Merge "Improve logging of exceptions which are not thrown but attached to context"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 24 Feb 2017 12:04:19 +0000 (12:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 24 Feb 2017 12:04:20 +0000 (12:04 +0000)
2474 files changed:
.eslintrc.json
.gitignore
.mailmap
.stylelintrc
.travis.yml
CREDITS
Gemfile
Gemfile.lock
Gruntfile.js
HISTORY
README
RELEASE-NOTES-1.28 [deleted file]
RELEASE-NOTES-1.29
autoload.php
composer.json
docs/contenthandler.txt
docs/extension.schema.json [deleted file]
docs/extension.schema.v1.json
docs/extension.schema.v2.json [new file with mode: 0644]
docs/hooks.txt
includes/AjaxDispatcher.php
includes/AjaxResponse.php
includes/AuthPlugin.php
includes/Block.php
includes/Category.php
includes/CategoryFinder.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/Defines.php
includes/DerivativeRequest.php
includes/DummyLinker.php
includes/EditPage.php
includes/FileDeleteForm.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/LinkFilter.php
includes/Linker.php
includes/MWGrants.php
includes/MWNamespace.php
includes/MagicWord.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/Message.php
includes/MimeMagic.php
includes/MovePage.php
includes/OutputPage.php
includes/PageProps.php
includes/PathRouter.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/ServiceWiring.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/TemplateParser.php
includes/Title.php
includes/TrackingCategories.php [new file with mode: 0644]
includes/WatchedItemQueryService.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/WikiMap.php
includes/Xml.php
includes/actions/CreditsAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/MarkpatrolledAction.php
includes/actions/RawAction.php
includes/actions/RevisiondeleteAction.php [deleted file]
includes/actions/RollbackAction.php
includes/actions/ViewAction.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiCSPReport.php
includes/api/ApiChangeAuthenticationData.php
includes/api/ApiCheckToken.php
includes/api/ApiClearHasMsg.php
includes/api/ApiClientLogin.php
includes/api/ApiComparePages.php
includes/api/ApiContinuationManager.php
includes/api/ApiDelete.php
includes/api/ApiDisabled.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiErrorFormatter.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiLinkAccount.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiManageTags.php
includes/api/ApiMergeHistory.php
includes/api/ApiMessage.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDisabled.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryMyStashedFiles.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTokens.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiRemoveAuthenticationData.php
includes/api/ApiResetPassword.php
includes/api/ApiResult.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiSetPageLanguage.php [new file with mode: 0755]
includes/api/ApiStashEdit.php
includes/api/ApiTag.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUsageException.php [new file with mode: 0644]
includes/api/ApiUserrights.php
includes/api/ApiValidatePassword.php [new file with mode: 0644]
includes/api/ApiWatch.php
includes/api/i18n/ar.json
includes/api/i18n/ast.json
includes/api/i18n/be-tarask.json
includes/api/i18n/bgn.json
includes/api/i18n/bn.json
includes/api/i18n/br.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/diq.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/ia.json
includes/api/i18n/id.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/lij.json
includes/api/i18n/lt.json
includes/api/i18n/lv.json
includes/api/i18n/mk.json
includes/api/i18n/nb.json
includes/api/i18n/nl.json
includes/api/i18n/oc.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sv.json
includes/api/i18n/ta.json
includes/api/i18n/te.json
includes/api/i18n/th.json [new file with mode: 0644]
includes/api/i18n/udm.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/auth/AuthManager.php
includes/auth/AuthenticationRequest.php
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
includes/auth/RememberMeAuthenticationRequest.php
includes/auth/TemporaryPasswordAuthenticationRequest.php
includes/auth/TemporaryPasswordPrimaryAuthenticationProvider.php
includes/auth/ThrottlePreAuthenticationProvider.php
includes/auth/Throttler.php
includes/auth/UserDataAuthenticationRequest.php
includes/cache/CacheHelper.php
includes/cache/FileCacheBase.php
includes/cache/HTMLFileCache.php
includes/cache/LinkCache.php
includes/cache/MessageCache.php
includes/cache/localisation/LocalisationCache.php
includes/changes/CategoryMembershipChange.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/changetags/ChangeTagsLogItem.php
includes/collation/Collation.php
includes/collation/CollationFa.php [new file with mode: 0644]
includes/collation/IcuCollation.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/WikitextContent.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php
includes/db/CloneDatabase.php
includes/db/DatabaseMssql.php [deleted file]
includes/db/DatabaseOracle.php
includes/db/MWLBFactory.php
includes/db/ORAField.php [new file with mode: 0644]
includes/db/ORAResult.php [new file with mode: 0644]
includes/debug/MWDebug.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/monolog/AvroFormatter.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/WANCacheReapUpdate.php [new file with mode: 0644]
includes/diff/DairikiDiff.php
includes/diff/DiffEngine.php
includes/diff/DifferenceEngine.php
includes/exception/ErrorPageError.php
includes/exception/LocalizedException.php [new file with mode: 0644]
includes/exception/MWContentSerializationException.php [new file with mode: 0644]
includes/exception/MWExceptionHandler.php
includes/exception/MWExceptionRenderer.php
includes/exception/MWUnknownContentModelException.php [new file with mode: 0644]
includes/exception/PermissionsError.php
includes/export/XmlDumpWriter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filerepo/FSRepo.php [deleted file]
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/TempFileRepo.php [new file with mode: 0644]
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/gallery/SlideshowImageGallery.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/htmlform/fields/HTMLAutoCompleteSelectField.php
includes/htmlform/fields/HTMLButtonField.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLDateTimeField.php
includes/htmlform/fields/HTMLFloatField.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLIntField.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLRadioField.php
includes/htmlform/fields/HTMLRestrictionsField.php
includes/htmlform/fields/HTMLSelectAndOtherField.php
includes/htmlform/fields/HTMLSelectField.php
includes/htmlform/fields/HTMLSizeFilterField.php
includes/htmlform/fields/HTMLTagFilter.php
includes/htmlform/fields/HTMLTextField.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/htmlform/fields/HTMLUserTextField.php
includes/htmlform/fields/HTMLUsersMultiselectField.php [new file with mode: 0644]
includes/http/CurlHttpRequest.php
includes/http/Http.php
includes/http/MWHttpRequest.php
includes/http/PhpHttpRequest.php
includes/import/ImportStreamSource.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/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/ar.json
includes/installer/i18n/ast.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/be.json
includes/installer/i18n/bg.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/ca.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/el.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/et.json
includes/installer/i18n/eu.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.json
includes/installer/i18n/hu.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lb.json
includes/installer/i18n/lki.json
includes/installer/i18n/mg.json
includes/installer/i18n/mk.json
includes/installer/i18n/my.json
includes/installer/i18n/nb.json
includes/installer/i18n/nl.json
includes/installer/i18n/oc.json
includes/installer/i18n/pl.json
includes/installer/i18n/pms.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ru.json
includes/installer/i18n/sd.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sv.json
includes/installer/i18n/th.json
includes/installer/i18n/tl.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/uk.json
includes/installer/i18n/vi.json
includes/installer/i18n/war.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/JobRunner.php
includes/jobqueue/aggregator/JobQueueAggregatorRedis.php
includes/jobqueue/jobs/CategoryMembershipChangeJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/json/FormatJson.php
includes/libs/CookieJar.php
includes/libs/ExplodeIterator.php
includes/libs/HashRing.php
includes/libs/HtmlArmor.php
includes/libs/IEUrlExtension.php
includes/libs/MapCacheLRU.php
includes/libs/StringUtils.php
includes/libs/Xhprof.php
includes/libs/eventrelayer/EventRelayer.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/lockmanager/LockManager.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/mime/mime.info
includes/libs/mime/mime.types
includes/libs/objectcache/APCUBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WANObjectCacheReaper.php [new file with mode: 0644]
includes/libs/rdbms/ChronologyProtector.php
includes/libs/rdbms/TransactionProfiler.php
includes/libs/rdbms/connectionmanager/ConnectionManager.php [new file with mode: 0644]
includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php [new file with mode: 0644]
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseDomain.php
includes/libs/rdbms/database/DatabaseMssql.php [new file with mode: 0644]
includes/libs/rdbms/database/DatabaseMysqlBase.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 [new file with mode: 0644]
includes/libs/rdbms/database/position/DBMasterPos.php
includes/libs/rdbms/database/position/MySQLMasterPos.php
includes/libs/rdbms/database/resultwrapper/IResultWrapper.php [new file with mode: 0644]
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/rdbms/defines.php
includes/libs/rdbms/encasing/Blob.php
includes/libs/rdbms/encasing/IBlob.php [new file with mode: 0644]
includes/libs/rdbms/encasing/LikeMatch.php
includes/libs/rdbms/encasing/MssqlBlob.php
includes/libs/rdbms/encasing/PostgresBlob.php
includes/libs/rdbms/exception/DBExpectedError.php
includes/libs/rdbms/exception/DBReplicationWaitError.php
includes/libs/rdbms/field/Field.php
includes/libs/rdbms/field/MssqlField.php
includes/libs/rdbms/field/MySQLField.php
includes/libs/rdbms/field/ORAField.php [deleted file]
includes/libs/rdbms/field/PostgresField.php
includes/libs/rdbms/field/SQLiteField.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/ILoadMonitor.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/replacers/Replacer.php
includes/libs/stats/NullStatsdDataFactory.php
includes/libs/xmp/XMP.php
includes/logging/BlockLogFormatter.php
includes/logging/ContentModelLogFormatter.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/RightsLogFormatter.php
includes/mail/MailAddress.php
includes/mail/UserMailer.php
includes/media/Bitmap.php
includes/media/DjVu.php
includes/media/Jpeg.php
includes/media/MediaTransformOutput.php
includes/media/SVG.php
includes/media/TransformationalImageHandler.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/CategoryPage.php
includes/page/ImageHistoryPseudoPager.php
includes/page/ImagePage.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/TablePager.php
includes/parser/BlockLevelPass.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/password/ParameterizedPassword.php
includes/password/Password.php
includes/password/UserPasswordPolicy.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/Profiler.php
includes/profiler/ProfilerXhprof.php
includes/rcfeed/FormattedRCFeed.php [new file with mode: 0644]
includes/rcfeed/RCFeed.php [new file with mode: 0644]
includes/rcfeed/RCFeedEngine.php
includes/rcfeed/RedisPubSubFeedEngine.php
includes/rcfeed/UDPRCFeedEngine.php
includes/registration/CoreVersionChecker.php [deleted file]
includes/registration/ExtensionJsonValidationError.php [new file with mode: 0644]
includes/registration/ExtensionJsonValidator.php [new file with mode: 0644]
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/registration/VersionChecker.php [new file with mode: 0644]
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php [deleted file]
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchiveItem.php
includes/revisiondelete/RevDelArchivedFileItem.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevDelRevisionItem.php
includes/search/DummySearchIndexFieldDefinition.php
includes/search/ResultAugmentor.php
includes/search/ResultSetAugmentor.php
includes/search/SearchEngine.php
includes/search/SearchHighlighter.php
includes/search/SearchSuggestion.php
includes/search/SearchSuggestionSet.php
includes/session/SessionManager.php
includes/site/DBSiteStore.php
includes/site/HashSiteStore.php
includes/skins/BaseTemplate.php
includes/skins/QuickTemplate.php
includes/skins/SkinTemplate.php
includes/specialpage/AuthManagerSpecialPage.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialApiHelp.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExport.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialListgrants.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialSpecialpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUncategorizedcategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnusedimages.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedcategories.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/CategoryPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/MergeHistoryPager.php
includes/specials/pagers/NewFilesPager.php
includes/specials/pagers/NewPagesPager.php
includes/specials/pagers/UsersPager.php
includes/tidy/Balancer.php
includes/tidy/RaggettWrapper.php
includes/title/MalformedTitleException.php
includes/title/MediaWikiTitleCodec.php
includes/title/TitleValue.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/user/PasswordReset.php
includes/user/User.php
includes/user/UserGroupMembership.php [new file with mode: 0644]
includes/user/UserRightsProxy.php
includes/utils/AutoloadGenerator.php
includes/utils/ZipDirectoryReader.php
includes/widget/DateInputWidget.php
includes/widget/UsersMultiselectWidget.php [new file with mode: 0644]
includes/widget/search/BasicSearchResultSetWidget.php [new file with mode: 0644]
includes/widget/search/DidYouMeanWidget.php [new file with mode: 0644]
includes/widget/search/FullSearchResultWidget.php [new file with mode: 0644]
includes/widget/search/InterwikiSearchResultSetWidget.php [new file with mode: 0644]
includes/widget/search/InterwikiSearchResultWidget.php [new file with mode: 0644]
includes/widget/search/SearchFormWidget.php [new file with mode: 0644]
includes/widget/search/SearchResultSetWidget.php [new file with mode: 0644]
includes/widget/search/SearchResultWidget.php [new file with mode: 0644]
includes/widget/search/SimpleSearchResultSetWidget.php [new file with mode: 0644]
includes/widget/search/SimpleSearchResultWidget.php [new file with mode: 0644]
jsduck.json
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageFi.php
languages/classes/LanguageHe.php [deleted file]
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageRu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageUk.php
languages/data/ZhConversion.php
languages/data/grammarTransformations/he.json [new file with mode: 0644]
languages/data/grammarTransformations/uk.json [new file with mode: 0644]
languages/i18n/ace.json
languages/i18n/af.json
languages/i18n/an.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/ast.json
languages/i18n/av.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bpy.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dty.json
languages/i18n/dv.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.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/glk.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.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/jv.json
languages/i18n/ka.json
languages/i18n/khw.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/ko.json
languages/i18n/kri.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lij.json
languages/i18n/liv.json
languages/i18n/lki.json
languages/i18n/lo.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/my.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pcd.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdh.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shn.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tet.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/udm.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAb.php
languages/messages/MessagesAce.php
languages/messages/MessagesAf.php
languages/messages/MessagesAk.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAnp.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesArq.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAy.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBan.php
languages/messages/MessagesBar.php
languages/messages/MessagesBbc_latn.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBh.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBm.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBqi.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesBug.php
languages/messages/MessagesBxr.php
languages/messages/MessagesCa.php
languages/messages/MessagesCbk_zam.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCeb.php
languages/messages/MessagesCh.php
languages/messages/MessagesCo.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDe_at.php
languages/messages/MessagesDe_ch.php
languages/messages/MessagesDe_formal.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesDv.php
languages/messages/MessagesDz.php
languages/messages/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEml.php
languages/messages/MessagesEn.php
languages/messages/MessagesEn_gb.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFf.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrc.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGag.php
languages/messages/MessagesGan.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGn.php
languages/messages/MessagesGot.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHr.php
languages/messages/MessagesHrx.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHt.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIe.php
languages/messages/MessagesIg.php
languages/messages/MessagesIi.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJut.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKg.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKoi.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKs.php
languages/messages/MessagesKs_arab.php
languages/messages/MessagesKs_deva.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_arab.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKv.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLbe.php
languages/messages/MessagesLez.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLiv.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLo.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLzh.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMo.php
languages/messages/MessagesMr.php
languages/messages/MessagesMrj.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNap.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNew.php
languages/messages/MessagesNl.php
languages/messages/MessagesNl_informal.php
languages/messages/MessagesNn.php
languages/messages/MessagesNrm.php [new file with mode: 0644]
languages/messages/MessagesNso.php
languages/messages/MessagesNv.php
languages/messages/MessagesOc.php
languages/messages/MessagesOlo.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPdt.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPi.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRgn.php
languages/messages/MessagesRm.php
languages/messages/MessagesRmy.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesRup.php [new file with mode: 0644]
languages/messages/MessagesRuq_cyrl.php
languages/messages/MessagesRuq_latn.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSd.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSg.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSrn.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTcy.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTy.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUdm.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVls.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXal.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZa.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh.php
languages/messages/MessagesZh_cn.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/messages/MessagesZh_hk.php
languages/messages/MessagesZh_sg.php
languages/messages/MessagesZh_tw.php
maintenance/CodeCleanerGlobalsPass.inc [new file with mode: 0644]
maintenance/Maintenance.php
maintenance/archives/patch-externallinks-el_index_60.sql [new file with mode: 0644]
maintenance/archives/patch-user_groups-primary-key.sql [new file with mode: 0644]
maintenance/archives/patch-user_groups-ug_expiry.sql [new file with mode: 0644]
maintenance/backup.inc
maintenance/cdb.php
maintenance/cleanupRemovedModules.php
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/dumpTextPass.php
maintenance/eval.php
maintenance/findHooks.php
maintenance/generateJsonI18n.php
maintenance/importDump.php
maintenance/importImages.inc [deleted file]
maintenance/importImages.php
maintenance/importTextFiles.php
maintenance/jsduck/categories.json
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simpphrases.manual
maintenance/language/zhtable/simpphrases_exclude.manual
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/manageJobs.php [new file with mode: 0644]
maintenance/mergeMessageFileList.php
maintenance/mssql/archives/patch-user_groups-ug_expiry.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/namespaceDupes.php
maintenance/oracle/archives/patch-externallinks-el_index_60.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-user_groups-ug_expiry.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/orphans.php
maintenance/populateContentModel.php
maintenance/populateInterwiki.php [new file with mode: 0644]
maintenance/postgres/tables.sql
maintenance/protect.php
maintenance/rebuildFileCache.php
maintenance/rebuildtextindex.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/shell.php [new file with mode: 0644]
maintenance/sqlite/archives/patch-user_groups-ug_expiry.sql [new file with mode: 0644]
maintenance/storage/checkStorage.php
maintenance/storage/compressOld.php
maintenance/tables.sql
maintenance/validateRegistrationFile.php
maintenance/view.php [new file with mode: 0644]
maintenance/wrapOldPasswords.php
mw-config/config-cc.css
mw-config/config.css
mw-config/index.php
package.json
phpcs.xml
resources/Resources.php
resources/lib/jquery.ui/jquery.ui.draggable.js
resources/lib/json2/json2.js [deleted file]
resources/lib/moment/LICENSE
resources/lib/moment/locale/af.js
resources/lib/moment/locale/ar-ma.js
resources/lib/moment/locale/ar-sa.js
resources/lib/moment/locale/ar-tn.js [new file with mode: 0644]
resources/lib/moment/locale/ar.js
resources/lib/moment/locale/az.js
resources/lib/moment/locale/be.js
resources/lib/moment/locale/bg.js
resources/lib/moment/locale/bn.js
resources/lib/moment/locale/bo.js
resources/lib/moment/locale/br.js
resources/lib/moment/locale/bs.js
resources/lib/moment/locale/ca.js
resources/lib/moment/locale/cs.js
resources/lib/moment/locale/cv.js
resources/lib/moment/locale/cy.js
resources/lib/moment/locale/da.js
resources/lib/moment/locale/de-at.js
resources/lib/moment/locale/de.js
resources/lib/moment/locale/dv.js [new file with mode: 0644]
resources/lib/moment/locale/el.js
resources/lib/moment/locale/en-au.js
resources/lib/moment/locale/en-ca.js
resources/lib/moment/locale/en-gb.js
resources/lib/moment/locale/eo.js
resources/lib/moment/locale/es.js
resources/lib/moment/locale/et.js
resources/lib/moment/locale/eu.js
resources/lib/moment/locale/fa.js
resources/lib/moment/locale/fi.js
resources/lib/moment/locale/fo.js
resources/lib/moment/locale/fr-ca.js
resources/lib/moment/locale/fr.js
resources/lib/moment/locale/fy.js [new file with mode: 0644]
resources/lib/moment/locale/gd.js [new file with mode: 0644]
resources/lib/moment/locale/gl.js
resources/lib/moment/locale/he.js
resources/lib/moment/locale/hi.js
resources/lib/moment/locale/hr.js
resources/lib/moment/locale/hu.js
resources/lib/moment/locale/hy-am.js
resources/lib/moment/locale/id.js
resources/lib/moment/locale/is.js
resources/lib/moment/locale/it.js
resources/lib/moment/locale/ja.js
resources/lib/moment/locale/jv.js [new file with mode: 0644]
resources/lib/moment/locale/ka.js
resources/lib/moment/locale/kk.js [new file with mode: 0644]
resources/lib/moment/locale/km.js
resources/lib/moment/locale/ko.js
resources/lib/moment/locale/ky.js [new file with mode: 0644]
resources/lib/moment/locale/lb.js
resources/lib/moment/locale/lo.js [new file with mode: 0644]
resources/lib/moment/locale/lt.js
resources/lib/moment/locale/lv.js
resources/lib/moment/locale/mi.js [new file with mode: 0644]
resources/lib/moment/locale/mk.js
resources/lib/moment/locale/ml.js
resources/lib/moment/locale/mr.js
resources/lib/moment/locale/ms-my.js
resources/lib/moment/locale/ms.js [new file with mode: 0644]
resources/lib/moment/locale/my.js
resources/lib/moment/locale/nb.js
resources/lib/moment/locale/ne.js
resources/lib/moment/locale/nl.js
resources/lib/moment/locale/nn.js
resources/lib/moment/locale/pa-in.js [new file with mode: 0644]
resources/lib/moment/locale/pl.js
resources/lib/moment/locale/pt-br.js
resources/lib/moment/locale/pt.js
resources/lib/moment/locale/ro.js
resources/lib/moment/locale/ru.js
resources/lib/moment/locale/se.js [new file with mode: 0644]
resources/lib/moment/locale/si.js [new file with mode: 0644]
resources/lib/moment/locale/sk.js
resources/lib/moment/locale/sl.js
resources/lib/moment/locale/sq.js
resources/lib/moment/locale/sr-cyrl.js
resources/lib/moment/locale/sr.js
resources/lib/moment/locale/ss.js [new file with mode: 0644]
resources/lib/moment/locale/sv.js
resources/lib/moment/locale/sw.js [new file with mode: 0644]
resources/lib/moment/locale/ta.js
resources/lib/moment/locale/te.js [new file with mode: 0644]
resources/lib/moment/locale/th.js
resources/lib/moment/locale/tl-ph.js
resources/lib/moment/locale/tr.js
resources/lib/moment/locale/tzm-latn.js
resources/lib/moment/locale/tzm.js
resources/lib/moment/locale/uk.js
resources/lib/moment/locale/uz.js
resources/lib/moment/locale/vi.js
resources/lib/moment/locale/x-pseudo.js [new file with mode: 0644]
resources/lib/moment/locale/zh-cn.js
resources/lib/moment/locale/zh-hk.js [new file with mode: 0644]
resources/lib/moment/locale/zh-tw.js
resources/lib/moment/moment.js
resources/lib/oojs-ui/i18n/be.json
resources/lib/oojs-ui/i18n/bqi.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/el.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/hif-latn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/io.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/tr.json
resources/lib/oojs-ui/i18n/tt-cyrl.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/eye.png
resources/lib/oojs-ui/themes/apex/images/icons/eye.svg
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png [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-core.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-list.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-media.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-user.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/add-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-warning.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-rtl-progressive.svg
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-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bell-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bell-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/block-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/block-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/block-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/block-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.svg
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/check-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clear-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clear-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clock-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clock-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/comment-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/comment-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/downTriangle-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/downTriangle-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ellipsis-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ellipsis-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/expand-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/expand-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eyeClosed-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eyeClosed-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfBright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/heart-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/heart-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/info-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/info-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-cc-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-cc-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaCommons-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaCommons-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikipedia-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikipedia-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/moon-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notBright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/settings-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/settings-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSideMenu-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSideMenu-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-warning.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/tray-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tray-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-destructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upTriangle-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upTriangle-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userAvatar-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userAvatar-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/window-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/window-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/lib/qunitjs/qunit.css
resources/lib/qunitjs/qunit.js
resources/src/jquery.tipsy/jquery.tipsy.js
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.arrowSteps.css
resources/src/jquery/jquery.badge.css
resources/src/jquery/jquery.byteLimit.js
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.farbtastic.css
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.spinner.css
resources/src/jquery/jquery.suggestions.css
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.textSelection.js
resources/src/json-skip.js [deleted file]
resources/src/mediawiki.action/mediawiki.action.edit.css
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.edit.stash.js
resources/src/mediawiki.action/mediawiki.action.edit.styles.css
resources/src/mediawiki.action/mediawiki.action.history.styles.css
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.filepage.css
resources/src/mediawiki.action/mediawiki.action.view.postEdit.css
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/src/mediawiki.language/languages/he.js [deleted file]
resources/src/mediawiki.language/languages/ru.js [deleted file]
resources/src/mediawiki.language/languages/uk.js [deleted file]
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.mixins.animation.less
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.ui/variables.less
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js [new file with mode: 0644]
resources/src/mediawiki.skinning/content.css
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 [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/book-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/course-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/course-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/definition-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/definition-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/dna-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/dna-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/image-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/image-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/news-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/news-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/quotation-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/quotation-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/textbook-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/textbook-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/travel-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/travel-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.apisandbox.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.changeslist.css
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.recentchanges.js
resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.styles.css
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.upload.styles.css
resources/src/mediawiki.special/mediawiki.special.userrights.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.userrights.js
resources/src/mediawiki.special/mediawiki.special.version.css
resources/src/mediawiki.special/mediawiki.special.watchlist.js
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.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.widgets.datetime/CalendarWidget.less
resources/src/mediawiki.widgets.datetime/DateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.js
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/DiscordianDateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/ProlepticGregorianDateTimeFormatter.js
resources/src/mediawiki.widgets/MediaSearch/broken-image.png [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.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.StashedFileWidget.less
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki/api.js
resources/src/mediawiki/api/options.js
resources/src/mediawiki/api/watch.js
resources/src/mediawiki/htmlform/datetime.js [deleted file]
resources/src/mediawiki/htmlform/hide-if.js
resources/src/mediawiki/htmlform/htmlform.js
resources/src/mediawiki/htmlform/ooui.styles.css
resources/src/mediawiki/htmlform/styles.css
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Upload.BookletLayout.css
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Uri.js
resources/src/mediawiki/mediawiki.apihelp.css
resources/src/mediawiki/mediawiki.debug.less
resources/src/mediawiki/mediawiki.diff.styles.css
resources/src/mediawiki/mediawiki.feedback.css
resources/src/mediawiki/mediawiki.hlist.css
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.requestIdleCallback.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.storage.js
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/page/gallery-slideshow.js
resources/src/mediawiki/page/gallery.css
resources/src/mediawiki/page/gallery.print.css
resources/src/mediawiki/page/image-pagination.js
resources/src/mediawiki/page/rollback.js
resources/src/mediawiki/page/watch.js
resources/src/moment-dmy.js
resources/src/moment-locale-overrides.js
resources/src/oojs-ui-local.js
resources/src/startup.js
tests/browser/features/login.feature
tests/browser/features/step_definitions/login_steps.rb
tests/browser/features/support/pages/create_account_page.rb
tests/browser/features/support/pages/login_page.rb
tests/common/TestSetup.php
tests/common/TestsAutoLoader.php
tests/integration/includes/http/CurlHttpRequestTest.php [new file with mode: 0644]
tests/integration/includes/http/MWHttpRequestTestCase.php [new file with mode: 0644]
tests/integration/includes/http/PhpHttpRequestTest.php [new file with mode: 0644]
tests/parser/DbTestPreviewer.php
tests/parser/DbTestRecorder.php
tests/parser/DjVuSupport.php
tests/parser/ParserTestPrinter.php
tests/parser/ParserTestResultNormalizer.php
tests/parser/ParserTestRunner.php
tests/parser/README
tests/parser/TestFileEditor.php
tests/parser/TestFileReader.php
tests/parser/TestRecorder.php
tests/parser/TidySupport.php
tests/parser/parserTests.txt
tests/phan/bin/phan [new file with mode: 0755]
tests/phan/bin/postprocess-phan.php [new file with mode: 0644]
tests/phan/config.php [new file with mode: 0644]
tests/phan/issues/.gitkeep [new file with mode: 0644]
tests/phan/stubs/README [new file with mode: 0644]
tests/phan/stubs/hhvm.php [new file with mode: 0644]
tests/phan/stubs/mail.php [new file with mode: 0644]
tests/phan/stubs/memcached.php [new file with mode: 0644]
tests/phan/stubs/tideways.php [new file with mode: 0644]
tests/phan/stubs/wikidiff.php [new file with mode: 0644]
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/autoload.ide.php [new file with mode: 0644]
tests/phpunit/data/localisationcache/ba.json [new file with mode: 0644]
tests/phpunit/data/localisationcache/en.json
tests/phpunit/data/localisationcache/ru.json
tests/phpunit/data/localisationcache/uk.json [deleted file]
tests/phpunit/data/media/say-test.opus [new file with mode: 0644]
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FormOptionsInitializationTest.php
tests/phpunit/includes/FormOptionsTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php [deleted file]
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SanitizerValidateEmailTest.php
tests/phpunit/includes/TestLogger.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiContinuationManagerTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiMessageTest.php
tests/phpunit/includes/api/ApiOpenSearchTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiQueryAllPagesTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php
tests/phpunit/includes/api/ApiRevisionDeleteTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiUnblockTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/MockApi.php
tests/phpunit/includes/api/MockApiQueryBase.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/format/ApiFormatXmlTest.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/auth/AbstractPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/cache/LocalisationCacheTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/config/ConfigFactoryTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/deferred/SearchUpdateTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/htmlform/HTMLCheckMatrixTest.php
tests/phpunit/includes/http/HttpTest.php [new file with mode: 0644]
tests/phpunit/includes/import/ImportLinkCacheIntegrationTest.php
tests/phpunit/includes/import/ImportTest.php
tests/phpunit/includes/installer/DatabaseUpdaterTest.php [deleted file]
tests/phpunit/includes/interwiki/InterwikiTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php
tests/phpunit/includes/libs/xmp/XMPTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/logging/RightsLogFormatterTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/MediaWikiMediaTestCase.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/page/ArticleTablesTest.php
tests/phpunit/includes/page/ArticleTest.php
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/pager/ReverseChronologicalPagerTest.php
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/password/UserPasswordPolicyTest.php
tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/registration/CoreVersionCheckerTest.php [deleted file]
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/ExtensionRegistryTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/skins/SkinTemplateTest.php
tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
tests/phpunit/includes/specials/SpecialBooksourcesTest.php
tests/phpunit/includes/specials/SpecialEditWatchlistTest.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php [new file with mode: 0644]
tests/phpunit/includes/tidy/BalancerTest.php
tests/phpunit/includes/tidy/html5lib-tests.json
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/user/PasswordResetTest.php
tests/phpunit/includes/user/UserGroupMembershipTest.php [new file with mode: 0644]
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/includes/utils/ClassCollectorTest.php [new file with mode: 0644]
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/classes/LanguageBe_taraskTest.php
tests/phpunit/languages/classes/LanguageHeTest.php
tests/phpunit/languages/classes/LanguageMlTest.php
tests/phpunit/languages/classes/LanguageTrTest.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/mocks/content/DummyContentHandlerForTesting.php
tests/phpunit/mocks/filebackend/MockFSFile.php
tests/phpunit/skins/SideBarTest.php
tests/phpunit/specials/SpecialSearchTest.php [deleted file]
tests/phpunit/structure/AutoLoaderTest.php
tests/phpunit/structure/ContentHandlerSanityTest.php
tests/phpunit/structure/ExtensionJsonValidationTest.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suites/CoreParserTestSuite.php
tests/phpunit/tests/MediaWikiTestCaseTest.php
tests/qunit/.eslintrc.json [new file with mode: 0644]
tests/qunit/QUnitTestResources.php
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/mediawiki.jqueryMsg.data.js
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
tests/qunit/suites/resources/jquery/jquery.color.test.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
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.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.errorLogger.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.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.track.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js
tests/qunit/suites/resources/startup.test.js
thumb.php
wiki.phtml [deleted file]

index 044dd72..64b5ea7 100644 (file)
@@ -2,14 +2,12 @@
        "extends": "wikimedia",
        "env": {
                "browser": true,
-               "jquery": true,
-               "qunit": true
+               "jquery": true
        },
        "globals": {
                "require": false,
                "module": false,
                "mediaWiki": false,
-               "mwPerformance": false,
                "OO": false
        },
        "rules": {
index 01a11bf..b2c4d45 100644 (file)
@@ -71,3 +71,4 @@ Thumbs.db
 /tags
 /.htaccess
 /.htpasswd
+/tests/phan/issues
index dd968e8..232824d 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -93,6 +93,7 @@ Chad Horohoe <chadh@wikimedia.org>
 Chad Horohoe <chadh@wikimedia.org> <demon@users.mediawiki.org>
 Charles Melbye <charlie@yourwiki.net> <charlie@users.mediawiki.org>
 Chiefwei <chiefwei1989@gmail.com>
+Chris Koerner <ckoerner@wikimedia.org>
 Chris McMahon <cmcmahon@wikimedia.org>
 Chris Steipp <csteipp@wikimedia.org>
 Christian Aistleitner <christian@quelltextlich.at>
@@ -100,6 +101,8 @@ Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
 Christian Williams <orbit@framezero.com>
 Christian Williams <orbit@framezero.com> <christian@localhost>
 Christian Williams <orbit@framezero.com> <christian@wikia-inc.com>
+Christoph Jauera <christoph.jauera@wikimedia.de>
+Christoph Jauera <christoph.jauera@wikimedia.de> <christoph.fischer@wikimedia.de>
 Christopher Johnson <root@bugzilla.wmde.de>
 church of emacs <churchofemacs@users.mediawiki.org>
 Cindy Cicalese <cicalese@mitre.org>
@@ -115,12 +118,14 @@ Daniel Friesen <mediawiki@danielfriesen.name> <dantman@users.mediawiki.org>
 Daniel Friesen <mediawiki@danielfriesen.name> <pub-github@nadir-seen-fire.com>
 Daniel Kinzler <daniel.kinzler@wikimedia.de>
 Daniel Kinzler <daniel.kinzler@wikimedia.de> <daniel@users.mediawiki.org>
+Daniel Renfro <bluecurio@gmail.com> <drenfro@vistaprint.com>
 Danny B. <Wikipedia.Danny.B@email.cz>
 Danny B. <Wikipedia.Danny.B@email.cz> <danny.b@email.cz>
 Danny B. <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
 Danny B. <Wikipedia.Danny.B@email.cz> <wikimedia.danny.b@email.cz>
 Darian Anthony Patrick <dpatrick@wikimedia.org>
 Darkdragon09 <ubuntu@ip-172-31-39-38.us-west-2.compute.internal>
+David Causse <dcausse@wikimedia.org>
 David Chan <david@sheetmusic.org.uk>
 Dereckson <dereckson@espace-win.org>
 Derk-Jan Hartman <hartman@videolan.org>
@@ -134,6 +139,7 @@ Ebrahim Byagowi <ebrahim@gnu.org>
 Ed Sanders <esanders@wikimedia.org>
 Elliott Eggleston <eeggleston@wikimedia.org>
 Elliott Eggleston <eeggleston@wikimedia.org> <ejegg@ejegg.com>
+Emad Elwany <emadelwany@hotmail.com>
 Emmanuel Engelhart <kelson@kiwix.org> <kelson42@users.mediawiki.org>
 Emufarmers <emufarmers@gmail.com>
 Emufarmers <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
@@ -201,14 +207,18 @@ Jason Richey <jasonr@wikia.com> <jasonr@users.mediawiki.org>
 Jason Richey <jasonr@wikia.com> <urichj00@users.mediawiki.org>
 Jeff Hall <jeffreyehall@gmail.com>
 Jeff Hall <jeffreyehall@gmail.com> <jhall@wikimedia.org>
+Jeff Hobson <jhobson@wikimedia.org>
 Jeff Janes <jeff.janes@gmail.com>
+Jeremy Baron <jeremy@tuxmachine.com>
 Jeremy Postlethwaite <jpostlethwaite@wikimedia.org> <jpostlethwaite@users.mediawiki.org>
 Jeroen De Dauw <jeroendedauw@gmail.com>
 Jeroen De Dauw <jeroendedauw@gmail.com> <jeroendedauw@users.mediawiki.org>
 Jesús Martínez Novo <martineznovo@gmail.com>
 Jiabao <jiabao.foss@gmail.com>
 Jimmy Collins <jimmy.collins@web.de> <collinj@users.mediawiki.org>
+Joel Sahleen <jsahleen@wikimedia.org>
 John Du Hart <john@compwhizii.net> <johnduhart@users.mediawiki.org>
+John Erling Blad <john.blad@wikimedia.de>
 Jon Harald Søby <jhsoby@gmail.com> <jhsoby@users.mediawiki.org>
 Jon Robson <jrobson@wikimedia.org>
 Jon Robson <jrobson@wikimedia.org> <jdlrobson@gmail.com>
@@ -217,6 +227,8 @@ Juliusz Gonera <jgonera@gmail.com> <jgonera@wikimedia.org>
 JuneHyeon Bae <devunt@gmail.com>
 Jure Kajzer <freak@drajv.si>
 Jure Kajzer <freak@drajv.si> <freakolowsky@users.mediawiki.org>
+Justin Du <justin.d128@gmail.com>
+Kai Nissen <kai.nissen@wikimedia.de>
 Karun Dambiec <karun.84@gmx.de>
 Katie Filbert <aude.wiki@gmail.com>
 Katie Filbert <aude.wiki@gmail.com> <aude@users.mediawiki.org>
@@ -236,6 +248,7 @@ liangent <liangent@gmail.com>
 Lisa Ridley <lhridley@gmail.com> <lhridley@users.mediawiki.org>
 Ljudusika <plo2000@i.ua>
 Luis Felipe Schenone <schenonef@gmail.com>
+Luke Welling <lwelling@wikimedia.org>
 Lupo <lupo.bugzilla@gmail.com>
 m4tx <m4tx@m4tx.pl>
 Madman <madman.enwiki@gmail.com>
@@ -261,6 +274,7 @@ Markus Glaser <glaser@hallowelt.biz> <mglaser@users.mediawiki.org>
 Matt Johnston <mattj@emazestudios.com> <mattj@users.mediawiki.org>
 Matthew Britton <hugglegurch@gmail.com> <gurch@users.mediawiki.org>
 Matthew Flaschen <mflaschen@wikimedia.org>
+Matthew Walker <mwalker@wikimedia.org>
 Matthias Mullie <git@mullie.eu>
 Matthias Mullie <git@mullie.eu> <mmullie@wikimedia.org>
 Matěj Grabovský <mgrabovsky@yahoo.com> <mgrabovsky@users.mediawiki.org>
@@ -277,15 +291,17 @@ Mormegil <mormegil@centrum.cz>
 MrBlueSky <mrbluesky@wikipedia.be>
 MrBlueSky <mrbluesky@wikipedia.be> <mrbluesky@localhost>
 Mukunda Modell <mmodell@wikimedia.org>
-Mwalker <mwalker@wikimedia.org>
 MZMcBride <g@mzmcbride.com>
 nadeesha <nadeesha@calcey.com> <nadeesha@users.mediawiki.org>
 Namit <namit.ohri@gmail.com>
+Nathan Larson <nathanlarson3141@gmail.com>
+Nathan Larson <nathanlarson3141@gmail.com> <tjlsangria@gmail.com>
 Nathaniel Herman <redwwjd@yahoo.com> <pinky@users.mediawiki.org>
 Neil Kandalgaonkar <neilk@wikimedia.org> <neilk@users.mediawiki.org>
 Nemo bis <federicoleva@tiscali.it>
 nephele <nephele@skyhighway.com> <nephele@users.mediawiki.org>
 Nick Jenkins <nickpj@gmail.com> <nickj@users.mediawiki.org>
+Niharika Kohli <nkohli@wikimedia.org>
 Nik Everett <neverett@wikimedia.org>
 Niklas Laxström <niklas.laxstrom@gmail.com>
 Niklas Laxström <niklas.laxstrom@gmail.com> <nikerabbit@users.mediawiki.org>
@@ -297,10 +313,12 @@ OverlordQ <wikipedia@thedarkcitadel.com> <overlordq@users.mediawiki.org>
 Owen Davis <owen@wikia-inc.com>
 Owen Davis <owen@wikia-inc.com> <owen@users.mediawiki.org>
 paladox <thomasmulhall410@yahoo.com>
+Patricio Molina <patriciomolina@gmail.com>
 Patrick Reilly <preilly@wikimedia.org>
 Patrick Reilly <preilly@wikimedia.org> <preilly@users.mediawiki.org>
 Patrick Westerhoff <PatrickWesterhoff@gmail.com>
 Paul Copperman <paul.copperman@gmail.com> <pcopp@users.mediawiki.org>
+Peter Coombe <pcoombe@wikimedia.org>
 Peter Coti <petercoti@gmail.com>
 Peter Potrowl <peter017@gmail.com> <peter17@users.mediawiki.org>
 Petr Kadlec <mormegil@centrum.cz>
@@ -385,10 +403,10 @@ Stephane Bisson <sbisson@wikimedia.org>
 Stephen Liang <github@stephenliang.pw>
 Steve Sanbeg <ffnaort@jro.qr> <sanbeg@users.mediawiki.org>
 Steven Roddis <StevenRoddis@users.noreply.github.com>
+Steven Walling <swalling@wikimedia.org>
 Subramanya Sastry <ssastry@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
 Sumit Asthana <asthana.sumit23@gmail.com>
-Swalling <swalling@wikimedia.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>
@@ -406,8 +424,6 @@ Timo Tijhof <krinklemail@gmail.com> <krinkle@users.mediawiki.org>
 Timo Tijhof <krinklemail@gmail.com> <timo@wikimedia.org>
 Timo Tijhof <krinklemail@gmail.com> <ttijhof@wikimedia.org>
 Tina Johnson <tinajohnson.1234@gmail.com>
-Tisane <nathanlarson3141@gmail.com>
-Tjones <tjones@wikimedia.org>
 Tom Maaswinkel <tom.maaswinkel@12wiki.eu> <thedevilonline@users.mediawiki.org>
 Tomasz Finc <tfinc@wikimedia.org> <tomasz@users.mediawiki.org>
 Tomasz W. Kozlowski <tomasz@twkozlowski.com>
@@ -418,9 +434,11 @@ Tpt <thomaspt@hotmail.fr>
 Trevor Parscal <trevorparscal@gmail.com>
 Trevor Parscal <trevorparscal@gmail.com> <tparscal@users.mediawiki.org>
 Trevor Parscal <trevorparscal@gmail.com> <tparscal@wikimedia.org>
+Trey Jones <tjones@wikimedia.org>
 Tyler Cipriani <tcipriani@wikimedia.org>
 Tyler Romeo <tylerromeo@gmail.com>
 Umherirrender <umherirrender_de.wp@web.de>
+Victor Barbu <victorbarbu08@gmail.com>
 Victor Vasiliev <vasilvv@mit.edu>
 Victor Vasiliev <vasilvv@mit.edu> <vasilievvv@users.mediawiki.org>
 Victor Vasiliev <vasilvv@mit.edu> <vasilvv@gmail.com>
@@ -438,6 +456,7 @@ Yongmin Hong <revi@member.fsf.org> <reviwiki@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org>
 Yuri Astrakhan <yurik@wikimedia.org> <yuriastrakhan@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org> <yurik@users.mediawiki.org>
+Yuriy Shnitkovskiy <bmp2558@gmail.com>
 Yusuke Matsubara <whym@whym.org>
 Yuvi Panda <yuvipanda@gmail.com>
 Zak Greant <zak+mediawiki@fooassociates.com> <zak@users.mediawiki.org>
index 62dbeb6..5a7b29f 100644 (file)
@@ -1,26 +1,15 @@
 {
+       "extends": "stylelint-config-wikimedia",
        "rules": {
-               "color-hex-case": [ "lower" ],
-               "color-hex-length": [ "short" ],
-               "color-named": [ "never" ],
-               "color-no-invalid-hex": true,
+               "declaration-no-important": null,
 
-               "declaration-bang-space-after": [ "never" ],
-               "declaration-bang-space-before": [ "always" ],
-               "declaration-colon-space-after": [ "always" ],
-               "declaration-colon-space-before": [ "never" ],
+               "no-descending-specificity": null,
 
-               "font-family-name-quotes": [ "always-unless-keyword" ],
-               "font-weight-notation": [ "named-where-possible" ],
+               "selector-no-id": null,
+               "selector-pseudo-element-colon-notation": null,
 
-               "function-calc-no-unspaced-operator": true,
-               "function-comma-newline-after": "never-multi-line",
-               "function-comma-newline-before": "never-multi-line",
-               "function-comma-space-after": [ "always" ],
-               "function-comma-space-before": [ "never" ],
-               "function-parentheses-newline-inside": [ "never-multi-line" ],
-               "function-parentheses-space-inside": [ "always" ],
-               "function-url-quotes": [ "never" ],
-               "function-whitespace-after": [ "always" ],
+               "string-quotes": null,
+
+               "value-keyword-case": null
        }
 }
index 9738605..5e2c7a0 100644 (file)
@@ -7,17 +7,29 @@
 # complement that setup by testing MediaWiki on travis
 #
 language: php
+# Use the slower sudo-enabled VMs instead of fast containers:
+# - Package 'djvulibre-bin' is not yet whitelisted for trusty containers.
+#   https://github.com/travis-ci/apt-package-whitelist/issues/4036
+sudo: required
+# Use Trusty instead of Travis default (precise)
+# - Required in order to use HHVM 3.6 or higher.
+# - Required for non-buggy xml library for XmlTypeCheck/UploadBaseTest (T75176).
+dist: trusty
 
 matrix:
   fast_finish: true
   include:
-    - env: dbtype=mysql
+    # On Trusty, mysql user 'travis' doesn't have create database rights
+    # Postgres has no user called 'root'.
+    - env: dbtype=mysql dbuser=root
       php: 5.5
-    - env: dbtype=postgres
+    - env: dbtype=postgres dbuser=travis
       php: 5.5
-    - env: dbtype=mysql
-      php: hhvm
-    - env: dbtype=mysql
+    - env: dbtype=mysql dbuser=root
+      # https://docs.travis-ci.com/user/languages/php#HHVM-versions
+      # https://github.com/travis-ci/travis-ci/issues/7368
+      php: hhvm-3.12
+    - env: dbtype=mysql dbuser=root
       php: 7
 
 services:
@@ -26,15 +38,17 @@ services:
 branches:
   # Test changes in master and arbitrary Travis CI branches only.
   # The latter allows developers to enable Travis CI in their GitHub fork of
-  # wikimedia/mediawiki and then push changes they like to test to branches like
+  # wikimedia/mediawiki and then push changes for testing to branches like
   # "travis-ci/test-this-awesome-change".
   only:
     - master
     - /^travis-ci\/.*$/
 
-before_install:
-  - sudo apt-get install -qq djvulibre-bin tidy
-  - composer self-update --quiet --no-interaction
+addons:
+  apt:
+    packages:
+    - djvulibre-bin
+    - tidy
 
 before_script:
   - composer install --prefer-source --quiet --no-interaction
@@ -44,7 +58,7 @@ before_script:
       --pass travis
       --dbtype "$dbtype"
       --dbname traviswiki
-      --dbuser travis
+      --dbuser "$dbuser"
       --dbpass ""
       --scriptpath "/w"
 
diff --git a/CREDITS b/CREDITS
index d9ff970..b37edf2 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,10 +1,9 @@
-{{int:version-credits-summary}}
-<!--
+{{int:version-credits-summary}} <!--
 MediaWiki 1.28 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
--->
-<!-- Please notice that the following can be found parsed under Special:Version/Credits -->
+
+The following list can be found parsed under Special:Version/Credits -->
 
 == Contributors ==
 <!-- Updates to this list made with maintenance/updateCredits.php -->
diff --git a/Gemfile b/Gemfile
index 8a349bf..8bbd00f 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.2'
+gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.4'
 gem 'rake', '~> 11.1', '>= 11.1.1'
 gem 'rubocop', '~> 0.32.1', require: false
index 982619a..8243874 100644 (file)
@@ -13,55 +13,58 @@ GEM
       gherkin (~> 2.12)
       multi_json (>= 1.7.5, < 2.0)
       multi_test (>= 0.1.2)
-    data_magic (0.22)
+    data_magic (1.0)
       faker (>= 1.1.2)
       yml_reader (>= 0.6)
     diff-lcs (1.2.5)
-    domain_name (0.5.20160615)
+    domain_name (0.5.20161129)
       unf (>= 0.0.5, < 1.0.0)
-    faker (1.6.6)
+    faker (1.7.1)
       i18n (~> 0.5)
-    faraday (0.9.2)
+    faraday (0.10.0)
       multipart-post (>= 1.2, < 3)
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
       http-cookie (~> 1.0.0)
-    faraday_middleware (0.10.0)
-      faraday (>= 0.7.4, < 0.10)
+    faraday_middleware (0.10.1)
+      faraday (>= 0.7.4, < 1.0)
     ffi (1.9.14)
     gherkin (2.12.2)
       multi_json (~> 1.3)
-    headless (2.2.3)
-    http-cookie (1.0.2)
+    headless (2.3.1)
+    http-cookie (1.0.3)
       domain_name (~> 0.5)
     i18n (0.7.0)
-    json (1.8.3)
+    json (2.0.2)
     mediawiki_api (0.7.0)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
       faraday_middleware (~> 0.10, >= 0.10.0)
-    mediawiki_selenium (1.7.2)
+    mediawiki_selenium (1.7.4)
       cucumber (~> 1.3, >= 1.3.20)
       headless (~> 2.0, >= 2.1.0)
-      json (~> 1.8, >= 1.8.1)
+      json (~> 2.0, >= 2.0.2)
       mediawiki_api (~> 0.7, >= 0.7.0)
       page-object (~> 1.0)
       rest-client (~> 1.6, >= 1.6.7)
       rspec-core (~> 2.14, >= 2.14.4)
       rspec-expectations (~> 2.14, >= 2.14.4)
+      selenium-webdriver (< 3)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
-    mime-types (2.99.2)
+    mime-types (2.99.3)
     multi_json (1.12.1)
     multi_test (0.1.2)
     multipart-post (2.0.0)
+    net-http-persistent (2.9.4)
     netrc (0.11.0)
-    page-object (1.2.0)
+    page-object (1.2.2)
+      net-http-persistent (~> 2.9.4)
       page_navigation (>= 0.9)
-      selenium-webdriver (>= 2.44.0)
-      watir-webdriver (>= 0.6.11)
-    page_navigation (0.9)
-      data_magic (>= 0.14)
+      selenium-webdriver (>= 2.53.0)
+      watir-webdriver (>= 0.6.11, < 0.9.9)
+    page_navigation (0.10)
+      data_magic (>= 0.22)
     parser (2.2.2.6)
       ast (>= 1.1, < 3.0)
     powerpack (0.1.1)
@@ -87,7 +90,7 @@ GEM
       rubyzip (~> 1.0)
       websocket (~> 1.0)
     syntax (1.2.1)
-    thor (0.19.1)
+    thor (0.19.4)
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.2)
@@ -100,6 +103,9 @@ PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.7, >= 1.7.2)
+  mediawiki_selenium (~> 1.7, >= 1.7.4)
   rake (~> 11.1, >= 11.1.1)
   rubocop (~> 0.32.1)
+
+BUNDLED WITH
+   1.13.7
index b38bc9a..0e1c8cb 100644 (file)
@@ -14,26 +14,30 @@ module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-karma' );
        grunt.loadNpmTasks( 'grunt-stylelint' );
 
-       karmaProxy[ wgScriptPath ] = wgServer + wgScriptPath;
+       karmaProxy[ wgScriptPath ] = {
+               target: wgServer + wgScriptPath,
+               changeOrigin: true
+       };
 
        grunt.initConfig( {
                eslint: {
                        all: [
                                '**/*.js',
                                '!docs/**',
-                               '!tests/**',
-                               '!extensions/**',
                                '!node_modules/**',
                                '!resources/lib/**',
                                '!resources/src/jquery.tipsy/**',
                                '!resources/src/jquery/jquery.farbtastic.js',
                                '!resources/src/mediawiki.libs/**',
-                               '!skins/**',
+                               // Third-party code of PHPUnit coverage report
+                               '!tests/coverage/**',
                                '!vendor/**',
+                               // Explicitly say "**/*.js" here in case of symlinks
+                               '!extensions/**/*.js',
+                               '!skins/**/*.js',
                                // Skip functions aren't even parseable
                                '!resources/src/dom-level2-skip.js',
                                '!resources/src/es5-skip.js',
-                               '!resources/src/json-skip.js',
                                '!resources/src/mediawiki.hidpi-skip.js'
                        ]
                },
@@ -55,7 +59,7 @@ module.exports = function ( grunt ) {
                        options: {
                                syntax: 'less'
                        },
-                       src: '{resources/src/*,mw-config/**}/*.{css,less}'
+                       src: '{resources/src,mw-config}/**/*.{css,less}'
                },
                watch: {
                        files: [
@@ -85,6 +89,9 @@ module.exports = function ( grunt ) {
                        main: {
                                browsers: [ 'Chrome' ]
                        },
+                       chromium: {
+                               browsers: [ 'Chromium' ]
+                       },
                        more: {
                                browsers: [ 'Chrome', 'Firefox' ]
                        }
diff --git a/HISTORY b/HISTORY
index 6de7de4..7f365ac 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,7 +1,352 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.28.
+Change notes from older releases. For current info see RELEASE-NOTES-1.29.
+
+== MediaWiki 1.28 ==
+
+=== Changes since 1.28.0-rc1 ===
+* (T148957) Replace wgShowExceptionDetails with wgShowDBErrorBacktrace on db
+  errors.
+* (T148956) Only apply wgDBschema to postgres/mssql.
+* (T145991) Introduce separate log action for deleting pages on move.
+* (T141474) (T110464) Bypass login page if no user input is required.
+
+=== Changes since 1.28.0-rc0 ===
+* (T142210) The changes to move the parser "NewPP limit report" from a HTML
+  comment to a machine-readable JavaScript config option 'wgPageParseReport'
+  have been undone. They caused the human-readable limit report to be shown
+  incompletely or not at all. ParserOutput::setLimitReportData() and
+  getLimitReportData() behave as they did in MediaWiki 1.27 again.
+* (T149510) Value of {{DISPLAYTITLE:}} parser function will not be used for
+  the text of subheadings on a category page when creating it. This wasn't
+  working correctly.
+* (T106793) MediaWiki will no longer try to perform a HTTP redirect to the
+  canonical pretty URL when a non-pretty URL is used. It resulted in redirect
+  loops in some clients and in some server configurations. This undoes a change
+  made in MediaWiki 1.26.
+* (T149759) manifest_version: 2 was removed.
+
+=== Configuration changes in 1.28 ===
+* $wgSend404Code now affects status code of action=history if the page is not there.
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* The load.php entry point now enforces the existing policy of not allowing
+  access to session data, which includes the session user and the session
+  user's language. If such access is attempted, an exception will be thrown.
+* The number of internal PBKDF2 iterations used to derive the session secret
+  is configurable via $wgSessionPbkdf2Iterations.
+* Upload dialog's file upload log comment can now be configured separately for
+  local and foreign uploads.
+* $wgForeignUploadTargets now defaults to `[ 'local' ]`, where `'local'`
+  signifies local uploads. A value of `[]` (empty array) now means that
+  no upload targets are allowed, effectively disabling the upload dialog.
+* The deprecated $wgEditEncoding variable has been removed; it was only used
+  for Esperanto language character conversion. You are now recommended to use
+  input methods provided by the UniversalLanguageSelector extension.
+* When $wgPingback is true, MediaWiki will periodically ping
+  https://www.mediawiki.org/beacon with basic information about the local
+  MediaWiki installation. This data includes, for example, the type of system,
+  PHP version, and chosen database backend. This behavior is off by default.
+* When $wgEditSubmitButtonLabelPublish is true, MediaWiki will label the button
+  to store-to-database-and-show-to-others as "Publish page"/"Publish changes";
+  if false, the default, they will be "Save page"/"Save changes".
+* The 'editcontentmodel' permission is now granted to all logged-in users ('user').
+  instead of just administrators ('sysop'). Documentation for this feature is
+  available at <https://www.mediawiki.org/wiki/Help:ChangeContentModel>.
+* $wgRevisionCacheExpiry is now set to one week by default instead of being disabled.
+* Magic links are now disabled by default, and can be re-enabled by modifying the value
+  of $wgEnableMagicLinks. Their usage is discouraged, but if they are manually enabled,
+  a tracking category will be added to help identify usage and make it easier to migrate
+  away from. If you depend upon magic link functionality, it is requested that you comment
+  on <https://www.mediawiki.org/wiki/Requests_for_comment/Future_of_magic_links> and
+  explain your use case(s).
+* New config variable $wgCSPFalsePositiveUrls to control what URLs to ignore
+  in upcoming Content-Security-Policy feature's reporting.
+
+=== New features in 1.28 ===
+* User::isBot() method for checking if an account is a bot role account.
+* Added a new 'slideshow' mode for galleries.
+* Added a new hook, 'UserIsBot', to aid in determining if a user is a bot.
+* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
+  interact with API parsing.
+* Added a new hook, 'UploadVerifyUpload', which can be used to reject a file
+  upload. Unlike 'UploadVerifyFile' it provides information about upload comment
+  and the file description page, but does not run for uploads to stash.
+* (T141604) Extensions can now provide a better error message when their
+  maintenance scripts are run without the extension being installed.
+* (T8948) Numeric sorting in categories is now supported by setting $wgCategoryCollation
+  to 'uca-default-u-kn' or 'uca-<langcode>-u-kn'. If you can't use UCA collations,
+  a 'numeric' collation is also available. If migrating from another
+  collation, you will need to run the updateCollation.php maintenance script.
+* Two new codes have been added to #time parser function: "xit" for days in current
+  month, and "xiz" for days passed in the year, both in Iranian calendar.
+* mw.Api has a new option, useUS, to use U+001F (Unit Separator) when
+  appropriate for sending multi-valued parameters. This defaults to true when
+  the mw.Api instance seems to be for the local wiki.
+* After a client performs an action which alters a database that has replica databases,
+  MediaWiki will wait for the replica databases to synchronize with the master database
+  while it renders the HTML output. However, if the output is a redirect to another wiki
+  on the wiki farm with a different domain, MediaWiki will instead alter the redirect
+  URL to include a ?cpPosTime parameter that triggers the database synchronization when
+  the URL is followed by the client. The same-domain case uses a new cpPosTime cookie.
+* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
+  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
+  'show' parameters to existing API query modules.
+
+=== External library changes in 1.28 ===
+
+==== Upgraded external libraries ====
+* Updated es5-shim from v4.1.5 to v4.5.8
+* Updated composer/semver from v1.4.1 to v1.4.2
+* Updated wikimedia/php-session-serializer from v1.0.3 to v1.0.4
+
+==== New external libraries ====
+* Added wikimedia/scoped-callback v1.0.0
+* Added wikimedia/wait-condition-loop v1.0.1
+
+=== Bug fixes in 1.28 ===
+* (T146496) action=history pages should return 404 HTTP error code if the page does not exist
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T139670) Move 'UserGetRights' call before application of
+  Session::getAllowedUserRights()
+
+=== Action API changes in 1.28 ===
+* Added 'maxarticlesize' property to action=query&meta=siteinfo which contains
+  the value of $wgMaxArticleSize.
+* Property 'modulemessages' from action=parse&prop=modules was removed
+  (deprecated since 1.26).
+* The following response properties from action=login, deprecated in 1.27, are
+  now removed: lgtoken, cookieprefix, sessionid. Clients should handle cookies
+  to properly manage session state.
+* 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.
+* (T141960) Multi-valued parameters may now be separated using U+001F (Unit Separator)
+  instead of the pipe character. This will be useful if some of the multiple
+  values need to contain pipes, e.g. for action=options.
+* The API will now warn if input is not NFC-normalized Unicode or if it
+  contains invalid characters.
+* The 'normalized' list output by action=query and other modules that use
+  ApiPageSet may contain entries where the 'from' value is percent-encoded as
+  the raw value cannot be represented in a valid API response. These are
+  indicated by a 'fromencoded' boolean alongside the existing 'from' parameter.
+* (T28680) action=paraminfo can now return info about all submodules of a
+  module without listing them all explicitly.
+* (T146770) It is now possible to assert that the current user is a specific
+  named user, using the 'assertuser' parameter.
+* (T141963) Added a 'known' property when missing-but-known titles (e.g. from
+  the 'TitleIsAlwaysKnown' hook) are output in various modules.
+
+=== Action API internal changes in 1.28 ===
+* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
+  interact with ApiParse and ApiExpandTemplates.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* ApiBase::getResultData() was removed (deprecated since 1.25)
+* ApiBase::makeHelpArrayToString() was removed (deprecated since 1.25)
+* ApiBase::makeHelpMsgParameters() was removed (deprecated since 1.25)
+* ApiBase::makeHelpMsg() was removed (deprecated since 1.25)
+* ApiFormatBase::formatHTML() was removed (deprecated since 1.25)
+* ApiFormatBase::getNeedsRawData() was removed (deprecated since 1.25)
+* ApiFormatBase::getWantsHelp() was removed (deprecated since 1.25)
+* ApiFormatBase::setBufferResult() was removed (deprecated since 1.25)
+* ApiFormatBase::setHelp() was removed (deprecated since 1.25)
+* ApiFormatBase::setUnescapeAmps() was removed (deprecated since 1.25)
+* ApiMain::makeHelpMsgHeader() was removed (deprecated since 1.25)
+* ApiMain::reallyMakeHelpMsg() was removed (deprecated since 1.25)
+* ApiMain::setHelp() was removed (deprecated since 1.25)
+* ApiResult::beginContinuation() was removed (deprecated since 1.25)
+* ApiResult::cleanUpUTF8() was removed (deprecated since 1.25)
+* ApiResult::convertStatusToArray() was removed (deprecated since 1.25)
+* ApiResult::disableSizeCheck() was removed (deprecated since 1.24)
+* ApiResult::enableSizeCheck() was removed (deprecated since 1.24)
+* ApiResult::endContinuation() was removed (deprecated since 1.25)
+* ApiResult::getData() was removed (deprecated since 1.25)
+* ApiResult::getIsRawMode() was removed (deprecated since 1.25)
+* ApiResult::setContent() was removed (deprecated since 1.25)
+* ApiResult::setContinueParam() was removed (deprecated since 1.25)
+* ApiResult::setElement() was removed (deprecated since 1.25)
+* ApiResult::setGeneratorContinueParam() was removed (deprecated since 1.25)
+* ApiResult::setIndexedTagName_internal() was removed (deprecated since 1.25)
+* ApiResult::setIndexedTagName_recursive() was removed (deprecated since 1.25)
+* ApiResult::setMainForContinuation() was removed (deprecated since 1.25)
+* ApiResult::setParsedLimit() was removed (deprecated since 1.25)
+* ApiResult::setRawMode() was removed (deprecated since 1.25)
+* ApiResult::size() was removed (deprecated since 1.25)
+* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
+  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
+  'show' parameters to existing API query modules. A query module can enable
+  these hooks by passing an array for $hookData to ApiQueryBase::select() and
+  by calling ApiQueryBase->processRow() before adding a row's data to the
+  result.
+
+=== Languages updated in 1.28 ===
+
+MediaWiki supports over 375 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Phabricator reports.
+
+* (T137411) ban (Balinese), thanks to translators Adi Mayndra, Andru,
+  BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라.
+* (T135867) shn (Shan), thanks to translators Khun Sar, Piangpha,
+  Saiddzone Saimawnkham, Saosukham, and Sengwan.
+* Czech (cs) and Slovak (sk) set as reciprocal fallbacks.
+* (T146744) Livvi-Karelian (olo) namespace messages created thanks to translator Ilja.mos.
+
+=== Other changes in 1.28 ===
+* (T128697) Improved handling of large diffs.
+* [BREAKING CHANGE] $wgExtendedLoginCookies has been removed. You can
+  use or update a custom session provider if needed.
+* Deprecated APIEditBeforeSave hook in favor of EditFilterMergedContent.
+* The 'UploadVerification' hook is deprecated. Use 'UploadVerifyFile' instead.
+* SiteConfiguration::isLocalVHost() was removed (deprecated since 1.25).
+* The 'UserLoginComplete' hook has a new parameter to differentiate between actual
+  login and visiting the login page while already logged in.
+* ResourceLoader::makeLoaderURL() was removed (deprecated since 1.24).
+* $.fn.liveAndTestAtStart was removed (deprecated since 1.24).
+* mw.util.tooltipAccessKeyPrefix was removed (deprecated since 1.24).
+* mw.util.tooltipAccessKeyRegexp was removed (deprecated since 1.24).
+* Linker::link() and Linker::linkKnown() were deprecated; please instead use
+  MediaWiki\Linker\LinkRenderer. In addition, the LinkBegin and LinkEnd hooks
+  were replaced by HtmlPageLinkRendererBegin and HtmlPageLinkRendererEnd
+  respectively. See docs/hooks.txt for the specific changes needed for those hooks.
+* Linker::formatSize() was deprecated. Use Language::formatSize() directly.
+* Aliases for Linker methods, deprecated since 1.21, were removed from Skin:
+  * Skin::commentBlock() (use Linker::commentBlock() instead)
+  * Skin::generateRollback() (use Linker::generateRollback() instead)
+  * Skin::link() (use MediaWiki\Linker\LinkRenderer instead)
+  * Skin::linkKnown() (use MediaWiki\Linker\LinkRenderer instead)
+  * Skin::userLink() (use Linker::userLink() instead)
+  * Skin::userToolLinks() (use Linker::userToolLinks() instead)
+* Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is
+  disabled.
+* DifferenceEngine::generateDiffBody() was removed (deprecated since 1.21).
+* UploadBase::stashFileGetKey() and UploadBase::stashSession() were deprecated.
+  Use ...->stashFile()->getFileKey() instead.
+* "Public domain" was removed as a wiki license option from the installer, in
+  favour of CC-0.
+* AuthenticationRequest::$required is now changed from REQUIRED to PRIMARY_REQUIRED
+  on requests needed by primary providers even if all primaries need them.
+  Primary providers are discouraged from returning multiple REQUIRED requests.
+* OOjs UI PHP widgets constructed with the `'infusable' => true` config option
+  will no longer be automatically infused. You should call `OO.ui.infuse()`
+  on them yourself from your JavaScript code.
+* parserTests.php has moved to tests/parser/parserTests.php
+* The command line options specific to parser tests have been removed from
+  phpunit.php: --regex and --keep-uploads. Instead of --regex, use --filter.
+  Instead of --keep-uploads, use the same option to parserTests.php, but you
+  must specify a directory with --upload-dir.
+* The 'jquery.arrowSteps' ResourceLoader module is now deprecated.
+* IP::isConfiguredProxy() and IP::isTrustedProxy() were removed. Callers should
+  migrate to using the same functions on a ProxyLookup instance, obtainable from
+  MediaWikiServices.
+* The ArticleAfterFetchContent, ArticleInsertComplete, ArticleSave, ArticleSaveComplete,
+  ArticleViewCustom, EditFilterMerged, EditPageGetDiffText, EditPageGetPreviewText and
+  ShowRawCssJs hooks will now emit deprecation warnings if used.
+* (T68404) CSS3 attr() function with url type is no longer allowed
+  in inline styles.
+* Database::getSearchEngine() is deprecated, use SearchEngineFactory::getSearchEngineClass
+  instead.
+
+== Compatibility ==
+
+MediaWiki 1.28 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.28 has several database changes since 1.27, 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.27.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.
 
 = MediaWiki 1.27 =
 
+== MediaWiki 1.27.1 ==
+
+This is a maintenance release of the MediaWiki 1.27 branch.
+
+=== Changes since 1.27.0 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* (T57548) Remove support for $wgWellFormedXml = false, all output is now well formed
+* (T139670) Move 'UserGetRights' call before application of Session::getAllowedUserRights()
+
 == MediaWiki 1.27.0 ==
 
 === PHP version requirement in 1.27 ===
@@ -328,7 +673,7 @@ The following PHP extensions are strongly recommended:
 * ApiMain::addFormat() was removed (deprecated in 1.21).
 * ApiMain::getFormats() was removed (deprecated in 1.21).
 * ApiPageSet::finishPageSetGeneration() was removed (deprecated in 1.21).
-* ApiCreateAccount is deprecated, and will be removed soon.
+* ApiCreateAccount was removed.
 
 === Languages updated in 1.27 ===
 
@@ -585,6 +930,55 @@ For notes on 1.26.x and older releases, see HISTORY.
 
 = MediaWiki 1.26 =
 
+== MediaWiki 1.26.4 ==
+
+This is a maintenance release of the MediaWiki 1.26 branch.
+
+=== Changes since 1.26.3 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* (T124163) Fixed fatal error in DifferenceEngine under HHVM.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* Remove support for $wgWellFormedXml = false, all output is now well formed
+
+== MediaWiki 1.26.3 ==
+
+This is a maintenance release of the MediaWiki 1.26 branch.
+
+=== Changes since 1.26.2 ===
+* (T116266) Fixed undefined property notices in DairikiDiff under HHVM.
+* (T123166) Fix fatal error when importing pages to titles which cannot be
+  created, such as invalid titles or titles the user is not allowed to edit.
+* (T122056) Old tokens are remaining valid within a new session
+* (T127114) Login throttle can be tricked using non-canonicalized usernames
+* (T123653) Cross-domain policy regexp is too narrow
+* (T123071) Incorrectly identifying http link in a's href attributes, due to
+  m modifier in regex
+* (T129506) MediaWiki:Gadget-popups.js isn't renderable
+* (T125283) Users occasionally logged in as different users after
+  SessionManager deployment
+* (T103239) Patrol allows click catching and patrolling of any page
+* (T122807) [tracking] Check php crypto primatives
+* (T98313) Graphs can leak tokens, leading to CSRF
+* (T130947) Diff generation should use PoolCounter
+* (T133507) Careless use of $wgExternalLinkTarget is insecure
+* (T132874) API action=move is not rate limited
+* (T110143) strip markers can be used to get around html attribute escaping in
+  (many?) parser tags
+* (T116030) Increase pbkdf2 parameter strengths
+* (T127420) Pbkdf2Password does not check if hash_pbkdf2() succeeded
+* (T126685) Globally throttle password attempts
+
 == MediaWiki 1.26.2 ==
 
 This is a maintenance release of the MediaWiki 1.26 branch.
@@ -863,6 +1257,33 @@ changes to languages because of Phabricator reports.
 
 = MediaWiki 1.25 =
 
+== MediaWiki 1.25.6 ==
+
+This is a maintenance release of the MediaWiki 1.25 branch.
+
+=== Changes since 1.25.5 ===
+* (T123166) Fix fatal error when importing pages to titles which cannot be
+  created, such as invalid titles or titles the user is not allowed to edit.
+* (T122056) Old tokens are remaining valid within a new session
+* (T127114) Login throttle can be tricked using non-canonicalized usernames
+* (T123653) Cross-domain policy regexp is too narrow
+* (T123071) Incorrectly identifying http link in a's href attributes, due to
+  m modifier in regex
+* (T129506) MediaWiki:Gadget-popups.js isn't renderable
+* (T125283) Users occasionally logged in as different users after
+  SessionManager deployment
+* (T103239) Patrol allows click catching and patrolling of any page
+* (T122807) [tracking] Check php crypto primatives
+* (T98313) Graphs can leak tokens, leading to CSRF
+* (T130947) Diff generation should use PoolCounter
+* (T133507) Careless use of $wgExternalLinkTarget is insecure
+* (T132874) API action=move is not rate limited
+* (T110143) strip markers can be used to get around html attribute escaping in
+  (many?) parser tags
+* (T116030) Increase pbkdf2 parameter strengths
+* (T127420) Pbkdf2Password does not check if hash_pbkdf2() succeeded
+* (T126685) Globally throttle password attempts
+
 == MediaWiki 1.25.5 ==
 
 This is a maintenance release of the MediaWiki 1.25 branch.
@@ -2249,6 +2670,26 @@ of files that are no longer available follows.
 
 = MediaWiki 1.23 =
 
+== MediaWiki 1.23.15 ==
+
+This is a maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.14 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* Remove support for $wgWellFormedXml = false, all output is now well formed
+
 == MediaWiki 1.23.13 ==
 
 This is a maintenance release of the MediaWiki 1.23 branch.
diff --git a/README b/README
index 6d3ab80..ad9b9d9 100644 (file)
--- a/README
+++ b/README
@@ -19,7 +19,7 @@ RELEASE-NOTES, INSTALL, and UPGRADE.
 * Ready to get started?
 ** https://www.mediawiki.org/wiki/Special:MyLanguage/Download
 * Looking for the technical manual?
-** https://www.mediawiki.org/wiki/Special:MyLangyage/Manual:Contents
+** https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents
 * Seeking help from a person?
 ** https://www.mediawiki.org/wiki/Special:MyLanguage/Communication
 * Looking to file a bug report or a feature request?
diff --git a/RELEASE-NOTES-1.28 b/RELEASE-NOTES-1.28
deleted file mode 100644 (file)
index 58ae23b..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-== MediaWiki 1.28 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.28 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== Changes since 1.28.0rc0 ===
-* (T142210) The changes to move the parser "NewPP limit report" from a HTML
-  comment to a machine-readable JavaScript config option 'wgPageParseReport'
-  have been undone. They caused the human-readable limit report to be shown
-  incompletely or not at all. ParserOutput::setLimitReportData() and
-  getLimitReportData() behave as they did in MediaWiki 1.27 again.
-* (T149510) Value of {{DISPLAYTITLE:}} parser function will not be used for
-  the text of subheadings on a category page when creating it. This wasn't
-  working correctly.
-* (T106793) MediaWiki will no longer try to perform a HTTP redirect to the
-  canonical pretty URL when a non-pretty URL is used. It resulted in redirect
-  loops in some clients and in some server configurations. This undoes a change
-  made in MediaWiki 1.26.
-
-=== Configuration changes in 1.28 ===
-* $wgSend404Code now affects status code of action=history if the page is not there.
-* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
-  made by MediaWiki via a proxy. Relying on the http_proxy environment
-  variable is no longer supported.
-* The load.php entry point now enforces the existing policy of not allowing
-  access to session data, which includes the session user and the session
-  user's language. If such access is attempted, an exception will be thrown.
-* The number of internal PBKDF2 iterations used to derive the session secret
-  is configurable via $wgSessionPbkdf2Iterations.
-* Upload dialog's file upload log comment can now be configured separately for
-  local and foreign uploads.
-* $wgForeignUploadTargets now defaults to `[ 'local' ]`, where `'local'`
-  signifies local uploads. A value of `[]` (empty array) now means that
-  no upload targets are allowed, effectively disabling the upload dialog.
-* The deprecated $wgEditEncoding variable has been removed; it was only used
-  for Esperanto language character conversion. You are now recommended to use
-  input methods provided by the UniversalLanguageSelector extension.
-* When $wgPingback is true, MediaWiki will periodically ping
-  https://www.mediawiki.org/beacon with basic information about the local
-  MediaWiki installation. This data includes, for example, the type of system,
-  PHP version, and chosen database backend. This behavior is off by default.
-* When $wgEditSubmitButtonLabelPublish is true, MediaWiki will label the button
-  to store-to-database-and-show-to-others as "Publish page"/"Publish changes";
-  if false, the default, they will be "Save page"/"Save changes".
-* The 'editcontentmodel' permission is now granted to all logged-in users ('user').
-  instead of just administrators ('sysop'). Documentation for this feature is
-  available at <https://www.mediawiki.org/wiki/Help:ChangeContentModel>.
-* $wgRevisionCacheExpiry is now set to one week by default instead of being disabled.
-* Magic links are now disabled by default, and can be re-enabled by modifying the value
-  of $wgEnableMagicLinks. Their usage is discouraged, but if they are manually enabled,
-  a tracking category will be added to help identify usage and make it easier to migrate
-  away from. If you depend upon magic link functionality, it is requested that you comment
-  on <https://www.mediawiki.org/wiki/Requests_for_comment/Future_of_magic_links> and
-  explain your use case(s).
-* New config variable $wgCSPFalsePositiveUrls to control what URLs to ignore
-  in upcoming Content-Security-Policy feature's reporting.
-
-=== New features in 1.28 ===
-* User::isBot() method for checking if an account is a bot role account.
-* Added a new 'slideshow' mode for galleries.
-* Added a new hook, 'UserIsBot', to aid in determining if a user is a bot.
-* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
-  interact with API parsing.
-* Added a new hook, 'UploadVerifyUpload', which can be used to reject a file
-  upload. Unlike 'UploadVerifyFile' it provides information about upload comment
-  and the file description page, but does not run for uploads to stash.
-* (T141604) Extensions can now provide a better error message when their
-  maintenance scripts are run without the extension being installed.
-* (T8948) Numeric sorting in categories is now supported by setting $wgCategoryCollation
-  to 'uca-default-u-kn' or 'uca-<langcode>-u-kn'. If you can't use UCA collations,
-  a 'numeric' collation is also available. If migrating from another
-  collation, you will need to run the updateCollation.php maintenance script.
-* Two new codes have been added to #time parser function: "xit" for days in current
-  month, and "xiz" for days passed in the year, both in Iranian calendar.
-* mw.Api has a new option, useUS, to use U+001F (Unit Separator) when
-  appropriate for sending multi-valued parameters. This defaults to true when
-  the mw.Api instance seems to be for the local wiki.
-* After a client performs an action which alters a database that has replica databases,
-  MediaWiki will wait for the replica databases to synchronize with the master database
-  while it renders the HTML output. However, if the output is a redirect to another wiki
-  on the wiki farm with a different domain, MediaWiki will instead alter the redirect
-  URL to include a ?cpPosTime parameter that triggers the database synchronization when
-  the URL is followed by the client. The same-domain case uses a new cpPosTime cookie.
-* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
-  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
-  'show' parameters to existing API query modules.
-
-=== External library changes in 1.28 ===
-
-==== Upgraded external libraries ====
-* Updated es5-shim from v4.1.5 to v4.5.8
-* Updated composer/semver from v1.4.1 to v1.4.2
-* Updated wikimedia/php-session-serializer from v1.0.3 to v1.0.4
-
-==== New external libraries ====
-* Added wikimedia/scoped-callback v1.0.0
-* Added wikimedia/wait-condition-loop v1.0.1
-
-==== Removed and replaced external libraries ====
-
-=== Bug fixes in 1.28 ===
-* (T146496) action=history pages should return 404 HTTP error code if the page does not exist
-* (T137264) SECURITY: XSS in unclosed internal links
-* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
-* (T133147) SECURITY: Require login to preview user CSS pages
-* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
-  the top file
-* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
-  permissions
-* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
-* (T139670) Move 'UserGetRights' call before application of
-  Session::getAllowedUserRights()
-
-=== Action API changes in 1.28 ===
-* Added 'maxarticlesize' property to action=query&meta=siteinfo which contains
-  the value of $wgMaxArticleSize.
-* Property 'modulemessages' from action=parse&prop=modules was removed
-  (deprecated since 1.26).
-* The following response properties from action=login, deprecated in 1.27, are
-  now removed: lgtoken, cookieprefix, sessionid. Clients should handle cookies
-  to properly manage session state.
-* 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.
-* (T141960) Multi-valued parameters may now be separated using U+001F (Unit Separator)
-  instead of the pipe character. This will be useful if some of the multiple
-  values need to contain pipes, e.g. for action=options.
-* The API will now warn if input is not NFC-normalized Unicode or if it
-  contains invalid characters.
-* The 'normalized' list output by action=query and other modules that use
-  ApiPageSet may contain entries where the 'from' value is percent-encoded as
-  the raw value cannot be represented in a valid API response. These are
-  indicated by a 'fromencoded' boolean alongside the existing 'from' parameter.
-* (T28680) action=paraminfo can now return info about all submodules of a
-  module without listing them all explicitly.
-* (T146770) It is now possible to assert that the current user is a specific
-  named user, using the 'assertuser' parameter.
-* (T141963) Added a 'known' property when missing-but-known titles (e.g. from
-  the 'TitleIsAlwaysKnown' hook) are output in various modules.
-
-=== Action API internal changes in 1.28 ===
-* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
-  interact with ApiParse and ApiExpandTemplates.
-* (T139565) SECURITY: API: Generate head items in the context of the given title
-* (T115333) SECURITY: Check read permission when loading page content in ApiParse
-* ApiBase::getResultData() was removed (deprecated since 1.25)
-* ApiBase::makeHelpArrayToString() was removed (deprecated since 1.25)
-* ApiBase::makeHelpMsgParameters() was removed (deprecated since 1.25)
-* ApiBase::makeHelpMsg() was removed (deprecated since 1.25)
-* ApiFormatBase::formatHTML() was removed (deprecated since 1.25)
-* ApiFormatBase::getNeedsRawData() was removed (deprecated since 1.25)
-* ApiFormatBase::getWantsHelp() was removed (deprecated since 1.25)
-* ApiFormatBase::setBufferResult() was removed (deprecated since 1.25)
-* ApiFormatBase::setHelp() was removed (deprecated since 1.25)
-* ApiFormatBase::setUnescapeAmps() was removed (deprecated since 1.25)
-* ApiMain::makeHelpMsgHeader() was removed (deprecated since 1.25)
-* ApiMain::reallyMakeHelpMsg() was removed (deprecated since 1.25)
-* ApiMain::setHelp() was removed (deprecated since 1.25)
-* ApiResult::beginContinuation() was removed (deprecated since 1.25)
-* ApiResult::cleanUpUTF8() was removed (deprecated since 1.25)
-* ApiResult::convertStatusToArray() was removed (deprecated since 1.25)
-* ApiResult::disableSizeCheck() was removed (deprecated since 1.24)
-* ApiResult::enableSizeCheck() was removed (deprecated since 1.24)
-* ApiResult::endContinuation() was removed (deprecated since 1.25)
-* ApiResult::getData() was removed (deprecated since 1.25)
-* ApiResult::getIsRawMode() was removed (deprecated since 1.25)
-* ApiResult::setContent() was removed (deprecated since 1.25)
-* ApiResult::setContinueParam() was removed (deprecated since 1.25)
-* ApiResult::setElement() was removed (deprecated since 1.25)
-* ApiResult::setGeneratorContinueParam() was removed (deprecated since 1.25)
-* ApiResult::setIndexedTagName_internal() was removed (deprecated since 1.25)
-* ApiResult::setIndexedTagName_recursive() was removed (deprecated since 1.25)
-* ApiResult::setMainForContinuation() was removed (deprecated since 1.25)
-* ApiResult::setParsedLimit() was removed (deprecated since 1.25)
-* ApiResult::setRawMode() was removed (deprecated since 1.25)
-* ApiResult::size() was removed (deprecated since 1.25)
-* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
-  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
-  'show' parameters to existing API query modules. A query module can enable
-  these hooks by passing an array for $hookData to ApiQueryBase::select() and
-  by calling ApiQueryBase->processRow() before adding a row's data to the
-  result.
-
-=== Languages updated in 1.28 ===
-
-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.
-
-* (T137411) ban (Balinese), thanks to translators Adi Mayndra, Andru,
-  BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라.
-* (T135867) shn (Shan), thanks to translators Khun Sar, Piangpha,
-  Saiddzone Saimawnkham, Saosukham, and Sengwan.
-* Czech (cs) and Slovak (sk) set as reciprocal fallbacks.
-* (T146744) Livvi-Karelian (olo) namespace messages created thanks to translator Ilja.mos.
-* Karelian (krl), thanks to translators Flrn, Ilja.mos, Likopiän tyttö, Mashoi7, Matma Rex,
-  Ontoi, Theunitedstatesofme, and Varvana.
-* Gorontalo (gor), thanks to translators Ilham, Lukman Tomayahu, Marwan Mohamad, Matma Rex,
-  NoiX180, and Zhoelyakin.
-
-=== Other changes in 1.28 ===
-* (T128697) Improved handling of large diffs.
-* [BREAKING CHANGE] $wgExtendedLoginCookies has been removed. You can
-  use or update a custom session provider if needed.
-* Deprecated APIEditBeforeSave hook in favor of EditFilterMergedContent.
-* The 'UploadVerification' hook is deprecated. Use 'UploadVerifyFile' instead.
-* SiteConfiguration::isLocalVHost() was removed (deprecated since 1.25).
-* The 'UserLoginComplete' hook has a new parameter to differentiate between actual
-  login and visiting the login page while already logged in.
-* ResourceLoader::makeLoaderURL() was removed (deprecated since 1.24).
-* $.fn.liveAndTestAtStart was removed (deprecated since 1.24).
-* mw.util.tooltipAccessKeyPrefix was removed (deprecated since 1.24).
-* mw.util.tooltipAccessKeyRegexp was removed (deprecated since 1.24).
-* Linker::link() and Linker::linkKnown() were deprecated; please instead use
-  MediaWiki\Linker\LinkRenderer. In addition, the LinkBegin and LinkEnd hooks
-  were replaced by HtmlPageLinkRendererBegin and HtmlPageLinkRendererEnd
-  respectively. See docs/hooks.txt for the specific changes needed for those hooks.
-* Linker::formatSize() was deprecated. Use Language::formatSize() directly.
-* Aliases for Linker methods, deprecated since 1.21, were removed from Skin:
-  * Skin::commentBlock() (use Linker::commentBlock() instead)
-  * Skin::generateRollback() (use Linker::generateRollback() instead)
-  * Skin::link() (use MediaWiki\Linker\LinkRenderer instead)
-  * Skin::linkKnown() (use MediaWiki\Linker\LinkRenderer instead)
-  * Skin::userLink() (use Linker::userLink() instead)
-  * Skin::userToolLinks() (use Linker::userToolLinks() instead)
-* Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is
-  disabled.
-* DifferenceEngine::generateDiffBody() was removed (deprecated since 1.21).
-* UploadBase::stashFileGetKey() and UploadBase::stashSession() were deprecated.
-  Use ...->stashFile()->getFileKey() instead.
-* "Public domain" was removed as a wiki license option from the installer, in
-  favour of CC-0.
-* AuthenticationRequest::$required is now changed from REQUIRED to PRIMARY_REQUIRED
-  on requests needed by primary providers even if all primaries need them.
-  Primary providers are discouraged from returning multiple REQUIRED requests.
-* OOjs UI PHP widgets constructed with the `'infusable' => true` config option
-  will no longer be automatically infused. You should call `OO.ui.infuse()`
-  on them yourself from your JavaScript code.
-* parserTests.php has moved to tests/parser/parserTests.php
-* The command line options specific to parser tests have been removed from
-  phpunit.php: --regex and --keep-uploads. Instead of --regex, use --filter.
-  Instead of --keep-uploads, use the same option to parserTests.php, but you
-  must specify a directory with --upload-dir.
-* The 'jquery.arrowSteps' ResourceLoader module is now deprecated.
-* IP::isConfiguredProxy() and IP::isTrustedProxy() were removed. Callers should
-  migrate to using the same functions on a ProxyLookup instance, obtainable from
-  MediaWikiServices.
-* The ArticleAfterFetchContent, ArticleInsertComplete, ArticleSave, ArticleSaveComplete,
-  ArticleViewCustom, EditFilterMerged, EditPageGetDiffText, EditPageGetPreviewText and
-  ShowRawCssJs hooks will now emit deprecation warnings if used.
-* (T68404) CSS3 attr() function with url type is no longer allowed
-  in inline styles.
-
-== Compatibility ==
-
-MediaWiki 1.28 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.28 has several database changes since 1.27, 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.27.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.
index 3a7cde9..a1ce9d9 100644 (file)
@@ -6,34 +6,128 @@ MediaWiki 1.29 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.29 ===
-* Default cookie expiration time has been reduced to 30 days. Login cookie expiration time is
-  kept at 180 days.
+* Default cookie expiration time has been reduced to 30 days. Login cookie
+  expiration time is kept at 180 days.
 * A new configuration variable has been added: $wgCookieSetOnAutoblock. This
   determines whether to set a cookie when a user is autoblocked. Doing so means
   that a blocked user, even after logging out and moving to a new IP address,
   will still be blocked.
+* The resetpassword right and associated password reset capture feature has
+  been removed.
+* The $error parameter to the EmailUser hook should be set to a Status object
+  or boolean false. This should be compatible with at least MediaWiki 1.23 if
+  not earlier. Returning a raw HTML string is now deprecated.
+* The $message parameter to the ApiCheckCanExecute hook should be set to an
+  ApiMessage. This is compatible with MediaWiki 1.27 and later. Returning a
+  code for ApiBase::parseMsg() will no longer work.
+* ApiBase::$messageMap is no longer public. Code attempting to access it will
+  result in a PHP fatal error.
+* $wgUserEmailUseReplyTo is now true by default to work around restrictive DMARC
+  policies.
+* Subpages are now enabled by default in the Template namespace. Set
+  $wgNamespacesWithSubpages[NS_TEMPLATE] to false to keep the old behavior.
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
+* 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.
+* (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=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.
+* 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 ===
 
@@ -41,9 +135,112 @@ 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 ==
 
index f0bbe92..41b6d81 100644 (file)
@@ -139,13 +139,16 @@ $wgAutoloadLocalClasses = [
        'ApiRsd' => __DIR__ . '/includes/api/ApiRsd.php',
        'ApiSerializable' => __DIR__ . '/includes/api/ApiSerializable.php',
        'ApiSetNotificationTimestamp' => __DIR__ . '/includes/api/ApiSetNotificationTimestamp.php',
+       'ApiSetPageLanguage' => __DIR__ . '/includes/api/ApiSetPageLanguage.php',
        'ApiStashEdit' => __DIR__ . '/includes/api/ApiStashEdit.php',
        'ApiTag' => __DIR__ . '/includes/api/ApiTag.php',
        'ApiTokens' => __DIR__ . '/includes/api/ApiTokens.php',
        'ApiUnblock' => __DIR__ . '/includes/api/ApiUnblock.php',
        'ApiUndelete' => __DIR__ . '/includes/api/ApiUndelete.php',
        'ApiUpload' => __DIR__ . '/includes/api/ApiUpload.php',
+       'ApiUsageException' => __DIR__ . '/includes/api/ApiUsageException.php',
        'ApiUserrights' => __DIR__ . '/includes/api/ApiUserrights.php',
+       'ApiValidatePassword' => __DIR__ . '/includes/api/ApiValidatePassword.php',
        'ApiWatch' => __DIR__ . '/includes/api/ApiWatch.php',
        'ArchivedFile' => __DIR__ . '/includes/filerepo/file/ArchivedFile.php',
        'ArrayDiffFormatter' => __DIR__ . '/includes/diff/ArrayDiffFormatter.php',
@@ -244,7 +247,6 @@ $wgAutoloadLocalClasses = [
        'CheckStorage' => __DIR__ . '/maintenance/storage/checkStorage.php',
        'CheckSyntax' => __DIR__ . '/maintenance/checkSyntax.php',
        'CheckUsernames' => __DIR__ . '/maintenance/checkUsernames.php',
-       'ChronologyProtector' => __DIR__ . '/includes/libs/rdbms/ChronologyProtector.php',
        'ClassCollector' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
        'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php',
        'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php',
@@ -255,10 +257,12 @@ $wgAutoloadLocalClasses = [
        'ClearInterwikiCache' => __DIR__ . '/maintenance/clearInterwikiCache.php',
        'CliInstaller' => __DIR__ . '/includes/installer/CliInstaller.php',
        'CloneDatabase' => __DIR__ . '/includes/db/CloneDatabase.php',
+       'CodeCleanerGlobalsPass' => __DIR__ . '/maintenance/CodeCleanerGlobalsPass.inc',
        'CodeContentHandler' => __DIR__ . '/includes/content/CodeContentHandler.php',
        'Collation' => __DIR__ . '/includes/collation/Collation.php',
        'CollationCkb' => __DIR__ . '/includes/collation/CollationCkb.php',
        'CollationEt' => __DIR__ . '/includes/collation/CollationEt.php',
+       'CollationFa' => __DIR__ . '/includes/collation/CollationFa.php',
        'CommandLineInc' => __DIR__ . '/maintenance/commandLine.inc',
        'CommandLineInstaller' => __DIR__ . '/maintenance/install.php',
        'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
@@ -292,7 +296,6 @@ $wgAutoloadLocalClasses = [
        'CopyJobQueue' => __DIR__ . '/maintenance/copyJobQueue.php',
        'CoreParserFunctions' => __DIR__ . '/includes/parser/CoreParserFunctions.php',
        'CoreTagHooks' => __DIR__ . '/includes/parser/CoreTagHooks.php',
-       'CoreVersionChecker' => __DIR__ . '/includes/registration/CoreVersionChecker.php',
        'CreateAndPromote' => __DIR__ . '/maintenance/createAndPromote.php',
        'CreateFileOp' => __DIR__ . '/includes/libs/filebackend/fileop/CreateFileOp.php',
        'CreditsAction' => __DIR__ . '/includes/actions/CreditsAction.php',
@@ -311,7 +314,6 @@ $wgAutoloadLocalClasses = [
        'DBExpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBExpectedError.php',
        'DBFileJournal' => __DIR__ . '/includes/filebackend/filejournal/DBFileJournal.php',
        'DBLockManager' => __DIR__ . '/includes/libs/lockmanager/DBLockManager.php',
-       'DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
        'DBQueryError' => __DIR__ . '/includes/libs/rdbms/exception/DBQueryError.php',
        'DBReadOnlyError' => __DIR__ . '/includes/libs/rdbms/exception/DBReadOnlyError.php',
        'DBReplicationWaitError' => __DIR__ . '/includes/libs/rdbms/exception/DBReplicationWaitError.php',
@@ -322,11 +324,10 @@ $wgAutoloadLocalClasses = [
        'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
        'Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
        'DatabaseBase' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
-       'DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
        'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
        'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
        'DatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
-       'DatabaseMssql' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
        'DatabaseMysql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysql.php',
        'DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
        'DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
@@ -428,6 +429,8 @@ $wgAutoloadLocalClasses = [
        'ExplodeIterator' => __DIR__ . '/includes/libs/ExplodeIterator.php',
        'ExportProgressFilter' => __DIR__ . '/maintenance/backup.inc',
        'ExportSites' => __DIR__ . '/maintenance/exportSites.php',
+       'ExtensionJsonValidationError' => __DIR__ . '/includes/registration/ExtensionJsonValidationError.php',
+       'ExtensionJsonValidator' => __DIR__ . '/includes/registration/ExtensionJsonValidator.php',
        'ExtensionLanguages' => __DIR__ . '/maintenance/language/languages.inc',
        'ExtensionProcessor' => __DIR__ . '/includes/registration/ExtensionProcessor.php',
        'ExtensionRegistry' => __DIR__ . '/includes/registration/ExtensionRegistry.php',
@@ -443,7 +446,6 @@ $wgAutoloadLocalClasses = [
        'FSFileBackendList' => __DIR__ . '/includes/libs/filebackend/FSFileBackend.php',
        'FSFileOpHandle' => __DIR__ . '/includes/libs/filebackend/FSFileBackend.php',
        'FSLockManager' => __DIR__ . '/includes/libs/lockmanager/FSLockManager.php',
-       'FSRepo' => __DIR__ . '/includes/filerepo/FSRepo.php',
        'FakeAuthTemplate' => __DIR__ . '/includes/specialpage/LoginSignupSpecialPage.php',
        'FakeConverter' => __DIR__ . '/languages/FakeConverter.php',
        'FakeMaintenance' => __DIR__ . '/maintenance/Maintenance.php',
@@ -503,6 +505,7 @@ $wgAutoloadLocalClasses = [
        'FormSpecialPage' => __DIR__ . '/includes/specialpage/FormSpecialPage.php',
        'FormatJson' => __DIR__ . '/includes/json/FormatJson.php',
        'FormatMetadata' => __DIR__ . '/includes/media/FormatMetadata.php',
+       'FormattedRCFeed' => __DIR__ . '/includes/rcfeed/FormattedRCFeed.php',
        'FormlessAction' => __DIR__ . '/includes/actions/FormlessAction.php',
        'GIFHandler' => __DIR__ . '/includes/media/GIF.php',
        'GIFMetadataExtractor' => __DIR__ . '/includes/media/GIFMetadataExtractor.php',
@@ -564,6 +567,7 @@ $wgAutoloadLocalClasses = [
        'HTMLTextFieldWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLTextFieldWithButton.php',
        'HTMLTitleTextField' => __DIR__ . '/includes/htmlform/fields/HTMLTitleTextField.php',
        'HTMLUserTextField' => __DIR__ . '/includes/htmlform/fields/HTMLUserTextField.php',
+       'HTMLUsersMultiselectField' => __DIR__ . '/includes/htmlform/fields/HTMLUsersMultiselectField.php',
        'HTTPFileStreamer' => __DIR__ . '/includes/libs/filebackend/HTTPFileStreamer.php',
        'HWLDFWordAccumulator' => __DIR__ . '/includes/diff/DairikiDiff.php',
        'HashBagOStuff' => __DIR__ . '/includes/libs/objectcache/HashBagOStuff.php',
@@ -592,9 +596,7 @@ $wgAutoloadLocalClasses = [
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
        'IExpiringStore' => __DIR__ . '/includes/libs/objectcache/IExpiringStore.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
-       'ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
-       'ILoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/ILoadBalancer.php',
-       'ILoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/ILoadMonitor.php',
+       'ILocalizedException' => __DIR__ . '/includes/exception/LocalizedException.php',
        'IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php',
        'IP' => __DIR__ . '/includes/libs/IP.php',
        'IPSet' => __DIR__ . '/includes/compat/IPSetCompat.php',
@@ -604,7 +606,6 @@ $wgAutoloadLocalClasses = [
        'IdentityCollation' => __DIR__ . '/includes/collation/IdentityCollation.php',
        'ImageBuilder' => __DIR__ . '/maintenance/rebuildImages.php',
        'ImageCleanup' => __DIR__ . '/maintenance/cleanupImages.php',
-       'ImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
        'ImageGalleryBase' => __DIR__ . '/includes/gallery/ImageGalleryBase.php',
        'ImageHandler' => __DIR__ . '/includes/media/ImageHandler.php',
        'ImageHistoryList' => __DIR__ . '/includes/page/ImageHistoryList.php',
@@ -612,6 +613,7 @@ $wgAutoloadLocalClasses = [
        'ImageListPager' => __DIR__ . '/includes/specials/pagers/ImageListPager.php',
        'ImagePage' => __DIR__ . '/includes/page/ImagePage.php',
        'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
+       'ImportImages' => __DIR__ . '/maintenance/importImages.php',
        'ImportLogFormatter' => __DIR__ . '/includes/logging/ImportLogFormatter.php',
        'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
        'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
@@ -667,10 +669,6 @@ $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',
-       'LBFactoryMulti' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactoryMulti.php',
-       'LBFactorySimple' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySimple.php',
-       'LBFactorySingle' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySingle.php',
        'LCStore' => __DIR__ . '/includes/cache/localisation/LCStore.php',
        'LCStoreCDB' => __DIR__ . '/includes/cache/localisation/LCStoreCDB.php',
        'LCStoreDB' => __DIR__ . '/includes/cache/localisation/LCStoreDB.php',
@@ -691,7 +689,6 @@ $wgAutoloadLocalClasses = [
        'LanguageFi' => __DIR__ . '/languages/classes/LanguageFi.php',
        'LanguageGa' => __DIR__ . '/languages/classes/LanguageGa.php',
        'LanguageGan' => __DIR__ . '/languages/classes/LanguageGan.php',
-       'LanguageHe' => __DIR__ . '/languages/classes/LanguageHe.php',
        'LanguageHsb' => __DIR__ . '/languages/classes/LanguageHsb.php',
        'LanguageHu' => __DIR__ . '/languages/classes/LanguageHu.php',
        'LanguageHy' => __DIR__ . '/languages/classes/LanguageHy.php',
@@ -728,7 +725,6 @@ $wgAutoloadLocalClasses = [
        'LegacyLogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
        'License' => __DIR__ . '/includes/Licenses.php',
        'Licenses' => __DIR__ . '/includes/Licenses.php',
-       'LikeMatch' => __DIR__ . '/includes/libs/rdbms/encasing/LikeMatch.php',
        'LinkBatch' => __DIR__ . '/includes/cache/LinkBatch.php',
        'LinkCache' => __DIR__ . '/includes/cache/LinkCache.php',
        'LinkFilter' => __DIR__ . '/includes/LinkFilter.php',
@@ -743,9 +739,6 @@ $wgAutoloadLocalClasses = [
        'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php',
        'LoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancer.php',
        'LoadBalancerSingle' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php',
-       'LoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitor.php',
-       'LoadMonitorMySQL' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php',
-       'LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php',
        'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileLockError' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
@@ -756,6 +749,7 @@ $wgAutoloadLocalClasses = [
        'LocalSettingsGenerator' => __DIR__ . '/includes/installer/LocalSettingsGenerator.php',
        'LocalisationCache' => __DIR__ . '/includes/cache/localisation/LocalisationCache.php',
        'LocalisationCacheBulkLoad' => __DIR__ . '/includes/cache/localisation/LocalisationCacheBulkLoad.php',
+       'LocalizedException' => __DIR__ . '/includes/exception/LocalizedException.php',
        'LockManager' => __DIR__ . '/includes/libs/lockmanager/LockManager.php',
        'LockManagerGroup' => __DIR__ . '/includes/filebackend/lockmanager/LockManagerGroup.php',
        'LogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
@@ -773,7 +767,7 @@ $wgAutoloadLocalClasses = [
        'LongPagesPage' => __DIR__ . '/includes/specials/SpecialLongpages.php',
        'MIMEsearchPage' => __DIR__ . '/includes/specials/SpecialMIMEsearch.php',
        'MWCallableUpdate' => __DIR__ . '/includes/deferred/MWCallableUpdate.php',
-       'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
+       'MWContentSerializationException' => __DIR__ . '/includes/exception/MWContentSerializationException.php',
        'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
        'MWCryptHash' => __DIR__ . '/includes/libs/MWCryptHash.php',
        'MWCryptRand' => __DIR__ . '/includes/utils/MWCryptRand.php',
@@ -794,16 +788,18 @@ $wgAutoloadLocalClasses = [
        'MWSaltedPassword' => __DIR__ . '/includes/password/MWSaltedPassword.php',
        'MWTidy' => __DIR__ . '/includes/parser/MWTidy.php',
        'MWTimestamp' => __DIR__ . '/includes/MWTimestamp.php',
-       'MWUnknownContentModelException' => __DIR__ . '/includes/content/ContentHandler.php',
+       'MWUnknownContentModelException' => __DIR__ . '/includes/exception/MWUnknownContentModelException.php',
        'MachineReadableRCFeedFormatter' => __DIR__ . '/includes/rcfeed/MachineReadableRCFeedFormatter.php',
        'MagicWord' => __DIR__ . '/includes/MagicWord.php',
        'MagicWordArray' => __DIR__ . '/includes/MagicWordArray.php',
        'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php',
        'MainConfigDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php',
        'Maintenance' => __DIR__ . '/maintenance/Maintenance.php',
        'MaintenanceFormatInstallDoc' => __DIR__ . '/maintenance/formatInstallDoc.php',
        'MakeTestEdits' => __DIR__ . '/maintenance/makeTestEdits.php',
        'MalformedTitleException' => __DIR__ . '/includes/title/MalformedTitleException.php',
+       'ManageJobs' => __DIR__ . '/maintenance/manageJobs.php',
        'ManualLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
        'MapCacheLRU' => __DIR__ . '/includes/libs/MapCacheLRU.php',
        'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php',
@@ -817,6 +813,7 @@ $wgAutoloadLocalClasses = [
        'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'MediaWiki' => __DIR__ . '/includes/MediaWiki.php',
        'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php',
+       'MediaWikiShell' => __DIR__ . '/maintenance/shell.php',
        'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
        'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php',
        'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php',
@@ -926,8 +923,19 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Widget\\DateTimeInputWidget' => __DIR__ . '/includes/widget/DateTimeInputWidget.php',
        'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\SearchInputWidget' => __DIR__ . '/includes/widget/SearchInputWidget.php',
+       'MediaWiki\\Widget\\Search\\BasicSearchResultSetWidget' => __DIR__ . '/includes/widget/search/BasicSearchResultSetWidget.php',
+       'MediaWiki\\Widget\\Search\\DidYouMeanWidget' => __DIR__ . '/includes/widget/search/DidYouMeanWidget.php',
+       'MediaWiki\\Widget\\Search\\FullSearchResultWidget' => __DIR__ . '/includes/widget/search/FullSearchResultWidget.php',
+       'MediaWiki\\Widget\\Search\\InterwikiSearchResultSetWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultSetWidget.php',
+       'MediaWiki\\Widget\\Search\\InterwikiSearchResultWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultWidget.php',
+       'MediaWiki\\Widget\\Search\\SearchFormWidget' => __DIR__ . '/includes/widget/search/SearchFormWidget.php',
+       'MediaWiki\\Widget\\Search\\SearchResultSetWidget' => __DIR__ . '/includes/widget/search/SearchResultSetWidget.php',
+       '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\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
+       'MediaWiki\\Widget\\UsersMultiselectWidget' => __DIR__ . '/includes/widget/UsersMultiselectWidget.php',
        'MemCachedClientforWiki' => __DIR__ . '/includes/compat/MemcachedClientCompat.php',
        'MemcLockManager' => __DIR__ . '/includes/libs/lockmanager/MemcLockManager.php',
        'MemcachedBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedBagOStuff.php',
@@ -963,8 +971,6 @@ $wgAutoloadLocalClasses = [
        'MoveLogFormatter' => __DIR__ . '/includes/logging/MoveLogFormatter.php',
        'MovePage' => __DIR__ . '/includes/MovePage.php',
        'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
-       'MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php',
-       'MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.php',
        'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
        'MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
        'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
@@ -974,8 +980,6 @@ $wgAutoloadLocalClasses = [
        'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
        'MutableContext' => __DIR__ . '/includes/context/MutableContext.php',
        'MwSql' => __DIR__ . '/maintenance/sql.php',
-       'MySQLField' => __DIR__ . '/includes/libs/rdbms/field/MySQLField.php',
-       'MySQLMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/MySQLMasterPos.php',
        'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MySqlLockManager.php',
        'MysqlInstaller' => __DIR__ . '/includes/installer/MysqlInstaller.php',
        'MysqlUpdater' => __DIR__ . '/includes/installer/MysqlUpdater.php',
@@ -1000,8 +1004,8 @@ $wgAutoloadLocalClasses = [
        'NullStatsdDataFactory' => __DIR__ . '/includes/libs/stats/NullStatsdDataFactory.php',
        'NumericUppercaseCollation' => __DIR__ . '/includes/collation/NumericUppercaseCollation.php',
        'OOUIHTMLForm' => __DIR__ . '/includes/htmlform/OOUIHTMLForm.php',
-       'ORAField' => __DIR__ . '/includes/libs/rdbms/field/ORAField.php',
-       'ORAResult' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'ORAField' => __DIR__ . '/includes/db/ORAField.php',
+       'ORAResult' => __DIR__ . '/includes/db/ORAResult.php',
        'ObjectCache' => __DIR__ . '/includes/objectcache/ObjectCache.php',
        'ObjectFactory' => __DIR__ . '/includes/libs/ObjectFactory.php',
        'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php',
@@ -1080,6 +1084,7 @@ $wgAutoloadLocalClasses = [
        'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php',
        'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
        'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
+       'PopulateInterwiki' => __DIR__ . '/maintenance/populateInterwiki.php',
        'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php',
        'PopulateLogUsertext' => __DIR__ . '/maintenance/populateLogUsertext.php',
        'PopulateParentId' => __DIR__ . '/maintenance/populateParentId.php',
@@ -1087,8 +1092,6 @@ $wgAutoloadLocalClasses = [
        'PopulateRevisionLength' => __DIR__ . '/maintenance/populateRevisionLength.php',
        'PopulateRevisionSha1' => __DIR__ . '/maintenance/populateRevisionSha1.php',
        'PostgreSqlLockManager' => __DIR__ . '/includes/libs/lockmanager/PostgreSqlLockManager.php',
-       'PostgresBlob' => __DIR__ . '/includes/libs/rdbms/encasing/PostgresBlob.php',
-       'PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
        'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
        'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
        'Preferences' => __DIR__ . '/includes/Preferences.php',
@@ -1132,6 +1135,7 @@ $wgAutoloadLocalClasses = [
        'RCCacheEntry' => __DIR__ . '/includes/changes/RCCacheEntry.php',
        'RCCacheEntryFactory' => __DIR__ . '/includes/changes/RCCacheEntryFactory.php',
        'RCDatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'RCFeed' => __DIR__ . '/includes/rcfeed/RCFeed.php',
        'RCFeedEngine' => __DIR__ . '/includes/rcfeed/RCFeedEngine.php',
        'RCFeedFormatter' => __DIR__ . '/includes/rcfeed/RCFeedFormatter.php',
        'RESTBagOStuff' => __DIR__ . '/includes/libs/objectcache/RESTBagOStuff.php',
@@ -1197,7 +1201,6 @@ $wgAutoloadLocalClasses = [
        'ResourceLoaderSpecialCharacterDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php',
        'ResourceLoaderStartUpModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderStartUpModule.php',
        'ResourceLoaderUploadDialogModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUploadDialogModule.php',
-       'ResourceLoaderUserCSSPrefsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
        'ResourceLoaderUserDefaultsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserDefaultsModule.php',
        'ResourceLoaderUserModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserModule.php',
        'ResourceLoaderUserOptionsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserOptionsModule.php',
@@ -1231,7 +1234,6 @@ $wgAutoloadLocalClasses = [
        'RevisionItemBase' => __DIR__ . '/includes/RevisionList.php',
        'RevisionList' => __DIR__ . '/includes/RevisionList.php',
        'RevisionListBase' => __DIR__ . '/includes/RevisionList.php',
-       'RevisiondeleteAction' => __DIR__ . '/includes/actions/RevisiondeleteAction.php',
        'RiffExtractor' => __DIR__ . '/includes/libs/RiffExtractor.php',
        'RightsLogFormatter' => __DIR__ . '/includes/logging/RightsLogFormatter.php',
        'RollbackAction' => __DIR__ . '/includes/actions/RollbackAction.php',
@@ -1239,7 +1241,6 @@ $wgAutoloadLocalClasses = [
        'RowUpdateGenerator' => __DIR__ . '/includes/utils/RowUpdateGenerator.php',
        'RunJobs' => __DIR__ . '/maintenance/runJobs.php',
        'RunningStat' => __DIR__ . '/includes/compat/RunningStatCompat.php',
-       'SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
        'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php',
@@ -1421,7 +1422,7 @@ $wgAutoloadLocalClasses = [
        'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
        'TagLogFormatter' => __DIR__ . '/includes/logging/TagLogFormatter.php',
        'TempFSFile' => __DIR__ . '/includes/libs/filebackend/fsfile/TempFSFile.php',
-       'TempFileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
+       'TempFileRepo' => __DIR__ . '/includes/filerepo/TempFileRepo.php',
        'TemplateParser' => __DIR__ . '/includes/TemplateParser.php',
        'TemplatesOnThisPageFormatter' => __DIR__ . '/includes/TemplatesOnThisPageFormatter.php',
        'TestFileOpPerformance' => __DIR__ . '/maintenance/fileOpPerfTest.php',
@@ -1446,8 +1447,8 @@ $wgAutoloadLocalClasses = [
        'TitlePrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
        'TitleValue' => __DIR__ . '/includes/title/TitleValue.php',
        'TrackBlobs' => __DIR__ . '/maintenance/storage/trackBlobs.php',
+       'TrackingCategories' => __DIR__ . '/includes/TrackingCategories.php',
        'TraditionalImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
-       'TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
        'TransformParameterError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'TransformTooBigImageAreaError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'TransformationalImageHandler' => __DIR__ . '/includes/media/TransformationalImageHandler.php',
@@ -1503,13 +1504,14 @@ $wgAutoloadLocalClasses = [
        'UploadStashWrongOwnerException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UppercaseCollation' => __DIR__ . '/includes/collation/UppercaseCollation.php',
-       'UsageException' => __DIR__ . '/includes/api/ApiMain.php',
+       'UsageException' => __DIR__ . '/includes/api/ApiUsageException.php',
        'User' => __DIR__ . '/includes/user/User.php',
        'UserArray' => __DIR__ . '/includes/user/UserArray.php',
        'UserArrayFromResult' => __DIR__ . '/includes/user/UserArrayFromResult.php',
        'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php',
        'UserCache' => __DIR__ . '/includes/cache/UserCache.php',
        'UserDupes' => __DIR__ . '/maintenance/userDupes.inc',
+       'UserGroupMembership' => __DIR__ . '/includes/user/UserGroupMembership.php',
        'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php',
        'UserNamePrefixSearch' => __DIR__ . '/includes/user/UserNamePrefixSearch.php',
        'UserNotLoggedIn' => __DIR__ . '/includes/exception/UserNotLoggedIn.php',
@@ -1522,10 +1524,14 @@ $wgAutoloadLocalClasses = [
        'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
        'VFormHTMLForm' => __DIR__ . '/includes/htmlform/VFormHTMLForm.php',
        'ValidateRegistrationFile' => __DIR__ . '/maintenance/validateRegistrationFile.php',
+       'VersionChecker' => __DIR__ . '/includes/registration/VersionChecker.php',
        'ViewAction' => __DIR__ . '/includes/actions/ViewAction.php',
+       'ViewCLI' => __DIR__ . '/maintenance/view.php',
        'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
        'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
+       'WANCacheReapUpdate' => __DIR__ . '/includes/deferred/WANCacheReapUpdate.php',
        'WANObjectCache' => __DIR__ . '/includes/libs/objectcache/WANObjectCache.php',
+       'WANObjectCacheReaper' => __DIR__ . '/includes/libs/objectcache/WANObjectCacheReaper.php',
        'WantedCategoriesPage' => __DIR__ . '/includes/specials/SpecialWantedcategories.php',
        'WantedFilesPage' => __DIR__ . '/includes/specials/SpecialWantedfiles.php',
        'WantedPagesPage' => __DIR__ . '/includes/specials/SpecialWantedpages.php',
@@ -1570,6 +1576,36 @@ $wgAutoloadLocalClasses = [
        '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\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
+       'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
+       'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
+       'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.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\\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',
+       'Wikimedia\\Rdbms\\LBFactorySimple' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySimple.php',
+       'Wikimedia\\Rdbms\\LBFactorySingle' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySingle.php',
+       'Wikimedia\\Rdbms\\LikeMatch' => __DIR__ . '/includes/libs/rdbms/encasing/LikeMatch.php',
+       'Wikimedia\\Rdbms\\LoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancer.php',
+       'Wikimedia\\Rdbms\\LoadBalancerSingle' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php',
+       '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\\MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php',
+       'Wikimedia\\Rdbms\\MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.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\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.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',
        'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
        'WinCacheBagOStuff' => __DIR__ . '/includes/libs/objectcache/WinCacheBagOStuff.php',
index e1d9f47..3520dc3 100644 (file)
@@ -17,7 +17,7 @@
        },
        "require": {
                "composer/semver": "1.4.2",
-               "cssjanus/cssjanus": "1.1.2",
+               "cssjanus/cssjanus": "1.1.3",
                "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.18.0",
+               "oojs/oojs-ui": "0.19.2",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
-               "psr/log": "1.0.0",
+               "psr/log": "1.0.2",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
                "wikimedia/cdb": "1.4.1",
                "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",
                "nikic/php-parser": "2.1.0",
                "nmred/kafka-php": "0.1.5",
-               "phpunit/phpunit": "4.8.24",
-               "wikimedia/avro": "1.7.7"
+               "phpunit/phpunit": "4.8.31",
+               "wikimedia/avro": "1.7.7",
+               "hamcrest/hamcrest-php": "^2.0",
+               "wmde/hamcrest-html-matchers": "^0.1.0",
+               "psy/psysh": "0.8.1"
        },
        "suggest": {
                "ext-apc": "Local data and opcode cache",
                        "ComposerHookHandler": "includes/composer"
                }
        },
+       "autoload-dev": {
+               "files": [
+                       "vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php",
+                       "vendor/wmde/hamcrest-html-matchers/src/functions.php"
+               ]
+       },
        "scripts": {
                "lint": "parallel-lint --exclude vendor",
                "phpcs": "phpcs -p -s",
index 6209b14..5f379e7 100644 (file)
@@ -21,10 +21,6 @@ ContentHandler::getDefaultModelFor($title) as follows:
 * The hook ContentHandlerDefaultModelFor may be used to override the page's default model.
 * Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript model if they end in .css or .js, respectively.
   Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
-* The hook TitleIsCssOrJsPage may be used to force a page to use the CSS or JavaScript model.
-  This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
-* The hook TitleIsWikitextPage may be used to force a page to use the wikitext model.
-  This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
 * Otherwise, the wikitext model is used.
 
 Note that is currently no mechanism to convert a page from one content model to another, and there is no guarantee that
diff --git a/docs/extension.schema.json b/docs/extension.schema.json
deleted file mode 100644 (file)
index 30feaef..0000000
+++ /dev/null
@@ -1,719 +0,0 @@
-{
-       "$schema": "http://json-schema.org/schema#",
-       "description": "MediaWiki extension.json schema",
-       "type": "object",
-       "properties": {
-               "manifest_version": {
-                       "type": "integer",
-                       "description": "Version of the extension.json schema the extension.json file is in.",
-                       "required": true
-               },
-               "name": {
-                       "type": "string",
-                       "description": "The extension's canonical name.",
-                       "required": true
-               },
-               "namemsg": {
-                       "type": "string",
-                       "description": "i18n message key of the extension's name."
-               },
-               "type": {
-                       "type": "string",
-                       "description": "The extension's type, as an index to $wgExtensionCredits.",
-                       "default": "other"
-               },
-               "author": {
-                       "type": [
-                               "string",
-                               "array"
-                       ],
-                       "description": "Extension's authors.",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "version": {
-                       "type": "string",
-                       "description": "The version of this release of the extension."
-               },
-               "url": {
-                       "type": "string",
-                       "description": "URL to the homepage for the extension.",
-                       "format": "uri"
-               },
-               "description": {
-                       "type": "string",
-                       "description": "Raw description of the extension."
-               },
-               "descriptionmsg": {
-                       "type": "string",
-                       "description": "Message key for a i18n message describing the extension."
-               },
-               "license-name": {
-                       "type": "string",
-                       "description": "SPDX identifier for the license under which the extension is released."
-               },
-               "requires": {
-                       "type": "object",
-                       "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
-                       "properties": {
-                               "MediaWiki": {
-                                       "type": "string",
-                                       "description": "Version constraint string against MediaWiki core."
-                               }
-                       }
-               },
-               "ResourceFileModulePaths": {
-                       "type": "object",
-                       "description": "Default paths to use for all ResourceLoader file modules",
-                       "additionalProperties": false,
-                       "properties": {
-                               "localBasePath": {
-                                       "type": "string",
-                                       "description": "Base path to prepend to all local paths, relative to current directory"
-                               },
-                               "remoteExtPath": {
-                                       "type": "string",
-                                       "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
-                               },
-                               "remoteSkinPath": {
-                                       "type": "string",
-                                       "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
-                               }
-                       }
-               },
-               "ResourceModules": {
-                       "type": "object",
-                       "description": "ResourceLoader modules to register",
-                       "patternProperties": {
-                               "^[a-zA-Z0-9-\\.]+$": {
-                                       "type": "object",
-                                       "anyOf": [
-                                               {
-                                                       "description": "A ResourceLoaderFileModule definition",
-                                                       "additionalProperties": false,
-                                                       "properties": {
-                                                               "localBasePath": {
-                                                                       "type": "string",
-                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
-                                                               },
-                                                               "remoteBasePath": {
-                                                                       "type": "string",
-                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
-                                                               },
-                                                               "remoteExtPath": {
-                                                                       "type": "string",
-                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
-                                                               },
-                                                               "skipFunction": {
-                                                                       "type": "string",
-                                                                       "description": "Path to a file containing a JavaScript \"skip function\", if desired."
-                                                               },
-                                                               "scripts": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Scripts to always include (array of file paths)",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "languageScripts": {
-                                                                       "type": "object",
-                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
-                                                                       "patternProperties": {
-                                                                               "^[a-zA-Z0-9-]{2,}$": {
-                                                                                       "type": [
-                                                                                               "string",
-                                                                                               "array"
-                                                                                       ],
-                                                                                       "items": {
-                                                                                               "type": "string"
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                               },
-                                                               "skinScripts": {
-                                                                       "type": "object",
-                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
-                                                                       "patternProperties": {
-                                                                               ".+": {
-                                                                                       "type": [
-                                                                                               "string",
-                                                                                               "array"
-                                                                                       ],
-                                                                                       "items": {
-                                                                                               "type": "string"
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                               },
-                                                               "debugScripts": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Scripts to include in debug contexts",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "loaderScripts": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Scripts to include in the startup module",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "dependencies": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Modules which must be loaded before this module",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "styles": {
-                                                                       "type": ["string", "array", "object"],
-                                                                       "description": "Styles to always load",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "skinStyles": {
-                                                                       "type": "object",
-                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
-                                                                       "patternProperties": {
-                                                                               ".+": {
-                                                                                       "type": [
-                                                                                               "string",
-                                                                                               "array"
-                                                                                       ],
-                                                                                       "items": {
-                                                                                               "type": "string"
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                               },
-                                                               "messages": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Messages to always load",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "group": {
-                                                                       "type": "string",
-                                                                       "description": "Group with which this module should be loaded"
-                                                               },
-                                                               "deprecated": {
-                                                                       "type": ["object", "boolean"],
-                                                                       "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
-                                                               },
-                                                               "position": {
-                                                                       "type": "string",
-                                                                       "description": "Position on the page to load this module at",
-                                                                       "enum": [
-                                                                               "bottom",
-                                                                               "top"
-                                                                       ]
-                                                               },
-                                                               "templates": {
-                                                                       "type": ["object", "array"],
-                                                                       "description": "Templates to be loaded for client-side usage"
-                                                               },
-                                                               "targets": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "ResourceLoader target the module can run on",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "noflip": {
-                                                                       "type": "boolean",
-                                                                       "description": "Whether to skip CSSJanus LTR-to-RTL flipping for this module. Recommended for styles imported from libraries that already properly handle their RTL styles. Default is false, meaning CSSJanus will be applied on RTL-mode output."
-                                                               }
-                                                       }
-                                               },
-                                               {
-                                                       "description": "A ResourceLoaderWikiModule definition",
-                                                       "additionalProperties": false,
-                                                       "properties": {
-                                                               "class": {
-                                                                       "enum": ["ResourceLoaderWikiModule"]
-                                                               },
-                                                               "group": {
-                                                                       "type": "string",
-                                                                       "description": "Group with which this module should be loaded"
-                                                               },
-                                                               "position": {
-                                                                       "type": "string",
-                                                                       "description": "Position on the page to load this module at",
-                                                                       "enum": [
-                                                                               "bottom",
-                                                                               "top"
-                                                                       ]
-                                                               },
-                                                               "targets": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "ResourceLoader target the module can run on",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "scripts": {
-                                                                       "type": "array",
-                                                                       "description": "A list of on-wiki pages containing JavaScript that should be loaded",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "styles": {
-                                                                       "type": "array",
-                                                                       "description": "A list of on-wiki pages containing CSS that should be loaded",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               }
-                                                       }
-                                               },
-                                               {
-                                                       "description": "A ResourceLoaderImageModule definition",
-                                                       "additionalProperties": false,
-                                                       "properties": {
-                                                               "class": {
-                                                                       "enum": ["ResourceLoaderImageModule"]
-                                                               },
-                                                               "data": {
-                                                                       "type": "string"
-                                                               },
-                                                               "prefix": {
-                                                                       "type": "string"
-                                                               },
-                                                               "selector": {
-                                                                       "type": "string"
-                                                               },
-                                                               "selectorWithoutVariant": {
-                                                                       "type": "string"
-                                                               },
-                                                               "selectorWithVariant": {
-                                                                       "type": "string"
-                                                               },
-                                                               "variants": {
-                                                                       "type": "object"
-                                                               },
-                                                               "images": {
-                                                                       "type": "object"
-                                                               },
-                                                               "position": {
-                                                                       "enum": [
-                                                                               "top",
-                                                                               "bottom"
-                                                                       ]
-                                                               }
-                                                       }
-                                               },
-                                               {
-                                                       "description": "An arbitrary ResourceLoaderModule definition",
-                                                       "properties": {
-                                                               "class": {
-                                                                       "type": "string",
-                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
-                                                               }
-                                                       },
-                                                       "required": ["class"]
-                                               }
-                                       ]
-                               }
-                       }
-               },
-               "ResourceModuleSkinStyles": {
-                       "type": "object",
-                       "description": "ResourceLoader modules for custom skin styles"
-               },
-               "ResourceLoaderSources": {
-                       "type": "object",
-                       "description": "ResourceLoader sources to register"
-               },
-               "ResourceLoaderLESSVars": {
-                       "type": "object",
-                       "description": "ResourceLoader LESS variables"
-               },
-               "ConfigRegistry": {
-                       "type": "object",
-                       "description": "Registry of factory functions to create Config objects"
-               },
-               "SessionProviders": {
-                       "type": "object",
-                       "description": "Session providers"
-               },
-               "AuthManagerAutoConfig": {
-                       "type": "object",
-                       "description": "AuthManager auto-configuration",
-                       "additionalProperties": false,
-                       "properties": {
-                               "preauth": {
-                                       "type": "object",
-                                       "description": "Pre-authentication providers"
-                               },
-                               "primaryauth": {
-                                       "type": "object",
-                                       "description": "Primary authentication providers"
-                               },
-                               "secondaryauth": {
-                                       "type": "object",
-                                       "description": "Secondary authentication providers"
-                               }
-                       }
-               },
-               "CentralIdLookupProviders": {
-                       "type": "object",
-                       "description": "Central ID lookup providers"
-               },
-               "ChangeCredentialsBlacklist": {
-                       "type": "object",
-                       "description": "AuthenticationRequest classes which can only be used internally for credentials change"
-               },
-               "RemoveCredentialsBlacklist": {
-                       "type": "object",
-                       "description": "AuthenticationRequest classes which can only be used internally for credentials removal"
-               },
-               "namespaces": {
-                       "type": "array",
-                       "description": "Method to add extra namespaces",
-                       "items": {
-                               "type": "object",
-                               "properties": {
-                                       "id": {
-                                               "type": "integer"
-                                       },
-                                       "constant": {
-                                               "type": "string"
-                                       },
-                                       "name": {
-                                               "type": "string"
-                                       },
-                                       "gender": {
-                                               "type": "object",
-                                               "properties": {
-                                                       "male": {
-                                                               "type": "string"
-                                                       },
-                                                       "female": {
-                                                               "type": "string"
-                                                       }
-                                               }
-                                       },
-                                       "subpages": {
-                                               "type": "boolean",
-                                               "default": false
-                                       },
-                                       "content": {
-                                               "type": "boolean",
-                                               "default": false
-                                       },
-                                       "defaultcontentmodel": {
-                                               "type": "string"
-                                       },
-                                       "protection": {
-                                               "type": ["string", "array"],
-                                               "description": "Userright(s) required to edit in this namespace"
-                                       },
-                                       "capitallinkoverride": {
-                                               "type": "boolean",
-                                               "description": "Set $wgCapitalLinks on a per-namespace basis"
-                                       },
-                                       "conditional": {
-                                               "type": "boolean",
-                                               "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
-                                               "default": false
-                                       }
-                               },
-                               "required": ["id", "constant", "name"]
-                       }
-               },
-               "TrackingCategories": {
-                       "type": "array",
-                       "description": "Tracking category message keys",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "DefaultUserOptions": {
-                       "type": "object",
-                       "description": "Default values of user options"
-               },
-               "HiddenPrefs": {
-                       "type": "array",
-                       "description": "Preferences users cannot set",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "GroupPermissions": {
-                       "type": "object",
-                       "description": "Default permissions to give to user groups",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z]+$": {
-                                                       "type": "boolean"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "RevokePermissions": {
-                       "type": "object",
-                       "description": "Default permissions to revoke from user groups",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z]+$": {
-                                                       "type": "boolean"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "GrantPermissions": {
-                       "type": "object",
-                       "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z]+$": {
-                                                       "type": "boolean"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "GrantPermissionGroups": {
-                       "type": "object",
-                       "description": "Map of grants to their UI grouping",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "string"
-                               }
-                       }
-               },
-               "ImplicitGroups": {
-                       "type": "array",
-                       "description": "Implicit groups"
-               },
-               "GroupsAddToSelf": {
-                       "type": "object",
-                       "description": "Groups a user can add to themselves"
-               },
-               "GroupsRemoveFromSelf": {
-                       "type": "object",
-                       "description": "Groups a user can remove from themselves"
-               },
-               "AddGroups": {
-                       "type": "object",
-                       "description": "Groups a user can add to users"
-               },
-               "RemoveGroups": {
-                       "type": "object",
-                       "description": "Groups a user can remove from users"
-               },
-               "AvailableRights": {
-                       "type": "array",
-                       "description": "User rights added by the extension",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "ContentHandlers": {
-                       "type": "object",
-                       "description": "Mapping of model ID to class name",
-                       "patternProperties": {
-                               "^[A-Za-z]+$": {
-                                       "type": "string"
-                               }
-                       }
-               },
-               "RateLimits": {
-                       "type": "object",
-                       "description": "Rate limits"
-               },
-               "RecentChangesFlags": {
-                       "type": "object",
-                       "description": "Flags (letter symbols) shown on RecentChanges pages"
-               },
-               "MediaHandlers": {
-                       "type": "object",
-                       "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
-               },
-               "ExtensionFunctions": {
-                       "type": [
-                               "array",
-                               "string"
-                       ],
-                       "description": "Function to call after setup has finished",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "ExtensionMessagesFiles": {
-                       "type": "object",
-                       "description": "File paths containing PHP internationalization data"
-               },
-               "MessagesDirs": {
-                       "type": "object",
-                       "description": "Directory paths containing JSON internationalization data"
-               },
-               "ExtensionEntryPointListFiles": {
-                       "type": "object"
-               },
-               "SpecialPages": {
-                       "type": "object",
-                       "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
-               },
-               "AutoloadClasses": {
-                       "type": "object"
-               },
-               "Hooks": {
-                       "type": [ "string", "object" ],
-                       "description": "Hooks this extension uses (mapping of hook name to callback)"
-               },
-               "JobClasses": {
-                       "type": "object",
-                       "description": "Job types this extension implements (mapping of job type to class name)"
-               },
-               "LogTypes": {
-                       "type": "array",
-                       "description": "List of new log types this extension uses"
-               },
-               "LogRestrictions": {
-                       "type": "object"
-               },
-               "FilterLogTypes": {
-                       "type": "object"
-               },
-               "ActionFilteredLogs": {
-                       "type": "object",
-                       "description": "List of log types which can be filtered by log actions",
-                       "patternProperties": {
-                               "^[a-z-]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z-]+$": {
-                                                       "type": "array",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "LogNames": {
-                       "type": "object"
-               },
-               "LogHeaders": {
-                       "type": "object"
-               },
-               "LogActions": {
-                       "type": "object"
-               },
-               "LogActionsHandlers": {
-                       "type": "object"
-               },
-               "Actions": {
-                       "type": "object"
-               },
-               "APIModules": {
-                       "type": "object"
-               },
-               "APIFormatModules": {
-                       "type": "object"
-               },
-               "APIMetaModules": {
-                       "type": "object"
-               },
-               "APIPropModules": {
-                       "type": "object"
-               },
-               "APIListModules": {
-                       "type": "object"
-               },
-               "ValidSkinNames": {
-                       "type": "object"
-               },
-               "FeedClasses": {
-                       "type": "object",
-                       "description": "Available feeds objects"
-               },
-               "SkinOOUIThemes": {
-                       "type": "object"
-               },
-               "PasswordPolicy": {
-                       "type": "object",
-                       "description": "Password policies"
-               },
-               "FileExtensions": {
-                       "type": "array",
-                       "description": "Preferred file extensions for uploading",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "callback": {
-                       "type": [
-                               "array",
-                               "string"
-                       ],
-                       "description": "A function to be called right after MediaWiki processes this file"
-               },
-               "config_prefix": {
-                       "type": "string",
-                       "default": "wg",
-                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
-               },
-               "config": {
-                       "type": "object",
-                       "description": "Configuration options for this extension",
-                       "patternProperties": {
-                               "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
-                                       "type": "object",
-                                       "properties": {
-                                               "value": {
-                                                       "required": true
-                                               },
-                                               "merge_strategy": {
-                                                       "type": "string",
-                                                       "enum": [
-                                                               "array_merge_recursive",
-                                                               "array_replace_recursive",
-                                                               "array_plus_2d",
-                                                               "array_plus",
-                                                               "array_merge"
-                                                       ],
-                                                       "default": "array_merge"
-                                               },
-                                               "path": {
-                                                       "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root",
-                                                       "type": "boolean",
-                                                       "default": false
-                                               },
-                                               "description": {
-                                                       "type": ["string", "array"],
-                                                       "description": "A description of the config setting, mostly for documentation/developers"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "ParserTestFiles": {
-                       "type": "array",
-                       "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
-               },
-               "ServiceWiringFiles": {
-                       "type": "array",
-                       "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices"
-               },
-               "load_composer_autoloader": {
-                       "type": "boolean",
-                       "description": "Load the composer autoloader for this extension, if one is present"
-               }
-       }
-}
index 421ea5c..3d6eda9 100644 (file)
                },
                "requires": {
                        "type": "object",
-                       "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
+                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "additionalProperties": false,
                        "properties": {
                                "MediaWiki": {
                                        "type": "string",
                                        "description": "Version constraint string against MediaWiki core."
+                               },
+                               "extensions": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific extensions."
+                               },
+                               "skins": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific skins."
                                }
                        }
                },
diff --git a/docs/extension.schema.v2.json b/docs/extension.schema.v2.json
new file mode 100644 (file)
index 0000000..b7ee1a7
--- /dev/null
@@ -0,0 +1,728 @@
+{
+       "$schema": "http://json-schema.org/schema#",
+       "description": "MediaWiki extension.json schema",
+       "type": "object",
+       "properties": {
+               "manifest_version": {
+                       "type": "integer",
+                       "description": "Version of the extension.json schema the extension.json file is in.",
+                       "required": true
+               },
+               "name": {
+                       "type": "string",
+                       "description": "The extension's canonical name.",
+                       "required": true
+               },
+               "namemsg": {
+                       "type": "string",
+                       "description": "i18n message key of the extension's name."
+               },
+               "type": {
+                       "type": "string",
+                       "description": "The extension's type, as an index to $wgExtensionCredits.",
+                       "default": "other"
+               },
+               "author": {
+                       "type": [
+                               "string",
+                               "array"
+                       ],
+                       "description": "Extension's authors.",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "version": {
+                       "type": "string",
+                       "description": "The version of this release of the extension."
+               },
+               "url": {
+                       "type": "string",
+                       "description": "URL to the homepage for the extension.",
+                       "format": "uri"
+               },
+               "description": {
+                       "type": "string",
+                       "description": "Raw description of the extension."
+               },
+               "descriptionmsg": {
+                       "type": "string",
+                       "description": "Message key for a i18n message describing the extension."
+               },
+               "license-name": {
+                       "type": "string",
+                       "description": "SPDX identifier for the license under which the extension is released."
+               },
+               "requires": {
+                       "type": "object",
+                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "additionalProperties": false,
+                       "properties": {
+                               "MediaWiki": {
+                                       "type": "string",
+                                       "description": "Version constraint string against MediaWiki core."
+                               },
+                               "extensions": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific extensions."
+                               },
+                               "skins": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific skins."
+                               }
+                       }
+               },
+               "ResourceFileModulePaths": {
+                       "type": "object",
+                       "description": "Default paths to use for all ResourceLoader file modules",
+                       "additionalProperties": false,
+                       "properties": {
+                               "localBasePath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all local paths, relative to current directory"
+                               },
+                               "remoteExtPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+                               },
+                               "remoteSkinPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+                               }
+                       }
+               },
+               "ResourceModules": {
+                       "type": "object",
+                       "description": "ResourceLoader modules to register",
+                       "patternProperties": {
+                               "^[a-zA-Z0-9-\\.]+$": {
+                                       "type": "object",
+                                       "anyOf": [
+                                               {
+                                                       "description": "A ResourceLoaderFileModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "localBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+                                                               },
+                                                               "remoteBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+                                                               },
+                                                               "remoteExtPath": {
+                                                                       "type": "string",
+                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+                                                               },
+                                                               "skipFunction": {
+                                                                       "type": "string",
+                                                                       "description": "Path to a file containing a JavaScript \"skip function\", if desired."
+                                                               },
+                                                               "scripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to always include (array of file paths)",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "languageScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+                                                                       "patternProperties": {
+                                                                               "^[a-zA-Z0-9-]{2,}$": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "skinScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "debugScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in debug contexts",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "loaderScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in the startup module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "dependencies": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Modules which must be loaded before this module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": ["string", "array", "object"],
+                                                                       "description": "Styles to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "skinStyles": {
+                                                                       "type": "object",
+                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "messages": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Messages to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group with which this module should be loaded"
+                                                               },
+                                                               "deprecated": {
+                                                                       "type": ["object", "boolean"],
+                                                                       "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "templates": {
+                                                                       "type": ["object", "array"],
+                                                                       "description": "Templates to be loaded for client-side usage"
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "noflip": {
+                                                                       "type": "boolean",
+                                                                       "description": "Whether to skip CSSJanus LTR-to-RTL flipping for this module. Recommended for styles imported from libraries that already properly handle their RTL styles. Default is false, meaning CSSJanus will be applied on RTL-mode output."
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "A ResourceLoaderWikiModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderWikiModule"]
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group with which this module should be loaded"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "scripts": {
+                                                                       "type": "array",
+                                                                       "description": "A list of on-wiki pages containing JavaScript that should be loaded",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": "array",
+                                                                       "description": "A list of on-wiki pages containing CSS that should be loaded",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "A ResourceLoaderImageModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderImageModule"]
+                                                               },
+                                                               "data": {
+                                                                       "type": "string"
+                                                               },
+                                                               "prefix": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selector": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithoutVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "variants": {
+                                                                       "type": "object"
+                                                               },
+                                                               "images": {
+                                                                       "type": "object"
+                                                               },
+                                                               "position": {
+                                                                       "enum": [
+                                                                               "top",
+                                                                               "bottom"
+                                                                       ]
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "An arbitrary ResourceLoaderModule definition",
+                                                       "properties": {
+                                                               "class": {
+                                                                       "type": "string",
+                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+                                                               }
+                                                       },
+                                                       "required": ["class"]
+                                               }
+                                       ]
+                               }
+                       }
+               },
+               "ResourceModuleSkinStyles": {
+                       "type": "object",
+                       "description": "ResourceLoader modules for custom skin styles"
+               },
+               "ResourceLoaderSources": {
+                       "type": "object",
+                       "description": "ResourceLoader sources to register"
+               },
+               "ResourceLoaderLESSVars": {
+                       "type": "object",
+                       "description": "ResourceLoader LESS variables"
+               },
+               "ConfigRegistry": {
+                       "type": "object",
+                       "description": "Registry of factory functions to create Config objects"
+               },
+               "SessionProviders": {
+                       "type": "object",
+                       "description": "Session providers"
+               },
+               "AuthManagerAutoConfig": {
+                       "type": "object",
+                       "description": "AuthManager auto-configuration",
+                       "additionalProperties": false,
+                       "properties": {
+                               "preauth": {
+                                       "type": "object",
+                                       "description": "Pre-authentication providers"
+                               },
+                               "primaryauth": {
+                                       "type": "object",
+                                       "description": "Primary authentication providers"
+                               },
+                               "secondaryauth": {
+                                       "type": "object",
+                                       "description": "Secondary authentication providers"
+                               }
+                       }
+               },
+               "CentralIdLookupProviders": {
+                       "type": "object",
+                       "description": "Central ID lookup providers"
+               },
+               "ChangeCredentialsBlacklist": {
+                       "type": "object",
+                       "description": "AuthenticationRequest classes which can only be used internally for credentials change"
+               },
+               "RemoveCredentialsBlacklist": {
+                       "type": "object",
+                       "description": "AuthenticationRequest classes which can only be used internally for credentials removal"
+               },
+               "namespaces": {
+                       "type": "array",
+                       "description": "Method to add extra namespaces",
+                       "items": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer"
+                                       },
+                                       "constant": {
+                                               "type": "string"
+                                       },
+                                       "name": {
+                                               "type": "string"
+                                       },
+                                       "gender": {
+                                               "type": "object",
+                                               "properties": {
+                                                       "male": {
+                                                               "type": "string"
+                                                       },
+                                                       "female": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       },
+                                       "subpages": {
+                                               "type": "boolean",
+                                               "default": false
+                                       },
+                                       "content": {
+                                               "type": "boolean",
+                                               "default": false
+                                       },
+                                       "defaultcontentmodel": {
+                                               "type": "string"
+                                       },
+                                       "protection": {
+                                               "type": ["string", "array"],
+                                               "description": "Userright(s) required to edit in this namespace"
+                                       },
+                                       "capitallinkoverride": {
+                                               "type": "boolean",
+                                               "description": "Set $wgCapitalLinks on a per-namespace basis"
+                                       },
+                                       "conditional": {
+                                               "type": "boolean",
+                                               "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
+                                               "default": false
+                                       }
+                               },
+                               "required": ["id", "constant", "name"]
+                       }
+               },
+               "TrackingCategories": {
+                       "type": "array",
+                       "description": "Tracking category message keys",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "DefaultUserOptions": {
+                       "type": "object",
+                       "description": "Default values of user options"
+               },
+               "HiddenPrefs": {
+                       "type": "array",
+                       "description": "Preferences users cannot set",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "GroupPermissions": {
+                       "type": "object",
+                       "description": "Default permissions to give to user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "RevokePermissions": {
+                       "type": "object",
+                       "description": "Default permissions to revoke from user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "GrantPermissions": {
+                       "type": "object",
+                       "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "GrantPermissionGroups": {
+                       "type": "object",
+                       "description": "Map of grants to their UI grouping",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "ImplicitGroups": {
+                       "type": "array",
+                       "description": "Implicit groups"
+               },
+               "GroupsAddToSelf": {
+                       "type": "object",
+                       "description": "Groups a user can add to themselves"
+               },
+               "GroupsRemoveFromSelf": {
+                       "type": "object",
+                       "description": "Groups a user can remove from themselves"
+               },
+               "AddGroups": {
+                       "type": "object",
+                       "description": "Groups a user can add to users"
+               },
+               "RemoveGroups": {
+                       "type": "object",
+                       "description": "Groups a user can remove from users"
+               },
+               "AvailableRights": {
+                       "type": "array",
+                       "description": "User rights added by the extension",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "ContentHandlers": {
+                       "type": "object",
+                       "description": "Mapping of model ID to class name",
+                       "patternProperties": {
+                               "^[A-Za-z]+$": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "RateLimits": {
+                       "type": "object",
+                       "description": "Rate limits"
+               },
+               "RecentChangesFlags": {
+                       "type": "object",
+                       "description": "Flags (letter symbols) shown on RecentChanges pages"
+               },
+               "MediaHandlers": {
+                       "type": "object",
+                       "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
+               },
+               "ExtensionFunctions": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "Function to call after setup has finished",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "ExtensionMessagesFiles": {
+                       "type": "object",
+                       "description": "File paths containing PHP internationalization data"
+               },
+               "MessagesDirs": {
+                       "type": "object",
+                       "description": "Directory paths containing JSON internationalization data"
+               },
+               "ExtensionEntryPointListFiles": {
+                       "type": "object"
+               },
+               "SpecialPages": {
+                       "type": "object",
+                       "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+               },
+               "AutoloadClasses": {
+                       "type": "object"
+               },
+               "Hooks": {
+                       "type": [ "string", "object" ],
+                       "description": "Hooks this extension uses (mapping of hook name to callback)"
+               },
+               "JobClasses": {
+                       "type": "object",
+                       "description": "Job types this extension implements (mapping of job type to class name)"
+               },
+               "LogTypes": {
+                       "type": "array",
+                       "description": "List of new log types this extension uses"
+               },
+               "LogRestrictions": {
+                       "type": "object"
+               },
+               "FilterLogTypes": {
+                       "type": "object"
+               },
+               "ActionFilteredLogs": {
+                       "type": "object",
+                       "description": "List of log types which can be filtered by log actions",
+                       "patternProperties": {
+                               "^[a-z-]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z-]+$": {
+                                                       "type": "array",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "LogNames": {
+                       "type": "object"
+               },
+               "LogHeaders": {
+                       "type": "object"
+               },
+               "LogActions": {
+                       "type": "object"
+               },
+               "LogActionsHandlers": {
+                       "type": "object"
+               },
+               "Actions": {
+                       "type": "object"
+               },
+               "APIModules": {
+                       "type": "object"
+               },
+               "APIFormatModules": {
+                       "type": "object"
+               },
+               "APIMetaModules": {
+                       "type": "object"
+               },
+               "APIPropModules": {
+                       "type": "object"
+               },
+               "APIListModules": {
+                       "type": "object"
+               },
+               "ValidSkinNames": {
+                       "type": "object"
+               },
+               "FeedClasses": {
+                       "type": "object",
+                       "description": "Available feeds objects"
+               },
+               "SkinOOUIThemes": {
+                       "type": "object"
+               },
+               "PasswordPolicy": {
+                       "type": "object",
+                       "description": "Password policies"
+               },
+               "FileExtensions": {
+                       "type": "array",
+                       "description": "Preferred file extensions for uploading",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "callback": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "A function to be called right after MediaWiki processes this file"
+               },
+               "config_prefix": {
+                       "type": "string",
+                       "default": "wg",
+                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+               },
+               "config": {
+                       "type": "object",
+                       "description": "Configuration options for this extension",
+                       "patternProperties": {
+                               "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+                                       "type": "object",
+                                       "properties": {
+                                               "value": {
+                                                       "required": true
+                                               },
+                                               "merge_strategy": {
+                                                       "type": "string",
+                                                       "enum": [
+                                                               "array_merge_recursive",
+                                                               "array_replace_recursive",
+                                                               "array_plus_2d",
+                                                               "array_plus",
+                                                               "array_merge"
+                                                       ],
+                                                       "default": "array_merge"
+                                               },
+                                               "path": {
+                                                       "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root",
+                                                       "type": "boolean",
+                                                       "default": false
+                                               },
+                                               "description": {
+                                                       "type": ["string", "array"],
+                                                       "description": "A description of the config setting, mostly for documentation/developers"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "ParserTestFiles": {
+                       "type": "array",
+                       "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
+               },
+               "ServiceWiringFiles": {
+                       "type": "array",
+                       "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices"
+               },
+               "load_composer_autoloader": {
+                       "type": "boolean",
+                       "description": "Load the composer autoloader for this extension, if one is present"
+               }
+       }
+}
index a73d50f..846a073 100644 (file)
@@ -212,9 +212,13 @@ related to a particular event, like so:
                # ...
                function protect() {
                        global $wgUser;
-                       if ( Hooks::run( 'ArticleProtect', array( &$this, &$wgUser ) ) ) {
+
+                       // Avoid PHP 7.1 warning from passing $this by reference
+                       $article = $this;
+
+                       if ( Hooks::run( 'ArticleProtect', [ &$article, &$wgUser ] ) ) {
                                # protect the article
-                               Hooks::run( 'ArticleProtectComplete', array( &$this, &$wgUser ) );
+                               Hooks::run( 'ArticleProtectComplete', [ &$article, &$wgUser ] );
                        }
                }
        }
@@ -358,8 +362,17 @@ authenticate and authorize API clients before executing the module. Return
 false and set a message to cancel the request.
 $module: Module object
 $user: Current user
-&$message: API usage message to die with, as a message key or array
-  as accepted by ApiBase::dieUsageMsg.
+&$message: API message to die with. Specific values accepted depend on the
+ MediaWiki version:
+ * 1.29+: IApiMessage, Message, string message key, or key+parameters array to
+   pass to ApiBase::dieWithError().
+ * 1.27+: IApiMessage, or a key or key+parameters in ApiBase::$messageMap.
+ * Earlier: A key or key+parameters in ApiBase::$messageMap.
+
+'ApiDeprecationHelp': Add messages to the 'deprecation-help' warning generated
+from ApiBase::addDeprecation().
+&$msgs: Message[] Messages to include in the help. Multiple messages will be
+  joined with spaces.
 
 'APIEditBeforeSave': DEPRECATED! Use EditFilterMergedContent instead.
 Before saving a page with api.php?action=edit, after
@@ -588,6 +601,10 @@ Use this hook to extend action=tokens with new token types.
 &$tokenTypes: supported token types in format 'type' => callback function
   used to retrieve this type of tokens.
 
+'ApiValidatePassword': Called from ApiValidatePassword.
+$module: ApiValidatePassword instance.
+&$r: Result array.
+
 'Article::MissingArticleConditions': Before fetching deletion & move log entries
 to display a message of a non-existing page being deleted/moved, give extensions
 a chance to hide their (unrelated) log entries.
@@ -595,12 +612,6 @@ a chance to hide their (unrelated) log entries.
   AND in the final query)
 $logTypes: Array of log types being queried
 
-'ArticleAfterFetchContent': DEPRECATED! Use ArticleAfterFetchContentObject
-instead.
-After fetching content of an article from the database.
-&$article: the article (object) being loaded from the database
-&$content: the content (string) of the article
-
 'ArticleAfterFetchContentObject': After fetching content of an article from the
 database.
 &$article: the article (object) being loaded from the database
@@ -669,18 +680,6 @@ Wiki::articleFromTitle().
 &$article: Article (object) that will be returned
 $context: IContextSource (object)
 
-'ArticleInsertComplete': DEPRECATED! Use PageContentInsertComplete.
-After a new article is created.
-$wikiPage: WikiPage created
-$user: User creating the article
-$text: New content
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-
 'ArticleMergeComplete': After merging to article using Special:Mergehistory.
 $targetTitle: target title (object)
 $destTitle: destination title (object)
@@ -732,30 +731,6 @@ $user: the user who did the rollback
 $revision: the revision the page was reverted back to
 $current: the reverted revision
 
-'ArticleSave': DEPRECATED! Use PageContentSave instead.
-Before an article is saved.
-$wikiPage: the WikiPage (object) being saved
-$user: the user (object) saving the article
-$text: the new article text
-$summary: the article summary (comment)
-$isminor: minor flag
-$iswatch: watch flag
-$section: section #
-
-'ArticleSaveComplete': DEPRECATED! Use PageContentSaveComplete instead.
-After an article has been updated.
-$wikiPage: WikiPage modified
-$user: User performing the modification
-$text: New content
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-$status: Status object about to be returned by doEditContent()
-$baseRevId: the rev ID (or false) this edit was based on
-
 'ArticleUndelete': When one or more revisions of an article are restored.
 &$title: Title corresponding to the article restored
 $create: Whether or not the restoration caused the page to be created (i.e. it
@@ -774,14 +749,6 @@ $article: the article
 &$sectionanchor: The section anchor link (e.g. "#overview" )
 &$extraq: Extra query parameters which can be added via hooked functions
 
-'ArticleViewCustom': DEPRECATED! Use ArticleContentViewCustom instead.
-Allows to output the text of the article in a different format than wikitext.
-Note that it is preferable to implement proper handing for a custom data type
-using the ContentHandler facility.
-$text: text of the page
-$title: title of the page
-$output: reference to $wgOut
-
 'ArticleViewFooter': After showing the footer section of an ordinary page view
 $article: Article object
 $patrolFooterShown: boolean whether patrol footer is shown
@@ -1078,6 +1045,12 @@ $params: tag params
 $rc: RecentChange being tagged when the tagging accompanies the action or null
 $user: User who performed the tagging when the tagging is subsequent to the action or null
 
+'ChangeUserGroups': Called before user groups are changed.
+$performer: The User who will perform the change
+$user: The User whose groups will be changed
+&$add: The groups that will be added
+&$remove: The groups that will be removed
+
 'Collation::factory': Called if $wgCategoryCollation is an unknown collation.
 $collationName: Name of the collation in question
 &$collationObject: Null. Replace with a subclass of the Collation class that
@@ -1119,6 +1092,8 @@ $title: the Title in question
 'ContentHandlerForModelID': Called when a ContentHandler is requested for
 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. 
 $modeName: the requested content model name
 &$handler: set this to a ContentHandler object, if desired.
 
@@ -1194,6 +1169,18 @@ $page: SpecialPage object for DeletedContributions
 $row: the DB row for this line
 &$classes: the classes to add to the surrounding <li>
 
+'DifferenceEngineAfterLoadNewText': called in DifferenceEngine::loadNewText()
+after the new revision's content has been loaded into the class member variable
+$differenceEngine->mNewContent but before returning true from this function.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineLoadTextAfterNewContentIsLoaded': called in
+DifferenceEngine::loadText() after the new revision's content has been loaded
+into the class member variable $differenceEngine->mNewContent but before
+checking if the variable's value is null.
+This hook can be used to inject content into said class member variable.
+$differenceEngine: DifferenceEngine object
+
 'DifferenceEngineMarkPatrolledLink': Allows extensions to change the "mark as patrolled" link
 which is shown both on the diff header as well as on the bottom of a page, usually
 wrapped in a span element which has class="patrollink".
@@ -1272,6 +1259,12 @@ $differenceEngine: DifferenceEngine object
 object into the diff view
 $out: OutputPage object
 
+'DifferenceEngineShowDiffPageMaybeShowMissingRevision': called in
+DifferenceEngine::showDiffPage() when revision data cannot be loaded.
+Return false in order to prevent displaying the missing revision message
+(i.e. to prevent DifferenceEngine::showMissingRevision() from being called).
+$differenceEngine: DifferenceEngine object
+
 'DiffRevisionTools': Override or extend the revision tools available from the
 diff view, i.e. undo, etc.
 $newRev: Revision object of the "new" revision
@@ -1309,12 +1302,6 @@ $section: Section being edited
 &$error: Error message to return
 $summary: Edit summary for page
 
-'EditFilterMerged': DEPRECATED! Use EditFilterMergedContent instead.
-Post-section-merge edit filter.
-$editor: EditPage instance (object)
-$text: content of the edit box
-&$error: error message to return
-$summary: Edit summary for page
 
 'EditFilterMergedContent': Post-section-merge edit filter.
 This may be triggered by the EditPage or any other facility that modifies page
@@ -1417,26 +1404,12 @@ different data types using the ContentHandler facility.
 $editPage: EditPage object
 &$newtext: wikitext that will be used as "your version"
 
-'EditPageGetDiffText': DEPRECATED! Use EditPageGetDiffContent instead.
-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.
-$editPage: EditPage object
-&$newtext: wikitext that will be used as "your version"
-
 'EditPageGetPreviewContent': Allow modifying the wikitext that will be
 previewed. Note that it is preferable to implement previews for different data
 types using the ContentHandler facility.
 $editPage: EditPage object
 &$content: Content object to be previewed (may be replaced by hook function)
 
-'EditPageGetPreviewText': DEPRECATED! Use EditPageGetPreviewContent instead.
-Allow modifying the wikitext that will be previewed. Note that it is preferable
-to implement previews for different data types using the ContentHandler
-facility.
-$editPage: EditPage object
-&$toparse: wikitext that will be parsed
-
 'EditPageNoSuchSection': When a section edit request is given for an
 non-existent section
 &$editpage: The current EditPage object
@@ -1459,7 +1432,7 @@ true to allow those checks to occur, and false if checking is done.
 &$from: MailAddress object of sending user
 &$subject: subject of the mail
 &$text: text of the mail
-&$error: Out-param for an error
+&$error: Out-param for an error. Should be set to a Status object or boolean false.
 
 'EmailUserCC': Before sending the copy of the email to the author.
 &$to: MailAddress object of receiving user
@@ -1591,6 +1564,9 @@ notifications.
 &$url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getCanonicalURL()
 
+'GetContentModels': Add content models to the list of available models.
+&$models: array containing current model list, as strings. Extensions should add to this list.
+
 'GetDefaultSortkey': Override the default sortkey for a page.
 $title: Title object that we need to get a sortkey for
 &$sortkey: Sortkey to use.
@@ -2213,6 +2189,7 @@ $text: new contents of the page.
 'MessagesPreLoad': When loading a message from the database.
 $title: title of the message (string)
 &$message: value (string), change it to the message you want to define
+$code: code (string) denoting the language to try.
 
 'MimeMagicGuessFromContent': Allows MW extensions guess the MIME by content.
 $mimeMagic: Instance of MimeMagic.
@@ -2378,6 +2355,7 @@ $revision: New Revision of the article (can be null for edits that change
   nothing)
 $status: Status object about to be returned by doEditContent()
 $baseRevId: the rev ID (or false) this edit was based on
+$undidRevId: the rev ID (or 0) this edit undid
 
 'PageHistoryBeforeList': When a history page list is about to be constructed.
 &$article: the article that the history is loading for
@@ -2554,8 +2532,6 @@ $user: the User considering the edit
 'PasswordPoliciesForUser': Alter the effective password policy for a user.
 $user: User object whose policy you are modifying
 &$effectivePolicy: Array of policy statements that apply to this user
-$purpose: string indicating purpose of the check, one of 'login', 'create',
-  or 'reset'
 
 'PerformRetroactiveAutoblock': Called before a retroactive autoblock is applied
 to a user.
@@ -2843,12 +2819,6 @@ Special:ShortPages.
 'ShowMissingArticle': Called when generating the output for a non-existent page.
 $article: The article object corresponding to the page
 
-'ShowRawCssJs': DEPRECATED! Use the ContentGetParserOutput hook instead.
-Customise the output of raw CSS and JavaScript in page views.
-$text: Text being shown
-$title: Title of the custom script/stylesheet page
-$output: Current OutputPage object
-
 'ShowSearchHit': Customize display of search hit.
 $searchPage: The SpecialSearch instance.
 $result: The SearchResult to show
@@ -2867,11 +2837,11 @@ $terms: Search terms, for highlighting
 
 'ShowSearchHitTitle': Customise display of search hit title/link.
 &$title: Title to link to
-&$text: Text to use for the link
-$result: The search result
-$terms: The search terms entered
-$page: The SpecialSearch object
-&$query: Query string to be appended to the link
+&$titleSnippet: Label for the link representing the search result. Typically the article title.
+$result: The SearchResult object
+$terms: String of the search terms entered
+$specialSearch: The SpecialSearch object
+&$query: Array of query string parameters for the link representing the search result.
 
 'SidebarBeforeOutput': Allows to edit sidebar just before it is output by skins.
 Warning: This hook is run on each display. You should consider to use
@@ -3303,13 +3273,6 @@ by the isKnown method.
 $title: Title object that is being checked
 &$isKnown: Boolean|null; whether MediaWiki currently thinks this page is known
 
-'TitleIsCssOrJsPage': DEPRECATED! Use ContentHandlerDefaultModelFor instead.
-Called when determining if a page is a CSS or JS page.
-$title: Title object that is being checked
-&$result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page.
-  Hooks may change this value to override the return value of
-  Title::isCssOrJsPage().
-
 'TitleIsMovable': Called when determining if it is possible to move a page. Note
 that this hook is not called for interwiki pages or pages in immovable
 namespaces: for these, isMovable() always returns false.
@@ -3318,13 +3281,6 @@ $title: Title object that is being checked
   Hooks may change this value to override the return value of
   Title::isMovable().
 
-'TitleIsWikitextPage': DEPRECATED! Use ContentHandlerDefaultModelFor instead.
-Called when determining if a page is a wikitext or should
-be handled by separate handler (via ArticleViewCustom).
-$title: Title object that is being checked
-&$result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
-  Hooks may change this value to override the return value of
-  Title::isWikitextPage()
 
 'TitleMove': Before moving an article (title).
 $old: old title
@@ -3374,6 +3330,15 @@ $user: Current user object
 $title: Title object to purge
 &$urls: An array of URLs to purge from the caches, to be manipulated.
 
+'UnblockUser': Before an IP address or user is unblocked.
+&$block: The Block object about to be saved
+&$user: The user performing the unblock (not the one being unblocked)
+&$reason: If the hook is aborted, the error message to be returned in an array
+
+'UnblockUserComplete': After an IP address or user has been unblocked.
+$block: The Block object that was saved
+$user: The user who performed the unblock (not the one being unblocked)
+
 'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
 PageArchive object has been created but before any further processing is done.
 &$archive: PageArchive object
@@ -3400,8 +3365,9 @@ Since 1.24: Paths pointing to a directory will be recursively scanned for
 test case files matching the suffix "Test.php".
 &$paths: list of test cases and directories to search.
 
-'UnknownAction': An unknown "action" has occurred (useful for defining your own
-actions).
+'UnknownAction': DEPRECATED! To add an action in an extension,
+create a subclass of Action, and add a new key to $wgActions.
+An unknown "action" has occurred (useful for defining your own actions).
 $action: action name
 $article: article "acted on"
 
@@ -3500,10 +3466,12 @@ temporary password
 &$ip: IP of the user who sent the message out
 &$u: the account whose new password will be set
 
-'UserAddGroup': Called when adding a group; return false to override
-stock group addition.
+'UserAddGroup': Called when adding a group or changing a group's expiry; return
+false to override stock group addition.
 $user: the user object that is to have a group added
-&$group: the group to add, can be modified
+&$group: the group to add; can be modified
+&$expiry: the expiry time in TS_MW format, or null if the group is not to
+expire; can be modified
 
 'UserArrayFromResult': Called when creating an UserArray object from a database
 result.
@@ -3746,7 +3714,8 @@ their data into the cache array so that things like global user groups are
 displayed correctly in Special:ListUsers.
 $dbr: Read-only database handle
 $userIds: Array of user IDs whose groups we should look up
-&$cache: Array of user ID -> internal user group name (e.g. 'sysop') mappings
+&$cache: Array of user ID -> (array of internal group name (e.g. 'sysop') ->
+UserGroupMembership object)
 &$groups: Array of group name -> bool true mappings for members of a given user
 group
 
index d444a27..2adbc80 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Ajax
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @defgroup Ajax Ajax
  */
@@ -135,7 +137,8 @@ class AjaxDispatcher {
                                        }
 
                                        // Make sure DB commit succeeds before sending a response
-                                       wfGetLBFactory()->commitMasterChanges( __METHOD__ );
+                                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                                       $lbFactory->commitMasterChanges( __METHOD__ );
 
                                        $result->sendHeaders();
                                        $result->printText();
index 0686578..3e42c08 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Ajax
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Handle responses for Ajax requests (send headers, print
@@ -82,7 +83,7 @@ class AjaxResponse {
        function __construct( $text = null, Config $config = null ) {
                $this->mCacheDuration = null;
                $this->mVary = null;
-               $this->mConfig = $config ?: ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $this->mConfig = $config ?: MediaWikiServices::getInstance()->getMainConfig();
 
                $this->mDisabled = false;
                $this->mText = '';
index 0b65593..b85e1d6 100644 (file)
@@ -73,7 +73,7 @@ class AuthPlugin {
        /**
         * Modify options in the login template.
         *
-        * @param UserLoginTemplate $template
+        * @param BaseTemplate $template
         * @param string $type 'signup' or 'login'. Added in 1.16.
         */
        public function modifyUITemplate( &$template, &$type ) {
index 8663d03..66b9ff0 100644 (file)
@@ -74,6 +74,9 @@ class Block {
        /** @var bool */
        protected $isAutoblocking;
 
+       /** @var string|null */
+       protected $systemBlockType;
+
        # TYPE constants
        const TYPE_USER = 1;
        const TYPE_IP = 2;
@@ -99,6 +102,10 @@ class Block {
         *     blockEmail bool      Disallow sending emails
         *     allowUsertalk bool   Allow the target to edit its own talk page
         *     byText string        Username of the blocker (for foreign users)
+        *     systemBlock string   Indicate that this block is automatically
+        *                          created by MediaWiki rather than being stored
+        *                          in the database. Value is a string to return
+        *                          from self::getSystemBlockType().
         *
         * @since 1.26 accepts $options array instead of individual parameters; order
         * of parameters above reflects the original order
@@ -119,6 +126,7 @@ class Block {
                        'blockEmail'      => false,
                        'allowUsertalk'   => false,
                        'byText'          => '',
+                       'systemBlock'     => null,
                ];
 
                if ( func_num_args() > 1 || !is_array( $options ) ) {
@@ -162,6 +170,7 @@ class Block {
                $this->prevents( 'createaccount', (bool)$options['createAccount'] );
 
                $this->mFromMaster = false;
+               $this->systemBlockType = $options['systemBlock'];
        }
 
        /**
@@ -461,6 +470,11 @@ class Block {
         */
        public function insert( $dbw = null ) {
                global $wgBlockDisablesLogin;
+
+               if ( $this->getSystemBlockType() !== null ) {
+                       throw new MWException( 'Cannot insert a system block into the database' );
+               }
+
                wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" );
 
                if ( $dbw === null ) {
@@ -741,13 +755,20 @@ class Block {
                        return false;
                }
 
+               # Don't autoblock for system blocks
+               if ( $this->getSystemBlockType() !== null ) {
+                       throw new MWException( 'Cannot autoblock from a system block' );
+               }
+
                # Check for presence on the autoblock whitelist.
                if ( self::isWhitelistedFromAutoblocks( $autoblockIP ) ) {
                        return false;
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $block = $this;
                # Allow hooks to cancel the autoblock.
-               if ( !Hooks::run( 'AbortAutoblock', [ $autoblockIP, &$this ] ) ) {
+               if ( !Hooks::run( 'AbortAutoblock', [ $autoblockIP, &$block ] ) ) {
                        wfDebug( "Autoblock aborted by hook.\n" );
                        return false;
                }
@@ -934,6 +955,14 @@ class Block {
                return $this->mId;
        }
 
+       /**
+        * Get the system block type, if any
+        * @return string|null
+        */
+       public function getSystemBlockType() {
+               return $this->systemBlockType;
+       }
+
        /**
         * Get/set a flag determining whether the master is used for reads
         *
@@ -1419,8 +1448,7 @@ class Block {
 
        /**
         * Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be
-        * the same as the block's, unless it's greater than $wgCookieExpiration in which case
-        * $wgCookieExpiration will be used instead (defaults to 30 days).
+        * the same as the block's, to a maximum of 24 hours.
         *
         * An empty value can also be set, in order to retain the cookie but remove the block ID
         * (e.g. as used in User::getBlockedStatus).
@@ -1430,18 +1458,64 @@ class Block {
         */
        public function setCookie( WebResponse $response, $setEmpty = false ) {
                // Calculate the default expiry time.
-               $config = RequestContext::getMain()->getConfig();
-               $defaultExpiry = wfTimestamp() + $config->get( 'CookieExpiration' );
+               $maxExpiryTime = wfTimestamp( TS_MW, wfTimestamp() + ( 24 * 60 * 60 ) );
 
                // Use the Block's expiry time only if it's less than the default.
-               $expiry = wfTimestamp( TS_UNIX, $this->getExpiry() );
-               if ( $expiry > $defaultExpiry ) {
-                       // The *default* default expiry is 30 days.
-                       $expiry = $defaultExpiry;
+               $expiryTime = $this->getExpiry();
+               if ( $expiryTime === 'infinity' || $expiryTime > $maxExpiryTime ) {
+                       $expiryTime = $maxExpiryTime;
                }
 
-               $cookieValue = $setEmpty ? '' : $this->getId();
-               $response->setCookie( 'BlockID', $cookieValue, $expiry );
+               // 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 ];
+               $response->setCookie( 'BlockID', $cookieValue, $expiryValue, $cookieOptions );
+       }
+
+       /**
+        * 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
+        * be the block ID.
+        * @return string The block ID, probably concatenated with "!" and the HMAC.
+        */
+       public function getCookieValue() {
+               $config = RequestContext::getMain()->getConfig();
+               $id = $this->getId();
+               $secretKey = $config->get( 'SecretKey' );
+               if ( !$secretKey ) {
+                       // If there's no secret key, don't append a HMAC.
+                       return $id;
+               }
+               $hmac = MWCryptHash::hmac( $id, $secretKey, false );
+               $cookieValue =  $id . '!' . $hmac;
+               return $cookieValue;
+       }
+
+       /**
+        * Get the stored ID from the 'BlockID' cookie. The cookie's value is usually a combination of
+        * the ID and a HMAC (see Block::setCookie), but will sometimes only be the ID.
+        * @param string $cookieValue The string in which to find the ID.
+        * @return integer|null The block ID, or null if the HMAC is present and invalid.
+        */
+       public static function getIdFromCookieValue( $cookieValue ) {
+               // Extract the ID prefix from the cookie value (may be the whole value, if no bang found).
+               $bangPos = strpos( $cookieValue, '!' );
+               $id = ( $bangPos === false ) ? $cookieValue : substr( $cookieValue, 0, $bangPos );
+               // Get the site-wide secret key.
+               $config = RequestContext::getMain()->getConfig();
+               $secretKey = $config->get( 'SecretKey' );
+               if ( !$secretKey ) {
+                       // If there's no secret key, just use the ID as given.
+                       return $id;
+               }
+               $storedHmac = substr( $cookieValue, $bangPos + 1 );
+               $calculatedHmac = MWCryptHash::hmac( $id, $secretKey, false );
+               if ( $calculatedHmac === $storedHmac ) {
+                       return $id;
+               } else {
+                       return null;
+               }
        }
 
        /**
@@ -1469,14 +1543,18 @@ class Block {
                 * This could be a username, an IP range, or a single IP. */
                $intended = $this->getTarget();
 
+               $systemBlockType = $this->getSystemBlockType();
+
                $lang = $context->getLanguage();
                return [
-                       $this->mAuto ? 'autoblockedtext' : 'blockedtext',
+                       $systemBlockType !== null
+                               ? 'systemblockedtext'
+                               : ( $this->mAuto ? 'autoblockedtext' : 'blockedtext' ),
                        $link,
                        $reason,
                        $context->getRequest()->getIP(),
                        $this->getByName(),
-                       $this->getId(),
+                       $systemBlockType !== null ? $systemBlockType : $this->getId(),
                        $lang->formatExpiry( $this->mExpiry ),
                        (string)$intended,
                        $lang->userTimeAndDate( $this->mTimestamp, $context->getUser() ),
index 1ebd605..d558dbc 100644 (file)
@@ -168,7 +168,7 @@ class Category {
         * @param Title $title Optional title object for the category represented by
         *   the given row. May be provided if it is already known, to avoid having
         *   to re-create a title object later.
-        * @return Category
+        * @return Category|false
         */
        public static function newFromRow( $row, $title = null ) {
                $cat = new self();
index 4efa2ff..504b35f 100644 (file)
@@ -40,7 +40,6 @@
  *     $a = $cf->run();
  *     print implode( ',' , $a );
  * @endcode
- *
  */
 class CategoryFinder {
        /** @var int[] The original article IDs passed to the seed function */
index b95f274..31369b0 100644 (file)
@@ -67,7 +67,7 @@ class CategoryViewer extends ContextSource {
        /** @var Collation */
        public $collation;
 
-       /** @var ImageGallery */
+       /** @var ImageGalleryBase */
        public $gallery;
 
        /** @var Category Category object for this page. */
@@ -197,7 +197,11 @@ class CategoryViewer extends ContextSource {
                $link = null;
                Hooks::run( 'CategoryViewer::generateLink', [ $type, $title, $html, &$link ] );
                if ( $link === null ) {
-                       $link = Linker::link( $title, $html );
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       if ( $html !== null ) {
+                               $html = new HtmlArmor( $html );
+                       }
+                       $link = $linkRenderer->makeLink( $title, $html );
                }
                if ( $isRedirect ) {
                        $link = '<span class="redirect-in-category">' . $link . '</span>';
@@ -628,11 +632,12 @@ class CategoryViewer extends ContextSource {
        private function pagingLinks( $first, $last, $type = '' ) {
                $prevLink = $this->msg( 'prev-page' )->text();
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( $first != '' ) {
                        $prevQuery = $this->query;
                        $prevQuery["{$type}until"] = $first;
                        unset( $prevQuery["{$type}from"] );
-                       $prevLink = Linker::linkKnown(
+                       $prevLink = $linkRenderer->makeKnownLink(
                                $this->addFragmentToTitle( $this->title, $type ),
                                $prevLink,
                                [],
@@ -646,7 +651,7 @@ class CategoryViewer extends ContextSource {
                        $lastQuery = $this->query;
                        $lastQuery["{$type}from"] = $last;
                        unset( $lastQuery["{$type}until"] );
-                       $nextLink = Linker::linkKnown(
+                       $nextLink = $linkRenderer->makeKnownLink(
                                $this->addFragmentToTitle( $this->title, $type ),
                                $nextLink,
                                [],
index 32717f1..c64f550 100644 (file)
@@ -443,7 +443,6 @@ $wgImgAuthUrlPathMap = [];
  * Properties required for all repos:
  *   - class            The class name for the repository. May come from the core or an extension.
  *                      The core repository classes are FileRepo, LocalRepo, ForeignDBRepo.
- *                      FSRepo is also supported for backwards compatibility.
  *
  *   - name             A unique name for the repository (but $wgLocalFileRepo should be 'local').
  *                      The name should consist of alpha-numeric characters.
@@ -1585,14 +1584,15 @@ $wgEnableEmail = true;
 $wgEnableUserEmail = true;
 
 /**
- * Set to true to put the sending user's email in a Reply-To header
- * instead of From. ($wgEmergencyContact will be used as From.)
+ * If true put the sending user's email in a Reply-To header
+ * instead of From (false). ($wgPasswordSender will be used as From.)
  *
  * Some mailers (eg SMTP) set the SMTP envelope sender to the From value,
  * which can cause problems with SPF validation and leak recipient addresses
- * when bounces are sent to the sender.
+ * when bounces are sent to the sender. In addition, DMARC restrictions
+ * can cause emails to fail to be received when false.
  */
-$wgUserEmailUseReplyTo = false;
+$wgUserEmailUseReplyTo = true;
 
 /**
  * Minimum time, in hours, which must elapse between password reminder
@@ -2031,7 +2031,6 @@ $wgDBmysql5 = false;
  * is in this case an unwanted overhead that just slows things down.
  *
  * @warning EXPERIMENTAL!
- *
  */
 $wgDBOracleDRCP = false;
 
@@ -2343,6 +2342,19 @@ $wgWANObjectCaches = [
        */
 ];
 
+/**
+ * Verify and enforce WAN cache purges using reliable DB sources as streams.
+ *
+ * These secondary cache purges are de-duplicated via simple cache mutexes.
+ * This improves consistency when cache purges are lost, which becomes more likely
+ * as more cache servers are added or if there are multiple datacenters. Only keys
+ * related to important mutable content will be checked.
+ *
+ * @var bool
+ * @since 1.29
+ */
+$wgEnableWANCacheReaper = false;
+
 /**
  * Main object stash type. This should be a fast storage system for storing
  * lightweight data like hit counters and user activity. Sites with multiple
@@ -2365,13 +2377,6 @@ $wgMainStash = 'db-replicated';
  */
 $wgParserCacheExpireTime = 86400;
 
-/**
- * Deprecated alias for $wgSessionsInObjectCache.
- *
- * @deprecated since 1.20; Use $wgSessionsInObjectCache
- */
-$wgSessionsInMemcached = true;
-
 /**
  * @deprecated since 1.27, session data is always stored in object cache.
  */
@@ -4023,6 +4028,7 @@ $wgNamespacesWithSubpages = [
        NS_FILE_TALK => true,
        NS_MEDIAWIKI => true,
        NS_MEDIAWIKI_TALK => true,
+       NS_TEMPLATE => true,
        NS_TEMPLATE_TALK => true,
        NS_HELP => true,
        NS_HELP_TALK => true,
@@ -4780,6 +4786,7 @@ $wgReservedUsernames = [
        'Maintenance script', // Maintenance scripts which perform editing, image import script
        'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
        'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
+       'Unknown user', // Used in WikiImporter when importing revisions with no author
        'msg:double-redirect-fixer', // Automatic double redirect fix
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
@@ -4795,7 +4802,7 @@ $wgReservedUsernames = [
  */
 $wgDefaultUserOptions = [
        'ccmeonemails' => 0,
-       'cols' => 80,
+       'cols' => 80, // @deprecated since 1.29 No longer used in core
        'date' => 'default',
        'diffonly' => 0,
        'disablemail' => 0,
@@ -4823,8 +4830,9 @@ $wgDefaultUserOptions = [
        'previewonfirst' => 0,
        'previewontop' => 1,
        'rcdays' => 7,
+       'rcenhancedfilters' => 0,
        'rclimit' => 50,
-       'rows' => 25,
+       'rows' => 25, // @deprecated since 1.29 No longer used in core
        'showhiddencats' => 0,
        'shownumberswatching' => 1,
        'showtoolbar' => 1,
@@ -4857,7 +4865,9 @@ $wgDefaultUserOptions = [
 /**
  * An array of preferences to not show for the user
  */
-$wgHiddenPrefs = [];
+$wgHiddenPrefs = [
+       'rcenhancedfilters',
+];
 
 /**
  * Characters to prevent during new account creations.
@@ -5329,26 +5339,60 @@ $wgAutoConfirmAge = 0;
 $wgAutoConfirmCount = 0;
 
 /**
- * Automatically add a usergroup to any user who matches certain conditions.
- *
- * @todo Redocument $wgAutopromote
- *
- * The format is
- *   [ '&' or '|' or '^' or '!', cond1, cond2, ... ]
- * where cond1, cond2, ... are themselves conditions; *OR*
- *   APCOND_EMAILCONFIRMED, *OR*
- *   [ APCOND_EMAILCONFIRMED ], *OR*
- *   [ APCOND_EDITCOUNT, number of edits ], *OR*
- *   [ APCOND_AGE, seconds since registration ], *OR*
- *   [ APCOND_INGROUPS, group1, group2, ... ], *OR*
- *   [ APCOND_ISIP, ip ], *OR*
- *   [ APCOND_IPINRANGE, range ], *OR*
- *   [ APCOND_AGE_FROM_EDIT, seconds since first edit ], *OR*
- *   [ APCOND_BLOCKED ], *OR*
- *   [ APCOND_ISBOT ], *OR*
- *   similar constructs defined by extensions.
- *
- * If $wgEmailAuthentication is off, APCOND_EMAILCONFIRMED will be true for any
+ * Array containing the conditions of automatic promotion of a user to specific groups.
+ *
+ * The basic syntax for `$wgAutopromote` is:
+ *
+ *     $wgAutopromote = array(
+ *         'groupname' => cond,
+ *         'group2' => cond2,
+ *     );
+ *
+ * A `cond` may be:
+ *  - a single condition without arguments:
+ *      Note that Autopromote wraps a single non-array value into an array
+ *      e.g. `APCOND_EMAILCONFIRMED` OR
+ *           array( `APCOND_EMAILCONFIRMED` )
+ *  - a single condition with arguments:
+ *      e.g. `array( APCOND_EDITCOUNT, 100 )`
+ *  - a set of conditions:
+ *      e.g. `array( 'operand', cond1, cond2, ... )`
+ *
+ * When constructing a set of conditions, the following conditions are available:
+ *  - `&` (**AND**):
+ *      promote if user matches **ALL** conditions
+ *  - `|` (**OR**):
+ *      promote if user matches **ANY** condition
+ *  - `^` (**XOR**):
+ *      promote if user matches **ONLY ONE OF THE CONDITIONS**
+ *  - `!` (**NOT**):
+ *      promote if user matces **NO** condition
+ *  - array( APCOND_EMAILCONFIRMED ):
+ *      true if user has a confirmed e-mail
+ *  - array( APCOND_EDITCOUNT, number of edits ):
+ *      true if user has the at least the number of edits as the passed parameter
+ *  - array( APCOND_AGE, seconds since registration ):
+ *      true if the length of time since the user created his/her account
+ *      is at least the same length of time as the passed parameter
+ *  - array( APCOND_AGE_FROM_EDIT, seconds since first edit ):
+ *      true if the length of time since the user made his/her first edit
+ *      is at least the same length of time as the passed parameter
+ *  - array( APCOND_INGROUPS, group1, group2, ... ):
+ *      true if the user is a member of each of the passed groups
+ *  - array( APCOND_ISIP, ip ):
+ *      true if the user has the passed IP address
+ *  - array( APCOND_IPINRANGE, range ):
+ *      true if the user has an IP address in the range of the passed parameter
+ *  - array( APCOND_BLOCKED ):
+ *      true if the user is blocked
+ *  - array( APCOND_ISBOT ):
+ *      true if the user is a bot
+ *  - similar constructs can be defined by extensions
+ *
+ * The sets of conditions are evaluated recursively, so you can use nested sets of conditions
+ * linked by operands.
+ *
+ * Note that if $wgEmailAuthentication is disabled, APCOND_EMAILCONFIRMED will be true for any
  * user who has provided an e-mail address.
  */
 $wgAutopromote = [
@@ -5518,6 +5562,15 @@ $wgDnsBlacklistUrls = [ 'http.dnsbl.sorbs.net.' ];
  */
 $wgProxyWhitelist = [];
 
+/**
+ * IP ranges that should be considered soft-blocked (anon-only, account
+ * creation allowed). The intent is to use this to prevent anonymous edits from
+ * shared resources such as Wikimedia Labs.
+ * @since 1.29
+ * @var string[]
+ */
+$wgSoftBlockRanges = [];
+
 /**
  * Whether to look at the X-Forwarded-For header's list of (potentially spoofed)
  * IPs and apply IP blocks to them. This allows for IP blocks to work with correctly-configured
@@ -5629,7 +5682,7 @@ $wgRateLimits = [
 ];
 
 /**
- * Array of IPs which should be excluded from rate limits.
+ * Array of IPs / CIDR ranges which should be excluded from rate limits.
  * This may be useful for whitelisting NAT gateways for conferences, etc.
  */
 $wgRateLimitsExcludedIPs = [];
@@ -5831,6 +5884,15 @@ $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
 
 /************************************************************************//**
@@ -5928,7 +5990,10 @@ $wgSessionName = false;
 
 /**
  * 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.
+ * after logging out and moving to a new IP address, will still be blocked. This cookie will contain
+ * an authentication code if $wgSecretKey is set, or otherwise will just be the block ID (in
+ * which case there is a possibility of an attacker discovering the names of revdeleted users, so
+ * it is best to use this in conjunction with $wgSecretKey being set).
  */
 $wgCookieSetOnAutoblock = false;
 
@@ -6595,51 +6660,64 @@ $wgRCLinkLimits = [ 50, 100, 250, 500 ];
 $wgRCLinkDays = [ 1, 3, 7, 14, 30 ];
 
 /**
- * Destinations to which notifications about recent changes
- * should be sent.
+ * Configuration for feeds to which notifications about recent changes will be sent.
+ *
+ * The following feed classes are available by default:
+ * - 'UDPRCFeedEngine' - sends recent changes over UDP to the specified server.
+ * - 'RedisPubSubFeedEngine' - send recent changes to Redis.
+ *
+ * Only 'class' or 'uri' is required. If 'uri' is set instead of 'class', then
+ * RecentChange::getEngine() is used to determine the class. All options are
+ * passed to the constructor.
  *
- * As of MediaWiki 1.22, there are 2 supported 'engine' parameter option in core:
- *   * 'UDPRCFeedEngine', which is used to send recent changes over UDP to the
- *      specified server.
- *   * 'RedisPubSubFeedEngine', which is used to send recent changes to Redis.
+ * Common options:
+ * - 'class' -- The class to use for this feed (must implement RCFeed).
+ * - 'omit_bots' -- Exclude bot edits from the feed. (default: false)
+ * - 'omit_anon' -- Exclude anonymous edits from the feed. (default: false)
+ * - 'omit_user' -- Exclude edits by registered users from the feed. (default: false)
+ * - 'omit_minor' -- Exclude minor edits from the feed. (default: false)
+ * - 'omit_patrolled' -- Exclude patrolled edits from the feed. (default: false)
  *
- * The common options are:
- *   * 'uri' -- the address to which the notices are to be sent.
- *   * 'formatter' -- the class name (implementing RCFeedFormatter) which will
- *     produce the text to send. This can also be an object of the class.
- *   * 'omit_bots' -- whether the bot edits should be in the feed
- *   * 'omit_anon' -- whether anonymous edits should be in the feed
- *   * 'omit_user' -- whether edits by registered users should be in the feed
- *   * 'omit_minor' -- whether minor edits should be in the feed
- *   * 'omit_patrolled' -- whether patrolled edits should be in the feed
+ * FormattedRCFeed-specific options:
+ * - 'uri' -- [required] The address to which the messages are sent.
+ *   The uri scheme of this string will be looked up in $wgRCEngines
+ *   to determine which RCFeedEngine class to use.
+ * - 'formatter' -- [required] The class (implementing RCFeedFormatter) which will
+ *   produce the text to send. This can also be an object of the class.
+ *   Formatters available by default: JSONRCFeedFormatter, XMLRCFeedFormatter,
+ *   IRCColourfulRCFeedFormatter.
  *
- *  The IRC-specific options are:
- *   * 'add_interwiki_prefix' -- whether the titles should be prefixed with
- *     the first entry in the $wgLocalInterwikis array (or the value of
- *     $wgLocalInterwiki, if set)
+ * IRCColourfulRCFeedFormatter-specific options:
+ * - 'add_interwiki_prefix' -- whether the titles should be prefixed with
+ *   the first entry in the $wgLocalInterwikis array (or the value of
+ *   $wgLocalInterwiki, if set)
  *
- *  The JSON-specific options are:
- *   * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
+ * JSONRCFeedFormatter-specific options:
+ * - 'channel' -- if set, the 'channel' parameter is also set in JSON values.
  *
  * @example $wgRCFeeds['example'] = [
+ *             'uri' => 'udp://localhost:1336',
  *             'formatter' => 'JSONRCFeedFormatter',
- *             'uri' => "udp://localhost:1336",
  *             'add_interwiki_prefix' => false,
  *             'omit_bots' => true,
  *     ];
- * @example $wgRCFeeds['exampleirc'] = [
+ * @example $wgRCFeeds['example'] = [
+ *             'uri' => 'udp://localhost:1338',
  *             'formatter' => 'IRCColourfulRCFeedFormatter',
- *             'uri' => "udp://localhost:1338",
  *             'add_interwiki_prefix' => false,
  *             'omit_bots' => true,
  *     ];
+ * @example $wgRCFeeds['example'] = [
+ *             'class' => 'ExampleRCFeed',
+ *     ];
  * @since 1.22
  */
 $wgRCFeeds = [];
 
 /**
- * Used by RecentChange::getEngine to find the correct engine to use for a given URI scheme.
- * Keys are scheme names, values are names of engine classes.
+ * Used by RecentChange::getEngine to find the correct engine for a given URI scheme.
+ * Keys are scheme names, values are names of FormattedRCFeed sub classes.
+ * @since 1.22
  */
 $wgRCEngines = [
        'redis' => 'RedisPubSubFeedEngine',
@@ -7516,6 +7594,7 @@ $wgLogActionsHandlers = [
        'contentmodel/change' => 'ContentModelLogFormatter',
        'contentmodel/new' => 'ContentModelLogFormatter',
        'delete/delete' => 'DeleteLogFormatter',
+       'delete/delete_redir' => 'DeleteLogFormatter',
        'delete/event' => 'DeleteLogFormatter',
        'delete/restore' => 'DeleteLogFormatter',
        'delete/revision' => 'DeleteLogFormatter',
@@ -7567,6 +7646,7 @@ $wgActionFilteredLogs = [
        ],
        'delete' => [
                'delete' => [ 'delete' ],
+               'delete_redir' => [ 'delete_redir' ],
                'restore' => [ 'restore' ],
                'event' => [ 'event' ],
                'revision' => [ 'revision' ],
@@ -8059,6 +8139,12 @@ $wgShellLocale = 'en_US.utf8';
  */
 $wgHTTPTimeout = 25;
 
+/**
+ * Timeout for HTTP requests done internally for transwiki imports, in seconds.
+ * @since 1.29
+ */
+$wgHTTPImportTimeout = 25;
+
 /**
  * Timeout for Asynchronous (background) HTTP requests, in seconds.
  */
@@ -8109,10 +8195,7 @@ $wgJobRunRate = 1;
  *
  * @since 1.23
  */
-$wgRunJobsAsync = (
-       !function_exists( 'register_postsend_function' ) &&
-       !function_exists( 'fastcgi_finish_request' )
-);
+$wgRunJobsAsync = false;
 
 /**
  * Number of rows to update per job
@@ -8187,7 +8270,19 @@ $wgRedirectOnLogin = null;
  * The remaining elements are passed through to the class as constructor
  * parameters.
  *
- * @par Example:
+ * @par Example using local redis instance:
+ * @code
+ *   $wgPoolCounterConf = [ 'ArticleView' => [
+ *     'class' => 'PoolCounterRedis',
+ *     'timeout' => 15, // wait timeout in seconds
+ *     'workers' => 1, // maximum number of active threads in each pool
+ *     'maxqueue' => 5, // maximum number of total threads in each pool
+ *     'servers' => [ '127.0.0.1' ],
+ *     'redisConfig' => []
+ *   ] ];
+ * @endcode
+ *
+ * @par Example using C daemon from https://www.mediawiki.org/wiki/Extension:PoolCounter:
  * @code
  *   $wgPoolCounterConf = [ 'ArticleView' => [
  *     'class' => 'PoolCounter_Client',
@@ -8195,7 +8290,7 @@ $wgRedirectOnLogin = null;
  *     'workers' => 5, // maximum number of active threads in each pool
  *     'maxqueue' => 50, // maximum number of total threads in each pool
  *     ... any extension-specific options...
- *   ];
+ *   ] ];
  * @endcode
  */
 $wgPoolCounterConf = null;
@@ -8467,6 +8562,42 @@ $wgCSPFalsePositiveUrls = [
        'https://d5p.de17a.com' => true,
 ];
 
+/**
+ * The following variables define 3 user experience levels:
+ *
+ *  - newcomer: has not yet reached the 'learner' level
+ *
+ *  - learner: has at least $wgLearnerEdits and has been
+ *             a member for $wgLearnerMemberSince days
+ *             but has not yet reached the 'experienced' level.
+ *
+ *  - experienced: has at least $wgExperiencedUserEdits edits and
+ *                 has been a member for $wgExperiencedUserMemberSince days.
+ */
+$wgLearnerEdits = 10;
+$wgLearnerMemberSince = 4; # days
+$wgExperiencedUserEdits = 500;
+$wgExperiencedUserMemberSince = 30; # days
+
+/**
+ * Mapping of interwiki index prefixes to descriptors that
+ * can be used to change the display of interwiki search results.
+ *
+ * Descriptors are appended to CSS classes of interwiki results
+ * which using InterwikiSearchResultWidget.
+ *
+ * Predefined descriptors include the following words:
+ * definition, textbook, news, quotation, book, travel, course
+ *
+ * @par Example:
+ * @code
+ * $wgInterwikiPrefixDisplayTypes = [
+ *     'iwprefix' => 'definition'
+ *];
+ * @endcode
+ */
+$wgInterwikiPrefixDisplayTypes = [];
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 0616898..35c2a2d 100644 (file)
  * @file
  */
 
+require_once __DIR__ . '/libs/mime/defines.php';
+require_once __DIR__ . '/libs/time/defines.php';
+require_once __DIR__ . '/libs/rdbms/defines.php';
+require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
+
 /**
  * @defgroup Constants MediaWiki constants
  */
@@ -97,8 +102,6 @@ define( 'CACHE_MEMCACHED', 2 );  // MemCached, must specify servers in $wgMemCac
 define( 'CACHE_ACCEL', 3 );      // APC, XCache or WinCache
 /**@}*/
 
-require_once __DIR__ . '/libs/mime/defines.php';
-
 /**@{
  * Antivirus result codes, for use in $wgAntivirusSetup.
  */
@@ -153,16 +156,6 @@ define( 'EDIT_AUTOSUMMARY', 64 );
 define( 'EDIT_INTERNAL', 128 );
 /**@}*/
 
-/**
- * Database related
- */
-require_once __DIR__ . '/libs/rdbms/defines.php';
-
-/**
- * Unicode and normalisation related
- */
-require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
-
 /**@{
  * Hook support constants
  */
index 4c149ae..487e86c 100644 (file)
@@ -49,10 +49,6 @@ class DerivativeRequest extends FauxRequest {
                return $this->base->getCookie( $key, $prefix, $default );
        }
 
-       public function checkSessionCookie() {
-               return $this->base->checkSessionCookie();
-       }
-
        public function getHeader( $name, $flags = 0 ) {
                return $this->base->getHeader( $name, $flags );
        }
index fc94a63..9aa6aeb 100644 (file)
@@ -5,48 +5,6 @@
  */
 class DummyLinker {
 
-       /**
-        * @deprecated since 1.27
-        */
-       public function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               return Linker::getInterwikiLinkAttributes(
-                       $title,
-                       $unused,
-                       $class
-               );
-       }
-
-       /**
-        * @deprecated since 1.27
-        */
-       public function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               return Linker::getInternalLinkAttributes(
-                       $title,
-                       $unused,
-                       $class
-               );
-       }
-
-       /**
-        * @deprecated since 1.27
-        */
-       public function getInternalLinkAttributesObj(
-               $nt,
-               $unused = null,
-               $class = '',
-               $title = false
-       ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               return Linker::getInternalLinkAttributesObj(
-                       $nt,
-                       $unused,
-                       $class,
-                       $title
-               );
-       }
-
        /**
         * @deprecated since 1.28, use LinkRenderer::getLinkClasses() instead
         */
index 745f8de..a45c889 100644 (file)
@@ -295,7 +295,7 @@ class EditPage {
        /** @var bool Has a summary been preset using GET parameter &summary= ? */
        public $hasPresetSummary = false;
 
-       /** @var bool */
+       /** @var Revision|bool */
        public $mBaseRevision = false;
 
        /** @var bool */
@@ -498,7 +498,10 @@ class EditPage {
                $this->enableApiEditOverride = $enableOverride;
        }
 
-       function submit() {
+       /**
+        * @deprecated since 1.29, call edit directly
+        */
+       public function submit() {
                $this->edit();
        }
 
@@ -513,7 +516,7 @@ class EditPage {
         * is made and all is well do we actually save and redirect to
         * the newly-edited page.
         */
-       function edit() {
+       public function edit() {
                global $wgOut, $wgRequest, $wgUser;
                // Allow extensions to modify/prevent this form or submission
                if ( !Hooks::run( 'AlternateEdit', [ $this ] ) ) {
@@ -661,7 +664,11 @@ class EditPage {
                $remove = [];
                foreach ( $permErrors as $error ) {
                        if ( ( $this->preview || $this->diff )
-                               && ( $error[0] == 'blockedtext' || $error[0] == 'autoblockedtext' )
+                               && (
+                                       $error[0] == 'blockedtext' ||
+                                       $error[0] == 'autoblockedtext' ||
+                                       $error[0] == 'systemblockedtext'
+                               )
                        ) {
                                $remove[] = $error;
                        }
@@ -833,7 +840,7 @@ class EditPage {
         * @param WebRequest $request
         * @throws ErrorPageError
         */
-       function importFormData( &$request ) {
+       public function importFormData( &$request ) {
                global $wgContLang, $wgUser;
 
                # Section edit can come from either the form or a link
@@ -1064,7 +1071,7 @@ class EditPage {
         * Called on the first invocation, e.g. when a user clicks an edit link
         * @return bool If the requested section is valid
         */
-       function initialiseForm() {
+       public function initialiseForm() {
                global $wgUser;
                $this->edittime = $this->page->getTimestamp();
                $this->editRevId = $this->page->getLatest();
@@ -1249,7 +1256,7 @@ class EditPage {
                $revision = $this->mArticle->getRevisionFetched();
                if ( $revision === null ) {
                        if ( !$this->contentModel ) {
-                               $this->contentModel = $this->getTitle()->getContentModel();
+                               throw new RuntimeException( 'EditPage contentModel was false' );
                        }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
 
@@ -1293,7 +1300,7 @@ class EditPage {
 
                if ( $content === false || $content === null ) {
                        if ( !$this->contentModel ) {
-                               $this->contentModel = $this->getTitle()->getContentModel();
+                               throw new RuntimeException( 'EditPage contentModel was false' );
                        }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
 
@@ -1416,7 +1423,7 @@ class EditPage {
         * @return bool
         * @private
         */
-       function tokenOk( &$request ) {
+       public function tokenOk( &$request ) {
                global $wgUser;
                $token = $request->getVal( 'wpEditToken' );
                $this->mTokenOk = $wgUser->matchEditToken( $token );
@@ -1617,15 +1624,7 @@ class EditPage {
         */
        protected function runPostMergeFilters( Content $content, Status $status, User $user ) {
                // Run old style post-section-merge edit filter
-               if ( !ContentHandler::runLegacyHooks( 'EditFilterMerged',
-                       [ $this, $content, &$this->hookError, $this->summary ],
-                       '1.21'
-               ) ) {
-                       # Error messages etc. could be handled within the hook...
-                       $status->fatal( 'hookaborted' );
-                       $status->value = self::AS_HOOK_ERROR;
-                       return false;
-               } elseif ( $this->hookError != '' ) {
+               if ( $this->hookError != '' ) {
                        # ...or the hook could be expecting us to produce an error
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR_EXPECTED;
@@ -1718,7 +1717,7 @@ class EditPage {
         *   AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some
         * time.
         */
-       function internalAttemptSave( &$result, $bot = false ) {
+       public function internalAttemptSave( &$result, $bot = false ) {
                global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize;
                global $wgContentHandlerUseDB;
 
@@ -2142,7 +2141,8 @@ class EditPage {
                        false,
                        $wgUser,
                        $content->getDefaultFormat(),
-                       $this->changeTags
+                       $this->changeTags,
+                       $this->undidRev
                );
 
                if ( !$doEditStatus->isOK() ) {
@@ -2273,7 +2273,7 @@ class EditPage {
         *        one might think of X as the "base revision", which is NOT what this returns.
         * @return Revision Current version when the edit was started
         */
-       function getBaseRevision() {
+       public function getBaseRevision() {
                if ( !$this->mBaseRevision ) {
                        $db = wfGetDB( DB_MASTER );
                        $this->mBaseRevision = $this->editRevId
@@ -2325,7 +2325,7 @@ class EditPage {
                return false;
        }
 
-       function setHeaders() {
+       public function setHeaders() {
                global $wgOut, $wgUser, $wgAjaxEditStash, $wgCookieSetOnAutoblock;
 
                $wgOut->addModules( 'mediawiki.action.edit' );
@@ -2585,7 +2585,7 @@ class EditPage {
         * The $formCallback parameter is deprecated since MediaWiki 1.25. Please
         * use the EditPage::showEditForm:fields hook instead.
         */
-       function showEditForm( $formCallback = null ) {
+       public function showEditForm( $formCallback = null ) {
                global $wgOut, $wgUser;
 
                # need to parse the preview early so that we know which templates are used,
@@ -2597,7 +2597,9 @@ class EditPage {
                        $previewOutput = $this->getPreviewText();
                }
 
-               Hooks::run( 'EditPage::showEditForm:initial', [ &$this, &$wgOut ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPage::showEditForm:initial', [ &$editPage, &$wgOut ] );
 
                $this->setHeaders();
 
@@ -2674,7 +2676,9 @@ class EditPage {
                        . Xml::closeElement( 'div' )
                );
 
-               Hooks::run( 'EditPage::showEditForm:fields', [ &$this, &$wgOut ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPage::showEditForm:fields', [ &$editPage, &$wgOut ] );
 
                // Put these up at the top to ensure they aren't lost on early form submission
                $this->showFormBeforeText();
@@ -2834,7 +2838,7 @@ class EditPage {
         * @param Title[] $templates
         * @return string HTML
         */
-       protected function makeTemplatesOnThisPageList( array $templates ) {
+       public function makeTemplatesOnThisPageList( array $templates ) {
                $templateListFormatter = new TemplatesOnThisPageFormatter(
                        $this->context, MediaWikiServices::getInstance()->getLinkRenderer()
                );
@@ -3023,7 +3027,7 @@ class EditPage {
         *
         * @return array An array in the format [ $label, $input ]
         */
-       function getSummaryInput( $summary = "", $labelText = null,
+       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.
@@ -3278,14 +3282,14 @@ HTML
         */
        protected function showPreview( $text ) {
                global $wgOut;
-               if ( $this->mTitle->getNamespace() == NS_CATEGORY ) {
+               if ( $this->mArticle instanceof CategoryPage ) {
                        $this->mArticle->openShowCategory();
                }
                # This hook seems slightly odd here, but makes things more
                # consistent for extensions.
                Hooks::run( 'OutputPageBeforeHTML', [ &$wgOut, &$text ] );
                $wgOut->addHTML( $text );
-               if ( $this->mTitle->getNamespace() == NS_CATEGORY ) {
+               if ( $this->mArticle instanceof CategoryPage ) {
                        $this->mArticle->closeShowCategory();
                }
        }
@@ -3297,7 +3301,7 @@ HTML
         * If this is a section edit, we'll replace the section as for final
         * save and then make a comparison.
         */
-       function showDiff() {
+       public function showDiff() {
                global $wgUser, $wgContLang, $wgOut;
 
                $oldtitlemsg = 'currentrev';
@@ -3326,7 +3330,6 @@ HTML
                }
 
                if ( $newContent ) {
-                       ContentHandler::runLegacyHooks( 'EditPageGetDiffText', [ $this, &$newContent ], '1.21' );
                        Hooks::run( 'EditPageGetDiffContent', [ $this, &$newContent ] );
 
                        $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
@@ -3537,16 +3540,10 @@ HTML
        protected function showConflict() {
                global $wgOut;
 
-               if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) {
-                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
-                       $stats->increment( 'edit.failures.conflict' );
-                       // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
-                       if (
-                               $this->mTitle->getNamespace() >= NS_MAIN &&
-                               $this->mTitle->getNamespace() <= NS_CATEGORY_TALK
-                       ) {
-                               $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() );
-                       }
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$editPage, &$wgOut ] ) ) {
+                       $this->incrementConflictStats();
 
                        $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
 
@@ -3566,11 +3563,24 @@ HTML
                }
        }
 
+       private function incrementConflictStats() {
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+               $stats->increment( 'edit.failures.conflict' );
+               // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
+               if (
+                       $this->mTitle->getNamespace() >= NS_MAIN &&
+                       $this->mTitle->getNamespace() <= NS_CATEGORY_TALK
+               ) {
+                       $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() );
+               }
+       }
+
        /**
         * @return string
         */
        public function getCancelLink() {
                $cancelParams = [];
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
                } elseif ( $this->getContextTitle()->isRedirect() ) {
@@ -3578,9 +3588,9 @@ HTML
                }
                $attrs = [ 'id' => 'mw-editform-cancel' ];
 
-               return Linker::linkKnown(
+               return $linkRenderer->makeKnownLink(
                        $this->getContextTitle(),
-                       $this->context->msg( 'cancel' )->parse(),
+                       new HtmlArmor( $this->context->msg( 'cancel' )->parse() ),
                        Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ),
                        $cancelParams
                );
@@ -3673,12 +3683,10 @@ HTML
         * @throws MWException
         * @return string
         */
-       function getPreviewText() {
+       public function getPreviewText() {
                global $wgOut, $wgRawHtml, $wgLang;
                global $wgAllowUserCss, $wgAllowUserJs;
 
-               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
-
                if ( $wgRawHtml && !$this->mTokenOk ) {
                        // Could be an offsite preview attempt. This is very unsafe if
                        // HTML is enabled, as it could be an attack.
@@ -3691,7 +3699,7 @@ HTML
                                        $this->context->msg( 'session_fail_preview_html' )->text() . "</div>",
                                        true, /* interface */true );
                        }
-                       $stats->increment( 'edit.failures.session_loss' );
+                       $this->incrementEditFailureStats( 'session_loss' );
                        return $parsedNote;
                }
 
@@ -3715,15 +3723,15 @@ HTML
                        if ( $this->mTriedSave && !$this->mTokenOk ) {
                                if ( $this->mTokenOkExceptSuffix ) {
                                        $note = $this->context->msg( 'token_suffix_mismatch' )->plain();
-                                       $stats->increment( 'edit.failures.bad_token' );
+                                       $this->incrementEditFailureStats( 'bad_token' );
                                } else {
                                        $note = $this->context->msg( 'session_fail_preview' )->plain();
-                                       $stats->increment( 'edit.failures.session_loss' );
+                                       $this->incrementEditFailureStats( 'session_loss' );
                                }
                        } elseif ( $this->incompleteForm ) {
                                $note = $this->context->msg( 'edit_form_incomplete' )->plain();
                                if ( $this->mTriedSave ) {
-                                       $stats->increment( 'edit.failures.incomplete_form' );
+                                       $this->incrementEditFailureStats( 'incomplete_form' );
                                }
                        } else {
                                $note = $this->context->msg( 'previewnote' )->plain() . ' ' . $continueEditing;
@@ -3769,7 +3777,6 @@ HTML
                        }
 
                        $hook_args = [ $this, &$content ];
-                       ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args, '1.25' );
                        Hooks::run( 'EditPageGetPreviewContent', $hook_args );
 
                        $parserResult = $this->doPreviewParse( $content );
@@ -3812,6 +3819,11 @@ HTML
                return $previewhead . $previewHTML . $this->previewTextAfterContent;
        }
 
+       private function incrementEditFailureStats( $failureType ) {
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+               $stats->increment( 'edit.failures.' . $failureType );
+       }
+
        /**
         * Get parser options for a preview
         * @return ParserOptions
@@ -3850,7 +3862,7 @@ HTML
        /**
         * @return array
         */
-       function getTemplates() {
+       public function getTemplates() {
                if ( $this->preview || $this->section != '' ) {
                        $templates = [];
                        if ( !isset( $this->mParserOutput ) ) {
@@ -3874,7 +3886,7 @@ HTML
         * @param Title $title Title object for the page being edited (optional)
         * @return string
         */
-       static function getEditToolbar( $title = null ) {
+       public static function getEditToolbar( $title = null ) {
                global $wgContLang, $wgOut;
                global $wgEnableUploads, $wgForeignFileRepos;
 
@@ -4065,7 +4077,10 @@ HTML
                                $checkboxes['watch'] = $watchThisHtml;
                        }
                }
-               Hooks::run( 'EditPageBeforeEditChecks', [ &$this, &$checkboxes, &$tabindex ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPageBeforeEditChecks', [ &$editPage, &$checkboxes, &$tabindex ] );
                return $checkboxes;
        }
 
@@ -4114,7 +4129,9 @@ HTML
                $buttons['diff'] = Html::submitButton( $this->context->msg( 'showdiff' )->text(),
                        $attribs );
 
-               Hooks::run( 'EditPageBeforeEditButtons', [ &$this, &$buttons, &$tabindex ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPageBeforeEditButtons', [ &$editPage, &$buttons, &$tabindex ] );
                return $buttons;
        }
 
@@ -4122,13 +4139,16 @@ HTML
         * Creates a basic error page which informs the user that
         * they have attempted to edit a nonexistent section.
         */
-       function noSuchSectionPage() {
+       public function noSuchSectionPage() {
                global $wgOut;
 
                $wgOut->prepareErrorPage( $this->context->msg( 'nosuchsectiontitle' ) );
 
                $res = $this->context->msg( 'nosuchsectiontext', $this->section )->parseAsBlock();
-               Hooks::run( 'EditPageNoSuchSection', [ &$this, &$res ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPageNoSuchSection', [ &$editPage, &$res ] );
                $wgOut->addHTML( $res );
 
                $wgOut->returnToMain( false, $this->mTitle );
@@ -4423,8 +4443,8 @@ HTML
                $attribs = $customAttribs + [
                                'accesskey' => ',',
                                'id' => $name,
-                               'cols' => $user->getIntOption( 'cols' ),
-                               'rows' => $user->getIntOption( 'rows' ),
+                               'cols' => 80,
+                               'rows' => 25,
                                // Avoid PHP notices when appending preferences
                                // (appending allows customAttribs['style'] to still work).
                                'style' => ''
index e6223e8..f284d92 100644 (file)
@@ -21,6 +21,7 @@
  * @author Rob Church <robchur@gmail.com>
  * @ingroup Media
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * File deletion user interface
@@ -152,7 +153,7 @@ class FileDeleteForm {
         * @param User $user User object performing the request
         * @param array $tags Tags to apply to the deletion action
         * @throws MWException
-        * @return bool|Status
+        * @return Status
         */
        public static function doDelete( &$title, &$file, &$oldimage, $reason,
                $suppress, User $user = null, $tags = []
@@ -205,7 +206,8 @@ class FileDeleteForm {
                                        $dbw->endAtomic( __METHOD__ );
                                } else {
                                        // Page deleted but file still there? rollback page delete
-                                       wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
+                                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                                       $lbFactory->rollbackMasterChanges( __METHOD__ );
                                }
                        } else {
                                // Done; nothing changed
@@ -301,9 +303,10 @@ class FileDeleteForm {
 
                        if ( $wgUser->isAllowed( 'editinterface' ) ) {
                                $title = wfMessage( 'filedelete-reason-dropdown' )->inContentLanguage()->getTitle();
-                               $link = Linker::linkKnown(
+                               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                               $link = $linkRenderer->makeKnownLink(
                                        $title,
-                                       wfMessage( 'filedelete-edit-reasonlist' )->escaped(),
+                                       wfMessage( 'filedelete-edit-reasonlist' )->text(),
                                        [],
                                        [ 'action' => 'edit' ]
                                );
index de7e8c2..4351acc 100644 (file)
@@ -46,7 +46,7 @@ class GitInfo {
        protected $cache = [];
 
        /**
-        * Map of repo URLs to viewer URLs. Access via static method getViewers().
+        * @var array|false Map of repo URLs to viewer URLs. Access via static method getViewers().
         */
        private static $viewers = false;
 
index b3ccc56..3c3cdb8 100644 (file)
@@ -545,7 +545,7 @@ function wfAppendQuery( $url, $query ) {
  * @param string $url Either fully-qualified or a local path + query
  * @param string $defaultProto One of the PROTO_* constants. Determines the
  *    protocol to use if $url or $wgServer is protocol-relative
- * @return string Fully-qualified URL, current-path-relative URL or false if
+ * @return string|false Fully-qualified URL, current-path-relative URL or false if
  *    no valid URL can be constructed
  */
 function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
@@ -1385,12 +1385,16 @@ function wfGetLangObj( $langcode = false ) {
  * @see Message::__construct
  */
 function wfMessage( $key /*...*/ ) {
+       $message = new Message( $key );
+
+       // We call Message::params() to reduce code duplication
        $params = func_get_args();
        array_shift( $params );
-       if ( isset( $params[0] ) && is_array( $params[0] ) ) {
-               $params = $params[0];
+       if ( $params ) {
+               call_user_func_array( [ $message, 'params' ], $params );
        }
-       return new Message( $key, $params );
+
+       return $message;
 }
 
 /**
@@ -1995,10 +1999,6 @@ function wfRestoreWarnings() {
        MediaWiki\suppressWarnings( true );
 }
 
-# Autodetect, convert and provide timestamps of various types
-
-require_once __DIR__ . '/libs/time/defines.php';
-
 /**
  * Get a timestamp string in one of various formats
  *
@@ -3084,7 +3084,7 @@ function wfGetDB( $db, $groups = [], $wiki = false ) {
  *              or MediaWikiServices::getDBLoadBalancerFactory() instead.
  *
  * @param string|bool $wiki Wiki ID, or false for the current wiki
- * @return LoadBalancer
+ * @return \Wikimedia\Rdbms\LoadBalancer
  */
 function wfGetLB( $wiki = false ) {
        if ( $wiki === false ) {
@@ -3100,7 +3100,7 @@ function wfGetLB( $wiki = false ) {
  *
  * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancerFactory() instead.
  *
- * @return LBFactory
+ * @return \Wikimedia\Rdbms\LBFactory
  */
 function wfGetLBFactory() {
        return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
@@ -3518,7 +3518,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
        # Run the extension hook
        $bad = false;
        if ( !Hooks::run( 'BadImage', [ $name, &$bad ] ) ) {
-               return $bad;
+               return (bool)$bad;
        }
 
        $cache = ObjectCache::getLocalServerInstance( 'hash' );
index b17a2f5..3d86201 100644 (file)
@@ -239,7 +239,7 @@ class HistoryBlobStub {
        }
 
        /**
-        * @return string
+        * @return string|false
         */
        function getText() {
                if ( isset( self::$blobCache[$this->mOldId] ) ) {
index 511781d..f4f86be 100644 (file)
@@ -176,22 +176,13 @@ class Hooks {
                                throw new MWException( 'Invalid callback ' . $func . ' in hooks for ' . $event . "\n" );
                        }
 
-                       /*
-                        * Call the hook. The documentation of call_user_func_array says
-                        * false is returned on failure. However, if the function signature
-                        * does not match the call signature, PHP will issue an warning and
-                        * return null instead. The following code catches that warning and
-                        * provides better error message.
-                        */
-                       $retval = null;
-                       $badhookmsg = null;
-                       $hook_args = array_merge( $hook, $args );
-
                        // mark hook as deprecated, if deprecation version is specified
                        if ( $deprecatedVersion !== null ) {
                                wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
                        }
 
+                       // Call the hook.
+                       $hook_args = array_merge( $hook, $args );
                        $retval = call_user_func_array( $callback, $hook_args );
 
                        // Process the return value.
index 0b6b655..b46ea81 100644 (file)
@@ -485,22 +485,6 @@ class Html {
                        // and better compression anyway.
                        $key = strtolower( $key );
 
-                       // Bug 23769: Blacklist all form validation attributes for now.  Current
-                       // (June 2010) WebKit has no UI, so the form just refuses to submit
-                       // without telling the user why, which is much worse than failing
-                       // server-side validation.  Opera is the only other implementation at
-                       // this time, and has ugly UI, so just kill the feature entirely until
-                       // we have at least one good implementation.
-
-                       // As the default value of "1" for "step" rejects decimal
-                       // numbers to be entered in 'type="number"' fields, allow
-                       // the special case 'step="any"'.
-
-                       if ( in_array( $key, [ 'max', 'min', 'pattern', 'required' ] )
-                               || $key === 'step' && $value !== 'any' ) {
-                               continue;
-                       }
-
                        // https://www.w3.org/TR/html401/index/attributes.html ("space-separated")
                        // https://www.w3.org/TR/html5/index.html#attributes-1 ("space-separated")
                        $spaceSeparatedListAttributes = [
index 7b3d72b..2f50558 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\LikeMatch;
 
 /**
  * Some functions to help implement an external link filter for spam control.
index d3d1f38..05e3abb 100644 (file)
@@ -38,102 +38,6 @@ class Linker {
        const TOOL_LINKS_NOBLOCK = 1;
        const TOOL_LINKS_EMAIL = 2;
 
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param string $title The title text for the link, URL-encoded (???) but
-        *   not HTML-escaped
-        * @param string $unused Unused
-        * @param string $class The contents of the class attribute; if an empty
-        *   string is passed, which is the default value, defaults to 'external'.
-        * @return string
-        */
-       static function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
-               global $wgContLang;
-
-               wfDeprecated( __METHOD__, '1.25' );
-
-               # @todo FIXME: We have a whole bunch of handling here that doesn't happen in
-               # getExternalLinkAttributes, why?
-               $title = urldecode( $title );
-               $title = $wgContLang->checkTitleEncoding( $title );
-               $title = preg_replace( '/[\\x00-\\x1f]/', ' ', $title );
-
-               return self::getLinkAttributesInternal( $title, $class );
-       }
-
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an internal link.
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param string $title The title text for the link, URL-encoded (???) but
-        *   not HTML-escaped
-        * @param string $unused Unused
-        * @param string $class The contents of the class attribute, default none
-        * @return string
-        */
-       static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               $title = urldecode( $title );
-               $title = strtr( $title, '_', ' ' );
-               return self::getLinkAttributesInternal( $title, $class );
-       }
-
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an internal
-        * link, given the Title object for the page we want to link to.
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param Title $nt
-        * @param string $unused Unused
-        * @param string $class The contents of the class attribute, default none
-        * @param string|bool $title Optional (unescaped) string to use in the title
-        *   attribute; if false, default to the name of the page we're linking to
-        * @return string
-        */
-       static function getInternalLinkAttributesObj( $nt, $unused = null, $class = '', $title = false ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               if ( $title === false ) {
-                       $title = $nt->getPrefixedText();
-               }
-               return self::getLinkAttributesInternal( $title, $class );
-       }
-
-       /**
-        * Common code for getLinkAttributesX functions
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param string $title
-        * @param string $class
-        *
-        * @return string
-        */
-       private static function getLinkAttributesInternal( $title, $class ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               $title = htmlspecialchars( $title );
-               $class = htmlspecialchars( $class );
-               $r = '';
-               if ( $class != '' ) {
-                       $r .= " class=\"$class\"";
-               }
-               if ( $title != '' ) {
-                       $r .= " title=\"$title\"";
-               }
-               return $r;
-       }
-
        /**
         * Return the CSS colour of a known link
         *
@@ -1029,13 +933,14 @@ class Linker {
                if ( $userId ) {
                        // check if the user has an edit
                        $attribs = [];
+                       $attribs['class'] = 'mw-usertoollinks-contribs';
                        if ( $redContribsWhenNoEdits ) {
                                if ( intval( $edits ) === 0 && $edits !== 0 ) {
                                        $user = User::newFromId( $userId );
                                        $edits = $user->getEditCount();
                                }
                                if ( $edits === 0 ) {
-                                       $attribs['class'] = 'new';
+                                       $attribs['class'] .= ' new';
                                }
                        }
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $userText );
@@ -1082,7 +987,10 @@ class Linker {
         */
        public static function userTalkLink( $userId, $userText ) {
                $userTalkPage = Title::makeTitle( NS_USER_TALK, $userText );
-               $userTalkLink = self::link( $userTalkPage, wfMessage( 'talkpagelinktext' )->escaped() );
+               $moreLinkAttribs['class'] = 'mw-usertoollinks-talk';
+               $userTalkLink = self::link( $userTalkPage,
+                                               wfMessage( 'talkpagelinktext' )->escaped(),
+                                               $moreLinkAttribs );
                return $userTalkLink;
        }
 
@@ -1094,7 +1002,10 @@ class Linker {
         */
        public static function blockLink( $userId, $userText ) {
                $blockPage = SpecialPage::getTitleFor( 'Block', $userText );
-               $blockLink = self::link( $blockPage, wfMessage( 'blocklink' )->escaped() );
+               $moreLinkAttribs['class'] = 'mw-usertoollinks-block';
+               $blockLink = self::link( $blockPage,
+                                        wfMessage( 'blocklink' )->escaped(),
+                                        $moreLinkAttribs );
                return $blockLink;
        }
 
@@ -1105,7 +1016,10 @@ class Linker {
         */
        public static function emailLink( $userId, $userText ) {
                $emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
-               $emailLink = self::link( $emailPage, wfMessage( 'emaillink' )->escaped() );
+               $moreLinkAttribs['class'] = 'mw-usertoollinks-mail';
+               $emailLink = self::link( $emailPage,
+                                        wfMessage( 'emaillink' )->escaped(),
+                                        $moreLinkAttribs );
                return $emailLink;
        }
 
@@ -2217,4 +2131,3 @@ class Linker {
        }
 
 }
-
index 58efdc7..c7c54fd 100644 (file)
@@ -17,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * A collection of public static functions to deal with grants.
@@ -178,9 +179,10 @@ class MWGrants {
         * @return string (proto-relative) HTML link
         */
        public static function getGrantsLink( $grant, $lang = null ) {
-               return \Linker::linkKnown(
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               return $linkRenderer->makeKnownLink(
                        \SpecialPage::getTitleFor( 'Listgrants', false, $grant ),
-                       htmlspecialchars( self::grantName( $grant, $lang ) )
+                       self::grantName( $grant, $lang )
                );
        }
 
index 61e34ee..4c5561f 100644 (file)
@@ -28,7 +28,6 @@
  *
  * These are synonyms for the names given in the language file
  * Users and translators should not change them
- *
  */
 class MWNamespace {
 
index 391e05a..09317d7 100644 (file)
@@ -169,6 +169,7 @@ class MagicWord {
                'localtimestamp',
                'directionmark',
                'contentlanguage',
+               'pagelanguage',
                'numberofadmins',
                'cascadingsources',
        ];
@@ -525,7 +526,7 @@ class MagicWord {
                $this->mFound = false;
                $text = preg_replace_callback(
                        $this->getRegex(),
-                       [ &$this, 'pregRemoveAndRecord' ],
+                       [ $this, 'pregRemoveAndRecord' ],
                        $text
                );
 
@@ -540,7 +541,7 @@ class MagicWord {
                $this->mFound = false;
                $text = preg_replace_callback(
                        $this->getRegexStart(),
-                       [ &$this, 'pregRemoveAndRecord' ],
+                       [ $this, 'pregRemoveAndRecord' ],
                        $text
                );
 
index eaa1c99..cfe4965 100644 (file)
@@ -22,6 +22,8 @@
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ChronologyProtector;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * The MediaWiki class is the helper class for the index.php entry point.
@@ -495,8 +497,15 @@ class MediaWiki {
                        $action->show();
                        return;
                }
-
-               if ( Hooks::run( 'UnknownAction', [ $request->getVal( 'action', 'view' ), $page ] ) ) {
+               // NOTE: deprecated hook. Add to $wgActions instead
+               if ( Hooks::run(
+                       'UnknownAction',
+                       [
+                               $request->getVal( 'action', 'view' ),
+                               $page
+                       ],
+                       '1.19'
+               ) ) {
                        $output->setStatusCode( 404 );
                        $output->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
                }
index 7c9363c..e44fefe 100644 (file)
@@ -9,10 +9,10 @@ use EventRelayerGroup;
 use GenderCache;
 use GlobalVarConfig;
 use Hooks;
-use LBFactory;
+use Wikimedia\Rdbms\LBFactory;
 use LinkCache;
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
-use LoadBalancer;
+use Wikimedia\Rdbms\LoadBalancer;
 use MediaHandlerFactory;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
index 7d86d07..fd67613 100644 (file)
@@ -168,6 +168,17 @@ class Message implements MessageSpecifier, Serializable {
        /** Transform {{..}} constructs, HTML-escape the result */
        const FORMAT_ESCAPED = 'escaped';
 
+       /**
+        * Mapping from Message::listParam() types to Language methods.
+        * @var array
+        */
+       protected static $listTypeMap = [
+               'comma' => 'commaList',
+               'semicolon' => 'semicolonList',
+               'pipe' => 'pipeList',
+               'text' => 'listToText',
+       ];
+
        /**
         * In which language to get this message. True, which is the default,
         * means the current user language, false content language.
@@ -477,18 +488,32 @@ class Message implements MessageSpecifier, Serializable {
         *
         * @since 1.17
         *
-        * @param mixed ... Parameters as strings, or a single argument that is
-        * an array of strings.
+        * @param mixed ... Parameters as strings or arrays from
+        *  Message::numParam() and the like, or a single array of parameters.
         *
         * @return Message $this
         */
        public function params( /*...*/ ) {
                $args = func_get_args();
-               if ( isset( $args[0] ) && is_array( $args[0] ) ) {
-                       $args = $args[0];
+
+               // If $args has only one entry and it's an array, then it's either a
+               // non-varargs call or it happens to be a call with just a single
+               // "special" parameter. Since the "special" parameters don't have any
+               // numeric keys, we'll test that to differentiate the cases.
+               if ( count( $args ) === 1 && isset( $args[0] ) && is_array( $args[0] ) ) {
+                       if ( $args[0] === [] ) {
+                               $args = [];
+                       } else {
+                               foreach ( $args[0] as $key => $value ) {
+                                       if ( is_int( $key ) ) {
+                                               $args = $args[0];
+                                               break;
+                                       }
+                               }
+                       }
                }
-               $args_values = array_values( $args );
-               $this->parameters = array_merge( $this->parameters, $args_values );
+
+               $this->parameters = array_merge( $this->parameters, array_values( $args ) );
                return $this;
        }
 
@@ -766,6 +791,7 @@ class Message implements MessageSpecifier, Serializable {
         */
        public function useDatabase( $useDatabase ) {
                $this->useDatabase = (bool)$useDatabase;
+               $this->message = null;
                return $this;
        }
 
@@ -1028,9 +1054,9 @@ class Message implements MessageSpecifier, Serializable {
        /**
         * @since 1.22
         *
-        * @param number $period
+        * @param int $period
         *
-        * @return number[] Array with a single "period" key.
+        * @return int[] Array with a single "period" key.
         */
        public static function timeperiodParam( $period ) {
                return [ 'period' => $period ];
@@ -1069,6 +1095,22 @@ class Message implements MessageSpecifier, Serializable {
                return [ 'plaintext' => $plaintext ];
        }
 
+       /**
+        * @since 1.29
+        *
+        * @param array $list
+        * @param string $type 'comma', 'semicolon', 'pipe', 'text'
+        * @return array Array with "list" and "type" keys.
+        */
+       public static function listParam( array $list, $type = 'text' ) {
+               if ( !isset( self::$listTypeMap[$type] ) ) {
+                       throw new InvalidArgumentException(
+                               "Invalid type '$type'. Known types are: " . join( ', ', array_keys( self::$listTypeMap ) )
+                       );
+               }
+               return [ 'list' => $list, 'type' => $type ];
+       }
+
        /**
         * Substitutes any parameters into the message text.
         *
@@ -1122,6 +1164,8 @@ class Message implements MessageSpecifier, Serializable {
                                return [ 'before', $this->getLanguage()->formatBitrate( $param['bitrate'] ) ];
                        } elseif ( isset( $param['plaintext'] ) ) {
                                return [ 'after', $this->formatPlaintext( $param['plaintext'], $format ) ];
+                       } elseif ( isset( $param['list'] ) ) {
+                               return $this->formatListParam( $param['list'], $param['type'], $format );
                        } else {
                                $warning = 'Invalid parameter for message "' . $this->getKey() . '": ' .
                                        htmlspecialchars( serialize( $param ) );
@@ -1132,10 +1176,27 @@ class Message implements MessageSpecifier, Serializable {
                                return [ 'before', '[INVALID]' ];
                        }
                } elseif ( $param instanceof Message ) {
+                       // Match language, flags, etc. to the current message.
+                       $msg = clone $param;
+                       if ( $msg->language !== $this->language || $msg->useDatabase !== $this->useDatabase ) {
+                               // Cache depends on these parameters
+                               $msg->message = null;
+                       }
+                       $msg->interface = $this->interface;
+                       $msg->language = $this->language;
+                       $msg->useDatabase = $this->useDatabase;
+                       $msg->title = $this->title;
+
+                       // DWIM
+                       if ( $format === 'block-parse' ) {
+                               $format = 'parse';
+                       }
+                       $msg->format = $format;
+
                        // Message objects should not be before parameters because
                        // then they'll get double escaped. If the message needs to be
                        // escaped, it'll happen right here when we call toString().
-                       return [ 'after', $param->toString( $format ) ];
+                       return [ 'after', $msg->toString( $format ) ];
                } else {
                        return [ 'before', $param ];
                }
@@ -1233,6 +1294,55 @@ class Message implements MessageSpecifier, Serializable {
 
                }
        }
+
+       /**
+        * Formats a list of parameters as a concatenated string.
+        * @since 1.29
+        * @param array $params
+        * @param string $listType
+        * @param string $format One of the FORMAT_* constants.
+        * @return array Array with the parameter type (either "before" or "after") and the value.
+        */
+       protected function formatListParam( array $params, $listType, $format ) {
+               if ( !isset( self::$listTypeMap[$listType] ) ) {
+                       $warning = 'Invalid list type for message "' . $this->getKey() . '": '
+                               . htmlspecialchars( $listType )
+                               . ' (params are ' . htmlspecialchars( serialize( $params ) ) . ')';
+                       trigger_error( $warning, E_USER_WARNING );
+                       $e = new Exception;
+                       wfDebugLog( 'Bug58676', $warning . "\n" . $e->getTraceAsString() );
+                       return [ 'before', '[INVALID]' ];
+               }
+               $func = self::$listTypeMap[$listType];
+
+               // Handle an empty list sensibly
+               if ( !$params ) {
+                       return [ 'before', $this->getLanguage()->$func( [] ) ];
+               }
+
+               // First, determine what kinds of list items we have
+               $types = [];
+               $vars = [];
+               $list = [];
+               foreach ( $params as $n => $p ) {
+                       list( $type, $value ) = $this->extractParam( $p, $format );
+                       $types[$type] = true;
+                       $list[] = $value;
+                       $vars[] = '$' . ( $n + 1 );
+               }
+
+               // Easy case: all are 'before' or 'after', so just join the
+               // values and use the same type.
+               if ( count( $types ) === 1 ) {
+                       return [ key( $types ), $this->getLanguage()->$func( $list ) ];
+               }
+
+               // Hard case: We need to process each value per its type, then
+               // return the concatenated values as 'after'. We handle this by turning
+               // the list into a RawMessage and processing that as a parameter.
+               $vars = $this->getLanguage()->$func( $vars );
+               return $this->extractParam( new RawMessage( $vars, $params ), $format );
+       }
 }
 
 /**
index c03bce7..f062d13 100644 (file)
  * @file
  */
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Assert\Assert;
 
+/**
+ * @deprecated since 1.29
+ * MimeAnalyzer should be used instead of MimeMagic
+ */
 class MimeMagic extends MimeAnalyzer {
        /**
         * Get an instance of this class
         * @return MimeMagic
-        * @deprecated since 1.28
+        * @deprecated since 1.28 get a MimeAnalyzer instance form MediaWikiServices
         */
        public static function singleton() {
-               return MediaWikiServices::getInstance()->getMIMEAnalyzer();
-       }
-
-       /**
-        * @param array $params
-        * @param Config $mainConfig
-        * @return array
-        */
-       public static function applyDefaultParameters( array $params, Config $mainConfig ) {
-               $logger = LoggerFactory::getInstance( 'Mime' );
-               $params += [
-                       'typeFile' => $mainConfig->get( 'MimeTypeFile' ),
-                       'infoFile' => $mainConfig->get( 'MimeInfoFile' ),
-                       'xmlTypes' => $mainConfig->get( 'XMLMimeTypes' ),
-                       'guessCallback' =>
-                               function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime ) use ( $logger ) {
-                                       // Also test DjVu
-                                       $deja = new DjVuImage( $file );
-                                       if ( $deja->isValid() ) {
-                                               $logger->info( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
-                                               $mime = 'image/vnd.djvu';
-
-                                               return;
-                                       }
-                                       // Some strings by reference for performance - assuming well-behaved hooks
-                                       Hooks::run(
-                                               'MimeMagicGuessFromContent',
-                                               [ $mimeAnalyzer, &$head, &$tail, $file, &$mime ]
-                                       );
-                               },
-                       'extCallback' => function ( $mimeAnalyzer, $ext, &$mime ) {
-                               // Media handling extensions can improve the MIME detected
-                               Hooks::run( 'MimeMagicImproveFromExtension', [ $mimeAnalyzer, $ext, &$mime ] );
-                       },
-                       'initCallback' => function ( $mimeAnalyzer ) {
-                               // Allow media handling extensions adding MIME-types and MIME-info
-                               Hooks::run( 'MimeMagicInit', [ $mimeAnalyzer ] );
-                       },
-                       'logger' => $logger
-               ];
-
-               if ( $params['infoFile'] === 'includes/mime.info' ) {
-                       $params['infoFile'] = __DIR__ . "/libs/mime/mime.info";
-               }
-
-               if ( $params['typeFile'] === 'includes/mime.types' ) {
-                       $params['typeFile'] = __DIR__ . "/libs/mime/mime.types";
-               }
-
-               $detectorCmd = $mainConfig->get( 'MimeDetectorCommand' );
-               if ( $detectorCmd ) {
-                       $params['detectCallback'] = function ( $file ) use ( $detectorCmd ) {
-                               return wfShellExec( "$detectorCmd " . wfEscapeShellArg( $file ) );
-                       };
-               }
-
-               return $params;
+               // XXX: We know that the MimeAnalyzer is currently an instance of MimeMagic
+               $instance = MediaWikiServices::getInstance()->getMimeAnalyzer();
+               Assert::postcondition(
+                       $instance instanceof MimeMagic,
+                       __METHOD__ . ' should return an instance of ' . MimeMagic::class
+               );
+               return $instance;
        }
 }
index a8f6f8e..ae12ba5 100644 (file)
@@ -233,9 +233,11 @@ class MovePage {
         * @param User $user
         * @param string $reason
         * @param bool $createRedirect
+        * @param string[] $changeTags Change tags to apply to the entry in the move log. Caller
+        *  should perform permission checks with ChangeTags::canAddTagsAccompanyingChange
         * @return Status
         */
-       public function move( User $user, $reason, $createRedirect ) {
+       public function move( User $user, $reason, $createRedirect, array $changeTags = [] ) {
                global $wgCategoryCollation;
 
                Hooks::run( 'TitleMove', [ $this->oldTitle, $this->newTitle, $user ] );
@@ -265,7 +267,8 @@ class MovePage {
                $protected = $this->oldTitle->isProtected();
 
                // Do the actual move; if this fails, it will throw an MWException(!)
-               $nullRevision = $this->moveToInternal( $user, $this->newTitle, $reason, $createRedirect );
+               $nullRevision = $this->moveToInternal( $user, $this->newTitle, $reason, $createRedirect,
+                       $changeTags );
 
                // Refresh the sortkey for this row.  Be careful to avoid resetting
                // cl_timestamp, which may disturb time-based lists on some sites.
@@ -356,6 +359,7 @@ class MovePage {
                                '4::oldtitle' => $this->oldTitle->getPrefixedText(),
                        ] );
                        $logEntry->setRelations( [ 'pr_id' => $logRelationsValues ] );
+                       $logEntry->setTags( $changeTags );
                        $logId = $logEntry->insert();
                        $logEntry->publish( $logId );
                }
@@ -424,18 +428,21 @@ class MovePage {
         * Move page to a title which is either a redirect to the
         * source page or nonexistent
         *
-        * @fixme This was basically directly moved from Title, it should be split into smaller functions
+        * @todo This was basically directly moved from Title, it should be split into
+        *   smaller functions
         * @param User $user the User doing the move
         * @param Title $nt The page to move to, which should be a redirect or non-existent
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to leave a redirect at the old title. Does not check
         *   if the user has the suppressredirect right
+        * @param string[] $changeTags Change tags to apply to the entry in the move log
         * @return Revision the revision created by the move
         * @throws MWException
         */
-       private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true ) {
-               global $wgContLang;
+       private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true,
+               array $changeTags = [] ) {
 
+               global $wgContLang;
                if ( $nt->exists() ) {
                        $moveOverRedirect = true;
                        $logType = 'move_redir';
@@ -457,7 +464,9 @@ class MovePage {
                                $nt->getArticleID(),
                                /* $commit */ false,
                                $errs,
-                               $user
+                               $user,
+                               $changeTags,
+                               'delete_redir'
                        );
 
                        if ( !$status->isGood() ) {
@@ -527,7 +536,8 @@ class MovePage {
                        throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
                }
 
-               $nullRevision->insertOn( $dbw );
+               $nullRevId = $nullRevision->insertOn( $dbw );
+               $logEntry->setAssociatedRevId( $nullRevId );
 
                # Change the name of the target page:
                $dbw->update( 'page',
@@ -582,18 +592,22 @@ class MovePage {
                                        'user' => $user->getId(),
                                        'comment' => $comment,
                                        'content' => $redirectContent ] );
-                               $redirectRevision->insertOn( $dbw );
+                               $redirectRevId = $redirectRevision->insertOn( $dbw );
                                $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
 
                                Hooks::run( 'NewRevisionFromEditComplete',
                                        [ $redirectArticle, $redirectRevision, false, $user ] );
 
                                $redirectArticle->doEditUpdates( $redirectRevision, $user, [ 'created' => true ] );
+
+                               ChangeTags::addTags( $changeTags, null, $redirectRevId, null );
                        }
                }
 
                # Log the move
                $logid = $logEntry->insert();
+
+               $logEntry->setTags( $changeTags );
                $logEntry->publish( $logid );
 
                return $nullRevision;
index 50629ba..eb2f7e7 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Session\SessionManager;
 use WrappedString\WrappedString;
 use WrappedString\WrappedStringList;
@@ -107,7 +108,10 @@ class OutputPage extends ContextSource {
        protected $mCategoryLinks = [];
 
        /** @var array */
-       protected $mCategories = [];
+       protected $mCategories = [
+               'hidden' => [],
+               'normal' => [],
+       ];
 
        /** @var array */
        protected $mIndicators = [];
@@ -295,6 +299,9 @@ class OutputPage extends ContextSource {
         */
        private $copyrightUrl;
 
+       /** @var array Profiling data */
+       private $limitReportJSData = [];
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -527,14 +534,32 @@ class OutputPage extends ContextSource {
                        if ( $module instanceof ResourceLoaderModule
                                && $module->getOrigin() <= $this->getAllowedModules( $type )
                                && ( is_null( $position ) || $module->getPosition() == $position )
-                               && ( !$this->mTarget || in_array( $this->mTarget, $module->getTargets() ) )
                        ) {
+                               if ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) ) {
+                                       $this->warnModuleTargetFilter( $module->getName() );
+                                       continue;
+                               }
                                $filteredModules[] = $val;
                        }
                }
                return $filteredModules;
        }
 
+       private function warnModuleTargetFilter( $moduleName ) {
+               static $warnings = [];
+               if ( isset( $warnings[$this->mTarget][$moduleName] ) ) {
+                       return;
+               }
+               $warnings[$this->mTarget][$moduleName] = true;
+               $this->getResourceLoader()->getLogger()->debug(
+                       'Module "{module}" not loadable on target "{target}".',
+                       [
+                               'module' => $moduleName,
+                               'target' => $this->mTarget,
+                       ]
+               );
+       }
+
        /**
         * Get the list of modules to include on this page
         *
@@ -1007,8 +1032,9 @@ class OutputPage extends ContextSource {
                if ( $title->isRedirect() ) {
                        $query['redirect'] = 'no';
                }
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                return wfMessage( 'backlinksubtitle' )
-                       ->rawParams( Linker::link( $title, null, [], $query ) );
+                       ->rawParams( $linkRenderer->makeLink( $title, null, [], $query ) );
        }
 
        /**
@@ -1249,31 +1275,7 @@ class OutputPage extends ContextSource {
                        return;
                }
 
-               # Add the links to a LinkBatch
-               $arr = [ NS_CATEGORY => $categories ];
-               $lb = new LinkBatch;
-               $lb->setArray( $arr );
-
-               # Fetch existence plus the hiddencat property
-               $dbr = wfGetDB( DB_REPLICA );
-               $fields = array_merge(
-                       LinkCache::getSelectFields(),
-                       [ 'page_namespace', 'page_title', 'pp_value' ]
-               );
-
-               $res = $dbr->select( [ 'page', 'page_props' ],
-                       $fields,
-                       $lb->constructSet( 'page', $dbr ),
-                       __METHOD__,
-                       [],
-                       [ 'page_props' => [ 'LEFT JOIN', [
-                               'pp_propname' => 'hiddencat',
-                               'pp_page = page_id'
-                       ] ] ]
-               );
-
-               # Add the results to the link cache
-               $lb->addResultToCache( LinkCache::singleton(), $res );
+               $res = $this->addCategoryLinksToLBAndGetResult( $categories );
 
                # Set all the values to 'normal'.
                $categories = array_fill_keys( array_keys( $categories ), 'normal' );
@@ -1285,11 +1287,14 @@ class OutputPage extends ContextSource {
                        }
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $outputPage = $this;
                # Add the remaining categories to the skin
                if ( Hooks::run(
                        'OutputPageMakeCategoryLinks',
-                       [ &$this, $categories, &$this->mCategoryLinks ] )
+                       [ &$outputPage, $categories, &$this->mCategoryLinks ] )
                ) {
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                        foreach ( $categories as $category => $type ) {
                                // array keys will cast numeric category names to ints, so cast back to string
                                $category = (string)$category;
@@ -1303,12 +1308,46 @@ class OutputPage extends ContextSource {
                                        continue;
                                }
                                $text = $wgContLang->convertHtml( $title->getText() );
-                               $this->mCategories[] = $title->getText();
-                               $this->mCategoryLinks[$type][] = Linker::link( $title, $text );
+                               $this->mCategories[$type][] = $title->getText();
+                               $this->mCategoryLinks[$type][] = $linkRenderer->makeLink( $title, new HtmlArmor( $text ) );
                        }
                }
        }
 
+       /**
+        * @param array $categories
+        * @return bool|ResultWrapper
+        */
+       protected function addCategoryLinksToLBAndGetResult( array $categories ) {
+               # Add the links to a LinkBatch
+               $arr = [ NS_CATEGORY => $categories ];
+               $lb = new LinkBatch;
+               $lb->setArray( $arr );
+
+               # Fetch existence plus the hiddencat property
+               $dbr = wfGetDB( DB_REPLICA );
+               $fields = array_merge(
+                       LinkCache::getSelectFields(),
+                       [ 'page_namespace', 'page_title', 'pp_value' ]
+               );
+
+               $res = $dbr->select( [ 'page', 'page_props' ],
+                       $fields,
+                       $lb->constructSet( 'page', $dbr ),
+                       __METHOD__,
+                       [],
+                       [ 'page_props' => [ 'LEFT JOIN', [
+                               'pp_propname' => 'hiddencat',
+                               'pp_page = page_id'
+                       ] ] ]
+               );
+
+               # Add the results to the link cache
+               $lb->addResultToCache( LinkCache::singleton(), $res );
+
+               return $res;
+       }
+
        /**
         * Reset the category links (but not the category list) and add $categories
         *
@@ -1332,12 +1371,26 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get the list of category names this page belongs to
+        * Get the list of category names this page belongs to.
         *
+        * @param string $type The type of categories which should be returned. Possible values:
+        *  * all: all categories of all types
+        *  * hidden: only the hidden categories
+        *  * normal: all categories, except hidden categories
         * @return array Array of strings
         */
-       public function getCategories() {
-               return $this->mCategories;
+       public function getCategories( $type = 'all' ) {
+               if ( $type === 'all' ) {
+                       $allCategories = [];
+                       foreach ( $this->mCategories as $categories ) {
+                               $allCategories = array_merge( $allCategories, $categories );
+                       }
+                       return $allCategories;
+               }
+               if ( !isset( $this->mCategories[$type] ) ) {
+                       throw new InvalidArgumentException( 'Invalid category type given: ' . $type );
+               }
+               return $this->mCategories[$type];
        }
 
        /**
@@ -1772,16 +1825,23 @@ class OutputPage extends ContextSource {
                        }
                }
 
-               // enable OOUI if requested via ParserOutput
+               // Enable OOUI if requested via ParserOutput
                if ( $parserOutput->getEnableOOUI() ) {
                        $this->enableOOUI();
                }
 
+               // Include parser limit report
+               if ( !$this->limitReportJSData ) {
+                       $this->limitReportJSData = $parserOutput->getLimitReportJSData();
+               }
+
                // Link flags are ignored for now, but may in the future be
                // used to mark individual language links.
                $linkFlags = [];
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $outputPage = $this;
                Hooks::run( 'LanguageLinks', [ $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ] );
-               Hooks::run( 'OutputPageParserOutput', [ &$this, $parserOutput ] );
+               Hooks::run( 'OutputPageParserOutput', [ &$outputPage, $parserOutput ] );
        }
 
        /**
@@ -1809,7 +1869,9 @@ class OutputPage extends ContextSource {
         */
        public function addParserOutputText( $parserOutput ) {
                $text = $parserOutput->getText();
-               Hooks::run( 'OutputPageBeforeHTML', [ &$this, &$text ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $outputPage = $this;
+               Hooks::run( 'OutputPageBeforeHTML', [ &$outputPage, &$text ] );
                $this->addHTML( $text );
        }
 
@@ -2146,7 +2208,7 @@ class OutputPage extends ContextSource {
         * if there isn't one. This is used by Skin to determine whether to enable
         * JavaScript frame-breaking, for clients that don't support X-Frame-Options.
         *
-        * @return string
+        * @return string|false
         */
        public function getFrameOptions() {
                $config = $this->getConfig();
@@ -2273,7 +2335,7 @@ class OutputPage extends ContextSource {
                                $response->header( "Content-Type: text/html; charset=utf-8" );
                                if ( $config->get( 'DebugRedirects' ) ) {
                                        $url = htmlspecialchars( $redirect );
-                                       print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
+                                       print "<!DOCTYPE html>\n<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
                                        print "<p>Location: <a href=\"$url\">$url</a></p>\n";
                                        print "</body>\n</html>\n";
                                } else {
@@ -2328,9 +2390,11 @@ class OutputPage extends ContextSource {
                        }
                        MWDebug::addModules( $this );
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $outputPage = $this;
                        // Hook that allows last minute changes to the output page, e.g.
                        // adding of CSS or Javascript by extensions.
-                       Hooks::run( 'BeforePageDisplay', [ &$this, &$sk ] );
+                       Hooks::run( 'BeforePageDisplay', [ &$outputPage, &$sk ] );
 
                        try {
                                $sk->outputPage();
@@ -2469,9 +2533,10 @@ class OutputPage extends ContextSource {
                                        $query['returntoquery'] = wfArrayToCgi( $returntoquery );
                                }
                        }
-                       $loginLink = Linker::linkKnown(
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $loginLink = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Userlogin' ),
-                               $this->msg( 'loginreqlink' )->escaped(),
+                               $this->msg( 'loginreqlink' )->text(),
                                [],
                                $query
                        );
@@ -2626,8 +2691,10 @@ class OutputPage extends ContextSource {
         * @param array $options Options array to pass to Linker
         */
        public function addReturnTo( $title, array $query = [], $text = null, $options = [] ) {
+               $linkRenderer = MediaWikiServices::getInstance()
+                       ->getLinkRendererFactory()->createFromLegacyOptions( $options );
                $link = $this->msg( 'returnto' )->rawParams(
-                       Linker::link( $title, $text, [], $query, $options ) )->escaped();
+                       $linkRenderer->makeLink( $title, $text, [], $query ) )->escaped();
                $this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
        }
 
@@ -2708,7 +2775,6 @@ class OutputPage extends ContextSource {
                                'site.styles',
                                'noscript',
                                'user.styles',
-                               'user.cssprefs',
                        ] );
                        $this->getSkin()->setupSkinUserCss( $this );
 
@@ -2821,6 +2887,14 @@ class OutputPage extends ContextSource {
                $bodyClasses[] = $userdir;
                $bodyClasses[] = "sitedir-$sitedir";
 
+               $underline = $this->getUser()->getOption( 'underline' );
+               if ( $underline < 2 ) {
+                       // The following classes can be used here:
+                       // * mw-underline-always
+                       // * mw-underline-never
+                       $bodyClasses[] = 'mw-underline-' . ( $underline ? 'always' : 'never' );
+               }
+
                if ( $this->getLanguage()->capitalizeAllNouns() ) {
                        # A <body> class is probably not the best way to do this . . .
                        $bodyClasses[] = 'capitalize-all-nouns';
@@ -2958,6 +3032,14 @@ class OutputPage extends ContextSource {
                        }
                }
 
+               if ( $this->limitReportJSData ) {
+                       $chunks[] = ResourceLoader::makeInlineScript(
+                               ResourceLoader::makeConfigSetScript(
+                                       [ 'wgPageParseReport' => $this->limitReportJSData ]
+                               )
+                       );
+               }
+
                return self::combineWrappedStrings( $chunks );
        }
 
@@ -3195,9 +3277,11 @@ class OutputPage extends ContextSource {
                }
 
                foreach ( $this->mMetatags as $tag ) {
-                       if ( 0 == strcasecmp( 'http:', substr( $tag[0], 0, 5 ) ) ) {
+                       if ( strncasecmp( $tag[0], 'http:', 5 ) === 0 ) {
                                $a = 'http-equiv';
                                $tag[0] = substr( $tag[0], 5 );
+                       } elseif ( strncasecmp( $tag[0], 'og:', 3 ) === 0 ) {
+                               $a = 'property';
                        } else {
                                $a = 'name';
                        }
@@ -3499,7 +3583,6 @@ class OutputPage extends ContextSource {
        protected function buildExemptModules() {
                global $wgContLang;
 
-               $resourceLoader = $this->getResourceLoader();
                $chunks = [];
                // Things that go after the ResourceLoaderDynamicStyles marker
                $append = [];
@@ -3632,6 +3715,8 @@ class OutputPage extends ContextSource {
         */
        public static function transformResourcePath( Config $config, $path ) {
                global $IP;
+
+               $localDir = $IP;
                $remotePathPrefix = $config->get( 'ResourceBasePath' );
                if ( $remotePathPrefix === '' ) {
                        // The configured base path is required to be empty string for
@@ -3640,12 +3725,23 @@ class OutputPage extends ContextSource {
                } else {
                        $remotePath = $remotePathPrefix;
                }
-               if ( strpos( $path, $remotePath ) !== 0 ) {
-                       // Path is outside wgResourceBasePath, ignore.
+               if ( strpos( $path, $remotePath ) !== 0 || substr( $path, 0, 2 ) === '//' ) {
+                       // - Path is outside wgResourceBasePath, ignore.
+                       // - Path is protocol-relative. Fixes T155310. Not supported by RelPath lib.
                        return $path;
                }
+               // For files in resources, extensions/ or skins/, ResourceBasePath is preferred here.
+               // For other misc files in $IP, we'll fallback to that as well. There is, however, a fourth
+               // supported dir/path pair in the configuration (wgUploadDirectory, wgUploadPath)
+               // which is not expected to be in wgResourceBasePath on CDNs. (T155146)
+               $uploadPath = $config->get( 'UploadPath' );
+               if ( strpos( $path, $uploadPath ) === 0 ) {
+                       $localDir = $config->get( 'UploadDirectory' );
+                       $remotePathPrefix = $remotePath = $uploadPath;
+               }
+
                $path = RelPath\getRelativePath( $path, $remotePath );
-               return self::transformFilePath( $remotePathPrefix, $IP, $path );
+               return self::transformFilePath( $remotePathPrefix, $localDir, $path );
        }
 
        /**
index d09e1fb..382d089 100644 (file)
@@ -25,7 +25,6 @@ use Wikimedia\ScopedCallback;
  * Gives access to properties of a page.
  *
  * @since 1.27
- *
  */
 class PageProps {
 
index 049b32f..cc6fc4a 100644 (file)
@@ -364,7 +364,7 @@ class PathRouterPatternReplacer {
         * difference between a $1 that was not replaced and a $1 that was part of
         * the content a $1 was replaced with.
         * @param string $value
-        * @return string
+        * @return string|false
         */
        public function replace( $value ) {
                $this->error = false;
index d86b19a..6d15c1e 100644 (file)
@@ -21,6 +21,7 @@
  */
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\PasswordAuthenticationRequest;
+use MediaWiki\MediaWikiServices;
 
 /**
  * We're now using the HTMLForm object with some customisation to generate the
@@ -54,8 +55,6 @@ class Preferences {
        /** @var array */
        protected static $saveFilters = [
                'timecorrection' => [ 'Preferences', 'filterTimezoneInput' ],
-               'cols' => [ 'Preferences', 'filterIntval' ],
-               'rows' => [ 'Preferences', 'filterIntval' ],
                'rclimit' => [ 'Preferences', 'filterIntval' ],
                'wllimit' => [ 'Preferences', 'filterIntval' ],
                'searchlimit' => [ 'Preferences', 'filterIntval' ],
@@ -223,24 +222,48 @@ class Preferences {
                        'section' => 'personal/info',
                ];
 
+               $lang = $context->getLanguage();
+
                # Get groups to which the user belongs
                $userEffectiveGroups = $user->getEffectiveGroups();
-               $userGroups = $userMembers = [];
+               $userGroupMemberships = $user->getGroupMemberships();
+               $userGroups = $userMembers = $userTempGroups = $userTempMembers = [];
                foreach ( $userEffectiveGroups as $ueg ) {
                        if ( $ueg == '*' ) {
                                // Skip the default * group, seems useless here
                                continue;
                        }
-                       $groupName = User::getGroupName( $ueg );
-                       $userGroups[] = User::makeGroupLinkHTML( $ueg, $groupName );
 
-                       $memberName = User::getGroupMember( $ueg, $userName );
-                       $userMembers[] = User::makeGroupLinkHTML( $ueg, $memberName );
-               }
-               asort( $userGroups );
-               asort( $userMembers );
+                       if ( isset( $userGroupMemberships[$ueg] ) ) {
+                               $groupStringOrObject = $userGroupMemberships[$ueg];
+                       } else {
+                               $groupStringOrObject = $ueg;
+                       }
 
-               $lang = $context->getLanguage();
+                       $userG = UserGroupMembership::getLink( $groupStringOrObject, $context, 'html' );
+                       $userM = UserGroupMembership::getLink( $groupStringOrObject, $context, 'html',
+                               $userName );
+
+                       // Store expiring groups separately, so we can place them before non-expiring
+                       // groups in the list. This is to avoid the ambiguity of something like
+                       // "administrator, bureaucrat (until X date)" -- users might wonder whether the
+                       // expiry date applies to both groups, or just the last one
+                       if ( $groupStringOrObject instanceof UserGroupMembership &&
+                               $groupStringOrObject->getExpiry()
+                       ) {
+                               $userTempGroups[] = $userG;
+                               $userTempMembers[] = $userM;
+                       } else {
+                               $userGroups[] = $userG;
+                               $userMembers[] = $userM;
+                       }
+               }
+               sort( $userGroups );
+               sort( $userMembers );
+               sort( $userTempGroups );
+               sort( $userTempMembers );
+               $userGroups = array_merge( $userTempGroups, $userGroups );
+               $userMembers = array_merge( $userTempMembers, $userMembers );
 
                $defaultPreferences['usergroups'] = [
                        'type' => 'info',
@@ -253,7 +276,9 @@ class Preferences {
                        'section' => 'personal/info',
                ];
 
-               $editCount = Linker::link( SpecialPage::getTitleFor( "Contributions", $userName ),
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
+               $editCount = $linkRenderer->makeLink( SpecialPage::getTitleFor( "Contributions", $userName ),
                        $lang->formatNum( $user->getEditCount() ) );
 
                $defaultPreferences['editcount'] = [
@@ -297,8 +322,8 @@ class Preferences {
                if ( $canEditPrivateInfo && $authManager->allowsAuthenticationDataChange(
                        new PasswordAuthenticationRequest(), false )->isGood()
                ) {
-                       $link = Linker::link( SpecialPage::getTitleFor( 'ChangePassword' ),
-                               $context->msg( 'prefs-resetpass' )->escaped(), [],
+                       $link = $linkRenderer->makeLink( SpecialPage::getTitleFor( 'ChangePassword' ),
+                               $context->msg( 'prefs-resetpass' )->text(), [],
                                [ 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ] );
 
                        $defaultPreferences['password'] = [
@@ -448,9 +473,9 @@ class Preferences {
 
                                $emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
                                if ( $canEditPrivateInfo && $authManager->allowsPropertyChange( 'emailaddress' ) ) {
-                                       $link = Linker::link(
+                                       $link = $linkRenderer->makeLink(
                                                SpecialPage::getTitleFor( 'ChangeEmail' ),
-                                               $context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
+                                               $context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->text(),
                                                [],
                                                [ 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ] );
 
@@ -492,9 +517,9 @@ class Preferences {
                                        } else {
                                                $disableEmailPrefs = true;
                                                $emailauthenticated = $context->msg( 'emailnotauthenticated' )->parse() . '<br />' .
-                                                       Linker::linkKnown(
+                                                       $linkRenderer->makeKnownLink(
                                                                SpecialPage::getTitleFor( 'Confirmemail' ),
-                                                               $context->msg( 'emailconfirmlink' )->escaped()
+                                                               $context->msg( 'emailconfirmlink' )->text()
                                                        ) . '<br />';
                                                $emailauthenticationclass = "mw-email-not-authenticated";
                                        }
@@ -601,14 +626,15 @@ class Preferences {
                        $linkTools = [];
                        $userName = $user->getName();
 
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                        if ( $allowUserCss ) {
                                $cssPage = Title::makeTitleSafe( NS_USER, $userName . '/common.css' );
-                               $linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
+                               $linkTools[] = $linkRenderer->makeLink( $cssPage, $context->msg( 'prefs-custom-css' )->text() );
                        }
 
                        if ( $allowUserJs ) {
                                $jsPage = Title::makeTitleSafe( NS_USER, $userName . '/common.js' );
-                               $linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
+                               $linkTools[] = $linkRenderer->makeLink( $jsPage, $context->msg( 'prefs-custom-js' )->text() );
                        }
 
                        $defaultPreferences['commoncssjs'] = [
@@ -692,19 +718,23 @@ class Preferences {
                $tzOptions = self::getTimezoneOptions( $context );
 
                $tzSetting = $tzOffset;
-               if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
-                       $minDiff = $tz[1];
-                       $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
-               } elseif ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
+               if ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
                        !in_array( $tzOffset, HTMLFormField::flattenOptions( $tzOptions ) )
                ) {
-                       # Timezone offset can vary with DST
-                       $userTZ = timezone_open( $tz[2] );
-                       if ( $userTZ !== false ) {
-                               $minDiff = floor( timezone_offset_get( $userTZ, date_create( 'now' ) ) / 60 );
+                       // Timezone offset can vary with DST
+                       try {
+                               $userTZ = new DateTimeZone( $tz[2] );
+                               $minDiff = floor( $userTZ->getOffset( new DateTime( 'now' ) ) / 60 );
                                $tzSetting = "ZoneInfo|$minDiff|{$tz[2]}";
+                       } catch ( Exception $e ) {
+                               // User has an invalid time zone set. Fall back to just using the offset
+                               $tz[0] = 'Offset';
                        }
                }
+               if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
+                       $minDiff = $tz[1];
+                       $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
+               }
 
                $defaultPreferences['timecorrection'] = [
                        'class' => 'HTMLSelectOrOtherField',
@@ -809,20 +839,7 @@ class Preferences {
                                ]
                        ];
                }
-               $defaultPreferences['cols'] = [
-                       'type' => 'int',
-                       'label-message' => 'columns',
-                       'section' => 'editing/editor',
-                       'min' => 4,
-                       'max' => 1000,
-               ];
-               $defaultPreferences['rows'] = [
-                       'type' => 'int',
-                       'label-message' => 'rows',
-                       'section' => 'editing/editor',
-                       'min' => 4,
-                       'max' => 1000,
-               ];
+
                if ( $user->isAllowed( 'minoredit' ) ) {
                        $defaultPreferences['minordefault'] = [
                                'type' => 'toggle',
@@ -830,6 +847,7 @@ class Preferences {
                                'label-message' => 'tog-minordefault',
                        ];
                }
+
                $defaultPreferences['forceeditsummary'] = [
                        'type' => 'toggle',
                        'section' => 'editing/editor',
@@ -948,11 +966,12 @@ class Preferences {
                                'raw' => [ 'EditWatchlist', 'raw' ],
                                'clear' => [ 'EditWatchlist', 'clear' ],
                        ];
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                        foreach ( $editWatchlistModes as $editWatchlistMode => $mode ) {
                                // Messages: prefs-editwatchlist-edit, prefs-editwatchlist-raw, prefs-editwatchlist-clear
-                               $editWatchlistLinks[] = Linker::linkKnown(
+                               $editWatchlistLinks[] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( $mode[0], $mode[1] ),
-                                       $context->msg( "prefs-editwatchlist-{$editWatchlistMode}" )->parse()
+                                       new HtmlArmor( $context->msg( "prefs-editwatchlist-{$editWatchlistMode}" )->parse() )
                                );
                        }
 
@@ -1110,6 +1129,8 @@ class Preferences {
                $mptitle = Title::newMainPage();
                $previewtext = $context->msg( 'skin-preview' )->escaped();
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                # Only show skins that aren't disabled in $wgSkipSkins
                $validSkinNames = Skin::getAllowedSkins();
 
@@ -1145,12 +1166,12 @@ class Preferences {
                        # Create links to user CSS/JS pages
                        if ( $allowUserCss ) {
                                $cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.css' );
-                               $linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
+                               $linkTools[] = $linkRenderer->makeLink( $cssPage, $context->msg( 'prefs-custom-css' )->text() );
                        }
 
                        if ( $allowUserJs ) {
                                $jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.js' );
-                               $linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
+                               $linkTools[] = $linkRenderer->makeLink( $jsPage, $context->msg( 'prefs-custom-js' )->text() );
                        }
 
                        $display = $sn . ' ' . $context->msg( 'parentheses' )
@@ -1212,7 +1233,8 @@ class Preferences {
                $pixels = $context->msg( 'unit-pixel' )->text();
 
                foreach ( $context->getConfig()->get( 'ImageLimits' ) as $index => $limits ) {
-                       $display = "{$limits[0]}×{$limits[1]}" . $pixels;
+                       // Note: A left-to-right marker (\u200e) is inserted, see T144386
+                       $display = "{$limits[0]}" . json_decode( '"\u200e"' ) . "×{$limits[1]}" . $pixels;
                        $ret[$display] = $index;
                }
 
@@ -1384,6 +1406,24 @@ class Preferences {
                $data = explode( '|', $tz, 3 );
                switch ( $data[0] ) {
                        case 'ZoneInfo':
+                               $valid = false;
+
+                               if ( count( $data ) === 3 ) {
+                                       // Make sure this timezone exists
+                                       try {
+                                               new DateTimeZone( $data[2] );
+                                               // If the constructor didn't throw, we know it's valid
+                                               $valid = true;
+                                       } catch ( Exception $e ) {
+                                               // Not a valid timezone
+                                       }
+                               }
+
+                               if ( !$valid ) {
+                                       // If the supplied timezone doesn't exist, fall back to the encoded offset
+                                       return 'Offset|' . intval( $tz[1] );
+                               }
+                               return $tz;
                        case 'System':
                                return $tz;
                        default:
@@ -1402,7 +1442,7 @@ class Preferences {
                                # Max is +14:00 and min is -12:00, see:
                                # https://en.wikipedia.org/wiki/Timezone
                                $minDiff = min( $minDiff, 840 );  # 14:00
-                               $minDiff = max( $minDiff, - 720 ); # -12:00
+                               $minDiff = max( $minDiff, -720 ); # -12:00
                                return 'Offset|' . $minDiff;
                }
        }
@@ -1624,7 +1664,8 @@ class PreferencesForm extends HTMLForm {
                if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
                        $t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
 
-                       $html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped(),
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $html .= "\n" . $linkRenderer->makeLink( $t, $this->msg( 'restoreprefs' )->text(),
                                Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ) );
 
                        $html = Xml::tags( 'div', [ 'class' => 'mw-prefs-buttons' ], $html );
index f6c4147..48b1d72 100644 (file)
@@ -23,7 +23,7 @@
 /**
  * Handles searching prefixes of titles and finding any page
  * names that match. Used largely by the OpenSearch implementation.
- * @deprecated Since 1.27, Use SearchEngine::prefixSearchSubpages or SearchEngine::completionSearch
+ * @deprecated Since 1.27, Use SearchEngine::defaultPrefixSearch or SearchEngine::completionSearch
  *
  * @ingroup Search
  */
@@ -239,7 +239,7 @@ abstract class PrefixSearch {
                // canonical and alias title forms...
                $keys = [];
                foreach ( SpecialPageFactory::getNames() as $page ) {
-                       $keys[$wgContLang->caseFold( $page )] = $page;
+                       $keys[$wgContLang->caseFold( $page )] = [ 'page' => $page, 'rank' => 0 ];
                }
 
                foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
@@ -247,33 +247,35 @@ abstract class PrefixSearch {
                                continue;
                        }
 
-                       foreach ( $aliases as $alias ) {
-                               $keys[$wgContLang->caseFold( $alias )] = $alias;
+                       foreach ( $aliases as $key => $alias ) {
+                               $keys[$wgContLang->caseFold( $alias )] = [ 'page' => $alias, 'rank' => $key ];
                        }
                }
                ksort( $keys );
 
-               $srchres = [];
-               $skipped = 0;
+               $matches = [];
                foreach ( $keys as $pageKey => $page ) {
                        if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
                                // bug 27671: 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'
-                               if ( $offset > 0 && $skipped < $offset ) {
-                                       $skipped++;
-                                       continue;
+                               $matches[$page['rank']][] = Title::makeTitleSafe( NS_SPECIAL, $page['page'] );
+
+                               if ( isset( $matches[0] ) && count( $matches[0] ) >= $limit + $offset ) {
+                                       // We have enough items in primary rank, no use to continue
+                                       break;
                                }
-                               $srchres[] = Title::makeTitleSafe( NS_SPECIAL, $page );
                        }
 
-                       if ( count( $srchres ) >= $limit ) {
-                               break;
-                       }
                }
 
-               return $srchres;
+               // Ensure keys are in order
+               ksort( $matches );
+               // Flatten the array
+               $matches = array_reduce( $matches, 'array_merge', [] );
+
+               return array_slice( $matches, $offset, $limit );
        }
 
        /**
@@ -367,7 +369,7 @@ abstract class PrefixSearch {
 
 /**
  * Performs prefix search, returning Title objects
- * @deprecated Since 1.27, Use SearchEngine::prefixSearchSubpages or SearchEngine::completionSearch
+ * @deprecated Since 1.27, Use SearchEngine::defaultPrefixSearch or SearchEngine::completionSearch
  * @ingroup Search
  */
 class TitlePrefixSearch extends PrefixSearch {
index 451635e..a68c36f 100644 (file)
@@ -22,6 +22,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Handles the page protection UI and backend
@@ -148,7 +149,7 @@ class ProtectionForm {
         *
         * @param string $action
         *
-        * @return string 14-char timestamp or "infinity", or false if the input was invalid
+        * @return string|false 14-char timestamp or "infinity", or false if the input was invalid
         */
        function getExpiry( $action ) {
                if ( $this->mExpirySelection[$action] == 'existing' ) {
@@ -543,9 +544,10 @@ class ProtectionForm {
                $out .= Xml::closeElement( 'fieldset' );
 
                if ( $user->isAllowed( 'editinterface' ) ) {
-                       $link = Linker::linkKnown(
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $link = $linkRenderer->makeKnownLink(
                                $context->msg( 'protect-dropdown' )->inContentLanguage()->getTitle(),
-                               $context->msg( 'protect-edit-reasonlist' )->escaped(),
+                               $context->msg( 'protect-edit-reasonlist' )->text(),
                                [],
                                [ 'action' => 'edit' ]
                        );
index b812191..d9e42ff 100644 (file)
@@ -874,7 +874,7 @@ class Revision implements IDBAccessObject {
        /**
         * Fetch revision's user id without regard for the current user's permissions
         *
-        * @return string
+        * @return int
         * @deprecated since 1.25, use getUser( Revision::RAW )
         */
        public function getRawUser() {
@@ -1035,28 +1035,6 @@ class Revision implements IDBAccessObject {
                return (int)$this->mDeleted;
        }
 
-       /**
-        * Fetch revision text if it's available to the specified audience.
-        * If the specified audience does not have the ability to view this
-        * revision, an empty string will be returned.
-        *
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        *
-        * @deprecated since 1.21, use getContent() instead
-        * @return string
-        */
-       public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               $content = $this->getContent( $audience, $user );
-               return ContentHandler::getContentText( $content ); # returns the raw content text, if applicable
-       }
-
        /**
         * Fetch revision content if it's available to the specified audience.
         * If the specified audience does not have the ability to view this
@@ -1131,7 +1109,7 @@ class Revision implements IDBAccessObject {
         *
         * @return string The content model id associated with this revision,
         *     see the CONTENT_MODEL_XXX constants.
-        **/
+        */
        public function getContentModel() {
                if ( !$this->mContentModel ) {
                        $title = $this->getTitle();
@@ -1155,7 +1133,7 @@ class Revision implements IDBAccessObject {
         *
         * @return string The content format id associated with this revision,
         *     see the CONTENT_FORMAT_XXX constants.
-        **/
+        */
        public function getContentFormat() {
                if ( !$this->mContentFormat ) {
                        $handler = $this->getContentHandler();
@@ -1269,7 +1247,7 @@ class Revision implements IDBAccessObject {
         *   (same as the the wiki $row was loaded from) or false to indicate the local
         *   wiki (this is the default). Otherwise, it must be a symbolic wiki database
         *   identifier as understood by the LoadBalancer class.
-        * @return string Text the text requested or false on failure
+        * @return string|false Text the text requested or false on failure
         */
        public static function getRevisionText( $row, $prefix = 'old_', $wiki = false ) {
 
@@ -1505,7 +1483,9 @@ class Revision implements IDBAccessObject {
                        );
                }
 
-               Hooks::run( 'RevisionInsertComplete', [ &$this, $data, $flags ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $revision = $this;
+               Hooks::run( 'RevisionInsertComplete', [ &$revision, $data, $flags ] );
 
                return $this->mId;
        }
index fb444bd..53cf699 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * List for revision table items for a single page
  */
@@ -268,6 +270,14 @@ abstract class RevisionItemBase {
         * This is used to show the list in HTML form, by the special page.
         */
        abstract public function getHTML();
+
+       /**
+        * Returns an instance of LinkRenderer
+        * @return \MediaWiki\Linker\LinkRenderer
+        */
+       protected function getLinkRenderer() {
+               return MediaWikiServices::getInstance()->getLinkRenderer();
+       }
 }
 
 class RevisionList extends RevisionListBase {
@@ -353,13 +363,14 @@ class RevisionItem extends RevisionItemBase {
         * @return string
         */
        protected function getRevisionLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() );
 
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return $date;
+                       return htmlspecialchars( $date );
                }
-               return Linker::linkKnown(
+               $linkRenderer = $this->getLinkRenderer();
+               return $linkRenderer->makeKnownLink(
                        $this->list->title,
                        $date,
                        [],
@@ -381,9 +392,10 @@ class RevisionItem extends RevisionItemBase {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->context->msg( 'diff' )->escaped();
                } else {
-                       return Linker::linkKnown(
+                       $linkRenderer = $this->getLinkRenderer();
+                       return $linkRenderer->makeKnownLink(
                                        $this->list->title,
-                                       $this->list->msg( 'diff' )->escaped(),
+                                       $this->list->msg( 'diff' )->text(),
                                        [],
                                        [
                                                'diff' => $this->revision->getId(),
index 44e4e3e..42b166d 100644 (file)
@@ -1119,6 +1119,7 @@ class Sanitizer {
                        '>'    => '&gt;',   // we've received invalid input
                        '"'    => '&quot;', // which should have been escaped.
                        '{'    => '&#123;',
+                       '}'    => '&#125;', // prevent unpaired language conversion syntax
                        '['    => '&#91;',
                        "''"   => '&#39;&#39;',
                        'ISBN' => '&#73;SBN',
@@ -1262,8 +1263,9 @@ class Sanitizer {
        static function escapeHtmlAllowEntities( $html ) {
                $html = Sanitizer::decodeCharReferences( $html );
                # It seems wise to escape ' as well as ", as a matter of course.  Can't
-               # hurt.
-               $html = htmlspecialchars( $html, ENT_QUOTES );
+               # hurt. Use ENT_SUBSTITUTE so that incorrectly truncated multibyte characters
+               # don't cause the entire string to disappear.
+               $html = htmlspecialchars( $html, ENT_QUOTES | ENT_SUBSTITUTE );
                return $html;
        }
 
index c2197a6..ce82702 100644 (file)
@@ -71,8 +71,14 @@ return [
        },
 
        'SiteLookup' => function( MediaWikiServices $services ) {
-               // Use the default SiteStore as the SiteLookup implementation for now
-               return $services->getSiteStore();
+               $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' );
+
+               if ( $cacheFile !== false ) {
+                       return new FileBasedSiteLookup( $cacheFile );
+               } else {
+                       // Use the default SiteStore as the SiteLookup implementation for now
+                       return $services->getSiteStore();
+               }
        },
 
        'ConfigFactory' => function( MediaWikiServices $services ) {
@@ -96,7 +102,7 @@ return [
                $config = $services->getMainConfig();
                return new ClassicInterwikiLookup(
                        $wgContLang,
-                       ObjectCache::getMainWANInstance(),
+                       $services->getMainWANObjectCache(),
                        $config->get( 'InterwikiExpiry' ),
                        $config->get( 'InterwikiCache' ),
                        $config->get( 'InterwikiScopes' ),
@@ -214,12 +220,56 @@ return [
        },
 
        'MimeAnalyzer' => function( MediaWikiServices $services ) {
-               return new MimeMagic(
-                       MimeMagic::applyDefaultParameters(
-                               [],
-                               $services->getMainConfig()
-                       )
-               );
+               $logger = LoggerFactory::getInstance( 'Mime' );
+               $mainConfig = $services->getMainConfig();
+               $params = [
+                       'typeFile' => $mainConfig->get( 'MimeTypeFile' ),
+                       'infoFile' => $mainConfig->get( 'MimeInfoFile' ),
+                       'xmlTypes' => $mainConfig->get( 'XMLMimeTypes' ),
+                       'guessCallback' =>
+                               function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime ) use ( $logger ) {
+                                       // Also test DjVu
+                                       $deja = new DjVuImage( $file );
+                                       if ( $deja->isValid() ) {
+                                               $logger->info( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
+                                               $mime = 'image/vnd.djvu';
+
+                                               return;
+                                       }
+                                       // Some strings by reference for performance - assuming well-behaved hooks
+                                       Hooks::run(
+                                               'MimeMagicGuessFromContent',
+                                               [ $mimeAnalyzer, &$head, &$tail, $file, &$mime ]
+                                       );
+                               },
+                       'extCallback' => function ( $mimeAnalyzer, $ext, &$mime ) {
+                               // Media handling extensions can improve the MIME detected
+                               Hooks::run( 'MimeMagicImproveFromExtension', [ $mimeAnalyzer, $ext, &$mime ] );
+                       },
+                       'initCallback' => function ( $mimeAnalyzer ) {
+                               // Allow media handling extensions adding MIME-types and MIME-info
+                               Hooks::run( 'MimeMagicInit', [ $mimeAnalyzer ] );
+                       },
+                       'logger' => $logger
+               ];
+
+               if ( $params['infoFile'] === 'includes/mime.info' ) {
+                       $params['infoFile'] = __DIR__ . "/libs/mime/mime.info";
+               }
+
+               if ( $params['typeFile'] === 'includes/mime.types' ) {
+                       $params['typeFile'] = __DIR__ . "/libs/mime/mime.types";
+               }
+
+               $detectorCmd = $mainConfig->get( 'MimeDetectorCommand' );
+               if ( $detectorCmd ) {
+                       $params['detectCallback'] = function ( $file ) use ( $detectorCmd ) {
+                               return wfShellExec( "$detectorCmd " . wfEscapeShellArg( $file ) );
+                       };
+               }
+
+               // XXX: MimeMagic::singleton currently requires this service to return an instance of MimeMagic
+               return new MimeMagic( $params );
        },
 
        'ProxyLookup' => function( MediaWikiServices $services ) {
@@ -238,7 +288,7 @@ return [
        'LinkCache' => function( MediaWikiServices $services ) {
                return new LinkCache(
                        $services->getTitleFormatter(),
-                       ObjectCache::getMainWANInstance()
+                       $services->getMainWANObjectCache()
                );
        },
 
index 357c76d..01ba1e8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Include most things that are needed to make %MediaWiki work.
+ * Include most things that are needed to make MediaWiki work.
  *
  * This file is included by WebStart.php and doMaintenance.php so that both
  * web and maintenance scripts share a final set up phase to include necessary
@@ -36,8 +36,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 $fname = 'Setup.php';
 $ps_setup = Profiler::instance()->scopedProfileIn( $fname );
 
-// If any extensions are still queued, force load them
+// Load queued extensions
 ExtensionRegistry::getInstance()->loadFromQueue();
+// Don't let any other extensions load
+ExtensionRegistry::getInstance()->finish();
 
 // Check to see if we are at the file scope
 if ( !isset( $wgVersion ) ) {
@@ -242,7 +244,7 @@ if ( $wgUseInstantCommons ) {
                'transformVia404' => true,
                'fetchDescription' => true,
                'descriptionCacheExpiry' => 43200,
-               'apiThumbCacheExpiry' => 86400,
+               'apiThumbCacheExpiry' => 0,
        ];
 }
 /*
@@ -462,7 +464,7 @@ if ( $wgMaximalPasswordLength !== false ) {
 }
 
 // Backwards compatibility warning
-if ( !$wgSessionsInObjectCache && !$wgSessionsInMemcached ) {
+if ( !$wgSessionsInObjectCache ) {
        wfDeprecated( '$wgSessionsInObjectCache = false', '1.27' );
        if ( $wgSessionHandler ) {
                wfDeprecated( '$wgSessionsHandler', '1.27' );
@@ -497,10 +499,6 @@ if ( $wgDebugToolbar && !$wgCommandLineMode ) {
        MWDebug::init();
 }
 
-if ( !class_exists( 'AutoLoader' ) ) {
-       require_once "$IP/includes/AutoLoader.php";
-}
-
 // Reset the global service locator, so any services that have already been created will be
 // re-created while taking into account any custom settings and extensions.
 MediaWikiServices::resetGlobalInstance( new GlobalVarConfig(), 'quick' );
@@ -878,7 +876,6 @@ if ( !$wgCommandLineMode ) {
        Pingback::schedulePingback();
 }
 
-wfDebug( "Fully initialised\n" );
 $wgFullyInitialised = true;
 
 Profiler::instance()->scopedProfileOut( $ps_extensions );
index 885f926..8d9256b 100644 (file)
@@ -274,7 +274,7 @@ class SiteConfiguration {
         * @param string $from
         * @param string $to
         * @param string|array $in
-        * @return string
+        * @return string|array
         */
        function doReplace( $from, $to, $in ) {
                if ( is_string( $in ) ) {
index ff7875c..105a581 100644 (file)
@@ -186,6 +186,7 @@ class SiteStats {
                        wfMemcKey( 'SiteStats', 'groupcounts', $group ),
                        $cache::TTL_HOUR,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
+                               global $wgDisableUserGroupExpiry;
                                $dbr = wfGetDB( DB_REPLICA );
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
@@ -193,7 +194,12 @@ class SiteStats {
                                return $dbr->selectField(
                                        'user_groups',
                                        'COUNT(*)',
-                                       [ 'ug_group' => $group ],
+                                       [
+                                               'ug_group' => $group,
+                                               $wgDisableUserGroupExpiry ?
+                                                       '1' :
+                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
+                                       ],
                                        __METHOD__
                                );
                        },
index a1e6d5b..470a75c 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Handles compiling Mustache templates into PHP rendering functions
  *
@@ -98,7 +100,7 @@ class TemplateParser {
                $fastHash = md5( $fileContents );
 
                // Fetch a secret key for building a keyed hash of the PHP code
-               $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $config = MediaWikiServices::getInstance()->getMainConfig();
                $secretKey = $config->get( 'SecretKey' );
 
                if ( $secretKey ) {
index 3c51bae..3ce775b 100644 (file)
@@ -835,7 +835,7 @@ class Title implements LinkTarget {
        /**
         * Returns the DB name of the distant wiki which owns the object.
         *
-        * @return string The DB name
+        * @return string|false The DB name
         */
        public function getTransWikiID() {
                if ( !$this->isExternal() ) {
@@ -974,7 +974,7 @@ class Title implements LinkTarget {
        /**
         * Get the namespace text
         *
-        * @return string Namespace text
+        * @return string|false Namespace text
         */
        public function getNsText() {
                if ( $this->isExternal() ) {
@@ -1233,12 +1233,6 @@ class Title implements LinkTarget {
                        && ( $this->hasContentModel( CONTENT_MODEL_CSS )
                                || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
 
-               # @note This hook is also called in ContentHandler::getDefaultModel.
-               #   It's called here again to make sure hook functions can force this
-               #   method to return true even outside the MediaWiki namespace.
-
-               Hooks::run( 'TitleIsCssOrJsPage', [ $this, &$isCssOrJsPage ], '1.25' );
-
                return $isCssOrJsPage;
        }
 
@@ -1627,7 +1621,7 @@ class Title implements LinkTarget {
         *
         * @since 1.19 (r105919)
         * @param array|string $query
-        * @param bool $query2
+        * @param string|string[]|bool $query2
         * @return string
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
@@ -1663,8 +1657,8 @@ class Title implements LinkTarget {
         *
         * @see self::getLocalURL for the arguments.
         * @see wfExpandUrl
-        * @param array|string $query
-        * @param bool $query2
+        * @param string|string[] $query
+        * @param string|string[]|bool $query2
         * @param string $proto Protocol type to use in URL
         * @return string The URL
         */
@@ -1681,8 +1675,9 @@ class Title implements LinkTarget {
 
                # Finally, add the fragment.
                $url .= $this->getFragmentForURL();
-
-               Hooks::run( 'GetFullURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetFullURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -1696,11 +1691,11 @@ class Title implements LinkTarget {
         *  valid to link, locally, to the current Title.
         * @see self::newFromText to produce a Title object.
         *
-        * @param string|array $query An optional query string,
+        * @param string|string[] $query An optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
         *   Some query patterns will trigger various shorturl path replacements.
-        * @param array $query2 An optional secondary query array. This one MUST
+        * @param string|string[]|bool $query2 An optional secondary query array. This one MUST
         *   be an array. If a string is passed it will be interpreted as a deprecated
         *   variant argument and urlencoded into a variant= argument.
         *   This second query argument will be added to the $query
@@ -1728,7 +1723,9 @@ class Title implements LinkTarget {
                        $dbkey = wfUrlencode( $this->getPrefixedDBkey() );
                        if ( $query == '' ) {
                                $url = str_replace( '$1', $dbkey, $wgArticlePath );
-                               Hooks::run( 'GetLocalURL::Article', [ &$this, &$url ] );
+                               // Avoid PHP 7.1 warning from passing $this by reference
+                               $titleRef = $this;
+                               Hooks::run( 'GetLocalURL::Article', [ &$titleRef, &$url ] );
                        } else {
                                global $wgVariantArticlePath, $wgActionPaths, $wgContLang;
                                $url = false;
@@ -1772,8 +1769,9 @@ class Title implements LinkTarget {
                                        $url = "{$wgScript}?title={$dbkey}&{$query}";
                                }
                        }
-
-                       Hooks::run( 'GetLocalURL::Internal', [ &$this, &$url, $query ] );
+                       // Avoid PHP 7.1 warning from passing $this by reference
+                       $titleRef = $this;
+                       Hooks::run( 'GetLocalURL::Internal', [ &$titleRef, &$url, $query ] );
 
                        // @todo FIXME: This causes breakage in various places when we
                        // actually expected a local URL and end up with dupe prefixes.
@@ -1781,7 +1779,9 @@ class Title implements LinkTarget {
                                $url = $wgServer . $url;
                        }
                }
-               Hooks::run( 'GetLocalURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetLocalURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -1795,7 +1795,7 @@ class Title implements LinkTarget {
         * The result obviously should not be URL-escaped, but does need to be
         * HTML-escaped if it's being output in HTML.
         *
-        * @param array $query
+        * @param string|string[] $query
         * @param bool $query2
         * @param string|int|bool $proto A PROTO_* constant on how the URL should be expanded,
         *                               or false (default) for no expansion
@@ -1830,7 +1830,9 @@ class Title implements LinkTarget {
                $query = self::fixUrlQueryArgs( $query, $query2 );
                $server = $wgInternalServer !== false ? $wgInternalServer : $wgServer;
                $url = wfExpandUrl( $server . $this->getLocalURL( $query ), PROTO_HTTP );
-               Hooks::run( 'GetInternalURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetInternalURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -1848,7 +1850,9 @@ class Title implements LinkTarget {
        public function getCanonicalURL( $query = '', $query2 = false ) {
                $query = self::fixUrlQueryArgs( $query, $query2 );
                $url = wfExpandUrl( $this->getLocalURL( $query ) . $this->getFragmentForURL(), PROTO_CANONICAL );
-               Hooks::run( 'GetCanonicalURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetCanonicalURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -2052,18 +2056,22 @@ class Title implements LinkTarget {
        private function checkPermissionHooks( $action, $user, $errors, $rigor, $short ) {
                // Use getUserPermissionsErrors instead
                $result = '';
-               if ( !Hooks::run( 'userCan', [ &$this, &$user, $action, &$result ] ) ) {
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               if ( !Hooks::run( 'userCan', [ &$titleRef, &$user, $action, &$result ] ) ) {
                        return $result ? [] : [ [ 'badaccess-group0' ] ];
                }
                // Check getUserPermissionsErrors hook
-               if ( !Hooks::run( 'getUserPermissionsErrors', [ &$this, &$user, $action, &$result ] ) ) {
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               if ( !Hooks::run( 'getUserPermissionsErrors', [ &$titleRef, &$user, $action, &$result ] ) ) {
                        $errors = $this->resultToError( $errors, $result );
                }
                // Check getUserPermissionsErrorsExpensive hook
                if (
                        $rigor !== 'quick'
                        && !( $short && count( $errors ) > 0 )
-                       && !Hooks::run( 'getUserPermissionsErrorsExpensive', [ &$this, &$user, $action, &$result ] )
+                       && !Hooks::run( 'getUserPermissionsErrorsExpensive', [ &$titleRef, &$user, $action, &$result ] )
                ) {
                        $errors = $this->resultToError( $errors, $result );
                }
@@ -2409,7 +2417,7 @@ class Title implements LinkTarget {
         *
         * @param string $action The action to check
         * @param bool $short Short circuit on first error
-        * @return array List of errors
+        * @return array Array containing an error message key and any parameters
         */
        private function missingPermissionError( $action, $short ) {
                // We avoid expensive display logic for quickUserCan's and such
@@ -2417,19 +2425,7 @@ class Title implements LinkTarget {
                        return [ 'badaccess-group0' ];
                }
 
-               $groups = array_map( [ 'User', 'makeGroupLinkWiki' ],
-                       User::getGroupsWithPermission( $action ) );
-
-               if ( count( $groups ) ) {
-                       global $wgLang;
-                       return [
-                               'badaccess-groups',
-                               $wgLang->commaList( $groups ),
-                               count( $groups )
-                       ];
-               } else {
-                       return [ 'badaccess-group0' ];
-               }
+               return User::newFatalPermissionDeniedStatus( $action )->getErrorsArray()[0];
        }
 
        /**
@@ -3595,18 +3591,6 @@ class Title implements LinkTarget {
                );
        }
 
-       /**
-        * Move this page without authentication
-        *
-        * @deprecated since 1.25 use MovePage class instead
-        * @param Title $nt The new page Title
-        * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
-        */
-       public function moveNoAuth( &$nt ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return $this->moveTo( $nt, false );
-       }
-
        /**
         * Check whether a given move operation would be valid.
         * Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
@@ -3670,9 +3654,12 @@ class Title implements LinkTarget {
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to create a redirect from the old title to the new title.
         *  Ignored if the user doesn't have the suppressredirect right.
+        * @param array $changeTags Applied to the entry in the move log and redirect page revision
         * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
-       public function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true ) {
+       public function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true,
+               array $changeTags = [] ) {
+
                global $wgUser;
                $err = $this->isValidMoveOperation( $nt, $auth, $reason );
                if ( is_array( $err ) ) {
@@ -3686,7 +3673,7 @@ class Title implements LinkTarget {
                }
 
                $mp = new MovePage( $this, $nt );
-               $status = $mp->move( $wgUser, $reason, $createRedirect );
+               $status = $mp->move( $wgUser, $reason, $createRedirect, $changeTags );
                if ( $status->isOK() ) {
                        return true;
                } else {
@@ -3702,24 +3689,32 @@ class Title implements LinkTarget {
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to create redirects from the old subpages to
         *     the new ones Ignored if the user doesn't have the 'suppressredirect' right
+        * @param array $changeTags Applied to the entry in the move log and redirect page revision
         * @return array Array with old page titles as keys, and strings (new page titles) or
-        *     arrays (errors) as values, or an error array with numeric indices if no pages
-        *     were moved
+        *     getUserPermissionsErrors()-like arrays (errors) as values, or a
+        *     getUserPermissionsErrors()-like error array with numeric indices if
+        *     no pages were moved
         */
-       public function moveSubpages( $nt, $auth = true, $reason = '', $createRedirect = true ) {
+       public function moveSubpages( $nt, $auth = true, $reason = '', $createRedirect = true,
+               array $changeTags = [] ) {
+
                global $wgMaximumMovedPages;
                // Check permissions
                if ( !$this->userCan( 'move-subpages' ) ) {
-                       return [ 'cant-move-subpages' ];
+                       return [
+                               [ 'cant-move-subpages' ],
+                       ];
                }
                // Do the source and target namespaces support subpages?
                if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) {
-                       return [ 'namespace-nosubpages',
-                               MWNamespace::getCanonicalName( $this->getNamespace() ) ];
+                       return [
+                               [ 'namespace-nosubpages', MWNamespace::getCanonicalName( $this->getNamespace() ) ],
+                       ];
                }
                if ( !MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
-                       return [ 'namespace-nosubpages',
-                               MWNamespace::getCanonicalName( $nt->getNamespace() ) ];
+                       return [
+                               [ 'namespace-nosubpages', MWNamespace::getCanonicalName( $nt->getNamespace() ) ],
+                       ];
                }
 
                $subpages = $this->getSubpages( $wgMaximumMovedPages + 1 );
@@ -3728,9 +3723,9 @@ class Title implements LinkTarget {
                foreach ( $subpages as $oldSubpage ) {
                        $count++;
                        if ( $count > $wgMaximumMovedPages ) {
-                               $retval[$oldSubpage->getPrefixedText()] =
-                                               [ 'movepage-max-pages',
-                                                       $wgMaximumMovedPages ];
+                               $retval[$oldSubpage->getPrefixedText()] = [
+                                       [ 'movepage-max-pages', $wgMaximumMovedPages ],
+                               ];
                                break;
                        }
 
@@ -3757,7 +3752,7 @@ class Title implements LinkTarget {
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
 
-                       $success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect );
+                       $success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect, $changeTags );
                        if ( $success === true ) {
                                $retval[$oldSubpage->getPrefixedText()] = $newSubpage->getPrefixedText();
                        } else {
@@ -4436,7 +4431,7 @@ class Title implements LinkTarget {
         * Get the last touched timestamp
         *
         * @param IDatabase $db Optional db
-        * @return string Last-touched timestamp
+        * @return string|false Last-touched timestamp
         */
        public function getTouched( $db = null ) {
                if ( $db === null ) {
diff --git a/includes/TrackingCategories.php b/includes/TrackingCategories.php
new file mode 100644 (file)
index 0000000..825860a
--- /dev/null
@@ -0,0 +1,130 @@
+<?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 Categories
+ */
+
+/**
+ * This class performs some operations related to tracking categories, such as creating
+ * a list of all such categories.
+ */
+class TrackingCategories {
+       /** @var Config */
+       private $config;
+
+       /**
+        * Tracking categories that exist in core
+        *
+        * @var array
+        */
+       private static $coreTrackingCategories = [
+               'index-category',
+               'noindex-category',
+               'duplicate-args-category',
+               'expensive-parserfunction-category',
+               'post-expand-template-argument-category',
+               'post-expand-template-inclusion-category',
+               'hidden-category-category',
+               'broken-file-category',
+               'node-count-exceeded-category',
+               'expansion-depth-exceeded-category',
+               'restricted-displaytitle-ignored',
+               'deprecated-self-close-category',
+       ];
+
+       /**
+        * @param Config $config
+        */
+       public function __construct( Config $config ) {
+               $this->config = $config;
+       }
+
+       /**
+        * Read the global and extract title objects from the corresponding messages
+        * @return array Array( 'msg' => Title, 'cats' => Title[] )
+        */
+       public function getTrackingCategories() {
+               $categories = array_merge(
+                       self::$coreTrackingCategories,
+                       ExtensionRegistry::getInstance()->getAttribute( 'TrackingCategories' ),
+                       $this->config->get( 'TrackingCategories' ) // deprecated
+               );
+
+               // Only show magic link tracking categories if they are enabled
+               $enableMagicLinks = $this->config->get( 'EnableMagicLinks' );
+               if ( $enableMagicLinks['ISBN'] ) {
+                       $categories[] = 'magiclink-tracking-isbn';
+               }
+               if ( $enableMagicLinks['RFC'] ) {
+                       $categories[] = 'magiclink-tracking-rfc';
+               }
+               if ( $enableMagicLinks['PMID'] ) {
+                       $categories[] = 'magiclink-tracking-pmid';
+               }
+
+               $trackingCategories = [];
+               foreach ( $categories as $catMsg ) {
+                       /*
+                        * Check if the tracking category varies by namespace
+                        * Otherwise only pages in the current namespace will be displayed
+                        * If it does vary, show pages considering all namespaces
+                        */
+                       $msgObj = wfMessage( $catMsg )->inContentLanguage();
+                       $allCats = [];
+                       $catMsgTitle = Title::makeTitleSafe( NS_MEDIAWIKI, $catMsg );
+                       if ( !$catMsgTitle ) {
+                               continue;
+                       }
+
+                       // Match things like {{NAMESPACE}} and {{NAMESPACENUMBER}}.
+                       // False positives are ok, this is just an efficiency shortcut
+                       if ( strpos( $msgObj->plain(), '{{' ) !== false ) {
+                               $ns = MWNamespace::getValidNamespaces();
+                               foreach ( $ns as $namesp ) {
+                                       $tempTitle = Title::makeTitleSafe( $namesp, $catMsg );
+                                       if ( !$tempTitle ) {
+                                               continue;
+                                       }
+                                       $catName = $msgObj->title( $tempTitle )->text();
+                                       # Allow tracking categories to be disabled by setting them to "-"
+                                       if ( $catName !== '-' ) {
+                                               $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+                                               if ( $catTitle ) {
+                                                       $allCats[] = $catTitle;
+                                               }
+                                       }
+                               }
+                       } else {
+                               $catName = $msgObj->text();
+                               # Allow tracking categories to be disabled by setting them to "-"
+                               if ( $catName !== '-' ) {
+                                       $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+                                       if ( $catTitle ) {
+                                               $allCats[] = $catTitle;
+                                       }
+                               }
+                       }
+                       $trackingCategories[$catMsg] = [
+                               'cats' => $allCats,
+                               'msg' => $catMsgTitle,
+                       ];
+               }
+
+               return $trackingCategories;
+       }
+}
index 0c3d52a..dd23310 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Linker\LinkTarget;
 use Wikimedia\Assert\Assert;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class performing complex database queries related to WatchedItems.
@@ -422,10 +423,7 @@ class WatchedItemQueryService {
                        $ownersToken = $watchlistOwner->getOption( 'watchlisttoken' );
                        $token = $options['watchlistOwnerToken'];
                        if ( $ownersToken == '' || !hash_equals( $ownersToken, $token ) ) {
-                               throw new UsageException(
-                                       'Incorrect watchlist token provided -- please set a correct token in Special:Preferences',
-                                       'bad_wltoken'
-                               );
+                               throw ApiUsageException::newWithMessage( null, 'apierror-bad-watchlist-token', 'bad_wltoken' );
                        }
                        return $watchlistOwner->getId();
                }
@@ -474,7 +472,7 @@ class WatchedItemQueryService {
        }
 
        private function getStartEndConds( IDatabase $db, array $options ) {
-               if ( !isset( $options['start'] ) && ! isset( $options['end'] ) ) {
+               if ( !isset( $options['start'] ) && !isset( $options['end'] ) ) {
                        return [];
                }
 
index cc4779e..9af5310 100644 (file)
@@ -2,8 +2,10 @@
 
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Storage layer class for WatchedItems.
@@ -668,7 +670,7 @@ class WatchedItemStore implements StatsdAwareInterface {
 
        /**
         * @param User $user The user to set the timestamp for
-        * @param string $timestamp Set the update timestamp to this value
+        * @param string|null $timestamp Set the update timestamp to this value
         * @param LinkTarget[] $targets List of targets to update. Default to all targets
         *
         * @return bool success
@@ -687,9 +689,13 @@ class WatchedItemStore implements StatsdAwareInterface {
                        $conds[] = $batch->constructSet( 'wl', $dbw );
                }
 
+               if ( $timestamp !== null ) {
+                       $timestamp = $dbw->timestamp( $timestamp );
+               }
+
                $success = $dbw->update(
                        'watchlist',
-                       [ 'wl_notificationtimestamp' => $dbw->timestamp( $timestamp ) ],
+                       [ 'wl_notificationtimestamp' => $timestamp ],
                        $conds,
                        __METHOD__
                );
@@ -730,7 +736,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                                        global $wgUpdateRowsPerQuery;
 
                                        $dbw = $this->getConnectionRef( DB_MASTER );
-                                       $factory = wfGetLBFactory();
+                                       $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                                        $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
 
                                        $watchersChunks = array_chunk( $watchers, $wgUpdateRowsPerQuery );
index 3ef3bc1..78d7444 100644 (file)
@@ -238,7 +238,7 @@ class WebRequest {
         * This is for use prior to Setup.php, when no WebRequest object is available.
         * At other times, use the non-static function getProtocol().
         *
-        * @return array
+        * @return string
         */
        public static function detectProtocol() {
                if ( ( !empty( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' ) ||
@@ -408,7 +408,7 @@ class WebRequest {
         * @since 1.28
         * @param string $name
         * @param string|null $default Optional default
-        * @return string
+        * @return string|null
         */
        public function getRawVal( $name, $default = null ) {
                $name = strtr( $name, '.', '_' ); // See comment in self::getGPCVal()
@@ -432,7 +432,7 @@ class WebRequest {
         *
         * @param string $name
         * @param string $default Optional default (or null)
-        * @return string
+        * @return string|null
         */
        public function getVal( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
@@ -482,7 +482,7 @@ class WebRequest {
         *
         * @param string $name
         * @param array $default Optional default (or null)
-        * @return array
+        * @return array|null
         */
        public function getArray( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
@@ -757,22 +757,6 @@ class WebRequest {
                return $this->sessionId;
        }
 
-       /**
-        * Returns true if the request has a persistent session.
-        * This does not necessarily mean that the user is logged in!
-        *
-        * @deprecated since 1.27, use
-        *  \MediaWiki\Session\SessionManager::singleton()->getPersistedSessionId()
-        *  instead.
-        * @return bool
-        */
-       public function checkSessionCookie() {
-               global $wgInitialSessionId;
-               wfDeprecated( __METHOD__, '1.27' );
-               return $wgInitialSessionId !== null &&
-                       $this->getSession()->getId() === (string)$wgInitialSessionId;
-       }
-
        /**
         * Get a cookie from the $_COOKIE jar
         *
@@ -1099,6 +1083,7 @@ class WebRequest {
                header( 'Content-Type: text/html' );
                $encUrl = htmlspecialchars( $url );
                echo <<<HTML
+<!DOCTYPE html>
 <html>
 <head>
 <title>Security redirect</title>
index 339b2e3..f5fb47f 100644 (file)
@@ -39,6 +39,9 @@ class WebResponse {
         * @param null|int $http_response_code Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
+               if ( headers_sent() ) {
+                       MWDebug::warning( 'Headers already sent, should send headers earlier than ' . wfGetCaller() );
+               }
                if ( $http_response_code ) {
                        header( $string, $replace, $http_response_code );
                } else {
index d063ce3..6e4fb09 100644 (file)
@@ -133,9 +133,7 @@ if ( ob_get_level() == 0 ) {
        ob_start( 'wfOutputHandler' );
 }
 
-if ( !defined( 'MW_NO_SETUP' ) ) {
-       require_once "$IP/includes/Setup.php";
-}
+require_once "$IP/includes/Setup.php";
 
 # Multiple DBs or commits might be used; keep the request as transactional as possible
 if ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) {
index 37f85ea..f7b8d2f 100644 (file)
@@ -141,7 +141,7 @@ class WikiMap {
         * @param string $wikiID Wiki'd id (generally database name)
         * @param string $page Page name (must be normalised before calling this function!)
         * @param string $text Link's text; optional, default to $page
-        * @return string HTML link or false if the wiki was not found
+        * @return string|false HTML link or false if the wiki was not found
         */
        public static function makeForeignLink( $wikiID, $page, $text = null ) {
                if ( !$text ) {
index 4c6b071..8f18046 100644 (file)
@@ -563,6 +563,36 @@ class Xml {
                        . Xml::closeElement( 'select' );
        }
 
+       /**
+        * Converts textual drop-down list to array
+        *
+        * @param string $list Correctly formatted text (newline delimited) to be
+        *   used to generate the options.
+        * @return array
+        */
+       public static function getArrayFromWikiTextList( $list = '' ) {
+               $options = [];
+
+               foreach ( explode( "\n", $list ) as $option ) {
+                       $value = trim( $option );
+                       if ( $value == '' ) {
+                               continue;
+                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
+                               // A new group is starting ...
+                               $value = trim( substr( $value, 1 ) );
+                               $options[] = $value;
+                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
+                               // groupmember
+                               $value = trim( substr( $value, 2 ) );
+                               $options[] = $value;
+                       } else {
+                               // groupless reason list
+                               $options[] = $value;
+                       }
+               }
+               return $options;
+       }
+
        /**
         * Shortcut for creating fieldsets.
         *
@@ -613,42 +643,6 @@ class Xml {
                                        $content, false );
        }
 
-       /**
-        * Returns an escaped string suitable for inclusion in a string literal
-        * for JavaScript source code.
-        * Illegal control characters are assumed not to be present.
-        *
-        * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
-        * @param string $string String to escape
-        * @return string
-        */
-       public static function escapeJsString( $string ) {
-               // See ECMA 262 section 7.8.4 for string literal format
-               $pairs = [
-                       "\\" => "\\\\",
-                       "\"" => "\\\"",
-                       '\'' => '\\\'',
-                       "\n" => "\\n",
-                       "\r" => "\\r",
-
-                       # To avoid closing the element or CDATA section
-                       "<" => "\\x3c",
-                       ">" => "\\x3e",
-
-                       # To avoid any complaints about bad entity refs
-                       "&" => "\\x26",
-
-                       # Work around https://bugzilla.mozilla.org/show_bug.cgi?id=274152
-                       # Encode certain Unicode formatting chars so affected
-                       # versions of Gecko don't misinterpret our strings;
-                       # this is a common problem with Farsi text.
-                       "\xe2\x80\x8c" => "\\u200c", // ZERO WIDTH NON-JOINER
-                       "\xe2\x80\x8d" => "\\u200d", // ZERO WIDTH JOINER
-               ];
-
-               return strtr( $string, $pairs );
-       }
-
        /**
         * Encode a variable of arbitrary type to JavaScript.
         * If the value is an XmlJsCode object, pass through the object's value verbatim.
index 1332ab4..803695a 100644 (file)
@@ -23,6 +23,8 @@
  * @author <evan@wikitravel.org>
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup Actions
  */
@@ -198,14 +200,15 @@ class CreditsAction extends FormlessAction {
                if ( $this->canShowRealUserName() && !$user->isAnon() ) {
                        $real = $user->getRealName();
                } else {
-                       $real = false;
+                       $real = $user->getName();
                }
 
                $page = $user->isAnon()
                        ? SpecialPage::getTitleFor( 'Contributions', $user->getName() )
                        : $user->getUserPage();
 
-               return Linker::link( $page, htmlspecialchars( $real ? $real : $user->getName() ) );
+               return MediaWikiServices::getInstance()
+                       ->getLinkRenderer()->makeLink( $page, $real );
        }
 
        /**
@@ -231,9 +234,9 @@ class CreditsAction extends FormlessAction {
         * @return string HTML link
         */
        protected function othersLink() {
-               return Linker::linkKnown(
+               return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                        $this->getTitle(),
-                       $this->msg( 'others' )->escaped(),
+                       $this->msg( 'others' )->text(),
                        [],
                        [ 'action' => 'credits' ]
                );
index c1763fa..e8aec1c 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Actions
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class handles printing the history page for an article. In order to
  * be efficient, it uses timestamps rather than offsets for paging, to avoid
@@ -58,9 +60,9 @@ class HistoryAction extends FormlessAction {
 
        protected function getDescription() {
                // Creation of a subtitle link pointing to [[Special:Log]]
-               return Linker::linkKnown(
+               return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                        SpecialPage::getTitleFor( 'Log' ),
-                       $this->msg( 'viewpagelogs' )->escaped(),
+                       $this->msg( 'viewpagelogs' )->text(),
                        [],
                        [ 'page' => $this->getTitle()->getPrefixedText() ]
                );
@@ -166,7 +168,7 @@ class HistoryAction extends FormlessAction {
                $year = $request->getInt( 'year' );
                $month = $request->getInt( 'month' );
                $tagFilter = $request->getVal( 'tagfilter' );
-               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
+               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter, false, $this->getContext() );
 
                /**
                 * Option to show only revisions that have been (partially) hidden via RevisionDelete
@@ -426,7 +428,10 @@ class HistoryPager extends ReverseChronologicalPager {
                        $queryInfo['options'],
                        $this->tagFilter
                );
-               Hooks::run( 'PageHistoryPager::getQueryInfo', [ &$this, &$queryInfo ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $historyPager = $this;
+               Hooks::run( 'PageHistoryPager::getQueryInfo', [ &$historyPager, &$queryInfo ] );
 
                return $queryInfo;
        }
@@ -734,9 +739,9 @@ class HistoryPager extends ReverseChronologicalPager {
                                $undoTooltip = $latest
                                        ? [ 'title' => $this->msg( 'tooltip-undo' )->text() ]
                                        : [];
-                               $undolink = Linker::linkKnown(
+                               $undolink = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                                        $this->getTitle(),
-                                       $this->msg( 'editundo' )->escaped(),
+                                       $this->msg( 'editundo' )->text(),
                                        $undoTooltip,
                                        [
                                                'action' => 'edit',
@@ -788,16 +793,15 @@ class HistoryPager extends ReverseChronologicalPager {
         */
        function revLink( $rev ) {
                $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $this->getUser() );
-               $date = htmlspecialchars( $date );
                if ( $rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                       $link = Linker::linkKnown(
+                       $link = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                                $this->getTitle(),
                                $date,
                                [ 'class' => 'mw-changeslist-date' ],
                                [ 'oldid' => $rev->getId() ]
                        );
                } else {
-                       $link = $date;
+                       $link = htmlspecialchars( $date );
                }
                if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                        $link = "<span class=\"history-deleted\">$link</span>";
@@ -818,7 +822,7 @@ class HistoryPager extends ReverseChronologicalPager {
                if ( $latest || !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                        return $cur;
                } else {
-                       return Linker::linkKnown(
+                       return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                                $this->getTitle(),
                                $cur,
                                [],
@@ -847,9 +851,10 @@ class HistoryPager extends ReverseChronologicalPager {
                        return $last;
                }
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( $next === 'unknown' ) {
                        # Next row probably exists but is unknown, use an oldid=prev link
-                       return Linker::linkKnown(
+                       return $linkRenderer->makeKnownLink(
                                $this->getTitle(),
                                $last,
                                [],
@@ -868,7 +873,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        return $last;
                }
 
-               return Linker::linkKnown(
+               return $linkRenderer->makeKnownLink(
                        $this->getTitle(),
                        $last,
                        [],
index be3be85..167b709 100644 (file)
@@ -230,11 +230,11 @@ class InfoAction extends FormlessAction {
                if ( $title->isRedirect() ) {
                        $pageInfo['header-basic'][] = [
                                $this->msg( 'pageinfo-redirectsto' ),
-                               Linker::link( $this->page->getRedirectTarget() ) .
+                               $linkRenderer->makeLink( $this->page->getRedirectTarget() ) .
                                $this->msg( 'word-separator' )->escaped() .
-                               $this->msg( 'parentheses' )->rawParams( Linker::link(
+                               $this->msg( 'parentheses' )->rawParams( $linkRenderer->makeLink(
                                        $this->page->getRedirectTarget(),
-                                       $this->msg( 'pageinfo-redirectsto-info' )->escaped(),
+                                       $this->msg( 'pageinfo-redirectsto-info' )->text(),
                                        [],
                                        [ 'action' => 'info' ]
                                ) )->escaped()
@@ -261,28 +261,29 @@ class InfoAction extends FormlessAction {
                // Language in which the page content is (supposed to be) written
                $pageLang = $title->getPageLanguage()->getCode();
 
+               $pageLangHtml = $pageLang . ' - ' .
+                       Language::fetchLanguageName( $pageLang, $lang->getCode() );
+               // Link to Special:PageLanguage with pre-filled page title if user has permissions
                if ( $config->get( 'PageLanguageUseDB' )
-                       && $this->getTitle()->userCan( 'pagelang', $this->getUser() )
+                       && $title->userCan( 'pagelang', $user )
                ) {
-                       // Link to Special:PageLanguage with pre-filled page title if user has permissions
-                       $titleObj = SpecialPage::getTitleFor( 'PageLanguage', $title->getPrefixedText() );
-                       $langDisp = Linker::link(
-                               $titleObj,
-                               $this->msg( 'pageinfo-language' )->escaped()
-                       );
-               } else {
-                       // Display just the message
-                       $langDisp = $this->msg( 'pageinfo-language' )->escaped();
+                       $pageLangHtml .= ' ' . $this->msg( 'parentheses' )->rawParams( $linkRenderer->makeLink(
+                               SpecialPage::getTitleValueFor( 'PageLanguage', $title->getPrefixedText() ),
+                               $this->msg( 'pageinfo-language-change' )->text()
+                       ) )->escaped();
                }
 
-               $pageInfo['header-basic'][] = [ $langDisp,
-                       Language::fetchLanguageName( $pageLang, $lang->getCode() )
-                       . ' ' . $this->msg( 'parentheses', $pageLang )->escaped() ];
+               $pageInfo['header-basic'][] = [
+                       $this->msg( 'pageinfo-language' )->escaped(),
+                       $pageLangHtml
+               ];
 
                // Content model of the page
                $modelHtml = htmlspecialchars( ContentHandler::getLocalizedName( $title->getContentModel() ) );
                // If the user can change it, add a link to Special:ChangeContentModel
-               if ( $title->quickUserCan( 'editcontentmodel' ) ) {
+               if ( $config->get( 'ContentHandlerUseDB' )
+                       && $title->userCan( 'editcontentmodel', $user )
+               ) {
                        $modelHtml .= ' ' . $this->msg( 'parentheses' )->rawParams( $linkRenderer->makeLink(
                                SpecialPage::getTitleValueFor( 'ChangeContentModel', $title->getPrefixedText() ),
                                $this->msg( 'pageinfo-content-model-change' )->text()
@@ -360,9 +361,9 @@ class InfoAction extends FormlessAction {
                // Redirects to this page
                $whatLinksHere = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
                $pageInfo['header-basic'][] = [
-                       Linker::link(
+                       $linkRenderer->makeLink(
                                $whatLinksHere,
-                               $this->msg( 'pageinfo-redirects-name' )->escaped(),
+                               $this->msg( 'pageinfo-redirects-name' )->text(),
                                [],
                                [
                                        'hidelinks' => 1,
@@ -436,7 +437,7 @@ class InfoAction extends FormlessAction {
 
                        foreach ( $sources as $sourceTitle ) {
                                $cascadingFrom .= Html::rawElement(
-                                       'li', [], Linker::linkKnown( $sourceTitle ) );
+                                       'li', [], $linkRenderer->makeKnownLink( $sourceTitle ) );
                        }
 
                        $cascadingFrom = Html::rawElement( 'ul', [], $cascadingFrom );
@@ -474,7 +475,7 @@ class InfoAction extends FormlessAction {
                        }
                        $expiry = $title->getRestrictionExpiry( $restrictionType );
                        $formattedexpiry = $this->msg( 'parentheses',
-                               $this->getLanguage()->formatExpiry( $expiry ) )->escaped();
+                               $lang->formatExpiry( $expiry ) )->escaped();
                        $message .= $this->msg( 'word-separator' )->escaped() . $formattedexpiry;
 
                        // Messages: restriction-edit, restriction-move, restriction-create,
@@ -525,9 +526,9 @@ class InfoAction extends FormlessAction {
                        // Date of page creation
                        $pageInfo['header-edits'][] = [
                                $this->msg( 'pageinfo-firsttime' ),
-                               Linker::linkKnown(
+                               $linkRenderer->makeKnownLink(
                                        $title,
-                                       htmlspecialchars( $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ) ),
+                                       $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ),
                                        [],
                                        [ 'oldid' => $firstRev->getId() ]
                                )
@@ -544,11 +545,9 @@ class InfoAction extends FormlessAction {
                        // Date of latest edit
                        $pageInfo['header-edits'][] = [
                                $this->msg( 'pageinfo-lasttime' ),
-                               Linker::linkKnown(
+                               $linkRenderer->makeKnownLink(
                                        $title,
-                                       htmlspecialchars(
-                                               $lang->userTimeAndDate( $this->page->getTimestamp(), $user )
-                                       ),
+                                       $lang->userTimeAndDate( $this->page->getTimestamp(), $user ),
                                        [],
                                        [ 'oldid' => $this->page->getLatest() ]
                                )
@@ -655,9 +654,9 @@ class InfoAction extends FormlessAction {
 
                        if ( !$config->get( 'MiserMode' ) && $pageCounts['transclusion']['to'] > 0 ) {
                                if ( $pageCounts['transclusion']['to'] > count( $transcludedTargets ) ) {
-                                       $more = Linker::link(
+                                       $more = $linkRenderer->makeLink(
                                                $whatLinksHere,
-                                               $this->msg( 'moredotdotdot' )->escaped(),
+                                               $this->msg( 'moredotdotdot' )->text(),
                                                [],
                                                [ 'hidelinks' => 1, 'hideredirs' => 1 ]
                                        );
@@ -836,6 +835,7 @@ class InfoAction extends FormlessAction {
                $real_names = [];
                $user_names = [];
                $anon_ips = [];
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
 
                # Sift for real versus user names
                /** @var $user User */
@@ -846,11 +846,11 @@ class InfoAction extends FormlessAction {
 
                        $hiddenPrefs = $this->context->getConfig()->get( 'HiddenPrefs' );
                        if ( $user->getId() == 0 ) {
-                               $anon_ips[] = Linker::link( $page, htmlspecialchars( $user->getName() ) );
+                               $anon_ips[] = $linkRenderer->makeLink( $page, $user->getName() );
                        } elseif ( !in_array( 'realname', $hiddenPrefs ) && $user->getRealName() ) {
-                               $real_names[] = Linker::link( $page, htmlspecialchars( $user->getRealName() ) );
+                               $real_names[] = $linkRenderer->makeLink( $page, $user->getRealName() );
                        } else {
-                               $user_names[] = Linker::link( $page, htmlspecialchars( $user->getName() ) );
+                               $user_names[] = $linkRenderer->makeLink( $page, $user->getName() );
                        }
                }
 
index 8df6044..611e683 100644 (file)
@@ -20,6 +20,8 @@
  * @ingroup Actions
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Mark a revision as patrolled on a page
  *
@@ -56,6 +58,7 @@ class MarkpatrolledAction extends FormAction {
        protected function preText() {
                $rc = $this->getRecentChange();
                $title = $rc->getTitle();
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
 
                // Based on logentry-patrol-patrol (see PatrolLogFormatter)
                $revId = $rc->getAttribute( 'rc_this_oldid' );
@@ -64,8 +67,8 @@ class MarkpatrolledAction extends FormAction {
                        'diff' => $revId,
                        'oldid' => $rc->getAttribute( 'rc_last_oldid' )
                ];
-               $revlink = Linker::link( $title, htmlspecialchars( $revId ), [], $query );
-               $pagelink = Linker::link( $title, htmlspecialchars( $title->getPrefixedText() ) );
+               $revlink = $linkRenderer->makeLink( $title, $revId, [], $query );
+               $pagelink = $linkRenderer->makeLink( $title, $title->getPrefixedText() );
 
                return $this->msg( 'confirm-markpatrolled-top' )->params(
                        $title->getPrefixedText(),
index 5bf24f6..d8c8bc3 100644 (file)
@@ -108,7 +108,9 @@ class RawAction extends FormlessAction {
                        $response->statusHeader( 404 );
                }
 
-               if ( !Hooks::run( 'RawPageViewBeforeOutput', [ &$this, &$text ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $rawAction = $this;
+               if ( !Hooks::run( 'RawPageViewBeforeOutput', [ &$rawAction, &$text ] ) ) {
                        wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
                }
 
diff --git a/includes/actions/RevisiondeleteAction.php b/includes/actions/RevisiondeleteAction.php
deleted file mode 100644 (file)
index 7df42b3..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * An action that just pass the request to Special:RevisionDelete
- *
- * Copyright © 2011 Alexandre Emsenhuber
- *
- * 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
- *
- * @file
- * @ingroup Actions
- * @author Alexandre Emsenhuber
- */
-
-/**
- * An action that just pass the request to Special:RevisionDelete
- *
- * @ingroup Actions
- * @deprecated since 1.25 This class has been replaced by SpecialPageAction, but
- * you really shouldn't have been using it outside core in the first place
- */
-class RevisiondeleteAction extends FormlessAction {
-       public function __construct( Page $page, IContextSource $context = null ) {
-               wfDeprecated( 'RevisiondeleteAction class', '1.25' );
-               parent::__construct( $page, $context );
-       }
-
-       public function getName() {
-               return 'revisiondelete';
-       }
-
-       public function requiresUnblock() {
-               return false;
-       }
-
-       public function getDescription() {
-               return '';
-       }
-
-       public function onView() {
-               return '';
-       }
-
-       public function show() {
-               $special = SpecialPageFactory::getPage( 'Revisiondelete' );
-               $special->setContext( $this->getContext() );
-               $special->getContext()->setTitle( $special->getPageTitle() );
-               $special->run( '' );
-       }
-
-       public function doesWrites() {
-               return true;
-       }
-}
index aa2858d..9d336e4 100644 (file)
@@ -41,6 +41,7 @@ class RollbackAction extends FormlessAction {
         * - confirm-rollback-button
         * - rollbackfailed
         * - rollback-missingparam
+        * - rollback-success-notify
         */
 
        /**
@@ -123,8 +124,13 @@ class RollbackAction extends FormlessAction {
 
                $old = Linker::revUserTools( $current );
                $new = Linker::revUserTools( $target );
-               $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )
-                       ->parseAsBlock() );
+               $this->getOutput()->addHTML(
+                       $this->msg( 'rollback-success' )
+                               ->rawParams( $old, $new )
+                               ->params( $current->getUserText( Revision::FOR_THIS_USER, $user ) )
+                               ->params( $target->getUserText( Revision::FOR_THIS_USER, $user ) )
+                               ->parseAsBlock()
+               );
 
                if ( $user->getBoolOption( 'watchrollback' ) ) {
                        $user->addWatch( $this->page->getTitle(), User::IGNORE_USER_RIGHTS );
index 4a7f623..0ba964f 100644 (file)
@@ -26,7 +26,7 @@
 /**
  * An action that views article content
  *
- * This is a wrapper that will call Article::render().
+ * This is a wrapper that will call Article::view().
  *
  * @ingroup Actions
  */
index 2511e3b..5d12590 100644 (file)
@@ -56,8 +56,8 @@ class ApiAMCreateAccount extends ApiBase {
                        $bits = wfParseUrl( $params['returnurl'] );
                        if ( !$bits || $bits['scheme'] === '' ) {
                                $encParamName = $this->encodeParamName( 'returnurl' );
-                               $this->dieUsage(
-                                       "Invalid value '{$params['returnurl']}' for url parameter $encParamName",
+                               $this->dieWithError(
+                                       [ 'apierror-badurl', $encParamName, wfEscapeWikiText( $params['returnurl'] ) ],
                                        "badurl_{$encParamName}"
                                );
                        }
index 6fafebf..d037c36 100644 (file)
@@ -93,7 +93,7 @@ class ApiAuthManagerHelper {
        /**
         * Call $manager->securitySensitiveOperationStatus()
         * @param string $operation Operation being checked.
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function securitySensitiveOperation( $operation ) {
                $status = AuthManager::singleton()->securitySensitiveOperationStatus( $operation );
@@ -102,14 +102,10 @@ class ApiAuthManagerHelper {
                                return;
 
                        case AuthManager::SEC_REAUTH:
-                               $this->module->dieUsage(
-                                       'You have not authenticated recently in this session, please reauthenticate.', 'reauthenticate'
-                               );
+                               $this->module->dieWithError( 'apierror-reauthenticate' );
 
                        case AuthManager::SEC_FAIL:
-                               $this->module->dieUsage(
-                                       'This action is not available as your identify cannot be verified.', 'cannotreauthenticate'
-                               );
+                               $this->module->dieWithError( 'apierror-cannotreauthenticate' );
 
                        default:
                                throw new UnexpectedValueException( "Unknown status \"$status\"" );
@@ -212,6 +208,7 @@ class ApiAuthManagerHelper {
                        $res->status === AuthenticationResponse::RESTART
                ) {
                        $this->formatMessage( $ret, 'message', $res->message );
+                       $ret['messagecode'] = ApiMessage::create( $res->message )->getApiCode();
                }
 
                if ( $res->status === AuthenticationResponse::FAIL ||
index 506ff73..e249810 100644 (file)
@@ -67,7 +67,8 @@ abstract class ApiBase extends ContextSource {
         * - limit: An integer or the string 'max'. Default lower limit is 0 (but
         *   see PARAM_MIN), and requires that PARAM_MAX and PARAM_MAX2 be
         *   specified. Cannot be used with PARAM_ISMULTI.
-        * - namespace: An integer representing a MediaWiki namespace.
+        * - namespace: An integer representing a MediaWiki namespace. Forces PARAM_ALL = true to
+        *   support easily specifying all namespaces.
         * - NULL: Any string.
         * - password: Any non-empty string. Input value is private or sensitive.
         *   <input type="password"> would be an appropriate HTML form field.
@@ -171,8 +172,24 @@ abstract class ApiBase extends ContextSource {
         */
        const PARAM_SUBMODULE_PARAM_PREFIX = 16;
 
+       /**
+        * (boolean|string) When PARAM_TYPE has a defined set of values and PARAM_ISMULTI is true,
+        * this allows for an asterisk ('*') to be passed in place of a pipe-separated list of
+        * every possible value. If a string is set, it will be used in place of the asterisk.
+        * @since 1.29
+        */
+       const PARAM_ALL = 17;
+
+       /**
+        * (int[]) When PARAM_TYPE is 'namespace', include these as additional possible values.
+        * @since 1.29
+        */
+       const PARAM_EXTRA_NAMESPACES = 18;
+
        /**@}*/
 
+       const ALL_DEFAULT_STRING = '*';
+
        /** Fast query, standard limit. */
        const LIMIT_BIG1 = 500;
        /** Fast query, apihighlimits limit. */
@@ -534,7 +551,7 @@ abstract class ApiBase extends ContextSource {
         * @since 1.25
         * @param string $path
         * @return ApiBase|null
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function getModuleFromPath( $path ) {
                $module = $this->getMain();
@@ -554,14 +571,14 @@ abstract class ApiBase extends ContextSource {
                        $manager = $parent->getModuleManager();
                        if ( $manager === null ) {
                                $errorPath = implode( '+', array_slice( $parts, 0, $i ) );
-                               $this->dieUsage( "The module \"$errorPath\" has no submodules", 'badmodule' );
+                               $this->dieWithError( [ 'apierror-badmodule-nosubmodules', $errorPath ], 'badmodule' );
                        }
                        $module = $manager->getModule( $parts[$i] );
 
                        if ( $module === null ) {
                                $errorPath = $i ? implode( '+', array_slice( $parts, 0, $i ) ) : $parent->getModuleName();
-                               $this->dieUsage(
-                                       "The module \"$errorPath\" does not have a submodule \"{$parts[$i]}\"",
+                               $this->dieWithError(
+                                       [ 'apierror-badmodule-badsubmodule', $errorPath, wfEscapeWikiText( $parts[$i] ) ],
                                        'badmodule'
                                );
                        }
@@ -659,11 +676,18 @@ abstract class ApiBase extends ContextSource {
        /**
         * This method mangles parameter name based on the prefix supplied to the constructor.
         * Override this method to change parameter name during runtime
-        * @param string $paramName Parameter name
-        * @return string Prefixed parameter name
+        * @param string|string[] $paramName Parameter name
+        * @return string|string[] Prefixed parameter name
+        * @since 1.29 accepts an array of strings
         */
        public function encodeParamName( $paramName ) {
-               return $this->mModulePrefix . $paramName;
+               if ( is_array( $paramName ) ) {
+                       return array_map( function ( $name ) {
+                               return $this->mModulePrefix . $name;
+                       }, $paramName );
+               } else {
+                       return $this->mModulePrefix . $paramName;
+               }
        }
 
        /**
@@ -714,20 +738,32 @@ abstract class ApiBase extends ContextSource {
        public function requireOnlyOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
-               $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
                        [ $this, 'parameterNotEmpty' ] ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage(
-                               "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together',
-                               'invalidparammix' );
+                       $this->dieWithError( [
+                               'apierror-invalidparammix',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $intersection )
+                               ) ),
+                               count( $intersection ),
+                       ] );
                } elseif ( count( $intersection ) == 0 ) {
-                       $this->dieUsage(
-                               "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required',
-                               'missingparam'
-                       );
+                       $this->dieWithError( [
+                               'apierror-missingparam-one-of',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $required )
+                               ) ),
+                               count( $required ),
+                       ], 'missingparam' );
                }
        }
 
@@ -740,16 +776,21 @@ abstract class ApiBase extends ContextSource {
        public function requireMaxOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
-               $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
                        [ $this, 'parameterNotEmpty' ] ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage(
-                               "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together',
-                               'invalidparammix'
-                       );
+                       $this->dieWithError( [
+                               'apierror-invalidparammix',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $intersection )
+                               ) ),
+                               count( $intersection ),
+                       ] );
                }
        }
 
@@ -763,7 +804,6 @@ abstract class ApiBase extends ContextSource {
        public function requireAtLeastOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
-               $p = $this->getModulePrefix();
 
                $intersection = array_intersect(
                        array_keys( array_filter( $params, [ $this, 'parameterNotEmpty' ] ) ),
@@ -771,8 +811,16 @@ abstract class ApiBase extends ContextSource {
                );
 
                if ( count( $intersection ) == 0 ) {
-                       $this->dieUsage( "At least one of the parameters {$p}" .
-                               implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
+                       $this->dieWithError( [
+                               'apierror-missingparam-at-least-one-of',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $required )
+                               ) ),
+                               count( $required ),
+                       ], 'missingparam' );
                }
        }
 
@@ -801,10 +849,8 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( $badParams ) {
-                       $this->dieUsage(
-                               'The following parameters were found in the query string, but must be in the POST body: '
-                                       . join( ', ', $badParams ),
-                               'mustpostparams'
+                       $this->dieWithError(
+                               [ 'apierror-mustpostparams', join( ', ', $badParams ), count( $badParams ) ]
                        );
                }
        }
@@ -837,10 +883,10 @@ abstract class ApiBase extends ContextSource {
                if ( isset( $params['title'] ) ) {
                        $titleObj = Title::newFromText( $params['title'] );
                        if ( !$titleObj || $titleObj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                        }
                        if ( !$titleObj->canExist() ) {
-                               $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+                               $this->dieWithError( 'apierror-pagecannotexist' );
                        }
                        $pageObj = WikiPage::factory( $titleObj );
                        if ( $load !== false ) {
@@ -852,13 +898,41 @@ abstract class ApiBase extends ContextSource {
                        }
                        $pageObj = WikiPage::newFromID( $params['pageid'], $load );
                        if ( !$pageObj ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['pageid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['pageid'] ] );
                        }
                }
 
                return $pageObj;
        }
 
+       /**
+        * Get a Title object from a title or pageid param, if possible.
+        * Can die, if no param is set or if the title or page id is not valid.
+        *
+        * @since 1.29
+        * @param array $params
+        * @return Title
+        */
+       public function getTitleFromTitleOrPageId( $params ) {
+               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+               $titleObj = null;
+               if ( isset( $params['title'] ) ) {
+                       $titleObj = Title::newFromText( $params['title'] );
+                       if ( !$titleObj || $titleObj->isExternal() ) {
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
+                       }
+                       return $titleObj;
+               } elseif ( isset( $params['pageid'] ) ) {
+                       $titleObj = Title::newFromID( $params['pageid'] );
+                       if ( !$titleObj ) {
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['pageid'] ] );
+                       }
+               }
+
+               return $titleObj;
+       }
+
        /**
         * Return true if we're to watch the page, false if not, null if no change.
         * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
@@ -913,40 +987,41 @@ abstract class ApiBase extends ContextSource {
                // Some classes may decide to change parameter names
                $encParamName = $this->encodeParamName( $paramName );
 
+               // Shorthand
                if ( !is_array( $paramSettings ) ) {
-                       $default = $paramSettings;
-                       $multi = false;
-                       $type = gettype( $paramSettings );
-                       $dupes = false;
-                       $deprecated = false;
-                       $required = false;
-               } else {
-                       $default = isset( $paramSettings[self::PARAM_DFLT] )
-                               ? $paramSettings[self::PARAM_DFLT]
-                               : null;
-                       $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
-                               ? $paramSettings[self::PARAM_ISMULTI]
-                               : false;
-                       $type = isset( $paramSettings[self::PARAM_TYPE] )
-                               ? $paramSettings[self::PARAM_TYPE]
-                               : null;
-                       $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
-                               ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
-                               : false;
-                       $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
-                               ? $paramSettings[self::PARAM_DEPRECATED]
-                               : false;
-                       $required = isset( $paramSettings[self::PARAM_REQUIRED] )
-                               ? $paramSettings[self::PARAM_REQUIRED]
-                               : false;
-
-                       // When type is not given, and no choices, the type is the same as $default
-                       if ( !isset( $type ) ) {
-                               if ( isset( $default ) ) {
-                                       $type = gettype( $default );
-                               } else {
-                                       $type = 'NULL'; // allow everything
-                               }
+                       $paramSettings = [
+                               self::PARAM_DFLT => $paramSettings,
+                       ];
+               }
+
+               $default = isset( $paramSettings[self::PARAM_DFLT] )
+                       ? $paramSettings[self::PARAM_DFLT]
+                       : null;
+               $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
+                       ? $paramSettings[self::PARAM_ISMULTI]
+                       : false;
+               $type = isset( $paramSettings[self::PARAM_TYPE] )
+                       ? $paramSettings[self::PARAM_TYPE]
+                       : null;
+               $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
+                       ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
+                       : false;
+               $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
+                       ? $paramSettings[self::PARAM_DEPRECATED]
+                       : false;
+               $required = isset( $paramSettings[self::PARAM_REQUIRED] )
+                       ? $paramSettings[self::PARAM_REQUIRED]
+                       : false;
+               $allowAll = isset( $paramSettings[self::PARAM_ALL] )
+                       ? $paramSettings[self::PARAM_ALL]
+                       : false;
+
+               // When type is not given, and no choices, the type is the same as $default
+               if ( !isset( $type ) ) {
+                       if ( isset( $default ) ) {
+                               $type = gettype( $default );
+                       } else {
+                               $type = 'NULL'; // allow everything
                        }
                }
 
@@ -979,10 +1054,8 @@ abstract class ApiBase extends ContextSource {
                                // accidentally uploaded as a field fails spectacularly)
                                $value = $this->getMain()->getRequest()->unsetVal( $encParamName );
                                if ( $value !== null ) {
-                                       $this->dieUsage(
-                                               "File upload param $encParamName is not a file upload; " .
-                                                       'be sure to use multipart/form-data for your POST and include ' .
-                                                       'a filename in the Content-Disposition header.',
+                                       $this->dieWithError(
+                                               [ 'apierror-badupload', $encParamName ],
                                                "badupload_{$encParamName}"
                                        );
                                }
@@ -992,6 +1065,14 @@ abstract class ApiBase extends ContextSource {
 
                        if ( isset( $value ) && $type == 'namespace' ) {
                                $type = MWNamespace::getValidNamespaces();
+                               if ( isset( $paramSettings[self::PARAM_EXTRA_NAMESPACES] ) &&
+                                       is_array( $paramSettings[self::PARAM_EXTRA_NAMESPACES] )
+                               ) {
+                                       $type = array_merge( $type, $paramSettings[self::PARAM_EXTRA_NAMESPACES] );
+                               }
+                               // By default, namespace parameters allow ALL_DEFAULT_STRING to be used to specify
+                               // all namespaces.
+                               $allowAll = true;
                        }
                        if ( isset( $value ) && $type == 'submodule' ) {
                                if ( isset( $paramSettings[self::PARAM_SUBMODULE_MAP] ) ) {
@@ -1014,10 +1095,7 @@ abstract class ApiBase extends ContextSource {
                                        // done by WebRequest for $_GET. Let's call that a feature.
                                        $value = join( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) );
                                } else {
-                                       $this->dieUsage(
-                                               "U+001F multi-value separation may only be used for multi-valued parameters.",
-                                               'badvalue_notmultivalue'
-                                       );
+                                       $this->dieWithError( 'apierror-badvalue-notmultivalue', 'badvalue_notmultivalue' );
                                }
                        }
 
@@ -1027,12 +1105,19 @@ abstract class ApiBase extends ContextSource {
                        }
                }
 
+               $allSpecifier = ( is_string( $allowAll ) ? $allowAll : self::ALL_DEFAULT_STRING );
+               if ( $allowAll && $multi && is_array( $type ) && in_array( $allSpecifier, $type, true ) ) {
+                       ApiBase::dieDebug(
+                               __METHOD__,
+                               "For param $encParamName, PARAM_ALL collides with a possible value" );
+               }
                if ( isset( $value ) && ( $multi || is_array( $type ) ) ) {
                        $value = $this->parseMultiValue(
                                $encParamName,
                                $value,
                                $multi,
-                               is_array( $type ) ? $type : null
+                               is_array( $type ) ? $type : null,
+                               $allowAll ? $allSpecifier : null
                        );
                }
 
@@ -1047,7 +1132,7 @@ abstract class ApiBase extends ContextSource {
                                        case 'text':
                                        case 'password':
                                                if ( $required && $value === '' ) {
-                                                       $this->dieUsageMsg( [ 'missingparam', $paramName ] );
+                                                       $this->dieWithError( [ 'apierror-missingparam', $paramName ] );
                                                }
                                                break;
                                        case 'integer': // Force everything using intval() and optionally validate limits
@@ -1150,8 +1235,6 @@ abstract class ApiBase extends ContextSource {
 
                        // Set a warning if a deprecated parameter has been passed
                        if ( $deprecated && $value !== false ) {
-                               $this->setWarning( "The $encParamName parameter has been deprecated." );
-
                                $feature = $encParamName;
                                $m = $this;
                                while ( !$m->isMain() ) {
@@ -1161,10 +1244,10 @@ abstract class ApiBase extends ContextSource {
                                        $feature = "{$param}={$name}&{$feature}";
                                        $m = $p;
                                }
-                               $this->logFeatureUsage( $feature );
+                               $this->addDeprecation( [ 'apiwarn-deprecation-parameter', $encParamName ], $feature );
                        }
                } elseif ( $required ) {
-                       $this->dieUsageMsg( [ 'missingparam', $paramName ] );
+                       $this->dieWithError( [ 'apierror-missingparam', $paramName ] );
                }
 
                return $value;
@@ -1179,11 +1262,7 @@ abstract class ApiBase extends ContextSource {
         */
        protected function handleParamNormalization( $paramName, $value, $rawValue ) {
                $encParamName = $this->encodeParamName( $paramName );
-               $this->setWarning(
-                       "The value passed for '$encParamName' contains invalid or non-normalized data. "
-                       . 'Textual data should be valid, NFC-normalized Unicode without '
-                       . 'C0 control characters other than HT (\\t), LF (\\n), and CR (\\r).'
-               );
+               $this->addWarning( [ 'apiwarn-badutf8', $encParamName ] );
        }
 
        /**
@@ -1215,9 +1294,13 @@ abstract class ApiBase extends ContextSource {
         *  separated by '|'?
         * @param string[]|null $allowedValues An array of values to check against. If
         *  null, all values are accepted.
+        * @param string|null $allSpecifier String to use to specify all allowed values, or null
+        *  if this behavior should not be allowed
         * @return string|string[] (allowMultiple ? an_array_of_values : a_single_value)
         */
-       protected function parseMultiValue( $valueName, $value, $allowMultiple, $allowedValues ) {
+       protected function parseMultiValue( $valueName, $value, $allowMultiple, $allowedValues,
+               $allSpecifier = null
+       ) {
                if ( ( trim( $value ) === '' || trim( $value ) === "\x1f" ) && $allowMultiple ) {
                        return [];
                }
@@ -1229,10 +1312,17 @@ abstract class ApiBase extends ContextSource {
                        ? self::LIMIT_SML2
                        : self::LIMIT_SML1;
 
+               if ( $allowMultiple && is_array( $allowedValues ) && $allSpecifier &&
+                       count( $valuesList ) === 1 && $valuesList[0] === $allSpecifier
+               ) {
+                       return $allowedValues;
+               }
+
                if ( self::truncateArray( $valuesList, $sizeLimit ) ) {
-                       $this->logFeatureUsage( "too-many-$valueName-for-{$this->getModulePath()}" );
-                       $this->setWarning( "Too many values supplied for parameter '$valueName': " .
-                               "the limit is $sizeLimit" );
+                       $this->addDeprecation(
+                               [ 'apiwarn-toomanyvalues', $valueName, $sizeLimit ],
+                               "too-many-$valueName-for-{$this->getModulePath()}"
+                       );
                }
 
                if ( !$allowMultiple && count( $valuesList ) != 1 ) {
@@ -1241,26 +1331,38 @@ abstract class ApiBase extends ContextSource {
                                return $value;
                        }
 
-                       $possibleValues = is_array( $allowedValues )
-                               ? "of '" . implode( "', '", $allowedValues ) . "'"
-                               : '';
-                       $this->dieUsage(
-                               "Only one $possibleValues is allowed for parameter '$valueName'",
-                               "multival_$valueName"
-                       );
+                       if ( is_array( $allowedValues ) ) {
+                               $values = array_map( function ( $v ) {
+                                       return '<kbd>' . wfEscapeWikiText( $v ) . '</kbd>';
+                               }, $allowedValues );
+                               $this->dieWithError( [
+                                       'apierror-multival-only-one-of',
+                                       $valueName,
+                                       Message::listParam( $values ),
+                                       count( $values ),
+                               ], "multival_$valueName" );
+                       } else {
+                               $this->dieWithError( [
+                                       'apierror-multival-only-one',
+                                       $valueName,
+                               ], "multival_$valueName" );
+                       }
                }
 
                if ( is_array( $allowedValues ) ) {
                        // Check for unknown values
-                       $unknown = array_diff( $valuesList, $allowedValues );
+                       $unknown = array_map( 'wfEscapeWikiText', array_diff( $valuesList, $allowedValues ) );
                        if ( count( $unknown ) ) {
                                if ( $allowMultiple ) {
-                                       $s = count( $unknown ) > 1 ? 's' : '';
-                                       $vals = implode( ', ', $unknown );
-                                       $this->setWarning( "Unrecognized value$s for parameter '$valueName': $vals" );
+                                       $this->addWarning( [
+                                               'apiwarn-unrecognizedvalues',
+                                               $valueName,
+                                               Message::listParam( $unknown, 'comma' ),
+                                               count( $unknown ),
+                                       ] );
                                } else {
-                                       $this->dieUsage(
-                                               "Unrecognized value for parameter '$valueName': {$valuesList[0]}",
+                                       $this->dieWithError(
+                                               [ 'apierror-unrecognizedvalue', $valueName, wfEscapeWikiText( $valuesList[0] ) ],
                                                "unknown_$valueName"
                                        );
                                }
@@ -1286,7 +1388,12 @@ abstract class ApiBase extends ContextSource {
                $enforceLimits = false
        ) {
                if ( !is_null( $min ) && $value < $min ) {
-                       $msg = $this->encodeParamName( $paramName ) . " may not be less than $min (set to $value)";
+                       $msg = ApiMessage::create(
+                               [ 'apierror-integeroutofrange-belowminimum',
+                                       $this->encodeParamName( $paramName ), $min, $value ],
+                               'integeroutofrange',
+                               [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
+                       );
                        $this->warnOrDie( $msg, $enforceLimits );
                        $value = $min;
                }
@@ -1302,13 +1409,22 @@ abstract class ApiBase extends ContextSource {
                if ( !is_null( $max ) && $value > $max ) {
                        if ( !is_null( $botMax ) && $this->getMain()->canApiHighLimits() ) {
                                if ( $value > $botMax ) {
-                                       $msg = $this->encodeParamName( $paramName ) .
-                                               " may not be over $botMax (set to $value) for bots or sysops";
+                                       $msg = ApiMessage::create(
+                                               [ 'apierror-integeroutofrange-abovebotmax',
+                                                       $this->encodeParamName( $paramName ), $botMax, $value ],
+                                               'integeroutofrange',
+                                               [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
+                                       );
                                        $this->warnOrDie( $msg, $enforceLimits );
                                        $value = $botMax;
                                }
                        } else {
-                               $msg = $this->encodeParamName( $paramName ) . " may not be over $max (set to $value) for users";
+                               $msg = ApiMessage::create(
+                                       [ 'apierror-integeroutofrange-abovemax',
+                                               $this->encodeParamName( $paramName ), $max, $value ],
+                                       'integeroutofrange',
+                                       [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
+                               );
                                $this->warnOrDie( $msg, $enforceLimits );
                                $value = $max;
                        }
@@ -1326,11 +1442,9 @@ abstract class ApiBase extends ContextSource {
                // (wfTimestamp() also accepts various non-strings and the string of 14
                // ASCII NUL bytes, but those can't get here)
                if ( !$value ) {
-                       $this->logFeatureUsage( 'unclear-"now"-timestamp' );
-                       $this->setWarning(
-                               "Passing '$value' for timestamp parameter $encParamName has been deprecated." .
-                                       ' If for some reason you need to explicitly specify the current time without' .
-                                       ' calculating it client-side, use "now".'
+                       $this->addDeprecation(
+                               [ 'apiwarn-unclearnowtimestamp', $encParamName, wfEscapeWikiText( $value ) ],
+                               'unclear-"now"-timestamp'
                        );
                        return wfTimestamp( TS_MW );
                }
@@ -1342,8 +1456,8 @@ abstract class ApiBase extends ContextSource {
 
                $unixTimestamp = wfTimestamp( TS_UNIX, $value );
                if ( $unixTimestamp === false ) {
-                       $this->dieUsage(
-                               "Invalid value '$value' for timestamp parameter $encParamName",
+                       $this->dieWithError(
+                               [ 'apierror-badtimestamp', $encParamName, wfEscapeWikiText( $value ) ],
                                "badtimestamp_{$encParamName}"
                        );
                }
@@ -1398,8 +1512,8 @@ abstract class ApiBase extends ContextSource {
        private function validateUser( $value, $encParamName ) {
                $title = Title::makeTitleSafe( NS_USER, $value );
                if ( $title === null || $title->hasFragment() ) {
-                       $this->dieUsage(
-                               "Invalid value '$value' for user parameter $encParamName",
+                       $this->dieWithError(
+                               [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $value ) ],
                                "baduser_{$encParamName}"
                        );
                }
@@ -1455,22 +1569,19 @@ abstract class ApiBase extends ContextSource {
                if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
                        $user = User::newFromName( $params['owner'], false );
                        if ( !( $user && $user->getId() ) ) {
-                               $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
+                               $this->dieWithError(
+                                       [ 'nosuchusershort', wfEscapeWikiText( $params['owner'] ) ], 'bad_wlowner'
+                               );
                        }
                        $token = $user->getOption( 'watchlisttoken' );
                        if ( $token == '' || !hash_equals( $token, $params['token'] ) ) {
-                               $this->dieUsage(
-                                       'Incorrect watchlist token provided -- please set a correct token in Special:Preferences',
-                                       'bad_wltoken'
-                               );
+                               $this->dieWithError( 'apierror-bad-watchlist-token', 'bad_wltoken' );
                        }
                } else {
                        if ( !$this->getUser()->isLoggedIn() ) {
-                               $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
-                       }
-                       if ( !$this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
-                               $this->dieUsage( 'You don\'t have permission to view your watchlist', 'permissiondenied' );
+                               $this->dieWithError( 'watchlistanontext', 'notloggedin' );
                        }
+                       $this->checkUserRightsAny( 'viewmywatchlist' );
                        $user = $this->getUser();
                }
 
@@ -1526,6 +1637,45 @@ abstract class ApiBase extends ContextSource {
                return $msg;
        }
 
+       /**
+        * Turn an array of message keys or key+param arrays into a Status
+        * @since 1.29
+        * @param array $errors
+        * @param User|null $user
+        * @return Status
+        */
+       public function errorArrayToStatus( array $errors, User $user = null ) {
+               if ( $user === null ) {
+                       $user = $this->getUser();
+               }
+
+               $status = Status::newGood();
+               foreach ( $errors as $error ) {
+                       if ( is_array( $error ) && $error[0] === 'blockedtext' && $user->getBlock() ) {
+                               $status->fatal( ApiMessage::create(
+                                       'apierror-blocked',
+                                       'blocked',
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
+                       } elseif ( is_array( $error ) && $error[0] === 'autoblockedtext' && $user->getBlock() ) {
+                               $status->fatal( ApiMessage::create(
+                                       'apierror-autoblocked',
+                                       'autoblocked',
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
+                       } elseif ( is_array( $error ) && $error[0] === 'systemblockedtext' && $user->getBlock() ) {
+                               $status->fatal( ApiMessage::create(
+                                       'apierror-systemblocked',
+                                       'blocked',
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
+                       } else {
+                               call_user_func_array( [ $status, 'fatal' ], (array)$error );
+                       }
+               }
+               return $status;
+       }
+
        /**@}*/
 
        /************************************************************************//**
@@ -1534,745 +1684,253 @@ abstract class ApiBase extends ContextSource {
         */
 
        /**
-        * Set warning section for this module. Users should monitor this
-        * section to notice any changes in API. Multiple calls to this
-        * function will result in the warning messages being separated by
-        * newlines
-        * @param string $warning Warning message
+        * Add a warning for this module.
+        *
+        * Users should monitor this section to notice any changes in API. Multiple
+        * calls to this function will result in multiple warning messages.
+        *
+        * If $msg is not an ApiMessage, the message code will be derived from the
+        * message key by stripping any "apiwarn-" or "apierror-" prefix.
+        *
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addWarning()
+        * @param string|null $code See ApiErrorFormatter::addWarning()
+        * @param array|null $data See ApiErrorFormatter::addWarning()
         */
-       public function setWarning( $warning ) {
-               $msg = new ApiRawMessage( $warning, 'warning' );
-               $this->getErrorFormatter()->addWarning( $this->getModuleName(), $msg );
+       public function addWarning( $msg, $code = null, $data = null ) {
+               $this->getErrorFormatter()->addWarning( $this->getModulePath(), $msg, $code, $data );
        }
 
        /**
-        * Adds a warning to the output, else dies
+        * Add a deprecation warning for this module.
         *
-        * @param string $msg Message to show as a warning, or error message if dying
-        * @param bool $enforceLimits Whether this is an enforce (die)
-        */
-       private function warnOrDie( $msg, $enforceLimits = false ) {
-               if ( $enforceLimits ) {
-                       $this->dieUsage( $msg, 'integeroutofrange' );
+        * A combination of $this->addWarning() and $this->logFeatureUsage()
+        *
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addWarning()
+        * @param string|null $feature See ApiBase::logFeatureUsage()
+        * @param array|null $data See ApiErrorFormatter::addWarning()
+        */
+       public function addDeprecation( $msg, $feature, $data = [] ) {
+               $data = (array)$data;
+               if ( $feature !== null ) {
+                       $data['feature'] = $feature;
+                       $this->logFeatureUsage( $feature );
+               }
+               $this->addWarning( $msg, 'deprecation', $data );
+
+               // No real need to deduplicate here, ApiErrorFormatter does that for
+               // us (assuming the hook is deterministic).
+               $msgs = [ $this->msg( 'api-usage-mailinglist-ref' ) ];
+               Hooks::run( 'ApiDeprecationHelp', [ &$msgs ] );
+               if ( count( $msgs ) > 1 ) {
+                       $key = '$' . join( ' $', range( 1, count( $msgs ) ) );
+                       $msg = ( new RawMessage( $key ) )->params( $msgs );
+               } else {
+                       $msg = reset( $msgs );
                }
+               $this->getMain()->addWarning( $msg, 'deprecation-help' );
+       }
 
-               $this->setWarning( $msg );
+       /**
+        * Add an error for this module without aborting
+        *
+        * If $msg is not an ApiMessage, the message code will be derived from the
+        * message key by stripping any "apiwarn-" or "apierror-" prefix.
+        *
+        * @note If you want to abort processing, use self::dieWithError() instead.
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addError()
+        * @param string|null $code See ApiErrorFormatter::addError()
+        * @param array|null $data See ApiErrorFormatter::addError()
+        */
+       public function addError( $msg, $code = null, $data = null ) {
+               $this->getErrorFormatter()->addError( $this->getModulePath(), $msg, $code, $data );
        }
 
        /**
-        * Throw a UsageException, which will (if uncaught) call the main module's
-        * error handler and die with an error message.
+        * Add warnings and/or errors from a Status
         *
-        * @param string $description One-line human-readable description of the
-        *   error condition, e.g., "The API requires a valid action parameter"
-        * @param string $errorCode Brief, arbitrary, stable string to allow easy
-        *   automated identification of the error, e.g., 'unknown_action'
-        * @param int $httpRespCode HTTP response code
-        * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
-        * @throws UsageException always
+        * @note If you want to abort processing, use self::dieStatus() instead.
+        * @since 1.29
+        * @param StatusValue $status
+        * @param string[] $types 'warning' and/or 'error'
         */
-       public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
-               throw new UsageException(
-                       $description,
-                       $this->encodeParamName( $errorCode ),
-                       $httpRespCode,
-                       $extradata
+       public function addMessagesFromStatus( StatusValue $status, $types = [ 'warning', 'error' ] ) {
+               $this->getErrorFormatter()->addMessagesFromStatus( $this->getModulePath(), $status, $types );
+       }
+
+       /**
+        * Abort execution with an error
+        *
+        * If $msg is not an ApiMessage, the message code will be derived from the
+        * message key by stripping any "apiwarn-" or "apierror-" prefix.
+        *
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addError()
+        * @param string|null $code See ApiErrorFormatter::addError()
+        * @param array|null $data See ApiErrorFormatter::addError()
+        * @param int|null $httpCode HTTP error code to use
+        * @throws ApiUsageException always
+        */
+       public function dieWithError( $msg, $code = null, $data = null, $httpCode = null ) {
+               throw ApiUsageException::newWithMessage( $this, $msg, $code, $data, $httpCode );
+       }
+
+       /**
+        * Abort execution with an error derived from an exception
+        *
+        * @since 1.29
+        * @param Exception|Throwable $exception See ApiErrorFormatter::getMessageFromException()
+        * @param array $options See ApiErrorFormatter::getMessageFromException()
+        * @throws ApiUsageException always
+        */
+       public function dieWithException( $exception, array $options = [] ) {
+               $this->dieWithError(
+                       $this->getErrorFormatter()->getMessageFromException( $exception, $options )
                );
        }
 
        /**
-        * Throw a UsageException, which will (if uncaught) call the main module's
+        * Adds a warning to the output, else dies
+        *
+        * @param ApiMessage $msg Message to show as a warning, or error message if dying
+        * @param bool $enforceLimits Whether this is an enforce (die)
+        */
+       private function warnOrDie( ApiMessage $msg, $enforceLimits = false ) {
+               if ( $enforceLimits ) {
+                       $this->dieWithError( $msg );
+               } else {
+                       $this->addWarning( $msg );
+               }
+       }
+
+       /**
+        * Throw an ApiUsageException, which will (if uncaught) call the main module's
         * error handler and die with an error message including block info.
         *
         * @since 1.27
-        * @param Block $block The block used to generate the UsageException
-        * @throws UsageException always
+        * @param Block $block The block used to generate the ApiUsageException
+        * @throws ApiUsageException always
         */
        public function dieBlocked( Block $block ) {
                // Die using the appropriate message depending on block type
                if ( $block->getType() == Block::TYPE_AUTO ) {
-                       $this->dieUsage(
-                               'Your IP address has been blocked automatically, because it was used by a blocked user',
+                       $this->dieWithError(
+                               'apierror-autoblocked',
                                'autoblocked',
-                               0,
                                [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ]
                        );
                } else {
-                       $this->dieUsage(
-                               'You have been blocked from editing',
+                       $this->dieWithError(
+                               'apierror-blocked',
                                'blocked',
-                               0,
                                [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ]
                        );
                }
        }
 
        /**
-        * Get error (as code, string) from a Status object.
+        * Throw an ApiUsageException based on the Status object.
         *
-        * @since 1.23
-        * @param Status $status
-        * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
-        * @return array Array of code and error string
-        * @throws MWException
+        * @since 1.22
+        * @since 1.29 Accepts a StatusValue
+        * @param StatusValue $status
+        * @throws ApiUsageException always
         */
-       public function getErrorFromStatus( $status, &$extraData = null ) {
+       public function dieStatus( StatusValue $status ) {
                if ( $status->isGood() ) {
                        throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
                }
 
-               $errors = $status->getErrorsByType( 'error' );
-               if ( !$errors ) {
-                       // No errors? Assume the warnings should be treated as errors
-                       $errors = $status->getErrorsByType( 'warning' );
-               }
-               if ( !$errors ) {
-                       // Still no errors? Punt
-                       $errors = [ [ 'message' => 'unknownerror-nocode', 'params' => [] ] ];
-               }
-
-               // Cannot use dieUsageMsg() because extensions might return custom
-               // error messages.
-               if ( $errors[0]['message'] instanceof Message ) {
-                       $msg = $errors[0]['message'];
-                       if ( $msg instanceof IApiMessage ) {
-                               $extraData = $msg->getApiData();
-                               $code = $msg->getApiCode();
-                       } else {
-                               $code = $msg->getKey();
-                       }
-               } else {
-                       $code = $errors[0]['message'];
-                       $msg = wfMessage( $code, $errors[0]['params'] );
-               }
-               if ( isset( ApiBase::$messageMap[$code] ) ) {
-                       // Translate message to code, for backwards compatibility
-                       $code = ApiBase::$messageMap[$code]['code'];
-               }
-
-               return [ $code, $msg->inLanguage( 'en' )->useDatabase( false )->plain() ];
+               throw new ApiUsageException( $this, $status );
        }
 
-       /**
-        * Throw a UsageException based on the errors in the Status object.
-        *
-        * @since 1.22
-        * @param Status $status
-        * @throws UsageException always
-        */
-       public function dieStatus( $status ) {
-               $extraData = null;
-               list( $code, $msg ) = $this->getErrorFromStatus( $status, $extraData );
-               $this->dieUsage( $msg, $code, 0, $extraData );
-       }
-
-       // @codingStandardsIgnoreStart Allow long lines. Cannot split these.
-       /**
-        * Array that maps message keys to error messages. $1 and friends are replaced.
-        */
-       public static $messageMap = [
-               // This one MUST be present, or dieUsageMsg() will recurse infinitely
-               'unknownerror' => [ 'code' => 'unknownerror', 'info' => "Unknown error: \"\$1\"" ],
-               'unknownerror-nocode' => [ 'code' => 'unknownerror', 'info' => 'Unknown error' ],
-
-               // Messages from Title::getUserPermissionsErrors()
-               'ns-specialprotected' => [
-                       'code' => 'unsupportednamespace',
-                       'info' => "Pages in the Special namespace can't be edited"
-               ],
-               'protectedinterface' => [
-                       'code' => 'protectednamespace-interface',
-                       'info' => "You're not allowed to edit interface messages"
-               ],
-               'namespaceprotected' => [
-                       'code' => 'protectednamespace',
-                       'info' => "You're not allowed to edit pages in the \"\$1\" namespace"
-               ],
-               'customcssprotected' => [
-                       'code' => 'customcssprotected',
-                       'info' => "You're not allowed to edit custom CSS pages"
-               ],
-               'customjsprotected' => [
-                       'code' => 'customjsprotected',
-                       'info' => "You're not allowed to edit custom JavaScript pages"
-               ],
-               'cascadeprotected' => [
-                       'code' => 'cascadeprotected',
-                       'info' => "The page you're trying to edit is protected because it's included in a cascade-protected page"
-               ],
-               'protectedpagetext' => [
-                       'code' => 'protectedpage',
-                       'info' => "The \"\$1\" right is required to edit this page"
-               ],
-               'protect-cantedit' => [
-                       'code' => 'cantedit',
-                       'info' => "You can't protect this page because you can't edit it"
-               ],
-               'deleteprotected' => [
-                       'code' => 'cantedit',
-                       'info' => "You can't delete this page because it has been protected"
-               ],
-               'badaccess-group0' => [
-                       'code' => 'permissiondenied',
-                       'info' => 'Permission denied'
-               ], // Generic permission denied message
-               'badaccess-groups' => [
-                       'code' => 'permissiondenied',
-                       'info' => 'Permission denied'
-               ],
-               'titleprotected' => [
-                       'code' => 'protectedtitle',
-                       'info' => 'This title has been protected from creation'
-               ],
-               'nocreate-loggedin' => [
-                       'code' => 'cantcreate',
-                       'info' => "You don't have permission to create new pages"
-               ],
-               'nocreatetext' => [
-                       'code' => 'cantcreate-anon',
-                       'info' => "Anonymous users can't create new pages"
-               ],
-               'movenologintext' => [
-                       'code' => 'cantmove-anon',
-                       'info' => "Anonymous users can't move pages"
-               ],
-               'movenotallowed' => [
-                       'code' => 'cantmove',
-                       'info' => "You don't have permission to move pages"
-               ],
-               'confirmedittext' => [
-                       'code' => 'confirmemail',
-                       'info' => 'You must confirm your email address before you can edit'
-               ],
-               'blockedtext' => [
-                       'code' => 'blocked',
-                       'info' => 'You have been blocked from editing'
-               ],
-               'autoblockedtext' => [
-                       'code' => 'autoblocked',
-                       'info' => 'Your IP address has been blocked automatically, because it was used by a blocked user'
-               ],
-
-               // Miscellaneous interface messages
-               'actionthrottledtext' => [
-                       'code' => 'ratelimited',
-                       'info' => "You've exceeded your rate limit. Please wait some time and try again"
-               ],
-               'alreadyrolled' => [
-                       'code' => 'alreadyrolled',
-                       'info' => 'The page you tried to rollback was already rolled back'
-               ],
-               'cantrollback' => [
-                       'code' => 'onlyauthor',
-                       'info' => 'The page you tried to rollback only has one author'
-               ],
-               'readonlytext' => [
-                       'code' => 'readonly',
-                       'info' => 'The wiki is currently in read-only mode'
-               ],
-               'sessionfailure' => [
-                       'code' => 'badtoken',
-                       'info' => 'Invalid token' ],
-               'cannotdelete' => [
-                       'code' => 'cantdelete',
-                       'info' => "Couldn't delete \"\$1\". Maybe it was deleted already by someone else"
-               ],
-               'notanarticle' => [
-                       'code' => 'missingtitle',
-                       'info' => "The page you requested doesn't exist"
-               ],
-               'selfmove' => [ 'code' => 'selfmove', 'info' => "Can't move a page to itself"
-               ],
-               'immobile_namespace' => [
-                       'code' => 'immobilenamespace',
-                       'info' => 'You tried to move pages from or to a namespace that is protected from moving'
-               ],
-               'articleexists' => [
-                       'code' => 'articleexists',
-                       'info' => 'The destination article already exists and is not a redirect to the source article'
-               ],
-               'protectedpage' => [
-                       'code' => 'protectedpage',
-                       'info' => "You don't have permission to perform this move"
-               ],
-               'hookaborted' => [
-                       'code' => 'hookaborted',
-                       'info' => 'The modification you tried to make was aborted by an extension hook'
-               ],
-               'cantmove-titleprotected' => [
-                       'code' => 'protectedtitle',
-                       'info' => 'The destination article has been protected from creation'
-               ],
-               'imagenocrossnamespace' => [
-                       'code' => 'nonfilenamespace',
-                       'info' => "Can't move a file to a non-file namespace"
-               ],
-               'imagetypemismatch' => [
-                       'code' => 'filetypemismatch',
-                       'info' => "The new file extension doesn't match its type"
-               ],
-               // 'badarticleerror' => shouldn't happen
-               // 'badtitletext' => shouldn't happen
-               'ip_range_invalid' => [ 'code' => 'invalidrange', 'info' => 'Invalid IP range' ],
-               'range_block_disabled' => [
-                       'code' => 'rangedisabled',
-                       'info' => 'Blocking IP ranges has been disabled'
-               ],
-               'nosuchusershort' => [
-                       'code' => 'nosuchuser',
-                       'info' => "The user you specified doesn't exist"
-               ],
-               'badipaddress' => [ 'code' => 'invalidip', 'info' => 'Invalid IP address specified' ],
-               'ipb_expiry_invalid' => [ 'code' => 'invalidexpiry', 'info' => 'Invalid expiry time' ],
-               'ipb_already_blocked' => [
-                       'code' => 'alreadyblocked',
-                       'info' => 'The user you tried to block was already blocked'
-               ],
-               'ipb_blocked_as_range' => [
-                       'code' => 'blockedasrange',
-                       'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP individually, but you can unblock the range as a whole."
-               ],
-               'ipb_cant_unblock' => [
-                       'code' => 'cantunblock',
-                       'info' => 'The block you specified was not found. It may have been unblocked already'
-               ],
-               'mailnologin' => [
-                       'code' => 'cantsend',
-                       'info' => 'You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email'
-               ],
-               'ipbblocked' => [
-                       'code' => 'ipbblocked',
-                       'info' => 'You cannot block or unblock users while you are yourself blocked'
-               ],
-               'ipbnounblockself' => [
-                       'code' => 'ipbnounblockself',
-                       'info' => 'You are not allowed to unblock yourself'
-               ],
-               'usermaildisabled' => [
-                       'code' => 'usermaildisabled',
-                       'info' => 'User email has been disabled'
-               ],
-               'blockedemailuser' => [
-                       'code' => 'blockedfrommail',
-                       'info' => 'You have been blocked from sending email'
-               ],
-               'notarget' => [
-                       'code' => 'notarget',
-                       'info' => 'You have not specified a valid target for this action'
-               ],
-               'noemail' => [
-                       'code' => 'noemail',
-                       'info' => 'The user has not specified a valid email address, or has chosen not to receive email from other users'
-               ],
-               'rcpatroldisabled' => [
-                       'code' => 'patroldisabled',
-                       'info' => 'Patrolling is disabled on this wiki'
-               ],
-               'markedaspatrollederror-noautopatrol' => [
-                       'code' => 'noautopatrol',
-                       'info' => "You don't have permission to patrol your own changes"
-               ],
-               'delete-toobig' => [
-                       'code' => 'bigdelete',
-                       'info' => "You can't delete this page because it has more than \$1 revisions"
-               ],
-               'movenotallowedfile' => [
-                       'code' => 'cantmovefile',
-                       'info' => "You don't have permission to move files"
-               ],
-               'userrights-no-interwiki' => [
-                       'code' => 'nointerwikiuserrights',
-                       'info' => "You don't have permission to change user rights on other wikis"
-               ],
-               'userrights-nodatabase' => [
-                       'code' => 'nosuchdatabase',
-                       'info' => "Database \"\$1\" does not exist or is not local"
-               ],
-               'nouserspecified' => [ 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ],
-               'noname' => [ 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ],
-               'summaryrequired' => [ 'code' => 'summaryrequired', 'info' => 'Summary required' ],
-               'import-rootpage-invalid' => [
-                       'code' => 'import-rootpage-invalid',
-                       'info' => 'Root page is an invalid title'
-               ],
-               'import-rootpage-nosubpage' => [
-                       'code' => 'import-rootpage-nosubpage',
-                       'info' => 'Namespace "$1" of the root page does not allow subpages'
-               ],
-
-               // API-specific messages
-               'readrequired' => [
-                       'code' => 'readapidenied',
-                       'info' => 'You need read permission to use this module'
-               ],
-               'writedisabled' => [
-                       'code' => 'noapiwrite',
-                       'info' => "Editing of this wiki through the API is disabled. Make sure the \$wgEnableWriteAPI=true; statement is included in the wiki's LocalSettings.php file"
-               ],
-               'writerequired' => [
-                       'code' => 'writeapidenied',
-                       'info' => "You're not allowed to edit this wiki through the API"
-               ],
-               'missingparam' => [ 'code' => 'no$1', 'info' => "The \$1 parameter must be set" ],
-               'invalidtitle' => [ 'code' => 'invalidtitle', 'info' => "Bad title \"\$1\"" ],
-               'nosuchpageid' => [ 'code' => 'nosuchpageid', 'info' => "There is no page with ID \$1" ],
-               'nosuchrevid' => [ 'code' => 'nosuchrevid', 'info' => "There is no revision with ID \$1" ],
-               'nosuchuser' => [ 'code' => 'nosuchuser', 'info' => "User \"\$1\" doesn't exist" ],
-               'invaliduser' => [ 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ],
-               'invalidexpiry' => [ 'code' => 'invalidexpiry', 'info' => "Invalid expiry time \"\$1\"" ],
-               'pastexpiry' => [ 'code' => 'pastexpiry', 'info' => "Expiry time \"\$1\" is in the past" ],
-               'create-titleexists' => [
-                       'code' => 'create-titleexists',
-                       'info' => "Existing titles can't be protected with 'create'"
-               ],
-               'missingtitle-createonly' => [
-                       'code' => 'missingtitle-createonly',
-                       'info' => "Missing titles can only be protected with 'create'"
-               ],
-               'cantblock' => [ 'code' => 'cantblock',
-                       'info' => "You don't have permission to block users"
-               ],
-               'canthide' => [
-                       'code' => 'canthide',
-                       'info' => "You don't have permission to hide user names from the block log"
-               ],
-               'cantblock-email' => [
-                       'code' => 'cantblock-email',
-                       'info' => "You don't have permission to block users from sending email through the wiki"
-               ],
-               'unblock-notarget' => [
-                       'code' => 'notarget',
-                       'info' => 'Either the id or the user parameter must be set'
-               ],
-               'unblock-idanduser' => [
-                       'code' => 'idanduser',
-                       'info' => "The id and user parameters can't be used together"
-               ],
-               'cantunblock' => [
-                       'code' => 'permissiondenied',
-                       'info' => "You don't have permission to unblock users"
-               ],
-               'cannotundelete' => [
-                       'code' => 'cantundelete',
-                       'info' => "Couldn't undelete: the requested revisions may not exist, or may have been undeleted already"
-               ],
-               'permdenied-undelete' => [
-                       'code' => 'permissiondenied',
-                       'info' => "You don't have permission to restore deleted revisions"
-               ],
-               'createonly-exists' => [
-                       'code' => 'articleexists',
-                       'info' => 'The article you tried to create has been created already'
-               ],
-               'nocreate-missing' => [
-                       'code' => 'missingtitle',
-                       'info' => "The article you tried to edit doesn't exist"
-               ],
-               'cantchangecontentmodel' => [
-                       'code' => 'cantchangecontentmodel',
-                       'info' => "You don't have permission to change the content model of a page"
-               ],
-               'nosuchrcid' => [
-                       'code' => 'nosuchrcid',
-                       'info' => "There is no change with rcid \"\$1\""
-               ],
-               'nosuchlogid' => [
-                       'code' => 'nosuchlogid',
-                       'info' => "There is no log entry with ID \"\$1\""
-               ],
-               'protect-invalidaction' => [
-                       'code' => 'protect-invalidaction',
-                       'info' => "Invalid protection type \"\$1\""
-               ],
-               'protect-invalidlevel' => [
-                       'code' => 'protect-invalidlevel',
-                       'info' => "Invalid protection level \"\$1\""
-               ],
-               'toofewexpiries' => [
-                       'code' => 'toofewexpiries',
-                       'info' => "\$1 expiry timestamps were provided where \$2 were needed"
-               ],
-               'cantimport' => [
-                       'code' => 'cantimport',
-                       'info' => "You don't have permission to import pages"
-               ],
-               'cantimport-upload' => [
-                       'code' => 'cantimport-upload',
-                       'info' => "You don't have permission to import uploaded pages"
-               ],
-               'importnofile' => [ 'code' => 'nofile', 'info' => "You didn't upload a file" ],
-               'importuploaderrorsize' => [
-                       'code' => 'filetoobig',
-                       'info' => 'The file you uploaded is bigger than the maximum upload size'
-               ],
-               'importuploaderrorpartial' => [
-                       'code' => 'partialupload',
-                       'info' => 'The file was only partially uploaded'
-               ],
-               'importuploaderrortemp' => [
-                       'code' => 'notempdir',
-                       'info' => 'The temporary upload directory is missing'
-               ],
-               'importcantopen' => [
-                       'code' => 'cantopenfile',
-                       'info' => "Couldn't open the uploaded file"
-               ],
-               'import-noarticle' => [
-                       'code' => 'badinterwiki',
-                       'info' => 'Invalid interwiki title specified'
-               ],
-               'importbadinterwiki' => [
-                       'code' => 'badinterwiki',
-                       'info' => 'Invalid interwiki title specified'
-               ],
-               'import-unknownerror' => [
-                       'code' => 'import-unknownerror',
-                       'info' => "Unknown error on import: \"\$1\""
-               ],
-               'cantoverwrite-sharedfile' => [
-                       'code' => 'cantoverwrite-sharedfile',
-                       'info' => 'The target file exists on a shared repository and you do not have permission to override it'
-               ],
-               'sharedfile-exists' => [
-                       'code' => 'fileexists-sharedrepo-perm',
-                       'info' => 'The target file exists on a shared repository. Use the ignorewarnings parameter to override it.'
-               ],
-               'mustbeposted' => [
-                       'code' => 'mustbeposted',
-                       'info' => "The \$1 module requires a POST request"
-               ],
-               'show' => [
-                       'code' => 'show',
-                       'info' => 'Incorrect parameter - mutually exclusive values may not be supplied'
-               ],
-               'specialpage-cantexecute' => [
-                       'code' => 'specialpage-cantexecute',
-                       'info' => "You don't have permission to view the results of this special page"
-               ],
-               'invalidoldimage' => [
-                       'code' => 'invalidoldimage',
-                       'info' => 'The oldimage parameter has invalid format'
-               ],
-               'nodeleteablefile' => [
-                       'code' => 'nodeleteablefile',
-                       'info' => 'No such old version of the file'
-               ],
-               'fileexists-forbidden' => [
-                       'code' => 'fileexists-forbidden',
-                       'info' => 'A file with name "$1" already exists, and cannot be overwritten.'
-               ],
-               'fileexists-shared-forbidden' => [
-                       'code' => 'fileexists-shared-forbidden',
-                       'info' => 'A file with name "$1" already exists in the shared file repository, and cannot be overwritten.'
-               ],
-               'filerevert-badversion' => [
-                       'code' => 'filerevert-badversion',
-                       'info' => 'There is no previous local version of this file with the provided timestamp.'
-               ],
-
-               // ApiEditPage messages
-               'noimageredirect-anon' => [
-                       'code' => 'noimageredirect-anon',
-                       'info' => "Anonymous users can't create image redirects"
-               ],
-               'noimageredirect-logged' => [
-                       'code' => 'noimageredirect',
-                       'info' => "You don't have permission to create image redirects"
-               ],
-               'spamdetected' => [
-                       'code' => 'spamdetected',
-                       'info' => "Your edit was refused because it contained a spam fragment: \"\$1\""
-               ],
-               'contenttoobig' => [
-                       'code' => 'contenttoobig',
-                       'info' => "The content you supplied exceeds the article size limit of \$1 kilobytes"
-               ],
-               'noedit-anon' => [ 'code' => 'noedit-anon', 'info' => "Anonymous users can't edit pages" ],
-               'noedit' => [ 'code' => 'noedit', 'info' => "You don't have permission to edit pages" ],
-               'wasdeleted' => [
-                       'code' => 'pagedeleted',
-                       'info' => 'The page has been deleted since you fetched its timestamp'
-               ],
-               'blankpage' => [
-                       'code' => 'emptypage',
-                       'info' => 'Creating new, empty pages is not allowed'
-               ],
-               'editconflict' => [ 'code' => 'editconflict', 'info' => 'Edit conflict detected' ],
-               'hashcheckfailed' => [ 'code' => 'badmd5', 'info' => 'The supplied MD5 hash was incorrect' ],
-               'missingtext' => [
-                       'code' => 'notext',
-                       'info' => 'One of the text, appendtext, prependtext and undo parameters must be set'
-               ],
-               'emptynewsection' => [
-                       'code' => 'emptynewsection',
-                       'info' => 'Creating empty new sections is not possible.'
-               ],
-               'revwrongpage' => [
-                       'code' => 'revwrongpage',
-                       'info' => "r\$1 is not a revision of \"\$2\""
-               ],
-               'undo-failure' => [
-                       'code' => 'undofailure',
-                       'info' => 'Undo failed due to conflicting intermediate edits'
-               ],
-               'content-not-allowed-here' => [
-                       'code' => 'contentnotallowedhere',
-                       'info' => 'Content model "$1" is not allowed at title "$2"'
-               ],
-
-               // Messages from WikiPage::doEit(]
-               'edit-hook-aborted' => [
-                       'code' => 'edit-hook-aborted',
-                       'info' => 'Your edit was aborted by an ArticleSave hook'
-               ],
-               'edit-gone-missing' => [
-                       'code' => 'edit-gone-missing',
-                       'info' => "The page you tried to edit doesn't seem to exist anymore"
-               ],
-               'edit-conflict' => [ 'code' => 'editconflict', 'info' => 'Edit conflict detected' ],
-               'edit-already-exists' => [
-                       'code' => 'edit-already-exists',
-                       'info' => 'It seems the page you tried to create already exist'
-               ],
-
-               // uploadMsgs
-               'invalid-file-key' => [ 'code' => 'invalid-file-key', 'info' => 'Not a valid file key' ],
-               'nouploadmodule' => [ 'code' => 'nouploadmodule', 'info' => 'No upload module set' ],
-               'uploaddisabled' => [
-                       'code' => 'uploaddisabled',
-                       'info' => 'Uploads are not enabled. Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true'
-               ],
-               'copyuploaddisabled' => [
-                       'code' => 'copyuploaddisabled',
-                       'info' => 'Uploads by URL is not enabled. Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.'
-               ],
-               'copyuploadbaddomain' => [
-                       'code' => 'copyuploadbaddomain',
-                       'info' => 'Uploads by URL are not allowed from this domain.'
-               ],
-               'copyuploadbadurl' => [
-                       'code' => 'copyuploadbadurl',
-                       'info' => 'Upload not allowed from this URL.'
-               ],
-
-               'filename-tooshort' => [
-                       'code' => 'filename-tooshort',
-                       'info' => 'The filename is too short'
-               ],
-               'filename-toolong' => [ 'code' => 'filename-toolong', 'info' => 'The filename is too long' ],
-               'illegal-filename' => [
-                       'code' => 'illegal-filename',
-                       'info' => 'The filename is not allowed'
-               ],
-               'filetype-missing' => [
-                       'code' => 'filetype-missing',
-                       'info' => 'The file is missing an extension'
-               ],
-
-               'mustbeloggedin' => [ 'code' => 'mustbeloggedin', 'info' => 'You must be logged in to $1.' ]
-       ];
-       // @codingStandardsIgnoreEnd
-
        /**
         * Helper function for readonly errors
         *
-        * @throws UsageException always
+        * @throws ApiUsageException always
         */
        public function dieReadOnly() {
-               $parsed = $this->parseMsg( [ 'readonlytext' ] );
-               $this->dieUsage( $parsed['info'], $parsed['code'], /* http error */ 0,
-                       [ 'readonlyreason' => wfReadOnlyReason() ] );
+               $this->dieWithError(
+                       'apierror-readonly',
+                       'readonly',
+                       [ 'readonlyreason' => wfReadOnlyReason() ]
+               );
        }
 
        /**
-        * Output the error message related to a certain array
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @throws UsageException always
+        * Helper function for permission-denied errors
+        * @since 1.29
+        * @param string|string[] $rights
+        * @param User|null $user
+        * @throws ApiUsageException if the user doesn't have any of the rights.
+        *  The error message is based on $rights[0].
         */
-       public function dieUsageMsg( $error ) {
-               # most of the time we send a 1 element, so we might as well send it as
-               # a string and make this an array here.
-               if ( is_string( $error ) ) {
-                       $error = [ $error ];
+       public function checkUserRightsAny( $rights, $user = null ) {
+               if ( !$user ) {
+                       $user = $this->getUser();
+               }
+               $rights = (array)$rights;
+               if ( !call_user_func_array( [ $user, 'isAllowedAny' ], $rights ) ) {
+                       $this->dieWithError( [ 'apierror-permissiondenied', $this->msg( "action-{$rights[0]}" ) ] );
                }
-               $parsed = $this->parseMsg( $error );
-               $extraData = isset( $parsed['data'] ) ? $parsed['data'] : null;
-               $this->dieUsage( $parsed['info'], $parsed['code'], 0, $extraData );
        }
 
        /**
-        * Will only set a warning instead of failing if the global $wgDebugAPI
-        * is set to true. Otherwise behaves exactly as dieUsageMsg().
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @throws UsageException
-        * @since 1.21
+        * Helper function for permission-denied errors
+        * @since 1.29
+        * @param Title $title
+        * @param string|string[] $actions
+        * @param User|null $user
+        * @throws ApiUsageException if the user doesn't have all of the rights.
         */
-       public function dieUsageMsgOrDebug( $error ) {
-               if ( $this->getConfig()->get( 'DebugAPI' ) !== true ) {
-                       $this->dieUsageMsg( $error );
+       public function checkTitleUserPermissions( Title $title, $actions, $user = null ) {
+               if ( !$user ) {
+                       $user = $this->getUser();
                }
 
-               if ( is_string( $error ) ) {
-                       $error = [ $error ];
+               $errors = [];
+               foreach ( (array)$actions as $action ) {
+                       $errors = array_merge( $errors, $title->getUserPermissionsErrors( $action, $user ) );
+               }
+               if ( $errors ) {
+                       $this->dieStatus( $this->errorArrayToStatus( $errors, $user ) );
                }
-               $parsed = $this->parseMsg( $error );
-               $this->setWarning( '$wgDebugAPI: ' . $parsed['code'] . ' - ' . $parsed['info'] );
        }
 
        /**
-        * Die with the $prefix.'badcontinue' error. This call is common enough to
-        * make it into the base method.
-        * @param bool $condition Will only die if this value is true
-        * @throws UsageException
-        * @since 1.21
+        * Will only set a warning instead of failing if the global $wgDebugAPI
+        * is set to true. Otherwise behaves exactly as self::dieWithError().
+        *
+        * @since 1.29
+        * @param string|array|Message $msg
+        * @param string|null $code
+        * @param array|null $data
+        * @param int|null $httpCode
+        * @throws ApiUsageException
         */
-       protected function dieContinueUsageIf( $condition ) {
-               if ( $condition ) {
-                       $this->dieUsage(
-                               'Invalid continue param. You should pass the original value returned by the previous query',
-                               'badcontinue' );
+       public function dieWithErrorOrDebug( $msg, $code = null, $data = null, $httpCode = null ) {
+               if ( $this->getConfig()->get( 'DebugAPI' ) !== true ) {
+                       $this->dieWithError( $msg, $code, $data, $httpCode );
+               } else {
+                       $this->addWarning( $msg, $code, $data );
                }
        }
 
        /**
-        * Return the error message related to a certain array
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @return [ 'code' => code, 'info' => info ]
+        * Die with the 'badcontinue' error.
+        *
+        * This call is common enough to make it into the base method.
+        *
+        * @param bool $condition Will only die if this value is true
+        * @throws ApiUsageException
+        * @since 1.21
         */
-       public function parseMsg( $error ) {
-               // Check whether someone passed the whole array, instead of one element as
-               // documented. This breaks if it's actually an array of fallback keys, but
-               // that's long-standing misbehavior introduced in r87627 to incorrectly
-               // fix T30797.
-               if ( is_array( $error ) ) {
-                       $first = reset( $error );
-                       if ( is_array( $first ) ) {
-                               wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) );
-                               $error = $first;
-                       }
-               }
-
-               $msg = Message::newFromSpecifier( $error );
-
-               if ( $msg instanceof IApiMessage ) {
-                       return [
-                               'code' => $msg->getApiCode(),
-                               'info' => $msg->inLanguage( 'en' )->useDatabase( false )->text(),
-                               'data' => $msg->getApiData()
-                       ];
-               }
-
-               $key = $msg->getKey();
-               if ( isset( self::$messageMap[$key] ) ) {
-                       $params = $msg->getParams();
-                       return [
-                               'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $params ),
-                               'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $params )
-                       ];
+       protected function dieContinueUsageIf( $condition ) {
+               if ( $condition ) {
+                       $this->dieWithError( 'apierror-badcontinue' );
                }
-
-               // If the key isn't present, throw an "unknown error"
-               return $this->parseMsg( [ 'unknownerror', $key ] );
        }
 
        /**
@@ -2288,6 +1946,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Write logging information for API features to a debug log, for usage
         * analysis.
+        * @note Consider using $this->addDeprecation() instead to both warn and log.
         * @param string $feature Feature being used.
         */
        public function logFeatureUsage( $feature ) {
@@ -2325,7 +1984,10 @@ abstract class ApiBase extends ContextSource {
         */
        public function getFinalDescription() {
                $desc = $this->getDescription();
-               Hooks::run( 'APIGetDescription', [ &$this, &$desc ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $apiModule = $this;
+               Hooks::run( 'APIGetDescription', [ &$apiModule, &$desc ] );
                $desc = self::escapeWikiText( $desc );
                if ( is_array( $desc ) ) {
                        $desc = implode( "\n", $desc );
@@ -2373,7 +2035,9 @@ abstract class ApiBase extends ContextSource {
                        ] + ( isset( $params['token'] ) ? $params['token'] : [] );
                }
 
-               Hooks::run( 'APIGetAllowedParams', [ &$this, &$params, $flags ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $apiModule = $this;
+               Hooks::run( 'APIGetAllowedParams', [ &$apiModule, &$params, $flags ] );
 
                return $params;
        }
@@ -2391,7 +2055,10 @@ abstract class ApiBase extends ContextSource {
                $path = $this->getModulePath();
 
                $desc = $this->getParamDescription();
-               Hooks::run( 'APIGetParamDescription', [ &$this, &$desc ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $apiModule = $this;
+               Hooks::run( 'APIGetParamDescription', [ &$apiModule, &$desc ] );
 
                if ( !$desc ) {
                        $desc = [];
@@ -2638,7 +2305,7 @@ abstract class ApiBase extends ContextSource {
         * "apihelp-{$this->getModulePath()}-description".
         *
         * @deprecated since 1.25
-        * @return Message|string|array
+        * @return Message|string|array|false
         */
        protected function getDescription() {
                return false;
@@ -2755,6 +2422,301 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
+       /**
+        * @deprecated since 1.29, use ApiBase::addWarning() instead
+        * @param string $warning Warning message
+        */
+       public function setWarning( $warning ) {
+               $msg = new ApiRawMessage( $warning, 'warning' );
+               $this->getErrorFormatter()->addWarning( $this->getModulePath(), $msg );
+       }
+
+       /**
+        * Throw an ApiUsageException, which will (if uncaught) call the main module's
+        * error handler and die with an error message.
+        *
+        * @deprecated since 1.29, use self::dieWithError() instead
+        * @param string $description One-line human-readable description of the
+        *   error condition, e.g., "The API requires a valid action parameter"
+        * @param string $errorCode Brief, arbitrary, stable string to allow easy
+        *   automated identification of the error, e.g., 'unknown_action'
+        * @param int $httpRespCode HTTP response code
+        * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
+        * @throws ApiUsageException always
+        */
+       public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
+               $this->dieWithError(
+                       new RawMessage( '$1', [ $description ] ),
+                       $errorCode,
+                       $extradata,
+                       $httpRespCode
+               );
+       }
+
+       /**
+        * Get error (as code, string) from a Status object.
+        *
+        * @since 1.23
+        * @deprecated since 1.29, use ApiErrorFormatter::arrayFromStatus instead
+        * @param Status $status
+        * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
+        * @return array Array of code and error string
+        * @throws MWException
+        */
+       public function getErrorFromStatus( $status, &$extraData = null ) {
+               if ( $status->isGood() ) {
+                       throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
+               }
+
+               $errors = $status->getErrorsByType( 'error' );
+               if ( !$errors ) {
+                       // No errors? Assume the warnings should be treated as errors
+                       $errors = $status->getErrorsByType( 'warning' );
+               }
+               if ( !$errors ) {
+                       // Still no errors? Punt
+                       $errors = [ [ 'message' => 'unknownerror-nocode', 'params' => [] ] ];
+               }
+
+               if ( $errors[0]['message'] instanceof MessageSpecifier ) {
+                       $msg = $errors[0]['message'];
+               } else {
+                       $msg = new Message( $errors[0]['message'], $errors[0]['params'] );
+               }
+               if ( !$msg instanceof IApiMessage ) {
+                       $key = $msg->getKey();
+                       $params = $msg->getParams();
+                       array_unshift( $params, isset( self::$messageMap[$key] ) ? self::$messageMap[$key] : $key );
+                       $msg = ApiMessage::create( $params );
+               }
+
+               return [
+                       $msg->getApiCode(),
+                       ApiErrorFormatter::stripMarkup( $msg->inLanguage( 'en' )->useDatabase( false )->text() )
+               ];
+       }
+
+       /**
+        * @deprecated since 1.29. Prior to 1.29, this was a public mapping from
+        *  arbitrary strings (often message keys used elsewhere in MediaWiki) to
+        *  API codes and message texts, and a few interfaces required poking
+        *  something in here. Now we're repurposing it to map those same strings
+        *  to i18n messages, and declaring that any interface that requires poking
+        *  at this is broken and needs replacing ASAP.
+        */
+       private static $messageMap = [
+               'unknownerror' => 'apierror-unknownerror',
+               'unknownerror-nocode' => 'apierror-unknownerror-nocode',
+               'ns-specialprotected' => 'ns-specialprotected',
+               'protectedinterface' => 'protectedinterface',
+               'namespaceprotected' => 'namespaceprotected',
+               'customcssprotected' => 'customcssprotected',
+               'customjsprotected' => 'customjsprotected',
+               'cascadeprotected' => 'cascadeprotected',
+               'protectedpagetext' => 'protectedpagetext',
+               'protect-cantedit' => 'protect-cantedit',
+               'deleteprotected' => 'deleteprotected',
+               'badaccess-group0' => 'badaccess-group0',
+               'badaccess-groups' => 'badaccess-groups',
+               'titleprotected' => 'titleprotected',
+               'nocreate-loggedin' => 'nocreate-loggedin',
+               'nocreatetext' => 'nocreatetext',
+               'movenologintext' => 'movenologintext',
+               'movenotallowed' => 'movenotallowed',
+               'confirmedittext' => 'confirmedittext',
+               'blockedtext' => 'apierror-blocked',
+               'autoblockedtext' => 'apierror-autoblocked',
+               'systemblockedtext' => 'apierror-systemblocked',
+               'actionthrottledtext' => 'apierror-ratelimited',
+               'alreadyrolled' => 'alreadyrolled',
+               'cantrollback' => 'cantrollback',
+               'readonlytext' => 'readonlytext',
+               'sessionfailure' => 'sessionfailure',
+               'cannotdelete' => 'cannotdelete',
+               'notanarticle' => 'apierror-missingtitle',
+               'selfmove' => 'selfmove',
+               'immobile_namespace' => 'apierror-immobilenamespace',
+               'articleexists' => 'articleexists',
+               'hookaborted' => 'hookaborted',
+               'cantmove-titleprotected' => 'cantmove-titleprotected',
+               'imagenocrossnamespace' => 'imagenocrossnamespace',
+               'imagetypemismatch' => 'imagetypemismatch',
+               'ip_range_invalid' => 'ip_range_invalid',
+               'range_block_disabled' => 'range_block_disabled',
+               'nosuchusershort' => 'nosuchusershort',
+               'badipaddress' => 'badipaddress',
+               'ipb_expiry_invalid' => 'ipb_expiry_invalid',
+               'ipb_already_blocked' => 'ipb_already_blocked',
+               'ipb_blocked_as_range' => 'ipb_blocked_as_range',
+               'ipb_cant_unblock' => 'ipb_cant_unblock',
+               'mailnologin' => 'apierror-cantsend',
+               'ipbblocked' => 'ipbblocked',
+               'ipbnounblockself' => 'ipbnounblockself',
+               'usermaildisabled' => 'usermaildisabled',
+               'blockedemailuser' => 'apierror-blockedfrommail',
+               'notarget' => 'apierror-notarget',
+               'noemail' => 'noemail',
+               'rcpatroldisabled' => 'rcpatroldisabled',
+               'markedaspatrollederror-noautopatrol' => 'markedaspatrollederror-noautopatrol',
+               'delete-toobig' => 'delete-toobig',
+               'movenotallowedfile' => 'movenotallowedfile',
+               'userrights-no-interwiki' => 'userrights-no-interwiki',
+               'userrights-nodatabase' => 'userrights-nodatabase',
+               'nouserspecified' => 'nouserspecified',
+               'noname' => 'noname',
+               'summaryrequired' => 'apierror-summaryrequired',
+               'import-rootpage-invalid' => 'import-rootpage-invalid',
+               'import-rootpage-nosubpage' => 'import-rootpage-nosubpage',
+               'readrequired' => 'apierror-readapidenied',
+               'writedisabled' => 'apierror-noapiwrite',
+               'writerequired' => 'apierror-writeapidenied',
+               'missingparam' => 'apierror-missingparam',
+               'invalidtitle' => 'apierror-invalidtitle',
+               'nosuchpageid' => 'apierror-nosuchpageid',
+               'nosuchrevid' => 'apierror-nosuchrevid',
+               'nosuchuser' => 'nosuchusershort',
+               'invaliduser' => 'apierror-invaliduser',
+               'invalidexpiry' => 'apierror-invalidexpiry',
+               'pastexpiry' => 'apierror-pastexpiry',
+               'create-titleexists' => 'apierror-create-titleexists',
+               'missingtitle-createonly' => 'apierror-missingtitle-createonly',
+               'cantblock' => 'apierror-cantblock',
+               'canthide' => 'apierror-canthide',
+               'cantblock-email' => 'apierror-cantblock-email',
+               'cantunblock' => 'apierror-permissiondenied-generic',
+               'cannotundelete' => 'cannotundelete',
+               'permdenied-undelete' => 'apierror-permissiondenied-generic',
+               'createonly-exists' => 'apierror-articleexists',
+               'nocreate-missing' => 'apierror-missingtitle',
+               'cantchangecontentmodel' => 'apierror-cantchangecontentmodel',
+               'nosuchrcid' => 'apierror-nosuchrcid',
+               'nosuchlogid' => 'apierror-nosuchlogid',
+               'protect-invalidaction' => 'apierror-protect-invalidaction',
+               'protect-invalidlevel' => 'apierror-protect-invalidlevel',
+               'toofewexpiries' => 'apierror-toofewexpiries',
+               'cantimport' => 'apierror-cantimport',
+               'cantimport-upload' => 'apierror-cantimport-upload',
+               'importnofile' => 'importnofile',
+               'importuploaderrorsize' => 'importuploaderrorsize',
+               'importuploaderrorpartial' => 'importuploaderrorpartial',
+               'importuploaderrortemp' => 'importuploaderrortemp',
+               'importcantopen' => 'importcantopen',
+               'import-noarticle' => 'import-noarticle',
+               'importbadinterwiki' => 'importbadinterwiki',
+               'import-unknownerror' => 'apierror-import-unknownerror',
+               'cantoverwrite-sharedfile' => 'apierror-cantoverwrite-sharedfile',
+               'sharedfile-exists' => 'apierror-fileexists-sharedrepo-perm',
+               'mustbeposted' => 'apierror-mustbeposted',
+               'show' => 'apierror-show',
+               'specialpage-cantexecute' => 'apierror-specialpage-cantexecute',
+               'invalidoldimage' => 'apierror-invalidoldimage',
+               'nodeleteablefile' => 'apierror-nodeleteablefile',
+               'fileexists-forbidden' => 'fileexists-forbidden',
+               'fileexists-shared-forbidden' => 'fileexists-shared-forbidden',
+               'filerevert-badversion' => 'filerevert-badversion',
+               'noimageredirect-anon' => 'apierror-noimageredirect-anon',
+               'noimageredirect-logged' => 'apierror-noimageredirect',
+               'spamdetected' => 'apierror-spamdetected',
+               'contenttoobig' => 'apierror-contenttoobig',
+               'noedit-anon' => 'apierror-noedit-anon',
+               'noedit' => 'apierror-noedit',
+               'wasdeleted' => 'apierror-pagedeleted',
+               'blankpage' => 'apierror-emptypage',
+               'editconflict' => 'editconflict',
+               'hashcheckfailed' => 'apierror-badmd5',
+               'missingtext' => 'apierror-notext',
+               'emptynewsection' => 'apierror-emptynewsection',
+               'revwrongpage' => 'apierror-revwrongpage',
+               'undo-failure' => 'undo-failure',
+               'content-not-allowed-here' => 'content-not-allowed-here',
+               'edit-hook-aborted' => 'edit-hook-aborted',
+               'edit-gone-missing' => 'edit-gone-missing',
+               'edit-conflict' => 'edit-conflict',
+               'edit-already-exists' => 'edit-already-exists',
+               'invalid-file-key' => 'apierror-invalid-file-key',
+               'nouploadmodule' => 'apierror-nouploadmodule',
+               'uploaddisabled' => 'uploaddisabled',
+               'copyuploaddisabled' => 'copyuploaddisabled',
+               'copyuploadbaddomain' => 'apierror-copyuploadbaddomain',
+               'copyuploadbadurl' => 'apierror-copyuploadbadurl',
+               'filename-tooshort' => 'filename-tooshort',
+               'filename-toolong' => 'filename-toolong',
+               'illegal-filename' => 'illegal-filename',
+               'filetype-missing' => 'filetype-missing',
+               'mustbeloggedin' => 'apierror-mustbeloggedin',
+       ];
+
+       /**
+        * @deprecated do not use
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @return ApiMessage
+        */
+       private function parseMsgInternal( $error ) {
+               $msg = Message::newFromSpecifier( $error );
+               if ( !$msg instanceof IApiMessage ) {
+                       $key = $msg->getKey();
+                       if ( isset( self::$messageMap[$key] ) ) {
+                               $params = $msg->getParams();
+                               array_unshift( $params, self::$messageMap[$key] );
+                       } else {
+                               $params = [ 'apierror-unknownerror', wfEscapeWikiText( $key ) ];
+                       }
+                       $msg = ApiMessage::create( $params );
+               }
+               return $msg;
+       }
+
+       /**
+        * Return the error message related to a certain array
+        * @deprecated since 1.29
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @return [ 'code' => code, 'info' => info ]
+        */
+       public function parseMsg( $error ) {
+               // Check whether someone passed the whole array, instead of one element as
+               // documented. This breaks if it's actually an array of fallback keys, but
+               // that's long-standing misbehavior introduced in r87627 to incorrectly
+               // fix T30797.
+               if ( is_array( $error ) ) {
+                       $first = reset( $error );
+                       if ( is_array( $first ) ) {
+                               wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) );
+                               $error = $first;
+                       }
+               }
+
+               $msg = $this->parseMsgInternal( $error );
+               return [
+                       'code' => $msg->getApiCode(),
+                       'info' => ApiErrorFormatter::stripMarkup(
+                               $msg->inLanguage( 'en' )->useDatabase( false )->text()
+                       ),
+                       'data' => $msg->getApiData()
+               ];
+       }
+
+       /**
+        * Output the error message related to a certain array
+        * @deprecated since 1.29, use ApiBase::dieWithError() instead
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @throws ApiUsageException always
+        */
+       public function dieUsageMsg( $error ) {
+               $this->dieWithError( $this->parseMsgInternal( $error ) );
+       }
+
+       /**
+        * Will only set a warning instead of failing if the global $wgDebugAPI
+        * is set to true. Otherwise behaves exactly as dieUsageMsg().
+        * @deprecated since 1.29, use ApiBase::dieWithErrorOrDebug() instead
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @throws ApiUsageException
+        * @since 1.21
+        */
+       public function dieUsageMsgOrDebug( $error ) {
+               $this->dieWithErrorOrDebug( $this->parseMsgInternal( $error ) );
+       }
+
        /**@}*/
 }
 
index e4c9d0a..58e3d1c 100644 (file)
@@ -39,43 +39,57 @@ class ApiBlock extends ApiBase {
         * of success. If it fails, the result will specify the nature of the error.
         */
        public function execute() {
-               global $wgContLang;
+               $this->checkUserRightsAny( 'block' );
 
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               if ( !$user->isAllowed( 'block' ) ) {
-                       $this->dieUsageMsg( 'cantblock' );
-               }
+               $this->requireOnlyOneParameter( $params, 'user', 'userid' );
 
                # bug 15810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
-                               $msg = $this->parseMsg( $status );
-                               $this->dieUsage(
-                                       $msg['info'],
-                                       $msg['code'],
-                                       0,
+                               $this->dieWithError(
+                                       $status,
+                                       null,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                );
                        }
                }
 
-               $target = User::newFromName( $params['user'] );
-               // Bug 38633 - if the target is a user (not an IP address), but it
-               // doesn't exist or is unusable, error.
-               if ( $target instanceof User &&
-                       ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
-               ) {
-                       $this->dieUsageMsg( [ 'nosuchuser', $params['user'] ] );
+               if ( $params['userid'] !== null ) {
+                       $username = User::whoIs( $params['userid'] );
+
+                       if ( $username === false ) {
+                               $this->dieWithError( [ 'apierror-nosuchuserid', $params['userid'] ], 'nosuchuserid' );
+                       } else {
+                               $params['user'] = $username;
+                       }
+               } else {
+                       $target = User::newFromName( $params['user'] );
+
+                       // Bug 38633 - if the target is a user (not an IP address), but it
+                       // doesn't exist or is unusable, error.
+                       if ( $target instanceof User &&
+                               ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
+                       ) {
+                               $this->dieWithError( [ 'nosuchusershort', $params['user'] ], 'nosuchuser' );
+                       }
+               }
+
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                if ( $params['hidename'] && !$user->isAllowed( 'hideuser' ) ) {
-                       $this->dieUsageMsg( 'canthide' );
+                       $this->dieWithError( 'apierror-canthide' );
                }
                if ( $params['noemail'] && !SpecialBlock::canBlockEmail( $user ) ) {
-                       $this->dieUsageMsg( 'cantblock-email' );
+                       $this->dieWithError( 'apierror-cantblock-email' );
                }
 
                $data = [
@@ -96,12 +110,12 @@ class ApiBlock extends ApiBase {
                        'Reblock' => $params['reblock'],
                        'Watch' => $params['watchuser'],
                        'Confirm' => true,
+                       'Tags' => $params['tags'],
                ];
 
                $retval = SpecialBlock::processForm( $data, $this->getContext() );
                if ( $retval !== true ) {
-                       // We don't care about multiple errors, just report one of them
-                       $this->dieUsageMsg( $retval );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval ) );
                }
 
                list( $target, /*...*/ ) = SpecialBlock::getTargetAndType( $params['user'] );
@@ -110,7 +124,7 @@ class ApiBlock extends ApiBase {
 
                $block = Block::newFromTarget( $target, null, true );
                if ( $block instanceof Block ) {
-                       $res['expiry'] = $wgContLang->formatExpiry( $block->mExpiry, TS_ISO_8601, 'infinite' );
+                       $res['expiry'] = ApiResult::formatExpiry( $block->mExpiry, 'infinite' );
                        $res['id'] = $block->getId();
                } else {
                        # should be unreachable
@@ -142,7 +156,9 @@ class ApiBlock extends ApiBase {
                return [
                        'user' => [
                                ApiBase::PARAM_TYPE => 'user',
-                               ApiBase::PARAM_REQUIRED => true
+                       ],
+                       'userid' => [
+                               ApiBase::PARAM_TYPE => 'integer',
                        ],
                        'expiry' => 'never',
                        'reason' => '',
@@ -154,6 +170,10 @@ class ApiBlock extends ApiBase {
                        'allowusertalk' => false,
                        'reblock' => false,
                        'watchuser' => false,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 5a0edfc..4139019 100644 (file)
@@ -137,8 +137,11 @@ class ApiCSPReport extends ApiBase {
                }
                $status = FormatJson::parse( $postBody, FormatJson::FORCE_ASSOC );
                if ( !$status->isGood() ) {
-                       list( $code, ) = $this->getErrorFromStatus( $status );
-                       $this->error( $code, __METHOD__ );
+                       $msg = $status->getErrors()[0]['message'];
+                       if ( $msg instanceof Message ) {
+                               $msg = $msg->getKey();
+                       }
+                       $this->error( $msg, __METHOD__ );
                }
 
                $report = $status->getValue();
@@ -176,7 +179,7 @@ class ApiCSPReport extends ApiBase {
         *
         * @param $code String error code
         * @param $method String method that made error
-        * @throws UsageException Always
+        * @throws ApiUsageException Always
         */
        private function error( $code, $method ) {
                $this->log->info( 'Error reading CSP report: ' . $code, [
@@ -184,7 +187,9 @@ class ApiCSPReport extends ApiBase {
                        'user-agent' => $this->getRequest()->getHeader( 'user-agent' )
                ] );
                // 500 so it shows up in browser's developer console.
-               $this->dieUsage( "Error processing CSP report: $code", 'cspreport-' . $code, 500 );
+               $this->dieWithError(
+                       [ 'apierror-csp-report', wfEscapeWikiText( $code ) ], 'cspreport-' . $code, [], 500
+               );
        }
 
        public function getAllowedParams() {
index aea2819..c25920e 100644 (file)
@@ -35,7 +35,7 @@ class ApiChangeAuthenticationData extends ApiBase {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'Must be logged in to change authentication data', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-changeauthenticationdata', 'notloggedin' );
                }
 
                $helper = new ApiAuthManagerHelper( $this );
@@ -50,7 +50,7 @@ class ApiChangeAuthenticationData extends ApiBase {
                        $this->getConfig()->get( 'ChangeCredentialsBlacklist' )
                );
                if ( count( $reqs ) !== 1 ) {
-                       $this->dieUsage( 'Failed to create change request', 'badrequest' );
+                       $this->dieWithError( 'apierror-changeauth-norequest', 'badrequest' );
                }
                $req = reset( $reqs );
 
index 3d2159c..3cc7a8a 100644 (file)
@@ -22,6 +22,8 @@
  * @file
  */
 
+use MediaWiki\Session\Token;
+
 /**
  * @since 1.25
  * @ingroup API
@@ -39,6 +41,11 @@ class ApiCheckToken extends ApiBase {
                $tokenObj = ApiQueryTokens::getToken(
                        $this->getUser(), $this->getRequest()->getSession(), $salts[$params['type']]
                );
+
+               if ( substr( $token, -strlen( urldecode( Token::SUFFIX ) ) ) === urldecode( Token::SUFFIX ) ) {
+                       $this->addWarning( 'apiwarn-checktoken-percentencoding' );
+               }
+
                if ( $tokenObj->match( $token, $maxage ) ) {
                        $res['result'] = 'valid';
                } elseif ( $maxage !== null && $tokenObj->match( $token ) ) {
@@ -47,7 +54,7 @@ class ApiCheckToken extends ApiBase {
                        $res['result'] = 'invalid';
                }
 
-               $ts = MediaWiki\Session\Token::getTimestamp( $token );
+               $ts = Token::getTimestamp( $token );
                if ( $ts !== null ) {
                        $mwts = new MWTimestamp();
                        $mwts->timestamp->setTimestamp( $ts );
index 13b3577..a5474b5 100644 (file)
 class ApiClearHasMsg extends ApiBase {
        public function execute() {
                $user = $this->getUser();
-               if ( $this->getRequest()->wasPosted() ) {
-                       $user->setNewtalk( false );
-               } else {
-                       DeferredUpdates::addCallableUpdate( function () use ( $user ) {
-                               $user->setNewtalk( false );
-                       } );
-               }
+               $user->setNewtalk( false );
                $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
        }
 
@@ -45,7 +39,7 @@ class ApiClearHasMsg extends ApiBase {
        }
 
        public function mustBePosted() {
-               return false;
+               return true;
        }
 
        protected function getExamplesMessages() {
index cbb1524..3f5bc0c 100644 (file)
@@ -57,8 +57,8 @@ class ApiClientLogin extends ApiBase {
                        $bits = wfParseUrl( $params['returnurl'] );
                        if ( !$bits || $bits['scheme'] === '' ) {
                                $encParamName = $this->encodeParamName( 'returnurl' );
-                               $this->dieUsage(
-                                       "Invalid value '{$params['returnurl']}' for url parameter $encParamName",
+                               $this->dieWithError(
+                                       [ 'apierror-badurl', $encParamName, wfEscapeWikiText( $params['returnurl'] ) ],
                                        "badurl_{$encParamName}"
                                );
                        }
index 7eb0bf3..d6867eb 100644 (file)
@@ -34,8 +34,7 @@ class ApiComparePages extends ApiBase {
                $revision = Revision::newFromId( $rev1 );
 
                if ( !$revision ) {
-                       $this->dieUsage( 'The diff cannot be retrieved, ' .
-                               'one revision does not exist or you do not have permission to view it.', 'baddiff' );
+                       $this->dieWithError( 'apierror-baddiff' );
                }
 
                $contentHandler = $revision->getContentHandler();
@@ -65,11 +64,7 @@ class ApiComparePages extends ApiBase {
                $difftext = $de->getDiffBody();
 
                if ( $difftext === false ) {
-                       $this->dieUsage(
-                               'The diff cannot be retrieved. Maybe one or both revisions do ' .
-                                       'not exist or you do not have permission to view them.',
-                               'baddiff'
-                       );
+                       $this->dieWithError( 'apierror-baddiff' );
                }
 
                ApiResult::setContentValue( $vals, 'body', $difftext );
@@ -89,22 +84,19 @@ class ApiComparePages extends ApiBase {
                } elseif ( $titleText ) {
                        $title = Title::newFromText( $titleText );
                        if ( !$title || $title->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $titleText ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titleText ) ] );
                        }
 
                        return $title->getLatestRevID();
                } elseif ( $titleId ) {
                        $title = Title::newFromID( $titleId );
                        if ( !$title ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $titleId ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $titleId ] );
                        }
 
                        return $title->getLatestRevID();
                }
-               $this->dieUsage(
-                       'A title, a page ID, or a revision number is needed for both the from and the to parameters',
-                       'inputneeded'
-               );
+               $this->dieWithError( 'apierror-compare-inputneeded', 'inputneeded' );
        }
 
        public function getAllowedParams() {
index 19e2453..7da8ed9 100644 (file)
@@ -40,7 +40,7 @@ class ApiContinuationManager {
         * @param ApiBase $module Module starting the continuation
         * @param ApiBase[] $allModules Contains ApiBase instances that will be executed
         * @param array $generatedModules Names of modules that depend on the generator
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function __construct(
                ApiBase $module, array $allModules = [], array $generatedModules = []
@@ -57,10 +57,7 @@ class ApiContinuationManager {
                if ( $continue !== '' ) {
                        $continue = explode( '||', $continue );
                        if ( count( $continue ) !== 2 ) {
-                               throw new UsageException(
-                                       'Invalid continue param. You should pass the original value returned by the previous query',
-                                       'badcontinue'
-                               );
+                               throw ApiUsageException::newWithMessage( $module->getMain(), 'apierror-badcontinue' );
                        }
                        $this->generatorDone = ( $continue[0] === '-' );
                        $skip = explode( '|', $continue[1] );
index 993c23e..50c24ae 100644 (file)
@@ -45,7 +45,7 @@ class ApiDelete extends ApiBase {
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
                if ( !$pageObj->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                $titleObj = $pageObj->getTitle();
@@ -53,10 +53,7 @@ class ApiDelete extends ApiBase {
                $user = $this->getUser();
 
                // Check that the user is allowed to carry out the deletion
-               $errors = $titleObj->getUserPermissionsErrors( 'delete', $user );
-               if ( count( $errors ) ) {
-                       $this->dieUsageMsg( $errors[0] );
-               }
+               $this->checkTitleUserPermissions( $titleObj, 'delete' );
 
                // If change tagging was requested, check that the user is allowed to tag,
                // and the tags are valid
@@ -80,9 +77,6 @@ class ApiDelete extends ApiBase {
                        $status = self::delete( $pageObj, $user, $reason, $params['tags'] );
                }
 
-               if ( is_array( $status ) ) {
-                       $this->dieUsageMsg( $status[0] );
-               }
                if ( !$status->isGood() ) {
                        $this->dieStatus( $status );
                }
@@ -112,7 +106,7 @@ class ApiDelete extends ApiBase {
         * @param User $user User doing the action
         * @param string|null $reason Reason for the deletion. Autogenerated if null
         * @param array $tags Tags to tag the deletion with
-        * @return Status|array
+        * @return Status
         */
        protected static function delete( Page $page, User $user, &$reason = null, $tags = [] ) {
                $title = $page->getTitle();
@@ -124,7 +118,7 @@ class ApiDelete extends ApiBase {
                        $hasHistory = false;
                        $reason = $page->getAutoDeleteReason( $hasHistory );
                        if ( $reason === false ) {
-                               return [ [ 'cannotdelete', $title->getPrefixedText() ] ];
+                               return Status::newFatal( 'cannotdelete', $title->getPrefixedText() );
                        }
                }
 
@@ -141,7 +135,7 @@ class ApiDelete extends ApiBase {
         * @param string $reason Reason for the deletion. Autogenerated if null.
         * @param bool $suppress Whether to mark all deleted versions as restricted
         * @param array $tags Tags to tag the deletion with
-        * @return Status|array
+        * @return Status
         */
        protected static function deleteFile( Page $page, User $user, $oldimage,
                &$reason = null, $suppress = false, $tags = []
@@ -155,11 +149,11 @@ class ApiDelete extends ApiBase {
 
                if ( $oldimage ) {
                        if ( !FileDeleteForm::isValidOldSpec( $oldimage ) ) {
-                               return [ [ 'invalidoldimage' ] ];
+                               return Status::newFatal( 'invalidoldimage' );
                        }
                        $oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $oldimage );
                        if ( !$oldfile->exists() || !$oldfile->isLocal() || $oldfile->getRedirected() ) {
-                               return [ [ 'nodeleteablefile' ] ];
+                               return Status::newFatal( 'nodeleteablefile' );
                        }
                }
 
index fc97522..41bf9b6 100644 (file)
@@ -37,7 +37,7 @@
 class ApiDisabled extends ApiBase {
 
        public function execute() {
-               $this->dieUsage( "The \"{$this->getModuleName()}\" module has been disabled.", 'moduledisabled' );
+               $this->dieWithError( [ 'apierror-moduledisabled', $this->getModuleName() ] );
        }
 
        public function isReadMode() {
index d6de834..b45be31 100644 (file)
@@ -40,12 +40,7 @@ class ApiEditPage extends ApiBase {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               if ( is_null( $params['text'] ) && is_null( $params['appendtext'] ) &&
-                       is_null( $params['prependtext'] ) &&
-                       $params['undo'] == 0
-               ) {
-                       $this->dieUsageMsg( 'missingtext' );
-               }
+               $this->requireAtLeastOneParameter( $params, 'text', 'appendtext', 'prependtext', 'undo' );
 
                $pageObj = $this->getTitleOrPageId( $params );
                $titleObj = $pageObj->getTitle();
@@ -55,9 +50,7 @@ class ApiEditPage extends ApiBase {
                        if ( $params['prependtext'] === null && $params['appendtext'] === null
                                && $params['section'] !== 'new'
                        ) {
-                               $this->dieUsage( 'You have attempted to edit using the "redirect"-following'
-                                       . ' mode, which must be used in conjuction with section=new, prependtext'
-                                       . ', or appendtext.', 'redirect-appendonly' );
+                               $this->dieWithError( 'apierror-redirect-appendonly' );
                        }
                        if ( $titleObj->isRedirect() ) {
                                $oldTitle = $titleObj;
@@ -105,10 +98,7 @@ class ApiEditPage extends ApiBase {
                if ( $params['undo'] > 0 ) {
                        // allow undo via api
                } elseif ( $contentHandler->supportsDirectApiEditing() === false ) {
-                       $this->dieUsage(
-                               "Direct editing via API is not supported for content model $model used by $name",
-                               'no-direct-editing'
-                       );
+                       $this->dieWithError( [ 'apierror-no-direct-editing', $model, $name ] );
                }
 
                if ( !isset( $params['contentformat'] ) || $params['contentformat'] == '' ) {
@@ -118,49 +108,21 @@ class ApiEditPage extends ApiBase {
                }
 
                if ( !$contentHandler->isSupportedFormat( $contentFormat ) ) {
-
-                       $this->dieUsage( "The requested format $contentFormat is not supported for content model " .
-                               " $model used by $name", 'badformat' );
+                       $this->dieWithError( [ 'apierror-badformat', $contentFormat, $model, $name ] );
                }
 
                if ( $params['createonly'] && $titleObj->exists() ) {
-                       $this->dieUsageMsg( 'createonly-exists' );
+                       $this->dieWithError( 'apierror-articleexists' );
                }
                if ( $params['nocreate'] && !$titleObj->exists() ) {
-                       $this->dieUsageMsg( 'nocreate-missing' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                // Now let's check whether we're even allowed to do this
-               $errors = $titleObj->getUserPermissionsErrors( 'edit', $user );
-               if ( !$titleObj->exists() ) {
-                       $errors = array_merge( $errors, $titleObj->getUserPermissionsErrors( 'create', $user ) );
-               }
-               if ( count( $errors ) ) {
-                       if ( is_array( $errors[0] ) ) {
-                               switch ( $errors[0][0] ) {
-                                       case 'blockedtext':
-                                               $this->dieUsage(
-                                                       'You have been blocked from editing',
-                                                       'blocked',
-                                                       0,
-                                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                                               );
-                                               break;
-                                       case 'autoblockedtext':
-                                               $this->dieUsage(
-                                                       'Your IP address has been blocked automatically, because it was used by a blocked user',
-                                                       'autoblocked',
-                                                       0,
-                                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                                               );
-                                               break;
-                                       default:
-                                               $this->dieUsageMsg( $errors[0] );
-                               }
-                       } else {
-                               $this->dieUsageMsg( $errors[0] );
-                       }
-               }
+               $this->checkTitleUserPermissions(
+                       $titleObj,
+                       $titleObj->exists() ? 'edit' : [ 'edit', 'create' ]
+               );
 
                $toMD5 = $params['text'];
                if ( !is_null( $params['appendtext'] ) || !is_null( $params['prependtext'] ) ) {
@@ -178,8 +140,9 @@ class ApiEditPage extends ApiBase {
                                        try {
                                                $content = ContentHandler::makeContent( $text, $this->getTitle() );
                                        } catch ( MWContentSerializationException $ex ) {
-                                               $this->dieUsage( $ex->getMessage(), 'parseerror' );
-
+                                               $this->dieWithException( $ex, [
+                                                       'wrap' => ApiMessage::create( 'apierror-contentserializationexception', 'parseerror' )
+                                               ] );
                                                return;
                                        }
                                } else {
@@ -191,17 +154,14 @@ class ApiEditPage extends ApiBase {
                        // @todo Add support for appending/prepending to the Content interface
 
                        if ( !( $content instanceof TextContent ) ) {
-                               $mode = $contentHandler->getModelID();
-                               $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
+                               $modelName = $contentHandler->getModelID();
+                               $this->dieWithError( [ 'apierror-appendnotsupported', $modelName ] );
                        }
 
                        if ( !is_null( $params['section'] ) ) {
                                if ( !$contentHandler->supportsSections() ) {
                                        $modelName = $contentHandler->getModelID();
-                                       $this->dieUsage(
-                                               "Sections are not supported for this content model: $modelName.",
-                                               'sectionsnotsupported'
-                                       );
+                                       $this->dieWithError( [ 'apierror-sectionsnotsupported', $modelName ] );
                                }
 
                                if ( $params['section'] == 'new' ) {
@@ -213,7 +173,7 @@ class ApiEditPage extends ApiBase {
                                        $content = $content->getSection( $section );
 
                                        if ( !$content ) {
-                                               $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+                                               $this->dieWithError( [ 'apierror-nosuchsection', wfEscapeWikiText( $section ) ] );
                                        }
                                }
                        }
@@ -238,22 +198,22 @@ class ApiEditPage extends ApiBase {
                        }
                        $undoRev = Revision::newFromId( $params['undo'] );
                        if ( is_null( $undoRev ) || $undoRev->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $this->dieUsageMsg( [ 'nosuchrevid', $params['undo'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['undo'] ] );
                        }
 
                        if ( $params['undoafter'] == 0 ) {
                                $undoafterRev = $undoRev->getPrevious();
                        }
                        if ( is_null( $undoafterRev ) || $undoafterRev->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $this->dieUsageMsg( [ 'nosuchrevid', $params['undoafter'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['undoafter'] ] );
                        }
 
                        if ( $undoRev->getPage() != $pageObj->getId() ) {
-                               $this->dieUsageMsg( [ 'revwrongpage', $undoRev->getId(),
+                               $this->dieWithError( [ 'apierror-revwrongpage', $undoRev->getId(),
                                        $titleObj->getPrefixedText() ] );
                        }
                        if ( $undoafterRev->getPage() != $pageObj->getId() ) {
-                               $this->dieUsageMsg( [ 'revwrongpage', $undoafterRev->getId(),
+                               $this->dieWithError( [ 'apierror-revwrongpage', $undoafterRev->getId(),
                                        $titleObj->getPrefixedText() ] );
                        }
 
@@ -264,7 +224,7 @@ class ApiEditPage extends ApiBase {
                        );
 
                        if ( !$newContent ) {
-                               $this->dieUsageMsg( 'undo-failure' );
+                               $this->dieWithError( 'undo-failure', 'undofailure' );
                        }
                        if ( empty( $params['contentmodel'] )
                                && empty( $params['contentformat'] )
@@ -293,7 +253,7 @@ class ApiEditPage extends ApiBase {
 
                // See if the MD5 hash checks out
                if ( !is_null( $params['md5'] ) && md5( $toMD5 ) !== $params['md5'] ) {
-                       $this->dieUsageMsg( 'hashcheckfailed' );
+                       $this->dieWithError( 'apierror-badmd5' );
                }
 
                // EditPage wants to parse its stuff from a WebRequest
@@ -347,14 +307,13 @@ class ApiEditPage extends ApiBase {
                if ( !is_null( $params['section'] ) ) {
                        $section = $params['section'];
                        if ( !preg_match( '/^((T-)?\d+|new)$/', $section ) ) {
-                               $this->dieUsage( "The section parameter must be a valid section id or 'new'",
-                                       'invalidsection' );
+                               $this->dieWithError( 'apierror-invalidsection' );
                        }
                        $content = $pageObj->getContent();
                        if ( $section !== '0' && $section != 'new'
                                && ( !$content || !$content->getSection( $section ) )
                        ) {
-                               $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+                               $this->dieWithError( [ 'apierror-nosuchsection', $section ] );
                        }
                        $requestArray['wpSection'] = $params['section'];
                } else {
@@ -423,7 +382,7 @@ class ApiEditPage extends ApiBase {
                                return;
                        }
 
-                       $this->dieUsageMsg( 'hookaborted' );
+                       $this->dieWithError( 'hookaborted' );
                }
 
                // Do the actual save
@@ -445,67 +404,22 @@ class ApiEditPage extends ApiBase {
                                        $r['result'] = 'Failure';
                                        $apiResult->addValue( null, $this->getModuleName(), $r );
                                        return;
-                               } else {
-                                       $this->dieUsageMsg( 'hookaborted' );
                                }
-
-                       case EditPage::AS_PARSE_ERROR:
-                               $this->dieUsage( $status->getMessage(), 'parseerror' );
-
-                       case EditPage::AS_IMAGE_REDIRECT_ANON:
-                               $this->dieUsageMsg( 'noimageredirect-anon' );
-
-                       case EditPage::AS_IMAGE_REDIRECT_LOGGED:
-                               $this->dieUsageMsg( 'noimageredirect-logged' );
-
-                       case EditPage::AS_SPAM_ERROR:
-                               $this->dieUsageMsg( [ 'spamdetected', $result['spam'] ] );
+                               if ( !$status->getErrors() ) {
+                                       $status->fatal( 'hookaborted' );
+                               }
+                               $this->dieStatus( $status );
 
                        case EditPage::AS_BLOCKED_PAGE_FOR_USER:
-                               $this->dieUsage(
-                                       'You have been blocked from editing',
+                               $this->dieWithError(
+                                       'apierror-blocked',
                                        'blocked',
-                                       0,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                );
 
-                       case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
-                       case EditPage::AS_CONTENT_TOO_BIG:
-                               $this->dieUsageMsg( [ 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ] );
-
-                       case EditPage::AS_READ_ONLY_PAGE_ANON:
-                               $this->dieUsageMsg( 'noedit-anon' );
-
-                       case EditPage::AS_READ_ONLY_PAGE_LOGGED:
-                               $this->dieUsageMsg( 'noedit' );
-
                        case EditPage::AS_READ_ONLY_PAGE:
                                $this->dieReadOnly();
 
-                       case EditPage::AS_RATE_LIMITED:
-                               $this->dieUsageMsg( 'actionthrottledtext' );
-
-                       case EditPage::AS_ARTICLE_WAS_DELETED:
-                               $this->dieUsageMsg( 'wasdeleted' );
-
-                       case EditPage::AS_NO_CREATE_PERMISSION:
-                               $this->dieUsageMsg( 'nocreate-loggedin' );
-
-                       case EditPage::AS_NO_CHANGE_CONTENT_MODEL:
-                               $this->dieUsageMsg( 'cantchangecontentmodel' );
-
-                       case EditPage::AS_BLANK_ARTICLE:
-                               $this->dieUsageMsg( 'blankpage' );
-
-                       case EditPage::AS_CONFLICT_DETECTED:
-                               $this->dieUsageMsg( 'editconflict' );
-
-                       case EditPage::AS_TEXTBOX_EMPTY:
-                               $this->dieUsageMsg( 'emptynewsection' );
-
-                       case EditPage::AS_CHANGE_TAG_ERROR:
-                               $this->dieStatus( $status );
-
                        case EditPage::AS_SUCCESS_NEW_ARTICLE:
                                $r['new'] = true;
                                // fall-through
@@ -526,15 +440,66 @@ class ApiEditPage extends ApiBase {
                                }
                                break;
 
-                       case EditPage::AS_SUMMARY_NEEDED:
-                               // Shouldn't happen since we set wpIgnoreBlankSummary, but just in case
-                               $this->dieUsageMsg( 'summaryrequired' );
-
-                       case EditPage::AS_END:
                        default:
-                               // $status came from WikiPage::doEditContent()
-                               $errors = $status->getErrorsArray();
-                               $this->dieUsageMsg( $errors[0] ); // TODO: Add new errors to message map
+                               if ( !$status->getErrors() ) {
+                                       // EditPage sometimes only sets the status code without setting
+                                       // any actual error messages. Supply defaults for those cases.
+                                       switch ( $status->value ) {
+                                               // Currently needed
+                                               case EditPage::AS_IMAGE_REDIRECT_ANON:
+                                                       $status->fatal( 'apierror-noimageredirect-anon' );
+                                                       break;
+                                               case EditPage::AS_IMAGE_REDIRECT_LOGGED:
+                                                       $status->fatal( 'apierror-noimageredirect-logged' );
+                                                       break;
+                                               case EditPage::AS_CONTENT_TOO_BIG:
+                                               case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
+                                                       $status->fatal( 'apierror-contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) );
+                                                       break;
+                                               case EditPage::AS_READ_ONLY_PAGE_ANON:
+                                                       $status->fatal( 'apierror-noedit-anon' );
+                                                       break;
+                                               case EditPage::AS_NO_CHANGE_CONTENT_MODEL:
+                                                       $status->fatal( 'apierror-cantchangecontentmodel' );
+                                                       break;
+                                               case EditPage::AS_ARTICLE_WAS_DELETED:
+                                                       $status->fatal( 'apierror-pagedeleted' );
+                                                       break;
+                                               case EditPage::AS_CONFLICT_DETECTED:
+                                                       $status->fatal( 'editconflict' );
+                                                       break;
+
+                                               // Currently shouldn't be needed, but here in case
+                                               // hooks use them without setting appropriate
+                                               // errors on the status.
+                                               case EditPage::AS_SPAM_ERROR:
+                                                       $status->fatal( 'apierror-spamdetected', $result['spam'] );
+                                                       break;
+                                               case EditPage::AS_READ_ONLY_PAGE_LOGGED:
+                                                       $status->fatal( 'apierror-noedit' );
+                                                       break;
+                                               case EditPage::AS_RATE_LIMITED:
+                                                       $status->fatal( 'apierror-ratelimited' );
+                                                       break;
+                                               case EditPage::AS_NO_CREATE_PERMISSION:
+                                                       $status->fatal( 'nocreate-loggedin' );
+                                                       break;
+                                               case EditPage::AS_BLANK_ARTICLE:
+                                                       $status->fatal( 'apierror-emptypage' );
+                                                       break;
+                                               case EditPage::AS_TEXTBOX_EMPTY:
+                                                       $status->fatal( 'apierror-emptynewsection' );
+                                                       break;
+                                               case EditPage::AS_SUMMARY_NEEDED:
+                                                       $status->fatal( 'apierror-summaryrequired' );
+                                                       break;
+                                               default:
+                                                       wfWarn( __METHOD__ . ": Unknown EditPage code {$status->value} with no message" );
+                                                       $status->fatal( 'apierror-unknownerror-editpage', $status->value );
+                                                       break;
+                                       }
+                               }
+                               $this->dieStatus( $status );
                                break;
                }
                $apiResult->addValue( null, $this->getModuleName(), $r );
index 192378e..8aff6f8 100644 (file)
@@ -36,7 +36,16 @@ class ApiEmailUser extends ApiBase {
                // Validate target
                $targetUser = SpecialEmailUser::getTarget( $params['target'] );
                if ( !( $targetUser instanceof User ) ) {
-                       $this->dieUsageMsg( [ $targetUser ] );
+                       switch ( $targetUser ) {
+                               case 'notarget':
+                                       $this->dieWithError( 'apierror-notarget' );
+                               case 'noemail':
+                                       $this->dieWithError( [ 'noemail', $params['target'] ] );
+                               case 'nowikiemail':
+                                       $this->dieWithError( 'nowikiemailtext', 'nowikiemail' );
+                               default:
+                                       $this->dieWithError( [ 'apierror-unknownerror', $targetUser ] );
+                       }
                }
 
                // Check permissions and errors
@@ -46,7 +55,7 @@ class ApiEmailUser extends ApiBase {
                        $this->getConfig()
                );
                if ( $error ) {
-                       $this->dieUsageMsg( [ $error ] );
+                       $this->dieWithError( $error );
                }
 
                $data = [
@@ -56,25 +65,16 @@ class ApiEmailUser extends ApiBase {
                        'CCMe' => $params['ccme'],
                ];
                $retval = SpecialEmailUser::submit( $data, $this->getContext() );
-
-               if ( $retval instanceof Status ) {
-                       // SpecialEmailUser sometimes returns a status
-                       // sometimes it doesn't.
-                       if ( $retval->isGood() ) {
-                               $retval = true;
-                       } else {
-                               $retval = $retval->getErrorsArray();
-                       }
+               if ( !$retval instanceof Status ) {
+                       // This is probably the reason
+                       $retval = Status::newFatal( 'hookaborted' );
                }
 
-               if ( $retval === true ) {
-                       $result = [ 'result' => 'Success' ];
-               } else {
-                       $result = [
-                               'result' => 'Failure',
-                               'message' => $retval
-                       ];
-               }
+               $result = array_filter( [
+                       'result' => $retval->isGood() ? 'Success' : $retval->isOk() ? 'Warnings' : 'Failure',
+                       'warnings' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'warning' ),
+                       'errors' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'error' ),
+               ] );
 
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
        }
index 6d9184f..c52b731 100644 (file)
@@ -43,7 +43,9 @@ class ApiErrorFormatter {
         * @param ApiResult $result Into which data will be added
         * @param Language $lang Used for i18n
         * @param string $format
-        *  - text: Error message as wikitext
+        *  - plaintext: Error message as something vaguely like plaintext
+        *    (it's basically wikitext with HTML tags stripped and entities decoded)
+        *  - wikitext: Error message as wikitext
         *  - html: Error message as HTML
         *  - raw: Raw message key and parameters, no human-readable text
         *  - none: Code and data only, no human-readable text
@@ -56,6 +58,15 @@ class ApiErrorFormatter {
                $this->format = $format;
        }
 
+       /**
+        * Fetch the Language for this formatter
+        * @since 1.29
+        * @return Language
+        */
+       public function getLanguage() {
+               return $this->lang;
+       }
+
        /**
         * Fetch a dummy title to set on Messages
         * @return Title
@@ -69,53 +80,49 @@ class ApiErrorFormatter {
 
        /**
         * Add a warning to the result
-        * @param string $moduleName
-        * @param MessageSpecifier|array|string $msg i18n message for the warning
-        * @param string $code Machine-readable code for the warning. Defaults as
-        *   for IApiMessage::getApiCode().
-        * @param array $data Machine-readable data for the warning, if any.
-        *   Uses IApiMessage::getApiData() if $msg implements that interface.
+        * @param string|null $modulePath
+        * @param Message|array|string $msg Warning message. See ApiMessage::create().
+        * @param string|null $code See ApiMessage::create().
+        * @param array|null $data See ApiMessage::create().
         */
-       public function addWarning( $moduleName, $msg, $code = null, $data = null ) {
+       public function addWarning( $modulePath, $msg, $code = null, $data = null ) {
                $msg = ApiMessage::create( $msg, $code, $data )
                        ->inLanguage( $this->lang )
                        ->title( $this->getDummyTitle() )
                        ->useDatabase( $this->useDB );
-               $this->addWarningOrError( 'warning', $moduleName, $msg );
+               $this->addWarningOrError( 'warning', $modulePath, $msg );
        }
 
        /**
         * Add an error to the result
-        * @param string $moduleName
-        * @param MessageSpecifier|array|string $msg i18n message for the error
-        * @param string $code Machine-readable code for the warning. Defaults as
-        *   for IApiMessage::getApiCode().
-        * @param array $data Machine-readable data for the warning, if any.
-        *   Uses IApiMessage::getApiData() if $msg implements that interface.
+        * @param string|null $modulePath
+        * @param Message|array|string $msg Warning message. See ApiMessage::create().
+        * @param string|null $code See ApiMessage::create().
+        * @param array|null $data See ApiMessage::create().
         */
-       public function addError( $moduleName, $msg, $code = null, $data = null ) {
+       public function addError( $modulePath, $msg, $code = null, $data = null ) {
                $msg = ApiMessage::create( $msg, $code, $data )
                        ->inLanguage( $this->lang )
                        ->title( $this->getDummyTitle() )
                        ->useDatabase( $this->useDB );
-               $this->addWarningOrError( 'error', $moduleName, $msg );
+               $this->addWarningOrError( 'error', $modulePath, $msg );
        }
 
        /**
-        * Add warnings and errors from a Status object to the result
-        * @param string $moduleName
-        * @param Status $status
+        * Add warnings and errors from a StatusValue object to the result
+        * @param string|null $modulePath
+        * @param StatusValue $status
         * @param string[] $types 'warning' and/or 'error'
         */
        public function addMessagesFromStatus(
-               $moduleName, Status $status, $types = [ 'warning', 'error' ]
+               $modulePath, StatusValue $status, $types = [ 'warning', 'error' ]
        ) {
-               if ( $status->isGood() || !$status->errors ) {
+               if ( $status->isGood() || !$status->getErrors() ) {
                        return;
                }
 
                $types = (array)$types;
-               foreach ( $status->errors as $error ) {
+               foreach ( $status->getErrors() as $error ) {
                        if ( !in_array( $error['type'], $types, true ) ) {
                                continue;
                        }
@@ -127,40 +134,98 @@ class ApiErrorFormatter {
                                $tag = 'warning';
                        }
 
-                       if ( is_array( $error ) && isset( $error['message'] ) ) {
-                               // Normal case
-                               if ( $error['message'] instanceof Message ) {
-                                       $msg = ApiMessage::create( $error['message'], null, [] );
-                               } else {
-                                       $args = isset( $error['params'] ) ? $error['params'] : [];
-                                       array_unshift( $args, $error['message'] );
-                                       $error += [ 'params' => [] ];
-                                       $msg = ApiMessage::create( $args, null, [] );
+                       $msg = ApiMessage::create( $error )
+                               ->inLanguage( $this->lang )
+                               ->title( $this->getDummyTitle() )
+                               ->useDatabase( $this->useDB );
+                       $this->addWarningOrError( $tag, $modulePath, $msg );
+               }
+       }
+
+       /**
+        * Get an ApiMessage from an exception
+        * @since 1.29
+        * @param Exception|Throwable $exception
+        * @param array $options
+        *  - wrap: (string|array|MessageSpecifier) Used to wrap the exception's
+        *    message if it's not an ILocalizedException. The exception's message
+        *    will be added as the final parameter.
+        *  - code: (string) Default code
+        *  - data: (array) Default extra data
+        * @return IApiMessage
+        */
+       public function getMessageFromException( $exception, array $options = [] ) {
+               $options += [ 'code' => null, 'data' => [] ];
+
+               if ( $exception instanceof ILocalizedException ) {
+                       $msg = $exception->getMessageObject();
+                       $params = [];
+               } else {
+                       // Extract code and data from the exception, if applicable
+                       if ( $exception instanceof UsageException ) {
+                               $data = $exception->getMessageArray();
+                               if ( !$options['code'] ) {
+                                       $options['code'] = $data['code'];
                                }
-                       } elseif ( is_array( $error ) ) {
-                               // Weird case handled by Message::getErrorMessage
-                               $msg = ApiMessage::create( $error, null, [] );
-                       } else {
-                               // Another weird case handled by Message::getErrorMessage
-                               $msg = ApiMessage::create( $error, null, [] );
+                               unset( $data['code'], $data['info'] );
+                               $options['data'] = array_merge( $data, $options['data'] );
                        }
 
-                       $msg->inLanguage( $this->lang )
-                               ->title( $this->getDummyTitle() )
-                               ->useDatabase( $this->useDB );
-                       $this->addWarningOrError( $tag, $moduleName, $msg );
+                       if ( isset( $options['wrap'] ) ) {
+                               $msg = $options['wrap'];
+                       } else {
+                               $msg = new RawMessage( '$1' );
+                               if ( !isset( $options['code'] ) ) {
+                                       $options['code'] = 'internal_api_error_' . get_class( $exception );
+                               }
+                       }
+                       $params = [ wfEscapeWikiText( $exception->getMessage() ) ];
                }
+               return ApiMessage::create( $msg, $options['code'], $options['data'] )
+                       ->params( $params )
+                       ->inLanguage( $this->lang )
+                       ->title( $this->getDummyTitle() )
+                       ->useDatabase( $this->useDB );
        }
 
        /**
-        * Format messages from a Status as an array
-        * @param Status $status
+        * Format an exception as an array
+        * @since 1.29
+        * @param Exception|Throwable $exception
+        * @param array $options See self::getMessageFromException(), plus
+        *  - format: (string) Format override
+        * @return array
+        */
+       public function formatException( $exception, array $options = [] ) {
+               return $this->formatMessage(
+                       $this->getMessageFromException( $exception, $options ),
+                       isset( $options['format'] ) ? $options['format'] : null
+               );
+       }
+
+       /**
+        * Format a message as an array
+        * @param Message|array|string $msg Message. See ApiMessage::create().
+        * @param string|null $format
+        * @return array
+        */
+       public function formatMessage( $msg, $format = null ) {
+               $msg = ApiMessage::create( $msg )
+                       ->inLanguage( $this->lang )
+                       ->title( $this->getDummyTitle() )
+                       ->useDatabase( $this->useDB );
+               return $this->formatMessageInternal( $msg, $format ?: $this->format );
+       }
+
+       /**
+        * Format messages from a StatusValue as an array
+        * @param StatusValue $status
         * @param string $type 'warning' or 'error'
         * @param string|null $format
         * @return array
         */
-       public function arrayFromStatus( Status $status, $type = 'error', $format = null ) {
-               if ( $status->isGood() || !$status->errors ) {
+       public function arrayFromStatus( StatusValue $status, $type = 'error', $format = null ) {
+               if ( $status->isGood() || !$status->getErrors() ) {
                        return [];
                }
 
@@ -168,24 +233,69 @@ class ApiErrorFormatter {
                $formatter = new ApiErrorFormatter(
                        $result, $this->lang, $format ?: $this->format, $this->useDB
                );
-               $formatter->addMessagesFromStatus( 'dummy', $status, [ $type ] );
+               $formatter->addMessagesFromStatus( null, $status, [ $type ] );
                switch ( $type ) {
                        case 'error':
-                               return (array)$result->getResultData( [ 'errors', 'dummy' ] );
+                               return (array)$result->getResultData( [ 'errors' ] );
                        case 'warning':
-                               return (array)$result->getResultData( [ 'warnings', 'dummy' ] );
+                               return (array)$result->getResultData( [ 'warnings' ] );
                }
        }
 
        /**
-        * Actually add the warning or error to the result
-        * @param string $tag 'warning' or 'error'
-        * @param string $moduleName
+        * Turn wikitext into something resembling plaintext
+        * @since 1.29
+        * @param string $text
+        * @return string
+        */
+       public static function stripMarkup( $text ) {
+               // Turn semantic quoting tags to quotes
+               $ret = preg_replace( '!</?(var|kbd|samp|code)>!', '"', $text );
+
+               // Strip tags and decode.
+               $ret = html_entity_decode( strip_tags( $ret ), ENT_QUOTES | ENT_HTML5 );
+
+               return $ret;
+       }
+
+       /**
+        * Format a Message object for raw format
+        * @param MessageSpecifier $msg
+        * @return array
+        */
+       private function formatRawMessage( MessageSpecifier $msg ) {
+               $ret = [
+                       'key' => $msg->getKey(),
+                       'params' => $msg->getParams(),
+               ];
+               ApiResult::setIndexedTagName( $ret['params'], 'param' );
+
+               // Transform Messages as parameters in the style of Message::fooParam().
+               foreach ( $ret['params'] as $i => $param ) {
+                       if ( $param instanceof MessageSpecifier ) {
+                               $ret['params'][$i] = [ 'message' => $this->formatRawMessage( $param ) ];
+                       }
+               }
+               return $ret;
+       }
+
+       /**
+        * Format a message as an array
+        * @since 1.29
         * @param ApiMessage|ApiRawMessage $msg
+        * @param string|null $format
+        * @return array
         */
-       protected function addWarningOrError( $tag, $moduleName, $msg ) {
+       protected function formatMessageInternal( $msg, $format ) {
                $value = [ 'code' => $msg->getApiCode() ];
-               switch ( $this->format ) {
+               switch ( $format ) {
+                       case 'plaintext':
+                               $value += [
+                                       'text' => self::stripMarkup( $msg->text() ),
+                                       ApiResult::META_CONTENT => 'text',
+                               ];
+                               break;
+
                        case 'wikitext':
                                $value += [
                                        'text' => $msg->text(),
@@ -201,19 +311,34 @@ class ApiErrorFormatter {
                                break;
 
                        case 'raw':
-                               $value += [
-                                       'key' => $msg->getKey(),
-                                       'params' => $msg->getParams(),
-                               ];
-                               ApiResult::setIndexedTagName( $value['params'], 'param' );
+                               $value += $this->formatRawMessage( $msg );
                                break;
 
                        case 'none':
                                break;
                }
-               $value += $msg->getApiData();
+               $data = $msg->getApiData();
+               if ( $data ) {
+                       $value['data'] = $msg->getApiData() + [
+                               ApiResult::META_TYPE => 'assoc',
+                       ];
+               }
+               return $value;
+       }
+
+       /**
+        * Actually add the warning or error to the result
+        * @param string $tag 'warning' or 'error'
+        * @param string|null $modulePath
+        * @param ApiMessage|ApiRawMessage $msg
+        */
+       protected function addWarningOrError( $tag, $modulePath, $msg ) {
+               $value = $this->formatMessageInternal( $msg, $this->format );
+               if ( $modulePath !== null ) {
+                       $value += [ 'module' => $modulePath ];
+               }
 
-               $path = [ $tag . 's', $moduleName ];
+               $path = [ $tag . 's' ];
                $existing = $this->result->getResultData( $path );
                if ( $existing === null || !in_array( $value, $existing ) ) {
                        $flags = ApiResult::NO_SIZE_CHECK;
@@ -243,19 +368,19 @@ class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
                parent::__construct( $result, Language::factory( 'en' ), 'none', false );
        }
 
-       public function arrayFromStatus( Status $status, $type = 'error', $format = null ) {
-               if ( $status->isGood() || !$status->errors ) {
+       public function arrayFromStatus( StatusValue $status, $type = 'error', $format = null ) {
+               if ( $status->isGood() || !$status->getErrors() ) {
                        return [];
                }
 
                $result = [];
                foreach ( $status->getErrorsByType( $type ) as $error ) {
-                       if ( $error['message'] instanceof Message ) {
-                               $error = [
-                                       'message' => $error['message']->getKey(),
-                                       'params' => $error['message']->getParams(),
-                               ] + $error;
-                       }
+                       $msg = ApiMessage::create( $error );
+                       $error = [
+                               'message' => $msg->getKey(),
+                               'params' => $msg->getParams(),
+                               'code' => $msg->getApiCode(),
+                       ] + $error;
                        ApiResult::setIndexedTagName( $error['params'], 'param' );
                        $result[] = $error;
                }
@@ -264,24 +389,50 @@ class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
                return $result;
        }
 
-       protected function addWarningOrError( $tag, $moduleName, $msg ) {
-               $value = $msg->plain();
+       protected function formatMessageInternal( $msg, $format ) {
+               return [
+                       'code' => $msg->getApiCode(),
+                       'info' => $msg->text(),
+               ] + $msg->getApiData();
+       }
+
+       /**
+        * Format an exception as an array
+        * @since 1.29
+        * @param Exception|Throwable $exception
+        * @param array $options See parent::formatException(), plus
+        *  - bc: (bool) Return only the string, not an array
+        * @return array|string
+        */
+       public function formatException( $exception, array $options = [] ) {
+               $ret = parent::formatException( $exception, $options );
+               return empty( $options['bc'] ) ? $ret : $ret['info'];
+       }
+
+       protected function addWarningOrError( $tag, $modulePath, $msg ) {
+               $value = self::stripMarkup( $msg->text() );
 
                if ( $tag === 'error' ) {
                        // In BC mode, only one error
-                       $code = $msg->getApiCode();
-                       if ( isset( ApiBase::$messageMap[$code] ) ) {
-                               // Backwards compatibility
-                               $code = ApiBase::$messageMap[$code]['code'];
+                       $existingError = $this->result->getResultData( [ 'error' ] );
+                       if ( !is_array( $existingError ) ||
+                               !isset( $existingError['code'] ) || !isset( $existingError['info'] )
+                       ) {
+                               $value = [
+                                       'code' => $msg->getApiCode(),
+                                       'info' => $value,
+                               ] + $msg->getApiData();
+                               $this->result->addValue( null, 'error', $value,
+                                       ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
                        }
-
-                       $value = [
-                               'code' => $code,
-                               'info' => $value,
-                       ] + $msg->getApiData();
-                       $this->result->addValue( null, 'error', $value,
-                               ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
                } else {
+                       if ( $modulePath === null ) {
+                               $moduleName = 'unknown';
+                       } else {
+                               $i = strrpos( $modulePath, '+' );
+                               $moduleName = $i === false ? $modulePath : substr( $modulePath, $i + 1 );
+                       }
+
                        // Don't add duplicate warnings
                        $tag .= 's';
                        $path = [ $tag, $moduleName ];
index 10fb182..6f7cf65 100644 (file)
@@ -42,11 +42,9 @@ class ApiExpandTemplates extends ApiBase {
                $this->requireMaxOneParameter( $params, 'prop', 'generatexml' );
 
                if ( $params['prop'] === null ) {
-                       $this->logFeatureUsage( 'action=expandtemplates&!prop' );
-                       $this->setWarning( 'Because no values have been specified for the prop parameter, a ' .
-                               'legacy format has been used for the output. This format is deprecated, and in ' .
-                               'the future, a default value will be set for the prop parameter, causing the new' .
-                               'format to always be used.' );
+                       $this->addDeprecation(
+                               'apiwarn-deprecation-expandtemplates-prop', 'action=expandtemplates&!prop'
+                       );
                        $prop = [];
                } else {
                        $prop = array_flip( $params['prop'] );
@@ -57,13 +55,13 @@ class ApiExpandTemplates extends ApiBase {
                if ( $revid !== null ) {
                        $rev = Revision::newFromId( $revid );
                        if ( !$rev ) {
-                               $this->dieUsage( "There is no revision ID $revid", 'missingrev' );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $revid ] );
                        }
                        $title_obj = $rev->getTitle();
                } else {
                        $title_obj = Title::newFromText( $params['title'] );
                        if ( !$title_obj || $title_obj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                        }
                }
 
@@ -161,9 +159,7 @@ class ApiExpandTemplates extends ApiBase {
                                }
                                if ( isset( $prop['modules'] ) &&
                                        !isset( $prop['jsconfigvars'] ) && !isset( $prop['encodedjsconfigvars'] ) ) {
-                                       $this->setWarning( "Property 'modules' was set but not 'jsconfigvars' " .
-                                               "or 'encodedjsconfigvars'. Configuration variables are necessary " .
-                                               'for proper module usage.' );
+                                       $this->addWarning( 'apiwarn-moduleswithoutvars' );
                                }
                        }
                }
index c7dc303..97720c6 100644 (file)
@@ -43,16 +43,16 @@ class ApiFeedContributions extends ApiBase {
 
                $config = $this->getConfig();
                if ( !$config->get( 'Feed' ) ) {
-                       $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+                       $this->dieWithError( 'feed-unavailable' );
                }
 
                $feedClasses = $config->get( 'FeedClasses' );
                if ( !isset( $feedClasses[$params['feedformat']] ) ) {
-                       $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+                       $this->dieWithError( 'feed-invalid' );
                }
 
                if ( $params['showsizediff'] && $this->getConfig()->get( 'MiserMode' ) ) {
-                       $this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' );
+                       $this->dieWithError( 'apierror-sizediffdisabled' );
                }
 
                $msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
index 813ac01..e0e50ed 100644 (file)
@@ -47,12 +47,12 @@ class ApiFeedRecentChanges extends ApiBase {
                $this->params = $this->extractRequestParams();
 
                if ( !$config->get( 'Feed' ) ) {
-                       $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+                       $this->dieWithError( 'feed-unavailable' );
                }
 
                $feedClasses = $config->get( 'FeedClasses' );
                if ( !isset( $feedClasses[$this->params['feedformat']] ) ) {
-                       $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+                       $this->dieWithError( 'feed-invalid' );
                }
 
                $this->getMain()->setCacheMode( 'public' );
@@ -98,7 +98,7 @@ class ApiFeedRecentChanges extends ApiBase {
                if ( $specialClass === 'SpecialRecentchangeslinked' ) {
                        $title = Title::newFromText( $this->params['target'] );
                        if ( !$title ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $this->params['target'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $this->params['target'] ) ] );
                        }
 
                        $feed = new ChangesFeed( $feedFormat, false );
index af5b1af..7f349bc 100644 (file)
@@ -52,15 +52,16 @@ class ApiFeedWatchlist extends ApiBase {
        public function execute() {
                $config = $this->getConfig();
                $feedClasses = $config->get( 'FeedClasses' );
+               $params = [];
                try {
                        $params = $this->extractRequestParams();
 
                        if ( !$config->get( 'Feed' ) ) {
-                               $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+                               $this->dieWithError( 'feed-unavailable' );
                        }
 
                        if ( !isset( $feedClasses[$params['feedformat']] ) ) {
-                               $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+                               $this->dieWithError( 'feed-invalid' );
                        }
 
                        // limit to the number of hours going from now back
@@ -151,15 +152,26 @@ class ApiFeedWatchlist extends ApiBase {
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
                        $feed = new $feedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
 
-                       if ( $e instanceof UsageException ) {
-                               $errorCode = $e->getCodeString();
+                       if ( $e instanceof ApiUsageException ) {
+                               foreach ( $e->getStatusValue()->getErrors() as $error ) {
+                                       $msg = ApiMessage::create( $error )
+                                               ->inLanguage( $this->getLanguage() );
+                                       $errorTitle = $this->msg( 'api-feed-error-title', $msg->getApiCode() );
+                                       $errorText = $msg->text();
+                                       $feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
+                               }
                        } else {
-                               // Something is seriously wrong
-                               $errorCode = 'internal_api_error';
+                               if ( $e instanceof UsageException ) {
+                                       $errorCode = $e->getCodeString();
+                               } else {
+                                       // Something is seriously wrong
+                                       $errorCode = 'internal_api_error';
+                               }
+                               $errorTitle = $this->msg( 'api-feed-error-title', $msg->getApiCode() );
+                               $errorText = $e->getMessage();
+                               $feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
                        }
 
-                       $errorText = $e->getMessage();
-                       $feedItems[] = new FeedItem( "Error ($errorCode)", $errorText, '', '', '' );
                        ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems );
                }
        }
index 97464d6..736898e 100644 (file)
@@ -45,7 +45,7 @@ class ApiFileRevert extends ApiBase {
                $this->validateParameters();
 
                // Check whether we're allowed to revert this file
-               $this->checkPermissions( $this->getUser() );
+               $this->checkTitleUserPermissions( $this->file->getTitle(), [ 'edit', 'upload' ] );
 
                $sourceUrl = $this->file->getArchiveVirtualUrl( $this->archiveName );
                $status = $this->file->upload(
@@ -70,23 +70,6 @@ class ApiFileRevert extends ApiBase {
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
        }
 
-       /**
-        * Checks that the user has permissions to perform this revert.
-        * Dies with usage message on inadequate permissions.
-        * @param User $user The user to check.
-        */
-       protected function checkPermissions( $user ) {
-               $title = $this->file->getTitle();
-               $permissionErrors = array_merge(
-                       $title->getUserPermissionsErrors( 'edit', $user ),
-                       $title->getUserPermissionsErrors( 'upload', $user )
-               );
-
-               if ( $permissionErrors ) {
-                       $this->dieUsageMsg( $permissionErrors[0] );
-               }
-       }
-
        /**
         * Validate the user parameters and set $this->archiveName and $this->file.
         * Throws an error if validation fails
@@ -95,21 +78,23 @@ class ApiFileRevert extends ApiBase {
                // Validate the input title
                $title = Title::makeTitleSafe( NS_FILE, $this->params['filename'] );
                if ( is_null( $title ) ) {
-                       $this->dieUsageMsg( [ 'invalidtitle', $this->params['filename'] ] );
+                       $this->dieWithError(
+                               [ 'apierror-invalidtitle', wfEscapeWikiText( $this->params['filename'] ) ]
+                       );
                }
                $localRepo = RepoGroup::singleton()->getLocalRepo();
 
                // Check if the file really exists
                $this->file = $localRepo->newFile( $title );
                if ( !$this->file->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                // Check if the archivename is valid for this file
                $this->archiveName = $this->params['archivename'];
                $oldFile = $localRepo->newFromArchiveName( $title, $this->archiveName );
                if ( !$oldFile->exists() ) {
-                       $this->dieUsageMsg( 'filerevert-badversion' );
+                       $this->dieWithError( 'filerevert-badversion' );
                }
        }
 
index 2e917e1..8ebfe48 100644 (file)
@@ -84,8 +84,8 @@ class ApiFormatJson extends ApiFormatBase {
                                        break;
 
                                default:
-                                       $this->dieUsage( __METHOD__ .
-                                               ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                                       // Should have been caught during parameter validation
+                                       $this->dieDebug( __METHOD__, 'Unknown value for \'formatversion\'' );
                        }
                }
                $data = $this->getResult()->getResultData( null, $transform );
index fc25f47..a744f57 100644 (file)
@@ -55,7 +55,8 @@ class ApiFormatPhp extends ApiFormatBase {
                                break;
 
                        default:
-                               $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                               // Should have been caught during parameter validation
+                               $this->dieDebug( __METHOD__, 'Unknown value for \'formatversion\'' );
                }
                $text = serialize( $this->getResult()->getResultData( null, $transforms ) );
 
@@ -67,11 +68,7 @@ class ApiFormatPhp extends ApiFormatBase {
                        in_array( 'wfOutputHandler', ob_list_handlers(), true ) &&
                        preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $text )
                ) {
-                       $this->dieUsage(
-                               'This response cannot be represented using format=php. ' .
-                               'See https://phabricator.wikimedia.org/T68776',
-                               'internalerror'
-                       );
+                       $this->dieWithError( 'apierror-formatphp', 'internalerror' );
                }
 
                $this->printText( $text );
index 9da040c..228b47e 100644 (file)
@@ -49,7 +49,7 @@ class ApiFormatRaw extends ApiFormatBase {
        public function getMimeType() {
                $data = $this->getResult()->getResultData();
 
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        return $this->errorFallback->getMimeType();
                }
 
@@ -62,7 +62,7 @@ class ApiFormatRaw extends ApiFormatBase {
 
        public function initPrinter( $unused = false ) {
                $data = $this->getResult()->getResultData();
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        $this->errorFallback->initPrinter( $unused );
                        if ( $this->mFailWithHTTPError ) {
                                $this->getMain()->getRequest()->response()->statusHeader( 400 );
@@ -74,7 +74,7 @@ class ApiFormatRaw extends ApiFormatBase {
 
        public function closePrinter() {
                $data = $this->getResult()->getResultData();
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        $this->errorFallback->closePrinter();
                } else {
                        parent::closePrinter();
@@ -83,7 +83,7 @@ class ApiFormatRaw extends ApiFormatBase {
 
        public function execute() {
                $data = $this->getResult()->getResultData();
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        $this->errorFallback->execute();
                        return;
                }
index a45dbeb..e4dfda0 100644 (file)
@@ -269,17 +269,17 @@ class ApiFormatXml extends ApiFormatBase {
        protected function addXslt() {
                $nt = Title::newFromText( $this->mXslt );
                if ( is_null( $nt ) || !$nt->exists() ) {
-                       $this->setWarning( 'Invalid or non-existent stylesheet specified' );
+                       $this->addWarning( 'apiwarn-invalidxmlstylesheet' );
 
                        return;
                }
                if ( $nt->getNamespace() != NS_MEDIAWIKI ) {
-                       $this->setWarning( 'Stylesheet should be in the MediaWiki namespace.' );
+                       $this->addWarning( 'apiwarn-invalidxmlstylesheetns' );
 
                        return;
                }
                if ( substr( $nt->getText(), -4 ) !== '.xsl' ) {
-                       $this->setWarning( 'Stylesheet should have .xsl extension.' );
+                       $this->addWarning( 'apiwarn-invalidxmlstylesheetext' );
 
                        return;
                }
index 02efd7b..e347a9f 100644 (file)
@@ -90,7 +90,6 @@ class ApiHelp extends ApiBase {
         * @param IContextSource $context
         * @param ApiBase[]|ApiBase $modules
         * @param array $options Formatting options (described above)
-        * @return string
         */
        public static function getHelp( IContextSource $context, $modules, array $options ) {
                global $wgContLang;
@@ -548,6 +547,12 @@ class ApiHelp extends ApiBase {
 
                                                                case 'namespace':
                                                                        $namespaces = MWNamespace::getValidNamespaces();
+                                                                       if ( isset( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] ) &&
+                                                                               is_array( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] )
+                                                                       ) {
+                                                                               $namespaces = array_merge( $namespaces, $settings[ApiBase::PARAM_EXTRA_NAMESPACES] );
+                                                                       }
+                                                                       sort( $namespaces );
                                                                        $count = count( $namespaces );
                                                                        $info[] = $context->msg( 'api-help-param-list' )
                                                                                ->params( $multi ? 2 : 1 )
@@ -645,6 +650,20 @@ class ApiHelp extends ApiBase {
                                                        if ( $extra ) {
                                                                $info[] = implode( ' ', $extra );
                                                        }
+
+                                                       $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
+                                                               ? $settings[ApiBase::PARAM_ALL]
+                                                               : false;
+                                                       if ( $allowAll || $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
+                                                               if ( $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
+                                                                       $allSpecifier = ApiBase::ALL_DEFAULT_STRING;
+                                                               } else {
+                                                                       $allSpecifier = ( is_string( $allowAll ) ? $allowAll : ApiBase::ALL_DEFAULT_STRING );
+                                                               }
+                                                               $info[] = $context->msg( 'api-help-param-multi-all' )
+                                                                       ->params( $allSpecifier )
+                                                                       ->parse();
+                                                       }
                                                }
                                        }
 
index 37cb80a..71bda6d 100644 (file)
@@ -42,6 +42,14 @@ class ApiImageRotate extends ApiBase {
                        'invalidTitles', 'special', 'missingIds', 'missingRevIds', 'interwikiTitles',
                ] );
 
+               // Check if user can add tags
+               if ( count( $params['tags'] ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $this->getUser() );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                foreach ( $pageSet->getTitles() as $title ) {
                        $r = [];
                        $r['id'] = $title->getArticleID();
@@ -56,23 +64,29 @@ class ApiImageRotate extends ApiBase {
                        $file = wfFindFile( $title, [ 'latest' => true ] );
                        if ( !$file ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = 'File does not exist';
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( 'apierror-filedoesnotexist' )
+                               );
                                $result[] = $r;
                                continue;
                        }
                        $handler = $file->getHandler();
                        if ( !$handler || !$handler->canRotate() ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = 'File type cannot be rotated';
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( 'apierror-filetypecannotberotated' )
+                               );
                                $result[] = $r;
                                continue;
                        }
 
                        // Check whether we're allowed to rotate this file
-                       $permError = $this->checkPermissions( $this->getUser(), $file->getTitle() );
-                       if ( $permError !== null ) {
+                       $permError = $this->checkTitleUserPermissions( $file->getTitle(), [ 'edit', 'upload' ] );
+                       if ( $permError ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = $permError;
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       $this->errorArrayToStatus( $permError )
+                               );
                                $result[] = $r;
                                continue;
                        }
@@ -80,7 +94,9 @@ class ApiImageRotate extends ApiBase {
                        $srcPath = $file->getLocalRefPath();
                        if ( $srcPath === false ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = 'Cannot get local file path';
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( 'apierror-filenopath' )
+                               );
                                $result[] = $r;
                                continue;
                        }
@@ -96,17 +112,27 @@ class ApiImageRotate extends ApiBase {
                                $comment = wfMessage(
                                        'rotate-comment'
                                )->numParams( $rotation )->inContentLanguage()->text();
-                               $status = $file->upload( $dstPath,
-                                       $comment, $comment, 0, false, false, $this->getUser() );
+                               $status = $file->upload(
+                                       $dstPath,
+                                       $comment,
+                                       $comment,
+                                       0,
+                                       false,
+                                       false,
+                                       $this->getUser(),
+                                       $params['tags'] ?: []
+                               );
                                if ( $status->isGood() ) {
                                        $r['result'] = 'Success';
                                } else {
                                        $r['result'] = 'Failure';
-                                       $r['errormessage'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                       $r['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                                }
                        } else {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = $err->toText();
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( ApiMessage::create( $err->getMsg() ) )
+                               );
                        }
                        $result[] = $r;
                }
@@ -130,28 +156,6 @@ class ApiImageRotate extends ApiBase {
                return $this->mPageSet;
        }
 
-       /**
-        * Checks that the user has permissions to perform rotations.
-        * @param User $user The user to check
-        * @param Title $title
-        * @return string|null Permission error message, or null if there is no error
-        */
-       protected function checkPermissions( $user, $title ) {
-               $permissionErrors = array_merge(
-                       $title->getUserPermissionsErrors( 'edit', $user ),
-                       $title->getUserPermissionsErrors( 'upload', $user )
-               );
-
-               if ( $permissionErrors ) {
-                       // Just return the first error
-                       $msg = $this->parseMsg( $permissionErrors[0] );
-
-                       return $msg['info'];
-               }
-
-               return null;
-       }
-
        public function mustBePosted() {
                return true;
        }
@@ -169,6 +173,10 @@ class ApiImageRotate extends ApiBase {
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
index 10106ff..bf5e4ce 100644 (file)
@@ -42,10 +42,10 @@ class ApiImport extends ApiBase {
                $isUpload = false;
                if ( isset( $params['interwikisource'] ) ) {
                        if ( !$user->isAllowed( 'import' ) ) {
-                               $this->dieUsageMsg( 'cantimport' );
+                               $this->dieWithError( 'apierror-cantimport' );
                        }
                        if ( !isset( $params['interwikipage'] ) ) {
-                               $this->dieUsageMsg( [ 'missingparam', 'interwikipage' ] );
+                               $this->dieWithError( [ 'apierror-missingparam', 'interwikipage' ] );
                        }
                        $source = ImportStreamSource::newFromInterwiki(
                                $params['interwikisource'],
@@ -56,7 +56,7 @@ class ApiImport extends ApiBase {
                } else {
                        $isUpload = true;
                        if ( !$user->isAllowed( 'importupload' ) ) {
-                               $this->dieUsageMsg( 'cantimport-upload' );
+                               $this->dieWithError( 'apierror-cantimport-upload' );
                        }
                        $source = ImportStreamSource::newFromUpload( 'xml' );
                }
@@ -64,6 +64,14 @@ class ApiImport extends ApiBase {
                        $this->dieStatus( $source );
                }
 
+               // Check if user can add the log entry tags which were requested
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                $importer = new WikiImporter( $source->value, $this->getConfig() );
                if ( isset( $params['namespace'] ) ) {
                        $importer->setTargetNamespace( $params['namespace'] );
@@ -79,11 +87,14 @@ class ApiImport extends ApiBase {
                        $params['interwikisource'],
                        $params['summary']
                );
+               if ( $params['tags'] ) {
+                       $reporter->setChangeTags( $params['tags'] );
+               }
 
                try {
                        $importer->doImport();
                } catch ( Exception $e ) {
-                       $this->dieUsageMsg( [ 'import-unknownerror', $e->getMessage() ] );
+                       $this->dieWithException( $e, [ 'wrap' => 'apierror-import-unknownerror' ] );
                }
 
                $resultData = $reporter->getData();
@@ -140,6 +151,10 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_TYPE => 'namespace'
                        ],
                        'rootpage' => null,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 1017607..9a21e76 100644 (file)
@@ -49,7 +49,7 @@ class ApiLinkAccount extends ApiBase {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'Must be logged in to link accounts', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-linkaccounts', 'notloggedin' );
                }
 
                $params = $this->extractRequestParams();
@@ -60,8 +60,8 @@ class ApiLinkAccount extends ApiBase {
                        $bits = wfParseUrl( $params['returnurl'] );
                        if ( !$bits || $bits['scheme'] === '' ) {
                                $encParamName = $this->encodeParamName( 'returnurl' );
-                               $this->dieUsage(
-                                       "Invalid value '{$params['returnurl']}' for url parameter $encParamName",
+                               $this->dieWithError(
+                                       [ 'apierror-badurl', $encParamName, wfEscapeWikiText( $params['returnurl'] ) ],
                                        "badurl_{$encParamName}"
                                );
                        }
index 6ac261d..e017eda 100644 (file)
@@ -70,13 +70,7 @@ class ApiLogin extends ApiBase {
                        return;
                }
 
-               try {
-                       $this->requirePostedParameters( [ 'password', 'token' ] );
-               } catch ( UsageException $ex ) {
-                       // Make this a warning for now, upgrade to an error in 1.29.
-                       $this->setWarning( $ex->getMessage() );
-                       $this->logFeatureUsage( 'login-params-in-query-string' );
-               }
+               $this->requirePostedParameters( [ 'password', 'token' ] );
 
                $params = $this->extractRequestParams();
 
@@ -146,15 +140,10 @@ class ApiLogin extends ApiBase {
                        switch ( $res->status ) {
                                case AuthenticationResponse::PASS:
                                        if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
-                                               $warn = 'Main-account login via action=login is deprecated and may stop working ' .
-                                                       'without warning.';
-                                               $warn .= ' To continue login with action=login, see [[Special:BotPasswords]].';
-                                               $warn .= ' To safely continue using main-account login, see action=clientlogin.';
+                                               $this->addDeprecation( 'apiwarn-deprecation-login-botpw', 'main-account-login' );
                                        } else {
-                                               $warn = 'Login via action=login is deprecated and may stop working without warning.';
-                                               $warn .= ' To safely log in, see action=clientlogin.';
+                                               $this->addDeprecation( 'apiwarn-deprecation-login-nobotpw', 'main-account-login' );
                                        }
-                                       $this->setWarning( $warn );
                                        $authRes = 'Success';
                                        $loginType = 'AuthManager';
                                        break;
@@ -194,16 +183,21 @@ class ApiLogin extends ApiBase {
 
                        case 'NeedToken':
                                $result['token'] = $token->toString();
-                               $this->setWarning( 'Fetching a token via action=login is deprecated. ' .
-                                  'Use action=query&meta=tokens&type=login instead.' );
-                               $this->logFeatureUsage( 'action=login&!lgtoken' );
+                               $this->addDeprecation( 'apiwarn-deprecation-login-token', 'action=login&!lgtoken' );
                                break;
 
                        case 'WrongToken':
                                break;
 
                        case 'Failed':
-                               $result['reason'] = $message->useDatabase( 'false' )->inLanguage( 'en' )->text();
+                               $errorFormatter = $this->getErrorFormatter();
+                               if ( $errorFormatter instanceof ApiErrorFormatter_BackCompat ) {
+                                       $result['reason'] = ApiErrorFormatter::stripMarkup(
+                                               $message->useDatabase( false )->inLanguage( 'en' )->text()
+                                       );
+                               } else {
+                                       $result['reason'] = $errorFormatter->formatMessage( $message );
+                               }
                                break;
 
                        case 'Aborted':
index 6a26e2e..d5c28f1 100644 (file)
@@ -45,9 +45,11 @@ class ApiLogout extends ApiBase {
 
                // Make sure it's possible to log out
                if ( !$session->canSetUser() ) {
-                       $this->dieUsage(
-                               'Cannot log out when using ' .
-                                       $session->getProvider()->describe( Language::factory( 'en' ) ),
+                       $this->dieWithError(
+                               [
+                                       'cannotlogoutnow-text',
+                                       $session->getProvider()->describe( $this->getErrorFormatter()->getLanguage() )
+                               ],
                                'cannotlogout'
                        );
                }
index 38299b4..9e00830 100644 (file)
@@ -46,6 +46,11 @@ class ApiMain extends ApiBase {
         */
        const API_DEFAULT_FORMAT = 'jsonfm';
 
+       /**
+        * When no uselang parameter is given, this language will be used
+        */
+       const API_DEFAULT_USELANG = 'user';
+
        /**
         * List of available modules: action name => module class
         */
@@ -74,6 +79,7 @@ class ApiMain extends ApiBase {
                'tokens' => 'ApiTokens',
                'checktoken' => 'ApiCheckToken',
                'cspreport' => 'ApiCSPReport',
+               'validatepassword' => 'ApiValidatePassword',
 
                // Write modules
                'purge' => 'ApiPurge',
@@ -100,6 +106,7 @@ class ApiMain extends ApiBase {
                'managetags' => 'ApiManageTags',
                'tag' => 'ApiTag',
                'mergehistory' => 'ApiMergeHistory',
+               'setpagelanguage' => 'ApiSetPageLanguage',
        ];
 
        /**
@@ -140,7 +147,7 @@ class ApiMain extends ApiBase {
         */
        private $mPrinter;
 
-       private $mModuleMgr, $mResult, $mErrorFormatter;
+       private $mModuleMgr, $mResult, $mErrorFormatter = null;
        /** @var ApiContinuationManager|null */
        private $mContinuationManager;
        private $mAction;
@@ -229,7 +236,11 @@ class ApiMain extends ApiBase {
                        }
                }
 
-               $uselang = $this->getParameter( 'uselang' );
+               $this->mResult = new ApiResult( $this->getConfig()->get( 'APIMaxResultSize' ) );
+
+               // Setup uselang. This doesn't use $this->getParameter()
+               // because we're not ready to handle errors yet.
+               $uselang = $request->getVal( 'uselang', self::API_DEFAULT_USELANG );
                if ( $uselang === 'user' ) {
                        // Assume the parent context is going to return the user language
                        // for uselang=user (see T85635).
@@ -247,6 +258,29 @@ class ApiMain extends ApiBase {
                        }
                }
 
+               // Set up the error formatter. This doesn't use $this->getParameter()
+               // because we're not ready to handle errors yet.
+               $errorFormat = $request->getVal( 'errorformat', 'bc' );
+               $errorLangCode = $request->getVal( 'errorlang', 'uselang' );
+               $errorsUseDB = $request->getCheck( 'errorsuselocal' );
+               if ( in_array( $errorFormat, [ 'plaintext', 'wikitext', 'html', 'raw', 'none' ], true ) ) {
+                       if ( $errorLangCode === 'uselang' ) {
+                               $errorLang = $this->getLanguage();
+                       } elseif ( $errorLangCode === 'content' ) {
+                               global $wgContLang;
+                               $errorLang = $wgContLang;
+                       } else {
+                               $errorLangCode = RequestContext::sanitizeLangCode( $errorLangCode );
+                               $errorLang = Language::factory( $errorLangCode );
+                       }
+                       $this->mErrorFormatter = new ApiErrorFormatter(
+                               $this->mResult, $errorLang, $errorFormat, $errorsUseDB
+                       );
+               } else {
+                       $this->mErrorFormatter = new ApiErrorFormatter_BackCompat( $this->mResult );
+               }
+               $this->mResult->setErrorFormatter( $this->getErrorFormatter() );
+
                $this->mModuleMgr = new ApiModuleManager( $this );
                $this->mModuleMgr->addModules( self::$Modules, 'action' );
                $this->mModuleMgr->addModules( $config->get( 'APIModules' ), 'action' );
@@ -255,9 +289,6 @@ class ApiMain extends ApiBase {
 
                Hooks::run( 'ApiMain::moduleManager', [ $this->mModuleMgr ] );
 
-               $this->mResult = new ApiResult( $this->getConfig()->get( 'APIMaxResultSize' ) );
-               $this->mErrorFormatter = new ApiErrorFormatter_BackCompat( $this->mResult );
-               $this->mResult->setErrorFormatter( $this->mErrorFormatter );
                $this->mContinuationManager = null;
                $this->mEnableWrite = $enableWrite;
 
@@ -464,7 +495,9 @@ class ApiMain extends ApiBase {
        public function createPrinterByName( $format ) {
                $printer = $this->mModuleMgr->getModule( $format, 'format' );
                if ( $printer === null ) {
-                       $this->dieUsage( "Unrecognized format: {$format}", 'unknown_format' );
+                       $this->dieWithError(
+                               [ 'apierror-unknownformat', wfEscapeWikiText( $format ) ], 'unknown_format'
+                       );
                }
 
                return $printer;
@@ -542,7 +575,7 @@ class ApiMain extends ApiBase {
         */
        protected function handleException( Exception $e ) {
                // Bug 63145: Rollback any open database transactions
-               if ( !( $e instanceof UsageException ) ) {
+               if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
                        // UsageExceptions are intentional, so don't rollback if that's the case
                        try {
                                MWExceptionHandler::rollbackMasterChangesAndLog( $e );
@@ -557,7 +590,7 @@ class ApiMain extends ApiBase {
                Hooks::run( 'ApiMain::onException', [ $this, $e ] );
 
                // Log it
-               if ( !( $e instanceof UsageException ) ) {
+               if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
                        MWExceptionHandler::logException( $e );
                }
 
@@ -565,13 +598,13 @@ class ApiMain extends ApiBase {
                // If this fails, an unhandled exception should be thrown so that global error
                // handler will process and log it.
 
-               $errCode = $this->substituteResultWithError( $e );
+               $errCodes = $this->substituteResultWithError( $e );
 
                // Error results should not be cached
                $this->setCacheMode( 'private' );
 
                $response = $this->getRequest()->response();
-               $headerStr = 'MediaWiki-API-Error: ' . $errCode;
+               $headerStr = 'MediaWiki-API-Error: ' . join( ', ', $errCodes );
                $response->header( $headerStr );
 
                // Reset and print just the error message
@@ -580,14 +613,31 @@ class ApiMain extends ApiBase {
                // Printer may not be initialized if the extractRequestParams() fails for the main module
                $this->createErrorPrinter();
 
+               $failed = false;
                try {
                        $this->printResult( $e->getCode() );
+               } catch ( ApiUsageException $ex ) {
+                       // The error printer itself is failing. Try suppressing its request
+                       // parameters and redo.
+                       $failed = true;
+                       $this->addWarning( 'apiwarn-errorprinterfailed' );
+                       foreach ( $ex->getStatusValue()->getErrors() as $error ) {
+                               try {
+                                       $this->mPrinter->addWarning( $error );
+                               } catch ( Exception $ex2 ) {
+                                       // WTF?
+                                       $this->addWarning( $error );
+                               }
+                       }
                } catch ( UsageException $ex ) {
                        // The error printer itself is failing. Try suppressing its request
                        // parameters and redo.
-                       $this->setWarning(
-                               'Error printer failed (will retry without params): ' . $ex->getMessage()
+                       $failed = true;
+                       $this->addWarning(
+                               [ 'apiwarn-errorprinterfailed-ex', $ex->getMessage() ], 'errorprinterfailed'
                        );
+               }
+               if ( $failed ) {
                        $this->mPrinter = null;
                        $this->createErrorPrinter();
                        $this->mPrinter->forceDefaultParams();
@@ -958,99 +1008,153 @@ class ApiMain extends ApiBase {
        /**
         * Create an error message for the given exception.
         *
-        * If the exception is a UsageException then
-        * UsageException::getMessageArray() will be called to create the message.
+        * If an ApiUsageException, errors/warnings will be extracted from the
+        * embedded StatusValue.
+        *
+        * If a base UsageException, the getMessageArray() method will be used to
+        * extract the code and English message for a single error (no warnings).
+        *
+        * Any other exception will be returned with a generic code and wrapper
+        * text around the exception's (presumably English) message as a single
+        * error (no warnings).
         *
         * @param Exception $e
-        * @return array ['code' => 'some string', 'info' => 'some other string']
+        * @param string $type 'error' or 'warning'
+        * @return ApiMessage[]
         * @since 1.27
         */
-       protected function errorMessageFromException( $e ) {
-               if ( $e instanceof UsageException ) {
+       protected function errorMessagesFromException( $e, $type = 'error' ) {
+               $messages = [];
+               if ( $e instanceof ApiUsageException ) {
+                       foreach ( $e->getStatusValue()->getErrorsByType( $type ) as $error ) {
+                               $messages[] = ApiMessage::create( $error );
+                       }
+               } elseif ( $type !== 'error' ) {
+                       // None of the rest have any messages for non-error types
+               } elseif ( $e instanceof UsageException ) {
                        // User entered incorrect parameters - generate error response
-                       $errMessage = $e->getMessageArray();
+                       $data = $e->getMessageArray();
+                       $code = $data['code'];
+                       $info = $data['info'];
+                       unset( $data['code'], $data['info'] );
+                       $messages[] = new ApiRawMessage( [ '$1', $info ], $code, $data );
                } else {
-                       $config = $this->getConfig();
                        // Something is seriously wrong
+                       $config = $this->getConfig();
+                       $code = 'internal_api_error_' . get_class( $e );
                        if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
-                               $info = 'Database query error';
+                               $params = [ 'apierror-databaseerror', WebRequest::getRequestId() ];
                        } else {
-                               $info = "Exception Caught: {$e->getMessage()}";
+                               $params = [
+                                       'apierror-exceptioncaught',
+                                       WebRequest::getRequestId(),
+                                       $e instanceof ILocalizedException
+                                               ? $e->getMessageObject()
+                                               : wfEscapeWikiText( $e->getMessage() )
+                               ];
                        }
-
-                       $errMessage = [
-                               'code' => 'internal_api_error_' . get_class( $e ),
-                               'info' => '[' . WebRequest::getRequestId() . '] ' . $info,
-                       ];
+                       $messages[] = ApiMessage::create( $params, $code );
                }
-               return $errMessage;
+               return $messages;
        }
 
        /**
         * Replace the result data with the information about an exception.
-        * Returns the error code
         * @param Exception $e
-        * @return string
+        * @return string[] Error codes
         */
        protected function substituteResultWithError( $e ) {
                $result = $this->getResult();
+               $formatter = $this->getErrorFormatter();
                $config = $this->getConfig();
+               $errorCodes = [];
 
-               $errMessage = $this->errorMessageFromException( $e );
-               if ( $e instanceof UsageException ) {
-                       // User entered incorrect parameters - generate error response
-                       $link = wfExpandUrl( wfScript( 'api' ) );
-                       ApiResult::setContentValue( $errMessage, 'docref', "See $link for API usage" );
-               } else {
-                       // Something is seriously wrong
-                       if ( $config->get( 'ShowExceptionDetails' ) ) {
-                               ApiResult::setContentValue(
-                                       $errMessage,
-                                       'trace',
-                                       MWExceptionHandler::getRedactedTraceAsString( $e )
-                               );
-                       }
+               // Remember existing warnings and errors across the reset
+               $errors = $result->getResultData( [ 'errors' ] );
+               $warnings = $result->getResultData( [ 'warnings' ] );
+               $result->reset();
+               if ( $warnings !== null ) {
+                       $result->addValue( null, 'warnings', $warnings, ApiResult::NO_SIZE_CHECK );
                }
+               if ( $errors !== null ) {
+                       $result->addValue( null, 'errors', $errors, ApiResult::NO_SIZE_CHECK );
 
-               // Remember all the warnings to re-add them later
-               $warnings = $result->getResultData( [ 'warnings' ] );
+                       // Collect the copied error codes for the return value
+                       foreach ( $errors as $error ) {
+                               if ( isset( $error['code'] ) ) {
+                                       $errorCodes[$error['code']] = true;
+                               }
+                       }
+               }
 
-               $result->reset();
-               // Re-add the id
-               $requestid = $this->getParameter( 'requestid' );
-               if ( !is_null( $requestid ) ) {
-                       $result->addValue( null, 'requestid', $requestid, ApiResult::NO_SIZE_CHECK );
+               // Add errors from the exception
+               $modulePath = $e instanceof ApiUsageException ? $e->getModulePath() : null;
+               foreach ( $this->errorMessagesFromException( $e, 'error' ) as $msg ) {
+                       $errorCodes[$msg->getApiCode()] = true;
+                       $formatter->addError( $modulePath, $msg );
                }
-               if ( $config->get( 'ShowHostnames' ) ) {
-                       // servedby is especially useful when debugging errors
-                       $result->addValue( null, 'servedby', wfHostname(), ApiResult::NO_SIZE_CHECK );
+               foreach ( $this->errorMessagesFromException( $e, 'warning' ) as $msg ) {
+                       $formatter->addWarning( $modulePath, $msg );
                }
-               if ( $warnings !== null ) {
-                       $result->addValue( null, 'warnings', $warnings, ApiResult::NO_SIZE_CHECK );
+
+               // Add additional data. Path depends on whether we're in BC mode or not.
+               // Data depends on the type of exception.
+               if ( $formatter instanceof ApiErrorFormatter_BackCompat ) {
+                       $path = [ 'error' ];
+               } else {
+                       $path = null;
+               }
+               if ( $e instanceof ApiUsageException || $e instanceof UsageException ) {
+                       $link = wfExpandUrl( wfScript( 'api' ) );
+                       $result->addContentValue(
+                               $path,
+                               'docref',
+                               trim(
+                                       $this->msg( 'api-usage-docref', $link )->inLanguage( $formatter->getLanguage() )->text()
+                                       . ' '
+                                       . $this->msg( 'api-usage-mailinglist-ref' )->inLanguage( $formatter->getLanguage() )->text()
+                               )
+                       );
+               } else {
+                       if ( $config->get( 'ShowExceptionDetails' ) &&
+                               ( !$e instanceof DBError || $config->get( 'ShowDBErrorBacktrace' ) )
+                       ) {
+                               $result->addContentValue(
+                                       $path,
+                                       'trace',
+                                       $this->msg( 'api-exception-trace',
+                                               get_class( $e ),
+                                               $e->getFile(),
+                                               $e->getLine(),
+                                               MWExceptionHandler::getRedactedTraceAsString( $e )
+                                       )->inLanguage( $formatter->getLanguage() )->text()
+                               );
+                       }
                }
 
-               $result->addValue( null, 'error', $errMessage, ApiResult::NO_SIZE_CHECK );
+               // Add the id and such
+               $this->addRequestedFields( [ 'servedby' ] );
 
-               return $errMessage['code'];
+               return array_keys( $errorCodes );
        }
 
        /**
-        * Set up for the execution.
-        * @return array
+        * Add requested fields to the result
+        * @param string[] $force Which fields to force even if not requested. Accepted values are:
+        *  - servedby
         */
-       protected function setupExecuteAction() {
-               // First add the id to the top element
+       protected function addRequestedFields( $force = [] ) {
                $result = $this->getResult();
+
                $requestid = $this->getParameter( 'requestid' );
-               if ( !is_null( $requestid ) ) {
-                       $result->addValue( null, 'requestid', $requestid );
+               if ( $requestid !== null ) {
+                       $result->addValue( null, 'requestid', $requestid, ApiResult::NO_SIZE_CHECK );
                }
 
-               if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
-                       $servedby = $this->getParameter( 'servedby' );
-                       if ( $servedby ) {
-                               $result->addValue( null, 'servedby', wfHostname() );
-                       }
+               if ( $this->getConfig()->get( 'ShowHostnames' ) && (
+                       in_array( 'servedby', $force, true ) || $this->getParameter( 'servedby' )
+               ) ) {
+                       $result->addValue( null, 'servedby', wfHostname(), ApiResult::NO_SIZE_CHECK );
                }
 
                if ( $this->getParameter( 'curtimestamp' ) ) {
@@ -1058,13 +1162,23 @@ class ApiMain extends ApiBase {
                                ApiResult::NO_SIZE_CHECK );
                }
 
-               $params = $this->extractRequestParams();
+               if ( $this->getParameter( 'responselanginfo' ) ) {
+                       $result->addValue( null, 'uselang', $this->getLanguage()->getCode(),
+                               ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( null, 'errorlang', $this->getErrorFormatter()->getLanguage()->getCode(),
+                               ApiResult::NO_SIZE_CHECK );
+               }
+       }
 
-               $this->mAction = $params['action'];
+       /**
+        * Set up for the execution.
+        * @return array
+        */
+       protected function setupExecuteAction() {
+               $this->addRequestedFields();
 
-               if ( !is_string( $this->mAction ) ) {
-                       $this->dieUsage( 'The API requires a valid action parameter', 'unknown_action' );
-               }
+               $params = $this->extractRequestParams();
+               $this->mAction = $params['action'];
 
                return $params;
        }
@@ -1073,13 +1187,15 @@ class ApiMain extends ApiBase {
         * Set up the module for response
         * @return ApiBase The module that will handle this action
         * @throws MWException
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        protected function setupModule() {
                // Instantiate the module requested by the user
                $module = $this->mModuleMgr->getModule( $this->mAction, 'action' );
                if ( $module === null ) {
-                       $this->dieUsage( 'The API requires a valid action parameter', 'unknown_action' );
+                       $this->dieWithError(
+                               [ 'apierror-unknownaction', wfEscapeWikiText( $this->mAction ) ], 'unknown_action'
+                       );
                }
                $moduleParams = $module->extractRequestParams();
 
@@ -1098,13 +1214,13 @@ class ApiMain extends ApiBase {
                        }
 
                        if ( !isset( $moduleParams['token'] ) ) {
-                               $this->dieUsageMsg( [ 'missingparam', 'token' ] );
+                               $module->dieWithError( [ 'apierror-missingparam', 'token' ] );
                        }
 
                        $module->requirePostedParameters( [ 'token' ] );
 
                        if ( !$module->validateToken( $moduleParams['token'], $moduleParams ) ) {
-                               $this->dieUsageMsg( 'sessionfailure' );
+                               $module->dieWithError( 'apierror-badtoken' );
                        }
                }
 
@@ -1128,10 +1244,10 @@ class ApiMain extends ApiBase {
                                $response->header( 'X-Database-Lag: ' . intval( $lag ) );
 
                                if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
-                                       $this->dieUsage( "Waiting for $host: $lag seconds lagged", 'maxlag' );
+                                       $this->dieWithError( [ 'apierror-maxlag', $lag, $host ] );
                                }
 
-                               $this->dieUsage( "Waiting for a database server: $lag seconds lagged", 'maxlag' );
+                               $this->dieWithError( [ 'apierror-maxlag-generic', $lag ], 'maxlag' );
                        }
                }
 
@@ -1262,19 +1378,16 @@ class ApiMain extends ApiBase {
                if ( $module->isReadMode() && !User::isEveryoneAllowed( 'read' ) &&
                        !$user->isAllowed( 'read' )
                ) {
-                       $this->dieUsageMsg( 'readrequired' );
+                       $this->dieWithError( 'apierror-readapidenied' );
                }
 
                if ( $module->isWriteMode() ) {
                        if ( !$this->mEnableWrite ) {
-                               $this->dieUsageMsg( 'writedisabled' );
+                               $this->dieWithError( 'apierror-noapiwrite' );
                        } elseif ( !$user->isAllowed( 'writeapi' ) ) {
-                               $this->dieUsageMsg( 'writerequired' );
+                               $this->dieWithError( 'apierror-writeapidenied' );
                        } elseif ( $this->getRequest()->getHeader( 'Promise-Non-Write-API-Action' ) ) {
-                               $this->dieUsage(
-                                       'Promise-Non-Write-API-Action HTTP header cannot be sent to write API modules',
-                                       'promised-nonwrite-api'
-                               );
+                               $this->dieWithError( 'apierror-promised-nonwrite-api' );
                        }
 
                        $this->checkReadOnly( $module );
@@ -1283,7 +1396,7 @@ class ApiMain extends ApiBase {
                // Allow extensions to stop execution for arbitrary reasons.
                $message = false;
                if ( !Hooks::run( 'ApiCheckCanExecute', [ $module, $user, &$message ] ) ) {
-                       $this->dieUsageMsg( $message );
+                       $this->dieWithError( $message );
                }
        }
 
@@ -1329,12 +1442,9 @@ class ApiMain extends ApiBase {
                                "Api request failed as read only because the following DBs are lagged: $laggedServers"
                        );
 
-                       $parsed = $this->parseMsg( [ 'readonlytext' ] );
-                       $this->dieUsage(
-                               $parsed['info'],
-                               $parsed['code'],
-                               /* http error */
-                               0,
+                       $this->dieWithError(
+                               'readonly_lag',
+                               'readonly',
                                [ 'readonlyreason' => "Waiting for $numLagged lagged database(s)" ]
                        );
                }
@@ -1350,12 +1460,12 @@ class ApiMain extends ApiBase {
                        switch ( $params['assert'] ) {
                                case 'user':
                                        if ( $user->isAnon() ) {
-                                               $this->dieUsage( 'Assertion that the user is logged in failed', 'assertuserfailed' );
+                                               $this->dieWithError( 'apierror-assertuserfailed' );
                                        }
                                        break;
                                case 'bot':
                                        if ( !$user->isAllowed( 'bot' ) ) {
-                                               $this->dieUsage( 'Assertion that the user has the bot right failed', 'assertbotfailed' );
+                                               $this->dieWithError( 'apierror-assertbotfailed' );
                                        }
                                        break;
                        }
@@ -1363,9 +1473,8 @@ class ApiMain extends ApiBase {
                if ( isset( $params['assertuser'] ) ) {
                        $assertUser = User::newFromName( $params['assertuser'], false );
                        if ( !$assertUser || !$this->getUser()->equals( $assertUser ) ) {
-                               $this->dieUsage(
-                                       'Assertion that the user is "' . $params['assertuser'] . '" failed',
-                                       'assertnameduserfailed'
+                               $this->dieWithError(
+                                       [ 'apierror-assertnameduserfailed', wfEscapeWikiText( $params['assertuser'] ) ]
                                );
                        }
                }
@@ -1381,7 +1490,7 @@ class ApiMain extends ApiBase {
                if ( !$request->wasPosted() && $module->mustBePosted() ) {
                        // Module requires POST. GET request might still be allowed
                        // if $wgDebugApi is true, otherwise fail.
-                       $this->dieUsageMsgOrDebug( [ 'mustbeposted', $this->mAction ] );
+                       $this->dieWithErrorOrDebug( [ 'apierror-mustbeposted', $this->mAction ] );
                }
 
                // See if custom printer is used
@@ -1396,8 +1505,7 @@ class ApiMain extends ApiBase {
                        ( $this->getUser()->isLoggedIn() &&
                                $this->getUser()->requiresHTTPS() )
                ) ) {
-                       $this->logFeatureUsage( 'https-expected' );
-                       $this->setWarning( 'HTTP used when HTTPS was expected' );
+                       $this->addDeprecation( 'apiwarn-deprecation-httpsexpected', 'https-expected' );
                }
        }
 
@@ -1481,7 +1589,9 @@ class ApiMain extends ApiBase {
                ];
 
                if ( $e ) {
-                       $logCtx['errorCodes'][] = $this->errorMessageFromException( $e )['code'];
+                       foreach ( $this->errorMessagesFromException( $e ) as $msg ) {
+                               $logCtx['errorCodes'][] = $msg->getApiCode();
+                       }
                }
 
                // Construct space separated message for 'api' log channel
@@ -1560,9 +1670,7 @@ class ApiMain extends ApiBase {
                        if ( $this->getRequest()->getArray( $name ) !== null ) {
                                // See bug 10262 for why we don't just implode( '|', ... ) the
                                // array.
-                               $this->setWarning(
-                                       "Parameter '$name' uses unsupported PHP array syntax"
-                               );
+                               $this->addWarning( [ 'apiwarn-unsupportedarray', $name ] );
                        }
                        $ret = $default;
                }
@@ -1602,8 +1710,7 @@ class ApiMain extends ApiBase {
 
                if ( !$this->mInternalMode ) {
                        // Printer has not yet executed; don't warn that its parameters are unused
-                       $printerParams = array_map(
-                               [ $this->mPrinter, 'encodeParamName' ],
+                       $printerParams = $this->mPrinter->encodeParamName(
                                array_keys( $this->mPrinter->getFinalParams() ?: [] )
                        );
                        $unusedParams = array_diff( $allParams, $paramsUsed, $printerParams );
@@ -1612,8 +1719,11 @@ class ApiMain extends ApiBase {
                }
 
                if ( count( $unusedParams ) ) {
-                       $s = count( $unusedParams ) > 1 ? 's' : '';
-                       $this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
+                       $this->addWarning( [
+                               'apierror-unrecognizedparams',
+                               Message::listParam( array_map( 'wfEscapeWikiText', $unusedParams ), 'comma' ),
+                               count( $unusedParams )
+                       ] );
                }
        }
 
@@ -1624,7 +1734,7 @@ class ApiMain extends ApiBase {
         */
        protected function printResult( $httpCode = 0 ) {
                if ( $this->getConfig()->get( 'DebugAPI' ) !== false ) {
-                       $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
+                       $this->addWarning( 'apiwarn-wgDebugAPI' );
                }
 
                $printer = $this->mPrinter;
@@ -1678,9 +1788,20 @@ class ApiMain extends ApiBase {
                        'requestid' => null,
                        'servedby' => false,
                        'curtimestamp' => false,
+                       'responselanginfo' => false,
                        'origin' => null,
                        'uselang' => [
-                               ApiBase::PARAM_DFLT => 'user',
+                               ApiBase::PARAM_DFLT => self::API_DEFAULT_USELANG,
+                       ],
+                       'errorformat' => [
+                               ApiBase::PARAM_TYPE => [ 'plaintext', 'wikitext', 'html', 'raw', 'none', 'bc' ],
+                               ApiBase::PARAM_DFLT => 'bc',
+                       ],
+                       'errorlang' => [
+                               ApiBase::PARAM_DFLT => 'uselang',
+                       ],
+                       'errorsuselocal' => [
+                               ApiBase::PARAM_DFLT => false,
                        ],
                ];
        }
@@ -1732,7 +1853,7 @@ class ApiMain extends ApiBase {
                        $help['permissions'] .= Html::rawElement( 'dd', null,
                                $this->msg( 'api-help-permissions-granted-to' )
                                        ->numParams( count( $groups ) )
-                                       ->params( $this->getLanguage()->commaList( $groups ) )
+                                       ->params( Message::listParam( $groups ) )
                                        ->parse()
                        );
                }
@@ -1831,70 +1952,6 @@ class ApiMain extends ApiBase {
        }
 }
 
-/**
- * This exception will be thrown when dieUsage is called to stop module execution.
- *
- * @ingroup API
- */
-class UsageException extends MWException {
-
-       private $mCodestr;
-
-       /**
-        * @var null|array
-        */
-       private $mExtraData;
-
-       /**
-        * @param string $message
-        * @param string $codestr
-        * @param int $code
-        * @param array|null $extradata
-        */
-       public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
-               parent::__construct( $message, $code );
-               $this->mCodestr = $codestr;
-               $this->mExtraData = $extradata;
-
-               // This should never happen, so throw an exception about it that will
-               // hopefully get logged with a backtrace (T138585)
-               if ( !is_string( $codestr ) || $codestr === '' ) {
-                       throw new InvalidArgumentException( 'Invalid $codestr, was ' .
-                               ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
-                       );
-               }
-       }
-
-       /**
-        * @return string
-        */
-       public function getCodeString() {
-               return $this->mCodestr;
-       }
-
-       /**
-        * @return array
-        */
-       public function getMessageArray() {
-               $result = [
-                       'code' => $this->mCodestr,
-                       'info' => $this->getMessage()
-               ];
-               if ( is_array( $this->mExtraData ) ) {
-                       $result = array_merge( $result, $this->mExtraData );
-               }
-
-               return $result;
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return "{$this->getCodeString()}: {$this->getMessage()}";
-       }
-}
-
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 617db22..3c08093 100644 (file)
@@ -27,22 +27,34 @@ class ApiManageTags extends ApiBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
+               $user = $this->getUser();
 
                // make sure the user is allowed
                if ( $params['operation'] !== 'delete'
                        && !$this->getUser()->isAllowed( 'managechangetags' )
                ) {
-                       $this->dieUsage( "You don't have permission to manage change tags",
-                               'permissiondenied' );
+                       $this->dieWithError( 'tags-manage-no-permission', 'permissiondenied' );
                } elseif ( !$this->getUser()->isAllowed( 'deletechangetags' ) ) {
-                       $this->dieUsage( "You don't have permission to delete change tags",
-                               'permissiondenied' );
+                       $this->dieWithError( 'tags-delete-no-permission', 'permissiondenied' );
+               }
+
+               // Check if user can add the log entry tags which were requested
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                $result = $this->getResult();
                $funcName = "{$params['operation']}TagWithChecks";
-               $status = ChangeTags::$funcName( $params['tag'], $params['reason'],
-                       $this->getUser(), $params['ignorewarnings'] );
+               $status = ChangeTags::$funcName(
+                       $params['tag'],
+                       $params['reason'],
+                       $user,
+                       $params['ignorewarnings'],
+                       $params['tags'] ?: []
+               );
 
                if ( !$status->isOK() ) {
                        $this->dieStatus( $status );
@@ -59,6 +71,7 @@ class ApiManageTags extends ApiBase {
                if ( $ret['success'] ) {
                        $ret['logid'] = $status->value;
                }
+
                $result->addValue( null, $this->getModuleName(), $ret );
        }
 
@@ -87,6 +100,10 @@ class ApiManageTags extends ApiBase {
                                ApiBase::PARAM_TYPE => 'boolean',
                                ApiBase::PARAM_DFLT => false,
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 276f1c0..357698e 100644 (file)
@@ -42,24 +42,24 @@ class ApiMergeHistory extends ApiBase {
                if ( isset( $params['from'] ) ) {
                        $fromTitle = Title::newFromText( $params['from'] );
                        if ( !$fromTitle || $fromTitle->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['from'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['from'] ) ] );
                        }
                } elseif ( isset( $params['fromid'] ) ) {
                        $fromTitle = Title::newFromID( $params['fromid'] );
                        if ( !$fromTitle ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['fromid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['fromid'] ] );
                        }
                }
 
                if ( isset( $params['to'] ) ) {
                        $toTitle = Title::newFromText( $params['to'] );
                        if ( !$toTitle || $toTitle->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['to'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['to'] ) ] );
                        }
                } elseif ( isset( $params['toid'] ) ) {
                        $toTitle = Title::newFromID( $params['toid'] );
                        if ( !$toTitle ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['toid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['toid'] ] );
                        }
                }
 
index ae66778..9e42d5f 100644 (file)
@@ -36,9 +36,10 @@ interface IApiMessage extends MessageSpecifier {
        /**
         * Returns a machine-readable code for use by the API
         *
-        * The message key is often sufficient, but sometimes there are multiple
-        * messages used for what is really the same underlying condition (e.g.
-        * badaccess-groups and badaccess-group0)
+        * If no code was specifically set, the message key is used as the code
+        * after removing "apiwarn-" or "apierror-" prefixes and applying
+        * backwards-compatibility mappings.
+        *
         * @return string
         */
        public function getApiCode();
@@ -51,7 +52,7 @@ interface IApiMessage extends MessageSpecifier {
 
        /**
         * Sets the machine-readable code for use by the API
-        * @param string|null $code If null, the message key should be returned by self::getApiCode()
+        * @param string|null $code If null, uses the default (see self::getApiCode())
         * @param array|null $data If non-null, passed to self::setApiData()
         */
        public function setApiCode( $code, array $data = null );
@@ -69,14 +70,96 @@ interface IApiMessage extends MessageSpecifier {
  * @ingroup API
  */
 trait ApiMessageTrait {
+
+       /**
+        * Compatibility code mappings for various MW messages.
+        * @todo Ideally anything relying on this should be changed to use ApiMessage.
+        */
+       protected static $messageMap = [
+               'actionthrottledtext' => 'ratelimited',
+               'autoblockedtext' => 'autoblocked',
+               'badaccess-group0' => 'permissiondenied',
+               'badaccess-groups' => 'permissiondenied',
+               'badipaddress' => 'invalidip',
+               'blankpage' => 'emptypage',
+               'blockedtext' => 'blocked',
+               'cannotdelete' => 'cantdelete',
+               'cannotundelete' => 'cantundelete',
+               'cantmove-titleprotected' => 'protectedtitle',
+               'cantrollback' => 'onlyauthor',
+               'confirmedittext' => 'confirmemail',
+               'content-not-allowed-here' => 'contentnotallowedhere',
+               'deleteprotected' => 'cantedit',
+               'delete-toobig' => 'bigdelete',
+               'edit-conflict' => 'editconflict',
+               'imagenocrossnamespace' => 'nonfilenamespace',
+               'imagetypemismatch' => 'filetypemismatch',
+               'importbadinterwiki' => 'badinterwiki',
+               'importcantopen' => 'cantopenfile',
+               'import-noarticle' => 'badinterwiki',
+               'importnofile' => 'nofile',
+               'importuploaderrorpartial' => 'partialupload',
+               'importuploaderrorsize' => 'filetoobig',
+               'importuploaderrortemp' => 'notempdir',
+               'ipb_already_blocked' => 'alreadyblocked',
+               'ipb_blocked_as_range' => 'blockedasrange',
+               'ipb_cant_unblock' => 'cantunblock',
+               'ipb_expiry_invalid' => 'invalidexpiry',
+               'ip_range_invalid' => 'invalidrange',
+               'mailnologin' => 'cantsend',
+               'markedaspatrollederror-noautopatrol' => 'noautopatrol',
+               'movenologintext' => 'cantmove-anon',
+               'movenotallowed' => 'cantmove',
+               'movenotallowedfile' => 'cantmovefile',
+               'namespaceprotected' => 'protectednamespace',
+               'nocreate-loggedin' => 'cantcreate',
+               'nocreatetext' => 'cantcreate-anon',
+               'noname' => 'invaliduser',
+               'nosuchusershort' => 'nosuchuser',
+               'notanarticle' => 'missingtitle',
+               'nouserspecified' => 'invaliduser',
+               'ns-specialprotected' => 'unsupportednamespace',
+               'protect-cantedit' => 'cantedit',
+               'protectedinterface' => 'protectednamespace-interface',
+               'protectedpagetext' => 'protectedpage',
+               'range_block_disabled' => 'rangedisabled',
+               'rcpatroldisabled' => 'patroldisabled',
+               'readonlytext' => 'readonly',
+               'sessionfailure' => 'badtoken',
+               'systemblockedtext' => 'blocked',
+               'titleprotected' => 'protectedtitle',
+               'undo-failure' => 'undofailure',
+               'userrights-nodatabase' => 'nosuchdatabase',
+               'userrights-no-interwiki' => 'nointerwikiuserrights',
+       ];
+
        protected $apiCode = null;
        protected $apiData = [];
 
        public function getApiCode() {
-               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
+               if ( $this->apiCode === null ) {
+                       $key = $this->getKey();
+                       if ( isset( self::$messageMap[$key] ) ) {
+                               $this->apiCode = self::$messageMap[$key];
+                       } elseif ( $key === 'apierror-missingparam' ) {
+                               /// @todo: Kill this case along with ApiBase::$messageMap
+                               $this->apiCode = 'no' . $this->getParams()[0];
+                       } elseif ( substr( $key, 0, 8 ) === 'apiwarn-' ) {
+                               $this->apiCode = substr( $key, 8 );
+                       } elseif ( substr( $key, 0, 9 ) === 'apierror-' ) {
+                               $this->apiCode = substr( $key, 9 );
+                       } else {
+                               $this->apiCode = $key;
+                       }
+               }
+               return $this->apiCode;
        }
 
        public function setApiCode( $code, array $data = null ) {
+               if ( $code !== null && !( is_string( $code ) && $code !== '' ) ) {
+                       throw new InvalidArgumentException( "Invalid code \"$code\"" );
+               }
+
                $this->apiCode = $code;
                if ( $data !== null ) {
                        $this->setApiData( $data );
@@ -124,9 +207,25 @@ class ApiMessage extends Message implements IApiMessage {
         * @param Message|RawMessage|array|string $msg
         * @param string|null $code
         * @param array|null $data
-        * @return ApiMessage
+        * @return IApiMessage
         */
        public static function create( $msg, $code = null, array $data = null ) {
+               if ( is_array( $msg ) ) {
+                       // From StatusValue
+                       if ( isset( $msg['message'] ) ) {
+                               if ( isset( $msg['params'] ) ) {
+                                       $msg = array_merge( [ $msg['message'] ], $msg['params'] );
+                               } else {
+                                       $msg = [ $msg['message'] ];
+                               }
+                       }
+
+                       // Weirdness that comes in sometimes, including the above
+                       if ( $msg[0] instanceof MessageSpecifier ) {
+                               $msg = $msg[0];
+                       }
+               }
+
                if ( $msg instanceof IApiMessage ) {
                        return $msg;
                } elseif ( $msg instanceof RawMessage ) {
@@ -143,7 +242,6 @@ class ApiMessage extends Message implements IApiMessage {
         *  - string: passed to Message::__construct
         * @param string|null $code
         * @param array|null $data
-        * @return ApiMessage
         */
        public function __construct( $msg, $code = null, array $data = null ) {
                if ( $msg instanceof Message ) {
@@ -158,8 +256,7 @@ class ApiMessage extends Message implements IApiMessage {
                } else {
                        parent::__construct( $msg );
                }
-               $this->apiCode = $code;
-               $this->apiData = (array)$data;
+               $this->setApiCode( $code, $data );
        }
 }
 
@@ -192,7 +289,6 @@ class ApiRawMessage extends RawMessage implements IApiMessage {
                } else {
                        parent::__construct( $msg );
                }
-               $this->apiCode = $code;
-               $this->apiData = (array)$data;
+               $this->setApiCode( $code, $data );
        }
 }
index 29e67b0..ab7199f 100644 (file)
@@ -41,45 +41,54 @@ class ApiMove extends ApiBase {
                if ( isset( $params['from'] ) ) {
                        $fromTitle = Title::newFromText( $params['from'] );
                        if ( !$fromTitle || $fromTitle->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['from'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['from'] ) ] );
                        }
                } elseif ( isset( $params['fromid'] ) ) {
                        $fromTitle = Title::newFromID( $params['fromid'] );
                        if ( !$fromTitle ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['fromid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['fromid'] ] );
                        }
                }
 
                if ( !$fromTitle->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
                $fromTalk = $fromTitle->getTalkPage();
 
                $toTitle = Title::newFromText( $params['to'] );
                if ( !$toTitle || $toTitle->isExternal() ) {
-                       $this->dieUsageMsg( [ 'invalidtitle', $params['to'] ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['to'] ) ] );
                }
-               $toTalk = $toTitle->getTalkPage();
+               $toTalk = $toTitle->canTalk() ? $toTitle->getTalkPage() : null;
 
                if ( $toTitle->getNamespace() == NS_FILE
                        && !RepoGroup::singleton()->getLocalRepo()->findFile( $toTitle )
                        && wfFindFile( $toTitle )
                ) {
                        if ( !$params['ignorewarnings'] && $user->isAllowed( 'reupload-shared' ) ) {
-                               $this->dieUsageMsg( 'sharedfile-exists' );
+                               $this->dieWithError( 'apierror-fileexists-sharedrepo-perm' );
                        } elseif ( !$user->isAllowed( 'reupload-shared' ) ) {
-                               $this->dieUsageMsg( 'cantoverwrite-sharedfile' );
+                               $this->dieWithError( 'apierror-cantoverwrite-sharedfile' );
                        }
                }
 
                // Rate limit
                if ( $user->pingLimiter( 'move' ) ) {
-                       $this->dieUsageMsg( 'actionthrottledtext' );
+                       $this->dieWithError( 'apierror-ratelimited' );
+               }
+
+               // Check if the user is allowed to add the specified changetags
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                // Move the page
                $toTitleExists = $toTitle->exists();
-               $status = $this->movePage( $fromTitle, $toTitle, $params['reason'], !$params['noredirect'] );
+               $status = $this->movePage( $fromTitle, $toTitle, $params['reason'], !$params['noredirect'],
+                       $params['tags'] ?: [] );
                if ( !$status->isOK() ) {
                        $this->dieStatus( $status );
                }
@@ -100,18 +109,22 @@ class ApiMove extends ApiBase {
                $r['moveoverredirect'] = $toTitleExists;
 
                // Move the talk page
-               if ( $params['movetalk'] && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
+               if ( $params['movetalk'] && $toTalk && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
                        $toTalkExists = $toTalk->exists();
-                       $status = $this->movePage( $fromTalk, $toTalk, $params['reason'], !$params['noredirect'] );
+                       $status = $this->movePage(
+                               $fromTalk,
+                               $toTalk,
+                               $params['reason'],
+                               !$params['noredirect'],
+                               $params['tags'] ?: []
+                       );
                        if ( $status->isOK() ) {
                                $r['talkfrom'] = $fromTalk->getPrefixedText();
                                $r['talkto'] = $toTalk->getPrefixedText();
                                $r['talkmoveoverredirect'] = $toTalkExists;
                        } else {
-                               // We're not gonna dieUsage() on failure, since we already changed something
-                               $error = $this->getErrorFromStatus( $status );
-                               $r['talkmove-error-code'] = $error[0];
-                               $r['talkmove-error-info'] = $error[1];
+                               // We're not going to dieWithError() on failure, since we already changed something
+                               $r['talkmove-errors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                        }
                }
 
@@ -119,13 +132,23 @@ class ApiMove extends ApiBase {
 
                // Move subpages
                if ( $params['movesubpages'] ) {
-                       $r['subpages'] = $this->moveSubpages( $fromTitle, $toTitle,
-                               $params['reason'], $params['noredirect'] );
+                       $r['subpages'] = $this->moveSubpages(
+                               $fromTitle,
+                               $toTitle,
+                               $params['reason'],
+                               $params['noredirect'],
+                               $params['tags'] ?: []
+                       );
                        ApiResult::setIndexedTagName( $r['subpages'], 'subpage' );
 
                        if ( $params['movetalk'] ) {
-                               $r['subpages-talk'] = $this->moveSubpages( $fromTalk, $toTalk,
-                                       $params['reason'], $params['noredirect'] );
+                               $r['subpages-talk'] = $this->moveSubpages(
+                                       $fromTalk,
+                                       $toTalk,
+                                       $params['reason'],
+                                       $params['noredirect'],
+                                       $params['tags'] ?: []
+                               );
                                ApiResult::setIndexedTagName( $r['subpages-talk'], 'subpage' );
                        }
                }
@@ -151,26 +174,28 @@ class ApiMove extends ApiBase {
         * @param Title $to
         * @param string $reason
         * @param bool $createRedirect
+        * @param array $changeTags Applied to the entry in the move log and redirect page revision
         * @return Status
         */
-       protected function movePage( Title $from, Title $to, $reason, $createRedirect ) {
+       protected function movePage( Title $from, Title $to, $reason, $createRedirect, $changeTags ) {
                $mp = new MovePage( $from, $to );
                $valid = $mp->isValidMove();
                if ( !$valid->isOK() ) {
                        return $valid;
                }
 
-               $permStatus = $mp->checkPermissions( $this->getUser(), $reason );
+               $user = $this->getUser();
+               $permStatus = $mp->checkPermissions( $user, $reason );
                if ( !$permStatus->isOK() ) {
                        return $permStatus;
                }
 
                // Check suppressredirect permission
-               if ( !$this->getUser()->isAllowed( 'suppressredirect' ) ) {
+               if ( !$user->isAllowed( 'suppressredirect' ) ) {
                        $createRedirect = true;
                }
 
-               return $mp->move( $this->getUser(), $reason, $createRedirect );
+               return $mp->move( $user, $reason, $createRedirect, $changeTags );
        }
 
        /**
@@ -178,13 +203,16 @@ class ApiMove extends ApiBase {
         * @param Title $toTitle
         * @param string $reason
         * @param bool $noredirect
+        * @param array $changeTags Applied to the entry in the move log and redirect page revisions
         * @return array
         */
-       public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect ) {
+       public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect, $changeTags = [] ) {
                $retval = [];
-               $success = $fromTitle->moveSubpages( $toTitle, true, $reason, !$noredirect );
+
+               $success = $fromTitle->moveSubpages( $toTitle, true, $reason, !$noredirect, $changeTags );
                if ( isset( $success[0] ) ) {
-                       return [ 'error' => $this->parseMsg( $success ) ];
+                       $status = $this->errorArrayToStatus( $success );
+                       return [ 'errors' => $this->getErrorFormatter()->arrayFromStatus( $status ) ];
                }
 
                // At least some pages could be moved
@@ -192,7 +220,8 @@ class ApiMove extends ApiBase {
                foreach ( $success as $oldTitle => $newTitle ) {
                        $r = [ 'from' => $oldTitle ];
                        if ( is_array( $newTitle ) ) {
-                               $r['error'] = $this->parseMsg( reset( $newTitle ) );
+                               $status = $this->errorArrayToStatus( $newTitle );
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                        } else {
                                // Success
                                $r['to'] = $newTitle;
@@ -242,7 +271,11 @@ class ApiMove extends ApiBase {
                                        'nochange'
                                ],
                        ],
-                       'ignorewarnings' => false
+                       'ignorewarnings' => false,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index ace776c..e6fe27c 100644 (file)
@@ -391,14 +391,14 @@ class ApiOpenSearchFormatJson extends ApiFormatJson {
        }
 
        public function execute() {
-               if ( !$this->getResult()->getResultData( 'error' ) ) {
-                       $result = $this->getResult();
-
+               $result = $this->getResult();
+               if ( !$result->getResultData( 'error' ) && !$result->getResultData( 'errors' ) ) {
                        // Ignore warnings or treat as errors, as requested
                        $warnings = $result->removeValue( 'warnings', null );
                        if ( $this->warningsAsError && $warnings ) {
-                               $this->dieUsage(
-                                       'Warnings cannot be represented in OpenSearch JSON format', 'warnings', 0,
+                               $this->dieWithError(
+                                       'apierror-opensearch-json-warnings',
+                                       'warnings',
                                        [ 'warnings' => $warnings ]
                                );
                        }
index 8bfe447..466d186 100644 (file)
@@ -36,22 +36,26 @@ class ApiOptions extends ApiBase {
         */
        public function execute() {
                if ( $this->getUser()->isAnon() ) {
-                       $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
-               } elseif ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
-                       $this->dieUsage( "You don't have permission to edit your options", 'permissiondenied' );
+                       $this->dieWithError(
+                               [ 'apierror-mustbeloggedin', $this->msg( 'action-editmyoptions' ) ], 'notloggedin'
+                       );
                }
 
+               $this->checkUserRightsAny( 'editmyoptions' );
+
                $params = $this->extractRequestParams();
                $changed = false;
 
                if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'optionname' ] );
+                       $this->dieWithError( [ 'apierror-missingparam', 'optionname' ] );
                }
 
                // Load the user from the master to reduce CAS errors on double post (T95839)
                $user = $this->getUser()->getInstanceForUpdate();
                if ( !$user ) {
-                       $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
+                       $this->dieWithError(
+                               [ 'apierror-mustbeloggedin', $this->msg( 'action-editmyoptions' ) ], 'notloggedin'
+                       );
                }
 
                if ( $params['reset'] ) {
@@ -71,7 +75,7 @@ class ApiOptions extends ApiBase {
                        $changes[$params['optionname']] = $newValue;
                }
                if ( !$changed && !count( $changes ) ) {
-                       $this->dieUsage( 'No changes were requested', 'nochanges' );
+                       $this->dieWithError( 'apierror-nochanges' );
                }
 
                $prefs = Preferences::getPreferences( $user, $this->getContext() );
@@ -98,26 +102,26 @@ class ApiOptions extends ApiBase {
                                case 'userjs':
                                        // Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
                                        if ( strlen( $key ) > 255 ) {
-                                               $validation = 'key too long (no more than 255 bytes allowed)';
+                                               $validation = $this->msg( 'apiwarn-validationfailed-keytoolong', Message::numParam( 255 ) );
                                        } elseif ( preg_match( '/[^a-zA-Z0-9_-]/', $key ) !== 0 ) {
-                                               $validation = 'invalid key (only a-z, A-Z, 0-9, _, - allowed)';
+                                               $validation = $this->msg( 'apiwarn-validationfailed-badchars' );
                                        } else {
                                                $validation = true;
                                        }
                                        break;
                                case 'special':
-                                       $validation = 'cannot be set by this module';
+                                       $validation = $this->msg( 'apiwarn-validationfailed-cannotset' );
                                        break;
                                case 'unused':
                                default:
-                                       $validation = 'not a valid preference';
+                                       $validation = $this->msg( 'apiwarn-validationfailed-badpref' );
                                        break;
                        }
                        if ( $validation === true ) {
                                $user->setOption( $key, $value );
                                $changed = true;
                        } else {
-                               $this->setWarning( "Validation error for '$key': $validation" );
+                               $this->addWarning( [ 'apiwarn-validationfailed', wfEscapeWikitext( $key ), $validation ] );
                        }
                }
 
index 46c57b8..d42e306 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * This class contains a list of pages that the client has requested.
@@ -154,10 +155,10 @@ class ApiPageSet extends ApiBase {
                        }
                        $generator = $dbSource->getModuleManager()->getModule( $generatorName, null, true );
                        if ( $generator === null ) {
-                               $this->dieUsage( 'Unknown generator=' . $generatorName, 'badgenerator' );
+                               $this->dieWithError( [ 'apierror-badgenerator-unknown', $generatorName ], 'badgenerator' );
                        }
                        if ( !$generator instanceof ApiQueryGeneratorBase ) {
-                               $this->dieUsage( "Module $generatorName cannot be used as a generator", 'badgenerator' );
+                               $this->dieWithError( [ 'apierror-badgenerator-notgenerator', $generatorName ], 'badgenerator' );
                        }
                        // Create a temporary pageset to store generator's output,
                        // add any additional fields generator may need, and execute pageset to populate titles/pageids
@@ -173,7 +174,10 @@ class ApiPageSet extends ApiBase {
                        // populate this pageset with the generator output
                        if ( !$isDryRun ) {
                                $generator->executeGenerator( $this );
-                               Hooks::run( 'APIQueryGeneratorAfterExecute', [ &$generator, &$this ] );
+
+                               // Avoid PHP 7.1 warning of passing $this by reference
+                               $apiModule = $this;
+                               Hooks::run( 'APIQueryGeneratorAfterExecute', [ &$generator, &$apiModule ] );
                        } else {
                                // Prevent warnings from being reported on these parameters
                                $main = $this->getMain();
@@ -193,13 +197,27 @@ class ApiPageSet extends ApiBase {
                        }
                        if ( isset( $this->mParams['pageids'] ) ) {
                                if ( isset( $dataSource ) ) {
-                                       $this->dieUsage( "Cannot use 'pageids' at the same time as '$dataSource'", 'multisource' );
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-cannotusewith',
+                                                       $this->encodeParamName( 'pageids' ),
+                                                       $this->encodeParamName( $dataSource )
+                                               ],
+                                               'multisource'
+                                       );
                                }
                                $dataSource = 'pageids';
                        }
                        if ( isset( $this->mParams['revids'] ) ) {
                                if ( isset( $dataSource ) ) {
-                                       $this->dieUsage( "Cannot use 'revids' at the same time as '$dataSource'", 'multisource' );
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-cannotusewith',
+                                                       $this->encodeParamName( 'revids' ),
+                                                       $this->encodeParamName( $dataSource )
+                                               ],
+                                               'multisource'
+                                       );
                                }
                                $dataSource = 'revids';
                        }
@@ -215,9 +233,7 @@ class ApiPageSet extends ApiBase {
                                                break;
                                        case 'revids':
                                                if ( $this->mResolveRedirects ) {
-                                                       $this->setWarning( 'Redirect resolution cannot be used ' .
-                                                               'together with the revids= parameter. Any redirects ' .
-                                                               'the revids= point to have not been resolved.' );
+                                                       $this->addWarning( 'apiwarn-redirectsandrevids' );
                                                }
                                                $this->mResolveRedirects = false;
                                                $this->initFromRevIDs( $this->mParams['revids'] );
@@ -915,7 +931,7 @@ class ApiPageSet extends ApiBase {
                }
 
                // Get gender information
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $genderCache->doQuery( $usernames, __METHOD__ );
        }
 
@@ -1138,7 +1154,7 @@ class ApiPageSet extends ApiBase {
                                        $this->mAllPages[0][$title] = $this->mFakePageId;
                                        $this->mInvalidTitles[$this->mFakePageId] = [
                                                'title' => $title,
-                                               'invalidreason' => $ex->getMessage(),
+                                               'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
                                        ];
                                        $this->mFakePageId--;
                                        continue; // There's nothing else we can do
@@ -1197,7 +1213,7 @@ class ApiPageSet extends ApiBase {
                        }
                }
                // Get gender information
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $genderCache->doQuery( $usernames, __METHOD__ );
 
                return $linkBatch;
@@ -1411,13 +1427,7 @@ class ApiPageSet extends ApiBase {
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_HELP_MSG => [
                                        'api-pageset-param-converttitles',
-                                       new DeferredStringifier(
-                                               function ( IContextSource $context ) {
-                                                       return $context->getLanguage()
-                                                               ->commaList( LanguageConverter::$languagesWithVariants );
-                                               },
-                                               $this
-                                       )
+                                       [ Message::listParam( LanguageConverter::$languagesWithVariants, 'text' ) ],
                                ],
                        ],
                ];
index caf0cd7..67983e7 100644 (file)
@@ -66,14 +66,17 @@ class ApiParamInfo extends ApiBase {
                                if ( $submodules ) {
                                        try {
                                                $module = $this->getModuleFromPath( $path );
-                                       } catch ( UsageException $ex ) {
-                                               $this->setWarning( $ex->getMessage() );
+                                       } catch ( ApiUsageException $ex ) {
+                                               foreach ( $ex->getStatusValue()->getErrors() as $error ) {
+                                                       $this->addWarning( $error );
+                                               }
+                                               continue;
                                        }
                                        $submodules = $this->listAllSubmodules( $module, $recursive );
                                        if ( $submodules ) {
                                                $modules = array_merge( $modules, $submodules );
                                        } else {
-                                               $this->setWarning( "Module $path has no submodules" );
+                                               $this->addWarning( [ 'apierror-badmodule-nosubmodules', $path ], 'badmodule' );
                                        }
                                } else {
                                        $modules[] = $path;
@@ -108,8 +111,10 @@ class ApiParamInfo extends ApiBase {
                foreach ( $modules as $m ) {
                        try {
                                $module = $this->getModuleFromPath( $m );
-                       } catch ( UsageException $ex ) {
-                               $this->setWarning( $ex->getMessage() );
+                       } catch ( ApiUsageException $ex ) {
+                               foreach ( $ex->getStatusValue()->getErrors() as $error ) {
+                                       $this->addWarning( $error );
+                               }
                                continue;
                        }
                        $key = 'modules';
@@ -232,7 +237,7 @@ class ApiParamInfo extends ApiBase {
 
        /**
         * @param ApiBase $module
-        * @return ApiResult
+        * @return array
         */
        private function getModuleInfo( $module ) {
                $ret = [];
@@ -406,6 +411,30 @@ class ApiParamInfo extends ApiBase {
                                        $item['type'] = array_values( $item['type'] );
                                        ApiResult::setIndexedTagName( $item['type'], 't' );
                                }
+
+                               // Add 'allspecifier' if applicable
+                               if ( $item['type'] === 'namespace' ) {
+                                       $allowAll = true;
+                                       $allSpecifier = ApiBase::ALL_DEFAULT_STRING;
+                               } else {
+                                       $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
+                                               ? $settings[ApiBase::PARAM_ALL]
+                                               : false;
+                                       $allSpecifier = ( is_string( $allowAll ) ? $allowAll : ApiBase::ALL_DEFAULT_STRING );
+                               }
+                               if ( $allowAll && $item['multi'] &&
+                                       ( is_array( $item['type'] ) || $item['type'] === 'namespace' ) ) {
+                                       $item['allspecifier'] = $allSpecifier;
+                               }
+
+                               if ( $item['type'] === 'namespace' &&
+                                       isset( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] ) &&
+                                       is_array( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] )
+                               ) {
+                                       $item['extranamespaces'] = $settings[ApiBase::PARAM_EXTRA_NAMESPACES];
+                                       ApiResult::setArrayType( $item['extranamespaces'], 'array' );
+                                       ApiResult::setIndexedTagName( $item['extranamespaces'], 'ns' );
+                               }
                        }
                        if ( isset( $settings[ApiBase::PARAM_MAX] ) ) {
                                $item['max'] = $settings[ApiBase::PARAM_MAX];
index 0cad5de..287ffb7 100644 (file)
@@ -36,18 +36,18 @@ class ApiParse extends ApiBase {
        /** @var Content $pstContent */
        private $pstContent = null;
 
-       private function checkReadPermissions( Title $title ) {
-               if ( !$title->userCan( 'read', $this->getUser() ) ) {
-                       $this->dieUsage( "You don't have permission to view this page", 'permissiondenied' );
-               }
-       }
-
        public function execute() {
                // The data is hot but user-dependent, like page views, so we set vary cookies
                $this->getMain()->setCacheMode( 'anon-public-user-private' );
 
                // Get parameters
                $params = $this->extractRequestParams();
+
+               // No easy way to say that text & title are allowed together while the
+               // rest aren't, so just do it in two calls.
+               $this->requireMaxOneParameter( $params, 'page', 'pageid', 'oldid', 'text' );
+               $this->requireMaxOneParameter( $params, 'page', 'pageid', 'oldid', 'title' );
+
                $text = $params['text'];
                $title = $params['title'];
                if ( $title === null ) {
@@ -65,21 +65,12 @@ class ApiParse extends ApiBase {
                $model = $params['contentmodel'];
                $format = $params['contentformat'];
 
-               if ( !is_null( $page ) && ( !is_null( $text ) || $titleProvided ) ) {
-                       $this->dieUsage(
-                               'The page parameter cannot be used together with the text and title parameters',
-                               'params'
-                       );
-               }
-
                $prop = array_flip( $params['prop'] );
 
                if ( isset( $params['section'] ) ) {
                        $this->section = $params['section'];
                        if ( !preg_match( '/^((T-)?\d+|new)$/', $this->section ) ) {
-                               $this->dieUsage(
-                                       'The section parameter must be a valid section id or "new"', 'invalidsection'
-                               );
+                               $this->dieWithError( 'apierror-invalidsection' );
                        }
                } else {
                        $this->section = false;
@@ -97,21 +88,20 @@ class ApiParse extends ApiBase {
 
                if ( !is_null( $oldid ) || !is_null( $pageid ) || !is_null( $page ) ) {
                        if ( $this->section === 'new' ) {
-                                       $this->dieUsage(
-                                               'section=new cannot be combined with oldid, pageid or page parameters. ' .
-                                               'Please use text', 'params'
-                                       );
+                               $this->dieWithError( 'apierror-invalidparammix-parse-new-section', 'invalidparammix' );
                        }
                        if ( !is_null( $oldid ) ) {
                                // Don't use the parser cache
                                $rev = Revision::newFromId( $oldid );
                                if ( !$rev ) {
-                                       $this->dieUsage( "There is no revision ID $oldid", 'missingrev' );
+                                       $this->dieWithError( [ 'apierror-nosuchrevid', $oldid ] );
                                }
 
-                               $this->checkReadPermissions( $rev->getTitle() );
+                               $this->checkTitleUserPermissions( $rev->getTitle(), 'read' );
                                if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                                       $this->dieUsage( "You don't have permission to view deleted revisions", 'permissiondenied' );
+                                       $this->dieWithError(
+                                               [ 'apierror-permissiondenied', $this->msg( 'action-deletedtext' ) ]
+                                       );
                                }
 
                                $titleObj = $rev->getTitle();
@@ -131,7 +121,9 @@ class ApiParse extends ApiBase {
                                        $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 
                                        if ( $this->section !== false ) {
-                                               $this->content = $this->getSectionContent( $this->content, 'r' . $rev->getId() );
+                                               $this->content = $this->getSectionContent(
+                                                       $this->content, $this->msg( 'revid', $rev->getId() )
+                                               );
                                        }
 
                                        // Should we save old revision parses to the parser cache?
@@ -167,10 +159,10 @@ class ApiParse extends ApiBase {
                                $pageObj = $this->getTitleOrPageId( $pageParams, 'fromdb' );
                                $titleObj = $pageObj->getTitle();
                                if ( !$titleObj || !$titleObj->exists() ) {
-                                       $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' );
+                                       $this->dieWithError( 'apierror-missingtitle' );
                                }
 
-                               $this->checkReadPermissions( $titleObj );
+                               $this->checkTitleUserPermissions( $titleObj, 'read' );
                                $wgTitle = $titleObj;
 
                                if ( isset( $prop['revid'] ) ) {
@@ -201,7 +193,7 @@ class ApiParse extends ApiBase {
                } else { // Not $oldid, $pageid, $page. Hence based on $text
                        $titleObj = Title::newFromText( $title );
                        if ( !$titleObj || $titleObj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $title ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $title ) ] );
                        }
                        $wgTitle = $titleObj;
                        if ( $titleObj->canExist() ) {
@@ -217,10 +209,7 @@ class ApiParse extends ApiBase {
 
                        if ( !$textProvided ) {
                                if ( $titleProvided && ( $prop || $params['generatexml'] ) ) {
-                                       $this->setWarning(
-                                               "'title' used without 'text', and parsed page properties were requested " .
-                                               "(did you mean to use 'page' instead of 'title'?)"
-                                       );
+                                       $this->addWarning( 'apiwarn-parse-titlewithouttext' );
                                }
                                // Prevent warning from ContentHandler::makeContent()
                                $text = '';
@@ -230,13 +219,15 @@ class ApiParse extends ApiBase {
                        // API title, but default to wikitext to keep BC.
                        if ( $textProvided && !$titleProvided && is_null( $model ) ) {
                                $model = CONTENT_MODEL_WIKITEXT;
-                               $this->setWarning( "No 'title' or 'contentmodel' was given, assuming $model." );
+                               $this->addWarning( [ 'apiwarn-parse-nocontentmodel', $model ] );
                        }
 
                        try {
                                $this->content = ContentHandler::makeContent( $text, $titleObj, $model, $format );
                        } catch ( MWContentSerializationException $ex ) {
-                               $this->dieUsage( $ex->getMessage(), 'parseerror' );
+                               $this->dieWithException( $ex, [
+                                       'wrap' => ApiMessage::create( 'apierror-contentserializationexception', 'parseerror' )
+                               ] );
                        }
 
                        if ( $this->section !== false ) {
@@ -357,10 +348,7 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['headitems'] ) ) {
                        $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
-                       $this->logFeatureUsage( 'action=parse&prop=headitems' );
-                       $this->setWarning( 'headitems is deprecated since MediaWiki 1.28. '
-                               . 'Use prop=headhtml when creating new HTML documents, or '
-                               . 'prop=modules|jsconfigvars when updating a document client-side.' );
+                       $this->addDeprecation( 'apiwarn-deprecation-parse-headitems', 'action=parse&prop=headitems' );
                }
 
                if ( isset( $prop['headhtml'] ) ) {
@@ -397,9 +385,7 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['modules'] ) &&
                        !isset( $prop['jsconfigvars'] ) && !isset( $prop['encodedjsconfigvars'] ) ) {
-                       $this->setWarning( 'Property "modules" was set but not "jsconfigvars" ' .
-                               'or "encodedjsconfigvars". Configuration variables are necessary ' .
-                               'for proper module usage.' );
+                       $this->addWarning( 'apiwarn-moduleswithoutvars' );
                }
 
                if ( isset( $prop['indicators'] ) ) {
@@ -435,7 +421,7 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
-                               $this->dieUsage( 'parsetree is only supported for wikitext content', 'notwikitext' );
+                               $this->dieWithError( 'apierror-parsetree-notwikitext', 'notwikitext' );
                        }
 
                        $wgParser->startExternalParse( $titleObj, $popts, Parser::OT_PREPROCESS );
@@ -516,7 +502,7 @@ class ApiParse extends ApiBase {
                // getParserOutput will save to Parser cache if able
                $pout = $page->getParserOutput( $popts );
                if ( !$pout ) {
-                       $this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' );
+                       $this->dieWithError( [ 'apierror-nosuchrevid', $page->getLatest() ] );
                }
                if ( $getWikitext ) {
                        $this->content = $page->getContent( Revision::RAW );
@@ -538,7 +524,9 @@ class ApiParse extends ApiBase {
                if ( $this->section !== false && $content !== null ) {
                        $content = $this->getSectionContent(
                                $content,
-                               !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText()
+                               !is_null( $pageId )
+                                       ? $this->msg( 'pageid', $pageId )
+                                       : $page->getTitle()->getPrefixedText()
                        );
                }
                return $content;
@@ -548,17 +536,17 @@ class ApiParse extends ApiBase {
         * Extract the requested section from the given Content
         *
         * @param Content $content
-        * @param string $what Identifies the content in error messages, e.g. page title.
+        * @param string|Message $what Identifies the content in error messages, e.g. page title.
         * @return Content|bool
         */
        private function getSectionContent( Content $content, $what ) {
                // Not cached (save or load)
                $section = $content->getSection( $this->section );
                if ( $section === false ) {
-                       $this->dieUsage( "There is no section {$this->section} in $what", 'nosuchsection' );
+                       $this->dieWithError( [ 'apierror-nosuchsection-what', $this->section, $what ], 'nosuchsection' );
                }
                if ( $section === null ) {
-                       $this->dieUsage( "Sections are not supported by $what", 'nosuchsection' );
+                       $this->dieWithError( [ 'apierror-sectionsnotsupported-what', $what ], 'nosuchsection' );
                        $section = false;
                }
 
index 6252882..c33542f 100644 (file)
@@ -40,19 +40,16 @@ class ApiPatrol extends ApiBase {
                if ( isset( $params['rcid'] ) ) {
                        $rc = RecentChange::newFromId( $params['rcid'] );
                        if ( !$rc ) {
-                               $this->dieUsageMsg( [ 'nosuchrcid', $params['rcid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrcid', $params['rcid'] ] );
                        }
                } else {
                        $rev = Revision::newFromId( $params['revid'] );
                        if ( !$rev ) {
-                               $this->dieUsageMsg( [ 'nosuchrevid', $params['revid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['revid'] ] );
                        }
                        $rc = $rev->getRecentChange();
                        if ( !$rc ) {
-                               $this->dieUsage(
-                                       'The revision ' . $params['revid'] . " can't be patrolled as it's too old",
-                                       'notpatrollable'
-                               );
+                               $this->dieWithError( [ 'apierror-notpatrollable', $params['revid'] ] );
                        }
                }
 
@@ -70,7 +67,7 @@ class ApiPatrol extends ApiBase {
                $retval = $rc->doMarkPatrolled( $user, false, $tags );
 
                if ( $retval ) {
-                       $this->dieUsageMsg( reset( $retval ) );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval, $user ) );
                }
 
                $result = [ 'rcid' => intval( $rc->getAttribute( 'rc_id' ) ) ];
index d289060..c74f890 100644 (file)
  */
 class ApiProtect extends ApiBase {
        public function execute() {
-               global $wgContLang;
-
                $params = $this->extractRequestParams();
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
                $titleObj = $pageObj->getTitle();
 
-               $errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
-               if ( $errors ) {
-                       // We don't care about multiple errors, just report one of them
-                       $this->dieUsageMsg( reset( $errors ) );
-               }
+               $this->checkTitleUserPermissions( $titleObj, 'protect' );
 
                $user = $this->getUser();
                $tags = $params['tags'];
@@ -58,8 +52,8 @@ class ApiProtect extends ApiBase {
                        if ( count( $expiry ) == 1 ) {
                                $expiry = array_fill( 0, count( $params['protections'] ), $expiry[0] );
                        } else {
-                               $this->dieUsageMsg( [
-                                       'toofewexpiries',
+                               $this->dieWithError( [
+                                       'apierror-toofewexpiries',
                                        count( $expiry ),
                                        count( $params['protections'] )
                                ] );
@@ -76,17 +70,17 @@ class ApiProtect extends ApiBase {
                        $protections[$p[0]] = ( $p[1] == 'all' ? '' : $p[1] );
 
                        if ( $titleObj->exists() && $p[0] == 'create' ) {
-                               $this->dieUsageMsg( 'create-titleexists' );
+                               $this->dieWithError( 'apierror-create-titleexists' );
                        }
                        if ( !$titleObj->exists() && $p[0] != 'create' ) {
-                               $this->dieUsageMsg( 'missingtitle-createonly' );
+                               $this->dieWithError( 'apierror-missingtitle-createonly' );
                        }
 
                        if ( !in_array( $p[0], $restrictionTypes ) && $p[0] != 'create' ) {
-                               $this->dieUsageMsg( [ 'protect-invalidaction', $p[0] ] );
+                               $this->dieWithError( [ 'apierror-protect-invalidaction', wfEscapeWikiText( $p[0] ) ] );
                        }
                        if ( !in_array( $p[1], $this->getConfig()->get( 'RestrictionLevels' ) ) && $p[1] != 'all' ) {
-                               $this->dieUsageMsg( [ 'protect-invalidlevel', $p[1] ] );
+                               $this->dieWithError( [ 'apierror-protect-invalidlevel', wfEscapeWikiText( $p[1] ) ] );
                        }
 
                        if ( wfIsInfinity( $expiry[$i] ) ) {
@@ -94,18 +88,18 @@ class ApiProtect extends ApiBase {
                        } else {
                                $exp = strtotime( $expiry[$i] );
                                if ( $exp < 0 || !$exp ) {
-                                       $this->dieUsageMsg( [ 'invalidexpiry', $expiry[$i] ] );
+                                       $this->dieWithError( [ 'apierror-invalidexpiry', wfEscapeWikiText( $expiry[$i] ) ] );
                                }
 
                                $exp = wfTimestamp( TS_MW, $exp );
                                if ( $exp < wfTimestampNow() ) {
-                                       $this->dieUsageMsg( [ 'pastexpiry', $expiry[$i] ] );
+                                       $this->dieWithError( [ 'apierror-pastexpiry', wfEscapeWikiText( $expiry[$i] ) ] );
                                }
                                $expiryarray[$p[0]] = $exp;
                        }
                        $resultProtections[] = [
                                $p[0] => $protections[$p[0]],
-                               'expiry' => $wgContLang->formatExpiry( $expiryarray[$p[0]], TS_ISO_8601, 'infinite' ),
+                               'expiry' => ApiResult::formatExpiry( $expiryarray[$p[0]], 'infinite' ),
                        ];
                }
 
index 8bbd88d..3124638 100644 (file)
@@ -37,12 +37,6 @@ class ApiPurge extends ApiBase {
         * Purges the cache of a page
         */
        public function execute() {
-               $main = $this->getMain();
-               if ( !$main->isInternalMode() && !$main->getRequest()->wasPosted() ) {
-                       $this->logFeatureUsage( 'purge-via-GET' );
-                       $this->setWarning( 'Use of action=purge via GET is deprecated. Use POST instead.' );
-               }
-
                $params = $this->extractRequestParams();
 
                $continuationManager = new ApiContinuationManager( $this, [], [] );
@@ -61,16 +55,11 @@ class ApiPurge extends ApiBase {
                        ApiQueryBase::addTitleInfo( $r, $title );
                        $page = WikiPage::factory( $title );
                        if ( !$user->pingLimiter( 'purge' ) ) {
-                               $flags = WikiPage::PURGE_ALL;
-                               if ( !$this->getRequest()->wasPosted() ) {
-                                       $flags ^= WikiPage::PURGE_GLOBAL_PCACHE; // skip DB_MASTER write
-                               }
                                // Directly purge and skip the UI part of purge()
-                               $page->doPurge( $flags );
+                               $page->doPurge( WikiPage::PURGE_ALL );
                                $r['purged'] = true;
                        } else {
-                               $error = $this->parseMsg( [ 'actionthrottledtext' ] );
-                               $this->setWarning( $error['info'] );
+                               $this->addWarning( 'apierror-ratelimited' );
                        }
 
                        if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
@@ -114,8 +103,7 @@ class ApiPurge extends ApiBase {
                                                }
                                        }
                                } else {
-                                       $error = $this->parseMsg( [ 'actionthrottledtext' ] );
-                                       $this->setWarning( $error['info'] );
+                                       $this->addWarning( 'apierror-ratelimited' );
                                        $forceLinkUpdate = false;
                                }
                        }
@@ -160,20 +148,7 @@ class ApiPurge extends ApiBase {
        }
 
        public function mustBePosted() {
-               // Anonymous users are not allowed a non-POST request
-               return !$this->getUser()->isAllowed( 'purge' );
-       }
-
-       protected function getHelpFlags() {
-               $flags = parent::getHelpFlags();
-
-               // Claim that we must be posted for the purposes of help and paraminfo.
-               // @todo Remove this when self::mustBePosted() is updated for T145649
-               if ( !in_array( 'mustbeposted', $flags, true ) ) {
-                       $flags[] = 'mustbeposted';
-               }
-
-               return $flags;
+               return true;
        }
 
        public function getAllowedParams( $flags = 0 ) {
index 16bd725..8196cfa 100644 (file)
@@ -310,7 +310,7 @@ class ApiQuery extends ApiBase {
                                        ApiBase::dieDebug( __METHOD__, 'Error instantiating module' );
                                }
                                if ( !$wasPosted && $instance->mustBePosted() ) {
-                                       $this->dieUsageMsgOrDebug( [ 'mustbeposted', $moduleName ] );
+                                       $this->dieWithErrorOrDebug( [ 'apierror-mustbeposted', $moduleName ] );
                                }
                                // Ignore duplicates. TODO 2.0: die()?
                                if ( !array_key_exists( $moduleName, $modules ) ) {
@@ -415,11 +415,7 @@ class ApiQuery extends ApiBase {
                }
 
                if ( !$fit ) {
-                       $this->dieUsage(
-                               'The value of $wgAPIMaxResultSize on this wiki is ' .
-                                       'too small to hold basic result information',
-                               'badconfig'
-                       );
+                       $this->dieWithError( 'apierror-badconfig-resulttoosmall', 'badconfig' );
                }
 
                if ( $this->mParams['export'] ) {
index 3073a95..b09b977 100644 (file)
@@ -41,15 +41,10 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
         * @return void
         */
        protected function run( ApiPageSet $resultPageSet = null ) {
-               $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted revision information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
+               $user = $this->getUser();
                $db = $this->getDB();
                $params = $this->extractRequestParams( false );
 
@@ -75,16 +70,20 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        foreach ( [ 'from', 'to', 'prefix', 'excludeuser' ] as $param ) {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
-                                       $this->dieUsage( "The '{$p}{$param}' parameter cannot be used with '{$p}user'",
-                                               'badparams' );
+                                       $this->dieWithError(
+                                               [ 'apierror-invalidparammix-cannotusewith', $p.$param, "{$p}user" ],
+                                               'invalidparammix'
+                                       );
                                }
                        }
                } else {
                        foreach ( [ 'start', 'end' ] as $param ) {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
-                                       $this->dieUsage( "The '{$p}{$param}' parameter may only be used with '{$p}user'",
-                                               'badparams' );
+                                       $this->dieWithError(
+                                               [ 'apierror-invalidparammix-mustusewith', $p.$param, "{$p}user" ],
+                                               'invalidparammix'
+                                       );
                                }
                        }
                }
@@ -100,7 +99,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                $optimizeGenerateTitles = true;
                        } else {
                                $p = $this->getModulePrefix();
-                               $this->setWarning( "For better performance when generating titles, set {$p}dir=newer" );
+                               $this->addWarning( [ 'apiwarn-alldeletedrevisions-performance', $p ], 'performance' );
                        }
                }
 
@@ -148,12 +147,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addFields( [ 'ar_text', 'ar_flags', 'old_text', 'old_flags' ] );
 
                        // This also means stricter restrictions
-                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
-                               $this->dieUsage(
-                                       'You don\'t have permission to view deleted revision content',
-                                       'permissiondenied'
-                               );
-                       }
+                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
                }
 
                $miser_ns = null;
index 8734f38..ef6bb6a 100644 (file)
@@ -64,11 +64,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
         */
        public function executeGenerator( $resultPageSet ) {
                if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage(
-                               'Use "gaifilterredir=nonredirects" option instead of "redirects" ' .
-                                       'when using allimages as a generator',
-                               'params'
-                       );
+                       $this->dieWithError( 'apierror-allimages-redirect', 'invalidparammix' );
                }
 
                $this->run( $resultPageSet );
@@ -81,10 +77,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        private function run( $resultPageSet = null ) {
                $repo = $this->mRepo;
                if ( !$repo instanceof LocalRepo ) {
-                       $this->dieUsage(
-                               'Local file repository does not support querying all images',
-                               'unsupportedrepo'
-                       );
+                       $this->dieWithError( 'apierror-unsupportedrepo' );
                }
 
                $prefix = $this->getModulePrefix();
@@ -109,16 +102,24 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $disallowed = [ 'start', 'end', 'user' ];
                        foreach ( $disallowed as $pname ) {
                                if ( isset( $params[$pname] ) ) {
-                                       $this->dieUsage(
-                                               "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=timestamp",
-                                               'badparams'
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-mustusewith',
+                                                       "{$prefix}{$pname}",
+                                                       "{$prefix}sort=timestamp"
+                                               ],
+                                               'invalidparammix'
                                        );
                                }
                        }
                        if ( $params['filterbots'] != 'all' ) {
-                               $this->dieUsage(
-                                       "Parameter '{$prefix}filterbots' can only be used with {$prefix}sort=timestamp",
-                                       'badparams'
+                               $this->dieWithError(
+                                       [
+                                               'apierror-invalidparammix-mustusewith',
+                                               "{$prefix}filterbots",
+                                               "{$prefix}sort=timestamp"
+                                       ],
+                                       'invalidparammix'
                                );
                        }
 
@@ -146,18 +147,21 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $disallowed = [ 'from', 'to', 'prefix' ];
                        foreach ( $disallowed as $pname ) {
                                if ( isset( $params[$pname] ) ) {
-                                       $this->dieUsage(
-                                               "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name",
-                                               'badparams'
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-mustusewith',
+                                                       "{$prefix}{$pname}",
+                                                       "{$prefix}sort=name"
+                                               ],
+                                               'invalidparammix'
                                        );
                                }
                        }
                        if ( !is_null( $params['user'] ) && $params['filterbots'] != 'all' ) {
                                // Since filterbots checks if each user has the bot right, it
                                // doesn't make sense to use it with user
-                               $this->dieUsage(
-                                       "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together",
-                                       'badparams'
+                               $this->dieWithError(
+                                       [ 'apierror-invalidparammix-cannotusewith', "{$prefix}user", "{$prefix}filterbots" ]
                                );
                        }
 
@@ -193,7 +197,10 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                        'LEFT JOIN',
                                        [
                                                'ug_group' => User::getGroupsWithPermission( 'bot' ),
-                                               'ug_user = img_user'
+                                               'ug_user = img_user',
+                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
+                                                       '1' :
+                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                        ]
                                ] ] );
                                $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL' : 'NOT NULL' );
@@ -214,13 +221,13 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                if ( isset( $params['sha1'] ) ) {
                        $sha1 = strtolower( $params['sha1'] );
                        if ( !$this->validateSha1Hash( $sha1 ) ) {
-                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
+                               $this->dieWithError( 'apierror-invalidsha1hash' );
                        }
                        $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
                } elseif ( isset( $params['sha1base36'] ) ) {
                        $sha1 = strtolower( $params['sha1base36'] );
                        if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
-                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
+                               $this->dieWithError( 'apierror-invalidsha1base36hash' );
                        }
                }
                if ( $sha1 ) {
@@ -229,7 +236,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                if ( !is_null( $params['mime'] ) ) {
                        if ( $this->getConfig()->get( 'MiserMode' ) ) {
-                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
+                               $this->dieWithError( 'apierror-mimesearchdisabled' );
                        }
 
                        $mimeConds = [];
index ac90605..3b24e37 100644 (file)
@@ -116,9 +116,13 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        $matches = array_intersect_key( $prop, $this->props + [ 'ids' => 1 ] );
                        if ( $matches ) {
                                $p = $this->getModulePrefix();
-                               $this->dieUsage(
-                                       "Cannot use {$p}prop=" . implode( '|', array_keys( $matches ) ) . " with {$p}unique",
-                                       'params'
+                               $this->dieWithError(
+                                       [
+                                               'apierror-invalidparammix-cannotusewith',
+                                               "{$p}prop=" . implode( '|', array_keys( $matches ) ),
+                                               "{$p}unique"
+                                       ],
+                                       'invalidparammix'
                                );
                        }
                        $this->addOption( 'DISTINCT' );
@@ -259,7 +263,8 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        ],
                        'namespace' => [
                                ApiBase::PARAM_DFLT => $this->dfltNamespace,
-                               ApiBase::PARAM_TYPE => 'namespace'
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'limit' => [
                                ApiBase::PARAM_DFLT => 10,
index e0ba4ea..244effc 100644 (file)
@@ -41,7 +41,9 @@ class ApiQueryAllMessages extends ApiQueryBase {
                if ( is_null( $params['lang'] ) ) {
                        $langObj = $this->getLanguage();
                } elseif ( !Language::isValidCode( $params['lang'] ) ) {
-                       $this->dieUsage( 'Invalid language code for parameter lang', 'invalidlang' );
+                       $this->dieWithError(
+                               [ 'apierror-invalidlang', $this->encodeParamName( 'lang' ) ], 'invalidlang'
+                       );
                } else {
                        $langObj = Language::factory( $params['lang'] );
                }
@@ -50,7 +52,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        if ( !is_null( $params['title'] ) ) {
                                $title = Title::newFromText( $params['title'] );
                                if ( !$title || $title->isExternal() ) {
-                                       $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                                }
                        } else {
                                $title = Title::newFromText( 'API' );
index 0ce1939..7460bd5 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Query module to enumerate all available pages.
@@ -49,11 +50,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
         */
        public function executeGenerator( $resultPageSet ) {
                if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage(
-                               'Use "gapfilterredir=nonredirects" option instead of "redirects" ' .
-                                       'when using allpages as a generator',
-                               'params'
-                       );
+                       $this->dieWithError( 'apierror-allpages-generator-redirects', 'params' );
                }
 
                $this->run( $resultPageSet );
@@ -156,7 +153,9 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 
                        $this->addOption( 'DISTINCT' );
                } elseif ( isset( $params['prlevel'] ) ) {
-                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
+                       $this->dieWithError(
+                               [ 'apierror-invalidparammix-mustusewith', 'prlevel', 'prtype' ], 'invalidparammix'
+                       );
                }
 
                if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
@@ -206,7 +205,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        foreach ( $res as $row ) {
                                $users[] = $row->page_title;
                        }
-                       GenderCache::singleton()->doQuery( $users, __METHOD__ );
+                       MediaWikiServices::getInstance()->getGenderCache()->doQuery( $users, __METHOD__ );
                        $res->rewind(); // reset
                }
 
index b7ed9dd..136f60e 100644 (file)
@@ -110,16 +110,24 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        }
                }
 
-               if ( !is_null( $params['group'] ) && !is_null( $params['excludegroup'] ) ) {
-                       $this->dieUsage( 'group and excludegroup cannot be used together', 'group-excludegroup' );
-               }
+               $this->requireMaxOneParameter( $params, 'group', 'excludegroup' );
 
                if ( !is_null( $params['group'] ) && count( $params['group'] ) ) {
                        // Filter only users that belong to a given group. This might
                        // produce as many rows-per-user as there are groups being checked.
                        $this->addTables( 'user_groups', 'ug1' );
-                       $this->addJoinConds( [ 'ug1' => [ 'INNER JOIN', [ 'ug1.ug_user=user_id',
-                               'ug1.ug_group' => $params['group'] ] ] ] );
+                       $this->addJoinConds( [
+                               'ug1' => [
+                                       'INNER JOIN',
+                                       [
+                                               '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() )
+                                       ]
+                               ]
+                       ] );
                        $maxDuplicateRows *= count( $params['group'] );
                }
 
@@ -137,7 +145,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                ) ];
                        }
                        $this->addJoinConds( [ 'ug1' => [ 'LEFT OUTER JOIN',
-                               array_merge( [ 'ug1.ug_user=user_id' ], $exclude )
+                               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() )
+                               ], $exclude )
                        ] ] );
                        $this->addWhere( 'ug1.ug_user IS NULL' );
                }
@@ -150,7 +163,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                if ( $fld_groups || $fld_rights ) {
                        $this->addFields( [ 'groups' =>
-                               $db->buildGroupConcatField( '|', 'user_groups', 'ug_group', 'ug_user=user_id' )
+                               $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() )
+                               ] )
                        ] );
                }
 
index fb502e4..613589e 100644 (file)
@@ -344,12 +344,12 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $this->validateLimit( 'limit', $this->params['limit'], 1, $userMax, $botMax );
                }
 
-               $this->rootTitle = $this->getTitleOrPageId( $this->params )->getTitle();
+               $this->rootTitle = $this->getTitleFromTitleOrPageId( $this->params );
 
                // only image titles are allowed for the root in imageinfo mode
                if ( !$this->hasNS && $this->rootTitle->getNamespace() !== NS_FILE ) {
-                       $this->dieUsage(
-                               "The title for {$this->getModuleName()} query must be a file",
+                       $this->dieWithError(
+                               [ 'apierror-imageusage-badtitle', $this->getModuleName() ],
                                'bad_image_title'
                        );
                }
index 8e89c32..4ed7f52 100644 (file)
@@ -104,6 +104,13 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                $titles = $pageSet->getGoodAndMissingTitles();
                $map = $pageSet->getGoodAndMissingTitlesByNamespace();
 
+               // Add in special pages, they can theoretically have backlinks too.
+               // (although currently they only do for prop=redirects)
+               foreach ( $pageSet->getSpecialTitles() as $id => $title ) {
+                       $titles[] = $title;
+                       $map[$title->getNamespace()][$title->getDBkey()] = $id;
+               }
+
                // Determine our fields to query on
                $p = $settings['prefix'];
                $hasNS = !isset( $settings['to_namespace'] );
@@ -220,8 +227,9 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                $this->addFieldsIf( 'page_namespace', $miser_ns !== null );
 
                if ( $hasNS ) {
-                       $lb = new LinkBatch( $titles );
-                       $this->addWhere( $lb->constructSet( $p, $db ) );
+                       // Can't use LinkBatch because it throws away Special titles.
+                       // And we already have the needed data structure anyway.
+                       $this->addWhere( $db->makeWhereFrom2d( $map, $bl_namespace, $bl_title ) );
                } else {
                        $where = [];
                        foreach ( $titles as $t ) {
@@ -238,7 +246,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                        if ( isset( $show['fragment'] ) && isset( $show['!fragment'] ) ||
                                isset( $show['redirect'] ) && isset( $show['!redirect'] )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
                        $this->addWhereIf( "rd_fragment != $emptyString", isset( $show['fragment'] ) );
                        $this->addWhereIf(
index bba5375..2d21865 100644 (file)
@@ -258,7 +258,7 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Equivalent to addWhere(array($field => $value))
         * @param string $field Field name
-        * @param string $value Value; ignored if null or empty array;
+        * @param string|string[] $value Value; ignored if null or empty array;
         */
        protected function addWhereFld( $field, $value ) {
                // Use count() to its full documented capabilities to simultaneously
@@ -325,7 +325,7 @@ abstract class ApiQueryBase extends ApiBase {
         * Add an option such as LIMIT or USE INDEX. If an option was set
         * before, the old value will be overwritten
         * @param string $name Option name
-        * @param string $value Option value
+        * @param string|string[] $value Option value
         */
        protected function addOption( $name, $value = null ) {
                if ( is_null( $value ) ) {
@@ -421,7 +421,7 @@ abstract class ApiQueryBase extends ApiBase {
 
                        $likeQuery = LinkFilter::makeLikeArray( $query, $protocol );
                        if ( !$likeQuery ) {
-                               $this->dieUsage( 'Invalid query', 'bad_query' );
+                               $this->dieWithError( 'apierror-badquery' );
                        }
 
                        $likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
@@ -547,7 +547,7 @@ abstract class ApiQueryBase extends ApiBase {
                $t = Title::makeTitleSafe( $namespace, $titlePart . 'x' );
                if ( !$t || $t->hasFragment() ) {
                        // Invalid title (e.g. bad chars) or contained a '#'.
-                       $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titlePart ) ] );
                }
                if ( $namespace != $t->getNamespace() || $t->isExternal() ) {
                        // This can happen in two cases. First, if you call titlePartToKey with a title part
@@ -555,7 +555,7 @@ abstract class ApiQueryBase extends ApiBase {
                        // difficult to handle such a case. Such cases cannot exist and are therefore treated
                        // as invalid user input. The second case is when somebody specifies a title interwiki
                        // prefix.
-                       $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titlePart ) ] );
                }
 
                return substr( $t->getDBkey(), 0, -1 );
@@ -573,7 +573,7 @@ abstract class ApiQueryBase extends ApiBase {
                $t = Title::newFromText( $titlePart . 'x', $defaultNamespace );
                if ( !$t || $t->hasFragment() || $t->isExternal() ) {
                        // Invalid title (e.g. bad chars) or contained a '#'.
-                       $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titlePart ) ] );
                }
 
                return [ $t->getNamespace(), substr( $t->getDBkey(), 0, -1 ) ];
@@ -584,7 +584,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool
         */
        public function validateSha1Hash( $hash ) {
-               return preg_match( '/^[a-f0-9]{40}$/', $hash );
+               return (bool)preg_match( '/^[a-f0-9]{40}$/', $hash );
        }
 
        /**
@@ -592,7 +592,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool
         */
        public function validateSha1Base36Hash( $hash ) {
-               return preg_match( '/^[a-z0-9]{31}$/', $hash );
+               return (bool)preg_match( '/^[a-z0-9]{31}$/', $hash );
        }
 
        /**
index 5d7c664..0040860 100644 (file)
@@ -36,8 +36,6 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function execute() {
-               global $wgContLang;
-
                $db = $this->getDB();
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'users', 'ip' );
@@ -114,16 +112,13 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $cidrLimit = $blockCIDRLimit['IPv6'];
                                $prefixLen = 3; // IP::toHex output is prefixed with "v6-"
                        } else {
-                               $this->dieUsage( 'IP parameter is not valid', 'param_ip' );
+                               $this->dieWithError( 'apierror-badip', 'param_ip' );
                        }
 
                        # Check range validity, if it's a CIDR
                        list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
                        if ( $ip !== false && $range !== false && $range < $cidrLimit ) {
-                               $this->dieUsage(
-                                       "$type CIDR ranges broader than /$cidrLimit are not accepted",
-                                       'cidrtoobroad'
-                               );
+                               $this->dieWithError( [ 'apierror-cidrtoobroad', $type, $cidrLimit ] );
                        }
 
                        # Let IP::parseRange handle calculating $upper, instead of duplicating the logic here.
@@ -154,7 +149,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                                || ( isset( $show['range'] ) && isset( $show['!range'] ) )
                                || ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        $this->addWhereIf( 'ipb_user = 0', isset( $show['!account'] ) );
@@ -207,7 +202,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $block['timestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
                        }
                        if ( $fld_expiry ) {
-                               $block['expiry'] = $wgContLang->formatExpiry( $row->ipb_expiry, TS_ISO_8601 );
+                               $block['expiry'] = ApiResult::formatExpiry( $row->ipb_expiry );
                        }
                        if ( $fld_reason ) {
                                $block['reason'] = $row->ipb_reason;
@@ -237,13 +232,19 @@ class ApiQueryBlocks extends ApiQueryBase {
 
        protected function prepareUsername( $user ) {
                if ( !$user ) {
-                       $this->dieUsage( 'User parameter may not be empty', 'param_user' );
+                       $encParamName = $this->encodeParamName( 'users' );
+                       $this->dieWithError( [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $user ) ],
+                               "baduser_{$encParamName}"
+                       );
                }
                $name = User::isIP( $user )
                        ? $user
                        : User::getCanonicalName( $user, 'valid' );
                if ( $name === false ) {
-                       $this->dieUsage( "User name {$user} is not valid", 'param_user' );
+                       $encParamName = $this->encodeParamName( 'users' );
+                       $this->dieWithError( [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $user ) ],
+                               "baduser_{$encParamName}"
+                       );
                }
                return $name;
        }
index 63d0f6d..f2498ca 100644 (file)
@@ -74,7 +74,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                        foreach ( $params['categories'] as $cat ) {
                                $title = Title::newFromText( $cat );
                                if ( !$title || $title->getNamespace() != NS_CATEGORY ) {
-                                       $this->setWarning( "\"$cat\" is not a category" );
+                                       $this->addWarning( [ 'apiwarn-invalidcategory', wfEscapeWikiText( $cat ) ] );
                                } else {
                                        $cats[] = $title->getDBkey();
                                }
@@ -96,7 +96,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                }
 
                if ( isset( $show['hidden'] ) && isset( $show['!hidden'] ) ) {
-                       $this->dieUsageMsg( 'show' );
+                       $this->dieWithError( 'apierror-show' );
                }
                if ( isset( $show['hidden'] ) || isset( $show['!hidden'] ) || isset( $prop['hidden'] ) ) {
                        $this->addOption( 'STRAIGHT_JOIN' );
index 4865ad5..3a8847c 100644 (file)
@@ -53,7 +53,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
         */
        private function validateHexSortkey( $hexSortkey ) {
                // A hex sortkey has an unbound number of 2 letter pairs
-               return preg_match( '/^(?:[a-fA-F0-9]{2})*$/D', $hexSortkey );
+               return (bool)preg_match( '/^(?:[a-fA-F0-9]{2})*$/D', $hexSortkey );
        }
 
        /**
@@ -65,7 +65,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
                $categoryTitle = $this->getTitleOrPageId( $params )->getTitle();
                if ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
-                       $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
+                       $this->dieWithError( 'apierror-invalidcategory' );
                }
 
                $prop = array_flip( $params['prop'] );
@@ -153,7 +153,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        $startsortkey = Collation::singleton()->getSortKey( $params['startsortkeyprefix'] );
                                } elseif ( $params['starthexsortkey'] !== null ) {
                                        if ( !$this->validateHexSortkey( $params['starthexsortkey'] ) ) {
-                                               $this->dieUsage( 'The starthexsortkey provided is not valid', 'bad_starthexsortkey' );
+                                               $encParamName = $this->encodeParamName( 'starthexsortkey' );
+                                               $this->dieWithError( [ 'apierror-badparameter', $encParamName ], "badvalue_$encParamName" );
                                        }
                                        $startsortkey = hex2bin( $params['starthexsortkey'] );
                                } else {
@@ -163,7 +164,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        $endsortkey = Collation::singleton()->getSortKey( $params['endsortkeyprefix'] );
                                } elseif ( $params['endhexsortkey'] !== null ) {
                                        if ( !$this->validateHexSortkey( $params['endhexsortkey'] ) ) {
-                                               $this->dieUsage( 'The endhexsortkey provided is not valid', 'bad_endhexsortkey' );
+                                               $encParamName = $this->encodeParamName( 'endhexsortkey' );
+                                               $this->dieWithError( [ 'apierror-badparameter', $encParamName ], "badvalue_$encParamName" );
                                        }
                                        $endsortkey = hex2bin( $params['endhexsortkey'] );
                                } else {
index ac5ccca..148e315 100644 (file)
@@ -160,7 +160,13 @@ class ApiQueryContributors extends ApiQueryBase {
                        $this->addTables( 'user_groups' );
                        $this->addJoinConds( [ 'user_groups' => [
                                $excludeGroups ? 'LEFT OUTER JOIN' : 'INNER JOIN',
-                               [ 'ug_user=rev_user', 'ug_group' => $limitGroups ]
+                               [
+                                       'ug_user=rev_user',
+                                       'ug_group' => $limitGroups,
+                                       $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
+                                               '1' :
+                                               'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                               ]
                        ] ] );
                        $this->addWhereIf( 'ug_user IS NULL', $excludeGroups );
                }
index cfd0653..d0b8214 100644 (file)
@@ -39,12 +39,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
        protected function run( ApiPageSet $resultPageSet = null ) {
                $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted revision information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
                $pageSet = $this->getPageSet();
                $pageMap = $pageSet->getGoodAndMissingTitlesByNamespace();
@@ -63,9 +58,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
 
                $db = $this->getDB();
 
-               if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
-               }
+               $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
 
                $this->addTables( 'archive' );
                if ( $resultPageSet === null ) {
@@ -106,12 +99,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addFields( [ 'ar_text', 'ar_flags', 'old_text', 'old_flags' ] );
 
                        // This also means stricter restrictions
-                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
-                               $this->dieUsage(
-                                       'You don\'t have permission to view deleted revision content',
-                                       'permissiondenied'
-                               );
-                       }
+                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
                }
 
                $dir = $params['dir'];
index d58efa1..6a259cd 100644 (file)
@@ -37,21 +37,12 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
        }
 
        public function execute() {
-               $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted revision information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
-               $this->setWarning(
-                       'list=deletedrevs has been deprecated. Please use prop=deletedrevisions or ' .
-                       'list=alldeletedrevisions instead.'
-               );
-               $this->logFeatureUsage( 'action=query&list=deletedrevs' );
+               $this->addDeprecation( 'apiwarn-deprecation-deletedrevs', 'action=query&list=deletedrevs' );
 
+               $user = $this->getUser();
                $db = $this->getDB();
                $params = $this->extractRequestParams( false );
                $prop = array_flip( $params['prop'] );
@@ -70,9 +61,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                if ( isset( $prop['token'] ) ) {
                        $p = $this->getModulePrefix();
-                       $this->setWarning(
-                               "{$p}prop=token has been deprecated. Please use action=query&meta=tokens instead."
-                       );
                }
 
                // If we're in a mode that breaks the same-origin policy, no tokens can
@@ -105,19 +93,19 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        // Ignore namespace and unique due to inability to know whether they were purposely set
                        foreach ( [ 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ] as $p ) {
                                if ( !is_null( $params[$p] ) ) {
-                                       $this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
+                                       $this->dieWithError( [ 'apierror-deletedrevs-param-not-1-2', $p ], 'badparams' );
                                }
                        }
                } else {
                        foreach ( [ 'start', 'end' ] as $p ) {
                                if ( !is_null( $params[$p] ) ) {
-                                       $this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams' );
+                                       $this->dieWithError( [ 'apierror-deletedrevs-param-not-3', $p ], 'badparams' );
                                }
                        }
                }
 
                if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
+                       $this->dieWithError( 'user and excludeuser cannot be used together', 'badparams' );
                }
 
                $this->addTables( 'archive' );
@@ -162,12 +150,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        $this->addFields( [ 'ar_text', 'ar_flags', 'ar_text_id', 'old_text', 'old_flags' ] );
 
                        // This also means stricter restrictions
-                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
-                               $this->dieUsage(
-                                       'You don\'t have permission to view deleted revision content',
-                                       'permissiondenied'
-                               );
-                       }
+                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
                }
                // Check limits
                $userMax = $fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1;
index e1c97e1..9476066 100644 (file)
@@ -37,7 +37,7 @@
 class ApiQueryDisabled extends ApiQueryBase {
 
        public function execute() {
-               $this->setWarning( "The \"{$this->getModuleName()}\" module has been disabled." );
+               $this->addWarning( [ 'apierror-moduledisabled', $this->getModuleName() ] );
        }
 
        public function getAllowedParams() {
index 03be491..116dbb3 100644 (file)
@@ -38,15 +38,10 @@ class ApiQueryFilearchive extends ApiQueryBase {
        }
 
        public function execute() {
-               $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted file information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
+               $user = $this->getUser();
                $db = $this->getDB();
 
                $params = $this->extractRequestParams();
@@ -112,13 +107,13 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        if ( $sha1Set ) {
                                $sha1 = strtolower( $params['sha1'] );
                                if ( !$this->validateSha1Hash( $sha1 ) ) {
-                                       $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
+                                       $this->dieWithError( 'apierror-invalidsha1hash' );
                                }
                                $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
                        } elseif ( $sha1base36Set ) {
                                $sha1 = strtolower( $params['sha1base36'] );
                                if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
-                                       $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
+                                       $this->dieWithError( 'apierror-invalidsha1base36hash' );
                                }
                        }
                        if ( $sha1 ) {
index 7568107..6e2fb67 100644 (file)
@@ -51,7 +51,14 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
 
                if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'prefix' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'prefix' ),
+                               ],
+                               'invalidparammix'
+                       );
                }
 
                if ( !is_null( $params['continue'] ) ) {
index 6d9c2ca..cfd990b 100644 (file)
@@ -45,7 +45,14 @@ class ApiQueryIWLinks extends ApiQueryBase {
                $prop = array_flip( (array)$params['prop'] );
 
                if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'prefix' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'prefix' ),
+                               ],
+                               'invalidparammix'
+                       );
                }
 
                // Handle deprecated param
index d1fcfa3..c9dae8d 100644 (file)
@@ -58,6 +58,15 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'revdelUser' => $this->getUser(),
                ];
 
+               if ( isset( $params['badfilecontexttitle'] ) ) {
+                       $badFileContextTitle = Title::newFromText( $params['badfilecontexttitle'] );
+                       if ( !$badFileContextTitle ) {
+                               $this->dieUsage( 'Invalid title in badfilecontexttitle parameter', 'invalid-title' );
+                       }
+               } else {
+                       $badFileContextTitle = false;
+               }
+
                $pageIds = $this->getPageSet()->getGoodAndMissingTitlesByNamespace();
                if ( !empty( $pageIds[NS_FILE] ) ) {
                        $titles = array_keys( $pageIds[NS_FILE] );
@@ -95,13 +104,16 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                        $result = $this->getResult();
                        foreach ( $titles as $title ) {
+                               $info = [];
                                $pageId = $pageIds[NS_FILE][$title];
                                $start = $title === $fromTitle ? $fromTimestamp : $params['start'];
 
                                if ( !isset( $images[$title] ) ) {
-                                       if ( isset( $prop['uploadwarning'] ) ) {
-                                               // Uploadwarning needs info about non-existing files
+                                       if ( isset( $prop['uploadwarning'] ) || isset( $prop['badfile'] ) ) {
+                                               // uploadwarning and badfile need info about non-existing files
                                                $images[$title] = wfLocalFile( $title );
+                                               // Doesn't exist, so set an empty image repository
+                                               $info['imagerepository'] = '';
                                        } else {
                                                $result->addValue(
                                                        [ 'query', 'pages', intval( $pageId ) ],
@@ -128,10 +140,14 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        break;
                                }
 
-                               $fit = $result->addValue(
-                                       [ 'query', 'pages', intval( $pageId ) ],
-                                       'imagerepository', $img->getRepoName()
-                               );
+                               if ( !isset( $info['imagerepository'] ) ) {
+                                       $info['imagerepository'] = $img->getRepoName();
+                               }
+                               if ( isset( $prop['badfile'] ) ) {
+                                       $info['badfile'] = (bool)wfIsBadImage( $title, $badFileContextTitle );
+                               }
+
+                               $fit = $result->addValue( [ 'query', 'pages' ], intval( $pageId ), $info );
                                if ( !$fit ) {
                                        if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                // The user is screwed. imageinfo can't be solely
@@ -280,8 +296,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                $h = $image->getHandler();
                if ( !$h ) {
-                       $this->setWarning( 'Could not create thumbnail because ' .
-                               $image->getName() . ' does not have an associated image handler' );
+                       $this->addWarning( [ 'apiwarn-nothumb-noimagehandler', wfEscapeWikiText( $image->getName() ) ] );
 
                        return $thumbParams;
                }
@@ -292,23 +307,24 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        // we could still render the image using width and height parameters,
                        // and this type of thing could happen between different versions of
                        // handlers.
-                       $this->setWarning( "Could not parse {$p}urlparam for " . $image->getName()
-                               . '. Using only width and height' );
+                       $this->addWarning( [ 'apiwarn-badurlparam', $p, wfEscapeWikiText( $image->getName() ) ] );
                        $this->checkParameterNormalise( $image, $thumbParams );
                        return $thumbParams;
                }
 
                if ( isset( $paramList['width'] ) && isset( $thumbParams['width'] ) ) {
                        if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
-                               $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
-                                       . "in favor of width value derived from {$p}urlwidth/{$p}urlheight "
-                                       . "({$thumbParams['width']})" );
+                               $this->addWarning(
+                                       [ 'apiwarn-urlparamwidth', $p, $paramList['width'], $thumbParams['width'] ]
+                               );
                        }
                }
 
                foreach ( $paramList as $name => $value ) {
                        if ( !$h->validateParam( $name, $value ) ) {
-                               $this->dieUsage( "Invalid value for {$p}urlparam ($name=$value)", 'urlparam' );
+                               $this->dieWithError(
+                                       [ 'apierror-invalidurlparam', $p, wfEscapeWikiText( $name ), wfEscapeWikiText( $value ) ]
+                               );
                        }
                }
 
@@ -337,8 +353,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                // in the actual normalised version, only if we can actually normalise them,
                // so we use the functions scope to throw away the normalisations.
                if ( !$h->normaliseParams( $image, $finalParams ) ) {
-                       $this->dieUsage( 'Could not normalise image parameters for ' .
-                               $image->getName(), 'urlparamnormal' );
+                       $this->dieWithError( [ 'apierror-urlparamnormal', wfEscapeWikiText( $image->getName() ) ] );
                }
        }
 
@@ -689,6 +704,9 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                ApiBase::PARAM_DFLT => '',
                                ApiBase::PARAM_TYPE => 'string',
                        ],
+                       'badfilecontexttitle' => [
+                               ApiBase::PARAM_TYPE => 'string',
+                       ],
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
                        ],
@@ -734,6 +752,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                'archivename' => 'apihelp-query+imageinfo-paramvalue-prop-archivename',
                                'bitdepth' => 'apihelp-query+imageinfo-paramvalue-prop-bitdepth',
                                'uploadwarning' => 'apihelp-query+imageinfo-paramvalue-prop-uploadwarning',
+                               'badfile' => 'apihelp-query+imageinfo-paramvalue-prop-badfile',
                        ],
                        array_flip( $filter )
                );
index e04d8c8..ae6f5bf 100644 (file)
@@ -90,7 +90,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                        foreach ( $params['images'] as $img ) {
                                $title = Title::newFromText( $img );
                                if ( !$title || $title->getNamespace() != NS_FILE ) {
-                                       $this->setWarning( "\"$img\" is not a file" );
+                                       $this->addWarning( [ 'apiwarn-notfile', wfEscapeWikiText( $img ) ] );
                                } else {
                                        $images[] = $title->getDBkey();
                                }
index d287020..e789dd4 100644 (file)
@@ -427,7 +427,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        foreach ( $this->params['token'] as $t ) {
                                $val = call_user_func( $tokenFunctions[$t], $pageid, $title );
                                if ( $val === false ) {
-                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                } else {
                                        $pageInfo[$t . 'token'] = $val;
                                }
@@ -535,7 +535,6 @@ class ApiQueryInfo extends ApiQueryBase {
         * Get information about protections and put it in $protections
         */
        private function getProtectionInfo() {
-               global $wgContLang;
                $this->protections = [];
                $db = $this->getDB();
 
@@ -554,7 +553,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $a = [
                                        'type' => $row->pr_type,
                                        'level' => $row->pr_level,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 )
+                                       'expiry' => ApiResult::formatExpiry( $row->pr_expiry )
                                ];
                                if ( $row->pr_cascade ) {
                                        $a['cascade'] = true;
@@ -614,7 +613,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->protections[$row->pt_namespace][$row->pt_title][] = [
                                        'type' => 'create',
                                        'level' => $row->pt_create_perm,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pt_expiry, TS_ISO_8601 )
+                                       'expiry' => ApiResult::formatExpiry( $row->pt_expiry )
                                ];
                        }
                }
@@ -652,7 +651,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->protections[$row->tl_namespace][$row->tl_title][] = [
                                        'type' => $row->pr_type,
                                        'level' => $row->pr_level,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 ),
+                                       'expiry' => ApiResult::formatExpiry( $row->pr_expiry ),
                                        'source' => $source->getPrefixedText()
                                ];
                        }
@@ -675,7 +674,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->protections[NS_FILE][$row->il_to][] = [
                                        'type' => $row->pr_type,
                                        'level' => $row->pr_level,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 ),
+                                       'expiry' => ApiResult::formatExpiry( $row->pr_expiry ),
                                        'source' => $source->getPrefixedText()
                                ];
                        }
index a6153de..8d5b5f3 100644 (file)
@@ -51,7 +51,14 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
 
                if ( isset( $params['title'] ) && !isset( $params['lang'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'lang' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'lang' )
+                               ],
+                               'nolang'
+                       );
                }
 
                if ( !is_null( $params['continue'] ) ) {
index 67f2c9e..55e3c85 100644 (file)
@@ -44,7 +44,14 @@ class ApiQueryLangLinks extends ApiQueryBase {
                $prop = array_flip( (array)$params['prop'] );
 
                if ( isset( $params['title'] ) && !isset( $params['lang'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'lang' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'lang' ),
+                               ],
+                               'invalidparammix'
+                       );
                }
 
                // Handle deprecated param
index 6e5239f..4556e29 100644 (file)
@@ -94,7 +94,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                        foreach ( $params[$this->titlesParam] as $t ) {
                                $title = Title::newFromText( $t );
                                if ( !$title ) {
-                                       $this->setWarning( "\"$t\" is not a valid title" );
+                                       $this->addWarning( [ 'apiwarn-invalidtitle', wfEscapeWikiText( $t ) ] );
                                } else {
                                        $lb->addObj( $title );
                                }
@@ -182,7 +182,8 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                return [
                        'namespace' => [
                                ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_ISMULTI => true
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'limit' => [
                                ApiBase::PARAM_DFLT => 10,
index 122594d..4d84aad 100644 (file)
@@ -121,10 +121,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        }
 
                        if ( !$valid ) {
-                               $valueName = $this->encodeParamName( 'action' );
-                               $this->dieUsage(
-                                       "Unrecognized value for parameter '$valueName': {$logAction}",
-                                       "unknown_$valueName"
+                               $encParamName = $this->encodeParamName( 'action' );
+                               $this->dieWithError(
+                                       [ 'apierror-unrecognizedvalue', $encParamName, wfEscapeWikiText( $logAction ) ],
+                                       "unknown_$encParamName"
                                );
                        }
 
@@ -173,7 +173,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                if ( !is_null( $title ) ) {
                        $titleObj = Title::newFromText( $title );
                        if ( is_null( $titleObj ) ) {
-                               $this->dieUsage( "Bad title value '$title'", 'param_title' );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $title ) ] );
                        }
                        $this->addWhereFld( 'log_namespace', $titleObj->getNamespace() );
                        $this->addWhereFld( 'log_title', $titleObj->getDBkey() );
@@ -187,12 +187,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( !is_null( $prefix ) ) {
                        if ( $this->getConfig()->get( 'MiserMode' ) ) {
-                               $this->dieUsage( 'Prefix search disabled in Miser Mode', 'prefixsearchdisabled' );
+                               $this->dieWithError( 'apierror-prefixsearchdisabled' );
                        }
 
                        $title = Title::newFromText( $prefix );
                        if ( is_null( $title ) ) {
-                               $this->dieUsage( "Bad title value '$prefix'", 'param_prefix' );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $prefix ) ] );
                        }
                        $this->addWhereFld( 'log_namespace', $title->getNamespace() );
                        $this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
@@ -435,7 +435,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        ],
                        'title' => null,
                        'namespace' => [
-                               ApiBase::PARAM_TYPE => 'namespace'
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'prefix' => [],
                        'tag' => null,
index 0c70a8a..1324f2f 100644 (file)
@@ -36,7 +36,7 @@ class ApiQueryMyStashedFiles extends ApiQueryBase {
                $user = $this->getUser();
 
                if ( $user->isAnon() ) {
-                       $this->dieUsage( 'The upload stash is only available to logged-in users.', 'stashnotloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-uploadstash', 'stashnotloggedin' );
                }
 
                // Note: If user is logged in but cannot upload, they can still see
index e3c949b..62b2e42 100644 (file)
@@ -135,8 +135,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                }
 
                                if ( isset( $prop['expiry'] ) ) {
-                                       global $wgContLang;
-                                       $vals['expiry'] = $wgContLang->formatExpiry( $row->pt_expiry, TS_ISO_8601 );
+                                       $vals['expiry'] = ApiResult::formatExpiry( $row->pt_expiry );
                                }
 
                                if ( isset( $prop['level'] ) ) {
index 9ba757c..908cdee 100644 (file)
@@ -62,7 +62,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                /** @var $qp QueryPage */
                $qp = new $this->qpMap[$params['page']]();
                if ( !$qp->userCanExecute( $this->getUser() ) ) {
-                       $this->dieUsageMsg( 'specialpage-cantexecute' );
+                       $this->dieWithError( 'apierror-specialpage-cantexecute' );
                }
 
                $r = [ 'name' => $params['page'] ];
index 8b11dc2..2c76e97 100644 (file)
@@ -195,7 +195,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                || ( isset( $show['patrolled'] ) && isset( $show['unpatrolled'] ) )
                                || ( isset( $show['!patrolled'] ) && isset( $show['unpatrolled'] ) )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        // Check permissions
@@ -204,10 +204,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                || isset( $show['unpatrolled'] )
                        ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage(
-                                               'You need patrol or patrolmarks permission to request the patrolled flag',
-                                               'permissiondenied'
-                                       );
+                                       $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                                }
                        }
 
@@ -239,9 +236,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        );
                }
 
-               if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
-               }
+               $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
 
                if ( !is_null( $params['user'] ) ) {
                        $this->addWhereFld( 'rc_user_text', $params['user'] );
@@ -274,10 +269,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->initProperties( $prop );
 
                        if ( $this->fld_patrolled && !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                               $this->dieUsage(
-                                       'You need patrol or patrolmarks permission to request the patrolled flag',
-                                       'permissiondenied'
-                               );
+                               $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                        }
 
                        /* Add fields to our query if they are specified as a needed parameter. */
@@ -571,7 +563,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                $val = call_user_func( $tokenFunctions[$t], $row->rc_cur_id,
                                        $title, RecentChange::newFromRow( $row ) );
                                if ( $val === false ) {
-                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                } else {
                                        $vals[$t . 'token'] = $val;
                                }
@@ -625,7 +617,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        ],
                        'namespace' => [
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => 'namespace'
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'user' => [
                                ApiBase::PARAM_TYPE => 'user'
index 3259927..48f6046 100644 (file)
@@ -110,19 +110,14 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $revCount > 0 && $enumRevMode ) {
-                       $this->dieUsage(
-                               'The revids= parameter may not be used with the list options ' .
-                                       '(limit, startid, endid, dirNewer, start, end).',
-                               'revids'
+                       $this->dieWithError(
+                               [ 'apierror-revisions-nolist', $this->getModulePrefix() ], 'invalidparammix'
                        );
                }
 
                if ( $pageCount > 1 && $enumRevMode ) {
-                       $this->dieUsage(
-                               'titles, pageids or a generator was used to supply multiple pages, ' .
-                                       'but the limit, startid, endid, dirNewer, user, excludeuser, start ' .
-                                       'and end parameters may only be used on a single page.',
-                               'multpages'
+                       $this->dieWithError(
+                               [ 'apierror-revisions-singlepage', $this->getModulePrefix() ], 'invalidparammix'
                        );
                }
 
@@ -170,14 +165,19 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                if ( $this->fetchContent ) {
                        // For each page we will request, the user must have read rights for that page
                        $user = $this->getUser();
+                       $status = Status::newGood();
                        /** @var $title Title */
                        foreach ( $pageSet->getGoodTitles() as $title ) {
                                if ( !$title->userCan( 'read', $user ) ) {
-                                       $this->dieUsage(
-                                               'The current user is not allowed to read ' . $title->getPrefixedText(),
-                                               'accessdenied' );
+                                       $status->fatal( ApiMessage::create(
+                                               [ 'apierror-cannotviewtitle', wfEscapeWikiText( $title->getPrefixedText() ) ],
+                                               'accessdenied'
+                                       ) );
                                }
                        }
+                       if ( !$status->isGood() ) {
+                               $this->dieStatus( $status );
+                       }
 
                        $this->addTables( 'text' );
                        $this->addJoinConds(
@@ -201,17 +201,9 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                        //  page_timestamp or usertext_timestamp if we have an IP rvuser
 
                        // This is mostly to prevent parameter errors (and optimize SQL?)
-                       if ( $params['startid'] !== null && $params['start'] !== null ) {
-                               $this->dieUsage( 'start and startid cannot be used together', 'badparams' );
-                       }
-
-                       if ( $params['endid'] !== null && $params['end'] !== null ) {
-                               $this->dieUsage( 'end and endid cannot be used together', 'badparams' );
-                       }
-
-                       if ( $params['user'] !== null && $params['excludeuser'] !== null ) {
-                               $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
-                       }
+                       $this->requireMaxOneParameter( $params, 'startid', 'start' );
+                       $this->requireMaxOneParameter( $params, 'endid', 'end' );
+                       $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
 
                        if ( $params['continue'] !== null ) {
                                $cont = explode( '|', $params['continue'] );
@@ -344,7 +336,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                                        foreach ( $this->token as $t ) {
                                                $val = call_user_func( $tokenFunctions[$t], $title->getArticleID(), $title, $revision );
                                                if ( $val === false ) {
-                                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                                } else {
                                                        $rev[$t . 'token'] = $val;
                                                }
index 266d699..696ec87 100644 (file)
@@ -70,10 +70,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                && $params['diffto'] != 'prev' && $params['diffto'] != 'next'
                        ) {
                                $p = $this->getModulePrefix();
-                               $this->dieUsage(
-                                       "{$p}diffto must be set to a non-negative number, \"prev\", \"next\" or \"cur\"",
-                                       'diffto'
-                               );
+                               $this->dieWithError( [ 'apierror-baddiffto', $p ], 'diffto' );
                        }
                        // Check whether the revision exists and is readable,
                        // DifferenceEngine returns a rather ambiguous empty
@@ -81,10 +78,10 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        if ( $params['diffto'] != 0 ) {
                                $difftoRev = Revision::newFromId( $params['diffto'] );
                                if ( !$difftoRev ) {
-                                       $this->dieUsageMsg( [ 'nosuchrevid', $params['diffto'] ] );
+                                       $this->dieWithError( [ 'apierror-nosuchrevid', $params['diffto'] ] );
                                }
                                if ( !$difftoRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                                       $this->setWarning( "Couldn't diff to r{$difftoRev->getId()}: content is hidden" );
+                                       $this->addWarning( [ 'apiwarn-difftohidden', $difftoRev->getId() ] );
                                        $params['diffto'] = null;
                                }
                        }
@@ -262,8 +259,12 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        if ( $content && $this->section !== false ) {
                                $content = $content->getSection( $this->section, false );
                                if ( !$content ) {
-                                       $this->dieUsage(
-                                               "There is no section {$this->section} in r" . $revision->getId(),
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-nosuchsection-what',
+                                                       wfEscapeWikiText( $this->section ),
+                                                       $this->msg( 'revid', $revision->getId() )
+                                               ],
                                                'nosuchsection'
                                        );
                                }
@@ -294,9 +295,14 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        $vals['parsetree'] = $xml;
                                } else {
                                        $vals['badcontentformatforparsetree'] = true;
-                                       $this->setWarning( 'Conversion to XML is supported for wikitext only, ' .
-                                               $title->getPrefixedDBkey() .
-                                               ' uses content model ' . $content->getModel() );
+                                       $this->addWarning(
+                                               [
+                                                       'apierror-parsetree-notwikitext-title',
+                                                       wfEscapeWikiText( $title->getPrefixedText() ),
+                                                       $content->getModel()
+                                               ],
+                                               'parsetree-notwikitext'
+                                       );
                                }
                        }
                }
@@ -315,9 +321,11 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                ParserOptions::newFromContext( $this->getContext() )
                                        );
                                } else {
-                                       $this->setWarning( 'Template expansion is supported for wikitext only, ' .
-                                               $title->getPrefixedDBkey() .
-                                               ' uses content model ' . $content->getModel() );
+                                       $this->addWarning( [
+                                               'apierror-templateexpansion-notwikitext',
+                                               wfEscapeWikiText( $title->getPrefixedText() ),
+                                               $content->getModel()
+                                       ] );
                                        $vals['badcontentformat'] = true;
                                        $text = false;
                                }
@@ -336,9 +344,8 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                $model = $content->getModel();
 
                                if ( !$content->isSupportedFormat( $format ) ) {
-                                       $name = $title->getPrefixedDBkey();
-                                       $this->setWarning( "The requested format {$this->contentFormat} is not " .
-                                               "supported for content model $model used by $name" );
+                                       $name = wfEscapeWikiText( $title->getPrefixedText() );
+                                       $this->addWarning( [ 'apierror-badformat', $this->contentFormat, $model, $name ] );
                                        $vals['badcontentformat'] = true;
                                        $text = false;
                                } else {
@@ -370,9 +377,8 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        if ( $this->contentFormat
                                                && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat )
                                        ) {
-                                               $name = $title->getPrefixedDBkey();
-                                               $this->setWarning( "The requested format {$this->contentFormat} is not " .
-                                                       "supported for content model $model used by $name" );
+                                               $name = wfEscapeWikiText( $title->getPrefixedText() );
+                                               $this->addWarning( [ 'apierror-badformat', $this->contentFormat, $model, $name ] );
                                                $vals['diff']['badcontentformat'] = true;
                                                $engine = null;
                                        } else {
index 6be5198..05b693d 100644 (file)
@@ -64,12 +64,14 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 
                // Deprecated parameters
                if ( isset( $prop['hasrelated'] ) ) {
-                       $this->logFeatureUsage( 'action=search&srprop=hasrelated' );
-                       $this->setWarning( 'srprop=hasrelated has been deprecated' );
+                       $this->addDeprecation(
+                               [ 'apiwarn-deprecation-parameter', 'srprop=hasrelated' ], 'action=search&srprop=hasrelated'
+                       );
                }
                if ( isset( $prop['score'] ) ) {
-                       $this->logFeatureUsage( 'action=search&srprop=score' );
-                       $this->setWarning( 'srprop=score has been deprecated' );
+                       $this->addDeprecation(
+                               [ 'apiwarn-deprecation-parameter', 'srprop=score' ], 'action=search&srprop=score'
+                       );
                }
 
                // Create search engine instance and set options
@@ -107,10 +109,25 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                $matches = $search->searchText( $query );
                        }
                }
-               if ( is_null( $matches ) ) {
-                       $this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" );
-               } elseif ( $matches instanceof Status && !$matches->isGood() ) {
-                       $this->dieUsage( $matches->getWikiText( false, false, 'en' ), 'search-error' );
+
+               if ( $matches instanceof Status ) {
+                       $status = $matches;
+                       $matches = $status->getValue();
+               } else {
+                       $status = null;
+               }
+
+               if ( $status ) {
+                       if ( $status->isOK() ) {
+                               $this->getMain()->getErrorFormatter()->addMessagesFromStatus(
+                                       $this->getModuleName(),
+                                       $status
+                               );
+                       } else {
+                               $this->dieStatus( $status );
+                       }
+               } elseif ( is_null( $matches ) ) {
+                       $this->dieWithError( [ 'apierror-searchdisabled', $what ], "search-{$what}-disabled" );
                }
 
                if ( $resultPageSet === null ) {
@@ -158,119 +175,44 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                continue;
                        }
 
-                       $title = $result->getTitle();
                        if ( $resultPageSet === null ) {
-                               $vals = [];
-                               ApiQueryBase::addTitleInfo( $vals, $title );
-
-                               if ( isset( $prop['snippet'] ) ) {
-                                       $vals['snippet'] = $result->getTextSnippet( $terms );
-                               }
-                               if ( isset( $prop['size'] ) ) {
-                                       $vals['size'] = $result->getByteSize();
-                               }
-                               if ( isset( $prop['wordcount'] ) ) {
-                                       $vals['wordcount'] = $result->getWordCount();
-                               }
-                               if ( isset( $prop['timestamp'] ) ) {
-                                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() );
-                               }
-                               if ( isset( $prop['titlesnippet'] ) ) {
-                                       $vals['titlesnippet'] = $result->getTitleSnippet();
-                               }
-                               if ( isset( $prop['categorysnippet'] ) ) {
-                                       $vals['categorysnippet'] = $result->getCategorySnippet();
-                               }
-                               if ( !is_null( $result->getRedirectTitle() ) ) {
-                                       if ( isset( $prop['redirecttitle'] ) ) {
-                                               $vals['redirecttitle'] = $result->getRedirectTitle()->getPrefixedText();
-                                       }
-                                       if ( isset( $prop['redirectsnippet'] ) ) {
-                                               $vals['redirectsnippet'] = $result->getRedirectSnippet();
-                                       }
-                               }
-                               if ( !is_null( $result->getSectionTitle() ) ) {
-                                       if ( isset( $prop['sectiontitle'] ) ) {
-                                               $vals['sectiontitle'] = $result->getSectionTitle()->getFragment();
-                                       }
-                                       if ( isset( $prop['sectionsnippet'] ) ) {
-                                               $vals['sectionsnippet'] = $result->getSectionSnippet();
+                               $vals = $this->getSearchResultData( $result, $prop, $terms );
+                               if ( $vals ) {
+                                       // Add item to results and see whether it fits
+                                       $fit = $apiResult->addValue( [ 'query', $this->getModuleName() ], null, $vals );
+                                       if ( !$fit ) {
+                                               $this->setContinueEnumParameter( 'offset', $params['offset'] + $count - 1 );
+                                               break;
                                        }
                                }
-                               if ( isset( $prop['isfilematch'] ) ) {
-                                       $vals['isfilematch'] = $result->isFileMatch();
-                               }
-
-                               // Add item to results and see whether it fits
-                               $fit = $apiResult->addValue( [ 'query', $this->getModuleName() ],
-                                       null, $vals );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'offset', $params['offset'] + $count - 1 );
-                                       break;
-                               }
                        } else {
-                               $titles[] = $title;
+                               $titles[] = $result->getTitle();
                        }
 
                        $result = $matches->next();
                }
 
-               $hasInterwikiResults = false;
-               $totalhits = null;
-               if ( $interwiki && $resultPageSet === null && $matches->hasInterwikiResults() ) {
-                       foreach ( $matches->getInterwikiResults() as $interwikiMatches ) {
-                               $hasInterwikiResults = true;
-
-                               // Include number of results if requested
-                               if ( $resultPageSet === null && isset( $searchInfo['totalhits'] ) ) {
-                                       $totalhits += $interwikiMatches->getTotalHits();
-                               }
-
-                               $result = $interwikiMatches->next();
-                               while ( $result ) {
-                                       $title = $result->getTitle();
-
-                                       if ( $resultPageSet === null ) {
-                                               $vals = [
-                                                       'namespace' => $result->getInterwikiNamespaceText(),
-                                                       'title' => $title->getText(),
-                                                       'url' => $title->getFullURL(),
-                                               ];
-
-                                               // Add item to results and see whether it fits
-                                               $fit = $apiResult->addValue(
-                                                       [ 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix() ],
-                                                       null,
-                                                       $vals
-                                               );
-
-                                               if ( !$fit ) {
-                                                       // We hit the limit. We can't really provide any meaningful
-                                                       // pagination info so just bail out
-                                                       break;
-                                               }
-                                       } else {
-                                               $titles[] = $title;
-                                       }
+               // Here we assume interwiki results do not count with
+               // regular search results. We may want to reconsider this
+               // if we ever return a lot of interwiki results or want pagination
+               // for them.
+               // Interwiki results inside main result set
+               $canAddInterwiki = (bool)$params['enablerewrites'] && ( $resultPageSet === null );
+               if ( $canAddInterwiki ) {
+                       $this->addInterwikiResults( $matches, $apiResult, $prop, $terms, 'additional',
+                               SearchResultSet::INLINE_RESULTS );
+               }
 
-                                       $result = $interwikiMatches->next();
-                               }
-                       }
-                       if ( $totalhits !== null ) {
-                               $apiResult->addValue( [ 'query', 'interwikisearchinfo' ],
-                                       'totalhits', $totalhits );
-                       }
+               // Interwiki results outside main result set
+               if ( $interwiki && $resultPageSet === null ) {
+                       $this->addInterwikiResults( $matches, $apiResult, $prop, $terms, 'interwiki',
+                               SearchResultSet::SECONDARY_RESULTS );
                }
 
                if ( $resultPageSet === null ) {
                        $apiResult->addIndexedTagName( [
                                'query', $this->getModuleName()
                        ], 'p' );
-                       if ( $hasInterwikiResults ) {
-                               $apiResult->addIndexedTagName( [
-                                       'query', 'interwiki' . $this->getModuleName()
-                               ], 'p' );
-                       }
                } else {
                        $resultPageSet->setRedirectMergePolicy( function ( $current, $new ) {
                                if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
@@ -286,6 +228,119 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                }
        }
 
+       /**
+        * Assemble search result data.
+        * @param SearchResult $result Search result
+        * @param array        $prop Props to extract (as keys)
+        * @param array        $terms Terms list
+        * @return array|null Result data or null if result is broken in some way.
+        */
+       private function getSearchResultData( SearchResult $result, $prop, $terms ) {
+               // Silently skip broken and missing titles
+               if ( $result->isBrokenTitle() || $result->isMissingRevision() ) {
+                       return null;
+               }
+
+               $vals = [];
+
+               $title = $result->getTitle();
+               ApiQueryBase::addTitleInfo( $vals, $title );
+
+               if ( isset( $prop['size'] ) ) {
+                       $vals['size'] = $result->getByteSize();
+               }
+               if ( isset( $prop['wordcount'] ) ) {
+                       $vals['wordcount'] = $result->getWordCount();
+               }
+               if ( isset( $prop['snippet'] ) ) {
+                       $vals['snippet'] = $result->getTextSnippet( $terms );
+               }
+               if ( isset( $prop['timestamp'] ) ) {
+                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() );
+               }
+               if ( isset( $prop['titlesnippet'] ) ) {
+                       $vals['titlesnippet'] = $result->getTitleSnippet();
+               }
+               if ( isset( $prop['categorysnippet'] ) ) {
+                       $vals['categorysnippet'] = $result->getCategorySnippet();
+               }
+               if ( !is_null( $result->getRedirectTitle() ) ) {
+                       if ( isset( $prop['redirecttitle'] ) ) {
+                               $vals['redirecttitle'] = $result->getRedirectTitle()->getPrefixedText();
+                       }
+                       if ( isset( $prop['redirectsnippet'] ) ) {
+                               $vals['redirectsnippet'] = $result->getRedirectSnippet();
+                       }
+               }
+               if ( !is_null( $result->getSectionTitle() ) ) {
+                       if ( isset( $prop['sectiontitle'] ) ) {
+                               $vals['sectiontitle'] = $result->getSectionTitle()->getFragment();
+                       }
+                       if ( isset( $prop['sectionsnippet'] ) ) {
+                               $vals['sectionsnippet'] = $result->getSectionSnippet();
+                       }
+               }
+               if ( isset( $prop['isfilematch'] ) ) {
+                       $vals['isfilematch'] = $result->isFileMatch();
+               }
+               return $vals;
+       }
+
+       /**
+        * Add interwiki results as a section in query results.
+        * @param SearchResultSet $matches
+        * @param ApiResult       $apiResult
+        * @param array           $prop Props to extract (as keys)
+        * @param array           $terms Terms list
+        * @param string          $section Section name where results would go
+        * @param int             $type Interwiki result type
+        * @return int|null Number of total hits in the data or null if none was produced
+        */
+       private function addInterwikiResults(
+               SearchResultSet $matches, ApiResult $apiResult, $prop,
+               $terms, $section, $type
+       ) {
+               $totalhits = null;
+               if ( $matches->hasInterwikiResults( $type ) ) {
+                       foreach ( $matches->getInterwikiResults( $type ) as $interwikiMatches ) {
+                               // Include number of results if requested
+                               $totalhits += $interwikiMatches->getTotalHits();
+
+                               $result = $interwikiMatches->next();
+                               while ( $result ) {
+                                       $title = $result->getTitle();
+                                       $vals = $this->getSearchResultData( $result, $prop, $terms );
+
+                                       $vals['namespace'] = $result->getInterwikiNamespaceText();
+                                       $vals['title'] = $title->getText();
+                                       $vals['url'] = $title->getFullURL();
+
+                                       // Add item to results and see whether it fits
+                                       $fit = $apiResult->addValue( [
+                                                       'query',
+                                                       $section . $this->getModuleName(),
+                                                       $result->getInterwikiPrefix()
+                                               ], null, $vals );
+
+                                       if ( !$fit ) {
+                                               // We hit the limit. We can't really provide any meaningful
+                                               // pagination info so just bail out
+                                               break;
+                                       }
+
+                                       $result = $interwikiMatches->next();
+                               }
+                       }
+                       if ( $totalhits !== null ) {
+                               $apiResult->addValue( [ 'query', $section . 'searchinfo' ], 'totalhits', $totalhits );
+                               $apiResult->addIndexedTagName( [
+                                       'query', $section . $this->getModuleName()
+                               ], 'p' );
+                       }
+               }
+               return $totalhits;
+       }
+
        public function getCacheMode( $params ) {
                return 'public';
        }
index 0bb7ff8..5093608 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * A query action to return meta information about the wiki site.
@@ -253,6 +254,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
                $data['minuploadchunksize'] = (int)$config->get( 'MinUploadChunkSize' );
 
+               $data['galleryoptions'] = $config->get( 'GalleryOptions' );
+
                $data['thumblimits'] = $config->get( 'ThumbLimits' );
                ApiResult::setArrayType( $data['thumblimits'], 'BCassoc' );
                ApiResult::setIndexedTagName( $data['thumblimits'], 'limit' );
@@ -386,7 +389,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
                $langNames = Language::fetchLanguageNames( $langCode );
 
-               $getPrefixes = Interwiki::getAllPrefixes( $local );
+               $getPrefixes = MediaWikiServices::getInstance()->getInterwikiLookup()->getAllPrefixes( $local );
                $extraLangPrefixes = $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' );
                $localInterwikis = $this->getConfig()->get( 'LocalInterwikis' );
                $data = [];
@@ -445,10 +448,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $showHostnames = $this->getConfig()->get( 'ShowHostnames' );
                if ( $includeAll ) {
                        if ( !$showHostnames ) {
-                               $this->dieUsage(
-                                       'Cannot view all servers info unless $wgShowHostnames is true',
-                                       'includeAllDenied'
-                               );
+                               $this->dieWithError( 'apierror-siteinfo-includealldenied', 'includeAllDenied' );
                        }
 
                        $lags = $lb->getLagTimes();
index b039a1e..abb827f 100644 (file)
@@ -33,7 +33,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'You must be logged-in to have an upload stash', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-uploadstash', 'notloggedin' );
                }
 
                $params = $this->extractRequestParams();
@@ -45,9 +45,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
                $result = $this->getResult();
 
-               if ( !$params['filekey'] && !$params['sessionkey'] ) {
-                       $this->dieUsage( 'One of filekey or sessionkey must be supplied', 'nofilekey' );
-               }
+               $this->requireAtLeastOneParameter( $params, 'filekey', 'sessionkey' );
 
                // Alias sessionkey to filekey, but give an existing filekey precedence.
                if ( !$params['filekey'] && $params['sessionkey'] ) {
@@ -66,9 +64,9 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                        }
                // @todo Update exception handling here to understand current getFile exceptions
                } catch ( UploadStashFileNotFoundException $e ) {
-                       $this->dieUsage( 'File not found: ' . $e->getMessage(), 'invalidsessiondata' );
+                       $this->dieWithException( $e, [ 'wrap' => 'apierror-stashedfilenotfound' ] );
                } catch ( UploadStashBadPathException $e ) {
-                       $this->dieUsage( 'Bad path: ' . $e->getMessage(), 'invalidsessiondata' );
+                       $this->dieWithException( $e, [ 'wrap' => 'apierror-stashpathinvalid' ] );
                }
        }
 
index de5a377..5b700db 100644 (file)
@@ -40,7 +40,7 @@ class ApiQueryTokens extends ApiQueryBase {
                ];
 
                if ( $this->lacksSameOriginSecurity() ) {
-                       $this->setWarning( 'Tokens may not be obtained when the same-origin policy is not applied' );
+                       $this->addWarning( [ 'apiwarn-tokens-origin' ] );
                        return;
                }
 
index b85bec4..31a9238 100644 (file)
@@ -65,24 +65,48 @@ class ApiQueryContributions extends ApiQueryBase {
                // TODO: if the query is going only against the revision table, should this be done?
                $this->selectNamedDB( 'contributions', DB_REPLICA, 'contributions' );
 
+               $this->requireOnlyOneParameter( $this->params, 'userprefix', 'userids', 'user' );
+
                $this->idMode = false;
                if ( isset( $this->params['userprefix'] ) ) {
                        $this->prefixMode = true;
                        $this->multiUserMode = true;
                        $this->userprefix = $this->params['userprefix'];
+               } elseif ( isset( $this->params['userids'] ) ) {
+                       $this->userids = [];
+
+                       if ( !count( $this->params['userids'] ) ) {
+                               $encParamName = $this->encodeParamName( 'userids' );
+                               $this->dieWithError( [ 'apierror-paramempty', $encParamName ], "paramempty_$encParamName" );
+                       }
+
+                       foreach ( $this->params['userids'] as $uid ) {
+                               if ( $uid <= 0 ) {
+                                       $this->dieWithError( [ 'apierror-invaliduserid', $uid ], 'invaliduserid' );
+                               }
+
+                               $this->userids[] = $uid;
+                       }
+
+                       $this->prefixMode = false;
+                       $this->multiUserMode = ( count( $this->params['userids'] ) > 1 );
+                       $this->idMode = true;
                } else {
                        $anyIPs = false;
                        $this->userids = [];
                        $this->usernames = [];
-                       if ( !is_array( $this->params['user'] ) ) {
-                               $this->params['user'] = [ $this->params['user'] ];
-                       }
                        if ( !count( $this->params['user'] ) ) {
-                               $this->dieUsage( 'User parameter may not be empty.', 'param_user' );
+                               $encParamName = $this->encodeParamName( 'user' );
+                               $this->dieWithError(
+                                       [ 'apierror-paramempty', $encParamName ], "paramempty_$encParamName"
+                               );
                        }
                        foreach ( $this->params['user'] as $u ) {
-                               if ( is_null( $u ) || $u === '' ) {
-                                       $this->dieUsage( 'User parameter may not be empty', 'param_user' );
+                               if ( $u === '' ) {
+                                       $encParamName = $this->encodeParamName( 'user' );
+                                       $this->dieWithError(
+                                               [ 'apierror-paramempty', $encParamName ], "paramempty_$encParamName"
+                                       );
                                }
 
                                if ( User::isIP( $u ) ) {
@@ -91,7 +115,10 @@ class ApiQueryContributions extends ApiQueryBase {
                                } else {
                                        $name = User::getCanonicalName( $u, 'valid' );
                                        if ( $name === false ) {
-                                               $this->dieUsage( "User name {$u} is not valid", 'param_user' );
+                                               $encParamName = $this->encodeParamName( 'user' );
+                                               $this->dieWithError(
+                                                       [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $u ) ], "baduser_$encParamName"
+                                               );
                                        }
                                        $this->usernames[] = $name;
                                }
@@ -254,7 +281,7 @@ class ApiQueryContributions extends ApiQueryBase {
                                || ( isset( $show['top'] ) && isset( $show['!top'] ) )
                                || ( isset( $show['new'] ) && isset( $show['!new'] ) )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        $this->addWhereIf( 'rev_minor_edit = 0', isset( $show['!minor'] ) );
@@ -285,10 +312,7 @@ class ApiQueryContributions extends ApiQueryBase {
                        $this->fld_patrolled
                ) {
                        if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                               $this->dieUsage(
-                                       'You need the patrol right to request the patrolled flag',
-                                       'permissiondenied'
-                               );
+                               $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                        }
 
                        // Use a redundant join condition on both
@@ -489,6 +513,10 @@ class ApiQueryContributions extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => 'user',
                                ApiBase::PARAM_ISMULTI => true
                        ],
+                       'userids' => [
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_ISMULTI => true
+                       ],
                        'userprefix' => null,
                        'dir' => [
                                ApiBase::PARAM_DFLT => 'older',
index d3cd0c4..04b0fac 100644 (file)
@@ -64,18 +64,19 @@ class ApiQueryUserInfo extends ApiQueryBase {
         *  - blockreason - reason provided for the block
         *  - blockedtimestamp - timestamp for when the block was placed/modified
         *  - blockexpiry - expiry time of the block
+        *  - systemblocktype - system block type, if any
         */
        public static function getBlockInfo( Block $block ) {
-               global $wgContLang;
                $vals = [];
                $vals['blockid'] = $block->getId();
                $vals['blockedby'] = $block->getByName();
                $vals['blockedbyid'] = $block->getBy();
                $vals['blockreason'] = $block->mReason;
                $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->mTimestamp );
-               $vals['blockexpiry'] = $wgContLang->formatExpiry(
-                       $block->getExpiry(), TS_ISO_8601, 'infinite'
-               );
+               $vals['blockexpiry'] = ApiResult::formatExpiry( $block->getExpiry(), 'infinite' );
+               if ( $block->getSystemBlockType() !== null ) {
+                       $vals['systemblocktype'] = $block->getSystemBlockType();
+               }
                return $vals;
        }
 
@@ -142,6 +143,19 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        ApiResult::setIndexedTagName( $vals['groups'], 'g' ); // even if empty
                }
 
+               if ( isset( $this->prop['groupmemberships'] ) ) {
+                       $ugms = $user->getGroupMemberships();
+                       $vals['groupmemberships'] = [];
+                       foreach ( $ugms as $group => $ugm ) {
+                               $vals['groupmemberships'][] = [
+                                       'group' => $group,
+                                       'expiry' => ApiResult::formatExpiry( $ugm->getExpiry() ),
+                               ];
+                       }
+                       ApiResult::setArrayType( $vals['groupmemberships'], 'array' ); // even if empty
+                       ApiResult::setIndexedTagName( $vals['groupmemberships'], 'groupmembership' ); // even if empty
+               }
+
                if ( isset( $this->prop['implicitgroups'] ) ) {
                        $vals['implicitgroups'] = $user->getAutomaticGroups();
                        ApiResult::setArrayType( $vals['implicitgroups'], 'array' ); // even if empty
@@ -170,8 +184,13 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
                if ( isset( $this->prop['preferencestoken'] ) ) {
                        $p = $this->getModulePrefix();
-                       $this->setWarning(
-                               "{$p}prop=preferencestoken has been deprecated. Please use action=query&meta=tokens instead."
+                       $this->addDeprecation(
+                               [
+                                       'apiwarn-deprecation-withreplacement',
+                                       "{$p}prop=preferencestoken",
+                                       'action=query&meta=tokens',
+                               ],
+                               "meta=userinfo&{$p}prop=preferencestoken"
                        );
                }
                if ( isset( $this->prop['preferencestoken'] ) &&
@@ -296,6 +315,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'blockinfo',
                                        'hasmsg',
                                        'groups',
+                                       'groupmemberships',
                                        'implicitgroups',
                                        'rights',
                                        'changeablegroups',
index 9b45b91..3a814c4 100644 (file)
@@ -42,6 +42,7 @@ class ApiQueryUsers extends ApiQueryBase {
                // everything except 'blockinfo' which might show hidden records if the user
                // making the request has the appropriate permissions
                'groups',
+               'groupmemberships',
                'implicitgroups',
                'rights',
                'editcount',
@@ -97,15 +98,21 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        public function execute() {
+               $db = $this->getDB();
+
                $params = $this->extractRequestParams();
+               $this->requireMaxOneParameter( $params, 'userids', 'users' );
 
                if ( !is_null( $params['prop'] ) ) {
                        $this->prop = array_flip( $params['prop'] );
                } else {
                        $this->prop = [];
                }
+               $useNames = !is_null( $params['users'] );
 
                $users = (array)$params['users'];
+               $userids = (array)$params['userids'];
+
                $goodNames = $done = [];
                $result = $this->getResult();
                // Canonicalize user names
@@ -127,12 +134,22 @@ class ApiQueryUsers extends ApiQueryBase {
                        }
                }
 
+               if ( $useNames ) {
+                       $parameters = &$goodNames;
+               } else {
+                       $parameters = &$userids;
+               }
+
                $result = $this->getResult();
 
-               if ( count( $goodNames ) ) {
+               if ( count( $parameters ) ) {
                        $this->addTables( 'user' );
                        $this->addFields( User::selectFields() );
-                       $this->addWhereFld( 'user_name', $goodNames );
+                       if ( $useNames ) {
+                               $this->addWhereFld( 'user_name', $goodNames );
+                       } else {
+                               $this->addWhereFld( 'user_id', $userids );
+                       }
 
                        $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) );
 
@@ -145,18 +162,29 @@ class ApiQueryUsers extends ApiQueryBase {
                                $userGroups = [];
 
                                $this->addTables( 'user' );
-                               $this->addWhereFld( 'user_name', $goodNames );
+                               if ( $useNames ) {
+                                       $this->addWhereFld( 'user_name', $goodNames );
+                               } else {
+                                       $this->addWhereFld( 'user_id', $userids );
+                               }
+
                                $this->addTables( 'user_groups' );
                                $this->addJoinConds( [ 'user_groups' => [ 'INNER JOIN', 'ug_user=user_id' ] ] );
-                               $this->addFields( [ 'user_name', 'ug_group' ] );
+                               $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() ) );
+                               }
                                $userGroupsRes = $this->select( __METHOD__ );
 
                                foreach ( $userGroupsRes as $row ) {
-                                       $userGroups[$row->user_name][] = $row->ug_group;
+                                       $userGroups[$row->user_name][] = $row;
                                }
                        }
 
                        foreach ( $res as $row ) {
+
                                // create user object and pass along $userGroups if set
                                // that reduces the number of database queries needed in User dramatically
                                if ( !isset( $userGroups ) ) {
@@ -167,44 +195,56 @@ class ApiQueryUsers extends ApiQueryBase {
                                        }
                                        $user = User::newFromRow( $row, [ 'user_groups' => $userGroups[$row->user_name] ] );
                                }
-                               $name = $user->getName();
-
-                               $data[$name]['userid'] = $user->getId();
-                               $data[$name]['name'] = $name;
+                               if ( $useNames ) {
+                                       $key = $user->getName();
+                               } else {
+                                       $key = $user->getId();
+                               }
+                               $data[$key]['userid'] = $user->getId();
+                               $data[$key]['name'] = $user->getName();
 
                                if ( isset( $this->prop['editcount'] ) ) {
-                                       $data[$name]['editcount'] = $user->getEditCount();
+                                       $data[$key]['editcount'] = $user->getEditCount();
                                }
 
                                if ( isset( $this->prop['registration'] ) ) {
-                                       $data[$name]['registration'] = wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
+                                       $data[$key]['registration'] = wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
                                }
 
                                if ( isset( $this->prop['groups'] ) ) {
-                                       $data[$name]['groups'] = $user->getEffectiveGroups();
+                                       $data[$key]['groups'] = $user->getEffectiveGroups();
+                               }
+
+                               if ( isset( $this->prop['groupmemberships'] ) ) {
+                                       $data[$key]['groupmemberships'] = array_map( function( $ugm ) {
+                                               return [
+                                                       'group' => $ugm->getGroup(),
+                                                       'expiry' => ApiResult::formatExpiry( $ugm->getExpiry() ),
+                                               ];
+                                       }, $user->getGroupMemberships() );
                                }
 
                                if ( isset( $this->prop['implicitgroups'] ) ) {
-                                       $data[$name]['implicitgroups'] = $user->getAutomaticGroups();
+                                       $data[$key]['implicitgroups'] = $user->getAutomaticGroups();
                                }
 
                                if ( isset( $this->prop['rights'] ) ) {
-                                       $data[$name]['rights'] = $user->getRights();
+                                       $data[$key]['rights'] = $user->getRights();
                                }
                                if ( $row->ipb_deleted ) {
-                                       $data[$name]['hidden'] = true;
+                                       $data[$key]['hidden'] = true;
                                }
                                if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) {
-                                       $data[$name]['blockid'] = (int)$row->ipb_id;
-                                       $data[$name]['blockedby'] = $row->ipb_by_text;
-                                       $data[$name]['blockedbyid'] = (int)$row->ipb_by;
-                                       $data[$name]['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
-                                       $data[$name]['blockreason'] = $row->ipb_reason;
-                                       $data[$name]['blockexpiry'] = $row->ipb_expiry;
+                                       $data[$key]['blockid'] = (int)$row->ipb_id;
+                                       $data[$key]['blockedby'] = $row->ipb_by_text;
+                                       $data[$key]['blockedbyid'] = (int)$row->ipb_by;
+                                       $data[$key]['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
+                                       $data[$key]['blockreason'] = $row->ipb_reason;
+                                       $data[$key]['blockexpiry'] = $row->ipb_expiry;
                                }
 
                                if ( isset( $this->prop['emailable'] ) ) {
-                                       $data[$name]['emailable'] = $user->canReceiveEmail();
+                                       $data[$key]['emailable'] = $user->canReceiveEmail();
                                }
 
                                if ( isset( $this->prop['gender'] ) ) {
@@ -212,11 +252,11 @@ class ApiQueryUsers extends ApiQueryBase {
                                        if ( strval( $gender ) === '' ) {
                                                $gender = 'unknown';
                                        }
-                                       $data[$name]['gender'] = $gender;
+                                       $data[$key]['gender'] = $gender;
                                }
 
                                if ( isset( $this->prop['centralids'] ) ) {
-                                       $data[$name] += ApiQueryUserInfo::getCentralUserInfo(
+                                       $data[$key] += ApiQueryUserInfo::getCentralUserInfo(
                                                $this->getConfig(), $user, $params['attachedwiki']
                                        );
                                }
@@ -226,9 +266,9 @@ class ApiQueryUsers extends ApiQueryBase {
                                        foreach ( $params['token'] as $t ) {
                                                $val = call_user_func( $tokenFunctions[$t], $user );
                                                if ( $val === false ) {
-                                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                                } else {
-                                                       $data[$name][$t . 'token'] = $val;
+                                                       $data[$key][$t . 'token'] = $val;
                                                }
                                        }
                                }
@@ -237,43 +277,53 @@ class ApiQueryUsers extends ApiQueryBase {
 
                $context = $this->getContext();
                // Second pass: add result data to $retval
-               foreach ( $goodNames as $u ) {
+               foreach ( $parameters as $u ) {
                        if ( !isset( $data[$u] ) ) {
-                               $data[$u] = [ 'name' => $u ];
-                               $urPage = new UserrightsPage;
-                               $urPage->setContext( $context );
-                               $iwUser = $urPage->fetchUser( $u );
-
-                               if ( $iwUser instanceof UserRightsProxy ) {
-                                       $data[$u]['interwiki'] = true;
-
-                                       if ( !is_null( $params['token'] ) ) {
-                                               $tokenFunctions = $this->getTokenFunctions();
-
-                                               foreach ( $params['token'] as $t ) {
-                                                       $val = call_user_func( $tokenFunctions[$t], $iwUser );
-                                                       if ( $val === false ) {
-                                                               $this->setWarning( "Action '$t' is not allowed for the current user" );
-                                                       } else {
-                                                               $data[$u][$t . 'token'] = $val;
+                               if ( $useNames ) {
+                                       $data[$u] = [ 'name' => $u ];
+                                       $urPage = new UserrightsPage;
+                                       $urPage->setContext( $context );
+
+                                       $iwUser = $urPage->fetchUser( $u );
+
+                                       if ( $iwUser instanceof UserRightsProxy ) {
+                                               $data[$u]['interwiki'] = true;
+
+                                               if ( !is_null( $params['token'] ) ) {
+                                                       $tokenFunctions = $this->getTokenFunctions();
+
+                                                       foreach ( $params['token'] as $t ) {
+                                                               $val = call_user_func( $tokenFunctions[$t], $iwUser );
+                                                               if ( $val === false ) {
+                                                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
+                                                               } else {
+                                                                       $data[$u][$t . 'token'] = $val;
+                                                               }
                                                        }
                                                }
-                                       }
-                               } else {
-                                       $data[$u]['missing'] = true;
-                                       if ( isset( $this->prop['cancreate'] ) ) {
-                                               $status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
-                                               $data[$u]['cancreate'] = $status->isGood();
-                                               if ( !$status->isGood() ) {
-                                                       $data[$u]['cancreateerror'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                       } else {
+                                               $data[$u]['missing'] = true;
+                                               if ( isset( $this->prop['cancreate'] ) ) {
+                                                       $status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
+                                                       $data[$u]['cancreate'] = $status->isGood();
+                                                       if ( !$status->isGood() ) {
+                                                               $data[$u]['cancreateerror'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                                       }
                                                }
                                        }
+                               } else {
+                                       $data[$u] = [ 'userid' => $u, 'missing' => true ];
                                }
+
                        } else {
                                if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) ) {
                                        ApiResult::setArrayType( $data[$u]['groups'], 'array' );
                                        ApiResult::setIndexedTagName( $data[$u]['groups'], 'g' );
                                }
+                               if ( isset( $this->prop['groupmemberships'] ) && isset( $data[$u]['groupmemberships'] ) ) {
+                                       ApiResult::setArrayType( $data[$u]['groupmemberships'], 'array' );
+                                       ApiResult::setIndexedTagName( $data[$u]['groupmemberships'], 'groupmembership' );
+                               }
                                if ( isset( $this->prop['implicitgroups'] ) && isset( $data[$u]['implicitgroups'] ) ) {
                                        ApiResult::setArrayType( $data[$u]['implicitgroups'], 'array' );
                                        ApiResult::setIndexedTagName( $data[$u]['implicitgroups'], 'g' );
@@ -287,8 +337,13 @@ class ApiQueryUsers extends ApiQueryBase {
                        $fit = $result->addValue( [ 'query', $this->getModuleName() ],
                                null, $data[$u] );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'users',
-                                       implode( '|', array_diff( $users, $done ) ) );
+                               if ( $useNames ) {
+                                       $this->setContinueEnumParameter( 'users',
+                                               implode( '|', array_diff( $users, $done ) ) );
+                               } else {
+                                       $this->setContinueEnumParameter( 'userids',
+                                               implode( '|', array_diff( $userids, $done ) ) );
+                               }
                                break;
                        }
                        $done[] = $u;
@@ -313,6 +368,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => [
                                        'blockinfo',
                                        'groups',
+                                       'groupmemberships',
                                        'implicitgroups',
                                        'rights',
                                        'editcount',
@@ -330,6 +386,10 @@ class ApiQueryUsers extends ApiQueryBase {
                        'users' => [
                                ApiBase::PARAM_ISMULTI => true
                        ],
+                       'userids' => [
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ],
                        'token' => [
                                ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
index 42ea55d..3f59751 100644 (file)
@@ -82,7 +82,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        if ( $this->fld_patrol ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage( 'patrol property is not available', 'patrol' );
+                                       $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'patrol' );
                                }
                        }
                }
@@ -134,7 +134,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        /* Check for conflicting parameters. */
                        if ( $this->showParamsConflicting( $show ) ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        // Check permissions.
@@ -142,10 +142,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                || isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] )
                        ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage(
-                                               'You need the patrol right to request the patrolled flag',
-                                               'permissiondenied'
-                                       );
+                                       $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                                }
                        }
 
@@ -154,15 +151,16 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                if ( !is_null( $params['type'] ) ) {
                        try {
-                               $options['rcTypes'] = RecentChange::parseToRCType( $params['type'] );
+                               $rcTypes = RecentChange::parseToRCType( $params['type'] );
+                               if ( $rcTypes ) {
+                                       $options['rcTypes'] = $rcTypes;
+                               }
                        } catch ( Exception $e ) {
                                ApiBase::dieDebug( __METHOD__, $e->getMessage() );
                        }
                }
 
-               if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
-               }
+               $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
                if ( !is_null( $params['user'] ) ) {
                        $options['onlyByUser'] = $params['user'];
                }
index 806861e..a1078a5 100644 (file)
@@ -60,7 +60,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] )
                        && isset( $show[WatchedItemQueryService::FILTER_NOT_CHANGED] )
                ) {
-                       $this->dieUsageMsg( 'show' );
+                       $this->dieWithError( 'apierror-show' );
                }
 
                $options = [];
index d72c8a4..359d045 100644 (file)
@@ -45,7 +45,7 @@ class ApiRemoveAuthenticationData extends ApiBase {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'Must be logged in to remove authentication data', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-removeauth', 'notloggedin' );
                }
 
                $params = $this->extractRequestParams();
@@ -67,7 +67,7 @@ class ApiRemoveAuthenticationData extends ApiBase {
                        }
                );
                if ( count( $reqs ) !== 1 ) {
-                       $this->dieUsage( 'Failed to create change request', 'badrequest' );
+                       $this->dieWithError( 'apierror-changeauth-norequest', 'badrequest' );
                }
                $req = reset( $reqs );
 
index 042ad69..b5fa8ed 100644 (file)
@@ -52,7 +52,7 @@ class ApiResetPassword extends ApiBase {
 
        public function execute() {
                if ( !$this->hasAnyRoutes() ) {
-                       $this->dieUsage( 'No password reset routes are available.', 'moduledisabled' );
+                       $this->dieWithError( 'apihelp-resetpassword-description-noroutes', 'moduledisabled' );
                }
 
                $params = $this->extractRequestParams() + [
@@ -65,13 +65,13 @@ class ApiResetPassword extends ApiBase {
 
                $passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
 
-               $status = $passwordReset->isAllowed( $this->getUser(), $params['capture'] );
+               $status = $passwordReset->isAllowed( $this->getUser() );
                if ( !$status->isOK() ) {
                        $this->dieStatus( Status::wrap( $status ) );
                }
 
                $status = $passwordReset->execute(
-                       $this->getUser(), $params['user'], $params['email'], $params['capture']
+                       $this->getUser(), $params['user'], $params['email']
                );
                if ( !$status->isOK() ) {
                        $status->value = null;
@@ -80,12 +80,6 @@ class ApiResetPassword extends ApiBase {
 
                $result = $this->getResult();
                $result->addValue( [ 'resetpassword' ], 'status', 'success' );
-               if ( $params['capture'] ) {
-                       $passwords = $status->getValue() ?: [];
-                       ApiResult::setArrayType( $passwords, 'kvp', 'user' );
-                       ApiResult::setIndexedTagName( $passwords, 'p' );
-                       $result->addValue( [ 'resetpassword' ], 'passwords', $passwords );
-               }
        }
 
        public function isWriteMode() {
@@ -111,7 +105,6 @@ class ApiResetPassword extends ApiBase {
                        'email' => [
                                ApiBase::PARAM_TYPE => 'string',
                        ],
-                       'capture' => false,
                ];
 
                $resetRoutes = $this->getConfig()->get( 'PasswordResetRoutes' );
index 6e27fc8..e27cf7d 100644 (file)
@@ -413,11 +413,9 @@ class ApiResult implements ApiSerializable {
 
                        $newsize = $this->size + self::size( $value );
                        if ( $this->maxSize !== false && $newsize > $this->maxSize ) {
-                               /// @todo Add i18n message when replacing calls to ->setWarning()
-                               $msg = new ApiRawMessage( 'This result was truncated because it would otherwise ' .
-                                       'be larger than the limit of $1 bytes', 'truncatedresult' );
-                               $msg->numParams( $this->maxSize );
-                               $this->errorFormatter->addWarning( 'result', $msg );
+                               $this->errorFormatter->addWarning(
+                                       'result', [ 'apiwarn-truncatedresult', Message::numParam( $this->maxSize ) ]
+                               );
                                return false;
                        }
                        $this->size = $newsize;
@@ -1198,6 +1196,29 @@ class ApiResult implements ApiSerializable {
                }
        }
 
+       /**
+        * Format an expiry timestamp for API output
+        * @since 1.29
+        * @param string $expiry Expiry timestamp, likely from the database
+        * @param string $infinity Use this string for infinite expiry
+        *  (only use this to maintain backward compatibility with existing output)
+        * @return string Formatted expiry
+        */
+       public static function formatExpiry( $expiry, $infinity = 'infinity' ) {
+               static $dbInfinity;
+               if ( $dbInfinity === null ) {
+                       $dbInfinity = wfGetDB( DB_REPLICA )->getInfinity();
+               }
+
+               if ( $expiry === '' || $expiry === null || $expiry === false ||
+                       wfIsInfinity( $expiry ) || $expiry === $dbInfinity
+               ) {
+                       return $infinity;
+               } else {
+                       return wfTimestamp( TS_ISO_8601, $expiry );
+               }
+       }
+
        /**@}*/
 
 }
index ed9fba2..4896e7e 100644 (file)
@@ -36,24 +36,30 @@ class ApiRevisionDelete extends ApiBase {
 
                $params = $this->extractRequestParams();
                $user = $this->getUser();
-               if ( !$user->isAllowed( RevisionDeleter::getRestriction( $params['type'] ) ) ) {
-                       $this->dieUsageMsg( 'badaccess-group0' );
-               }
+               $this->checkUserRightsAny( RevisionDeleter::getRestriction( $params['type'] ) );
 
                if ( $user->isBlocked() ) {
                        $this->dieBlocked( $user->getBlock() );
                }
 
                if ( !$params['ids'] ) {
-                       $this->dieUsage( "At least one value is required for 'ids'", 'badparams' );
+                       $this->dieWithError( [ 'apierror-paramempty', 'ids' ], 'paramempty_ids' );
+               }
+
+               // Check if user can add tags
+               if ( count( $params['tags'] ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                $hide = $params['hide'] ?: [];
                $show = $params['show'] ?: [];
                if ( array_intersect( $hide, $show ) ) {
-                       $this->dieUsage( "Mutually exclusive values for 'hide' and 'show'", 'badparams' );
+                       $this->dieWithError( 'apierror-revdel-mutuallyexclusive', 'badparams' );
                } elseif ( !$hide && !$show ) {
-                       $this->dieUsage( "At least one value is required for 'hide' or 'show'", 'badparams' );
+                       $this->dieWithError( 'apierror-revdel-paramneeded', 'badparams' );
                }
                $bits = [
                        'content' => RevisionDeleter::getRevdelConstant( $params['type'] ),
@@ -72,9 +78,7 @@ class ApiRevisionDelete extends ApiBase {
                }
 
                if ( $params['suppress'] === 'yes' ) {
-                       if ( !$user->isAllowed( 'suppressrevision' ) ) {
-                               $this->dieUsageMsg( 'badaccess-group0' );
-                       }
+                       $this->checkUserRightsAny( 'suppressrevision' );
                        $bitfield[Revision::DELETED_RESTRICTED] = 1;
                } elseif ( $params['suppress'] === 'no' ) {
                        $bitfield[Revision::DELETED_RESTRICTED] = 0;
@@ -88,15 +92,18 @@ class ApiRevisionDelete extends ApiBase {
                }
                $targetObj = RevisionDeleter::suggestTarget( $params['type'], $targetObj, $params['ids'] );
                if ( $targetObj === null ) {
-                       $this->dieUsage( 'A target title is required for this RevDel type', 'needtarget' );
+                       $this->dieWithError( [ 'apierror-revdel-needtarget' ], 'needtarget' );
                }
 
                $list = RevisionDeleter::createList(
                        $params['type'], $this->getContext(), $targetObj, $params['ids']
                );
-               $status = $list->setVisibility(
-                       [ 'value' => $bitfield, 'comment' => $params['reason'], 'perItemStatus' => true ]
-               );
+               $status = $list->setVisibility( [
+                       'value' => $bitfield,
+                       'comment' => $params['reason'],
+                       'perItemStatus' => true,
+                       'tags' => $params['tags']
+               ] );
 
                $result = $this->getResult();
                $data = $this->extractStatusInfo( $status );
@@ -124,49 +131,19 @@ class ApiRevisionDelete extends ApiBase {
                $ret = [
                        'status' => $status->isOK() ? 'Success' : 'Fail',
                ];
-               $errors = $this->formatStatusMessages( $status->getErrorsByType( 'error' ) );
+
+               $errors = $this->getErrorFormatter()->arrayFromStatus( $status, 'error' );
                if ( $errors ) {
-                       ApiResult::setIndexedTagName( $errors, 'e' );
                        $ret['errors'] = $errors;
                }
-               $warnings = $this->formatStatusMessages( $status->getErrorsByType( 'warning' ) );
+               $warnings = $this->getErrorFormatter()->arrayFromStatus( $status, 'warning' );
                if ( $warnings ) {
-                       ApiResult::setIndexedTagName( $warnings, 'w' );
                        $ret['warnings'] = $warnings;
                }
 
                return $ret;
        }
 
-       private function formatStatusMessages( $messages ) {
-               if ( !$messages ) {
-                       return [];
-               }
-               $ret = [];
-               foreach ( $messages as $m ) {
-                       if ( $m['message'] instanceof Message ) {
-                               $msg = $m['message'];
-                               $message = [ 'message' => $msg->getKey() ];
-                               if ( $msg->getParams() ) {
-                                       $message['params'] = $msg->getParams();
-                                       ApiResult::setIndexedTagName( $message['params'], 'p' );
-                               }
-                       } else {
-                               $message = [ 'message' => $m['message'] ];
-                               $msg = wfMessage( $m['message'] );
-                               if ( isset( $m['params'] ) ) {
-                                       $message['params'] = $m['params'];
-                                       ApiResult::setIndexedTagName( $message['params'], 'p' );
-                                       $msg->params( $m['params'] );
-                               }
-                       }
-                       $message['rendered'] = $msg->useDatabase( false )->inLanguage( 'en' )->plain();
-                       $ret[] = $message;
-               }
-
-               return $ret;
-       }
-
        public function mustBePosted() {
                return true;
        }
@@ -199,6 +176,10 @@ class ApiRevisionDelete extends ApiBase {
                                ApiBase::PARAM_DFLT => 'nochange',
                        ],
                        'reason' => null,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index b9911da..9584f09 100644 (file)
@@ -69,24 +69,8 @@ class ApiRollback extends ApiBase {
                        $params['tags']
                );
 
-               // We don't care about multiple errors, just report one of them
                if ( $retval ) {
-                       if ( isset( $retval[0][0] ) &&
-                               ( $retval[0][0] == 'alreadyrolled' || $retval[0][0] == 'cantrollback' )
-                       ) {
-                               $error = $retval[0];
-                               $userMessage = $this->msg( $error[0], array_slice( $error, 1 ) );
-                               // dieUsageMsg() doesn't support $extraData
-                               $errorCode = $error[0];
-                               $errorInfo = isset( ApiBase::$messageMap[$errorCode] ) ?
-                                       ApiBase::$messageMap[$errorCode]['info'] :
-                                       $errorCode;
-                               $this->dieUsage( $errorInfo, $errorCode, 0, [
-                                       'messageHtml' => $userMessage->parseAsBlock()
-                               ] );
-                       }
-
-                       $this->dieUsageMsg( reset( $retval ) );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval, $user ) );
                }
 
                $watch = 'preferences';
@@ -108,17 +92,6 @@ class ApiRollback extends ApiBase {
                        'last_revid' => intval( $details['target']->getID() )
                ];
 
-               $oldUser = $details['current']->getUserText( Revision::FOR_THIS_USER );
-               $lastUser = $details['target']->getUserText( Revision::FOR_THIS_USER );
-               $diffUrl = $titleObj->getFullURL( [
-                       'diff' => $info['revid'],
-                       'oldid' => $info['old_revid'],
-                       'diffonly' => '1'
-               ] );
-               $info['messageHtml'] = $this->msg( 'rollback-success-notify' )
-                       ->params( $oldUser, $lastUser, $diffUrl )
-                       ->parseAsBlock();
-
                $this->getResult()->addValue( null, $this->getModuleName(), $info );
        }
 
@@ -181,7 +154,7 @@ class ApiRollback extends ApiBase {
                        ? $params['user']
                        : User::getCanonicalName( $params['user'] );
                if ( !$this->mUser ) {
-                       $this->dieUsageMsg( [ 'invaliduser', $params['user'] ] );
+                       $this->dieWithError( [ 'apierror-invaliduser', wfEscapeWikiText( $params['user'] ) ] );
                }
 
                return $this->mUser;
@@ -202,17 +175,17 @@ class ApiRollback extends ApiBase {
                if ( isset( $params['title'] ) ) {
                        $this->mTitleObj = Title::newFromText( $params['title'] );
                        if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                        }
                } elseif ( isset( $params['pageid'] ) ) {
                        $this->mTitleObj = Title::newFromID( $params['pageid'] );
                        if ( !$this->mTitleObj ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['pageid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['pageid'] ] );
                        }
                }
 
                if ( !$this->mTitleObj->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                return $this->mTitleObj;
index 3412f38..5769ff6 100644 (file)
@@ -38,11 +38,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
                $user = $this->getUser();
 
                if ( $user->isAnon() ) {
-                       $this->dieUsage( 'Anonymous users cannot use watchlist change notifications', 'notloggedin' );
-               }
-               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
-                       $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+                       $this->dieWithError( 'watchlistanontext', 'notloggedin' );
                }
+               $this->checkUserRightsAny( 'editmywatchlist' );
 
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
@@ -52,8 +50,12 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
                $pageSet = $this->getPageSet();
                if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
-                       $this->dieUsage(
-                               "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'",
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-cannotusewith',
+                                       $this->encodeParamName( 'entirewatchlist' ),
+                                       $pageSet->encodeParamName( $pageSet->getDataSource() )
+                               ],
                                'multisource'
                        );
                }
@@ -71,7 +73,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
                if ( isset( $params['torevid'] ) ) {
                        if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
-                               $this->dieUsage( 'torevid may only be used with a single page', 'multpages' );
+                               $this->dieWithError( [ 'apierror-multpages', $this->encodeParamName( 'torevid' ) ] );
                        }
                        $title = reset( $pageSet->getGoodTitles() );
                        if ( $title ) {
@@ -85,7 +87,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        }
                } elseif ( isset( $params['newerthanrevid'] ) ) {
                        if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
-                               $this->dieUsage( 'newerthanrevid may only be used with a single page', 'multpages' );
+                               $this->dieWithError( [ 'apierror-multpages', $this->encodeParamName( 'newerthanrevid' ) ] );
                        }
                        $title = reset( $pageSet->getGoodTitles() );
                        if ( $title ) {
diff --git a/includes/api/ApiSetPageLanguage.php b/includes/api/ApiSetPageLanguage.php
new file mode 100755 (executable)
index 0000000..3ff99f1
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+/**
+ *
+ *
+ * Created on January 1, 2017
+ *
+ * Copyright © 2017 Justin Du "<justin.d128@gmail.com>"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * API module that facilitates changing the language of a page.
+ * The API equivalent of SpecialPageLanguage.
+ * Requires API write mode to be enabled.
+ *
+ * @ingroup API
+ */
+class ApiSetPageLanguage extends ApiBase {
+       // Check if change language feature is enabled
+       protected function getDescriptionMessage() {
+               if ( !$this->getConfig()->get( 'PageLanguageUseDB' ) ) {
+                       return 'apihelp-setpagelanguage-description-disabled';
+               }
+               return parent::getDescriptionMessage();
+       }
+
+       /**
+        * Extracts the title and language from the request parameters and invokes
+        * the static SpecialPageLanguage::changePageLanguage() function with these as arguments.
+        * If the language change succeeds, the title, old language, and new language
+        * of the article changed, as well as the performer of the language change
+        * are added to the result object.
+        */
+       public function execute() {
+               // Check if change language feature is enabled
+               if ( !$this->getConfig()->get( 'PageLanguageUseDB' ) ) {
+                       $this->dieWithError( 'apierror-pagelang-disabled' );
+               }
+
+               // Check if the user has permissions
+               $this->checkUserRightsAny( 'pagelang' );
+
+               $this->useTransactionalTimeLimit();
+
+               $params = $this->extractRequestParams();
+
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
+               if ( !$pageObj->exists() ) {
+                       $this->dieWithError( 'apierror-missingtitle' );
+               }
+
+               $titleObj = $pageObj->getTitle();
+               $user = $this->getUser();
+
+               // Check that the user is allowed to edit the page
+               $this->checkTitleUserPermissions( $titleObj, 'edit' );
+
+               // If change tagging was requested, check that the user is allowed to tag,
+               // and the tags are valid
+               if ( count( $params['tags'] ) ) {
+                       $tagStatus = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$tagStatus->isOK() ) {
+                               $this->dieStatus( $tagStatus );
+                       }
+               }
+
+               $status = SpecialPageLanguage::changePageLanguage(
+                       $this,
+                       $titleObj,
+                       $params['lang'],
+                       $params['reason'] === null ? '' : $params['reason'],
+                       $params['tags'] ?: []
+               );
+
+               if ( !$status->isOK() ) {
+                       $this->dieStatus( $status );
+               }
+
+               $r = [
+                       'title' => $titleObj->getPrefixedText(),
+                       'oldlanguage' => $status->value->oldLanguage,
+                       'newlanguage' => $status->value->newLanguage,
+                       'logid' => $status->value->logId
+               ];
+               $this->getResult()->addValue( null, $this->getModuleName(), $r );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'title' => null,
+                       'pageid' => [
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ],
+                       'lang' => [
+                               ApiBase::PARAM_TYPE => array_merge(
+                                       [ 'default' ],
+                                       array_keys( Language::fetchLanguageNames( null, 'mwfile' ) )
+                               ),
+                               ApiBase::PARAM_REQUIRED => true,
+                       ],
+                       'reason' => null,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
+               ];
+       }
+
+       public function needsToken() {
+               return 'csrf';
+       }
+
+       protected function getExamplesMessages() {
+               return [
+                       'action=setpagelanguage&title=Main%20Page&lang=eu&token=123ABC'
+                               => 'apihelp-setpagelanguage-example-language',
+                       'action=setpagelanguage&pageid=123&lang=default&token=123ABC'
+                               => 'apihelp-setpagelanguage-example-default',
+               ];
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:SetPageLanguage';
+       }
+}
index 92cbe90..37ee3e7 100644 (file)
@@ -51,7 +51,7 @@ class ApiStashEdit extends ApiBase {
                $params = $this->extractRequestParams();
 
                if ( $user->isBot() ) { // sanity
-                       $this->dieUsage( 'This interface is not supported for bots', 'botsnotsupported' );
+                       $this->dieWithError( 'apierror-botsnotsupported' );
                }
 
                $cache = ObjectCache::getLocalClusterInstance();
@@ -61,9 +61,14 @@ class ApiStashEdit extends ApiBase {
                if ( !ContentHandler::getForModelID( $params['contentmodel'] )
                        ->isSupportedFormat( $params['contentformat'] )
                ) {
-                       $this->dieUsage( 'Unsupported content model/format', 'badmodelformat' );
+                       $this->dieWithError(
+                               [ 'apierror-badformat-generic', $params['contentformat'], $params['contentmodel'] ],
+                               'badmodelformat'
+                       );
                }
 
+               $this->requireAtLeastOneParameter( $params, 'stashedtexthash', 'text' );
+
                $text = null;
                $textHash = null;
                if ( strlen( $params['stashedtexthash'] ) ) {
@@ -72,15 +77,18 @@ class ApiStashEdit extends ApiBase {
                        $textKey = $cache->makeKey( 'stashedit', 'text', $textHash );
                        $text = $cache->get( $textKey );
                        if ( !is_string( $text ) ) {
-                               $this->dieUsage( 'No stashed text found with the given hash', 'missingtext' );
+                               $this->dieWithError( 'apierror-stashedit-missingtext', 'missingtext' );
                        }
                } elseif ( $params['text'] !== null ) {
                        // Trim and fix newlines so the key SHA1's match (see WebRequest::getText())
                        $text = rtrim( str_replace( "\r\n", "\n", $params['text'] ) );
                        $textHash = sha1( $text );
                } else {
-                       $this->dieUsage(
-                               'The text or stashedtexthash parameter must be given', 'missingtextparam' );
+                       $this->dieWithError( [
+                               'apierror-missingparam-at-least-one-of',
+                               Message::listParam( [ '<var>stashedtexthash</var>', '<var>text</var>' ] ),
+                               2,
+                       ], 'missingparam' );
                }
 
                $textContent = ContentHandler::makeContent(
@@ -91,11 +99,11 @@ class ApiStashEdit extends ApiBase {
                        // Page exists: get the merged content with the proposed change
                        $baseRev = Revision::newFromPageId( $page->getId(), $params['baserevid'] );
                        if ( !$baseRev ) {
-                               $this->dieUsage( "No revision ID {$params['baserevid']}", 'missingrev' );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['baserevid'] ] );
                        }
                        $currentRev = $page->getRevision();
                        if ( !$currentRev ) {
-                               $this->dieUsage( "No current revision of page ID {$page->getId()}", 'missingrev' );
+                               $this->dieWithError( [ 'apierror-missingrev-pageid', $page->getId() ], 'missingrev' );
                        }
                        // Merge in the new version of the section to get the proposed version
                        $editContent = $page->replaceSectionAtRev(
@@ -105,7 +113,7 @@ class ApiStashEdit extends ApiBase {
                                $baseRev->getId()
                        );
                        if ( !$editContent ) {
-                               $this->dieUsage( 'Could not merge updated section.', 'replacefailed' );
+                               $this->dieWithError( 'apierror-sectionreplacefailed', 'replacefailed' );
                        }
                        if ( $currentRev->getId() == $baseRev->getId() ) {
                                // Base revision was still the latest; nothing to merge
@@ -115,7 +123,7 @@ class ApiStashEdit extends ApiBase {
                                $baseContent = $baseRev->getContent();
                                $currentContent = $currentRev->getContent();
                                if ( !$baseContent || !$currentContent ) {
-                                       $this->dieUsage( "Missing content for page ID {$page->getId()}", 'missingrev' );
+                                       $this->dieWithError( [ 'apierror-missingcontent-pageid', $page->getId() ], 'missingrev' );
                                }
                                $handler = ContentHandler::getForModelID( $baseContent->getModel() );
                                $content = $handler->merge3( $baseContent, $editContent, $currentContent );
@@ -160,7 +168,7 @@ class ApiStashEdit extends ApiBase {
         * @param Content $content Edit content
         * @param User $user
         * @param string $summary Edit summary
-        * @return integer ApiStashEdit::ERROR_* constant
+        * @return string ApiStashEdit::ERROR_* constant
         * @since 1.25
         */
        public static function parseAndStash( WikiPage $page, Content $content, User $user, $summary ) {
index f88c2db..7470ff3 100644 (file)
@@ -30,15 +30,20 @@ class ApiTag extends ApiBase {
                $user = $this->getUser();
 
                // make sure the user is allowed
-               if ( !$user->isAllowed( 'changetags' ) ) {
-                       $this->dieUsage( "You don't have permission to add or remove change tags from individual edits",
-                               'permissiondenied' );
-               }
+               $this->checkUserRightsAny( 'changetags' );
 
                if ( $user->isBlocked() ) {
                        $this->dieBlocked( $user->getBlock() );
                }
 
+               // Check if user can add tags
+               if ( count( $params['tags'] ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOk() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                // validate and process each revid, rcid and logid
                $this->requireAtLeastOneParameter( $params, 'revid', 'rcid', 'logid' );
                $ret = [];
@@ -88,7 +93,8 @@ class ApiTag extends ApiBase {
 
                if ( !$valid ) {
                        $idResult['status'] = 'error';
-                       $idResult += $this->parseMsg( [ "nosuch$type", $id ] );
+                       // Messages: apierror-nosuchrcid apierror-nosuchrevid apierror-nosuchlogid
+                       $idResult += $this->getErrorFormatter()->formatMessage( [ "apierror-nosuch$type", $id ] );
                        return $idResult;
                }
 
@@ -111,13 +117,17 @@ class ApiTag extends ApiBase {
                } else {
                        $idResult['status'] = 'success';
                        if ( is_null( $status->value->logId ) ) {
-                               $idResult['noop'] = '';
+                               $idResult['noop'] = true;
                        } else {
                                $idResult['actionlogid'] = $status->value->logId;
                                $idResult['added'] = $status->value->addedTags;
                                ApiResult::setIndexedTagName( $idResult['added'], 't' );
                                $idResult['removed'] = $status->value->removedTags;
                                ApiResult::setIndexedTagName( $idResult['removed'], 't' );
+
+                               if ( $params['tags'] ) {
+                                       ChangeTags::addTags( $params['tags'], null, null, $status->value->logId );
+                               }
                        }
                }
                return $idResult;
@@ -156,6 +166,10 @@ class ApiTag extends ApiBase {
                        'reason' => [
                                ApiBase::PARAM_DFLT => '',
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 4940394..fc2951a 100644 (file)
 class ApiTokens extends ApiBase {
 
        public function execute() {
-               $this->setWarning(
-                       'action=tokens has been deprecated. Please use action=query&meta=tokens instead.'
+               $this->addDeprecation(
+                       [ 'apiwarn-deprecation-withreplacement', 'action=tokens', 'action=query&meta=tokens' ],
+                       'action=tokens'
                );
-               $this->logFeatureUsage( 'action=tokens' );
 
                $params = $this->extractRequestParams();
                $res = [
@@ -46,7 +46,7 @@ class ApiTokens extends ApiBase {
                        $val = call_user_func( $types[$type], null, null );
 
                        if ( $val === false ) {
-                               $this->setWarning( "Action '$type' is not allowed for the current user" );
+                               $this->addWarning( [ 'apiwarn-tokennotallowed', $type ] );
                        } else {
                                $res[$type . 'token'] = $val;
                        }
index ace41a4..3eeb7a4 100644 (file)
@@ -39,25 +39,18 @@ class ApiUnblock extends ApiBase {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               if ( is_null( $params['id'] ) && is_null( $params['user'] ) ) {
-                       $this->dieUsageMsg( 'unblock-notarget' );
-               }
-               if ( !is_null( $params['id'] ) && !is_null( $params['user'] ) ) {
-                       $this->dieUsageMsg( 'unblock-idanduser' );
-               }
+               $this->requireOnlyOneParameter( $params, 'id', 'user', 'userid' );
 
                if ( !$user->isAllowed( 'block' ) ) {
-                       $this->dieUsageMsg( 'cantunblock' );
+                       $this->dieWithError( 'apierror-permissiondenied-unblock', 'permissiondenied' );
                }
                # bug 15810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
-                               $msg = $this->parseMsg( $status );
-                               $this->dieUsage(
-                                       $msg['info'],
-                                       $msg['code'],
-                                       0,
+                               $this->dieWithError(
+                                       $status,
+                                       null,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                );
                        }
@@ -71,6 +64,16 @@ class ApiUnblock extends ApiBase {
                        }
                }
 
+               if ( $params['userid'] !== null ) {
+                       $username = User::whoIs( $params['userid'] );
+
+                       if ( $username === false ) {
+                               $this->dieWithError( [ 'apierror-nosuchuserid', $params['userid'] ], 'nosuchuserid' );
+                       } else {
+                               $params['user'] = $username;
+                       }
+               }
+
                $data = [
                        'Target' => is_null( $params['id'] ) ? $params['user'] : "#{$params['id']}",
                        'Reason' => $params['reason'],
@@ -79,7 +82,7 @@ class ApiUnblock extends ApiBase {
                $block = Block::newFromTarget( $data['Target'] );
                $retval = SpecialUnblock::processUnblock( $data, $this->getContext() );
                if ( $retval !== true ) {
-                       $this->dieUsageMsg( $retval[0] );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval ) );
                }
 
                $res['id'] = $block->getId();
@@ -104,6 +107,9 @@ class ApiUnblock extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ],
                        'user' => null,
+                       'userid' => [
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ],
                        'reason' => '',
                        'tags' => [
                                ApiBase::PARAM_TYPE => 'tags',
index e24f2ce..7fda1ea 100644 (file)
@@ -33,18 +33,16 @@ class ApiUndelete extends ApiBase {
                $this->useTransactionalTimeLimit();
 
                $params = $this->extractRequestParams();
-               $user = $this->getUser();
-               if ( !$user->isAllowed( 'undelete' ) ) {
-                       $this->dieUsageMsg( 'permdenied-undelete' );
-               }
+               $this->checkUserRightsAny( 'undelete' );
 
+               $user = $this->getUser();
                if ( $user->isBlocked() ) {
                        $this->dieBlocked( $user->getBlock() );
                }
 
                $titleObj = Title::newFromText( $params['title'] );
                if ( !$titleObj || $titleObj->isExternal() ) {
-                       $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                }
 
                // Check if user can add tags
@@ -76,7 +74,7 @@ class ApiUndelete extends ApiBase {
                        $params['tags']
                );
                if ( !is_array( $retval ) ) {
-                       $this->dieUsageMsg( 'cannotundelete' );
+                       $this->dieWithError( 'apierror-cantundelete' );
                }
 
                if ( $retval[1] ) {
index 7b44f40..af3fff6 100644 (file)
@@ -36,7 +36,7 @@ class ApiUpload extends ApiBase {
        public function execute() {
                // Check whether upload is enabled
                if ( !UploadBase::isEnabled() ) {
-                       $this->dieUsageMsg( 'uploaddisabled' );
+                       $this->dieWithError( 'uploaddisabled' );
                }
 
                $user = $this->getUser();
@@ -61,11 +61,10 @@ class ApiUpload extends ApiBase {
                        if ( !$this->selectUploadModule() ) {
                                return; // not a true upload, but a status request or similar
                        } elseif ( !isset( $this->mUpload ) ) {
-                               $this->dieUsage( 'No upload module set', 'nomodule' );
+                               $this->dieDebug( __METHOD__, 'No upload module set' );
                        }
                } catch ( UploadStashException $e ) { // XXX: don't spam exception log
-                       list( $msg, $code ) = $this->handleStashException( get_class( $e ), $e->getMessage() );
-                       $this->dieUsage( $msg, $code );
+                       $this->dieStatus( $this->handleStashException( $e ) );
                }
 
                // First check permission to upload
@@ -75,19 +74,17 @@ class ApiUpload extends ApiBase {
                /** @var $status Status */
                $status = $this->mUpload->fetchFile();
                if ( !$status->isGood() ) {
-                       $errors = $status->getErrorsArray();
-                       $error = array_shift( $errors[0] );
-                       $this->dieUsage( 'Error fetching file from remote source', $error, 0, $errors[0] );
+                       $this->dieStatus( $status );
                }
 
                // Check if the uploaded file is sane
                if ( $this->mParams['chunk'] ) {
                        $maxSize = UploadBase::getMaxUploadSize();
                        if ( $this->mParams['filesize'] > $maxSize ) {
-                               $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
+                               $this->dieWithError( 'file-too-large' );
                        }
                        if ( !$this->mUpload->getTitle() ) {
-                               $this->dieUsage( 'Invalid file title supplied', 'internal-error' );
+                               $this->dieWithError( 'illegal-filename' );
                        }
                } elseif ( $this->mParams['async'] && $this->mParams['filekey'] ) {
                        // defer verification to background process
@@ -102,7 +99,7 @@ class ApiUpload extends ApiBase {
                if ( !$this->mParams['stash'] ) {
                        $permErrors = $this->mUpload->verifyTitlePermissions( $user );
                        if ( $permErrors !== true ) {
-                               $this->dieRecoverableError( $permErrors[0], 'filename' );
+                               $this->dieRecoverableError( $permErrors, 'filename' );
                        }
                }
 
@@ -110,8 +107,7 @@ class ApiUpload extends ApiBase {
                try {
                        $result = $this->getContextResult();
                } catch ( UploadStashException $e ) { // XXX: don't spam exception log
-                       list( $msg, $code ) = $this->handleStashException( get_class( $e ), $e->getMessage() );
-                       $this->dieUsage( $msg, $code );
+                       $this->dieStatus( $this->handleStashException( $e ) );
                }
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
 
@@ -146,7 +142,7 @@ class ApiUpload extends ApiBase {
                // Check throttle after we've handled warnings
                if ( UploadBase::isThrottled( $this->getUser() )
                ) {
-                       $this->dieUsageMsg( 'actionthrottledtext' );
+                       $this->dieWithError( 'apierror-ratelimited' );
                }
 
                // This is the most common case -- a normal upload with no warnings
@@ -208,16 +204,12 @@ class ApiUpload extends ApiBase {
 
                // Sanity check sizing
                if ( $totalSoFar > $this->mParams['filesize'] ) {
-                       $this->dieUsage(
-                               'Offset plus current chunk is greater than claimed file size', 'invalid-chunk'
-                       );
+                       $this->dieWithError( 'apierror-invalid-chunk' );
                }
 
                // Enforce minimum chunk size
                if ( $totalSoFar != $this->mParams['filesize'] && $chunkSize < $minChunkSize ) {
-                       $this->dieUsage(
-                               "Minimum chunk size is $minChunkSize bytes for non-final chunks", 'chunk-too-small'
-                       );
+                       $this->dieWithError( [ 'apierror-chunk-too-small', Message::numParam( $minChunkSize ) ] );
                }
 
                if ( $this->mParams['offset'] == 0 ) {
@@ -229,11 +221,9 @@ class ApiUpload extends ApiBase {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $filekey );
                        if ( !$progress ) {
                                // Probably can't get here, but check anyway just in case
-                               $this->dieUsage( 'No chunked upload session with this key', 'stashfailed' );
+                               $this->dieWithError( 'apierror-stashfailed-nosession', 'stashfailed' );
                        } elseif ( $progress['result'] !== 'Continue' || $progress['stage'] !== 'uploading' ) {
-                               $this->dieUsage(
-                                       'Chunked upload is already completed, check status for details', 'stashfailed'
-                               );
+                               $this->dieWithError( 'apierror-stashfailed-complete', 'stashfailed' );
                        }
 
                        $status = $this->mUpload->addChunk(
@@ -330,12 +320,14 @@ class ApiUpload extends ApiBase {
 
                        if ( $status->isGood() && !$status->getValue() ) {
                                // Not actually a 'good' status...
-                               $status->fatal( new ApiRawMessage( 'Invalid stashed file', 'stashfailed' ) );
+                               $status->fatal( new ApiMessage( 'apierror-stashinvalidfile', 'stashfailed' ) );
                        }
                } catch ( Exception $e ) {
                        $debugMessage = 'Stashing temporary file failed: ' . get_class( $e ) . ' ' . $e->getMessage();
                        wfDebug( __METHOD__ . ' ' . $debugMessage . "\n" );
-                       $status = Status::newFatal( new ApiRawMessage( $e->getMessage(), 'stashfailed' ) );
+                       $status = Status::newFatal( $this->getErrorFormatter()->getMessageFromException(
+                               $e, [ 'wrap' => new ApiMessage( 'apierror-stashexception', 'stashfailed' ) ]
+                       ) );
                }
 
                if ( $status->isGood() ) {
@@ -352,16 +344,13 @@ class ApiUpload extends ApiBase {
                        list( $exceptionType, $message ) = $status->getMessage()->getParams();
                        $debugMessage = 'Stashing temporary file failed: ' . $exceptionType . ' ' . $message;
                        wfDebug( __METHOD__ . ' ' . $debugMessage . "\n" );
-                       list( $msg, $code ) = $this->handleStashException( $exceptionType, $message );
-                       $status = Status::newFatal( new ApiRawMessage( $msg, $code ) );
                }
 
                // Bad status
                if ( $failureMode !== 'optional' ) {
                        $this->dieStatus( $status );
                } else {
-                       list( $code, $msg ) = $this->getErrorFromStatus( $status );
-                       $data['stashfailed'] = $msg;
+                       $data['stasherrors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                        return null;
                }
        }
@@ -370,25 +359,25 @@ class ApiUpload extends ApiBase {
         * Throw an error that the user can recover from by providing a better
         * value for $parameter
         *
-        * @param array|string|MessageSpecifier $error Error suitable for passing to dieUsageMsg()
-        * @param string $parameter Parameter that needs revising
-        * @param array $data Optional extra data to pass to the user
-        * @param string $code Error code to use if the error is unknown
-        * @throws UsageException
+        * @param array $errors Array of Message objects, message keys, key+param
+        *  arrays, or StatusValue::getErrors()-style arrays
+        * @param string|null $parameter Parameter that needs revising
+        * @throws ApiUsageException
         */
-       private function dieRecoverableError( $error, $parameter, $data = [], $code = 'unknownerror' ) {
+       private function dieRecoverableError( $errors, $parameter = null ) {
                $this->performStash( 'optional', $data );
-               $data['invalidparameter'] = $parameter;
 
-               $parsed = $this->parseMsg( $error );
-               if ( isset( $parsed['data'] ) ) {
-                       $data = array_merge( $data, $parsed['data'] );
-               }
-               if ( $parsed['code'] === 'unknownerror' ) {
-                       $parsed['code'] = $code;
+               if ( $parameter ) {
+                       $data['invalidparameter'] = $parameter;
                }
 
-               $this->dieUsage( $parsed['info'], $parsed['code'], 0, $data );
+               $sv = StatusValue::newGood();
+               foreach ( $errors as $error ) {
+                       $msg = ApiMessage::create( $error );
+                       $msg->setApiData( $msg->getApiData() + $data );
+                       $sv->fatal( $msg );
+               }
+               $this->dieStatus( $sv );
        }
 
        /**
@@ -398,20 +387,18 @@ class ApiUpload extends ApiBase {
         * @param Status $status
         * @param string $overrideCode Error code to use if there isn't one from IApiMessage
         * @param array|null $moreExtraData
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function dieStatusWithCode( $status, $overrideCode, $moreExtraData = null ) {
-               $extraData = null;
-               list( $code, $msg ) = $this->getErrorFromStatus( $status, $extraData );
-               $errors = $status->getErrorsByType( 'error' ) ?: $status->getErrorsByType( 'warning' );
-               if ( !( $errors[0]['message'] instanceof IApiMessage ) ) {
-                       $code = $overrideCode;
-               }
-               if ( $moreExtraData ) {
-                       $extraData = $extraData ?: [];
-                       $extraData += $moreExtraData;
+               $sv = StatusValue::newGood();
+               foreach ( $status->getErrors() as $error ) {
+                       $msg = ApiMessage::create( $error, $overrideCode );
+                       if ( $moreExtraData ) {
+                               $msg->setApiData( $msg->getApiData() + $moreExtraData );
+                       }
+                       $sv->fatal( $msg );
                }
-               $this->dieUsage( $msg, $code, 0, $extraData );
+               $this->dieStatus( $sv );
        }
 
        /**
@@ -434,7 +421,7 @@ class ApiUpload extends ApiBase {
                if ( $this->mParams['filekey'] && $this->mParams['checkstatus'] ) {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
                        if ( !$progress ) {
-                               $this->dieUsage( 'No result in status data', 'missingresult' );
+                               $this->dieWithError( 'api-upload-missingresult', 'missingresult' );
                        } elseif ( !$progress['status']->isGood() ) {
                                $this->dieStatusWithCode( $progress['status'], 'stashfailed' );
                        }
@@ -466,7 +453,7 @@ class ApiUpload extends ApiBase {
 
                // The following modules all require the filename parameter to be set
                if ( is_null( $this->mParams['filename'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'filename' ] );
+                       $this->dieWithError( [ 'apierror-missingparam', 'filename' ] );
                }
 
                if ( $this->mParams['chunk'] ) {
@@ -474,7 +461,7 @@ class ApiUpload extends ApiBase {
                        $this->mUpload = new UploadFromChunks( $this->getUser() );
                        if ( isset( $this->mParams['filekey'] ) ) {
                                if ( $this->mParams['offset'] === 0 ) {
-                                       $this->dieUsage( 'Cannot supply a filekey when offset is 0', 'badparams' );
+                                       $this->dieWithError( 'apierror-upload-filekeynotallowed', 'filekeynotallowed' );
                                }
 
                                // handle new chunk
@@ -485,7 +472,7 @@ class ApiUpload extends ApiBase {
                                );
                        } else {
                                if ( $this->mParams['offset'] !== 0 ) {
-                                       $this->dieUsage( 'Must supply a filekey when offset is non-zero', 'badparams' );
+                                       $this->dieWithError( 'apierror-upload-filekeyneeded', 'filekeyneeded' );
                                }
 
                                // handle first chunk
@@ -497,7 +484,7 @@ class ApiUpload extends ApiBase {
                } elseif ( isset( $this->mParams['filekey'] ) ) {
                        // Upload stashed in a previous request
                        if ( !UploadFromStash::isValidKey( $this->mParams['filekey'] ) ) {
-                               $this->dieUsageMsg( 'invalid-file-key' );
+                               $this->dieWithError( 'apierror-invalid-file-key' );
                        }
 
                        $this->mUpload = new UploadFromStash( $this->getUser() );
@@ -507,6 +494,13 @@ class ApiUpload extends ApiBase {
                                $this->mParams['filekey'], $this->mParams['filename'], !$this->mParams['async']
                        );
                } elseif ( isset( $this->mParams['file'] ) ) {
+                       // Can't async upload directly from a POSTed file, we'd have to
+                       // stash the file and then queue the publish job. The user should
+                       // just submit the two API queries to perform those two steps.
+                       if ( $this->mParams['async'] ) {
+                               $this->dieWithError( 'apierror-cannot-async-upload-file' );
+                       }
+
                        $this->mUpload = new UploadFromFile();
                        $this->mUpload->initialize(
                                $this->mParams['filename'],
@@ -515,15 +509,15 @@ class ApiUpload extends ApiBase {
                } elseif ( isset( $this->mParams['url'] ) ) {
                        // Make sure upload by URL is enabled:
                        if ( !UploadFromUrl::isEnabled() ) {
-                               $this->dieUsageMsg( 'copyuploaddisabled' );
+                               $this->dieWithError( 'copyuploaddisabled' );
                        }
 
                        if ( !UploadFromUrl::isAllowedHost( $this->mParams['url'] ) ) {
-                               $this->dieUsageMsg( 'copyuploadbaddomain' );
+                               $this->dieWithError( 'apierror-copyuploadbaddomain' );
                        }
 
                        if ( !UploadFromUrl::isAllowedUrl( $this->mParams['url'] ) ) {
-                               $this->dieUsageMsg( 'copyuploadbadurl' );
+                               $this->dieWithError( 'apierror-copyuploadbadurl' );
                        }
 
                        $this->mUpload = new UploadFromUrl;
@@ -545,10 +539,10 @@ class ApiUpload extends ApiBase {
 
                if ( $permission !== true ) {
                        if ( !$user->isLoggedIn() ) {
-                               $this->dieUsageMsg( [ 'mustbeloggedin', 'upload' ] );
+                               $this->dieWithError( [ 'apierror-mustbeloggedin', $this->msg( 'action-upload' ) ] );
                        }
 
-                       $this->dieUsageMsg( 'badaccess-groups' );
+                       $this->dieStatus( User::newFatalPermissionDeniedStatus( $permission ) );
                }
 
                // Check blocks
@@ -579,32 +573,34 @@ class ApiUpload extends ApiBase {
         * @param array $verification
         */
        protected function checkVerification( array $verification ) {
-               // @todo Move them to ApiBase's message map
                switch ( $verification['status'] ) {
                        // Recoverable errors
                        case UploadBase::MIN_LENGTH_PARTNAME:
-                               $this->dieRecoverableError( 'filename-tooshort', 'filename' );
+                               $this->dieRecoverableError( [ 'filename-tooshort' ], 'filename' );
                                break;
                        case UploadBase::ILLEGAL_FILENAME:
-                               $this->dieRecoverableError( 'illegal-filename', 'filename',
-                                       [ 'filename' => $verification['filtered'] ] );
+                               $this->dieRecoverableError(
+                                       [ ApiMessage::create(
+                                               'illegal-filename', null, [ 'filename' => $verification['filtered'] ]
+                                       ) ], 'filename'
+                               );
                                break;
                        case UploadBase::FILENAME_TOO_LONG:
-                               $this->dieRecoverableError( 'filename-toolong', 'filename' );
+                               $this->dieRecoverableError( [ 'filename-toolong' ], 'filename' );
                                break;
                        case UploadBase::FILETYPE_MISSING:
-                               $this->dieRecoverableError( 'filetype-missing', 'filename' );
+                               $this->dieRecoverableError( [ 'filetype-missing' ], 'filename' );
                                break;
                        case UploadBase::WINDOWS_NONASCII_FILENAME:
-                               $this->dieRecoverableError( 'windows-nonascii-filename', 'filename' );
+                               $this->dieRecoverableError( [ 'windows-nonascii-filename' ], 'filename' );
                                break;
 
                        // Unrecoverable errors
                        case UploadBase::EMPTY_FILE:
-                               $this->dieUsage( 'The file you submitted was empty', 'empty-file' );
+                               $this->dieWithError( 'empty-file' );
                                break;
                        case UploadBase::FILE_TOO_LARGE:
-                               $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
+                               $this->dieWithError( 'file-too-large' );
                                break;
 
                        case UploadBase::FILETYPE_BADTYPE:
@@ -612,57 +608,48 @@ class ApiUpload extends ApiBase {
                                        'filetype' => $verification['finalExt'],
                                        'allowed' => array_values( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) )
                                ];
+                               $extensions = array_unique( $this->getConfig()->get( 'FileExtensions' ) );
+                               $msg = [
+                                       'filetype-banned-type',
+                                       null, // filled in below
+                                       Message::listParam( $extensions, 'comma' ),
+                                       count( $extensions ),
+                                       null, // filled in below
+                               ];
                                ApiResult::setIndexedTagName( $extradata['allowed'], 'ext' );
 
-                               $msg = 'Filetype not permitted: ';
                                if ( isset( $verification['blacklistedExt'] ) ) {
-                                       $msg .= implode( ', ', $verification['blacklistedExt'] );
+                                       $msg[1] = Message::listParam( $verification['blacklistedExt'], 'comma' );
+                                       $msg[4] = count( $verification['blacklistedExt'] );
                                        $extradata['blacklisted'] = array_values( $verification['blacklistedExt'] );
                                        ApiResult::setIndexedTagName( $extradata['blacklisted'], 'ext' );
                                } else {
-                                       $msg .= $verification['finalExt'];
+                                       $msg[1] = $verification['finalExt'];
+                                       $msg[4] = 1;
                                }
-                               $this->dieUsage( $msg, 'filetype-banned', 0, $extradata );
+
+                               $this->dieWithError( $msg, 'filetype-banned', $extradata );
                                break;
+
                        case UploadBase::VERIFICATION_ERROR:
-                               $parsed = $this->parseMsg( $verification['details'] );
-                               $info = "This file did not pass file verification: {$parsed['info']}";
-                               if ( $verification['details'][0] instanceof IApiMessage ) {
-                                       $code = $parsed['code'];
-                               } else {
-                                       // For backwards-compatibility, all of the errors from UploadBase::verifyFile() are
-                                       // reported as 'verification-error', and the real error code is reported in 'details'.
-                                       $code = 'verification-error';
-                               }
-                               if ( $verification['details'][0] instanceof IApiMessage ) {
-                                       $msg = $verification['details'][0];
+                               $msg = ApiMessage::create( $verification['details'], 'verification-error' );
+                               if ( $verification['details'][0] instanceof MessageSpecifier ) {
                                        $details = array_merge( [ $msg->getKey() ], $msg->getParams() );
                                } else {
                                        $details = $verification['details'];
                                }
                                ApiResult::setIndexedTagName( $details, 'detail' );
-                               $data = [ 'details' => $details ];
-                               if ( isset( $parsed['data'] ) ) {
-                                       $data = array_merge( $data, $parsed['data'] );
-                               }
-
-                               $this->dieUsage( $info, $code, 0, $data );
+                               $msg->setApiData( $msg->getApiData() + [ 'details' => $details ] );
+                               $this->dieWithError( $msg );
                                break;
+
                        case UploadBase::HOOK_ABORTED:
-                               if ( is_array( $verification['error'] ) ) {
-                                       $params = $verification['error'];
-                               } elseif ( $verification['error'] !== '' ) {
-                                       $params = [ $verification['error'] ];
-                               } else {
-                                       $params = [ 'hookaborted' ];
-                               }
-                               $key = array_shift( $params );
-                               $msg = $this->msg( $key, $params )->inLanguage( 'en' )->useDatabase( false )->text();
-                               $this->dieUsage( $msg, 'hookaborted', 0, [ 'details' => $verification['error'] ] );
+                               $msg = $verification['error'] === '' ? 'hookaborted' : $verification['error'];
+                               $this->dieWithError( $msg, 'hookaborted', [ 'details' => $verification['error'] ] );
                                break;
                        default:
-                               $this->dieUsage( 'An unknown error occurred', 'unknown-error',
-                                       0, [ 'details' => [ 'code' => $verification['status'] ] ] );
+                               $this->dieWithError( 'apierror-unknownerror-nocode', 'unknown-error',
+                                       [ 'details' => [ 'code' => $verification['status'] ] ] );
                                break;
                }
        }
@@ -735,42 +722,41 @@ class ApiUpload extends ApiBase {
 
        /**
         * Handles a stash exception, giving a useful error to the user.
-        * @param string $exceptionType Class name of the exception we encountered.
-        * @param string $message Message of the exception we encountered.
-        * @return array Array of message and code, suitable for passing to dieUsage()
+        * @todo Internationalize the exceptions then get rid of this
+        * @param Exception $e
+        * @return StatusValue
         */
-       protected function handleStashException( $exceptionType, $message ) {
-               switch ( $exceptionType ) {
+       protected function handleStashException( $e ) {
+               switch ( get_class( $e ) ) {
                        case 'UploadStashFileNotFoundException':
-                               return [
-                                       'Could not find the file in the stash: ' . $message,
-                                       'stashedfilenotfound'
-                               ];
+                               $wrap = 'apierror-stashedfilenotfound';
+                               break;
                        case 'UploadStashBadPathException':
-                               return [
-                                       'File key of improper format or otherwise invalid: ' . $message,
-                                       'stashpathinvalid'
-                               ];
+                               $wrap = 'apierror-stashpathinvalid';
+                               break;
                        case 'UploadStashFileException':
-                               return [
-                                       'Could not store upload in the stash: ' . $message,
-                                       'stashfilestorage'
-                               ];
+                               $wrap = 'apierror-stashfilestorage';
+                               break;
                        case 'UploadStashZeroLengthFileException':
-                               return [
-                                       'File is of zero length, and could not be stored in the stash: ' .
-                                               $message,
-                                       'stashzerolength'
-                               ];
+                               $wrap = 'apierror-stashzerolength';
+                               break;
                        case 'UploadStashNotLoggedInException':
-                               return [ 'Not logged in: ' . $message, 'stashnotloggedin' ];
+                               return StatusValue::newFatal( ApiMessage::create(
+                                       [ 'apierror-mustbeloggedin', $this->msg( 'action-upload' ) ], 'stashnotloggedin'
+                               ) );
                        case 'UploadStashWrongOwnerException':
-                               return [ 'Wrong owner: ' . $message, 'stashwrongowner' ];
+                               $wrap = 'apierror-stashwrongowner';
+                               break;
                        case 'UploadStashNoSuchKeyException':
-                               return [ 'No such filekey: ' . $message, 'stashnosuchfilekey' ];
+                               $wrap = 'apierror-stashnosuchfilekey';
+                               break;
                        default:
-                               return [ $exceptionType . ': ' . $message, 'stasherror' ];
+                               $wrap = [ 'uploadstash-exception', get_class( $e ) ];
+                               break;
                }
+               return StatusValue::newFatal(
+                       $this->getErrorFormatter()->getMessageFromException( $e, [ 'wrap' => $wrap ] )
+               );
        }
 
        /**
@@ -821,7 +807,7 @@ class ApiUpload extends ApiBase {
                if ( $this->mParams['async'] ) {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
                        if ( $progress && $progress['result'] === 'Poll' ) {
-                               $this->dieUsage( 'Upload from stash already in progress.', 'publishfailed' );
+                               $this->dieWithError( 'apierror-upload-inprogress', 'publishfailed' );
                        }
                        UploadBase::setSessionStatus(
                                $this->getUser(),
@@ -848,14 +834,7 @@ class ApiUpload extends ApiBase {
                                $this->mParams['text'], $watch, $this->getUser(), $this->mParams['tags'] );
 
                        if ( !$status->isGood() ) {
-                               // Is there really no better way to do this?
-                               $errors = $status->getErrorsByType( 'error' );
-                               $msg = array_merge( [ $errors[0]['message'] ], $errors[0]['params'] );
-                               $data = $status->getErrorsArray();
-                               ApiResult::setIndexedTagName( $data, 'error' );
-                               // For backwards-compatibility, we use the 'internal-error' fallback key and merge $data
-                               // into the root of the response (rather than something sane like [ 'details' => $data ]).
-                               $this->dieRecoverableError( $msg, null, $data, 'internal-error' );
+                               $this->dieRecoverableError( $status->getErrors() );
                        }
                        $result['result'] = 'Success';
                }
diff --git a/includes/api/ApiUsageException.php b/includes/api/ApiUsageException.php
new file mode 100644 (file)
index 0000000..9dc1f92
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @defgroup API API
+ */
+
+/**
+ * This exception will be thrown when dieUsage is called to stop module execution.
+ *
+ * @ingroup API
+ * @deprecated since 1.29, use ApiUsageException instead
+ */
+class UsageException extends MWException {
+
+       private $mCodestr;
+
+       /**
+        * @var null|array
+        */
+       private $mExtraData;
+
+       /**
+        * @param string $message
+        * @param string $codestr
+        * @param int $code
+        * @param array|null $extradata
+        */
+       public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
+               parent::__construct( $message, $code );
+               $this->mCodestr = $codestr;
+               $this->mExtraData = $extradata;
+
+               // This should never happen, so throw an exception about it that will
+               // hopefully get logged with a backtrace (T138585)
+               if ( !is_string( $codestr ) || $codestr === '' ) {
+                       throw new InvalidArgumentException( 'Invalid $codestr, was ' .
+                               ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
+                       );
+               }
+       }
+
+       /**
+        * @return string
+        */
+       public function getCodeString() {
+               return $this->mCodestr;
+       }
+
+       /**
+        * @return array
+        */
+       public function getMessageArray() {
+               $result = [
+                       'code' => $this->mCodestr,
+                       'info' => $this->getMessage()
+               ];
+               if ( is_array( $this->mExtraData ) ) {
+                       $result = array_merge( $result, $this->mExtraData );
+               }
+
+               return $result;
+       }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               return "{$this->getCodeString()}: {$this->getMessage()}";
+       }
+}
+
+/**
+ * Exception used to abort API execution with an error
+ *
+ * If possible, use ApiBase::dieWithError() instead of throwing this directly.
+ *
+ * @ingroup API
+ * @note This currently extends UsageException for backwards compatibility, so
+ *  all the existing code that catches UsageException won't break when stuff
+ *  starts throwing ApiUsageException. Eventually UsageException will go away
+ *  and this will (probably) extend MWException directly.
+ */
+class ApiUsageException extends UsageException implements ILocalizedException {
+
+       protected $modulePath;
+       protected $status;
+
+       /**
+        * @param ApiBase|null $module API module responsible for the error, if known
+        * @param StatusValue $status Status holding errors
+        * @param int $httpCode HTTP error code to use
+        */
+       public function __construct(
+               ApiBase $module = null, StatusValue $status, $httpCode = 0
+       ) {
+               if ( $status->isOK() ) {
+                       throw new InvalidArgumentException( __METHOD__ . ' requires a fatal Status' );
+               }
+
+               $this->modulePath = $module ? $module->getModulePath() : null;
+               $this->status = $status;
+
+               // Bug T46111: Messages in the log files should be in English and not
+               // customized by the local wiki.
+               $enMsg = clone $this->getApiMessage();
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+               parent::__construct(
+                       ApiErrorFormatter::stripMarkup( $enMsg->text() ),
+                       $enMsg->getApiCode(),
+                       $httpCode,
+                       $enMsg->getApiData()
+               );
+       }
+
+       /**
+        * @param ApiBase|null $module API module responsible for the error, if known
+        * @param string|array|Message $msg See ApiMessage::create()
+        * @param string|null $code See ApiMessage::create()
+        * @param array|null $data See ApiMessage::create()
+        * @param int $httpCode HTTP error code to use
+        * @return static
+        */
+       public static function newWithMessage(
+               ApiBase $module = null, $msg, $code = null, $data = null, $httpCode = 0
+       ) {
+               return new static(
+                       $module,
+                       StatusValue::newFatal( ApiMessage::create( $msg, $code, $data ) ),
+                       $httpCode
+               );
+       }
+
+       /**
+        * @returns ApiMessage
+        */
+       private function getApiMessage() {
+               $errors = $this->status->getErrorsByType( 'error' );
+               if ( !$errors ) {
+                       $errors = $this->status->getErrors();
+               }
+               if ( !$errors ) {
+                       $msg = new ApiMessage( 'apierror-unknownerror-nocode', 'unknownerror' );
+               } else {
+                       $msg = ApiMessage::create( $errors[0] );
+               }
+               return $msg;
+       }
+
+       /**
+        * Fetch the responsible module name
+        * @return string|null
+        */
+       public function getModulePath() {
+               return $this->modulePath;
+       }
+
+       /**
+        * Fetch the error status
+        * @return StatusValue
+        */
+       public function getStatusValue() {
+               return $this->status;
+       }
+
+       /**
+        * @deprecated Do not use. This only exists here because UsageException is in
+        *  the inheritance chain for backwards compatibility.
+        * @inheritdoc
+        */
+       public function getCodeString() {
+               return $this->getApiMessage()->getApiCode();
+       }
+
+       /**
+        * @deprecated Do not use. This only exists here because UsageException is in
+        *  the inheritance chain for backwards compatibility.
+        * @inheritdoc
+        */
+       public function getMessageArray() {
+               $enMsg = clone $this->getApiMessage();
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+
+               return [
+                       'code' => $enMsg->getApiCode(),
+                       'info' => ApiErrorFormatter::stripMarkup( $enMsg->text() ),
+               ] + $enMsg->getApiData();
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function getMessageObject() {
+               return $this->status->getMessage();
+       }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               $enMsg = clone $this->getApiMessage();
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+               $text = ApiErrorFormatter::stripMarkup( $enMsg->text() );
+
+               return get_class( $this ) . ": {$enMsg->getApiCode()}: {$text} "
+                       . "in {$this->getFile()}:{$this->getLine()}\n"
+                       . "Stack trace:\n{$this->getTraceAsString()}";
+       }
+
+}
index 79c6866..262f072 100644 (file)
@@ -1,9 +1,7 @@
 <?php
 
 /**
- *
- *
- * Created on Mar 24, 2009
+ * API userrights module
  *
  * Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
@@ -59,15 +57,60 @@ class ApiUserrights extends ApiBase {
 
                $params = $this->extractRequestParams();
 
+               // Figure out expiry times from the input
+               // @todo Remove this isset check when removing $wgDisableUserGroupExpiry
+               if ( isset( $params['expiry'] ) ) {
+                       $expiry = (array)$params['expiry'];
+               } else {
+                       $expiry = [ 'infinity' ];
+               }
+               if ( count( $expiry ) !== count( $params['add'] ) ) {
+                       if ( count( $expiry ) === 1 ) {
+                               $expiry = array_fill( 0, count( $params['add'] ), $expiry[0] );
+                       } else {
+                               $this->dieWithError( [
+                                       'apierror-toofewexpiries',
+                                       count( $expiry ),
+                                       count( $params['add'] )
+                               ] );
+                       }
+               }
+
+               // Validate the expiries
+               $groupExpiries = [];
+               foreach ( $expiry as $index => $expiryValue ) {
+                       $group = $params['add'][$index];
+                       $groupExpiries[$group] = UserrightsPage::expiryToTimestamp( $expiryValue );
+
+                       if ( $groupExpiries[$group] === false ) {
+                               $this->dieWithError( [ 'apierror-invalidexpiry', wfEscapeWikiText( $expiryValue ) ] );
+                       }
+
+                       // not allowed to have things expiring in the past
+                       if ( $groupExpiries[$group] && $groupExpiries[$group] < wfTimestampNow() ) {
+                               $this->dieWithError( [ 'apierror-pastexpiry', wfEscapeWikiText( $expiryValue ) ] );
+                       }
+               }
+
                $user = $this->getUrUser( $params );
 
+               $tags = $params['tags'];
+
+               // Check if user can add tags
+               if ( !is_null( $tags ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $tags, $pUser );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
                $r['user'] = $user->getName();
                $r['userid'] = $user->getId();
                list( $r['added'], $r['removed'] ) = $form->doSaveUserGroups(
-                       $user, (array)$params['add'],
-                       (array)$params['remove'], $params['reason']
+                       $user, (array)$params['add'], (array)$params['remove'],
+                       $params['reason'], $tags, $groupExpiries
                );
 
                $result = $this->getResult();
@@ -110,7 +153,7 @@ class ApiUserrights extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return [
+               $a = [
                        'user' => [
                                ApiBase::PARAM_TYPE => 'user',
                        ],
@@ -121,6 +164,11 @@ class ApiUserrights extends ApiBase {
                                ApiBase::PARAM_TYPE => $this->getAllGroups(),
                                ApiBase::PARAM_ISMULTI => true
                        ],
+                       'expiry' => [
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_ALLOW_DUPLICATES => true,
+                               ApiBase::PARAM_DFLT => 'infinite',
+                       ],
                        'remove' => [
                                ApiBase::PARAM_TYPE => $this->getAllGroups(),
                                ApiBase::PARAM_ISMULTI => true
@@ -132,7 +180,15 @@ class ApiUserrights extends ApiBase {
                                // Standard definition automatically inserted
                                ApiBase::PARAM_HELP_MSG_APPEND => [ 'api-help-param-token-webui' ],
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true
+                       ],
                ];
+               if ( !$this->getUserRightsPage()->canProcessExpiries() ) {
+                       unset( $a['expiry'] );
+               }
+               return $a;
        }
 
        public function needsToken() {
@@ -144,12 +200,17 @@ class ApiUserrights extends ApiBase {
        }
 
        protected function getExamplesMessages() {
-               return [
+               $a = [
                        'action=userrights&user=FooBot&add=bot&remove=sysop|bureaucrat&token=123ABC'
                                => 'apihelp-userrights-example-user',
                        'action=userrights&userid=123&add=bot&remove=sysop|bureaucrat&token=123ABC'
                                => 'apihelp-userrights-example-userid',
                ];
+               if ( $this->getUserRightsPage()->canProcessExpiries() ) {
+                       $a['action=userrights&user=SometimeSysop&add=sysop&expiry=1%20month&token=123ABC']
+                               = 'apihelp-userrights-example-expiry';
+               }
+               return $a;
        }
 
        public function getHelpUrls() {
diff --git a/includes/api/ApiValidatePassword.php b/includes/api/ApiValidatePassword.php
new file mode 100644 (file)
index 0000000..6968523
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+use MediaWiki\Auth\AuthManager;
+
+/**
+ * @ingroup API
+ */
+class ApiValidatePassword extends ApiBase {
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               // For sanity
+               $this->requirePostedParameters( [ 'password' ] );
+
+               if ( $params['user'] !== null ) {
+                       $user = User::newFromName( $params['user'], 'creatable' );
+                       if ( !$user ) {
+                               $encParamName = $this->encodeParamName( 'user' );
+                               $this->dieWithError(
+                                       [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $params['user'] ) ],
+                                       "baduser_{$encParamName}"
+                               );
+                       }
+
+                       if ( !$user->isAnon() || AuthManager::singleton()->userExists( $user->getName() ) ) {
+                               $this->dieWithError( 'userexists' );
+                       }
+
+                       $user->setEmail( (string)$params['email'] );
+                       $user->setRealName( (string)$params['realname'] );
+               } else {
+                       $user = $this->getUser();
+               }
+
+               $validity = $user->checkPasswordValidity( $params['password'] );
+               $r['validity'] = $validity->isGood() ? 'Good' : ( $validity->isOK() ? 'Change' : 'Invalid' );
+               $messages = array_merge(
+                       $this->getErrorFormatter()->arrayFromStatus( $validity, 'error' ),
+                       $this->getErrorFormatter()->arrayFromStatus( $validity, 'warning' )
+               );
+               if ( $messages ) {
+                       $r['validitymessages'] = $messages;
+               }
+
+               Hooks::run( 'ApiValidatePassword', [ $this, &$r ] );
+
+               $this->getResult()->addValue( null, $this->getModuleName(), $r );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'password' => [
+                               ApiBase::PARAM_TYPE => 'password',
+                               ApiBase::PARAM_REQUIRED => true
+                       ],
+                       'user' => [
+                               ApiBase::PARAM_TYPE => 'user',
+                       ],
+                       'email' => null,
+                       'realname' => null,
+               ];
+       }
+
+       protected function getExamplesMessages() {
+               return [
+                       'action=validatepassword&password=foobar'
+                               => 'apihelp-validatepassword-example-1',
+                       'action=validatepassword&password=querty&user=Example'
+                               => 'apihelp-validatepassword-example-2',
+               ];
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Validatepassword';
+       }
+}
index 3a7a082..37d319f 100644 (file)
@@ -35,12 +35,10 @@ class ApiWatch extends ApiBase {
        public function execute() {
                $user = $this->getUser();
                if ( !$user->isLoggedIn() ) {
-                       $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
+                       $this->dieWithError( 'watchlistanontext', 'notloggedin' );
                }
 
-               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
-                       $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
-               }
+               $this->checkUserRightsAny( 'editmywatchlist' );
 
                $params = $this->extractRequestParams();
 
@@ -62,7 +60,7 @@ class ApiWatch extends ApiBase {
 
                        foreach ( $pageSet->getMissingTitles() as $title ) {
                                $r = $this->watchTitle( $title, $user, $params );
-                               $r['missing'] = 1;
+                               $r['missing'] = true;
                                $res[] = $r;
                        }
 
@@ -78,16 +76,19 @@ class ApiWatch extends ApiBase {
                        } ) );
 
                        if ( $extraParams ) {
-                               $p = $this->getModulePrefix();
-                               $this->dieUsage(
-                                       "The parameter {$p}title can not be used with " . implode( ', ', $extraParams ),
+                               $this->dieWithError(
+                                       [
+                                               'apierror-invalidparammix-cannotusewith',
+                                               $this->encodeParamName( 'title' ),
+                                               $pageSet->encodeParamName( $extraParams[0] )
+                                       ],
                                        'invalidparammix'
                                );
                        }
 
                        $title = Title::newFromText( $params['title'] );
                        if ( !$title || !$title->isWatchable() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'invalidtitle', $params['title'] ] );
                        }
                        $res = $this->watchTitle( $title, $user, $params, true );
                }
@@ -109,26 +110,20 @@ class ApiWatch extends ApiBase {
                if ( $params['unwatch'] ) {
                        $status = UnwatchAction::doUnwatch( $title, $user );
                        $res['unwatched'] = $status->isOK();
-                       if ( $status->isOK() ) {
-                               $msgKey = $title->isTalkPage() ? 'removedwatchtext-talk' : 'removedwatchtext';
-                               $res['message'] = $this->msg( $msgKey, $title->getPrefixedText() )
-                                       ->title( $title )->parseAsBlock();
-                       }
                } else {
                        $status = WatchAction::doWatch( $title, $user );
                        $res['watched'] = $status->isOK();
-                       if ( $status->isOK() ) {
-                               $msgKey = $title->isTalkPage() ? 'addedwatchtext-talk' : 'addedwatchtext';
-                               $res['message'] = $this->msg( $msgKey, $title->getPrefixedText() )
-                                       ->title( $title )->parseAsBlock();
-                       }
                }
 
                if ( !$status->isOK() ) {
                        if ( $compatibilityMode ) {
                                $this->dieStatus( $status );
                        }
-                       $res['error'] = $this->getErrorFromStatus( $status );
+                       $res['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'error' );
+                       $res['warnings'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'warning' );
+                       if ( !$res['warnings'] ) {
+                               unset( $res['warnings'] );
+                       }
                }
 
                return $res;
index 5072c66..1222195 100644 (file)
                        "Fatz",
                        "Hiba Alshawi",
                        "Maroen1990",
-                       "محمد أحمد عبد الفتاح"
+                       "محمد أحمد عبد الفتاح",
+                       "ديفيد",
+                       "ASHmed"
                ]
        },
        "apihelp-main-param-action": "أي فعل للعمل.",
        "apihelp-main-param-format": "صيغة الخرج.",
+       "apihelp-main-param-assertuser": "التحقق من أن المستخدم الحالي هو المستخدم المسمى.",
+       "apihelp-main-param-requestid": "سيتم إدراج أي قيمة معينة هنا في الاستجابة. يمكن أن تُستخدَم لتمييز الطلبات.",
+       "apihelp-main-param-servedby": "تتضمن اسم المضيف الذي الخدم طلب في النتائج.",
+       "apihelp-main-param-curtimestamp": "تشمل الطابع الزمني الحالي في النتيجة.",
+       "apihelp-main-param-responselanginfo": "تشمل اللغات المستخدمة لأجل <var>uselang</var> and <var>errorlang</var> في النتيجة.",
+       "apihelp-main-param-errorsuselocal": "إذا ما أعطيت، النصوص الخطأ ستستخدم الرسائل المخصصة محليا من نطاق {{ns:MediaWiki}}.",
        "apihelp-block-description": "منع مستخدم.",
+       "apihelp-block-param-user": "اسم المستخدم، أو عنوان IP أو نطاق عنوان IP لمنعه. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1userid</var>",
+       "apihelp-block-param-userid": "معرف المستخدم لمنعه، لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1user</var>",
        "apihelp-block-param-reason": "السبب للمنع.",
+       "apihelp-block-param-anononly": "منع المستخدمين المجهولين فقط (أي تعطيل تعديلات المجهولين من  عنوان IP هذا).",
        "apihelp-block-param-nocreate": "امنع إنشاء الحسابات.",
+       "apihelp-block-param-autoblock": "منع آخر عنوان IP مستخدم تلقائيا، وأية عناوين IP لاحقة حاولت الدخول من خلاله.",
+       "apihelp-block-param-noemail": "منع المستخدم من إرسال البريد الإلكتروني من خلال الويكي. (يتطلب صلاحية <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "إخفاء اسم المستخدم من سجل المنع. (يتطلب صلاحية <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "تسمح للمستخدم لتحرير صفحة النقاش الخاصة (يعتمد على <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-watchuser": "مشاهدة صفحة المستخدم ونقاش IP.",
+       "apihelp-block-example-ip-simple": "منع عنوان IP <kbd>192.0.2.5</kbd> لمدة ثلاثة أيام بسبب >المخالفة الأولى</kbd>.",
+       "apihelp-block-example-user-complex": "منع المستخدم <kbd>المخرب</kbd> لأجل غير مسمى بسبب <kbd>التخريب</kbd>، ومنع إنشاء حساب جديد وإرسال بريد إلكتروني.",
+       "apihelp-changeauthenticationdata-description": "تغيير بيانات المصادقة للمستخدم الحالي.",
+       "apihelp-changeauthenticationdata-example-password": "محاولة تغيير كلمة المرور للمستخدم الحالي إلى <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "تحقق من صحة رمز من <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "نوع من الرموز يجري اختبارها.",
        "apihelp-checktoken-param-token": "اختبار الرموز.",
        "apihelp-checktoken-param-maxtokenage": "أقصى عمر للرمز يسمح، في ثوان.",
+       "apihelp-checktoken-example-simple": "اختبار صلاحية رمز <kbd>csrf</kbd>.",
+       "apihelp-clearhasmsg-description": "مسح <code>hasmsg</code> العلم للمستخدم الحالي.",
+       "apihelp-clearhasmsg-example-1": "مسح <code>hasmsg</code> العلم للمستخدم الحالي.",
+       "apihelp-clientlogin-description": "تسجيل الدخول إلى ويكي باستخدام التدفق التفاعلي.",
+       "apihelp-clientlogin-example-login": "بدء عملية تسجيل الدخول إلى الويكي كمستخدم <kbd>Example</kbd> بكلمة المرور <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "واصلة تسجيل الدخول بعد استجابة <samp>UI</samp> لعاملي الصادقة، إمداد <var>OATHToken</var> ل<kbd>987654</kbd>.",
+       "apihelp-compare-description": "الحصول على الفرق بين صفحتين. يجب تمرير عنوان الصفحة أو رقم المراجعة أو معرف الصفحة لكل من \"من\" و\"إلى\".",
        "apihelp-compare-param-fromtitle": "العنوان الأول للمقارنة.",
        "apihelp-compare-param-fromid": "رقم الصفحة الأول للمقارنة.",
        "apihelp-compare-param-fromrev": "أول مراجعة للمقارنة.",
        "apihelp-compare-param-totitle": "العنوان الثاني للمقارنة.",
        "apihelp-compare-param-toid": "رقم الصفحة الثاني للمقارنة.",
        "apihelp-compare-param-torev": "المراجعة الثانية للمقارنة.",
+       "apihelp-compare-example-1": "إنشاء فرق بين المراجعة 1 و2.",
        "apihelp-createaccount-description": "انشاء حساب مستخدم جديد",
+       "apihelp-createaccount-example-create": "بدء عملية إنشاء المستخدم <kbd>Example</kbd> بكلمة المرور <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "اسم المستخدم.",
+       "apihelp-createaccount-param-domain": "مجال للمصادقة الخارجية (اختياري).",
+       "apihelp-createaccount-param-token": "حصلت على رمز إنشاء حساب في الطلب الأول.",
        "apihelp-createaccount-param-email": "عنوان البريد الإلكتروني للمستخدم (اختياري).",
        "apihelp-createaccount-param-realname": "الاسم الحقيقي للمستخدم (اختياري).",
        "apihelp-createaccount-param-mailpassword": "اذا تم تعيين اي قيمة, سيتم ارسال كلمة سر عشوائية للمستخدم عن طريق الاميل.",
+       "apihelp-createaccount-param-reason": "السبب اختياري لإنشاء الحساب لوضعه في السجلات.",
+       "apihelp-createaccount-param-language": "رمز اللغة لتعيينه كافتراضي للمستخدم (اختياري، لغة المحتوى الافتراضية).",
+       "apihelp-createaccount-example-pass": "إنشاء المستخدم <kbd>testuser</kbd> بكلمة المرور <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "إنشاء مستخدم <kbd>testmailuser</kbd> وأرسل كلمة المرور بالبريد الإلكتروني بشكل عشوائي.",
+       "apihelp-cspreport-description": "مستخدمة من قبل المتصفحات للإبلاغ عن انتهاكات سياسة أمن المحتوى. لا ينبغي أبدا أن تستخدم هذه الوحدة، إلا عند استخدامها تلقائيا باستخدام متصفح ويب CSP متوافق.",
+       "apihelp-cspreport-param-reportonly": "علم على أنه تقرير عن سياسة الرصد، وليس فرض سياسة",
        "apihelp-delete-description": "حذف صفحة.",
+       "apihelp-delete-param-title": "عنوان الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-delete-param-pageid": "معرف الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-delete-param-reason": "سبب الحذف. إذا لم يُحدَّد، سوف تُستخدَم أحد الأسباب التي تنشأ تلقائيا.",
+       "apihelp-delete-param-tags": "تغيير وسوم لتطبيق الإدخال في سجل الحذف.",
        "apihelp-delete-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
        "apihelp-delete-param-unwatch": "إزالة الصفحة من قائمة المراقبة للمستخدم الحالي.",
+       "apihelp-delete-param-oldimage": "اسم الصورة القديمة لحذفها كما هو منصوص عليه [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "حذف <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "حذف <kbd>Main Page</kbd> بسبب <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "هذا الاصدار تم تعطيله.",
        "apihelp-edit-description": "إنشاء وتعديل الصفحات.",
+       "apihelp-edit-param-title": "عنوان الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-edit-param-pageid": "معرف الصفحة لتحريرها. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-edit-param-section": "رقم القسم. <kbd>0</kbd> للقسم العلوي، <kbd>new</kbd> لقسم جديد.",
        "apihelp-edit-param-sectiontitle": "عنوان لقسم جديد.",
        "apihelp-edit-param-text": "محتوى الصفحة",
+       "apihelp-edit-param-summary": "ملخص التعديل. أيضا عنوان القسم عند عدم تعيين $1section=new and $1sectiontitle.",
+       "apihelp-edit-param-tags": "عدل الوسوم لتطبيق المراجعة.",
+       "apihelp-edit-param-minor": "تعديل طفيف",
        "apihelp-edit-param-notminor": "تعديل غير طفيف.",
-       "apihelp-edit-param-bot": "علم على هذا التعديل كبوت.",
+       "apihelp-edit-param-bot": "علم على هذا التعديل كتعديل بوت.",
+       "apihelp-edit-param-basetimestamp": "الطابع الزمني للمراجعة الأساسية، ويُستخدَم للكشف عن الحروب التحريرية، ويمكن الحصول عليها من خلال [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "الطابع الزمني عند بدء عملية التحرير، ويُستخدَم للكشف عن الحروب التحريرية، ويمكن الحصول عليها من خلال <var>[[Special:ApiHelp/main|curtimestamp]]</var> when beginning the edit process (e.g. when loading the page content to edit).",
+       "apihelp-edit-param-recreate": "تجاوز أية أخطاء حول الصفحة التي تم حذفها في هذه الأثناء.",
        "apihelp-edit-param-createonly": "لا تحرر الصفحة إذا كان موجودا بالفعل.",
+       "apihelp-edit-param-nocreate": "يحدث خطأ إذا كانت الصفحة غير موجودة.",
        "apihelp-edit-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
        "apihelp-edit-param-unwatch": "إزالة الصفحة من قائمة المراقبة للمستخدم الحالي.",
+       "apihelp-edit-param-prependtext": "إضافة هذا النص إلى بداية الصفحة. تجاوز $1text.",
+       "apihelp-edit-param-appendtext": "إضافة هذا النص إلى بداية الصفحة. تجاوز $1text.\n\nاستخدم $1section=جديد لحاق القسم الجديد، بدلا من هذا الوسيط.",
+       "apihelp-edit-param-undo": "التراجع عن هذه المراجعة. تجاوز $1text, $1prependtext و$1appendtext.",
+       "apihelp-edit-param-undoafter": "التراجع عن جميع المراجعات من $1undo لهذه. إذا لم يتم التغيير، تراجع عن تعديل واحد فقط.",
+       "apihelp-edit-param-redirect": "حل التحويلات تلقائيا.",
+       "apihelp-edit-param-contentmodel": "نموذج المحتوى للمحتوى الجديد.",
+       "apihelp-edit-param-token": "ينبغي دائما أن يُرسَل الرمز كوسيط أخير، أو على الأقل بعد الوسيط $1text.",
        "apihelp-edit-example-edit": "عدل صفحة.",
+       "apihelp-edit-example-prepend": "إضافة البادئة <kbd>_&#95;NOTOC_&#95;</kbd> إلى الصفحة.",
+       "apihelp-edit-example-undo": "التراجع عن التعديلات 13579 خلال 13585 بملخص تلقائي.",
        "apihelp-emailuser-description": "مراسلة المستخدم",
+       "apihelp-emailuser-param-target": "مستخدم لإرسال بريد إلكتروني له.",
+       "apihelp-emailuser-param-subject": "رأس الموضوع",
+       "apihelp-emailuser-param-text": "جسم البريد الإلكتروني",
+       "apihelp-emailuser-param-ccme": "إرسال نسخة من هذه الرسالة لي.",
+       "apihelp-emailuser-example-email": "أرسل بريدا إلكترونيا للمستخدم <kbd>WikiSysop</kbd> بالنص  <kbd>Content</kbd>.",
+       "apihelp-expandtemplates-description": "يوسع كافة القوالب ضمن نصوص الويكي.",
        "apihelp-expandtemplates-param-title": "عنوان الصفحة.",
+       "apihelp-expandtemplates-param-text": "نص ويكي للتحويل.",
+       "apihelp-expandtemplates-param-revid": "معرف المراجعة، ل<nowiki>{{REVISIONID}}</nowiki> والمتغيرات مماثلة.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "نص الويكي الموسع",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "خصائص الصفحة التي تحددها الكلمات السحرية الموسعة في نص الويكي.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "إذا كان الإخراج سريع التأثر، ينبغي عدم استخدامه في أي مكان آخر داخل الصفحة.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة كسلسلة JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "شجرة تحليل XML للمدخلات.",
+       "apihelp-expandtemplates-param-includecomments": "إدراج أو عدم إدراج تعليقات HTML في الإخراج.",
+       "apihelp-expandtemplates-param-generatexml": "ولد شجرة تحليل XML (حل محلها $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "توسيع نص الويكي <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
+       "apihelp-feedcontributions-description": "إرجاع تغذية مساهمات المستخدم.",
+       "apihelp-feedcontributions-param-feedformat": "هيئة التلقيم.",
+       "apihelp-feedcontributions-param-user": "أي المستخدمين سيتم الحصول على تبرعات لهم.",
+       "apihelp-feedcontributions-param-namespace": "أي نطاق ستتم تصفية المساهمات حسبه.",
+       "apihelp-feedcontributions-param-year": "من سنة (وأقدم).",
+       "apihelp-feedcontributions-param-month": "من شهر (وأقدم).",
+       "apihelp-feedcontributions-param-tagfilter": "تصفية المساهمات التي بها هذه الوسوم.",
+       "apihelp-feedcontributions-param-deletedonly": "اعرض المساهمات المحذوفة فقط.",
+       "apihelp-feedcontributions-param-toponly": "تظهر فقط التعديلات التي هي أحدث المراجعات.",
+       "apihelp-feedcontributions-param-newonly": "أظهر إنشاء الصفحات فقط",
+       "apihelp-feedcontributions-param-hideminor": "إخفاء التعديلات الطفيفة.",
+       "apihelp-feedcontributions-param-showsizediff": "عرض حجم الفرق بين النسخ.",
+       "apihelp-feedrecentchanges-param-feedformat": "هيئة التلقيم.",
+       "apihelp-feedrecentchanges-param-namespace": "نطاق لتقييد النتائج.",
+       "apihelp-feedrecentchanges-param-invert": "جميع النطاقات عدا المختار.",
+       "apihelp-feedrecentchanges-param-associated": "تشمل النطاق المرتبط (نقاش أو الرئيسي).",
+       "apihelp-feedrecentchanges-param-days": "أيام لتقييد النتائج.",
+       "apihelp-feedrecentchanges-param-limit": "الحد الأقصى للنتائج المُرجعة",
+       "apihelp-feedrecentchanges-param-from": "أظهر التغييرات منذ",
+       "apihelp-feedrecentchanges-param-hideminor": "إخفاء التعديلات الطفيفة.",
+       "apihelp-feedrecentchanges-param-hidebots": "إخفاء التغييرات التي أجرتها بوتات.",
+       "apihelp-feedrecentchanges-param-hideanons": "إخفاء التغييرات التي أجراها مستخدمون مجهولون.",
+       "apihelp-feedrecentchanges-param-hideliu": "إخفاء التغييرات التي أجراها مستخدمون مسجلون.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "إخفاء التغييرات المراجعة.",
+       "apihelp-feedrecentchanges-param-hidemyself": "إخفاء التغييرات التي قام بها المستخدم الحالي.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "إخفاء تغيير عضوية التصنيف.",
        "apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.",
+       "apihelp-feedrecentchanges-param-target": "أحدث التغييرات في الصفحات الموصولة من هذه الصفحة فقط",
+       "apihelp-feedrecentchanges-param-showlinkedto": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+       "apihelp-feedrecentchanges-param-categories": "أظهر التغييرات في الصفحات في كل تصنيف من هذه التصنيفات فقط.",
+       "apihelp-feedrecentchanges-param-categories_any": "أظهر التغييرات في الصفحات في أي تصنيف بدلا من ذلك.",
        "apihelp-feedrecentchanges-example-simple": " اظهر التغييرات الحديثة",
        "apihelp-feedrecentchanges-example-30days": "أظهر التغييرات الأخيرة في 30 يوم.",
+       "apihelp-feedwatchlist-description": "إرجاع تغذية قائمة المراقبة.",
+       "apihelp-feedwatchlist-param-feedformat": "هيئة التلقيم.",
+       "apihelp-feedwatchlist-param-hours": "صفحات قائمة معدلة ضمن عدة ساعات من الآن.",
+       "apihelp-feedwatchlist-example-default": "عرض تغذية قائمة المراقبة.",
        "apihelp-feedwatchlist-example-all6hrs": "اظهر كل التغييرات في اخر 6 ساعات",
+       "apihelp-filerevert-description": "استرجع الملف لنسخة قديمة.",
+       "apihelp-filerevert-param-filename": "اسم الملف المستهدف، دون البادئة ملف:.",
        "apihelp-filerevert-param-comment": "تعليق الرفع.",
+       "apihelp-filerevert-example-revert": "استرجاع <kbd>Wiki.png</kbd> لنسحة <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "عرض مساعدة لوحدات محددة.",
+       "apihelp-help-param-modules": "وحدات لعرض مساعدة لها (قيم وسائط <var>action</var> و<var>format</var> أو<kbd>main</kbd>). يمكن تحديد الوحدات الفرعية ب <kbd>+</kbd>.",
+       "apihelp-help-param-submodules": "تشمل المساعدة للوحدات الفرعية من الوحدة المسماة.",
+       "apihelp-help-param-recursivesubmodules": "تشمل المساعدة للوحدات الفرعية بشكل متكرر.",
+       "apihelp-help-param-helpformat": "شكل مخرجات المساعدة.",
+       "apihelp-help-param-wrap": "التفاف المخرجات في بنية استجابة API القياسية.",
+       "apihelp-help-param-toc": "يتضمن جدول المحتويات في مخرجات HTML.",
+       "apihelp-help-example-main": "مساعدة للوحدة الرئيسية.",
+       "apihelp-help-example-submodules": "مساعدة ل<kbd>action=query</kbd> وجميع الوحدات الفرعية لها.",
        "apihelp-help-example-recursive": "كل المساعدة في صفحة واحدة.",
-       "apihelp-import-param-summary": "تعليق الاستيراد.",
+       "apihelp-help-example-help": "مساعدة لوحدة المساعدة نفسها.",
+       "apihelp-help-example-query": "مساعدة لوحدتي استعلام فرعيتين.",
+       "apihelp-imagerotate-description": "تدوير صورة واحدة أو أكثر.",
+       "apihelp-imagerotate-param-rotation": "درجة تدوير الصورة في اتجاه عقارب الساعة.",
+       "apihelp-imagerotate-example-simple": "تدوير <kbd>File:Example.png</kbd> بمقدار <kbd>90</kbd> درجة.",
+       "apihelp-imagerotate-example-generator": "تدوير جميع الصور في <kbd>Category:Flip</kbd> بمقدار <kbd>180</kbd> درجة.",
+       "apihelp-import-param-summary": "ملخص إدخال سجل الاستيراد.",
+       "apihelp-import-param-xml": "ملف XML مرفوع.",
+       "apihelp-import-param-interwikisource": "بالنسبة لواردات الإنترويكي: ويكي للاستيراد منه.",
+       "apihelp-import-param-interwikipage": "بالنسبة لواردات الإنترويكي: صفحة لاستيرادها.",
+       "apihelp-import-param-fullhistory": "بالنسبة لواردات الإنترويكي: استيراد التاريخ كاملا، وليست النسخة الحالية فقط.",
+       "apihelp-import-param-templates": "بالنسبة لواردات الإنترويكي: الإستيراد شمل كافة القوالب كذلك.",
+       "apihelp-import-param-namespace": "استيراد إلى هذا النطاق. لا يمكن أن يُستخدَم إلى جانب <var>$1rootpage</var>.",
+       "apihelp-import-param-rootpage": "استيراد كصفحة فرعية لهذه الصفحة. لا يمكن أن يُستخدَم إلى جانب <var>$1rootpage</var>.",
+       "apihelp-import-example-import": "استيراد [[meta:Help:ParserFunctions]] للنطاق 100 بالتاريخ الكامل.",
+       "apihelp-linkaccount-description": "ربط حساب من موفر طرف ثالث للمستخدم الحالي.",
+       "apihelp-linkaccount-example-link": "بدء عملية ربط حساب من <kbd>Example</kbd>.",
+       "apihelp-login-description": "سجل دخولك الآن واحصل على مصادقة الكوكيز، وينبغي استخدام هذا الإجراء فقط في تركيبة مع [[Special:BotPasswords|خاص:كلمات مرور البوت]]. تم إهمال استخدام لتسجيل الدخول للحساب الرئيسي وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "سجل دخولك الآن واحصل على مصادقة الكوكيز. هذا العمل مستنكر وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "اسم المستخدم.",
        "apihelp-login-param-password": "كلمة السر",
        "apihelp-login-param-domain": "النطاق (اختياري).",
+       "apihelp-login-param-token": "تم الحصول على رمز الدخول في الطلب الأول.",
+       "apihelp-login-example-gettoken": "استرداد رمز تسجيل الدخول.",
        "apihelp-login-example-login": "تسجيل الدخول",
+       "apihelp-logout-description": "تسجيل الخروج ومسح بيانات الجلسة.",
+       "apihelp-logout-example-logout": "تسجيل خروج المستخدم الحالي.",
+       "apihelp-managetags-description": "أداء المهام الإدارية المتعلقة بتغيير الوسوم.",
+       "apihelp-managetags-param-operation": "أي الإجراءات ستنفذ:\n؛ إنشاء: إنشاء وسم التغيير جديدة للاستخدام اليدوي.\n؛ حذف: إزالة وسم التغيير من قاعدة البيانات، بما في ذلك إزالة الوسم من كافة المراجعات، وإدخالات التغيير الأخيرة، وإدخالات السجل المستخدم.\n؛ تنشيط: تنشيط وسم التغيير، مما يسمح للمستخدمين بتطبيقه يدويا.\n; إلغاء: إلغاء تنشيط وسم التغيير، ومنع المستخدمين من تطبيقه يدويا.",
+       "apihelp-managetags-param-reason": "سبب اختياري لإنشاء، وحذف، وتفعيل أو تعطيل الوسم.",
+       "apihelp-managetags-param-ignorewarnings": "إذا كان سيتم تجاهل أي تحذيرات تصدر خلال العملية.",
+       "apihelp-managetags-example-create": "إنشاء وسم مسمى <kbd>spam</kbd> بسبب <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "حذف <kbd>vandlaism</kbd> وسم بسبب <kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "تنشيط الوسم المسمى <kbd>spam</kbd> بسبب <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "تعطيل الوسم المسمى <kbd>spam</kbd> بسبب <kbd>No longer required</kbd>",
        "apihelp-mergehistory-description": "ادمج تاريخ الصفحة.",
+       "apihelp-mergehistory-param-from": "عنوان الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "معرف الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "عنوان الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "معرف الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "الطابع الزمني للمراجعات التي سيتم نقلها من تاريخ صفحة المصدر إلى تاريخ صفحة الوجهة. إذا تم حذفها، سيتم دمج تاريخ الصفحة كاملا من صفحة المصدر إلى صفحة الوجهة.",
+       "apihelp-mergehistory-param-reason": "سبب دمج التاريخ.",
+       "apihelp-mergehistory-example-merge": "دمج تاريخ <kbd>Oldpage</kbd> كاملا إلى <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "دمج مراجعات الصفحة <kbd>Oldpage</kbd> dating up to <kbd>2015-12-31T04:37:41Z</kbd> إلى <kbd>Newpage</kbd>.",
        "apihelp-move-description": "نقل صفحة.",
+       "apihelp-move-param-from": "عنوان الصفحة للنقل. لا يمكن أن تُستخدَم بجانب <var>$1pageid</var",
+       "apihelp-move-param-fromid": "معرف الصفحة للنقل. لا يمكن أن تُستخدَم بجانب <var>$1pageid</var",
+       "apihelp-move-param-to": "عنوان لإعادة تسمية الصفحة له.",
        "apihelp-move-param-reason": "السبب لإعادة التسمية.",
+       "apihelp-move-param-movetalk": "إعادة تسمية صفحة النقاش، إن وُجِدت.",
+       "apihelp-move-param-movesubpages": "إعادة تسمية الصفحات الفرعية، إن وُجِدت.",
+       "apihelp-move-param-noredirect": "لا تنشئ تحويلة.",
+       "apihelp-move-param-watch": "إضافة الصفحة والتحويلة إلى قائمة مراقبة المستخدم الحالي.",
+       "apihelp-move-param-unwatch": "إزالة الصفحة والتحويلة إلى قائمة مراقبة المستخدم الحالي.",
        "apihelp-move-param-ignorewarnings": "تجاهل أي تحذيرات.",
+       "apihelp-move-example-move": "انقل <kbd>Badtitle</kbd> إلى <kbd>Goodtitle</kbd> دون ترك تحويلة.",
+       "apihelp-opensearch-description": "بحث الويكي باستخدام بروتوكول أوبن سيرش OpenSearch.",
        "apihelp-opensearch-param-search": "سطر البحث",
        "apihelp-opensearch-param-limit": "الحد الأقصى للنتائج المُرجعة",
        "apihelp-opensearch-param-namespace": "النطاقات للبحث.",
+       "apihelp-opensearch-param-suggest": "لا تفعل شيئا إذا كان <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> خاطئا.",
+       "apihelp-opensearch-param-format": "شكل الإخراج.",
+       "apihelp-opensearch-param-warningsaserror": "إذا تم رفع التحذيرات ب<kbd>format=json</kbd>, أعد أخطاء API بدلا من تجاهلها.",
+       "apihelp-opensearch-example-te": "العثور على صفحات تبدأ ب<kbd>Te</kbd>.",
+       "apihelp-options-param-reset": "إعادة تعيين التفضيلات إلى إعدادات الموقع الإفتراضية.",
+       "apihelp-options-param-resetkinds": "قائمة أنواع الخيارات لإعادة ضبطها عندما يتم تعيين خيار <var>$1reset</var>.",
+       "apihelp-options-param-optionname": "اسم الخيار الذي ينبغي ضبطه إلى القيمة التي قدمها <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionvalue": "قيمة للخيار المحدد من قبل <var>$1optionname</var>.",
+       "apihelp-options-example-reset": "إعادة تعيين كل التفضيلات.",
+       "apihelp-options-example-change": "غير تفضيلات <kbd>skin</kbd> و<kbd>hideminor</kbd>.",
+       "apihelp-options-example-complex": "إعادة تعيين جميع تفضيلات، ثم تعيين <kbd>skin</kbd> و<kbd>nickname</kbd>.",
+       "apihelp-paraminfo-description": "الحصول على معلومات حول وحدات API.",
+       "apihelp-paraminfo-param-helpformat": "شكل سلاسل المساعدة.",
+       "apihelp-paraminfo-param-mainmodule": "الحصول على معلومات عن وحدة (المستوى الأعلى) الرئيسية أيضا. استخدم <kbd>$1modules=main</kbd> بدلا من ذلك.",
+       "apihelp-paraminfo-param-formatmodules": "قائمة بأسماء أشكال الوحدات (قيم الوسيط <var>format</var>). استخدم <var>$1modules</var> بدلا من ذلك.",
+       "apihelp-paraminfo-example-1": "عرض معلومات عن <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> و<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd> و<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> و<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
+       "apihelp-paraminfo-example-2": "أظهر المعلومات لجميع الوحدات الفرعية ل<kbd>[[Special:ApiHelp/query|action=query]]</kbd>.",
+       "apihelp-parse-param-title": "عنوان الصفحة التي ينتمي النص إليها.إذا تم حذفها، <var>$1contentmodel</var> يجب أن تكون محددة، و[[API]] سيتم استخدامه كعنوان.",
+       "apihelp-parse-param-text": "نص للتحليل. استخدم <var>$1title</var> أو <var>$1contentmodel</var> للتحكم في نموذج المحتوى.",
+       "apihelp-parse-param-summary": "ملخص للتحليل.",
+       "apihelp-parse-param-page": "تحليل محتوى هذه الصفحة. لا يمكن أن تُستخدَم بجانب <var>$1text</var> and <var>$1title</var>.",
+       "apihelp-parse-param-pageid": "حلل محتوى هذه الصفحة. تجاوز <var>$1page</var>.",
+       "apihelp-parse-param-redirects": "لو <var>$1page</var> أو <var>$1pageid</var> is تم تعيينها للتحويل، حلها.",
+       "apihelp-parse-param-oldid": "تحليل مضمون هذا التعديل. تجاوز <var>$1page</var> و<var>$1pageid</var>.",
+       "apihelp-parse-param-prop": "أي قطعة من المعلومات تريد الحصول عليها:",
+       "apihelp-parse-paramvalue-prop-langlinks": "يعطي وصلات اللغات في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-categories": "يعطي التصنيفات في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "يعطي إصدار HTML للتصنيفات.",
+       "apihelp-parse-paramvalue-prop-links": "يعطي الوصلات الداخلية في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-templates": "يعطي القوالب في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-images": "يعطي الصور في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-externallinks": "يعطي الوصلات الخارجية في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-sections": "يعطي الأقسام في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "يضيف العنوان في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Deprecated.</span> يعطي عناصر لوضعها في <code>&lt;head&gt;</code> الصفحة.",
+       "apihelp-parse-paramvalue-prop-headhtml": "يعطي تحليل <code>&lt;head&gt;</code> الصفحة.",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة. للتطبيق; استخدم <code>mw.config.set()</code>.",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة كسلسلة JSON.",
+       "apihelp-parse-paramvalue-prop-indicators": "يعطي HTML مؤشرات حالة الصفحة المستخدمة في الصفحة.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "يعطي وصلات اللغات في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-wikitext": "يعطي نصوص الويكي الأصلية التي تم تحليلها.",
+       "apihelp-parse-paramvalue-prop-properties": "يعطي الخصائص المختلفة المحددة في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "يعطي تقرير الحد بطريقة منظمة. لا يعطي أية بيانات، عندما يتم تعيين <var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "يعطي إصدار HTML لتقرير الحد. لا يعطي أية بيانات، عندما يتم تعيين<var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-parsetree": "شجرة تحليل XML لمحتويات المراجعة (يتطلب نموذج محتوى <code>$1</code>)",
+       "apihelp-parse-param-pst": "قم بتحويل قبل الحفظ على المدخلات قبل تحليل ذلك. صالح فقط عند استخدامه مع النص.",
+       "apihelp-parse-param-effectivelanglinks": "يشمل وصلات لغة المقدمة بواسطة ملحقات (للاستخدام مع <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-disablelimitreport": "تجاهل تقرير الحد (\"NewPP limit report\") من مخرجات المحلل.",
+       "apihelp-parse-param-disablepp": "استخدم <var>$1disablelimitreport</var> بدلا من ذلك.",
+       "apihelp-parse-param-disableeditsection": "تجاهل روابط تحرير الأقسام من مخرجات المحلل.",
+       "apihelp-parse-param-disabletidy": "لا تشغل تنظيف HTML (على سبيل المثال مرتبة) على مخرجات المحلل.",
+       "apihelp-parse-param-generatexml": "توليد شجرة تحليل XML (يتطلب نموذج المحتوى <code>$1</code>; حل محلها <kbd>$2prop=parsetree</kbd>).",
+       "apihelp-parse-param-preview": "تحليل في وضع المعاينة.",
+       "apihelp-parse-param-sectionpreview": "تحليل في وضع معاينة القسم (يمكن وضع المعاينة أيضا).",
+       "apihelp-parse-param-disabletoc": "تجاهل جدول المحتويات في المخرجات.",
+       "apihelp-parse-param-contentformat": "نموذج المحتوى المسلسل يُستخدَم للنص المدخل. صالح فقط عند استخدامه مع $1text.",
        "apihelp-parse-example-page": "تحليل صفحة.",
+       "apihelp-parse-example-text": "تحليل نصوص ويكي",
+       "apihelp-parse-example-texttitle": "تحليل نصوص ويكي، تحديد عنوان الصفحة.",
+       "apihelp-parse-example-summary": "تحليل الملخص.",
+       "apihelp-patrol-description": "مراجعة صفحة أو مراجعة.",
+       "apihelp-patrol-param-rcid": "معرف أحدث التغييرات للمراجعة",
+       "apihelp-patrol-param-revid": "معرف مراجعة للمراجعة",
+       "apihelp-patrol-param-tags": "تغيير وسوم لتطبيق الإدخال في سجل المراجعة.",
        "apihelp-patrol-example-rcid": "ابحث عن تغيير جديد",
        "apihelp-patrol-example-revid": "راجع مراجعة.",
        "apihelp-protect-description": "غير مستوى الحماية لصفحة.",
+       "apihelp-protect-param-title": "عنوان الصفحة ل (إزالة) الحماية. لا يمكن أن تُستخدَم بجانب $1pageid.",
+       "apihelp-protect-param-pageid": "معرف الصفحة ل (إزالة) الحماية. لا يمكن أن تُستخدَم بجانب $1pageid.",
+       "apihelp-protect-param-reason": "سبب (إزالة) الحماية.",
+       "apihelp-protect-param-tags": "تغيير وسوم لتطبيق الإدخال في سجل الحماية.",
+       "apihelp-protect-param-watch": "إذا تم الضبط، أضف الصفحة (غير) المحمية لقائمة مراقبة المستخدم الحالي.",
        "apihelp-protect-example-protect": "حماية صفحة.",
+       "apihelp-protect-example-unprotect": "إلغاء حماية الصفحة من خلال وضع قيود ل<kbd>all</kbd> (أي يُسمَح أي شخص باتخاذ الإجراءات).",
+       "apihelp-protect-example-unprotect2": "إلغاء حماية الصفحة عن طريق عدم وضع أية قيود.",
+       "apihelp-purge-description": "مسح ذاكرة التخزين المؤقت للعناوين المعطاة",
+       "apihelp-purge-param-forcelinkupdate": "تحديث جداول الروابط.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "تحديث جدول الروابط، وتحديث جداول الروابط لأية صفحة تستخدم هذه الصفحة كقالب.",
+       "apihelp-purge-example-simple": "إفراغ كاش <kbd>Main Page</kbd> وصفحة <kbd>API</kbd>.",
+       "apihelp-purge-example-generator": "إفراغ كاش أول 10 صفحات في النطاق الرئيسي.",
+       "apihelp-query-description": "جلب البيانات من وعن ميدياويكي. يجب على جميع تعديلات البيانات أولا استخدام استعلام للحصول على رمز لمنع الاعتداء من المواقع الخبيثة.",
+       "apihelp-query-param-prop": "أي الخصائص تريد الحصول على صفحات استعلام عنها.",
+       "apihelp-query-param-list": "أي القوائم تريد الحصول عليها.",
+       "apihelp-query-param-meta": "أي البيانات الوصفية تريد الحصول عليها.",
+       "apihelp-query-param-export": "تصدير المراجعات الحالية لجميع الصفحات المعينة أو المولدة.",
+       "apihelp-query-param-exportnowrap": "إعادة تصدير XML دون التفاف عليه في نتيجة XML (نفس شكل [[Special:Export|خاص:تصدير]]). يمكن استخدامها فقط مع $1export.",
+       "apihelp-query-param-rawcontinue": "إرجاع <samp>query-continue</samp> بيانات خام للاستمرار.",
+       "apihelp-query-example-revisions": "جلب [[Special:ApiHelp/query+siteinfo|معلومات الموقع]] و[[Special:ApiHelp/query+revisions|مراجعات]] <kbd>Main Page</kbd>.",
+       "apihelp-query-example-allpages": "جلب مراجعات الصفحات التي تبدأ ب<kbd>API/</kbd>.",
+       "apihelp-query+allcategories-description": "تعداد جميع التصنيفات.",
+       "apihelp-query+allcategories-param-from": "التصنيف الذي يبدأ التعداد منه.",
+       "apihelp-query+allcategories-param-to": "التصنيف الذي يقف التعداد عنده.",
+       "apihelp-query+allcategories-param-prefix": "ابحث عن جميع التصنيفات التي تبدأ أسماؤها بهذه القيمة.",
+       "apihelp-query+allcategories-param-dir": "اتجاه الفرز.",
+       "apihelp-query+allcategories-param-limit": "كم عدد الفئات في الإرجاع.",
+       "apihelp-query+allcategories-param-prop": "أي الخصائص تريد الحصول عليها:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "أضف عدد الصفحات في هذا التصنيف.",
+       "apihelp-query+allcategories-example-generator": "استرداد المعلومات حول صفحة التصنيف نفسها للتصنيفات التي تبدأ ب<kbd>List</kbd>.",
+       "apihelp-query+alldeletedrevisions-description": "قائمة جميع المراجعات المحذوفة بواسطة المستخدم أو في نطاق.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "يمكن أن تُستخدَم فقط مع <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "لا يمكن أن تُستخدَم مع <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-param-end": "الطابع الزمني الذي يقف التعداد منه.",
+       "apihelp-query+alldeletedrevisions-param-from": "بدء الإدراج في القائمة من هذا العنوان.",
+       "apihelp-query+alldeletedrevisions-param-to": "وقف الإدراج في القائمة من هذا العنوان.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "ابحث عن جميع عناوين الصفحات التي تبدأ أسماؤها بهذه القيمة.",
+       "apihelp-query+alldeletedrevisions-param-tag": "مراجعات القائمة فقط تم وسمها بهذ الوسم.",
+       "apihelp-query+alldeletedrevisions-param-user": "أدرج المراجعات التي كتبها هذا المستخدم فقط.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "لا تدرج المراجعات التي كتبها هذا المستخدم.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "أدرج الصفحات  في هذا النطاق فقط.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "عندما يُستخدَم كمولد، ولد عناوين بدلا من معرفات المراجعات.",
+       "apihelp-query+allfileusages-description": "قائمة جميع استخدامات الملفات، بما في ذلك غير الموجودة.",
+       "apihelp-query+allfileusages-param-from": "عنوان الملف لبدء التعداد منه.",
+       "apihelp-query+allfileusages-param-to": "عنوان الملف لوقف التعداد منه.",
+       "apihelp-query+allfileusages-param-prefix": "البحث عن كل عناوين الملفات التي تبدأ بهذه القيمة.",
+       "apihelp-query+allfileusages-param-prop": "أي قطعة من المعلومات تريد تضمينها:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "تضيف معرفات استخدام الصفحات (لا يمكن استخدامها مع $1unique).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "تضيف عنوان الملف.",
+       "apihelp-query+allfileusages-param-limit": "كم عدد مجموع البنود للعودة.",
+       "apihelp-query+allimages-description": "تعداد كافة الصور بشكل متتالي.",
+       "apihelp-query+allimages-param-sort": "خاصية للفرز وفقًا لها.",
+       "apihelp-query+allimages-param-from": "عنوان الصورة لبدء التعداد منه. يمكن استخدامها مع $1sort=name فقط.",
+       "apihelp-query+allimages-param-to": "عنوان الصورة لوقف التعداد منه. يمكن استخدامها مع $1sort=name فقط.",
+       "apihelp-query+allimages-param-start": "طابع زمني لبدء التعداد منه. يمكن استخدامه مع $1sort فقط.",
+       "apihelp-query+allimages-param-end": "طابع زمني لإنهاء التعداد منه. يمكن استخدامه مع $1sort فقط.",
+       "apihelp-query+allimages-param-prefix": "البحث عن كل عناوين الصور التي تبدأ بهذه القيمة. يمكن استخدامها مع $1sort فقط.",
+       "apihelp-query+allimages-param-sha1": "SHA1 تجزئة الصورة. تجاوز $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "SHA1 تجزئة الصورة في قاعدة 36 (تُستخدَم في ميدياويكي).",
+       "apihelp-query+allimages-param-filterbots": "كيفية تصفية الملفات التي تم تحميلها بواسطة بوتات. يمكن استخدامها مع $1sort=timestamp فقط. لا يمكن أن تُستخدَم بجانب $1user.",
+       "apihelp-query+allimages-param-mime": "عن أي أنواع MIME تبحث، على سبيل المثال <kbd>image/jpeg</kbd>.",
+       "apihelp-query+allimages-example-B": "أظهر قائمة الملفات التي تبدأ ب<kbd>B</kbd>.",
+       "apihelp-query+allimages-example-recent": "أظهر قائمة الملفات التي تم تحميلها مؤخرا، على غرار [[Special:NewFiles|خاص:ملفات جديدة]].",
+       "apihelp-query+allimages-example-mimetypes": "أظهر قائمة الملفات من نوع MIME <kbd>image/png</kbd> أو <kbd>image/gif</kbd>",
+       "apihelp-query+allimages-example-generator": "عرض معلومات حول 4 ملفات تبدأ بالحرف <kbd>T</kbd>.",
+       "apihelp-query+alllinks-description": "تعداد كافة الروابط التي تشير إلى نطاق معين.",
+       "apihelp-query+alllinks-param-from": "عنوان الرابط لبدء التعداد منه.",
+       "apihelp-query+alllinks-param-to": "عنوان الرابط لوقف التعداد منه.",
+       "apihelp-query+alllinks-param-prefix": "البحث عن كل العناوين المرتبطة التي تبدأ بهذه القيمة.",
+       "apihelp-query+alllinks-param-prop": "أي قطعة من المعلومات تريد تضمينها:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "تضيف معرف الصفحة للصفحة المرتبطة (لا يمكن استخدامها مع $1unique).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "تضيف عنوان الرابط.",
+       "apihelp-query+alllinks-param-namespace": "نطاق للتعداد.",
+       "apihelp-query+alllinks-param-limit": "كم عدد مجموع البنود للعودة.",
+       "apihelp-query+alllinks-example-generator": "يحصل على الصفحات التي تحتوي على وصلات.",
+       "apihelp-query+allmessages-param-prop": "أي الخصائص تريد الحصول عليها:",
+       "apihelp-query+allmessages-param-filter": "إرجاع الرسائل بالأسماء التي تحتوي على هذه السلسلة فقط.",
+       "apihelp-query+allmessages-param-lang": "إرجاع الرسائل بهذه اللغة.",
+       "apihelp-query+allmessages-param-from": "إرجاع الرسائل ابتداء من هذه الرسالة.",
+       "apihelp-query+allmessages-param-to": "إرجاع الرسائل التي تنتهي بهذه الرسالة.",
+       "apihelp-query+allmessages-param-prefix": "إرجاء الرسائل بهذه البادئة.",
+       "apihelp-query+allmessages-example-ipb": "عرض رسائل تبدأ ب<kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "عرض رسائل <kbd>august</kbd> and <kbd>mainpage</kbd> باللغة الألمانية.",
+       "apihelp-query+allpages-description": "تعداد كافة الصفحات بشكل متتالي في نطاق معين.",
+       "apihelp-query+allpages-param-to": "عنوان الصفحة لإيقاف التعداد منه.",
+       "apihelp-query+allpages-param-prefix": "البحث عن كل عناوين الصفحات التي تبدأ بهذه القيمة.",
+       "apihelp-query+allpages-param-namespace": "نطاق للتعداد.",
        "apihelp-query+allpages-param-filterredir": "أي الصفحات للعرض.",
+       "apihelp-query+allpages-param-limit": "كم عدد مجموع الصفحات للعودة.",
+       "apihelp-query+allpages-example-B": "عرض  قائمة من الصفحات التي تبدأ بالحرف <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "عرض معلومات حول 4 صفحات تبدأ بالحرف <kbd>T</kbd>.",
+       "apihelp-query+allredirects-param-from": "عنوان التحويلة لبدء التعداد منه.",
+       "apihelp-query+allredirects-param-to": "عنوان التحويلة لإيقاف التعداد منه.",
+       "apihelp-query+allredirects-param-prefix": "ابحث عن جميع عناوين الصفحات المستهدفة التي تبدأ بهذه القيمة.",
+       "apihelp-query+allredirects-param-prop": "أي قطعة من المعلومات تريد تضمينها:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "تضيف معرف الصفحة لصفحة التحويل (لا يمكن استخدامها مع $1unique).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "تضيف عنوان التحويلة.",
+       "apihelp-query+allredirects-param-namespace": "نطاق للتعداد.",
+       "apihelp-query+allredirects-param-limit": "كم عدد مجموع البنود للعودة.",
+       "apihelp-query+allredirects-example-generator": "يحصل على الصفحات التي تحتوي على تحويلات.",
        "apihelp-query+allrevisions-description": "اعرض كل المراجعات.",
+       "apihelp-query+allrevisions-param-start": "التصنيف الذي يبدأ التعداد منه.",
+       "apihelp-query+allrevisions-param-end": "الطابع الزمني الذي يقف التعداد منه.",
+       "apihelp-query+allrevisions-param-generatetitles": "عندما يُستخدَم كمولد، ولد عناوين بدلا من معرفات المراجعات.",
+       "apihelp-query+mystashedfiles-param-prop": "أي الخصائص تريد لجلب للملفات.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "جلب حجم الملف وأبعاد الصورة.",
        "apihelp-query+blocks-example-simple": "قائمة المنع.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "إضافة هوية المستخدم الذي قام بتحميل كل إصدار ملف.",
-       "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
+       "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها.",
+       "api-feed-error-title": "خطأ ($1)"
 }
index fccdc0f..89f9e39 100644 (file)
@@ -16,7 +16,7 @@
        "apihelp-main-param-servedby": "Incluyir el nome del host que sirvió la solicitú nes resultancies.",
        "apihelp-main-param-curtimestamp": "Incluyir la marca de tiempu actual na resultancia.",
        "apihelp-block-description": "Bloquiar a un usuariu.",
-       "apihelp-block-param-user": "El nome d'usuariu, dirección IP o intervalu d'IP que quies bloquiar.",
+       "apihelp-block-param-user": "Nome d'usuariu, dirección #IP o intervalu d'IP que quies bloquiar. Nun puede utilizase con <var>$1userid</var>",
        "apihelp-block-param-expiry": "Fecha de caducidá. Puede ser relativa (por casu, <kbd>5 meses</kbd> o <kbd>2 selmanes</kbd>) o absoluta (por casu, 2016-01-16T12:34:56Z). Si s'establez a <kbd>infinitu</kbd>, <kbd>indefiníu</kbd>, o <kbd>nunca</kbd>, el bloquéu nun caducará nunca.",
        "apihelp-block-param-reason": "Motivu del bloquéu.",
        "apihelp-block-param-anononly": "Bloquiar solo los usuarios anónimos (esto ye, desactivar ediciones anónimes dende esta dirección IP).",
index 3818ce9..6634645 100644 (file)
@@ -18,7 +18,7 @@
        "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST).\n\nДля аўтэнтыфікаваных запытаў ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца знаходзіцца ў белым сьпісе, будуць выстаўленыя загалоўкі <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неаўтэнтыфікаваных запытаў выстаўце значэньне <kbd>*</kbd>. Гэта прывядзе да выстаўленьня загалоўку <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> будзе мець значэньне <code>false</code> і ўсе зьвесткі пра карыстальніка будуць абмежаваныя.",
        "apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> вяртае сьпіс кодаў мовы, або трэба вызначыць <kbd>user</kbd>, каб ужываць налады мовы цяперашняга карыстальніка, або вызначыць <kbd>content</kbd>, каб ужываць мову зьместу гэтай вікі.",
        "apihelp-block-description": "Блякаваньне ўдзельніка.",
-       "apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць.",
+       "apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць. Ня можа быць ужыты разам з <var>$1userid</var>",
        "apihelp-block-param-expiry": "Час заканчэньня. Можа быць адносным (напрыклад, <kbd>5 months</kbd> або <kbd>2 weeks</kbd>) ці абсалютным (напрыклад, <kbd>2014-09-18T12:34:56Z</kbd>). Калі выстаўлены на <kbd>infinite</kbd>, <kbd>indefinite</kbd> ці <kbd>never</kbd>, блякаваньне будзе бестэрміновым.",
        "apihelp-block-param-reason": "Прычына блякаваньня.",
        "apihelp-block-param-anononly": "Заблякаваць толькі ананімных удзельнікаў (напрыклад, забараніць ананімныя праўкі з гэтага IP-адрасу).",
index 4fe6a04..6f8f596 100644 (file)
@@ -4,5 +4,8 @@
                        "Ibrahim khashrowdi"
                ]
        },
-       "apihelp-block-description": "کار زوروکئ بستین"
+       "apihelp-block-description": "کار زوروکئ بستین",
+       "apihelp-createaccount-param-name": "کار زورؤکین نام.",
+       "apihelp-login-param-name": "کار زورؤکین نام.",
+       "apihelp-userrights-param-user": "کار زورؤکین نام."
 }
index fde631c..fe93ebe 100644 (file)
@@ -21,5 +21,8 @@
        "apihelp-edit-param-contentmodel": "নতুন বিষয়বস্তুর, বিষয়বস্তু-মডেল।",
        "apihelp-edit-example-edit": "একটি পাতা সম্পাদনা করুন",
        "apihelp-edit-example-prepend": "একটি পৃষ্ঠার পূর্বে <kbd>_&#95;NOTOC_&#95;</kbd> লিখুন।",
-       "apihelp-login-example-login": "প্রবেশ"
+       "apihelp-login-example-login": "প্রবেশ",
+       "apihelp-setpagelanguage-param-reason": "পরিবর্তনের কারণ।",
+       "apierror-invaliduserid": "ব্যবহারকারী আইডি <var>$1</var> বৈধ নয়।",
+       "apierror-nosuchuserid": "$1 আইডি যুক্ত কোন ব্যবহারকারী নেই।"
 }
index 9ed9dcb..a8f4dd8 100644 (file)
@@ -1,19 +1,35 @@
 {
        "@metadata": {
                "authors": [
-                       "Y-M D"
+                       "Y-M D",
+                       "Fulup"
                ]
        },
        "apihelp-block-description": "Stankañ un implijer",
        "apihelp-block-param-reason": "Abeg evit stankañ.",
+       "apihelp-createaccount-description": "Krouiñ ur gont implijer nevez.",
        "apihelp-createaccount-param-name": "Anv implijer.",
        "apihelp-delete-description": "Diverkañ ur bajenn.",
+       "apihelp-edit-description": "Krouiñ pajennoù ha kemmañ anezho.",
+       "apihelp-edit-param-sectiontitle": "Titl ur rannbennad nevez.",
        "apihelp-edit-param-text": "Danvez ar bajenn.",
        "apihelp-edit-param-minor": "Kemmig dister.",
        "apihelp-edit-example-edit": "Kemmañ ur bajenn.",
+       "apihelp-emailuser-description": "Kas ur postel d'un implijer.",
+       "apihelp-emailuser-param-text": "Korf ar postel.",
        "apihelp-expandtemplates-param-title": "Titl ar bajenn.",
+       "apihelp-feedcontributions-param-year": "Adalek ar bloaz (ha koshoc'h)",
+       "apihelp-feedcontributions-param-month": "Adalek ar miz (ha koshoc'h).",
+       "apihelp-feedcontributions-param-hideminor": "Kuzhat ar c'hemmoù dister.",
+       "apihelp-feedrecentchanges-param-hideminor": "Kuzhat ar c'hemmoù dister.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Silañ dre dikedennoù.",
+       "apihelp-feedrecentchanges-example-simple": "Diskouez ar c'hemmoù diwezhañ.",
        "apihelp-login-param-name": "Anv implijer.",
        "apihelp-login-param-password": "Ger-tremen.",
+       "apihelp-login-param-domain": "Domani (diret).",
        "apihelp-login-example-login": "Kevreañ.",
-       "apihelp-protect-example-protect": "Gwareziñ ur bajenn."
+       "apihelp-move-description": "Dilec'hiañ ur bajenn.",
+       "apihelp-move-param-noredirect": "Chom hep krouiñ un adkas.",
+       "apihelp-protect-example-protect": "Gwareziñ ur bajenn.",
+       "apihelp-rollback-param-tags": "Tikedennoù da lakaat e talvoud war an distroioù."
 }
index 2396f69..ca1e85a 100644 (file)
@@ -26,7 +26,7 @@
        "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu).\n\nU autentizovaných požadavků hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, budou nastaveny hlavičky <code>Access-Control-Allow-Origin</code> a <code>Access-Control-Allow-Credentials</code>.\n\nU neautentizovaných požadavků uveďte hodnotu <kbd>*</kbd>. To způsobí nastavení hlavičky <code>Access-Control-Allow-Origin</code>, ale hlavička <code>Access-Control-Allow-Credentials</code> bude <code>false</code> a budou omezena všechna data specifická pro uživatele.",
        "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Pomocí <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd> získáte seznam jazykových kódů nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
        "apihelp-block-description": "Zablokovat uživatele.",
-       "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
+       "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat. Nelze použít dohromady s <var>$1userid</var>.",
        "apihelp-block-param-reason": "Důvod bloku.",
        "apihelp-block-param-anononly": "Zablokovat pouze anonymní uživatele (tj. zakázat editovat anonymně z této IP).",
        "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
        "apihelp-query+watchlistraw-description": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.",
        "apihelp-query+watchlistraw-example-simple": "Seznam sledovaných stránek uživatele.",
        "apihelp-stashedit-param-summary": "Změnit shrnutí.",
-       "apihelp-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s <var>$1id</var>.",
+       "apihelp-unblock-param-user": "Uživatel, IP adresa nebo rozsah IP adres k odblokování. Nelze použít dohromady s <var>$1id</var> nebo <var>$1userid</var>.",
        "apihelp-watch-example-watch": "Sledovat stránku <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.",
        "apihelp-format-example-generic": "Výsledek dotazu vrátit ve formátu $1.",
        "api-help-permissions-granted-to": "Uděleno {{PLURAL:$1|skupině|skupinám}}: $2",
        "api-help-right-apihighlimits": "Používání vyšších limitů v API dotazech (pomalé dotazy: $1, rychlé dotazy: $2). Limity pro pomalé dotazy se vztahují i na vícehodnotové parametry.",
        "api-help-open-in-apisandbox": "<small>[otevřít v pískovišti]</small>",
+       "apierror-nosuchsection-what": "$2 neobsahuje sekci $1.",
+       "apierror-sectionsnotsupported-what": "$1 nepodporuje sekce.",
        "api-credits-header": "Zásluhy",
        "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://phabricator.wikimedia.org/."
 }
index db799e2..2a61a90 100644 (file)
@@ -16,7 +16,8 @@
                        "Ljonka",
                        "FriedhelmW",
                        "Predatorix",
-                       "Luke081515"
+                       "Luke081515",
+                       "Eddie"
                ]
        },
        "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-param-smaxage": "Den <code>s-maxage</code>-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gepuffert.",
        "apihelp-main-param-maxage": "Den <code>max-age</code>-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
        "apihelp-main-param-assert": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf <kbd>user</kbd> gesetzt, oder Bot ist, wenn auf <kbd>bot</kbd> gesetzt.",
+       "apihelp-main-param-assertuser": "Überprüft, ob der aktuelle Benutzer der benannte Benutzer ist.",
        "apihelp-main-param-requestid": "Der angegebene Wert wird mit in die Antwort aufgenommen und kann zur Unterscheidung von Anfragen verwendet werden.",
        "apihelp-main-param-servedby": "Namen des bearbeitenden Hosts mit zurückgeben.",
        "apihelp-main-param-curtimestamp": "Aktuellen Zeitstempel mit zurückgeben.",
+       "apihelp-main-param-responselanginfo": "Bezieht die für <var>uselang</var> und <var>errorlang</var> verwendeten Sprachen im Ergebnis mit ein.",
        "apihelp-main-param-origin": "Beim Zugriff auf die API mit einer Kreuz-Domain-AJAX-Anfrage (CORS) muss dies als entstehende Domäne festgelegt werden. Dies muss in jeder Vorfluganfrage mit eingeschlossen werden und deshalb ein Teil der Anfragen-URI sein (nicht des POST-Körpers).\n\nFür authentifizierte Anfragen muss dies exakt einem der Ursprünge im Header <code>Origin</code> entsprechen, so dass es auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> festgelegt werden muss. Falls dieser Parameter nicht mit dem Header <code>Origin</code> übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter mit dem Header <code>Origin</code> übereinstimmt und der Ursprung weißgelistet ist, werden die Header <code>Access-Control-Allow-Origin</code> und <code>Access-Control-Allow-Credentials</code> festgelegt.\n\nGib für nicht authentifizierte Anfragen den Wert <kbd>*</kbd> an. Dies verursacht, dass der Header <code>Access-Control-Allow-Origin</code> festgelegt wird, aber <code>Access-Control-Allow-Credentials</code> wird <code>false</code> sein und alle benutzerspezifischen Daten werden beschränkt.",
        "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> gibt eine Liste der Sprachcodes zurück. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
+       "apihelp-main-param-errorformat": "Zu verwendendes Format zur Ausgabe von Warnungen und Fehlertexten.\n; plaintext: Wikitext mit entfernten HTML-Tags und ersetzten Entitäten.\n; wikitext: Ungeparster Wikitext.\n; html: HTML.\n; raw: Nachrichtenschlüssel und Parameter.\n; none: Keine Textausgabe, nur die Fehlercodes.\n; bc: Vor MediaWiki 1.29 verwendetes Format. <var>errorlang</var> und <var>errorsuselocal</var> werden ignoriert.",
+       "apihelp-main-param-errorsuselocal": "Falls angegeben, verwenden Fehlertexte lokalisierte Nachrichten aus dem {{ns:MediaWiki}}-Namensraum.",
        "apihelp-block-description": "Einen Benutzer sperren.",
-       "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, der gesperrt werden soll.",
+       "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Adressbereich, der gesperrt werden soll. Kann nicht zusammen mit <var>$1userid</var> verwendet werden.",
+       "apihelp-block-param-userid": "Die zu sperrende Benutzerkennung. Kann nicht zusammen mit <var>$1user</var> verwendet werden.",
        "apihelp-block-param-expiry": "Sperrdauer. Kann relativ (z.&nbsp;B. <kbd>5 months</kbd> oder <kbd>2 weeks</kbd>) oder absolut (z.&nbsp;B. <kbd>2014-09-18T12:34:56Z</kbd>) sein. Wenn auf <kbd>infinite</kbd>, <kbd>indefinite</kbd> oder <kbd>never</kbd> gesetzt, ist die Sperre unbegrenzt.",
        "apihelp-block-param-reason": "Sperrbegründung.",
        "apihelp-block-param-anononly": "Nur anonyme Benutzer sperren (z.&nbsp;B. anonyme Bearbeitungen für diese IP deaktivieren).",
        "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.",
        "apihelp-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.",
+       "apihelp-block-param-tags": "Auf den Eintrag im Sperr-Logbuch anzuwendende Änderungsmarkierungen.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd> für drei Tage mit der Begründung „First strike“ (erste Verwarnung) sperren",
        "apihelp-block-example-user-complex": "Benutzer <kbd>Vandal</kbd> unbeschränkt sperren mit der Begründung „Vandalism“ (Vandalismus), Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
+       "apihelp-changeauthenticationdata-description": "Ändert die Authentifizierungsdaten für den aktuellen Benutzer.",
+       "apihelp-changeauthenticationdata-example-password": "Versucht, das Passwort des aktuellen Benutzers in <kbd>ExamplePassword</kbd> zu ändern.",
        "apihelp-checktoken-description": "Überprüft die Gültigkeit eines über <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> erhaltenen Tokens.",
        "apihelp-checktoken-param-type": "Typ des Tokens, das getestet werden soll.",
        "apihelp-checktoken-param-token": "Token, das getestet werden soll.",
@@ -52,6 +61,7 @@
        "apihelp-checktoken-example-simple": "Überprüft die Gültigkeit des <kbd>csrf</kbd>-Tokens.",
        "apihelp-clearhasmsg-description": "Löschen des <code>hasmsg</code>-Flags („hat Nachrichten“-Flag) für den aktuellen Benutzer.",
        "apihelp-clearhasmsg-example-1": "<code>hasmsg</code>-Flags für den aktuellen Benutzer löschen",
+       "apihelp-clientlogin-example-login": "Startet den Prozess der Anmeldung in dem Wiki als Benutzer <kbd>Example</kbd> mit dem Passwort <kbd>ExamplePassword</kbd>.",
        "apihelp-compare-description": "Abrufen des Unterschieds zwischen zwei Seiten.\n\nDu musst eine Versionsnummer, einen Seitentitel oder eine Seitennummer für „from“ als auch „to“ angeben.",
        "apihelp-compare-param-fromtitle": "Erster zu vergleichender Titel.",
        "apihelp-compare-param-fromid": "Erste zu vergleichende Seitennummer.",
        "apihelp-help-example-query": "Hilfe für zwei Abfrage-Submodule",
        "apihelp-imagerotate-description": "Ein oder mehrere Bilder drehen.",
        "apihelp-imagerotate-param-rotation": "Anzahl der Grad, um die das Bild im Uhrzeigersinn gedreht werden soll.",
+       "apihelp-imagerotate-param-tags": "Auf den Eintrag im Datei-Logbuch anzuwendende Markierungen",
        "apihelp-imagerotate-example-simple": "<kbd>Datei:Beispiel.png</kbd> um <kbd>90</kbd> Grad drehen.",
        "apihelp-imagerotate-example-generator": "Alle Bilder in der <kbd>Kategorie:Flip</kbd> um <kbd>180</kbd> Grad drehen.",
        "apihelp-import-description": "Importiert eine Seite aus einem anderen Wiki oder von einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den <var>xml</var>-Parameter zu senden.",
        "apihelp-import-param-templates": "Für Interwiki-Importe: importiere auch alle eingebundenen Vorlagen.",
        "apihelp-import-param-namespace": "In diesen Namensraum importieren. Kann nicht zusammen mit <var>$1rootpage</var> verwendet werden.",
        "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren. Kann nicht zusammen mit <var>$1namespace</var> verwendet werden.",
+       "apihelp-import-param-tags": "Auf den Eintrag im Import-Logbuch und die Nullversion bei den importierten Seiten anzuwendende Änderungsmarkierungen.",
        "apihelp-import-example-import": "Importiere [[meta:Help:ParserFunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
        "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nDiese Aktion sollte nur in Kombination mit [[Special:BotPasswords]] verwendet werden. Die Verwendung für die Anmeldung beim Hauptkonto ist veraltet und kann ohne Warnung fehlschlagen. Um sich sicher beim Hauptkonto anzumelden, verwende <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Benutzername.",
        "apihelp-managetags-param-tag": "Schlagwort zum Erstellen, Löschen, Aktivieren oder Deaktivieren. Zum Erstellen darf das Schlagwort noch nicht vorhanden sein. Zur Löschung muss das Schlagwort vorhanden sein. Zur Aktivierung muss das Schlagwort vorhanden sein, darf aber nicht von einer Erweiterung in Gebrauch sein. Zur Deaktivierung muss das Schlagwort gegenwärtig aktiv und manuell definiert sein.",
        "apihelp-managetags-param-reason": "optionale Begründung für das Erstellen, Löschen, Aktivieren oder Deaktivieren der Markierung.",
        "apihelp-managetags-param-ignorewarnings": "Warnungen während des Vorgangs ignorieren.",
+       "apihelp-managetags-param-tags": "Auf den Eintrag im Markierungs-Verwaltungs-Logbuch anzuwendende Änderungsmarkierungen.",
        "apihelp-managetags-example-create": "Erstellt eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
        "apihelp-managetags-example-delete": "Löscht die <kbd>vandlaism</kbd>-Markierung mit der Begründung <kbd>Misspelt</kbd>.",
        "apihelp-managetags-example-activate": "Aktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
        "apihelp-managetags-example-deactivate": "Deaktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>No longer required</kbd> (nicht mehr benötigt).",
        "apihelp-mergehistory-description": "Führt Versionsgeschichten von Seiten zusammen.",
+       "apihelp-mergehistory-param-reason": "Grund für die Zusammenführung der Versionsgeschichten",
+       "apihelp-mergehistory-example-merge": "Fügt alle Versionen von <kbd>Oldpage</kbd> der Versionsgeschichte von <kbd>Newpage</kbd> hinzu.",
        "apihelp-move-description": "Eine Seite verschieben.",
        "apihelp-move-param-from": "Titel der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1fromid</var> verwendet werden.",
        "apihelp-move-param-fromid": "Seitenkennung der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1from</var> verwendet werden.",
        "apihelp-move-param-unwatch": "Die Seite und die entstandene Weiterleitung von der Beobachtungsliste entfernen.",
        "apihelp-move-param-watchlist": "Die Seite in jedem Fall zur Beobachtungsliste hinzufügen oder davon entfernen, die Voreinstellungen dafür nutzen oder den Beobachtungsstatus nicht ändern.",
        "apihelp-move-param-ignorewarnings": "Alle Warnungen ignorieren.",
+       "apihelp-move-param-tags": "Auf den Eintrag im Verschiebungs-Logbuch und die Nullversion der Zielseite anzuwendende Änderungsmarkierungen.",
        "apihelp-move-example-move": "<kbd>Badtitle</kbd> nach <kbd>Goodtitle</kbd> verschieben, ohne eine Weiterleitung zu erstellen.",
        "apihelp-opensearch-description": "Das Wiki mithilfe des OpenSearch-Protokolls durchsuchen.",
        "apihelp-opensearch-param-search": "Such-Zeichenfolge.",
        "apihelp-protect-example-protect": "Schützt eine Seite",
        "apihelp-protect-example-unprotect": "Entsperrt eine Seite, indem die Einschränkungen durch den Schutz auf <kbd>all</kbd> gestellt werden (z.&nbsp;B. darf jeder die Aktion ausführen).",
        "apihelp-protect-example-unprotect2": "Eine Seite entsperren, indem keine Einschränkungen übergeben werden",
-       "apihelp-purge-description": "Setzt den Cache der angegebenen Seiten zurück.\n\nFalls kein Benutzer angemeldet ist, müssen POST-Anfragen genutzt werden.",
+       "apihelp-purge-description": "Setzt den Cache der angegebenen Seiten zurück.",
        "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Aktualisiert die Linktabelle der Seite und alle Linktabellen der Seiten, die sie als Vorlage einbinden.",
        "apihelp-purge-example-simple": "Purgt die <kbd>Main Page</kbd> und die <kbd>API</kbd>-Seite.",
        "apihelp-query+allmessages-param-prop": "Zurückzugebende Eigenschaften.",
        "apihelp-query+allmessages-param-enableparser": "Setzen, um den Parser zu aktivieren. Dies wird den Wikitext der Nachricht vorverarbeiten (magische Worte ersetzen, Vorlagen berücksichtigen, usw.).",
        "apihelp-query+allmessages-param-nocontent": "Wenn gesetzt, füge nicht den Inhalt der Nachricht der Ausgabe hinzu.",
-       "apihelp-query+allmessages-param-includelocal": "Schließt auch lokale Nachrichten ein. Zum Beispiel Nachrichten die es nicht in der Software gibt, die es aber als MediaWiki: - Seite gibt. Dies listet alle MediaWiki: - Seiten auf. Daher werden auch diejenigen aufgelistet, die eigentlich keine Nachrichten sind, wie [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Schließt auch lokale Nachrichten ein, zum Beispiel Nachrichten, die nicht in der Software vorhanden sind, aber dafür im {{ns:MediaWiki}}-Namensraum.\nDies listet alle Seiten im {{ns:MediaWiki}}-Namensraum auf, auch solche, die nicht wirklich Nachrichten sind, wie [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Argumente die in der Nachricht ersetzt werden sollen.",
        "apihelp-query+allmessages-param-filter": "Gebe nur Nachrichten mit Namen, die diese Zeichenfolge enthalten, zurück.",
        "apihelp-query+allmessages-param-customised": "Gebe nur Nachrichten in diesem Anpassungszustand zurück.",
        "apihelp-query+allrevisions-param-generatetitles": "Wenn als Generator verwendet, werden eher Titel als Bearbeitungs-IDs erzeugt.",
        "apihelp-query+allrevisions-example-user": "Liste die letzten 50 Beiträge, sortiert nach Benutzer <kbd>Beispiel</kbd> auf.",
        "apihelp-query+allrevisions-example-ns-main": "Liste die ersten 50 Bearbeitungen im Hauptnamensraum auf.",
+       "apihelp-query+mystashedfiles-param-prop": "Welche Eigenschaften für die Dateien abgerufen werden sollen.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "Ruft die Dateigröße und Bildabmessungen ab.",
        "apihelp-query+mystashedfiles-param-limit": "Wie viele Dateien zurückgegeben werden sollen.",
        "apihelp-query+alltransclusions-description": "Liste alle Transklusionen auf (eingebettete Seiten die &#123;&#123;x&#125;&#125; benutzen), einschließlich nicht vorhandener.",
        "apihelp-query+alltransclusions-param-from": "Der Titel der Transklusion bei dem die Auflistung beginnen soll.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "Füge die ID des Benutzers zu jeder hochgeladenen Dateiversion hinzu.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "Kommentar zu der Version.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analysiere den Kommentar zu dieser Version.",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Ergänzt den kanonischen Titel für die Datei.",
        "apihelp-query+imageinfo-paramvalue-prop-url": "Gibt die URL zur Datei- und Beschreibungsseite zurück.",
        "apihelp-query+imageinfo-paramvalue-prop-size": "Fügt die Größe der Datei in Bytes und (falls zutreffend) in Höhe, Breite und Seitenzahl hinzu.",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias für die Größe.",
        "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Listet formatierte Metadaten kombiniert aus mehreren Quellen auf. Die Ergebnisse sind im HTML-Format.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Fügt den Dateinamen der Archivversion für die nicht-letzten Versionen hinzu.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Fügt die Bittiefe der Version hinzu.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Ergänzt, ob die Datei auf der [[MediaWiki:Bad image list]] ist.",
        "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
        "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
        "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
        "apihelp-query+imageinfo-param-urlheight": "Ähnlich wie $1urlwidth.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Falls <kbd>$2prop=badfile</kbd> festgelegt ist, ist dies der verwendete Seitentitel beim Auswerten der [[MediaWiki:Bad image list]].",
        "apihelp-query+imageinfo-param-localonly": "Suche nur nach Dateien im lokalen Repositorium.",
        "apihelp-query+imageinfo-example-simple": "Rufe Informationen über die aktuelle Version von [[:File:Albert Einstein Head.jpg]] ab.",
        "apihelp-query+imageinfo-example-dated": "Rufe Informationen über Versionen von [[:File:Test.jpg]] von 2008 und später ab.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Gibt die Art und Weise an, in der der Seitentitel tatsächlich angezeigt wird.",
        "apihelp-query+info-param-testactions": "Überprüft, ob der aktuelle Benutzer gewisse Aktionen auf der Seite ausführen kann.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
+       "apihelp-query+iwbacklinks-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+iwbacklinks-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Ergänzt das Präfix des Interwikis.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ergänzt den Titel des Interwikis.",
        "apihelp-query+iwbacklinks-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+iwbacklinks-example-simple": "Ruft Seiten ab, die auf [[wikibooks:Test]] verlinken.",
        "apihelp-query+iwlinks-param-prop": "Zusätzlich zurückzugebende Eigenschaften jedes Interlanguage-Links:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+iwlinks-param-limit": "Wie viele Interwiki-Links zurückgegeben werden sollen.",
        "apihelp-query+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-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+recentchanges-paramvalue-prop-title": "Ergänzt den Seitentitel der Bearbeitung.",
        "apihelp-query+redirects-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+redirects-paramvalue-prop-pageid": "Seitenkennung einer jeden Weiterleitung.",
        "apihelp-query+redirects-paramvalue-prop-title": "Titel einer jeden Weiterleitung.",
+       "apihelp-query+redirects-param-namespace": "Schließt nur Seiten in diesen Namensräumen ein.",
        "apihelp-query+redirects-param-limit": "Wie viele Weiterleitungen zurückgegeben werden sollen.",
        "apihelp-query+revisions-param-tag": "Listet nur Versionen auf, die mit dieser Markierung markiert sind.",
        "apihelp-query+revisions+base-param-prop": "Zurückzugebende Eigenschaften jeder Version:",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
        "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-query+stashimageinfo-example-params": "Gibt Vorschaubilder für zwei gespeicherte Dateien zurück.",
        "apihelp-query+tags-description": "Änderungs-Tags auflisten.",
        "apihelp-query+tags-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+tags-paramvalue-prop-name": "Ergänzt den Namen der Markierung.",
        "apihelp-query+tags-paramvalue-prop-displayname": "Ergänzt die Systemnachricht für die Markierung.",
        "apihelp-query+tags-paramvalue-prop-description": "Ergänzt die Beschreibung der Markierung.",
        "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten",
+       "apihelp-query+templates-param-limit": "Wie viele Vorlagen zurückgegeben werden sollen.",
        "apihelp-query+templates-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+tokens-param-type": "Typen der Token, die abgerufen werden sollen.",
        "apihelp-query+transcludedin-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "Seitenkennung jeder Seite.",
        "apihelp-query+usercontribs-description": "Alle Bearbeitungen von einem Benutzer abrufen.",
        "apihelp-query+usercontribs-param-limit": "Die maximale Anzahl der zurückzugebenden Beiträge.",
        "apihelp-query+usercontribs-param-start": "Der zurückzugebende Start-Zeitstempel.",
        "apihelp-query+usercontribs-param-end": "Der zurückzugebende End-Zeitstempel.",
-       "apihelp-query+usercontribs-param-user": "Die Benutzer, für die Beiträge abgerufen werden sollen.",
+       "apihelp-query+usercontribs-param-user": "Die Benutzer, für die Beiträge abgerufen werden sollen. Kann nicht zusammen mit <var>$1userids</var> oder <var>$1userprefix</var> verwendet werden.",
+       "apihelp-query+usercontribs-param-userprefix": "Ruft Beiträge für alle Benutzer ab, deren Namen mit diesem Wert beginnt. Kann nicht zusammen mit <var>$1user</var> oder <var>$1userids</var> verwendet werden.",
+       "apihelp-query+usercontribs-param-userids": "Die Benutzerkennungen, für die die Beiträge abgerufen werden sollen. Kann nicht zusammen mit <var>$1user</var> oder <var>$1userprefix</var> verwendet werden.",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Fügt die Seiten- und Versionskennung hinzu.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "Fügt den Kommentar der Bearbeitung hinzu.",
        "apihelp-query+users-paramvalue-prop-rights": "Listet alle Rechte auf, die jeder Benutzer hat.",
        "apihelp-query+users-paramvalue-prop-editcount": "Ergänzt den Bearbeitungszähler des Benutzers.",
        "apihelp-query+users-param-users": "Eine Liste der Benutzer, für die Informationen abgerufen werden sollen.",
+       "apihelp-query+users-param-userids": "Eine Liste der Benutzerkennungen, für die die Informationen abgerufen werden sollen.",
        "apihelp-query+users-example-simple": "Gibt Informationen für den Benutzer <kbd>Example</kbd> zurück.",
        "apihelp-query+watchlist-param-user": "Listet nur Änderungen von diesem Benutzer auf.",
        "apihelp-query+watchlist-param-excludeuser": "Listet keine Änderungen von diesem Benutzer auf.",
        "apihelp-revisiondelete-description": "Löscht und stellt Versionen wieder her.",
        "apihelp-revisiondelete-param-hide": "Was für jede Version versteckt werden soll.",
        "apihelp-revisiondelete-param-show": "Was für jede Version wieder eingeblendet werden soll.",
+       "apihelp-revisiondelete-param-tags": "Auf den Eintrag im Lösch-Logbuch anzuwendende Markierungen.",
        "apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.",
        "apihelp-rsd-example-simple": "Das RSD-Schema exportieren",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
+       "apihelp-setpagelanguage-description": "Ändert die Sprache einer Seite.",
+       "apihelp-setpagelanguage-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>, um diese Aktion zu verwenden.",
+       "apihelp-setpagelanguage-param-title": "Titel der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
+       "apihelp-setpagelanguage-param-pageid": "Kennung der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit <var>$1title</var> verwendet werden.",
+       "apihelp-setpagelanguage-param-lang": "Code der Sprache, auf den die Seite geändert werden soll. Verwende <kbd>default</kbd>, um die Seite auf die Standardinhaltssprache des Wikis zurückzusetzen.",
+       "apihelp-setpagelanguage-param-reason": "Grund für die Änderung.",
+       "apihelp-setpagelanguage-param-tags": "Auf den Logbucheintrag anzuwendende Änderungsmarkierungen, die sich aus dieser Aktion ergeben.",
+       "apihelp-setpagelanguage-example-language": "Ändert die Sprache von <kbd>Hauptseite</kbd> auf Baskisch.",
+       "apihelp-setpagelanguage-example-default": "Ändert die Sprache der Seite mit der Kennung 123 auf die Standardinhaltssprache des Wikis.",
        "apihelp-stashedit-param-sectiontitle": "Der Titel für einen neuen Abschnitt.",
        "apihelp-stashedit-param-text": "Seiteninhalt.",
        "apihelp-stashedit-param-stashedtexthash": "Stattdessen zu verwendende Prüfsumme des Seiteninhalts von einem vorherigen Speicher.",
        "apihelp-stashedit-param-contentmodel": "Inhaltsmodell des neuen Inhalts.",
        "apihelp-stashedit-param-summary": "Änderungszusammenfassung.",
        "apihelp-tag-param-reason": "Grund für die Änderung.",
+       "apihelp-tag-param-tags": "Auf den Logbucheintrag anzuwendende Markierungen, die als Ergebnis dieser Aktion erstellt wurden.",
        "apihelp-tokens-param-type": "Abzufragende Tokentypen.",
        "apihelp-tokens-example-edit": "Ruft einen Bearbeitungstoken ab (Standard).",
        "apihelp-tokens-example-emailmove": "Ruft einen E-Mail- und Verschiebungstoken ab.",
        "apihelp-unblock-description": "Einen Benutzer freigeben.",
-       "apihelp-unblock-param-id": "ID der Sperre zum Entsperren (über <kbd>list=blocks</kbd> erhalten). Darf nicht zusammen mit <var>$1user</var> verwendet werden.",
-       "apihelp-unblock-param-user": "Freizugebender Benutzername, IP-Adressbereich oder freizugebende IP-Adresse. Kann nicht zusammen mit <var>$1id</var> verwendet werden.",
+       "apihelp-unblock-param-id": "Kennung der Sperre zur Freigabe (abgerufen durch <kbd>list=blocks</kbd>). Kann nicht zusammen mit <var>$1user</var> oder <var>$1userid</var> verwendet werden.",
+       "apihelp-unblock-param-user": "Benutzername, IP-Adresse oder IP-Adressbereich, der freigegeben werden soll. Kann nicht zusammen mit <var>$1id</var> oder <var>$1userid</var> verwendet werden.",
        "apihelp-unblock-param-reason": "Grund für die Freigabe.",
        "apihelp-unblock-param-tags": "Auf den Benutzersperr-Logbuch-Eintrag anzuwendende Änderungsmarkierungen.",
        "apihelp-unblock-example-id": "Sperrkennung #<kbd>105</kbd> freigeben.",
        "apihelp-userrights-description": "Ändert die Gruppenzugehörigkeit eines Benutzers.",
        "apihelp-userrights-param-user": "Benutzername.",
        "apihelp-userrights-param-userid": "Benutzerkennung.",
-       "apihelp-userrights-param-add": "Fügt den Benutzer zu diesen Gruppen hinzu.",
+       "apihelp-userrights-param-add": "Fügt den Benutzer zu diesen Gruppen hinzu oder falls er bereits Mitglied ist, aktualisiert den Ablauf seiner Mitgliedschaft in dieser Gruppe.",
        "apihelp-userrights-param-remove": "Entfernt den Benutzer von diesen Gruppen.",
        "apihelp-userrights-param-reason": "Grund für die Änderung.",
+       "apihelp-userrights-param-tags": "Auf den Eintrag im Benutzerrechte-Logbuch anzuwendende Änderungsmarkierungen.",
+       "apihelp-validatepassword-description": "Validiert ein Passwort gegen die Passwortrichtlinien des Wikis.\n\nDie Validität wird als <samp>Good</samp> gemeldet, falls das Passwort akzeptabel ist, <samp>Change</samp>, falls das Passwort zur Anmeldung verwendet werden kann, jedoch geändert werden muss oder <samp>Invalid</samp>, falls das Passwort nicht verwendbar ist.",
+       "apihelp-validatepassword-param-password": "Zu validierendes Passwort.",
+       "apihelp-validatepassword-param-user": "Der beim Austesten der Benutzerkontenerstellung verwendete Benutzername. Der angegebene Benutzer darf nicht vorhanden sein.",
+       "apihelp-validatepassword-param-email": "Die beim Austesten der Benutzerkontenerstellung verwendete E-Mail-Adresse.",
+       "apihelp-validatepassword-param-realname": "Der beim Austesten der Benutzerkontenerstellung verwendete bürgerliche Name.",
+       "apihelp-validatepassword-example-1": "Validiert das Passwort <kbd>foobar</kbd> für den aktuellen Benutzer.",
+       "apihelp-validatepassword-example-2": "Validiert das Passwort <kbd>qwerty</kbd> zum Erstellen des Benutzers <kbd>Beispiel</kbd>.",
        "apihelp-watch-example-watch": "Die Seite <kbd>Main Page</kbd> beobachten.",
        "apihelp-watch-example-unwatch": "Die Seite <kbd>Main Page</kbd> nicht beobachten.",
        "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format ausgeben.",
        "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-rawfm-description": "Daten, einschließlich Fehlerbehebungselementen, im JSON-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-xml-description": "Daten im XML-Format ausgeben.",
-       "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:mediawiki}}“ sein und mit <code>.xsl</code> enden.",
+       "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:MediaWiki}}“ sein und mit <code>.xsl</code> enden.",
        "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
        "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
        "api-format-title": "MediaWiki-API-Ergebnis",
        "api-help-param-upload": "Muss als Dateiupload mithilfe eines multipart/form-data-Formular bereitgestellt werden.",
        "api-help-param-multi-separate": "Werte mit <kbd>|</kbd> trennen oder [[Special:ApiHelp/main#main/datatypes|Alternative]].",
        "api-help-param-multi-max": "Maximale Anzahl der Werte ist {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} für Bots).",
+       "api-help-param-multi-all": "Um alle Werte anzugeben, verwende <kbd>$1</kbd>.",
        "api-help-param-default": "Standard: $1",
        "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-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-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-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-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.",
+       "apierror-stashnosuchfilekey": "Kein derartiger Dateischlüssel: $1.",
+       "apierror-stashwrongowner": "Falscher Besitzer: $1",
+       "apierror-systemblocked": "Du wurdest von MediaWiki automatisch gesperrt.",
+       "apierror-unknownerror-nocode": "Unbekannter Fehler.",
+       "apierror-unknownerror": "Unbekannter Fehler: „$1“.",
+       "apierror-unknownformat": "Nicht erkanntes Format „$1“.",
+       "apiwarn-invalidcategory": "„$1“ ist keine Kategorie.",
+       "apiwarn-invalidtitle": "„$1“ ist kein gültiger Titel.",
+       "apiwarn-notfile": "„$1“ ist keine Datei.",
+       "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.",
+       "apiwarn-validationfailed": "Validierungsfehler für <kbd>$1</kbd>: $2",
+       "api-feed-error-title": "Fehler ($1)",
+       "api-usage-docref": "Siehe $1 zur Verwendung der API.",
+       "api-usage-mailinglist-ref": "Abonniere die Mailingliste „mediawiki-api-announce“ auf &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; zum Feststellen von API-Veralterungen und „Breaking Changes“.",
        "api-credits-header": "Danksagungen",
        "api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://phabricator.wikimedia.org/ ein."
 }
index b5179bb..0c43bd7 100644 (file)
@@ -4,7 +4,9 @@
                        "Gorizon",
                        "Mirzali",
                        "Kumkumuk",
-                       "Asmen"
+                       "Asmen",
+                       "1917 Ekim Devrimi",
+                       "Gambollar"
                ]
        },
        "apihelp-main-param-action": "Performansa kamci aksiyon",
        "apihelp-expandtemplates-param-text": "Wikimetıni açarnê.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Herabıyaye wikimetin",
        "apihelp-feedcontributions-param-feedformat": "Formata warikerdışi",
+       "apihelp-feedcontributions-param-year": "Ser ra (u rewên)",
+       "apihelp-feedcontributions-param-month": "Meng ra (u rewên)",
        "apihelp-feedcontributions-param-hideminor": "Vuryayışanê werdiyan bınımne",
-       "apihelp-feedcontributions-param-showsizediff": "Goreyê ebati ferqê versiyoni bıasne.",
+       "apihelp-feedcontributions-param-showsizediff": "Goreyê ebati ferqê versiyoni bımotné.",
        "apihelp-feedrecentchanges-param-hideminor": "Vurriyayışanê werdiyan bınımne.",
        "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.",
        "apihelp-feedrecentchanges-param-hideanons": "Vurnayışanê karberanê anoniman bınımne.",
@@ -57,5 +61,6 @@
        "apihelp-parse-example-text": "Wikimetini analiz ke",
        "apihelp-parse-example-summary": "Xulasay analiz ke",
        "apihelp-query+alllinks-paramvalue-prop-title": "Sernamey rê link dek",
+       "apihelp-query+allmessages-param-lang": "Mesaja açarn ena zıwan.",
        "apihelp-query+blocks-example-simple": "Listey bloqeyan"
 }
index 0f184d9..7b2bcfd 100644 (file)
        "apihelp-main-param-requestid": "Any value given here will be included in the response. May be used to distinguish requests.",
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.",
+       "apihelp-main-param-responselanginfo": "Include the languages used for <var>uselang</var> and <var>errorlang</var> in the result.",
        "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body).\n\nFor authenticated requests, this must match one of the origins in the <code>Origin</code> header exactly, so it has to be set to something like <kbd>https://en.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. If this parameter does not match the <code>Origin</code> header, a 403 response will be returned. If this parameter matches the <code>Origin</code> header and the origin is whitelisted, the <code>Access-Control-Allow-Origin</code> and <code>Access-Control-Allow-Credentials</code> headers will be set.\n\nFor non-authenticated requests, specify the value <kbd>*</kbd>. This will cause the <code>Access-Control-Allow-Origin</code> header to be set, but <code>Access-Control-Allow-Credentials</code> will be <code>false</code> and all user-specific data will be restricted.",
        "apihelp-main-param-uselang": "Language to use for message translations. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd> returns a list of language codes, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
+       "apihelp-main-param-errorformat": "Format to use for warning and error text output.\n; plaintext: Wikitext with HTML tags removed and entities replaced.\n; wikitext: Unparsed wikitext.\n; html: HTML.\n; raw: Message key and parameters.\n; none: No text output, only the error codes.\n; bc: Format used prior to MediaWiki 1.29. <var>errorlang</var> and <var>errorsuselocal</var> are ignored.",
+       "apihelp-main-param-errorlang": "Language to use for warnings and errors. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd> returns a list of language codes, or specify <kbd>content</kbd> to use this wiki's content language, or specify <kbd>uselang</kbd> to use the same value as the <var>uselang</var> parameter.",
+       "apihelp-main-param-errorsuselocal": "If given, error texts will use locally-customized messages from the {{ns:MediaWiki}} namespace.",
 
        "apihelp-block-description": "Block a user.",
-       "apihelp-block-param-user": "Username, IP address, or IP address range to block.",
+       "apihelp-block-param-user": "Username, IP address, or IP address range to block. Cannot be used together with <var>$1userid</var>",
+       "apihelp-block-param-userid": "User ID to block. Cannot be used together with <var>$1user</var>.",
        "apihelp-block-param-expiry": "Expiry time. May be relative (e.g. <kbd>5 months</kbd> or <kbd>2 weeks</kbd>) or absolute (e.g. <kbd>2014-09-18T12:34:56Z</kbd>). If set to <kbd>infinite</kbd>, <kbd>indefinite</kbd>, or <kbd>never</kbd>, the block will never expire.",
        "apihelp-block-param-reason": "Reason for block.",
        "apihelp-block-param-anononly": "Block anonymous users only (i.e. disable anonymous edits for this IP address).",
@@ -32,6 +37,7 @@
        "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "If the user is already blocked, overwrite the existing block.",
        "apihelp-block-param-watchuser": "Watch the user's or IP address's user and talk pages.",
+       "apihelp-block-param-tags": "Change tags to apply to the entry in the block log.",
        "apihelp-block-example-ip-simple": "Block IP address <kbd>192.0.2.5</kbd> for three days with reason <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Block user <kbd>Vandal</kbd> indefinitely with reason <kbd>Vandalism</kbd>, and prevent new account creation and email sending.",
 
 
        "apihelp-imagerotate-description": "Rotate one or more images.",
        "apihelp-imagerotate-param-rotation": "Degrees to rotate image clockwise.",
+       "apihelp-imagerotate-param-tags": "Tags to apply to the entry in the upload log.",
        "apihelp-imagerotate-example-simple": "Rotate <kbd>File:Example.png</kbd> by <kbd>90</kbd> degrees.",
        "apihelp-imagerotate-example-generator": "Rotate all images in <kbd>Category:Flip</kbd> by <kbd>180</kbd> degrees.",
 
        "apihelp-import-param-templates": "For interwiki imports: import all included templates as well.",
        "apihelp-import-param-namespace": "Import to this namespace. Cannot be used together with <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Import as subpage of this page. Cannot be used together with <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Change tags to apply to the entry in the import log and to the null revision on the imported pages.",
        "apihelp-import-example-import": "Import [[meta:Help:ParserFunctions]] to namespace 100 with full history.",
 
        "apihelp-linkaccount-description": "Link an account from a third-party provider to the current user.",
        "apihelp-managetags-param-tag": "Tag to create, delete, activate or deactivate. For tag creation, the tag must not exist. For tag deletion, the tag must exist. For tag activation, the tag must exist and not be in use by an extension. For tag deactivation, the tag must be currently active and manually defined.",
        "apihelp-managetags-param-reason": "An optional reason for creating, deleting, activating or deactivating the tag.",
        "apihelp-managetags-param-ignorewarnings": "Whether to ignore any warnings that are issued during the operation.",
+       "apihelp-managetags-param-tags": "Change tags to apply to the entry in the tag management log.",
        "apihelp-managetags-example-create": "Create a tag named <kbd>spam</kbd> with the reason <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Delete the <kbd>vandlaism</kbd> tag with the reason <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activate a tag named <kbd>spam</kbd> with the reason <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Remove the page and the redirect from the current user's watchlist.",
        "apihelp-move-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-move-param-ignorewarnings": "Ignore any warnings.",
+       "apihelp-move-param-tags": "Change tags to apply to the entry in the move log and to the null revision on the destination page.",
        "apihelp-move-example-move": "Move <kbd>Badtitle</kbd> to <kbd>Goodtitle</kbd> without leaving a redirect.",
 
        "apihelp-opensearch-description": "Search the wiki using the OpenSearch protocol.",
        "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to <kbd>all</kbd> (i.e. everyone is allowed to take the action).",
        "apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions.",
 
-       "apihelp-purge-description": "Purge the cache for the given titles.\n\nRequires a POST request if the user is not logged in.",
+       "apihelp-purge-description": "Purge the cache for the given titles.",
        "apihelp-purge-param-forcelinkupdate": "Update the links tables.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Update the links table, and update the links tables for any page that uses this page as a template.",
        "apihelp-purge-example-simple": "Purge the <kbd>Main Page</kbd> and the <kbd>API</kbd> page.",
        "apihelp-query+allmessages-param-prop": "Which properties to get.",
        "apihelp-query+allmessages-param-enableparser": "Set to enable parser, will preprocess the wikitext of message (substitute magic words, handle templates, etc.).",
        "apihelp-query+allmessages-param-nocontent": "If set, do not include the content of the messages in the output.",
-       "apihelp-query+allmessages-param-includelocal": "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.\nThis lists all MediaWiki: pages, so it will also list those that aren't really messages such as [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Also include local messages, i.e. messages that don't exist in the software but do exist as in the {{ns:MediaWiki}} namespace.\nThis lists all {{ns:MediaWiki}}-namespace pages, so it will also list those that aren't really messages such as [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Arguments to be substituted into message.",
        "apihelp-query+allmessages-param-filter": "Return only messages with names that contain this string.",
        "apihelp-query+allmessages-param-customised": "Return only messages in this customisation state.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Adds the filename of the archive version for non-latest versions.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Adds the bit depth of the version.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Adds whether the file is on the [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "How many file revisions to return per file.",
        "apihelp-query+imageinfo-param-start": "Timestamp to start listing from.",
        "apihelp-query+imageinfo-param-end": "Timestamp to stop listing at.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "If translations for extmetadata property are available, fetch all of them.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "If specified and non-empty, only these keys will be returned for $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "A handler specific parameter string. For example, PDFs might use <kbd>page15-100px</kbd>. <var>$1urlwidth</var> must be used and be consistent with <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "If <kbd>$2prop=badfile</kbd> is set, this is the page title used when evaluating the [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Look only for files in the local repository.",
        "apihelp-query+imageinfo-example-simple": "Fetch information about the current version of [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Fetch information about versions of [[:File:Test.jpg]] from 2008 and later.",
        "apihelp-query+usercontribs-param-limit": "The maximum number of contributions to return.",
        "apihelp-query+usercontribs-param-start": "The start timestamp to return from.",
        "apihelp-query+usercontribs-param-end": "The end timestamp to return to.",
-       "apihelp-query+usercontribs-param-user": "The users to retrieve contributions for.",
-       "apihelp-query+usercontribs-param-userprefix": "Retrieve contributions for all users whose names begin with this value. Overrides $1user.",
+       "apihelp-query+usercontribs-param-user": "The users to retrieve contributions for. Cannot be used with <var>$1userids</var> or <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Retrieve contributions for all users whose names begin with this value. Cannot be used with <var>$1user</var> or <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "The user IDs to retrieve contributions for. Cannot be used with <var>$1user</var> or <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Only list contributions in these namespaces.",
        "apihelp-query+usercontribs-param-prop": "Include additional pieces of information:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Adds the page ID and revision ID.",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Tags if the current user is blocked, by whom, and for what reason.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Adds a tag <samp>messages</samp> if the current user has pending messages.",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Lists all the groups the current user belongs to.",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Lists groups that the current user has been explicitly assigned to, including the expiry date of each group membership.",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lists all the groups the current user is automatically a member of.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lists all the rights the current user has.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lists the groups the current user can add to and remove from.",
        "apihelp-query+users-param-prop": "Which pieces of information to include:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Tags if the user is blocked, by whom, and for what reason.",
        "apihelp-query+users-paramvalue-prop-groups": "Lists all the groups each user belongs to.",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "Lists groups that each user has been explicitly assigned to, including the expiry date of each group membership.",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "Lists all the groups a user is automatically a member of.",
        "apihelp-query+users-paramvalue-prop-rights": "Lists all the rights each user has.",
        "apihelp-query+users-paramvalue-prop-editcount": "Adds the user's edit count.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indicates whether an account for valid but unregistered usernames can be created.",
        "apihelp-query+users-param-attachedwiki": "With <kbd>$1prop=centralids</kbd>, indicate whether the user is attached with the wiki identified by this ID.",
        "apihelp-query+users-param-users": "A list of users to obtain information for.",
+       "apihelp-query+users-param-userids": "A list of user IDs to obtain information for.",
        "apihelp-query+users-param-token": "Use <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> instead.",
        "apihelp-query+users-example-simple": "Return information for user <kbd>Example</kbd>.",
 
        "apihelp-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-param-user": "User being reset.",
        "apihelp-resetpassword-param-email": "Email address of the user being reset.",
-       "apihelp-resetpassword-param-capture": "Return the temporary passwords that were sent. Requires the <code>passwordreset</code> user right.",
        "apihelp-resetpassword-example-user": "Send a password reset email to user <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "Send a password reset email for all users with email address <kbd>user@example.com</kbd>.",
 
        "apihelp-revisiondelete-param-show": "What to unhide for each revision.",
        "apihelp-revisiondelete-param-suppress": "Whether to suppress data from administrators as well as others.",
        "apihelp-revisiondelete-param-reason": "Reason for the deletion or undeletion.",
+       "apihelp-revisiondelete-param-tags": "Tags to apply to the entry in the deletion log.",
        "apihelp-revisiondelete-example-revision": "Hide content for revision <kbd>12345</kbd> on the page <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Hide all data on log entry <kbd>67890</kbd> with the reason <kbd>BLP violation</kbd>.",
 
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Set the notification timestamp for <kbd>Main page</kbd> so all edits since 1 January 2012 are unviewed.",
        "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the <kbd>{{ns:user}}</kbd> namespace.",
 
+       "apihelp-setpagelanguage-description": "Change the language of a page.",
+       "apihelp-setpagelanguage-description-disabled": "Changing the language of a page is not allowed on this wiki.\n\nEnable <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> to use this action.",
+       "apihelp-setpagelanguage-param-title": "Title of the page whose language you wish to change. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Page ID of the page whose language you wish to change. Cannot be used together with <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Language code of the language to change the page to. Use <kbd>default</kbd> to reset the page to the wiki's default content language.",
+       "apihelp-setpagelanguage-param-reason": "Reason for the change.",
+       "apihelp-setpagelanguage-param-tags": "Change tags to apply to the log entry resulting from this action.",
+       "apihelp-setpagelanguage-example-language": "Change the language of <kbd>Main Page</kbd> to Basque.",
+       "apihelp-setpagelanguage-example-default": "Change the language of the page with ID 123 to the wiki's default content language.",
+
        "apihelp-stashedit-description": "Prepare an edit in shared cache.\n\nThis is intended to be used via AJAX from the edit form to improve the performance of the page save.",
        "apihelp-stashedit-param-title": "Title of the page being edited.",
        "apihelp-stashedit-param-section": "Section number. <kbd>0</kbd> for the top section, <kbd>new</kbd> for a new section.",
        "apihelp-tag-param-add": "Tags to add. Only manually defined tags can be added.",
        "apihelp-tag-param-remove": "Tags to remove. Only tags that are either manually defined or completely undefined can be removed.",
        "apihelp-tag-param-reason": "Reason for the change.",
+       "apihelp-tag-param-tags": "Tags to apply to the log entry that will be created as a result of this action.",
        "apihelp-tag-example-rev": "Add the <kbd>vandalism</kbd> tag to revision ID 123 without specifying a reason",
        "apihelp-tag-example-log": "Remove the <kbd>spam</kbd> tag from log entry ID 123 with the reason <kbd>Wrongly applied</kbd>",
 
        "apihelp-tokens-example-emailmove": "Retrieve an email token and a move token.",
 
        "apihelp-unblock-description": "Unblock a user.",
-       "apihelp-unblock-param-id": "ID of the block to unblock (obtained through <kbd>list=blocks</kbd>). Cannot be used together with <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Username, IP address or IP address range to unblock. Cannot be used together with <var>$1id</var>.",
+       "apihelp-unblock-param-id": "ID of the block to unblock (obtained through <kbd>list=blocks</kbd>). Cannot be used together with <var>$1user</var> or <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Username, IP address or IP address range to unblock. Cannot be used together with <var>$1id</var> or <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "User ID to unblock. Cannot be used together with <var>$1id</var> or <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Reason for unblock.",
        "apihelp-unblock-param-tags": "Change tags to apply to the entry in the block log.",
        "apihelp-unblock-example-id": "Unblock block ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Unblock user <kbd>Bob</kbd> with reason <kbd>Sorry Bob</kbd>.",
 
-       "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Title of the page to restore.",
        "apihelp-undelete-param-reason": "Reason for restoring.",
        "apihelp-undelete-param-tags": "Change tags to apply to the entry in the deletion log.",
        "apihelp-userrights-description": "Change a user's group membership.",
        "apihelp-userrights-param-user": "User name.",
        "apihelp-userrights-param-userid": "User ID.",
-       "apihelp-userrights-param-add": "Add the user to these groups.",
+       "apihelp-userrights-param-add": "Add the user to these groups, or if they are already a member, update the expiry of their membership in that group.",
+       "apihelp-userrights-param-expiry": "Expiry timestamps. May be relative (e.g. <kbd>5 months</kbd> or <kbd>2 weeks</kbd>) or absolute (e.g. <kbd>2014-09-18T12:34:56Z</kbd>). If only one timestamp is set, it will be used for all groups passed to the <var>$1add</var> parameter. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, or <kbd>never</kbd> for a never-expiring user group.",
        "apihelp-userrights-param-remove": "Remove the user from these groups.",
        "apihelp-userrights-param-reason": "Reason for the change.",
+       "apihelp-userrights-param-tags": "Change tags to apply to the entry in the user rights log.",
        "apihelp-userrights-example-user": "Add user <kbd>FooBot</kbd> to group <kbd>bot</kbd>, and remove from groups <kbd>sysop</kbd> and <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Add the user with ID <kbd>123</kbd> to group <kbd>bot</kbd>, and remove from groups <kbd>sysop</kbd> and <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "Add user <kbd>SometimeSysop</kbd> to group <kbd>sysop</kbd> for 1 month.",
+
+       "apihelp-validatepassword-description": "Validate a password against the wiki's password policies.\n\nValidity is reported as <samp>Good</samp> if the password is acceptable, <samp>Change</samp> if the password may be used for login but must be changed, or <samp>Invalid</samp> if the password is not usable.",
+       "apihelp-validatepassword-param-password": "Password to validate.",
+       "apihelp-validatepassword-param-user": "User name, for use when testing account creation. The named user must not exist.",
+       "apihelp-validatepassword-param-email": "Email address, for use when testing account creation.",
+       "apihelp-validatepassword-param-realname": "Real name, for use when testing account creation.",
+       "apihelp-validatepassword-example-1": "Validate the password <kbd>foobar</kbd> for the current user.",
+       "apihelp-validatepassword-example-2": "Validate the password <kbd>qwerty</kbd> for creating user <kbd>Example</kbd>.",
 
        "apihelp-watch-description": "Add or remove pages from the current user's watchlist.",
        "apihelp-watch-param-title": "The page to (un)watch. Use <var>$1titles</var> instead.",
        "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).",
        "apihelp-rawfm-description": "Output data, including debugging elements, in JSON format (pretty-print in HTML).",
        "apihelp-xml-description": "Output data in XML format.",
-       "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:mediawiki}} namespace ending in <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:MediaWiki}} namespace ending in <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "If specified, adds an XML namespace.",
        "apihelp-xmlfm-description": "Output data in XML format (pretty-print in HTML).",
 
        "api-help-param-upload": "Must be posted as a file upload using multipart/form-data.",
        "api-help-param-multi-separate": "Separate values with <kbd>|</kbd> or [[Special:ApiHelp/main#main/datatypes|alternative]].",
        "api-help-param-multi-max": "Maximum number of values is {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} for bots).",
+       "api-help-param-multi-all": "To specify all values, use <kbd>$1</kbd>.",
        "api-help-param-default": "Default: $1",
        "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-authmanagerhelper-continue": "This request is a continuation after an earlier <samp>UI</samp> or <samp>REDIRECT</samp> response. Either this or <var>$1returnurl</var> is required.",
        "api-help-authmanagerhelper-additional-params": "This module accepts additional parameters depending on the available authentication requests. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> with <kbd>amirequestsfor=$1</kbd> (or a previous response from this module, if applicable) to determine the requests available and the fields that they use.",
 
+       "apierror-allimages-redirect": "Use <kbd>gaifilterredir=nonredirects</kbd> instead of <var>redirects</var> when using <kbd>allimages</kbd> as a generator.",
+       "apierror-allpages-generator-redirects": "Use <kbd>gapfilterredir=nonredirects</kbd> instead of <var>redirects</var> when using <kbd>allpages</kbd> as a generator.",
+       "apierror-appendnotsupported": "Can't append to pages using content model $1.",
+       "apierror-articleexists": "The article you tried to create has been created already.",
+       "apierror-assertbotfailed": "Assertion that the user has the <code>bot</code> right failed.",
+       "apierror-assertnameduserfailed": "Assertion that the user is \"$1\" failed.",
+       "apierror-assertuserfailed": "Assertion that the user is logged in failed.",
+       "apierror-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
+       "apierror-badconfig-resulttoosmall": "The value of <code>$wgAPIMaxResultSize</code> on this wiki is too small to hold basic result information.",
+       "apierror-badcontinue": "Invalid continue param. You should pass the original value returned by the previous query.",
+       "apierror-baddiff": "The diff cannot be retrieved. One or both revisions do not exist or you do not have permission to view them.",
+       "apierror-baddiffto": "<var>$1diffto</var> must be set to a non-negative number, <kbd>prev</kbd>, <kbd>next</kbd> or <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "The requested format $1 is not supported for content model $2.",
+       "apierror-badformat": "The requested format $1 is not supported for content model $2 used by $3.",
+       "apierror-badgenerator-notgenerator": "Module <kbd>$1</kbd> cannot be used as a generator.",
+       "apierror-badgenerator-unknown": "Unknown <kbd>generator=$1</kbd>.",
+       "apierror-badip": "IP parameter is not valid.",
+       "apierror-badmd5": "The supplied MD5 hash was incorrect.",
+       "apierror-badmodule-badsubmodule": "The module <kbd>$1</kbd> does not have a submodule \"$2\".",
+       "apierror-badmodule-nosubmodules": "The module <kbd>$1</kbd> has no submodules.",
+       "apierror-badparameter": "Invalid value for parameter <var>$1</var>.",
+       "apierror-badquery": "Invalid query.",
+       "apierror-badtimestamp": "Invalid value \"$2\" for timestamp parameter <var>$1</var>.",
+       "apierror-badtoken": "Invalid CSRF token.",
+       "apierror-badupload": "File upload parameter <var>$1</var> is not a file upload; be sure to use <code>multipart/form-data</code> for your POST and include a filename in the <code>Content-Disposition</code> header.",
+       "apierror-badurl": "Invalid value \"$2\" for URL parameter <var>$1</var>.",
+       "apierror-baduser": "Invalid value \"$2\" for user parameter <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "U+001F multi-value separation may only be used for multi-valued parameters.",
+       "apierror-bad-watchlist-token": "Incorrect watchlist token provided. Please set a correct token in [[Special:Preferences]].",
+       "apierror-blockedfrommail": "You have been blocked from sending email.",
+       "apierror-blocked": "You have been blocked from editing.",
+       "apierror-botsnotsupported": "This interface is not supported for bots.",
+       "apierror-cannot-async-upload-file": "The parameters <var>async</var> and <var>file</var> cannot be combined. If you want asynchronous processing of your uploaded file, first upload it to stash (using the <var>stash</var> parameter) and then publish the stashed file asynchronously (using <var>filekey</var> and <var>async</var>).",
+       "apierror-cannotreauthenticate": "This action is not available as your identity cannot be verified.",
+       "apierror-cannotviewtitle": "You are not allowed to view $1.",
+       "apierror-cantblock-email": "You don't have permission to block users from sending email through the wiki.",
+       "apierror-cantblock": "You don't have permission to block users.",
+       "apierror-cantchangecontentmodel": "You don't have permission to change the content model of a page.",
+       "apierror-canthide": "You don't have permission to hide user names from the block log.",
+       "apierror-cantimport-upload": "You don't have permission to import uploaded pages.",
+       "apierror-cantimport": "You don't have permission to import pages.",
+       "apierror-cantoverwrite-sharedfile": "The target file exists on a shared repository and you do not have permission to override it.",
+       "apierror-cantsend": "You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email.",
+       "apierror-cantundelete": "Couldn't undelete: the requested revisions may not exist, or may have been undeleted already.",
+       "apierror-changeauth-norequest": "Failed to create change request.",
+       "apierror-chunk-too-small": "Minimum chunk size is $1 {{PLURAL:$1|byte|bytes}} for non-final chunks.",
+       "apierror-cidrtoobroad": "$1 CIDR ranges broader than /$2 are not accepted.",
+       "apierror-compare-inputneeded": "A title, a page ID, or a revision number is needed for both the <var>from</var> and the <var>to</var> parameters.",
+       "apierror-contentserializationexception": "Content serialization failed: $1",
+       "apierror-contenttoobig": "The content you supplied exceeds the article size limit of $1 {{PLURAL:$1|kilobyte|kilobytes}}.",
+       "apierror-copyuploadbaddomain": "Uploads by URL are not allowed from this domain.",
+       "apierror-copyuploadbadurl": "Upload not allowed from this URL.",
+       "apierror-create-titleexists": "Existing titles can't be protected with <kbd>create</kbd>.",
+       "apierror-csp-report": "Error processing CSP report: $1.",
+       "apierror-databaseerror": "[$1] Database query error.",
+       "apierror-deletedrevs-param-not-1-2": "The <var>$1</var> parameter cannot be used in modes 1 or 2.",
+       "apierror-deletedrevs-param-not-3": "The <var>$1</var> parameter cannot be used in mode 3.",
+       "apierror-emptynewsection": "Creating empty new sections is not possible.",
+       "apierror-emptypage": "Creating new, empty pages is not allowed.",
+       "apierror-exceptioncaught": "[$1] Exception caught: $2",
+       "apierror-filedoesnotexist": "File does not exist.",
+       "apierror-fileexists-sharedrepo-perm": "The target file exists on a shared repository. Use the <var>ignorewarnings</var> parameter to override it.",
+       "apierror-filenopath": "Cannot get local file path.",
+       "apierror-filetypecannotberotated": "File type cannot be rotated.",
+       "apierror-formatphp": "This response cannot be represented using <kbd>format=php</kbd>. See https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "The title for <kbd>$1</kbd> must be a file.",
+       "apierror-import-unknownerror": "Unknown error on import: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> may not be over $2 (set to $3) for bots or sysops.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> may not be over $2 (set to $3) for users.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> may not be less than $2 (set to $3).",
+       "apierror-invalidcategory": "The category name you entered is not valid.",
+       "apierror-invalid-chunk": "Offset plus current chunk is greater than claimed file size.",
+       "apierror-invalidexpiry": "Invalid expiry time \"$1\".",
+       "apierror-invalid-file-key": "Not a valid file key.",
+       "apierror-invalidlang": "Invalid language code for parameter <var>$1</var>.",
+       "apierror-invalidoldimage": "The oldimage parameter has invalid format.",
+       "apierror-invalidparammix-cannotusewith": "The <kbd>$1</kbd> parameter cannot be used with <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "The <kbd>$1</kbd> parameter may only be used with <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> cannot be combined with the <var>oldid</var>, <var>pageid</var> or <var>page</var> parameters. Please use <var>title</var> and <var>text</var>.",
+       "apierror-invalidparammix": "The {{PLURAL:$2|parameters}} $1 can not be used together.",
+       "apierror-invalidsection": "The section parameter must be a valid section ID or <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "The SHA1Base36 hash provided is not valid.",
+       "apierror-invalidsha1hash": "The SHA1 hash provided is not valid.",
+       "apierror-invalidtitle": "Bad title \"$1\".",
+       "apierror-invalidurlparam": "Invalid value for <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Invalid username \"$1\".",
+       "apierror-invaliduserid": "User ID <var>$1</var> is not valid.",
+       "apierror-maxlag-generic": "Waiting for a database server: $1 {{PLURAL:$1|second|seconds}} lagged.",
+       "apierror-maxlag": "Waiting for $2: $1 {{PLURAL:$1|second|seconds}} lagged.",
+       "apierror-mimesearchdisabled": "MIME search is disabled in Miser Mode.",
+       "apierror-missingcontent-pageid": "Missing content for page ID $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|The parameter|At least one of the parameters}} $1 is required.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|The parameter|One of the parameters}} $1 is required.",
+       "apierror-missingparam": "The <var>$1</var> parameter must be set.",
+       "apierror-missingrev-pageid": "No current revision of page ID $1.",
+       "apierror-missingtitle-createonly": "Missing titles can only be protected with <kbd>create</kbd>.",
+       "apierror-missingtitle": "The page you specified doesn't exist.",
+       "apierror-missingtitle-byname": "The page $1 doesn't exist.",
+       "apierror-moduledisabled": "The <kbd>$1</kbd> module has been disabled.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Only|Only one of}} $2 is allowed for parameter <var>$1</var>.",
+       "apierror-multival-only-one": "Only one value is allowed for parameter <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> may only be used with a single page.",
+       "apierror-mustbeloggedin-changeauth": "You must be logged in to change authentication data.",
+       "apierror-mustbeloggedin-generic": "You must be logged in.",
+       "apierror-mustbeloggedin-linkaccounts": "You must be logged in to link accounts.",
+       "apierror-mustbeloggedin-removeauth": "You must be logged in to remove authentication data.",
+       "apierror-mustbeloggedin-uploadstash": "The upload stash is only available to logged-in users.",
+       "apierror-mustbeloggedin": "You must be logged in to $1.",
+       "apierror-mustbeposted": "The <kbd>$1</kbd> module requires a POST request.",
+       "apierror-mustpostparams": "The following {{PLURAL:$2|parameter was|parameters were}} found in the query string, but must be in the POST body: $1.",
+       "apierror-noapiwrite": "Editing of this wiki through the API is disabled. Make sure the <code>$wgEnableWriteAPI=true;</code> statement is included in the wiki's <code>LocalSettings.php</code> file.",
+       "apierror-nochanges": "No changes were requested.",
+       "apierror-nodeleteablefile": "No such old version of the file.",
+       "apierror-no-direct-editing": "Direct editing via API is not supported for content model $1 used by $2.",
+       "apierror-noedit-anon": "Anonymous users can't edit pages.",
+       "apierror-noedit": "You don't have permission to edit pages.",
+       "apierror-noimageredirect-anon": "Anonymous users can't create image redirects.",
+       "apierror-noimageredirect": "You don't have permission to create image redirects.",
+       "apierror-nosuchlogid": "There is no log entry with ID $1.",
+       "apierror-nosuchpageid": "There is no page with ID $1.",
+       "apierror-nosuchrcid": "There is no recent change with ID $1.",
+       "apierror-nosuchrevid": "There is no revision with ID $1.",
+       "apierror-nosuchsection": "There is no section $1.",
+       "apierror-nosuchsection-what": "There is no section $1 in $2.",
+       "apierror-nosuchuserid": "There is no user with ID $1.",
+       "apierror-notarget": "You have not specified a valid target for this action.",
+       "apierror-notpatrollable": "The revision r$1 can't be patrolled as it's too old.",
+       "apierror-nouploadmodule": "No upload module set.",
+       "apierror-opensearch-json-warnings": "Warnings cannot be represented in OpenSearch JSON format.",
+       "apierror-pagecannotexist": "Namespace doesn't allow actual pages.",
+       "apierror-pagedeleted": "The page has been deleted since you fetched its timestamp.",
+       "apierror-pagelang-disabled": "Changing the language of a page is not allowed on this wiki.",
+       "apierror-paramempty": "The parameter <var>$1</var> may not be empty.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> is only supported for wikitext content.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> is only supported for wikitext content. $1 uses content model $2.",
+       "apierror-pastexpiry": "Expiry time \"$1\" is in the past.",
+       "apierror-permissiondenied": "You don't have permission to $1.",
+       "apierror-permissiondenied-generic": "Permission denied.",
+       "apierror-permissiondenied-patrolflag": "You need the <code>patrol</code> or <code>patrolmarks</code> right to request the patrolled flag.",
+       "apierror-permissiondenied-unblock": "You don't have permission to unblock users.",
+       "apierror-prefixsearchdisabled": "Prefix search is disabled in Miser Mode.",
+       "apierror-promised-nonwrite-api": "The <code>Promise-Non-Write-API-Action</code> HTTP header cannot be sent to write-mode API modules.",
+       "apierror-protect-invalidaction": "Invalid protection type \"$1\".",
+       "apierror-protect-invalidlevel": "Invalid protection level \"$1\".",
+       "apierror-ratelimited": "You've exceeded your rate limit. Please wait some time and try again.",
+       "apierror-readapidenied": "You need read permission to use this module.",
+       "apierror-readonly": "The wiki is currently in read-only mode.",
+       "apierror-reauthenticate": "You have not authenticated recently in this session, please reauthenticate.",
+       "apierror-redirect-appendonly": "You have attempted to edit using the redirect-following mode, which must be used in conjuction with <kbd>section=new</kbd>, <var>prependtext</var>, or <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "The same field cannot be used in both <var>hide</var> and <var>show</var>.",
+       "apierror-revdel-needtarget": "A target title is required for this RevDel type.",
+       "apierror-revdel-paramneeded": "At least one value is required for <var>hide</var> and/or <var>show</var>.",
+       "apierror-revisions-norevids": "The <var>revids</var> parameter may not be used with the list options (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, and <var>$1end</var>).",
+       "apierror-revisions-singlepage": "<var>titles</var>, <var>pageids</var> or a generator was used to supply multiple pages, but the <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, and <var>$1end</var> parameters may only be used on a single page.",
+       "apierror-revwrongpage": "r$1 is not a revision of $2.",
+       "apierror-searchdisabled": "<var>$1</var> search is disabled.",
+       "apierror-sectionreplacefailed": "Could not merge updated section.",
+       "apierror-sectionsnotsupported": "Sections are not supported for content model $1.",
+       "apierror-sectionsnotsupported-what": "Sections are not supported by $1.",
+       "apierror-show": "Incorrect parameter - mutually exclusive values may not be supplied.",
+       "apierror-siteinfo-includealldenied": "Cannot view all servers' info unless <var>$wgShowHostNames</var> is true.",
+       "apierror-sizediffdisabled": "Size difference is disabled in Miser Mode.",
+       "apierror-spamdetected": "Your edit was refused because it contained a spam fragment: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "You don't have permission to view the results of this special page.",
+       "apierror-stashedfilenotfound": "Could not find the file in the stash: $1.",
+       "apierror-stashedit-missingtext": "No stashed text found with the given hash.",
+       "apierror-stashexception": "$1",
+       "apierror-stashfailed-complete": "Chunked upload is already completed, check status for details.",
+       "apierror-stashfailed-nosession": "No chunked upload session with this key.",
+       "apierror-stashfilestorage": "Could not store upload in the stash: $1",
+       "apierror-stashinvalidfile": "Invalid stashed file.",
+       "apierror-stashnosuchfilekey": "No such filekey: $1.",
+       "apierror-stashpathinvalid": "File key of improper format or otherwise invalid: $1.",
+       "apierror-stashwrongowner": "Wrong owner: $1",
+       "apierror-stashzerolength": "File is of zero length, and could not be stored in the stash: $1.",
+       "apierror-systemblocked": "You have been blocked automatically by MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "Template expansion is only supported for wikitext content. $1 uses content model $2.",
+       "apierror-toofewexpiries": "$1 expiry {{PLURAL:$1|timestamp was|timestamps were}} provided where $2 {{PLURAL:$2|was|were}} needed.",
+       "apierror-unknownaction": "The action specified, <kbd>$1</kbd>, is not recognized.",
+       "apierror-unknownerror-editpage": "Unknown EditPage error: $1.",
+       "apierror-unknownerror-nocode": "Unknown error.",
+       "apierror-unknownerror": "Unknown error: \"$1\".",
+       "apierror-unknownformat": "Unrecognized format \"$1\".",
+       "apierror-unrecognizedparams": "Unrecognized {{PLURAL:$2|parameter|parameters}}: $1.",
+       "apierror-unrecognizedvalue": "Unrecognized value for parameter <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "Local file repository does not support querying all images.",
+       "apierror-upload-filekeyneeded": "Must supply a <var>filekey</var> when <var>offset</var> is non-zero.",
+       "apierror-upload-filekeynotallowed": "Cannot supply a <var>filekey</var> when <var>offset</var> is 0.",
+       "apierror-upload-inprogress": "Upload from stash already in progress.",
+       "apierror-upload-missingresult": "No result in status data.",
+       "apierror-urlparamnormal": "Could not normalize image parameters for $1.",
+       "apierror-writeapidenied": "You're not allowed to edit this wiki through the API.",
+
+       "apiwarn-alldeletedrevisions-performance": "For better performance when generating titles, set <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "Could not parse <var>$1urlparam</var> for $2. Using only width and height.",
+       "apiwarn-badutf8": "The value passed for <var>$1</var> contains invalid or non-normalized data. Textual data should be valid, NFC-normalized Unicode without C0 control characters other than HT (\\t), LF (\\n), and CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "Check that symbols such as \"+\" in the token are properly percent-encoded in the URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> has been deprecated. Please use <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> instead.",
+       "apiwarn-deprecation-expandtemplates-prop": "Because no values have been specified for the <var>prop</var> parameter, a legacy format has been used for the output. This format is deprecated, and in the future, a default value will be set for the <var>prop</var> parameter, causing the new format to always be used.",
+       "apiwarn-deprecation-httpsexpected": "HTTP used when HTTPS was expected.",
+       "apiwarn-deprecation-login-botpw": "Main-account login via <kbd>action=login</kbd> is deprecated and may stop working without warning. To continue login with <kbd>action=login</kbd>, see [[Special:BotPasswords]]. To safely continue using main-account login, see <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "Main-account login via <kbd>action=login</kbd> is deprecated and may stop working without warning. To safely log in, see <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "Fetching a token via <kbd>action=login</kbd> is deprecated. Use <kbd>action=query&meta=tokens&type=login</kbd> instead.",
+       "apiwarn-deprecation-parameter": "The parameter <var>$1</var> has been deprecated.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> is deprecated since MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> when creating new HTML documents, or <kbd>prop=modules|jsconfigvars</kbd> when updating a document client-side.",
+       "apiwarn-deprecation-purge-get": "Use of <kbd>action=purge</kbd> via GET is deprecated. Use POST instead.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> has been deprecated. Please use <kbd>$2</kbd> instead.",
+       "apiwarn-difftohidden": "Couldn't diff to r$1: content is hidden.",
+       "apiwarn-errorprinterfailed": "Error printer failed. Will retry without params.",
+       "apiwarn-errorprinterfailed-ex": "Error printer failed (will retry without params): $1",
+       "apiwarn-invalidcategory": "\"$1\" is not a category.",
+       "apiwarn-invalidtitle": "\"$1\" is not a valid title.",
+       "apiwarn-invalidxmlstylesheetext": "Stylesheet should have <code>.xsl</code> extension.",
+       "apiwarn-invalidxmlstylesheet": "Invalid or non-existent stylesheet specified.",
+       "apiwarn-invalidxmlstylesheetns": "Stylesheet should be in the {{ns:MediaWiki}} namespace.",
+       "apiwarn-moduleswithoutvars": "Property <kbd>modules</kbd> was set but not <kbd>jsconfigvars</kbd> or <kbd>encodedjsconfigvars</kbd>. Configuration variables are necessary for proper module usage.",
+       "apiwarn-notfile": "\"$1\" is not a file.",
+       "apiwarn-nothumb-noimagehandler": "Could not create thumbnail because $1 does not have an associated image handler.",
+       "apiwarn-parse-nocontentmodel": "No <var>title</var> or <var>contentmodel</var> was given, assuming $1.",
+       "apiwarn-parse-titlewithouttext": "<var>title</var> used without <var>text</var>, and parsed page properties were requested. Did you mean to use <var>page</var> instead of <var>title</var>?",
+       "apiwarn-redirectsandrevids": "Redirect resolution cannot be used together with the <var>revids</var> parameter. Any redirects the <var>revids</var> point to have not been resolved.",
+       "apiwarn-tokennotallowed": "Action \"$1\" is not allowed for the current user.",
+       "apiwarn-tokens-origin": "Tokens may not be obtained when the same-origin policy is not applied.",
+       "apiwarn-toomanyvalues": "Too many values supplied for parameter <var>$1</var>: the limit is $2.",
+       "apiwarn-truncatedresult": "This result was truncated because it would otherwise be larger than the limit of $1 bytes.",
+       "apiwarn-unclearnowtimestamp": "Passing \"$2\" for timestamp parameter <var>$1</var> has been deprecated. If for some reason you need to explicitly specify the current time without calculating it client-side, use <kbd>now</kbd>.",
+       "apiwarn-unrecognizedvalues": "Unrecognized {{PLURAL:$3|value|values}} for parameter <var>$1</var>: $2.",
+       "apiwarn-unsupportedarray": "Parameter <var>$1</var> uses unsupported PHP array syntax.",
+       "apiwarn-urlparamwidth": "Ignoring width value set in <var>$1urlparam</var> ($2) in favor of width value derived from <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
+       "apiwarn-validationfailed-badchars": "invalid characters in key (only <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code>, and <code>-</code> are allowed).",
+       "apiwarn-validationfailed-badpref": "not a valid preference.",
+       "apiwarn-validationfailed-cannotset": "cannot be set by this module.",
+       "apiwarn-validationfailed-keytoolong": "key too long (no more than $1 bytes allowed).",
+       "apiwarn-validationfailed": "Validation error for <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Security Warning</strong>: <var>$wgDebugAPI</var> is enabled.",
+
+       "api-feed-error-title": "Error ($1)",
+       "api-usage-docref": "See $1 for API usage.",
+       "api-usage-mailinglist-ref": "Subscribe to the mediawiki-api-announce mailing list at &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; for notice of API deprecations and breaking changes.",
+       "api-exception-trace": "$1 at $2($3)\n$4",
        "api-credits-header": "Credits",
        "api-credits": "API developers:\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (lead developer 2013–present)\n\nPlease send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org\nor file a bug report at https://phabricator.wikimedia.org/."
 }
index 1078a6d..fd22eb2 100644 (file)
@@ -26,7 +26,8 @@
                        "Irus",
                        "Hamilton Abreu",
                        "Pompilos",
-                       "Igv"
+                       "Igv",
+                       "Fortega"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correo]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página deberían funcionar, pero la API aún se encuentra en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía una cabecera HTTP con la clave \"MediaWiki-API-Error\". El valor de la cabecera y el código de error devuelto tomarán el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\n<strong>Pruebas:</strong> para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].",
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
+       "apihelp-main-param-responselanginfo": "Incluye los idiomas utilizados para <var>uselang</var> y <var>errorlang</var> en el resultado.",
        "apihelp-main-param-origin": "Cuando se accede a la API usando una petición AJAX de distinto dominio (CORS), se establece este valor al dominio de origen. Debe ser incluido en cualquier petición pre-vuelo, y por lo tanto debe ser parte de la URI de la petición (no del cuerpo POST).\n\nEn las peticiones con autenticación, debe coincidir exactamente con uno de los orígenes de la cabecera <code>Origin</code>, por lo que debería ser algo como <kbd>https://en.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si este parámetro no coincide con la cabecera <code>Origin</code>, se devolverá una respuesta 403. Si este parámetro coincide con la cabecera <code>Origin</code> y el origen está en la lista blanca, se creará una cabecera <code>Access-Control-Allow-Origin</code>.\n\nEn las peticiones sin autenticación, introduce el valor <kbd>*</kbd>. Esto creará una cabecera <code>Access-Control-Allow-Origin</code>, pero el valor de <code>Access-Control-Allow-Credentials</code> será <code>false</code> y todos los datos que dependan del usuario estarán restringidos.",
        "apihelp-main-param-uselang": "El idioma que se utilizará para las traducciones de mensajes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devuelve una lista de códigos de idiomas. También puedes introducir <kbd>user</kbd> para usar la preferencia de idioma del usuario actual, o <kbd>content</kbd> para usar el idioma de contenido de este wiki.",
+       "apihelp-main-param-errorformat": "Formato utilizado para la salida de texto de avisos y errores.\n; plaintext: Wikitexto en el que se han eliminado las etiquetas HTML y reemplazado las entidades.\n; wikitext: Wikitexto sin analizar.\n; html: HTML.\n; raw: Clave del mensaje y parámetros.\n; none: Ninguna salida de texto, solo códigos de error.\n; bc: Formato empleado en versiones de MediaWiki anteriores a la 1.29. No se tienen en cuenta <var>errorlang</var> y <var>errorsuselocal</var>.",
+       "apihelp-main-param-errorlang": "Idioma empleado para advertencias y errores. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devuelve una lista de códigos de idioma. Puedes especificar <kbd>content</kbd> para utilizar el idioma del contenido de este wiki o <kbd>uselang</kbd> para utilizar el valor del parámetro <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Si se da, los textos de error emplearán mensajes localmente personalizados del espacio de nombres {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquear a un usuario.",
-       "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
+       "apihelp-block-param-user": "Nombre de usuario, dirección IP o intervalo de IP que quieres bloquear. No se puede utilizar junto con <var>$1userid</var>",
+       "apihelp-block-param-userid": "ID de usuario para bloquear. No se puede utilizar junto con <var>$1user</var>.",
        "apihelp-block-param-expiry": "Fecha de expiración. Puede ser relativa (por ejemplo, <kbd>5 months</kbd> o <kbd>2 weeks</kbd>) o absoluta (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si se establece en <kbd>infinite</kbd>, <kbd>indefinite</kbd>, o <kbd>never</kbd>, el bloqueo será permanente.",
        "apihelp-block-param-reason": "Razón para el bloqueo.",
        "apihelp-block-param-anononly": "Bloquear solo usuarios anónimos (es decir, desactivar ediciones anónimas de esta dirección IP).",
@@ -54,6 +60,7 @@
        "apihelp-block-param-allowusertalk": "Permitir que el usuario edite su propia página de discusión (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Si la cuenta ya está bloqueada, sobrescribir el bloqueo existente.",
        "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.",
+       "apihelp-block-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de bloqueos.",
        "apihelp-block-example-ip-simple": "Bloquear la dirección IP <kbd>192.0.2.5</kbd> durante 3 días por el motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear al usuario <kbd>Vandal</kbd> indefinidamente con el motivo <kbd>Vandalism</kbd> y evitar que se cree nuevas cuentas o envíe correos.",
        "apihelp-changeauthenticationdata-description": "Cambiar los datos de autentificación para el usuario actual.",
@@ -67,6 +74,7 @@
        "apihelp-clearhasmsg-example-1": "Limpiar la marca <code>hasmsg</code> del usuario actual.",
        "apihelp-clientlogin-description": "Entrar en wiki usando el flujo interactivo.",
        "apihelp-clientlogin-example-login": "Comenzar el proceso para iniciar sesión en el wiki como usuario <kbd>Example</kbd> con la contraseña <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuar el inicio de sesión después de una respuesta de la <samp>UI</samp> a la autenticación de dos pasos, en la que devuelve un <var>OATHToken</var> de <kbd>987654</kbd>.",
        "apihelp-compare-description": "Obtener la diferencia entre 2 páginas.\n\nSe debe pasar un número de revisión, un título de página o una ID tanto desde \"de\" hasta \"a\".",
        "apihelp-compare-param-fromtitle": "Primer título para comparar",
        "apihelp-compare-param-fromid": "ID de la primera página a comparar.",
@@ -76,6 +84,8 @@
        "apihelp-compare-param-torev": "Segunda revisión para comparar.",
        "apihelp-compare-example-1": "Crear una diferencia entre las revisiones 1 y 2.",
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
+       "apihelp-createaccount-param-preservestate": "Si <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> devolvió true (verdadero) para <samp>hasprimarypreservedstate</samp>, deberían omitirse las peticiones marcadas como <samp>primary-required</samp>. Si devolvió un valor no vacío para <samp>preservedusername</samp>, se debe usar ese nombre de usuario en el parámetro <var>username</var>.",
+       "apihelp-createaccount-example-create": "Empezar el proceso de creación del usuario <kbd>Example</kbd> con la contraseña <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Nombre de usuario.",
        "apihelp-createaccount-param-password": "Contraseña (ignorada si está establecido <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Dominio de autenticación externa (opcional).",
        "apihelp-expandtemplates-paramvalue-prop-properties": "Propiedades de página definidas por palabras mágicas en el wikitexto.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Si la salida es volátil y no debe ser reutilizada en otro lugar dentro de la página.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "El tiempo máximo tras el cual deberían invalidarse los resultados en caché.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Todos los módulos ResourceLoader que las funciones del analizador sintáctico hayan solicitado añadir a la salida. Debe solicitarse <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> junto con <kbd>modules</kbd>.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Da las variables de configuración JavaScript específicas para la página.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Da las variables de configuración JavaScript específicas para la página como una cadena JSON.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "El árbol XML analiza el árbol de la entrada.",
        "apihelp-help-example-query": "Ayuda para dos submódulos de consulta.",
        "apihelp-imagerotate-description": "Girar una o más imágenes.",
        "apihelp-imagerotate-param-rotation": "Grados que rotar una imagen en sentido horario.",
+       "apihelp-imagerotate-param-tags": "Etiquetas que añadir a la entrada en el registro de subidas.",
        "apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> grados.",
        "apihelp-imagerotate-example-generator": "Rotar todas las imágenes en <kbd>Category:Flip</kbd> <kbd>180</kbd> grados.",
        "apihelp-import-description": "Importar una página desde otra wiki, o desde un archivo XML.\n\nTenga en cuenta que el HTTP POST debe hacerse como una carga de archivos (es decir, el uso de multipart/form-data) al enviar un archivo para el parámetro <var>xml</var>.",
        "apihelp-import-param-templates": "Para importaciones interwiki: importar también todas las plantillas incluidas.",
        "apihelp-import-param-namespace": "Importar a este espacio de nombres. No puede usarse simultáneamente con <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpágina de esta página. No puede usarse simultáneamente con <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de importaciones y a la revisión nula de las páginas importadas.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] al espacio de nombres 100 con todo el historial.",
        "apihelp-linkaccount-description": "Vincular una cuenta de un proveedor de terceros para el usuario actual.",
        "apihelp-linkaccount-example-link": "Iniciar el proceso de vincular a una cuenta de <kbd>Ejemplo</kbd>.",
        "apihelp-managetags-param-tag": "Etiqueta para crear, eliminar, activar o desactivar. Para crear una etiqueta, esta debe no existir. Para eliminarla, debe existir. Para activarla, debe existir y no estar en uso por ninguna extensión. Para desactivarla, debe estar activada y definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, eliminar, activar o desactivar la etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Ya sea para ignorar las advertencias que se emiten durante la operación.",
+       "apihelp-managetags-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de administración de etiquetas.",
        "apihelp-managetags-example-create": "Crear una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Eliminar la etiqueta <kbd>vandlaism</kbd> con el motivo <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Eliminar la página y la redirección de la lista de seguimiento del usuario.",
        "apihelp-move-param-watchlist": "Incondicionalmente puede añadir o eliminar la página de lista del usuario actual, utilizar referencias o no cambiar el reloj.",
        "apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.",
+       "apihelp-move-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de traslados y en la revisión nula de la página de destino.",
        "apihelp-move-example-move": "Trasladar <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sin dejar una redirección.",
        "apihelp-opensearch-description": "Buscar en el wiki mediante el protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Buscar cadena.",
        "apihelp-options-description": "Cambiar preferencias del usuario actual.\n\nSolo se pueden establecer opciones que estén registradas en el núcleo o en una de las extensiones instaladas u opciones con claves predefinidas con <code>userjs-</code> (diseñadas para utilizarse con scripts de usuario).",
        "apihelp-options-param-reset": "Restablece las preferencias de la página web a sus valores predeterminados.",
        "apihelp-options-param-resetkinds": "Lista de tipos de opciones a restablecer cuando la opción <var>$1reset</var> esté establecida.",
-       "apihelp-options-param-change": "Lista de cambios con el formato name=value (por ejemplo: skin=vector). El valor no puede contener caracteres de barras verticales. Si no se da ningún valor (ni siquiera un signo de igual), por ejemplo: optionname|otheroption|..., la opción se restablecerá a sus valores predeterminados.",
+       "apihelp-options-param-change": "Lista de cambios con el formato nombre=valor (por ejemplo: skin=vector). Si no se da ningún valor (ni siquiera un signo de igual), por ejemplo: optionname|otheroption|..., la opción se restablecerá a sus valores predeterminados. Si algún valor contiene el carácter tubería (<kbd>|</kbd>), se debe utilizar el [[Special:ApiHelp/main#main/datatypes|separador alternativo de múltiples valores]] para que las operaciones se realicen correctamente.",
        "apihelp-options-param-optionname": "El nombre de la opción que debe establecerse en el valor dado por <var>$1optionvalue</var>.",
        "apihelp-options-param-optionvalue": "El valor de la opción especificada por <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Restablecer todas las preferencias",
        "apihelp-options-example-change": "Cambiar las preferencias <kbd>skin</kbd> y <kbd>hideminor</kbd>.",
        "apihelp-options-example-complex": "Restablecer todas las preferencias y establecer <kbd>skin</kbd> y <kbd>nickname</kbd>.",
        "apihelp-paraminfo-description": "Obtener información acerca de los módulos de la API.",
-       "apihelp-paraminfo-param-modules": "Lista de los nombres de los módulos (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar los submódulos con un <kbd>+</kbd>.",
+       "apihelp-paraminfo-param-modules": "Lista de los nombres de los módulos (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar submódulos con un <kbd>+</kbd>, todos los submódulos con <kbd>+*</kbd> o todos los submódulos recursivamente con <kbd>+**</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Formato de las cadenas de ayuda.",
        "apihelp-paraminfo-param-querymodules": "Lista de los nombres de los módulos de consulta (valor de los parámetros <var>prop</var>, <var>meta</var> or <var>list</var>). Utiliza <kbd>$1modules=query+foo</kbd> en vez de <kbd>$1querymodules=foo</kbd>.",
        "apihelp-paraminfo-param-mainmodule": "Obtener también información sobre el módulo principal (primer nivel). Utilizar <kbd>$1modules=main</kbd> en su lugar.",
        "apihelp-paraminfo-param-pagesetmodule": "Obtener también información sobre el módulo PageSet (Proporcionar títulos= y amigos).",
        "apihelp-paraminfo-param-formatmodules": "Lista de los nombres del formato de los módulos (valor del parámetro <var>format</var>). Utiliza <var>$1modules</var> en su lugar.",
        "apihelp-paraminfo-example-1": "Mostrar información para <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> y <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
+       "apihelp-paraminfo-example-2": "Mostrar información para todos los submódulos de <kbd>[[Special:ApiHelp/query|action=query]]</kbd>.",
+       "apihelp-parse-description": "Analiza el contenido y devuelve la salida del analizador sintáctico.\n\nVéanse los distintos módulos prop de <kbd>[[Special:ApiHelp/query|action=query]]</kbd> para obtener información de la versión actual de una página.\n\nHay varias maneras de especificar el texto que analizar:\n# Especificar una página o revisión, mediante <var>$1page</var>, <var>$1pageid</var> o <var>$1oldid</var>.\n# Especificar explícitamente el contenido, mediante <var>$1text</var>, <var>$1title</var> y <var>$1contentmodel</var>.\n# Especificar solamente un resumen que analizar. Se debería asignar a <var>$1prop</var> un valor vacío.",
        "apihelp-parse-param-title": "Título de la página a la que pertenece el texto. Si se omite se debe especificar <var>$1contentmodel</var> y se debe utilizar el [[API]] como título.",
        "apihelp-parse-param-text": "Texto a analizar. Utiliza <var>$1title</var> or <var>$1contentmodel</var> para controlar el modelo del contenido.",
        "apihelp-parse-param-summary": "Resumen a analizar.",
        "apihelp-parse-paramvalue-prop-sections": "Da las secciones del wikitexto analizado.",
        "apihelp-parse-paramvalue-prop-revid": "Añade la ID de revisión de la página analizada.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Añade el título del wikitexto analizado.",
-       "apihelp-parse-paramvalue-prop-headitems": "Da elementos para colocar en el <code>&lt;encabezado&gt;</code> de la página.",
+       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Proporciona elementos para colocar en el <code>&lt;head&gt;</code> de la página.",
        "apihelp-parse-paramvalue-prop-headhtml": "Da el <code>&lt;encabezado&gt;</code> analizado de la página.",
-       "apihelp-parse-paramvalue-prop-modules": "Da los módulos de ResourceLoader utilizados en la página. <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> deben solicitarse en conjunto con <kbd>modules</kbd>.",
-       "apihelp-parse-paramvalue-prop-jsconfigvars": "Da la configuración JavaScript de variables específica para la página.",
+       "apihelp-parse-paramvalue-prop-modules": "Proporciona los módulos de ResourceLoader utilizados en la página. Para cargar, utiliza <code>mw.loader.using()</code>. <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> deben solicitarse en conjunto con <kbd>modules</kbd>.",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "Proporciona las variables de configuración de JavaScript específicas de la página. Para obtenerlas, utiliza <code>mw.config.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Da la configuración JavaScript de variables específica para la página como cadena JSON.",
        "apihelp-parse-paramvalue-prop-indicators": "Da el HTML de los indicadores de estado utilizados en la página.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Da los enlaces interwiki del texto analizado.",
        "apihelp-parse-param-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-section": "Analizar solo el contenido de este número de sección.\n\nSi el valor es <kbd>new</kbd>, analiza <var>$1text</var> y <var>$1sectiontitle</var> como si se añadiera una nueva sección a la página.\n\n<kbd>new</kbd> solo se permite cuando se especifique <var>text</var>.",
+       "apihelp-parse-param-sectiontitle": "Nuevo título de sección cuando <var>section</var> tiene el valor <kbd>new</kbd>.\n\nAl contrario que en la edición de páginas, no se sustituye por <var>summary</var> cuando se omite o su valor es vacío.",
        "apihelp-parse-param-disablelimitreport": "Omitir el informe de límite (\"NewPP limit report\") desde la salida del analizador.",
        "apihelp-parse-param-disablepp": "Usa <var>$1disablelimitreport</var> en su lugar.",
        "apihelp-parse-param-disableeditsection": "Omitir los enlaces de edición de sección de la salida del analizador.",
        "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).",
        "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.",
        "apihelp-parse-param-contentformat": "Formato de serialización de contenido utilizado para la introducción de texto. Sólo es válido cuando se utiliza con $1text.",
+       "apihelp-parse-param-contentmodel": "Modelo de contenido del texto de entrada. Si se omite, se debe especificar $1title, y el valor por defecto será el modelo del título especificado. Solo es válido cuando se use junto con $1text.",
        "apihelp-parse-example-page": "Analizar una página.",
        "apihelp-parse-example-text": "Analizar wikitexto.",
        "apihelp-parse-example-texttitle": "Analizar wikitexto, especificando el título de la página.",
        "apihelp-protect-description": "Cambiar el nivel de protección de una página.",
        "apihelp-protect-param-title": "Título de la página a (des)proteger. No se puede utilizar con $1pageid.",
        "apihelp-protect-param-pageid": "ID de la página a (des)proteger. No se puede utilizar con $1title.",
-       "apihelp-protect-param-protections": "Lista de los niveles de protección, con formato <kbd>action=level</kbd> (por ejemplo: <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Cualquier acción no mencionada tendrá las restricciones eliminadas.",
+       "apihelp-protect-param-protections": "Lista de los niveles de protección, con formato <kbd>action=level</kbd> (por ejemplo: <kbd>edit=sysop</kbd>). Un nivel de <kbd>all</kbd> («todos») significa que cualquier usuaro puede realizar la acción, es decir, no hay restricción.\n\n<strong>Nota:</strong> Cualquier acción no mencionada tendrá las restricciones eliminadas.",
+       "apihelp-protect-param-expiry": "Marcas de tiempo de expiración. Si solo se establece una marca de tiempo, se utilizará para todas las protecciones. Utiliza <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, o <kbd>never</kbd> para una protección indefinida.",
        "apihelp-protect-param-reason": "Motivo de la (des)protección.",
        "apihelp-protect-param-tags": "Cambiar las etiquetas para aplicar a la entrada en el registro de protección.",
        "apihelp-protect-param-cascade": "Activar la protección en cascada (o sea, proteger plantillas e imágenes transcluidas usadas en esta página). Se ignorará si ninguno de los niveles de protección dados son compatibles con la función de cascada.",
+       "apihelp-protect-param-watch": "Si se activa, añade la página en proceso de (des)protección a la lista de seguimiento del usuario actual.",
+       "apihelp-protect-param-watchlist": "Añadir o borrar incondicionalmente la página de la lista de seguimiento del usuario actual, utilizar las preferencias o no cambiar el estado de seguimiento.",
        "apihelp-protect-example-protect": "Proteger una página",
-       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd>.",
+       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd> («todos», es decir, cualquier usuario puede realizar la acción).",
        "apihelp-protect-example-unprotect2": "Desproteger una página anulando las restricciones.",
-       "apihelp-purge-description": "Purgar la caché de los títulos proporcionados.\n\nSe requiere una solicitud POST si el usuario no ha iniciado sesión.",
+       "apihelp-purge-description": "Purgar la caché de los títulos proporcionados.",
        "apihelp-purge-param-forcelinkupdate": "Actualizar las tablas de enlaces.",
        "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-query-param-meta": "Qué metadatos obtener.",
        "apihelp-query-param-indexpageids": "Incluir una sección de ID de páginas adicional en la que se muestran todas las ID de páginas.",
        "apihelp-query-param-export": "Exportar las revisiones actuales de las páginas dadas o generadas.",
+       "apihelp-query-param-exportnowrap": "Devuelve el XML de exportación sin envolverlo en un resultado XML (mismo formato que [[Special:Export]]). Solo se puede usar junto con $1export.",
        "apihelp-query-param-iwurl": "Si la URL completa si el título es un interwiki.",
+       "apihelp-query-param-rawcontinue": "Devuelve los datos <samp>query-continue</samp> en bruto para continuar.",
+       "apihelp-query-example-allpages": "Obtener revisiones de páginas que comiencen por <kbd>API/</kbd>.",
        "apihelp-query+allcategories-description": "Enumerar todas las categorías.",
        "apihelp-query+allcategories-param-from": "La categoría para comenzar la enumeración",
        "apihelp-query+allcategories-param-to": "La categoría para detener la enumeración",
        "apihelp-query+allcategories-paramvalue-prop-size": "Añade el número de páginas en la categoría.",
        "apihelp-query+allcategories-paramvalue-prop-hidden": "Etiqueta las categorías que están ocultas con <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "Lista las categorías con información sobre el número de páginas de cada una.",
+       "apihelp-query+allcategories-example-generator": "Recupera la información sobre la propia página de categoría para las categorías que empiezan por <kbd>List</kbd>.",
        "apihelp-query+alldeletedrevisions-description": "Listar todas las revisiones eliminadas por un usuario o en un espacio de nombres.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Solo puede usarse con <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "No puede utilizarse con <var>$3user</var>.",
        "apihelp-query+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-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-param-from": "El título del archivo para comenzar la enumeración.",
        "apihelp-query+allfileusages-param-to": "El título del archivo para detener la enumeración.",
        "apihelp-query+allfileusages-param-prefix": "Buscar todos los títulos de los archivos que comiencen con este valor.",
+       "apihelp-query+allfileusages-param-unique": "Mostrar solo títulos únicos de archivo. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+allfileusages-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Agrega el título del archivo.",
        "apihelp-query+allfileusages-param-limit": "Cuántos elementos en total se devolverán.",
        "apihelp-query+allimages-param-maxsize": "Limitar a imágenes con como mucho este número de bytes.",
        "apihelp-query+allimages-param-sha1": "Suma SHA1 de la imagen. Invalida $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "Suma SHA1 de la imagen en base 36 (usada en MediaWiki).",
+       "apihelp-query+allimages-param-user": "Devolver solo los archivos subidos por este usuario. Solo se puede usar con $1tipo=timestamp. No se puede usar junto con $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Cómo filtrar archivos subidos por bots. Solo se puede usar con $1sort=timestamp. No se puede usar junto con $1user.",
+       "apihelp-query+allimages-param-mime": "Tipos MIME que buscar, como, por ejemplo, <kbd>image/jpeg</kbd>.",
        "apihelp-query+allimages-param-limit": "Cuántas imágenes en total se devolverán.",
        "apihelp-query+allimages-example-B": "Mostrar una lista de archivos que empiecen por la letra <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Mostrar una lista de archivos subidos recientemente, similar a [[Special:NewFiles]].",
        "apihelp-query+alllinks-param-from": "El título del enlace para comenzar la enumeración.",
        "apihelp-query+alllinks-param-to": "El título del enlace para detener la enumeración.",
        "apihelp-query+alllinks-param-prefix": "Buscar todos los títulos vinculados que comiencen con este valor.",
+       "apihelp-query+alllinks-param-unique": "Mostrar solo títulos únicos enlazados. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+alllinks-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+alllinks-paramvalue-prop-title": "Añade el título del enlace.",
        "apihelp-query+alllinks-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alllinks-param-limit": "Cuántos elementos en total se devolverán.",
        "apihelp-query+alllinks-param-dir": "La dirección en la que se listará.",
+       "apihelp-query+alllinks-example-B": "Enumera los títulos enlazados, incluyendo los títulos faltantes, con los ID de página de los que provienen, empezando por <kbd>B</kbd>.",
        "apihelp-query+alllinks-example-unique": "Lista de títulos vinculados únicamente.",
        "apihelp-query+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.",
        "apihelp-query+alllinks-example-generator": "Obtiene páginas que contienen los enlaces.",
        "apihelp-query+allmessages-param-prop": "Qué propiedades se obtendrán.",
        "apihelp-query+allmessages-param-enableparser": "Establecer para habilitar el analizador, se preprocesará el wikitexto del mensaje (sustitución de palabras mágicas, uso de plantillas, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Si se establece, no incluya el contenido de los mensajes en la salida.",
+       "apihelp-query+allmessages-param-includelocal": "Incluir también los mensajes locales, es decir, aquellos que no existen en el propio software pero sí en el espacio de nombres {{ns:MediaWiki}}.\nEsto muestra todas las páginas del espacio de nombres {{ns:MediaWiki}}, así que también mostrará las que no son propiamente mensajes, como, por ejemplo, [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Los argumentos que se sustituyen en el mensaje.",
        "apihelp-query+allmessages-param-filter": "Devolver solo mensajes con nombres que contengan esta cadena.",
        "apihelp-query+allmessages-param-customised": "Devolver solo mensajes en este estado de personalización.",
        "apihelp-query+allmessages-param-lang": "Devolver mensajes en este idioma.",
        "apihelp-query+allmessages-param-from": "Devolver mensajes que empiecen por este mensaje.",
        "apihelp-query+allmessages-param-to": "Devolver mensajes que acaben por este mensaje.",
+       "apihelp-query+allmessages-param-title": "Nombre de página que usar como contexto al analizar el mensaje (para la opción $1enableparser).",
        "apihelp-query+allmessages-param-prefix": "Devolver mensajes con este prefijo.",
        "apihelp-query+allmessages-example-ipb": "Mostrar mensajes que empiecen por <kbd>ipb-</kbd>.",
        "apihelp-query+allmessages-example-de": "Mostrar mensajes <kbd>august</kbd> y <kbd>mainpage</kbd> en alemán.",
        "apihelp-query+allpages-param-minsize": "Limitar a páginas con al menos este número de bytes.",
        "apihelp-query+allpages-param-maxsize": "Limitar a páginas con este número máximo de bytes.",
        "apihelp-query+allpages-param-prtype": "Limitar a páginas protegidas.",
+       "apihelp-query+allpages-param-prlevel": "Filtrar protecciones según el nivel de protección (se debe usar junto con el parámetro $1prtype= ).",
+       "apihelp-query+allpages-param-prfiltercascade": "Filtrar protecciones según la protección en cascada (se ignora cuando $1prtype no está fijado).",
        "apihelp-query+allpages-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+allpages-param-dir": "La dirección en la que se listará.",
        "apihelp-query+allpages-param-filterlanglinks": "Filtrar en función de si una página tiene langlinks. Tenga en cuenta que esto no puede considerar langlinks agregados por extensiones.",
        "apihelp-query+allredirects-param-from": "El título de la redirección para iniciar la enumeración.",
        "apihelp-query+allredirects-param-to": "El título de la redirección para detener la enumeración.",
        "apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.",
+       "apihelp-query+allredirects-param-unique": "Mostrar solo títulos únicos de páginas de destino. No se puede usar junto con $1prop=ids|fragment|interwiki. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+allredirects-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Añade el identificador de la página de redirección (no se puede usar junto con <var>$1unique</var>).",
        "apihelp-query+allredirects-paramvalue-prop-title": "Añade el título de la redirección.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Añade el fragmento de la redirección, si existe (no se puede usar junto con <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Añade el prefijo interwiki de la redirección, si existe (no se puede usar junto con <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "El espacio de nombres a enumerar.",
        "apihelp-query+allredirects-param-limit": "Cuántos elementos se devolverán.",
        "apihelp-query+allredirects-param-dir": "La dirección en la que se listará.",
+       "apihelp-query+allredirects-example-B": "Enumera las páginas de destino, incluyendo las páginas desaparecidas, con los identificadores de las páginas de las que provienen, empezando por <kbd>B</kbd>.",
        "apihelp-query+allredirects-example-unique": "La lista de páginas de destino.",
        "apihelp-query+allredirects-example-unique-generator": "Obtiene todas las páginas de destino, marcando los que faltan.",
        "apihelp-query+allredirects-example-generator": "Obtiene páginas que contienen las redirecciones.",
        "apihelp-query+allrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+allrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+allrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
+       "apihelp-query+allrevisions-param-generatetitles": "Cuando se utilice como generador, genera títulos en lugar de ID de revisión.",
        "apihelp-query+allrevisions-example-user": "Listar las últimas 50 contribuciones del usuario <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Listar las primeras 50 revisiones en el espacio de nombres principal.",
        "apihelp-query+mystashedfiles-description": "Obtener una lista de archivos en la corriente de carga de usuarios.",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "Buscar el tamaño del archivo y las dimensiones de la imagen.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Obtener el tipo MIME y tipo multimedia del archivo.",
        "apihelp-query+mystashedfiles-param-limit": "Cuántos archivos obtener.",
+       "apihelp-query+alltransclusions-description": "Mostrar todas las transclusiones (páginas integradas mediante &#123;&#123;x&#125;&#125;), incluidas las inexistentes.",
        "apihelp-query+alltransclusions-param-from": "El título de la transclusión por la que empezar la enumeración.",
        "apihelp-query+alltransclusions-param-to": "El título de la transclusión por la que terminar la enumeración.",
        "apihelp-query+alltransclusions-param-prefix": "Buscar todos los títulos transcluidos que comiencen con este valor.",
+       "apihelp-query+alltransclusions-param-unique": "Mostrar solo títulos únicos transcluidos. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+alltransclusions-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "Añade el título de la transclusión.",
        "apihelp-query+alltransclusions-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alltransclusions-param-limit": "Número de elementos que se desea obtener.",
        "apihelp-query+alltransclusions-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+alltransclusions-example-B": "Enumerar los títulos transcluidos, incluyendo los faltantes, junto con los identificadores de las páginas de las que provienen, empezando por <kbd>B</kbd>.",
        "apihelp-query+alltransclusions-example-unique": "Listar títulos transcluidos de forma única.",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtiene todos los títulos transcluidos, marcando los que faltan.",
        "apihelp-query+alltransclusions-example-generator": "Obtiene las páginas que contienen las transclusiones.",
        "apihelp-query+allusers-description": "Enumerar todos los usuarios registrados.",
+       "apihelp-query+allusers-param-from": "El nombre de usuario por el que empezar la enumeración.",
+       "apihelp-query+allusers-param-to": "El nombre de usuario por el que finalizar la enumeración.",
        "apihelp-query+allusers-param-prefix": "Buscar todos los usuarios que empiecen con este valor.",
        "apihelp-query+allusers-param-dir": "Dirección de ordenamiento.",
        "apihelp-query+allusers-param-group": "Incluir solo usuarios en los grupos dados.",
        "apihelp-query+allusers-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, indicar también si el usuario está conectado con el wiki identificado por el ID.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que empiecen por <kbd>Y</kbd>.",
        "apihelp-query+authmanagerinfo-description": "Recuperar información sobre el estado de autenticación actual.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Obtener información sobre las peticiones de autentificación requeridas para la acción de autentificación especificada.",
        "apihelp-query+authmanagerinfo-example-login": "Captura de las solicitudes que puede ser utilizadas al comienzo de inicio de sesión.",
+       "apihelp-query+authmanagerinfo-example-login-merged": "Obtener las peticiones que podrían utilizarse al empezar un inicio de sesión, con los campos de formulario integrados.",
+       "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Comprueba si la autentificación es suficiente para realizar la acción <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Encuentra todas las páginas que enlazan a la página dada.",
+       "apihelp-query+backlinks-param-title": "Título que buscar. No se puede usar junto con <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
        "apihelp-query+backlinks-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+backlinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+backlinks-param-filterredir": "Cómo filtrar redirecciones. Si se establece a <kbd>nonredirects</kbd> cuando está activo <var>$1redirect</var>, esto sólo se aplica al segundo nivel.",
        "apihelp-query+backlinks-param-limit": "Cuántas páginas en total se devolverán. Si está activo <var>$1redirect</var>, el límite aplica a cada nivel por separado (lo que significa que se pueden devolver hasta 2 * <var>$1limit</var> resultados).",
+       "apihelp-query+backlinks-param-redirect": "Si la página con el enlace es una redirección, encontrar también las páginas que enlacen a esa redirección. El límite máximo se reduce a la mitad.",
        "apihelp-query+backlinks-example-simple": "Mostrar enlaces a <kbd>Main page</kbd>.",
        "apihelp-query+backlinks-example-generator": "Obtener información acerca de las páginas enlazadas a <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Listar todos los usuarios y direcciones IP bloqueadas.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Añade la razón dada para el bloqueo.",
        "apihelp-query+blocks-paramvalue-prop-range": "Añade la gama de direcciones de IP afectó por el bloque.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Etiquetas la prohibición con (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-show": "Muestra solamente los elementos que cumplen estos criterios.\nPor ejemplo, para mostrar solamente los bloqueos indefinidos a direcciones IP, introduce <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Listar bloques.",
+       "apihelp-query+blocks-example-users": "Muestra los bloqueos de los usuarios <kbd>Alice</kbd> y <kbd>Bob</kbd>.",
+       "apihelp-query+categories-description": "Enumera todas las categorías a las que pertenecen las páginas.",
        "apihelp-query+categories-param-prop": "Qué propiedades adicionales obtener para cada categoría:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Añade la clave de ordenación (cadena hexadecimal) y el prefijo de la clave de ordenación (la parte legible) de la categoría.",
        "apihelp-query+categories-paramvalue-prop-timestamp": "Añade la marca de tiempo del momento en que se añadió la categoría.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Etiqueta las categorías que están ocultas con <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Qué tipo de categorías mostrar.",
        "apihelp-query+categories-param-limit": "Cuántas categorías se devolverán.",
+       "apihelp-query+categories-param-categories": "Enumerar solamente estas categorías. Útil para comprobar si una página determinada está en una categoría determinada.",
        "apihelp-query+categories-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+categories-example-simple": "Obtener una lista de categorías a las que pertenece la página <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categories-example-generator": "Obtener información acerca de todas las categorías utilizadas en la página <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categoryinfo-description": "Devuelve información acerca de las categorías dadas.",
        "apihelp-query+categoryinfo-example-simple": "Obtener información acerca de <kbd>Category:Foo</kbd> y <kbd>Category:Bar</kbd>",
        "apihelp-query+categorymembers-description": "Lista todas las páginas en una categoría dada.",
+       "apihelp-query+categorymembers-param-title": "Categoría que enumerar (requerida). Debe incluir el prefijo <kbd>{{ns:category}}:</kbd>. No se puede utilizar junto con <var>$1pageid</var>.",
+       "apihelp-query+categorymembers-param-pageid": "ID de página de la categoría para enumerar. No se puede utilizar junto con <var>$1title</var>.",
        "apihelp-query+categorymembers-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "Añade el identificador de página.",
        "apihelp-query+categorymembers-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Añade la clave de ordenación utilizada para la ordenación en la categoría (cadena hexadecimal).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Añade la clave de ordenación utilizada para la ordenación en la categoría (parte legible de la clave de ordenación).",
        "apihelp-query+categorymembers-paramvalue-prop-type": "Añade el tipo en el que se categorizó la página (<samp>page</samp>, <samp>subcat</samp> or <samp>file</samp>).",
        "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Añade la marca de tiempo del momento en que se incluyó la página.",
+       "apihelp-query+categorymembers-param-namespace": "Incluir solamente páginas de estos espacios de nombres. Ten en cuenta que puede haberse utilizado <kbd>$1type=subcat</kbd> o <kbd>$1type=file</kbd> en lugar de <kbd>$1namespace=14</kbd> o <kbd>6</kbd>.",
+       "apihelp-query+categorymembers-param-type": "Qué tipo de miembros de la categoría incluir. Ignorado cuando se ha establecido <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-limit": "Número máximo de páginas que devolver.",
        "apihelp-query+categorymembers-param-sort": "Propiedad por la que realizar la ordenación.",
        "apihelp-query+categorymembers-param-dir": "Dirección en la que desea ordenar.",
+       "apihelp-query+categorymembers-param-start": "Marca de tiempo por la que empezar la enumeración. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "Marca de tiempo por la que terminar la enumeración. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Clave de ordenación por la que empezar la enumeración, tal como se ha devuelto por <kbd>$1prop=sortkey</kbd>. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "Clave de ordenación por la que terminar la enumeración, tal como se ha devuelto por <kbd>$1prop=sortkey</kbd>. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "Prefijo de la clave de ordenación por el que empezar la enumeración. Solo se puede utilizar junto con <kbd>$1sort=sortkey</kbd>. Reemplaza <var>$1starthexsortkey</var>.",
+       "apihelp-query+categorymembers-param-endsortkeyprefix": "Prefijo de la clave de ordenación <strong>antes</strong> del cual termina la enumeración (no <strong>en</strong> el cual; si este valor existe, no será incluido). Solo se puede utilizar junto con <kbd>$1sort=sortkey</kbd>. Reemplaza <var>$1endhexsortkey</var>.",
        "apihelp-query+categorymembers-param-startsortkey": "Utilizar $1starthexsortkey en su lugar.",
        "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.",
        "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas en <kbd>Category:Physics</kbd>.",
        "apihelp-query+categorymembers-example-generator": "Obtener información sobre las primeras 10 páginas de la <kbd>Category:Physics</kbd>.",
+       "apihelp-query+contributors-description": "Obtener la lista de contribuidores conectados y el número de contribuidores anónimos de una página.",
+       "apihelp-query+contributors-param-group": "Solo incluir usuarios de los grupos especificados. No incluye grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
+       "apihelp-query+contributors-param-excludegroup": "Excluir usuarios de los grupos especificados. No incluye grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
+       "apihelp-query+contributors-param-rights": "Solo incluir usuarios con los derechos especificados. No incluye derechos concedidos a grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
+       "apihelp-query+contributors-param-excluderights": "Excluir usuarios con los derechos especificados. No incluye derechos concedidos a grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
        "apihelp-query+contributors-param-limit": "Cuántos contribuyentes se devolverán.",
        "apihelp-query+contributors-example-simple": "Mostrar los contribuyentes de la página <kbd>Main Page</kbd>.",
+       "apihelp-query+deletedrevisions-param-start": "Marca de tiempo por la que empezar la enumeración. Se ignora cuando se esté procesando una lista de ID de revisión.",
+       "apihelp-query+deletedrevisions-param-end": "Marca de tiempo por la que terminar la enumeración. Se ignora cuando se esté procesando una lista de ID de revisión.",
        "apihelp-query+deletedrevisions-param-tag": "Listar solo las revisiones con esta etiqueta.",
        "apihelp-query+deletedrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+deletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
+       "apihelp-query+deletedrevisions-example-titles": "Muestra la lista de revisiones borradas de las páginas <kbd>Main Page</kbd> y <kbd>Talk:Main Page</kbd>, con su contenido.",
+       "apihelp-query+deletedrevisions-example-revids": "Mostrar la información de la revisión borrada <kbd>123456</kbd>.",
+       "apihelp-query+deletedrevs-description": "Muestra la lista de revisiones borradas.\n\nOpera en tres modos:\n# Lista de revisiones borradas de los títulos dados, ordenadas por marca de tiempo.\n# Lista de contribuciones borradas del usuario dado, ordenadas por marca de tiempo.\n# Lista de todas las revisiones borradas en el espacio de nombres dado, ordenadas por título y marca de tiempo (donde no se ha especificado ningún título ni se ha fijado $1user).",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
+       "apihelp-query+deletedrevs-param-start": "Marca de tiempo por la que empezar la enumeración.",
+       "apihelp-query+deletedrevs-param-end": "Marca de tiempo por la que terminar la enumeración.",
        "apihelp-query+deletedrevs-param-from": "Empezar a listar en este título.",
        "apihelp-query+deletedrevs-param-to": "Terminar de listar en este título.",
        "apihelp-query+deletedrevs-param-prefix": "Buscar todas las páginas que empiecen con este valor.",
        "apihelp-query+deletedrevs-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+deletedrevs-param-namespace": "Listar solo las páginas en este espacio de nombres.",
        "apihelp-query+deletedrevs-param-limit": "La cantidad máxima de revisiones que listar.",
+       "apihelp-query+deletedrevs-param-prop": "Propiedades que obtener:\n;revid: Añade el identificador de la revisión borrada.\n;parentid: Añade el identificador de la revisión anterior de la página.\n;user: Añade el usuario que hizo la revisión.\n;userid: Añade el identificador del usuario que hizo la revisión.\n;comment: Añade el comentario de la revisión.\n;parsedcomment: Añade el comentario de la revisión, pasado por el analizador sintáctico.\n;minor: Añade una etiqueta si la revisión es menor.\n;len: Añade la longitud (en bytes) de la revisión.\n;sha1: Añade el SHA-1 (base 16) de la revisión.\n;content: Añade el contenido de la revisión.\n;token:<span class=\"apihelp-deprecated\">Obsoleto.</span> Devuelve el token de edición.\n;tags: Etiquetas de la revisión.",
+       "apihelp-query+deletedrevs-example-mode1": "Muestra las últimas revisiones borradas de las páginas <kbd>Main Page</kbd> y <kbd>Talk:Main Page</kbd>, con contenido (modo 1).",
+       "apihelp-query+deletedrevs-example-mode2": "Muestra las últimas 50 contribuciones de <kbd>Bob</kbd> (modo 2).",
+       "apihelp-query+deletedrevs-example-mode3-main": "Muestra las primeras 50 revisiones borradas del espacio principal (modo 3).",
        "apihelp-query+deletedrevs-example-mode3-talk": "Listar las primeras 50 páginas en el espacio de nombres {{ns:talk}} (modo 3).",
        "apihelp-query+disabled-description": "Se ha desactivado el módulo de consulta.",
+       "apihelp-query+duplicatefiles-description": "Enumerar todos los archivos que son duplicados de los archivos dados a partir de los valores hash.",
+       "apihelp-query+duplicatefiles-param-limit": "Número de archivos duplicados para devolver.",
        "apihelp-query+duplicatefiles-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+duplicatefiles-param-localonly": "Buscar solo archivos en el repositorio local.",
        "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Alber Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los archivos.",
        "apihelp-query+embeddedin-description": "Encuentra todas las páginas que transcluyen el título dado.",
        "apihelp-query+embeddedin-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
+       "apihelp-query+embeddedin-param-pageid": "Identificador de página que buscar. No se puede usar junto con $1title.",
+       "apihelp-query+embeddedin-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+embeddedin-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+embeddedin-param-filterredir": "Cómo filtrar las redirecciones.",
        "apihelp-query+embeddedin-param-limit": "Cuántas páginas se devolverán.",
+       "apihelp-query+embeddedin-example-simple": "Mostrar las páginas que transcluyen <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Obtener información sobre las páginas que transcluyen <kbd>Template:Stub</kbd>.",
+       "apihelp-query+extlinks-description": "Devuelve todas las URL externas (excluidos los interwikis) de las páginas dadas.",
        "apihelp-query+extlinks-param-limit": "Cuántos enlaces se devolverán.",
+       "apihelp-query+extlinks-param-protocol": "Protocolo de la URL. Si está vacío y <var>$1query</var> está definido, el protocolo es <kbd>http</kbd>. Para enumerar todos los enlaces externos, deja a la vez vacíos esto y <var>$1query</var>.",
+       "apihelp-query+extlinks-param-query": "Cadena de búsqueda sin protocolo. Útil para comprobar si una determinada página contiene una determinada URL externa.",
+       "apihelp-query+extlinks-param-expandurl": "Expandir las URL relativas a un protocolo con el protocolo canónico.",
        "apihelp-query+extlinks-example-simple": "Obtener una lista de los enlaces externos en <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Enumera páginas que contienen una URL dada.",
        "apihelp-query+exturlusage-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+exturlusage-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+exturlusage-paramvalue-prop-url": "Añade el URL utilizado en la página.",
        "apihelp-query+exturlusage-param-protocol": "Protocolo del URL. Si está vacío y se establece <var>$1query</var>, el protocolo es <kbd>http</kbd>. Deja vacío esto y <var>$1query</var> para listar todos los enlaces externos.",
+       "apihelp-query+exturlusage-param-query": "Cadena de búsqueda sin protocolo. Véase [[Special:LinkSearch]]. Deja el campo vacío para enumerar todos los enlaces externos.",
+       "apihelp-query+exturlusage-param-namespace": "Los espacios de nombres que enumerar.",
        "apihelp-query+exturlusage-param-limit": "Cuántas páginas se devolverán.",
+       "apihelp-query+exturlusage-param-expandurl": "Expandir las URL relativas a un protocolo con el protocolo canónico.",
        "apihelp-query+exturlusage-example-simple": "Mostrar páginas que enlacen con <kbd>http://www.mediawiki.org</kbd>.",
+       "apihelp-query+filearchive-description": "Enumerar todos los archivos borrados de forma secuencial.",
        "apihelp-query+filearchive-param-from": "El título de imagen para comenzar la enumeración",
        "apihelp-query+filearchive-param-to": "El título de imagen para detener la enumeración.",
        "apihelp-query+filearchive-param-prefix": "Buscar todos los títulos de las imágenes que comiencen con este valor.",
+       "apihelp-query+filearchive-param-limit": "Número de imágenes que devolver en total.",
        "apihelp-query+filearchive-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+filearchive-param-sha1": "Hash SHA1 de la imagen. Reemplaza $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1base36": "Hash SHA1 de la imagen en base 36 (utilizado en MediaWiki).",
        "apihelp-query+filearchive-param-prop": "Qué información de imagen se obtendrá:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Añade el hash SHA-1 para la imagen.",
        "apihelp-query+filearchive-paramvalue-prop-timestamp": "Añade la marca de tiempo de la versión subida.",
        "apihelp-query+filearchive-paramvalue-prop-user": "Agrega el usuario que subió la versión de la imagen.",
        "apihelp-query+filearchive-paramvalue-prop-size": "Agrega el tamaño de la imagen en bytes y la altura, la anchura y el número de páginas (si es aplicable).",
        "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Analizar la descripción de la versión.",
        "apihelp-query+filearchive-paramvalue-prop-mime": "Añade el MIME de la imagen.",
        "apihelp-query+filearchive-paramvalue-prop-mediatype": "Añade el tipo multimedia de la imagen.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Enumera los metadatos Exif para la versión de la imagen.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Añade la profundidad de bit de la versión.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Añade el nombre de archivo de la versión archivada para las versiones que no son las últimas.",
        "apihelp-query+filearchive-example-simple": "Mostrar una lista de todos los archivos eliminados.",
+       "apihelp-query+filerepoinfo-description": "Devuelve metainformación sobre los repositorios de imágenes configurados en el wiki.",
        "apihelp-query+filerepoinfo-example-simple": "Obtener información acerca de los repositorios de archivos.",
+       "apihelp-query+fileusage-description": "Encontrar todas las páginas que utilizan los archivos dados.",
        "apihelp-query+fileusage-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+fileusage-paramvalue-prop-pageid": "Identificador de cada página.",
        "apihelp-query+fileusage-paramvalue-prop-title": "Título de cada página.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Marcar si la página es una redirección.",
+       "apihelp-query+fileusage-param-namespace": "Incluir solo páginas de estos espacios de nombres.",
        "apihelp-query+fileusage-param-limit": "Cuántos se devolverán.",
+       "apihelp-query+fileusage-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.",
        "apihelp-query+fileusage-example-simple": "Obtener una lista de páginas que utilicen [[:File:Example.jpg]].",
        "apihelp-query+fileusage-example-generator": "Obtener información acerca de las páginas que utilicen [[:File:Example.jpg]].",
        "apihelp-query+imageinfo-description": "Devuelve información del archivo y su historial de subida.",
        "apihelp-query+imageinfo-param-prop": "Qué información del archivo se obtendrá:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Añade la marca de tiempo a la versión actualizada.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Añade el usuario que subió cada versión del archivo.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "Añade la ID de usuario que subió cada versión del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "Comentarios sobre la versión.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analizar el comentario de la versión.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Agrega el título canónico del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "Devuelve la URL para el archivo y la página de descripción.",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias para el tamaño.",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "Añade el hash SHA-1 para la imagen.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "Añade el tipo MIME del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Añade el tipo MIME de la miniatura de la imagen (se requiere la URL y el parámetro $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Añade el tipo multimedia de la imagen.",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "Enumera los metadatos Exif para la versión del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Enumera los metadatos genéricos del formato del archivo para la versión del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Enumera metadatos con formato combinados de múltiples fuentes. Los resultados están en formato HTML.",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "Añade el nombre del archivo de la versión archivada para las versiones anteriores a la última.",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Añade la profundidad de bits de la versión.",
        "apihelp-query+imageinfo-param-limit": "Cuántos revisiones de archivos se devolverán por perfil.",
+       "apihelp-query+imageinfo-param-start": "Marca de tiempo por la que empezar la enumeración.",
+       "apihelp-query+imageinfo-param-end": "Marca de tiempo por la que terminar la enumeración.",
        "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
+       "apihelp-query+imageinfo-param-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-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-localonly": "Buscar solo archivos en el repositorio local.",
        "apihelp-query+imageinfo-example-dated": "Obtener información sobre las versiones de [[:File:Test.jpg]] a partir de 2008.",
        "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
        "apihelp-query+images-param-limit": "Cuántos archivos se devolverán.",
+       "apihelp-query+images-param-images": "Mostrar solo estos archivos. Útil para comprobar si una determinada página tiene un determinado archivo.",
        "apihelp-query+images-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+images-example-simple": "Obtener una lista de los archivos usados en la [[Main Page|Portada]].",
+       "apihelp-query+images-example-generator": "Obtener información sobre todos los archivos empleados en [[Main Page]].",
+       "apihelp-query+imageusage-description": "Encontrar todas las páginas que usen el título de imagen dado.",
        "apihelp-query+imageusage-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
        "apihelp-query+imageusage-param-pageid": "ID de página a buscar. No puede usarse con $1title.",
        "apihelp-query+imageusage-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+imageusage-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+imageusage-param-filterredir": "Cómo filtrar las redirecciones. Si se establece a no redirecciones cuando está habilitado $1redirect, esto solo se aplica al segundo nivel.",
+       "apihelp-query+imageusage-param-limit": "Número de páginas que devolver. Si está habilitado <var>$1redirect</var>, el límite se aplica a cada nivel de forma separada (es decir, se pueden devolver hasta 2 * <var>$1limit</var>).",
+       "apihelp-query+imageusage-param-redirect": "Si la página con el enlace es una redirección, encontrar también las páginas que enlacen a esa redirección. El límite máximo se reduce a la mitad.",
        "apihelp-query+imageusage-example-simple": "Mostrar las páginas que usan [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageusage-example-generator": "Obtener información sobre las páginas que empleen [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+info-description": "Obtener información básica de la página.",
        "apihelp-query+info-param-prop": "Qué propiedades adicionales se obtendrán:",
        "apihelp-query+info-paramvalue-prop-protection": "Listar el nivel de protección de cada página.",
+       "apihelp-query+info-paramvalue-prop-talkid": "El identificador de la página de discusión correspondiente a cada página que no es de discusión.",
        "apihelp-query+info-paramvalue-prop-subjectid": "La ID de página de la página principal de cada página de discusión.",
+       "apihelp-query+info-paramvalue-prop-url": "Muestra una URL completa, una URL de edición y la URL canónica de cada página.",
        "apihelp-query+info-paramvalue-prop-readable": "Si el usuario puede leer esta página.",
+       "apihelp-query+info-paramvalue-prop-preload": "Muestra el texto devuelto por EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Proporciona la manera en que se muestra realmente el título de la página",
+       "apihelp-query+info-param-testactions": "Comprobar su el usuario actual puede realizar determinadas acciones en la página.",
        "apihelp-query+info-param-token": "Usa [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] en su lugar.",
        "apihelp-query+info-example-simple": "Obtener información acerca de la página <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obtén información general y protección acerca de la página <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-description": "Encontrar todas las páginas que enlazan al enlace interwiki dado.\n\nPuede utilizarse para encontrar todos los enlaces con un prefijo, o todos los enlaces a un título (con un determinado prefijo). Si no se introduce ninguno de los parámetros, se entiende como «todos los enlaces interwiki».",
+       "apihelp-query+iwbacklinks-param-prefix": "Prefijo para el interwiki.",
+       "apihelp-query+iwbacklinks-param-title": "Enlace interlingüístico que buscar. Se debe usar junto con <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+iwbacklinks-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Añade el prefijo del interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Añade el título del interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+iwbacklinks-example-simple": "Obtener las páginas enlazadas a [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-generator": "Obtener información sobre las páginas que enlacen a [[wikibooks:Test]].",
        "apihelp-query+iwlinks-description": "Devuelve todos los enlaces interwiki de las páginas dadas.",
        "apihelp-query+iwlinks-param-prop": "Qué propiedades adicionales obtener para cada enlace interlingüe:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Añade el URL completo.",
        "apihelp-query+iwlinks-param-limit": "Cuántos enlaces interwiki se desea devolver.",
        "apihelp-query+iwlinks-param-prefix": "Devolver únicamente enlaces interwiki con este prefijo.",
        "apihelp-query+iwlinks-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+iwlinks-example-simple": "Obtener los enlaces interwiki de la página <kbd>Main Page</kbd>.",
        "apihelp-query+langbacklinks-param-lang": "Idioma del enlace de idioma.",
        "apihelp-query+langbacklinks-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+langbacklinks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+langbacklinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+langbacklinks-example-simple": "Obtener las páginas enlazadas a [[:fr:Test]]",
        "apihelp-query+langbacklinks-example-generator": "Obtener información acerca de las páginas enlazadas a [[:fr:Test]].",
+       "apihelp-query+langlinks-description": "Devuelve todos los enlaces interlingüísticos de las páginas dadas.",
+       "apihelp-query+langlinks-param-limit": "Número de enlaces interlingüísticos que devolver.",
        "apihelp-query+langlinks-param-url": "Obtener la URL completa o no (no se puede usar con <var>$1prop</var>).",
        "apihelp-query+langlinks-param-prop": "Qué propiedades adicionales obtener para cada enlace interlingüe:",
        "apihelp-query+langlinks-paramvalue-prop-url": "Añade el URL completo.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Añade el nombre del idioma localizado (o la mejor estimación). Usa <var>$1inlanguagecode</var> para controlar el idioma.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Añade el nombre nativo del idioma.",
        "apihelp-query+langlinks-param-lang": "Devolver solo enlaces de idioma con este código de idioma.",
+       "apihelp-query+langlinks-param-title": "Enlace que buscar. Se debe usar junto con <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+langlinks-param-inlanguagecode": "Código de idioma para los nombres de idiomas localizados.",
+       "apihelp-query+langlinks-example-simple": "Obtener los enlaces interlingüísticos de la página <kbd>Main Page</kbd>.",
+       "apihelp-query+links-description": "Devuelve todos los enlaces de las páginas dadas.",
+       "apihelp-query+links-param-namespace": "Mostrar solo los enlaces en estos espacios de nombres.",
        "apihelp-query+links-param-limit": "Cuántos enlaces se devolverán.",
+       "apihelp-query+links-param-titles": "Devolver solo los enlaces a estos títulos. Útil para comprobar si una determinada página enlaza a un determinado título.",
        "apihelp-query+links-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+links-example-simple": "Obtener los enlaces de la página <kbd>Main Page</kbd>",
+       "apihelp-query+links-example-namespaces": "Obtener enlaces de la página <kbd>Main Page</kbd> de los espacios de nombres {{ns:user}} and {{ns:template}}.",
+       "apihelp-query+linkshere-description": "Buscar todas las páginas que enlazan a las páginas dadas.",
        "apihelp-query+linkshere-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Identificador de cada página.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Título de cada página.",
        "apihelp-query+linkshere-paramvalue-prop-redirect": "Indicar si la página es una redirección.",
+       "apihelp-query+linkshere-param-namespace": "Incluir solo páginas de estos espacios de nombres.",
        "apihelp-query+linkshere-param-limit": "Cuántos se devolverán.",
+       "apihelp-query+linkshere-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.",
        "apihelp-query+linkshere-example-simple": "Obtener una lista de páginas que enlacen a la [[Main Page]].",
        "apihelp-query+linkshere-example-generator": "Obtener información acerca de las páginas enlazadas a la [[Main Page|Portada]].",
+       "apihelp-query+logevents-description": "Obtener eventos de los registros.",
        "apihelp-query+logevents-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+logevents-paramvalue-prop-ids": "Agrega el identificador del evento de registro.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Añade el título de la página para el evento del registro.",
        "apihelp-query+logevents-paramvalue-prop-type": "Añade el tipo del evento de registro.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Añade el usuario responsable del evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Agrega el identificador del usuario responsable del evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Añade la marca de tiempo para el evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Añade el comentario del evento del registro.",
        "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Añade el comentario analizado del evento de registro.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Muestra detalles adicionales sobre el evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "Muestra las etiquetas para el evento del registro.",
+       "apihelp-query+logevents-param-type": "Filtrar las entradas del registro solo a este tipo.",
+       "apihelp-query+logevents-param-action": "Filtrar las acciones del registro solo a esta acción. Reemplaza <var>$1type</var>. En la lista de valores posibles, los valores con el asterisco como carácter comodín tales como <kbd>action/*</kbd> pueden tener distintas cadenas después de la barra (/).",
+       "apihelp-query+logevents-param-start": "Marca de tiempo por la que empezar la enumeración.",
+       "apihelp-query+logevents-param-end": "Marca de tiempo por la que terminar la enumeración.",
+       "apihelp-query+logevents-param-user": "Filtrar entradas a aquellas realizadas por el usuario dado.",
+       "apihelp-query+logevents-param-title": "Filtrar entradas a aquellas relacionadas con una página.",
+       "apihelp-query+logevents-param-namespace": "Filtrar entradas a aquellas en el espacio de nombres dado.",
+       "apihelp-query+logevents-param-prefix": "Filtrar entradas que empiezan por este prefijo.",
+       "apihelp-query+logevents-param-tag": "Solo mostrar las entradas de eventos con esta etiqueta.",
+       "apihelp-query+logevents-param-limit": "Número total de entradas de eventos que devolver.",
+       "apihelp-query+logevents-example-simple": "Mostrar los eventos recientes del registro.",
+       "apihelp-query+pagepropnames-description": "Mostrar todos los nombres de propiedades de página utilizados en el wiki.",
+       "apihelp-query+pagepropnames-param-limit": "Número máximo de nombres que devolver.",
+       "apihelp-query+pagepropnames-example-simple": "Obtener los 10 primeros nombres de propiedades.",
        "apihelp-query+pageprops-description": "Obtener diferentes propiedades de página definidas en el contenido de la página.",
        "apihelp-query+pageprops-param-prop": "Sólo listar estas propiedades de página (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devuelve los nombres de las propiedades de página en uso). Útil para comprobar si las páginas usan una determinada propiedad de página.",
+       "apihelp-query+pageprops-example-simple": "Obtener las propiedades de las páginas <kbd>Main Page</kbd> y <kbd>MediaWiki</kbd>.",
+       "apihelp-query+pageswithprop-description": "Mostrar todas las páginas que usen una propiedad de página.",
        "apihelp-query+pageswithprop-param-propname": "Propiedad de página para la cual enumerar páginas (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devuelve los nombres de las propiedades de página en uso).",
        "apihelp-query+pageswithprop-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Añade el identificador de página.",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+pageswithprop-paramvalue-prop-value": "Añade el valor de la propiedad de página.",
        "apihelp-query+pageswithprop-param-limit": "El máximo número de páginas que se devolverán.",
+       "apihelp-query+pageswithprop-param-dir": "Dirección en la que se desea ordenar.",
        "apihelp-query+pageswithprop-example-simple": "Listar las 10 primeras páginas que utilicen <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "Obtener información adicional acerca de las 10 primeras páginas que utilicen <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "Buscar cadena.",
        "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-query+prefixsearch-param-offset": "Número de resultados que omitir.",
        "apihelp-query+prefixsearch-example-simple": "Buscar títulos de páginas que empiecen con <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Perfil de búsqueda que utilizar.",
+       "apihelp-query+protectedtitles-description": "Mostrar todos los títulos protegidos contra creación.",
        "apihelp-query+protectedtitles-param-namespace": "Listar solo los títulos en estos espacios de nombres.",
        "apihelp-query+protectedtitles-param-level": "Listar solo títulos con estos niveles de protección.",
        "apihelp-query+protectedtitles-param-limit": "Cuántas páginas se devolverán.",
+       "apihelp-query+protectedtitles-param-start": "Empezar la enumeración en esta marca de tiempo de protección.",
+       "apihelp-query+protectedtitles-param-end": "Terminar la enumeración en esta marca de tiempo de protección.",
        "apihelp-query+protectedtitles-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Añade la marca de tiempo de cuando se añadió la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-user": "Agrega el usuario que agregó la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-userid": "Agrega el identificador de usuario que agregó la protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Añade el comentario de la protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Añade el comentario analizado para la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Añade la fecha y hora de cuando se levantará la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Agrega el nivel de protección.",
        "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos.",
        "apihelp-query+querypage-param-page": "El nombre de la página especial. Recuerda, es sensible a mayúsculas y minúsculas.",
        "apihelp-query+querypage-param-limit": "Número de resultados que se devolverán.",
        "apihelp-query+querypage-example-ancientpages": "Devolver resultados de [[Special:Ancientpages]].",
+       "apihelp-query+random-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+random-param-namespace": "Devolver solo las páginas de estos espacios de nombres.",
+       "apihelp-query+random-param-limit": "Limita el número de páginas aleatorias que se devolverán.",
+       "apihelp-query+random-param-redirect": "Usa <kbd>$1filterredir=redirects</kbd> en su lugar.",
+       "apihelp-query+random-param-filterredir": "Cómo filtrar las redirecciones.",
+       "apihelp-query+random-example-simple": "Devuelve dos páginas aleatorias del espacio de nombres principal.",
+       "apihelp-query+random-example-generator": "Devuelve la información de dos páginas aleatorias del espacio de nombres principal.",
        "apihelp-query+recentchanges-description": "Enumerar cambios recientes.",
        "apihelp-query+recentchanges-param-start": "El sello de tiempo para comenzar la enumeración.",
        "apihelp-query+recentchanges-param-end": "El sello de tiempo para finalizar la enumeración.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrar cambios solamente a los espacios de nombres dados.",
        "apihelp-query+recentchanges-param-user": "Listar solo los cambios de este usuario.",
        "apihelp-query+recentchanges-param-excludeuser": "No listar cambios de este usuario.",
        "apihelp-query+recentchanges-param-tag": "Listar solo los cambios con esta etiqueta.",
        "apihelp-query+recentchanges-param-prop": "Incluir piezas adicionales de información:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Añade el usuario responsable de la edición y añade una etiqueta si se trata de una IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Añade el identificador del usuario responsable de la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Añade el comentario de la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Añade el comentario analizado para la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Añade marcas para la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-sizes": "Añade la longitud antigua y la longitud nueva de la página en bytes.",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "Etiqueta la edición si la página es una redirección.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Etiqueta ediciones verificables como verificadas o no verificadas.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Añade información de registro (identificador de registro, tipo de registro, etc.) a las entradas de registro.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Muestra las etiquetas de la entrada.",
        "apihelp-query+recentchanges-param-token": "Usa <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> en su lugar.",
+       "apihelp-query+recentchanges-param-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-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-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+redirects-paramvalue-prop-pageid": "Identificador de página de cada redirección.",
        "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirección.",
        "apihelp-query+redirects-param-limit": "Cuántas redirecciones se devolverán.",
        "apihelp-query+redirects-example-simple": "Mostrar una lista de las redirecciones a la [[Main Page|Portada]]",
        "apihelp-query+redirects-example-generator": "Obtener información sobre todas las redirecciones a la [[Main Page|Portada]].",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "Solo se puede usar con una sola página (modo n.º 2).",
+       "apihelp-query+revisions-param-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+revisions-param-start": "Marca de tiempo a partir de la cual empezar la enumeración.",
        "apihelp-query+revisions-param-end": "Enumerar hasta esta marca de tiempo.",
        "apihelp-query+revisions-param-user": "Incluir solo las revisiones realizadas por el usuario.",
        "apihelp-query+revisions-param-excludeuser": "Excluir las revisiones realizadas por el usuario.",
+       "apihelp-query+revisions-param-tag": "Mostrar solo revisiones marcadas con esta etiqueta.",
+       "apihelp-query+revisions-example-content": "Obtener datos con el contenido de la última revisión de los títulos <kbd>API</kbd> y <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-last5": "Mostrar las últimas 5 revisiones de la <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5": "Obtener las primeras 5 revisiones de <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5-after": "Obtener las primeras 5 revisiones de <kbd>Main Page</kbd> realizadas después de 2006-05-01.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtener las primeras 5 revisiones de <kbd>Main Page</kbd> que no fueron realizadas por el usuario anónimo <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions-example-first5-user": "Obtener las primeras 5 revisiones de <kbd>Main Page</kbd> que fueron realizadas por el usuario <kbd>MediaWiki default</kbd>.",
        "apihelp-query+revisions+base-param-prop": "Las propiedades que se obtendrán para cada revisión:",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "El identificador de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "Marcas de revisión (menor).",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Identificador del modelo de contenido de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Comentario del usuario para la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Comentario analizado del usuario para la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Texto de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "El árbol de análisis sintáctico XML del contenido de la revisión (requiere el modelo de contenido <code>$1</code>).",
+       "apihelp-query+revisions+base-param-limit": "Limitar la cantidad de revisiones que se devolverán.",
+       "apihelp-query+revisions+base-param-expandtemplates": "Expandir las plantillas en el contenido de la revisión (requiere $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Generar el árbol de análisis sintáctico XML para el contenido de la revisión (requiere $1prop=content; reemplazado por <kbd>$1prop=parsetree</kbd>).",
+       "apihelp-query+revisions+base-param-parse": "Analizar el contenido de la revisión (requiere $1prop=content). Por motivos de rendimiento, si se utiliza esta opción, el valor de $1limit es forzado a 1.",
+       "apihelp-query+revisions+base-param-section": "Recuperar solamente el contenido de este número de sección.",
+       "apihelp-query+revisions+base-param-contentformat": "Formato de serialización utilizado para <var>$1difftotext</var> y esperado para la salida de contenido.",
+       "apihelp-query+search-description": "Realizar una búsqueda de texto completa.",
+       "apihelp-query+search-param-namespace": "Buscar sólo en estos espacios de nombres.",
+       "apihelp-query+search-param-what": "Tipo de búsqueda que realizar.",
        "apihelp-query+search-param-info": "Qué metadatos devolver.",
        "apihelp-query+search-param-prop": "Qué propiedades se devolverán:",
+       "apihelp-query+search-paramvalue-prop-size": "Añade el tamaño de la página en bytes.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Añade el número de palabras de la página.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Añade la marca de tiempo de la última edición de la página.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Añade un fragmento analizado de la página.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Añade un fragmento analizado del título de la página.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Añade un fragmento analizado del título de la redirección.",
        "apihelp-query+search-paramvalue-prop-redirecttitle": "Añade el título de la redirección coincidente.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Añade un fragmento analizado del título de la sección correspondiente.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Añade el título de la sección correspondiente.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Añade un fragmento analizado de la categoría correspondiente.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Añade un booleano que indica si la búsqueda corresponde al contenido del archivo.",
        "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Desaconsejado e ignorado.</span>",
        "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Desaconsejado e ignorado.</span>",
        "apihelp-query+search-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwiki en la búsqueda, si es posible.",
+       "apihelp-query+search-param-backend": "Qué servidor de búsqueda utilizar, si no es el servidor por defecto.",
+       "apihelp-query+search-param-enablerewrites": "Habilita la reescritura de consultas internas. Algunos servidores de búsqueda pueden reescribir la consulta a una que considere que da mejores resultados, por ejemplo, corrigiendo las faltas ortográficas.",
        "apihelp-query+search-example-simple": "Buscar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Buscar <kbd>meaning</kbd> en los textos.",
        "apihelp-query+search-example-generator": "Obtener información acerca de las páginas devueltas por una búsqueda de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Devuelve una lista de identificadores variables.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devuelve una lista de los protocolos que se permiten en los enlaces externos.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devuelve los valores predeterminados de las preferencias del usuario.",
+       "apihelp-query+siteinfo-param-filteriw": "Devuelve solo entradas locales o solo entradas no locales del mapa interwiki.",
+       "apihelp-query+siteinfo-param-numberingroup": "Muestra el número de usuarios en los grupos de usuarios.",
+       "apihelp-query+siteinfo-param-inlanguagecode": "Código de idioma para los nombres localizados de los idiomas (en el mejor intento posible) y apariencias.",
        "apihelp-query+siteinfo-example-simple": "Obtener información del sitio.",
+       "apihelp-query+siteinfo-example-interwiki": "Obtener una lista de prefijos interwiki locales.",
        "apihelp-query+stashimageinfo-description": "Devuelve información del archivo para archivos escondidos.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias de $1filekey, para retrocompatibilidad.",
        "apihelp-query+stashimageinfo-example-simple": "Devuelve información para un archivo escondido.",
        "apihelp-query+stashimageinfo-example-params": "Devuelve las miniaturas de dos archivos escondidos.",
+       "apihelp-query+tags-description": "Enumerar las etiquetas de modificación.",
        "apihelp-query+tags-param-limit": "El número máximo de etiquetas para enumerar.",
        "apihelp-query+tags-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+tags-paramvalue-prop-name": "Añade el nombre de la etiqueta.",
        "apihelp-query+tags-paramvalue-prop-displayname": "Agrega el mensaje de sistema para la etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-description": "Añade la descripción de la etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Añade el número de revisiones y entradas de registro que tienen esta etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Indicar si la etiqueta está definida.",
        "apihelp-query+tags-paramvalue-prop-source": "Obtiene las fuentes de la etiqueta, que pueden incluir <samp>extension</samp> para etiquetas definidas por extensiones y <samp>manual</samp> para etiquetas que pueden aplicarse manualmente por los usuarios.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la etiqueta aún se sigue aplicando.",
+       "apihelp-query+tags-example-simple": "Enumera las etiquetas disponibles.",
        "apihelp-query+templates-description": "Devuelve todas las páginas transcluidas en las páginas dadas.",
+       "apihelp-query+templates-param-namespace": "Mostrar plantillas solamente en estos espacios de nombres.",
        "apihelp-query+templates-param-limit": "Cuántas plantillas se devolverán.",
+       "apihelp-query+templates-param-templates": "Mostrar solo estas plantillas. Útil para comprobar si una determinada página utiliza una determinada plantilla.",
        "apihelp-query+templates-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+templates-example-simple": "Obtener las plantillas que se usan en la página <kbd>Portada</kbd>.",
+       "apihelp-query+templates-example-generator": "Obtener información sobre las páginas de las plantillas utilizadas en <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-namespaces": "Obtener las páginas de los espacios de nombres {{ns:user}} y {{ns:template}} que están transcluidas en la página <kbd>Main Page</kbd>.",
        "apihelp-query+transcludedin-description": "Encuentra todas las páginas que transcluyan las páginas dadas.",
        "apihelp-query+transcludedin-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "Identificador de cada página.",
        "apihelp-query+transcludedin-paramvalue-prop-title": "Título de cada página.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Marcar si la página es una redirección.",
        "apihelp-query+transcludedin-param-namespace": "Incluir solo las páginas en estos espacios de nombres.",
        "apihelp-query+transcludedin-param-limit": "Cuántos se devolverán.",
+       "apihelp-query+transcludedin-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.",
        "apihelp-query+transcludedin-example-simple": "Obtener una lista de páginas transcluyendo <kbd>Main Page</kbd>.",
+       "apihelp-query+transcludedin-example-generator": "Obtener información sobre las páginas que transcluyen <kbd>Main Page</kbd>.",
+       "apihelp-query+usercontribs-description": "Obtener todas las ediciones realizadas por un usuario.",
        "apihelp-query+usercontribs-param-limit": "Número máximo de contribuciones que se devolverán.",
+       "apihelp-query+usercontribs-param-user": "Los usuarios para los cuales se desea recuperar las contribuciones. No se puede utilizar junto con <var>$1userids</var> o <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Recuperar las contribuciones de todos los usuarios cuyos nombres comienzan con este valor. No se puede utilizar junto con <var>$1user</var> o <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Los identificadores de los usuarios para los cuales se desea recuperar las contribuciones. No se puede utilizar junto con <var>$1userids</var> o <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-namespace": "Enumerar solo las contribuciones en estos espacios de nombres.",
        "apihelp-query+usercontribs-param-prop": "Incluir piezas adicionales de información:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Añade el identificador de página y el de revisión.",
        "apihelp-query+usercontribs-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "Añade el comentario de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Añade el comentario analizado de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Añade el nuevo tamaño de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Añade la diferencia de tamaño de la edición respecto de su progenitora.",
+       "apihelp-query+usercontribs-paramvalue-prop-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-tag": "Enumerar solo las revisiones con esta etiqueta.",
+       "apihelp-query+usercontribs-param-toponly": "Enumerar solo las modificaciones que sean las últimas revisiones.",
        "apihelp-query+usercontribs-example-user": "Mostrar contribuciones del usuario <kbd>Example</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Mostrar las contribuciones de todas las direcciones IP con el prefijo <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obtener información sobre el usuario actual.",
        "apihelp-query+userinfo-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etiqueta si el usuario está bloqueado, por quién y por qué motivo.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Añade una etiqueta <samp>messages</samp> si el usuario actual tiene mensajes pendientes.",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos los grupos al que pertenece el usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Enumera todos los grupos a los que pertenece automáticamente el usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos los permisos que tiene el usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Enumera los grupos a los que el usuario actual se puede unir o retirar.",
        "apihelp-query+userinfo-paramvalue-prop-options": "Lista todas las preferencias que haya establecido el usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Añade el número de ediciones del usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lista todos los límites de velocidad aplicados al usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Añade el nombre real del usuario.",
        "apihelp-query+userinfo-paramvalue-prop-email": "Añade la dirección de correo electrónico del usuario y la fecha de autenticación por correo.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Reenvía la cabecera <code>Accept-Language</code> enviada por el cliente en un formato estructurado.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Añade la fecha de registro del usuario.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Añade el recuento de páginas no leídas de la lista de seguimiento del usuario (máximo $1, devuelve <samp>$2</samp> si el número es mayor).",
        "apihelp-query+userinfo-example-simple": "Obtener información sobre el usuario actual.",
        "apihelp-query+userinfo-example-data": "Obtener información adicional sobre el usuario actual.",
        "apihelp-query+users-description": "Obtener información sobre una lista de usuarios.",
        "apihelp-query+users-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Etiqueta si el usuario está bloqueado, por quién y por qué razón.",
        "apihelp-query+users-paramvalue-prop-groups": "Lista todos los grupos a los que pertenece cada usuario.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Enumera todos los grupos a los que pertenece automáticamente un usuario.",
+       "apihelp-query+users-paramvalue-prop-rights": "Enumera todos los permisos que tiene cada usuario.",
        "apihelp-query+users-paramvalue-prop-editcount": "Añade el número de ediciones del usuario.",
+       "apihelp-query+users-paramvalue-prop-registration": "Añade la marca de tiempo del registro del usuario.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Marca si el usuario puede y quiere recibir correo electrónico a través de [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Etiqueta el género del usuario. Devuelve \"masculino\", \"femenino\" o \"desconocido\".",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Indica si se puede crear una cuenta para nombres de usuario válidos pero no registrados.",
+       "apihelp-query+users-param-users": "Una lista de usuarios de los que obtener información.",
+       "apihelp-query+users-param-userids": "Una lista de identificadores de usuarios de los que obtener información.",
+       "apihelp-query+users-param-token": "Usa <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> en su lugar.",
        "apihelp-query+users-example-simple": "Devolver información del usuario <kbd>Example</kbd>.",
+       "apihelp-query+watchlist-description": "Obtener los cambios recientes de las páginas de la lista de seguimiento del usuario actual.",
        "apihelp-query+watchlist-param-start": "El sello de tiempo para comenzar la enumeración",
        "apihelp-query+watchlist-param-end": "El sello de tiempo para finalizar la enumeración.",
+       "apihelp-query+watchlist-param-namespace": "Filtrar cambios solamente a los espacios de nombres dados.",
+       "apihelp-query+watchlist-param-user": "Mostrar solamente los cambios de este usuario.",
        "apihelp-query+watchlist-param-excludeuser": "No listar cambios de este usuario.",
+       "apihelp-query+watchlist-param-limit": "Número de resultados que devolver en cada petición.",
        "apihelp-query+watchlist-param-prop": "Qué propiedades adicionales se obtendrán:",
        "apihelp-query+watchlist-paramvalue-prop-ids": "Añade identificadores de revisiones y de páginas.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Añade el título de la página.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Añade el usuario que hizo la edición.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Añade el identificador de usuario de quien hizo la edición.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Añade el comentario de la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Añade el comentario analizado de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta las ediciones que están verificadas.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Añade la longitud vieja y la nueva de la página.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Añade fecha y hora de cuando el usuario fue notificado por última vez acerca de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Añade información del registro cuando corresponda.",
+       "apihelp-query+watchlist-param-show": "Muestra solo los elementos que cumplan estos criterios. Por ejemplo, para ver solo ediciones menores realizadas por usuarios conectados, introduce $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Qué tipos de cambios mostrar:",
        "apihelp-query+watchlist-paramvalue-type-edit": "Ediciones comunes a páginas",
        "apihelp-query+watchlist-paramvalue-type-external": "Cambios externos.",
        "apihelp-query+watchlist-paramvalue-type-new": "Creaciones de páginas.",
        "apihelp-query+watchlist-paramvalue-type-log": "Entradas del registro.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Cambios de pertenencia a categorías.",
+       "apihelp-query+watchlist-param-owner": "Utilizado junto con $1token para acceder a la lista de seguimiento de otro usuario.",
+       "apihelp-query+watchlist-example-simple": "Enumera la última revisión de las páginas con cambios recientes de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-props": "Obtener información adicional sobre la última revisión de páginas con cambios recientes en la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-allrev": "Obtener información sobre todos los cambios recientes de páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-generator": "Obtener información de página de las páginas con cambios recientes de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-generator-rev": "Obtener información de revisión de los cambios recientes de páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-wlowner": "Enumerar la última revisión de páginas con cambios recientes de la lista de seguimiento del usuario <kbd>Example</kbd>.",
+       "apihelp-query+watchlistraw-description": "Obtener todas las páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlistraw-param-namespace": "Mostrar solamente las páginas de los espacios de nombres dados.",
+       "apihelp-query+watchlistraw-param-limit": "Número de resultados que devolver en cada petición.",
        "apihelp-query+watchlistraw-param-prop": "Qué propiedades adicionales se obtendrán:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Añade la marca de tiempo de la última notificación al usuario sobre la edición.",
        "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
+       "apihelp-query+watchlistraw-param-owner": "Utilizado junto con $1token para acceder a la lista de seguimiento de otro usuario.",
        "apihelp-query+watchlistraw-param-dir": "La dirección en la que se listará.",
        "apihelp-query+watchlistraw-param-fromtitle": "Título (con el prefijo de espacio de nombres) desde el que se empezará a enumerar.",
        "apihelp-query+watchlistraw-param-totitle": "Título (con el prefijo de espacio de nombres) desde el que se dejará de enumerar.",
        "apihelp-query+watchlistraw-example-simple": "Listar las páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlistraw-example-generator": "Obtener información de las páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-removeauthenticationdata-description": "Elimina los datos de autentificación del usuario actual.",
+       "apihelp-removeauthenticationdata-example-simple": "Trata de eliminar los datos del usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Enviar un email de reinicialización de la contraseña a un usuario.",
+       "apihelp-resetpassword-param-user": "Usuario en proceso de reinicialización",
+       "apihelp-resetpassword-param-email": "Dirección de correo electrónico del usuario que se va a reinicializar",
+       "apihelp-resetpassword-example-user": "Enviar un correo de recuperación de contraseña al usuario <kbd>Ejemplo</kbd>.",
+       "apihelp-resetpassword-example-email": "Enviar un correo de recuperación de contraseña para todos los usuarios con dirección de correo electrónico <kbd>usuario@ejemplo.com</kbd>.",
        "apihelp-revisiondelete-description": "Eliminar y restaurar revisiones",
+       "apihelp-revisiondelete-param-target": "Título de la página para el borrado de la revisión, en caso de ser necesario para ese tipo.",
+       "apihelp-revisiondelete-param-ids": "Identificadores de las revisiones para borrar.",
        "apihelp-revisiondelete-param-hide": "Qué ocultar en cada revisión.",
        "apihelp-revisiondelete-param-show": "Qué mostrar en cada revisión.",
        "apihelp-revisiondelete-param-reason": "Motivo de la eliminación o restauración.",
+       "apihelp-revisiondelete-param-tags": "Etiquetas que aplicar a la entrada en el registro de borrados.",
+       "apihelp-revisiondelete-example-revision": "Ocultar el contenido de la revisión <kbd>12345</kbd> de la página <kbd>Main Page</kbd>.",
+       "apihelp-revisiondelete-example-log": "Ocultar todos los datos de la entrada de registro <kbd>67890</kbd> con el motivo <kbd>BLP violation</kbd>.",
+       "apihelp-rollback-description": "Deshacer la última edición de la página.\n\nSi el último usuario que editó la página hizo varias ediciones consecutivas, todas ellas serán revertidas.",
+       "apihelp-rollback-param-title": "Título de la página que revertir. No se puede usar junto con <var>$1pageid</var>.",
+       "apihelp-rollback-param-pageid": "Identificador de la página que revertir. No se puede usar junto con <var>$1title</var>.",
+       "apihelp-rollback-param-tags": "Etiquetas que aplicar a la reversión.",
+       "apihelp-rollback-param-user": "Nombre del usuario cuyas ediciones se van a revertir.",
        "apihelp-rollback-param-summary": "Resumen de edición personalizado. Si se deja vacío se utilizará el predeterminado.",
+       "apihelp-rollback-param-markbot": "Marcar las acciones revertidas y la reversión como ediciones por bots.",
+       "apihelp-rollback-param-watchlist": "Añadir o borrar incondicionalmente la página de la lista de seguimiento del usuario actual, usar preferencias o no cambiar seguimiento.",
+       "apihelp-rollback-example-simple": "Revertir las últimas ediciones de la página <kbd>Main Page</kbd> por el usuario <kbd>Example</kbd>.",
+       "apihelp-rollback-example-summary": "Revertir las últimas ediciones de la página <kbd>Main Page</kbd> por el usuario de IP <kbd>192.0.2.5</kbd> con resumen <kbd>Reverting vandalism</kbd>, y marcar esas ediciones y la reversión como ediciones realizadas por bots.",
+       "apihelp-rsd-description": "Exportar un esquema RSD (Really Simple Discovery; Descubrimiento Muy Simple).",
+       "apihelp-rsd-example-simple": "Exportar el esquema RSD.",
+       "apihelp-setnotificationtimestamp-description": "Actualizar la marca de tiempo de notificación de las páginas en la lista de seguimiento.\n\nEsto afecta a la función de resaltado de las páginas modificadas en la lista de seguimiento y al envío de correo electrónico cuando la preferencia \"{{int:tog-enotifwatchlistpages}}\" está habilitada.",
+       "apihelp-setnotificationtimestamp-param-entirewatchlist": "Trabajar en todas las páginas en seguimiento.",
+       "apihelp-setnotificationtimestamp-param-timestamp": "Marca de tiempo en la que fijar la marca de tiempo de notificación.",
+       "apihelp-setnotificationtimestamp-param-torevid": "Revisión a la que fijar la marca de tiempo de notificación (una sola página).",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "Revisión a la que fijar la marca de tiempo de notificación más reciente (una sola página).",
+       "apihelp-setnotificationtimestamp-example-all": "Restablecer el estado de notificación para la totalidad de la lista de seguimiento.",
+       "apihelp-setnotificationtimestamp-example-page": "Restablecer el estado de notificación de <kbd>Main page</kbd>.",
+       "apihelp-setnotificationtimestamp-example-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-param-title": "Título de la página cuyo idioma deseas cambiar. No se puede usar junto con <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Identificador de la página cuyo idioma deseas cambiar. No se puede usar junto con <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Código del idioma al que se desea cambiar la página. Usa <kbd>default</kbd> para restablecer la página al idioma predeterminado para el contenido del wiki.",
+       "apihelp-setpagelanguage-param-reason": "Motivo del cambio.",
+       "apihelp-setpagelanguage-param-tags": "Cambiar las etiquetas que aplicar a la entrada de registro resultante de esta acción.",
+       "apihelp-setpagelanguage-example-language": "Cambiar el idioma de <kbd>Main Page</kbd> al euskera.",
+       "apihelp-setpagelanguage-example-default": "Cambiar el idioma de la página con identificador 123 al idioma predeterminado para el contenido del wiki.",
        "apihelp-stashedit-param-title": "Título de la página que se está editando.",
        "apihelp-stashedit-param-section": "Número de la sección. <kbd>0</kbd> para una sección superior, <kbd>new</kbd> para una sección nueva.",
        "apihelp-stashedit-param-sectiontitle": "El título de una sección nueva.",
        "apihelp-stashedit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.",
        "apihelp-stashedit-param-baserevid": "Identificador de la revisión de base.",
        "apihelp-stashedit-param-summary": "Resumen de cambios.",
+       "apihelp-tag-description": "Añadir o borrar etiquetas de modificación de revisiones individuales o entradas de registro.",
+       "apihelp-tag-param-rcid": "Uno o más identificadores de cambios recientes a los que añadir o borrar la etiqueta.",
+       "apihelp-tag-param-revid": "Uno o más identificadores de revisión a los que añadir o borrar la etiqueta.",
        "apihelp-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.",
+       "apihelp-tag-param-add": "Etiquetas que añadir. Solo se pueden añadir etiquetas definidas manualmente.",
+       "apihelp-tag-param-remove": "Etiquetas que borrar. Solo se pueden borrar etiquetas definidas manualmente o completamente indefinidas.",
        "apihelp-tag-param-reason": "Motivo del cambio.",
+       "apihelp-tag-param-tags": "Etiquetas que aplicar a la entrada de registro que se generará como resultado de esta acción.",
        "apihelp-tag-example-rev": "Añadir la etiqueta <kbd>vandalism</kbd> al identificador de revisión 123 sin especificar un motivo",
        "apihelp-tag-example-log": "Eliminar la etiqueta <kbd>spam</kbd> de la entrada del registro con identificador 123 con el motivo <kbd>Wrongly applied</kbd>",
        "apihelp-unblock-description": "Desbloquear un usuario.",
-       "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o intervalo de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var>.",
+       "apihelp-unblock-param-id": "Identificador del bloqueo que se desea desbloquear (obtenido mediante <kbd>list=blocks</kbd>). No se puede usar junto con with <var>$1user</var> o <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o intervalo de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var> o <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID de usuario que desbloquear. No se puede utilizar junto con <var>$1id</var> o <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Motivo del desbloqueo.",
+       "apihelp-unblock-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de bloqueos.",
        "apihelp-unblock-example-id": "Desbloquear el bloqueo de ID #<kbd>105</kbd>",
        "apihelp-unblock-example-user": "Desbloquear al usuario <kbd>Bob</kbd> con el motivo <kbd>Sorry Bob</kbd>",
+       "apihelp-undelete-param-title": "Título de la página que restaurar.",
        "apihelp-undelete-param-reason": "Motivo de la restauración.",
+       "apihelp-undelete-param-tags": "Cambiar las etiquetas para aplicar a la entrada en el registro de borrados.",
+       "apihelp-undelete-param-timestamps": "Marcas de tiempo de las revisiones que se desea restaurar. Si tanto <var>$1timestamps</var> como <var>$1fileids</var> están vacíos, se restaurarán todas.",
+       "apihelp-undelete-param-fileids": "Identificadores de las revisiones que se desea restaurar. Si tanto <var>$1timestamps</var> como <var>$1fileids</var> están vacíos, se restaurarán todas.",
+       "apihelp-undelete-example-page": "Restaurar la página <kbd>Main page</kbd>.",
        "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Main Page</kbd>.",
+       "apihelp-upload-param-filename": "Nombre del archivo de destino.",
        "apihelp-upload-param-tags": "Cambiar etiquetas para aplicar a la entrada del registro de subidas y a la revisión de página de archivo.",
+       "apihelp-upload-param-text": "Texto de página inicial para archivos nuevos.",
        "apihelp-upload-param-watch": "Vigilar la página.",
+       "apihelp-upload-param-watchlist": "Añadir o borrar incondicionalmente la página de la lista de seguimiento del usuario actual, utilizar las preferencias o no cambiar el estado de seguimiento.",
        "apihelp-upload-param-ignorewarnings": "Ignorar las advertencias.",
+       "apihelp-upload-param-file": "Contenido del archivo.",
+       "apihelp-upload-param-url": "URL de la que obtener el archivo.",
+       "apihelp-upload-param-sessionkey": "Idéntico a $1filekey, mantenido por razones de retrocompatibilidad.",
+       "apihelp-upload-param-filesize": "Tamaño de archivo total de la carga.",
+       "apihelp-upload-param-offset": "Posición del fragmento en bytes.",
+       "apihelp-upload-param-chunk": "Contenido del fragmento.",
+       "apihelp-upload-param-async": "Realizar de forma asíncrona las operaciones de archivo potencialmente grandes cuando sea posible.",
        "apihelp-upload-example-url": "Subir desde una URL.",
+       "apihelp-upload-example-filekey": "Completar una subida que falló debido a advertencias.",
+       "apihelp-userrights-description": "Cambiar la pertenencia a grupos de un usuario.",
        "apihelp-userrights-param-user": "Nombre de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
-       "apihelp-userrights-param-add": "Agregar el usuario a estos grupos.",
+       "apihelp-userrights-param-add": "Agregar el usuario a estos grupos, o, si ya es miembro, actualizar la fecha de expiración de su pertenencia a ese grupo.",
+       "apihelp-userrights-param-expiry": "Marcas de tiempo de expiración. Pueden ser relativas (por ejemplo, <kbd>5 months</kbd> o <kbd>2 weeks</kbd>) o absolutas (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si sólo se fija una marca de tiempo, se utilizará para todos los grupos que se pasen al parámetro <var>$1añadir</var>. Usa <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, o <kbd>never</kbd> para que la pertenencia al grupo no tenga fecha de expiración.",
        "apihelp-userrights-param-remove": "Eliminar el usuario de estos grupos.",
        "apihelp-userrights-param-reason": "Motivo del cambio.",
+       "apihelp-userrights-param-tags": "Cambia las etiquetas que aplicar a la entrada del registro de derechos del usuario.",
        "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-userid": "Añade el usuario con identificador <kbd>123</kbd> al grupo <kbd>bot</kbd>, y lo borra de los grupos <kbd>sysop</kbd> y <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "Añadir al usuario <kbd>SometimeSysop</kbd> al grupo <kbd>sysop</kbd> por 1 mes.",
+       "apihelp-validatepassword-description": "Valida una contraseña contra las políticas de contraseñas del wiki.\n\nLa validez es <samp>Good</samp> si la contraseña es aceptable, <samp>Change</samp> y la contraseña se puede usar para iniciar sesión pero debe cambiarse o <samp>Invalid</samp> si la contraseña no se puede usar.",
+       "apihelp-validatepassword-param-password": "Contraseña para validar.",
+       "apihelp-validatepassword-param-user": "Nombre de usuario, para pruebas de creación de cuentas. El usuario nombrado no debe existir.",
+       "apihelp-validatepassword-param-email": "Dirección de correo electrónico, para pruebas de creación de cuentas.",
+       "apihelp-validatepassword-param-realname": "Nombre real, para pruebas de creación de cuentas.",
+       "apihelp-validatepassword-example-1": "Validar la contraseña <kbd>foobar</kbd> para el usuario actual.",
+       "apihelp-validatepassword-example-2": "Validar la contraseña <kbd>qwerty</kbd> para la creación del usuario <kbd>Example</kbd>.",
+       "apihelp-watch-description": "Añadir o borrar páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-watch-param-title": "La página que seguir o dejar de seguir. Usa <var>$1titles</var> en su lugar.",
+       "apihelp-watch-param-unwatch": "Si se define, en vez de seguir la página, se dejará de seguir.",
        "apihelp-watch-example-watch": "Vigilar la página <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Dejar de vigilar la <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-generator": "Seguir las primeras páginas del espacio de nombres principal.",
        "apihelp-format-example-generic": "Devolver el resultado de la consulta en formato $1.",
+       "apihelp-format-param-wrappedhtml": "Devolver el HTML con resaltado sintáctico y los módulos ResourceLoader asociados en forma de objeto JSON.",
        "apihelp-json-description": "Extraer los datos de salida en formato JSON.",
        "apihelp-json-param-callback": "Si se especifica, envuelve la salida dentro de una llamada a una función dada. Por motivos de seguridad, cualquier dato específico del usuario estará restringido.",
        "apihelp-json-param-utf8": "Si se especifica, codifica la mayoría (pero no todos) de los caracteres no pertenecientes a ASCII como UTF-8 en lugar de reemplazarlos por secuencias de escape hexadecimal. Toma el comportamiento por defecto si <var>formatversion</var> no es <kbd>1</kbd>.",
        "apihelp-json-param-ascii": "Si se especifica, codifica todos los caracteres no pertenecientes a ASCII mediante secuencias de escape hexadecimal. Toma el comportamiento por defecto si <var>formatversion</var> no es <kbd>1</kbd>.",
        "apihelp-json-param-formatversion": "Formato de salida:\n;1: Formato retrocompatible (booleanos con estilo XML, claves <samp>*</samp> para nodos de contenido, etc.).\n;2: Formato moderno experimental. ¡Atención, las especificaciones pueden cambiar!\n;latest: Utiliza el último formato (actualmente <kbd>2</kbd>). Puede cambiar sin aviso.",
+       "apihelp-jsonfm-description": "Producir los datos de salida en formato JSON (con resaltado sintáctico en HTML).",
        "apihelp-none-description": "No extraer nada.",
        "apihelp-php-description": "Extraer los datos de salida en formato serializado PHP.",
+       "apihelp-php-param-formatversion": "Formato de salida:\n;1: Formato retrocompatible (booleanos con estilo XML, claves <samp>*</samp> para nodos de contenido, etc.).\n;2: Formato moderno experimental. ¡Atención, las especificaciones pueden cambiar!\n;latest: Utilizar el último formato (actualmente <kbd>2</kbd>). Puede cambiar sin aviso.",
+       "apihelp-phpfm-description": "Producir los datos de salida en formato PHP serializado (con resaltado sintáctico en HTML).",
        "apihelp-rawfm-description": "Extraer los datos de salida, incluidos los elementos de depuración, en formato JSON (embellecido en HTML).",
-       "apihelp-xml-param-xslt": "Si se especifica, añade la página nombrada como una hoja de estilo XSL. El valor debe ser un título en el espacio de nombres {{ns:mediawiki}} que termine en <code>.xsl</code>.",
+       "apihelp-xml-description": "Producir los datos de salida en formato XML.",
+       "apihelp-xml-param-xslt": "Si se especifica, añade la página nombrada como una hoja de estilo XSL. El valor debe ser un título en el espacio de nombres {{ns:MediaWiki}} que termine en <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si se especifica, añade un espacio de nombres XML.",
+       "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-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-revids": "Una lista de identificadores de revisiones 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-help-title": "Ayuda de la API de MediaWiki",
+       "api-help-lead": "Esta es una página de documentación autogenerada de la API de MediaWiki.\n\nDocumentación y ejemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está en desuso.",
+       "api-help-flag-internal": "<strong>Este módulo es interno o inestable.</strong> Su funcionamiento puede cambiar sin previo aviso.",
        "api-help-flag-readrights": "Este módulo requiere permisos de lectura.",
        "api-help-flag-writerights": "Este módulo requiere permisos de escritura.",
        "api-help-flag-mustbeposted": "Este módulo solo acepta solicitudes POST.",
        "api-help-param-deprecated": "En desuso.",
        "api-help-param-required": "Este parámetro es obligatorio.",
        "api-help-datatypes-header": "Tipos de datos",
-       "api-help-datatypes": "Algunos tipos de parámetros en las solicitudes de API necesita más explicación:\n;boolean\n:Los parámetros booleanos trabajo como HTML casillas de verificación: si el parámetro se especifica, independientemente de su valor, se considera verdadero. Para un valor false, se omite el parámetro completo.\n;marca de tiempo\n:Las marcas de tiempo se puede especificar en varios formatos. ISO 8601 la fecha y la hora se recomienda. Todas las horas están en UTC, la inclusión de la zona horaria es ignorado.\n:* ISO 8601 la fecha y la hora, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (signos de puntuación y <kbd>Z</kbd> son opcionales)\n:* ISO 8601 la fecha y la hora (se omite) fracciones de segundos, <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> (guiones, dos puntos, y, <kbd>Z</kbd> son opcionales)\n:* MediaWiki formato, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Genérico formato numérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (opcional en la zona horaria de <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, o <kbd>-<var>##</var></kbd> se omite)\n:* El formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (zona horaria se puede omitir), <kbd><var>Mon</var>, <var>15</var> <var>Ene</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (zona horaria se puede omitir), <kbd><var>lunes</var>, <var>15</var>-<var>Ene</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime formato, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>de 2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como la 1 a la 13 dígito entero (excepto <kbd>0</kbd>)\n:* La cadena de <kbd>ahora</kbd>",
+       "api-help-datatypes": "Las entradas en MediaWiki deberían estar en UTF-8 según la norma NFC. MediaWiki puede tratar de convertir otros formatos, pero esto puede provocar errores en algunas operaciones (tales como las [[Special:ApiHelp/edit|ediciones]] con controles MD5).\n\nAlgunos tipos de parámetros en las solicitudes de API requieren de una explicación más detallada:\n;boolean\n:Los parámetros booleanos trabajo como cajas de verificación de HTML: si el parámetro está definido, independientemente de su valor, se considera verdadero. Para un valor falso, se debe omitir el parámetro  por completo.\n;marca de tiempo\n:Las marcas de tiempo se pueden definir en varios formatos. Se recomienda seguir la norma ISO 8601 de fecha y hora. Todas las horas están en UTC, ignorándose cualquier indicación de zona horaria.\n:* Fecha y hora en ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (los signos de puntuación y la <kbd>Z</kbd> son opcionales)\n:* Fecha y hora en ISO 8601 con fracciones de segundo (que se omiten), <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> (los guiones, los dos puntos y la <kbd>Z</kbd> son opcionales)\n:* Formato MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato genérico de número, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (la zona horaria opcional, sea <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> o <kbd>-<var>##</var></kbd> se omite)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (la zona horaria es opcional), <kbd><var>lun</var>, <var>15</var> <var>ene</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (la zona horaria es opcional), <kbd><var>lunes</var>, <var>15</var>-<var>ene</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato ctime de 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:* Número de segundos desde 1970-01-01T00:00:00Z en forma de número entero de entre 1 y 13 cifras (sin <kbd>0</kbd>)\n:* La cadena <kbd>now</kbd>\n\n;separador alternativo de valores múltiples\n:Los parámetros que toman valores múltiples se envían normalmente utilizando la barra vertical para separar los valores, p. ej., <kbd>param=valor1|valor2</kbd> o <kbd>param=valor1%7Cvalor2</kbd>. Si un valor tiene que contener el carácter de barra vertical, utiliza U+001F (separador de unidades) como separador ''y'' prefija el valor con, p. ej. <kbd>param=%1Fvalor1%1Fvalor2</kbd>.",
        "api-help-param-type-limit": "Tipo: entero o <kbd>max</kbd>",
        "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=entero|2=lista de enteros}}",
        "api-help-param-type-boolean": "Tipo: booleano/lógico ([[Special:ApiHelp/main#main/datatypes|detalles]])",
        "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=timestamp|2=lista de timestamps}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nombre de usuario|2=lista de nombres de usuarios}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Uno de los siguientes valores|2=Valores (separados por <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Uno de los siguientes valores|2=Valores (separados por <kbd>{{!}}</kbd> u [[Special:ApiHelp/main#main/datatypes|otro separador]])}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Debe estar vacío|Puede estar vacío, o $2}}",
        "api-help-param-limit": "No se permite más de $1.",
        "api-help-param-limit2": "No se permite más de $1 ($2 para los bots).",
        "api-help-param-integer-min": "{{PLURAL:$1|1=El valor no debe ser menor|2=Los valores no deben ser menores}} a $2.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=El valor no debe ser mayor|2=Los valores no deben ser mayores}} a $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=El valor debe|2=Los valores deben}} estar entre $2 y $3.",
-       "api-help-param-multi-separate": "Separar los valores con <kbd>|</kbd>.",
+       "api-help-param-multi-separate": "Separar los valores con <kbd>|</kbd> o con una [[Special:ApiHelp/main#main/datatypes|alternativa]].",
        "api-help-param-multi-max": "El número máximo de los valores es {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para los bots).",
+       "api-help-param-multi-all": "Para especificar todos los valores, utiliza <kbd>$1</kbd>.",
        "api-help-param-default": "Predeterminado: $1",
        "api-help-param-default-empty": "Predeterminado: <span class=\"apihelp-empty\">(vacío)</span>",
+       "api-help-param-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-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>",
        "api-help-examples": "{{PLURAL:$1|Ejemplo|Ejemplos}}:",
        "api-help-permissions": "{{PLURAL:$1|Permiso|Permisos}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedido a|Concedidos a}}: $2",
+       "api-help-right-apihighlimits": "Usa límites más altos para consultas a través de la API (consultas lentas: $1; consultas rápidas: $2). Los límites para las consultas lentas también se aplican a los parámetros multivalorados.",
+       "api-help-open-in-apisandbox": "<small>[abrir en la zona de pruebas]</small>",
+       "api-help-authmanagerhelper-messageformat": "Formato utilizado para los mensajes devueltos.",
+       "api-help-authmanagerhelper-mergerequestfields": "Combinar la información de los campos para todas las peticiones de autentificación en una matriz.",
+       "api-help-authmanagerhelper-preservestate": "Preservar el estado de un intento fallido anterior de inicio de sesión, si es posible.",
+       "apierror-allimages-redirect": "Usar <kbd>gaifilterredir=nonredirects</kbd> en lugar de <var>redirects</var> cuando se use <kbd>allimages</kbd> como generador.",
+       "apierror-allpages-generator-redirects": "Usar <kbd>gaifilterredir=nonredirects</kbd> en lugar de <var>redirects</var> cuando se use <kbd>allpages</kbd> como generador.",
+       "apierror-appendnotsupported": "No se puede añadir a las páginas que utilizan el modelo de contenido $1.",
+       "apierror-articleexists": "El artículo que intentaste crear ya estaba creado.",
+       "apierror-assertbotfailed": "La aserción de que el usuario tiene el derecho <code>bot</code> falló.",
+       "apierror-assertnameduserfailed": "La aserción de que el usuario es «$1» falló.",
+       "apierror-assertuserfailed": "La aserción de que el usuario está conectado falló.",
+       "apierror-autoblocked": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por un usuario bloqueado.",
+       "apierror-badconfig-resulttoosmall": "El valor de <code>$wgAPIMaxResultSize</code> en este wiki es demasiado pequeño como para contener información básica de resultados.",
+       "apierror-badcontinue": "Parámetro continue no válido. Debes pasar el valor original devuelto por la consulta anterior.",
+       "apierror-baddiff": "La comparación no puede recuperarse. Una o ambas revisiones no existen o no tienes permiso para verlas.",
+       "apierror-baddiffto": "<var>$1diffto</var> debe fijarse a un número no negativo, <kbd>prev</kbd>, <kbd>next</kbd> or <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "El formato solicitado $1 no es compatible con el modelo de contenido $2.",
+       "apierror-badformat": "El formato solicitado $1 no es compatible con el modelo de contenido $2 utilizado por $3.",
+       "apierror-badgenerator-notgenerator": "El módulo <kbd>$1</kbd> no puede utilizarse como un generador.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> desconocido.",
+       "apierror-badip": "El parámetro IP no es válido.",
+       "apierror-badmd5": "El hash MD5 suministrado es incorrecto.",
+       "apierror-badmodule-badsubmodule": "El módulo <kbd>$1</kbd> no tiene un submódulo \"$2\".",
+       "apierror-badmodule-nosubmodules": "El módulo <kbd>$1</kbd> no tiene submódulos.",
+       "apierror-badparameter": "Valor no válido para el parámetro <var>$1</var>.",
+       "apierror-badquery": "La consulta no es válida.",
+       "apierror-badtimestamp": "Valor no válido \"$2\" para el parámetro de marca de tiempo <var>$1</var>.",
+       "apierror-badupload": "El parámetro de subida de archivo <var>$1</var> no es una subida de archivo. Asegúrate de usar <code>multipart/form-data</code> para tu POST e introduce un nombre de archivo en la cabecera <code>Content-Disposition</code>.",
+       "apierror-badurl": "Valor no válido \"$2\" para el parámetro de URL <var>$1</var>.",
+       "apierror-baduser": "Valor no válido \"$2\" para el parámetro de usuario <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "El separador multivalor U+001F solo se puede utilizar en parámetros multivalorados.",
+       "apierror-blockedfrommail": "Se te ha bloqueado de enviar email.",
+       "apierror-blocked": "Se te ha bloqueado de editar.",
+       "apierror-botsnotsupported": "Esta interfaz no está disponible para bots.",
+       "apierror-cannotreauthenticate": "Esta acción no está disponible, ya que tu identidad no se puede verificar.",
+       "apierror-cannotviewtitle": "No tienes permiso para ver $1.",
+       "apierror-cantblock-email": "No tienes permiso para bloquear a los usuarios el envío de correo electrónico a través de la wiki.",
+       "apierror-cantblock": "No tienes permiso para bloquear usuarios.",
+       "apierror-cantchangecontentmodel": "No tienes permiso para cambiar el modelo de contenido de una página.",
+       "apierror-canthide": "No tienes permiso para ocultar nombres de usuario del registro de bloqueos.",
+       "apierror-cantimport-upload": "No tienes permiso para importar páginas subidas.",
+       "apierror-cantimport": "No tienes permiso para importar páginas.",
+       "apierror-cantoverwrite-sharedfile": "El fichero objetivo existe en un repositorio compartido y no tienes permiso para reemplazarlo.",
+       "apierror-cantsend": "No estás conectado, no tienes una dirección de correo electrónico confirmada o no tienes permiso para enviar correo electrónico a otros usuarios, así que no puedes enviar correo electrónico.",
+       "apierror-cantundelete": "No se ha podido restaurar: puede que las revisiones solicitadas no existan o que ya se hayan restaurado.",
+       "apierror-changeauth-norequest": "No se ha podido crear la petición de modificación.",
+       "apierror-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-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-deletedrevs-param-not-1-2": "El parámetro <var>$1</var> no se puede utilizar en los modos 1 o 2.",
+       "apierror-deletedrevs-param-not-3": "El parámetro <var>$1</var> no se puede usar en modo 3.",
+       "apierror-emptynewsection": "Crear secciones vacías no es posible.",
+       "apierror-emptypage": "Crear páginas vacías no está permitido.",
+       "apierror-exceptioncaught": "[$1] Excepción capturada: $2",
+       "apierror-filedoesnotexist": "El archivo no existe.",
+       "apierror-fileexists-sharedrepo-perm": "El archivo objetivo existe en un repositorio compartido. Usa el parámetro <var>ignorewarnings</var> para reemplazarlo.",
+       "apierror-filenopath": "No se pudo obtener la ruta local del archivo.",
+       "apierror-filetypecannotberotated": "El tipo de archivo no se puede girar.",
+       "apierror-formatphp": "Esta respuesta no se puede representar con <kbd>format=php</kbd>. Véase https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "El título de <kbd>$1</kbd> debe ser un archivo.",
+       "apierror-import-unknownerror": "Error desconocido en la importación: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> no puede ser mayor que $2 (fijado a $3) para bots o administradores de sistema.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> no puede ser mayor que $2 (fijado a $3) para usuarios.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> no puede ser menor que $2 (fijado a $3).",
+       "apierror-invalidcategory": "El nombre de la categoría que has introducido no es válida.",
+       "apierror-invalidexpiry": "Tiempo de expiración \"$1\" no válido.",
+       "apierror-invalidlang": "Código de idioma no válido para el parámetro <var>$1</var>.",
+       "apierror-invalidparammix-cannotusewith": "El parámetro <kbd>$1</kbd> no se puede utilizar junto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "El parámetro <kbd>$1</kbd> solo se puede utilizar junto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> no se puede combinar con los parámetros <var>oldid</var>, <var>pageid</var> y <var>page</var>. Por favor, utiliza <var>title</var> y <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Los parámetros}} $1 no se pueden utilizar juntos.",
+       "apierror-invalidsection": "El parámetro de sección debe ser un ID de sección válido, o bien <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "El hash SHA1Base36 proporcionado no es válido.",
+       "apierror-invalidsha1hash": "El hash SHA1 proporcionado no es válido.",
+       "apierror-invalidtitle": "Título incorrecto \"$1\".",
+       "apierror-invalidurlparam": "Valor no válido para <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Nombre de usuario «$1» no válido.",
+       "apierror-invaliduserid": "El identificador de usuario <var>$1</var> no es válido.",
+       "apierror-mimesearchdisabled": "La búsqueda MIME está deshabilitada en el modo avaro.",
+       "apierror-missingcontent-pageid": "Contenido faltante para la página con identificador $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|El parámetro|Al menos uno de los parámetros}} $1 es necesario.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|El parámetro|Uno de los parámetros}} $1 es necesario.",
+       "apierror-missingparam": "Se debe establecer el parámetro <var>$1</var>.",
+       "apierror-missingrev-pageid": "No hay ninguna revisión actual de la página con ID $1.",
+       "apierror-missingtitle-createonly": "Los títulos faltantes solo se pueden proteger con <kbd>create</kbd>.",
+       "apierror-missingtitle": "El título especificado no existe.",
+       "apierror-missingtitle-byname": "La página $1 no existe.",
+       "apierror-moduledisabled": "El módulo <kbd>$1</kbd> ha sido deshabilitado.",
+       "apierror-multival-only-one-of": "Solo {{PLURAL:$3|se permite el valor|se permiten los valores}} $2 para el parámetro <var>$1</var>.",
+       "apierror-multival-only-one": "Solo se permite un valor para el parámetro <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> no se puede utilizar más que con una sola página.",
+       "apierror-mustbeloggedin-changeauth": "Debes estar conectado para poder cambiar los datos de autentificación.",
+       "apierror-mustbeloggedin-generic": "Debes estar conectado.",
+       "apierror-mustbeloggedin-linkaccounts": "Debes estar conectado para enlazar cuentas.",
+       "apierror-mustbeloggedin-removeauth": "Debes estar conectado para borrar datos de autentificación.",
+       "apierror-mustbeloggedin": "Debes estar conectado para $1.",
+       "apierror-mustbeposted": "El módulo <kbd>$1</kbd> requiere una petición POST.",
+       "apierror-mustpostparams": "Se {{PLURAL:$2|encontró el siguiente parámetro|encontraron los siguientes parámetros}} en la cadena de la consulta, pero deben estar en el cuerpo del POST: $1.",
+       "apierror-noapiwrite": "La edición de este wiki a través de la API está deshabilitada. Asegúrate de que la declaración <code>$wgEnableWriteAPI=true;</code> está incluida en el archivo <code>LocalSettings.php</code> del wiki.",
+       "apierror-nochanges": "No se solicitó ningún cambio.",
+       "apierror-nodeleteablefile": "No existe tal versión antigua del archivo.",
+       "apierror-no-direct-editing": "La edición directa a través de la API no es compatible con el modelo de contenido $1 utilizado por $2.",
+       "apierror-noedit-anon": "Los usuarios anónimos no pueden editar páginas.",
+       "apierror-noedit": "No tienes permiso para editar páginas.",
+       "apierror-noimageredirect-anon": "Los usuarios anónimos no pueden crear redirecciones de imágenes.",
+       "apierror-noimageredirect": "No tienes permiso para crear redirecciones de imágenes.",
+       "apierror-nosuchlogid": "No hay ninguna entrada de registro con identificador $1.",
+       "apierror-nosuchpageid": "No hay ninguna página con identificador $1.",
+       "apierror-nosuchrcid": "No hay ningún cambio reciente con identificador $1.",
+       "apierror-nosuchrevid": "No hay ninguna revisión con identificador $1.",
+       "apierror-nosuchsection": "No hay ninguna sección $1.",
+       "apierror-nosuchsection-what": "No hay ninguna sección $1 en $2.",
+       "apierror-nosuchuserid": "No hay ningún usuario con ID $1.",
+       "apierror-notarget": "No has especificado un destino válido para esta acción.",
+       "apierror-notpatrollable": "La revisión r$1 no se puede patrullar por ser demasiado antigua.",
+       "apierror-opensearch-json-warnings": "No se pueden representar los avisos en formato JSON de OpenSearch.",
+       "apierror-pagecannotexist": "En este espacio de nombres no se permiten páginas reales.",
+       "apierror-pagedeleted": "La página ha sido borrada en algún momento desde que obtuviste su marca de tiempo.",
+       "apierror-pagelang-disabled": "En este wiki no se puede cambiar el idioma de una página.",
+       "apierror-paramempty": "El parámetro <var>$1</var> no puede estar vacío.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> solo es compatible con el contenido en wikitexto.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> solo es compatible con el contenido en wikitexto. $1 usa el modelo de contenido $2.",
+       "apierror-permissiondenied": "No tienes permiso para $1.",
+       "apierror-permissiondenied-generic": "Permiso denegado.",
+       "apierror-permissiondenied-unblock": "No tienes permiso para desbloquear usuarios.",
+       "apierror-prefixsearchdisabled": "La búsqueda por prefijo está deshabilitada en el modo avaro.",
+       "apierror-promised-nonwrite-api": "La cabecera HTTP <code>Promise-Non-Write-API-Action</code> no se puede enviar a módulos de la API en modo escritura.",
+       "apierror-protect-invalidaction": "Tipo de protección «$1» no válido.",
+       "apierror-protect-invalidlevel": "Nivel de protección «$1» no válido.",
+       "apierror-readapidenied": "Necesitas permiso de lectura para utilizar este módulo.",
+       "apierror-readonly": "El wiki está actualmente en modo de solo lectura.",
+       "apierror-reauthenticate": "No te has autentificado recientemente en esta sesión. Por favor, vuelve a autentificarte.",
+       "apierror-revdel-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-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-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.",
+       "apierror-show": "Parámetro incorrecto: no se pueden proporcionar valores mutuamente excluyentes.",
+       "apierror-siteinfo-includealldenied": "No se puede ver la información de todos los servidores a menos que <var>$wgShowHostNames</var> tenga valor verdadero.",
+       "apierror-sizediffdisabled": "La diferencia de tamaño está deshabilitada en el modo avaro.",
+       "apierror-spamdetected": "Tu edición fue rechazada por contener un fragmento de spam: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "No tienes permiso para ver los resultados de esta página especial.",
+       "apierror-stashwrongowner": "Propietario incorrecto: $1",
+       "apierror-systemblocked": "Has sido bloqueado automáticamente por el software MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "La expansión de plantillas solo es compatible con el contenido en wikitexto. $1 usa el modelo de contenido $2.",
+       "apierror-unknownaction": "La acción especificada, <kbd>$1</kbd>, no está reconocida.",
+       "apierror-unknownerror-editpage": "Error de EditPage desconocido: $1.",
+       "apierror-unknownerror-nocode": "Error desconocido.",
+       "apierror-unknownerror": "Error desconocido: «$1»",
+       "apierror-unknownformat": "Formato no reconocido «$1».",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro no reconocido|Parámetros no reconocidos}}: $1.",
+       "apierror-unrecognizedvalue": "Valor no reconocido para el parámetro <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "El repositorio local de archivos no permite consultar todas las imágenes.",
+       "apierror-urlparamnormal": "No se pudieron normalizar los parámetros de imagen de $1.",
+       "apierror-writeapidenied": "No tienes permiso para editar este wiki a través de la API.",
+       "apiwarn-alldeletedrevisions-performance": "Para conseguir un mejor rendimiento a la hora de generar títulos, establece <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "No se pudo analizar <var>$1urlparam</var> para $2. Se utilizarán solamente la anchura y altura.",
+       "apiwarn-badutf8": "El valor pasado para <var>$1</var> contiene datos no válidos o no normalizados. Los datos textuales deberían estar en Unicode válido, normalizado en NFC y sin caracteres de control C0 excepto HT (\\t), LF (\\n) y CR (\\r).",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>prop=deletedrevisions</kbd> o <kbd>list=alldeletedrevisions</kbd>.",
+       "apiwarn-deprecation-expandtemplates-prop": "Como no se ha especificado ningún valor para el parámetro <var>prop</var>, se ha utilizado un formato heredado para la salida. Este formato está en desuso y, en el futuro, el parámetro <var>prop</var> tendrá un valor predeterminado, de forma que siempre se utilizará el formato nuevo.",
+       "apiwarn-deprecation-httpsexpected": "Se ha utilizado HTTP cuando se esperaba HTTPS.",
+       "apiwarn-deprecation-login-botpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para proseguir el inicio de sesión mediante <kbd>action=login</kbd>, véase [[Special:BotPasswords]]. Para proseguir el inicio de sesión con la cuenta principal de forma segura, véase <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para iniciar sesión de forma segura, véase <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-parameter": "El parámetro <var>$1</var> ha quedado obsoleto.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está en desuso desde MediaWiki 1.28. Usa <kbd>prop=headhtml</kbd> cuando crees nuevos documentos HTML, o <kbd>prop=módulos|jsconfigvars</kbd> cuando actualices un documento en el lado del cliente.",
+       "apiwarn-deprecation-purge-get": "El uso de <kbd>action=purge</kbd> mediante GET está obsoleto. Usa POST en su lugar.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>$2</kbd>.",
+       "apiwarn-invalidcategory": "\"$1\" no es una categoría.",
+       "apiwarn-invalidtitle": "«$1» no es un título válido.",
+       "apiwarn-invalidxmlstylesheetext": "Las hojas de estilo deben tener la extensión <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "La hoja de estilos especificada no es válida o no existe.",
+       "apiwarn-invalidxmlstylesheetns": "La hoja de estilos debería estar en el espacio de nombres {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "La propiedad <kbd>modules</kbd> está definida, pero no lo está <kbd>jsconfigvars</kbd> ni <kbd>encodedjsconfigvars</kbd>. Las variables de configuración son necesarias para el correcto uso del módulo.",
+       "apiwarn-notfile": "\"$1\" no es un archivo.",
+       "apiwarn-parse-nocontentmodel": "No se proporcionó <var>title</var> ni <var>contentmodel</var>. Se asume $1.",
+       "apiwarn-tokennotallowed": "La acción «$1» no está permitida para el usuario actual.",
+       "apiwarn-truncatedresult": "Se ha truncado este resultado porque de otra manera sobrepasaría el límite de $1 bytes.",
+       "apiwarn-unclearnowtimestamp": "El paso de «$2» para el parámetro <var>$1</var> de la marca de tiempo ha quedado obsoleto. Si por alguna razón necesitas especificar de forma explícita la hora actual sin calcularla desde el lado del cliente, utiliza <kbd>now</kbd> («ahora»).",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor no reconocido|Valores no reconocidos}} para el parámetro <var>$1</var>: $2.",
+       "apiwarn-validationfailed-badchars": "caracteres no válidos en la clave (solamente se admiten los caracteres <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code> y <code>-</code>).",
+       "apiwarn-validationfailed-badpref": "no es una preferencia válida.",
+       "apiwarn-validationfailed-cannotset": "no puede ser establecido por este módulo.",
+       "apiwarn-validationfailed-keytoolong": "clave demasiado larga (no puede tener más de $1 bytes).",
+       "apiwarn-validationfailed": "Error de validación de <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Aviso de seguridad</strong>: <var>$wgDebugAPI</var> está habilitado.",
+       "api-feed-error-title": "Error ($1)",
+       "api-usage-docref": "Véase $1 para el uso de la API.",
+       "api-exception-trace": "$1 en $2($3)\n$4",
        "api-credits-header": "Créditos",
        "api-credits": "Desarrolladores de la API:\n* Roan Kattouw (desarrollador principal, sep. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador y desarrollador principal, sep. 2006-sep. 2007)\n* Brad Jorsch (desarrollador principal, 2013-actualidad)\n\nEnvía comentarios, sugerencias y preguntas a mediawiki-api@lists.wikimedia.org\no informa de un error en https://phabricator.wikimedia.org/."
 }
index 5d2f396..1773279 100644 (file)
        "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.",
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
+       "apihelp-main-param-responselanginfo": "Inclure les langues utilisées pour <var>uselang</var> et <var>errorlang</var> dans le résultat.",
        "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et doit donc faire partie de l’URI de la requête (pas du corps du POST).\n\nPour les requêtes authentifiées, il doit correspondre exactement à une des origines dans l’entête <code>Origin</code> header, donc il doit être fixé avec quelque chose comme <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Si ce paramètre ne correspond pas à l’entête <code>Origin</code>, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête <code>Origin</code> et que l’origine est en liste blanche, des entêtes <code>Access-Control-Allow-Origin</code> et <code>Access-Control-Allow-Credentials</code> seront positionnés.\n\nPour les requêtes non authentifiées, spécifiez la valeur <kbd>*</kbd>. Cela positionnera l’entête <code>Access-Control-Allow-Origin</code>, mais <code>Access-Control-Allow-Credentials</code> vaudra <code>false</code> et toutes les données spécifiques à l’utilisateur seront filtrées.",
        "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoie une liste de codes de langue, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> pour utiliser le langage du contenu de ce wiki.",
+       "apihelp-main-param-errorformat": "Format à utiliser pour la sortie du texte d’avertissement et d’erreur.\n; plaintext: Wikitexte avec balises HTML supprimées et les entités remplacées.\n; wikitext: wikitexte non analysé.\n; html: HTML.\n; raw: Clé de message et paramètres.\n; none: Aucune sortie de texte, uniquement les codes erreur.\n; bc: Format utilisé avant MédiaWiki 1.29. <var>errorlang</var> et <var>errorsuselocal</var> sont ignorés.",
+       "apihelp-main-param-errorlang": "Langue à utiliser pour les avertissements et les erreurs. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoyant une liste de codes de langue, ou spécifier <kbd>content</kbd> pour utiliser la langue du contenu de ce wiki, ou spécifier <kbd>uselang</kbd> pour utiliser la même valeur que le paramètre <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "S’il est fourni, les textes d’erreur utiliseront des messages adaptés à la langue dans l’espace de noms {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquer un utilisateur.",
-       "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer.",
+       "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer. Ne peut pas être utilisé en même temps que <var>$1userid</var>",
+       "apihelp-block-param-userid": "ID d'utilisateur à bloquer. Ne peut pas être utilisé avec <var>$1user</var>.",
        "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. <kbd>5 months</kbd> ou <kbd>2 weeks</kbd>) ou absolue (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si elle est mise à <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, le blocage n’expirera jamais.",
        "apihelp-block-param-reason": "Motif du blocage.",
        "apihelp-block-param-anononly": "Bloquer uniquement les utilisateurs anonymes (c’est-à-dire désactiver les modifications anonymes pour cette adresse IP).",
@@ -55,6 +60,7 @@
        "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.",
        "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
+       "apihelp-block-param-tags": "Modifier les balises à appliquer à l’entrée du journal des blocages.",
        "apihelp-block-example-ip-simple": "Bloquer l’adresse IP <kbd>192.0.2.5</kbd> pour trois jours avec le motif <kbd>Premier avertissement</kbd>.",
        "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandal</kbd> avec le motif <kbd>Vandalism</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
        "apihelp-changeauthenticationdata-description": "Modifier les données d’authentification pour l’utilisateur actuel.",
        "apihelp-cspreport-param-reportonly": "Marquer comme étant un rapport d’une politique de surveillance, et non une politique exigée",
        "apihelp-cspreport-param-source": "Ce qui a généré l’entête CSP qui a déclenché ce rapport",
        "apihelp-delete-description": "Supprimer une page.",
-       "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec <var>$1pageid</var>.",
+       "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.",
        "apihelp-delete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal des suppressions.",
        "apihelp-edit-param-watch": "Ajouter la page à la liste de suivi de l'utilisateur actuel.",
        "apihelp-edit-param-unwatch": "Supprimer la page de la liste de suivi de l'utilisateur actuel.",
        "apihelp-edit-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
-       "apihelp-edit-param-md5": "Le hachage MD5 du paramètre $1text, ou les paramètres $1prependtext et $1appendtext concaténés. Si défini, la modification ne sera pas effectuée à moins que le hachage ne soit correct.",
+       "apihelp-edit-param-md5": "Le hachage MD5 du paramètre $1text, ou les paramètres $1prependtext et $1appendtext concaténés. Si défini, la modification ne sera pas effectuée sauf si le hachage est correct.",
        "apihelp-edit-param-prependtext": "Ajouter ce texte au début de la page. Écrase $1text.",
        "apihelp-edit-param-appendtext": "Ajouter ce texte à la fin de la page. Écrase $1text.\n\nUtiliser $1section=new pour ajouter une nouvelle section, plutôt que ce paramètre.",
        "apihelp-edit-param-undo": "Annuler cette révision. Écrase $1text, $1prependtext et $1appendtext.",
        "apihelp-edit-param-contentmodel": "Modèle de contenu du nouveau contenu.",
        "apihelp-edit-param-token": "Le jeton doit toujours être envoyé en tant que dernier paramètre, ou au moins après le paramètre $1text.",
        "apihelp-edit-example-edit": "Modifier une page",
-       "apihelp-edit-example-prepend": "Préfixer une page par <kbd>_&#95;NOTOC_&#95;</kbd>",
-       "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique",
+       "apihelp-edit-example-prepend": "Préfixer une page par <kbd>_&#95;NOTOC_&#95;</kbd>.",
+       "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique.",
        "apihelp-emailuser-description": "Envoyer un courriel à un utilisateur.",
        "apihelp-emailuser-param-target": "Utilisateur à qui envoyer le courriel.",
        "apihelp-emailuser-param-subject": "Entête du sujet.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "Le délai maximum après lequel la mise en cache de ce résultat doit être invalidée.",
        "apihelp-expandtemplates-paramvalue-prop-modules": "Tous les modules ResourceLoader que les fonctions d’analyse ont demandé d’ajouter à la sortie. Soit <kbd>jsconfigvars</kbd> soit <kbd>encodedjsconfigvars</kbd> doit être demandé avec <kbd>modules</kbd>.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Donne les variables de configuration JavaScript spécifiques à la page.",
-       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Donne les variables de configuration JavaScript spécifiques à la page sous forme de chaîne JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Donne les variables de configuration JavaScript spécifiques à la page sous la forme d'une chaîne JSON.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "L’arbre d’analyse XML de l’entrée.",
        "apihelp-expandtemplates-param-includecomments": "S’il faut inclure les commentaires HTML dans la sortie.",
        "apihelp-expandtemplates-param-generatexml": "Générer l’arbre d’analyse XML (remplacé par $1prop=parsetree).",
        "apihelp-feedcontributions-param-feedformat": "Le format du flux.",
        "apihelp-feedcontributions-param-user": "Pour quels utilisateurs récupérer les contributions.",
        "apihelp-feedcontributions-param-namespace": "Par quels espaces de nom filtrer les contributions.",
-       "apihelp-feedcontributions-param-year": "Depuis l’année (et plus récent).",
+       "apihelp-feedcontributions-param-year": "De l’année (et antérieur).",
        "apihelp-feedcontributions-param-month": "Depuis le mois (et plus récent).",
        "apihelp-feedcontributions-param-tagfilter": "Filtrer les contributions qui ont ces balises.",
        "apihelp-feedcontributions-param-deletedonly": "Afficher uniquement les contributions supprimées.",
        "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.",
        "apihelp-feedrecentchanges-param-feedformat": "Le format du flux.",
        "apihelp-feedrecentchanges-param-namespace": "Espace de noms auquel limiter les résultats.",
-       "apihelp-feedrecentchanges-param-invert": "Tous les espaces de nom sauf le sélectionné.",
+       "apihelp-feedrecentchanges-param-invert": "Tous les espaces de noms sauf celui sélectionné.",
        "apihelp-feedrecentchanges-param-associated": "Inclure l’espace de noms associé (discussion ou principal).",
        "apihelp-feedrecentchanges-param-days": "Jours auxquels limiter le résultat.",
        "apihelp-feedrecentchanges-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-feedrecentchanges-param-from": "Afficher les modifications depuis lors.",
        "apihelp-feedrecentchanges-param-hideminor": "Masquer les modifications mineures.",
        "apihelp-feedrecentchanges-param-hidebots": "Masquer les modifications faites par des robots.",
-       "apihelp-feedrecentchanges-param-hideanons": "Masquer les modifications faites par des utilisateurs anonymes.",
-       "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par des utilisateurs enregistrés.",
+       "apihelp-feedrecentchanges-param-hideanons": "Masquer les modifications faites par les utilisateurs anonymes.",
+       "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par les utilisateurs enregistrés.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Masquer les modifications contrôlées.",
        "apihelp-feedrecentchanges-param-hidemyself": "Masquer les modifications faites par l'utilisateur actuel.",
        "apihelp-feedrecentchanges-param-hidecategorization": "Masquer les changements de la catégorie d'appartenance.",
        "apihelp-feedwatchlist-description": "Renvoie un flux de liste de suivi.",
        "apihelp-feedwatchlist-param-feedformat": "Le format du flux.",
        "apihelp-feedwatchlist-param-hours": "Lister les pages modifiées lors de ce nombre d’heures depuis maintenant.",
-       "apihelp-feedwatchlist-param-linktosections": "Lier directement pour modifier les sections si possible.",
+       "apihelp-feedwatchlist-param-linktosections": "Lier directement vers les sections modifées si possible.",
        "apihelp-feedwatchlist-example-default": "Afficher le flux de la liste de suivi",
        "apihelp-feedwatchlist-example-all6hrs": "Afficher toutes les modifications sur les pages suivies dans les dernières 6 heures",
        "apihelp-filerevert-description": "Rétablir un fichier dans une ancienne version.",
        "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.",
        "apihelp-help-param-recursivesubmodules": "Inclure l’aide pour les sous-modules de façon récursive.",
        "apihelp-help-param-helpformat": "Format de sortie de l’aide.",
-       "apihelp-help-param-wrap": "Inclut la sortie dans une structure de réponse API standard.",
-       "apihelp-help-param-toc": "Inclure une table des matières dans la sortir HTML.",
+       "apihelp-help-param-wrap": "Inclut la sortie dans une structure standard de réponse API.",
+       "apihelp-help-param-toc": "Inclure une table des matières dans la sortie HTML.",
        "apihelp-help-example-main": "Aide pour le module principal",
        "apihelp-help-example-submodules": "Aide pour <kbd>action=query</kbd> et tous ses sous-modules.",
-       "apihelp-help-example-recursive": "Toute l’aide sur une page",
-       "apihelp-help-example-help": "Aide pour le module d’aide lui-même",
-       "apihelp-help-example-query": "Aide pour deux sous-modules de recherche",
+       "apihelp-help-example-recursive": "Toute l’aide sur une page.",
+       "apihelp-help-example-help": "Aide pour le module d’aide lui-même.",
+       "apihelp-help-example-query": "Aide pour deux sous-modules de recherche.",
        "apihelp-imagerotate-description": "Faire pivoter une ou plusieurs images.",
        "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.",
+       "apihelp-imagerotate-param-tags": "Balises à appliquer à l’entrée dans le journal de téléchargement.",
        "apihelp-imagerotate-example-simple": "Faire pivoter <kbd>File:Example.png</kbd> de <kbd>90</kbd> degrés.",
        "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de <kbd>Category:Flip</kbd> de <kbd>180</kbd> degrés.",
        "apihelp-import-description": "Importer une page depuis un autre wiki, ou depuis un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre <var>xml</var>.",
        "apihelp-import-param-templates": "Pour les importations interwiki : importer aussi tous les modèles inclus.",
        "apihelp-import-param-namespace": "Importer vers cet espace de noms. Impossible à utiliser avec <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importer comme une sous-page de cette page. Impossible à utiliser avec <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Modifier les balises à appliquer à l'entrée du journal d'importation et à la version zéro des pages importées.",
        "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] vers l’espace de noms 100 avec tout l’historique.",
        "apihelp-linkaccount-description": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.",
        "apihelp-linkaccount-example-link": "Commencer le processus de liaison d’un compte depuis <kbd>Exemple</kbd>.",
        "apihelp-managetags-param-operation": "Quelle opération effectuer :\n;create:Créer une nouvelle balise de modification pour un usage manuel.\n;delete:Supprimer une balise de modification de la base de données, y compris la suppression de la marque de toutes les révisions, entrées de modification récente et entrées de journal dans lesquelles elle serait utilisée.\n;activate:Activer une balise de modification, permettant aux utilisateurs de l’appliquer manuellement.\n;deactivate:Désactiver une balise de modification, empêchant les utilisateurs de l’appliquer manuellement.",
        "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.",
        "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.",
-       "apihelp-managetags-param-ignorewarnings": "S’il faut ignorer tout avertissement qui se produirait au cours de l’opération.",
+       "apihelp-managetags-param-ignorewarnings": "S’il faut ignorer tout avertissement qui surviendrait au cours de l’opération.",
+       "apihelp-managetags-param-tags": "Modifier les balises à appliquer à l’entrée du journal de gestion des balises.",
        "apihelp-managetags-example-create": "Créer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Supprimer la balise <kbd>vandlaism</kbd> avec le motif <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-description": "Déplacer une page.",
        "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec <var>$1from</var>.",
-       "apihelp-move-param-to": "Titre de la page renommée.",
+       "apihelp-move-param-to": "Nouveau titre de la page.",
        "apihelp-move-param-reason": "Motif du renommage.",
        "apihelp-move-param-movetalk": "Renommer la page de discussion, si elle existe.",
        "apihelp-move-param-movesubpages": "Renommer les sous-pages, le cas échéant.",
        "apihelp-move-param-noredirect": "Ne pas créer une redirection.",
-       "apihelp-move-param-watch": "Ajouter une page et la redirection à liste de suivi de l'utilisateur actuel.",
+       "apihelp-move-param-watch": "Ajouter la page et la redirection, à la liste de suivi de l'utilisateur actuel.",
        "apihelp-move-param-unwatch": "Supprimer la page et la redirection de la liste de suivi de l'utilisateur actuel.",
        "apihelp-move-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.",
-       "apihelp-move-example-move": "Déplacer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
+       "apihelp-move-param-tags": "Modifier les balises à appliquer à l'entrée du journal des renommages et à la version zéro de la page de destination.",
+       "apihelp-move-example-move": "Renommer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
        "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
-       "apihelp-opensearch-param-search": "Chaîne de recherche.",
+       "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-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 sont levés avec <kbd>format=json</kbd>, renvoyer une erreur d’API au lieu de les ignorer.",
+       "apihelp-opensearch-param-warningsaserror": "Si des avertissements apparaissent avec <kbd>format=json</kbd>, renvoyer une erreur d’API au lieu de les ignorer.",
        "apihelp-opensearch-example-te": "Trouver les pages commençant par <kbd>Te</kbd>.",
        "apihelp-options-description": "Modifier les préférences de l’utilisateur courant.\n\nSeules les options enregistrées dans le cœur ou dans l’une des extensions installées, ou les options avec des clés préfixées par <code>userjs-</code> (devant être utilisées dans les scripts utilisateur), peuvent être définies.",
-       "apihelp-options-param-reset": "Réinitialise les préférences aux valeurs par défaut du site.",
+       "apihelp-options-param-reset": "Réinitialise les préférences avec les valeurs par défaut du site.",
        "apihelp-options-param-resetkinds": "Liste des types d’option à réinitialiser quand l’option <var>$1reset</var> est définie.",
        "apihelp-options-param-change": "Liste des modifications, au format nom=valeur (par ex. skin=vector). Si aucune valeur n’est fournie (pas même un signe égal), par ex., nomoption|autreoption|…, l’option sera réinitialisée à sa valeur par défaut. Pour toute valeur passée contenant une barre verticale (<kbd>|</kbd>), utiliser le [[Special:ApiHelp/main#main/datatypes|séparateur alternatif de valeur multiple]] pour que l'opération soit correcte.",
-       "apihelp-options-param-optionname": "Un nom d’option qui doit être fixé à la valeur fournie par <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionname": "Nom de l’option qui doit être définie avec la valeur fournie par <var>$1optionvalue</var>.",
        "apihelp-options-param-optionvalue": "La valeur de l'option spécifiée par <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Réinitialiser toutes les préférences",
        "apihelp-options-example-change": "Modifier les préférences <kbd>skin</kbd> et <kbd>hideminor</kbd>.",
        "apihelp-paraminfo-description": "Obtenir des informations sur les modules de l’API.",
        "apihelp-paraminfo-param-modules": "Liste des noms de module (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Peut spécifier des sous-modules avec un <kbd>+</kbd>, ou tous les sous-modules avec <kbd>+*</kbd>, ou tous les sous-modules récursivement avec <kbd>+**</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Format des chaînes d’aide.",
-       "apihelp-paraminfo-param-querymodules": "Liste des noms de module de requêtage (valeur des paramètres <var>prop</var>, <var>meta</var> ou <var>list</var>=). Utiliser <kbd>$1modules=query+foo</kbd> au lieu de <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-querymodules": "Liste des noms des modules de requête (valeur des paramètres <var>prop</var>, <var>meta</var> ou <var>list</var>). Utiliser <kbd>$1modules=query+foo</kbd> au lieu de <kbd>$1querymodules=foo</kbd>.",
        "apihelp-paraminfo-param-mainmodule": "Obtenir aussi des informations sur le module principal (niveau supérieur). Utiliser plutôt <kbd>$1modules=main</kbd>.",
        "apihelp-paraminfo-param-pagesetmodule": "Obtenir aussi des informations sur le module pageset (en fournissant titles= et ses amis).",
        "apihelp-paraminfo-param-formatmodules": "Liste des noms de module de mise en forme (valeur du paramètre <var>format</var>). Utiliser plutôt <var>$1modules</var>.",
        "apihelp-protect-param-expiry": "Horodatages d’expiration. Si un seul horodatage est fourni, il sera utilisé pour toutes les protections. Utiliser <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> ou <kbd>never</kbd> pour une protection sans expiration.",
        "apihelp-protect-param-reason": "Motif de (dé)protection.",
        "apihelp-protect-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de protection.",
-       "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les modèles transclus et les images utilisées dans cette page). Ignoré si aucun des niveaux de protection fournis ne prend en charge la mise en cascade.",
+       "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les modèles transclus et les images utilisés dans cette page). Ignoré si aucun des niveaux de protection fournis ne prend en charge la mise en cascade.",
        "apihelp-protect-param-watch": "Si activé, ajouter la page (dé)protégée à la liste de suivi de l'utilisateur actuel.",
        "apihelp-protect-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 modifier le suivi.",
        "apihelp-protect-example-protect": "Protéger une page",
        "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à <kbd>all</kbd> (c'est à dire tout le monde est autorisé à faire l'action).",
        "apihelp-protect-example-unprotect2": "Enlever la protection de la page en ne mettant aucune restriction",
-       "apihelp-purge-description": "Vider le cache des titres fournis.\n\nNécessite une requête POST si l’utilisateur n’est pas connecté.",
+       "apihelp-purge-description": "Vider le cache des titres fournis.",
        "apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle",
        "apihelp-purge-example-simple": "Purger les pages <kbd>Main Page</kbd> et <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal",
        "apihelp-query-description": "Extraire des données de et sur MediaWiki.\n\nToutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.",
-       "apihelp-query-param-prop": "Quelles propriétés obtenir des pages demandées.",
+       "apihelp-query-param-prop": "Quelles propriétés obtenir pour les pages demandées.",
        "apihelp-query-param-list": "Quelles listes obtenir.",
        "apihelp-query-param-meta": "Quelles métadonnées obtenir.",
        "apihelp-query-param-indexpageids": "Inclure une section pageids supplémentaire listant tous les IDs de page renvoyés.",
        "apihelp-query+allcategories-param-from": "La catégorie depuis laquelle démarrer l’énumération.",
        "apihelp-query+allcategories-param-to": "La catégorie à laquelle terminer l’énumération.",
        "apihelp-query+allcategories-param-prefix": "Rechercher tous les titres de catégorie qui commencent avec cette valeur.",
-       "apihelp-query+allcategories-param-dir": "Direction dans laquelle trier.",
+       "apihelp-query+allcategories-param-dir": "Ordre dans lequel trier.",
        "apihelp-query+allcategories-param-min": "Renvoyer uniquement les catégories avec au moins ce nombre de membres.",
        "apihelp-query+allcategories-param-max": "Renvoyer uniquement les catégories avec au plus ce nombre de membres.",
        "apihelp-query+allcategories-param-limit": "Combien de catégories renvoyer.",
        "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: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-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
        "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.",
-       "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichier, y compris ceux n’existant pas.",
+       "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichiers, y compris ceux n’existant pas.",
        "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.",
        "apihelp-query+allfileusages-param-to": "Le titre du fichier auquel arrêter l’énumération.",
        "apihelp-query+allfileusages-param-prefix": "Rechercher tous les fichiers dont le titre commence par cette valeur.",
-       "apihelp-query+allfileusages-param-unique": "Afficher uniquement les titres de fichier distincts. Impossible à utiliser avec $1prop=ids.\nQuand utilisé comme générateur, produit les pages cibles au lieu des sources.",
+       "apihelp-query+allfileusages-param-unique": "Afficher uniquement les titres de fichiers distincts. Impossible à utiliser avec $1prop=ids.\nQuand il est utilisé comme générateur, il produit les pages cible au lieu des pages source.",
        "apihelp-query+allfileusages-param-prop": "Quelles informations inclure :",
-       "apihelp-query+allfileusages-paramvalue-prop-ids": "Ajoute les IDs de page des pages l’utilisant (impossible à utiliser avec $1unique).",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Ajoute l'ID des pages qui l’utilisent (incompatible avec $1unique).",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Ajoute le titre du fichier.",
        "apihelp-query+allfileusages-param-limit": "Combien d’éléments renvoyer au total.",
-       "apihelp-query+allfileusages-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+allfileusages-example-B": "Lister les titres de fichier, y compris les manquants, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
-       "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques",
-       "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants",
-       "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers",
+       "apihelp-query+allfileusages-param-dir": "L'ordre dans lequel lister.",
+       "apihelp-query+allfileusages-example-B": "Lister les titres des fichiers, y compris ceux manquants, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
+       "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques.",
+       "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants.",
+       "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers.",
        "apihelp-query+allimages-description": "Énumérer toutes les images séquentiellement.",
        "apihelp-query+allimages-param-sort": "Propriété par laquelle trier.",
-       "apihelp-query+allimages-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allimages-param-dir": "L'ordre dans laquel lister.",
        "apihelp-query+allimages-param-from": "Le titre de l’image depuis laquelle démarrer l’énumération. Ne peut être utilisé qu’avec $1sort=name.",
        "apihelp-query+allimages-param-to": "Le titre de l’image auquel arrêter l’énumération. Ne peut être utilisé qu’avec $1sort=name.",
        "apihelp-query+allimages-param-start": "L’horodatage depuis lequel énumérer. Ne peut être utilisé qu’avec $1sort=timestamp.",
-       "apihelp-query+allimages-param-end": "L’horodatage de fin de l’énumération. Ne peut être utilisé qu’avec $1sort=timestamp.",
+       "apihelp-query+allimages-param-end": "L’horodatage de la fin d’énumération. Ne peut être utilisé qu’avec $1sort=timestamp.",
        "apihelp-query+allimages-param-prefix": "Rechercher toutes les images dont le titre commence par cette valeur. Utilisable uniquement avec $1sort=name.",
        "apihelp-query+allimages-param-minsize": "Restreindre aux images avec au moins ce nombre d’octets.",
        "apihelp-query+allimages-param-maxsize": "Restreindre aux images avec au plus ce nombre d’octets.",
        "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 des fichiers récemment téléchargés semblable à [[Special:NewFiles]]",
+       "apihelp-query+allimages-example-recent": "Afficher une liste de fichiers récemment téléchargés, semblable à [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Afficher une liste de fichiers avec le type MIME <kbd>image/png</kbd> ou <kbd>image/gif</kbd>",
        "apihelp-query+allimages-example-generator": "Afficher l’information sur 4 fichiers commençant par la lettre <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.",
        "apihelp-query+alllinks-paramvalue-prop-title": "Ajoute le titre du lien.",
        "apihelp-query+alllinks-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+alllinks-param-limit": "Combien d’éléments renvoyer au total.",
-       "apihelp-query+alllinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+alllinks-example-B": "Lister les titres liés, y compris les manquants, avec les IDs des pages d’où ils proviennent, en démarrant à <kbd>B</kbd>.",
+       "apihelp-query+alllinks-param-dir": "L'ordre dans lequel lister.",
+       "apihelp-query+alllinks-example-B": "Lister les titres liés, y compris ceux manquants, avec les IDs des pages d’où ils proviennent, en démarrant à <kbd>B</kbd>.",
        "apihelp-query+alllinks-example-unique": "Lister les titres liés uniques",
        "apihelp-query+alllinks-example-unique-generator": "Obtient tous les titres liés, en marquant les manquants",
        "apihelp-query+alllinks-example-generator": "Obtient les pages contenant les liens",
        "apihelp-query+allmessages-description": "Renvoyer les messages depuis ce site.",
        "apihelp-query+allmessages-param-messages": "Quels messages sortir. <kbd>*</kbd> (par défaut) signifie tous les messages.",
        "apihelp-query+allmessages-param-prop": "Quelles propriétés obtenir.",
-       "apihelp-query+allmessages-param-enableparser": "Si positionné pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
+       "apihelp-query+allmessages-param-enableparser": "Positionner pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Si positionné, ne pas inclure le contenu des messages dans la sortie.",
-       "apihelp-query+allmessages-param-includelocal": "Inclure aussi les messages locaux, c’est-à-dire les messages qui n’existent pas dans le logiciel mais sous forme d’une page MediaWiki:.\nCela liste toutes les pages MediaWiki:, donc aussi celles qui ne sont pas vraiment des messages, telles que [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Inclure aussi les messages locaux, c’est-à-dire les messages qui n’existent pas dans le logiciel mais dans l’espace de noms {{ns:MediaWiki}}.\nCela liste toutes les pages de l’espace de noms {{ns:MediaWiki}}, donc aussi celles qui ne sont pas vraiment des messages, telles que [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Arguments à substituer dans le message.",
        "apihelp-query+allmessages-param-filter": "Renvoyer uniquement les messages avec des noms contenant cette chaîne.",
        "apihelp-query+allmessages-param-customised": "Renvoyer uniquement les messages dans cet état de personnalisation.",
        "apihelp-query+allpages-param-prlevel": "Filtrer les protections basées sur le niveau de protection (doit être utilisé avec le paramètre $1prtype=).",
        "apihelp-query+allpages-param-prfiltercascade": "Filtrer les protections d’après leur cascade (ignoré si $1prtype n’est pas positionné).",
        "apihelp-query+allpages-param-limit": "Combien de pages renvoyer au total.",
-       "apihelp-query+allpages-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allpages-param-dir": "L'ordre dans lequel lister.",
        "apihelp-query+allpages-param-filterlanglinks": "Filtrer si une page a des liens de langue. Noter que cela ne prend pas en compte les liens de langue ajoutés par des extensions.",
        "apihelp-query+allpages-param-prexpiry": "Quelle expiration de protection sur laquelle filtrer la page :\n;indefinite:N’obtenir que les pages avec une expiration de protection infinie.\n;definite:N’obtenir que les pages avec une expiration de protection définie (spécifique).\n;all:Obtenir toutes les pages avec une expiration de protection.",
        "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre <kbd>B</kbd>.",
        "apihelp-query+allredirects-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+allredirects-param-limit": "Combien d’éléments renvoyer au total.",
        "apihelp-query+allredirects-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+allredirects-example-B": "Lister les pages cible, y compris les manquantes, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
+       "apihelp-query+allredirects-example-B": "Lister les pages cible, y compris celles manquantes, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
        "apihelp-query+allredirects-example-unique": "Lister les pages cible unique",
        "apihelp-query+allredirects-example-unique-generator": "Obtient toutes les pages cible, en marquant les manquantes",
        "apihelp-query+allredirects-example-generator": "Obtient les pages contenant les redirections",
        "apihelp-query+allrevisions-param-excludeuser": "Ne pas lister les révisions faites par cet utilisateur.",
        "apihelp-query+allrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "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>Exemple</kbd>.",
+       "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-param-prop": "Quelles propriétés récupérer pour les fichiers.",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "Ajoute le titre de la transclusion.",
        "apihelp-query+alltransclusions-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+alltransclusions-param-limit": "Combien d’éléments renvoyer au total.",
-       "apihelp-query+alltransclusions-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+alltransclusions-param-dir": "L'ordre dans lequel lister.",
        "apihelp-query+alltransclusions-example-B": "Lister les titres inclus, y compris les manquants, avec les IDs des pages d’où ils viennent, en commençant à <kbd>B</kbd>.",
        "apihelp-query+alltransclusions-example-unique": "Lister les titres inclus uniques",
-       "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants",
-       "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant des transclusions",
+       "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants.",
+       "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant les transclusions.",
        "apihelp-query+allusers-description": "Énumérer tous les utilisateurs enregistrés.",
        "apihelp-query+allusers-param-from": "Le nom d’utilisateur auquel démarrer l’énumération.",
        "apihelp-query+allusers-param-to": "Le nom d’utilisateur auquel stopper l’énumération.",
        "apihelp-query+allusers-paramvalue-prop-blockinfo": "Ajoute l’information sur le bloc actuel d’un utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-groups": "Liste des groupes auxquels appartient l’utilisateur. Cela utilise beaucoup de ressources du serveur et peut renvoyer moins de résultats que la limite.",
        "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Liste tous les groupes auxquels l’utilisateur est affecté automatiquement.",
-       "apihelp-query+allusers-paramvalue-prop-rights": "Liste les droits qu’à l’utilisateur.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Liste les droits qu’a l’utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-registration": "Ajoute l’horodatage de l’inscription de l’utilisateur, s’il est disponible (peut être vide).",
        "apihelp-query+allusers-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
        "apihelp-query+backlinks-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+backlinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+backlinks-param-filterredir": "Comment filtrer les redirections. Si positionné à <kbd>nonredirects</kbd> quand <var>$1redirect</var> est activé, cela ne s’applique qu’au second niveau.",
-       "apihelp-query+backlinks-param-limit": "Combien de pages renvoyer au total. Si $1redirect est activé, la limite s’applique à chaque niveau séparément (ce qui signifie jusqu’à 2 * limite résultats peut être retourné).",
-       "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont un lien vers cette redirection aussi. La limite maximale est divisée par deux.",
+       "apihelp-query+backlinks-param-limit": "Combien de pages renvoyer au total. Si <var>$1redirect</var> est activé, la limite s’applique à chaque niveau séparément (ce qui signifie jusqu’à 2 * <var>$1limit</var> résultats pouvant être retournés).",
+       "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver également toutes les pages qui ont un lien vers cette redirection. La limite maximale est divisée par deux.",
        "apihelp-query+backlinks-example-simple": "Afficher les liens vers <kbd>Main page</kbd>.",
        "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Lister tous les utilisateurs et les adresses IP bloqués.",
        "apihelp-query+categories-paramvalue-prop-hidden": "Marque les catégories cachées avec <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Quelle sorte de catégories afficher.",
        "apihelp-query+categories-param-limit": "Combien de catégories renvoyer.",
-       "apihelp-query+categories-param-categories": "Lister uniquement ces catégories. Utile pour vérifier si une certaine page est dans une certaine catégorie.",
+       "apihelp-query+categories-param-categories": "Lister uniquement ces catégories. Utile pour vérifier si une certaine page est dans une catégorie donnée.",
        "apihelp-query+categories-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+categories-example-simple": "Obtenir une liste des catégories auxquelles appartient la page <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categories-example-generator": "Obtenir des informations sur toutes les catégories utilisées dans la page <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de <kbd>Category:Physics</kbd>.",
        "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de <kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-description": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.",
-       "apihelp-query+contributors-param-group": "Inclure uniquement les utilisateurs dans les groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
+       "apihelp-query+contributors-param-group": "Inclut uniquement les utilisateurs dans les groupes donnés. N'inclut pas les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excludegroup": "Exclure les utilisateurs des groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-rights": "Inclure uniquement les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "Exclure les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
        "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
        "apihelp-query+disabled-description": "Ce module de requête a été désactivé.",
-       "apihelp-query+duplicatefiles-description": "Lister tous les fichiers qui sont des doublons des fichiers donnés d’après leurs valeurs de hachage.",
+       "apihelp-query+duplicatefiles-description": "Lister d’après leurs valeurs de hachage, tous les fichiers qui sont des doublons de fichiers donnés.",
        "apihelp-query+duplicatefiles-param-limit": "Combien de fichiers dupliqués à renvoyer.",
        "apihelp-query+duplicatefiles-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+duplicatefiles-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
-       "apihelp-query+duplicatefiles-example-simple": "Rechercher les doublons de [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+duplicatefiles-example-simple": "Rechercher les doublons de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Rechercher les doublons de tous les fichiers",
        "apihelp-query+embeddedin-description": "Trouver toutes les pages qui incluent (par transclusion) le titre donné.",
        "apihelp-query+embeddedin-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
        "apihelp-query+embeddedin-param-filterredir": "Comment filtrer les redirections.",
        "apihelp-query+embeddedin-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+embeddedin-example-simple": "Afficher les pages incluant <kbd>Template:Stub</kbd>.",
-       "apihelp-query+embeddedin-example-generator": "Obteir des informations sur les pages incluant <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Obtenir des informations sur les pages incluant <kbd>Template:Stub</kbd>.",
        "apihelp-query+extlinks-description": "Renvoyer toutes les URLs externes (non interwikis) des pages données.",
        "apihelp-query+extlinks-param-limit": "Combien de liens renvoyer.",
-       "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et <var>$1query</var> est positionné, le protocole est <kbd>http</kbd>. Laisser à la fois ceci et <var>$1query</var> vide pour lister tous les liens externes.",
+       "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et <var>$1query</var> est positionné, le protocole est <kbd>http</kbd>. Laisser à la fois ceci et <var>$1query</var> vides pour lister tous les liens externes.",
        "apihelp-query+extlinks-param-query": "Rechercher une chaîne sans protocole. Utile pour vérifier si une certaine page contient une certaine URL externe.",
        "apihelp-query+extlinks-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
        "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.",
        "apihelp-query+exturlusage-paramvalue-prop-url": "Ajoute l’URL utilisée dans la page.",
        "apihelp-query+exturlusage-param-protocol": "Protocole de l’URL. Si vide et que <var>$1query</var>  est rempli, le protocole est <kbd>http</kbd>. Le laisser avec <var>$1query</var>  vide pour lister tous les liens externes.",
-       "apihelp-query+exturlusage-param-query": "Rechercher une chaîne sans protocole. Voyez [[Special:LinkSearch]]. Le laisser vide liste tous les liens externes.",
+       "apihelp-query+exturlusage-param-query": "Rechercher une chaîne sans protocole. Voyez [[Special:LinkSearch]]. Le laisser vide pour lister tous les liens externes.",
        "apihelp-query+exturlusage-param-namespace": "Les espaces de nom à énumérer.",
        "apihelp-query+exturlusage-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+exturlusage-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
        "apihelp-query+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-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-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-bitdepth": "Ajoute la profondeur de bit de la version.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés",
-       "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’image configurés dans le wiki.",
+       "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-example-simple": "Obtenir l’information sur les référentiels de fichier",
+       "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-paramvalue-prop-pageid": "ID de chaque page.",
        "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-param-prop": "Quelles informations obtenir du fichier :\n;timestamp:Ajoute l’horodatage de la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé chaque version du fichier.\n;userid:Ajoute l’ID de l’utilisateur qui a téléchargé chaque version du fichier.\n;comment:Commentaire sur la version.\n;parsedcomment:Analyser le commentaire sur cette version.\n;canonicaltitle:Ajoute le titre canonique du fichier.\n;url:Fournit l’URL du fichier et la page de description.\n;size:Ajoute la taille du fichier en octets et la hauteur, la largeur et le nombre de pages (si applicable).\n;dimensions:Alias pour la taille.\n;sha1:Ajoute le hachage SHA-1 pour le fichier.\n;mime:Ajoute le type MIME du fichier.\n;thumbmime:Ajoute le type MIME de la vignette de l’image (nécessite l’URL et le paramètre $1urlwidth).\n;mediatype:Ajoute le type de média du fichier.\n;metadata:Liste les métadonnées Exif de la version du fichier.\n;commonmetadata:Liste les métadonnées génériques du format du fichier pour la version du fichier.\n;extmetadata:Liste les métadonnées mises en forme combinées depuis différentes sources. Les résultats sont au format HTML.\n;archivename:Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.\n;bitdepth:Ajoute la profondeur de bit de la version.\n;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-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-parsedcomment": "Analyser le commentaire de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Ajoute le titre canonique du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-url": "Fournit l’URL du fichier et de la page de description.",
-       "apihelp-query+imageinfo-paramvalue-prop-size": "Ajoute la taille du fichier en octets et sa hauteur, largeur et compteur de page (le cas échéant).",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "Ajoute la taille du fichier en octets et sa hauteur, sa largeur et le compteur de page (le cas échéant).",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias pour la taille.",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "Ajoute le hachage SH1-1 du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "Ajoute le type MIME du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Ajoute la profondeur de bits de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Ajoute l'indication que le fichier est sur [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "Combien de révision de fichier renvoyer par fichier.",
        "apihelp-query+imageinfo-param-start": "Horodatage auquel démarrer la liste.",
        "apihelp-query+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Si des traductions pour la propriété extmetadata sont disponibles, les analyser toutes.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Si spécifié et non vide, seules ces clés seront renvoyées pour $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètre spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser <kbd>page15-100px</kbd>. <var>$1urlwidth</var> doit être utilisé et être cohérent avec <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Si <kbd>$2prop=badfile</kbd> est positionné, il s'agit du titre de la page utilisé pour évaluer la [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
-       "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]]",
-       "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008",
+       "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008.",
        "apihelp-query+images-description": "Renvoie tous les fichiers contenus dans les pages fournies.",
        "apihelp-query+images-param-limit": "Combien de fichiers renvoyer.",
        "apihelp-query+images-param-images": "Lister uniquement ces fichiers. Utile pour vérifier si une page donnée contient un fichier donné.",
        "apihelp-query+imageusage-example-simple": "Afficher les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+imageusage-example-generator": "Obtenir des informations sur les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+info-description": "Obtenir les informations de base sur la page.",
-       "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :\n;protection:Liste de niveau de protection de chaque page.\n;talkid:L’ID de la page de discussion pour chaque page qui n’est pas une page de discussion.\n;watched:Liste de l’état de suivi de chaque page.\n;watchers:Le nombre d’observateurs, si c&est autorisé.\n;notificationtimestamp:L’horodatage de notification de la liste de suivi de chaque page.\n;subjectid:L’ID de la page parente de chaque page de discussion.\n;url:Fournit une URL complète, une URL de modification, et l’URL canonique pour chaque page.\n;readable:Si l’utilisateur peut lire cette page.\n;preload:Fournit le texte renvoyé par EditFormPreloadText.\n;displaytitle:Fournit la manière dont le titre de la page est vraiment affiché.",
+       "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :",
        "apihelp-query+info-paramvalue-prop-protection": "Lister le niveau de protection de chaque page.",
        "apihelp-query+info-paramvalue-prop-talkid": "L’ID de la page de discussion de chaque page qui n’est pas de discussion.",
        "apihelp-query+info-paramvalue-prop-watched": "Lister l’état de suivi de chaque page.",
        "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-namespace": "Renvoyer seulement des pages de ces espaces de noms.",
-       "apihelp-query+random-param-limit": "Limite sur le nombre de pages aléatoires renvoyées.",
+       "apihelp-query+random-param-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+usercontribs-param-limit": "Le nombre maximal de contributions à renvoyer.",
        "apihelp-query+usercontribs-param-start": "L’horodatage auquel démarrer le retour.",
        "apihelp-query+usercontribs-param-end": "L’horodatage auquel arrêter le retour.",
-       "apihelp-query+usercontribs-param-user": "Les utilisateurs pour lesquels récupérer les contributions.",
-       "apihelp-query+usercontribs-param-userprefix": "Récupérer les contributions pour tous les utilisateurs dont les noms commencent par cette valeur. Écrase $1user.",
+       "apihelp-query+usercontribs-param-user": "Utilisateurs pour lesquels il faut récupérer les contributions.   Ne peut pas être utilisé avec <var>$1userid</var> ou <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Récupérer les contributions pour tous les utilisateurs dont les noms commencent par cette valeur. Ne peut pas être utilisé avec <var>$1user</var> ou <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Utilisateurs pour lesquels il faut récupérer les contributions.   Ne peut pas être utilisé avec <var>$1user</var> ou <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Lister uniquement les contributions dans ces espaces de nom.",
        "apihelp-query+usercontribs-param-prop": "Inclure des informations supplémentaires:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Ajoute l’ID de page et l’ID de révision.",
        "apihelp-query+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-groups": "Liste tous les groupes auxquels appartient l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Liste les groupes auxquels l’utilisateur actuel a été explicitement affecté, avec la date d’expiration de chaque appartenance au groupe.",
        "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+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-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-editcount": "Ajoute le compteur de modifications 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-userids": "Une liste d’ID utilisateur pour lesquels obtenir des informations.",
        "apihelp-query+users-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur actuel.",
        "apihelp-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-param-user": "Utilisateur ayant été réinitialisé.",
        "apihelp-resetpassword-param-email": "Adresse courriel de l’utilisateur ayant été réinitialisé.",
-       "apihelp-resetpassword-param-capture": "Renvoyer les mots de passe temporaires déjà envoyés. Nécessite le droit utilisateur <code>passwordreset</code>.",
        "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-param-show": "Quoi démasquer pour chaque révision",
        "apihelp-revisiondelete-param-suppress": "S’il faut supprimer les données aux administrateurs comme aux autres.",
        "apihelp-revisiondelete-param-reason": "Motif de suppression ou d’annulation de suppression.",
+       "apihelp-revisiondelete-param-tags": "Balises à appliquer à l’entrée dans le journal de suppression.",
        "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision <kbd>12345</kbd> de la page <kbd>Main Page</kbd>",
        "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal <kbd>67890</kbd> avec le motif <kbd>Violation de Biographie de Personne Vivante</kbd>.",
        "apihelp-rollback-description": "Annuler la dernière modification de la page.\n\nSi le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.",
        "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la <kbd>Page principale<kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour <kbd>Page principale</kbd> afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
        "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Modifier la langue d’une page.",
+       "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> pour utiliser cette action.",
+       "apihelp-setpagelanguage-param-title": "Titre de la page dont vous souhaitez modifier la langue. Ne peut pas être utilisé avec <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Identifiant (ID) de la page dont vous souhaitez modifier la langue. Ne peut être utilisé avec <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Code de langue vers lequel la page doit être changée. Utiliser <kbd>defaut</kbd> pour réinitialiser la page sur la langue par défaut du contenu du wiki.",
+       "apihelp-setpagelanguage-param-reason": "Motif de la modification.",
+       "apihelp-setpagelanguage-param-tags": "Modifier les balises à appliquer à l'entrée du journal résultant de cette action.",
+       "apihelp-setpagelanguage-example-language": "Changer la langue de la <kbd>page principale</kbd> en basque.",
+       "apihelp-setpagelanguage-example-default": "Remplacer la langue de la page ayant l'ID 123 par la langue par défaut du contenu du wiki.",
        "apihelp-stashedit-description": "Préparer une modification dans le cache partagé.\n\nCeci a pour but d’être utilisé via AJAX depuis le formulaire d’édition pour améliorer la performance de la sauvegarde de la page.",
        "apihelp-stashedit-param-title": "Titre de la page en cours de modification.",
        "apihelp-stashedit-param-section": "Numéro de section. <kbd>0</kbd> pour la section du haut, <kbd>new</kbd> pour une nouvelle section.",
        "apihelp-tag-param-add": "Balises à ajouter. Seules les balises définies manuellement peuvent être ajoutées.",
        "apihelp-tag-param-remove": "Balises à supprimer. Seules les balises qui sont soit définies manuellement soit pas du tout définies peuvent être supprimées.",
        "apihelp-tag-param-reason": "Motif de la modification.",
+       "apihelp-tag-param-tags": "Balises à appliquer à l’entrée de journal qui sera créée en résultat de cette action.",
        "apihelp-tag-example-rev": "Ajoute la balise <kbd>vandalism</kbd> à partir de l’ID de révision 123 sans indiquer de motif",
        "apihelp-tag-example-log": "Supprimer la balise <kbd>spam</kbd> à partir de l’ID d’entrée de journal 123 avec le motif <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "Obtenir les jetons pour les actions modifiant les données.\n\nCe module est obsolète, remplacé par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Récupérer un jeton de modification (par défaut).",
        "apihelp-tokens-example-emailmove": "Récupérer un jeton de courriel et un jeton de déplacement.",
        "apihelp-unblock-description": "Débloquer un utilisateur.",
-       "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via <kbd>list=blocks</kbd>). Impossible à utiliser avec <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP à débloquer. Impossible à utiliser en même temps que <var>$1id</var>.",
+       "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via <kbd>list=blocks</kbd>). Impossible à utiliser avec <var>$1user</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP à débloquer. Impossible à utiliser en même temps que <var>$1id</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID de l'utilisateur à débloquer. Ne peut être utilisé avec <var>$1id</var> ou <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Motif de déblocage.",
        "apihelp-unblock-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de blocage.",
        "apihelp-unblock-example-id": "Lever le blocage d’ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Débloquer l’utilisateur <kbd>Bob</kbd> avec le motif <kbd>Désolé Bob</kbd>.",
-       "apihelp-undelete-description": "Restaurer les révisions d’une page supprimée.\n\nUne liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restaurer les révisions d’une page supprimée.\n\nUne liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Titre de la page à restaurer.",
        "apihelp-undelete-param-reason": "Motif de restauration.",
        "apihelp-undelete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de suppression.",
        "apihelp-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-userrights-param-add": "Ajouter l’utilisateur à ces groupes.",
+       "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes, ou s’ils sont déjà membres, mettre à jour la date d’expiration de leur appartenance à ce groupe.",
+       "apihelp-userrights-param-expiry": "Horodatages d’expiration. Peuvent être relatifs (par ex. <kbd>5 mois</kbd> ou <kbd>2 semaines</kbd>) ou absolus (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si uniquement un horodatage est fixé, il sera utilisé pour tous les groupes passés au paramètre <var>$1add</var>. Utiliser <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd> pour une lien utilisateur-groupe qui n’expire jamais.",
        "apihelp-userrights-param-remove": "Supprimer l’utilisateur de ces groupes.",
        "apihelp-userrights-param-reason": "Motif pour la modification.",
+       "apihelp-userrights-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal des droits utilisateur.",
        "apihelp-userrights-example-user": "Ajouter l’utilisateur <kbd>FooBot</kbd> au groupe <kbd>bot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Ajouter l’utilisateur d’ID <kbd>123</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
+       "apihelp-userrights-example-expiry": "Ajouter l'utilisateur <kbd>SometimeSysop</kbd> au groupe <kbd>sysop</kbd> pour 1 mois.",
+       "apihelp-validatepassword-description": "Valider un mot de passe en suivant les règles des mots de passe du wiki.\n\nLa validation est <samp>Good</samp> si le mot de passe est acceptable, <samp>Change</samp> s'il peut être utilisé pour se connecter et doit être changé, ou  <samp>Invalid</samp> s'il n'est pas utilisable.",
+       "apihelp-validatepassword-param-password": "Mot de passe à valider.",
+       "apihelp-validatepassword-param-user": "Nom de l'utilisateur, pour tester la création de compte. L'utilisateur ne doit pas déja exister.",
+       "apihelp-validatepassword-param-email": "Adresse courriel, pour tester la création de compte.",
+       "apihelp-validatepassword-param-realname": "Vrai nom, pour tester la création de compte.",
+       "apihelp-validatepassword-example-1": "Valider le mot de passe <kbd>foobar</kbd> pour l'utilisateur actuel.",
+       "apihelp-validatepassword-example-2": "Valider le mot de passe <kbd>qwerty</kbd> pour la création de l'utilisateur <kbd>Example</kbd>.",
        "apihelp-watch-description": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Si défini, la page ne sera plus suivie plutôt que suivie.",
        "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
        "apihelp-rawfm-description": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
-       "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:mediawiki}} se terminant par <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:MediaWiki}} se terminant par <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
        "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
        "api-format-title": "Résultat de l’API de MediaWiki",
        "api-help-param-upload": "Doit être envoyé comme un fichier importé utilisant multipart/form-data.",
        "api-help-param-multi-separate": "Valeurs séparées par <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|autre]].",
        "api-help-param-multi-max": "Le nombre maximal de valeurs est {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} pour les robots).",
+       "api-help-param-multi-all": "Pour spécifier toutes les valeurs, utiliser <kbd>$1</kbd>.",
        "api-help-param-default": "Par défaut : $1",
        "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-authmanagerhelper-returnurl": "Renvoyer l’URL pour les flux d’authentification tiers, qui doit être absolue. Cela ou <var>$1continue</var> est obligatoire.\n\nDès réception d’une réponse <samp>REDIRECT</samp>, vous ouvrirez typiquement un navigateur ou un affichage web vers l’URL <samp>redirecttarget</samp> spécifiée pour un flux d’authentification tiers. Une fois ceci terminé, le tiers renverra le navigateur ou l’affichage web vers cette URL. Vous devez extraire toute requête ou paramètre POST de l’URL et les passer comme une requête <var>$1continue</var> à ce module de l’API.",
        "api-help-authmanagerhelper-continue": "Cette requête est une continuation après une précédente réponse <samp>UI</samp> ou <samp>REDIRECT</samp>. Cela ou <var>$1returnurl</var> est obligatoire.",
        "api-help-authmanagerhelper-additional-params": "Ce module accepte des paramètres supplémentaires selon les requêtes d’authentification disponibles. Utiliser <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$1</kbd> (ou une réponse précédente de ce module, le cas échéant) pour déterminer les requêtes disponibles et les champs qu’elles utilisent.",
+       "apierror-allimages-redirect": "Utiliser <kbd>gaifilterredir=nonredirects</kbd> au lieu de <var>redirects</var> quand <kbd>allimages</kbd> est utilisé comme générateur.",
+       "apierror-allpages-generator-redirects": "Utiliser <kbd>gapfilterredir=nonredirects</kbd> au lieu de <var>redirects</var> quand <kbd>allpages</kbd> est utilisé comme un générateur.",
+       "apierror-appendnotsupported": "Impossible d’ajouter aux pages utilisant le modèle de contenu $1.",
+       "apierror-articleexists": "L’article que vous essayez de créer l’a déjà été.",
+       "apierror-assertbotfailed": "La vérification que l’utilisateur a le droit <code>bot</code> a échoué.",
+       "apierror-assertnameduserfailed": "La vérification que l’utilisateur est « $1 » a échoué.",
+       "apierror-assertuserfailed": "La vérification que l’utilisateur est connecté a échoué.",
+       "apierror-autoblocked": "Votre adresse IP a été bloquée automatiquement, parce qu’elle a été utilisée par un utilisateur bloqué.",
+       "apierror-badconfig-resulttoosmall": "La valeur de <code>$wgAPIMaxResultSize</code> sur ce wiki est trop petite pour contenir des informations de résultat basiques.",
+       "apierror-badcontinue": "Paramètre de continuation non valide. Vous devez passer la valeur d’origine renvoyée par la requête précédente.",
+       "apierror-baddiff": "La différence ne peut être récupérée. Une ou les deux révisions n’existent pas ou vous n’avez pas le droit de les voir.",
+       "apierror-baddiffto": "<var>$1diffto</var> doit être fixé à un nombre positif ou nul, <kbd>prev</kbd>, <kbd>next</kbd> ou <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "Le format demandé $1 n’est pas supporté pour le modèle de contenu $2.",
+       "apierror-badformat": "Le format demandé $1 n’est pas supporté pour le modèle de contenu $2 utilisé par $3.",
+       "apierror-badgenerator-notgenerator": "Le module <kbd>$1</kbd> ne peut pas être utilisé comme générateur.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> inconnu.",
+       "apierror-badip": "Paramètre IP non valide.",
+       "apierror-badmd5": "Le hachage MD5 fourni n’était pas correct.",
+       "apierror-badmodule-badsubmodule": "Le module <kbd>$1</kbd> n’a pas de sous-module « $2 ».",
+       "apierror-badmodule-nosubmodules": "Le module <kbd>$1</kbd> n’a pas de sous-modules.",
+       "apierror-badparameter": "Valeur non valide pour le paramètre <var>$1</var>.",
+       "apierror-badquery": "Requête invalide.",
+       "apierror-badtimestamp": "Valeur non valide « $2 » pour le paramètre de référence horaire  <var>$1</var>.",
+       "apierror-badtoken": "Jeton CSRF non valide.",
+       "apierror-badupload": "Le paramètre de téléchargement de fichier <var>$1</var> n’est pas un téléchargement de fichier ; assurez-vous d’utiliser <code>multipart/form-data</code> pour votre POST et d’inclure un nom de fichier dans l’entête <code>Content-Disposition</code>.",
+       "apierror-badurl": "Valeur « $2 » non valide pour le paramètre d’URL <var>$1</var>.",
+       "apierror-baduser": "Valeur « $2 » non valide pour le paramètre utilisateur <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "La séparation multi-valeur U+001F ne peut être utilisée que pour des paramètres multi-valeurs.",
+       "apierror-bad-watchlist-token": "Jeton de liste de suivi fourni non valide. Veuillez mettre un jeton valide dans [[Special:Preferences]].",
+       "apierror-blockedfrommail": "Vous avez été bloqué pour l’envoi de courriel.",
+       "apierror-blocked": "Vous avez été bloqué pour modifier.",
+       "apierror-botsnotsupported": "Cette interface n’est pas supportée pour les robots.",
+       "apierror-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-cannotreauthenticate": "Cette action n’est pas disponible car votre identité ne peut pas être vérifiée.",
+       "apierror-cannotviewtitle": "Vous n’êtes pas autorisé à voir $1.",
+       "apierror-cantblock-email": "Vous n’avez pas le droit de bloquer des utilisateurs pour envoyer des courriels via ce wiki.",
+       "apierror-cantblock": "Vous n’avez pas le droit de bloquer des utilisateurs.",
+       "apierror-cantchangecontentmodel": "Vous n’avez pas le droit de modifier le modèle de contenu d’une page.",
+       "apierror-canthide": "Vous n’avez pas le droit de masquer les noms d’utilisateur du journal de blog.",
+       "apierror-cantimport-upload": "Vous n’avez pas le droit d’importer des pages téléchargées.",
+       "apierror-cantimport": "Vous n’avez pas le droit d’importer des pages.",
+       "apierror-cantoverwrite-sharedfile": "Le fichier cible existe dans un dépôt partagé et vous n’avez pas le droit de l’écraser.",
+       "apierror-cantsend": "Vous n’êtes pas connecté, vous n’avez pas d’adresse de courriel confirmée, ou vous n’êtes pas autorisé à envoyer des courriels aux autres utilisateurs, donc vous ne pouvez envoyer de courriel.",
+       "apierror-cantundelete": "Impossible d’annuler : les révisions demandées peuvent ne plus exister, ou avoir déjà été annulées.",
+       "apierror-changeauth-norequest": "Échec à la création de la requête de modification.",
+       "apierror-chunk-too-small": "La taille minimale d’un segment est de $1 {{PLURAL:$1|octet|octets}} pour les segments hors le dernier.",
+       "apierror-cidrtoobroad": "Les plages CIDR $1 plus large que /$2 ne sont pas acceptées.",
+       "apierror-compare-inputneeded": "Un titre, un ID de page ou un numéro de révision est nécessaire pour les paramètres <var>from</var> et <var>to</var>.",
+       "apierror-contentserializationexception": "Échec de sérialisation du contenu : $1",
+       "apierror-contenttoobig": "Le contenu que vous avez fourni dépasse la limite de taille d’un article, qui est de $1 {{PLURAL:$1|kilooctet|kilooctets}}.",
+       "apierror-copyuploadbaddomain": "Les téléchargements par URL ne sont pas autorisés pour ce domaine.",
+       "apierror-copyuploadbadurl": "Les téléchargements ne sont pas autorisés depuis cette URL.",
+       "apierror-create-titleexists": "Les titres existants ne peuvent pas être protégés avec <kbd>create</kbd>.",
+       "apierror-csp-report": "Erreur lors du traitement du rapport CSP: $1.",
+       "apierror-databaseerror": "[$1] erreur de requête de base de données.",
+       "apierror-deletedrevs-param-not-1-2": "Le paramètre <var>$1</var> ne peut pas être utilisé dans les modes 1 ou 2.",
+       "apierror-deletedrevs-param-not-3": "Le paramètre <var>$1</var> ne peut pas être utilisé dans le mode 3.",
+       "apierror-emptynewsection": "Il n'est pas possible de créer de nouvelles sections vides.",
+       "apierror-emptypage": "Il n'est pas possible de créer de nouvelles pages vides.",
+       "apierror-exceptioncaught": "[$1] Exception interceptée: $2",
+       "apierror-filedoesnotexist": "Le fichier n’existe pas.",
+       "apierror-fileexists-sharedrepo-perm": "Le fichier cible existe dans un dépôt partagé. Utilisr le paramètre <var>ignorewarnings</var> pour l’écraser.",
+       "apierror-filenopath": "Il n'est pas possible de récupérer le chemin du fichier local.",
+       "apierror-filetypecannotberotated": "Le type du fichier ne peut pas être tourné.",
+       "apierror-formatphp": "Cette réponse ne peut pas être représentée en utilisant <kbd>format=php</kbd>. Voir https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "Le titre pour <kbd>$1</kbd> doit être un fichier.",
+       "apierror-import-unknownerror": "Erreur inconnue lors de l'importation: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> ne peut pas dépasser $2 (fixé à $3) pour les robots ou les opérateurs système.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> ne peut pas dépasser $2 (fixé à $3) pour les utilisateurs.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> ne peut pas être inférieur à $2 (fixé à $3).",
+       "apierror-invalidcategory": "Le nom de la catégorie que vous avez entré n'est pas valide.",
+       "apierror-invalid-chunk": "Le déplacement plus le segment actuel dépassent la taille demandée du fichier.",
+       "apierror-invalidexpiry": "Heure d'expiration invalide \"$1\".",
+       "apierror-invalid-file-key": "Ne correspond pas à une clé valide de fichier.",
+       "apierror-invalidlang": "Code de langue non valide pour le paramètre <var>$1</var>.",
+       "apierror-invalidoldimage": "Le paramètre oldimage a un format non valide.",
+       "apierror-invalidparammix-cannotusewith": "Le paramètre <kbd>$1</kbd> ne peut pas être utilisé avec <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "Le paramètre <kbd>$1</kbd> ne peut être utilisé qu’avec <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> ne peut pas être combiné avec le paramètre <var>oldid</var>, <var>pageid</var> ou <var>page</var>. Veuillez utiliser <var>title</var> et <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Les paramètres}} $1 ne peuvent pas être utilisés ensemble.",
+       "apierror-invalidsection": "Le paramètre section doit être un ID de section valide ou <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "Le hachage SHA1Base36 fourni n’est pas valide.",
+       "apierror-invalidsha1hash": "Le hachage SHA1 fourni n’est pas valide.",
+       "apierror-invalidtitle": "Mauvais titre « $1 ».",
+       "apierror-invalidurlparam": "Valeur non valide pour <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Nom d'utilisateur invalide \"$1\".",
+       "apierror-invaliduserid": "L'ID d'utilisateur <var>$1</var> n'est pas valide.",
+       "apierror-maxlag-generic": "Attente d’un serveur de base de données : $1 {{PLURAL:$1|seconde|secondes}} de délai.",
+       "apierror-maxlag": "Attente de $2 : $1 {{PLURAL:$1|seconed|secondes}} de délai.",
+       "apierror-mimesearchdisabled": "La recherche MIME est désactivée en mode Misère.",
+       "apierror-missingcontent-pageid": "Contenu manquant pour la page d’ID $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|Le paramètre|Au moins un des paramètres}} $1 est obligatoire.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|Le paramètre|Un des paramètres}} $1 est obligatoire.",
+       "apierror-missingparam": "Le paramètre <var>$1</var> doit être défini.",
+       "apierror-missingrev-pageid": "Aucune révision actuelle de la page d’ID $1.",
+       "apierror-missingtitle-createonly": "Les titres manquants ne peuvent être protégés qu’avec <kbd>create</kbd>.",
+       "apierror-missingtitle": "La page que vous avez spécifié n’existe pas.",
+       "apierror-missingtitle-byname": "La page $1 n’existe pas.",
+       "apierror-moduledisabled": "Le module <kbd>$1</kbd> a été désactivé.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Seul|Seul un des}} $2 est autorisé pour le paramètre <var>$1</var>.",
+       "apierror-multival-only-one": "Une seule valeur est autorisée pour le paramètre <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> ne peut être utilisé qu’avec une seule page.",
+       "apierror-mustbeloggedin-changeauth": "Vous devez être connecté pour modifier les données d’authentification.",
+       "apierror-mustbeloggedin-generic": "Vous devez être connecté.",
+       "apierror-mustbeloggedin-linkaccounts": "Vous devez être connecté pour lier des comptes.",
+       "apierror-mustbeloggedin-removeauth": "Vous devez être connecté pour supprimer les données d’authentification.",
+       "apierror-mustbeloggedin-uploadstash": "La réserve de téléchargement n’est disponible que pour les utilisateurs connectés.",
+       "apierror-mustbeloggedin": "Vous devez être connecté pour $1.",
+       "apierror-mustbeposted": "Le module <kbd>$1</kbd> nécessite une requête POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Le paramètre suivant a été trouvé|Les paramètres suivants ont été trouvés}} dans la chaîne de requête, mais doit être dans le corps du POST : $1.",
+       "apierror-noapiwrite": "La modification de ce wiki via l’API est désactivée. Assurez-vous que la déclaration <code>$wgEnableWriteAPI=true;</code> st inclue dans le fichier <code>LocalSettings.php</code> du wiki.",
+       "apierror-nochanges": "Aucun changement n’a été demandé.",
+       "apierror-nodeleteablefile": "Pas de telle ancienne version du fichier.",
+       "apierror-no-direct-editing": "La modification directe via l’API n’est pas supportée pour le modèle de contenu $1 utilisée par $2.",
+       "apierror-noedit-anon": "Les utilisateurs anonymes ne peuvent pas modifier les pages.",
+       "apierror-noedit": "Vous n’avez pas le droit de modifier les pages.",
+       "apierror-noimageredirect-anon": "Les utilisateurs anonymes ne peut pas créer des redirections d’image.",
+       "apierror-noimageredirect": "Vous n’avez pas le droit de créer des redirections d’image.",
+       "apierror-nosuchlogid": "Il n’y a pas d’entrée du journal avec l’ID $1.",
+       "apierror-nosuchpageid": "Il n’y a pas de page avec l’ID $1.",
+       "apierror-nosuchrcid": "Il n’y a pas de modification récente avec l’ID $1.",
+       "apierror-nosuchrevid": "Il n’y a pas de révision d’ID $1.",
+       "apierror-nosuchsection": "Il n’y a pas de section $1.",
+       "apierror-nosuchsection-what": "Il ’y a pas de section $1 dans $2.",
+       "apierror-nosuchuserid": "Il n'y a pas d'utilisateur ayant l'ID $1.",
+       "apierror-notarget": "Vous n’avez pas spécifié une cible valide pour cette action.",
+       "apierror-notpatrollable": "La révision r$1 ne peut pas être patrouillée car elle est trop ancienne.",
+       "apierror-nouploadmodule": "Aucun module de téléchargement défini.",
+       "apierror-opensearch-json-warnings": "Les avertissements ne peuvent pas être représentés dans le format JSON OpenSearch.",
+       "apierror-pagecannotexist": "L’espace de noms ne permet pas de pages réelles.",
+       "apierror-pagedeleted": "La page a été supprimée depuis que vous avez récupéré son horodatage.",
+       "apierror-pagelang-disabled": "Il n'est pas possible de modifier la langue d'une page sur ce wiki.",
+       "apierror-paramempty": "Le paramètre <var>$1</var> ne peut pas être vide.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> n’est supporté que pour le contenu wikitexte.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> n’est supporté que pour le contenu wikitexte. $1 utilise le modèle de contenu $2.",
+       "apierror-pastexpiry": "Le temps d’expiration « $1 » est dans le passé.",
+       "apierror-permissiondenied": "Vous n’avez pas le droit de $1.",
+       "apierror-permissiondenied-generic": "Autorisation refusée.",
+       "apierror-permissiondenied-patrolflag": "Vous avez besoin du droit <code>patrol</code> ou <code>patrolmarks</code> pour demander le drapeau patrouillé.",
+       "apierror-permissiondenied-unblock": "Vous n’avez pas le droit de débloquer les utilisateurs.",
+       "apierror-prefixsearchdisabled": "La recherche de préfixe est désactivée en mode misérable.",
+       "apierror-promised-nonwrite-api": "L’entête HTTP <code>Promise-Non-Write-API-Action</code> ne peut pas être envoyé aux modules de l’API en mode écriture.",
+       "apierror-protect-invalidaction": "Type de protection non valide « $1 ».",
+       "apierror-protect-invalidlevel": "Niveau de protection non valide « $1 ».",
+       "apierror-ratelimited": "Vous avez dépassé votre limite de débit. Veuillez attendre un peu et réessayer.",
+       "apierror-readapidenied": "Vous avez besoin du droit de lecture pour utiliser ce module.",
+       "apierror-readonly": "Ce wiki est actuellement en mode lecture seule.",
+       "apierror-reauthenticate": "Vous n’avez pas authentifié récemment cette session ; veuillez vous authentifier de nouveau.",
+       "apierror-redirect-appendonly": "Vous avez essayé de modifier en utilisant le mode de suivi de redirection, qui doit être utilisé en lien avec <kbd>section=new</kbd>, <var>prependtext</var>, ou <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "Le même champ ne peut pas être utilisé à la fois en <var>hide</var> et <var>show</var>.",
+       "apierror-revdel-needtarget": "Un titre cible est nécessaire pour ce type RevDel.",
+       "apierror-revdel-paramneeded": "Au moins une valeur est nécessaire pour <var>hide</var> ou <var>show</var>.",
+       "apierror-revisions-norevids": "Le paramètre <var>revids</var> ne peut pas être utilisé avec les options de liste (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, et <var>$1end</var>).",
+       "apierror-revisions-singlepage": "<var>titles</var>, <var>pageids</var> ou un générateur a été utilisé pour fournir plusieurs pages, mais les paramètres <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> et <var>$1end</var> ne peuvent être utilisés que sur une seule page.",
+       "apierror-revwrongpage": "r$1 n'est pas une révision de $2.",
+       "apierror-searchdisabled": "La recherche <var>$1</var> est désactivée.",
+       "apierror-sectionreplacefailed": "Impossible de fusionner la section mise à jour.",
+       "apierror-sectionsnotsupported": "Les sections ne sont pas prises en charge pour le modèle de contenu $1.",
+       "apierror-sectionsnotsupported-what": "Les sections ne sont pas prises en charge par $1.",
+       "apierror-show": "Paramètre incorrect - des valeurs mutuellement exclusives ne peuvent pas être fournies.",
+       "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si <var>$wgShowHostNames</var> vaut vrai.",
+       "apierror-sizediffdisabled": "La différence de taille est désactivée dans le mode Miser.",
+       "apierror-spamdetected": "Votre modification a été refusée parce qu'elle contenait un fragment de spam: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "Vous n'avez pas l'autorisation d'afficher les résultats de cette page spéciale.",
+       "apierror-stashedfilenotfound": "Impossible de trouver le fichier dans la réserve: $1.",
+       "apierror-stashedit-missingtext": "Pas de texte en réserve associé à la donnée de hachage.",
+       "apierror-stashfailed-complete": "Un téléchargement par morceaux est déjà achevé, vérifiez l’état pour plus de détails.",
+       "apierror-stashfailed-nosession": "Aucune session de téléchargement par morceaux avec cette clé.",
+       "apierror-stashfilestorage": "Impossible de mettre le téléchargement en réserve: $1",
+       "apierror-stashinvalidfile": "Fichier de réserve invalide.",
+       "apierror-stashnosuchfilekey": "Filekey inconnue: $1.",
+       "apierror-stashpathinvalid": "La clé du fichier n'a pas le bon format ou est invalide: $1 .",
+       "apierror-stashwrongowner": "Erreur de propriétaire: $1",
+       "apierror-stashzerolength": "Fichier est de longueur nulle, et n'a pas pu être mis dans la réserve: $1.",
+       "apierror-systemblocked": "Vous avez été bloqué automatiquement par MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "Le développement du modèle n'est effectif que sur un contenu wikitext. $1 utilise le modèle de contenu $2.",
+       "apierror-toofewexpiries": "$1 {{PLURAL:$1|horodatage d’expiration a été fourni|horodatages d’expiration ont été fournis}} alors que $2 {{PLURAL:$2|était attendu|étaient attendus}}.",
+       "apierror-unknownaction": "L'action spécifiée, <kbd>$1</kbd>, n'est pas reconnue.",
+       "apierror-unknownerror-editpage": "Erreur inconnue EditPage: $1.",
+       "apierror-unknownerror-nocode": "Erreur inconnue.",
+       "apierror-unknownerror": "Erreur inconnue : « $1 ».",
+       "apierror-unknownformat": "Format inconnu \"$1\".",
+       "apierror-unrecognizedparams": "Paramètre{{PLURAL:$2||s}} non reconnu{{PLURAL:$2||s}} : $1.",
+       "apierror-unrecognizedvalue": "Valeur non reconnue du paramètre <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "Le dépôt local des fichiers ne prend pas en charge la recherche de toutes les images.",
+       "apierror-upload-filekeyneeded": "Un <var>filekey</var> est nécessaire si le <var>décalage</var> est non nul.",
+       "apierror-upload-filekeynotallowed": "Pas possible de fournir une <var>filekey</var> si <var>offset</var> vaut 0.",
+       "apierror-upload-inprogress": "Le téléversement à partir de la réserve est déjà en cours.",
+       "apierror-upload-missingresult": "Pas de résultat dans les données d'état.",
+       "apierror-urlparamnormal": "Impossible de normaliser les paramètres de l'image pour $1.",
+       "apierror-writeapidenied": "Vous n'êtes pas autorisé à modifier ce wiki au travers de l'API.",
+       "apiwarn-alldeletedrevisions-performance": "Pour de meilleures performances lors de la génération des titres, mettre <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "Impossible d'analyser <var>$1urlparam</var> pour $2. En utilisant seulement la largeur et la hauteur.",
+       "apiwarn-badutf8": "La valeur passée pour <var>$1</var> contient des données non valides ou non normalisées. Les données textuelles doivent être de l’Unicode valide normalisé en NFC sans caractères de contrôle c0 autres que HT (\\t), LF (\\n) et CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "Vérifier que les symboles tels que \"+\" dans le jeton sont correctement  codés avec des pourcents dans l'URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> est devenu obsolète. Veuillez utiliser <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> à la place.",
+       "apiwarn-deprecation-expandtemplates-prop": "Comme aucune valeur n’a été spécifiée pour le paramètre <var>prop</var>, un format d’héritage a été utilisé pour la sortie. Ce format est obsolète et, dans le futur, une valeur par défaut sera fixée pour le paramètre <var>prop</var>, provoquant ainsi l’utilisation systématique du nouveau format.",
+       "apiwarn-deprecation-httpsexpected": "HTTP est utilisé alors que HTTPS est attendu.",
+       "apiwarn-deprecation-login-botpw": "La connexion au compte principal via <kbd>action=login</kbd> est obsolète et peut ne plus fonctionner sans avertissement. Pour continuer à vous connecter avec <kbd>action=login</kbd>, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion au compte principal en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "La connexion au compte principal via <kbd>action=login</kbd> est obsolète et peut ne plus fonctionner sans avertissement. Pour vous connecter en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "La récupération d’un jeton via <kbd>action=login</kbd> est obsolète. Utilisez <kbd>action=query&meta=tokens&type=login</kbd> à la place.",
+       "apiwarn-deprecation-parameter": "Le paramètre <var>$1</var> est obsolète.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> est obsolète depuis MédiaWiki 1.28. Utilisez <kbd>prop=headhtml</kbd> lors de la création de nouveaux documents HTML, ou <kbd>prop=modules|jsconfigvars</kbd> lors de la mise à jour d’un document côté client.",
+       "apiwarn-deprecation-purge-get": "L'utilisation de <kbd>action=purge</kbd> via un GET est obsolète. Utiliser POST à la place.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> est obsolète. Veuillez utiliser <kbd>$2</kbd> à la place.",
+       "apiwarn-difftohidden": "Impossible de faire un diff avec r$1 : le contenu est masqué.",
+       "apiwarn-errorprinterfailed": "Erreur échec imprimante. Nouvel essai sans paramètres.",
+       "apiwarn-errorprinterfailed-ex": "Erreur d’échec de l’impression (réessayera sans paramètres) : $1",
+       "apiwarn-invalidcategory": "« $1 » n'est pas une catégorie.",
+       "apiwarn-invalidtitle": "« $1 » n’est pas un titre valide.",
+       "apiwarn-invalidxmlstylesheetext": "Une feuille de style doit avoir une extension <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "Feuille de style spécifiée non valide ou inexistante.",
+       "apiwarn-invalidxmlstylesheetns": "La feuille de style devrait être dans l’espace de noms {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "La propriété <kbd>modules</kbd> a été définie mais pas <kbd>jsconfigvars</kbd> ni <kbd>encodedjsconfigvars</kbd>. Les variables de configuration sont nécessaires pour une utilisation correcte du module.",
+       "apiwarn-notfile": "« $1 » n'est pas un fichier.",
+       "apiwarn-nothumb-noimagehandler": "Impossible de créer la vignette car $1 n’a pas de gestionnaire d’image associé.",
+       "apiwarn-parse-nocontentmodel": "Ni <var>title</var> ni <var>contentmodel</var> n’ont été fournis, $1 est supposé.",
+       "apiwarn-parse-titlewithouttext": "<var>title</var> utilisé sans <var>text</var>, et les propriétés de page analysées sont nécessaires. Voulez-vous dire que vous voulez utiliser <var>page</var> à la place de <var>title</var> ?",
+       "apiwarn-redirectsandrevids": "La résolution de la redirection ne peut pas être utilisée avec le paramètre <var>revids</var>. Toutes les redirections vers lesquelles pointent <var>revids</var> n’ont pas été résolues.",
+       "apiwarn-tokennotallowed": "L'action « $1 » n'est pas autorisée pour l'utilisateur actuel.",
+       "apiwarn-tokens-origin": "Les jetons ne peuvent pas être obtenus quand la politique de même origine n’est pas appliquée.",
+       "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>: la limite est $2.",
+       "apiwarn-truncatedresult": "Ce résultat a été tronqué parce que sinon, il dépasserait la limite de $1 octets.",
+       "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> a été rendu obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now</kbd>.",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valeur non reconnue|Valeurs non reconnues}} pour le paramètre <var>$1</var> : $2.",
+       "apiwarn-unsupportedarray": "Le paramètre <var>$1</var> utilise une syntaxe PHP de tableau non prise en charge.",
+       "apiwarn-urlparamwidth": "Valeur de la largeur définie dans <var>$1urlparam</var> ($2) ignorée en faveur de la largeur calculée à partir de <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
+       "apiwarn-validationfailed-badchars": "caractères non valides dans la clé (<code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code>et <code>-</code> sont les seuls autorisés).",
+       "apiwarn-validationfailed-badpref": "pas une préférence valide.",
+       "apiwarn-validationfailed-cannotset": "ne peut pas être initialisé par ce module.",
+       "apiwarn-validationfailed-keytoolong": "clé trop longue (au plus $1 octets).",
+       "apiwarn-validationfailed": "Erreur de validation pour <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Avertissement de sécurité</strong>: <var>$wgDebugAPI</var> est activé.",
+       "api-feed-error-title": "Erreur ($1)",
+       "api-usage-docref": "Voir $1 concernant l'utilisation de l'API.",
+       "api-usage-mailinglist-ref": "S’abonner à la liste de diffusion mediawiki-api-announce sur &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; pour les signalisations d’obsolescence de l’API ou de modifications en rupture.",
+       "api-exception-trace": "$1 à $2($3)\n$4",
        "api-credits-header": "Remerciements",
        "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://phabricator.wikimedia.org/."
 }
index bd8d4a2..f8e3f05 100644 (file)
        "apihelp-main-param-requestid": "Calquera valor dado aquí será incluído na resposta. Pode usarse para distingir peticións.",
        "apihelp-main-param-servedby": "Inclúa o nome do servidor que servía a solicitude nos resultados.",
        "apihelp-main-param-curtimestamp": "Incluir a marca de tempo actual no resultado.",
+       "apihelp-main-param-responselanginfo": "Incluír no resultado as linguas usada para <var>uselang</var> e <var>errorlang</var>.",
        "apihelp-main-param-origin": "Cando se accede á API usando unha petición AJAX entre-dominios (CORS), inicializar o parámetro co dominio orixe. Isto debe incluírse en calquera petición pre-flight, e polo tanto debe ser parte da petición URI (non do corpo POST). Para peticións autenticadas, isto debe coincidir exactamente cunha das orixes na cabeceira <code>Origin</code>, polo que ten que ser fixado a algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parámetro non coincide coa cabeceira <code>Origin</code>, devolverase unha resposta 403. Se este parámetro coincide coa cabeceira <code>Origin</code> e a orixe está na lista branca, as cabeceiras <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serán fixadas.\n\nPara peticións non autenticadas, especifique o valor <kbd>*</kbd>. Isto fará que se fixe a cabeceira <code>Access-Control-Allow-Origin</code>, pero <code>Access-Control-Allow-Credentials</code> será <code>false</code> e todos os datos específicos do usuario serán ocultados.",
        "apihelp-main-param-uselang": "Linga a usar para a tradución de mensaxes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devolve unha lista de códigos de lingua, ou especificando <kbd>user</kbd> coa preferencia de lingua do usuario actual, ou especificando <kbd>content</kbd> para usar a lingua do contido desta wiki.",
+       "apihelp-main-param-errorformat": "Formato a usar para a saída do texto de aviso e de erroː\n; plaintext:  texto wiki sen as etiquetas HTML e coas entidades substituídas.\n; wikitext: texto wiki sen analizar.\n; html: HTML.\n; raw: Clave de mensaxe e parámetros.\n; none: Sen saída de texto, só os códigos de erro.\n; bc: Formato utilizado antes de MediaWiki 1.29. <var>errorlang</var> e <var>errorsuselocal</var> non se teñen en conta.",
+       "apihelp-main-param-errorlang": "Lingua usada para advertencias e erros. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devolve unha lista de códigos de lingua. Pode especificar <kbd>content</kbd> para utilizar a lingua do contido deste wiki ou <kbd>uselang</kbd> para utilizar o mesmo valor que o do parámetro <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Se se indica, os textos de erro empregarán mensaxes adaptadas á lingua do espazo de nomes {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquear un usuario.",
-       "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear.",
+       "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear. Non pode usarse xunto con <var>$1userid</var>",
+       "apihelp-block-param-userid": "Identificador de usuario a bloquear. Non pode usarse xunto con <var>$1user</var>.",
        "apihelp-block-param-expiry": "Tempo de caducidade. Pode ser relativo (p. ex.<kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absoluto (p. ex. 2014-09-18T12:34:56Z</kbd>). Se se pon kbd>infinite</kbd>, <kbd>indefinite</kbd>, ou <kbd>never</kbd>, o bloqueo nunca caducará.",
        "apihelp-block-param-reason": "Motivo para o bloqueo.",
        "apihelp-block-param-anononly": "Bloquear só usuarios anónimos (é dicir, desactivar edicións anónimas desta dirección IP).",
@@ -39,6 +44,7 @@
        "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-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-block-example-ip-simple": "Bloquear dirección IP <kbd>192.0.2.5</kbd> durante tres días coa razón <kbd>Primeiro aviso</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario <kbd>Vandal</kbd> coa razón <kbd>Vandalism</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
        "apihelp-changeauthenticationdata-description": "Cambiar os datos de autenticación do usuario actual.",
        "apihelp-help-example-query": "Axuda para dous submódulos de consulta.",
        "apihelp-imagerotate-description": "Xirar unha ou máis imaxes.",
        "apihelp-imagerotate-param-rotation": "Graos a rotar a imaxe no sentido do reloxio.",
+       "apihelp-imagerotate-param-tags": "Etiquetas aplicar á entrada no rexistro de subas.",
        "apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> graos.",
        "apihelp-imagerotate-example-generator": "Rotar tódalas imaxes en <kbd>Category:Flip</kbd> <kbd>180</kbd> graos",
        "apihelp-import-description": "Importar unha páxina doutra wiki, ou dun ficheiro XML.\n\nDecátese de que o POST HTTP debe facerse como unha carga de ficheiro (p. ex. usando multipart/form-data) cando se envíe un ficheiro para o parámetro <var>xml</var>.",
        "apihelp-import-param-templates": "Para importacións interwiki: importar tódolos modelos incluídos.",
        "apihelp-import-param-namespace": "Importar a este espazo de nomes. Non se pode usar de forma conxunta con  <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpáxina desta páxina. Non se pode usar de forma conxunta con <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de importacións e á revisión nula das páxinas importadas.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] ó espazo de nomes 100 con todo o historial.",
        "apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.",
        "apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de <kbd>Exemplo</kbd>.",
        "apihelp-managetags-param-tag": "Etiqueta para crear, borrar, activar ou desactivar. Para a creación da etiqueta, a etiqueta non pode existir previamente. Para o borrado da etiqueta, a etiqueta debe existir. Para a activación da etiqueta, a etiqueta debe existir e non pode ser usada por unha extensión. Para desactivar unha etiqueta, a etiqueta debe estar activa e definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, borrar, activar ou desactivar a etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Ignorar calquera aviso que apareza durante a operación.",
+       "apihelp-managetags-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de xestión das etiquetas.",
        "apihelp-managetags-example-create": "Crear unha etiqueta chamada <kbd>spam</kbd> coa razón <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Borrar a etiqueta <kbd>vandalismo</kbd> coa razón <kbd>Erros ortográficos</kbd>",
        "apihelp-managetags-example-activate": "Activar a etiqueta chamada <kbd>spam</kbd> coa razón <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Eliminar a páxina e a redirección da páxina de vixiancia do usuario actual.",
        "apihelp-move-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
        "apihelp-move-param-ignorewarnings": "Ignorar as advertencias.",
+       "apihelp-move-param-tags": "Cambiar as etiquetas a aplicar á entrada do rexistro de traslados e na revisión nula da páxina de destino.",
        "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sen deixar unha redirección.",
        "apihelp-opensearch-description": "Buscar no wiki mediante o protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Buscar texto.",
        "apihelp-protect-example-protect": "Protexer unha páxina",
        "apihelp-protect-example-unprotect": "Desprotexer unha páxina poñendo as restricións a <kbd>all</kbd>. (isto quere dicir que todo o mundo pode realizar a acción).",
        "apihelp-protect-example-unprotect2": "Desprotexer unha páxina quitando as restricións.",
-       "apihelp-purge-description": "Borrar a caché para os títulos indicados.\n\nPrecisa dunha petición POST se o usuario non está conectado.",
+       "apihelp-purge-description": "Borrar a caché para os títulos indicados.",
        "apihelp-purge-param-forcelinkupdate": "Actualizar as táboas de ligazóns.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Actualizar a táboa de ligazóns, e actualizar as táboas de ligazóns para calquera páxina que use esta páxina como modelo.",
        "apihelp-purge-example-simple": "Purgar a <kbd>Main Page</kbd> e páxina da <kbd>API</kbd>.",
        "apihelp-query+allmessages-param-prop": "Que propiedades obter.",
        "apihelp-query+allmessages-param-enableparser": "Marcar para activar o analizador, isto preprocesará o texto wiki da mensaxe (substituir palabras máxicas, xestionar modelo, etc.)",
        "apihelp-query+allmessages-param-nocontent": "Se se marca, non inclúe o contido das mensaxes na saída.",
-       "apihelp-query+allmessages-param-includelocal": "Tamén inclúe mensaxes locais, p.ex. mensaxes que non existen no software pero existen como unha páxina MediaWiki:. \nIsto lista todas as páxinas MediaWiki:, polo que tamén listará as que non son realmente mensaxes como [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Tamén inclúe mensaxes locais, p.ex. mensaxes que non existen no software pero existen como no espazo de nomes {{ns:MediaWiki}}. \nIsto lista todas as páxinas do espazo de nomes {{ns:MediaWiki}}, polo que tamén listará as que non son realmente mensaxes como [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Argumentos a substituír na mensaxe.",
        "apihelp-query+allmessages-param-filter": "Retornar só mensaxes con nomes que conteñan esta cadea.",
        "apihelp-query+allmessages-param-customised": "Devolver só mensaxes neste estado de personalización.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Engade o nome de ficheiro da versión do ficheiro para versións anteriores ás últimas.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Engade a profundidade de bits da versión.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Usado pola páxina Special:Upload para obter información sobre un ficheiro existente. Non previsto para usar fóra do núcleo MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Engadido cando o ficheiro está na [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "Cantas revisións de ficheiro a devolver por ficheiro.",
        "apihelp-query+imageinfo-param-start": "Selo de tempo dende o que comezar a lista.",
        "apihelp-query+imageinfo-param-end": "Selo de tempo no que rematar a lista.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Se as traducións para a propiedade extmetadata están dispoñibles, búscaas todas.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Se está especificado e non baleiro, só se devolverán esas claves para $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Unha cadea de parámetro específico no analizador. Por exemplo, os PDFs poden usar <kbd>page15-100px</kbd>. Debe usarse <var>$1urlwidth</var> que debe ser coherente con <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Se <kbd>$2prop=badfile</kbd> está definido, este é o título da páxina usado para avaliar a [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Só buscar ficheiros no repositorio local.",
        "apihelp-query+imageinfo-example-simple": "Busca a información sobre a versión actual de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Busca información sobre as versións de [[:File:Test.jpg]] posteriores a 2008.",
        "apihelp-query+usercontribs-param-limit": "Máximo número de contribucións a mostar.",
        "apihelp-query+usercontribs-param-start": "Selo de tempo de comezo ó que volver.",
        "apihelp-query+usercontribs-param-end": "Selo de tempo de fin ó que volver.",
-       "apihelp-query+usercontribs-param-user": "Usuarios para os que recuperar as contribucións.",
-       "apihelp-query+usercontribs-param-userprefix": "Recuperar as contribucións de todos os usuarios cuxo nome comece por este valor. Ignora $1user.",
+       "apihelp-query+usercontribs-param-user": "Usuarios para os que recuperar as contribucións. Non pode ser usado con <var>$1userids</var> ou <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Recuperar as contribucións de todos os usuarios cuxo nome comece por este valor. Non pode usarse con <var>$1user</var> nin con  <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "IDs de usuarios para os que recuperar as contribucións. Non pode ser usado con <var>$1user</var> nin con <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Só listar contribucións nestes espazos de nomes.",
        "apihelp-query+usercontribs-param-prop": "Engade información adicional:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Engade os identificadores de páxina e modificación.",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marca se o usuario actual está bloqueado, por que, e por que razón.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Engade unha etiqueta <samp>messages</samp> (mensaxe) se o usuario actual ten mensaxes pendentes.",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos os grupos ós que pertence o usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Lista os grupos ós que o usuario actual foi asignado explicitamente, incluíndo a data de caducidade de afiliación a cada grupo.",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lista todos so grupos dos que o usuario actual é membro automaticamente.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos os dereitos que ten o usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lista os grupos ós que o usuario pode engadir ou eliminar a outros usuarios.",
        "apihelp-query+users-param-prop": "Que información incluír:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Etiquetas se o usuario está bloqueado, por quen, e por que razón.",
        "apihelp-query+users-paramvalue-prop-groups": "Lista todos os grupos ós que pertence cada usuario.",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "Lista os grupos ós que foi asignado explicitamente cada usuario, incluíndo a data de caducidade de afiliación a cada grupo.",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "Lista os grupos dos que un usuario é membro de forma automatica.",
        "apihelp-query+users-paramvalue-prop-rights": "Lista todos os dereitos que ten cada usuario.",
        "apihelp-query+users-paramvalue-prop-editcount": "Engade o contador de edicións do usuario.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indica se unha conta pode ser creada para nomes de usuario válidos pero non rexistrados.",
        "apihelp-query+users-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \nindica que o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+users-param-users": "Lista de usuarios para os que obter información.",
+       "apihelp-query+users-param-userids": "Unha lista de identificadores de usuarios dos que obter información.",
        "apihelp-query+users-param-token": "Usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> no canto diso.",
        "apihelp-query+users-example-simple": "Mostar información para o usuario <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Ver os cambios recentes das páxinas na lista de vixiancia do usuario actual.",
        "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-param-user": "Usuario sendo reinicializado.",
        "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.",
-       "apihelp-resetpassword-param-capture": "Devolve os contrasinais temporais que se enviaron. Require o dereito de usuario <code>passwordreset</code> .",
        "apihelp-resetpassword-example-user": "Enviar un correo de reinicialización de contrasinal ó usuario <kbd>Exemplo</kbd>.",
        "apihelp-resetpassword-example-email": "Enviar un correo de reinicialización de contrasinal a todos os usuarios con enderezo de correo electrónico <kbd>usario@exemplo.com</kbd>.",
        "apihelp-revisiondelete-description": "Borrar e restaurar revisións.",
        "apihelp-revisiondelete-param-show": "Que mostrar para cada revisión.",
        "apihelp-revisiondelete-param-suppress": "Eliminar os datos dos administradores así coma dos doutros.",
        "apihelp-revisiondelete-param-reason": "Razón para o borrado ou restaurado.",
+       "apihelp-revisiondelete-param-tags": "Etiquetas a aplicar á entrada no rexistro de borrados.",
        "apihelp-revisiondelete-example-revision": "Ocultar contido para revisión <kbd>12345</kbd> na <kbd>Páxina Principal</kbd>.",
        "apihelp-revisiondelete-example-log": "Ocultar todos os datos da entrada de rexistro <kbd>67890</kbd> coa razón <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "Desfacer a última modificación da páxina.\n\nSe o último usuario que modificou a páxina fixo varias modificacións nunha fila, desfaranse todas.",
        "apihelp-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a <kbd>Páxina Principal</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a <kbd>Main page</kbd> de forma que todas as edicións dende o 1 se xaneiro de 2012 queden sen revisar.",
        "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Cambiar a lingua dunha páxina.",
+       "apihelp-setpagelanguage-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-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-setpagelanguage-param-reason": "Motivo do cambio.",
+       "apihelp-setpagelanguage-param-tags": "Cambiar as etiquetas a aplicar á entrada de rexistro resultante desta acción.",
+       "apihelp-setpagelanguage-example-language": "Cambiar a lingua de <kbd>Main Page</kbd> ó éuscaro.",
+       "apihelp-setpagelanguage-example-default": "Cambiar a lingua da páxina con identificador 123 á lingua predeterminada para o contido da wiki.",
        "apihelp-stashedit-description": "Preparar unha edición na caché compartida.\n\nEstá previsto que sexa usado vía AJAX dende o formulario de edición para mellorar o rendemento de gardado da páxina.",
        "apihelp-stashedit-param-title": "Título da páxina que se está a editar.",
        "apihelp-stashedit-param-section": "Número de selección. O <kbd>0</kbd> é para a sección superior, <kbd>novo</kbd> para unha sección nova.",
        "apihelp-tag-param-add": "Etiquetas a engadir. Só poden engadirse etiquetas definidas manualmente.",
        "apihelp-tag-param-remove": "Etiquetas a eliminar. Só se poden eliminar as etiquetas definidas manualmente ou que non teñen ningunha definición.",
        "apihelp-tag-param-reason": "Razón para o cambio.",
+       "apihelp-tag-param-tags": "Etiquetas a aplicar á entrada de rexistro que será creada como resultado desta acción.",
        "apihelp-tag-example-rev": "Engadir a etiqueta <kbd>vandalismo</kbd> á revisión con identificador 123 sen indicar un motivo",
        "apihelp-tag-example-log": "Eliminar a etiqueta <kbd>publicidade</kbd> da entrada do rexistro con identificador 123 co motivo <kbd>aplicada incorrectamente</kbd>",
        "apihelp-tokens-description": "Obter os identificadores para accións de modificación de datos.\n\nEste módulo está obsoleto e foi reemprazado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Recuperar un identificador de modificación (por defecto).",
        "apihelp-tokens-example-emailmove": "Recuperar un identificador de correo e un identificador de movemento.",
        "apihelp-unblock-description": "Desbloquear un usuario.",
-       "apihelp-unblock-param-id": "ID do bloque a desbloquear (obtido de <kbd>list=blocks</kbd>). Non pode usarse xunto con <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Nome de usuario, dirección IP ou rango de direccións IP a desbloquear. Non pode usarse xunto con <var>$1id</var>.",
+       "apihelp-unblock-param-id": "ID do bloque a desbloquear (obtido de <kbd>list=blocks</kbd>). Non pode usarse xunto con <var>$1user</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Nome de usuario, enderezo IP ou rango de enderezos IP a desbloquear. Non pode usarse xunto con <var>$1id</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID de usuario a desbloquear. Non pode usarse xunto con <var>$1id</var> ou <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Razón para desbloquear.",
        "apihelp-unblock-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de bloqueo.",
        "apihelp-unblock-example-id": "Desbloquear bloqueo ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Desbloquear usuario <kbd>Bob</kbd> con razón <kbd>Síntoo Bob</kbd>.",
-       "apihelp-undelete-description": "Restaurar modificacións dunha páxina borrada.\n\nUnha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restaurar modificacións dunha páxina borrada.\n\nUnha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Título da páxina a restaurar.",
        "apihelp-undelete-param-reason": "Razón para restaurar.",
        "apihelp-undelete-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de borrado.",
        "apihelp-userrights-description": "Cambiar a pertencia dun usuario a un grupo.",
        "apihelp-userrights-param-user": "Nome de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
-       "apihelp-userrights-param-add": "Engadir o usuario a estes grupos.",
+       "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-remove": "Eliminar o usuario destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para o cambio.",
+       "apihelp-userrights-param-tags": "Cambia as etiquetas a aplicar á entrada do rexistro de dereitos de usuario.",
        "apihelp-userrights-example-user": "Engadir o usuario <kbd>FooBot</kbd> ó grupo <kbd>bot</kbd>, e eliminar dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Engadir ó usuario con ID <kbd>123</kbd> ó grupo <kbd>bot</kbd>, e borralo dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
+       "apihelp-userrights-example-expiry": "Engadir o usuario <kbd>SometimeSysop</kbd> ó grupo <kbd>sysop</kbd> por 1 mes.",
+       "apihelp-validatepassword-description": "Valida un contrasinal contra as políticas de contrasinais da wiki.\n\nA validez é <samp>Good</samp> se o contrasinal é aceptable, <samp>Change</samp> se o contrasinal pode usarse para iniciar sesión pero debe cambiarse ou <samp>Invalid</samp> se o contrasinal non se pode usar.",
+       "apihelp-validatepassword-param-password": "Contrasinal a validar.",
+       "apihelp-validatepassword-param-user": "Nome de usuario, para probas de creación de contas. O usuario nomeado non debe existir.",
+       "apihelp-validatepassword-param-email": "Enderezo de correo electrónico, para probas de creación de contas.",
+       "apihelp-validatepassword-param-realname": "Nome real, para probas de creación de contas.",
+       "apihelp-validatepassword-example-1": "Validar o contrasinal <kbd>foobar</kbd> para o usuario actual.",
+       "apihelp-validatepassword-example-2": "Validar o contrasinal <kbd>qwerty</kbd> para a creación do usuario <kbd>Example</kbd>.",
        "apihelp-watch-description": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.",
        "apihelp-watch-param-title": "Páxina a vixiar/deixar de vixiar. Usar no canto <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Se está definido, a páxina deixará de estar vixiada en vez de vixiada.",
        "apihelp-phpfm-description": "Datos de saída en formato serializado de PHP(impresión en HTML).",
        "apihelp-rawfm-description": "Datos de saída, incluíndo os elementos de depuración, en formato JSON (impresión en HTML).",
        "apihelp-xml-description": "Datos de saída en formato XML.",
-       "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:mediawiki}} rematando con <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:MediaWiki}} rematando con <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.",
        "apihelp-xmlfm-description": "Datos de saída en formato XML(impresión en HTML).",
        "api-format-title": "Resultado de API de MediaWiki",
        "api-help-param-upload": "Debe ser enviado como un ficheiro importado usando multipart/form-data.",
        "api-help-param-multi-separate": "Separe os valores con <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|outros]].",
        "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para os bots).",
+       "api-help-param-multi-all": "Para especificar tódolos valores use <kbd>$1</kbd>.",
        "api-help-param-default": "Por defecto: $1",
        "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-authmanagerhelper-returnurl": "Devolve o URL para os fluxos de autenticación de terceiros, que debe ser absoluto. Este ou <var>$1continue</var> é obrigatorio.\n\nLogo da recepción dunha resposta <samp>REDIRECT</samp>, vostede normalmente abrirá un navegador web ou un visor web para ver a URL <samp>redirecttarget</samp> especificada para un fluxo de autenticación de terceiros. Cando isto se complete, a aplicación de terceiros enviará ó navegador web ou visor web a esta URL. Vostede debe eliminar calquera consulta ou parámetros POST da URL e pasalos como unha consulta <var>$1continue</var> a este módulo API.",
        "api-help-authmanagerhelper-continue": "Esta petición é unha continucación despois dun resposta precedente <samp>UI</samp> ou <samp>REDIRECT</samp>. Esta ou <var>$1returnurl</var> é requirida.",
        "api-help-authmanagerhelper-additional-params": "Este módulo acepta parámetros adicionais dependendo das consultas de autenticación dispoñibles. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (ou unha resposta previa deste módulo, se aplicable) para determinar as consultas dispoñibles e os campos que usan.",
+       "apierror-allimages-redirect": "Usar <kbd>gaifilterredir=nonredirects</kbd> no canto de <var>redirects</var> cando <kbd>allimages</kbd> é usado como xerador.",
+       "apierror-allpages-generator-redirects": "Usar <kbd>gapfilterredir=nonredirects</kbd> no canto de <var>redirects</var> cando <kbd>allpages</kbd> é usado como xerador.",
+       "apierror-appendnotsupported": "Non pode anexarse a páxinas que usan o modelo de contido $1.",
+       "apierror-articleexists": "O artigo que intentou crear xa existe.",
+       "apierror-assertbotfailed": "A verificación de que o usuario ten o dereito de <code>bot</code> fallou.",
+       "apierror-assertnameduserfailed": "A verificación de que o usuario é «$1» fallou.",
+       "apierror-assertuserfailed": "A verificación de que o usuario está conectado fallou.",
+       "apierror-autoblocked": "O seu enderezo IP foi bloqueado automaticamente porque foi utilizado por un usuario bloqueado.",
+       "apierror-badconfig-resulttoosmall": "O valor de <code>$wgAPIMaxResultSize</code> neste wiki é demasiado pequeno como para conter información de resultados básicos.",
+       "apierror-badcontinue": "Parámetro de continuación non válido. Debe pasar o valor orixinal devolto pola consulta precedente.",
+       "apierror-baddiff": "A comparación non pode recuperarse. Unha ou ambas revisións non existen ou non ten permiso para velas.",
+       "apierror-baddiffto": "<var>$1diffto</var> debe fixarse cun número non negativo, <kbd>prev</kbd>, <kbd>next</kbd> ou <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "O formato solicitado $1 non está soportado polo modelo de contido $2.",
+       "apierror-badformat": "O formato solicitado $1 non está soportado polo modelo de contido $2 utilizado por $3.",
+       "apierror-badgenerator-notgenerator": "O módulo <kbd>$1</kbd> non pode utilizarse como xerador.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> descoñecido.",
+       "apierror-badip": "O parámetro IP non é válido.",
+       "apierror-badmd5": "O código hash MD5 non era incorrecto.",
+       "apierror-badmodule-badsubmodule": "O módulo <kbd>$1</kbd> non ten un submódulo \"$2\".",
+       "apierror-badmodule-nosubmodules": "O módulo <kbd>$1</kbd> non ten submódulos.",
+       "apierror-badparameter": "Valor non válido para o parámetro <var>$1</var>.",
+       "apierror-badquery": "A consulta non é válida.",
+       "apierror-badtimestamp": "Valor \"$2\" non válido para o parámetro de data e hora <var>$1</var>.",
+       "apierror-badtoken": "Identificador CSRF non válido.",
+       "apierror-badupload": "O parámetro de suba de ficheiro <var>$1</var> non é unha suba de ficheiro, asegúrese de usar <code>multipart/form-data</code> para o seu POST e de incluír un nome de ficheiro na cabeceira <code>Content-Disposition</code>.",
+       "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-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-cannotreauthenticate": "Esta acción non está dispoñible xa que súa identidade non se pode verificar.",
+       "apierror-cannotviewtitle": "Non está autorizado para ver $1.",
+       "apierror-cantblock-email": "Non ten permiso para bloquear ós usuarios o envío de correo electrónico a través da wiki.",
+       "apierror-cantblock": "Non ten permisos para bloquear usuarios.",
+       "apierror-cantchangecontentmodel": "Non ten permiso para cambiar o modelo de contido dunha páxina.",
+       "apierror-canthide": "Non ten permiso para ocultar nomes de usuario do rexistro de bloqueos.",
+       "apierror-cantimport-upload": "Non ten permiso para importar páxinas subidas.",
+       "apierror-cantimport": "Non ten permisos para importar páxinas.",
+       "apierror-cantoverwrite-sharedfile": "O ficheiro obxectivo existe nun repositorio compartido e non ten permiso para substituílo.",
+       "apierror-cantsend": "Non está conectado na súa conta, non ten un enderezo de correo electrónico confirmado, ou non ten permiso para enviar correos electrónicos a outros usuarios, polo que non pode enviar correo electrónico.",
+       "apierror-cantundelete": "Non se puido restaurarː pode que as revisións solicitadas non existan, ou pode que xa se restauraran.",
+       "apierror-changeauth-norequest": "Erro ó crear a petición de modificación.",
+       "apierror-chunk-too-small": "O tamaño mínimo dun segmento é de  $1 {{PLURAL:$1|byte|bytes}} para os segmentos non finais.",
+       "apierror-cidrtoobroad": "Os rangos CIDR $1 maiores que /$2 non son aceptados.",
+       "apierror-compare-inputneeded": "É necesario un título, un ID de páxina ou un número de revisión para os parámetros <var>from</var> e <var>to</var>.",
+       "apierror-contentserializationexception": "Erro de serialización do contidoː $1",
+       "apierror-contenttoobig": "O contido que achegou excede o límite de tamaño dun artigo, que é de  {{PLURAL:$1|kilobyte|kilobytes}}.",
+       "apierror-copyuploadbaddomain": "As subas por URL non están permitidas para este dominio.",
+       "apierror-copyuploadbadurl": "As subas non están permitidas para esta URL.",
+       "apierror-create-titleexists": "Os títulos existentes non poden ser protexidos con <kbd>create</kbd>.",
+       "apierror-csp-report": "Erro procesando o informe CSPː $1.",
+       "apierror-databaseerror": "[$1] erro de consulta da base de datos.",
+       "apierror-deletedrevs-param-not-1-2": "O parámetro <var>$1</var> non pode usarse nos modos 1 e 2.",
+       "apierror-deletedrevs-param-not-3": "O parámetro <var>$1</var> non pode usarse no modo 3.",
+       "apierror-emptynewsection": "Non é posible crear novas seccións baleiras.",
+       "apierror-emptypage": "Non é posible crear novas páxinas baleiras.",
+       "apierror-exceptioncaught": "[$1] Excepción capturada: $2",
+       "apierror-filedoesnotexist": "O ficheiro non existe.",
+       "apierror-fileexists-sharedrepo-perm": "O ficheiro obxectivo existe nun servidor compartido. Use o parámetro <var>ignorewarnings</var> para ignoralo.",
+       "apierror-filenopath": "Non é posible obter o camiño do ficheiro local.",
+       "apierror-filetypecannotberotated": "O tipo de ficheiro non permite que sexa rotado.",
+       "apierror-formatphp": "Esta resposta non pode ser representada usando kbd>format=php</kbd>. Consulte https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "O título para <kbd>$1</kbd> debe ser un ficheiro.",
+       "apierror-import-unknownerror": "Erro descoñecido ó importarː $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> non pode pasar de $2 (fixado a $3) para bots ou administradores do sistema.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> non pode pasar de $2 (fixado a $3) para os usuarios.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> non pode ser menor de $2 (fixado a $3).",
+       "apierror-invalidcategory": "O nome da categoría que indicou non é válido.",
+       "apierror-invalid-chunk": "O desplazamento máis o segmento actual é maior que o tamaño solicitado do ficheiro.",
+       "apierror-invalidexpiry": "Hora de caducidade incorrecta \"$1\".",
+       "apierror-invalid-file-key": "Non se corresponde cunha clave válida de ficheiro.",
+       "apierror-invalidlang": "Código de lingua incorrecto para o parámetro <var>$1</var>.",
+       "apierror-invalidoldimage": "O parámetro oldimage ten un formato incorrecto.",
+       "apierror-invalidparammix-cannotusewith": "O parámetro <kbd>$1</kbd> non pode usarse xunto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "O parámetro <kbd>$1</kbd> só pode usarse xunto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> non se pode combinar cos parámetros <var>oldid</var>, <var>pageid</var> e <var>page</var>. Por favor, utilice <var>title</var> e <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Os parámetros}} $1 non poden usarse xuntos.",
+       "apierror-invalidsection": "O parámetro sección debe ser un ID de sección válido ou <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "O código hash SHA1Base36 proporcionado non é correcto.",
+       "apierror-invalidsha1hash": "O código hash SHA1 proporcionado non é correcto.",
+       "apierror-invalidtitle": "Título incorrecto \"$1\".",
+       "apierror-invalidurlparam": "Valor non válido para <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Nome de usuario incorrecto \"$1\".",
+       "apierror-invaliduserid": "O identificador de usuario <var>$1</var> non é válido.",
+       "apierror-maxlag-generic": "Esparando por un servidor de base de datosː $1 {{PLURAL:$1|segundo|segundos}} de atraso.",
+       "apierror-maxlag": "Esperando por $2: $1 {{PLURAL:$1|segundo|segundos}} de atraso.",
+       "apierror-mimesearchdisabled": "A busca MIME está desactivada no modo Miser (avaro).",
+       "apierror-missingcontent-pageid": "Falta contido para a páxina con identificador $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|O parámetro|Polo menos un dos parámetros}} $1 é necesario.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|O parámetro|Un dos parámetros}} $1 é necesario.",
+       "apierror-missingparam": "O parámetro <var>$1</var> debe estar definido.",
+       "apierror-missingrev-pageid": "Non hai ningunha revisión actual da páxina con ID $1.",
+       "apierror-missingtitle-createonly": "Os títulos faltantes só se poden protexer con <kbd>create</kbd>.",
+       "apierror-missingtitle": "A páxina que especificou non existe.",
+       "apierror-missingtitle-byname": "A páxina $1 non existe.",
+       "apierror-moduledisabled": "O módulo <kbd>$1</kbd> foi deshabilitado.",
+       "apierror-multival-only-one-of": "Só {{PLURAL:$3|se permite o valor|se permiten os valores}} $2 para o parámetro <var>$1</var>.",
+       "apierror-multival-only-one": "Só se permite un valor para o parámetro <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> non se pode utilizar máis que con unha soa páxina.",
+       "apierror-mustbeloggedin-changeauth": "Debe estar conectado para poder cambiar os datos de autentificación.",
+       "apierror-mustbeloggedin-generic": "Debe estar conectado.",
+       "apierror-mustbeloggedin-linkaccounts": "Debe estar conectado para ligar contas.",
+       "apierror-mustbeloggedin-removeauth": "Debe estar conectado para borrar datos de autentificación.",
+       "apierror-mustbeloggedin": "Debe estar conectado para $1.",
+       "apierror-mustbeposted": "O módulo <kbd>$1</kbd> require unha petición POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Atopouse o seguinte parámetro|Atopáronse os seguintes parámetros}} na cadea da consulta, pero deben estar no corpo do POST: $1.",
+       "apierror-noapiwrite": "A edición deste wiki a través da API está deshabilitada. Asegúrese de que a declaración <code>$wgEnableWriteAPI=true;</code> está incluída no ficheiro <code>LocalSettings.php</code> da wiki.",
+       "apierror-nochanges": "Non se solicitou ningún cambio.",
+       "apierror-nodeleteablefile": "Non existe esa versión antiga do ficheiro.",
+       "apierror-no-direct-editing": "A edición directa a través da API non é compatible co modelo de contido $1 utilizado por $2.",
+       "apierror-noedit-anon": "Os usuarios anónimos non poden editar páxinas.",
+       "apierror-noedit": "Non ten permisos para editar páxinas.",
+       "apierror-noimageredirect-anon": "Os usuarios anónimos non poden crear redireccións de imaxes.",
+       "apierror-noimageredirect": "Non ten permiso para crear redireccións de imaxes.",
+       "apierror-nosuchlogid": "Non hai ningunha entrada de rexistro con identificador $1.",
+       "apierror-nosuchpageid": "Non hai ningunha páxina con identificador $1.",
+       "apierror-nosuchrcid": "Non hai ningún cambio recente con identificador $1.",
+       "apierror-nosuchrevid": "Non hai ningunha revisión con identificador $1.",
+       "apierror-nosuchsection": "Non hai ningunha sección $1.",
+       "apierror-nosuchsection-what": "Non hai ningunha sección $1 en $2.",
+       "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-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-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-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> só está soportado para o contido wikitexto. $1 usa o modelo de contido $2.",
+       "apierror-pastexpiry": "A tempo de caducidade \"$1\" está no pasado.",
+       "apierror-permissiondenied": "Non ten permiso para $1.",
+       "apierror-permissiondenied-generic": "Permisos rexeitados.",
+       "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-protect-invalidaction": "Tipo de protección \"$1\" non válido.",
+       "apierror-protect-invalidlevel": "Nivel de protección \"$1\" non válido.",
+       "apierror-ratelimited": "Superou o seu límite de rango. Agarde uns minutos e inténteo de novo",
+       "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-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-sectionsnotsupported": "As seccións non son compatibles co modelo de contido $1.",
+       "apierror-sectionsnotsupported-what": "As seccións non son compatibles con $1.",
+       "apierror-show": "Parámetro incorrecto - non se poden proporcionar valores mutuamente excluíntes.",
+       "apierror-siteinfo-includealldenied": "Non se pode ver a información de tódolos servidores a menos que <var>$wgShowHostNames</var> teña valor verdadeiro.",
+       "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-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-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-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-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
+       "apiwarn-deprecation-parameter": "O parámetro <var>$1</var> está obsoleto.",
+       "apiwarn-invalidcategory": "\"$1\" non é unha categoría.",
+       "apiwarn-invalidtitle": "\"$1\" non é un título válido.",
+       "apiwarn-notfile": "\"$1\" non é un ficheiro.",
+       "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-truncatedresult": "Truncouse este resultado porque doutra maneira sobrepasaría o límite de $1 bytes.",
+       "apiwarn-validationfailed-badpref": "non é unha preferencia válida.",
+       "apiwarn-validationfailed-cannotset": "non pode ser establecido por este módulo.",
+       "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-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 c1dd0fa..682f9fc 100644 (file)
@@ -11,7 +11,9 @@
                        "Elyashiv",
                        "Umherirrender",
                        "Macofe",
-                       "MojoMann"
+                       "MojoMann",
+                       "Mikey641",
+                       "Esh77"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|תיעוד]]\n* [[mw:API:FAQ|שו\"ת]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api רשימת דיוור]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce הודעות על API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R באגים ובקשות]\n</div>\n<strong>מצב:</strong> כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\n<strong>בקשות שגויות:</strong> כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\n<strong>בדיקה:</strong> לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].",
        "apihelp-main-param-requestid": "כל ערך שיינתן כאן ייכלל בתשובה. אפשר להשתמש בזה כדי להבדיל בין בקשות.",
        "apihelp-main-param-servedby": "לכלול את שם המארח ששירת את הבקשה בתוצאות.",
        "apihelp-main-param-curtimestamp": "הכללת חותם־הזמן הנוכחי בתוצאה.",
+       "apihelp-main-param-responselanginfo": "לכלול את השפות שמשמשות ל־<var>uselang</var> ול־<var>errorlang</var> בתוצאה.",
        "apihelp-main-param-origin": "בעת גישה ל־API עם בקשת AJAX חוצה מתחמים (CORS), יש להציב כאן את המתחם שהבקשה יוצאת ממנו. זה היה להיות כלול בכל בקשה מקדימה, ולכן הוא חייב להיות חלק מה־URI של הבקשה (לא גוף ה־POST).\n\nעבור בקשות מאומתות, זה חייב להיות תואם במדויק לאחד המקורות בכותרת <code>Origin</code>, כך שזה צריך להיות מוגדר למשהו כמו <kbd>https://en.wikipedia.org</kbd> או <kbd>https://meta.wikimedia.org</kbd>. אם הפרמטר הזה אינו תואם לכותרת <code>Origin</code>, תוחזר תשובת 403. אם הפרמטר הזה תורם לכותרת <code>Origin</code> והמקור נמצא ברשימה הלבנה, תוגדרנה הכותרות <code>Access-Control-Allow-Origin</code> ו־<code>Access-Control-Allow-Credentials</code>.\n\nעבור בקשות בלתי־מאומתות, יש לציין את הערך <kbd>*</kbd>. זה יגרום לכותרת להיות <code>Access-Control-Allow-Origin</code>, אבל <code>Access-Control-Allow-Credentials</code> תהיה <code>false</code> וכל הנתונים הייחודיים למשתמש יהיו מוגבלים.",
        "apihelp-main-param-uselang": "באיזו שפה להשתמש לתרגומי הודעות. הקריאה <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> עם <kbd>siprop=languages</kbd> מחזירה רשימת קודים. ציון <kbd>user</kbd> כדי להשתמש בהעדפת השפה של המשתמש הנוכחי, וציון <kbd>content</kbd> להשתמש בקוד השפה של הוויקי הזה.",
+       "apihelp-main-param-errorformat": "תסדיר לשימוש בפלט טקסט אזהרות ושגיאות.\n; plaintext: קוד ויקי ללא תגי HTML ועם ישויות מוחלפות.\n; wikitext: קוד ויקי לא מפוענח.\n; html: קוד HTML.\n; raw: מפתח הודעה ופרמטרים.\n; none: ללא פלט טקסט, רק הודעות השגיאה.\n; bc: התסדיר ששימש לפני מדיה־ויקי 1.29. התעלמות מ־<var>errorlang</var> ו־ <var>errorsuselocal</var>.",
+       "apihelp-main-param-errorlang": "השפה שתשמש לאזהרות לשגיאות <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> עם <kbd>siprop=languages</kbd> תחזיר רשימת קודי שפה, ואפשר גם לציין <kbd>content</kbd> כדי להשתמש בשפת התוכן של הוויקי הזה, או לציין <kbd>uselang</kbd> עם אותו הערך הפרמטר <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "אם ניתן, הטקסטים של השגיאות ישתמשו בהודעות מותאמות מקומית ממרחב השם {{ns:MediaWiki}}.",
        "apihelp-block-description": "חסימת משתמש.",
-       "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
+       "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח כתובות IP שברצונך לחסום. אי־אפשר להשתמש בזה יחד עם <var>$1userid</var>",
+       "apihelp-block-param-userid": "מזהה המשתמש לחסימה. לא יכול לשמש יחד עם <var>$1user</var>.",
        "apihelp-block-param-expiry": "זמן תפוגה. יכול להיות יחסי (למשל <kbd>5 months</kbd> או <kbd>2 weeks</kbd>) או מוחלט (למשל <kbd>2014-09-18T12:34:56Z</kbd>). אם זה מוגדר ל־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>, או <kbd>never</kbd>, החסימה לא תפוג לעולם.",
        "apihelp-block-param-reason": "סיבה לחסימה.",
        "apihelp-block-param-anononly": "לחסום משתמשים אלמוניים בלבד (דהיינו, השבתת עריכות אלמוניות מכתובת ה־IP הזאת)",
@@ -39,6 +46,7 @@
        "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
+       "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "apihelp-block-example-ip-simple": "חסימת כתובת ה־IP‏ <kbd>192.0.2.5</kbd> לשלושה ימים עם הסיבה <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "חסימת המשתמש <kbd>Vandal</kbd> ללא הגבלת זמן עם הסיבה <kbd>Vandalism</kbd>, ומניעת יצירת חשבונות חדשים ושליחת דוא\"ל.",
        "apihelp-changeauthenticationdata-description": "שינוי נתוני אימות עבור המשתמש הנוכחי.",
@@ -82,7 +90,7 @@
        "apihelp-delete-param-title": "כותרת העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "מס׳ הזיהוי של העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1title</var>.",
        "apihelp-delete-param-reason": "סיבת המחיקה. אם לא הוגדרה, תתווסף סיבה שנוצרה אוטומטית.",
-       "apihelp-delete-param-tags": "×\9cשנ×\95ת ×\90ת ×\94ת×\92×\99×\9d ×\9b×\93י שיחולו על העיול ביומן המחיקה.",
+       "apihelp-delete-param-tags": "ת×\92×\99 ×©×\99× ×\95י שיחולו על העיול ביומן המחיקה.",
        "apihelp-delete-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-delete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
        "apihelp-help-example-query": "עזרה לשתי תת־יחידות של שאילתה.",
        "apihelp-imagerotate-description": "סיבוב של תמונה אחת או יותר.",
        "apihelp-imagerotate-param-rotation": "בכמה מעלות לסובב בכיוון השעון.",
+       "apihelp-imagerotate-param-tags": "אילו תגים להחיל על העיול ביומן ההעלאות.",
        "apihelp-imagerotate-example-simple": "לסובב את <kbd>File:Example.png</kbd> ב־<kbd>90</kbd> מעלות.",
        "apihelp-imagerotate-example-generator": "לסובב את כל התמונות ב־<kbd>Category:Flip</kbd> ב־<kbd>180</kbd> מעלות.",
        "apihelp-import-description": "לייבא דף מוויקי אחר או מקובץ XML.\n\nיש לשים לב לכך שפעולת HTTP POST צריכה להיעשות בתור העלאת קובץ (כלומר, עם multipart/form-data) בזמן שליחת קובץ לפרמטר <var>xml</var>.",
        "apihelp-import-param-templates": "ליבוא בין אתרי ויקי: לייבא גם את כל התבניות המוכללות.",
        "apihelp-import-param-namespace": "לייבא למרחב השם הזה. לא ניתן להשתמש בזה יחד עם <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "לייבא בתור תת־משנה של הדף הזה. לא ניתן להשתמש בזה יחד עם <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "תגי שינוי שיחולו על העיול ביומן הייבוא ולגרסה הריקה בדפים המיובאים.",
        "apihelp-import-example-import": "לייבא את [[meta:Help:ParserFunctions]] למרחב השם 100 עם היסטוריה מלאה.",
        "apihelp-linkaccount-description": "קישור חשבון של ספק צד־שלישי למשתמש הנוכחי.",
        "apihelp-linkaccount-example-link": "תחילת תהליך הקישור לחשבון מ־<kbd>Example</kbd>.",
        "apihelp-managetags-param-tag": "תג ליצירה, מחיקה, הפעלה או כיבוי. ליצירת תג, התג לא צריך להיות קיים. למחיקת תג, התג צריך להיות קיים. להפעלת תג, התג צריך להתקיים ולא להיות בשימוש של הרחבה. לכיבוי תג, התג צריך להיות קיים ומוגדר ידנית.",
        "apihelp-managetags-param-reason": "סיבה אופציונלית ליצירה, מחיקה, הפעלה או כיבוי של תג.",
        "apihelp-managetags-param-ignorewarnings": "האם להתעלם מכל האזהרות שמופיעות תוך כדי הפעולה.",
+       "apihelp-managetags-param-tags": "תגי השינוי שיחולו על העיול ביומן ניהול התגים.",
        "apihelp-managetags-example-create": "יצירת תג בשם <kbd>spam</kbd> עם הסיבה <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "מחיקת התג <kbd>vandlaism</kbd> עם הסיבה <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "הפעלת התג <kbd>spam</kbd> עם הסיבה <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "הסרת הדף וההפניה מרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-move-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-move-param-ignorewarnings": "להתעלם מכל האזהרות.",
+       "apihelp-move-param-tags": "תגי שינוי שיחולו על העיול ביומן ההעברות ולגרסה הריקה בדף היעד.",
        "apihelp-move-example-move": "העברת <kbd>Badtitle</kbd> ל־<kbd>Goodtitle</kbd> בלי להשאיר הפניה.",
        "apihelp-opensearch-description": "חיפוש בוויקי בפרוטוקול OpenSearch.",
        "apihelp-opensearch-param-search": "מחרוזת לחיפוש.",
        "apihelp-patrol-param-rcid": "מזהה שינויים אחרונים לניטור.",
        "apihelp-patrol-param-revid": "מזהה גרסה לניטור.",
        "apihelp-patrol-param-tags": "תגי שינוי שיחולו על העיול ביומן הניטור.",
-       "apihelp-patrol-example-rcid": "×\9c× ×\98ר ×¢×\99×\95×\9c משינויים אחרונים.",
+       "apihelp-patrol-example-rcid": "×\9c× ×\98ר ×¨×©×\95×\9e×\94 משינויים אחרונים.",
        "apihelp-patrol-example-revid": "לנטר גרסה.",
        "apihelp-protect-description": "לשנות את רמת ההגנה של דף.",
        "apihelp-protect-param-title": "כותרת הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1pageid.",
        "apihelp-protect-example-protect": "הגנה על דף.",
        "apihelp-protect-example-unprotect": "להסיר את ההגנה מהדף על־ידי הגדרת מגבלות על <kbd>all</kbd> (למשל: כולם מורשים לבצע את הפעולה).",
        "apihelp-protect-example-unprotect2": "הסרת הגנה מדף על־ידי הגדרה של אפס הגבלות.",
-       "apihelp-purge-description": "ניקוי המטמון לכותרות שניתנו.\n\nדורש בקשת POST אם המשתמש לא נכנס לחשבון.",
+       "apihelp-purge-description": "ניקוי המטמון לכותרות שניתנו.",
        "apihelp-purge-param-forcelinkupdate": "עדכון טבלאות הקישורים.",
        "apihelp-purge-param-forcerecursivelinkupdate": "עדכון טבלת הקישורים ועדכון טבלאות הקישורים עבור כל דף שמשתמש בדף הזה בתור תבנית.",
        "apihelp-purge-example-simple": "ניקוי המטמון של הדפים <kbd>Main Page</kbd> ו־<kbd>API</kbd>.",
        "apihelp-query+allmessages-param-prop": "אלו מאפיינים לקבל.",
        "apihelp-query+allmessages-param-enableparser": "יש להגדיר כדי להפעיל את המפענח, יעשה קדם־עיבוד לקוד ויקי של ההודעה (יחליף מילות קסם, יטפל בתבניות, וכו').",
        "apihelp-query+allmessages-param-nocontent": "אם זה מוגדר, לא לכלול את תוכן ההודעות בפלט.",
-       "apihelp-query+allmessages-param-includelocal": "×\9c×\9b×\9c×\95×\9c ×\92×\9d ×\94×\95×\93×¢×\95ת ×\9eק×\95×\9e×\99×\95ת, ×\9b×\9c×\95×\9eר ×\94×\95×\93×¢×\95ת ×©×\90×\99× ×\9f ×§×\99×\99×\9e×\95ת ×\91ת×\9b× ×\94, ×\90×\91×\9c ×\9b×\9f ×§×\99×\99×\9e×\95ת ×\91ת×\95ר ×\93×£ ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99.\n×\96×\94 ×¨×\95ש×\9d ×\90ת ×\9b×\9c ×\93פ×\99 MediaWiki: כך שזה ירשום גם דפים שאינם באמת הודעות, כגון [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "×\9c×\9b×\9c×\95×\9c ×\92×\9d ×\94×\95×\93×¢×\95ת ×\9eק×\95×\9e×\99×\95ת, ×\9b×\9c×\95×\9eר ×\94×\95×\93×¢×\95ת ×©×\90×\99× ×\9f ×§×\99×\99×\9e×\95ת ×\91ת×\9b× ×\94, ×\90×\91×\9c ×\9b×\9f ×§×\99×\99×\9e×\95ת ×\91×\9eר×\97×\91 {{ns:MediaWiki}}.\n×\96×\94 ×¨×\95ש×\9d ×\90ת ×\9b×\9c ×\94×\93פ×\99×\9d ×\91×\9eר×\97×\91 {{ns:MediaWiki}}, כך שזה ירשום גם דפים שאינם באמת הודעות, כגון [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "ארגומנטים שיוחלפו לתוך ההודעה.",
        "apihelp-query+allmessages-param-filter": "החזרה רק של הודעות עם שמות שמכילים את המחרוזת הזאת.",
        "apihelp-query+allmessages-param-customised": "להחזיר רק הודעות במצב ההתאמה הזה.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסת הארכיון עבור הגרסאות שאינן האחרונה.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "הוספת עומק הביטים של הגרסה.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "משמש את Special:Upload כדי לקבל מידע על קובץ קיים. לא נועד לשימוש מחוץ לליבת MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "מוסיף האם הקובץ נמצא ב־[[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "כמה גרסאות של קובץ לכל קובץ.",
        "apihelp-query+imageinfo-param-start": "מאיז חותם־זמן להתחיל רשימה.",
        "apihelp-query+imageinfo-param-end": "באיזה חותם־זמן לסיים את הרשימה.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "אם תרגומים של המאפיין extmetadata זמינים, לאחזר את כולם.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "אם זה מוגדר ולא ריק, רק המפתחות האלה יוחזרו עבור $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "מחרוזת פרמטר ייחודית למטפל. למשל, PDF־ים יכולים להשתמש ב־<kbd>page15-100px</kbd>.‏ <var>$1urlwidth</var> צריך לשמש ולהיות עקבי עם <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "אם <kbd>$2prop=badfile</kbd> מוגדר, זאת כותרת הדף שתשמש בזמן שערוך ה־[[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.",
        "apihelp-query+imageinfo-example-simple": "קבלת מידע על הגרסה הנוכחית של [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "אחזור מידע על גרסאות של [[:File:Test.jpg]] מ־2008 ואחרי‏־כן.",
        "apihelp-query+usercontribs-param-limit": "המספר המרבי של התרומות להחזיר.",
        "apihelp-query+usercontribs-param-start": "באיזה חותם־הזמן להתחיל.",
        "apihelp-query+usercontribs-param-end": "באיזה חותם־הזמן לסיים",
-       "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות.",
-       "apihelp-query+usercontribs-param-userprefix": "אחזור תרומות עבור כל המשתמשים שהשמות שלהם מתחילים בערך הזה. דורס את $1user.",
+       "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות. לא יכול לשמש עם <var>$1userids</var> או <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "אחזור תרומות עבור כל המשתמשים שהשמות שלהם מתחילים בערך הזה. לא יכול לשמש עם <var>$1user</var> או <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "מזהי המשתמשים לאחזור תרומות.  לא יכול לשמש עם  <var>$1user</var> או <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "לרשום רק תרומות במרחבי השם האלה.",
        "apihelp-query+usercontribs-param-prop": "לכלול פריטי מידע נוספים:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "הוספת מזהה הדף ומזהה הגרסה.",
        "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-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-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
        "apihelp-resetpassword-param-user": "המשתמש שמאופס.",
        "apihelp-resetpassword-param-email": "כתובת הדוא\"ל של המשתמש שהסיסמה שלו מאופסת.",
-       "apihelp-resetpassword-param-capture": "החזרת הססמאות הזמניות שנשלחו. דורש את ההרשאה <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "שליחת מכתב איפוס ססמה למשתמש <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "שליחת מכתב איפוס ססמה לכל המשתמשים שהכתובת שלהם היא <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "מחיקה ושחזור ממחיקה של גרסאות.",
        "apihelp-revisiondelete-param-show": "הסתרה של מה לבטל עבור כל גרסה.",
        "apihelp-revisiondelete-param-suppress": "האם להעלים נתונים ממפעילים ומאחרים.",
        "apihelp-revisiondelete-param-reason": "סיבה למחיקה או לשחזור ממחיקה.",
+       "apihelp-revisiondelete-param-tags": "אילו תגים להחיל על העיול ביומן המחיקה.",
        "apihelp-revisiondelete-example-revision": "הסתרת התוכן של הגרסה <kbd>12345</kbd> בדף <kbd>Main Page</kbd>.",
-       "apihelp-revisiondelete-example-log": "×\94סתרת ×\9b×\9c ×\94נת×\95×\94×\99×\9d ×¢×\9c ×¢×\99×\95×\9c היומן <kbd>67890</kbd> עם הסיבה <kbd>BLP violation</kbd>.",
+       "apihelp-revisiondelete-example-log": "×\94סתרת ×\9b×\9c ×\94נת×\95× ×\99×\9d ×¢×\9c ×¨×©×\95×\9eת היומן <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-setnotificationtimestamp-example-page": "אתחול מצב ההודעה עבור <kbd>Main Page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־<kbd>Main page</kbd> כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.",
        "apihelp-setnotificationtimestamp-example-allpages": "אתחול מצב ההודעה עבור דפים במרחב השם <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "שנה את השפה של דף",
+       "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> על מנת להשתמש בפעולה זו",
+       "apihelp-setpagelanguage-param-title": "כותרת הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-reason": "הסיבה לשינוי.",
+       "apihelp-setpagelanguage-param-tags": "אילו תגי שינוי להחיל על העיול ביומן שמתבצע כתוצאה מהפעולה הזאת.",
+       "apihelp-setpagelanguage-example-language": "שינוי השפה של <kbd>Main Page</kbd> לבסקית.",
+       "apihelp-setpagelanguage-example-default": "שינוי השפה של הדף בעל המזהה 123 לשפה הרגילה של הוויקי.",
        "apihelp-stashedit-description": "הכנת עריכה במטמון משותף.\n\nזה מיועד לשימוש דרך AJAX מתוך ערך כדי לשפר את הביצועים של שמירת הדף.",
        "apihelp-stashedit-param-title": "כותרת הדף הנערך.",
        "apihelp-stashedit-param-section": "מספר הפסקה. <kbd>0</kbd> עבור הפסקה הראשונה, <kbd>new</kbd> עבור פסקה חדשה.",
        "apihelp-tag-description": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.",
        "apihelp-tag-param-rcid": "מזהה שינוי אחרון אחד או יותר שתג יתווסף אליו או יוסר ממנו.",
        "apihelp-tag-param-revid": "מזהה גרסה אחד או יותר שתג יתווסף אליה או יוסר ממנה.",
-       "apihelp-tag-param-logid": "×\9e×\96×\94×\94 ×¢×\99×\95×\9c ×\99×\95×\9e×\9f ×\90×\97×\93 ×\90×\95 ×\99×\95תר ×©×ª×\92 ×\99ת×\95×\95סף ×\90×\9c×\99×\95 ×\90×\95 ×\99×\95סר ×\9e×\9e× ×\95.",
+       "apihelp-tag-param-logid": "×\9e×\96×\94×\94 ×¨×©×\95×\9eת ×\99×\95×\9e×\9f ×\90×\97ת ×\90×\95 ×\99×\95תר ×©×ª×\92 ×\99ת×\95×\95סף ×\90×\9c×\99×\94 ×\90×\95 ×\99×\95סר ×\9e×\9e× ×\94.",
        "apihelp-tag-param-add": "התגים להוספה. אפשר להוסיף רק תגים קיימים.",
        "apihelp-tag-param-remove": "תגים להסרה. רק תגים שהוגדרו ידנית או שאינם מוגדרים כלל יכולים להיות מוסרים.",
        "apihelp-tag-param-reason": "סיבה לשינוי.",
+       "apihelp-tag-param-tags": "אילו תגים להחיל על רשומת היומן שתיווצר כתוצאה מהפעולה הזאת.",
        "apihelp-tag-example-rev": "הוספת התג <kbd>vandalism</kbd> לגרסה עם המזהה 123 בלי לציין סיבה",
        "apihelp-tag-example-log": "הסרת התג <kbd>spam</kbd> מעיול עם המזהה 123 עם הסיבה <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.\n\nהיחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "אחזור אסימון עריכה (בררת המחדל).",
        "apihelp-tokens-example-emailmove": "אחזור אסימון דוא\"ל ואסימון העברה.",
        "apihelp-unblock-description": "שחרור משתמש מחסימה.",
-       "apihelp-unblock-param-id": "מזהה החסימה לשחרור (מתקבל דרך <kbd>list=blocks</kbd>). לא יכול לשמש יחד עם <var>$1user</var>.",
-       "apihelp-unblock-param-user": "שם משתמש, כתובת IP או טווח IP לחסימה. לא יכול לשמש יחד עם <var>$1id</var>",
+       "apihelp-unblock-param-id": "מזהה החסימה לשחרור (מתקבל דרך <kbd>list=blocks</kbd>). לא יכול לשמש יחד עם <var>$1user</var> או <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "שם משתמש, כתובת IP או טווח כתובות IP לחסימה. לא יכול לשמש יחד עם <var>$1id</var> או <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "מזהה המשתמש שישוחרר מחסימה. לא יכול לשמש יחד עם <var>$1id</var> או <var>$1user</var>.",
        "apihelp-unblock-param-reason": "סיבה להסרת חסימה.",
        "apihelp-unblock-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "apihelp-unblock-example-id": "לשחרר את החסימה עם מזהה #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "לשחרר את החסימה של המשתמש <kbd>Bob</kbd> עם הסיבה <kbd>Sorry Bob</kbd>.",
-       "apihelp-undelete-description": "שחזור גרסאות של דף מחוק.\n\nאפשר לאחזר רשימת גרסאות מחוקות (כולל חותמי־זמן) דרך [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], ואפשר לאחזר רשימת מזהי קבצים מחוקים דרך [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "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-userrights-description": "שינוי חברות בקבוצות של המשתמש.",
        "apihelp-userrights-param-user": "שם משתמש.",
        "apihelp-userrights-param-userid": "מזהה משתמש.",
-       "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו.",
+       "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו, ואם הוא כבר חבר, עדכון זמן התפוגה של החברות בקבוצה הזאת.",
        "apihelp-userrights-param-remove": "הסרת משתמש מהקבוצות האלו.",
        "apihelp-userrights-param-reason": "סיבה לשינוי.",
+       "apihelp-userrights-param-tags": "לשנות את התגים שיוחלו על העיול ביומן הרשאות המשתמש.",
        "apihelp-userrights-example-user": "הוספת המשתמש <kbd>FooBot</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "הוספת המשתמש עם המזהה <kbd>123</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
+       "apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־<samp>Good</samp> אם הססמה קבילה, <samp>Change</samp> אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או <samp>Invalid</samp> אם הססמה אינה שמישה.",
+       "apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.",
+       "apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.",
+       "apihelp-validatepassword-param-email": "כתובת הדוא\"ל, לשימוש בעת בדיקת יצירת חשבון.",
+       "apihelp-validatepassword-param-realname": "שם אמתי, לשימוש בעת בדיקת יצירת חשבון.",
+       "apihelp-validatepassword-example-1": "לבדוק את תקינות הססמה <kbd>foobar</kbd> עבור המשתמש הנוכחי.",
+       "apihelp-validatepassword-example-2": "לבדוק את תקינות הססמה <kbd>qwerty</kbd> ליצירת החשבון <kbd>Example</kbd>.",
        "apihelp-watch-description": "להוסיף דפים לרשימת המעקב של המשתמש הנוכחי או הסרתם ממנה.",
        "apihelp-watch-param-title": "הדף להוסיף לרשימת המעקב או להסיר ממנה. יש להשתמש במקום זאת ב־<var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "אם זה מוגדר, הדף יהיה לא במעקב במקום להיות במעקב.",
        "apihelp-phpfm-description": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
        "apihelp-rawfm-description": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-description": "לפלוט נתונים בתסדיר XML.",
-       "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:mediawiki}} במרחב שם המשתמש, המסתיים ב-  <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:MediaWiki}} במרחב שם המשתמש, המסתיים ב-  <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "אם זה צוין, מוסיף מרחב שם של XML.",
        "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-help-param-upload": "חייב להישלח (posted) בתור העלאת קובץ באמצעות 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-token": "אסימון \"$1\" שאוחזר מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-authmanagerhelper-returnurl": "כתובת URL לחזרה עם זרימות אימות צד־שלישי, חייב להיות מוחלט. נדרש או זה או <var>$1continue</var>.\n\nעם קבלת תשובת <samp>REDIRECT</samp>, בדרך־כלל תפתח דפדפן או תצוגת וב בכתובת ה־<samp>redirecttarget</samp> שצוינה בשביל זרימת אימות צד־שלישי. כשזה יושלם, הצד השלישי ישלח את הדפדפן או את תצוגת הווב לכתובת הזאת. יש לחלץ את כל הפרמטרים של שאילתה או בקשת POST מה־URL ולהעביר אותם בתור בקשת <var>$1continue</var> למודול ה־API הזה.",
        "api-help-authmanagerhelper-continue": "הבקשה הזאת היא המשך אחרי תשובת <samp>UI</samp> או <samp>REDIRECT</samp> קודמת. נדרש זה או <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "המודול הזה מקבל פרמטרים נוספים בהתאם לבקשות אימות זמינות. יש להשתמש ב־<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> עם <kbd>amirequestsfor=$1</kbd> (או תגובה קודמת מהמודול הזה, אם זה זמין) כדי להבין מה הבקשות הזמינות ובאילו שדות הן משתמשות.",
+       "apierror-allimages-redirect": "יש להשתמש ב־<kbd>gaifilterredir=nonredirects</kbd> במקום ב־<var>redirects</var> בעת שימוש ב־<kbd>allimages</kbd> בתור מחולל.",
+       "apierror-allpages-generator-redirects": "יש להשתמש ב־<kbd>gaifilterredir=nonredirects</kbd> במקום ב־<var>redirects</var> בעת שימוש ב־<kbd>allpages</kbd> בתור מחולל.",
+       "apierror-appendnotsupported": "אי־אפשר להוסיף את זה לדפים שמשתמשים בדגם תוכן $1.",
+       "apierror-articleexists": "הערך שניסית ליצור כבר נוצר.",
+       "apierror-assertbotfailed": "הבדיקה שלמשתמש יש הרשאת <code>bot</code> נכשלה.",
+       "apierror-assertnameduserfailed": "הבדיקה שהמשתמש הוא \"$1\" נכשלה.",
+       "apierror-assertuserfailed": "הבדיקה שהמשתמש נכנס לחשבון נכשלה.",
+       "apierror-autoblocked": "כתובת ה־IP שלך נחסמה אוטומטית, כי היא שימשה משתמש חסום.",
+       "apierror-badconfig-resulttoosmall": "הערך של <code dir=\"ltr\">$wgAPIMaxResultSize</code> בוויקי הזה קטן מלהחזיק מידע בסיסי על תוצאה.",
+       "apierror-badcontinue": "פרמטר continue בלתי־תקין. יש להעביר את הערך המקורי שהחזירה השאילתה הקודמת.",
+       "apierror-baddiff": "לא ניתן לאחזר את ההשוואה. גרסה אחת לא קיימת או ששתיהן לא קיימות, או שאין לך הרשאה להציג אותן.",
+       "apierror-baddiffto": "יש להגדיר את <var>$1diffto</var> למספר שאינו שלילי, <kbd dir=\"ltr\">prev</kbd>, <kbd dir=\"ltr\">next</kbd> או <kbd dir=\"ltr\">cur</kbd>",
+       "apierror-badformat-generic": "התסדיר המבוקש $1 אינו נתמך במודל התוכן $2.",
+       "apierror-badformat": "התסדיר המבוקש $1 אינו נתמך במודל התוכן $2 שמשמש ב־$3.",
+       "apierror-badgenerator-notgenerator": "המודול <kbd>$1</kbd> אינו יכול לשמש כמחולל.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> בלתי־ידוע.",
+       "apierror-badip": "הפרמטר IP אינו תקין.",
+       "apierror-badmd5": "גיבוב MD5 היה שגוי.",
+       "apierror-badmodule-badsubmodule": "למודול <kbd>$1</kbd> אין תת־מודול \"$2\".",
+       "apierror-badmodule-nosubmodules": "למודול <kbd>$1</kbd> אין תת־מודולים.",
+       "apierror-badparameter": "ערך בלתי־תקין לפרמטר <var>$1</var>.",
+       "apierror-badquery": "שאילתה בלתי־תקינה.",
+       "apierror-badtimestamp": "ערך בלתי־תקין \"$2\" לפרמטר חותם זמן <var>$1</var>.",
+       "apierror-badtoken": "אסימון CSRF בלתי־תקין.",
+       "apierror-badupload": "פרמטר העלאת הקובץ <var>$1</var> הוא לא העלאת קובץ; יש להקפיד להשתמש ב־<code>multipart/form-data</code> בשביל בקשת ה־POST שלך ולכלול שם קובץ בכותר <code>Content-Disposition</code>.",
+       "apierror-badurl": "ערך בלתי־תקין \"$2\" לפרמטר URL בשם <var>$1</var>.",
+       "apierror-baduser": "ערך בלתי־תקין \"$2\" לפרמטר משתמש בשם <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "הפרדת ערכים מרובים ב־U+001F אפשרית רק בפרמטרים מרובי־פרמטרים.",
+       "apierror-bad-watchlist-token": "סופק אסימון רשימת מעקב בלתי־תקין. נא להשתמש באסימון תקין ב־[[Special:Preferences]].",
+       "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
+       "apierror-blocked": "נחסמת מעריכה.",
+       "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
+       "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
+       "apierror-cannotviewtitle": "אין לך הרשאה להציג את $1.",
+       "apierror-cantblock-email": "אין לך הרשאה לחסום משתמשים משליחת דואר אלקטרוני דרך הוויקי.",
+       "apierror-cantblock": "אין לך הרשאה לחסום משתמשים.",
+       "apierror-cantchangecontentmodel": "אין לך הרשאה לשנות את דגם התוכן של דף.",
+       "apierror-canthide": "אין לך הרשאה להסתיר שמות משתמשים ביומן החסימה.",
+       "apierror-cantimport-upload": "אין לך הרשאה לייבא דפים מוּעלים.",
+       "apierror-cantimport": "אין לך הרשאה לייבא דפים.",
+       "apierror-cantoverwrite-sharedfile": "קובץ היעד קיים במאגר משותף ואין לך הרשאה לעקוף אותו.",
+       "apierror-cantsend": "לא נכנסת לחשבון, אין לך חשבון דואר אלקטרוני מאושר, או שאסור לך לשלוח דואר אלקטרוני למשתמשים אחרים, אז אינך לך אפשרות לשלוח דואר אלקטרוני.",
+       "apierror-cantundelete": "לא היה אפשר לשחזר ממחיקה: אולי הגרסאות המבוקשות אינן קיימות, ואולי הן כבר נמחקו.",
+       "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
+       "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
+       "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
+       "apierror-compare-inputneeded": "כותרת, מזהה דף, או מספר גרסה נחוצים בשביל הפרמטרים <var>from</var> ו־<var>to</var>.",
+       "apierror-contentserializationexception": "הסדרת התוכן נכשלה: $1",
+       "apierror-contenttoobig": "התוכן שסיפקת חורג מגודל הערך המרבי של {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}.",
+       "apierror-copyuploadbaddomain": "העלאות לפי URL אינם מורשות מהמתחם הזה.",
+       "apierror-copyuploadbadurl": "העלאה אינה מותרת מה־URL הזה.",
+       "apierror-create-titleexists": "כותרות קיימות אינם יכולות מוגנות עם <kbd>create</kbd>.",
+       "apierror-csp-report": "בעיבוד דו\"ח CSP אירעה שגיאה: $1",
+       "apierror-databaseerror": "[$1] שגיאת שאילתת מסד נתונים.",
+       "apierror-deletedrevs-param-not-1-2": "הפרמטר <var>$1</var> אינו יכול לשמש במצבים 1 או 2.",
+       "apierror-deletedrevs-param-not-3": "הפרמטר <var>$1</var> אינו יכול במצב 3.",
+       "apierror-emptynewsection": "יצירת פסקאות חדשות ריקות בלתי־אפשרי.",
+       "apierror-emptypage": "יצירת דפים חדשים ריקים אינו מותר.",
+       "apierror-exceptioncaught": "[$1] נתפס חריג: $2",
+       "apierror-filedoesnotexist": "הקובץ אינו קיים.",
+       "apierror-fileexists-sharedrepo-perm": "קובץ היעד קיים במאגר משותף. יש להשתמש בפרמטר <var>ignorewarnings</var> כדי לעקוף אותו.",
+       "apierror-filenopath": "לא ניתן לקבל נתיב לקובץ מקומי.",
+       "apierror-filetypecannotberotated": "לא ניתן לסובב את סוג הקובץ הזה.",
+       "apierror-formatphp": "התשובה הזאת לא יכולה להיות מיוצגת עם <kbd>format=php</kbd>. ר' https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "הכותרת בשביל <kbd>$1</kbd> צריכה להיות קובץ.",
+       "apierror-import-unknownerror": "שגיאה בלתי־ידועה בייצוא: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור בוטים או מפעילים.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור משתמשים.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3).",
+       "apierror-invalidcategory": "שם הקטגוריה שהזנת אינו תקין.",
+       "apierror-invalidexpiry": "זמן תפוגה בלתי־תקין \"$1\".",
+       "apierror-invalid-file-key": "לא מפתח קובץ תקין.",
+       "apierror-invalidtitle": "כותרת רעה \"$1\".",
+       "apierror-invaliduser": "שם משתמש בלתי־תקין \"$1\".",
+       "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
+       "apierror-mustbeloggedin-generic": "חובה להיכנס.",
+       "apierror-mustbeloggedin-linkaccounts": "חובה להיכנס לחשבון כדי לקשר חשבונות.",
+       "apierror-mustbeloggedin-removeauth": "חובה להיכנס לחשבון כדי להסיר מידע אימות.",
+       "apierror-mustbeloggedin-uploadstash": "סליק ההעלאה זמין רק למשתמשים שנכנסו לחשבון.",
+       "apierror-mustbeloggedin": "חובה להיכנס לחשבון כדי $1.",
+       "apierror-nochanges": "לא התבקשו שינויים.",
+       "apierror-nodeleteablefile": "אין גרסה ישנה כזאת של הקובץ.",
+       "apierror-no-direct-editing": "עריכה ישירה דרך ה־API אינה נתמכת עבור דגם התוכן $1 שמשמש ב{{GRAMMAR:תחילית|$2}}.",
+       "apierror-noedit-anon": "משתמשים אלמוניים אינם יכולים לערוך דפים.",
+       "apierror-nosuchlogid": "אין רשומה ביומן עם המזהה $1.",
+       "apierror-stashinvalidfile": "קובץ מוסלק בלתי־תקין.",
+       "apierror-stashnosuchfilekey": "אין מפתח קובץ כזה: $1.",
+       "apierror-stashpathinvalid": "מפתח קובץ מתסדיר בלתי־הולם או בלתי־תקין באופן אחר: $1.",
+       "apierror-stashwrongowner": "בעלים בלתי־תקין: $1",
+       "apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.",
+       "apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.",
+       "apierror-unknownerror-nocode": "שגיאה בלתי־ידועה.",
+       "apierror-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
+       "apierror-unknownformat": "תסדיר בלתי־ידוע \"$1\".",
+       "apierror-upload-filekeyneeded": "חובה לספק <var>filekey</var> כאשר <var>offset</var> אינו אפס.",
+       "apierror-upload-filekeynotallowed": "לא ניתן לספק <var>filekey</var> כאשר <var>offset</var> הוא 0.",
+       "apierror-upload-missingresult": "אין תוצאות בנתוני מצב.",
+       "apierror-writeapidenied": "אין לך הרשאה לערוך את הוויקי הזה דרך ה־API.",
+       "apiwarn-alldeletedrevisions-performance": "לביצועים טובים יותר בעת יצירת כותרת, יש להשתמש ב־<kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
+       "apiwarn-badutf8": "הערך הערך שהועבר ל־<var>$1</var> מכיל נתונים בלתי־תקינים או בלתי־מנורמלים. נתונים טקסט אמורים להיות תקינים, מנורמלי NFC ללא תווי בקרה C0 למעט HT (\\t)‏, LF (\\n), ו־CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
+       "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
+       "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
+       "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <kbd>action=login</kbd> מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם <kbd>action=login</kbd>, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' <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-deprecation-purge-get": "שימוש ב־<kbd>action=purge</kbd> דרך GET מיושן. יש להשתמש ב־POST במקום זה.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> מיושן. יש להשתמש ב־<kbd>$2</kbd> במקום זה.",
+       "apiwarn-difftohidden": "לא היה אפשר לעשות השוואה עם גרסה $1: התוכן מוסתר.",
+       "apiwarn-errorprinterfailed": "מדפיס השגיאות לא עבד. ינסה שוב ללא פרמטרים.",
+       "apiwarn-errorprinterfailed-ex": "מדפיס השגיאות לא עבד (ינסה שוב ללא פרמטרים): $1",
+       "apiwarn-invalidcategory": "\"$1\" אינה קטגוריה.",
+       "apiwarn-invalidtitle": "\"$1\" אינה כותרת תקינה.",
+       "apiwarn-invalidxmlstylesheetext": "לגיליון הסגנונות אמור להיות הסיומת <code dir=\"ltr\">.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": "לפרמטר <var>$1</var> היתנ ג{{PLURAL:$3|ניתן ערך בלתי־ידוע|ניתנו ערכים בלתי־ידועים}}: $2.",
+       "apiwarn-unsupportedarray": "הפרמטר <var>$1</var> משתמש בתחביר מערכים שאינו נתמך ב־PHP.",
+       "apiwarn-urlparamwidth": "התעלמות מרוחב (width) שהוגדר ב־<var>$1urlparam</var> (ערך: $2) לטובת רוחב שנגזר מ־<var>$1urlwidth</var>/<var>$1urlheight</var> (ערך: $3).",
+       "apiwarn-validationfailed-badchars": "תווים בלתי־תקינים במפתח (מותרים רק <code>a-z</code>‏, <code>A-Z</code>‏, <code>0-9</code>‏, <code>_</code>, ו־<code>-</code>).",
+       "apiwarn-validationfailed-badpref": "לא העדפה תקינה.",
+       "apiwarn-validationfailed-cannotset": "לא יכולה להיות מוגדרת על־ידי המודול הזה.",
+       "apiwarn-validationfailed-keytoolong": "המפתח ארוך מדי (מותר לכתוב לא יותר מ־$1 בתים).",
+       "apiwarn-validationfailed": "שגיאה בבדיקת תקינות עבור <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>אזהרת אבטחה</strong>: <var dir=\"ltr\">$wgDebugAPI</var> מופעל.",
+       "api-feed-error-title": "שגיאה ($1)",
+       "api-usage-docref": "ר' $1 לשימוש ב־API.",
+       "api-usage-mailinglist-ref": "עשו מינוי לרשימת התפוצה mediawiki-api-announce בכתובת &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; בשביל הודעות על התיישנות API ושינויים שוברים.",
+       "api-exception-trace": "$1 בקובץ $2 (שורה $3)\n$4",
        "api-credits-header": "קרדיטים",
        "api-credits": "מפתחי ה־API:\n* רואן קטאו (מפתח מוביל 2007–2009)\n* ויקטור וסילייב\n* בריאן טונג מין\n* סאם ריד\n* יורי אסטרחן (יוצר, מפתח מוביל מספטמבר 2006 עד ספטמבר 2007)\n* בראד יורש (מפתח מוביל מאז 2013)\n\nאנא שלחו הערות, הצעות ושאלות לכתובת mediawiki-api@lists.wikimedia.org או כתבו דיווח באג באתר https://phabricator.wikimedia.org."
 }
index e0920f6..232386e 100644 (file)
@@ -92,5 +92,6 @@
        "api-help-param-limit2": "Nem engedélyezett több mint $1 (botoknak $2).",
        "api-help-param-integer-min": "Az {{PLURAL:$1|1=érték nem lehet kisebb|2=értékek nem lehetnek kisebbek}} mint $2.",
        "api-help-param-integer-max": "Az {{PLURAL:$1|1=érték nem lehet nagyobb|2=értékek nem lehetnek nagyobbak}} mint $3.",
-       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Az értéknek $2 és $3 között kell lennie.|2=Az értékeknek $2 és $3 között kell lenniük.}}"
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Az értéknek $2 és $3 között kell lennie.|2=Az értékeknek $2 és $3 között kell lenniük.}}",
+       "api-help-param-default": "Alapértelmezett: $1"
 }
index 0f8a9ad..dad298f 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "McDutchie"
+                       "McDutchie",
+                       "Rafaneta"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Listas de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annuncios sur le API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & demandas]\n</div>\n<strong>Stato:</strong> Tote le functiones monstrate in iste pagina deberea functionar, sed le API es ancora in disveloppamento active e pote cambiar a omne momento. Subscribe te al [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de diffusion mediawiki-api-announce] pro esser informate de actualisationes.\n\n<strong>Requestas erronee:</strong> Quando requestas erronee se invia al API, un capite HTTP essera inviate con le clave \"MediaWiki-API-Error\". Le valor de iste capite e le codice de error reinviate essera identic. Pro plus information vide [[mw:API:Errors_and_warnings|API: Errores e avisos]].\n\n<strong>Tests:</strong> Pro facilitar le test de requestas API, vide [[Special:ApiSandbox]].",
        "apihelp-main-param-smaxage": "Fixar le capite de controlo de cache HTTP <code>s-maxage</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
        "apihelp-main-param-maxage": "Fixar le capite de controlo de cache HTTP <code>max-age</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
        "apihelp-main-param-assert": "Verificar si le usator ha aperite session si mittite a <kbd>user</kbd>, o si ha le derecto de usator robot si <kbd>bot</kbd>.",
+       "apihelp-main-param-assertuser": "Verificar que le usator currente es le usator nominate.",
        "apihelp-main-param-requestid": "Omne valor fornite hic essera includite in le responsa. Pote esser usate pro distinguer requestas.",
        "apihelp-main-param-servedby": "Includer in le resultato le nomine del host que ha servite le requesta.",
        "apihelp-main-param-curtimestamp": "Includer le data e hora actual in le resultato.",
-       "apihelp-main-param-origin": "Quando se accede al API usante un requesta AJAX inter-dominios (CORS), mitte le dominio de origine in iste parametro. Illo debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST). Illo debe corresponder exactemente a un del origines in le capite <code>Origin</code>, dunque debe esser mittite a qualcosa como <kbd>http://ia.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si iste parametro non corresponde al capite <code>Origin</code>, un responsa 403 essera retornate. Si iste parametro corresponde al capite <code>Origin</code> e le origine es in le lista blanc, un capite <code>Access-Control-Allow-Origin</code> essera inserite.",
+       "apihelp-main-param-responselanginfo": "Includer le linguas usate pro <var>uselang</var> e <var>errorlang</var> in le resultato.",
+       "apihelp-main-param-origin": "Quando se accede al API usante un requesta AJAX inter-dominios (CORS), mitte le dominio de origine in iste parametro. Illo debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST).\n\nPro requestas authenticate, isto debe corresponder exactemente a un del origines in le capite <code>Origin</code>, dunque debe esser mittite a qualcosa como <kbd>http://ia.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si iste parametro non corresponde al capite <code>Origin</code>, un responsa 403 essera retornate. Si iste parametro corresponde al capite <code>Origin</code> e le origine es in le lista blanc, le capites <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> essera inserite.\n\nPro requestas non authenticate, specifica le valor <kbd>*</kbd>. Isto causara le insertion del capite <code>Access-Control-Allow-Origin</code>, ma <code>Access-Control-Allow-Credentials</code> essera mittite a <code>false</code> e tote le datos specific al usator essera restringite.",
        "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> retorna un lista de codices de lingua, o specifica <kbd>user</kbd> pro usar le preferentia de lingua del usator actual, o specifica <kbd>content</kbd> pro usar le lingua de contento de iste wiki.",
        "apihelp-block-description": "Blocar un usator.",
-       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar.",
+       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo de adresses IP a blocar. Non pote esser usate insimul a <var>$1userid</var>",
        "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. <kbd>5 months</kbd> o <kbd>2 weeks<.kbd>) o absolute (p.ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si es mittite a <kbd>infinite</kbd>, <kbd>indefinite</kbd> o <kbd>never</kbd>, le blocada nunquam expirara.",
        "apihelp-block-param-reason": "Motivo del blocada.",
        "apihelp-block-param-anononly": "Blocar solmente usatores anonyme (i.e. disactivar modificationes anonyme pro iste adresse IP).",
@@ -53,6 +56,6 @@
        "apihelp-createaccount-description": "Crear un nove conto de usator.",
        "apihelp-createaccount-param-name": "Nomine de usator.",
        "apihelp-query+prefixsearch-param-profile": "Le profilo de recerca a usar.",
-       "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del \"Pagina principal\" que non ha essite facite per le usator anonyme \"127.0.0.1\"",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del <kbd>Pagina principal</kbd> que non ha essite facite per le usator anonyme <kbd>127.0.0.1</kbd>",
        "api-credits": "Programmatores del API:\n* Roan Kattouw (programmator dirigente Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, programmator dirigente Sept. 2006–Sept. 2007)\n* Brad Jorsch (programmator dirigente 2013–presente)\n\nInvia tu commentos, suggestiones e questiones a mediawiki-api@lists.wikimedia.org\no insere un reportage de bug a https://phabricator.wikimedia.org/."
 }
index b585885..5ae3547 100644 (file)
@@ -61,7 +61,7 @@
        "apihelp-edit-param-tags": "Ganti tag untuk menerapkan ke revisi.",
        "apihelp-edit-param-minor": "Suntingan kecil.",
        "apihelp-edit-param-notminor": "Bukan suntingan kecil.",
-       "apihelp-edit-param-bot": "Tandai suntingan ini sebagai bot.",
+       "apihelp-edit-param-bot": "Tandai suntingan ini sebagai suntingan bot.",
        "apihelp-edit-param-basetimestamp": "Stempel waktu dari revisi asal, digunakan untuk mendeteksi konflik penyuntingan. Dapat ditemukan di [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Stempel waktu ketika proses penyuntingan dimulai, digunakan untuk mendeteksi konflik penyuntingan. Nilai yang cocok dapat ditemukan dengan menggunakan <var>[[Special:ApiHelp/main|curtimestamp]]</var> ketika memulai proses penyuntingan (seperti ketika memuat isi konten yang akan disunting).",
        "apihelp-edit-param-recreate": "Batalkan galat yang terjadi tentang halaman yang sudah dihapus pada saat itu.",
        "apihelp-emailuser-param-subject": "Tajuk subjek.",
        "apihelp-emailuser-param-text": "Badan pesan.",
        "apihelp-emailuser-param-ccme": "Kirimkan salinan pesan ini kepada saya.",
-       "apihelp-expandtemplates-description": "Tambahkan semua templat dalam teks wiki.",
+       "apihelp-expandtemplates-description": "Longgarkan semua templat dalam teks wiki.",
        "apihelp-expandtemplates-param-title": "Judul halaman.",
        "apihelp-expandtemplates-param-text": "Teks wiki yang akan diubah.",
        "apihelp-expandtemplates-param-revid": "ID revisi, untuk <nowiki>{{REVISIONID}}</nowiki> dan variabel serupa.",
        "apihelp-expandtemplates-param-prop": "Bagian informasi manakah yang ingin didapatkan.\n\nPerhatikan bahwa jika tidak ada nilai yang dipilih, hasilnya akan mengandung teks wiki, namun keluaran akan berupa format usang.",
+       "apihelp-feedcontributions-param-deletedonly": "Tampilkan hanya kontribusi terhapus.",
        "apihelp-login-example-login": "Masuk log.",
+       "apihelp-move-param-noredirect": "Jangan buat pengalihan.",
+       "apihelp-move-param-unwatch": "Hapus halaman dan pengalihan dari daftar pantauan pengguna ini.",
+       "apihelp-move-example-move": "Pindahkan <kbd>Judul buruk</kbd> ke <kbd>Judul benar</kbd> tanpa membuat pengalihan.",
+       "apihelp-opensearch-param-redirects": "Bagaimana menangani pengalihan:\n;return:Kembali ke pengalihan itu.\n;resolve:Kembali ke halaman tujuan. Mungkin hasil kembali kurang dari $1limit.\nUntuk alasan riwayat, nilai baku adalah \"kembali\" untuk $1format=json dan \"resolve\" untuk format lain.",
        "apihelp-query+prefixsearch-param-profile": "Cari profil untuk digunakan.",
        "apihelp-query+search-param-qiprofile": "Meminta profil independen untuk digunakan (berefek pada algoritma peringkat).",
        "apihelp-revisiondelete-param-ids": "Penanda untuk perubahan yang akan dihapus",
index 48521a1..61e70f4 100644 (file)
@@ -15,7 +15,8 @@
                        "Urielejh",
                        "Matteocng",
                        "Einreiher",
-                       "Mpiva"
+                       "Mpiva",
+                       "Margherita.mignanelli"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
@@ -26,7 +27,7 @@
        "apihelp-main-param-servedby": "Includi nel risultato il nome dell'host che ha servito la richiesta.",
        "apihelp-main-param-curtimestamp": "Includi nel risultato il timestamp attuale.",
        "apihelp-block-description": "Blocca  un utente.",
-       "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare.",
+       "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare. Non può essere usato insieme a <var>$1userid</var>",
        "apihelp-block-param-expiry": "Tempo di scadenza. Può essere relativo (ad esempio, <kbd>5 months</kbd> o <kbd>2 weeks</kbd>) o assoluto (ad esempio <kbd>2014-09-18T12:34:56Z</kbd>). Se impostato a <kbd>infinite</kbd>, <kbd>indefinite</kbd> o <kbd>never</kbd>, il blocco non scadrà mai.",
        "apihelp-block-param-reason": "Motivo del blocco.",
        "apihelp-block-param-anononly": "Blocca solo gli utenti non registrati (cioè disattiva i contributi anonimi da questo indirizzo IP).",
        "apihelp-protect-example-protect": "Proteggi una pagina.",
        "apihelp-protect-example-unprotect": "Sproteggi una pagina impostando restrizione su <kbd>all</kbd> (cioè a tutti è consentito intraprendere l'azione).",
        "apihelp-protect-example-unprotect2": "Sproteggi una pagina impostando nessuna restrizione.",
+       "apihelp-purge-description": "Pulisce la cache per i titoli indicati.",
        "apihelp-purge-param-forcelinkupdate": "Aggiorna la tabella dei collegamenti.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Aggiorna la tabella dei collegamenti per questa pagina, e per ogni pagina che usa questa pagina come template.",
        "apihelp-query-param-list": "Quali elenchi ottenere.",
        "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-param-user": "Utente in corso di ripristino.",
        "apihelp-resetpassword-param-email": "Indirizzo di posta elettronica dell'utente in corso di ripristino.",
-       "apihelp-resetpassword-param-capture": "Restituisce le password temporanee che erano state inviate. Richiede il diritto utente <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "Invia una mail per reimpostare la password all'utente <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "Invia una mail per reimpostare la password a tutti gli utenti con indirizzo di posta elettronica <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Cancella e ripristina le versioni.",
        "apihelp-revisiondelete-param-hide": "Cosa nascondere per ogni versione.",
        "apihelp-revisiondelete-param-show": "Cosa mostrare per ogni versione.",
        "apihelp-revisiondelete-param-reason": "Motivo per l'eliminazione o il ripristino.",
+       "apihelp-setpagelanguage-description": "Cambia la lingua di una pagina.",
+       "apihelp-setpagelanguage-param-reason": "Motivo per la modifica.",
        "apihelp-stashedit-param-title": "Titolo della pagina che si sta modificando.",
        "apihelp-stashedit-param-sectiontitle": "Il titolo per una nuova sezione.",
        "apihelp-stashedit-param-text": "Contenuto della pagina.",
        "apihelp-tokens-param-type": "Tipi di token da richiedere.",
        "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).",
        "apihelp-unblock-description": "Sblocca un utente",
+       "apihelp-unblock-param-user": "Nome utente, indirizzo IP o range di IP da sbloccare. Non può essere usato insieme a <var>$1id</var> o <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID utente da sbloccare. Non può essere usato insieme a <var>$1id</var> o <var>$1userid</var>.",
        "apihelp-unblock-param-reason": "Motivo dello sblocco.",
        "apihelp-unblock-param-tags": "Modifica etichette da applicare all'elemento del registro dei blocchi.",
        "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
        "apihelp-upload-example-url": "Carica da un URL.",
        "apihelp-userrights-param-user": "Nome utente.",
        "apihelp-userrights-param-userid": "ID utente.",
-       "apihelp-userrights-param-add": "Aggiungi l'utente a questi gruppi.",
+       "apihelp-userrights-param-add": "Aggiungere l'utente a questi gruppi, o se sono già membri, aggiornare la scadenza della loro appartenenza a quel gruppo.",
        "apihelp-userrights-param-remove": "Rimuovi l'utente da questi gruppi.",
        "apihelp-userrights-param-reason": "Motivo del cambiamento.",
+       "apihelp-validatepassword-description": "Convalida una password seguendo le politiche del wiki sulle password.\n\nLa validità è riportata come <samp>Good</samp> se la password è accettabile, <samp>Change</samp> se la password può essere utilizzata per l'accesso ma deve essere modificata, o <samp>Invalid</samp> se la password non è utilizzabile.",
+       "apihelp-validatepassword-param-password": "Password da convalidare.",
+       "apihelp-validatepassword-example-1": "Convalidare la password <kbd>foobar</kbd> per l'attuale utente.",
+       "apihelp-validatepassword-example-2": "Convalida la password <kbd>qwerty</kbd> per la creazione dell'utente <kbd>Example</kbd>.",
        "apihelp-watch-description": "Aggiunge o rimuove pagine dagli osservati speciali dell'utente attuale.",
        "apihelp-format-param-wrappedhtml": "Restituisce l'HTML ben formattato e i moduli ResourceLoader associati come un oggetto JSON.",
        "api-pageset-param-titles": "Un elenco di titoli su cui lavorare.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Il valore deve essere compreso|2=I valori devono essere compresi}} tra $2 e $3.",
        "api-help-param-multi-separate": "Separa i valori con <kbd>|</kbd> o [[Special:ApiHelp/main#main/datatypes|alternativa]].",
        "api-help-param-multi-max": "Il numero massimo di valori è {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} per i bot).",
+       "api-help-param-multi-all": "Per specificare tutti i valori, utilizza <kbd>$1</kbd>.",
        "api-help-param-default": "Predefinito: $1",
        "api-help-param-default-empty": "Predefinito: <span class=\"apihelp-empty\">(vuoto)</span>",
        "api-help-param-token": "Un token \"$1\" recuperato da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
        "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. È necessario fornirlo, oppure fornire <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
+       "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
+       "apierror-nosuchuserid": "Non c'è alcun utente con ID $1.",
        "api-credits-header": "Crediti"
 }
index d9d079b..e17b9ad 100644 (file)
@@ -25,7 +25,8 @@
        "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
        "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> は <kbd>siprop=languages</kbd> を付けると言語コードの一覧を返します。<kbd>user</kbd> を指定することで現在の利用者の個人設定の言語を、<kbd>content</kbd> を指定することでこのウィキの本文の言語を使用することもできます。",
        "apihelp-block-description": "利用者をブロックします。",
-       "apihelp-block-param-user": "ブロックする利用者名、IPアドレスまたはIPレンジ。",
+       "apihelp-block-param-user": "ブロックを解除する利用者名、IPアドレスまたはIPレンジ。<var>$1userid</var>とは同時に使用できません。",
+       "apihelp-block-param-userid": "ブロックする利用者のID。<var>$1user</var>とは同時に使用できません。",
        "apihelp-block-param-expiry": "有効期限。相対的 (例: <kbd>5 months</kbd> または <kbd>2 weeks</kbd>) または絶対的 (e.g. <kbd>2014-09-18T12:34:56Z</kbd>) どちらでも構いません。<kbd>infinite</kbd>, <kbd>indefinite</kbd>, もしくは <kbd>never</kbd> と設定した場合, 無期限ブロックとなります。",
        "apihelp-block-param-reason": "ブロックの理由。",
        "apihelp-block-param-anononly": "匿名利用者のみブロックします(つまり、このIPアドレスからの匿名での編集を不可能にします)。",
        "apihelp-protect-example-protect": "ページを保護する。",
        "apihelp-protect-example-unprotect": "制限値を <kbd>all</kbd> にしてページの保護を解除する。",
        "apihelp-protect-example-unprotect2": "制限を設定されたページ保護を解除します。",
-       "apihelp-purge-description": "指定されたページのキャッシュをパージします。\n\n利用者がログインしていない場合は、 POST リクエストが必要です。",
+       "apihelp-purge-description": "指定されたページのキャッシュを破棄します。",
        "apihelp-purge-param-forcelinkupdate": "リンクテーブルを更新します。",
        "apihelp-purge-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>API</kbd> をパージする。",
        "apihelp-purge-example-generator": "標準名前空間にある最初の10ページをパージする。",
        "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。",
        "apihelp-query+usercontribs-param-limit": "返す投稿記録の最大数。",
-       "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。",
-       "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。$1user をオーバーライドします。",
+       "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。<var>$1userids</var> または <var>$1userprefix</var> とは同時に使用できません。",
+       "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。<var>$1user</var> または <var>$1userids</var> とは同時に使用できません。",
+       "apihelp-query+usercontribs-param-userids": "投稿記録を取得する利用者のID。<var>$1user</var> または <var>$1userprefix</var> とは同時に使用できません。",
        "apihelp-query+usercontribs-param-namespace": "この名前空間への投稿記録のみを一覧表示する。",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "ページIDと版IDを追加します。",
        "apihelp-query+usercontribs-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
        "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+watchlistraw-param-dir": "一覧表示する方向。",
        "apihelp-query+watchlistraw-example-generator": "現在の利用者のウォッチリスト上のページに関する情報を取得する。",
+       "apihelp-resetpassword-example-user": "利用者 <kbd>Example</kbd> にパスワード再設定の電子メールを送信する。",
        "apihelp-revisiondelete-description": "版の削除および復元を行います。",
        "apihelp-revisiondelete-param-reason": "削除または復元の理由。",
        "apihelp-revisiondelete-example-revision": "<kbd>Main Page</kbd> の版 <kbd>12345</kbd> の本文を隠す。",
        "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+deletedrevs|list=deletedrevs]]に、また削除されたファイルのID一覧は[[Special:ApiHelp/query+filearchive|list=filearchive]]で見つけることができます。",
+       "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-userrights-param-userid": "利用者ID。",
        "apihelp-userrights-param-add": "利用者をこのグループに追加します。",
        "apihelp-userrights-param-reason": "変更の理由。",
+       "apihelp-watch-description": "現在の利用者のウォッチリストにページを追加/除去します。",
        "apihelp-watch-example-watch": "<kbd>Main Page</kbd> をウォッチする。",
        "apihelp-watch-example-unwatch": "<kbd>Main Page</kbd> のウォッチを解除する。",
        "apihelp-format-example-generic": "クエリの結果を $1 形式に返します。",
        "apihelp-phpfm-description": "データを PHP のシリアル化した形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-rawfm-description": "データをデバッグ要素付きで JSON 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-xml-description": "データを XML 形式で出力します。",
-       "apihelp-xml-param-xslt": "指定すると、XSLスタイルシートとして名付けられたページを追加します。値は、必ず、{{ns:mediawiki}} 名前空間の、ページ名の末尾が <code>.xsl</code> でのタイトルである必要があります。",
+       "apihelp-xml-param-xslt": "指定すると、XSLスタイルシートとして名付けられたページを追加します。値は、必ず、{{ns:MediaWiki}} 名前空間の、ページ名の末尾が <code>.xsl</code> でのタイトルである必要があります。",
        "apihelp-xml-param-includexmlnamespace": "指定すると、XML 名前空間を追加します。",
        "apihelp-xmlfm-description": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki API の結果",
        "api-help-permissions": "{{PLURAL:$1|権限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|権限を持つグループ}}: $2",
        "api-help-open-in-apisandbox": "<small>[サンドボックスで開く]</small>",
+       "apierror-missingparam": "パラメーター <var>$1</var> を設定してください。",
        "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 d01abe5..258a3d4 100644 (file)
                        "Priviet",
                        "Ykhwong",
                        "Jonghaya",
-                       "Jerrykim306"
+                       "Jerrykim306",
+                       "코코아"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|ì\84¤ëª\85문ì\84\9c]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API ì\95\8c림 ì\82¬í\95­]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ë²\84ê·¸ ë°\8f ì\9a\94ì²­]\n</div>\n<strong>ì\83\81í\83\9c:</strong> ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ë³´ì\9d´ë\8a\94 ëª¨ë\93  ê¸°ë\8a¥ì\9d\80 ì \95ì\83\81ì \81ì\9c¼ë¡\9c ì\9e\91ë\8f\99í\95\98ì§\80ë§\8c, APIë\8a\94 ì\97¬ì \84í\9e\88 í\99\9cë°\9cí\95\98ê²\8c ê°\9cë°\9cë\90\98ê³  ì\9e\88ì\9c¼ë©°, ì\96¸ì \9cë\93 ì§\80 ë³\80ê²½ë\90  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\97\85ë\8d°ì\9d´í\8a¸ ê³µì§\80를 ë°\9bì\95\84보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]를 êµ¬ë\8f\85í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>ì\9e\98못ë\90\9c ì\9a\94ì²­:</strong> APIì\97\90 ì\9e\98못ë\90\9c ì\9a\94ì²­ì\9d´ ì \84ì\86¡ë\90\98ë©´ \"MediaWiki-API-Error\" í\82¤ê°\80 í\8f¬í\95¨ë\90\9c HTTP í\97¤ë\8d\94ê°\80 ì \84ì\86¡ë\90\98ë©° ë°\98í\99\98ë\90\98ë\8a\94 í\97¤ë\8d\94ì\99\80 ì\98¤ë¥\98 ì½\94ë\93\9cì\9d\98 ê°\92ì\9d\80 ë\8f\99ì\9d¼í\95\9c ê°\92ì\9c¼ë¡\9c ì\84¤ì \95ë\90©ë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì \95ë³´ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[mw:API:Errors_and_warnings|API:오류와 경고]]를 참조하십시오.\n\n<strong>테스트하기:</strong> API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|ì\84¤ëª\85문ì\84\9c]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API ì\95\8c림 ì\82¬í\95­]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ë²\84ê·¸ ë°\8f ì\9a\94ì²­]\n</div>\n<strong>ì\83\81í\83\9c:</strong> ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ë³´ì\9d´ë\8a\94 ëª¨ë\93  ê¸°ë\8a¥ì\9d\80 ì \95ì\83\81ì \81ì\9c¼ë¡\9c ì\9e\91ë\8f\99í\95\98ì§\80ë§\8c, APIë\8a\94 ì\97¬ì \84í\9e\88 í\99\9cë°\9cí\95\98ê²\8c ê°\9cë°\9cë\90\98ê³  ì\9e\88ì\9c¼ë©°, ì\96¸ì \9cë\93 ì§\80 ë³\80ê²½ë\90  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\97\85ë\8d°ì\9d´í\8a¸ ê³µì§\80를 ë°\9bì\95\84보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]를 êµ¬ë\8f\85í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>ì\9e\98못ë\90\9c ì\9a\94ì²­:</strong> APIì\97\90 ì\9e\98못ë\90\9c ì\9a\94ì²­ì\9d´ ì \84ì\86¡ë\90\98ë©´ \"MediaWiki-API-Error\" í\82¤ê°\80 í\8f¬í\95¨ë\90\9c HTTP í\97¤ë\8d\94ê°\80 ì \84ì\86¡ë\90\98ë©° ë°\98í\99\98ë\90\98ë\8a\94 í\97¤ë\8d\94ì\99\80 ì\98¤ë¥\98 ì½\94ë\93\9cì\9d\98 ê°\92ì\9d\80 ëª¨ë\91\90 ë\8f\99ì\9d¼í\95\9c ê°\92ì\9c¼ë¡\9c ì\84¤ì \95ë\90©ë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì \95ë³´ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[mw:API:Errors and warnings/ko|API:오류와 경고]]를 참조하십시오.\n\n<strong>테스트하기:</strong> API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.",
        "apihelp-main-param-action": "수행할 동작",
        "apihelp-main-param-format": "출력값의 형식.",
        "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, <samp>maxlag</samp> 오류 코드와 <samp>Waiting for $host: $lag seconds lagged</samp> 메시지가 제공됩니다.<br />[[mw:Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]] 에서 더 많은 정보를 얻을 수 있습니다.",
        "apihelp-main-param-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>  플래그가 설정되어 있다면 봇 사용자 권한이 설정되어 있는지 확인합니다.",
+       "apihelp-main-param-assertuser": "현재 사용자가 지명된 사용자인지 확인합니다.",
        "apihelp-main-param-requestid": "주어진 요청 값은 응답에 포함됩니다. 요청을 구분하기 위해 사용될 수 있습니다.",
        "apihelp-main-param-servedby": "결과에 요청을 처리한 호스트네임을 포함합니다.",
        "apihelp-main-param-curtimestamp": "결과의 타임스탬프를 포함합니다.",
+       "apihelp-main-param-responselanginfo": "<var>uselang</var> 및 <var>errorlang</var>에 사용되는 언어를 결과에 포함합니다.",
+       "apihelp-main-param-origin": "크로스 도메인 AJAX 요청 (CORS)을 사용하여 API에 접근할 때, 이것을 발신 도메인으로 설정하십시오. 모든 pre-flight 요청에 포함되어야 하며, 이에 따라 (POST 본문이 아닌) 요청 URI의 일부여야 합니다.\n\n인증된 요청의 경우, <code>Origin</code> 헤더의 발신지들 중 하나와 정확히 일치해야 하므로 <kbd>https://en.wikipedia.org</kbd> 또는 <kbd>https://meta.wikimedia.org</kbd>와 같이 설정되어야 합니다. 이 변수가 <code>Origin</code> 헤더와 일치하지 않으면 403 응답이 반환됩니다. 이 변수가 <code>Origin</code> 헤더와 일치하고 발신지가 화이트리스트에 있을 경우 <code>Access-Control-Allow-Origin</code>과 <code>Access-Control-Allow-Credentials</code> 헤더가 설정됩니다.\n\n인증되지 않은 요청의 경우, <kbd>*</kbd> 값을 지정하십시오. 이를 통해 <code>Access-Control-Allow-Origin</code> 헤더가 설정되지만 <code>Access-Control-Allow-Credentials</code>는 <code>false</code>로 설정되어 모든 사용자 지정 데이터가 제한을 받게 됩니다.",
+       "apihelp-main-param-uselang": "메시지 번역을 위한 언어입니다. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>에 <kbd>siprop=languages</kbd>를 함께 사용하면 언어 코드의 목록을 반환하고, <kbd>user</kbd>를 지정하면 현재 사용자의 언어 환경 설정을 사용하며, <kbd>content</kbd>를 지정하면 이 위키의 콘텐츠 언어를 사용합니다.",
+       "apihelp-main-param-errorformat": "경고 및 오류 텍스트 출력을 위해 사용할 형식입니다.\n; plaintext: HTML 태그가 제거되고 엔티티가 치환된 위키텍스트입니다.\n; wikitext: 구문 분석되지 않은 위키텍스트입니다.\n; html: HTML입니다.\n; raw: 메시지 키와 변수입니다.\n; none: 텍스트 없이 오류 코드만 출력합니다.\n; bc: 미디어위키 1.29 이전에 사용된 형식입니다. <var>errorlang</var> 및 <var>errorsuselocal</var>은 무시됩니다.",
+       "apihelp-main-param-errorlang": "경고와 오류를 위해 사용할 언어입니다. <kbd>siprop=languages</kbd>가 포함된 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>는 언어 코드의 목록을 반환하고, <kbd>content</kbd>를 지정하면 이 위키의 내용 상의 언어를 사용하며, <kbd>uselang</kbd>을 지정하면 <var>uselang</var> 변수와 동일한 값을 사용합니다.",
+       "apihelp-main-param-errorsuselocal": "지정하면 오류 텍스트가 {{ns:MediaWiki}} 이름공간에서 지역적으로 정의된 메시지를 사용합니다.",
        "apihelp-block-description": "사용자를 차단합니다.",
-       "apihelp-block-param-user": "차단하고자 하는 계정 이름, IP 주소 또는 대역",
+       "apihelp-block-param-user": "차단할 사용자 이름, IP 주소, 또는 IP 주소 대역입니다. <var>$1userid</var>와(과) 함께 사용할 수 없습니다.",
+       "apihelp-block-param-userid": "차단할 사용자 ID입니다. <var>$1user</var>와(과) 함께 사용할 수 없습니다.",
        "apihelp-block-param-expiry": "기한. 상대값(예시: <kbd>5 months</kbd> 또는 </kbd>2 weeks</kbd>) 또는 절대값(예시: <kbd>2014-09-18T12:34:56Z</kbd>)이 될 수 있습니다. <kbd>infinite</kbd>, <kbd>indefinite</kbd> 또는 <kbd>never</kbd>로 설정하면 무기한으로 설정됩니다.",
        "apihelp-block-param-reason": "차단 이유.",
        "apihelp-block-param-anononly": "익명 사용자만 차단합니다. (즉, 이 IP의 익명 편집을 막음)",
@@ -39,6 +48,7 @@
        "apihelp-block-param-allowusertalk": "자신의 토론 문서를 편집할 수 있도록 허용합니다. (<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> 값에 따라 다름)",
        "apihelp-block-param-reblock": "사용자가 이미 차단된 경우, 기존 차단 설정을 바꿉니다.",
        "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
+       "apihelp-block-param-tags": "차단 기록의 항목에 적용할 태그를 변경합니다.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일 간 차단하기",
        "apihelp-block-example-user-complex": "사용자 <kbd>Vandal</kbd>을 <kbd>Vandalism</kbd>이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
        "apihelp-changeauthenticationdata-description": "현재 사용자의 인증 데이터를 변경합니다.",
@@ -52,6 +62,7 @@
        "apihelp-clearhasmsg-example-1": "현재 계정의 <code>hasmsg</code> 플래그를 삭제합니다.",
        "apihelp-clientlogin-description": "상호작용 플로우를 이용하여 위키에 로그인합니다.",
        "apihelp-clientlogin-example-login": "사용자 <kbd>Example</kbd>, 비밀번호 <kbd>ExamplePassword</kbd>로 위키 로그인 과정을 시작합니다.",
+       "apihelp-clientlogin-example-login2": "<kbd>987654</kbd>의 <var>OATHToken</var>을 지정하여 2요소 인증을 위한 <samp>UI</samp> 응답 이후에 로그인을 계속합니다.",
        "apihelp-compare-description": "두 문서 간의 차이를 가져옵니다.\n\n대상이 되는 두 문서의 판 번호나 문서 제목 또는 문서 ID를 지정해야 합니다.",
        "apihelp-compare-param-fromtitle": "비교할 첫 이름.",
        "apihelp-compare-param-fromid": "비교할 첫 문서 ID.",
        "apihelp-edit-param-redirect": "자동으로 넘겨주기 처리하기.",
        "apihelp-edit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.",
        "apihelp-edit-example-edit": "문서 편집",
+       "apihelp-edit-example-undo": "자동 편집요약으로 13579판에서 13585판까지 되돌리기.",
        "apihelp-emailuser-description": "사용자에게 이메일을 보냅니다.",
        "apihelp-emailuser-param-target": "이메일을 받을 사용자.",
        "apihelp-emailuser-param-subject": "제목 헤더.",
        "apihelp-feedrecentchanges-param-invert": "선택한 항목을 제외한 모든 이름공간.",
        "apihelp-feedrecentchanges-param-associated": "관련 (토론 또는 일반) 이름공간을 포함합니다.",
        "apihelp-feedrecentchanges-param-limit": "반환할 결과의 최대 수.",
-       "apihelp-feedrecentchanges-param-from": "이후의 변경 사항을 보여줍니다.",
+       "apihelp-feedrecentchanges-param-from": "이후의 변경사항을 보여줍니다.",
        "apihelp-feedrecentchanges-param-hideminor": "사소한 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hidebots": "봇의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hideanons": "익명 사용자의 편집을 숨깁니다.",
        "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
        "apihelp-filerevert-param-comment": "업로드 댓글입니다.",
        "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
-       "apihelp-help-description": "지정된 모듈의 도움말을 보여줍니다.",
+       "apihelp-help-description": "지정된 모듈의 도움말을 표시합니다.",
        "apihelp-help-param-helpformat": "도움말 출력 포맷.",
+       "apihelp-help-example-main": "메인 모듈의 도움말입니다.",
        "apihelp-help-example-recursive": "모든 도움말을 한 페이지로 모읍니다.",
        "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.",
        "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.",
        "apihelp-import-param-xml": "업로드한 XML 파일.",
-       "apihelp-login-param-name": "계정 이름.",
+       "apihelp-login-param-name": "사용자 이름.",
        "apihelp-login-param-password": "비밀번호.",
        "apihelp-login-param-domain": "도메인 (선택).",
        "apihelp-login-param-token": "처음 요청에서 로그인 토큰을 취득했습니다.",
        "apihelp-move-param-watch": "현재 사용자의 주시 문서에 이 문서와 넘겨주기 문서를 추가하기",
        "apihelp-move-param-unwatch": "현재 사용자의 주시 문서에 이 문서와 넘겨주기 문서를 제거하기",
        "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-format": "출력 포맷.",
+       "apihelp-opensearch-example-te": "<kbd>Te</kbd>로 시작하는 문서를 찾기.",
        "apihelp-options-param-reset": "사이트 기본으로 설정 초기화",
        "apihelp-options-example-reset": "모든 설정 초기화",
        "apihelp-paraminfo-description": "API 모듈의 정보를 가져옵니다.",
        "apihelp-parse-example-page": "페이지의 구문을 분석합니다.",
        "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.",
        "apihelp-parse-example-summary": "요약을 구문 분석합니다.",
+       "apihelp-patrol-example-revid": "판을 점검합니다.",
        "apihelp-protect-description": "문서의 보호 수준을 변경합니다.",
        "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.",
        "apihelp-protect-example-protect": "문서 보호",
+       "apihelp-purge-description": "주어진 제목을 위한 캐시를 새로 고침.",
        "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.",
+       "apihelp-query-param-prop": "조회된 페이지에 대해 가져올 속성입니다.",
+       "apihelp-query-param-list": "가져올 목록입니다.",
+       "apihelp-query-param-meta": "가져올 메타데이터입니다.",
+       "apihelp-query-param-indexpageids": "반환된 모든 페이지 ID를 나열하는 부가적인 페이지 ID 섹션을 포함합니다.",
+       "apihelp-query-param-export": "기존의 페이지나 생성된 페이지들 전체의 현재 판들을 내보냅니다.",
+       "apihelp-query-param-exportnowrap": "XML 결과물로 래핑하지 않고 엑스포트 XML을 반환합니다. $1export와만 같이 사용할 수 있습니다.",
+       "apihelp-query-param-iwurl": "제목이 인터위키 링크인 경우 전체 URL을 가져올지의 여부입니다.",
+       "apihelp-query-param-rawcontinue": "계속하기 위해 순수 <samp>query-continue</samp> 데이터를 반환합니다.",
        "apihelp-query+allcategories-description": "모든 분류를 열거합니다.",
        "apihelp-query+allcategories-param-prefix": "이 값으로 시작하는 모든 분류 제목을 검색합니다.",
        "apihelp-query+allcategories-param-dir": "정렬 방향.",
        "apihelp-query+alldeletedrevisions-param-user": "이 사용자에 대한 판만 나열합니다.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "이 사용자에 대한 판을 나열하지 않습니다.",
        "apihelp-query+alldeletedrevisions-param-namespace": "이 이름공간의 문서만 나열합니다.",
+       "apihelp-query+alldeletedrevisions-example-user": "<kbd>Example</kbd>님의 최근 50개의 삭제된 기여를 나열합니다.",
        "apihelp-query+allfileusages-paramvalue-prop-title": "파일의 제목을 추가합니다.",
        "apihelp-query+allfileusages-param-limit": "반환할 총 항목 수입니다.",
        "apihelp-query+allfileusages-example-unique": "고유한 파일 제목을 나열합니다.",
        "apihelp-query+allfileusages-example-unique-generator": "모든 파일 제목을 가져오되, 존재하지 않는 항목을 표시합니다.",
        "apihelp-query+allfileusages-example-generator": "파일을 포함하는 문서를 가져옵니다.",
        "apihelp-query+allimages-description": "모든 그림을 순차적으로 열거합니다.",
+       "apihelp-query+allimages-example-recent": "최근 업로드된 파일을 보여줍니다. [[Special:NewFiles]]와 유사합니다.",
        "apihelp-query+alllinks-paramvalue-prop-title": "링크의 제목을 추가합니다.",
        "apihelp-query+alllinks-param-namespace": "열거할 이름공간.",
        "apihelp-query+alllinks-param-limit": "반환할 총 항목 수입니다.",
        "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]]의 현재 판에 대한 정보를 가져옵니다.",
        "apihelp-query+imageinfo-example-dated": "2008년 및 그 이후의 [[:File:Test.jpg]]의 판에 대한 정보를 가져옵니다.",
        "apihelp-query+images-param-limit": "반환할 파일 수.",
+       "apihelp-query+images-example-simple": "[[Main Page|대문]]에 사용된 파일 목록을 가져옵니다.",
+       "apihelp-query+images-example-generator": "[[Main Page|대문]]에 사용된 모든 파일에 관한 정보를 가져옵니다.",
        "apihelp-query+imageusage-param-namespace": "열거할 이름공간.",
        "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]]를 이용하여 페이지의 정보를 가져옵니다.",
        "apihelp-query+info-description": "기본 페이지 정보를 가져옵니다.",
        "apihelp-query+prefixsearch-param-limit": "반환할 결과의 최대 수",
        "apihelp-query+prefixsearch-param-profile": "검색 프로파일 사용",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "보호 수준을 추가합니다.",
+       "apihelp-query+querypage-example-ancientpages": "[[Special:Ancientpages|특수:오래된문서]]에서 결과를 반환합니다.",
        "apihelp-query+recentchanges-param-prop": "추가 정보를 포함합니다:",
        "apihelp-query+recentchanges-paramvalue-prop-user": "편집에 임할 사용자를 추가하고 IP인 경우 태그합니다.",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "편집에 임할 사용자를 추가합니다.",
        "apihelp-query+search-paramvalue-prop-timestamp": "문서가 마지막으로 편집된 시기의 타임스탬프를 추가합니다.",
        "apihelp-query+search-example-simple": "<kbd>meaning</kbd>을 검색합니다.",
        "apihelp-query+search-example-text": "<kbd>meaning</kbd>의 텍스트를 검색합니다.",
+       "apihelp-query+siteinfo-description": "사이트의 전반적인 정보를 반환합니다.",
        "apihelp-query+siteinfo-param-prop": "가져올 정보:",
-       "apihelp-query+siteinfo-paramvalue-prop-general": "전반적인 시스템 정보.",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "전반적인 시스템 정보입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "등록된 이름공간 및 기본 이름의 목록입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "등록된 이름공간 별칭의 목록입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "특수 문서의 별칭 목록입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "매직 워드와 별칭의 목록입니다.",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "사이트 통계를 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "인터위키 맵을 반환합니다. (<var>$1inlanguagecode</var>를 사용하여 필터링 및 지역화 선택 가능)",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "반복 지연이 가장 높은 데이터베이스 서버를 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "사용자 그룹 및 관련 권한을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "위키에 설치된 라이브러리를 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "위키에 설치된 확장 기능을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "사용 중인 모든 스킨의 목록을 반환합니다. (<var>$1inlanguagecode</var>를 사용하여 지역화 선택이 가능하며, 이를 사용하지 않으면 본문의 언어를 사용함)",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "파서 확장 태그의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "파서 함수 훅의 목록을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "예약된 모든 훅(<var>[[mw:Manual:$wgHooks|$wgHooks]]</var>의 내용)의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "변수 ID의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "외부 링크에 허용된 프로토콜의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "사용자 환경 설정의 기본값을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "업로드 대화 상자 구성을 반환합니다.",
+       "apihelp-query+siteinfo-param-filteriw": "인터위키 맵의 로컬 또는 로컬이 아닌 항목만 반환합니다.",
+       "apihelp-query+siteinfo-param-showalldb": "가장 지연이 심한 서버뿐 아니라, 모든 데이터베이스 서버를 나열합니다.",
        "apihelp-query+siteinfo-param-numberingroup": "사용자 그룹의 사용자 수를 나열합니다.",
+       "apihelp-query+siteinfo-param-inlanguagecode": "지역화된 언어 이름 (가능한 경우) 및 스킨 이름의 언어 코드입니다.",
        "apihelp-query+siteinfo-example-simple": "사이트 정보를 가져옵니다.",
        "apihelp-query+siteinfo-example-interwiki": "로컬 인터위키 접두사 목록을 가져옵니다.",
+       "apihelp-query+siteinfo-example-replag": "현재의 반복 지연을 검사합니다.",
        "apihelp-query+tags-param-limit": "나열할 태그의 최대 수.",
        "apihelp-query+tags-paramvalue-prop-name": "태그의 이름을 추가합니다.",
        "apihelp-query+tags-paramvalue-prop-description": "태그의 설명을 추가합니다.",
        "apihelp-query+tags-paramvalue-prop-hitcount": "판의 수와 이 판을 가진 로그 엔트리를 추가합니다.",
        "apihelp-query+templates-param-limit": "반환할 틀 수.",
        "apihelp-query+tokens-param-type": "요청할 토큰의 종류.",
+       "apihelp-query+tokens-example-simple": "csrf 토큰을 가져옵니다. (기본값)",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "각 문서의 페이지 ID.",
        "apihelp-query+transcludedin-paramvalue-prop-title": "각 문서의 제목.",
        "apihelp-query+transcludedin-paramvalue-prop-redirect": "문서가 넘겨주기이면 표시합니다.",
        "apihelp-query+users-param-prop": "포함할 정보:",
        "apihelp-query+users-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.",
        "apihelp-query+users-paramvalue-prop-registration": "사용자의 등록 타임스탬프를 추가합니다.",
+       "apihelp-query+users-param-userids": "정보를 가져올 사용자 ID의 목록입니다.",
        "apihelp-query+users-param-token": "<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>을 대신 사용하십시오.",
        "apihelp-query+users-example-simple": "사용자 <kbd>Example</kbd>의 정보를 반환합니다.",
        "apihelp-query+watchlist-description": "현재 사용자의 주시목록의 문서의 최근 바뀜을 가져옵니다.",
        "apihelp-query+watchlist-param-user": "이 사용자의 변경 사항만 나열합니다.",
-       "apihelp-query+watchlist-param-excludeuser": "이 사용자의 변경 사항을 나열하지 않습니다.",
+       "apihelp-query+watchlist-param-excludeuser": "이 사용자의 변경사항을 나열하지 않습니다.",
        "apihelp-query+watchlist-paramvalue-prop-ids": "판 ID와 페이지 ID를 추가합니다.",
        "apihelp-query+watchlist-paramvalue-prop-title": "문서의 제목을 추가합니다.",
        "apihelp-query+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
        "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.",
        "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.",
        "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.",
+       "apihelp-setpagelanguage-description": "문서의 언어를 변경합니다.",
+       "apihelp-setpagelanguage-description-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.\n\n이 동작을 사용하려면 <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>을 활성화하십시오.",
+       "apihelp-setpagelanguage-param-reason": "변경 이유.",
+       "apihelp-setpagelanguage-example-language": "<kbd>Main Page</kbd>의 언어를 바스크어로 변경합니다.",
        "apihelp-stashedit-param-sectiontitle": "새 문단을 위한 제목.",
        "apihelp-stashedit-param-text": "문서 내용.",
        "apihelp-stashedit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.",
        "apihelp-tag-param-reason": "변경 이유.",
        "apihelp-tokens-param-type": "요청할 토큰의 종류.",
        "apihelp-unblock-description": "사용자를 차단 해제합니다.",
+       "apihelp-unblock-param-user": "차단을 해제할 사용자 이름, IP 주소, IP 주소 대역입니다. <var>$1id</var> 또는 <var>$1userid</var>와(과) 함께 사용할 수 없습니다.",
+       "apihelp-unblock-param-userid": "차단을 해제할 사용자 ID입니다. <var>$1id</var> 또는 <var>$1user</var>와(과) 함께 사용할 수 없습니다.",
        "apihelp-unblock-param-reason": "차단 해제 이유.",
+       "apihelp-unblock-param-tags": "차단 기록의 항목에 적용할 태그를 변경합니다.",
+       "apihelp-upload-param-ignorewarnings": "모든 경고를 무시합니다.",
        "apihelp-userrights-param-user": "사용자 이름.",
        "apihelp-userrights-param-userid": "사용자 ID.",
-       "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.",
+       "apihelp-validatepassword-param-email": "계정 생성을 테스트할 때 사용할 이메일 주소입니다.",
+       "apihelp-validatepassword-param-realname": "계정 생성을 테스트할 때 사용할 실명입니다.",
+       "apihelp-json-description": "데이터를 JSON 형식으로 출력합니다.",
+       "apihelp-json-param-formatversion": "출력 형식:\n;1:하위 호환 포맷 (XML 스타일 불린, 콘텐츠 노드를 위한 <samp>*</samp> 키 등).\n;2:실험적인 모던 포맷. 상세 내용은 바뀔 수 있습니다!\n;latest:최신 포맷(현재 <kbd>2</kbd>)을 이용하지만 경고 없이 바뀔 수 있습니다.",
+       "apihelp-jsonfm-description": "데이터를 JSON 포맷으로 출력합니다. (HTML의 가독성 증가)",
+       "apihelp-rawfm-description": "디버깅 요소를 포함하여 데이터를 JSON 형식으로 출력합니다. (HTML의 가독성 증가)",
        "apihelp-xml-param-includexmlnamespace": "지정하면 XML 이름공간을 추가합니다.",
        "api-format-title": "미디어위키 API 결과",
+       "api-pageset-param-titles": "작업할 제목의 목록입니다.",
+       "api-pageset-param-pageids": "작업할 페이지 ID의 목록입니다.",
+       "api-pageset-param-revids": "작업할 판 ID의 목록입니다.",
+       "api-pageset-param-generator": "특정 쿼리 모듈을 실행함으로써 작업할 페이지의 목록입니다.\n\n<strong>참고:</strong> 발생기 변수명은 \"g\"로 시작해야 합니다. 예시를 참고하십시오.",
        "api-help-title": "미디어위키 API 도움말",
        "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "메인 모듈",
        "api-help-param-type-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-list": "{{PLURAL:$1|1=다음 값 중 하나|2=값 (<kbd>{{!}}</kbd>로 구분)}}: $2",
+       "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-limit": "$1 초과는 허용되지 않습니다.",
        "api-help-param-limit2": "$1 초과는 허용되지 않습니다. (봇의 경우 $2)",
        "api-help-param-integer-min": "{{PLURAL:$1|1=값|2=값들}}은 $2 이상이어야 합니다.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=값|2=값들}}은 $3 이하여야 합니다.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=값|2=값들}}은 $2와 $3 사이여야 합니다.",
+       "api-help-param-multi-separate": "<kbd>|</kbd> 또는 [[Special:ApiHelp/main#main/datatypes|대안]]으로 값을 구분합니다.",
        "api-help-param-multi-max": "값들의 최대 수는 {{PLURAL:$1|$1}}입니다. (봇의 경우 {{PLURAL:$2|$2}})",
        "api-help-param-default": "기본값: $1",
        "api-help-param-default-empty": "기본값: <span class=\"apihelp-empty\">(비어 있음)</span>",
+       "api-help-param-token": "\"$1\" 토큰은 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]에서 가져옵니다",
        "api-help-param-token-webui": "호환성을 위해, 웹 UI에 사용된 토큰도 허용합니다.",
        "api-help-param-continue": "더 많은 결과를 이용할 수 있을 때, 계속하려면 이것을 사용하십시오.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(설명 없음)</span>",
        "api-help-examples": "{{PLURAL:$1|예시}}:",
        "api-help-permissions": "{{PLURAL:$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>amirequestsfor=$4</kbd>와 함께 <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</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> 및 반환 URL에 전달되는, 모든 관련 필드와 함께 이 모듈에 전달하고 단계 4를 반복합니다.\n#* <samp>RESTART</samp>를 수실한 경우 인증은 동작했으나 연결된 사용자 계정이 없다는 것을 의미합니다. <samp>UI</samp>나 <samp>FAIL</samp>로 간주할 수 있습니다.",
+       "api-help-authmanagerhelper-requests": "<kbd>amirequestsfor=$1</kbd>와(과) 함께 <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>에서 반환된 <samp>id</samp>를 통해, 또는 이 모듈의 과거 응답으로부터 이 인증 요청만을 사용합니다.",
+       "api-help-authmanagerhelper-request": "<kbd>amirequestsfor=$1</kbd>을(를) 지정하여 <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>가 반환한 <samp>id</samp>를 통해 이 인증 요청을 사용합니다.",
        "api-help-authmanagerhelper-messageformat": "반환 메시지에 사용할 형식.",
-       "api-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 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 보고를 해 주시기 바랍니다."
+       "api-help-authmanagerhelper-mergerequestfields": "모든 인증 요청에 대한 필드 정보를 하나의 배열로 합칩니다.",
+       "api-help-authmanagerhelper-preservestate": "가능하면 과거에 실패한 로그인 시도의 상태를 보존합니다.",
+       "api-help-authmanagerhelper-continue": "이 요청은 초기 <samp>UI</samp> 또는 <samp>REDIRECT</samp> 응답 이후에 계속됩니다. 이것 또는 <var>$1returnurl</var> 중 하나가 필요합니다.",
+       "api-help-authmanagerhelper-additional-params": "이 모듈은 사용 가능한 인증 요청에 따라 추가 변수를 허용합니다. 사용 가능한 요청 및 사용되는 필드를 결정하려면 <kbd>amirequestsfor=$1</kbd>(또는 해당되는 경우 이 모듈의 과거 응답)과 함께 <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>을(를) 사용하십시오.",
+       "apierror-articleexists": "작성하려는 문서가 이미 만들어져 있습니다.",
+       "apierror-autoblocked": "사용자의 IP 주소는 차단된 사용자에 의해 사용되었으므로 자동으로 차단된 상태입니다.",
+       "apierror-badgenerator-unknown": "알 수 없는 <kbd>generator=$1</kbd>.",
+       "apierror-badip": "IP 변수가 유효하지 않습니다.",
+       "apierror-badmd5": "제공된 MD5 해시가 잘못되었습니다.",
+       "apierror-badmodule-badsubmodule": "<kbd>$1</kbd> 모듈에 \"$2\" 하위 모듈이 없습니다.",
+       "apierror-badmodule-nosubmodules": "<kbd>$1</kbd> 모듈은 하위 모듈이 없습니다.",
+       "apierror-badquery": "유효하지 않은 쿼리입니다.",
+       "apierror-badtoken": "잘못된 CSRF 토큰.",
+       "apierror-blockedfrommail": "이메일 보내기에서 차단되어 있습니다.",
+       "apierror-blocked": "편집에서 차단되어 있습니다.",
+       "apierror-botsnotsupported": "이 인터페이스는 봇을 위해 지원되지 않습니다.",
+       "apierror-cannotviewtitle": "$1을(를) 볼 권한이 없습니다.",
+       "apierror-cantblock": "사용자를 차단할 권한이 없습니다.",
+       "apierror-canthide": "차단 기록에서 사용자 이름을 숨길 권한이 없습니다.",
+       "apierror-cantimport-upload": "업로드된 페이지를 가져올 권한이 없습니다.",
+       "apierror-cantimport": "페이지를 가져올 권한이 없습니다.",
+       "apierror-cantsend": "로그인하지 않았거나 인증된 이메일 주소가 없거나 다른 사용자로 이메일을 보낼 권한이 없기 때문에 이메일을 보낼 수 없습니다.",
+       "apierror-databaseerror": "[$1] 데이터베이스 쿼리 오류.",
+       "apierror-emptynewsection": "비어있는 새 문단을 만들 수 없습니다.",
+       "apierror-emptypage": "새 문서로 빈 문서를 만들 수 없습니다.",
+       "apierror-exceptioncaught": "[$1] 예외가 발생했습니다: $2",
+       "apierror-filedoesnotexist": "파일이 존재하지 않습니다.",
+       "apierror-filenopath": "로컬 파일 경로를 가져올 수 없습니다.",
+       "apierror-import-unknownerror": "알 수 없는 가져오기 오류: $1.",
+       "apierror-invalidcategory": "입력한 분류 이름이 올바르지 않습니다.",
+       "apierror-invalid-file-key": "유효한 파일 키가 아닙니다.",
+       "apierror-invalidoldimage": "oldimage 변수에 유효하지 않은 형식이 있습니다.",
+       "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd> 변수는 <kbd>$2</kbd>와(과) 함께 사용할 수 없습니다.",
+       "apierror-invalidsha1base36hash": "제공된 SHA1Base36 해시가 유효하지 않습니다.",
+       "apierror-invalidsha1hash": "제공된 SHA1 해시가 유효하지 않습니다.",
+       "apierror-invalidtitle": "잘못된 제목 \"$1\".",
+       "apierror-invaliduser": "잘못된 사용자 이름 \"$1\".",
+       "apierror-invaliduserid": "<var>$1</var> 사용자 ID는 유효하지 않습니다.",
+       "apierror-maxlag-generic": "데이터베이스 서버 대기 중: $1 {{PLURAL:$1|초}} 지연되었습니다.",
+       "apierror-maxlag": "$2 대기 중: $1 {{PLURAL:$1|초}} 지연되었습니다.",
+       "apierror-missingparam": "<var>$1</var> 변수는 설정해야 합니다.",
+       "apierror-missingtitle": "지정한 페이지가 존재하지 않습니다.",
+       "apierror-missingtitle-byname": "$1 문서가 존재하지 않습니다.",
+       "apierror-moduledisabled": "<kbd>$1</kbd> 모듈은 비활성화되었습니다.",
+       "apierror-mustbeloggedin-generic": "로그인해야 합니다.",
+       "apierror-mustbeloggedin-linkaccounts": "계정을 연결하려면 로그인해야 합니다.",
+       "apierror-mustbeloggedin": "$1에 로그인해야 합니다.",
+       "apierror-mustbeposted": "<kbd>$1</kbd> 모듈은 POST 요청이 필요합니다.",
+       "apierror-noedit-anon": "익명 사용자는 문서를 편집할 수 없습니다.",
+       "apierror-noedit": "문서를 편집할 권한이 없습니다.",
+       "apierror-noimageredirect": "그림 넘겨주기를 만들 권한이 없습니다.",
+       "apierror-nosuchrevid": "ID $1에 해당하는 판이 없습니다.",
+       "apierror-nosuchuserid": "ID $1에 해당하는 사용자가 없습니다.",
+       "apierror-notarget": "이 작업을 위한 유효한 대상을 지정하지 않았습니다.",
+       "apierror-pagecannotexist": "이름공간은 실제 페이지를 허용하지 않습니다.",
+       "apierror-pagelang-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.",
+       "apierror-permissiondenied": "$1에 대한 권한이 없습니다.",
+       "apierror-permissiondenied-generic": "권한이 없습니다.",
+       "apierror-permissiondenied-unblock": "사용자의 차단을 해제할 권한이 없습니다.",
+       "apierror-protect-invalidaction": "잘못된 보호 유형 \"$1\".",
+       "apierror-protect-invalidlevel": "잘못된 보호 수준 \"$1\".",
+       "apierror-ratelimited": "속도 제한을 초과했습니다. 잠시 기다렸다가 다시 시도하십시오.",
+       "apierror-readapidenied": "이 모듈을 사용하려면 읽기 권한이 필요합니다.",
+       "apierror-readonly": "위키는 현재 읽기 전용 모드입니다.",
+       "apierror-revwrongpage": "r$1은(는) $2의 판이 아닙니다.",
+       "apierror-specialpage-cantexecute": "특수 문서의 결과를 볼 권한이 없습니다.",
+       "apierror-stashwrongowner": "잘못된 소유자: $1",
+       "apierror-systemblocked": "당신은 미디어위키에 의해서 자동으로 차단되었습니다.",
+       "apierror-unknownerror-editpage": "알 수 없는 EditPage 오류: $1.",
+       "apierror-unknownerror-nocode": "알 수 없는 오류.",
+       "apierror-unknownerror": "알 수 없는 오류: \"$1\"",
+       "apierror-unknownformat": "인식되지 않는 형식 \"$1\".",
+       "apierror-unsupportedrepo": "로컬 파일 저장소는 모든 그림의 조회를 지원하지 않습니다.",
+       "apierror-upload-missingresult": "상태 데이터에 결과가 없습니다.",
+       "apierror-writeapidenied": "API를 통해 이 위키를 편집할 권한이 없습니다.",
+       "apiwarn-deprecation-httpsexpected": "HTTPS를 예측하였으나 HTTP가 사용되었습니다.",
+       "apiwarn-difftohidden": "r$1에 대한 차이를 만들 수 없습니다: 내용이 숨겨져 있습니다.",
+       "apiwarn-invalidcategory": "\"$1\"은(는) 분류가 아닙니다.",
+       "apiwarn-invalidtitle": "\"$1\"은(는) 올바른 제목이 아닙니다.",
+       "apiwarn-invalidxmlstylesheetns": "스타일시트는 {{ns:MediaWiki}} 이름공간에 있어야 합니다.",
+       "apiwarn-notfile": "\"$1\"은(는) 파일이 아닙니다.",
+       "apiwarn-unsupportedarray": "<var>$1</var> 변수는 지원되지 않는 PHP 배열 문법을 사용합니다.",
+       "apiwarn-validationfailed-keytoolong": "키가 너무 깁니다. ($1 바이트 이상 허용하지 않습니다)",
+       "api-feed-error-title": "오류 ($1)",
+       "api-usage-docref": "API 사용법을 보려면 $1을(를) 참고하십시오.",
+       "api-credits-header": "크레딧",
+       "api-credits": "API 개발자:\n* Yuri Astrakhan (만든이, 선임 개발자 2006년 9월~2007년 9월)\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시고,\n버그 보고는 https://phabricator.wikimedia.org/ 에 해주시기 바랍니다."
 }
index 47b79ab..a803645 100644 (file)
@@ -8,7 +8,7 @@
        "apihelp-main-param-assertuser": "Iwwerpréifen ob den aktuelle Benotzer de Benotzer mat deem Numm ass.",
        "apihelp-main-param-curtimestamp": "Den aktuellen Zäitstempel an d'Resultat integréieren.",
        "apihelp-block-description": "E Benotzer spären.",
-       "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich deen Dir späre wëllt.",
+       "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich fir ze spären. Kann net zesumme mat <var>$1userid</var> benotzt ginn.",
        "apihelp-block-param-reason": "Grond fir ze spären.",
        "apihelp-block-param-anononly": "Nëmmen anonym Benotzer spären (z. Bsp. anonym Ännerunge vun dëser IP-Adress ausschalten)",
        "apihelp-block-param-nocreate": "Opmaache vun engem Benotzerkont verhënneren.",
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
        "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.",
        "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren",
+       "apihelp-setpagelanguage-description": "D'Sprooch vun enger Säit änneren",
+       "apihelp-setpagelanguage-param-reason": "Grond fir d'Ännerung.",
+       "apihelp-setpagelanguage-example-language": "Ännert d'Sprooch vun der <kbd>Main Page</kbd> op baskesch.",
        "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.",
        "apihelp-stashedit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
        "apihelp-stashedit-param-text": "Inhalt vun der Säit",
        "apihelp-userrights-param-user": "Benotzernumm.",
        "apihelp-userrights-param-userid": "Benotzer Id.",
        "apihelp-userrights-param-reason": "Grond fir d'Ännerung.",
+       "apihelp-validatepassword-param-password": "Passwuert fir ze validéieren.",
+       "apihelp-validatepassword-example-1": "Validéiert d'Passwuert <kbd>foobar</kbd> fir den aktuelle Benotzer.",
        "apihelp-watch-example-watch": "D'Säit <kbd>Main Page</kbd> iwwerwaachen.",
        "api-help-source": "Quell: $1",
        "api-help-source-unknown": "Quell: <span class=\"apihelp-unknown\">onbekannt</span>",
        "api-help-param-type-user": "Typ: {{PLURAL:$1|1=Benotzernumm|2=Lëscht vu Benotzernimm}}",
        "api-help-examples": "{{PLURAL:$1|Beispill|Beispiler}}:",
        "api-help-permissions": "{{PLURAL:$1|Autorisatioun|Autorisatiounen}}:",
-       "api-help-open-in-apisandbox": "<small>[an der Sandkëscht opmaachen]</small>"
+       "api-help-open-in-apisandbox": "<small>[an der Sandkëscht opmaachen]</small>",
+       "apierror-articleexists": "Den Artikel deen dir probéiert hutt unzeleeë gouf schonn ugeluecht.",
+       "apierror-autoblocked": "Är IP-Adress gouf automatesch gespaart well se vun engem gespaarte Benotzer benotzt gouf.",
+       "apierror-badip": "IP-Parameter ass net valabel.",
+       "apierror-cantblock": "Dir hutt net d'Recht fir Benotzer ze spären.",
+       "apierror-cantimport": "Dir hutt net déi néideg Rechter fir Säiten z'importéieren.",
+       "apierror-copyuploadbadurl": "D'Eroplueden ass vun dëser URL net erlaabt.",
+       "apierror-filetypecannotberotated": "Den Typ vu Fichier kann net rotéiert ginn.",
+       "apierror-import-unknownerror": "Onbekannte Feeler beim Import: $1\nf",
+       "apierror-invalidcategory": "Den Numm vun der Kategorie deen Dir aginn hutt ass net valabel.",
+       "apierror-invalidtitle": "Schlechten Titel \"$1\".",
+       "apierror-invaliduserid": "Benotzer ID <var>$1</var> ass net valabel.",
+       "apierror-missingtitle": "D'Säit déi Dir spezifizéiert hutt gëtt et net.",
+       "apierror-missingtitle-byname": "D'Säit $1 gëtt et net.",
+       "apierror-moduledisabled": "De(n) <kbd>$1</kbd> Modul gouf ausgeschalt.",
+       "apierror-mustbeloggedin-generic": "Dir musst ageloggt sinn.",
+       "apierror-nochanges": "Et goufe keng Ännerungen ugefrot.",
+       "apierror-nodeleteablefile": "Et gëtt keng esou al Versioun vum Fichier.",
+       "apierror-noedit": "Dir hutt net déi néideg Rechter fir Säiten z'änneren.",
+       "apierror-nosuchuserid": "Et gëtt kee Benotzer mat der ID $1.",
+       "apierror-notarget": "Dir hutt kee valabelt Zil fir dës Aktioun spezifizéiert.",
+       "apierror-notpatrollable": "D'Versioun r$1 kann net nogekuckt gi well se ze al ass.",
+       "apierror-pagecannotexist": "Nummraum erlaabt keng aktuell Säiten.",
+       "apierror-pagelang-disabled": "D'Ännere vun der Sprooch vun enger Säit ass op dëser Wiki net erlaabt.",
+       "apierror-permissiondenied-generic": "Autorisatioun refuséiert.",
+       "apierror-permissiondenied-unblock": "Dir hutt net d'Recht fir d'Spär vu Benotzer opzehiewen.",
+       "apierror-readonly": "D'Wiki kann elo just geliest ginn.",
+       "apierror-revwrongpage": "r$1 ass keng Versioun vu(n) $2.",
+       "apierror-stashwrongowner": "Falsche Besëtzer: $1",
+       "apierror-systemblocked": "Dir gouft automatesch vu MediaWiki gespaart.",
+       "apierror-unknownerror-editpage": "Onbekannten EditPage-Feeler: $1",
+       "apierror-unknownerror-nocode": "Onbekannte Feeler.",
+       "apierror-unknownerror": "Onbekannte Feeler: \"$1\".",
+       "apierror-unknownformat": "Net-erkannte Format \"$1\".",
+       "apierror-unrecognizedparams": "Net {{PLURAL:$2|erkannte Parameter|erkannt Parameteren}}: $1",
+       "apierror-writeapidenied": "Dir däerft dës Wiki net iwwer den API ännneren.",
+       "apiwarn-invalidcategory": "\"$1\" ass keng Kategorie.",
+       "apiwarn-invalidtitle": "\"$1\" ass kee valabelen Titel",
+       "apiwarn-notfile": "\"$1\" ass kee Fichier.",
+       "apiwarn-tokennotallowed": "Aktioun \"$1\" ass net erlaabt fir den aktuelle Benotzer.",
+       "apiwarn-validationfailed-badpref": "keng valabel Astellung",
+       "api-feed-error-title": "Feeler ($1)"
 }
index 5ea8613..45680f4 100644 (file)
        "apihelp-feedrecentchanges-param-hidecategorization": "Ascondi e variaçioin d'apartegninça a-e categorie.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtra pe etichetta.",
        "apihelp-feedrecentchanges-param-target": "Mostra solo e modifiche a-e paggine collegæ da questa paggina.",
-       "apihelp-feedrecentchanges-param-showlinkedto": "Fanni védde sôlo i cangiaménti a-e pàggine colegæ a-a quella speçificâ",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Fanni védde sôlo i cangiaménti a-e pàggine conligæ a-a quella speçificâ",
        "apihelp-feedrecentchanges-param-categories": "Mostra solo e variaçioin in sce-e paggine de tutte queste categorie.",
        "apihelp-feedrecentchanges-param-categories_any": "Mostra invece solo e variaçioin in sce-e paggine inte 'na qualonque categoria.",
        "apihelp-feedrecentchanges-example-simple": "Mostra i urtime modiffiche.",
        "apihelp-import-param-namespace": "Importa inte questo namespace. O no poeu ese doeuviou insemme a <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importa comme sottopaggina de questa paggina. O no poeu ese doeuviou insemme a <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] into namespace 100 con cronologia completa.",
-       "apihelp-linkaccount-description": "Colegamento de 'n'utença de 'n provider de terçe parte a l'utente corente.",
+       "apihelp-linkaccount-description": "Conligamento de 'n'utença de 'n provider de terçe parte a l'utente corente.",
        "apihelp-linkaccount-example-link": "Avvia o processo de collegamento a 'n'utença da <kbd>Example</kbd>.",
        "apihelp-login-description": "Accedi e otegni i cookie d'aotenticaçion.\n\nQuest'açion dev'ese doeuviâ escluxivamente in combinaçion con [[Special:BotPasswords]]; doeuviâla pe l'accesso a l'account prinçipâ o l'è deprecou e o poeu fallî sença preaviso. Pe acedere in moddo seguo a l'utença prinçipâ, doeuvia <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-description-nobotpasswords": "Accedi e otegni i cookies d'aotenticaçion.\n\nQuest'açion a l'è deprecâ e a poeu fallî sença preaviso. Pe acede in moddo seguo, doeuvia [[Special:ApiHelp/clientlogin|action=clientlogin]].",
index 25012ba..0935c59 100644 (file)
        "apihelp-options-example-complex": "Nustatyti visus pageidavimus iš naujo, tada nustatyti <kbd>skin</kbd> ir <kbd>nickname</kbd>.",
        "apihelp-paraminfo-description": "Gauti informaciją apie API modulius.",
        "apihelp-protect-example-protect": "Apsaugoti puslapį.",
+       "apihelp-query-param-list": "Kurios sąrašus gauti.",
+       "apihelp-query-param-meta": "Kokius metaduomenis gauti.",
        "apihelp-query+allcategories-param-dir": "Rūšiavimo kryptis.",
        "apihelp-query+allcategories-param-min": "Gražinti tik kategorijas, kuriuose yra bent tiek narių.",
        "apihelp-query+allcategories-param-max": "Gražinti tik kategorijas, kuriuose yra iki tiek narių.",
        "apihelp-query+allcategories-param-limit": "Kiek kategorijų gražinti.",
        "apihelp-query+allcategories-paramvalue-prop-size": "Prideda puslapių kategorijoje skaičių.",
+       "apihelp-query+alldeletedrevisions-param-from": "Pradėti sąrašą šiuo pavadinimu.",
+       "apihelp-query+alldeletedrevisions-param-to": "Sustabdyti sąrašą ties šiuo pavadinimu.",
        "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Prideda failo pavadinimą.",
        "apihelp-query+allfileusages-param-limit": "Kiek iš viso gražinti objektų.",
+       "apihelp-query+allfileusages-example-unique": "Pateikti unikalius failų pavadinimus.",
+       "apihelp-query+allfileusages-example-unique-generator": "Gauna visus failų pavadinimus, paženklinant trūkstamus.",
        "apihelp-query+allfileusages-example-generator": "Gauti puslapius, kuriuose yra failai.",
+       "apihelp-query+allimages-param-sort": "Pagal ką rūšiuoti.",
        "apihelp-query+allimages-param-limit": "Kiek iš viso gražinti paveikslėlių.",
        "apihelp-query+allimages-example-B": "Rodyti failų sąrašą, pradedant raide <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Rodyti neseniai įkeltų failų sąrašą, panašu į [[Special:NewFiles]].",
        "apihelp-query+logevents-param-prop": "Kurias savybes gauti:",
        "apihelp-query+logevents-paramvalue-prop-ids": "Prideda žurnalo įvykio ID.",
        "apihelp-query+logevents-paramvalue-prop-type": "Prideda žurnalo įvykio tipą.",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "Kiekvieno puslapio ID.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Kiekvieno puslapio pavadinimas.",
+       "apihelp-query+transcludedin-param-limit": "Kiek gražinti.",
+       "apihelp-query+usercontribs-description": "Gauti visus vartotojo keitimus.",
+       "apihelp-query+usercontribs-param-limit": "Maksimalus gražinamų įnašų skaičius.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Prideda keitimo komentarą.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Prideda naują keitimo dydį.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Prideda vartotojo tikrą vardą.",
+       "apihelp-query+userinfo-example-simple": "Gauti informacijos apie dabartinį vartotoją.",
+       "apihelp-query+userinfo-example-data": "Gauti papildomos informacijos apie dabartinį vartotoją.",
+       "apihelp-query+users-description": "Gauti informacijos apie vartotojų sąrašą.",
+       "apihelp-query+users-param-prop": "Kokią informaciją įtraukti:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "Pažymi ar vartotojas užblokuotas, kas tai padarė ir dėl kokios priežasties.",
+       "apihelp-query+users-paramvalue-prop-groups": "Nurodo grupes, kurioms priklauso kiekvienas vartotojas.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Nurodo visas grupes, kuriuose vartotojas yra automatiškai kaip narys.",
+       "apihelp-query+users-paramvalue-prop-rights": "Nurodo visas teises, kurias turi kiekvienas vartotojas.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Prideda vartotojo keitimų skaičių.",
+       "apihelp-query+users-paramvalue-prop-registration": "Prideda vartotojo registracijos laiko žymę.",
+       "apihelp-query+users-param-users": "Sąrašas vartotojų, kurių informaciją gauti.",
+       "apihelp-query+users-param-userids": "Vartotojų ID sąrašas, kurių informaciją gauti:",
+       "apihelp-query+users-param-token": "Vietoj to naudoti <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+users-example-simple": "Gražinti informaciją apie vartotoją <kbd>Example</kbd>.",
+       "apihelp-query+watchlist-param-user": "Nurodyti tik pakeitimus, atliktus šio vartotojo.",
+       "apihelp-query+watchlist-param-excludeuser": "Nenurodyti pakeitimų, kuriuos atliko šis vartotojas.",
+       "apihelp-query+watchlist-param-limit": "Kiek viso rezultatų gražinti vienai užklausai.",
+       "apihelp-query+watchlist-param-prop": "Kokias papildomas savybes gauti:",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Prideda puslapio pavadinimą.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Prideda naują vartotoją, kuris atliko pakeitimą.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Prideda vartotojo ID, kuris atliko pakeitimą.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Prideda keitimo komentarą.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Prideda keitimo laiko žymę.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Prideda naują ir seną puslapio ilgius.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Prideda laiko žymę, kada vartotojui buvo pranešta apie pakeitimą.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Prideda žurnalo informaciją, kai reikia.",
+       "apihelp-query+watchlist-param-type": "Kokios keitimų tipus rodyti:",
        "apihelp-query+watchlist-paramvalue-type-external": "Išoriniai keitimai.",
        "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Žurnalo įrašai.",
+       "apihelp-resetpassword-param-user": "Iš naujo nustatomas vartotojas.",
+       "apihelp-resetpassword-param-email": "Iš naujo nustatomo vartotojo el. pašto adresas.",
+       "apihelp-setpagelanguage-description": "Keisti puslapio kalbą.",
+       "apihelp-setpagelanguage-param-reason": "Keitimo priežastis.",
        "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
        "apihelp-stashedit-param-sectiontitle": "Naujo skyriaus pavadinimas.",
        "apihelp-stashedit-param-text": "Puslapio turinys.",
-       "api-format-prettyprint-status": "Šis atsakymas būtų gražintas su HTTP statusu $1 $2."
+       "apihelp-stashedit-param-summary": "Keisti santrauką.",
+       "apihelp-tag-param-reason": "Keitimo priežastis.",
+       "apihelp-unblock-description": "Atblokuoti naudotoją.",
+       "apihelp-unblock-param-reason": "Atblokavimo priežastis.",
+       "apihelp-unblock-example-id": "Atblokuoti blokavimo ID #<kbd>105</kbd>.",
+       "apihelp-unblock-example-user": "Atblokuoti vartoją <kbd>Bob</kbd> su priežastimi <kbd>Sorry Bob</kbd>.",
+       "apihelp-undelete-param-title": "Atkuriamo puslapio pavadinimas.",
+       "apihelp-undelete-param-reason": "Atkūrimo priežastis.",
+       "apihelp-undelete-example-page": "Atkurti puslapį <kbd>Main Page</kbd>.",
+       "apihelp-upload-param-watch": "Stebėti šį puslapį.",
+       "apihelp-upload-param-ignorewarnings": "Ignuoruoti bet kokius įspėjimus.",
+       "apihelp-upload-param-file": "Failo turinys.",
+       "apihelp-upload-param-url": "URL, iš kurio gauti failą.",
+       "apihelp-upload-example-url": "Įkelti iš URL.",
+       "apihelp-upload-example-filekey": "Baigti įkėlimą, kuris nepavyko dėl įspėjimų.",
+       "apihelp-userrights-description": "Keisti vartotoju grupės narystę.",
+       "apihelp-userrights-param-user": "Vartotojo vardas.",
+       "apihelp-userrights-param-userid": "Vartotojo ID.",
+       "apihelp-userrights-param-add": "Pridėti vartotoją į šias grupes.",
+       "apihelp-userrights-param-remove": "Pašalinti vartotoją iš šių grupių.",
+       "apihelp-userrights-param-reason": "Keitimo priežastis.",
+       "apihelp-watch-description": "Pridėti ar pašalinti puslapius iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-watch-example-watch": "Stebėti puslapį <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-unwatch": "Nebestebėti puslapio <kbd>Main Page</kbd>.",
+       "api-format-title": "MedijaViki API rezultatas",
+       "api-format-prettyprint-status": "Šis atsakymas būtų gražintas su HTTP statusu $1 $2.",
+       "api-help-title": "MedijaViki API pagalba",
+       "api-help-main-header": "Pagrindinis modulis",
+       "api-help-source": "Šaltinis: $1",
+       "api-help-source-unknown": "Šaltinis: <span class=\"apihelp-unknown\">nežinomas</span>",
+       "api-help-license": "Licencija: [[$1|$2]]",
+       "api-help-license-noname": "Licencija: [[$1|Žiūrėti nuorodą]]",
+       "api-help-license-unknown": "Licencija: <span class=\"apihelp-unknown\">nežinoma</span>",
+       "api-help-parameters": "{{PLURAL:$1|Parametras|Parametrai}}:",
+       "api-help-param-required": "Šis parametras yra reikalingas.",
+       "api-help-datatypes-header": "Duomenų tipai",
+       "api-help-param-limit": "Leidžiama ne daugiau nei $1.",
+       "api-help-param-limit2": "Leidžiama ne daugiau nei $1 ($2 robotams).",
+       "api-help-param-default": "Numatytasis: $1",
+       "api-help-param-default-empty": "Numatytasis: <span class=\"apihelp-empty\">(tuščia)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(nėra aprašymo)</span>",
+       "api-help-examples": "{{PLURAL:$1|Pavyzdys|Pavyzdžiai}}:",
+       "api-help-permissions": "{{PLURAL:$1|Leidimas|Leidimai}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Suteikta}}: $2",
+       "apierror-articleexists": "Straipsnis, kurį bandėte sukurti, jau yra sukurtas.",
+       "apierror-autoblocked": "Jūsų IP adresas buvo automatiškai užblokuotas, nes jis buvo naudojamas užblokuoto vartotojo.",
+       "apierror-badgenerator-unknown": "Nežinomas <kbd>generator=$1</kbd>.",
+       "apierror-badip": "IP parametras negalimas.",
+       "apierror-badquery": "Negalima užklausa.",
+       "apierror-badurl": "Negalima reikšmė „$2“ URL parametrui <var>$1</var>.",
+       "apierror-blockedfrommail": "Jus buvote užblokuotas nuo el. laiško siuntimo.",
+       "apierror-blocked": "Jus buvote užblokuotas nuo redagavimo.",
+       "apierror-botsnotsupported": "Ši sąsaja negali būti palaikoma robotams.",
+       "apierror-cannotreauthenticate": "Veiksmas negalimas, nes jūsų tapatybė negali būti patvirtinta.",
+       "apierror-cannotviewtitle": "Jūs negalite peržiūrėti $1.",
+       "apierror-cantblock": "Neturite teisės blokuoti vartotojus.",
+       "apierror-cantchangecontentmodel": "Neturite teisės pakeisti puslapio turinio modelį.",
+       "apierror-cantimport-upload": "Neturite teisės importuoti įkeltų puslapių.",
+       "apierror-cantimport": "Neturite teisės importuoti puslapių.",
+       "apierror-copyuploadbadurl": "Įkėlimas neleidžiamas iš šio URL.",
+       "apierror-databaseerror": "[$1] Duomenų bazės užklausos klaida.",
+       "apierror-emptynewsection": "Neįmanoma kurti naujų tuščių skyrių.",
+       "apierror-filedoesnotexist": "Failas neegzistuoja.",
+       "apierror-filetypecannotberotated": "Failo tipas negali būti pasuktas.",
+       "apierror-import-unknownerror": "Nežinoma klaida importuojant: $1.",
+       "apierror-invalidcategory": "Kategorijos pavadinimas, kurį įvedėte, yra negalimas.",
+       "apierror-invalidparammix": "{{PLURAL:$2|parametrai}} $1 negali būti naudojami kartu.",
+       "apierror-invalidtitle": "Blogas pavadinimas „$1“.",
+       "apierror-invaliduser": "Negalimas vartotojo vardas „$1“.",
+       "apierror-invaliduserid": "Vartotojo ID <var>$1</var> nėra galimas.",
+       "apierror-missingtitle": "Puslapis, kurį nurodėte, neegzistuoja.",
+       "apierror-missingtitle-byname": "Puslapis $1 neegzistuoja",
+       "apierror-multpages": "<var>$1</var> gali būti naudojamas tik su vienu puslapiu.",
+       "apierror-mustbeloggedin-generic": "Turite būti prisijungęs.",
+       "apierror-mustbeloggedin-linkaccounts": "Turite būti prisijungęs, kad galėtumėte susieti paskyras.",
+       "apierror-mustbeloggedin": "Turite būti prisijungęs, kad $1.",
+       "apierror-nochanges": "Neprašyta jokių keitimų.",
+       "apierror-noedit-anon": "Anoniminiai vartotojai negali redaguoti puslapių.",
+       "apierror-noedit": "Neturite teisės redaguoti puslapius.",
+       "apierror-nosuchlogid": "Nėra žurnalo įrašo su ID $1.",
+       "apierror-nosuchpageid": "Nėra puslapio su ID $1.",
+       "apierror-nosuchsection": "Nėra skyriaus $1.",
+       "apierror-nosuchsection-what": "$2 nėra sekcijos $1.",
+       "apierror-nosuchuserid": "Nėra vartotojo su ID $1.",
+       "apierror-pagelang-disabled": "Puslapio kalbos keitimas nėra leidžiamas šioje viki.",
+       "apierror-paramempty": "Parametras <var>$1</var> negali būti tusčiau.",
+       "apierror-permissiondenied": "Neturite leidimo $1.",
+       "apierror-permissiondenied-generic": "Teisė nesuteikta.",
+       "apierror-protect-invalidaction": "Negalimas apsaugos tipas „$1“.",
+       "apierror-protect-invalidlevel": "Negalimas apsaugos lygis „$1“.",
+       "apierror-readonly": "Viki šiuo metu yra skaitymo režime.",
+       "apierror-sectionreplacefailed": "Nepavyko sujungti atnaujinto skyriaus.",
+       "apierror-specialpage-cantexecute": "Neturite teisės peržiūrėti šio specialaus puslapio rezultatus.",
+       "apierror-stashwrongowner": "Neteisingas savininkas: $1",
+       "apierror-unknownerror-nocode": "Nežinoma klaida.",
+       "apierror-unknownerror": "Nežinoma klaida: „$1“.",
+       "apierror-unknownformat": "Neatpažintas formatas „$1“.",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|Neatpažintas parametras|Neatpažinti parametrai}}: $1.",
+       "apierror-writeapidenied": "Negalite redaguoti šios viki per API.",
+       "apiwarn-deprecation-httpsexpected": "panaudotas HTTP, kai buvo tikėtasi HTTPS.",
+       "apiwarn-invalidcategory": "„$1“ nėra kategorija.",
+       "apiwarn-invalidtitle": "„$1“ nėra galimas pavadinimas.",
+       "apiwarn-notfile": "„$1“ nėra failas.",
+       "apiwarn-tokennotallowed": "Veiksmas „$1“ nėra leidžiamas dabartiniam vartotojui.",
+       "apiwarn-validationfailed-badpref": "negalimas nustatymas.",
+       "apiwarn-validationfailed": "Patvirtinimo klaida skirta <kbd>$1</kbd>: $2",
+       "api-feed-error-title": "Klaida ($1)",
+       "api-credits-header": "Kreditai"
 }
index b163c22..6c90a3e 100644 (file)
@@ -9,5 +9,6 @@
        "apihelp-block-param-reason": "Bloķēšanas iemesls:",
        "apihelp-delete-description": "Dzēst lapas",
        "apihelp-emailuser-description": "Sūtīt e-pastu lietotājam",
-       "apihelp-userrights-param-userid": "Lietotāja ID:"
+       "apihelp-userrights-param-userid": "Lietotāja ID:",
+       "apierror-nosuchuserid": "Nav lietotāja ar ID $1."
 }
index 8240e08..3abfdeb 100644 (file)
@@ -8,7 +8,7 @@
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документација]]\n*  [[mw:API:FAQ|ЧПП]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на  [[mw:API:Errors_and_warnings|Извршник: Грешки и предупредувања]].",
        "apihelp-main-param-action": "Кое дејство да се изврши.",
        "apihelp-main-param-format": "Формат на изводот.",
-       "apihelp-main-param-maxlag": "Ð\9cакÑ\81ималниоÑ\82 заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код <samp>maxlag</samp> со порака од обликот <samp>Го чекам $host: има заостаток од $lag секунди</samp>.<br />Погл. [[mw:Manual:Maxlag_parameter|Прирачник: Параметар Maxlag]]",
+       "apihelp-main-param-maxlag": "Ð\9dаÑ\98големиоÑ\82 Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ен заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код <samp>maxlag</samp> со порака од обликот <samp>Го чекам $host: има заостаток од $lag секунди</samp>.<br />Погл. [[mw:Manual:Maxlag_parameter|Прирачник: Параметар Maxlag]]",
        "apihelp-main-param-smaxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-maxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено <kbd>user</kbd> или дали го има корисничкото право на бот, ако е зададено <kbd>bot</kbd>.",
        "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
        "apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
        "apihelp-feedrecentchanges-param-days": "На кои денови да се ограничат резултатите.",
-       "apihelp-feedrecentchanges-param-limit": "Ð\9cакÑ\81ималниоÑ\82 Ð±Ñ\80оÑ\98 Ð½Ð° Ñ\80езÑ\83лÑ\82аÑ\82и за прикажување.",
+       "apihelp-feedrecentchanges-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\81Ñ\82авки Ð²Ð¾ Ð¸Ñ\81Ñ\85одоÑ\82 за прикажување.",
        "apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
        "apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
        "apihelp-feedrecentchanges-param-hidebots": "Скриј ги промените напарвени од ботови.",
        "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
-       "apihelp-opensearch-param-limit": "Ð\9cакÑ\81ималниоÑ\82 Ð±Ñ\80оÑ\98 Ð½Ð° резултати за прикажување.",
+       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе резултати за прикажување.",
        "apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
        "apihelp-opensearch-param-suggest": "Не прави ништо ако <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> е неточно.",
        "apihelp-opensearch-param-redirects": "Како да се работи со пренасочувања:\n;return: Дај го самото пренасочување.\n;resolve: Дај ја целната страница. Може да даде помалку од $1limit резултати.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
        "apihelp-phpfm-description": "Давај го изводот во серијализиран PHP-формат (подобрен испис во HTML).",
        "apihelp-rawfm-description": "Давај го изводот со елементи за отстранување грешки во JSON-формат (подобрен испис во HTML).",
        "apihelp-xml-description": "Давај го изводот во XML-формат.",
-       "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:mediawiki}}“ што ќе завршува со <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
        "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
        "api-format-title": "Резултат од Извршникот на МедијаВики",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Вредноста мора да изнесува|2=Вредностите мораат да изнесуваат}} помеѓу $2 и $3.",
        "api-help-param-upload": "Мора да биде објавено како податотечно подигање користејќи податоци кои се повеќеделни или од образец.",
        "api-help-param-multi-separate": "Одделувајте ги вредностите со <kbd>|</kbd>.",
-       "api-help-param-multi-max": "Ð\9cакÑ\81ималниоÑ\82 Ð±Ñ\80оÑ\98 Ð½Ð° Ð²Ñ\80едноÑ\81Ñ\82и Ð¸Ð·Ð½ÐµÑ\81Ñ\83ва {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} за ботови).",
+       "api-help-param-multi-max": "Ð\9dаÑ\98веÑ\9cе Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ени Ð²Ñ\80едноÑ\81Ñ\82и: {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} за ботови).",
        "api-help-param-default": "По основно: $1",
        "api-help-param-default-empty": "По основно: <span class=\"apihelp-empty\">(празно)</span>",
        "api-help-param-token": "Шифра „$1“ добиена од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-disabled-in-miser-mode": "Исклучено поради [[mw:Manual:$wgMiserMode|скржавиот режим]].",
        "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> резултати пред да продолжите; во крајни случаи може да не добиете ниеден резултат.",
        "api-help-param-direction": "Во која насока да се набројува:\n;понови:Прво најстарите. Напомена: $1start мора да биде пред $1end.\n;постари:Прво најновите (по основно). Напомена: $1start мора да биде подоцна од $1end.",
-       "api-help-param-continue": "УпоÑ\82Ñ\80ебеÑ\82е Ð³Ð¾ Ð¾Ð²Ð° Ð·Ð° Ð´Ð° Ð¿Ñ\80одолжиÑ\82е ÐºÐ¾Ð³Ð° Ð¸Ð¼Ð° Ð¿Ð¾Ð²ÐµÑ\9cе Ñ\80аÑ\81положиви Ñ\80езÑ\83лÑ\82аÑ\82и.",
+       "api-help-param-continue": "УпоÑ\82Ñ\80ебеÑ\82е Ð³Ð¾ Ð¾Ð²Ð° Ð·Ð° Ð´Ð° Ð¿Ñ\80одолжиÑ\82е ÐºÐ¾Ð³Ð° Ð¸Ð¼Ð° Ð¿Ð¾Ð²ÐµÑ\9cе Ñ\80аÑ\81положиви Ñ\81Ñ\82авки.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
        "api-help-examples": "{{PLURAL:$1|Пример|Примери}}:",
        "api-help-permissions": "{{PLURAL:$1|Дозвола|Дозволи}}:",
index 3df95e7..6506036 100644 (file)
@@ -4,9 +4,12 @@
                        "Jeblad",
                        "Chameleon222",
                        "Macofe",
-                       "Jon Harald Søby"
+                       "Jon Harald Søby",
+                       "Event",
+                       "Kingu"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentasjon]]\n* [[mw:API:FAQ|Ofte stilte spørsmål]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-post-liste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-kunngjøringer]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Feil & forespørsler]\n</div>\n<strong>Status:</strong> Alle funksjonene som vises på denne siden skal virke, men API-en er fortsatt i aktiv utvikling, og kan bli endret når som helst. Abonner på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki sin API-kunnkjøringsepostliste] for nyheter om oppdateringer.\n\n<strong>Feile kall:</strong> Hvis det blir sendt feile kall til API-et, blir det sendt en HTTP-header med nøkkelen \"MediaWiki-API-Error\" og da blir både header-verdien og feilkoden sendt tilbake med samme verdi. For mer informasjon se [[mw:API:Errors_and_warnings|API: Feil og advarsler]].\n\n<strong>Testing:</strong> For enkelt å teste API-kall, se [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Hvilken handling skal utføres",
        "apihelp-main-param-format": "Resultatets format.",
        "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>.",
@@ -16,7 +19,7 @@
        "apihelp-main-param-curtimestamp": "Inkluder det nåværende tidsmerket i resultatet.",
        "apihelp-main-param-uselang": "Språk å bruke for meldingsoversettelser. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd> returnerer en liste over språkkoder, eller spesifiser <kbd>user</kbd> for å bruke den nåværende brukerens språkpreferanser, eller spesifiser <kbd>content</kbd> for å bruke denne wikiens innholdsspråk.",
        "apihelp-block-description": "Blokker en bruker.",
-       "apihelp-block-param-user": "Brukernavn, IP-adresse eller IP-intervall som skal blokkeres.",
+       "apihelp-block-param-user": "Brukernavn, IP-adresse eller IP-intervall som skal blokkeres. Kan ikke brukes sammen med <var>$1userid</var>",
        "apihelp-block-param-expiry": "Utløpstid. Kan være relativ (f.eks. <kbd>5 months</kbd> eller <kbd>2 weeks</kbd>) eller absolutt (f.eks. <kbd>2014-09-18T12:34:56Z</kbd>). Om den er satt til <kbd>infinite</kbd>, <kbd>indefinite</kbd> eller <kbd>never</kbd> vil blokkeringen ikke ha noen utløpsdato.",
        "apihelp-block-param-reason": "Årsak for blokkering.",
        "apihelp-block-param-anononly": "Blokker bare anonyme brukere (dvs. hindre anonyme redigeringer fra denne IP-adressen).",
@@ -86,7 +89,7 @@
        "apihelp-edit-param-minor": "Mindre redigering.",
        "apihelp-edit-param-notminor": "Ikke mindre redigering.",
        "apihelp-edit-param-bot": "Merk denne redigeringen som en botendring.",
-       "apihelp-edit-param-basetimestamp": "Tidsstempel for grunnrevisjonen, brukes for å oppdage redigeringskonflikter. Kan hentes via [[Special.ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-basetimestamp": "Tidsstempel for grunnrevisjonen, brukes for å oppdage redigeringskonflikter. Kan hentes via [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Tidsstempel for når redigeringsprosessen begynte, brukes for å oppdage redigeringskonflikter. En gyldig verdi kan hentes med <var>[[Special:ApiHelp/main|curtimestamp]]</var> når man begynner en redigeringsprosess (f.eks. når man laster sideinnholdet som redigeres).",
        "apihelp-edit-param-recreate": "Overstyr feil om at siden har blitt slettet i mellomtiden.",
        "apihelp-edit-param-createonly": "Ikke rediger siden dersom den finnes allerede.",
        "apihelp-expandtemplates-description": "Ekspanderer alle maler i wikitekst.",
        "apihelp-expandtemplates-param-title": "Sidetittel.",
        "apihelp-expandtemplates-param-text": "Wikitekst som skal konverteres.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Den utvidede wikiteksten.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Kategorier som er tilstede i innputt som ikke representeres i utputt.",
        "apihelp-feedcontributions-param-year": "Fra år (og tidligere).",
        "apihelp-feedcontributions-param-month": "Fra måned (og tidligere).",
        "apihelp-feedcontributions-param-tagfilter": "Filtrer bidrag som har disse merkene.",
        "apihelp-feedcontributions-param-deletedonly": "Vis bare slettede bidrag.",
        "apihelp-feedcontributions-param-toponly": "Vis kun redigeringer som er gjeldende revisjoner.",
        "apihelp-feedcontributions-param-newonly": "Bare vis bidrag som er sideopprettinger.",
+       "apihelp-feedcontributions-param-hideminor": "Skjul mindre endringer.",
        "apihelp-feedcontributions-param-showsizediff": "Vis størrelsesforskjellen mellom revisjoner.",
+       "apihelp-feedcontributions-example-simple": "Returner bidrag for brukeren <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-param-feedformat": "Matingens format.",
+       "apihelp-feedrecentchanges-param-namespace": "Navnerom resultater skal begrenses til.",
+       "apihelp-feedrecentchanges-param-invert": "Alle navnerom utenom det valgte.",
+       "apihelp-feedrecentchanges-param-associated": "Inkluder tilknyttede navnerom (diskusjons- eller hovednavnerom).",
+       "apihelp-feedrecentchanges-param-days": "Dager resultatene skal begrenses til.",
+       "apihelp-feedrecentchanges-param-limit": "Maksimalt antall resultater som skal returneres",
        "apihelp-feedrecentchanges-param-from": "Vis endringer siden da.",
        "apihelp-feedrecentchanges-param-hideminor": "Skjul mindre endringer.",
        "apihelp-feedrecentchanges-param-hidebots": "Skjul botendringer.",
+       "apihelp-feedrecentchanges-param-hideanons": "Skjul endringer gjort av anonyme brukere.",
+       "apihelp-feedrecentchanges-param-hideliu": "Skjul endringer gjort av registrerte brukere.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Skjul patruljerte endringer.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Skjul endringer gjort av den aktuelle brukeren.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Skjul endringer i kategorimedlemsskap.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrer etter tagger.",
+       "apihelp-feedrecentchanges-param-target": "Vis bare endringer på sider som lenkes fra denne siden.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Vis endringer på sider som lenker til den valgte siden i stedet.",
+       "apihelp-feedrecentchanges-param-categories": "Vis bare endringer på sider i alle disse kategoriene.",
+       "apihelp-feedrecentchanges-param-categories_any": "Vis bare endringer på sider som er i noen av kategoriene i stedet.",
+       "apihelp-feedrecentchanges-example-simple": "Vis siste endringer.",
+       "apihelp-feedrecentchanges-example-30days": "Vis siste endringer for 30 døgn.",
+       "apihelp-feedwatchlist-description": "Returnerer en overvåkningslistemating.",
+       "apihelp-feedwatchlist-param-feedformat": "Matingens format.",
        "apihelp-help-param-toc": "Inkluder en innholdsfortegnelse i HTML-utdataen.",
        "apihelp-help-example-main": "Hjelp for hovedmodulen.",
        "apihelp-help-example-recursive": "All hjelp på en side.",
        "apihelp-help-example-help": "Hjelp for selve hjelpemodulen.",
        "apihelp-help-example-query": "Hjelp for to utspørringsundermoduler.",
        "apihelp-imagerotate-description": "Roter ett eller flere bilder.",
-       "apihelp-import-param-summary": "Importsammendrag.",
+       "apihelp-import-param-summary": "Sammendrag for importering av loggelement.",
        "apihelp-import-param-xml": "Opplastet XML-fil.",
        "apihelp-login-param-name": "Brukernavn.",
        "apihelp-login-param-password": "Passord.",
        "api-help-flag-generator": "Denne modulen kan brukes som en generator.",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parametre}}:",
        "api-help-param-deprecated": "Utgått.",
-       "api-help-param-required": "Denne parameteren er påkrevd."
+       "api-help-param-required": "Denne parameteren er påkrevd.",
+       "apierror-multival-only-one": "Bare én verdi er tillatt for parameteret <var>$1</var>.",
+       "apierror-permissiondenied-generic": "Tilgang nektet.",
+       "apiwarn-validationfailed": "Bekreftelsesfeil <kbd>$1</kbd>: $2"
 }
index ac2c8b7..f782ae0 100644 (file)
@@ -14,7 +14,8 @@
                        "Robin van der Vliet",
                        "Edoderoo",
                        "Lemondoge",
-                       "Hex"
+                       "Hex",
+                       "Mainframe98"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentatie]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:API:Errors_and_warnings|API: Errors and warnings]] voor meer informatie.\n\n<strong>Testen:</strong> u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].",
        "apihelp-main-param-requestid": "Elke waarde die hier gegeven wordt, wordt aan het antwoord toegevoegd. Dit kan gebruikt worden om verzoeken te onderscheiden.",
        "apihelp-main-param-servedby": "Voeg de hostnaam van de server die de aanvraag heeft afgehandeld toe aan het antwoord.",
        "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
+       "apihelp-main-param-responselanginfo": "Toon de talen gebruikt voor <var>uselang</var> en <var>errorlang</var> in het resultaat.",
+       "apihelp-main-param-errorlang": "De taal om te gebruiken voor waarschuwingen en fouten. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> met <kbd>siprop=languages</kbd> toont een lijst van taalcodes, of stel <kbd>inhoud</kbd> in om gebruik te maken van de inhoudstaal van deze wiki, of stel <kbd>uselang</kbd> in om gebruik te maken van dezelfde waarde als de <var>uselang</var> parameter.",
+       "apihelp-main-param-errorsuselocal": "Indien ingesteld maken foutmeldingen gebruik van lokaal-aangepaste berichten in de {{ns:MediaWiki}} naamruimte.",
        "apihelp-block-description": "Gebruiker blokkeren.",
-       "apihelp-block-param-user": "Gebruikersnaam, IP-adres of IP-range om te blokkeren.",
+       "apihelp-block-param-user": "Gebruikersnaam, IP-adres of IP-range om te blokkeren. Kan niet samen worden gebruikt me <var>$1userid</var>",
+       "apihelp-block-param-userid": "Gebruikers-ID om te blokkeren. Kan niet worden gebruikt in combinatie met <var>$1user</var>.",
+       "apihelp-block-param-expiry": "Vervaldatum. Kan relatief zijn (bijv. <kbd>5 months</kbd> of <kbd>2 weeks</kbd>) of absoluut (<kbd>2014-09-18T12:34:56Z</kbd>). Indien ingesteld op <kbd>infinite</kbd>, <kbd>indefinite</kbd>, of <kbd>never</kbd> verloopt de blokkade nooit.",
        "apihelp-block-param-reason": "Reden voor blokkade.",
        "apihelp-block-param-anononly": "Alleen anonieme gebruikers blokkeren (uitschakelen van anonieme bewerkingen via dit IP-adres)",
        "apihelp-block-param-nocreate": "Voorkom registeren van accounts.",
        "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.",
+       "apihelp-block-param-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-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
        "apihelp-block-param-watchuser": "De gebruikerspagina en overlegpagina van de gebruiker of het IP-adres volgen.",
+       "apihelp-block-param-tags": "Wijzigingslabels om toe te passen op de regel in het blokkeerlogboek.",
        "apihelp-block-example-ip-simple": "Het IP-adres <kbd>192.0.2.5</kbd> voor drie dagen blokkeren met <kbd>First strike</kbd> als opgegeven reden.",
+       "apihelp-block-example-user-complex": "Blokkeer gebruiker<kbd>Vandal</kbd> voor altijd met reden <kbd>Vandalism</kbd> en voorkom het aanmaken van nieuwe accounts en het versturen van email",
+       "apihelp-changeauthenticationdata-example-password": "Poging tot het wachtwoord van de huidige gebruiker te veranderen naar <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "Controleer de geldigheid van een token van <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tokentype wordt getest.",
+       "apihelp-checktoken-param-token": "Token om te controleren.",
+       "apihelp-checktoken-param-maxtokenage": "Maximum levensduur van de token, in seconden.",
+       "apihelp-checktoken-example-simple": "Test de geldigheid van een <kbd>csrf</kbd> token.",
+       "apihelp-clearhasmsg-description": "Wist de <code>hasmsg</code> vlag voor de huidige gebruiker.",
+       "apihelp-clearhasmsg-example-1": "Wis de <code>hasmsg</code> vlag voor de huidige gebruiker.",
+       "apihelp-clientlogin-description": "Log in op de wiki met behulp van de interactieve flow.",
+       "apihelp-clientlogin-example-login": "Start het inlogproces op de wiki als gebruiker <kbd>Example</kbd> met wachtwoord <kbd>ExamplePassword</kbd>.",
+       "apihelp-compare-description": "Toon het verschil tussen 2 pagina's.\n\nEen versienummer, een paginatitel of een pagina-ID is vereist voor zowel de \"from\" en \"to\" parameter.",
        "apihelp-compare-param-fromtitle": "Eerste paginanaam om te vergelijken.",
        "apihelp-compare-param-fromid": "Eerste pagina-ID om te vergelijken.",
        "apihelp-compare-param-fromrev": "Eerste versie om te vergelijken.",
        "apihelp-compare-param-toid": "Tweede pagina-ID om te vergelijken.",
        "apihelp-compare-param-torev": "Tweede versie om te vergelijken.",
        "apihelp-createaccount-description": "Nieuwe gebruikersaccount aanmaken.",
+       "apihelp-createaccount-example-create": "Start het proces voor het aanmaken van de gebruiker <kbd>Example</kbd> met het wachtwoord <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Gebruikersnaam.",
+       "apihelp-createaccount-param-password": "Wachtwoord (genegeerd als <var>$1mailpassword</var> is ingesteld).",
+       "apihelp-createaccount-param-domain": "Domein voor externe authentificatie (optioneel).",
        "apihelp-createaccount-param-email": "E-mailadres van de gebruiker (optioneel).",
        "apihelp-createaccount-param-realname": "Echte naam van de gebruiker (optioneel).",
+       "apihelp-createaccount-param-reason": "Optionele reden voor het aanmaken van het account voor in het logboek.",
+       "apihelp-createaccount-param-language": "Taalcode om als standaard in te stellen voor de gebruiker (optioneel, standaard de inhoudstaal).",
+       "apihelp-createaccount-example-pass": "Maak gebruiker <kbd>testuser</kbd> aan met wachtwoord <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Maak gebruiker <kbd>testmailuser</kbd> aan en e-mail een willekeurig gegenereerd wachtwoord.",
        "apihelp-delete-description": "Een pagina verwijderen.",
+       "apihelp-delete-param-title": "Titel van de pagina om te verwijderen. Kan niet samen worden gebruikt met <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "ID van de pagina om te verwijderen. Kan niet samen worden gebruikt met <var>$1title</var>.",
        "apihelp-delete-param-reason": "Reden voor verwijdering. Wanneer dit niet is opgegeven wordt een automatisch gegenereerde reden gebruikt.",
+       "apihelp-delete-param-tags": "Wijzigingslabels om toe te passen op de regel in het verwijderlogboek.",
        "apihelp-delete-param-watch": "De pagina aan de volglijst van de huidige gebruiker toevoegen.",
        "apihelp-delete-param-unwatch": "De pagina van de volglijst van de huidige gebruiker verwijderen.",
        "apihelp-delete-example-simple": "Verwijder <kbd>Main Page</kbd>.",
@@ -56,6 +86,7 @@
        "apihelp-disabled-description": "Deze module is uitgeschakeld.",
        "apihelp-edit-description": "Aanmaken en bewerken van pagina's.",
        "apihelp-edit-param-title": "Naam van de pagina om te bewerken. Kan niet gebruikt worden samen met <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID van de pagina om te bewerken. Kan niet samen worden gebruikt met <var>$1title</var>.",
        "apihelp-edit-param-sectiontitle": "De naam van de nieuwe sectie.",
        "apihelp-edit-param-text": "Pagina-inhoud.",
        "apihelp-edit-param-tags": "Wijzigingslabels om aan de versie toe te voegen.",
        "apihelp-edit-param-nocreate": "Een foutmelding geven als de pagina niet bestaat.",
        "apihelp-edit-param-watch": "Voeg de pagina toe aan de volglijst van de huidige gebruiker.",
        "apihelp-edit-param-unwatch": "Verwijder de pagina van de volglijst van de huidige gebruiker.",
+       "apihelp-edit-param-md5": "De MD5-hash van de $1text parameter, of de $1prependtext en $1appendtext parameters samengevoegd. Indien ingesteld, wordt de bewerking niet gemaakt, tenzij de hash juist is.",
+       "apihelp-edit-param-prependtext": "Voeg deze tekst toe aan het begin van de pagina. Overschrijft $1text.",
+       "apihelp-edit-param-appendtext": "Voeg deze tekst toe aan het begin van de pagina. Overschrijft $1text.\n\nGebruik $1section=new in plaats van deze parameter om een nieuw kopje toe te voegen.",
+       "apihelp-edit-param-undo": "Maak deze versie ongedaan. Overschrijft $1text, $1prependtext en $1appendtext.",
+       "apihelp-edit-param-undoafter": "Maak alle versies vanaf $1undo to deze ongedaan maken. Indien niet ingesteld wordt slechts één versie ongedaan gemaakt.",
        "apihelp-edit-param-redirect": "Doorverwijzingen automatisch oplossen.",
+       "apihelp-edit-param-contentmodel": "Inhoudsmodel van de nieuwe inhoud.",
+       "apihelp-edit-param-token": "Het token moet altijd worden verzonden als de laatste parameter, of tenminste na de $1text parameter.",
        "apihelp-edit-example-edit": "Een pagina bewerken.",
+       "apihelp-edit-example-prepend": "Voeg <kbd>__NOTOC__</kbd> toe aan het begin van een pagina.",
        "apihelp-edit-example-undo": "Versies 13579 tot 13585 ongedaan maken met automatische beschrijving.",
        "apihelp-emailuser-description": "Gebruiker e-mailen.",
        "apihelp-emailuser-param-target": "Gebruiker naar wie de e-mail moet worden gestuurd.",
        "apihelp-emailuser-param-subject": "Onderwerpkoptekst.",
        "apihelp-emailuser-param-text": "E-mailtekst.",
        "apihelp-emailuser-param-ccme": "Mij een kopie sturen van deze e-mail.",
+       "apihelp-emailuser-example-email": "Stuur een e-mail naar de gebruiker <kbd>WikiSysop</kbd> met de tekst <kbd>Inhoud</kbd>.",
        "apihelp-expandtemplates-param-title": "Paginanaam.",
        "apihelp-expandtemplates-param-text": "Wikitekst om om te zetten.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "De uitgevulde wikitekst.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "De maximale tijdsduur waarna de cache van het resultaat moet worden weggegooid.",
        "apihelp-feedcontributions-description": "Haalt de feed van de gebruikersbijdragen op.",
        "apihelp-feedcontributions-param-feedformat": "De indeling van de feed.",
+       "apihelp-feedcontributions-param-user": "De gebruiker om de bijdragen voor te verkrijgen.",
        "apihelp-feedcontributions-param-year": "Van jaar (en eerder).",
        "apihelp-feedcontributions-param-month": "Van maand (en eerder).",
        "apihelp-feedcontributions-param-deletedonly": "Alleen verwijderde bijdragen weergeven.",
+       "apihelp-feedcontributions-param-toponly": "Alleen bewerkingen die de nieuwste versies zijn weergeven.",
+       "apihelp-feedcontributions-param-newonly": "Alleen bewerkingen die nieuwe pagina's aanmaken weergeven.",
+       "apihelp-feedcontributions-param-hideminor": "Verberg kleine bewerkingen.",
+       "apihelp-feedcontributions-param-showsizediff": "Toon het verschil in grootte tussen versies.",
+       "apihelp-feedcontributions-example-simple": "Toon bijdragen voor gebruiker <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-param-feedformat": "De indeling van de feed.",
+       "apihelp-feedrecentchanges-param-namespace": "Naamruimte om de resultaten tot te beperken.",
+       "apihelp-feedrecentchanges-param-invert": "Alle naamruimten behalve de geselecteerde.",
+       "apihelp-feedrecentchanges-param-limit": "Het maximaal aantal weer te geven resultaten.",
        "apihelp-feedrecentchanges-param-hideminor": "Kleine wijzigingen verbergen.",
        "apihelp-feedrecentchanges-param-hidebots": "Wijzigingen gedaan door bots verbergen.",
        "apihelp-feedrecentchanges-param-hideanons": "Wijzigingen gedaan door anonieme gebruikers verbergen.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filteren op label.",
        "apihelp-feedrecentchanges-example-simple": "Recente wijzigingen weergeven.",
        "apihelp-feedrecentchanges-example-30days": "Recente wijzigingen van de afgelopen 30 dagen weergeven.",
+       "apihelp-feedwatchlist-param-feedformat": "De indeling van de feed.",
        "apihelp-filerevert-description": "Een oude versie van een bestand terugplaatsen.",
+       "apihelp-filerevert-param-filename": "Doel bestandsnaam, zonder het Bestand: voorvoegsel.",
+       "apihelp-filerevert-param-comment": "Opmerking voor het uploaden.",
+       "apihelp-filerevert-example-revert": "Zet <kbd>Wiki.png</kbd> terug naar de versie van <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "Toon help voor de opgegeven modules.",
+       "apihelp-help-param-helpformat": "Indeling van de help uitvoer.",
+       "apihelp-help-example-main": "Hulp voor de hoofdmodule.",
+       "apihelp-help-example-submodules": "Hulp voor <kbd>action=query</kbd> en alle submodules.",
+       "apihelp-help-example-recursive": "Alle hulp op een pagina.",
+       "apihelp-help-example-help": "Help voor de help-module zelf.",
        "apihelp-imagerotate-description": "Een of meerdere afbeeldingen draaien.",
+       "apihelp-imagerotate-param-rotation": "Aantal graden om de afbeelding met de klok mee te draaien.",
+       "apihelp-imagerotate-param-tags": "Labels om toe te voegen aan de regel in het uploadlogboek.",
+       "apihelp-imagerotate-example-simple": "Roteer <kbd>File:Example.png</kbd> met <kbd>90</kbd> graden.",
+       "apihelp-imagerotate-example-generator": "Roteer alle afbeeldingen in <kbd>Category:Flip</kbd> met <kbd>180</kbd> graden.",
+       "apihelp-import-description": "Importeer een pagina van een andere wiki, of van een XML bestand.\n\nMerk op dat de HTTP POST moet worden uitgevoerd als bestandsupload (bijv. door middel van multipart/form-data) wanneer een bestand wordt verstuurd voor de <var>xml</var> parameter.",
+       "apihelp-import-param-summary": "Importsamenvatting voor het logboek.",
        "apihelp-import-param-xml": "Geüpload XML-bestand.",
+       "apihelp-import-param-interwikisource": "Voor interwiki imports: wiki om van te importeren.",
        "apihelp-import-param-namespace": "Importeren in deze naamruimte. Can niet samen gebruikt worden met <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importeren als subpagina van deze pagina. Kan niet samen met <var>$1namespace</var> gebruikt worden.",
+       "apihelp-import-example-import": "Importeer [[meta:Help:ParserFunctions]] in naamruimte 100 met de volledige geschiedenis.",
        "apihelp-login-param-name": "Gebruikersnaam.",
        "apihelp-login-param-password": "Wachtwoord.",
        "apihelp-login-param-domain": "Domein (optioneel).",
        "apihelp-logout-description": "Afmelden en sessiegegevens wissen.",
        "apihelp-logout-example-logout": "Meldt de huidige gebruiker af.",
        "apihelp-managetags-param-tag": "Label om aan te maken, te activeren of te deactiveren. Voor het aanmaken van een label, mag het niet bestaan. Voor het verwijderen van een label, moet het bestaan. Voor het activeren van een label, moet het bestaan en mag het niet gebruikt worden door een uitbreiding. Voor het deactiveren van een label, moet het gebruikt worden en handmatig gedefinieerd zijn.",
+       "apihelp-managetags-example-create": "Maak een label met de naam <kbd>spam</kbd> aan met als reden <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "Verwijder het <kbd>vandlaism</kbd> label met de reden <kbd>Misspelt</kbd>",
+       "apihelp-mergehistory-description": "Geschiedenis van pagina's samenvoegen.",
+       "apihelp-mergehistory-param-reason": "Reden voor samenvoegen van de geschiedenis.",
+       "apihelp-mergehistory-example-merge": "Voeg de hele geschiedenis van <kbd>Oldpage</kbd> samen met <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Pagina hernoemen.",
        "apihelp-move-param-to": "Nieuwe paginanaam.",
        "apihelp-move-param-reason": "Reden voor de naamswijziging.",
+       "apihelp-move-param-movetalk": "Hernoem de overlegpagina, indien deze bestaat.",
        "apihelp-move-param-noredirect": "Geen doorverwijzing achterlaten.",
        "apihelp-move-param-watch": "Pagina en de omleiding toevoegen aan de volglijst van de huidige gebruiker.",
        "apihelp-move-param-unwatch": "Verwijder de pagina en de doorverwijzing van de volglijst van de huidige gebruiker.",
        "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Alle voorkeuren opnieuw instellen.",
        "apihelp-options-example-change": "Voorkeuren wijzigen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
+       "apihelp-paraminfo-description": "Verkrijg informatie over API-modules.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Vraagt een HTML-versie van de categorieën op.",
        "apihelp-parse-example-page": "Een pagina verwerken.",
        "apihelp-parse-example-text": "Wikitext verwerken.",
        "apihelp-patrol-example-revid": "Een versie markeren als gecontroleerd.",
        "apihelp-protect-param-reason": "Reden voor opheffen van de beveiliging.",
        "apihelp-protect-example-protect": "Een pagina beveiligen",
+       "apihelp-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-paramvalue-prop-size": "Voegt het aantal pagina's in de categorie toe.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met <code>_&#95;HIDDENCAT_&#95;</code>",
        "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Toon geen versies door deze gebruiker.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Toon alleen pagina's in deze naamruimte.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Voegt de titel van het bestand toe.",
+       "apihelp-query+allfileusages-param-limit": "Hoeveel items er in totaal moeten worden getoond.",
+       "apihelp-query+allimages-example-recent": "Toon een lijst van recentlijk geüploade bestanden, vergelijkbaar met [[Special:NewFiles]].",
+       "apihelp-query+alllinks-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+alllinks-param-limit": "Hoeveel items er in totaal moeten worden getoond.",
        "apihelp-query+allmessages-param-enableparser": "Stel in om de parser in te schakelen, zorgt voor het voorverwerken van de wikitekst van een bericht (vervangen van magische woorden, de afhandeling van sjablonen, enzovoort).",
+       "apihelp-query+allmessages-param-lang": "Toon berichten in deze taal.",
+       "apihelp-query+allmessages-param-from": "Toon berichten vanaf dit bericht.",
+       "apihelp-query+allmessages-param-to": "Toon berichten tot aan dit bericht.",
+       "apihelp-query+allredirects-description": "Toon alle doorverwijzingen naar een naamruimte.",
+       "apihelp-query+allrevisions-example-user": "Toon de laatste 50 bijdragen van de gebruiker <kbd>Example</kbd>.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Vraag het MIME- en mediatype van het bestand op.",
+       "apihelp-query+mystashedfiles-param-limit": "Hoeveel bestanden te tonen.",
+       "apihelp-query+allusers-param-excludegroup": "Sluit gebruikers in de gegeven groepen uit.",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Voegt informatie over een actuale blokkade van de gebruiker toe.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Toont de groepen waar de gebruiker in zit. Dit gebruikt meer serverbronnen en kan minder resultaten teruggeven dat de opgegeven limiet.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Toon alle groepen de gebruiker automatisch in zit.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Toon de rechten die de gebruiker heeft.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Voegt het aantal bewerkingen van de gebruiker toe.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Voegt de registratiedatum van de gebruiker toe, indien beschikbaar (kan leeg zijn).",
+       "apihelp-query+allusers-param-witheditsonly": "Toon alleen gebruikers die bewerkingen hebben gemaakt.",
+       "apihelp-query+allusers-param-activeusers": "Toon alleen gebruikers die actief zijn geweest in de laatste $1 {{PLURAL:$1|dag|dagen}}.",
+       "apihelp-query+allusers-example-Y": "Toon gebruikers vanaf <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Haal informatie op over de huidige authentificatie status.",
+       "apihelp-query+backlinks-description": "Vind alle pagina's die verwijzen naar de gegeven pagina.",
+       "apihelp-query+backlinks-param-title": "Titel om op te zoeken. Kan niet worden gebruikt in combinatie met<var>$1pageid</var>.",
+       "apihelp-query+backlinks-param-pageid": "Pagina ID om op te zoeken. Kan niet worden gebruikt in combinatie met <var>$1title</var>.",
+       "apihelp-query+backlinks-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+backlinks-example-simple": "Toon verwijzingen naar de <kbd>Hoofdpagina</kbd>.",
+       "apihelp-query+blocks-description": "Toon alle geblokkeerde gebruikers en IP-adressen.",
+       "apihelp-query+blocks-param-limit": "Het maximum aantal blokkades te tonen.",
+       "apihelp-query+blocks-paramvalue-prop-id": "Voegt de blokkade ID toe.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Voegt de gebruikernaam van de geblokeerde gebruiker toe.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Voegt de gebruiker-ID van de geblokkeerde gebruiker toe.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Labelt de blokkade met (automatische blokkade, alleen anoniem, enzovoort).",
+       "apihelp-query+blocks-example-simple": "Toon blokkades.",
+       "apihelp-query+blocks-example-users": "Toon blokkades van gebruikers <kbd>Alice</kbd> en <kbd>Bob</kbd>.",
+       "apihelp-query+categories-description": "Toon alle categorieën waar de pagina in zit.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met <code>_&#95;HIDDENCAT_&#95;</code>",
+       "apihelp-query+categories-param-show": "Welke soort categorieën te tonen.",
+       "apihelp-query+categories-param-limit": "Hoeveel categorieën te tonen.",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Voegt de pagina-ID toe.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Voegt de titel en de naamruimte-ID van de pagina toe.",
+       "apihelp-query+categorymembers-param-dir": "Richting om in te sorteren.",
        "apihelp-query+deletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
        "apihelp-query+deletedrevs-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+embeddedin-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "Pagina ID van elke pagina.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Titel van elke pagina.",
+       "apihelp-query+imageusage-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+imageusage-example-simple": "Toon pagina's die gebruik maken van [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Toon informatie over pagina's die gebruik maken van [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+iwbacklinks-param-prefix": "Voorvoegsel voor de interwiki.",
        "apihelp-query+logevents-param-type": "Logboekregels alleen voor dit type filteren.",
        "apihelp-query+logevents-param-tag": "Alleen logboekregels weergeven met dit label.",
        "apihelp-query+logevents-example-simple": "Recente logboekregels weergeven.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Voegt het beveiligingsniveau toe.",
+       "apihelp-query+protectedtitles-example-simple": "Toon beveiligde titels.",
+       "apihelp-query+querypage-param-limit": "Aantal resultaten om te tonen.",
+       "apihelp-query+querypage-example-ancientpages": "Toon resultaten van [[Special:Ancientpages]].",
+       "apihelp-query+random-param-namespace": "Toon alleen pagina's in deze naamruimten.",
+       "apihelp-query+random-param-limit": "Beperk het aantal aan willekeurige pagina's dat wordt getoond.",
+       "apihelp-query+random-example-simple": "Toon twee willekeurige pagina's uit de hoofdnaamruimte.",
+       "apihelp-query+random-example-generator": "Toon pagina informatie over twee willekeurige pagina's uit de hoofdnaamruimte.",
+       "apihelp-query+recentchanges-param-user": "Toon alleen wijzigingen door deze gebruiker.",
+       "apihelp-query+recentchanges-param-excludeuser": "Toon geen wijzigingen door deze gebruiker",
        "apihelp-query+recentchanges-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Voegt de bewerkingssamenvatting voor de bewerking toe.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Voegt logboekgegevens toe aan logboekregels (logboek-ID, logboektype, enzovoort).",
+       "apihelp-query+recentchanges-example-simple": "Toon recente wijzigingen.",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "Pagina ID van elke doorverwijzing.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Titel van elke doorverwijzing.",
+       "apihelp-query+redirects-param-namespace": "Toon alleen pagina's in deze naamruimten.",
+       "apihelp-query+redirects-param-limit": "Hoeveel doorverwijzingen te tonen.",
+       "apihelp-query+redirects-example-simple": "Toon een lijst van doorverwijzingen naar [[Main Page]].",
+       "apihelp-query+redirects-example-generator": "Toon informatie over alle doorverwijzingen naar [[Main Page]].",
        "apihelp-query+revisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Versietekst.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Labels voor de versie.",
        "apihelp-query+revisions+base-param-difftotextpst": "\"pre-save\"-transformatie uitvoeren op de tekst alvorens de verschillen te bepalen. Alleen geldig als dit wordt gebruikt met <var>$1difftotext</var>.",
+       "apihelp-query+search-description": "Voer een volledige tekst zoekopdracht uit.",
+       "apihelp-query+search-param-limit": "Hoeveel pagina's te tonen.",
+       "apihelp-query+search-example-simple": "Zoeken naar <kbd>betekenis</kbd>.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Toon geregistreerde naamruimte aliassen.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Toon speciale pagina aliassen.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Toon magische woorden en hun aliassen.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Toon site statistieken.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Toont bibliotheken die op de wiki zijn geïnstalleerd.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Toont uitbreidingen die op de wiki zijn geïnstalleerd.",
        "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Geeft een lijst met bestandsextensies (bestandstypen) die geüpload mogen worden.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Toont wiki rechten (licentie) informatie als deze beschikbaar is.",
        "apihelp-query+tags-description": "Wijzigingslabels weergeven.",
        "apihelp-query+tags-paramvalue-prop-name": "Voegt de naam van het label toe.",
        "apihelp-query+tags-paramvalue-prop-displayname": "Voegt het systeembericht toe voor het label.",
        "apihelp-query+tags-paramvalue-prop-description": "Voegt beschrijving van het label toe.",
        "apihelp-query+tags-paramvalue-prop-defined": "Geeft aan of het label is gedefinieerd.",
        "apihelp-query+tags-paramvalue-prop-active": "Of het label nog steeds wordt toegepast.",
+       "apihelp-query+tags-example-simple": "Toon beschikbare labels.",
+       "apihelp-query+templates-description": "Toon alle pagina's ingesloten op de gegeven pagina's.",
+       "apihelp-query+templates-param-limit": "Het aantal sjablonen om te tonen.",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "Pagina ID van elke pagina.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Titel van elke pagina.",
+       "apihelp-query+usercontribs-description": "Toon alle bewerkingen door een gebruiker.",
+       "apihelp-query+usercontribs-param-limit": "Het maximum aantal bewerkingen om te tonen.",
+       "apihelp-query+usercontribs-param-namespace": "Toon alleen bijdragen in deze naamruimten.",
        "apihelp-query+usercontribs-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+usercontribs-example-ipprefix": "Toon bijdragen van alle IP-adressen met het voorvoegsel <kbd>192.0.2.</kbd>.",
+       "apihelp-query+userinfo-description": "Toon informatie over de huidige gebruiker.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Toon de gebruikers echte naam.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Voegt logboekgegevens toe waar van toepassing.",
        "apihelp-query+watchlist-param-type": "Welke typen wijzigingen weer te geven:",
        "apihelp-query+watchlist-paramvalue-type-edit": "Gewone paginabewerkingen.",
        "apihelp-query+watchlist-paramvalue-type-log": "Logboekregels.",
        "apihelp-query+watchlist-paramvalue-type-categorize": "Wijzigingen in categorielidmaatschap.",
        "apihelp-stashedit-param-text": "Pagina-inhoud.",
+       "apihelp-unblock-param-user": "Gebruikersnaam, IP-adres of IP-range om te deblokkeren. Kan niet samen worden gebruikt met <var>$1id</var> of <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "Gebruikers-ID om te deblokkeren. Kan niet worden gebruikt in combinatie met <var>$1id</var> of <var>$1user</var>.",
        "apihelp-json-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
        "apihelp-php-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
        "apihelp-rawfm-description": "Uitvoergegevens, inclusief debugelementen, opgemaakt in JSON (nette opmaak in HTML).",
        "api-help-param-deprecated": "Verouderd.",
        "api-help-datatypes-header": "Gegevenstypen",
        "api-help-param-default": "Standaard: $1",
+       "apierror-autoblocked": "Uw IP-adres is automatisch geblokeerd, omdat het gebruikt is door een geblokkeerde gebruiker.",
+       "apierror-badmodule-nosubmodules": "De module <kbd>$1</kbd> heeft geen submodules.",
+       "apierror-blockedfrommail": "U bent geblokkeerd en kunt geen emails verzenden.",
+       "apierror-blocked": "U bent geblokkeerd en kunt niet bewerken.",
+       "apierror-filedoesnotexist": "Bestand bestaat niet.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> mag niet minder zijn dan $2 (ingesteld op $3).",
+       "apierror-invalidcategory": "De opgegeven categorienaam is niet geldig.",
+       "apierror-invaliduser": "Ongeldige gebruikersnaam \"$1\".",
+       "apierror-maxlag-generic": "Wachten op een database server: $1 {{PLURAL:$1|seconde|seconden}} vertraging.",
+       "apierror-maxlag": "Wachten op $2: $1 {{PLURAL:$1|seconde|seconden}} vertraging.",
+       "apierror-missingtitle": "De opgegeven pagina bestaat niet.",
+       "apierror-missingtitle-byname": "De pagina $1 bestaat niet.",
+       "apierror-mustbeloggedin-generic": "U moet ingelogd zijn.",
+       "apierror-nosuchuserid": "Er is geen gebruiker met ID $1.",
+       "apierror-permissiondenied": "U heeft geen toestemming om $1.",
+       "apierror-permissiondenied-generic": "Toegang geweigerd.",
+       "apierror-readonly": "De wiki is momenteel in alleen-lezen modus.",
+       "apierror-systemblocked": "U bent automatisch geblokkeerd door MediaWiki.",
+       "apierror-unknownerror-nocode": "Onbekende fout.",
+       "apierror-unknownerror": "Onbekende fout: \"$1\".",
+       "apierror-unrecognizedparams": "Niet-herkende {{PLURAL:$2|parameter|parameters}}: $1.",
+       "apiwarn-invalidcategory": "\"$1\" is geen categorie.",
+       "apiwarn-invalidtitle": "\"$1\" is geen geldige titel.",
+       "apiwarn-notfile": "\"$1\" is geen bestand.",
+       "apiwarn-validationfailed-badpref": "geen geldige voorkeur.",
+       "api-feed-error-title": "Fout ($1)",
+       "api-usage-docref": "Zie $1 voor API gebruik.",
        "api-credits-header": "Vermeldingen",
        "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://phabricator.wikimedia.org/."
 }
index 7ecfebe..8d1f4a5 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Cedric31",
-                       "Macofe"
+                       "Macofe",
+                       "Nicolas Eynaud"
                ]
        },
        "apihelp-main-param-action": "Quina accion cal efectuar.",
@@ -17,6 +18,7 @@
        "apihelp-compare-param-totitle": "Segond títol de comparar.",
        "apihelp-compare-param-toid": "ID de la segonda pagina de comparar.",
        "apihelp-compare-param-torev": "Segonda revision de comparar.",
+       "apihelp-compare-example-1": "Crear un diff entre lei revisions 1 e 2",
        "apihelp-createaccount-description": "Creatz un novèl compte d'utilizaire.",
        "apihelp-createaccount-param-name": "Nom d'utilizaire.",
        "apihelp-createaccount-param-password": "Senhal (ignorat se <var>$1mailpassword</var> es definit).",
@@ -49,6 +51,7 @@
        "apihelp-feedrecentchanges-param-feedformat": "Lo format del flux.",
        "apihelp-feedrecentchanges-param-hideminor": "Amagar las modificacions menoras.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar per balisa.",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar lei darriers cambiaments.",
        "apihelp-filerevert-param-comment": "Telecargar lo comentari.",
        "apihelp-filerevert-param-archivename": "Nom d’archiu de la revision de restablir.",
        "apihelp-import-param-summary": "Resumit de l’importacion de l’entrada de jornal.",
@@ -58,6 +61,7 @@
        "apihelp-login-param-domain": "Domeni (facultatiu).",
        "apihelp-login-example-login": "Se connectar.",
        "apihelp-managetags-description": "Efectuar de prètzfaits de gestion relatius a la modificacion de las balisas.",
+       "apihelp-mergehistory-description": "Fusionar leis istorics de pagina",
        "apihelp-move-description": "Desplaçar una pagina.",
        "apihelp-opensearch-param-search": "Cadena de recèrca.",
        "apihelp-parse-example-page": "Analisar una pagina.",
        "apihelp-query+allcategories-description": "Enumerar totas las categorias.",
        "apihelp-query+alldeletedrevisions-param-from": "Aviar la lista a aqueste títol.",
        "apihelp-query+allimages-param-sort": "Proprietat per la quala cal triar.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Ajustatz lo títol de la redireccion.",
        "apihelp-query+blocks-example-simple": "Listar los blocatges",
        "apihelp-query+blocks-example-users": "Listar los blocatges dels utilizaires <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
        "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Tèxte de la revision.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Balisas de la revision.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Cambiaments extèrnes",
+       "apihelp-query+watchlist-paramvalue-type-new": "Creacions de pagina",
+       "apihelp-resetpassword-description": "Mandar un corrier electronic de reïnicializacion de son senhau a l'utilizaire.",
+       "apihelp-stashedit-param-text": "Contengut de la pagina",
        "apihelp-tag-param-reason": "Motiu de la modificacion.",
        "apihelp-unblock-description": "Desblocar un utilizaire.",
        "apihelp-unblock-param-reason": "Motiu del desblocatge.",
        "apihelp-unblock-example-id": "Levar lo blocatge d’ID #<kbd>105</kbd>.",
+       "apihelp-undelete-param-reason": "Motiu de restauracion.",
        "apihelp-userrights-param-user": "Nom d'utilizaire.",
        "apihelp-userrights-param-userid": "ID de l'utilizaire.",
+       "apihelp-validatepassword-param-password": "Senhau de validar.",
        "api-help-main-header": "Modul principal",
+       "api-help-flag-deprecated": "Lo module es desaprovat.",
        "api-help-source": "Font : $1",
        "api-help-source-unknown": "Font : <span class=\"apihelp-unknown\">desconeguda</span>",
        "api-help-license": "Licéncia : [[$1|$2]]",
        "api-help-param-required": "Aqueste paramètre es obligatòri.",
        "api-help-datatypes-header": "Tipe de donadas",
        "api-help-param-default": "Per defaut : $1",
+       "apierror-badquery": "Requista invalida.",
+       "apierror-cannotviewtitle": "Siatz autorizat a veire $1.",
+       "apierror-cantblock-email": "Sus aqueu wiki, avètz pas lei drechs necessaris per empedir leis utilizats de mandar de corriers electronics.",
+       "apierror-cantblock": "Avètz pas lei drechs necessaris per blocar d'utilizaires.",
+       "apierror-canthide": "Avètz pas lei drechs necessaris per escondre lo nom d'un utilizaire dins lo jornau dei blocatges.",
+       "apierror-cantimport-upload": "Avètz pas lei drechs necessaris per importar de paginas telecargadas.",
+       "apierror-cantimport": "Avètz pas lei drechs necesaris per importar de paginas.",
+       "apierror-copyuploadbadurl": "Telecargament pas autorizat a partir d'aquel URL.",
+       "apierror-create-titleexists": "Lei títols existents pòdon pas èsser protegits amb <kbd>create</kbd>.",
+       "apierror-emptynewsection": "La creacion de seccions vuejas novèlas es pas possibla.",
+       "apierror-filedoesnotexist": "Lo fichier existís pas.",
+       "apierror-noedit": "Avètz pas lei drechs necessaris per editar de paginas.",
+       "apierror-noimageredirect-anon": "Leis utilizaires anonims pòdon pas crear de redireccions d'imatge.",
+       "apierror-noimageredirect": "Avètz pas lei drechs necessaris per crear de redireccions d'imatge.",
+       "apierror-nosuchsection": "I a ges seccion $1",
+       "apierror-nosuchsection-what": "I a pas de seccion $1 dins $2.",
+       "apierror-permissiondenied-generic": "Autorizacion refusada.",
+       "apierror-unknownerror-nocode": "Error desconeguda.",
+       "apierror-unknownerror": "Error desconeguda : $1",
+       "apierror-unknownformat": "Format $1 non reconegut",
+       "apierror-unrecognizedvalue": "Valor pas reconeguda per lo paramètre <var>$1</var>: $2.",
+       "apiwarn-invalidcategory": "\"$1\" es pas una categoria.",
+       "apiwarn-invalidtitle": "\"$1\" es pas un títol valide.",
+       "apiwarn-notfile": "$1 es pas un fichier.",
+       "apiwarn-tokennotallowed": "L'accion $1 es pas autorizada per l'utilizaire actuau.",
+       "apiwarn-validationfailed-badpref": "Pas una preferéncia valida.",
+       "api-feed-error-title": "Error ($1)",
        "api-credits-header": "Mercejaments"
 }
index 4c31ca8..3aebf9a 100644 (file)
@@ -29,7 +29,7 @@
        "apihelp-main-param-curtimestamp": "Dołącz obecny znacznik czasu do wyniku.",
        "apihelp-main-param-uselang": "Język, w którym mają być pokazywane tłumaczenia wiadomości. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> z <kbd>siprop=languages</kbd> zwróci listę języków lub ustaw jako <kbd>user</kbd>, aby pobrać z preferencji zalogowanego użytkownika lub <kbd>content</kbd>, aby wykorzystać język zawartości tej wiki.",
        "apihelp-block-description": "Zablokuj użytkownika.",
-       "apihelp-block-param-user": "Nazwa użytkownika, adres IP lub zakres adresów IP, które chcesz zablokować.",
+       "apihelp-block-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz zablokować. Nie można używać razem z <var>$1userid</var>.",
        "apihelp-block-param-expiry": "Czas trwania. Może być względny (np. <kbd>5 months</kbd> or <kbd>2 weeks</kbd>) lub konkretny (np. <kbd>2014-09-18T12:34:56Z</kbd>). Jeśli jest ustawiony na <kbd>infinite</kbd>, <kbd>indefinite</kbd>, lub <kbd>never</kbd>, blokada nigdy nie wygaśnie.",
        "apihelp-block-param-reason": "Powód blokady.",
        "apihelp-block-param-anononly": "Blokuj tylko anonimowych użytkowników (blokuje anonimowe edycje z tego adresu IP).",
        "apihelp-emailuser-param-text": "Treść emaila.",
        "apihelp-emailuser-param-ccme": "Wyślij kopię wiadomości do mnie.",
        "apihelp-emailuser-example-email": "Wyślij e-mail do użytkownika <kbd>WikiSysop</kbd> z tekstem <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Rozwiń wszystkie szablony w wikitexcie.",
+       "apihelp-expandtemplates-description": "Rozwija wszystkie szablony zawarte w wikitekście.",
        "apihelp-expandtemplates-param-title": "Tytuł strony.",
        "apihelp-expandtemplates-param-text": "Wikitext do przekonwertowania.",
+       "apihelp-expandtemplates-param-revid": "ID wersji, dla <nowiki>{{REVISIONID}}</nowiki> i podobnych zmiennych.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Rozszerzony wikitext.",
+       "apihelp-feedcontributions-description": "Zwraca kanał wkładu użytkownika.",
        "apihelp-feedcontributions-param-feedformat": "Format danych wyjściowych.",
+       "apihelp-feedcontributions-param-user": "Jakich użytkowników pobrać wkład.",
+       "apihelp-feedcontributions-param-namespace": "Z jakiej przestrzeni nazw wyświetlać wkład użytkownika.",
        "apihelp-feedcontributions-param-year": "Od roku (i wcześniej).",
        "apihelp-feedcontributions-param-month": "Od miesiąca (i wcześniej).",
+       "apihelp-feedcontributions-param-tagfilter": "Pokaż tylko wkład z tymi znacznikami.",
        "apihelp-feedcontributions-param-deletedonly": "Pokazuj tylko usunięty wkład.",
        "apihelp-feedcontributions-param-toponly": "Pokazuj tylko edycje będące ostatnią zmianą strony.",
        "apihelp-feedcontributions-param-newonly": "Pokazuj tylko edycje tworzące stronę.",
        "apihelp-feedcontributions-param-hideminor": "Ukryj drobne zmiany.",
        "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.",
+       "apihelp-feedcontributions-example-simple": "Zwróć liste edycji dokonanych przez użytkownika <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Zwraca kanał ostatnich zmian.",
        "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.",
        "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.",
        "apihelp-feedrecentchanges-param-invert": "Wszystkie przestrzenie nazw oprócz wybranej.",
+       "apihelp-feedrecentchanges-param-associated": "Uwzględnij powiązaną przestrzeń nazw (dyskusja lub treść).",
        "apihelp-feedrecentchanges-param-days": "Dni, do których ograniczone są wyniki.",
        "apihelp-feedrecentchanges-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-feedrecentchanges-param-from": "Pokaż zmiany od tamtej chwili.",
        "apihelp-feedrecentchanges-param-hideliu": "Ukryj zmiany zrobione przez zarejestrowanych użytkowników.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Ukryj sprawdzone zmiany.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ukryj zmiany zrobione przez obecnego użytkownika.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ukryj zmiany w kategoryzacji.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtruj po znacznikach.",
+       "apihelp-feedrecentchanges-param-target": "Pokaż tylko zmiany na stronach linkowanych z tej strony.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Pokaż zmiany na stronach linkujących do wybranej strony.",
+       "apihelp-feedrecentchanges-param-categories": "Pokaż zmiany tylko na stronach będących we wszystkich tych kategoriach.",
+       "apihelp-feedrecentchanges-param-categories_any": "Pokaż zmiany tylko na stronach będących w jednej z tych kategorii.",
        "apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.",
        "apihelp-feedrecentchanges-example-30days": "Pokaż ostatnie zmiany z 30 dni.",
+       "apihelp-feedwatchlist-description": "Zwraca kanał listy obserwowanych.",
+       "apihelp-feedwatchlist-param-feedformat": "Format kanału.",
+       "apihelp-feedwatchlist-param-hours": "Wymień strony zmienione w ciągu tylu godzin licząc od teraz.",
+       "apihelp-feedwatchlist-param-linktosections": "Linkuj bezpośrednio do zmienionych sekcji jeżeli to możliwe.",
+       "apihelp-feedwatchlist-example-default": "Pokaż kanał listy obserwowanych.",
+       "apihelp-feedwatchlist-example-all6hrs": "Pokaż wszystkie zmiany na obserwowanych stronach dokonane w ciągu ostatnich 6 godzin.",
        "apihelp-filerevert-description": "Przywróć plik do starej wersji.",
        "apihelp-filerevert-param-filename": "Docelowa nazwa pliku bez prefiksu Plik:",
        "apihelp-filerevert-param-comment": "Prześlij komentarz.",
        "apihelp-filerevert-example-revert": "Przywróć <kbd>Wiki.png</kbd> do wersji z <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Wyświetl pomoc dla określonych modułów.",
        "apihelp-help-param-modules": "Moduły do wyświetlenia pomocy dla (wartości <var>action</var> i <var>format</var> parametry, lub <kbd>main</kbd>). Może określić podmoduły z <kbd>+</kbd>.",
+       "apihelp-help-param-submodules": "Dołącz pomoc podmodułów nazwanego modułu.",
        "apihelp-help-param-recursivesubmodules": "Zawiera pomoc dla podmodułów rekursywnie.",
        "apihelp-help-param-helpformat": "Format wyjściowy pomocy.",
        "apihelp-help-param-toc": "Dołącz spis treści do wyjściowego HTML.",
        "apihelp-login-example-login": "Zaloguj się",
        "apihelp-logout-description": "Wyloguj i wyczyść dane sesji.",
        "apihelp-logout-example-logout": "Wyloguj obecnego użytkownika.",
+       "apihelp-managetags-description": "Wykonywanie zadań związanych z zarządzaniem znacznikami zmian.",
+       "apihelp-managetags-param-operation": "Jakiej operacji dokonać:\n;create:Stworzenie nowego znacznika zmian do ręcznego użycia.\n;delete:Usunięcie znacznika zmian z bazy danych, włącznie z usunięciem danego znacznika z wszystkich oznaczonych nim zmian i wpisów rejestru i ostatnich zmian.\n;activate:Aktywuj znacznik zmian, użytkownicy będą mogli go ręcznie przypisywać.\n;deactivate:Dezaktywuj znacznik zmian, użytkownicy nie będą mogli przypisywać go ręcznie.",
+       "apihelp-managetags-param-tag": "Znacznik do utworzenia, usunięcia, aktywacji lub dezaktywacji. Do utworzenia znacznika, nazwa nie misi istnieć. Do usunięcia znacznika, musi on istnieć. Do aktywacji znacznika, musi on istnieć i nie może być w użyciu przez żadne rozszerzenie. Do dezaktywowania znacznika, musi on być do tej pory aktywowany i ręcznie zdefiniowany.",
        "apihelp-managetags-param-reason": "Opcjonalny powód utworzenia, usunięcia, włączenia lub wyłączenia znacznika.",
        "apihelp-managetags-param-ignorewarnings": "Czy zignorować ostrzeżenia, które pojawiają się w trakcie operacji.",
+       "apihelp-managetags-example-create": "Stworzenie znacznika o nazwie <kbd>spam</kbd> z powodem <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "Usunięcie znacznika <kbd>vandlaism</kbd> z powodu <kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "Aktywacja znacznika o nazwie <kbd>spam</kbd> z powodem <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Dezaktywacja znacznika o nazwie <kbd>spam</kbd> z powodu <kbd>No longer required</kbd>",
        "apihelp-mergehistory-description": "Łączenie historii edycji.",
+       "apihelp-mergehistory-param-from": "Tytuł strony, z której historia ma zostać połączona. Nie może być używane z <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "ID strony, z której historia ma zostać połączona. Nie może być używane z <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Tytuł strony, z którą połączyć historię. Nie może być używane z <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "ID strony, z którą połączyć historię. Nie może być używane z <var>$1to</var>.",
        "apihelp-mergehistory-param-reason": "Powód łączenia historii.",
+       "apihelp-mergehistory-example-merge": "Połącz całą historię strony <kbd>Oldpage</kbd> ze stroną <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Przenieś stronę.",
+       "apihelp-move-param-from": "Tytuł strony do zmiany nazwy. Nie można używać razem z <var>$1fromid</var>.",
        "apihelp-move-param-to": "Tytuł na jaki zmienić nazwę strony.",
        "apihelp-move-param-reason": "Powód zmiany nazwy.",
        "apihelp-move-param-movetalk": "Zmień nazwę strony dyskusji, jeśli istnieje.",
        "apihelp-parse-paramvalue-prop-images": "Zdjęcia 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-param-disabletoc": "Pomiń spis treści na wyjściu.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
        "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>all</kbd> (czyli każdy może wykonać działanie).",
        "apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.",
-       "apihelp-purge-description": "Wyczyść pamięć podręczną dla stron o podanych tytułach.\n\nWymaga wysłania jako żądanie POST jeżeli użytkownik jest niezalogowany.",
+       "apihelp-purge-description": "Wyczyść pamięć podręczną dla stron o podanych tytułach.",
        "apihelp-purge-param-forcelinkupdate": "Uaktualnij tabele linków.",
        "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-query+allrevisions-example-ns-main": "Wyświetl pierwsze 50 wersji w przestrzeni głównej.",
        "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-limit": "Łączna liczba elementów do zwrócenia.",
        "apihelp-query+allusers-param-from": "Nazwa użytkownika, od którego rozpocząć wyliczanie.",
        "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-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+blocks-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
        "apihelp-query+blocks-param-ids": "Lista zablokowanych ID do wylistowania (opcjonalne).",
        "apihelp-query+blocks-param-users": "Lista użytkowników do wyszukania (opcjonalne).",
        "apihelp-query+blocks-param-limit": "Maksymalna liczba blokad do wylistowania.",
+       "apihelp-query+blocks-paramvalue-prop-id": "Dodaje identyfikator blokady.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Dodaje nazwę zablokowanego użytkownika.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Dodaje identyfikator zablokowanego użytkownika.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Dodaje znacznik czasu założenia blokady.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Dodaje znacznik czasu wygaśnięcia blokady.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Dodaje powód zablokowania.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Dodaje zakres adresów IP, na który zastosowano blokadę.",
        "apihelp-query+blocks-example-simple": "Listuj blokady.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Dodaje znacznik czasu dodania kategorii.",
        "apihelp-query+categories-param-limit": "Liczba kategorii do zwrócenia.",
+       "apihelp-query+categoryinfo-description": "Zwraca informacje o danych kategoriach.",
        "apihelp-query+categorymembers-description": "Wszystkie strony w danej kategorii.",
        "apihelp-query+categorymembers-param-title": "Kategoria, której zawartość wymienić (wymagane). Musi zawierać prefiks <kbd>{{ns:category}}:</kbd>. Nie może być używany równocześnie z <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID strony kategorii, z której wymienić strony. Nie może być użyty równocześnie z <var>$1title</var>.",
        "apihelp-query+exturlusage-param-limit": "Liczba stron do zwrócenia.",
        "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias rozmiaru.",
        "apihelp-query+filearchive-paramvalue-prop-description": "Dodaje opis wersji obrazka.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Dodaje typ MIME obrazka.",
        "apihelp-query+filearchive-example-simple": "Pokaż listę wszystkich usuniętych plików.",
        "apihelp-query+filerepoinfo-example-simple": "Uzyskaj informacje na temat repozytoriów plików.",
        "apihelp-query+fileusage-description": "Znajdź wszystkie strony, które używają danych plików.",
        "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.",
        "apihelp-query+pageswithprop-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Doda ID 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+prefixsearch-param-search": "Wyszukaj tekst.",
        "apihelp-query+prefixsearch-param-namespace": "Przestrzenie nazw do przeszukania.",
        "apihelp-query+protectedtitles-description": "Lista wszystkich tytułów zabezpieczonych przed tworzeniem.",
        "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+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-param-filterredir": "Jaki filtrować przekierowania.",
+       "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-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+redirects-paramvalue-prop-title": "Nazwa każdego przekierowania.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "Identyfikator wersji.",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "Znaczniki wersji (drobne).",
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Znacznik czasu wersji.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Użytkownik, który utworzył wersję.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Długość wersji (w bajtach).",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) wersji.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Tekst wersji.",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Ogólne informacje o systemie.",
        "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista zarejestrowanych przestrzeni nazw i ich nazwy kanoniczne.",
        "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Lista zarejestrowanych aliasów przestrzeni nazw.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Lista słów magicznych i ich aliasów.",
        "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+transcludedin-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+transcludedin-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-query+transcludedin-param-limit": "Ile zwrócić.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Dodaje komentarz edycji.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Dodaje sparsowany komentarz edycji.",
        "apihelp-query+userinfo-description": "Pobierz informacje o aktualnym użytkowniku.",
        "apihelp-query+userinfo-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Wyświetla wszystkie grupy, do których należy bieżący użytkownik.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Wyświetla wszystkie uprawnienia, które ma bieżący użytkownik.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Dodaje liczbę edycji bieżącego użytkownika.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Dodaje adres e-mail użytkownika i datę jego potwierdzenia.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Dodaje datę rejestracji użytkownika.",
        "apihelp-query+userinfo-example-simple": "Pobierz informacje o aktualnym użytkowniku.",
        "apihelp-query+userinfo-example-data": "Pobierz dodatkowe informacje o aktualnym użytkowniku.",
        "apihelp-query+watchlist-paramvalue-type-external": "Zmiany zewnętrzne.",
        "apihelp-resetpassword-description": "Wyślij użytkownikowi e-mail do resetowania hasła.",
        "apihelp-resetpassword-example-email": "Wyślij e-mail do resetowania hasła do wszystkich użytkowników posiadających adres <kbd>user@example.com</kbd>.",
+       "apihelp-revisiondelete-param-ids": "Identyfikatory wersji do usunięcia.",
+       "apihelp-revisiondelete-param-hide": "Co ukryć w każdej z wersji.",
+       "apihelp-revisiondelete-param-show": "Co pokazać w każdej z wersji.",
+       "apihelp-revisiondelete-param-reason": "Powód usunięcia lub przywrócenia.",
+       "apihelp-setpagelanguage-description": "Zmień język strony.",
+       "apihelp-setpagelanguage-param-reason": "Powód zmiany.",
        "apihelp-stashedit-param-title": "Tytuł edytowanej strony.",
        "apihelp-stashedit-param-sectiontitle": "Tytuł nowej sekcji.",
        "apihelp-stashedit-param-text": "Zawartość strony.",
        "apihelp-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-description": "Odblokuj użytkownika.",
+       "apihelp-unblock-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz odblokować. Nie można używać jednocześnie z <var>$1id</var> lub <var>$1userid</var>.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
+       "apihelp-undelete-param-title": "Tytuł strony do przywrócenia.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
        "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
        "apihelp-upload-param-watch": "Obserwuj stronę.",
        "apihelp-upload-param-ignorewarnings": "Ignoruj wszystkie ostrzeżenia.",
        "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-remove": "Usuń użytkownika z tych grup.",
        "apihelp-userrights-param-reason": "Powód zmiany.",
+       "apihelp-validatepassword-param-password": "Hasło do walidacji.",
        "apihelp-json-description": "Dane wyjściowe w formacie JSON.",
        "apihelp-jsonfm-description": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).",
        "apihelp-php-description": "Dane wyjściowe w serializowany formacie PHP.",
        "apihelp-phpfm-description": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).",
        "apihelp-xml-description": "Dane wyjściowe w formacie XML.",
        "apihelp-xml-param-xslt": "Jeśli określony, dodaje podaną stronę jako arkusz styli XSL. Powinna to być strona wiki w przestrzeni nazw MediaWiki, której nazwa kończy się na <code>.xsl</code>.",
+       "apihelp-xml-param-includexmlnamespace": "Jeśli zaznaczono, dodaje przestrzeń nazw XML.",
        "apihelp-xmlfm-description": "Dane wyjściowe w formacie XML (prawidłowo wyświetlane w HTML).",
        "api-format-title": "Wynik MediaWiki API",
        "api-pageset-param-titles": "Lista tytułów, z którymi pracować.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być pomiędzy $2 a $3.",
        "api-help-param-multi-separate": "Oddziel wartości za pomocą <kbd>|</kbd> lub [[Special:ApiHelp/main#main/datatypes|alternatywy]].",
        "api-help-param-multi-max": "Maksymalna liczba wartości to {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} dla botów).",
+       "api-help-param-multi-all": "Aby wskazać wszystkie wartości, użyj <kbd>$1</kbd>.",
        "api-help-param-default": "Domyślnie: $1",
        "api-help-param-default-empty": "Domyślnie: <span class=\"apihelp-empty\">(puste)</span>",
        "api-help-param-token": "Token \"$1\" zdobyty z [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2",
        "api-help-right-apihighlimits": "Użyj wyższych limitów w zapytaniach API (dla zapytań powolnych: $1; dla zapytań szbkich: $2). Limity zapytań powolnych są także stosowane dla parametrów z podanymi wieloma wartościami.",
        "api-help-open-in-apisandbox": "<small>[otwórz w brudnopisie]</small>",
+       "apierror-baddiff": "Różnicy wersji nie można odtworzyć. Jedna lub obie wersje nie istnieją, lub nie masz uprawnień do ich wyświetlenia.",
+       "apierror-badgenerator-unknown": "Nieznany <kbd>generator=$1</kbd>.",
+       "apierror-badip": "Parametr IP nie jest prawidłowy.",
+       "apierror-badparameter": "Nieprawidłowa wartość parametru <var>$1</var>.",
+       "apierror-badquery": "Nieprawidłowe zapytanie.",
+       "apierror-badtoken": "Nieprawidłowy token CSRF.",
+       "apierror-blockedfrommail": "Została Ci zablokowana możliwość wysyłania e-maili.",
+       "apierror-blocked": "Została Ci zablokowana możliwość edycji.",
+       "apierror-botsnotsupported": "Interfejs nie jest obsługiwany dla botów.",
+       "apierror-cannotviewtitle": "Nie masz uprawnień do oglądania $1.",
+       "apierror-cantblock": "Nie masz uprawnień do blokowania użytkowników.",
+       "apierror-cantimport-upload": "Nie masz uprawnień do importowania przesłanych stron.",
+       "apierror-cantimport": "Nie masz uprawnień do importowania stron.",
+       "apierror-cantsend": "Nie jesteś zalogowany, nie masz potwierdzonego adresu e-mail, albo nie masz prawa wysyłać e-maili do innych użytkowników, więc nie możesz wysłać wiadomości e-mail.",
+       "apierror-cantundelete": "Nie można przywrócić: dana wersja nie istnieje albo została już przywrócona.",
+       "apierror-databaseerror": "[$1] Błąd zapytania do bazy danych.",
+       "apierror-exceptioncaught": "[$1] Stwierdzono wyjątek: $2",
+       "apierror-filedoesnotexist": "Plik nie istnieje.",
+       "apierror-import-unknownerror": "Nieznany błąd podczas importowania: $1.",
+       "apierror-integeroutofrange-abovebotmax": "Wartość <var>$1</var> dla botów i administratorów nie może przekraczać $2 (ustawiono $3).",
+       "apierror-integeroutofrange-abovemax": "Wartość <var>$1</var> dla użytkowników nie może przekraczać $2 (ustawiono $3).",
+       "apierror-integeroutofrange-belowminimum": "Wartość <var>$1</var> nie może być mniejsza niż $2 (ustawiono $3).",
+       "apierror-invalidcategory": "Wprowadzona nazwa kategorii jest nieprawidłowa.",
+       "apierror-invalidlang": "Nieprawidłowy kod języka dla parametru <var>$1</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Parametry}} $1 nie mogą być używane razem.",
+       "apierror-invalidtitle": "Zły tytuł „$1”.",
+       "apierror-invalidurlparam": "Nieprawidłowa wartość <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Niepoprawna nazwa użytkownika „$1”.",
+       "apierror-invaliduserid": "Identyfikator użytkownika <var>$1</var> jest nieprawidłowy.",
+       "apierror-maxlag-generic": "Oczekiwania na serwer bazy danych: opóźnienie $1 {{PLURAL:$1|sekunda|sekundy|sekund}}.",
+       "apierror-missingparam": "Parametr <var>$1</var> musi być podany.",
+       "apierror-missingtitle": "Wybrana przez ciebie strona nie istnieje.",
+       "apierror-missingtitle-byname": "Strona $1 nie istnieje.",
+       "apierror-moduledisabled": "Moduł <kbd>$1</kbd> został wyłączony.",
+       "apierror-mustbeloggedin-generic": "Musisz być zalogowany.",
+       "apierror-mustbeloggedin": "Musisz się zalogować, aby mieć możliwość $1.",
+       "apierror-nodeleteablefile": "Nie ma takiej starej wersji pliku.",
+       "apierror-noedit-anon": "Niezarejestrowani użytkownicy nie mogą edytować stron.",
+       "apierror-noedit": "Nie masz uprawnień do edytowania stron.",
+       "apierror-noimageredirect-anon": "Anonimowi użytkownicy nie mogą tworzyć przekierowań plików.",
+       "apierror-noimageredirect": "Nie masz uprawnień do tworzenia przekierowań plików.",
+       "apierror-nosuchpageid": "Nie ma strony z identyfikatorem $1.",
+       "apierror-nosuchrevid": "Nie ma wersji z identyfikatorem $1.",
+       "apierror-nosuchsection": "Nie ma sekcji $1.",
+       "apierror-permissiondenied": "Nie masz uprawnień do $1.",
+       "apierror-permissiondenied-generic": "Brak dostępu.",
+       "apierror-permissiondenied-unblock": "Nie masz uprawnień do odblokowania użytkowników.",
+       "apierror-protect-invalidaction": "Nieprawidłowy rodzaj zabezpieczenia „$1”.",
+       "apierror-protect-invalidlevel": "Nieprawidłowy poziom zabezpieczeń „$1”.",
+       "apierror-readonly": "Wiki jest teraz w trybie tylko do odczytu.",
+       "apierror-revwrongpage": "r$1 nie jest wersją strony $2.",
+       "apierror-sectionsnotsupported-what": "Sekcje nie są obsługiwane przez $1.",
+       "apierror-specialpage-cantexecute": "Nie masz uprawnień, aby zobaczyć wyniki tej strony specjalnej.",
+       "apierror-stashwrongowner": "Nieprawidłowy właściciel: $1",
+       "apierror-unknownerror-nocode": "Nieznany błąd.",
+       "apierror-unknownerror": "Nieznany błąd: „$1”.",
+       "apierror-unknownformat": "Nierozpoznany format „$1”.",
+       "apierror-unrecognizedvalue": "Nierozpoznana wartość parametru <var>$1</var>: $2.",
+       "apiwarn-invalidcategory": "„$1” nie jest kategorią.",
+       "apiwarn-invalidtitle": "„$1” nie jest poprawnym tytułem.",
+       "apiwarn-notfile": "„$1” nie jest plikiem.",
+       "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",
        "api-credits-header": "Twórcy",
        "api-credits": "Deweloperzy API:\n* Roan Kattouw (główny programista wrzesień 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (twórca, główny programista wrzesień 2006–wrzesień 2007)\n* Brad Jorsch (główny programista 2013–obecnie)\n\nProsimy wysyłać komentarze, sugestie i pytania do mediawiki-api@lists.wikimedia.org\nlub zgłoś błąd na https://phabricator.wikimedia.org/."
 }
index 38af0cb..c340d4a 100644 (file)
@@ -9,14 +9,18 @@
                        "Almondega",
                        "Raphaelras",
                        "Caçador de Palavras",
-                       "LucyDiniz"
+                       "LucyDiniz",
+                       "Eduardo Addad de Oliveira",
+                       "Warley Felipe C."
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
        "apihelp-main-param-format": "O formato da saída.",
        "apihelp-main-param-smaxage": "Define o cabeçalho <code>s-maxage</code> para esta quantidade de segundos. Os erros não são armazenados em cache.",
        "apihelp-main-param-maxage": "Define o cabeçalho <code>max-age</code> para esta quantidade de segundos. Os erros não são armazenados em cache.",
+       "apihelp-main-param-assertuser": "Verificar que o utilizador atual é o utilizador nomeado.",
        "apihelp-main-param-requestid": "Qualquer valor dado aqui será incluído na resposta. Pode ser usado para distinguir requisições.",
+       "apihelp-main-param-servedby": "Inclua o nome de host que atendeu a solicitação nos resultados.",
        "apihelp-main-param-curtimestamp": "Inclui a data atual no resultado.",
        "apihelp-block-description": "Bloquear um usuário",
        "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear.",
@@ -26,6 +30,7 @@
        "apihelp-block-param-autoblock": "Bloquear automaticamente o endereço IP usado e quaisquer endereços IPs subseqüentes que tentarem acessar a partir deles.",
        "apihelp-block-param-hidename": "Oculta o nome do usuário do ''log'' de bloqueio. (Requer o direito <code>hideuser</code>).",
        "apihelp-block-param-reblock": "Se o usuário já estiver bloqueado, sobrescrever o bloqueio existente.",
+       "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-compare-param-fromtitle": "Primeiro título para comparar.",
@@ -84,6 +89,7 @@
        "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições excluídas.",
        "apihelp-feedcontributions-param-toponly": "Mostrar somente as edições que sejam a última revisão.",
        "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-param-feedformat": "O formato do feed.",
@@ -93,7 +99,9 @@
        "apihelp-feedrecentchanges-param-from": "Mostra modificações desde então.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar modificações menores.",
        "apihelp-feedrecentchanges-param-hidebots": "Ocultar modificações menores feitas por bots.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar mudanças patrulhadas.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas pelo usuário atual.",
+       "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-query+alllinks-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+alllinks-param-limit": "Quantos itens retornar.",
        "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+allmessages-param-customised": "Retornar apenas mensagens neste estado personalização.",
        "apihelp-query+allmessages-param-lang": "Retornar mensagens neste idioma.",
        "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-namespace": "O espaço nominal a se enumerar.",
+       "apihelp-query+allrevisions-description": "Listar todas as revisões.",
        "apihelp-query+alltransclusions-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+alltransclusions-param-limit": "Quantos itens retornar.",
        "apihelp-query+backlinks-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "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+iwlinks-paramvalue-prop-url": "Adiciona o URL completo.",
        "apihelp-query+langbacklinks-param-limit": "Quantas páginas retornar.",
        "apihelp-query+langlinks-param-limit": "Quantos links de idioma retornar.",
        "apihelp-query+links-param-limit": "Quantos links retornar.",
        "apihelp-query+linkshere-param-limit": "Quantos retornar.",
+       "apihelp-query+logevents-example-simple": "Listar os eventos recentes do registo.",
        "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-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-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-userrights-param-add": "Adicionar o usuário para estes grupos.",
        "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."
+       "apihelp-none-description": "Nenhuma saída.",
+       "api-help-flag-deprecated": "Este módulo é obsoleto.",
+       "api-help-source": "Fonte: $1",
+       "api-help-source-unknown": "Fonte: <span class=\"apihelp-unknown\">desconhecida</span>",
+       "api-help-license": "Licença: [[$1|$2]]",
+       "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
+       "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."
 }
index 709230a..b00e30b 100644 (file)
        "apihelp-main-param-requestid": "Qualquer valor fornecido aqui será incluído na resposta. Pode ser usado para distinguir pedidos.",
        "apihelp-main-param-servedby": "Incluir nos resultados o nome do servidor que serviu o pedido.",
        "apihelp-main-param-curtimestamp": "Incluir a data e hora atuais no resultado.",
+       "apihelp-main-param-responselanginfo": "Incluir as línguas usadas para <var>uselang</var> e <var>errorlang</var> no resultado.",
        "apihelp-main-param-origin": "Ao aceder à API usando um pedido AJAX entre domínios (CORS), coloque aqui o domínio de origem. Isto tem de ser incluído em todas as verificações prévias e, portanto, tem de fazer parte do URI do pedido (e não do conteúdo do POST).\n\nPara pedidos autenticados, este valor tem de corresponder de forma exata a um dos cabeçalhos <code>Origin</code>, portanto, tem de ser algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não for igual ao cabeçalho <code>Origin</code>, será devolvida a resposta 403. Se este parâmetro for igual ao cabeçalho <code>Origin</code> e a origem for permitida (''white-listed'') os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão preenchidos.\n\nPara pedidos não autenticados, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code>\nseja preenchido, mas <code>Access-Control-Allow-Credentials</code> terá o valor <code>false</code> e o acesso a todos os dados específicos do utilizador está restringido.",
-       "apihelp-main-param-uselang": "Língua a usar nas traduções de mensagens. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>user</kbd> para usar a língua nas preferências do utilizador atual, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki.",
+       "apihelp-main-param-uselang": "A língua a ser usada nas traduções de mensagens. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>user</kbd> para usar a língua nas preferências do utilizador atual, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki.",
+       "apihelp-main-param-errorformat": "O formato a ser usado no texto de avisos e erros.\n; plaintext: Texto wiki com os elementos HTML removidos e as entidades substituídas.\n; wikitext: Texto wiki sem análise sintática.\n; html: HTML.\n; raw: Chave e parâmetros da mensagem.\n; none: Sem saída de texto, só os códigos de erro.\n; bc: Formato usado antes do MediaWiki 1.29. <var>errorlang</var> e <var>errorsuselocal</var> são ignorados.",
+       "apihelp-main-param-errorlang": "A língua a ser usada para avisos e erros. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki, ou especifique <kbd>uselang</kbd> para usar o mesmo valor que o parâmetro <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Se fornecido, os textos de erro utilizarão mensagens personalizadas localmente do espaço nominal {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquear um utilizador.",
-       "apihelp-block-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a serem bloqueados.",
+       "apihelp-block-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a serem bloqueados. Não pode ser usado em conjunto com <var>$1userid</var>",
+       "apihelp-block-param-userid": "O identificador do utilizador a ser bloqueado. Não pode ser usado em conjunto com <var>$1user</var>.",
        "apihelp-block-param-expiry": "O período de expiração. Pode ser relativo (p. ex. <kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absoluto (p. ex. <kbd>2014-09-18T12:34:56Z</kbd>). Se definido como <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, o bloqueio nunca expirará.",
        "apihelp-block-param-reason": "O motivo do bloqueio.",
        "apihelp-block-param-anononly": "Bloquear só utilizadores anónimos (isto é, impedir edições anónimas a partir deste endereço IP)",
@@ -34,6 +39,7 @@
        "apihelp-block-param-allowusertalk": "Permitir que o utilizador edite a sua própria página de discussão (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Se o utilizador já está bloqueado, sobrescrever o bloco existente.",
        "apihelp-block-param-watchuser": "Vigiar as páginas de utilizador e de discussão, do utilizador ou do endereço IP.",
+       "apihelp-block-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
        "apihelp-block-example-ip-simple": "Bloquear o endereço IP <kbd>192.0.2.5</kbd> por três dias com o motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear o utilizador <kbd>Vandal</kbd> indefinidamente com o motivo <kbd>Vandalism</kbd>, e impedir a criação de nova conta e o envio de correio eletrónico.",
        "apihelp-changeauthenticationdata-description": "Alterar os dados de autenticação do utilizador atual.",
        "apihelp-help-example-query": "Ajuda para dois submódulos de consulta.",
        "apihelp-imagerotate-description": "Rodar uma ou mais imagens.",
        "apihelp-imagerotate-param-rotation": "Graus de rotação da imagem no sentido horário.",
+       "apihelp-imagerotate-param-tags": "Etiquetas a aplicar à entrada no registo de carregamentos.",
        "apihelp-imagerotate-example-simple": "Rodar <kbd>File:Example.png</kbd> <kbd>90</kbd> graus.",
        "apihelp-imagerotate-example-generator": "Rodar todas as imagens na categoria <kbd>Category:Flip</kbd> em <kbd>180</kbd> graus.",
        "apihelp-import-description": "Importar uma página de outra wiki ou de um ficheiro XML.\n\nNote que o POST do HTTP tem de ser feito como um carregamento de ficheiro (isto é, com multipart/form-data como Content-Type) ao enviar um ficheiro para o parâmetro <var>xml</var>.",
        "apihelp-import-param-templates": "Para importações interwikis: importar também todas as predefinições incluídas.",
        "apihelp-import-param-namespace": "Importar para este espaço nominal. Não pode ser usado em conjunto com <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpágina desta página. Não pode ser usado em conjunto com <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de importações e à revisão nula nas páginas importadas.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] para o espaço nominal 100 com o historial completo.",
        "apihelp-linkaccount-description": "Ligar uma conta de um fornecedor terceiro ao utilizador atual.",
        "apihelp-linkaccount-example-link": "Iniciar o processo de ligação a uma conta do fornecedor <kbd>Example</kbd>.",
        "apihelp-managetags-param-tag": "Etiqueta a ser criada, eliminada, ativada ou desativada. Para criar uma etiqueta ela não pode existir. Para eliminar uma etiqueta, ela tem de existir. Para ativar uma etiqueta, ela tem de existir e não estar a ser utilizada por nenhuma extensão. Para desativar uma etiqueta, ela tem de estar ativa e definida manualmente.",
        "apihelp-managetags-param-reason": "Um motivo, opcional, para a criação, eliminação, ativação ou desativação da etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Indica se devem ser ignorados todos os avisos gerados durante a operação.",
+       "apihelp-managetags-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de gestão de etiquetas.",
        "apihelp-managetags-example-create": "Criar uma etiqueta com o nome <kbd>spam</kbd> e o motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Eliminar a etiqueta <kbd>vandlaism</kbd> com o motivo <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Ativar uma etiqueta com o nome <kbd>spam</kbd> e o motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Remover a página e o redirecionamento das páginas vigiadas do utilizador atual.",
        "apihelp-move-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.",
+       "apihelp-move-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de movimentações e à revisão nula na página de destino.",
        "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> para <kbd>Goodtitle</kbd> sem deixar um redirecionamento.",
        "apihelp-opensearch-description": "Pesquisar a wiki usando o protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Texto a pesquisar.",
        "apihelp-patrol-description": "Patrulhar uma página ou revisão.",
        "apihelp-patrol-param-rcid": "Identificador da mudança recente a patrulhar.",
        "apihelp-patrol-param-revid": "Identificador da revisão a patrulhar.",
-       "apihelp-patrol-param-tags": "Etiquetas de modificação a aplicar à entrada do registo de patrulha.",
+       "apihelp-patrol-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de edições patrulhadas.",
        "apihelp-patrol-example-rcid": "Patrulhar uma mudança recente.",
        "apihelp-patrol-example-revid": "Patrulhar uma revisão.",
        "apihelp-protect-description": "Alterar o nível de proteção de uma página.",
        "apihelp-protect-example-protect": "Proteger uma página.",
        "apihelp-protect-example-unprotect": "Desproteger uma página definindo a restrição <kbd>all</kbd> (isto é, todos podem executar a operação).",
        "apihelp-protect-example-unprotect2": "Desproteger uma página definindo que não há restrições.",
-       "apihelp-purge-description": "Limpar a ''cache'' para os títulos especificados.\n\nRequer um pedido POST se o utilizador não tiver iniciado uma sessão.",
+       "apihelp-purge-description": "Limpar a ''cache'' para os títulos especificados.",
        "apihelp-purge-param-forcelinkupdate": "Atualizar as tabelas de ligações.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Atualizar a tabela de ligações, e atualizar as tabelas de ligações de qualquer página que usa esta página como modelo.",
        "apihelp-purge-example-simple": "Purgar as páginas <kbd>Main Page</kbd> e <kbd>API</kbd>.",
        "apihelp-query+allmessages-param-prop": "As propriedades a serem obtidas:",
        "apihelp-query+allmessages-param-enableparser": "Definir, para ativar o analisador sintático e pré-processar o texto da mensagem com notação wiki (substituir palavras mágicas, processar predefinições, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Se definido, não incluir o conteúdo das mensagens no resultado de saída.",
-       "apihelp-query+allmessages-param-includelocal": "Incluir também as mensagens locais, isto é, mensagens que não existem no software mas existem como uma página no espaço nominal MediaWiki:.\nIsto lista todas as páginas do espaço nominal MediaWiki:, portanto, também irá listar aquelas que não são verdadeiramente mensagens, como [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Incluir também as mensagens locais, isto é, mensagens que não existem no software mas existem como uma página no espaço nominal {{ns:MediaWiki}}.\nIsto lista todas as páginas do espaço nominal {{ns:MediaWiki}}, portanto, também irá listar aquelas que não são verdadeiramente mensagens, como [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Os argumentos a serem substituídos na mensagem.",
        "apihelp-query+allmessages-param-filter": "Devolver só as mensagens cujos nomes contêm este texto.",
        "apihelp-query+allmessages-param-customised": "Devolver só as mensagens neste estado de personalização.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Adiciona a profundidade em ''bits'' da versão.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Usado pela página Special:Upload para obter informação sobre um ficheiro existente. Não se destina a ser usado fora do núcleo central do MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Indica se o ficheiro está na lista [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "O número de revisões a serem devolvidas por ficheiro.",
        "apihelp-query+imageinfo-param-start": "Data e hora a partir da qual será começada a listagem.",
        "apihelp-query+imageinfo-param-end": "Data e hora na qual será terminada a listagem.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Se estiverem disponíveis traduções para a propriedade extmetadata, obtê-las todas.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Se for especificado e não estiver vazio, só serão devolvidas estas chaves para $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Um parâmetro de texto específico do objeto. Por exemplo, ficheiros PDF podem usar <kbd>page15-100px</kbd>. <var>$1urlwidth</var> tem de ser usado e ser consistente com <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Se <kbd>$2prop=badfile</kbd> estiver definido, este é o título da página usado ao calcular a [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Procurar ficheiros só no repositório local.",
        "apihelp-query+imageinfo-example-simple": "Obter informação sobre a versão atual do ficheiro [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Obter informação sobre as versões de [[:File:Test.jpg]] a partir de 2008.",
        "apihelp-query+usercontribs-param-limit": "O número máximo de contribuições a serem devolvidas.",
        "apihelp-query+usercontribs-param-start": "A data e hora da contribuição pela qual será começada a devolução de resultados.",
        "apihelp-query+usercontribs-param-end": "A data e hora da contribuição na qual será terminada a devolução de resultados.",
-       "apihelp-query+usercontribs-param-user": "Os utilizadores cujas contribuições serão obtidas.",
-       "apihelp-query+usercontribs-param-userprefix": "Obter as contribuições de todos os utilizadores cujos nomes começam por este valor. Tem precedência sobre $1user.",
+       "apihelp-query+usercontribs-param-user": "Os utilizadores cujas contribuições serão obtidas. Não pode ser usado em conjunto com <var>$1userids</var> ou <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Obter as contribuições de todos os utilizadores cujos nomes começam por este valor. Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Os identificadores dos utilizadores cujas contribuições serão obtidas. Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Listar só as contribuições nestes espaços nominais.",
        "apihelp-query+usercontribs-param-prop": "Incluir informações adicionais:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Adiciona os identificadores da página e da revisão.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indica se pode ser criada uma conta para os nomes de utilizador não registados, mas válidos.",
        "apihelp-query+users-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar se o utilizador tem ligação com a wiki designada por este identificador.",
        "apihelp-query+users-param-users": "Uma lista de utilizadores dos quais serão obtidas informações.",
+       "apihelp-query+users-param-userids": "Uma lista de identificadores dos utilizadores de que serão obtidas informações.",
        "apihelp-query+users-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Devolver informações sobre o utilizador <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obter mudanças recentes das páginas vigiadas do utilizador atual.",
        "apihelp-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-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-param-capture": "Devolver as palavras-passe temporárias que foram enviadas. Requer a permissão <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "Enviar uma mensagem eletrónica para reinício da palavra-passe ao utilizador <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "Enviar uma mensagem eletrónica para reinício da palavra-passe a todos os utilizadores com o correio eletrónico <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Eliminar e restaurar revisões.",
        "apihelp-revisiondelete-param-show": "O que deve ser mostrado para cada revisão.",
        "apihelp-revisiondelete-param-suppress": "Indica se devem ser suprimidos os dados aos administradores como a todos os restantes utilizadores.",
        "apihelp-revisiondelete-param-reason": "O motivo da eliminação ou restauro.",
+       "apihelp-revisiondelete-param-tags": "Etiquetas a aplicar à entrada no registo de eliminações.",
        "apihelp-revisiondelete-example-revision": "Ocultar o conteúdo da revisão <kbd>12345</kbd> na página <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Ocultar todos os dados na entrada <kbd>67890</kbd> do registo com o motivo <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "Desfazer a última edição da página.\n\nSe o último utilizador a editar a página realizou várias edições em sequência, estas serão todas desfeitas.",
        "apihelp-setnotificationtimestamp-example-page": "Reiniciar o estado de notificação da página <kbd>Main page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Definir a data e hora de notificação para a página <kbd>Main page</kbd> de forma a que todas as edições desde 1 de janeiro de 2012 passem a ser consideradas não vistas",
        "apihelp-setnotificationtimestamp-example-allpages": "Reiniciar o estado de notificação das páginas no espaço nominal <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Alterar a língua de uma página.",
+       "apihelp-setpagelanguage-description-disabled": "Não é permitido alterar a língua de uma página nesta wiki.\n\nAtivar <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para usar esta operação.",
+       "apihelp-setpagelanguage-param-title": "O título da página cuja língua pretende alterar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "O identificador da página cuja língua pretende alterar. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "O código de língua, da língua para a qual a página será alterada. Usar <kbd>default</kbd> para redefinir a língua da página para a língua padrão de conteúdo da wiki.",
+       "apihelp-setpagelanguage-param-reason": "Motivo da alteração.",
+       "apihelp-setpagelanguage-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que resultar desta operação.",
+       "apihelp-setpagelanguage-example-language": "Alterar a língua da página <kbd>Main Page</kbd> para basco.",
+       "apihelp-setpagelanguage-example-default": "Alterar a língua da página com o identificador 123 para a língua padrão de conteúdo da wiki.",
        "apihelp-stashedit-description": "Preparar uma edição na ''cache'' partilhada.\n\nIsto destina-se a ser usado via AJAX a partir do formulário de edição, para melhorar o desempenho da gravação da página.",
        "apihelp-stashedit-param-title": "Título da página que está a ser editada.",
        "apihelp-stashedit-param-section": "Número da secção. <kbd>0</kbd> para a secção do topo, <kbd>new</kbd> para uma secção nova.",
        "apihelp-tag-param-add": "As etiquetas a serem adicionadas. Só podem ser adicionadas as etiquetas definidas manualmente.",
        "apihelp-tag-param-remove": "As etiquetas a serem removidas. Só podem ser removidas as etiquetas definidas manualmente ou completamente indefinidas.",
        "apihelp-tag-param-reason": "O motivo da alteração.",
+       "apihelp-tag-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que será criada em resultado desta operação.",
        "apihelp-tag-example-rev": "Adicionar a etiqueta <kbd>vandalism</kbd> à revisão com o identificador 123, sem especificar um motivo.",
        "apihelp-tag-example-log": "Remover a etiqueta <kbd>spam</kbd> da entrada do registo com o identificador 123, com o motivo <kbd>Wrongly applied</kbd>.",
        "apihelp-tokens-description": "Obter chaves para operações de modificação de dados.\n\nEste módulo é obsoleto e foi substituído por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Obter uma chave de edição (padrão).",
        "apihelp-tokens-example-emailmove": "Obter uma chave de correio eletrónico e uma chave de movimentação.",
        "apihelp-unblock-description": "Desbloquear um utilizador.",
-       "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Nome de utilizador, endereço IP ou gama de endereços IP a desbloquear. Não pode ser usado em conjunto com <var>$1id</var>.",
+       "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a ser desbloqueado. Não pode ser usado em conjunto com <var>$1id</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "O identificador do utilizador a ser desbloqueado. Não pode ser usado em conjunto com <var>$1id</var> ou <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Motivo para o desbloqueio.",
        "apihelp-unblock-param-tags": "As etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
        "apihelp-unblock-example-id": "Desfazer o bloqueio com o identificador #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Desbloquear o utilizador <kbd>Bob</kbd> com o motivo <kbd>Sorry Bob</kbd>.",
-       "apihelp-undelete-description": "Restaurar revisões de uma página eliminada.\n\nPode obter-se uma lista de revisões eliminadas (incluindo as datas e horas de eliminação) com [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]] e uma lista de identificadores de ficheiros eliminados com [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restaurar revisões de uma página eliminada.\n\nPode obter-se uma lista de revisões eliminadas (incluindo as datas e horas de eliminação) com [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]] e uma lista de identificadores de ficheiros eliminados com [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Título da página a restaurar.",
        "apihelp-undelete-param-reason": "Motivo para restaurar a página.",
        "apihelp-undelete-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de eliminações.",
        "apihelp-userrights-description": "Alterar os membros de um grupo de utilizadores.",
        "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.",
+       "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-remove": "Remover o utilizador destes grupos.",
        "apihelp-userrights-param-reason": "O motivo da alteração.",
+       "apihelp-userrights-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de privilégios de utilizadores.",
        "apihelp-userrights-example-user": "Adicionar o utilizador <kbd>FooBot</kbd> ao grupo <kbd>bot</kbd> e removê-lo dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Adicionar o utilizador com o identificador <kbd>123</kbd> ao grupo <kbd>bot</kbd> e removê-lo dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
+       "apihelp-validatepassword-description": "Validar uma palavra-passe face às regras para palavras-passe da wiki.\n\nA validade é reportada <samp>Good</samp> (Boa) se a palavra-passe é aceitável, <samp>Change</samp> (Alterar) se a palavra-passe pode ser usada para iniciar uma sessão mas terá de ser alterada, ou <samp>Invalid</samp> (Inválida) se a palavra-passe não é utilizável.",
+       "apihelp-validatepassword-param-password": "A palavra-passe a ser validada.",
+       "apihelp-validatepassword-param-user": "O nome de utilizador, para ser usado ao testar a criação de conta. O nome de utilizador não pode existir.",
+       "apihelp-validatepassword-param-email": "O endereço de correio eletrónico, para ser usado ao testar a criação de conta.",
+       "apihelp-validatepassword-param-realname": "O nome verdadeiro, para ser usado ao testar a criação de conta.",
+       "apihelp-validatepassword-example-1": "Validar a palavra-passe <kbd>foobar</kbd> para o utilizador atual.",
+       "apihelp-validatepassword-example-2": "Validar a palavra-passe <kbd>qwerty</kbd> para a criação do utilizador <kbd>Example</kbd>.",
        "apihelp-watch-description": "Adicionar ou remover páginas da lista de páginas vigiadas do utilizador atual.",
        "apihelp-watch-param-title": "A página a vigiar ou deixar de ser vigiada. Em vez disto, usar <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Se definido, a página deixará de ser vigiada, em vez de o ser.",
        "apihelp-phpfm-description": "Produzir os dados de saída em formato PHP seriado (realce sintático em HTML).",
        "apihelp-rawfm-description": "Produzir os dados de saída, incluindo elementos para despiste de erros, em formato JSON (realce sintático em HTML).",
        "apihelp-xml-description": "Produzir os dados de saída em formato XML.",
-       "apihelp-xml-param-xslt": "Se especificado, adiciona a página nomeada como uma folha de estilo XSL. O valor tem de ser um título no espaço nominal {{ns:mediawiki}} e acabar em <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Se especificado, adiciona a página nomeada como uma folha de estilo XSL. O valor tem de ser um título no espaço nominal {{ns:MediaWiki}} e acabar em <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Se especificado, adiciona um espaço nominal XML.",
        "apihelp-xmlfm-description": "Produzir os dados de saída em formato XML (realce sintático em HTML).",
        "api-format-title": "Resultado da API do MediaWiki.",
        "api-help-param-upload": "Tem ser enviado (''posted'') como um carregamento de ficheiro usando multipart/form-data.",
        "api-help-param-multi-separate": "Separar os valores com <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|alternativas]].",
        "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para robôs).",
+       "api-help-param-multi-all": "Para especificar todos os valores, use <kbd>$1</kbd>.",
        "api-help-param-default": "Valor por omissão: $1",
        "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]]",
index f7c750e..c3ccad6 100644 (file)
        "apihelp-main-param-requestid": "{{doc-apihelp-param|main|requestid}}",
        "apihelp-main-param-servedby": "{{doc-apihelp-param|main|servedby}}",
        "apihelp-main-param-curtimestamp": "{{doc-apihelp-param|main|curtimestamp}}",
+       "apihelp-main-param-responselanginfo": "{{doc-apihelp-param|main|responselanginfo}}",
        "apihelp-main-param-origin": "{{doc-apihelp-param|main|origin}}",
        "apihelp-main-param-uselang": "{{doc-apihelp-param|main|uselang}}",
+       "apihelp-main-param-errorformat": "{{doc-apihelp-param|main|errorformat}}",
+       "apihelp-main-param-errorlang": "{{doc-apihelp-param|main|errorlang}}",
+       "apihelp-main-param-errorsuselocal": "{{doc-apihelp-param|main|errorsuselocal}}",
        "apihelp-block-description": "{{doc-apihelp-description|block}}",
        "apihelp-block-param-user": "{{doc-apihelp-param|block|user}}",
+       "apihelp-block-param-userid": "{{doc-apihelp-param|block|userid}}",
        "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}\n{{doc-important|Do not translate \"5 months\", \"2 weeks\", \"infinite\", \"indefinite\" or \"never\"!}}",
        "apihelp-block-param-reason": "{{doc-apihelp-param|block|reason}}",
        "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n* See also {{msg-mw|ipb-hardblock}}",
@@ -41,6 +46,7 @@
        "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}\n* See also {{msg-mw|ipb-disableusertalk}}",
        "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}",
        "apihelp-block-param-watchuser": "{{doc-apihelp-param|block|watchuser}}",
+       "apihelp-block-param-tags": "{{doc-apihelp-param|block|tags}}",
        "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}",
        "apihelp-block-example-user-complex": "{{doc-apihelp-example|block}}",
        "apihelp-changeauthenticationdata-description": "{{doc-apihelp-description|changeauthenticationdata}}",
        "apihelp-help-example-query": "{{doc-apihelp-example|help}}",
        "apihelp-imagerotate-description": "{{doc-apihelp-description|imagerotate}}",
        "apihelp-imagerotate-param-rotation": "{{doc-apihelp-param|imagerotate|rotation}}",
+       "apihelp-imagerotate-param-tags": "{{doc-apihelp-param|imagerotate|tags}}",
        "apihelp-imagerotate-example-simple": "{{doc-apihelp-example|imagerotate}}",
        "apihelp-imagerotate-example-generator": "{{doc-apihelp-example|imagerotate}}",
        "apihelp-import-description": "{{doc-apihelp-description|import}}",
        "apihelp-import-param-templates": "{{doc-apihelp-param|import|templates}}",
        "apihelp-import-param-namespace": "{{doc-apihelp-param|import|namespace}}",
        "apihelp-import-param-rootpage": "{{doc-apihelp-param|import|rootpage}}",
+       "apihelp-import-param-tags": "{{doc-apihelp-param|import|tags}}",
        "apihelp-import-example-import": "{{doc-apihelp-example|import}}",
        "apihelp-linkaccount-description": "{{doc-apihelp-description|linkaccount}}",
        "apihelp-linkaccount-example-link": "{{doc-apihelp-example|linkaccount}}",
        "apihelp-managetags-param-tag": "{{doc-apihelp-param|managetags|tag}}",
        "apihelp-managetags-param-reason": "{{doc-apihelp-param|managetags|reason}}",
        "apihelp-managetags-param-ignorewarnings": "{{doc-apihelp-param|managetags|ignorewarnings}}",
+       "apihelp-managetags-param-tags": "{{doc-apihelp-param|managetags|tags}}",
        "apihelp-managetags-example-create": "{{doc-apihelp-example|managetags}}",
        "apihelp-managetags-example-delete": "{{doc-apihelp-example|managetags|info={{doc-important|The text \"vandlaism\" in this message is intentionally misspelled; the example being documented by this message is the deletion of a misspelled tag.}}}}",
        "apihelp-managetags-example-activate": "{{doc-apihelp-example|managetags}}",
        "apihelp-move-param-unwatch": "{{doc-apihelp-param|move|unwatch}}",
        "apihelp-move-param-watchlist": "{{doc-apihelp-param|move|watchlist}}",
        "apihelp-move-param-ignorewarnings": "{{doc-apihelp-param|move|ignorewarnings}}",
+       "apihelp-move-param-tags": "{{doc-apihelp-param|move|tags}}",
        "apihelp-move-example-move": "{{doc-apihelp-example|move}}",
        "apihelp-opensearch-description": "{{doc-apihelp-description|opensearch}}",
        "apihelp-opensearch-param-search": "{{doc-apihelp-param|opensearch|search}}",
        "apihelp-query+allfileusages-param-prefix": "{{doc-apihelp-param|query+allfileusages|prefix}}",
        "apihelp-query+allfileusages-param-unique": "{{doc-apihelp-param|query+allfileusages|unique}}",
        "apihelp-query+allfileusages-param-prop": "{{doc-apihelp-param|query+allfileusages|prop|paramvalues=1}}",
-       "apihelp-query+allfileusages-paramvalue-prop-ids": "{{doc-apihelp-param|query+allfileusages|prop|ids}}",
-       "apihelp-query+allfileusages-paramvalue-prop-title": "{{doc-apihelp-param|query+allfileusages|prop|title}}",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+allfileusages|prop|ids}}",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+allfileusages|prop|title}}",
        "apihelp-query+allfileusages-param-limit": "{{doc-apihelp-param|query+allfileusages|limit}}",
        "apihelp-query+allfileusages-param-dir": "{{doc-apihelp-param|query+allfileusages|dir}}",
        "apihelp-query+allfileusages-example-B": "{{doc-apihelp-example|query+allfileusages}}",
        "apihelp-query+allredirects-param-prefix": "{{doc-apihelp-param|query+allredirects|prefix}}",
        "apihelp-query+allredirects-param-unique": "{{doc-apihelp-param|query+allredirects|unique}}",
        "apihelp-query+allredirects-param-prop": "{{doc-apihelp-param|query+allredirects|prop|paramvalues=1}}",
-       "apihelp-query+allredirects-paramvalue-prop-ids": "{{doc-apihelp-param|query+allredirects|prop|ids}}",
-       "apihelp-query+allredirects-paramvalue-prop-title": "{{doc-apihelp-param|query+allredirects|prop|title}}",
-       "apihelp-query+allredirects-paramvalue-prop-fragment": "{{doc-apihelp-param|query+allredirects|prop|fragment}}",
-       "apihelp-query+allredirects-paramvalue-prop-interwiki": "{{doc-apihelp-param|query+allredirects|prop|interwiki}}",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+allredirects|prop|ids}}",
+       "apihelp-query+allredirects-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+allredirects|prop|title}}",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "{{doc-apihelp-paramvalue|query+allredirects|prop|fragment}}",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "{{doc-apihelp-paramvalue|query+allredirects|prop|interwiki}}",
        "apihelp-query+allredirects-param-namespace": "{{doc-apihelp-param|query+allredirects|namespace}}",
        "apihelp-query+allredirects-param-limit": "{{doc-apihelp-param|query+allredirects|limit}}",
        "apihelp-query+allredirects-param-dir": "{{doc-apihelp-param|query+allredirects|dir}}",
        "apihelp-query+categorymembers-param-title": "{{doc-apihelp-param|query+categorymembers|title}}",
        "apihelp-query+categorymembers-param-pageid": "{{doc-apihelp-param|query+categorymembers|pageid}}",
        "apihelp-query+categorymembers-param-prop": "{{doc-apihelp-param|query+categorymembers|prop|paramvalues=1}}",
-       "apihelp-query+categorymembers-paramvalue-prop-ids": "{{doc-apihelp-param|query+categorymembers|prop|ids}}",
-       "apihelp-query+categorymembers-paramvalue-prop-title": "{{doc-apihelp-param|query+categorymembers|prop|title}}",
-       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "{{doc-apihelp-param|query+categorymembers|prop|sortkey}}",
-       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "{{doc-apihelp-param|query+categorymembers|prop|sortkeyprefix}}",
-       "apihelp-query+categorymembers-paramvalue-prop-type": "{{doc-apihelp-param|query+categorymembers|prop|type}}",
-       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "{{doc-apihelp-param|query+categorymembers|prop|timestamp}}",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+categorymembers|prop|ids}}",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+categorymembers|prop|title}}",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "{{doc-apihelp-paramvalue|query+categorymembers|prop|sortkey}}",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "{{doc-apihelp-paramvalue|query+categorymembers|prop|sortkeyprefix}}",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "{{doc-apihelp-paramvalue|query+categorymembers|prop|type}}",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+categorymembers|prop|timestamp}}",
        "apihelp-query+categorymembers-param-namespace": "{{doc-apihelp-param|query+categorymembers|namespace}}",
        "apihelp-query+categorymembers-param-type": "{{doc-apihelp-param|query+categorymembers|type}}",
        "apihelp-query+categorymembers-param-limit": "{{doc-apihelp-param|query+categorymembers|limit}}",
        "apihelp-query+deletedrevs-param-excludeuser": "{{doc-apihelp-param|query+deletedrevs|excludeuser}}",
        "apihelp-query+deletedrevs-param-namespace": "{{doc-apihelp-param|query+deletedrevs|namespace}}",
        "apihelp-query+deletedrevs-param-limit": "{{doc-apihelp-param|query+deletedrevs|limit}}",
-       "apihelp-query+deletedrevs-param-prop": "{{doc-apihelp-param|query+deletedrevs|prop}}",
+       "apihelp-query+deletedrevs-param-prop": "{{doc-apihelp-param|query+deletedrevs|prop}}\n{{doc-important|You can translate the word \"Deprecated\", but please do not alter the <code><nowiki>class=\"apihelp-deprecated\"</nowiki></code> attribute}}",
        "apihelp-query+deletedrevs-example-mode1": "{{doc-apihelp-example|query+deletedrevs}}",
        "apihelp-query+deletedrevs-example-mode2": "{{doc-apihelp-example|query+deletedrevs}}",
        "apihelp-query+deletedrevs-example-mode3-main": "{{doc-apihelp-example|query+deletedrevs}}",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "{{doc-apihelp-paramvalue|query+imageinfo|prop|archivename}}",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "{{doc-apihelp-paramvalue|query+imageinfo|prop|bitdepth}}",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "{{doc-apihelp-paramvalue|query+imageinfo|prop|uploadwarning}}",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "{{doc-apihelp-paramvalue|query+imageinfo|prop|badfile}}",
        "apihelp-query+imageinfo-param-limit": "{{doc-apihelp-param|query+imageinfo|limit}}",
        "apihelp-query+imageinfo-param-start": "{{doc-apihelp-param|query+imageinfo|start}}",
        "apihelp-query+imageinfo-param-end": "{{doc-apihelp-param|query+imageinfo|end}}",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "{{doc-apihelp-param|query+imageinfo|extmetadatamultilang}}",
        "apihelp-query+imageinfo-param-extmetadatafilter": "{{doc-apihelp-param|query+imageinfo|extmetadatafilter}}",
        "apihelp-query+imageinfo-param-urlparam": "{{doc-apihelp-param|query+imageinfo|urlparam}}",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "{{doc-apihelp-param|query+imageinfo|badfilecontexttitle}}",
        "apihelp-query+imageinfo-param-localonly": "{{doc-apihelp-param|query+imageinfo|localonly}}",
        "apihelp-query+imageinfo-example-simple": "{{doc-apihelp-example|query+imageinfo}}",
        "apihelp-query+imageinfo-example-dated": "{{doc-apihelp-example|query+imageinfo}}",
        "apihelp-query+langbacklinks-param-title": "{{doc-apihelp-param|query+langbacklinks|title}}",
        "apihelp-query+langbacklinks-param-limit": "{{doc-apihelp-param|query+langbacklinks|limit}}",
        "apihelp-query+langbacklinks-param-prop": "{{doc-apihelp-param|query+langbacklinks|prop|paramvalues=1}}",
-       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "{{doc-apihelp-param|query+langbacklinks|prop|lllang}}",
-       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "{{doc-apihelp-param|query+langbacklinks|prop|lltitle}}",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "{{doc-apihelp-paramvalue|query+langbacklinks|prop|lllang}}",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "{{doc-apihelp-paramvalue|query+langbacklinks|prop|lltitle}}",
        "apihelp-query+langbacklinks-param-dir": "{{doc-apihelp-param|query+langbacklinks|dir}}",
        "apihelp-query+langbacklinks-example-simple": "{{doc-apihelp-example|query+langbacklinks}}",
        "apihelp-query+langbacklinks-example-generator": "{{doc-apihelp-example|query+langbacklinks}}",
        "apihelp-query+pageswithprop-description": "{{doc-apihelp-description|query+pageswithprop}}",
        "apihelp-query+pageswithprop-param-propname": "{{doc-apihelp-param|query+pageswithprop|propname}}",
        "apihelp-query+pageswithprop-param-prop": "{{doc-apihelp-param|query+pageswithprop|prop|paramvalues=1}}",
-       "apihelp-query+pageswithprop-paramvalue-prop-ids": "{{doc-apihelp-param|query+pageswithprop|prop|ids}}",
-       "apihelp-query+pageswithprop-paramvalue-prop-title": "{{doc-apihelp-param|query+pageswithprop|prop|title}}",
-       "apihelp-query+pageswithprop-paramvalue-prop-value": "{{doc-apihelp-param|query+pageswithprop|prop|value}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+pageswithprop|prop|ids}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+pageswithprop|prop|title}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "{{doc-apihelp-paramvalue|query+pageswithprop|prop|value}}",
        "apihelp-query+pageswithprop-param-limit": "{{doc-apihelp-param|query+pageswithprop|limit}}",
        "apihelp-query+pageswithprop-param-dir": "{{doc-apihelp-param|query+pageswithprop|dir}}",
        "apihelp-query+pageswithprop-example-simple": "{{doc-apihelp-example|query+pageswithprop}}",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "{{doc-apihelp-paramvalue|query+search|prop|sectiontitle}}",
        "apihelp-query+search-paramvalue-prop-categorysnippet": "{{doc-apihelp-paramvalue|query+search|prop|categorysnippet}}",
        "apihelp-query+search-paramvalue-prop-isfilematch": "{{doc-apihelp-paramvalue|query+search|prop|isfilematch}}",
-       "apihelp-query+search-paramvalue-prop-score": "{{doc-apihelp-paramvalue|query+search|prop|score}}",
-       "apihelp-query+search-paramvalue-prop-hasrelated": "{{doc-apihelp-paramvalue|query+search|prop|hasrelated}}",
+       "apihelp-query+search-paramvalue-prop-score": "{{doc-apihelp-paramvalue|query+search|prop|score}}\n{{doc-important|Please do not alter the <code><nowiki>class=\"apihelp-deprecated\"</nowiki></code> attribute}}",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "{{doc-apihelp-paramvalue|query+search|prop|hasrelated}}\n{{doc-important|Please do not alter the <code><nowiki>class=\"apihelp-deprecated\"</nowiki></code> attribute}}",
        "apihelp-query+search-param-limit": "{{doc-apihelp-param|query+search|limit}}",
        "apihelp-query+search-param-interwiki": "{{doc-apihelp-param|query+search|interwiki}}",
        "apihelp-query+search-param-backend": "{{doc-apihelp-param|query+search|backend}}",
        "apihelp-query+usercontribs-param-end": "{{doc-apihelp-param|query+usercontribs|end}}",
        "apihelp-query+usercontribs-param-user": "{{doc-apihelp-param|query+usercontribs|user}}",
        "apihelp-query+usercontribs-param-userprefix": "{{doc-apihelp-param|query+usercontribs|userprefix}}",
+       "apihelp-query+usercontribs-param-userids": "{{doc-apihelp-param|query+usercontribs|userids}}",
        "apihelp-query+usercontribs-param-namespace": "{{doc-apihelp-param|query+usercontribs|namespace}}",
        "apihelp-query+usercontribs-param-prop": "{{doc-apihelp-param|query+usercontribs|prop|paramvalues=1}}",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+usercontribs|prop|ids}}",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "{{doc-apihelp-paramvalue|query+userinfo|prop|blockinfo}}",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "{{doc-apihelp-paramvalue|query+userinfo|prop|hasmsg}}",
        "apihelp-query+userinfo-paramvalue-prop-groups": "{{doc-apihelp-paramvalue|query+userinfo|prop|groups}}",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "{{doc-apihelp-paramvalue|query+userinfo|prop|groupmemberships}}",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "{{doc-apihelp-paramvalue|query+userinfo|prop|implicitgroups}}",
        "apihelp-query+userinfo-paramvalue-prop-rights": "{{doc-apihelp-paramvalue|query+userinfo|prop|rights}}",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "{{doc-apihelp-paramvalue|query+userinfo|prop|changeablegroups}}",
        "apihelp-query+userinfo-paramvalue-prop-options": "{{doc-apihelp-paramvalue|query+userinfo|prop|options}}",
-       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "{{doc-apihelp-paramvalue|query+userinfo|prop|preferencestoken}}",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "{{doc-apihelp-paramvalue|query+userinfo|prop|preferencestoken}}\n{{doc-important|You can translate the word \"Deprecated\", but please do not alter the <code><nowiki>class=\"apihelp-deprecated\"</nowiki></code> attribute}}",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "{{doc-apihelp-paramvalue|query+userinfo|prop|editcount}}",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "{{doc-apihelp-paramvalue|query+userinfo|prop|ratelimits}}",
        "apihelp-query+userinfo-paramvalue-prop-realname": "{{doc-apihelp-paramvalue|query+userinfo|prop|realname}}",
        "apihelp-query+users-param-prop": "{{doc-apihelp-param|query+users|prop|paramvalues=1}}",
        "apihelp-query+users-paramvalue-prop-blockinfo": "{{doc-apihelp-paramvalue|query+users|prop|blockinfo}}",
        "apihelp-query+users-paramvalue-prop-groups": "{{doc-apihelp-paramvalue|query+users|prop|groups}}",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "{{doc-apihelp-paramvalue|query+users|prop|groupmemberships}}",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "{{doc-apihelp-paramvalue|query+users|prop|implicitgroups}}",
        "apihelp-query+users-paramvalue-prop-rights": "{{doc-apihelp-paramvalue|query+users|prop|rights}}",
        "apihelp-query+users-paramvalue-prop-editcount": "{{doc-apihelp-paramvalue|query+users|prop|editcount}}",
        "apihelp-query+users-paramvalue-prop-cancreate": "{{doc-apihelp-paramvalue|query+users|prop|cancreate}}",
        "apihelp-query+users-param-attachedwiki": "{{doc-apihelp-param|query+users|attachedwiki}}",
        "apihelp-query+users-param-users": "{{doc-apihelp-param|query+users|users}}",
+       "apihelp-query+users-param-userids": "{{doc-apihelp-param|query+users|userids}}",
        "apihelp-query+users-param-token": "{{doc-apihelp-param|query+users|token}}",
        "apihelp-query+users-example-simple": "{{doc-apihelp-example|query+users}}",
        "apihelp-query+watchlist-description": "{{doc-apihelp-description|query+watchlist}}",
        "apihelp-resetpassword-description-noroutes": "{{doc-apihelp-description|resetpassword|info=This message is used when no known routes are enabled in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.|seealso={{msg-mw|apihelp-resetpassword-description}}}}",
        "apihelp-resetpassword-param-user": "{{doc-apihelp-param|resetpassword|user}}",
        "apihelp-resetpassword-param-email": "{{doc-apihelp-param|resetpassword|email}}",
-       "apihelp-resetpassword-param-capture": "{{doc-apihelp-param|resetpassword|capture}}",
        "apihelp-resetpassword-example-user": "{{doc-apihelp-example|resetpassword}}",
        "apihelp-resetpassword-example-email": "{{doc-apihelp-example|resetpassword}}",
        "apihelp-revisiondelete-description": "{{doc-apihelp-description|revisiondelete}}",
        "apihelp-revisiondelete-param-show": "{{doc-apihelp-param|revisiondelete|show}}",
        "apihelp-revisiondelete-param-suppress": "{{doc-apihelp-param|revisiondelete|suppress}}",
        "apihelp-revisiondelete-param-reason": "{{doc-apihelp-param|revisiondelete|reason}}",
+       "apihelp-revisiondelete-param-tags": "{{doc-apihelp-param|revisiondelete|tags}}",
        "apihelp-revisiondelete-example-revision": "{{doc-apihelp-example|revisiondelete}}",
        "apihelp-revisiondelete-example-log": "{{doc-apihelp-example|revisiondelete}}",
        "apihelp-rollback-description": "{{doc-apihelp-description|rollback}}",
        "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}",
+       "apihelp-setpagelanguage-description": "{{doc-apihelp-description|setpagelanguage}}",
+       "apihelp-setpagelanguage-description-disabled": "{{doc-apihelp-description|setpagelanguage|info=This message is used when changing the language of a page is not allowed on the wiki because <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> is not enabled.|seealso={{msg-mw|apihelp-setpagelanguage-description}}}}",
+       "apihelp-setpagelanguage-param-title": "{{doc-apihelp-param|setpagelanguage|title}}",
+       "apihelp-setpagelanguage-param-pageid": "{{doc-apihelp-param|setpagelanguage|pageid}}",
+       "apihelp-setpagelanguage-param-lang": "{{doc-apihelp-param|setpagelanguage|lang}}",
+       "apihelp-setpagelanguage-param-reason": "{{doc-apihelp-param|setpagelanguage|reason}}",
+       "apihelp-setpagelanguage-param-tags": "{{doc-apihelp-param|setpagelanguage|tags}}",
+       "apihelp-setpagelanguage-example-language": "{{doc-apihelp-example|setpagelanguage}}",
+       "apihelp-setpagelanguage-example-default": "{{doc-apihelp-example|setpagelanguage}}",
        "apihelp-stashedit-description": "{{doc-apihelp-description|stashedit}}",
        "apihelp-stashedit-param-title": "{{doc-apihelp-param|stashedit|title}}",
        "apihelp-stashedit-param-section": "{{doc-apihelp-param|stashedit|section}}",
        "apihelp-tag-param-add": "{{doc-apihelp-param|tag|add}}",
        "apihelp-tag-param-remove": "{{doc-apihelp-param|tag|remove}}",
        "apihelp-tag-param-reason": "{{doc-apihelp-param|tag|reason}}",
+       "apihelp-tag-param-tags": "{{doc-apihelp-param|tag|tags}}",
        "apihelp-tag-example-rev": "{{doc-apihelp-example|tag}}",
        "apihelp-tag-example-log": "{{doc-apihelp-example|tag}}",
        "apihelp-tokens-description": "{{doc-apihelp-description|tokens}}",
        "apihelp-unblock-description": "{{doc-apihelp-description|unblock}}",
        "apihelp-unblock-param-id": "{{doc-apihelp-param|unblock|id}}",
        "apihelp-unblock-param-user": "{{doc-apihelp-param|unblock|user}}",
+       "apihelp-unblock-param-userid": "{{doc-apihelp-param|unblock|userid}}",
        "apihelp-unblock-param-reason": "{{doc-apihelp-param|unblock|reason}}",
        "apihelp-unblock-param-tags": "{{doc-apihelp-param|unblock|tags}}",
        "apihelp-unblock-example-id": "{{doc-apihelp-example|unblock}}",
        "apihelp-userrights-param-user": "{{doc-apihelp-param|userrights|user}}\n{{Identical|Username}}",
        "apihelp-userrights-param-userid": "{{doc-apihelp-param|userrights|userid}}\n{{Identical|User ID}}",
        "apihelp-userrights-param-add": "{{doc-apihelp-param|userrights|add}}",
+       "apihelp-userrights-param-expiry": "{{doc-apihelp-param|userrights|expiry}}",
        "apihelp-userrights-param-remove": "{{doc-apihelp-param|userrights|remove}}",
        "apihelp-userrights-param-reason": "{{doc-apihelp-param|userrights|reason}}",
+       "apihelp-userrights-param-tags": "{{doc-apihelp-param|userrights|tags}}",
        "apihelp-userrights-example-user": "{{doc-apihelp-example|userrights}}",
        "apihelp-userrights-example-userid": "{{doc-apihelp-example|userrights}}",
+       "apihelp-userrights-example-expiry": "{{doc-apihelp-example|userrights}}",
+       "apihelp-validatepassword-description": "{{doc-apihelp-description|validatepassword}}",
+       "apihelp-validatepassword-param-password": "{{doc-apihelp-param|validatepassword|password}}",
+       "apihelp-validatepassword-param-user": "{{doc-apihelp-param|validatepassword|user}}",
+       "apihelp-validatepassword-param-email": "{{doc-apihelp-param|validatepassword|email}}",
+       "apihelp-validatepassword-param-realname": "{{doc-apihelp-param|validatepassword|realname}}",
+       "apihelp-validatepassword-example-1": "{{doc-apihelp-example|validatepassword}}",
+       "apihelp-validatepassword-example-2": "{{doc-apihelp-example|validatepassword}}",
        "apihelp-watch-description": "{{doc-apihelp-description|watch}}",
        "apihelp-watch-param-title": "{{doc-apihelp-param|watch|title}}",
        "apihelp-watch-param-unwatch": "{{doc-apihelp-param|watch|unwatch}}",
        "apihelp-jsonfm-description": "{{doc-apihelp-description|jsonfm|seealso=* {{msg-mw|apihelp-json-description}}}}",
        "apihelp-none-description": "{{doc-apihelp-description|none}}",
        "apihelp-php-description": "{{doc-apihelp-description|php|seealso=* {{msg-mw|apihelp-phpfm-description}}}}",
-       "apihelp-php-param-formatversion": "{{doc-apihelp-param|json|formatversion}}",
+       "apihelp-php-param-formatversion": "{{doc-apihelp-param|php|formatversion}}",
        "apihelp-phpfm-description": "{{doc-apihelp-description|phpfm|seealso=* {{msg-mw|apihelp-php-description}}}}",
        "apihelp-rawfm-description": "{{doc-apihelp-description|rawfm|seealso=* {{msg-mw|apihelp-raw-description}}}}",
        "apihelp-xml-description": "{{doc-apihelp-description|xml|seealso=* {{msg-mw|apihelp-xmlfm-description}}}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
        "api-help-datatypes-header": "Header for the data type section in the API help output",
-       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside &lt;kbd&gt; tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside <nowiki><kbd></kbd></nowiki> or <nowiki><var></var></nowiki> tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd&gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-upload": "{{technical}} Used to indicate that an 'upload'-type parameter must be posted as a file upload using multipart/form-data",
        "api-help-param-multi-separate": "Used to indicate how to separate multiple values. Not used with {{msg-mw|api-help-param-list}}.",
        "api-help-param-multi-max": "Used to indicate the maximum number of values accepted for a multi-valued parameter.\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
+       "api-help-param-multi-all": "Used to indicate what string can be used to specify all possible values of a multi-valued parameter. \n\nParameters:\n* $1 - String to specify all possible values of the parameter",
        "api-help-param-default": "Used to display the default value for an API parameter\n\nParameters:\n* $1 - Default value\n\nSee also:\n* {{msg-mw|api-help-param-default-empty}}\n{{Identical|Default}}",
        "api-help-param-default-empty": "Used to display the default value for an API parameter when that default is an empty value\n\nSee also:\n* {{msg-mw|api-help-param-default}}",
        "api-help-param-token": "{{doc-apihelp-param|description=any 'token' parameter|paramstart=2|params=\n* $1 - Token type|noseealso=1}}",
        "api-help-authmanagerhelper-returnurl": "{{doc-apihelp-param|description=the \"returnurl\" parameter for AuthManager-using API modules|noseealso=1}}",
        "api-help-authmanagerhelper-continue": "{{doc-apihelp-param|description=the \"continue\" parameter for AuthManager-using API modules|noseealso=1}}",
        "api-help-authmanagerhelper-additional-params": "Message to display for AuthManager modules that take additional parameters to populate AuthenticationRequests. Parameters:\n* $1 - AuthManager action used by this module\n* $2 - Module parameter prefix, e.g. \"login\"\n* $3 - Module name, e.g. \"clientlogin\"\n* $4 - Module path, e.g. \"clientlogin\"",
+       "apierror-allimages-redirect": "{{doc-apierror}}",
+       "apierror-allpages-generator-redirects": "{{doc-apierror}}",
+       "apierror-appendnotsupported": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model",
+       "apierror-articleexists": "{{doc-apierror}}",
+       "apierror-assertbotfailed": "{{doc-apierror}}",
+       "apierror-assertnameduserfailed": "{{doc-apierror}}\n\nParameters:\n* $1 - User name passed in.",
+       "apierror-assertuserfailed": "{{doc-apierror}}",
+       "apierror-autoblocked": "{{doc-apierror}}",
+       "apierror-badconfig-resulttoosmall": "{{doc-apierror}}",
+       "apierror-badcontinue": "{{doc-apierror}}",
+       "apierror-baddiff": "{{doc-apierror}}",
+       "apierror-baddiffto": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apierror-badformat-generic": "{{doc-apierror}}\n\nParameters:\n* $1 - Content format.\n* $2 - Content model.",
+       "apierror-badformat": "{{doc-apierror}}\n\nParameters:\n* $1 - Content format.\n* $2 - Content model.\n* $3 - Title using the model.",
+       "apierror-badgenerator-notgenerator": "{{doc-apierror}}\n\nParameters:\n* $1 - Generator module name.",
+       "apierror-badgenerator-unknown": "{{doc-apierror}}\n\nParameters:\n* $1 - Generator module name.",
+       "apierror-badip": "{{doc-apierror}}",
+       "apierror-badmd5": "{{doc-apierror}}",
+       "apierror-badmodule-badsubmodule": "{{doc-apierror}}\n\nParameters:\n* $1 - Module path.\n* $2 - Submodule name.",
+       "apierror-badmodule-nosubmodules": "{{doc-apierror}}\n\nParameters:\n* $1 - Module path.",
+       "apierror-badparameter": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-badquery": "{{doc-apierror}}",
+       "apierror-badtimestamp": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Value of the parameter.",
+       "apierror-badtoken": "{{doc-apierror}}",
+       "apierror-badupload": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-badurl": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Value of the parameter.",
+       "apierror-baduser": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Value of the parameter.",
+       "apierror-badvalue-notmultivalue": "{{doc-apierror}}",
+       "apierror-bad-watchlist-token": "{{doc-apierror}}",
+       "apierror-blockedfrommail": "{{doc-apierror}}",
+       "apierror-blocked": "{{doc-apierror}}",
+       "apierror-botsnotsupported": "{{doc-apierror}}",
+       "apierror-cannot-async-upload-file": "{{doc-apierror}}",
+       "apierror-cannotreauthenticate": "{{doc-apierror}}",
+       "apierror-cannotviewtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Title.",
+       "apierror-cantblock-email": "{{doc-apierror}}",
+       "apierror-cantblock": "{{doc-apierror}}",
+       "apierror-cantchangecontentmodel": "{{doc-apierror}}",
+       "apierror-canthide": "{{doc-apierror}}",
+       "apierror-cantimport-upload": "{{doc-apierror}}",
+       "apierror-cantimport": "{{doc-apierror}}",
+       "apierror-cantoverwrite-sharedfile": "{{doc-apierror}}",
+       "apierror-cantsend": "{{doc-apierror}}",
+       "apierror-cantundelete": "{{doc-apierror}}",
+       "apierror-changeauth-norequest": "{{doc-apierror}}",
+       "apierror-chunk-too-small": "{{doc-apierror}}\n\nParameters:\n* $1 - Minimum size in bytes.",
+       "apierror-cidrtoobroad": "{{doc-apierror}}\n\nParameters:\n* $1 - \"IPv4\" or \"IPv6\"\n* $2 - Minimum CIDR mask length.",
+       "apierror-compare-inputneeded": "{{doc-apierror}}",
+       "apierror-contentserializationexception": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, may end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-contenttoobig": "{{doc-apierror}}\n\nParameters:\n* $1 - Maximum article size in kilobytes.",
+       "apierror-copyuploadbaddomain": "{{doc-apierror}}",
+       "apierror-copyuploadbadurl": "{{doc-apierror}}",
+       "apierror-create-titleexists": "{{doc-apierror}}",
+       "apierror-csp-report": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code, e.g. \"toobig\".",
+       "apierror-databaseerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception log ID code. This is meaningless to the end user, but can be used by people with access to the logs to easily find the logged error.",
+       "apierror-deletedrevs-param-not-1-2": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-description}}",
+       "apierror-deletedrevs-param-not-3": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-description}}",
+       "apierror-emptynewsection": "{{doc-apierror}}",
+       "apierror-emptypage": "{{doc-apierror}}",
+       "apierror-exceptioncaught": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception log ID code. This is meaningless to the end user, but can be used by people with access to the logs to easily find the logged error.\n* $2 - Exception message, which may end with punctuation. Probably in English.",
+       "apierror-filedoesnotexist": "{{doc-apierror}}",
+       "apierror-fileexists-sharedrepo-perm": "{{doc-apierror}}",
+       "apierror-filenopath": "{{doc-apierror}}",
+       "apierror-filetypecannotberotated": "{{doc-apierror}}",
+       "apierror-formatphp": "{{doc-apierror}}",
+       "apierror-imageusage-badtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Module name.",
+       "apierror-import-unknownerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Error message returned by the import, probably in English.",
+       "apierror-integeroutofrange-abovebotmax": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name\n* $2 - Maximum allowed value\n* $3 - Supplied value",
+       "apierror-integeroutofrange-abovemax": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name\n* $2 - Maximum allowed value\n* $3 - Supplied value",
+       "apierror-integeroutofrange-belowminimum": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name\n* $2 - Minimum allowed value\n* $3 - Supplied value",
+       "apierror-invalidcategory": "{{doc-apierror}}",
+       "apierror-invalid-chunk": "{{doc-apierror}}",
+       "apierror-invalidexpiry": "{{doc-apierror}}\n\nParameters:\n* $1 - Value provided.",
+       "apierror-invalid-file-key": "{{doc-apierror}}",
+       "apierror-invalidlang": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-invalidoldimage": "{{doc-apierror}}",
+       "apierror-invalidparammix-cannotusewith": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name or \"parameter=value\" text.\n* $2 - Parameter name or \"parameter=value\" text.",
+       "apierror-invalidparammix-mustusewith": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name or \"parameter=value\" text.\n* $2 - Parameter name or \"parameter=value\" text.",
+       "apierror-invalidparammix-parse-new-section": "{{doc-apierror}}",
+       "apierror-invalidparammix": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names or \"parameter=value\" text.\n* $2 - Number of parameters.",
+       "apierror-invalidsection": "{{doc-apierror}}",
+       "apierror-invalidsha1base36hash": "{{doc-apierror}}",
+       "apierror-invalidsha1hash": "{{doc-apierror}}",
+       "apierror-invalidtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Title that is invalid",
+       "apierror-invalidurlparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Key\n* $3 - Value.",
+       "apierror-invaliduser": "{{doc-apierror}}\n\nParameters:\n* $1 - User name that is invalid.",
+       "apierror-invaliduserid": "{{doc-apierror}}",
+       "apierror-maxlag-generic": "{{doc-apierror}}\n\nParameters:\n* $1 - Database is lag in seconds.",
+       "apierror-maxlag": "{{doc-apierror}}\n\nParameters:\n* $1 - Database lag in seconds.\n* $2 - Database server that is lagged.",
+       "apierror-mimesearchdisabled": "{{doc-apierror}}",
+       "apierror-missingcontent-pageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.",
+       "apierror-missingparam-at-least-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names.\n* $2 - Number of parameters.",
+       "apierror-missingparam-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names.\n* $2 - Number of parameters.",
+       "apierror-missingparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-missingrev-pageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.",
+       "apierror-missingtitle-createonly": "{{doc-apierror}}",
+       "apierror-missingtitle": "{{doc-apierror}}",
+       "apierror-missingtitle-byname": "{{doc-apierror}}",
+       "apierror-moduledisabled": "{{doc-apierror}}\n\nParameters:\n* $1 - Name of the module.",
+       "apierror-multival-only-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Possible values for the parameter.\n* $3 - Number of values.",
+       "apierror-multival-only-one": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-multpages": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name",
+       "apierror-mustbeloggedin-changeauth": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-generic": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-linkaccounts": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-removeauth": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-uploadstash": "{{doc-apierror}}",
+       "apierror-mustbeloggedin": "{{doc-apierror}}\n\nParameters:\n* $1 - One of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.\n\nSee also:\n* {{msg-mw|apierror-permissiondenied}}\n* {{msg-mw|permissionserrorstext-withaction}}",
+       "apierror-mustbeposted": "{{doc-apierror}}\n\nParameters:\n* $1 - Module name.",
+       "apierror-mustpostparams": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter names.\n* $2 - Number of parameters.",
+       "apierror-noapiwrite": "{{doc-apierror}}",
+       "apierror-nochanges": "{{doc-apierror}}",
+       "apierror-nodeleteablefile": "{{doc-apierror}}",
+       "apierror-no-direct-editing": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model.\n* $2 - Title using the model.",
+       "apierror-noedit-anon": "{{doc-apierror}}",
+       "apierror-noedit": "{{doc-apierror}}",
+       "apierror-noimageredirect-anon": "{{doc-apierror}}",
+       "apierror-noimageredirect": "{{doc-apierror}}",
+       "apierror-nosuchlogid": "{{doc-apierror}}\n\nParameters:\n* $1 - Log ID number.",
+       "apierror-nosuchpageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.",
+       "apierror-nosuchrcid": "{{doc-apierror}}\n\nParameters:\n* $1 - RecentChanges ID number.",
+       "apierror-nosuchrevid": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+       "apierror-nosuchsection": "{{doc-apierror}}\n\nParameters:\n* $1 - Section identifier. Probably a number or \"T-\" followed by a number.",
+       "apierror-nosuchsection-what": "{{doc-apierror}}\n\nParameters:\n* $1 - Section identifier. Probably a number or \"T-\" followed by a number.\n* $2 - Page title, revision ID formatted with {{msg-mw|revid}}, or page ID formatted with {{msg-mw|pageid}}.",
+       "apierror-nosuchuserid": "{{doc-apierror}}",
+       "apierror-notarget": "{{doc-apierror}}",
+       "apierror-notpatrollable": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+       "apierror-nouploadmodule": "{{doc-apierror}}",
+       "apierror-opensearch-json-warnings": "{{doc-apierror}}",
+       "apierror-pagecannotexist": "{{doc-apierror}}",
+       "apierror-pagedeleted": "{{doc-apierror}}",
+       "apierror-pagelang-disabled": "{{doc-apierror}}",
+       "apierror-paramempty": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-parsetree-notwikitext": "{{doc-apierror}}",
+       "apierror-parsetree-notwikitext-title": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title.\n* $2 - Content model.",
+       "apierror-pastexpiry": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied expiry time.",
+       "apierror-permissiondenied": "{{doc-apierror}}\n\nParameters:\n* $1 - One of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.\n\nSee also:\n* {{msg-mw|permissionserrorstext-withaction}}",
+       "apierror-permissiondenied-generic": "{{doc-apierror}}",
+       "apierror-permissiondenied-patrolflag": "{{doc-apierror}}\n\nSee also:\n* {{msg-mw|apierror-permissiondenied}}",
+       "apierror-permissiondenied-unblock": "{{doc-apierror}}\n\nSee also:\n* {{msg-mw|apierror-permissiondenied}}",
+       "apierror-prefixsearchdisabled": "{{doc-apierror}}",
+       "apierror-promised-nonwrite-api": "{{doc-apierror}}",
+       "apierror-protect-invalidaction": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied protection type.",
+       "apierror-protect-invalidlevel": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied protection level.",
+       "apierror-ratelimited": "{{doc-apierror}}",
+       "apierror-readapidenied": "{{doc-apierror}}",
+       "apierror-readonly": "{{doc-apierror}}",
+       "apierror-reauthenticate": "{{doc-apierror}}",
+       "apierror-redirect-appendonly": "{{doc-apierror}}",
+       "apierror-revdel-mutuallyexclusive": "{{doc-apierror}}",
+       "apierror-revdel-needtarget": "{{doc-apierror}}",
+       "apierror-revdel-paramneeded": "{{doc-apierror}}",
+       "apierror-revisions-norevids": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apierror-revisions-singlepage": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apierror-revwrongpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n* $2 - Page title.",
+       "apierror-searchdisabled": "{{doc-apierror}}\n\nParameters:\n* $1 - Search parameter that is disabled.",
+       "apierror-sectionreplacefailed": "{{doc-apierror}}",
+       "apierror-sectionsnotsupported": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model that doesn't support sections.",
+       "apierror-sectionsnotsupported-what": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title, revision ID formatted with {{msg-mw|revid}}, or page ID formatted with {{msg-mw|pageid}}.",
+       "apierror-show": "{{doc-apierror}}",
+       "apierror-siteinfo-includealldenied": "{{doc-apierror}}",
+       "apierror-sizediffdisabled": "{{doc-apierror}}",
+       "apierror-spamdetected": "{{doc-apierror}}\n\nParameters:\n* $1 - Matching \"spam filter\".\n\nSee also:\n* {{msg-mw|spamprotectionmatch}}",
+       "apierror-specialpage-cantexecute": "{{doc-apierror}}",
+       "apierror-stashedfilenotfound": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashedit-missingtext": "{{doc-apierror}}",
+       "apierror-stashexception": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. May be English or localized, may or may not end in punctuation.",
+       "apierror-stashfailed-complete": "{{doc-apierror}}",
+       "apierror-stashfailed-nosession": "{{doc-apierror}}",
+       "apierror-stashfilestorage": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, which may already end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashinvalidfile": "{{doc-apierror}}",
+       "apierror-stashnosuchfilekey": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashpathinvalid": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashwrongowner": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, which should already end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashzerolength": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-systemblocked": "{{doc-apierror}}",
+       "apierror-templateexpansion-notwikitext": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title.\n* $2 - Content model.",
+       "apierror-toofewexpiries": "{{doc-apierror}}\n\nParameters:\n* $1 - Number provided.\n* $2 - Number needed.",
+       "apierror-unknownaction": "{{doc-apierror}}\n\nParameters:\n* $1 - Action provided.",
+       "apierror-unknownerror-editpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (an integer).",
+       "apierror-unknownerror-nocode": "{{doc-apierror}}",
+       "apierror-unknownerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (possibly a message key) not handled by ApiBase::parseMsg().",
+       "apierror-unknownformat": "{{doc-apierror}}\n\nParameters:\n* $1 - Format provided.",
+       "apierror-unrecognizedparams": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameters.\n* $2 - Number of parameters.",
+       "apierror-unrecognizedvalue": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Parameter value.",
+       "apierror-unsupportedrepo": "{{doc-apierror}}",
+       "apierror-upload-filekeyneeded": "{{doc-apierror}}",
+       "apierror-upload-filekeynotallowed": "{{doc-apierror}}",
+       "apierror-upload-inprogress": "{{doc-apierror}}",
+       "apierror-upload-missingresult": "{{doc-apierror}}",
+       "apierror-urlparamnormal": "{{doc-apierror}}\n\nParameters:\n* $1 - Image title.",
+       "apierror-writeapidenied": "{{doc-apierror}}",
+       "apiwarn-alldeletedrevisions-performance": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apiwarn-badurlparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Image title.",
+       "apiwarn-badutf8": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n{{doc-important|Do not translate \"\\t\", \"\\n\", and \"\\r\"}}",
+       "apiwarn-checktoken-percentencoding": "{{doc-apierror}}",
+       "apiwarn-deprecation-deletedrevs": "{{doc-apierror}}",
+       "apiwarn-deprecation-expandtemplates-prop": "{{doc-apierror}}",
+       "apiwarn-deprecation-httpsexpected": "{{doc-apierror}}",
+       "apiwarn-deprecation-login-botpw": "{{doc-apierror}}",
+       "apiwarn-deprecation-login-nobotpw": "{{doc-apierror}}",
+       "apiwarn-deprecation-login-token": "{{doc-apierror}}",
+       "apiwarn-deprecation-parameter": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apiwarn-deprecation-parse-headitems": "{{doc-apierror}}",
+       "apiwarn-deprecation-purge-get": "{{doc-apierror}}",
+       "apiwarn-deprecation-withreplacement": "{{doc-apierror}}\n\nParameters:\n* $1 - Query string fragment that is deprecated, e.g. \"action=tokens\".\n* $2 - Query string fragment to use instead, e.g. \"action=tokens\".",
+       "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n\n\"r\" is short for \"revision\". You may translate it.",
+       "apiwarn-errorprinterfailed": "{{doc-apierror}}",
+       "apiwarn-errorprinterfailed-ex": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, which may already end in punctuation. Probably in English.",
+       "apiwarn-invalidcategory": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied category name.",
+       "apiwarn-invalidtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied title.",
+       "apiwarn-invalidxmlstylesheetext": "{{doc-apierror}}",
+       "apiwarn-invalidxmlstylesheet": "{{doc-apierror}}",
+       "apiwarn-invalidxmlstylesheetns": "{{doc-apierror}}",
+       "apiwarn-moduleswithoutvars": "{{doc-apierror}}",
+       "apiwarn-notfile": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied file name.",
+       "apiwarn-nothumb-noimagehandler": "{{doc-apierror}}\n\nParameters:\n* $1 - File name.",
+       "apiwarn-parse-nocontentmodel": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model being assumed.",
+       "apiwarn-parse-titlewithouttext": "{{doc-apierror}}",
+       "apiwarn-redirectsandrevids": "{{doc-apierror}}",
+       "apiwarn-tokennotallowed": "{{doc-apierror}}\n\nParameters:\n* $1 - Token type being requested, typically named after the action requiring the token.",
+       "apiwarn-tokens-origin": "{{doc-apierror}}",
+       "apiwarn-toomanyvalues": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Maximum number of values allowed.",
+       "apiwarn-truncatedresult": "{{doc-apierror}}\n\nParameters:\n* $1 - Size limit in bytes.",
+       "apiwarn-unclearnowtimestamp": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Supplied value.",
+       "apiwarn-unrecognizedvalues": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - List of unknown values supplied.\n* $3 - Number of unknown values.",
+       "apiwarn-unsupportedarray": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apiwarn-urlparamwidth": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Width being ignored.\n* $3 - Width being used.",
+       "apiwarn-validationfailed-badchars": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.",
+       "apiwarn-validationfailed-badpref": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.",
+       "apiwarn-validationfailed-cannotset": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.",
+       "apiwarn-validationfailed-keytoolong": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.\n\nParameters:\n* $1 - Maximum allowed key length in bytes.",
+       "apiwarn-validationfailed": "{{doc-apierror}}\n\nParameters:\n* $1 - User preference name.\n* $2 - Failure message, such as {{msg-mw|apiwarn-validationfailed-badpref}}. Probably already ends with punctuation",
+       "apiwarn-wgDebugAPI": "{{doc-apierror}}",
+       "api-feed-error-title": "Used as a feed item title when an error occurs in <kbd>action=feedwatchlist</kbd>.\n\nParameters:\n* $1 - API error code\n{{Identical|Error}}",
+       "api-usage-docref": "\n\nParameters:\n* $1 - URL of the API auto-generated documentation.",
+       "api-usage-mailinglist-ref": "{{doc-apierror}} Also used in the error response.",
+       "api-exception-trace": "\n\nParameters:\n* $1 - Exception class.\n* $2 - File from which the exception was thrown.\n* $3 - Line number from which the exception was thrown.\n* $4 - Exception backtrace.",
        "api-credits-header": "Header for the API credits section in the API help output\n{{Identical|Credit}}",
        "api-credits": "API credits text, displayed in the API help output"
 }
index 2879020..007c9d7 100644 (file)
                        "MaxSem",
                        "Irus",
                        "MaxBioHazard",
-                       "Kareyac"
+                       "Kareyac",
+                       "Mailman",
+                       "Ping08",
+                       "Ivan-r"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки и может измениться в любой момент. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Действие, которое следует выполнить.",
        "apihelp-main-param-format": "Формат вывода.",
-       "apihelp-main-param-maxlag": "Ð\9cакÑ\81ималÑ\8cное Ð¾Ñ\82Ñ\81Ñ\82авание Ð¼Ð¾Ð¶ÐµÑ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð¸Ñ\81полÑ\8cзован, ÐºÐ¾Ð³Ð´Ð° Ð\9cедиавики Ñ\83Ñ\81Ñ\82анавливаеÑ\82Ñ\81Ñ\8f Ð½Ð° Ñ\80еплиÑ\86иÑ\80Ñ\83емой Ð±Ð°Ð·Ñ\8b Ð´Ð°Ð½Ð½Ñ\8bÑ\85 ÐºÐ»Ð°Ñ\81Ñ\82еÑ\80а. Ð§Ñ\82обÑ\8b Ñ\81паÑ\81Ñ\82и Ð´ÐµÐ¹Ñ\81Ñ\82вий, Ñ\81поÑ\81обнÑ\8bÑ\85 Ð¿Ñ\80иÑ\87иниÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е Ð¾Ñ\82Ñ\81Ñ\82аваÑ\82Ñ\8c Ñ\80епликаÑ\86ии Ñ\81айÑ\82а, Ñ\8dÑ\82оÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¼Ð¾Ð¶ÐµÑ\82 Ð·Ð°Ñ\81Ñ\82авлÑ\8fÑ\82Ñ\8c ÐºÐ»Ð¸ÐµÐ½Ñ\82а Ð¶Ð´Ð°Ñ\82Ñ\8c Ð´Ð¾ Ð·Ð°Ð´ÐµÑ\80жки Ñ\80епликаÑ\86ии Ð¼ÐµÐ½Ñ\8cÑ\88е Ñ\83казанного Ð·Ð½Ð°Ñ\87ениÑ\8f. Ð\92 Ñ\81лÑ\83Ñ\87ае Ñ\87Ñ\80езмеÑ\80ной Ð·Ð°Ð´ÐµÑ\80жки, ÐºÐ¾Ð´ Ð¾Ñ\88ибки <samp>maxlag</samp> Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82Ñ\81Ñ\8f Ñ\81 Ñ\81ообÑ\89ением <samp>ждеÑ\82 $ведÑ\83Ñ\89ий: $оÑ\82Ñ\81Ñ\82аваÑ\82Ñ\8c Ñ\81екÑ\83нд Ð¾Ñ\82Ñ\81Ñ\82ала</samp>.<br />См. [[mw:Manual:Maxlag_parameter|Maxlag Ð¿Ð°Ñ\80амеÑ\82Ñ\80]] Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cной Ð¸Ð½Ñ\84оÑ\80маÑ\86ии.",
+       "apihelp-main-param-maxlag": "Ð\97наÑ\87ение Ð¼Ð°ÐºÑ\81ималÑ\8cного Ð¾Ñ\82Ñ\81Ñ\82аваниÑ\8f Ð¼Ð¾Ð¶ÐµÑ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f, ÐºÐ¾Ð³Ð´Ð° MediaWiki Ñ\83Ñ\81Ñ\82анавливаеÑ\82Ñ\81Ñ\8f Ð½Ð° ÐºÐ»Ð°Ñ\81Ñ\82еÑ\80 Ð¸Ð· Ñ\80еплиÑ\86иÑ\80Ñ\83емÑ\8bÑ\85 Ð±Ð°Ð· Ð´Ð°Ð½Ð½Ñ\8bÑ\85. Ð§Ñ\82обÑ\8b Ð¸Ð·Ð±ÐµÐ¶Ð°Ñ\82Ñ\8c Ñ\83Ñ\85Ñ\83дÑ\88ениÑ\8f Ñ\81иÑ\82Ñ\83аÑ\86ии Ñ\81 Ð¾Ñ\82Ñ\81Ñ\82аванием Ñ\80епликаÑ\86ии Ñ\81айÑ\82а, Ñ\8dÑ\82оÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¼Ð¾Ð¶ÐµÑ\82 Ð·Ð°Ñ\81Ñ\82авиÑ\82Ñ\8c ÐºÐ»Ð¸ÐµÐ½Ñ\82а Ð¶Ð´Ð°Ñ\82Ñ\8c, ÐºÐ¾Ð³Ð´Ð° Ð·Ð°Ð´ÐµÑ\80жка Ñ\80епликаÑ\86ии Ñ\81Ñ\82анеÑ\82 Ð½Ð¸Ð¶Ðµ Ñ\83казанного Ð·Ð½Ð°Ñ\87ениÑ\8f. Ð\92 Ñ\81лÑ\83Ñ\87ае Ñ\87Ñ\80езмеÑ\80ной Ð·Ð°Ð´ÐµÑ\80жки Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82Ñ\81Ñ\8f ÐºÐ¾Ð´ Ð¾Ñ\88ибки Â«<samp>maxlag</samp>» Ñ\81 Ñ\81ообÑ\89ением Â«<samp>Waiting for $host: $lag seconds lagged</samp>».<br />См. Ð¿Ð¾Ð´Ñ\80обнее Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81 Ð¾Ð¿Ð¸Ñ\81анием [[mw:Manual:Maxlag_parameter|паÑ\80амеÑ\82Ñ\80а maxlag]].",
        "apihelp-main-param-smaxage": "Устанавливает значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-maxage": "Устанавливает значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано <kbd>user</kbd>, или что имеет права бота, если задано <kbd>bot</kbd>.",
        "apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.",
        "apihelp-main-param-curtimestamp": "Включить в результаты временную метку.",
        "apihelp-main-param-origin": "При обращении к API, используя кросс-доменный AJAX-запрос (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI-запроса (не тела POST).\n\nДля аутентифицированных запросов он должен точно соответствовать одному из источников в заголовке <code>Origin</code>, так что он должен быть задан наподобие <kbd>https://ru.wikipedia.org</kbd> или <kbd>https://meta.wikimedia.org</kbd>. Если параметр не соответствует заголовку <code>Origin</code>, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку <code>Origin</code>, и источник находится в белом списке, будут установлены заголовки <code>Access-Control-Allow-Origin</code> и <code>Access-Control-Allow-Credentials</code>.\n\nДля неаутентифицированных запросов укажите значение <kbd>*</kbd>. Это приведёт к установке заголовка <code>Access-Control-Allow-Origin</code> заголовка должен быть установлен, но <code>Access-Control-Allow-Credentials</code> примет значение <code>false</code> и все пользовательские данные будут ограничены.",
-       "apihelp-main-param-uselang": "Язык, используемый для перевода Сообщений. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> с <kbd>siprop=языки</kbd> возвращает список кодов языков, или указать <kbd>пользователей</kbd> , чтобы использовать текущий язык пользователя предпочтения, или указать <kbd>контента</kbd> для использования этой Вики содержание язык.",
+       "apihelp-main-param-uselang": "Язык, используемый для перевода сообщений. Запрос «<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>» с «<kbd>siprop=languages</kbd>» возвращает список кодов языков; укажите «<kbd>user</kbd>», чтобы использовать текущие языковые настройки пользователя, или «<kbd>content</kbd>» для использования основного языка этой вики.",
+       "apihelp-main-param-errorlang": "Язык, используемый для вывода предупреждений и сообщений об ошибках. Запрос «<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>» с «<kbd>siprop=languages</kbd>» возвращает список кодов языков; укажите «<kbd>content</kbd>» для использования основного языка этой вики, или «<kbd>uselang</kbd>» для использования того же значения, что и в параметре «<var>uselang</var>».",
        "apihelp-block-description": "Блокировка участника.",
-       "apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать.",
+       "apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать. Нельзя использовать вместе с <var>$1userid</var>",
+       "apihelp-block-param-userid": "ID участника, которого вы хотите заблокировать. Нельзя использовать одновременно вместе с <var>$1user</var>.",
        "apihelp-block-param-expiry": "Время истечения срока действия. Могут быть относительными (например, <kbd>5 месяцев</kbd> или <kbd>2 недели</kbd>) или абсолютными (например, <kbd>2014-09-18T12:34:56Z</kbd>). Если задано <kbd>бессрочно</kbd>, <kbd>бессрочно</kbd>, или <kbd>не</kbd>, блок никогда не истекает.",
        "apihelp-block-param-reason": "Причина блокировки.",
        "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).",
@@ -70,7 +75,7 @@
        "apihelp-compare-param-toid": "Второй идентификатор страницы для сравнения",
        "apihelp-compare-param-torev": "Вторая версия для сравнения",
        "apihelp-compare-example-1": "Создание различий между версиями 1 и 2.",
-       "apihelp-createaccount-description": "Создайте новую учетную запись Пользователя.",
+       "apihelp-createaccount-description": "Создайте новую учётную запись.",
        "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": "Запустить процесс создания пользователя <kbd>пример</kbd> с паролем <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Имя участника.",
        "apihelp-login-param-name": "Имя участника.",
        "apihelp-login-param-password": "Пароль.",
        "apihelp-login-param-domain": "Домен (необязательно).",
+       "apihelp-login-example-gettoken": "Получить токен входа.",
        "apihelp-login-example-login": "Войти",
        "apihelp-logout-description": "Выйти и очистить данные сессии.",
        "apihelp-mergehistory-description": "Объединение историй правок",
        "apihelp-protect-example-unprotect": "Снять защиту страницы, установив ограничения <kbd>all</kbd> (т. е. любой желающий может принять меры).",
        "apihelp-protect-example-unprotect2": "Бер ниндәй сикләүҙәр ҡуймай биттән һаҡлауҙы алырға.",
        "apihelp-purge-param-forcelinkupdate": "Обновление связей таблиц.",
-       "apihelp-purge-param-forcerecursivelinkupdate": "Һылтанманы һәм таблицаны яңыртығыҙ һәм был битте шаблон итеп ҡулланған башҡа биттәр өсөн һылтанмаларҙы ла яңыртығыҙ.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "Обновить таблицу ссылок для данной страницы, а также всех страниц, использующих данную как шаблон.",
        "apihelp-purge-example-generator": "Продувка первые 10 страниц в основном пространстве имен.",
        "apihelp-query-param-list": "Какие списки использовать",
        "apihelp-query-param-meta": "Какие метаданные использовать",
        "apihelp-query+deletedrevs-example-mode1": "Юҡ ителгән һуңғы биттәрҙең исемлеге, баш биттең<kbd>-һы </kbd> һәм<kbd>әйтергә:баш биттең /kbd>-һы,континент менән(режим 1).",
        "apihelp-query+deletedrevs-example-mode3-talk": "Юҡ ителгән тәүге 50 биттең исемлеге {{НС:фекер алышыу}} исемдәр арауығы(режим 3).",
        "apihelp-query+duplicatefiles-example-generated": "Поиск дубликатов всех файлов.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Добавляет указание на то, находится ли файл в списке [[MediaWiki:Bad image list]]",
        "apihelp-query+logevents-description": "Получать события из журналов.",
        "apihelp-query+logevents-example-simple": "Список последних зарегистрированных событий.",
        "apihelp-query+pagepropnames-example-simple": "Получить первые 10 имен свойств.",
        "apihelp-query+usercontribs-description": "Получить все правки пользователя",
        "apihelp-revisiondelete-description": "удалить и восстановить редакции",
        "apihelp-stashedit-param-sectiontitle": "Заголовок нового раздела.",
-       "apihelp-unblock-description": "Разблокировать пользователя.",
+       "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-upload-param-chunk": "Кусок содержимого.",
        "apihelp-upload-example-url": "Загрузить через URL",
        "apihelp-userrights-description": "Изменить членство в группе пользователей.",
-       "apihelp-userrights-param-user": "Имя пользователя",
+       "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-watch-example-watch": "Следить за страницей <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Не следить за страницей <kbd>Main Page</kbd>.",
        "apihelp-json-description": "Выходные данные в формате json.",
        "api-help-param-continue": "Когда доступно больше результатов, использовать этот чтобы продолжить.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(описание отсутствует)</span>",
        "api-help-examples": "Пример{{PLURAL:$1||ы}}:",
-       "api-help-permissions": "{{PLURAL:$1|Permission|Permissions}}:",
+       "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-feed-error-title": "Ошибка ($1)",
        "api-credits-header": "Создатели"
 }
index e409591..5498449 100644 (file)
@@ -14,7 +14,8 @@
                        "VickyC",
                        "Josve05a",
                        "Rockyfelle",
-                       "Macofe"
+                       "Macofe",
+                       "Magol"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aviseringar]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R|Buggar & förslag]\n</div>\n<strong>Status:</strong> Alla funktioner som visas på denna sida borde fungera. API:et är dock fortfarande under aktiv utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/mediawiki-api-announce e-postlistan] för att få aviseringar om uppdateringar.\n\n<strong>Felaktiga förfrågningar:</strong> När felaktiga förfrågningar skickas till API:et skickas en HTTP-header med nyckeln \"MediaWiki-API-Error\" och sedan sätts både värdet på headern och den felkoden som returneras till samma värde. För mer information läs [[mw:API:Errors_and_warnings|API: Fel och varningar]].",
        "apihelp-main-param-smaxage": "Ange headervärdet <code>s-maxage</code> till så här många sekunder. Fel cachelagras aldrig.",
        "apihelp-main-param-maxage": "Ange headervärdet <code>max-age</code> till så här många sekunder. Fel cachelagras aldrig.",
        "apihelp-main-param-assert": "Bekräfta att användaren är inloggad om satt till <kbd>user</kbd>, eller har bot-användarrättigheter om satt till <kbd>bot</kbd>.",
+       "apihelp-main-param-assertuser": "Verifiera att den nuvarande användaren är den namngivne användaren.",
        "apihelp-main-param-requestid": "Alla värde som anges här kommer att inkluderas i svaret. Kan användas för att särskilja förfrågningar.",
        "apihelp-main-param-servedby": "Inkludera det värdnamn som besvarade förfrågan i resultatet.",
        "apihelp-main-param-curtimestamp": "Inkludera den aktuella tidsstämpeln i resultatet.",
+       "apihelp-main-param-responselanginfo": "Inkluderar de språk som används för <var>uselang</var> och <var>errorlang</var> i resultatet.",
        "apihelp-main-param-origin": "När API:et används genom en cross-domain AJAX-begäran (CORS), ange detta till den ursprungliga domänen. Detta måste inkluderas i alla pre-flight-begäran, och mpste därför vara en del av den begärda URI:n (inte i POST-datat). Detta måste överensstämma med en av källorna i headern <code>Origin</code> exakt, så den måste sättas till något i stil med <kbd>http://en.wikipedia.org</kbd> eller <kbd>https://meta.wikimedia.org</kbd>. Om denna parameter inte överensstämmer med headern <code>Origin</code>, returneras ett 403-svar. Om denna parameter överensstämmer med headern <code>Origin</code> och källan är vitlistad, sätts en <code>Access-Control-Allow-Origin</code>-header.",
        "apihelp-main-param-uselang": "Språk som ska användas för meddelandeöversättningar. En lista med koder kan hämtas från <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd>, eller ange <kbd>user</kbd> för att använda den aktuella användarens språkpreferenser, eller ange <kbd>content</kbd> för att använda innehållsspråket.",
        "apihelp-block-description": "Blockera en användare.",
-       "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall du vill blockera.",
+       "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall att blockera. Kan inte användas tillsammans med <var>$1userid</var>",
+       "apihelp-block-param-userid": "Användar-ID att blocker. Kan inte användas tillsammans med <var>$1user</var>.",
        "apihelp-block-param-expiry": "Förfallotid. Kan vara Kan vara relativt (t.ex. <kbd>5 months</kbd> eller <kbd>2 weeks</kbd>) eller absolut (t.ex. <kbd>2014-09-18T12:34:56Z</kbd>). Om satt till <kbd>infinite</kbd>, <kbd>indefinite</kbd> eller <kbd>never</kbd>, kommer blockeringen aldrig att löpa ut.",
        "apihelp-block-param-reason": "Orsak till blockering.",
        "apihelp-block-param-anononly": "Blockera endast anonyma användare (t.ex. inaktivera anonyma redigeringar för denna IP-adress).",
        "apihelp-patrol-example-revid": "Patrullera en sidversion",
        "apihelp-protect-description": "Ändra skyddsnivån för en sida.",
        "apihelp-protect-example-protect": "Skydda en sida",
+       "apihelp-purge-description": "Rensa cachen för angivna titlar.",
        "apihelp-query-param-list": "Vilka listor att hämta.",
        "apihelp-query-param-meta": "Vilka metadata att hämta.",
        "apihelp-query-example-allpages": "Hämta sidversioner av sidor som börjar med <kbd>API/</kbd>.",
        "apihelp-query+watchlistraw-example-simple": "Lista sidor på den aktuella användarens bevakningslista.",
        "apihelp-setnotificationtimestamp-example-all": "Återställ meddelandestatus för hela bevakningslistan.",
        "apihelp-stashedit-param-summary": "Ändra sammanfattning.",
+       "apihelp-unblock-param-id": "ID för blockeringen att häva (hämtas genom <kbd>list=blocks</kbd>). Kan inte användas tillsammans med <var>$1user</var> eller <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Användarnamn, IP-adresser eller IP-adressintervall att häva blockering för. Kan inte användas tillsammans med <var>$1id</var> eller <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "Användar-ID att häva blockering för. Kan inte användas tillsammans med <var>$1id</var> eller <var>$1user</var>.",
        "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-upload-param-stash": "Om angiven, kommer servern att temporärt lagra filen istället för att lägga till den i centralförvaret.",
        "apihelp-upload-example-url": "Ladda upp från URL.",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Måste vara tom|Kan vara tom, eller $2}}",
        "api-help-param-limit": "Inte mer än $1 tillåts.",
        "api-help-param-limit2": "Inte mer än $1 ($2 för robotar) tillåts.",
-       "api-help-param-multi-separate": "Separera värden med <kbd>|</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]]."
+       "api-help-param-multi-separate": "Separera värden med <kbd>|</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]].",
+       "apierror-articleexists": "Artikeln du försökte skapa har redan skapats.",
+       "apierror-baddiff": "Diff kan inte hämtas. En eller båda sidversioner finns inte eller du har inte behörighet för att visa dem.",
+       "apierror-nosuchuserid": "Det finns ingen användare med ID $1.",
+       "apierror-protect-invalidaction": "Ogiltig skyddstyp \"$1\".",
+       "apierror-systemblocked": "Du har blockerats automatiskt av MediaWiki.",
+       "apierror-unknownformat": "Okänt format \"$1\".",
+       "api-feed-error-title": "Fel ($1)"
 }
index 5626b70..6efd3f4 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "AntanO",
                        "கலைவாணன்",
-                       "Info-farmer"
+                       "Info-farmer",
+                       "ElangoRamanujam"
                ]
        },
        "apihelp-main-param-action": "எச்செயலை செயற்படுத்த",
        "apihelp-import-param-rootpage": "இப்பக்கத்தின் துணைப்பக்கமாக இறக்குமதி செய்யவும். <kbd>$1namespace</kbd> அளவுரு வழங்கப்பட்டிருந்தால் இது புறக்கணிக்கப்படும்.",
        "api-help-source": "மூலம்: $1",
        "api-help-license": "அனுமதி: [[$1|$2]]",
-       "api-help-license-noname": "அனுமதி: [[$1|இணைப்பைப் பார்]]"
+       "api-help-license-noname": "அனுமதி: [[$1|இணைப்பைப் பார்]]",
+       "apierror-invalidtitle": "தவறான தலைப்பு ”$1”",
+       "apierror-mustbeloggedin-generic": "தாங்கள் புகுபதிந்திருக்கவேண்டும்.",
+       "apierror-mustbeloggedin": "தாங்கள் $1-ல் புகுபதிந்திருக்கவேண்டும்.",
+       "apierror-nochanges": "மாற்றங்களேதும் கோரப்படவில்லை.",
+       "apierror-permissiondenied-generic": "அனுமதி மறுக்கப்பட்டது.",
+       "apierror-unknownerror-nocode": "இனம்புரியாப் பிழை.",
+       "apierror-unknownerror": "இனமறியாப் பிழை:\"$1\".",
+       "apiwarn-invalidtitle": "\"$1\" என்பது செல்லும் தலைப்பல்ல.",
+       "apiwarn-notfile": "”$1” ஒரு கோப்பல்ல.",
+       "api-feed-error-title": "பிழை ($1)"
 }
index 96a47fc..b7491b5 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Veeven",
                        "HAUSANRIK",
-                       "Ravichandra"
+                       "Ravichandra",
+                       "Jedimaster26"
                ]
        },
        "apihelp-block-description": "ఓ వాడుకరిని నిరోధించండి.",
@@ -15,5 +16,6 @@
        "apihelp-edit-example-edit": "ఓ పేజీని మార్చు.",
        "apihelp-emailuser-description": "వాడుకరికి ఈమెయిలు పంపించండి.",
        "apihelp-feedrecentchanges-example-simple": "ఇటీవలి మార్పులను చూడండి",
+       "apihelp-query+users-param-userids": "వివరములు సేకరించవలసిన ఉపయోగదారుల పేర్లు",
        "apihelp-rawfm-description": "బయటకు వచ్చిన సమాచారo, డీబగ్గింగ్ అంశముతో కలిపి, JSON పద్ధతిలో (HTMLలో అందంగా-ముద్రించు)"
 }
diff --git a/includes/api/i18n/th.json b/includes/api/i18n/th.json
new file mode 100644 (file)
index 0000000..d2ea18f
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Aefgh39622"
+               ]
+       },
+       "apihelp-imagerotate-description": "หมุนรูปภาพอย่างน้อยหนึ่งรูป",
+       "api-help-param-continue": "เมื่อมีผลลัพธ์เพิ่มเติมพร้อมใช้งาน ใช้ตัวเลือกนี้เพื่อดำเนินการต่อ"
+}
index fe9d085..9aaba31 100644 (file)
@@ -1,9 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Kaganer"
+                       "Kaganer",
+                       "Mouse21"
                ]
        },
+       "apihelp-block-description": "Блокировка пыриськисьёс.",
        "apihelp-edit-example-edit": "Бамез тупатъяно.",
        "apihelp-login-example-login": "Пырыны."
 }
index a02d1f9..e3dba0b 100644 (file)
@@ -11,7 +11,8 @@
                        "Mix Gerder",
                        "Piramidion",
                        "Andriykopanytsia",
-                       "Максим Підліснюк"
+                       "Максим Підліснюк",
+                       "AS"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|ЧаПи]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Тестування:</strong> Для зручності тестування запитів API, див. [[Special:ApiSandbox]].",
        "apihelp-main-param-requestid": "Будь-яке значення, вказане тут, буде включене у відповідь. Може використовуватися, щоб відрізняти запити.",
        "apihelp-main-param-servedby": "Включити в результати ім'я хоста, який обробив запит.",
        "apihelp-main-param-curtimestamp": "Включити в результат поточну мітку часу.",
+       "apihelp-main-param-responselanginfo": "Включати мови, які були використані для <var>uselang</var> і <var>errorlang</var>, у результат.",
        "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). \n\nДля автентифікованих запитів він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовки <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неавтентифікованих запитів укажіть значення <kbd>*</kbd>. Це дасть встановлення заголовка <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> буде <code>false</code> і всі дані про користувача будуть заборонені.",
        "apihelp-main-param-uselang": "Мова, що використовується для перекладу повідомлень. Список кодів можна видати на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
+       "apihelp-main-param-errorformat": "Формат попереджень і тексту помилок.\n; plaintext: вікітекст із прираними HTML-тегами і заміненими HTML-мнемоніками.\n; wikitext: неопрацьований вікітекст.\n; html: HTML.\n; raw: лише ключ і параметри повідомлення.\n; none: без тексту, тільки коди помилок.\n; bc: формат, який використовувався до MediaWiki 1.29. <var>errorlang</var> і <var>errorsuselocal</var> ігноруються.",
+       "apihelp-main-param-errorlang": "Мова, яку використовувати для попереджень і помилок. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> із <kbd>siprop=languages</kbd> повертає список кодів мов, або ж вкажіть <kbd>content</kbd>, щоб використати мову вмісту поточної вікі, або вкажіть <kbd>uselang</kbd>, щоб використовувати те ж значення, що й параметр <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Якщо задано, тексти помилок використовуватимуть локальні повідомлення з простору назв {{ns:MediaWiki}}.",
        "apihelp-block-description": "Заблокувати користувача.",
-       "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування.",
+       "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування. Не може бути використано разом із <var>$1userid</var>",
+       "apihelp-block-param-userid": "Ідентифікатор користувача, який заблокувати. Не може бути використано разом із <var>$1user</var>.",
        "apihelp-block-param-expiry": "Закінчення часу. Може бути відносним (напр., <kbd>5 місяців</kbd> або <kbd>2 тижні</kbd>) чи абсолютним (напр., <kbd>2014-09-18T12:34:56Z</kbd>). Якщо вказано <kbd>infinite</kbd>, <kbd>indefinite</kbd> або <kbd>never</kbd>, блокування не закінчиться ніколи.",
        "apihelp-block-param-reason": "Причина блокування.",
        "apihelp-block-param-anononly": "Блокувати тільки анонімних користувачів (тобто відключити можливість анонімних редагувань з цієї IP-адреси).",
@@ -39,6 +45,7 @@
        "apihelp-block-param-allowusertalk": "Дозволити користувачу редагувати власну сторінку обговорення (залежить від <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Якщо користувач уже заблокований, переписати наявне блокування.",
        "apihelp-block-param-watchuser": "Спостерігати за сторінкою користувача чи IP-адреси і сторінкою обговорення.",
+       "apihelp-block-param-tags": "Змінити теги для застосування їх до запису в журналі блокувань.",
        "apihelp-block-example-ip-simple": "Блокувати IP-адресу <kbd>192.0.2.5</kbd> на три дні з причиною <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Блокувати користувача<kbd>Vandal</kbd> на невизначений термін з причиною <kbd>Vandalism</kbd> і заборонити створення нових облікових записів та надсилання електронної пошти.",
        "apihelp-changeauthenticationdata-description": "Зміна параметрів аутентифікації для поточного користувача.",
        "apihelp-help-example-query": "Довідка для двох підмодулів запитів.",
        "apihelp-imagerotate-description": "Поворот одного або декількох зображень.",
        "apihelp-imagerotate-param-rotation": "Градуси для повороту зображення за годинниковою стрілкою.",
+       "apihelp-imagerotate-param-tags": "Теги для застосування до запису в журналі завантажень.",
        "apihelp-imagerotate-example-simple": "Повернути <kbd>File:Example.png</kbd> на <kbd>90</kbd> градусів.",
        "apihelp-imagerotate-example-generator": "Повернути усі зображення у <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусів.",
        "apihelp-import-description": "Імпортувати сторінку з іншої вікі або з XML-файлу.\n\nЗважте, що HTTP POST має бути виконано як завантаження файлу (тобто з використанням даних різних частин/форм) під час надсилання файлу для параметра <var>xml</var>.",
        "apihelp-import-param-templates": "Для інтервікі-імпорту: імпортувати також усі включені шаблони.",
        "apihelp-import-param-namespace": "Імпортувати у цей простір назв. Не можна використати разом з <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Імпортувати як підсторінку цієї сторінки. Не можна використати разом з <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Змінити теги для застосування до запису в журналі імпорту і до нульової версії імпортованих сторінок.",
        "apihelp-import-example-import": "Імпортувати [[meta:Help:ParserFunctions]] у простір назв 100 з повною історією.",
        "apihelp-linkaccount-description": "Пов'язати обліковий запис третьої сторони з поточним користувачем.",
        "apihelp-linkaccount-example-link": "Почати процес пов'язування з обліковм записом з <kbd>Example</kbd>.",
        "apihelp-managetags-param-tag": "Мітка для створення, вилучення, активування чи деактивування. Для створення мітки, вона повинна не існувати. Для вилучення мітки, вона повинна існувати. Для активування мітки, вона повинна існувати і не використовуватися жодним розширенням. Для деактивування мітки, вона має бути жива і визначена вручну.",
        "apihelp-managetags-param-reason": "Необов'язкова причина створення, вилучення, активування чи деактивування мітки.",
        "apihelp-managetags-param-ignorewarnings": "Чи ігнорувати усі попередження, що з'являються під час операції.",
+       "apihelp-managetags-param-tags": "Змінити теги для застосування до запису в журналі керування тегами.",
        "apihelp-managetags-example-create": "Створити мітку з назвою <kbd>spam</kbd> з причиною <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Вилучити мітку <kbd>vandlaism</kbd> з причиною <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Активувати мітку з назвою <kbd>spam</kbd> з причиною <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Вилучити сторінку й перенаправлення зі списку спостереження поточного користувача.",
        "apihelp-move-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
        "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження",
+       "apihelp-move-param-tags": "Змінити теги для застосування до запису в журналі перейменувань і до нульової версії цільової сторінки.",
        "apihelp-move-example-move": "Перейменувати <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd> без збереження перенаправлення.",
        "apihelp-opensearch-description": "Шукати у вікі з використанням протоколу OpenSearch.",
        "apihelp-opensearch-param-search": "Рядок пошуку.",
        "apihelp-protect-example-protect": "Захистити сторінку.",
        "apihelp-protect-example-unprotect": "Зняти захист зі сторінки, встановивши обмеження для <kbd>all</kbd> (тобто будь-хто зможе робити дії).",
        "apihelp-protect-example-unprotect2": "Зняти захист з сторінки, встановивши відсутність обмежень.",
-       "apihelp-purge-description": "Очистити кеш для вказаних заголовків.\n\nВимагає запиту POST, якщо користувач не ввійшов у систему.",
+       "apihelp-purge-description": "Очистити кеш для вказаних заголовків.",
        "apihelp-purge-param-forcelinkupdate": "Оновити таблиці посилань.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Оновити таблицю посилань, і оновити таблиці посилань для кожної сторінки, що використовує цю сторінку як шаблон.",
        "apihelp-purge-example-simple": "Очистити кеш <kbd>Main Page</kbd> і сторінки <kbd>API</kbd>.",
        "apihelp-query+allmessages-param-prop": "Які властивості отримати.",
        "apihelp-query+allmessages-param-enableparser": "Встановити увімкнення парсеру, це попередньо обробить вікітекст повідомлення (підставити магічні слова, розкрити шаблони тощо).",
        "apihelp-query+allmessages-param-nocontent": "Якщо вказано, не включати повідомлення вміст повідомлення у результат.",
-       "apihelp-query+allmessages-param-includelocal": "Також включити локальні повідомлення, тобто повідомлення, що не існують у програмному забезпеченні, але існують як сторінка MediaWiki:.\nЦе видає список усіх сторінок MediaWiki:, так що у ньому будуть сторінки, які насправді не є повідомленнями, як-то [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Також включити локальні повідомлення, тобто повідомлення, що не існують у програмному забезпеченні, але існують як сторінка в просторі назв {{ns:MediaWiki}}.\nЦе видає список усіх сторінок простору {{ns:MediaWiki}}, так що у ньому також будуть сторінки, які насправді не є повідомленнями, як-то [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Аргументи будуть підставлятися в повідомлення.",
        "apihelp-query+allmessages-param-filter": "Видати лише повідомлення з назвами, що місять цей рядок.",
        "apihelp-query+allmessages-param-customised": "Видати лише повідомлення у цьому стані налаштувань.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Додає назву файлу архівної версії для неостанніх версій.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Додає бітну глибину версії.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Використовується на Special:Upload page для отримання інформації про наявний файл. Не призначено для використання поза ядром MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Додає інформацію про те, чи перебуває файл у \n[[MediaWiki:Bad image list|списку недозволених файлів]]",
        "apihelp-query+imageinfo-param-limit": "Скільки виводити версій кожного файлу.",
        "apihelp-query+imageinfo-param-start": "Часова мітка, з якої почати список.",
        "apihelp-query+imageinfo-param-end": "Часова мітка, на якій закінчити список.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Якщо переклади властивості extmetadata доступні, вибрати їх усі.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Якщо вказано і не порожньо, буде видано лише ці ключі для $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Рядок окремого параметра. Наприклад, PDF-ки можуть використовувати <kbd>page15-100px</kbd>. <var>$1urlwidth</var> повинно використовуватись і бути сумісним з <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Якщо встановлено <kbd>$2prop=badfile</kbd>, це — назва сторінки, що буде використана при аналізі [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Шукати лише файли у локальному репозиторії.",
        "apihelp-query+imageinfo-example-simple": "Вибрати інформацію про поточну версію [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Вибрати інформацію про версії [[:File:Test.jpg]] від 2008 і раніше.",
        "apihelp-query+usercontribs-param-limit": "Максимальна кількість елементів внеску для виведення.",
        "apihelp-query+usercontribs-param-start": "З якої часової мітки виводити.",
        "apihelp-query+usercontribs-param-end": "До якої часової мітки виводити.",
-       "apihelp-query+usercontribs-param-user": "Користувачі, для яких отримати внесок.",
-       "apihelp-query+usercontribs-param-userprefix": "Отримати внесок усіх користувачів, чиї імена починаються цим значенням. Перевизначає $1user.",
+       "apihelp-query+usercontribs-param-user": "Користувачі, для яких отримати внесок. Не можна використовувати з <var>$1userids</var> чи <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Отримати внесок усіх користувачів, чиї імена починаються цим значенням. Не можна використовувати з <var>$1user</var> чи <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Ідентифікатори користувачів, для яких отримати внесок. Не можна використовувати з <var>$1user</var> чи <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Перерахувати записи внеску лише в цих просторах назв.",
        "apihelp-query+usercontribs-param-prop": "Включити додаткові відомомсті:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Додає ID сторінки й ID версії.",
        "apihelp-query+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-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-resetpassword-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>, щоб використовувати цей модуль.",
        "apihelp-resetpassword-param-user": "Користувача відновлено.",
        "apihelp-resetpassword-param-email": "Адреса електронної пошти користувача відновлено.",
-       "apihelp-resetpassword-param-capture": "Повернути тимчасові паролі, які були надіслані. Вимагає право користувача <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "Надіслати лист для скидання пароля користувачу <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "Надіслати лист для скидання пароля усім користувачам з адресою електронної пошти <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Вилучити або відновити версії.",
        "apihelp-revisiondelete-param-show": "Що показати у кожній з версії.",
        "apihelp-revisiondelete-param-suppress": "Чи приховати дані від адміністраторів так само як від усіх інших.",
        "apihelp-revisiondelete-param-reason": "Причина вилучення або відновлення.",
+       "apihelp-revisiondelete-param-tags": "Теги для застосування до запису в журналі вилучень",
        "apihelp-revisiondelete-example-revision": "Приховати вміст версії <kbd>12345</kbd> сторінки <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Приховати всі дані у записі журналу <kbd>67890</kbd> з причиною <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "Скасувати останнє редагування цієї сторінки.\n\nЯкщо користувач, який редагував сторінку, зробив декілька редагувань підряд, їх усі буде відкочено.",
        "apihelp-setnotificationtimestamp-example-page": "Стерти статус сповіщень для <kbd>Main page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Встановити часову мітку сповіщень для <kbd>Main page</kbd> так, що всі редагування після 1 січня 2012 будуть виглядати як не переглянуті.",
        "apihelp-setnotificationtimestamp-example-allpages": "Стерти статус сповіщень для сторінок у просторі назв <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Змінити мову сторінки.",
+       "apihelp-setpagelanguage-description-disabled": "Зміна мови сторінки заборонена в цій вікі. \n\nУвімкніть <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>, щоб використовувати цю дію.",
+       "apihelp-setpagelanguage-param-title": "Назва сторінки, мову якої Ви хочете змінити. Не можна використовувати разом з <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Ідентифікатор сторінки, мову якої Ви хочете змінити. Не можна використовувати разом з <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Код мови, якою треба замінити поточну мову сторінки. Використовуйте <kbd>default</kbd>, щоб встановити стандартну мову вмісту цієї вікі як мову сторінки.",
+       "apihelp-setpagelanguage-param-reason": "Причина зміни.",
+       "apihelp-setpagelanguage-param-tags": "Змінити теги для застосування до запису в журналі, який буде результатом цієї дії.",
+       "apihelp-setpagelanguage-example-language": "Змінити мову сторінки <kbd>Main Page</kbd> на «баскська».",
+       "apihelp-setpagelanguage-example-default": "Змінити мову сторінки з ідентифікатором 123 на стандартну мову вмісту вікі.",
        "apihelp-stashedit-description": "Підготувати редагування в загальний кеш.\n\nЦе призначено для використання через AJAX з форми редагування, щоб поліпшити продуктивність збереження сторінки.",
        "apihelp-stashedit-param-title": "Назва редагованої сторінки.",
        "apihelp-stashedit-param-section": "Номер розділу. <kbd>0</kbd> для вступного розділу, <kbd>new</kbd> для нового розділу.",
        "apihelp-tag-param-add": "Мітки, які слід додати. Лише визначені вручну мітки може бути додано.",
        "apihelp-tag-param-remove": "Мітки, які слід вилучити. Лише мітки, які було визначено вручну, або взагалі не визначено, можуть бути вилучені.",
        "apihelp-tag-param-reason": "Причина зміни.",
+       "apihelp-tag-param-tags": "Теги для застосування до запису в журналі, що буде створений в результаті цієї дії.",
        "apihelp-tag-example-rev": "Додати мітку <kbd>vandalism</kbd> до версії з ідентифікатором 123 без вказання причини",
        "apihelp-tag-example-log": "Вилучити мітку <kbd>spam</kbd> з запису журналу з ідентифікатором 123 з причиною <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "Отримати жетони для дій пов'язаних зі зміною даних.\n\nЦей модуль застарів на користь [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Отримати жетон редагування (за замовчуванням).",
        "apihelp-tokens-example-emailmove": "Отримати жетон електронної пошти та жетон перейменування.",
        "apihelp-unblock-description": "Розблокувати користувача.",
-       "apihelp-unblock-param-id": "Ідентифікатор блоку чи розблокування (отриманий через <kbd>list=blocks</kbd>). Не може бути використано разом з <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Ім'я користувача, IP-адреса чи IP-діапазон до розблокування. Не може бути використано разом з <var>$1id</var>.",
+       "apihelp-unblock-param-id": "Ідентифікатор блоку чи розблокування (отриманий через <kbd>list=blocks</kbd>). Не може бути використано разом із <var>$1user</var> або <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Ім'я користувача, IP-адреса чи IP-діапазон до розблокування. Не може бути використано разом із <var>$1id</var> або <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "Ідентифікатор користувача до розблокування. Не може бути використано разом із <var>$1id</var> або <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Причина розблокування.",
        "apihelp-unblock-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі блокувань.",
        "apihelp-unblock-example-id": "Зняти блокування з ідентифікатором #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Розблокувати користувача <kbd>Bob</kbd> з причиною <kbd>Sorry Bob</kbd>.",
-       "apihelp-undelete-description": "Відновити версії вилученої сторінки.\n\nСписок вилучених версій (включено з часовими мітками) може бути отримано через [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], а список ідентифікаторів вилучених файлів може бути отримано через [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "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-userrights-description": "Змінити членство користувача у групах.",
        "apihelp-userrights-param-user": "Ім'я користувача.",
        "apihelp-userrights-param-userid": "Ідентифікатор користувача.",
-       "apihelp-userrights-param-add": "Додати користувача до цих груп.",
+       "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> на 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>qwerty</kbd> для створення користувача <kbd>Example</kbd>.",
        "apihelp-watch-description": "Додати або вилучити сторінки з списку спостереження поточного користувача.",
        "apihelp-watch-param-title": "Сторінки до додання/вилучення. Використовуйте <var>$1titles</var> натомість.",
        "apihelp-watch-param-unwatch": "Якщо вказано, сторінку буде вилучено зі списку спостереження замість додання до нього.",
        "apihelp-phpfm-description": "Виводити дані у форматі серіалізованого PHP (вивід відформатованого коду за допомогою HTML).",
        "apihelp-rawfm-description": "Виводити дані, включно з елементами налагодження, у форматі JSON (вивід відформатованого коду за допомогою HTML).",
        "apihelp-xml-description": "Виводити дані у форматі XML.",
-       "apihelp-xml-param-xslt": "Якщо вказано, додає названу сторінку як таблицю стилів XSL. Це значення повинне бути назвою у просторі назв {{ns:mediawiki}}, що закінчується на <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Якщо вказано, додає названу сторінку як таблицю стилів XSL. Це значення повинне бути назвою у просторі назв {{ns:MediaWiki}}, що закінчується на <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Якщо вказано, додає простір назв XML.",
        "apihelp-xmlfm-description": "Вивести дані у форматі XML (вивід відформатованого коду за допомогою HTML).",
        "api-format-title": "Результат запиту до API MediaWiki",
        "api-help-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-token": "Токен «$1» отримано з [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-authmanagerhelper-returnurl": "URL-адреса повернення для сторонніх автентифікаційних потоків повинна бути абсолютною. Обов'язковим є це, або <var>$1continue</var>. \n\nПри отриманні відповіді <samp>REDIRECT</samp>, найбільш звичною Вашою дією буде відкриття браузерного чи іншого веб-перегляду вказаного URL-посилання для стороннього потоку автентифікації. Коли ця операція буде завершена, стороння програма перенаправить веб-переглядач на цю URL-адресу. Ви повинні видобувати будь-які параметри запитів або POST-параметри із цієї URL-адреси, і передавати їх як запит <var>$1continue</var> до цього модуля API.",
        "api-help-authmanagerhelper-continue": "Цей запит є продовженням після попередньої відповіді <samp>UI</samp> або <samp>REDIRECT</samp>. Або це, або <var>$1returnurl</var> є обов'язковим.",
        "api-help-authmanagerhelper-additional-params": "Цей модуль приймає додаткові параметри, залежно від доступних автентифікаційних запитів. Використовуйте <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> за допомогою <kbd>amirequestsfor=$1</kbd> (або попередню відповідь від цього модуля, якщо це застосовно), аби визначити доступні запити та поля, які вони використовують.",
+       "apierror-allimages-redirect": "Використовуйте <kbd>gaifilterredir=nonredirects</kbd> замість <var>redirects</var> при використанні <kbd>allimages</kbd> як генератора.",
+       "apierror-allpages-generator-redirects": "Використовуйте <kbd>gapfilterredir=nonredirects</kbd> замість <var>redirects</var> при використанні <kbd>allpages</kbd> як генератора.",
+       "apierror-appendnotsupported": "Не вдається додавати до сторінок, що використовують контентну модель $1.",
+       "apierror-articleexists": "Статтю, яку Ви намагались створити, вже було створено.",
+       "apierror-assertbotfailed": "Твердження, що користувач має право <code>bot</code>, виявилося хибним.",
+       "apierror-assertnameduserfailed": "Твердження, що ім'я користувача — «$1», виявилося хибним.",
+       "apierror-assertuserfailed": "Твердження, що користувач перебуває в системі, виявилося хибним.",
+       "apierror-autoblocked": "Вашу IP-адресу було автоматично заблоковано, оскільки її використовував заблокований користувач.",
+       "apierror-badconfig-resulttoosmall": "Значення <code>$wgAPIMaxResultSize</code> у цій вікі є надто малим, щоб містити базову інформацію щодо результатів.",
+       "apierror-badcontinue": "Параметр продовження недійсний. Вам треба вказати початкове значення, отримане з попереднього запиту.",
+       "apierror-baddiff": "Цю різницю версій неможливо відтворити: одна або й обидві версії не існують, або Ви не маєте прав на їх перегляд.",
+       "apierror-baddiffto": "Для <var>$1diffto</var> треба задати невід'ємне число,<kbd>prev</kbd>, <kbd>next</kbd> або <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "Запитуваний формат $1 не підтримується контентною моделлю$2.",
+       "apierror-badformat": "Запитуваний формат $1 не підтримується контентною моделлю $2, що використовується $3.",
+       "apierror-badgenerator-notgenerator": "Модуль <kbd>$1</kbd> не може бути використаний як генератор.",
+       "apierror-badgenerator-unknown": "Невідомий <kbd>generator=$1</kbd>.",
+       "apierror-badip": "Параметр IP є недійсним.",
+       "apierror-badmd5": "Вказаний хеш MD5 був неправильним.",
+       "apierror-badmodule-badsubmodule": "Модуль <kbd>$1</kbd> не має підмодуля «$2».",
+       "apierror-badmodule-nosubmodules": "Модуль <kbd>$1</kbd> не має підмодулів.",
+       "apierror-badparameter": "Недійсне значення для параметра <var>$1</var>.",
+       "apierror-badquery": "Неприпустимий запит.",
+       "apierror-badtimestamp": "Недійсне значення «$2» для параметра мітки часу <var>$1</var>.",
+       "apierror-badtoken": "Недійсний токен CSRF.",
+       "apierror-badupload": "Параметр завантаження файлу <var>$1</var> не є завантаженням файлу; не забудьте використати <code>multipart/form-data</code> для Вашого POST і додайте назву файлу в шапку <code>Content-Disposition</code>.",
+       "apierror-badurl": "Недійсне значення «$2» для URL-параметра <var>$1</var>.",
+       "apierror-baduser": "Недійсне значення «$2» для параметра користувача <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "Відокремлення значень через U+001F може використовуватись лише в тих параметрах, де використання двох і більше значень є прийнятним.",
+       "apierror-bad-watchlist-token": "Надано некоректний токен списку спостереження. Будь ласка, подайте коректний токен на сторінці [[Special:Preferences|Спеціальна:Налаштування]].",
+       "apierror-blockedfrommail": "Вам заблоковано можливість надсилання електронної пошти.",
+       "apierror-blocked": "Вам заблоковано можливість редагування.",
+       "apierror-botsnotsupported": "Інтерфейс не підтримується для ботів.",
+       "apierror-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": "Завантаження за URL-адресою недозволені з цього домену.",
+       "apierror-copyuploadbadurl": "Завантаження з цієї URL-адреси недозволені.",
+       "apierror-create-titleexists": "Наявні назви не можна захистити за допомогою <kbd>create</kbd>.",
+       "apierror-csp-report": "Помилка при опрацюванні CSP-звіту: $1.",
+       "apierror-databaseerror": "[$1] Помилка запиту до бази даних.",
+       "apierror-deletedrevs-param-not-1-2": "Параметр <var>$1</var> не може використовуватись у режимах 1 або 2.",
+       "apierror-deletedrevs-param-not-3": "Параметр <var>$1</var> не може використовуватись у режимі 3.",
+       "apierror-emptynewsection": "Створення нових порожніх розділів неможливе.",
+       "apierror-emptypage": "Створення нових порожніх сторінок недозволене.",
+       "apierror-exceptioncaught": "[$1] Виявлено виняток: $2",
+       "apierror-filedoesnotexist": "Файл не існує.",
+       "apierror-fileexists-sharedrepo-perm": "Цільовий файл існує у загальному репозиторії. Використовуйте параметр <var>ignorewarnings</var>, щоб проігнорувати це.",
+       "apierror-filenopath": "Не вдалося отримати шлях до локального файлу.",
+       "apierror-filetypecannotberotated": "Тип файлу не можна повернути.",
+       "apierror-formatphp": "Цю відповідь не можна представити через <kbd>format=php</kbd>. Див. https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "Назва для <kbd>$1</kbd> має бути файлом.",
+       "apierror-import-unknownerror": "Невідома помилка при імпорті: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> не може мати значення понад $2 (встановлено як $3) для ботів чи адмінів.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> не може мати значення понад $2 (встановлено як $3) для користувачів.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> не може мати значення менш як $2 (встановлено як $3).",
+       "apierror-invalidcategory": "Введена Вами назва категорії недійсна.",
+       "apierror-invalid-chunk": "Зміщення плюс поточний шматок мають більший розмір, аніж заявлений розмір файлу.",
+       "apierror-invalidexpiry": "Недійсний час завершення «$1».",
+       "apierror-invalid-file-key": "Недійсний ключ файлу.",
+       "apierror-invalidlang": "Недійсний код мови для параметра <var>$1</var>.",
+       "apierror-invalidoldimage": "Параметр «oldimage» має недійсний формат.",
+       "apierror-invalidparammix-cannotusewith": "Параметр <kbd>$1</kbd> не можна використовувати з <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "Параметр <kbd>$1</kbd> можна використовувати тільки з  <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> не можна поєднувати з параметрами <var>oldid</var>, <var>pageid</var> чи <var>page</var>. Будь ласка, використовуйте <var>title</var> і <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Ці параметри}} $1 не можна використовувати водночас.",
+       "apierror-invalidsection": "Параметр «section» має бути дійсним ідентифікатором розділу або <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "Поданий хеш SHA1Base36 недійсний.",
+       "apierror-invalidsha1hash": "Поданий хеш SHA1 недійсний.",
+       "apierror-invalidtitle": "Погана назва «$1».",
+       "apierror-invalidurlparam": "Недійсне значення для <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Недійсне ім'я користувача «$1».",
+       "apierror-invaliduserid": "Ідентифікатор <var>$1</var> недійсний.",
+       "apierror-maxlag-generic": "Очікування на сервер бази даних: затримка $1 {{PLURAL:$1|секунда|секунди|секунд}}.",
+       "apierror-maxlag": "Очікування на $2: затримка $1 {{PLURAL:$1|секунда|секунди|секунд}}.",
+       "apierror-mimesearchdisabled": "MIME-пошук вимкнений у скупому режимі.",
+       "apierror-missingcontent-pageid": "Відсутній вміст для сторінки з ідентифікатором $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|Параметр|Щонайменше один параметрів}} $1 є обов'язковим.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|Параметр|Один з параметрів}} $1 є обов'язковим.",
+       "apierror-missingparam": "Параметр <var>$1</var> має бути заповнений.",
+       "apierror-missingrev-pageid": "Немає поточної версії сторінки з ідентифікатором $1.",
+       "apierror-missingtitle-createonly": "Відсутні назви можна захистити тільки через <kbd>create</kbd>.",
+       "apierror-missingtitle": "Вказана Вами сторінка не існує.",
+       "apierror-missingtitle-byname": "Сторінка $1 не існує.",
+       "apierror-moduledisabled": "Модуль <kbd>$1</kbd> було вимкнено.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Лише значення|Лише одне значення з}} $2 дозволене для параметра <var>$1</var>.",
+       "apierror-multival-only-one": "Лише одне значення дозволене для параметра <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> може використовуватись тільки з однією сторінкою.",
+       "apierror-mustbeloggedin-changeauth": "Вам треба увійти в систему, щоб змінити автентифікаційні дані.",
+       "apierror-mustbeloggedin-generic": "Ви повинні перебувати в системі.",
+       "apierror-mustbeloggedin-linkaccounts": "Щоб зв'язувати облікові записи Вам треба увійти в систему.",
+       "apierror-mustbeloggedin-removeauth": "Щоб вилучати автентифікаційні дані Вам треба увійти в систему.",
+       "apierror-mustbeloggedin-uploadstash": "Сховок завантажень доступний тільки для зареєстрованих користувачів.",
+       "apierror-mustbeloggedin": "Для $1 Вам треба увійти в систему.",
+       "apierror-mustbeposted": "Модуль <kbd>$1</kbd> потребує запиту POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Вказаний параметр було знайдено в рядку запиту, але має|Вказані параметри було знайдено в рядку запиту, але мають}} бути у тілі POST: $1.",
+       "apierror-noapiwrite": "Редагування цієї вікі через API вимкнено. Упевніться, що твердження <code>$wgEnableWriteAPI=true;</code> включено у файл <code>LocalSettings.php</code> цієї вікі.",
+       "apierror-nochanges": "На жодні зміни запиту не було.",
+       "apierror-nodeleteablefile": "Немає такої старої версії файлу.",
+       "apierror-no-direct-editing": "Пряме редагування через API не підтримується контентною моделлю $1, що використовується $2.",
+       "apierror-noedit-anon": "Анонімні користувачі не можуть редагувати сторінки.",
+       "apierror-noedit": "У Вас немає прав на редагування сторінок.",
+       "apierror-noimageredirect-anon": "Анонімні користувачі не можуть створювати перенаправлення на файли.",
+       "apierror-noimageredirect": "Ви не маєте прав на створення перенаправлень на файли.",
+       "apierror-nosuchlogid": "Немає журнального запису з ідентифікатором $1.",
+       "apierror-nosuchpageid": "Немає сторінки з ідентифікатором $1.",
+       "apierror-nosuchrcid": "Немає недавньої зміни з ідентифікатором $1.",
+       "apierror-nosuchrevid": "Немає версії з ідентифікатором $1.",
+       "apierror-nosuchsection": "Немає розділу $1.",
+       "apierror-nosuchsection-what": "Немає розділу $1 на сторінці $2.",
+       "apierror-nosuchuserid": "Немає користувача з ідентифікатором $1.",
+       "apierror-notarget": "Ви не вказали дійсної цілі для цієї дії.",
+       "apierror-notpatrollable": "Версія r$1 не може бути відпатрульована, оскільки вона надто стара.",
+       "apierror-nouploadmodule": "Не встановлено модуля завантаження.",
+       "apierror-opensearch-json-warnings": "Попередження не можуть бути представлені у форматі OpenSearch JSON.",
+       "apierror-pagecannotexist": "Простір назв не дозволяє фактичних сторінок.",
+       "apierror-pagedeleted": "Цю сторінку було вилучено після того, як Ви отримали її мітку часу.",
+       "apierror-pagelang-disabled": "Зміна мови сторінки заборонена в цій вікі.",
+       "apierror-paramempty": "Параметр <var>$1</var> не може бути порожнім.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> підтримується лише для вмісту у форматі вікірозмітки.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> підтримується лише для вмісту у форматі вікірозмітки. $1 використовує контентну модель $2.",
+       "apierror-pastexpiry": "Час закінчення «$1» — в минулому.",
+       "apierror-permissiondenied": "Ви не маєте прав на $1.",
+       "apierror-permissiondenied-generic": "Доступ заборонено.",
+       "apierror-permissiondenied-patrolflag": "Вам потрібне право <code>patrol</code> або <code>patrolmarks</code>, щоб подати запит на прапорець «відпатрульовано».",
+       "apierror-permissiondenied-unblock": "Ви не маєте прав на розблокування користувачів.",
+       "apierror-prefixsearchdisabled": "Пошук за префіксом вимкнено у скупому режимі.",
+       "apierror-promised-nonwrite-api": "HTTP-заголовок <code>Promise-Non-Write-API-Action</code> не можна надсилати до модулів API із режимом запису.",
+       "apierror-protect-invalidaction": "Недійсний тип захисту «$1».",
+       "apierror-protect-invalidlevel": "Недійсний рівень захисту «$1».",
+       "apierror-ratelimited": "Ви перевищили свій ліміт частоти. Будь ласка, почекайте деякий час і спробуйте знову.",
+       "apierror-readapidenied": "Вам потрібне право на читання, щоб використовувати цей модуль.",
+       "apierror-readonly": "Ця вікі наразі перебуває в режимі тільки для читання.",
+       "apierror-reauthenticate": "Ви останнім часом не проходили автентифікацію в цій сесії. Будь ласка, пройдіть автентифікацію ще раз.",
+       "apierror-redirect-appendonly": "Ви зробили спробу редагування з використанням режиму переходу за перенаправленням, який має використовуватись разом із <kbd>section=new</kbd>, <var>prependtext</var>, або <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "Одне й те ж поле не може використовуватись у <var>hide</var> і <var>show</var> водночас.",
+       "apierror-revdel-needtarget": "Для цього типу RevDel необхідна цільова назва.",
+       "apierror-revdel-paramneeded": "Щонайменше одне значення необхідне для <var>hide</var> та/або <var>show</var>.",
+       "apierror-revisions-norevids": "Параметр <var>revids</var> не можна використовувати з опціями списку (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, і <var>$1end</var>).",
+       "apierror-revisions-singlepage": "Було використано <var>titles</var>, <var>pageids</var> або генератор для постачання декількох сторінок, але параметри <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, і <var>$1end</var> можуть використовуватися тільки на одній сторінці.",
+       "apierror-revwrongpage": "r$1 не є версією сторінки $2.",
+       "apierror-searchdisabled": "<var>$1</var> пошук вимкнено.",
+       "apierror-sectionreplacefailed": "Не вдалося об'єднати оновлений розділ.",
+       "apierror-sectionsnotsupported": "Розділи не підтримуються для контентної моделі $1.",
+       "apierror-sectionsnotsupported-what": "Розділи не підтримуються $1.",
+       "apierror-show": "Неправильний параметр — не можна надавати взаємовиключні значення.",
+       "apierror-siteinfo-includealldenied": "Не можна переглядати інформацію щодо всіх серверів, якщо тільки <var>$wgShowHostNames</var> не вказано як «true».",
+       "apierror-sizediffdisabled": "Різниця у розмірах вимкнена в скупому режимі.",
+       "apierror-spamdetected": "Ваше редагування було відхилено, оскільки воно містило фрагмент спаму: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "Ви не маєте прав на перегляд результатів цієї спеціальної сторінки.",
+       "apierror-stashedfilenotfound": "Не вдалося знайти файл у сховку: $1.",
+       "apierror-stashedit-missingtext": "У сховку не знайдено збереженого тексту із заданим хешем.",
+       "apierror-stashfailed-complete": "Завантаження по шматках вже завершилося, перегляньте статус, щоб дізнатися подробиці.",
+       "apierror-stashfailed-nosession": "Немає сесії завантажень по шматках із цим ключем.",
+       "apierror-stashfilestorage": "Не вдалося зберегти завантаження у сховку: $1",
+       "apierror-stashinvalidfile": "Недійсний файл у сховку.",
+       "apierror-stashnosuchfilekey": "Немає такого filekey: $1.",
+       "apierror-stashpathinvalid": "Ключ файлу має неправильний формат або є недійсним з іншої причини: $1.",
+       "apierror-stashwrongowner": "Неправильний власник: $1",
+       "apierror-stashzerolength": "Довжина файлу дорівнює нулю, і його не можна зберегти у сховку: $1.",
+       "apierror-systemblocked": "Вас автоматично заблоковано MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "Розширення шаблонів підтримується лише для вмісту у форматі вікірозмітки. $1 використовує контентну модель $2.",
+       "apierror-toofewexpiries": "$1 {{PLURAL:$1|мітка часу завершення була надана|мітки часу завершення були надані|міток часу завершення було надано}}, тоді як {{PLURAL:$2|потрібна була $2 така мітка|потрібні були $2 таких мітки|потрібно було $2 таких міток}}.",
+       "apierror-unknownaction": "Вказана дія, <kbd>$1</kbd>, нерозпізнана.",
+       "apierror-unknownerror-editpage": "Невідома помилка EditPage: $1.",
+       "apierror-unknownerror-nocode": "Невідома помилка.",
+       "apierror-unknownerror": "Невідома помилка: «$1».",
+       "apierror-unknownformat": "Невідомий формат «$1».",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|Нерозпізнаний параметр|Нерозпізнані параметри}}: $1.",
+       "apierror-unrecognizedvalue": "Нерозпізнане значення для параметра <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "Місцевий репозиторій файлів не підтримує запитів щодо всіх зображень.",
+       "apierror-upload-filekeyneeded": "Треба вказати <var>filekey</var>, коли <var>offset</var> є ненульовим.",
+       "apierror-upload-filekeynotallowed": "Не можна вказувати <var>filekey</var>, коли <var>offset</var> дорівнює 0.",
+       "apierror-upload-inprogress": "Завантаження зі сховку вже в процесі.",
+       "apierror-upload-missingresult": "Немає результатів у даних статусу.",
+       "apierror-urlparamnormal": "Не вдалося нормалізувати параметри зображення для $1.",
+       "apierror-writeapidenied": "Ви не маєте дозволу на редагування цієї вікі через API.",
+       "apiwarn-alldeletedrevisions-performance": "Для підвищення продуктивності при генеруванні назв, встановіть <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "Не вдалося парсити <var>$1urlparam</var> для $2. Використовується лише ширина і висота.",
+       "apiwarn-badutf8": "Значення, вказане для <var>$1</var>, містить недійсні або ненормалізовані дані. Текстові дані мають бути дійсними, NFC-нормалізований Unicode без контрольних символів C0, окрім HT (\\t), LF (\\n), і CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "Перевірте, чи символи, такі як «+» у токені, пройшли правильне процентне кодування в URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> є застарілим. Будь ласка, використовуйте замість нього <kbd>prop=deletedrevisions</kbd> або <kbd>list=alldeletedrevisions</kbd>.",
+       "apiwarn-deprecation-expandtemplates-prop": "Оскільки не задано жодних значень для параметра <var>prop</var>, як вихідні дані було використано старий формат. Цей формат є застарілим, і в майбутньому параметру <var>prop</var> буде задано стандартне значення, наслідком чого стане те, що завжди використовуватиметься новий формат.",
+       "apiwarn-deprecation-httpsexpected": "Використано HTTP, тоді як очікувалося використання HTTPS.",
+       "apiwarn-deprecation-login-botpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб продовжити вхід у систему через <kbd>action=login</kbd>, див. [[Special:BotPasswords]]. Щоб безпечно продовжити, використовуючи вхід в основний обліковий запис, див. <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб безпечно увійти в систему, див. <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "Отримання токена через <kbd>action=login</kbd> є застарілим. Використовуйте натомість <kbd>action=query&meta=tokens&type=login</kbd>.",
+       "apiwarn-deprecation-parameter": "Параметр <var>$1</var> — застарілий.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> є застарілим, починаючи з MediaWiki 1.28. Використовуйте <kbd>prop=headhtml</kbd> при створенні нових документів HTML, або <kbd>prop=modules|jsconfigvars</kbd> при оновленні документа з боку клієнта.",
+       "apiwarn-deprecation-purge-get": "Використання <kbd>action=purge</kbd> через GET є застарілим. Використовуйте POST замість цього.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> є застарілим. Будь ласка, використовуйте натомість <kbd>$2</kbd>.",
+       "apiwarn-difftohidden": "Не вдалося відкрити версію r$1: вміст приховано.",
+       "apiwarn-errorprinterfailed": "Невдача через помилку принтера. Буде здійснено повторну спробу без параметрів.",
+       "apiwarn-errorprinterfailed-ex": "Невдача через помилку принтера (буде здійснено повторну спробу без параметрів): $1",
+       "apiwarn-invalidcategory": "«$1» не є категорією.",
+       "apiwarn-invalidtitle": "«$1» не є коректною назвою.",
+       "apiwarn-invalidxmlstylesheetext": "Таблиця стилів повинна мати розширення <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "Вказана таблиця стилів є недійсною або не існує.",
+       "apiwarn-invalidxmlstylesheetns": "Таблиця стилів має перебувати в просторі назв {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "Задано властивість <kbd>modules</kbd>, але не задано <kbd>jsconfigvars</kbd> або <kbd>encodedjsconfigvars</kbd>. Змінні конфігурації необхідні для коректного використання модуля.",
+       "apiwarn-notfile": "«$1» не є файлом.",
+       "apiwarn-nothumb-noimagehandler": "Не вдалося створити мініатюру, оскільки $1 не має пов'язаного обробника зображень.",
+       "apiwarn-parse-nocontentmodel": "Не задано <var>title</var> або <var>contentmodel</var>, буде використано $1.",
+       "apiwarn-parse-titlewithouttext": "<var>title</var> використано без <var>text</var>, і надіслано запит на оброблені властивості сторінки. Може \nВи хотіли використати <var>page</var> замість <var>title</var>?",
+       "apiwarn-redirectsandrevids": "Вирішення перенаправлень не може використовуватись разом з параметром <var>revids</var>. Усі перенаправлення, на які вказує <var>revids</var>, не було вирішено.",
+       "apiwarn-tokennotallowed": "Дія «$1» недозволена для поточного користувача.",
+       "apiwarn-tokens-origin": "Токени не можна отримати, поки не застосована політика одного походження.",
+       "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>: ліміт становить $2.",
+       "apiwarn-truncatedresult": "Цей результат було скорочено, оскільки інакше він перевищив би ліміт у $1 байтів.",
+       "apiwarn-unclearnowtimestamp": "Вказування «$2» для параметра мітки часу <var>$1</var> є застарілим. Якщо з якоїсь причини Вам треба чітко вказати поточний час без вираховування його з боку клієнта, використайте <kbd>now</kbd>.",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Нерозпізнане|Нерозпізнані}} значення для параметра <var>$1</var>: $2.",
+       "apiwarn-unsupportedarray": "Параметр <var>$1</var> використовує непідтримуваний синтаксис PHP-масиву.",
+       "apiwarn-urlparamwidth": "Ігнорування значення ширини, встановленого в <var>$1urlparam</var> ($2) на користь значення ширини, запозиченого із <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
+       "apiwarn-validationfailed-badchars": "недійсні символи у ключі (лише <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code>, і <code>-</code> дозволені).",
+       "apiwarn-validationfailed-badpref": "недійсне налаштування.",
+       "apiwarn-validationfailed-cannotset": "не може бути встановлено цим модулем.",
+       "apiwarn-validationfailed-keytoolong": "ключ надто довгий (дозволено не більш як $1 байтів).",
+       "apiwarn-validationfailed": "Помилка перевірки для <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Попередження щодо безпеки</strong>: увімкнено <var>$wgDebugAPI</var>.",
+       "api-feed-error-title": "Помилка ($1)",
+       "api-usage-docref": "Див. $1 щодо використання API.",
+       "api-usage-mailinglist-ref": "Щоб взнавати про заплановані і остаточні критичні зміни API, підпишіться на розсилку mediawiki-api-announce тут: &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* Roan Kattouw (головний розробник вер. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (творець, головний розробник вер. 2006 – вер. 2007)\n* Brad Jorsch (головний розробник 2013 – тепер)\n\nБудь ласка, надсилайте свої коментарі, пропозиції та запитання на mediawiki-api@lists.wikimedia.org\nабо зафайліть звіт про баґ на https://phabricator.wikimedia.org/."
 }
index 27fac5d..36251d4 100644 (file)
        "apihelp-main-param-requestid": "任何在此提供的值将包含在响应中。可以用以区别请求。",
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
+       "apihelp-main-param-responselanginfo": "包含在结果中用于<var>uselang</var>和<var>errorlang</var>的语言。",
        "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。\n\n对于已验证的请求,这必须正确匹配<code>Origin</code>标头中的原点之一,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置<code>Access-Control-Allow-Origin</code>和<code>Access-Control-Allow-Credentials</code>开头。\n\n对于未验证的请求,会指定值<kbd>*</kbd>。这将导致<code>Access-Control-Allow-Origin</code>标头被设置,但<code>Access-Control-Allow-Credentials</code>将为<code>false</code>,且所有用户特定数据将受限制。",
        "apihelp-main-param-uselang": "用于消息翻译的语言。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>与<kbd>siprop=languages</kbd>可返回语言代码列表,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
+       "apihelp-main-param-errorformat": "用于警告和错误文本输出的格式。\n; plaintext:已移除HTML标签,并被替换实体的Wiki文本。\n; wikitext:未解析的wiki文本。\n; html:HTML。\n; raw:消息关键词和参数。\n; none:无文本输出,仅包含错误代码。\n; bc:在MediaWiki 1.29以前版本使用的格式。<var>errorlang</var>和<var>errorsuselocal</var>会被忽略。",
+       "apihelp-main-param-errorlang": "用于警告和错误的语言。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>带<kbd>siprop=languages</kbd>返回语言代码的列表,或指定<kbd>content</kbd>以使用此wiki的内容语言,或指定<kbd>uselang</kbd>以使用与<var>uselang</var>参数相同的值。",
+       "apihelp-main-param-errorsuselocal": "如果指定,错误文本将使用来自{{ns:MediaWiki}}名字空间的本地自定义消息。",
        "apihelp-block-description": "封禁一位用户。",
-       "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
+       "apihelp-block-param-user": "要封禁的用户、IP地址或IP地址段。不能与<var>$1userid</var>一起使用",
+       "apihelp-block-param-userid": "要封禁的用户ID。不能与<var>$1user</var>一起使用。",
        "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如<kbd>5 months</kbd>或<kbd>2 weeks</kbd>)或绝对时间(例如<kbd>2014-09-18T12:34:56Z</kbd>)。如果设置为<kbd>infinite</kbd>、<kbd>indefinite</kbd>或<kbd>never</kbd>,封禁将无限期。",
        "apihelp-block-param-reason": "封禁的原因。",
        "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此 IP 地址的匿名编辑)。",
@@ -50,6 +55,7 @@
        "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>)。",
        "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
        "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。",
+       "apihelp-block-param-tags": "要在封禁日志中应用到实体的更改标签。",
        "apihelp-block-example-ip-simple": "封禁IP地址<kbd>192.0.2.5</kbd>三天,原因<kbd>First strike</kbd>。",
        "apihelp-block-example-user-complex": "无限期封禁用户<kbd>Vandal</kbd>,原因<kbd>Vandalism</kbd>,并阻止新账户创建和电子邮件发送。",
        "apihelp-changeauthenticationdata-description": "更改当前用户的身份验证数据。",
        "apihelp-help-example-query": "两个查询子模块的帮助。",
        "apihelp-imagerotate-description": "旋转一幅或多幅图像。",
        "apihelp-imagerotate-param-rotation": "顺时针旋转图像的度数。",
+       "apihelp-imagerotate-param-tags": "要在上传日志中应用到实体的标签。",
        "apihelp-imagerotate-example-simple": "<kbd>90</kbd>度旋转<kbd>File:Example.png</kbd>。",
        "apihelp-imagerotate-example-generator": "将<kbd>Category:Flip</kbd>之中的所有图像旋转<kbd>180</kbd>度。",
        "apihelp-import-description": "从另一个wiki或从一个XML文件导入页面。\n\n注意当发送一个用于<var>xml</var>参数的文件时,HTTP POST必须作为一次文件上传完成(也就是使用multipart/form-data)。",
        "apihelp-import-param-templates": "用于跨wiki导入:连带导入所有包含的模板。",
        "apihelp-import-param-namespace": "导入至此名字空间。不能与<var>$1rootpage</var>一起使用。",
        "apihelp-import-param-rootpage": "作为此页面的子页面导入。不能与<var>$1namespace</var>一起使用。",
+       "apihelp-import-param-tags": "要在导入日志,以及在导入页面的空修订版本中应用到实体的更改标签。",
        "apihelp-import-example-import": "将页面[[meta:Help:ParserFunctions]]连带完整历史导入至100名字空间。",
        "apihelp-linkaccount-description": "将来自第三方提供商的账户链接至当前用户。",
        "apihelp-linkaccount-example-link": "开始从<kbd>Example</kbd>链接至账户的过程。",
        "apihelp-managetags-param-tag": "要创建、删除、激活或取消激活的标签。要创建标签,标签必须不存在。要删除标签,标签必须存在。要激活标签,标签必须存在,且不被任何扩展使用。要取消激活标签,标签必须当前处于激活状态,且被手动定义。",
        "apihelp-managetags-param-reason": "一个创建、删除、激活或停用标签时的原因,可选。",
        "apihelp-managetags-param-ignorewarnings": "是否忽略操作期间发生的任何警告。",
+       "apihelp-managetags-param-tags": "要在标签管理日志中应用到实体的更改标签。",
        "apihelp-managetags-example-create": "创建一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "删除<kbd>vandlaism</kbd>标签,原因<kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "激活一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "从当前用户的监视列表中移除页面及重定向。",
        "apihelp-move-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-move-param-ignorewarnings": "忽略任何警告。",
+       "apihelp-move-param-tags": "要在移动日志,以及在目标页面的空修订版本中应用到实体的更改标签。",
        "apihelp-move-example-move": "移动<kbd>Badtitle</kbd>到<kbd>Goodtitle</kbd>,不保留重定向。",
        "apihelp-opensearch-description": "使用OpenSearch协议搜索wiki。",
        "apihelp-opensearch-param-search": "搜索字符串。",
        "apihelp-protect-example-protect": "保护一个页面。",
        "apihelp-protect-example-unprotect": "通过设置限制为<kbd>all</kbd>解除保护一个页面(就是说任何人都可以执行操作)。",
        "apihelp-protect-example-unprotect2": "通过设置没有限制解除保护一个页面。",
-       "apihelp-purge-description": "为指定标题刷新缓存。\n\n如果用户尚未登录的话,就需要POST请求。",
+       "apihelp-purge-description": "为指定标题刷新缓存。",
        "apihelp-purge-param-forcelinkupdate": "更新链接表。",
        "apihelp-purge-param-forcerecursivelinkupdate": "更新链接表中,并更新任何使用此页作为模板的页面的链接表。",
        "apihelp-purge-example-simple": "刷新<kbd>Main Page</kbd>和<kbd>API</kbd>页面。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
        "apihelp-query+allmessages-param-enableparser": "设置以启用解析器,将处理消息的wiki文本(替代魔术字、处理模板等)。",
        "apihelp-query+allmessages-param-nocontent": "如果设置,不要在输出中包含消息内容。",
-       "apihelp-query+allmessages-param-includelocal": "也包括本地消息,也就是不存在于软件但作为MediaWiki:页面存在的消息。\n这会列举所有MediaWiki:页面,因此它也将列举那些不是真消息的消息,例如[[MediaWiki:Common.js|Common.js]]。",
+       "apihelp-query+allmessages-param-includelocal": "也包括本地消息,也就是不存在于软件但存在于{{ns:MediaWiki}}名字空间的消息。\n这会列举所有{{ns:MediaWiki}}名字空间页面,因此它也将列举那些不是真消息的消息,例如[[MediaWiki:Common.js|Common.js]]。",
        "apihelp-query+allmessages-param-args": "要替代进消息的参数。",
        "apihelp-query+allmessages-param-filter": "只返回名称包含此字符串的消息。",
        "apihelp-query+allmessages-param-customised": "只返回在此定制情形下的消息。",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "添加用于非最新修订的存档修订的文件名。",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "添加修订的字节深度。",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "由Special:Upload所使用,以获取关于现有文件的信息。不适用于MediaWiki核心以外代码。",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "无论文件是否在[[MediaWiki:Bad image list]]都添加",
        "apihelp-query+imageinfo-param-limit": "每个文件返回多少文件修订。",
        "apihelp-query+imageinfo-param-start": "开始列举的时间戳。",
        "apihelp-query+imageinfo-param-end": "列举的结束时间戳。",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "如果用于extmetadata属性的翻译可用,则全部取得。",
        "apihelp-query+imageinfo-param-extmetadatafilter": "如果指定且非空,则只为$1prop=extmetadata返回这些键。",
        "apihelp-query+imageinfo-param-urlparam": "处理器特定的参数字符串。例如PDF可能使用<kbd>page15-100px</kbd>。<var>$1urlwidth</var>必须被使用,并与<var>$1urlparam</var>一致。",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "如果<kbd>$2prop=badfile</kbd>被设置,这会是在评估[[MediaWiki:Bad image list]]时使用的页面标题",
        "apihelp-query+imageinfo-param-localonly": "只看本地存储库的文件。",
        "apihelp-query+imageinfo-example-simple": "取得有关[[:File:Albert Einstein Head.jpg]]的当前版本的信息。",
        "apihelp-query+imageinfo-example-dated": "取得有关[[:File:Test.jpg]]自2008年以来版本的信息。",
        "apihelp-query+usercontribs-param-limit": "返回贡献的最大数量。",
        "apihelp-query+usercontribs-param-start": "返回的起始时间戳。",
        "apihelp-query+usercontribs-param-end": "返回的最终时间戳。",
-       "apihelp-query+usercontribs-param-user": "要检索贡献的用户。",
-       "apihelp-query+usercontribs-param-userprefix": "取得所有用户名以这个值开头的用户的贡献。覆盖$1user。",
+       "apihelp-query+usercontribs-param-user": "要检索贡献的用户。不能与<var>$1userids</var>或<var>$1userprefix</var>一起使用。",
+       "apihelp-query+usercontribs-param-userprefix": "取得所有用户名以这个值开头的用户的贡献。不能与<var>$1user</var>或<var>$1userids</var>一起使用。",
+       "apihelp-query+usercontribs-param-userids": "要检索贡献的用户ID。不能与<var>$1user</var>或<var>$1userprefix</var>一起使用。",
        "apihelp-query+usercontribs-param-namespace": "只列出这些名字空间的贡献。",
        "apihelp-query+usercontribs-param-prop": "包含额外的信息束:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "添加页面ID和修订ID。",
        "apihelp-query+users-paramvalue-prop-cancreate": "表明是否可以为有效但尚未注册的用户名创建一个账户。",
        "apihelp-query+users-param-attachedwiki": "与<kbd>$1prop=centralids</kbd>一起使用,表明用户是否附加于此ID定义的wiki。",
        "apihelp-query+users-param-users": "要获取信息的用户列表。",
+       "apihelp-query+users-param-userids": "要获得信息的用户ID列表。",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
        "apihelp-query+watchlist-description": "在当前用户的监视列表中获取对页面的最近更改。",
        "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>中启用路由以使用此模块。",
        "apihelp-resetpassword-param-user": "正在重置的用户。",
        "apihelp-resetpassword-param-email": "正在重置用户的电子邮件地址。",
-       "apihelp-resetpassword-param-capture": "返回已发送的临时密码。需要<code>passwordreset</code>用户权限。",
        "apihelp-resetpassword-example-user": "向用户<kbd>Example</kbd>发送密码重置邮件。",
        "apihelp-resetpassword-example-email": "向所有电子邮件地址为<kbd>user@example.com</kbd>的用户发送密码重置邮件。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
        "apihelp-revisiondelete-param-show": "每次修订要恢复显示的东西。",
        "apihelp-revisiondelete-param-suppress": "是否对管理员及其他人禁止数据。",
        "apihelp-revisiondelete-param-reason": "删除或恢复的原因。",
+       "apihelp-revisiondelete-param-tags": "要在删除日志中应用到实体的标签。",
        "apihelp-revisiondelete-example-revision": "隐藏<kbd>首页</kbd>的修订版本<kbd>12345</kbd>的内容。",
        "apihelp-revisiondelete-example-log": "隐藏日志记录<kbd>67890</kbd>上的所有数据,原因<kbd>BLP violation</kbd>。",
        "apihelp-rollback-description": "撤销对页面的最近编辑。\n\n如果最近编辑页面的用户在一行中进行多次编辑,所有编辑将被回退。",
        "apihelp-setnotificationtimestamp-example-page": "重置用于<kbd>Main page</kbd>的通知状态。",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
        "apihelp-setnotificationtimestamp-example-allpages": "重置在<kbd>{{ns:user}}</kbd>名字空间中的页面的通知状态。",
+       "apihelp-setpagelanguage-description": "更改页面的语言。",
+       "apihelp-setpagelanguage-description-disabled": "此wiki不允许更改页面的语言。\n\n启用<var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>以使用此操作。",
+       "apihelp-setpagelanguage-param-title": "您希望更改语言的页面标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-setpagelanguage-param-pageid": "您希望更改语言的页面ID。不能与<var>$1title</var>一起使用。",
+       "apihelp-setpagelanguage-param-lang": "更改页面的目标语言的语言代码。使用<kbd>default</kbd>以重置页面为wiki的默认内容语言。",
+       "apihelp-setpagelanguage-param-reason": "更改原因。",
+       "apihelp-setpagelanguage-param-tags": "要应用到此操作导致的日志记录的更改标签。",
+       "apihelp-setpagelanguage-example-language": "更改<kbd>Main Page</kbd>的语言为巴斯克语。",
+       "apihelp-setpagelanguage-example-default": "更改ID为123的页面的语言为wiki的默认内容语言。",
        "apihelp-stashedit-description": "在分享的缓存中准备一次编辑。\n\n这是为了从编辑表单中通过AJAX使用,以改进页面保存的性能。",
        "apihelp-stashedit-param-title": "已开始编辑的页面标题。",
        "apihelp-stashedit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
        "apihelp-tag-param-add": "要添加的标签。只有手动定义的标签可以添加。",
        "apihelp-tag-param-remove": "要移除的标签。只有手动定义或完全不明确的标签可以被移除。",
        "apihelp-tag-param-reason": "更改原因。",
+       "apihelp-tag-param-tags": "要应用到将被创建为此操作结果的日志实体的标签。",
        "apihelp-tag-example-rev": "将<kbd>vandalism</kbd>标签添加至修订ID 123,而不指定原因",
        "apihelp-tag-example-log": "从日志记录ID 123移除<kbd>spam</kbd>标签,原因为<kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "获取可修改数据的操作的令牌。\n\n此模块被弃用以有利于[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-tokens-example-edit": "检索一个编辑令牌(默认)。",
        "apihelp-tokens-example-emailmove": "检索一个电子邮件令牌和一个移动令牌。",
        "apihelp-unblock-description": "解封一位用户。",
-       "apihelp-unblock-param-id": "解封时需要的封禁ID(通过<kbd>list=blocks</kbd>获得)。不能与<var>$1user</var>一起使用。",
-       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP段。不能与<var>$1id</var>一起使用。",
+       "apihelp-unblock-param-id": "解封时需要的封禁ID(通过<kbd>list=blocks</kbd>获得)。不能与<var>$1user</var>或<var>$1userid</var>一起使用。",
+       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP地址段。不能与<var>$1id</var>或<var>$1userid</var>一起使用。",
+       "apihelp-unblock-param-userid": "要封禁的用户ID。不能与<var>$1id</var>或<var>$1user</var>一起使用。",
        "apihelp-unblock-param-reason": "解封的原因。",
        "apihelp-unblock-param-tags": "要在封禁日志中应用到实体的更改标签。",
        "apihelp-unblock-example-id": "解封封禁ID #<kbd>105</kbd>。",
        "apihelp-unblock-example-user": "解封用户<kbd>Bob</kbd>,原因<kbd>Sorry Bob</kbd>。",
-       "apihelp-undelete-description": "恢复一个被删除页面的修订。\n\n被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。",
+       "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-userrights-description": "更改一位用户的组成员。",
        "apihelp-userrights-param-user": "用户名。",
        "apihelp-userrights-param-userid": "用户ID。",
-       "apihelp-userrights-param-add": "将用户加入至这些组中。",
+       "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>机器人</kbd>组,并将其从<kbd>管理员</kbd>和<kbd>行政员</kbd>组移除。",
+       "apihelp-userrights-example-expiry": "添加用户<kbd>SometimeSysop</kbd>至用户组<kbd>sysop</kbd>,为期1个月。",
+       "apihelp-validatepassword-description": "验证密码是否符合wiki的密码方针。\n\n如果密码可以接受,就报告有效性为<samp>Good</samp>,如果密码可用于登录但必须更改,则报告为<samp>Change</samp>,或如果密码不可使用,则报告为<samp>Invalid</samp>。",
+       "apihelp-validatepassword-param-password": "要验证的密码。",
+       "apihelp-validatepassword-param-user": "用户名,供测试账户创建时使用。命名的用户必须不存在。",
+       "apihelp-validatepassword-param-email": "电子邮件,供测试账户创建时使用。",
+       "apihelp-validatepassword-param-realname": "真实姓名,供测试账户创建时使用。",
+       "apihelp-validatepassword-example-1": "验证当前用户的密码<kbd>foobar</kbd>。",
+       "apihelp-validatepassword-example-2": "为创建用户<kbd>Example</kbd>验证密码<kbd>qwerty</kbd>。",
        "apihelp-watch-description": "从当前用户的监视列表中添加或移除页面。",
        "apihelp-watch-param-title": "要(取消)监视的页面。也可使用<var>$1titles</var>。",
        "apihelp-watch-param-unwatch": "如果设置页面将被取消监视而不是被监视。",
        "apihelp-watch-example-unwatch": "取消监视页面<kbd>Main Page</kbd>。",
        "apihelp-watch-example-generator": "监视主名字空间中的最少几个页面。",
        "apihelp-format-example-generic": "返回查询结果为$1格式。",
-       "apihelp-format-param-wrappedhtml": "作为一个JSON对象返回渲染好的HTML和关联的ResouceLoader模块。",
+       "apihelp-format-param-wrappedhtml": "作为一个JSON对象返回优质打印的HTML和关联的ResouceLoader模块。",
        "apihelp-json-description": "输出数据为JSON格式。",
        "apihelp-json-param-callback": "如果指定,将输出内容包裹在一个指定的函数调用中。出于安全考虑,所有用户相关的数据将被限制。",
        "apihelp-json-param-utf8": "如果指定,使用十六进制转义序列将大多数(但不是全部)非ASCII的字符编码为UTF-8,而不是替换它们。默认当<var>formatversion</var>不是<kbd>1</kbd>时。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
        "apihelp-rawfm-description": "输出数据为JSON格式,包含调试元素(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
-       "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:mediawiki}}名字空间以<code>.xsl</code>为结尾的标题。",
+       "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:MediaWiki}}名字空间以<code>.xsl</code>为结尾的标题。",
        "apihelp-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
        "api-format-title": "MediaWiki API 结果",
        "api-help-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-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$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>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,that means the authentication worked but we don't have a linked user account. You might treat this as <samp>UI</samp> or as <samp>FAIL</samp>.",
+       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证可以工作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
        "api-help-authmanagerhelper-requests": "只使用这些身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>,或来自此模块之前的响应。",
        "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
        "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
        "api-help-authmanagerhelper-returnurl": "为第三方身份验证流返回URL,必须为绝对值。需要此值或<var>$1continue</var>两者之一。\n\nUpon receiving a <samp>REDIRECT</samp> response, you will typically open a browser or web view to the specified <samp>redirecttarget</samp> URL for a third-party authentication flow. When that completes, the third party will send the browser or web view to this URL. You should extract any query or POST parameters from the URL and pass them as a <var>$1continue</var> request to this API module.",
        "api-help-authmanagerhelper-continue": "此请求是在早先的<samp>UI</samp>或<samp>REDIRECT</samp>响应之后的附加请求。必需此值或<var>$1returnurl</var>。",
        "api-help-authmanagerhelper-additional-params": "此模块允许额外参数,取决于可用的身份验证请求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前来自此模块的相应,如果可以)以决定可用请求及其使用的字段。",
+       "apierror-allimages-redirect": "当使用<kbd>allimages</kbd>作为发生器时,请使用<kbd>gaifilterredir=nonredirects</kbd>而不是<var>redirects</var>。",
+       "apierror-allpages-generator-redirects": "当使用<kbd>allpages</kbd>作为发生器时,请使用<kbd>gapfilterredir=nonredirects</kbd>而不是<var>redirects</var>。",
+       "apierror-appendnotsupported": "不能使用内容模型$1附加在页面上。",
+       "apierror-articleexists": "您尝试创建的条目已刚刚被创建。",
+       "apierror-assertbotfailed": "主张用户有<code>bot</code>权限失败。",
+       "apierror-assertnameduserfailed": "主张用户为“$1”失败。",
+       "apierror-assertuserfailed": "主张用户已登录失败。",
+       "apierror-autoblocked": "您的IP地址已被自动封禁,因为它曾被一位已封禁用户使用。",
+       "apierror-badconfig-resulttoosmall": "此wiki上<code>$wgAPIMaxResultSize</code>的值太小,不能获得基础结果信息。",
+       "apierror-badcontinue": "无效继续参数。您应该传递由之前查询返回的原始值。",
+       "apierror-baddiff": "不能取得差异。一个或多个修订版本不存在,或您没有权限查看它们。",
+       "apierror-baddiffto": "<var>$1diffto</var>必须设置为非负数、<kbd>prev</kbd>、<kbd>next</kbd>或<kbd>cur</kbd>。",
+       "apierror-badformat-generic": "内容模型$2尚不支持请求的内容格式$1。",
+       "apierror-badformat": "由$3使用的内容模型$2尚不支持请求的内容格式$1。",
+       "apierror-badgenerator-notgenerator": "模块<kbd>$1</kbd>不能用作发生器。",
+       "apierror-badgenerator-unknown": "未知<kbd>generator=$1</kbd>。",
+       "apierror-badip": "IP参数无效。",
+       "apierror-badmd5": "提供的MD5哈希不正确。",
+       "apierror-badmodule-badsubmodule": "模块<kbd>$1</kbd>不包含子模块“$2”。",
+       "apierror-badmodule-nosubmodules": "模块<kbd>$1</kbd>没有子模块。",
+       "apierror-badparameter": "用于参数<var>$1</var>的值无效。",
+       "apierror-badquery": "无效的查询。",
+       "apierror-badtimestamp": "用于时间戳参数<var>$1</var>的值“$2”无效。",
+       "apierror-badtoken": "无效的CSRF令牌。",
+       "apierror-badupload": "文件上传参数<var>$1</var>不是文件上传;确保为您的POST使用<code>multipart/form-data</code>,并在<code>Content-Disposition</code>标头中包含文件名。",
+       "apierror-badurl": "用于URL参数<var>$1</var>的值“$2”无效。",
+       "apierror-baduser": "用于用户参数<var>$1</var>的值“$2”无效。",
+       "apierror-badvalue-notmultivalue": "U+001F多值分隔符只可以用于多值参数。",
+       "apierror-bad-watchlist-token": "提供了不正确的监视列表令牌。请在[[Special:Preferences]]设置正确的令牌。",
+       "apierror-blockedfrommail": "您已被封禁,不能发送电子邮件。",
+       "apierror-blocked": "您已被封禁,不能编辑。",
+       "apierror-botsnotsupported": "此界面不支持机器人。",
+       "apierror-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": "您没有权限封禁用户通过wiki发送电子邮件。",
+       "apierror-cantblock": "您没有权限封禁用户。",
+       "apierror-cantchangecontentmodel": "您没有权限更改页面的内容模型。",
+       "apierror-canthide": "您没有权限从封禁日志中隐藏用户名。",
+       "apierror-cantimport-upload": "您没有权限导入上传的页面。",
+       "apierror-cantimport": "您没有权限导入页面。",
+       "apierror-cantoverwrite-sharedfile": "目标文件存在于分享存储库,并且您没有权限覆盖它。",
+       "apierror-cantsend": "您没有登录,您没有已确认的电子邮件地址,或者您未被允许向其他用户发送电子邮件,所以您不能发送电子邮件。",
+       "apierror-cantundelete": "不能还原:请求的修订版本可能不存在,或可能已被还原。",
+       "apierror-changeauth-norequest": "创建更改请求失败。",
+       "apierror-chunk-too-small": "对于非最终块,最小块大小为$1{{PLURAL:$1|字节}}。",
+       "apierror-cidrtoobroad": "比/$2更宽的$1 CIDR地址段不被接受。",
+       "apierror-compare-inputneeded": "需要标题、页面ID或修订版本号以用于<var>from</var>和<var>to</var>参数。",
+       "apierror-contentserializationexception": "内容序列化失败:$1",
+       "apierror-contenttoobig": "您提供的内容超过了$1{{PLURAL:$1|千字节}}的条目大小限制。",
+       "apierror-copyuploadbaddomain": "不允许从此域名通过URL上传。",
+       "apierror-copyuploadbadurl": "不允许从此URL上传。",
+       "apierror-create-titleexists": "现有标题不能通过<kbd>create</kbd>保护。",
+       "apierror-csp-report": "处理CSP报告时出错:$1。",
+       "apierror-databaseerror": "[$1]数据库查询错误。",
+       "apierror-deletedrevs-param-not-1-2": "<var>$1</var>参数不能用于模式1或2。",
+       "apierror-deletedrevs-param-not-3": "<var>$1</var>参数不能用于模式3。",
+       "apierror-emptynewsection": "无法创建空白新章节。",
+       "apierror-emptypage": "不允许创建新的,空白的页面。",
+       "apierror-exceptioncaught": "[$1]捕获异常:$2",
+       "apierror-filedoesnotexist": "文件不存在。",
+       "apierror-fileexists-sharedrepo-perm": "目标文件存在于共享存储库。使用<var>ignorewarnings</var>参数覆盖它。",
+       "apierror-filenopath": "不能获取本地文件路径。",
+       "apierror-filetypecannotberotated": "文件类型不能旋转。",
+       "apierror-formatphp": "此响应不能使用<kbd>format=php</kbd>代表。请参见https://phabricator.wikimedia.org/T68776。",
+       "apierror-imageusage-badtitle": "<kbd>$1</kbd>的标题必须是文件。",
+       "apierror-import-unknownerror": "导入时的未知错误:$1。",
+       "apierror-integeroutofrange-abovebotmax": "对于机器人和管理员,<var>$1</var>不能超过$2(设置为$3)。",
+       "apierror-integeroutofrange-abovemax": "对于用户,<var>$1</var>不能超过$2(设置为$3)。",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var>不能小于$2(设置为$3)。",
+       "apierror-invalidcategory": "您输入的分类名称无效。",
+       "apierror-invalid-chunk": "偏移值与当前数据块之和大于声称的文件大小。",
+       "apierror-invalidexpiry": "无效的过期时间“$1”。",
+       "apierror-invalid-file-key": "不是有效的文件关键词。",
+       "apierror-invalidlang": "用于参数<var>$1</var>的语言值无效。",
+       "apierror-invalidoldimage": "旧图片参数有无效格式。",
+       "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd>参数不能与<kbd>$2</kbd>一起使用。",
+       "apierror-invalidparammix-mustusewith": "<kbd>$1</kbd>参数只能与<kbd>$2</kbd>一起使用。",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd>不能连同<var>oldid</var>、<var>pageid</var>或<var>page</var>参数使用。请使用<var>title</var>和<var>text</var>。",
+       "apierror-invalidparammix": "{{PLURAL:$2|参数}}$1不能一起使用。",
+       "apierror-invalidsection": "章节参数必须为有效的章节ID或<kbd>new</kbd>。",
+       "apierror-invalidsha1base36hash": "提供的SHA1Base36哈希无效。",
+       "apierror-invalidsha1hash": "提供的SHA1哈希无效。",
+       "apierror-invalidtitle": "错误标题“$1”。",
+       "apierror-invalidurlparam": "<var>$1urlparam</var>的值无效(<kbd>$2=$3</kbd>)。",
+       "apierror-invaliduser": "无效用户名“$1”。",
+       "apierror-invaliduserid": "用户ID<var>$1</var>无效。",
+       "apierror-maxlag-generic": "正在等待数据库服务器:已延迟$1{{PLURAL:$1|秒}}。",
+       "apierror-maxlag": "正在等待$2:已延迟$1{{PLURAL:$1|秒}}。",
+       "apierror-mimesearchdisabled": "MIME搜索在Miser模式中被禁用。",
+       "apierror-missingcontent-pageid": "丢失ID为$1的页面的内容。",
+       "apierror-missingparam-at-least-one-of": "需要{{PLURAL:$2|参数$1|$1中的至少一个参数}}。",
+       "apierror-missingparam-one-of": "需要{{PLURAL:$2|参数$1|$1中的一个参数}}。",
+       "apierror-missingparam": "<var>$1</var>参数必须被设置。",
+       "apierror-missingrev-pageid": "没有ID为$1的页面的当前修订版本。",
+       "apierror-missingtitle-createonly": "丢失标题只可以通过<kbd>create</kbd>保护。",
+       "apierror-missingtitle": "您指定的页面不存在。",
+       "apierror-missingtitle-byname": "页面$1不存在。",
+       "apierror-moduledisabled": "<kbd>$1</kbd>模块已被禁用。",
+       "apierror-multival-only-one-of": "参数<var>$1</var>只允许$2{{PLURAL:$3||之一}}。",
+       "apierror-multival-only-one": "参数<var>$1</var>只允许一个值。",
+       "apierror-multpages": "<var>$1</var>只可以在单一页面使用。",
+       "apierror-mustbeloggedin-changeauth": "您必须登录以更改身份验证数据。",
+       "apierror-mustbeloggedin-generic": "您必须登录。",
+       "apierror-mustbeloggedin-linkaccounts": "您必须登录以链接账户。",
+       "apierror-mustbeloggedin-removeauth": "您必须登录以移除身份验证数据。",
+       "apierror-mustbeloggedin-uploadstash": "上传暂存功能只对已登录用户可用。",
+       "apierror-mustbeloggedin": "您必须登录至$1。",
+       "apierror-mustbeposted": "<kbd>$1</kbd>模块需要POST请求。",
+       "apierror-mustpostparams": "以下{{PLURAL:$2|参数}}在查询字符串中被找到,但必须在POST正文中:$1。",
+       "apierror-noapiwrite": "通过API编辑此wiki已禁用。请确保<code>$wgEnableWriteAPI=true;</code>声明包含在wiki的<code>LocalSettings.php</code>文件中。",
+       "apierror-nochanges": "没有请求的更改。",
+       "apierror-nodeleteablefile": "没有该文件的旧版本。",
+       "apierror-no-direct-editing": "$2使用的内容模型$1不支持通过API直接编辑。",
+       "apierror-noedit-anon": "匿名用户不能编辑页面。",
+       "apierror-noedit": "您没有权限编辑页面。",
+       "apierror-noimageredirect-anon": "匿名用户不能创建图片重定向。",
+       "apierror-noimageredirect": "您没有权限创建图片重定向。",
+       "apierror-nosuchlogid": "没有ID为$1的日志记录。",
+       "apierror-nosuchpageid": "没有ID为$1的页面。",
+       "apierror-nosuchrcid": "没有ID为$1的最近更改。",
+       "apierror-nosuchrevid": "没有ID为$1的修订版本。",
+       "apierror-nosuchsection": "没有章节$1。",
+       "apierror-nosuchsection-what": "在$2中没有章节$1。",
+       "apierror-nosuchuserid": "没有ID为$1的用户。",
+       "apierror-notarget": "您没有为此章节指定有效目标。",
+       "apierror-notpatrollable": "修订版本r$1不能巡查,因为它太旧了。",
+       "apierror-nouploadmodule": "未设置上传模块。",
+       "apierror-opensearch-json-warnings": "警告不能以OpenSearch JSON格式表示。",
+       "apierror-pagecannotexist": "名字空间不允许实际页面。",
+       "apierror-pagedeleted": "在您取得页面时间戳以来,页面已被删除。",
+       "apierror-pagelang-disabled": "此wiki不允许更改页面的语言。",
+       "apierror-paramempty": "参数<var>$1</var>不能为空。",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd>只支持wiki文本内容。",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd>只支持wiki文本内容。$1使用内容模型$2。",
+       "apierror-pastexpiry": "终止时间“$1”已过去。",
+       "apierror-permissiondenied": "您没有权限$1。",
+       "apierror-permissiondenied-generic": "权限被拒绝。",
+       "apierror-permissiondenied-patrolflag": "您需要<code>patrol</code>或<code>patrolmarks</code>权限来请求巡查标记。",
+       "apierror-permissiondenied-unblock": "您没有权限解封用户。",
+       "apierror-prefixsearchdisabled": "前缀搜索在Miser模式中被禁用。",
+       "apierror-promised-nonwrite-api": "<code>Promise-Non-Write-API-Action</code> HTTP标头不能发送至写模式API模块。",
+       "apierror-protect-invalidaction": "无效的保护类型“$1”。",
+       "apierror-protect-invalidlevel": "无效的保护级别“$1”。",
+       "apierror-ratelimited": "您已超过您的速率限制。请等待一段时间再试。",
+       "apierror-readapidenied": "您需要读取权限以使用此模块。",
+       "apierror-readonly": "此wiki目前为只读模式。",
+       "apierror-reauthenticate": "您在该会话中尚未经过验证,请重新验证。",
+       "apierror-redirect-appendonly": "您试图使用重定向跟随模式编辑,而这必须与<kbd>section=new</kbd>、<var>prependtext</var>或<var>appendtext</var>共同使用。",
+       "apierror-revdel-mutuallyexclusive": "同一字段不能同时用于<var>hide</var>和<var>show</var>。",
+       "apierror-revdel-needtarget": "此修订版本删除类型需要目标标题。",
+       "apierror-revdel-paramneeded": "需要<var>hide</var>和/或<var>show</var>的至少一个值。",
+       "apierror-revisions-norevids": "<var>revids</var>参数不能与列表选项(<var>$1limit</var>、<var>$1startid</var>、<var>$1endid</var>、<kbd>$1dir=newer</kbd>、<var>$1user</var>、<var>$1excludeuser</var>、<var>$1start</var>和<var>$1end</var>)一起使用",
+       "apierror-revisions-singlepage": "<var>titles</var>、<var>pageids</var>或发生器用于提供多个页面,但<var>$1limit</var>、<var>$1startid</var>、<var>$1endid</var>、<kbd>$1dir=newer</kbd>、<var>$1user</var>、<var>$1excludeuser</var>、<var>$1start</var>和<var>$1end</var>参数只能在一个页面上使用。",
+       "apierror-revwrongpage": "r$1不是$2的修订版本。",
+       "apierror-searchdisabled": "<var>$1</var>搜索已禁用。",
+       "apierror-sectionreplacefailed": "不能合并更新的章节。",
+       "apierror-sectionsnotsupported": "内容模型$1不支持章节。",
+       "apierror-sectionsnotsupported-what": "章节不被$1所支持。",
+       "apierror-show": "不正确的参数——不可提供互斥值。",
+       "apierror-siteinfo-includealldenied": "除非<var>$wgShowHostNames</var>为真,否则不能查看所有服务器的信息。",
+       "apierror-sizediffdisabled": "大小差异在Miser模式中被禁用。",
+       "apierror-spamdetected": "您的编辑被拒绝,因为它包含垃圾部分:<code>$1</code>。",
+       "apierror-specialpage-cantexecute": "您没有权限查看此特殊页面的结果。",
+       "apierror-stashedfilenotfound": "无法在暂存处找到文件:$1。",
+       "apierror-stashedit-missingtext": "提供的哈希中找不到暂存文本。",
+       "apierror-stashfailed-complete": "大块上传已经完成,检查状态以获取详情。",
+       "apierror-stashfailed-nosession": "没有带此关键词的大块上传会话。",
+       "apierror-stashfilestorage": "不能在暂存处存储上传:$1",
+       "apierror-stashinvalidfile": "无效暂存文件。",
+       "apierror-stashnosuchfilekey": "没有这个filekey:$1。",
+       "apierror-stashwrongowner": "错误所有者:$1",
+       "apierror-stashzerolength": "文件长度为0,并且不能在暂存库中储存:$1。",
+       "apierror-systemblocked": "您已被MediaWiki自动封禁。",
+       "apierror-templateexpansion-notwikitext": "模板展开只支持wiki文本内容。$1使用内容模型$2。",
+       "apierror-unknownaction": "指定的操作<kbd>$1</kbd>不被承认。",
+       "apierror-unknownerror-editpage": "未知的编辑页面错误:$1。",
+       "apierror-unknownerror-nocode": "未知错误。",
+       "apierror-unknownerror": "未知错误:“$1”。",
+       "apierror-unknownformat": "无法识别的格式“$1”。",
+       "apierror-unrecognizedparams": "无法识别的{{PLURAL:$2|参数}}:$1。",
+       "apierror-unrecognizedvalue": "无法识别的参数<var>$1</var>的值:$2。",
+       "apierror-unsupportedrepo": "本地文件存储库不支持查询所有图片。",
+       "apierror-upload-filekeyneeded": "当<var>offset</var>不为0时,必须提供<var>filekey</var>。",
+       "apierror-upload-filekeynotallowed": "当<var>offset</var>为0时,不能提供<var>filekey</var>。",
+       "apierror-upload-inprogress": "从暂存处上传已在进行中。",
+       "apierror-upload-missingresult": "状态数据中没有结果。",
+       "apierror-urlparamnormal": "不能为$1标准化图片参数。",
+       "apierror-writeapidenied": "您不被允许通过API编辑此wiki。",
+       "apiwarn-alldeletedrevisions-performance": "当生成标题时,为获得更好性能,请设置<kbd>$1dir=newer</kbd>。",
+       "apiwarn-badurlparam": "不能为$2解析<var>$1urlparam</var>。请只使用宽和高。",
+       "apiwarn-badutf8": "<var>$1</var>通过的值包含无效或非标准化数据。正文数据应为有效的NFC标准化Unicode,没有除HT(\\t)、LF(\\n)和CR(\\r)以外的C0控制字符。",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd>已被弃用。请改用<kbd>prop=deletedrevisions</kbd>或<kbd>list=alldeletedrevisions</kbd>。",
+       "apiwarn-deprecation-expandtemplates-prop": "因为没有为<var>prop</var>参数指定值,所以在输出上使用了遗留格式。这种格式已弃用,并且将来会为<var>prop</var>参数设置默认值,这会导致新格式总会被使用。",
+       "apiwarn-deprecation-httpsexpected": "当应为HTTPS时,HTTP被使用。",
+       "apiwarn-deprecation-login-botpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要继续通过<kbd>action=login</kbd>登录,请参见[[Special:BotPasswords]]。要安全继续使用主账户登录,请参见<kbd>action=clientlogin</kbd>。",
+       "apiwarn-deprecation-login-nobotpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要安全登录,请参见<kbd>action=clientlogin</kbd>。",
+       "apiwarn-deprecation-login-token": "通过<kbd>action=login</kbd>取得令牌已弃用。请改用<kbd>action=query&meta=tokens&type=login</kbd>。",
+       "apiwarn-deprecation-parameter": "参数<var>$1</var>已被弃用。",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd>从MediaWiki 1.28版开始已弃用。在创建新HTML文档时请使用<kbd>prop=headhtml</kbd>,或当更新文档客户端时请使用<kbd>prop=modules|jsconfigvars</kbd>。",
+       "apiwarn-deprecation-purge-get": "通过GET使用<kbd>action=purge</kbd>已被弃用。请改用POST。",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd>已弃用。请改用<kbd>$2</kbd>。",
+       "apiwarn-difftohidden": "不能与r$1做差异比较:内容被隐藏。",
+       "apiwarn-errorprinterfailed": "错误打印失败。将在没有参数的前提下重试。",
+       "apiwarn-errorprinterfailed-ex": "错误打印失败(将在没有参数的前提下重试):$1",
+       "apiwarn-invalidcategory": "“$1”不是一个分类。",
+       "apiwarn-invalidtitle": "“$1”不是一个有效的标题。",
+       "apiwarn-invalidxmlstylesheetext": "样式表应拥有<code>.xsl</code>扩展名。",
+       "apiwarn-invalidxmlstylesheet": "指定了无效或不存在的样式表。",
+       "apiwarn-invalidxmlstylesheetns": "样式表应位于{{ns:MediaWiki}}名字空间。",
+       "apiwarn-moduleswithoutvars": "属性<kbd>modules</kbd>被设置,但不是<kbd>jsconfigvars</kbd>或<kbd>encodedjsconfigvars</kbd>。需要配置变量以获得适当的模块使用。",
+       "apiwarn-notfile": "“$1”不是文件。",
+       "apiwarn-nothumb-noimagehandler": "不能创建缩略图,因为$1没有关联的图片处理器。",
+       "apiwarn-parse-nocontentmodel": "<var>title</var>或<var>contentmodel</var>未提供,假设$1。",
+       "apiwarn-parse-titlewithouttext": "<var>title</var>在没有<var>text</var>的情况下被使用,并且请求了已解析页面的属性。您是想用<var>page</var>而不是<var>title</var>么?",
+       "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。",
+       "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值:上限为$2。",
+       "apiwarn-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-validationfailed-badchars": "关键词中的字符无效(只允许<code>a-z</code>、<code>A-Z</code>、<code>0-9</code>、<code>_</code>和<code>-</code>)。",
+       "apiwarn-validationfailed-badpref": "不是有效的偏好。",
+       "apiwarn-validationfailed-cannotset": "不能通过此模块设置。",
+       "apiwarn-validationfailed-keytoolong": "关键词太长(不允许超过$1字节)。",
+       "apiwarn-validationfailed": "<kbd>$1</kbd>的合法性错误:$2",
+       "apiwarn-wgDebugAPI": "<strong>安全警告</strong>:<var>$wgDebugAPI</var>已启用。",
+       "api-feed-error-title": "错误($1)",
+       "api-usage-docref": "参见$1以获取API用法。",
+       "api-usage-mailinglist-ref": "在&lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt;订阅mediawiki-api-announce列表以获取API弃用和重大更新的通知。",
+       "api-exception-trace": "$1在$2($3)\n$4",
        "api-credits-header": "制作人员",
        "api-credits": "API 开发人员:\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求至https://phabricator.wikimedia.org/。"
 }
index 54e476f..86ddc4c 100644 (file)
@@ -7,12 +7,21 @@
                        "EagerLin",
                        "Zhxy 519",
                        "Macofe",
-                       "Jasonzhuocn"
+                       "Jasonzhuocn",
+                       "Winstonyin"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文件]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵件清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug與請求]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是 API 仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤請求:</strong>當 API 收到錯誤請求時, HTTP header 將會返回一個包含「MediaWiki-API-Error」的值,隨後 header 的值與錯誤碼將會送回並設定為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|說明文件]]\n* [[mw:API:FAQ|常見問題]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵寄清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 報告錯誤及請求功能]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是API仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤的請求:</strong>當API收到錯誤的請求時,會發出以「MediaWiki-API-Error」為鍵的HTTP頭欄位,隨後頭欄位的值與錯誤碼將會被設為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。\n\n<strong>測試:</strong>要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。",
        "apihelp-main-param-action": "要執行的動作。",
        "apihelp-main-param-format": "輸出的格式。",
+       "apihelp-main-param-smaxage": "將HTTP緩存控制頭欄位設為<code>s-maxage</code>秒。錯誤不會做緩存。",
+       "apihelp-main-param-maxage": "將HTTP緩存控制頭欄位設為<code>max-age</code>秒。錯誤不會做緩存。",
+       "apihelp-main-param-assert": "若設為<kbd>user</kbd>,會確認使用者是否已登入;若設為<kbd>bot</kbd>,會確認是否擁有機械人權限。",
+       "apihelp-main-param-assertuser": "確認目前使用者就是指定的使用者。",
+       "apihelp-main-param-requestid": "在此處提供的任何值都將包括在響應之中。可用於區分請求。",
+       "apihelp-main-param-servedby": "在結果中包括提出請求的主機名。",
+       "apihelp-main-param-curtimestamp": "在結果中包括目前的時間戳。",
+       "apihelp-main-param-responselanginfo": "在結果中包括<var>uselang</var>和<var>errorlang</var>所用的語言。",
        "apihelp-block-description": "封鎖使用者。",
        "apihelp-block-param-user": "您要封鎖的使用者名稱、IP 位址或 IP 範圍。",
        "apihelp-block-param-reason": "封鎖原因。",
        "apihelp-login-example-login": "登入",
        "apihelp-logout-description": "登出並清除 session 資料。",
        "apihelp-logout-example-logout": "登出當前使用者",
+       "apihelp-mergehistory-description": "合併頁面歷史",
+       "apihelp-mergehistory-param-reason": "合併歷史的原因。",
+       "apihelp-mergehistory-example-merge": "將<kbd>Oldpage</kbd>的整個歷史合併至<kbd>Newpage</kbd>。",
+       "apihelp-mergehistory-example-merge-timestamp": "將<kbd>Oldpage</kbd>直至<kbd>2015-12-31T04:37:41Z</kbd>的頁面修訂版本合併至<kbd>Newpage</kbd>。",
        "apihelp-move-description": "移動頁面。",
        "apihelp-move-param-from": "重新命名本頁面的標題。不能與 <var>$1fromid</var> 一起出現。",
        "apihelp-move-param-fromid": "重新命名本頁面的 ID 。不能與 <var>$1fromid</var> 一起出現。",
        "apihelp-move-param-to": "將本頁面的標題重新命名為",
        "apihelp-move-param-reason": "重新命名的原因。",
+       "apihelp-move-param-movetalk": "如果討論頁存在,變更討論頁名稱。",
        "apihelp-move-param-movesubpages": "如果適用,則重新命名子頁面。",
        "apihelp-move-param-noredirect": "不要建立重新導向。",
+       "apihelp-move-param-watch": "將頁面和重定向加入目前使用者的監視清單。",
+       "apihelp-move-param-unwatch": "從目前使用者的監視清單中移除頁面和重定向。",
+       "apihelp-move-param-watchlist": "在目前使用者的監視清單中無條件地加入或移除頁面,或使用設定,或不變更監視清單。",
        "apihelp-move-param-ignorewarnings": "忽略所有警告。",
+       "apihelp-move-example-move": "將<kbd>Badtitle</kbd>移動至<kbd>Goodtitle</kbd>,不留下重定向。",
        "apihelp-opensearch-description": "使用 OpenSearch 協定搜尋本 wiki。",
        "apihelp-opensearch-param-search": "搜尋字串。",
        "apihelp-opensearch-param-limit": "回傳的結果數量上限。",
        "apihelp-opensearch-param-namespace": "搜尋的命名空間。",
+       "apihelp-opensearch-param-suggest": "若<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>設定為false,則不做任何事。",
+       "apihelp-opensearch-param-redirects": "如何處理重定向:\n;return:傳回重定向本身。\n;resolve:傳回目標頁面,傳回的結果數目可能少於$1limit。\n由於歷史原因,$1format=json的預設值為「return」,其他格式則為「resolve」。",
        "apihelp-opensearch-param-format": "輸出的格式。",
        "apihelp-options-param-reset": "重設偏好設定為網站預設值。",
        "apihelp-options-example-reset": "重設所有偏好設定",
index d88a5b2..e9a6edc 100644 (file)
@@ -24,6 +24,7 @@
 namespace MediaWiki\Auth;
 
 use Config;
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Status;
@@ -146,7 +147,7 @@ class AuthManager implements LoggerAwareInterface {
                if ( self::$instance === null ) {
                        self::$instance = new self(
                                \RequestContext::getMain()->getRequest(),
-                               \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                               MediaWikiServices::getInstance()->getMainConfig()
                        );
                }
                return self::$instance;
index ff4569b..7fc362a 100644 (file)
@@ -108,6 +108,10 @@ abstract class AuthenticationRequest {
         *  - optional: (bool) If set and truthy, the field may be left empty
         *  - sensitive: (bool) If set and truthy, the field is considered sensitive. Code using the
         *      request should avoid exposing the value of the field.
+        *  - skippable: (bool) If set and truthy, the client is free to hide this
+        *      field from the user to streamline the workflow. If all fields are
+        *      skippable (except possibly a single button), no user interaction is
+        *      required at all.
         *
         * All AuthenticationRequests are populated from the same data, so most of the time you'll
         * want to prefix fields names with something unique to the extension/provider (although
index 859fd0c..fd36887 100644 (file)
@@ -242,14 +242,14 @@ class LocalPasswordPrimaryAuthenticationProvider
 
                $pwhash = null;
 
-               if ( $this->loginOnly ) {
-                       $pwhash = $this->getPasswordFactory()->newFromCiphertext( null );
-                       $expiry = null;
-                       // @codeCoverageIgnoreStart
-               } elseif ( get_class( $req ) === PasswordAuthenticationRequest::class ) {
-                       // @codeCoverageIgnoreEnd
-                       $pwhash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
-                       $expiry = $this->getNewPasswordExpiry( $username );
+               if ( get_class( $req ) === PasswordAuthenticationRequest::class ) {
+                       if ( $this->loginOnly ) {
+                               $pwhash = $this->getPasswordFactory()->newFromCiphertext( null );
+                               $expiry = null;
+                       } else {
+                               $pwhash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
+                               $expiry = $this->getNewPasswordExpiry( $username );
+                       }
                }
 
                if ( $pwhash ) {
index d487e31..06060b1 100644 (file)
@@ -58,6 +58,7 @@ class RememberMeAuthenticationRequest extends AuthenticationRequest {
                                'label' => wfMessage( 'userlogin-remembermypassword' )->numParams( $expirationDays ),
                                'help' => wfMessage( 'authmanager-userlogin-remembermypassword-help' ),
                                'optional' => true,
+                               'skippable' => true,
                        ]
                ];
        }
index 42f0e70..bc7c779 100644 (file)
@@ -21,6 +21,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This represents the intention to set a temporary password for the user.
  * @ingroup Auth
@@ -33,12 +35,6 @@ class TemporaryPasswordAuthenticationRequest extends AuthenticationRequest {
        /** @var bool Email password to the user. */
        public $mailpassword = false;
 
-       /**
-        * @var bool Do not fail certain operations if the password cannot be mailed, there is a
-        *   backchannel present.
-        */
-       public $hasBackchannel = false;
-
        /** @var string Username or IP address of the caller */
        public $caller;
 
@@ -67,7 +63,7 @@ class TemporaryPasswordAuthenticationRequest extends AuthenticationRequest {
         * @return TemporaryPasswordAuthenticationRequest
         */
        public static function newRandom() {
-               $config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $config = MediaWikiServices::getInstance()->getMainConfig();
 
                // get the min password length
                $minLength = $config->get( 'MinimalPasswordLength' );
index 2e6f93c..44c2824 100644 (file)
@@ -246,7 +246,7 @@ class TemporaryPasswordPrimaryAuthenticationProvider
                        $sv->merge( $this->checkPasswordValidity( $username, $req->password ) );
 
                        if ( $req->mailpassword ) {
-                               if ( !$this->emailEnabled && !$req->hasBackchannel ) {
+                               if ( !$this->emailEnabled ) {
                                        return \StatusValue::newFatal( 'passwordreset-emaildisabled' );
                                }
 
@@ -336,7 +336,7 @@ class TemporaryPasswordPrimaryAuthenticationProvider
 
                $ret = \StatusValue::newGood();
                if ( $req ) {
-                       if ( $req->mailpassword && !$req->hasBackchannel ) {
+                       if ( $req->mailpassword ) {
                                if ( !$this->emailEnabled ) {
                                        $ret->merge( \StatusValue::newFatal( 'emaildisabled' ) );
                                } elseif ( !$user->getEmail() ) {
index 3f6a47d..ae0bc6b 100644 (file)
@@ -167,7 +167,9 @@ class ThrottlePreAuthenticationProvider extends AbstractPreAuthenticationProvide
 
                $data = $this->manager->getAuthenticationSessionData( 'LoginThrottle' );
                if ( !$data ) {
-                       $this->logger->error( 'throttler data not found for {user}', [ 'user' => $user->getName() ] );
+                       // this can occur when login is happening via AuthenticationRequest::$loginRequest
+                       // so testForAuthentication is skipped
+                       $this->logger->info( 'throttler data not found for {user}', [ 'user' => $user->getName() ] );
                        return;
                }
 
index 000b070..6d3b2f4 100644 (file)
@@ -23,6 +23,7 @@ namespace MediaWiki\Auth;
 
 use BagOStuff;
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
@@ -68,7 +69,7 @@ class Throttler implements LoggerAwareInterface {
                }
 
                if ( $conditions === null ) {
-                       $config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                        $conditions = $config->get( 'PasswordAttemptThrottle' );
                        $params += [
                                'type' => 'password',
index ee77d7b..35d6652 100644 (file)
@@ -21,6 +21,7 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
 use StatusValue;
 use User;
 
@@ -38,7 +39,7 @@ class UserDataAuthenticationRequest extends AuthenticationRequest {
        public $realname;
 
        public function getFieldInfo() {
-               $config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $config = MediaWikiServices::getInstance()->getMainConfig();
                $ret = [
                        'email' => [
                                'type' => 'string',
index fb461b7..8c70be2 100644 (file)
@@ -82,6 +82,8 @@ interface ICacheHelper {
        function setExpiry( $cacheExpiry );
 }
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Helper class for caching various elements in a single cache entry.
  *
@@ -217,9 +219,9 @@ class CacheHelper implements ICacheHelper {
                        $subPage = explode( '/', $subPage, 2 );
                        $subPage = count( $subPage ) > 1 ? $subPage[1] : false;
 
-                       $message .= ' ' . Linker::link(
+                       $message .= ' ' . MediaWikiServices::getInstance()->getLinkRenderer()->makeLink(
                                $context->getTitle( $subPage ),
-                               $context->msg( 'cachedspecial-refresh-now' )->escaped(),
+                               $context->msg( 'cachedspecial-refresh-now' )->text(),
                                [],
                                $refreshArgs
                        );
index e25f882..6d5f8c3 100644 (file)
@@ -154,7 +154,7 @@ abstract class FileCacheBase {
        /**
         * Save and compress text to the cache
         * @param string $text
-        * @return string Compressed text
+        * @return string|false Compressed text
         */
        public function saveText( $text ) {
                if ( $this->useGzip() ) {
index ae8efa9..b0a3a1c 100644 (file)
@@ -35,19 +35,6 @@ class HTMLFileCache extends FileCacheBase {
        const MODE_OUTAGE = 1; // fallback cache for DB outages
        const MODE_REBUILD = 2; // background cache rebuild mode
 
-       /**
-        * Construct an HTMLFileCache object from a Title and an action
-        *
-        * @deprecated since 1.24, instantiate this class directly
-        * @param Title|string $title Title object or prefixed DB key string
-        * @param string $action
-        * @throws MWException
-        * @return HTMLFileCache
-        */
-       public static function newFromTitle( $title, $action ) {
-               return new self( $title, $action );
-       }
-
        /**
         * @param Title|string $title Title object or prefixed DB key string
         * @param string $action
index 23cc26d..b720dec 100644 (file)
@@ -278,6 +278,20 @@ class LinkCache {
                return $id;
        }
 
+       /**
+        * @param WANObjectCache $cache
+        * @param TitleValue $t
+        * @return string[]
+        * @since 1.28
+        */
+       public function getMutableCacheKeys( WANObjectCache $cache, TitleValue $t ) {
+               if ( $this->isCacheable( $t ) ) {
+                       return [ $cache->makeKey( 'page', $t->getNamespace(), sha1( $t->getDBkey() ) ) ];
+               }
+
+               return [];
+       }
+
        private function isCacheable( LinkTarget $title ) {
                return ( $title->inNamespace( NS_TEMPLATE ) || $title->inNamespace( NS_FILE ) );
        }
index 1bcab41..4facc20 100644 (file)
@@ -89,10 +89,12 @@ class MessageCache {
         */
        protected $mInParser = false;
 
-       /** @var BagOStuff */
-       protected $mMemc;
        /** @var WANObjectCache */
        protected $wanCache;
+       /** @var BagOStuff */
+       protected $clusterCache;
+       /** @var BagOStuff */
+       protected $srvCache;
 
        /**
         * Singleton instance
@@ -109,9 +111,13 @@ class MessageCache {
         */
        public static function singleton() {
                if ( self::$instance === null ) {
-                       global $wgUseDatabaseMessages, $wgMsgCacheExpiry;
+                       global $wgUseDatabaseMessages, $wgMsgCacheExpiry, $wgUseLocalMessageCache;
                        self::$instance = new self(
+                               MediaWikiServices::getInstance()->getMainWANObjectCache(),
                                wfGetMessageCacheStorage(),
+                               $wgUseLocalMessageCache
+                                       ? MediaWikiServices::getInstance()->getLocalServerObjectCache()
+                                       : new EmptyBagOStuff(),
                                $wgUseDatabaseMessages,
                                $wgMsgCacheExpiry
                        );
@@ -149,28 +155,25 @@ class MessageCache {
        }
 
        /**
-        * @param BagOStuff $memCached A cache instance. If none, fall back to CACHE_NONE.
-        * @param bool $useDB
+        * @param WANObjectCache $wanCache WAN cache instance
+        * @param BagOStuff $clusterCache Cluster cache instance
+        * @param BagOStuff $srvCache Server cache instance
+        * @param bool $useDB Whether to look for message overrides (e.g. MediaWiki: pages)
         * @param int $expiry Lifetime for cache. @see $mExpiry.
         */
-       function __construct( $memCached, $useDB, $expiry ) {
-               global $wgUseLocalMessageCache;
-
-               if ( !$memCached ) {
-                       $memCached = wfGetCache( CACHE_NONE );
-               }
+       public function __construct(
+               WANObjectCache $wanCache,
+               BagOStuff $clusterCache,
+               BagOStuff $srvCache,
+               $useDB,
+               $expiry
+       ) {
+               $this->wanCache = $wanCache;
+               $this->clusterCache = $clusterCache;
+               $this->srvCache = $srvCache;
 
-               $this->mMemc = $memCached;
                $this->mDisable = !$useDB;
                $this->mExpiry = $expiry;
-
-               if ( $wgUseLocalMessageCache ) {
-                       $this->localCache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
-               } else {
-                       $this->localCache = new EmptyBagOStuff();
-               }
-
-               $this->wanCache = ObjectCache::getMainWANInstance();
        }
 
        /**
@@ -207,7 +210,7 @@ class MessageCache {
        protected function getLocalCache( $code ) {
                $cacheKey = wfMemcKey( __CLASS__, $code );
 
-               return $this->localCache->get( $cacheKey );
+               return $this->srvCache->get( $cacheKey );
        }
 
        /**
@@ -218,7 +221,7 @@ class MessageCache {
         */
        protected function saveToLocalCache( $code, $cache ) {
                $cacheKey = wfMemcKey( __CLASS__, $code );
-               $this->localCache->set( $cacheKey, $cache );
+               $this->srvCache->set( $cacheKey, $cache );
        }
 
        /**
@@ -304,7 +307,7 @@ class MessageCache {
                                        # below, and use the local stale value if it was not acquired.
                                        $where[] = 'global cache is presumed expired';
                                } else {
-                                       $cache = $this->mMemc->get( $cacheKey );
+                                       $cache = $this->clusterCache->get( $cacheKey );
                                        if ( !$cache ) {
                                                $where[] = 'global cache is empty';
                                        } elseif ( $this->isCacheExpired( $cache ) ) {
@@ -385,12 +388,10 @@ class MessageCache {
         * @return bool|string True on success or one of ("cantacquire", "disabled")
         */
        protected function loadFromDBWithLock( $code, array &$where, $mode = null ) {
-               global $wgUseLocalMessageCache;
-
                # 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' );
-               $status = $this->mMemc->get( $statusKey );
+               $status = $this->clusterCache->get( $statusKey );
                if ( $status === 'error' ) {
                        $where[] = "could not load; method is still globally disabled";
                        return 'disabled';
@@ -428,8 +429,8 @@ class MessageCache {
                         * incurring a loadFromDB() overhead on every request, and thus saves the
                         * wiki from complete downtime under moderate traffic conditions.
                         */
-                       if ( !$wgUseLocalMessageCache ) {
-                               $this->mMemc->set( $statusKey, 'error', 60 * 5 );
+                       if ( $this->srvCache instanceof EmptyBagOStuff ) {
+                               $this->clusterCache->set( $statusKey, 'error', 60 * 5 );
                                $where[] = 'could not save cache, disabled globally for 5 minutes';
                        } else {
                                $where[] = "could not save global cache";
@@ -448,7 +449,7 @@ class MessageCache {
         * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache
         * @return array Loaded messages for storing in caches
         */
-       function loadFromDB( $code, $mode = null ) {
+       protected function loadFromDB( $code, $mode = null ) {
                global $wgMaxMsgCacheEntrySize, $wgLanguageCode, $wgAdaptiveMessageCache;
 
                $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_REPLICA );
@@ -517,11 +518,12 @@ class MessageCache {
                        if ( $text === false ) {
                                // Failed to fetch data; possible ES errors?
                                // Store a marker to fetch on-demand as a workaround...
+                               // TODO Use a differnt marker
                                $entry = '!TOO BIG';
                                wfDebugLog(
                                        'MessageCache',
                                        __METHOD__
-                                               . ": failed to load message page text for {$row->page_title} ($code)"
+                                       . ": failed to load message page text for {$row->page_title} ($code)"
                                );
                        } else {
                                $entry = ' ' . $text;
@@ -531,6 +533,10 @@ class MessageCache {
 
                $cache['VERSION'] = MSG_CACHE_VERSION;
                ksort( $cache );
+
+               # Hash for validating local cache (APC). No need to take into account
+               # messages larger than $wgMaxMsgCacheEntrySize, since those are only
+               # stored and fetched from memcache.
                $cache['HASH'] = md5( serialize( $cache ) );
                $cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
 
@@ -540,11 +546,11 @@ class MessageCache {
        /**
         * Updates cache as necessary when message page is changed
         *
-        * @param string|bool $title Name of the page changed (false if deleted)
+        * @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 ) {
-               global $wgMaxMsgCacheEntrySize, $wgContLang, $wgLanguageCode;
+               global $wgLanguageCode;
 
                if ( $this->mDisable ) {
                        return;
@@ -556,62 +562,76 @@ class MessageCache {
                        return;
                }
 
-               // Note that if the cache is volatile, load() may trigger a DB fetch.
-               // In that case we reenter/reuse the existing cache key lock to avoid
-               // a self-deadlock. This is safe as no reads happen *directly* in this
-               // method between getReentrantScopedLock() and load() below. There is
-               // no risk of data "changing under our feet" for replace().
-               $scopedLock = $this->getReentrantScopedLock( wfMemcKey( 'messages', $code ) );
-               // Load the messages from the master DB to avoid race conditions
-               $this->load( $code, self::FOR_UPDATE );
-
-               // Load the new value into the process cache...
+               // (a) Update the process cache with the new message text
                if ( $text === false ) {
+                       // Page deleted
                        $this->mCache[$code][$title] = '!NONEXISTENT';
-               } elseif ( strlen( $text ) > $wgMaxMsgCacheEntrySize ) {
-                       $this->mCache[$code][$title] = '!TOO BIG';
-                       // Pre-fill the individual key cache with the known latest message text
-                       $key = $this->wanCache->makeKey( 'messages-big', $this->mCache[$code]['HASH'], $title );
-                       $this->wanCache->set( $key, " $text", $this->mExpiry );
                } else {
+                       // Ignore $wgMaxMsgCacheEntrySize so the process cache is up to date
                        $this->mCache[$code][$title] = ' ' . $text;
                }
-               // Mark this cache as definitely being "latest" (non-volatile) so
-               // load() calls do not try to refresh the cache with replica DB data
-               $this->mCache[$code]['LATEST'] = time();
 
-               // Update caches if the lock was acquired
-               if ( $scopedLock ) {
-                       $this->saveToCaches( $this->mCache[$code], 'all', $code );
-               } else {
-                       LoggerFactory::getInstance( 'MessageCache' )->error(
-                               __METHOD__ . ': could not acquire lock to update {title} ({code})',
-                               [ 'title' => $title, 'code' => $code ] );
-               }
-
-               ScopedCallback::consume( $scopedLock );
-               // Relay the purge to APC and other DCs
-               $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) );
-
-               // Also delete cached sidebar... just in case it is affected
-               $codes = [ $code ];
-               if ( $code === 'en' ) {
-                       // Delete all sidebars, like for example on action=purge on the
-                       // sidebar messages
-                       $codes = array_keys( Language::fetchLanguageNames() );
-               }
-
-               foreach ( $codes as $code ) {
-                       $sidebarKey = wfMemcKey( 'sidebar', $code );
-                       $this->wanCache->delete( $sidebarKey );
-               }
+               // (b) Update the shared caches in a deferred update with a fresh DB snapshot
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( $title, $msg, $code ) {
+                               global $wgContLang, $wgMaxMsgCacheEntrySize;
+                               // Allow one caller at a time to avoid race conditions
+                               $scopedLock = $this->getReentrantScopedLock( wfMemcKey( 'messages', $code ) );
+                               if ( !$scopedLock ) {
+                                       LoggerFactory::getInstance( 'MessageCache' )->error(
+                                               __METHOD__ . ': could not acquire lock to update {title} ({code})',
+                                               [ 'title' => $title, 'code' => $code ] );
+                                       return;
+                               }
+                               // Load the messages from the master DB to avoid race conditions
+                               $cache = $this->loadFromDB( $code, self::FOR_UPDATE );
+                               $this->mCache[$code] = $cache;
+                               // Load the process cache values and set the per-title cache keys
+                               $page = WikiPage::factory( Title::makeTitle( NS_MEDIAWIKI, $title ) );
+                               $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 ) {
+                                       $this->wanCache->set( $titleKey, ' ' . $text, $this->mExpiry );
+                               }
+                               // Mark this cache as definitely being "latest" (non-volatile) so
+                               // load() calls do try to refresh the cache with replica DB data
+                               $this->mCache[$code]['LATEST'] = time();
+                               // Pre-emptively update the local datacenter cache so things like edit filter and
+                               // blacklist changes are reflect immediately, as these often use MediaWiki: pages.
+                               // The datacenter handling replace() calls should be the same one handling edits
+                               // as they require HTTP POST.
+                               $this->saveToCaches( $this->mCache[$code], 'all', $code );
+                               // Release the lock now that the cache is saved
+                               ScopedCallback::consume( $scopedLock );
+
+                               // 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 ) );
+                               // Also delete cached sidebar... just in case it is affected
+                               // @TODO: shouldn't this be $code === $wgLanguageCode?
+                               if ( $code === 'en' ) {
+                                       // Purge all language sidebars, e.g. on ?action=purge to the sidebar messages
+                                       $codes = array_keys( Language::fetchLanguageNames() );
+                               } else {
+                                       // Purge only the sidebar for this language
+                                       $codes = [ $code ];
+                               }
+                               foreach ( $codes as $code ) {
+                                       $this->wanCache->delete( wfMemcKey( 'sidebar', $code ) );
+                               }
 
-               // Update the message in the message blob store
-               $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader();
-               $blobStore = $resourceloader->getMessageBlobStore();
-               $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) );
+                               // Purge the message in the message blob store
+                               $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader();
+                               $blobStore = $resourceloader->getMessageBlobStore();
+                               $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) );
 
-               Hooks::run( 'MessageCacheReplace', [ $title, $text ] );
+                               Hooks::run( 'MessageCacheReplace', [ $title, $text ] );
+                       },
+                       DeferredUpdates::PRESEND
+               );
        }
 
        /**
@@ -646,7 +666,7 @@ class MessageCache {
        protected function saveToCaches( array $cache, $dest, $code = false ) {
                if ( $dest === 'all' ) {
                        $cacheKey = wfMemcKey( 'messages', $code );
-                       $success = $this->mMemc->set( $cacheKey, $cache );
+                       $success = $this->clusterCache->set( $cacheKey, $cache );
                        $this->setValidationHash( $code, $cache );
                } else {
                        $success = true;
@@ -718,7 +738,7 @@ class MessageCache {
         * @return null|ScopedCallback
         */
        protected function getReentrantScopedLock( $key, $timeout = self::WAIT_SEC ) {
-               return $this->mMemc->getScopedLock( $key, $timeout, self::LOCK_TTL, __METHOD__ );
+               return $this->clusterCache->getScopedLock( $key, $timeout, self::LOCK_TTL, __METHOD__ );
        }
 
        /**
@@ -843,7 +863,7 @@ class MessageCache {
 
                $alreadyTried = [];
 
-                // First try the requested language.
+               // First try the requested language.
                $message = $this->getMessageForLang( $lang, $lckey, $useDB, $alreadyTried );
                if ( $message !== false ) {
                        return $message;
@@ -948,6 +968,7 @@ class MessageCache {
         */
        public function getMsgFromNamespace( $title, $code ) {
                $this->load( $code );
+
                if ( isset( $this->mCache[$code][$title] ) ) {
                        $entry = $this->mCache[$code][$title];
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
@@ -961,7 +982,7 @@ class MessageCache {
                } else {
                        // XXX: This is not cached in process cache, should it?
                        $message = false;
-                       Hooks::run( 'MessagesPreLoad', [ $title, &$message ] );
+                       Hooks::run( 'MessagesPreLoad', [ $title, &$message, $code ] );
                        if ( $message !== false ) {
                                return $message;
                        }
index 4b6362f..90b3de1 100644 (file)
@@ -313,7 +313,7 @@ class LocalisationCache {
         * array.
         * @param string $code
         * @param string $key
-        * @return bool|null|string
+        * @return bool|null|string|string[]
         */
        public function getSubitemList( $code, $key ) {
                if ( in_array( $key, self::$splitKeys ) ) {
index 515ab05..5d19961 100644 (file)
@@ -129,7 +129,7 @@ class CategoryMembershipChange {
                        $this->getUser(),
                        $this->getChangeMessageText(
                                $type,
-                               [ 'prefixedText' => $this->pageTitle->getPrefixedText() ],
+                               $this->pageTitle->getPrefixedText(),
                                $this->numTemplateLinks
                        ),
                        $this->pageTitle,
@@ -245,13 +245,12 @@ class CategoryMembershipChange {
         *
         * @param int $type may be CategoryMembershipChange::CATEGORY_ADDITION
         * or CategoryMembershipChange::CATEGORY_REMOVAL
-        * @param array $params
-        * - prefixedText: result of Title::->getPrefixedText()
+        * @param string $prefixedText result of Title::->getPrefixedText()
         * @param int $numTemplateLinks
         *
         * @return string
         */
-       private function getChangeMessageText( $type, array $params, $numTemplateLinks ) {
+       private function getChangeMessageText( $type, $prefixedText, $numTemplateLinks ) {
                $array = [
                        self::CATEGORY_ADDITION => 'recentchanges-page-added-to-category',
                        self::CATEGORY_REMOVAL => 'recentchanges-page-removed-from-category',
@@ -263,7 +262,7 @@ class CategoryMembershipChange {
                        $msgKey .= '-bundled';
                }
 
-               return wfMessage( $msgKey, $params )->inContentLanguage()->text();
+               return wfMessage( $msgKey, $prefixedText )->inContentLanguage()->text();
        }
 
        /**
index 77038ed..bc7d721 100644 (file)
@@ -158,19 +158,43 @@ class ChangesList extends ContextSource {
        protected function getHTMLClasses( $rc, $watched ) {
                $classes = [];
                $logType = $rc->mAttribs['rc_log_type'];
+               $prefix = 'mw-changeslist-';
 
                if ( $logType ) {
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' . $logType );
+                       $classes[] = Sanitizer::escapeClass( $prefix . 'log-' . $logType );
                } else {
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
+                       $classes[] = Sanitizer::escapeClass( $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
-                       ? 'mw-changeslist-line-watched'
-                       : 'mw-changeslist-line-not-watched';
+                       ? $prefix . 'line-watched'
+                       : $prefix . 'line-not-watched';
+
+               $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rc ) );
+
+               return $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();
+               }
 
                return $classes;
        }
@@ -379,7 +403,7 @@ class ChangesList extends ContextSource {
                        $diffLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
                                new HtmlArmor( $this->message['diff'] ),
-                               [],
+                               [ 'class' => 'mw-changeslist-diff' ],
                                $query
                        );
                }
@@ -391,7 +415,7 @@ class ChangesList extends ContextSource {
                        $diffhist .= $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
                                new HtmlArmor( $this->message['hist'] ),
-                               [],
+                               [ 'class' => 'mw-changeslist-history' ],
                                [
                                        'curid' => $rc->mAttribs['rc_cur_id'],
                                        'action' => 'history'
@@ -444,8 +468,10 @@ class ChangesList extends ContextSource {
 
                # TODO: Deprecate the $s argument, it seems happily unused.
                $s = '';
+               # Avoid PHP 7.1 warning from passing $this by reference
+               $changesList = $this;
                Hooks::run( 'ChangesListInsertArticleLink',
-                       [ &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ] );
+                       [ &$changesList, &$articlelink, &$s, &$rc, $unpatrolled, $watched ] );
 
                return "{$s} {$articlelink}";
        }
index d3a414b..3c76f32 100644 (file)
@@ -177,6 +177,7 @@ 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';
                }
@@ -358,16 +359,17 @@ class EnhancedChangesList extends ChangesList {
        protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = [] ) {
                $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
 
-               $classes = [ 'mw-enhanced-rc' ];
                $type = $rcObj->mAttribs['rc_type'];
                $data = [];
                $lineParams = [];
 
+               $classes = [ 'mw-enhanced-rc' ];
                if ( $rcObj->watched
                        && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
                ) {
-                       $classes = [ 'mw-enhanced-watched' ];
+                       $classes[] = [ 'mw-enhanced-watched' ];
                }
+               $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rcObj ) );
 
                $separator = ' <span class="mw-changeslist-separator">. .</span> ';
 
index 8eb06ce..d862ef4 100644 (file)
@@ -50,7 +50,9 @@ class OldChangesList extends ChangesList {
                                $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
                }
 
-               if ( !Hooks::run( 'OldChangesListRecentChangesLine', [ &$this, &$html, $rc, &$classes ] ) ) {
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $list = $this;
+               if ( !Hooks::run( 'OldChangesListRecentChangesLine', [ &$list, &$html, $rc, &$classes ] ) ) {
                        return false;
                }
 
index 1262f2c..dcab158 100644 (file)
@@ -329,7 +329,9 @@ class RecentChange {
                $this->mAttribs['rc_id'] = $dbw->insertId();
 
                # Notify extensions
-               Hooks::run( 'RecentChange_save', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $rc = $this;
+               Hooks::run( 'RecentChange_save', [ &$rc ] );
 
                if ( count( $this->tags ) ) {
                        ChangeTags::addTags( $this->tags, $this->mAttribs['rc_id'],
@@ -389,8 +391,8 @@ class RecentChange {
 
                $performer = $this->getPerformer();
 
-               foreach ( $feeds as $feed ) {
-                       $feed += [
+               foreach ( $feeds as $params ) {
+                       $params += [
                                'omit_bots' => false,
                                'omit_anon' => false,
                                'omit_user' => false,
@@ -399,59 +401,48 @@ class RecentChange {
                        ];
 
                        if (
-                               ( $feed['omit_bots'] && $this->mAttribs['rc_bot'] ) ||
-                               ( $feed['omit_anon'] && $performer->isAnon() ) ||
-                               ( $feed['omit_user'] && !$performer->isAnon() ) ||
-                               ( $feed['omit_minor'] && $this->mAttribs['rc_minor'] ) ||
-                               ( $feed['omit_patrolled'] && $this->mAttribs['rc_patrolled'] ) ||
+                               ( $params['omit_bots'] && $this->mAttribs['rc_bot'] ) ||
+                               ( $params['omit_anon'] && $performer->isAnon() ) ||
+                               ( $params['omit_user'] && !$performer->isAnon() ) ||
+                               ( $params['omit_minor'] && $this->mAttribs['rc_minor'] ) ||
+                               ( $params['omit_patrolled'] && $this->mAttribs['rc_patrolled'] ) ||
                                $this->mAttribs['rc_type'] == RC_EXTERNAL
                        ) {
                                continue;
                        }
 
-                       $engine = self::getEngine( $feed['uri'] );
-
                        if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
                                $actionComment = $this->mExtra['actionCommentIRC'];
                        } else {
                                $actionComment = null;
                        }
 
-                       /** @var $formatter RCFeedFormatter */
-                       $formatter = is_object( $feed['formatter'] ) ? $feed['formatter'] : new $feed['formatter']();
-                       $line = $formatter->getLine( $feed, $this, $actionComment );
-                       if ( !$line ) {
-                               // T109544
-                               // If a feed formatter returns null, this will otherwise cause an
-                               // error in at least RedisPubSubFeedEngine.
-                               // Not sure where/how this should best be handled.
-                               continue;
-                       }
-
-                       $engine->send( $feed, $line );
+                       $feed = RCFeed::factory( $params );
+                       $feed->notify( $this, $actionComment );
                }
        }
 
        /**
-        * Gets the stream engine object for a given URI from $wgRCEngines
-        *
+        * @since 1.22
+        * @deprecated since 1.29 Use RCFeed::factory() instead
         * @param string $uri URI to get the engine object for
-        * @throws MWException
         * @return RCFeedEngine The engine object
+        * @throws MWException
         */
-       public static function getEngine( $uri ) {
+       public static function getEngine( $uri, $params = [] ) {
+               // TODO: Merge into RCFeed::factory().
                global $wgRCEngines;
-
                $scheme = parse_url( $uri, PHP_URL_SCHEME );
                if ( !$scheme ) {
-                       throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" );
+                       throw new MWException( "Invalid RCFeed uri: '$uri'" );
                }
-
                if ( !isset( $wgRCEngines[$scheme] ) ) {
-                       throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" );
+                       throw new MWException( "Unknown RCFeedEngine scheme: '$scheme'" );
                }
-
-               return new $wgRCEngines[$scheme];
+               if ( defined( 'MW_PHPUNIT_TEST' ) && is_object( $wgRCEngines[$scheme] ) ) {
+                       return $wgRCEngines[$scheme];
+               }
+               return new $wgRCEngines[$scheme]( $params );
        }
 
        /**
@@ -762,6 +753,7 @@ class RecentChange {
                # # Get pageStatus for email notification
                switch ( $type . '-' . $action ) {
                        case 'delete-delete':
+                       case 'delete-delete_redir':
                                $pageStatus = 'deleted';
                                break;
                        case 'move-move':
index e3035be..d2239eb 100644 (file)
@@ -668,12 +668,20 @@ class ChangeTags {
         * @param string $selected Tag to select by default
         * @param bool $ooui Use an OOUI TextInputWidget as selector instead of a non-OOUI input field
         *        You need to call OutputPage::enableOOUI() yourself.
+        * @param IContextSource|null $context
+        * @note Even though it takes null as a valid argument, an IContextSource is preferred
+        *       in a new code, as the null value can change in the future
         * @return array an array of (label, selector)
         */
-       public static function buildTagFilterSelector( $selected = '', $ooui = false ) {
-               global $wgUseTagFilter;
+       public static function buildTagFilterSelector(
+               $selected = '', $ooui = false, IContextSource $context = null
+       ) {
+               if ( !$context ) {
+                       $context = RequestContext::getMain();
+               }
 
-               if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) ) {
+               $config = $context->getConfig();
+               if ( !$config->get( 'UseTagFilter' ) || !count( self::listDefinedTags() ) ) {
                        return [];
                }
 
@@ -681,7 +689,7 @@ class ChangeTags {
                        Html::rawElement(
                                'label',
                                [ 'for' => 'tagfilter' ],
-                               wfMessage( 'tag-filter' )->parse()
+                               $context->msg( 'tag-filter' )->parse()
                        )
                ];
 
@@ -749,11 +757,13 @@ class ChangeTags {
         * @param User $user Who to attribute the action to
         * @param int $tagCount For deletion only, how many usages the tag had before
         * it was deleted.
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return int ID of the inserted log entry
         * @since 1.25
         */
        protected static function logTagManagementAction( $action, $tag, $reason,
-               User $user, $tagCount = null ) {
+               User $user, $tagCount = null, array $logEntryTags = [] ) {
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -770,6 +780,7 @@ class ChangeTags {
                }
                $logEntry->setParameters( $params );
                $logEntry->setRelations( [ 'Tag' => $tag ] );
+               $logEntry->setTags( $logEntryTags );
 
                $logId = $logEntry->insert( $dbw );
                $logEntry->publish( $logId );
@@ -822,12 +833,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function activateTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canActivateTag( $tag, $user );
@@ -840,7 +853,9 @@ class ChangeTags {
                self::defineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'activate', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'activate', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -881,12 +896,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function deactivateTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canDeactivateTag( $tag, $user );
@@ -899,7 +916,9 @@ class ChangeTags {
                self::undefineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'deactivate', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'deactivate', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -960,12 +979,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function createTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canCreateTag( $tag, $user );
@@ -978,7 +999,9 @@ class ChangeTags {
                self::defineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'create', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'create', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -1087,12 +1110,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function deleteTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canDeleteTag( $tag, $user );
@@ -1112,7 +1137,9 @@ class ChangeTags {
                }
 
                // log it
-               $logId = self::logTagManagementAction( 'delete', $tag, $reason, $user, $hitcount );
+               $logId = self::logTagManagementAction( 'delete', $tag, $reason, $user,
+                       $hitcount, $logEntryTags );
+
                $deleteResult->value = $logId;
                return $deleteResult;
        }
index 2dc953c..b78efaf 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Change tagging
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Item class for a logging table row with its associated change tags.
  * @todo Abstract out a base class for this and RevDelLogItem, similar to the
@@ -70,9 +72,9 @@ class ChangeTagsLogItem extends RevisionItemBase {
                $formatter->setAudience( LogFormatter::FOR_THIS_USER );
 
                // Log link for this page
-               $loglink = Linker::link(
+               $loglink = MediaWikiServices::getInstance()->getLinkRenderer()->makeLink(
                        SpecialPage::getTitleFor( 'Log' ),
-                       $this->list->msg( 'log' )->escaped(),
+                       $this->list->msg( 'log' )->text(),
                        [],
                        [ 'page' => $title->getPrefixedText() ]
                );
index 9950a11..d67bc7e 100644 (file)
@@ -63,9 +63,11 @@ abstract class Collation {
                                return new CollationCkb;
                        case 'xx-uca-et':
                                return new CollationEt;
+                       case 'xx-uca-fa':
+                               return new CollationFa;
                        default:
                                $match = [];
-                               if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
+                               if ( preg_match( '/^uca-([A-Za-z@=-]+)$/', $collationName, $match ) ) {
                                        return new IcuCollation( $match[1] );
                                }
 
diff --git a/includes/collation/CollationFa.php b/includes/collation/CollationFa.php
new file mode 100644 (file)
index 0000000..9cce087
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Temporary workaround for incorrect collation of Persian language ('fa') in ICU 52 (bug T139110).
+ *
+ * All of the following will be considered separate letters for category headings in Persian:
+ *  - Characters 'و' 'ا' (often appear at the beginning of words)
+ *  - Characters 'ٲ' 'ٳ' (may appear at the beginning of words in loanwords)
+ *  - Characters 'ء' 'ئ' (don't appear at the beginning of words, but it's easier to implement)
+ *
+ * @since 1.29
+ */
+class CollationFa extends IcuCollation {
+       private $tertiaryCollator;
+
+       public function __construct() {
+               parent::__construct( 'fa' );
+               $this->tertiaryCollator = Collator::create( 'fa' );
+       }
+
+       public function getPrimarySortKey( $string ) {
+               $primary = parent::getPrimarySortKey( $string );
+               // We have to use a tertiary sortkey for everything with the primary sortkey of 2627.
+               // Otherwise, the "Remove duplicate prefixes" logic in IcuCollation would remove them.
+               // This matches sortkeys for the following characters: ء ئ ا و ٲ ٳ
+               if ( substr( $primary, 0, 2 ) === "\x26\x27" ) {
+                       wfDebug( "Using tertiary sortkey for '$string'\n" );
+                       return $this->tertiaryCollator->getSortKey( $string );
+               }
+               return $primary;
+       }
+}
index 7b4fce6..bc5a209 100644 (file)
@@ -330,6 +330,7 @@ class IcuCollation extends Collation {
                        $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                        $cacheKey = $cache->makeKey(
                                'first-letters',
+                               get_class( $this ),
                                $this->locale,
                                $this->digitTransformLanguage->getCode(),
                                self::getICUVersion(),
index 931128f..6a0a63b 100644 (file)
@@ -381,7 +381,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param string|number $sectionId Section identifier as a number or string
+        * @param string|int $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'). The ID "0" retrieves the section before the first heading, "1" the
         * text between the first heading (included) and the second heading (excluded), etc.
         *
@@ -396,7 +396,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * @param string|int|null|bool $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
         * or 'new' for a new section.
         * @param Content $with New content of the section
index 3389a00..58665bb 100644 (file)
@@ -27,41 +27,6 @@ use MediaWiki\Search\ParserOutputSearchDataExtractor;
  *
  * @author Daniel Kinzler
  */
-
-/**
- * Exception representing a failure to serialize or unserialize a content object.
- *
- * @ingroup Content
- */
-class MWContentSerializationException extends MWException {
-}
-
-/**
- * Exception thrown when an unregistered content model is requested. This error
- * can be triggered by user input, so a separate exception class is provided so
- * callers can substitute a context-specific, internationalised error message.
- *
- * @ingroup Content
- * @since 1.27
- */
-class MWUnknownContentModelException extends MWException {
-       /** @var string The name of the unknown content model */
-       private $modelId;
-
-       /** @param string $modelId */
-       function __construct( $modelId ) {
-               parent::__construct( "The content model '$modelId' is not registered on this wiki.\n" .
-                       'See https://www.mediawiki.org/wiki/Content_handlers to find out which extensions ' .
-                       'handle this content model.' );
-               $this->modelId = $modelId;
-       }
-
-       /** @return string */
-       public function getModelId() {
-               return $this->modelId;
-       }
-}
-
 /**
  * A content handler knows how do deal with a specific type of content on a wiki
  * page. Content is stored in the database in a serialized form (using a
@@ -233,9 +198,6 @@ abstract class ContentHandler {
                        $ext = $m[1];
                }
 
-               // Hook can force JS/CSS
-               Hooks::run( 'TitleIsCssOrJsPage', [ $title, &$isCodePage ], '1.21' );
-
                // Is this a user subpage containing code?
                $isCodeSubpage = NS_USER == $ns
                        && !$isCodePage
@@ -248,9 +210,6 @@ abstract class ContentHandler {
                $isWikitext = is_null( $model ) || $model == CONTENT_MODEL_WIKITEXT;
                $isWikitext = $isWikitext && !$isCodePage && !$isCodeSubpage;
 
-               // Hook can override $isWikitext
-               Hooks::run( 'TitleIsWikitextPage', [ $title, &$isWikitext ], '1.21' );
-
                if ( !$isWikitext ) {
                        switch ( $ext ) {
                                case 'js':
@@ -402,7 +361,9 @@ abstract class ContentHandler {
        public static function getContentModels() {
                global $wgContentHandlers;
 
-               return array_keys( $wgContentHandlers );
+               $models = array_keys( $wgContentHandlers );
+               Hooks::run( 'GetContentModels', [ &$models ] );
+               return $models;
        }
 
        public static function getAllContentFormats() {
@@ -1130,65 +1091,6 @@ abstract class ContentHandler {
                return $this->supportsDirectEditing();
        }
 
-       /**
-        * Call a legacy hook that uses text instead of Content objects.
-        * Will log a warning when a matching hook function is registered.
-        * If the textual representation of the content is changed by the
-        * hook function, a new Content object is constructed from the new
-        * text.
-        *
-        * @param string $event Event name
-        * @param array $args Parameters passed to hook functions
-        * @param string|null $deprecatedVersion Emit a deprecation notice
-        *   when the hook is run for the provided version
-        *
-        * @return bool True if no handler aborted the hook
-        */
-       public static function runLegacyHooks( $event, $args = [],
-               $deprecatedVersion = null
-       ) {
-
-               if ( !Hooks::isRegistered( $event ) ) {
-                       return true; // nothing to do here
-               }
-
-               // convert Content objects to text
-               $contentObjects = [];
-               $contentTexts = [];
-
-               foreach ( $args as $k => $v ) {
-                       if ( $v instanceof Content ) {
-                               /* @var Content $v */
-
-                               $contentObjects[$k] = $v;
-
-                               $v = $v->serialize();
-                               $contentTexts[$k] = $v;
-                               $args[$k] = $v;
-                       }
-               }
-
-               // call the hook functions
-               $ok = Hooks::run( $event, $args, $deprecatedVersion );
-
-               // see if the hook changed the text
-               foreach ( $contentTexts as $k => $orig ) {
-                       /* @var Content $content */
-
-                       $modified = $args[$k];
-                       $content = $contentObjects[$k];
-
-                       if ( $modified !== $orig ) {
-                               // text was changed, create updated Content object
-                               $content = $content->getContentHandler()->unserializeContent( $modified );
-                       }
-
-                       $args[$k] = $content;
-               }
-
-               return $ok;
-       }
-
        /**
         * Get fields definition for search index
         *
@@ -1204,7 +1106,6 @@ abstract class ContentHandler {
                        'category',
                        SearchIndexField::INDEX_TYPE_TEXT
                );
-
                $fields['category']->setFlag( SearchIndexField::FLAG_CASEFOLD );
 
                $fields['external_link'] = $engine->makeSearchFieldMapping(
@@ -1221,9 +1122,13 @@ abstract class ContentHandler {
                        'template',
                        SearchIndexField::INDEX_TYPE_KEYWORD
                );
-
                $fields['template']->setFlag( SearchIndexField::FLAG_CASEFOLD );
 
+               $fields['content_model'] = $engine->makeSearchFieldMapping(
+                       'content_model',
+                       SearchIndexField::INDEX_TYPE_KEYWORD
+               );
+
                return $fields;
        }
 
@@ -1270,6 +1175,7 @@ abstract class ContentHandler {
                        $fieldData['text'] = $text;
                        $fieldData['source_text'] = $text;
                        $fieldData['text_bytes'] = $content->getSize();
+                       $fieldData['content_model'] = $content->getModel();
                }
 
                Hooks::run( 'SearchDataForIndex', [ &$fieldData, $this, $page, $output, $engine ] );
index 9296728..d649baf 100644 (file)
@@ -38,7 +38,7 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string|number $sectionId
+        * @param string|int $sectionId
         *
         * @return Content|bool|null
         *
@@ -58,7 +58,7 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string|number|null|bool $sectionId
+        * @param string|int|null|bool $sectionId
         * @param Content $with
         * @param string $sectionTitle
         *
index ebedb7e..ecd274b 100644 (file)
@@ -99,7 +99,7 @@ class RequestContext implements IContextSource, MutableContext {
                if ( $this->config === null ) {
                        // @todo In the future, we could move this to WebStart.php so
                        // the Config object is ready for when initialization happens
-                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                return $this->config;
index 6a1bbd6..da660bd 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * Base class for objects that allow access to other wiki's databases using
  * the foreign database access mechanism implemented by LBFactoryMulti.
index f1ccd2a..2b394b6 100644 (file)
@@ -41,19 +41,19 @@ class CloneDatabase {
        /** @var bool Whether to use temporary tables or not */
        private $useTemporaryTables = true;
 
-       /** @var Database */
+       /** @var IMaintainableDatabase */
        private $db;
 
        /**
         * Constructor
         *
-        * @param Database $db A database subclass
+        * @param IMaintainableDatabase $db A database subclass
         * @param array $tablesToClone An array of tables to clone, unprefixed
         * @param string $newTablePrefix Prefix to assign to the tables
         * @param string $oldTablePrefix Prefix on current tables, if not $wgDBprefix
         * @param bool $dropCurrentTables
         */
-       public function __construct( Database $db, array $tablesToClone,
+       public function __construct( IMaintainableDatabase $db, array $tablesToClone,
                $newTablePrefix, $oldTablePrefix = '', $dropCurrentTables = true
        ) {
                $this->db = $db;
@@ -107,7 +107,8 @@ class CloneDatabase {
 
                        # Create new table
                        wfDebug( __METHOD__ . " duplicating $oldTableName to $newTableName\n" );
-                       $this->db->duplicateTableStructure( $oldTableName, $newTableName, $this->useTemporaryTables );
+                       $this->db->duplicateTableStructure(
+                               $oldTableName, $newTableName, $this->useTemporaryTables );
                }
        }
 
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
deleted file mode 100644 (file)
index 7208b7e..0000000
+++ /dev/null
@@ -1,1384 +0,0 @@
-<?php
-/**
- * This is the MS SQL Server Native database abstraction layer.
- *
- * 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 Database
- * @author Joel Penner <a-joelpe at microsoft dot com>
- * @author Chris Pucci <a-cpucci at microsoft dot com>
- * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
- * @author Ryan Schmidt <skizzerz at gmail dot com>
- */
-
-/**
- * @ingroup Database
- */
-class DatabaseMssql extends DatabaseBase {
-       protected $mInsertId = null;
-       protected $mLastResult = null;
-       protected $mAffectedRows = null;
-       protected $mSubqueryId = 0;
-       protected $mScrollableCursor = true;
-       protected $mPrepareStatements = true;
-       protected $mBinaryColumnCache = null;
-       protected $mBitColumnCache = null;
-       protected $mIgnoreDupKeyErrors = false;
-       protected $mIgnoreErrors = [];
-
-       protected $mPort;
-
-       public function implicitGroupby() {
-               return false;
-       }
-
-       public function implicitOrderby() {
-               return false;
-       }
-
-       public function unionSupportsOrderAndLimit() {
-               return false;
-       }
-
-       /**
-        * Usually aborts on failure
-        * @param string $server
-        * @param string $user
-        * @param string $password
-        * @param string $dbName
-        * @throws DBConnectionError
-        * @return bool|resource|null
-        */
-       public function open( $server, $user, $password, $dbName ) {
-               # Test for driver support, to avoid suppressed fatal error
-               if ( !function_exists( 'sqlsrv_connect' ) ) {
-                       throw new DBConnectionError(
-                               $this,
-                               "Microsoft SQL Server Native (sqlsrv) functions missing.
-                               You can download the driver from: http://go.microsoft.com/fwlink/?LinkId=123470\n"
-                       );
-               }
-
-               global $wgDBport, $wgDBWindowsAuthentication;
-
-               # e.g. the class is being loaded
-               if ( !strlen( $user ) ) {
-                       return null;
-               }
-
-               $this->close();
-               $this->mServer = $server;
-               $this->mPort = $wgDBport;
-               $this->mUser = $user;
-               $this->mPassword = $password;
-               $this->mDBname = $dbName;
-
-               $connectionInfo = [];
-
-               if ( $dbName ) {
-                       $connectionInfo['Database'] = $dbName;
-               }
-
-               // Decide which auth scenerio to use
-               // if we are using Windows auth, don't add credentials to $connectionInfo
-               if ( !$wgDBWindowsAuthentication ) {
-                       $connectionInfo['UID'] = $user;
-                       $connectionInfo['PWD'] = $password;
-               }
-
-               MediaWiki\suppressWarnings();
-               $this->mConn = sqlsrv_connect( $server, $connectionInfo );
-               MediaWiki\restoreWarnings();
-
-               if ( $this->mConn === false ) {
-                       throw new DBConnectionError( $this, $this->lastError() );
-               }
-
-               $this->mOpened = true;
-
-               return $this->mConn;
-       }
-
-       /**
-        * Closes a database connection, if it is open
-        * Returns success, true if already closed
-        * @return bool
-        */
-       protected function closeConnection() {
-               return sqlsrv_close( $this->mConn );
-       }
-
-       /**
-        * @param bool|MssqlResultWrapper|resource $result
-        * @return bool|MssqlResultWrapper
-        */
-       protected function resultObject( $result ) {
-               if ( !$result ) {
-                       return false;
-               } elseif ( $result instanceof MssqlResultWrapper ) {
-                       return $result;
-               } elseif ( $result === true ) {
-                       // Successful write query
-                       return $result;
-               } else {
-                       return new MssqlResultWrapper( $this, $result );
-               }
-       }
-
-       /**
-        * @param string $sql
-        * @return bool|MssqlResult
-        * @throws DBUnexpectedError
-        */
-       protected function doQuery( $sql ) {
-               if ( $this->getFlag( DBO_DEBUG ) ) {
-                       wfDebug( "SQL: [$sql]\n" );
-               }
-               $this->offset = 0;
-
-               // several extensions seem to think that all databases support limits
-               // via LIMIT N after the WHERE clause well, MSSQL uses SELECT TOP N,
-               // so to catch any of those extensions we'll do a quick check for a
-               // LIMIT clause and pass $sql through $this->LimitToTopN() which parses
-               // the limit clause and passes the result to $this->limitResult();
-               if ( preg_match( '/\bLIMIT\s*/i', $sql ) ) {
-                       // massage LIMIT -> TopN
-                       $sql = $this->LimitToTopN( $sql );
-               }
-
-               // MSSQL doesn't have EXTRACT(epoch FROM XXX)
-               if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
-                       // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
-                       $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
-               }
-
-               // perform query
-
-               // SQLSRV_CURSOR_STATIC is slower than SQLSRV_CURSOR_CLIENT_BUFFERED (one of the two is
-               // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED
-               // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty
-               // strings make php throw a fatal error "Severe error translating Unicode"
-               if ( $this->mScrollableCursor ) {
-                       $scrollArr = [ 'Scrollable' => SQLSRV_CURSOR_STATIC ];
-               } else {
-                       $scrollArr = [];
-               }
-
-               if ( $this->mPrepareStatements ) {
-                       // we do prepare + execute so we can get its field metadata for later usage if desired
-                       $stmt = sqlsrv_prepare( $this->mConn, $sql, [], $scrollArr );
-                       $success = sqlsrv_execute( $stmt );
-               } else {
-                       $stmt = sqlsrv_query( $this->mConn, $sql, [], $scrollArr );
-                       $success = (bool)$stmt;
-               }
-
-               // make a copy so that anything we add below does not get reflected in future queries
-               $ignoreErrors = $this->mIgnoreErrors;
-
-               if ( $this->mIgnoreDupKeyErrors ) {
-                       // ignore duplicate key errors
-                       // this emulates INSERT IGNORE in MySQL
-                       $ignoreErrors[] = '2601'; // duplicate key error caused by unique index
-                       $ignoreErrors[] = '2627'; // duplicate key error caused by primary key
-                       $ignoreErrors[] = '3621'; // generic "the statement has been terminated" error
-               }
-
-               if ( $success === false ) {
-                       $errors = sqlsrv_errors();
-                       $success = true;
-
-                       foreach ( $errors as $err ) {
-                               if ( !in_array( $err['code'], $ignoreErrors ) ) {
-                                       $success = false;
-                                       break;
-                               }
-                       }
-
-                       if ( $success === false ) {
-                               return false;
-                       }
-               }
-               // remember number of rows affected
-               $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
-
-               return $stmt;
-       }
-
-       public function freeResult( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               sqlsrv_free_stmt( $res );
-       }
-
-       /**
-        * @param MssqlResultWrapper $res
-        * @return stdClass
-        */
-       public function fetchObject( $res ) {
-               // $res is expected to be an instance of MssqlResultWrapper here
-               return $res->fetchObject();
-       }
-
-       /**
-        * @param MssqlResultWrapper $res
-        * @return array
-        */
-       public function fetchRow( $res ) {
-               return $res->fetchRow();
-       }
-
-       /**
-        * @param mixed $res
-        * @return int
-        */
-       public function numRows( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               $ret = sqlsrv_num_rows( $res );
-
-               if ( $ret === false ) {
-                       // we cannot get an amount of rows from this cursor type
-                       // has_rows returns bool true/false if the result has rows
-                       $ret = (int)sqlsrv_has_rows( $res );
-               }
-
-               return $ret;
-       }
-
-       /**
-        * @param mixed $res
-        * @return int
-        */
-       public function numFields( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               return sqlsrv_num_fields( $res );
-       }
-
-       /**
-        * @param mixed $res
-        * @param int $n
-        * @return int
-        */
-       public function fieldName( $res, $n ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               return sqlsrv_field_metadata( $res )[$n]['Name'];
-       }
-
-       /**
-        * This must be called after nextSequenceVal
-        * @return int|null
-        */
-       public function insertId() {
-               return $this->mInsertId;
-       }
-
-       /**
-        * @param MssqlResultWrapper $res
-        * @param int $row
-        * @return bool
-        */
-       public function dataSeek( $res, $row ) {
-               return $res->seek( $row );
-       }
-
-       /**
-        * @return string
-        */
-       public function lastError() {
-               $strRet = '';
-               $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $retErrors != null ) {
-                       foreach ( $retErrors as $arrError ) {
-                               $strRet .= $this->formatError( $arrError ) . "\n";
-                       }
-               } else {
-                       $strRet = "No errors found";
-               }
-
-               return $strRet;
-       }
-
-       /**
-        * @param array $err
-        * @return string
-        */
-       private function formatError( $err ) {
-               return '[SQLSTATE ' . $err['SQLSTATE'] . '][Error Code ' . $err['code'] . ']' . $err['message'];
-       }
-
-       /**
-        * @return string
-        */
-       public function lastErrno() {
-               $err = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $err !== null && isset( $err[0] ) ) {
-                       return $err[0]['code'];
-               } else {
-                       return 0;
-               }
-       }
-
-       /**
-        * @return int
-        */
-       public function affectedRows() {
-               return $this->mAffectedRows;
-       }
-
-       /**
-        * SELECT wrapper
-        *
-        * @param mixed $table Array or string, table name(s) (prefix auto-added)
-        * @param mixed $vars Array or string, field name(s) to be retrieved
-        * @param mixed $conds Array or string, condition(s) for WHERE
-        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        * @param array $options Associative array of options (e.g.
-        *   [ 'GROUP BY' => 'page_title' ]), see Database::makeSelectOptions
-        *   code for list of supported stuff
-        * @param array $join_conds Associative array of table join conditions
-        *   (optional) (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
-        * @return mixed Database result resource (feed to Database::fetchObject
-        *   or whatever), or false on failure
-        * @throws DBQueryError
-        * @throws DBUnexpectedError
-        * @throws Exception
-        */
-       public function select( $table, $vars, $conds = '', $fname = __METHOD__,
-               $options = [], $join_conds = []
-       ) {
-               $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-               if ( isset( $options['EXPLAIN'] ) ) {
-                       try {
-                               $this->mScrollableCursor = false;
-                               $this->mPrepareStatements = false;
-                               $this->query( "SET SHOWPLAN_ALL ON" );
-                               $ret = $this->query( $sql, $fname );
-                               $this->query( "SET SHOWPLAN_ALL OFF" );
-                       } catch ( DBQueryError $dqe ) {
-                               if ( isset( $options['FOR COUNT'] ) ) {
-                                       // likely don't have privs for SHOWPLAN, so run a select count instead
-                                       $this->query( "SET SHOWPLAN_ALL OFF" );
-                                       unset( $options['EXPLAIN'] );
-                                       $ret = $this->select(
-                                               $table,
-                                               'COUNT(*) AS EstimateRows',
-                                               $conds,
-                                               $fname,
-                                               $options,
-                                               $join_conds
-                                       );
-                               } else {
-                                       // someone actually wanted the query plan instead of an est row count
-                                       // let them know of the error
-                                       $this->mScrollableCursor = true;
-                                       $this->mPrepareStatements = true;
-                                       throw $dqe;
-                               }
-                       }
-                       $this->mScrollableCursor = true;
-                       $this->mPrepareStatements = true;
-                       return $ret;
-               }
-               return $this->query( $sql, $fname );
-       }
-
-       /**
-        * SELECT wrapper
-        *
-        * @param mixed $table Array or string, table name(s) (prefix auto-added)
-        * @param mixed $vars Array or string, field name(s) to be retrieved
-        * @param mixed $conds Array or string, condition(s) for WHERE
-        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        * @param array $options Associative array of options (e.g. [ 'GROUP BY' => 'page_title' ]),
-        *   see Database::makeSelectOptions code for list of supported stuff
-        * @param array $join_conds Associative array of table join conditions (optional)
-        *    (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
-        * @return string The SQL text
-        */
-       public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
-               $options = [], $join_conds = []
-       ) {
-               if ( isset( $options['EXPLAIN'] ) ) {
-                       unset( $options['EXPLAIN'] );
-               }
-
-               $sql = parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-
-               // try to rewrite aggregations of bit columns (currently MAX and MIN)
-               if ( strpos( $sql, 'MAX(' ) !== false || strpos( $sql, 'MIN(' ) !== false ) {
-                       $bitColumns = [];
-                       if ( is_array( $table ) ) {
-                               foreach ( $table as $t ) {
-                                       $bitColumns += $this->getBitColumns( $this->tableName( $t ) );
-                               }
-                       } else {
-                               $bitColumns = $this->getBitColumns( $this->tableName( $table ) );
-                       }
-
-                       foreach ( $bitColumns as $col => $info ) {
-                               $replace = [
-                                       "MAX({$col})" => "MAX(CAST({$col} AS tinyint))",
-                                       "MIN({$col})" => "MIN(CAST({$col} AS tinyint))",
-                               ];
-                               $sql = str_replace( array_keys( $replace ), array_values( $replace ), $sql );
-                       }
-               }
-
-               return $sql;
-       }
-
-       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
-               $fname = __METHOD__
-       ) {
-               $this->mScrollableCursor = false;
-               try {
-                       parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-       }
-
-       public function delete( $table, $conds, $fname = __METHOD__ ) {
-               $this->mScrollableCursor = false;
-               try {
-                       parent::delete( $table, $conds, $fname );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-       }
-
-       /**
-        * Estimate rows in dataset
-        * Returns estimated count, based on SHOWPLAN_ALL output
-        * This is not necessarily an accurate estimate, so use sparingly
-        * Returns -1 if count cannot be found
-        * Takes same arguments as Database::select()
-        * @param string $table
-        * @param string $vars
-        * @param string $conds
-        * @param string $fname
-        * @param array $options
-        * @return int
-        */
-       public function estimateRowCount( $table, $vars = '*', $conds = '',
-               $fname = __METHOD__, $options = []
-       ) {
-               // http://msdn2.microsoft.com/en-us/library/aa259203.aspx
-               $options['EXPLAIN'] = true;
-               $options['FOR COUNT'] = true;
-               $res = $this->select( $table, $vars, $conds, $fname, $options );
-
-               $rows = -1;
-               if ( $res ) {
-                       $row = $this->fetchRow( $res );
-
-                       if ( isset( $row['EstimateRows'] ) ) {
-                               $rows = (int)$row['EstimateRows'];
-                       }
-               }
-
-               return $rows;
-       }
-
-       /**
-        * Returns information about an index
-        * If errors are explicitly ignored, returns NULL on failure
-        * @param string $table
-        * @param string $index
-        * @param string $fname
-        * @return array|bool|null
-        */
-       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
-               # This does not return the same info as MYSQL would, but that's OK
-               # because MediaWiki never uses the returned value except to check for
-               # the existance of indexes.
-               $sql = "sp_helpindex '" . $this->tableName( $table ) . "'";
-               $res = $this->query( $sql, $fname );
-
-               if ( !$res ) {
-                       return null;
-               }
-
-               $result = [];
-               foreach ( $res as $row ) {
-                       if ( $row->index_name == $index ) {
-                               $row->Non_unique = !stristr( $row->index_description, "unique" );
-                               $cols = explode( ", ", $row->index_keys );
-                               foreach ( $cols as $col ) {
-                                       $row->Column_name = trim( $col );
-                                       $result[] = clone $row;
-                               }
-                       } elseif ( $index == 'PRIMARY' && stristr( $row->index_description, 'PRIMARY' ) ) {
-                               $row->Non_unique = 0;
-                               $cols = explode( ", ", $row->index_keys );
-                               foreach ( $cols as $col ) {
-                                       $row->Column_name = trim( $col );
-                                       $result[] = clone $row;
-                               }
-                       }
-               }
-
-               return empty( $result ) ? false : $result;
-       }
-
-       /**
-        * INSERT wrapper, inserts an array into a table
-        *
-        * $arrToInsert may be a single associative array, or an array of these with numeric keys, for
-        * multi-row insert.
-        *
-        * Usually aborts on failure
-        * If errors are explicitly ignored, returns success
-        * @param string $table
-        * @param array $arrToInsert
-        * @param string $fname
-        * @param array $options
-        * @return bool
-        * @throws Exception
-        */
-       public function insert( $table, $arrToInsert, $fname = __METHOD__, $options = [] ) {
-               # No rows to insert, easy just return now
-               if ( !count( $arrToInsert ) ) {
-                       return true;
-               }
-
-               if ( !is_array( $options ) ) {
-                       $options = [ $options ];
-               }
-
-               $table = $this->tableName( $table );
-
-               if ( !( isset( $arrToInsert[0] ) && is_array( $arrToInsert[0] ) ) ) { // Not multi row
-                       $arrToInsert = [ 0 => $arrToInsert ]; // make everything multi row compatible
-               }
-
-               // We know the table we're inserting into, get its identity column
-               $identity = null;
-               // strip matching square brackets and the db/schema from table name
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-               $res = $this->doQuery(
-                       "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS " .
-                               "WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'"
-               );
-               if ( $res && sqlsrv_has_rows( $res ) ) {
-                       // There is an identity for this table.
-                       $identityArr = sqlsrv_fetch_array( $res, SQLSRV_FETCH_ASSOC );
-                       $identity = array_pop( $identityArr );
-               }
-               sqlsrv_free_stmt( $res );
-
-               // Determine binary/varbinary fields so we can encode data as a hex string like 0xABCDEF
-               $binaryColumns = $this->getBinaryColumns( $table );
-
-               // INSERT IGNORE is not supported by SQL Server
-               // remove IGNORE from options list and set ignore flag to true
-               if ( in_array( 'IGNORE', $options ) ) {
-                       $options = array_diff( $options, [ 'IGNORE' ] );
-                       $this->mIgnoreDupKeyErrors = true;
-               }
-
-               foreach ( $arrToInsert as $a ) {
-                       // start out with empty identity column, this is so we can return
-                       // it as a result of the insert logic
-                       $sqlPre = '';
-                       $sqlPost = '';
-                       $identityClause = '';
-
-                       // if we have an identity column
-                       if ( $identity ) {
-                               // iterate through
-                               foreach ( $a as $k => $v ) {
-                                       if ( $k == $identity ) {
-                                               if ( !is_null( $v ) ) {
-                                                       // there is a value being passed to us,
-                                                       // we need to turn on and off inserted identity
-                                                       $sqlPre = "SET IDENTITY_INSERT $table ON;";
-                                                       $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
-                                               } else {
-                                                       // we can't insert NULL into an identity column,
-                                                       // so remove the column from the insert.
-                                                       unset( $a[$k] );
-                                               }
-                                       }
-                               }
-
-                               // we want to output an identity column as result
-                               $identityClause = "OUTPUT INSERTED.$identity ";
-                       }
-
-                       $keys = array_keys( $a );
-
-                       // Build the actual query
-                       $sql = $sqlPre . 'INSERT ' . implode( ' ', $options ) .
-                               " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
-
-                       $first = true;
-                       foreach ( $a as $key => $value ) {
-                               if ( isset( $binaryColumns[$key] ) ) {
-                                       $value = new MssqlBlob( $value );
-                               }
-                               if ( $first ) {
-                                       $first = false;
-                               } else {
-                                       $sql .= ',';
-                               }
-                               if ( is_null( $value ) ) {
-                                       $sql .= 'null';
-                               } elseif ( is_array( $value ) || is_object( $value ) ) {
-                                       if ( is_object( $value ) && $value instanceof Blob ) {
-                                               $sql .= $this->addQuotes( $value );
-                                       } else {
-                                               $sql .= $this->addQuotes( serialize( $value ) );
-                                       }
-                               } else {
-                                       $sql .= $this->addQuotes( $value );
-                               }
-                       }
-                       $sql .= ')' . $sqlPost;
-
-                       // Run the query
-                       $this->mScrollableCursor = false;
-                       try {
-                               $ret = $this->query( $sql );
-                       } catch ( Exception $e ) {
-                               $this->mScrollableCursor = true;
-                               $this->mIgnoreDupKeyErrors = false;
-                               throw $e;
-                       }
-                       $this->mScrollableCursor = true;
-
-                       if ( !is_null( $identity ) ) {
-                               // then we want to get the identity column value we were assigned and save it off
-                               $row = $ret->fetchObject();
-                               if ( is_object( $row ) ) {
-                                       $this->mInsertId = $row->$identity;
-
-                                       // it seems that mAffectedRows is -1 sometimes when OUTPUT INSERTED.identity is used
-                                       // if we got an identity back, we know for sure a row was affected, so adjust that here
-                                       if ( $this->mAffectedRows == -1 ) {
-                                               $this->mAffectedRows = 1;
-                                       }
-                               }
-                       }
-               }
-               $this->mIgnoreDupKeyErrors = false;
-               return $ret;
-       }
-
-       /**
-        * INSERT SELECT wrapper
-        * $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
-        * Source items may be literals rather than field names, but strings should
-        * be quoted with Database::addQuotes().
-        * @param string $destTable
-        * @param array|string $srcTable May be an array of tables.
-        * @param array $varMap
-        * @param array $conds May be "*" to copy the whole table.
-        * @param string $fname
-        * @param array $insertOptions
-        * @param array $selectOptions
-        * @return null|ResultWrapper
-        * @throws Exception
-        */
-       public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = []
-       ) {
-               $this->mScrollableCursor = false;
-               try {
-                       $ret = parent::nativeInsertSelect(
-                               $destTable,
-                               $srcTable,
-                               $varMap,
-                               $conds,
-                               $fname,
-                               $insertOptions,
-                               $selectOptions
-                       );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-
-               return $ret;
-       }
-
-       /**
-        * UPDATE wrapper. Takes a condition array and a SET array.
-        *
-        * @param string $table Name of the table to UPDATE. This will be passed through
-        *                Database::tableName().
-        *
-        * @param array $values An array of values to SET. For each array element,
-        *                the key gives the field name, and the value gives the data
-        *                to set that field to. The data will be quoted by
-        *                Database::addQuotes().
-        *
-        * @param array $conds An array of conditions (WHERE). See
-        *                Database::select() for the details of the format of
-        *                condition arrays. Use '*' to update all rows.
-        *
-        * @param string $fname The function name of the caller (from __METHOD__),
-        *                for logging and profiling.
-        *
-        * @param array $options An array of UPDATE options, can be:
-        *                   - IGNORE: Ignore unique key conflicts
-        *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
-        * @return bool
-        * @throws DBUnexpectedError
-        * @throws Exception
-        */
-       function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {
-               $table = $this->tableName( $table );
-               $binaryColumns = $this->getBinaryColumns( $table );
-
-               $opts = $this->makeUpdateOptions( $options );
-               $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET, $binaryColumns );
-
-               if ( $conds !== [] && $conds !== '*' ) {
-                       $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns );
-               }
-
-               $this->mScrollableCursor = false;
-               try {
-                       $this->query( $sql );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-               return true;
-       }
-
-       /**
-        * Makes an encoded list of strings from an array
-        * @param array $a Containing the data
-        * @param int $mode Constant
-        *      - LIST_COMMA:          comma separated, no field names
-        *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
-        *        the documentation for $conds in Database::select().
-        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
-        *      - LIST_SET:            comma separated with field names, like a SET clause
-        *      - LIST_NAMES:          comma separated field names
-        * @param array $binaryColumns Contains a list of column names that are binary types
-        *      This is a custom parameter only present for MS SQL.
-        *
-        * @throws DBUnexpectedError
-        * @return string
-        */
-       public function makeList( $a, $mode = LIST_COMMA, $binaryColumns = [] ) {
-               if ( !is_array( $a ) ) {
-                       throw new DBUnexpectedError( $this, __METHOD__ . ' called with incorrect parameters' );
-               }
-
-               if ( $mode != LIST_NAMES ) {
-                       // In MS SQL, values need to be specially encoded when they are
-                       // inserted into binary fields. Perform this necessary encoding
-                       // for the specified set of columns.
-                       foreach ( array_keys( $a ) as $field ) {
-                               if ( !isset( $binaryColumns[$field] ) ) {
-                                       continue;
-                               }
-
-                               if ( is_array( $a[$field] ) ) {
-                                       foreach ( $a[$field] as &$v ) {
-                                               $v = new MssqlBlob( $v );
-                                       }
-                                       unset( $v );
-                               } else {
-                                       $a[$field] = new MssqlBlob( $a[$field] );
-                               }
-                       }
-               }
-
-               return parent::makeList( $a, $mode );
-       }
-
-       /**
-        * @param string $table
-        * @param string $field
-        * @return int Returns the size of a text field, or -1 for "unlimited"
-        */
-       public function textFieldSize( $table, $field ) {
-               $table = $this->tableName( $table );
-               $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
-                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'";
-               $res = $this->query( $sql );
-               $row = $this->fetchRow( $res );
-               $size = -1;
-               if ( strtolower( $row['DATA_TYPE'] ) != 'text' ) {
-                       $size = $row['CHARACTER_MAXIMUM_LENGTH'];
-               }
-
-               return $size;
-       }
-
-       /**
-        * Construct a LIMIT query with optional offset
-        * This is used for query pages
-        *
-        * @param string $sql SQL query we will append the limit too
-        * @param int $limit The SQL limit
-        * @param bool|int $offset The SQL offset (default false)
-        * @return array|string
-        * @throws DBUnexpectedError
-        */
-       public function limitResult( $sql, $limit, $offset = false ) {
-               if ( $offset === false || $offset == 0 ) {
-                       if ( strpos( $sql, "SELECT" ) === false ) {
-                               return "TOP {$limit} " . $sql;
-                       } else {
-                               return preg_replace( '/\bSELECT(\s+DISTINCT)?\b/Dsi',
-                                       'SELECT$1 TOP ' . $limit, $sql, 1 );
-                       }
-               } else {
-                       // This one is fun, we need to pull out the select list as well as any ORDER BY clause
-                       $select = $orderby = [];
-                       $s1 = preg_match( '#SELECT\s+(.+?)\s+FROM#Dis', $sql, $select );
-                       $s2 = preg_match( '#(ORDER BY\s+.+?)(\s*FOR XML .*)?$#Dis', $sql, $orderby );
-                       $overOrder = $postOrder = '';
-                       $first = $offset + 1;
-                       $last = $offset + $limit;
-                       $sub1 = 'sub_' . $this->mSubqueryId;
-                       $sub2 = 'sub_' . ( $this->mSubqueryId + 1 );
-                       $this->mSubqueryId += 2;
-                       if ( !$s1 ) {
-                               // wat
-                               throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" );
-                       }
-                       if ( !$s2 ) {
-                               // no ORDER BY
-                               $overOrder = 'ORDER BY (SELECT 1)';
-                       } else {
-                               if ( !isset( $orderby[2] ) || !$orderby[2] ) {
-                                       // don't need to strip it out if we're using a FOR XML clause
-                                       $sql = str_replace( $orderby[1], '', $sql );
-                               }
-                               $overOrder = $orderby[1];
-                               $postOrder = ' ' . $overOrder;
-                       }
-                       $sql = "SELECT {$select[1]}
-                                       FROM (
-                                               SELECT ROW_NUMBER() OVER({$overOrder}) AS rowNumber, *
-                                               FROM ({$sql}) {$sub1}
-                                       ) {$sub2}
-                                       WHERE rowNumber BETWEEN {$first} AND {$last}{$postOrder}";
-
-                       return $sql;
-               }
-       }
-
-       /**
-        * If there is a limit clause, parse it, strip it, and pass the remaining
-        * SQL through limitResult() with the appropriate parameters. Not the
-        * prettiest solution, but better than building a whole new parser. This
-        * exists becase there are still too many extensions that don't use dynamic
-        * sql generation.
-        *
-        * @param string $sql
-        * @return array|mixed|string
-        */
-       public function LimitToTopN( $sql ) {
-               // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
-               $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
-               if ( preg_match( $pattern, $sql, $matches ) ) {
-                       $row_count = $matches[4];
-                       $offset = $matches[3] ?: $matches[6] ?: false;
-
-                       // strip the matching LIMIT clause out
-                       $sql = str_replace( $matches[0], '', $sql );
-
-                       return $this->limitResult( $sql, $row_count, $offset );
-               }
-
-               return $sql;
-       }
-
-       /**
-        * @return string Wikitext of a link to the server software's web site
-        */
-       public function getSoftwareLink() {
-               return "[{{int:version-db-mssql-url}} MS SQL Server]";
-       }
-
-       /**
-        * @return string Version information from the database
-        */
-       public function getServerVersion() {
-               $server_info = sqlsrv_server_info( $this->mConn );
-               $version = 'Error';
-               if ( isset( $server_info['SQLServerVersion'] ) ) {
-                       $version = $server_info['SQLServerVersion'];
-               }
-
-               return $version;
-       }
-
-       /**
-        * @param string $table
-        * @param string $fname
-        * @return bool
-        */
-       public function tableExists( $table, $fname = __METHOD__ ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       wfDebug( "Attempting to call tableExists on a remote table" );
-                       return false;
-               }
-
-               if ( $schema === false ) {
-                       global $wgDBmwschema;
-                       $schema = $wgDBmwschema;
-               }
-
-               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
-                       WHERE TABLE_TYPE = 'BASE TABLE'
-                       AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
-
-               if ( $res->numRows() ) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Query whether a given column exists in the mediawiki schema
-        * @param string $table
-        * @param string $field
-        * @param string $fname
-        * @return bool
-        */
-       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       wfDebug( "Attempting to call fieldExists on a remote table" );
-                       return false;
-               }
-
-               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
-                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-
-               if ( $res->numRows() ) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       public function fieldInfo( $table, $field ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       wfDebug( "Attempting to call fieldInfo on a remote table" );
-                       return false;
-               }
-
-               $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.COLUMNS
-                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-
-               $meta = $res->fetchRow();
-               if ( $meta ) {
-                       return new MssqlField( $meta );
-               }
-
-               return false;
-       }
-
-       /**
-        * Begin a transaction, committing any previously open transaction
-        * @param string $fname
-        */
-       protected function doBegin( $fname = __METHOD__ ) {
-               sqlsrv_begin_transaction( $this->mConn );
-               $this->mTrxLevel = 1;
-       }
-
-       /**
-        * End a transaction
-        * @param string $fname
-        */
-       protected function doCommit( $fname = __METHOD__ ) {
-               sqlsrv_commit( $this->mConn );
-               $this->mTrxLevel = 0;
-       }
-
-       /**
-        * Rollback a transaction.
-        * No-op on non-transactional databases.
-        * @param string $fname
-        */
-       protected function doRollback( $fname = __METHOD__ ) {
-               sqlsrv_rollback( $this->mConn );
-               $this->mTrxLevel = 0;
-       }
-
-       /**
-        * Escapes a identifier for use inm SQL.
-        * Throws an exception if it is invalid.
-        * Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
-        * @param string $identifier
-        * @throws InvalidArgumentException
-        * @return string
-        */
-       private function escapeIdentifier( $identifier ) {
-               if ( strlen( $identifier ) == 0 ) {
-                       throw new InvalidArgumentException( "An identifier must not be empty" );
-               }
-               if ( strlen( $identifier ) > 128 ) {
-                       throw new InvalidArgumentException( "The identifier '$identifier' is too long (max. 128)" );
-               }
-               if ( ( strpos( $identifier, '[' ) !== false )
-                       || ( strpos( $identifier, ']' ) !== false )
-               ) {
-                       // It may be allowed if you quoted with double quotation marks, but
-                       // that would break if QUOTED_IDENTIFIER is OFF
-                       throw new InvalidArgumentException( "Square brackets are not allowed in '$identifier'" );
-               }
-
-               return "[$identifier]";
-       }
-
-       /**
-        * @param string $s
-        * @return string
-        */
-       public function strencode( $s ) {
-               // Should not be called by us
-
-               return str_replace( "'", "''", $s );
-       }
-
-       /**
-        * @param string|int|null|bool|Blob $s
-        * @return string|int
-        */
-       public function addQuotes( $s ) {
-               if ( $s instanceof MssqlBlob ) {
-                       return $s->fetch();
-               } elseif ( $s instanceof Blob ) {
-                       // this shouldn't really ever be called, but it's here if needed
-                       // (and will quite possibly make the SQL error out)
-                       $blob = new MssqlBlob( $s->fetch() );
-                       return $blob->fetch();
-               } else {
-                       if ( is_bool( $s ) ) {
-                               $s = $s ? 1 : 0;
-                       }
-                       return parent::addQuotes( $s );
-               }
-       }
-
-       /**
-        * @param string $s
-        * @return string
-        */
-       public function addIdentifierQuotes( $s ) {
-               // http://msdn.microsoft.com/en-us/library/aa223962.aspx
-               return '[' . $s . ']';
-       }
-
-       /**
-        * @param string $name
-        * @return bool
-        */
-       public function isQuotedIdentifier( $name ) {
-               return strlen( $name ) && $name[0] == '[' && substr( $name, -1, 1 ) == ']';
-       }
-
-       /**
-        * MS SQL supports more pattern operators than other databases (ex: [,],^)
-        *
-        * @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 '\' ";
-       }
-
-       /**
-        * @param string $db
-        * @return bool
-        */
-       public function selectDB( $db ) {
-               try {
-                       $this->mDBname = $db;
-                       $this->query( "USE $db" );
-                       return true;
-               } catch ( Exception $e ) {
-                       return false;
-               }
-       }
-
-       /**
-        * @param array $options An associative array of options to be turned into
-        *   an SQL query, valid keys are listed in the function.
-        * @return array
-        */
-       public function makeSelectOptions( $options ) {
-               $tailOpts = '';
-               $startOpts = '';
-
-               $noKeyOptions = [];
-               foreach ( $options as $key => $option ) {
-                       if ( is_numeric( $key ) ) {
-                               $noKeyOptions[$option] = true;
-                       }
-               }
-
-               $tailOpts .= $this->makeGroupByWithHaving( $options );
-
-               $tailOpts .= $this->makeOrderBy( $options );
-
-               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
-                       $startOpts .= 'DISTINCT';
-               }
-
-               if ( isset( $noKeyOptions['FOR XML'] ) ) {
-                       // used in group concat field emulation
-                       $tailOpts .= " FOR XML PATH('')";
-               }
-
-               // we want this to be compatible with the output of parent::makeSelectOptions()
-               return [ $startOpts, '', $tailOpts, '', '' ];
-       }
-
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        * @return string
-        */
-       public function getType() {
-               return 'mssql';
-       }
-
-       /**
-        * @param array $stringList
-        * @return string
-        */
-       public function buildConcat( $stringList ) {
-               return implode( ' + ', $stringList );
-       }
-
-       /**
-        * Build a GROUP_CONCAT or equivalent statement for a query.
-        * MS SQL doesn't have GROUP_CONCAT so we emulate it with other stuff (and boy is it nasty)
-        *
-        * This is useful for combining a field for several rows into a single string.
-        * NULL values will not appear in the output, duplicated values will appear,
-        * and the resulting delimiter-separated values have no defined sort order.
-        * Code using the results may need to use the PHP unique() or sort() methods.
-        *
-        * @param string $delim Glue to bind the results together
-        * @param string|array $table Table name
-        * @param string $field Field name
-        * @param string|array $conds Conditions
-        * @param string|array $join_conds Join conditions
-        * @return string SQL text
-        * @since 1.23
-        */
-       public function buildGroupConcatField( $delim, $table, $field, $conds = '',
-               $join_conds = []
-       ) {
-               $gcsq = 'gcsq_' . $this->mSubqueryId;
-               $this->mSubqueryId++;
-
-               $delimLen = strlen( $delim );
-               $fld = "{$field} + {$this->addQuotes( $delim )}";
-               $sql = "(SELECT LEFT({$field}, LEN({$field}) - {$delimLen}) FROM ("
-                       . $this->selectSQLText( $table, $fld, $conds, null, [ 'FOR XML' ], $join_conds )
-                       . ") {$gcsq} ({$field}))";
-
-               return $sql;
-       }
-
-       /**
-        * Returns an associative array for fields that are of type varbinary, binary, or image
-        * $table can be either a raw table name or passed through tableName() first
-        * @param string $table
-        * @return array
-        */
-       private function getBinaryColumns( $table ) {
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-
-               if ( $this->mBinaryColumnCache === null ) {
-                       $this->populateColumnCaches();
-               }
-
-               return isset( $this->mBinaryColumnCache[$tableRaw] )
-                       ? $this->mBinaryColumnCache[$tableRaw]
-                       : [];
-       }
-
-       /**
-        * @param string $table
-        * @return array
-        */
-       private function getBitColumns( $table ) {
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-
-               if ( $this->mBitColumnCache === null ) {
-                       $this->populateColumnCaches();
-               }
-
-               return isset( $this->mBitColumnCache[$tableRaw] )
-                       ? $this->mBitColumnCache[$tableRaw]
-                       : [];
-       }
-
-       private function populateColumnCaches() {
-               $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
-                       [
-                               'TABLE_CATALOG' => $this->mDBname,
-                               'TABLE_SCHEMA' => $this->mSchema,
-                               'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ]
-                       ] );
-
-               $this->mBinaryColumnCache = [];
-               $this->mBitColumnCache = [];
-               foreach ( $res as $row ) {
-                       if ( $row->DATA_TYPE == 'bit' ) {
-                               $this->mBitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
-                       } else {
-                               $this->mBinaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
-                       }
-               }
-       }
-
-       /**
-        * @param string $name
-        * @param string $format
-        * @return string
-        */
-       function tableName( $name, $format = 'quoted' ) {
-               # Replace reserved words with better ones
-               switch ( $name ) {
-                       case 'user':
-                               return $this->realTableName( 'mwuser', $format );
-                       default:
-                               return $this->realTableName( $name, $format );
-               }
-       }
-
-       /**
-        * call this instead of tableName() in the updater when renaming tables
-        * @param string $name
-        * @param string $format One of quoted, raw, or split
-        * @return string
-        */
-       function realTableName( $name, $format = 'quoted' ) {
-               $table = parent::tableName( $name, $format );
-               if ( $format == 'split' ) {
-                       // Used internally, we want the schema split off from the table name and returned
-                       // as a list with 3 elements (database, schema, table)
-                       $table = explode( '.', $table );
-                       while ( count( $table ) < 3 ) {
-                               array_unshift( $table, false );
-                       }
-               }
-               return $table;
-       }
-
-       /**
-        * Delete a table
-        * @param string $tableName
-        * @param string $fName
-        * @return bool|ResultWrapper
-        * @since 1.18
-        */
-       public function dropTable( $tableName, $fName = __METHOD__ ) {
-               if ( !$this->tableExists( $tableName, $fName ) ) {
-                       return false;
-               }
-
-               // parent function incorrectly appends CASCADE, which we don't want
-               $sql = "DROP TABLE " . $this->tableName( $tableName );
-
-               return $this->query( $sql, $fName );
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param bool|null $value
-        * @return bool|null
-        */
-       public function prepareStatements( $value = null ) {
-               return wfSetVar( $this->mPrepareStatements, $value );
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param bool|null $value
-        * @return bool|null
-        */
-       public function scrollableCursor( $value = null ) {
-               return wfSetVar( $this->mScrollableCursor, $value );
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param array|null $value
-        * @return array|null
-        */
-       public function ignoreErrors( array $value = null ) {
-               return wfSetVar( $this->mIgnoreErrors, $value );
-       }
-} // end DatabaseMssql class
index 561dadb..344aa3d 100644 (file)
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\Blob;
 
 /**
- * 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
- * Oracle-specific bits, like converting column names back to lowercase.
  * @ingroup Database
  */
-class ORAResult {
-       private $rows;
-       private $cursor;
-       private $nrows;
-
-       private $columns = [];
-
-       private function array_unique_md( $array_in ) {
-               $array_out = [];
-               $array_hashes = [];
-
-               foreach ( $array_in as $item ) {
-                       $hash = md5( serialize( $item ) );
-                       if ( !isset( $array_hashes[$hash] ) ) {
-                               $array_hashes[$hash] = $hash;
-                               $array_out[] = $item;
-                       }
-               }
-
-               return $array_out;
-       }
-
-       /**
-        * @param IDatabase $db
-        * @param resource $stmt A valid OCI statement identifier
-        * @param bool $unique
-        */
-       function __construct( &$db, $stmt, $unique = false ) {
-               $this->db =& $db;
-
-               $this->nrows = oci_fetch_all( $stmt, $this->rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW | OCI_NUM );
-               if ( $this->nrows === false ) {
-                       $e = oci_error( $stmt );
-                       $db->reportQueryError( $e['message'], $e['code'], '', __METHOD__ );
-                       $this->free();
-
-                       return;
-               }
-
-               if ( $unique ) {
-                       $this->rows = $this->array_unique_md( $this->rows );
-                       $this->nrows = count( $this->rows );
-               }
-
-               if ( $this->nrows > 0 ) {
-                       foreach ( $this->rows[0] as $k => $v ) {
-                               $this->columns[$k] = strtolower( oci_field_name( $stmt, $k + 1 ) );
-                       }
-               }
-
-               $this->cursor = 0;
-               oci_free_statement( $stmt );
-       }
-
-       public function free() {
-               unset( $this->db );
-       }
-
-       public function seek( $row ) {
-               $this->cursor = min( $row, $this->nrows );
-       }
-
-       public function numRows() {
-               return $this->nrows;
-       }
-
-       public function numFields() {
-               return count( $this->columns );
-       }
-
-       public function fetchObject() {
-               if ( $this->cursor >= $this->nrows ) {
-                       return false;
-               }
-               $row = $this->rows[$this->cursor++];
-               $ret = new stdClass();
-               foreach ( $row as $k => $v ) {
-                       $lc = $this->columns[$k];
-                       $ret->$lc = $v;
-               }
-
-               return $ret;
-       }
-
-       public function fetchRow() {
-               if ( $this->cursor >= $this->nrows ) {
-                       return false;
-               }
-
-               $row = $this->rows[$this->cursor++];
-               $ret = [];
-               foreach ( $row as $k => $v ) {
-                       $lc = $this->columns[$k];
-                       $ret[$lc] = $v;
-                       $ret[$k] = $v;
-               }
-
-               return $ret;
-       }
-}
-
-/**
- * @ingroup Database
- */
-class DatabaseOracle extends DatabaseBase {
+class DatabaseOracle extends Database {
        /** @var resource */
        protected $mLastResult = null;
 
@@ -668,7 +562,7 @@ class DatabaseOracle extends DatabaseBase {
                list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) =
                        $this->makeSelectOptions( $selectOptions );
                if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ &$this, 'tableName' ], $srcTable ) );
+                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
                } else {
                        $srcTable = $this->tableName( $srcTable );
                }
@@ -993,12 +887,12 @@ class DatabaseOracle extends DatabaseBase {
         *
         * @param array|string $table
         * @param string $field
-        * @return ORAField|ORAResult
+        * @return ORAField|ORAResult|false
         */
        private function fieldInfoMulti( $table, $field ) {
                $field = strtoupper( $field );
                if ( is_array( $table ) ) {
-                       $table = array_map( [ &$this, 'tableNameInternal' ], $table );
+                       $table = array_map( [ $this, 'tableNameInternal' ], $table );
                        $tableWhere = 'IN (';
                        foreach ( $table as &$singleTable ) {
                                $singleTable = $this->removeIdentifierQuotes( $singleTable );
@@ -1085,24 +979,18 @@ class DatabaseOracle extends DatabaseBase {
                }
        }
 
-       /**
-        * defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
-        *
-        * @param resource $fp
-        * @param bool|string $lineCallback
-        * @param bool|callable $resultCallback
-        * @param string $fname
-        * @param bool|callable $inputCallback
-        * @return bool|string
-        */
-       function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
-               $fname = __METHOD__, $inputCallback = false ) {
+       function sourceStream(
+               $fp,
+               callable $lineCallback = null,
+               callable $resultCallback = null,
+               $fname = __METHOD__, callable $inputCallback = null
+       ) {
                $cmd = '';
                $done = false;
                $dollarquote = false;
 
                $replacements = [];
-
+               // Defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
                while ( !feof( $fp ) ) {
                        if ( $lineCallback ) {
                                call_user_func( $lineCallback );
index 42ef685..fe063f2 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DatabaseDomain;
 
 /**
  * MediaWiki-specific class for generating database load balancers
@@ -37,6 +38,8 @@ abstract class MWLBFactory {
        public static function applyDefaultConfig( array $lbConf, Config $mainConfig ) {
                global $wgCommandLineMode;
 
+               static $typesWithSchema = [ 'postgres', 'msssql' ];
+
                $lbConf += [
                        'localDomain' => new DatabaseDomain(
                                $mainConfig->get( 'DBname' ),
@@ -56,6 +59,9 @@ abstract class MWLBFactory {
                        'readOnlyReason' => wfConfiguredReadOnlyReason(),
                ];
 
+               // When making changes here, remember to also specify MediaWiki-specific options
+               // for Database classes in the relevant Installer subclass.
+               // Such as MysqlInstaller::openConnection and PostgresInstaller::openConnectionWithParams.
                if ( $lbConf['class'] === 'LBFactorySimple' ) {
                        if ( isset( $lbConf['servers'] ) ) {
                                // Server array is already explicitly configured; leave alone
@@ -69,14 +75,25 @@ abstract class MWLBFactory {
                                                        // Work around the reserved word usage in MediaWiki schema
                                                        'keywordTableMap' => [ 'user' => 'mwuser', 'text' => 'pagecontent' ]
                                                ];
+                                       } elseif ( $server['type'] === 'mssql' ) {
+                                               $server += [
+                                                       'port' => $mainConfig->get( 'DBport' ),
+                                                       'useWindowsAuth' => $mainConfig->get( 'DBWindowsAuthentication' )
+                                               ];
                                        }
-                                       $lbConf['servers'][$i] = $server + [
-                                               'schema' => $mainConfig->get( 'DBmwschema' ),
+
+                                       if ( in_array( $server['type'], $typesWithSchema, true ) ) {
+                                               $server += [ 'schema' => $mainConfig->get( 'DBmwschema' ) ];
+                                       }
+
+                                       $server += [
                                                'tablePrefix' => $mainConfig->get( 'DBprefix' ),
                                                'flags' => DBO_DEFAULT,
                                                'sqlMode' => $mainConfig->get( 'SQLMode' ),
                                                'utf8Mode' => $mainConfig->get( 'DBmysql5' )
                                        ];
+
+                                       $lbConf['servers'][$i] = $server;
                                }
                        } else {
                                $flags = DBO_DEFAULT;
@@ -88,7 +105,6 @@ abstract class MWLBFactory {
                                        'user' => $mainConfig->get( 'DBuser' ),
                                        'password' => $mainConfig->get( 'DBpassword' ),
                                        'dbname' => $mainConfig->get( 'DBname' ),
-                                       'schema' => $mainConfig->get( 'DBmwschema' ),
                                        'tablePrefix' => $mainConfig->get( 'DBprefix' ),
                                        'type' => $mainConfig->get( 'DBtype' ),
                                        'load' => 1,
@@ -96,12 +112,18 @@ abstract class MWLBFactory {
                                        'sqlMode' => $mainConfig->get( 'SQLMode' ),
                                        'utf8Mode' => $mainConfig->get( 'DBmysql5' )
                                ];
+                               if ( in_array( $server['type'], $typesWithSchema, true ) ) {
+                                       $server += [ 'schema' => $mainConfig->get( 'DBmwschema' ) ];
+                               }
                                if ( $server['type'] === 'sqlite' ) {
                                        $server[ 'dbDirectory'] = $mainConfig->get( 'SQLiteDataDir' );
                                } elseif ( $server['type'] === 'postgres' ) {
                                        $server['port'] = $mainConfig->get( 'DBport' );
                                        // Work around the reserved word usage in MediaWiki schema
                                        $server['keywordTableMap'] = [ 'user' => 'mwuser', 'text' => 'pagecontent' ];
+                               } elseif ( $server['type'] === 'mssql' ) {
+                                       $server['port'] = $mainConfig->get( 'DBport' );
+                                       $server['useWindowsAuth'] = $mainConfig->get( 'DBWindowsAuthentication' );
                                }
                                $lbConf['servers'] = [ $server ];
                        }
@@ -110,7 +132,9 @@ abstract class MWLBFactory {
                        }
                } elseif ( $lbConf['class'] === 'LBFactoryMulti' ) {
                        if ( isset( $lbConf['serverTemplate'] ) ) {
-                               $lbConf['serverTemplate']['schema'] = $mainConfig->get( 'DBmwschema' );
+                               if ( in_array( $lbConf['serverTemplate']['type'], $typesWithSchema, true ) ) {
+                                       $lbConf['serverTemplate']['schema'] = $mainConfig->get( 'DBmwschema' );
+                               }
                                $lbConf['serverTemplate']['sqlMode'] = $mainConfig->get( 'SQLMode' );
                                $lbConf['serverTemplate']['utf8Mode'] = $mainConfig->get( 'DBmysql5' );
                        }
@@ -160,6 +184,17 @@ abstract class MWLBFactory {
                        );
                }
 
+               // For configuration backward compatibility after moving classes to namespaces (1.29)
+               $compat = [
+                       'LBFactorySingle' => Wikimedia\Rdbms\LBFactorySingle::class,
+                       'LBFactorySimple' => Wikimedia\Rdbms\LBFactorySimple::class,
+                       'LBFactoryMulti' => Wikimedia\Rdbms\LBFactoryMulti::class
+               ];
+
+               if ( isset( $compat[$class] ) ) {
+                       $class = $compat[$class];
+               }
+
                return $class;
        }
 }
diff --git a/includes/db/ORAField.php b/includes/db/ORAField.php
new file mode 100644 (file)
index 0000000..df31000
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+use Wikimedia\Rdbms\Field;
+
+class ORAField implements Field {
+       private $name, $tablename, $default, $max_length, $nullable,
+               $is_pk, $is_unique, $is_multiple, $is_key, $type;
+
+       function __construct( $info ) {
+               $this->name = $info['column_name'];
+               $this->tablename = $info['table_name'];
+               $this->default = $info['data_default'];
+               $this->max_length = $info['data_length'];
+               $this->nullable = $info['not_null'];
+               $this->is_pk = isset( $info['prim'] ) && $info['prim'] == 1 ? 1 : 0;
+               $this->is_unique = isset( $info['uniq'] ) && $info['uniq'] == 1 ? 1 : 0;
+               $this->is_multiple = isset( $info['nonuniq'] ) && $info['nonuniq'] == 1 ? 1 : 0;
+               $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
+               $this->type = $info['data_type'];
+       }
+
+       function name() {
+               return $this->name;
+       }
+
+       function tableName() {
+               return $this->tablename;
+       }
+
+       function defaultValue() {
+               return $this->default;
+       }
+
+       function maxLength() {
+               return $this->max_length;
+       }
+
+       function isNullable() {
+               return $this->nullable;
+       }
+
+       function isKey() {
+               return $this->is_key;
+       }
+
+       function isMultipleKey() {
+               return $this->is_multiple;
+       }
+
+       function type() {
+               return $this->type;
+       }
+}
diff --git a/includes/db/ORAResult.php b/includes/db/ORAResult.php
new file mode 100644 (file)
index 0000000..07c6fc7
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * 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
+ * Oracle-specific bits, like converting column names back to lowercase.
+ * @ingroup Database
+ */
+class ORAResult {
+       private $rows;
+       private $cursor;
+       private $nrows;
+
+       private $columns = [];
+
+       private function array_unique_md( $array_in ) {
+               $array_out = [];
+               $array_hashes = [];
+
+               foreach ( $array_in as $item ) {
+                       $hash = md5( serialize( $item ) );
+                       if ( !isset( $array_hashes[$hash] ) ) {
+                               $array_hashes[$hash] = $hash;
+                               $array_out[] = $item;
+                       }
+               }
+
+               return $array_out;
+       }
+
+       /**
+        * @param IDatabase $db
+        * @param resource $stmt A valid OCI statement identifier
+        * @param bool $unique
+        */
+       function __construct( &$db, $stmt, $unique = false ) {
+               $this->db =& $db;
+
+               $this->nrows = oci_fetch_all( $stmt, $this->rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW | OCI_NUM );
+               if ( $this->nrows === false ) {
+                       $e = oci_error( $stmt );
+                       $db->reportQueryError( $e['message'], $e['code'], '', __METHOD__ );
+                       $this->free();
+
+                       return;
+               }
+
+               if ( $unique ) {
+                       $this->rows = $this->array_unique_md( $this->rows );
+                       $this->nrows = count( $this->rows );
+               }
+
+               if ( $this->nrows > 0 ) {
+                       foreach ( $this->rows[0] as $k => $v ) {
+                               $this->columns[$k] = strtolower( oci_field_name( $stmt, $k + 1 ) );
+                       }
+               }
+
+               $this->cursor = 0;
+               oci_free_statement( $stmt );
+       }
+
+       public function free() {
+               unset( $this->db );
+       }
+
+       public function seek( $row ) {
+               $this->cursor = min( $row, $this->nrows );
+       }
+
+       public function numRows() {
+               return $this->nrows;
+       }
+
+       public function numFields() {
+               return count( $this->columns );
+       }
+
+       public function fetchObject() {
+               if ( $this->cursor >= $this->nrows ) {
+                       return false;
+               }
+               $row = $this->rows[$this->cursor++];
+               $ret = new stdClass();
+               foreach ( $row as $k => $v ) {
+                       $lc = $this->columns[$k];
+                       $ret->$lc = $v;
+               }
+
+               return $ret;
+       }
+
+       public function fetchRow() {
+               if ( $this->cursor >= $this->nrows ) {
+                       return false;
+               }
+
+               $row = $this->rows[$this->cursor++];
+               $ret = [];
+               foreach ( $row as $k => $v ) {
+                       $lc = $this->columns[$k];
+                       $ret[$lc] = $v;
+                       $ret[$k] = $v;
+               }
+
+               return $ret;
+       }
+}
index dde678f..87656f2 100644 (file)
@@ -147,8 +147,6 @@ class MWDebug {
         * @param string $log 'production' will always trigger a php error, 'auto'
         *    will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
         *    will only write to the debug log(s).
-        *
-        * @return mixed
         */
        public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE, $log = 'auto' ) {
                global $wgDevelopmentWarnings;
index 4614c46..baf4637 100644 (file)
@@ -378,7 +378,7 @@ class LegacyLogger extends AbstractLogger {
                        if ( is_nan( $item ) ) {
                                return 'NaN';
                        }
-                       return $item;
+                       return (string)$item;
                }
 
                if ( is_scalar( $item ) ) {
index ce0cda1..2700daa 100644 (file)
@@ -138,9 +138,7 @@ class AvroFormatter implements FormatterInterface {
                                $this->schemas[$channel]['schema'] = AvroSchema::parse( $schema );
                        } else {
                                $this->schemas[$channel]['schema'] = AvroSchema::real_parse(
-                                       $schema,
-                                       null,
-                                       new AvroNamedSchemata()
+                                       $schema
                                );
                        }
                }
index 1ba6c1f..000b526 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class for managing the deferred updates
index 6aa3831..7215696 100644 (file)
@@ -24,7 +24,7 @@ use Wikimedia\ScopedCallback;
 
 /**
  * Update object handling the cleanup of links tables after a page was deleted.
- **/
+ */
 class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
        /** @var WikiPage */
        protected $page;
index 229a9a2..464c908 100644 (file)
@@ -154,7 +154,9 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                $this->mRecursive = $recursive;
 
-               Hooks::run( 'LinksUpdateConstructed', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $linksUpdate = $this;
+               Hooks::run( 'LinksUpdateConstructed', [ &$linksUpdate ] );
        }
 
        /**
@@ -169,7 +171,9 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                        $scopedLock = self::acquirePageLock( $this->getDB(), $this->mId );
                }
 
-               Hooks::run( 'LinksUpdate', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $linksUpdate = $this;
+               Hooks::run( 'LinksUpdate', [ &$linksUpdate ] );
                $this->doIncrementalUpdate();
 
                // Commit and release the lock (if set)
@@ -177,7 +181,9 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                // Run post-commit hooks without DBO_TRX
                $this->getDB()->onTransactionIdle(
                        function () {
-                               Hooks::run( 'LinksUpdateComplete', [ &$this, $this->ticket ] );
+                               // Avoid PHP 7.1 warning from passing $this by reference
+                               $linksUpdate = $this;
+                               Hooks::run( 'LinksUpdateComplete', [ &$linksUpdate, $this->ticket ] );
                        },
                        __METHOD__
                );
diff --git a/includes/deferred/WANCacheReapUpdate.php b/includes/deferred/WANCacheReapUpdate.php
new file mode 100644 (file)
index 0000000..33ddc59
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+
+use Psr\Log\LoggerInterface;
+
+/**
+ * Class for fixing stale WANObjectCache keys using a purge event source
+ *
+ * This is useful for expiring keys that missed fire-and-forget purges. This uses the
+ * recentchanges table as a reliable stream to make certain keys reach consistency
+ * as soon as the underlying replica database catches up. These means that critical
+ * keys will not escape getting purged simply due to brief hiccups in the network,
+ * which are more prone to happen accross datacenters.
+ *
+ * ----
+ * "I was trying to cheat death. I was only trying to surmount for a little while the
+ * darkness that all my life I surely knew was going to come rolling in on me some day
+ * and obliterate me. I was only to stay alive a little brief while longer, after I was
+ * already gone. To stay in the light, to be with the living, a little while past my time."
+ *   -- Notes for "Blues of a Lifetime", by [[Cornell Woolrich]]
+ *
+ * @since 1.28
+ */
+class WANCacheReapUpdate implements DeferrableUpdate {
+       /** @var IDatabase */
+       private $db;
+       /** @var LoggerInterface */
+       private $logger;
+
+       /**
+        * @param IDatabase $db
+        * @param LoggerInterface $logger
+        */
+       public function __construct( IDatabase $db, LoggerInterface $logger ) {
+               $this->db = $db;
+               $this->logger = $logger;
+       }
+
+       function doUpdate() {
+               $reaper = new WANObjectCacheReaper(
+                       ObjectCache::getMainWANInstance(),
+                       ObjectCache::getLocalClusterInstance(),
+                       [ $this, 'getTitleChangeEvents' ],
+                       [ $this, 'getEventAffectedKeys' ],
+                       [
+                               'channel' => 'table:recentchanges:' . $this->db->getWikiID(),
+                               'logger' => $this->logger
+                       ]
+               );
+
+               $reaper->invoke( 100 );
+       }
+
+       /**
+        * @see WANObjectCacheRepear
+        *
+        * @param int $start
+        * @param int $id
+        * @param int $end
+        * @param int $limit
+        * @return TitleValue[]
+        */
+       public function getTitleChangeEvents( $start, $id, $end, $limit ) {
+               $db = $this->db;
+               $encStart = $db->addQuotes( $db->timestamp( $start ) );
+               $encEnd = $db->addQuotes( $db->timestamp( $end ) );
+               $id = (int)$id; // cast NULL => 0 since rc_id is an integer
+
+               $res = $db->select(
+                       'recentchanges',
+                       [ 'rc_namespace', 'rc_title', 'rc_timestamp', 'rc_id' ],
+                       [
+                               $db->makeList( [
+                                       "rc_timestamp > $encStart",
+                                       "rc_timestamp = $encStart AND rc_id > " . $db->addQuotes( $id )
+                               ], LIST_OR ),
+                               "rc_timestamp < $encEnd"
+                       ],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'rc_timestamp ASC, rc_id ASC', 'LIMIT' => $limit ]
+               );
+
+               $events = [];
+               foreach ( $res as $row ) {
+                       $events[] = [
+                               'id' => (int)$row->rc_id,
+                               'pos' => (int)wfTimestamp( TS_UNIX, $row->rc_timestamp ),
+                               'item' => new TitleValue( (int)$row->rc_namespace, $row->rc_title )
+                       ];
+               }
+
+               return $events;
+       }
+
+       /**
+        * Gets a list of important cache keys associated with a title
+        *
+        * @see WANObjectCacheRepear
+        * @param WANObjectCache $cache
+        * @param TitleValue $t
+        * @returns string[]
+        */
+       public function getEventAffectedKeys( WANObjectCache $cache, TitleValue $t ) {
+               /** @var WikiPage[]|LocalFile[]|User[] $entities */
+               $entities = [];
+
+               $entities[] = WikiPage::factory( Title::newFromTitleValue( $t ) );
+               if ( $t->inNamespace( NS_FILE ) ) {
+                       $entities[] = wfLocalFile( $t->getText() );
+               }
+               if ( $t->inNamespace( NS_USER ) ) {
+                       $entities[] = User::newFromName( $t->getText(), false );
+               }
+
+               $keys = [];
+               foreach ( $entities as $entity ) {
+                       if ( $entity ) {
+                               $keys = array_merge( $keys, $entity->getMutableCacheKeys( $cache ) );
+                       }
+               }
+               if ( $keys ) {
+                       $this->logger->debug( __CLASS__ . ': got key(s) ' . implode( ', ', $keys ) );
+               }
+
+               return $keys;
+       }
+}
index d38319e..a08bd9e 100644 (file)
@@ -67,7 +67,7 @@ abstract class DiffOp {
 
        /**
         * @param int $i
-        * @return string|null
+        * @return string[]|string|null
         */
        public function getClosing( $i = null ) {
                if ( $i === null ) {
index babd00b..25d50d3 100644 (file)
@@ -182,7 +182,7 @@ class DiffEngine {
                        }
 
                        while ( $i < $len && !$changed[$i] ) {
-                               assert( $j < $other_len && ! $other_changed[$j] );
+                               assert( $j < $other_len && !$other_changed[$j] );
                                $i++;
                                $j++;
                                while ( $j < $other_len && $other_changed[$j] ) {
@@ -247,7 +247,7 @@ class DiffEngine {
                                                $i++;
                                        }
 
-                                       assert( $j < $other_len && ! $other_changed[$j] );
+                                       assert( $j < $other_len && !$other_changed[$j] );
                                        $j++;
                                        if ( $j < $other_len && $other_changed[$j] ) {
                                                $corresponding = $i;
index a5a8676..5367199 100644 (file)
@@ -210,7 +210,7 @@ class DifferenceEngine extends ContextSource {
                if ( $link ) {
                        return "[$link $id]";
                } else {
-                       return $id;
+                       return (string)$id;
                }
        }
 
@@ -247,8 +247,9 @@ class DifferenceEngine extends ContextSource {
                Hooks::run( 'DifferenceEngineShowDiffPage', [ $out ] );
 
                if ( !$this->loadRevisionData() ) {
-                       $this->showMissingRevision();
-
+                       if ( Hooks::run( 'DifferenceEngineShowDiffPageMaybeShowMissingRevision', [ $this ] ) ) {
+                               $this->showMissingRevision();
+                       }
                        return;
                }
 
@@ -481,7 +482,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return string HTML or empty string
         */
-       protected function markPatrolledLink() {
+       public function markPatrolledLink() {
                if ( $this->mMarkPatrolledLink === null ) {
                        $linkInfo = $this->getMarkPatrolledLinkInfo();
                        // If false, there is no patrol link needed/allowed
@@ -601,28 +602,7 @@ class DifferenceEngine extends ContextSource {
                        $out->setRevisionTimestamp( $this->mNewRev->getTimestamp() );
                        $out->setArticleFlag( true );
 
-                       // NOTE: only needed for B/C: custom rendering of JS/CSS via hook
-                       if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
-                               // This needs to be synchronised with Article::showCssOrJsPage(), which sucks
-                               // Give hooks a chance to customise the output
-                               // @todo standardize this crap into one function
-                               if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', [ $this->mNewContent, $this->mNewPage, $out ], '1.24' ) ) {
-                                       // NOTE: deprecated hook, B/C only
-                                       // use the content object's own rendering
-                                       $cnt = $this->mNewRev->getContent();
-                                       $po = $cnt ? $cnt->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() ) : null;
-                                       if ( $po ) {
-                                               $out->addParserOutputContent( $po );
-                                       }
-                               }
-                       } elseif ( !Hooks::run( 'ArticleContentViewCustom', [ $this->mNewContent, $this->mNewPage, $out ] ) ) {
-                               // Handled by extension
-                       } elseif ( !ContentHandler::runLegacyHooks(
-                               'ArticleViewCustom',
-                               [ $this->mNewContent, $this->mNewPage, $out ],
-                               '1.21'
-                       ) ) {
-                               // NOTE: deprecated hook, B/C only
+                       if ( !Hooks::run( 'ArticleContentViewCustom', [ $this->mNewContent, $this->mNewPage, $out ] ) ) {
                                // Handled by extension
                        } else {
                                // Normal page
@@ -782,8 +762,11 @@ class DifferenceEngine extends ContextSource {
 
                $difftext = $this->generateContentDiffBody( $this->mOldContent, $this->mNewContent );
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $diffEngine = $this;
+
                // Save to cache for 7 days
-               if ( !Hooks::run( 'AbortDiffCache', [ &$this ] ) ) {
+               if ( !Hooks::run( 'AbortDiffCache', [ &$diffEngine ] ) ) {
                        wfIncrStats( 'diff_cache.uncacheable' );
                } elseif ( $key !== false && $difftext !== false ) {
                        wfIncrStats( 'diff_cache.miss' );
@@ -1002,7 +985,7 @@ class DifferenceEngine extends ContextSource {
        public function localiseLineNumbers( $text ) {
                return preg_replace_callback(
                        '/<!--LINE (\d+)-->/',
-                       [ &$this, 'localiseLineNumbersCb' ],
+                       [ $this, 'localiseLineNumbersCb' ],
                        $text
                );
        }
@@ -1085,7 +1068,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return string HTML fragment
         */
-       protected function getRevisionHeader( Revision $rev, $complete = '' ) {
+       public function getRevisionHeader( Revision $rev, $complete = '' ) {
                $lang = $this->getLanguage();
                $user = $this->getUser();
                $revtimestamp = $rev->getTimestamp();
@@ -1390,6 +1373,7 @@ class DifferenceEngine extends ContextSource {
 
                if ( $this->mNewRev ) {
                        $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       Hooks::run( 'DifferenceEngineLoadTextAfterNewContentIsLoaded', [ $this ] );
                        if ( $this->mNewContent === null ) {
                                return false;
                        }
@@ -1416,6 +1400,8 @@ class DifferenceEngine extends ContextSource {
 
                $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 
+               Hooks::run( 'DifferenceEngineAfterLoadNewText', [ $this ] );
+
                return true;
        }
 
index 2f502d8..9b5a268 100644 (file)
@@ -24,7 +24,7 @@
  * @since 1.7
  * @ingroup Exception
  */
-class ErrorPageError extends MWException {
+class ErrorPageError extends MWException implements ILocalizedException {
        public $title, $msg, $params;
 
        /**
@@ -43,15 +43,23 @@ class ErrorPageError extends MWException {
                // customized by the local wiki. So get the default English version for
                // passing to the parent constructor. Our overridden report() below
                // makes sure that the page shown to the user is not forced to English.
-               if ( $msg instanceof Message ) {
-                       $enMsg = clone $msg;
-               } else {
-                       $enMsg = wfMessage( $msg, $params );
-               }
+               $enMsg = $this->getMessageObject();
                $enMsg->inLanguage( 'en' )->useDatabase( false );
                parent::__construct( $enMsg->text() );
        }
 
+       /**
+        * Return a Message object for this exception
+        * @since 1.29
+        * @return Message
+        */
+       public function getMessageObject() {
+               if ( $this->msg instanceof Message ) {
+                       return clone $this->msg;
+               }
+               return wfMessage( $this->msg, $this->params );
+       }
+
        public function report() {
                global $wgOut;
 
diff --git a/includes/exception/LocalizedException.php b/includes/exception/LocalizedException.php
new file mode 100644 (file)
index 0000000..cbdb53e
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Interface for MediaWiki-localized exceptions
+ *
+ * @since 1.29
+ * @ingroup Exception
+ */
+interface ILocalizedException {
+       /**
+        * Return a Message object for this exception
+        * @return Message
+        */
+       public function getMessageObject();
+}
+
+/**
+ * Basic localized exception.
+ *
+ * @since 1.29
+ * @ingroup Exception
+ * @note Don't use this in a situation where MessageCache is not functional.
+ */
+class LocalizedException extends Exception implements ILocalizedException {
+       /** @var string|array|MessageSpecifier */
+       protected $messageSpec;
+
+       /**
+        * @param string|array|MessageSpecifier $messageSpec See Message::newFromSpecifier
+        * @param int $code Exception code
+        * @param Exception|Throwable $previous The previous exception used for the exception chaining.
+        */
+       public function __construct( $messageSpec, $code = 0, $previous = null ) {
+               $this->messageSpec = $messageSpec;
+
+               // Exception->getMessage() should be in plain English, not localized.
+               // So fetch the English version of the message, without local
+               // customizations, and make a basic attempt to turn markup into text.
+               $msg = $this->getMessageObject()->inLanguage( 'en' )->useDatabase( false )->text();
+               $msg = preg_replace( '!</?(var|kbd|samp|code)>!', '"', $msg );
+               $msg = html_entity_decode( strip_tags( $msg ), ENT_QUOTES | ENT_HTML5 );
+               parent::__construct( $msg, $code, $previous );
+       }
+
+       public function getMessageObject() {
+               return Message::newFromSpecifier( $this->messageSpec );
+       }
+}
diff --git a/includes/exception/MWContentSerializationException.php b/includes/exception/MWContentSerializationException.php
new file mode 100644 (file)
index 0000000..500cf7c
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Exception representing a failure to serialize or unserialize a content object.
+ *
+ * @ingroup Content
+ */
+class MWContentSerializationException extends MWException {
+}
index 3d8ddb8..44ab0e4 100644 (file)
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Psr\Log\LogLevel;
 
 /**
  * Handler class for MWExceptions
  * @ingroup Exception
  */
 class MWExceptionHandler {
+       const CAUGHT_BY_HANDLER = 'mwe_handler'; // error reported by this exception handler
+       const CAUGHT_BY_OTHER = 'other'; // error reported by direct logException() call
 
        /**
         * @var string $reservedMemory
@@ -130,10 +133,10 @@ class MWExceptionHandler {
                        // which would result in an exception loop. PHP may escalate such
                        // errors to "Exception thrown without a stack frame" fatals, but
                        // it's better to be explicit here.
-                       self::logException( $e2 );
+                       self::logException( $e2, self::CAUGHT_BY_HANDLER );
                }
 
-               self::logException( $e );
+               self::logException( $e, self::CAUGHT_BY_HANDLER );
                self::report( $e );
 
                // Exit value should be nonzero for the benefit of shell jobs
@@ -172,31 +175,37 @@ class MWExceptionHandler {
                switch ( $level ) {
                        case E_RECOVERABLE_ERROR:
                                $levelName = 'Error';
+                               $severity = LogLevel::ERROR;
                                break;
                        case E_WARNING:
                        case E_CORE_WARNING:
                        case E_COMPILE_WARNING:
                        case E_USER_WARNING:
                                $levelName = 'Warning';
+                               $severity = LogLevel::WARNING;
                                break;
                        case E_NOTICE:
                        case E_USER_NOTICE:
                                $levelName = 'Notice';
+                               $severity = LogLevel::INFO;
                                break;
                        case E_STRICT:
                                $levelName = 'Strict Standards';
+                               $severity = LogLevel::DEBUG;
                                break;
                        case E_DEPRECATED:
                        case E_USER_DEPRECATED:
                                $levelName = 'Deprecated';
+                               $severity = LogLevel::INFO;
                                break;
                        default:
                                $levelName = 'Unknown error';
+                               $severity = LogLevel::ERROR;
                                break;
                }
 
                $e = new ErrorException( "PHP $levelName: $message", 0, $level, $file, $line );
-               self::logError( $e, 'error' );
+               self::logError( $e, 'error', $severity );
 
                // This handler is for logging only. Return false will instruct PHP
                // to continue regular handling.
@@ -293,6 +302,7 @@ TXT;
                                'trace' => static::redactTrace( $trace ),
                        ],
                        'exception_id' => wfRandomString( 8 ),
+                       'caught_by' => self::CAUGHT_BY_HANDLER
                ] );
 
                // Remember call so we don't double process via HHVM's fatal
@@ -464,12 +474,14 @@ TXT;
         * logger.
         *
         * @param Exception|Throwable $e
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         * @return array
         */
-       public static function getLogContext( $e ) {
+       public static function getLogContext( $e, $catcher = self::CAUGHT_BY_OTHER ) {
                return [
                        'exception' => $e,
                        'exception_id' => WebRequest::getRequestId(),
+                       'caught_by' => $catcher
                ];
        }
 
@@ -481,11 +493,13 @@ TXT;
         * will be redacted as per getRedactedTraceAsArray().
         *
         * @param Exception|Throwable $e
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         * @return array
         * @since 1.26
         */
-       public static function getStructuredExceptionData( $e ) {
+       public static function getStructuredExceptionData( $e, $catcher = self::CAUGHT_BY_OTHER ) {
                global $wgLogExceptionBacktrace;
+
                $data = [
                        'id' => WebRequest::getRequestId(),
                        'type' => get_class( $e ),
@@ -494,6 +508,7 @@ TXT;
                        'message' => $e->getMessage(),
                        'code' => $e->getCode(),
                        'url' => self::getURL() ?: null,
+                       'caught_by' => $catcher
                ];
 
                if ( $e instanceof ErrorException &&
@@ -509,7 +524,7 @@ TXT;
 
                $previous = $e->getPrevious();
                if ( $previous !== null ) {
-                       $data['previous'] = self::getStructuredExceptionData( $previous );
+                       $data['previous'] = self::getStructuredExceptionData( $previous, $catcher );
                }
 
                return $data;
@@ -566,11 +581,17 @@ TXT;
         * @param Exception|Throwable $e
         * @param bool $pretty Add non-significant whitespace to improve readability (default: false).
         * @param int $escaping Bitfield consisting of FormatJson::.*_OK class constants.
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         * @return string|false JSON string if successful; false upon failure
         */
-       public static function jsonSerializeException( $e, $pretty = false, $escaping = 0 ) {
-               $data = self::getStructuredExceptionData( $e );
-               return FormatJson::encode( $data, $pretty, $escaping );
+       public static function jsonSerializeException(
+               $e, $pretty = false, $escaping = 0, $catcher = self::CAUGHT_BY_OTHER
+       ) {
+               return FormatJson::encode(
+                       self::getStructuredExceptionData( $e, $catcher ),
+                       $pretty,
+                       $escaping
+               );
        }
 
        /**
@@ -581,16 +602,17 @@ TXT;
         *
         * @since 1.22
         * @param Exception|Throwable $e
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         */
-       public static function logException( $e ) {
+       public static function logException( $e, $catcher = self::CAUGHT_BY_OTHER ) {
                if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
                        $logger = LoggerFactory::getInstance( 'exception' );
                        $logger->error(
                                self::getLogMessage( $e ),
-                               self::getLogContext( $e )
+                               self::getLogContext( $e, $catcher )
                        );
 
-                       $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
+                       $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK, $catcher );
                        if ( $json !== false ) {
                                $logger = LoggerFactory::getInstance( 'exception-json' );
                                $logger->error( $json, [ 'private' => true ] );
@@ -606,25 +628,30 @@ TXT;
         * @since 1.25
         * @param ErrorException $e
         * @param string $channel
+        * @param string $level
        */
-       protected static function logError( ErrorException $e, $channel ) {
+       protected static function logError(
+               ErrorException $e, $channel, $level = LogLevel::ERROR
+       ) {
+               $catcher = self::CAUGHT_BY_HANDLER;
                // The set_error_handler callback is independent from error_reporting.
                // Filter out unwanted errors manually (e.g. when
                // MediaWiki\suppressWarnings is active).
                $suppressed = ( error_reporting() & $e->getSeverity() ) === 0;
                if ( !$suppressed ) {
                        $logger = LoggerFactory::getInstance( $channel );
-                       $logger->error(
+                       $logger->log(
+                               $level,
                                self::getLogMessage( $e ),
-                               self::getLogContext( $e )
+                               self::getLogContext( $e, $catcher )
                        );
                }
 
                // Include all errors in the json log (surpressed errors will be flagged)
-               $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
+               $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK, $catcher );
                if ( $json !== false ) {
                        $logger = LoggerFactory::getInstance( "{$channel}-json" );
-                       $logger->error( $json, [ 'private' => true ] );
+                       $logger->log( $level, $json, [ 'private' => true ] );
                }
 
                Hooks::run( 'LogException', [ $e, $suppressed ] );
index c0f1e84..a569bcd 100644 (file)
@@ -60,7 +60,9 @@ class MWExceptionRenderer {
                                                        MWExceptionHandler::getLogMessage( $eNew ) .
                                                "\nBacktrace:\n" . MWExceptionHandler::getRedactedTraceAsString( $eNew );
                                } else {
-                                       $message .= "Exception caught inside exception handler.\n\n" .
+                                       $message .= 'Original exception: ' .
+                                               MWExceptionHandler::getPublicLogMessage( $e );
+                                       $message .= "\n\nException caught inside exception handler.\n\n" .
                                                self::getShowBacktraceError( $e );
                                }
                                $message .= "\n";
@@ -205,14 +207,14 @@ class MWExceptionRenderer {
         */
        public static function getHTML( $e ) {
                if ( self::showBackTrace( $e ) ) {
-                       $html = "<div class=\"errorbox\"><p>" .
+                       $html = "<div class=\"errorbox mw-content-ltr\"><p>" .
                                nl2br( htmlspecialchars( MWExceptionHandler::getLogMessage( $e ) ) ) .
                                '</p><p>Backtrace:</p><p>' .
                                nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $e ) ) ) .
                                "</p></div>\n";
                } else {
                        $logId = WebRequest::getRequestId();
-                       $html = "<div class=\"errorbox\">" .
+                       $html = "<div class=\"errorbox mw-content-ltr\">" .
                                '[' . $logId . '] ' .
                                gmdate( 'Y-m-d H:i:s' ) . ": " .
                                self::msg( "internalerror-fatal-exception",
diff --git a/includes/exception/MWUnknownContentModelException.php b/includes/exception/MWUnknownContentModelException.php
new file mode 100644 (file)
index 0000000..df7111a
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Exception thrown when an unregistered content model is requested. This error
+ * can be triggered by user input, so a separate exception class is provided so
+ * callers can substitute a context-specific, internationalised error message.
+ *
+ * @ingroup Content
+ * @since 1.27
+ */
+class MWUnknownContentModelException extends MWException {
+       /** @var string The name of the unknown content model */
+       private $modelId;
+
+       /** @param string $modelId */
+       function __construct( $modelId ) {
+               parent::__construct( "The content model '$modelId' is not registered on this wiki.\n" .
+                       'See https://www.mediawiki.org/wiki/Content_handlers to find out which extensions ' .
+                       'handle this content model.' );
+               $this->modelId = $modelId;
+       }
+       /** @return string */
+       public function getModelId() {
+               return $this->modelId;
+       }
+}
index e31374c..cc69a76 100644 (file)
@@ -45,10 +45,10 @@ class PermissionsError extends ErrorPageError {
                $this->permission = $permission;
 
                if ( !count( $errors ) ) {
-                       $groups = array_map(
-                               [ 'User', 'makeGroupLinkWiki' ],
-                               User::getGroupsWithPermission( $this->permission )
-                       );
+                       $groups = [];
+                       foreach ( User::getGroupsWithPermission( $this->permission ) as $group ) {
+                               $groups[] = UserGroupMembership::getLink( $group, RequestContext::getMain(), 'wiki' );
+                       }
 
                        if ( $groups ) {
                                $errors[] = [ 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) ];
@@ -58,6 +58,9 @@ class PermissionsError extends ErrorPageError {
                }
 
                $this->errors = $errors;
+
+               // Give the parent class something to work with
+               parent::__construct( 'permissionserrors', Message::newFromSpecifier( $errors[0] ) );
        }
 
        public function report() {
index ab26803..52bf0f0 100644 (file)
@@ -38,7 +38,7 @@ class XmlDumpWriter {
         * @return string
         */
        function openStream() {
-               global $wgLanguageCode;
+               global $wgContLang;
                $ver = WikiExporter::schemaVersion();
                return Xml::element( 'mediawiki', [
                        'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
@@ -56,7 +56,7 @@ class XmlDumpWriter {
                        'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
                                "http://www.mediawiki.org/xml/export-$ver.xsd",
                        'version'            => $ver,
-                       'xml:lang'           => $wgLanguageCode ],
+                       'xml:lang'           => $wgContLang->getHtmlCode() ],
                        null ) .
                        "\n" .
                        $this->siteInfo();
@@ -269,7 +269,9 @@ class XmlDumpWriter {
                        $out .= "      <sha1/>\n";
                }
 
-               Hooks::run( 'XmlDumpWriterWriteRevision', [ &$this, &$out, $row, $text ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $writer = $this;
+               Hooks::run( 'XmlDumpWriterWriteRevision', [ &$writer, &$out, $row, $text ] );
 
                $out .= "    </revision>\n";
 
index 7e93299..d907c30 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * DB accessable external objects.
  *
@@ -105,19 +107,17 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @param string $cluster Cluster name
         * @return LoadBalancer
         */
-       function getLoadBalancer( $cluster ) {
-               $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
-
-               return wfGetLBFactory()->getExternalLB( $cluster, $wiki );
+       private function getLoadBalancer( $cluster ) {
+               return wfGetLBFactory()->getExternalLB( $cluster );
        }
 
        /**
         * Get a replica DB connection for the specified cluster
         *
         * @param string $cluster Cluster name
-        * @return IDatabase
+        * @return DBConnRef
         */
-       function getSlave( $cluster ) {
+       public function getSlave( $cluster ) {
                global $wgDefaultExternalStore;
 
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
@@ -140,13 +140,13 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Get a master database connection for the specified cluster
         *
         * @param string $cluster Cluster name
-        * @return IDatabase
+        * @return MaintainableDBConnRef
         */
-       function getMaster( $cluster ) {
+       public function getMaster( $cluster ) {
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
                $lb = $this->getLoadBalancer( $cluster );
 
-               $db = $lb->getConnectionRef( DB_MASTER, [], $wiki );
+               $db = $lb->getMaintenanceConnectionRef( DB_MASTER, [], $wiki );
                $db->clearFlag( DBO_TRX ); // sanity
 
                return $db;
@@ -158,7 +158,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @param IDatabase $db
         * @return string Table name ('blobs' by default)
         */
-       function getTable( $db ) {
+       public function getTable( $db ) {
                $table = $db->getLBInfo( 'blobs table' );
                if ( is_null( $table ) ) {
                        $table = 'blobs';
@@ -175,9 +175,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @param string $id
         * @param string $itemID
         * @return HistoryBlob|bool Returns false if missing
-        * @private
         */
-       function fetchBlob( $cluster, $id, $itemID ) {
+       private function fetchBlob( $cluster, $id, $itemID ) {
                /**
                 * One-step cache variable to hold base blobs; operations that
                 * pull multiple revisions may often pull multiple times from
@@ -230,7 +229,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @return array A map from the blob_id's requested to their content.
         *   Unlocated ids are not represented
         */
-       function batchFetchBlobs( $cluster, array $ids ) {
+       private function batchFetchBlobs( $cluster, array $ids ) {
                $dbr = $this->getSlave( $cluster );
                $res = $dbr->select( $this->getTable( $dbr ),
                        [ 'blob_id', 'blob_text' ], [ 'blob_id' => array_keys( $ids ) ], __METHOD__ );
index 2e06c40..62e635d 100644 (file)
@@ -22,6 +22,8 @@
  * @author Aaron Schulz
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Version of FileJournal that logs to a DB table
  * @since 1.20
@@ -180,7 +182,7 @@ class DBFileJournal extends FileJournal {
        protected function getMasterDB() {
                if ( !$this->dbw ) {
                        // Get a separate connection in autocommit mode
-                       $lb = wfGetLBFactory()->newMainLB();
+                       $lb =  MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->newMainLB();
                        $this->dbw = $lb->getConnection( DB_MASTER, [], $this->wiki );
                        $this->dbw->clearFlag( DBO_TRX );
                }
diff --git a/includes/filerepo/FSRepo.php b/includes/filerepo/FSRepo.php
deleted file mode 100644 (file)
index d06acf2..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * A repository for files accessible via the local filesystem.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileRepo
- */
-
-/**
- * A repository for files accessible via the local filesystem.
- * Does not support database access or registration.
- *
- * This is a mostly a legacy class. New uses should not be added.
- *
- * @ingroup FileRepo
- * @deprecated since 1.19
- */
-class FSRepo extends FileRepo {
-       /**
-        * @param array $info
-        * @throws MWException
-        */
-       function __construct( array $info ) {
-               if ( !isset( $info['backend'] ) ) {
-                       // B/C settings...
-                       $directory = $info['directory'];
-                       $deletedDir = isset( $info['deletedDir'] )
-                               ? $info['deletedDir']
-                               : false;
-                       $thumbDir = isset( $info['thumbDir'] )
-                               ? $info['thumbDir']
-                               : "{$directory}/thumb";
-                       $transcodedDir = isset( $info['transcodedDir'] )
-                               ? $info['transcodedDir']
-                               : "{$directory}/transcoded";
-                       $fileMode = isset( $info['fileMode'] )
-                               ? $info['fileMode']
-                               : 0644;
-
-                       $repoName = $info['name'];
-                       // Get the FS backend configuration
-                       $backend = new FSFileBackend( [
-                               'name' => $info['name'] . '-backend',
-                               'wikiId' => wfWikiID(),
-                               'lockManager' => LockManagerGroup::singleton( wfWikiID() )->get( 'fsLockManager' ),
-                               'containerPaths' => [
-                                       "{$repoName}-public" => "{$directory}",
-                                       "{$repoName}-temp" => "{$directory}/temp",
-                                       "{$repoName}-thumb" => $thumbDir,
-                                       "{$repoName}-transcoded" => $transcodedDir,
-                                       "{$repoName}-deleted" => $deletedDir
-                               ],
-                               'fileMode' => $fileMode,
-                               'tmpDirectory' => wfTempDir()
-                       ] );
-                       // Update repo config to use this backend
-                       $info['backend'] = $backend;
-               }
-
-               parent::__construct( $info );
-
-               if ( !( $this->backend instanceof FSFileBackend ) ) {
-                       throw new MWException( "FSRepo only supports FSFileBackend." );
-               }
-       }
-}
index 66dab99..0e4b2f0 100644 (file)
@@ -99,7 +99,7 @@ class FileRepo {
         */
        protected $pathDisclosureProtection = 'simple';
 
-       /** @var bool Public zone URL. */
+       /** @var string|false Public zone URL. */
        protected $url;
 
        /** @var string The base thumbnail URL. Defaults to "<url>/thumb". */
@@ -309,7 +309,7 @@ class FileRepo {
         * @return bool Whether non-ASCII path characters are allowed
         */
        public function backendSupportsUnicodePaths() {
-               return ( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
+               return (bool)( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
        }
 
        /**
@@ -737,7 +737,7 @@ class FileRepo {
         * constructor, whereas local repositories use the local Title functions.
         *
         * @param string $name
-        * @return string
+        * @return string|false
         */
        public function getDescriptionUrl( $name ) {
                $encName = wfUrlencode( $name );
@@ -771,7 +771,7 @@ class FileRepo {
         *
         * @param string $name Name of image to fetch
         * @param string $lang Language to fetch it in, if any.
-        * @return string
+        * @return string|false
         */
        public function getDescriptionRenderUrl( $name, $lang = null ) {
                $query = 'action=render';
@@ -1059,7 +1059,7 @@ class FileRepo {
 
        /**
         * Pick a random name in the temp zone and store a file to it.
-        * Returns a FileRepoStatus object with the file Virtual URL in the value,
+        * Returns a Status object with the file Virtual URL in the value,
         * file can later be disposed using FileRepo::freeTemp().
         *
         * @param string $originalName The base name of the file as specified
@@ -1143,7 +1143,7 @@ class FileRepo {
         * Copy or move a file either from a storage path, virtual URL,
         * or file system path, into this repository at the specified destination location.
         *
-        * Returns a FileRepoStatus object. On success, the value contains "new" or
+        * Returns a Status object. On success, the value contains "new" or
         * "archived", to indicate whether the file was new with that name.
         *
         * Options to $options include:
@@ -1924,12 +1924,3 @@ class FileRepo {
                return $this->supportsSha1URLs;
        }
 }
-
-/**
- * FileRepo for temporary files created via FileRepo::getTempRepo()
- */
-class TempFileRepo extends FileRepo {
-       public function getTempRepo() {
-               throw new MWException( "Cannot get a temp repo from a temp repo." );
-       }
-}
index 4176c82..ca41718 100644 (file)
@@ -109,7 +109,7 @@ class ForeignAPIRepo extends FileRepo {
         *
         * @param Title $title
         * @param string|bool $time
-        * @return File
+        * @return File|false
         */
        function newFile( $title, $time = false ) {
                if ( $time ) {
index d47624f..2edd6d0 100644 (file)
@@ -334,7 +334,7 @@ class RepoGroup {
        /**
         * Get the repo instance by its name
         * @param string $name
-        * @return bool
+        * @return FileRepo|bool
         */
        function getRepoByName( $name ) {
                if ( !$this->reposInitialised ) {
diff --git a/includes/filerepo/TempFileRepo.php b/includes/filerepo/TempFileRepo.php
new file mode 100644 (file)
index 0000000..c9a6b59
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+/**
+ * FileRepo for temporary files created via FileRepo::getTempRepo()
+ */
+class TempFileRepo extends FileRepo {
+       public function getTempRepo() {
+               throw new MWException( "Cannot get a temp repo from a temp repo." );
+       }
+}
index 921e129..6984d48 100644 (file)
@@ -81,7 +81,7 @@ class ArchivedFile {
        /** @var string SHA-1 hash of file content */
        private $sha1;
 
-       /** @var string Number of pages of a multipage document, or false for
+       /** @var int|false Number of pages of a multipage document, or false for
         * documents which aren't multipage documents
         */
        private $pageCount;
@@ -492,26 +492,10 @@ class ArchivedFile {
                throw new MWException( "Unknown type '$type'." );
        }
 
-       /**
-        * Return the user name of the uploader.
-        *
-        * @deprecated since 1.23 Use getUser( 'text' ) instead.
-        * @return string
-        */
-       public function getUserText() {
-               wfDeprecated( __METHOD__, '1.23' );
-               $this->load();
-               if ( $this->isDeleted( File::DELETED_USER ) ) {
-                       return 0;
-               } else {
-                       return $this->user_text;
-               }
-       }
-
        /**
         * Return upload description.
         *
-        * @return string
+        * @return string|int
         */
        public function getDescription() {
                $this->load();
index c1d5573..be78462 100644 (file)
@@ -127,7 +127,7 @@ abstract class File implements IDBAccessObject {
        /** @var string Relative path including trailing slash */
        protected $hashPath;
 
-       /** @var string Number of pages of a multipage document, or false for
+       /** @var string|false Number of pages of a multipage document, or false for
         *    documents which aren't multipage documents
         */
        protected $pageCount;
@@ -535,7 +535,7 @@ abstract class File implements IDBAccessObject {
        /**
         * Get the duration of a media file in seconds
         *
-        * @return int
+        * @return float|int
         */
        public function getLength() {
                $handler = $this->getHandler();
@@ -909,7 +909,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param array $handlerParams
         *
-        * @return string
+        * @return ThumbnailImage|MediaTransformOutput|bool False on failure
         */
        function getUnscaledThumb( $handlerParams = [] ) {
                $hp =& $handlerParams;
@@ -1018,7 +1018,7 @@ abstract class File implements IDBAccessObject {
                        return $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                } else {
                        return new MediaTransformError( 'thumbnail_error',
-                               $params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
+                               $params['width'], 0, wfMessage( 'thumbnail-dest-create' ) );
                }
        }
 
@@ -1792,7 +1792,7 @@ abstract class File implements IDBAccessObject {
 
        /**
         * Move or copy a file to its public location. If a file exists at the
-        * destination, move it to an archive. Returns a FileRepoStatus object with
+        * destination, move it to an archive. Returns a Status object with
         * the archive name in the "value" member on success.
         *
         * The archive name should be passed through to recordUpload for database
@@ -1963,7 +1963,7 @@ abstract class File implements IDBAccessObject {
         * Returns the number of pages of a multipage document, or false for
         * documents which aren't multipage documents
         *
-        * @return bool|int
+        * @return string|bool|int
         */
        function pageCount() {
                if ( !isset( $this->pageCount ) ) {
@@ -1991,7 +1991,7 @@ abstract class File implements IDBAccessObject {
                if ( $srcWidth == 0 ) {
                        return 0;
                } else {
-                       return round( $srcHeight * $dstWidth / $srcWidth );
+                       return (int)round( $srcHeight * $dstWidth / $srcWidth );
                }
        }
 
@@ -2003,7 +2003,7 @@ abstract class File implements IDBAccessObject {
         *  a good reason. This method skips all caches.
         *
         * @param string $filePath The path to the file (e.g. From getLocalPathRef() )
-        * @return array The width, followed by height, with optionally more things after
+        * @return array|false The width, followed by height, with optionally more things after
         */
        function getImageSize( $filePath ) {
                if ( !$this->getHandler() ) {
@@ -2031,7 +2031,7 @@ abstract class File implements IDBAccessObject {
         * Get the HTML text of the description page, if available
         *
         * @param bool|Language $lang Optional language to fetch description in
-        * @return string
+        * @return string|false
         */
        function getDescriptionText( $lang = false ) {
                global $wgLang;
@@ -2122,7 +2122,7 @@ abstract class File implements IDBAccessObject {
        /**
         * Get the deletion archive key, "<sha1>.<ext>"
         *
-        * @return string
+        * @return string|false
         */
        function getStorageKey() {
                $hash = $this->getSha1();
index df50a67..f6f44e6 100644 (file)
@@ -120,10 +120,10 @@ class ForeignDBFile extends LocalFile {
        }
 
        /**
-        * @param bool|Language $lang Optional language to fetch description in.
-        * @return string
+        * @param Language|null $lang Optional language to fetch description in.
+        * @return string|false
         */
-       function getDescriptionText( $lang = false ) {
+       function getDescriptionText( $lang = null ) {
                global $wgLang;
 
                if ( !$this->repo->fetchDescription ) {
index 011ba87..8c088b9 100644 (file)
@@ -240,6 +240,15 @@ class LocalFile extends File {
                return $this->repo->getSharedCacheKey( 'file', sha1( $this->getName() ) );
        }
 
+       /**
+        * @param WANObjectCache $cache
+        * @return string[]
+        * @since 1.28
+        */
+       public function getMutableCacheKeys( WANObjectCache $cache ) {
+               return [ $this->getCacheKey() ];
+       }
+
        /**
         * Try to load file metadata from memcached, falling back to the database
         */
@@ -1061,7 +1070,9 @@ class LocalFile extends File {
                $opts['ORDER BY'] = "oi_timestamp $order";
                $opts['USE INDEX'] = [ 'oldimage' => 'oi_name_timestamp' ];
 
-               Hooks::run( 'LocalFile::getHistory', [ &$this, &$tables, &$fields,
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $localFile = $this;
+               Hooks::run( 'LocalFile::getHistory', [ &$localFile, &$tables, &$fields,
                        &$conds, &$opts, &$join_conds ] );
 
                $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $opts, $join_conds );
@@ -1572,7 +1583,7 @@ class LocalFile extends File {
 
        /**
         * Move or copy a file to its public location. If a file exists at the
-        * destination, move it to an archive. Returns a FileRepoStatus object with
+        * destination, move it to an archive. Returns a Status object with
         * the archive name in the "value" member on success.
         *
         * The archive name should be passed through to recordUpload for database
@@ -1590,7 +1601,7 @@ class LocalFile extends File {
        }
 
        /**
-        * Move or copy a file to a specified location. Returns a FileRepoStatus
+        * Move or copy a file to a specified location. Returns a Status
         * object with the archive name in the "value" member on success.
         *
         * The archive name should be passed through to recordUpload for database
@@ -2086,7 +2097,7 @@ class LocalFileDeleteBatch {
        /** @var bool Whether to suppress all suppressable fields when deleting */
        private $suppress;
 
-       /** @var FileRepoStatus */
+       /** @var Status */
        private $status;
 
        /** @var User */
@@ -2993,7 +3004,7 @@ class LocalFileMoveBatch {
        }
 
        /**
-        * Verify the database updates and return a new FileRepoStatus indicating how
+        * Verify the database updates and return a new Status indicating how
         * many rows would be updated.
         *
         * @return Status
@@ -3036,7 +3047,7 @@ class LocalFileMoveBatch {
        }
 
        /**
-        * Do the database updates and return a new FileRepoStatus indicating how
+        * Do the database updates and return a new Status indicating how
         * many rows where updated.
         */
        protected function doDBUpdates() {
index 3f0c932..f29c565 100644 (file)
@@ -34,4 +34,8 @@ class SlideshowImageGallery extends TraditionalImageGallery {
        protected function getModules() {
                return [ 'mediawiki.page.gallery.slideshow' ];
        }
+
+       public function setAdditionalOptions( $params ) {
+               $this->mAttribs['data-showthumbnails'] = isset( $params['showthumbnails'] );
+       }
 }
index 0f889da..1fd7b0a 100644 (file)
@@ -348,17 +348,3 @@ class TraditionalImageGallery extends ImageGalleryBase {
        protected function adjustImageParameters( $thumb, &$imageParameters ) {
        }
 }
-
-/**
- * Backwards compatibility. This always uses traditional mode
- * if called the old way, for extensions that may expect traditional
- * mode.
- *
- * @deprecated since 1.22 Use ImageGalleryBase::factory instead.
- */
-class ImageGallery extends TraditionalImageGallery {
-       function __construct( $mode = 'traditional' ) {
-               wfDeprecated( __METHOD__, '1.22' );
-               parent::__construct( $mode );
-       }
-}
index cadb502..179f6af 100644 (file)
@@ -165,6 +165,7 @@ class HTMLForm extends ContextSource {
                'url' => 'HTMLTextField',
                'title' => 'HTMLTitleTextField',
                'user' => 'HTMLUserTextField',
+               'usersmultiselect' => 'HTMLUsersMultiselectField',
        ];
 
        public $mFieldData;
@@ -604,10 +605,14 @@ class HTMLForm extends ContextSource {
         */
        public function trySubmit() {
                $valid = true;
-               $hoistedErrors = [];
-               $hoistedErrors[] = isset( $this->mValidationErrorMessage )
-                       ? $this->mValidationErrorMessage
-                       : [ 'htmlform-invalid-input' ];
+               $hoistedErrors = Status::newGood();
+               if ( $this->mValidationErrorMessage ) {
+                       foreach ( (array)$this->mValidationErrorMessage as $error ) {
+                               call_user_func_array( [ $hoistedErrors, 'fatal' ], $error );
+                       }
+               } else {
+                       $hoistedErrors->fatal( 'htmlform-invalid-input' );
+               }
 
                $this->mWasSubmitted = true;
 
@@ -634,15 +639,16 @@ class HTMLForm extends ContextSource {
                        if ( $res !== true ) {
                                $valid = false;
                                if ( $res !== false && !$field->canDisplayErrors() ) {
-                                       $hoistedErrors[] = [ 'rawmessage', $res ];
+                                       if ( is_string( $res ) ) {
+                                               $hoistedErrors->fatal( 'rawmessage', $res );
+                                       } else {
+                                               $hoistedErrors->fatal( $res );
+                                       }
                                }
                        }
                }
 
                if ( !$valid ) {
-                       if ( count( $hoistedErrors ) === 1 ) {
-                               $hoistedErrors = $hoistedErrors[0];
-                       }
                        return $hoistedErrors;
                }
 
@@ -1042,6 +1048,7 @@ class HTMLForm extends ContextSource {
                        : 'application/x-www-form-urlencoded';
                # Attributes
                $attribs = [
+                       'class' => 'mw-htmlform',
                        'action' => $this->getAction(),
                        'method' => $this->getMethod(),
                        'enctype' => $encType,
@@ -1055,6 +1062,9 @@ class HTMLForm extends ContextSource {
                if ( $this->mName ) {
                        $attribs['name'] = $this->mName;
                }
+               if ( $this->needsJSForHtml5FormValidation() ) {
+                       $attribs['novalidate'] = true;
+               }
                return $attribs;
        }
 
@@ -1074,7 +1084,7 @@ class HTMLForm extends ContextSource {
 
                return Html::rawElement(
                        'form',
-                       $this->getFormAttributes() + [ 'class' => 'visualClear' ],
+                       $this->getFormAttributes(),
                        $html
                );
        }
@@ -1870,4 +1880,22 @@ class HTMLForm extends ContextSource {
        protected function getMessage( $value ) {
                return Message::newFromSpecifier( $value )->setContext( $this );
        }
+
+       /**
+        * Whether this form, with its current fields, requires the user agent to have JavaScript enabled
+        * for the client-side HTML5 form validation to work correctly. If this function returns true, a
+        * 'novalidate' attribute will be added on the `<form>` element. It will be removed if the user
+        * agent has JavaScript support, in htmlform.js.
+        *
+        * @return boolean
+        * @since 1.29
+        */
+       public function needsJSForHtml5FormValidation() {
+               foreach ( $this->mFlatFields as $fieldname => $field ) {
+                       if ( $field->needsJSForHtml5FormValidation() ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
 }
index 8390a0b..487d6f6 100644 (file)
@@ -296,7 +296,7 @@ abstract class HTMLFormField {
         * @param string|array $value The value the field was submitted with
         * @param array $alldata The data collected from the form
         *
-        * @return bool|string True on success, or String error to display, or
+        * @return bool|string|Message True on success, or String/Message error to display, or
         *   false to fail validation without displaying an error.
         */
        public function validate( $value, $alldata ) {
@@ -308,7 +308,7 @@ abstract class HTMLFormField {
                        && $this->mParams['required'] !== false
                        && $value === ''
                ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                if ( isset( $this->mValidationCallback ) ) {
@@ -1034,7 +1034,7 @@ abstract class HTMLFormField {
         * with integer 0 as a value.
         *
         * @param array $array
-        * @return array
+        * @return array|string
         */
        public static function forceToStringRecursive( $array ) {
                if ( is_array( $array ) ) {
@@ -1194,4 +1194,19 @@ abstract class HTMLFormField {
        public function skipLoadData( $request ) {
                return !empty( $this->mParams['nodata'] );
        }
+
+       /**
+        * Whether this field requires the user agent to have JavaScript enabled for the client-side HTML5
+        * form validation to work correctly.
+        *
+        * @return boolean
+        * @since 1.29
+        */
+       public function needsJSForHtml5FormValidation() {
+               if ( $this->mHideIf ) {
+                       // This is probably more restrictive than it needs to be, but better safe than sorry
+                       return true;
+               }
+               return false;
+       }
 }
index 46b570d..54bdf04 100644 (file)
@@ -275,7 +275,7 @@ class OOUIHTMLForm extends HTMLForm {
 
        public function wrapForm( $html ) {
                $form = new OOUI\FormLayout( $this->getFormAttributes() + [
-                       'classes' => [ 'mw-htmlform-ooui' ],
+                       'classes' => [ 'mw-htmlform', 'mw-htmlform-ooui' ],
                        'content' => new OOUI\HtmlSnippet( $html ),
                ] );
 
index 5d9f7a0..325526b 100644 (file)
@@ -67,7 +67,7 @@ class VFormHTMLForm extends HTMLForm {
 
        protected function getFormAttributes() {
                $attribs = parent::getFormAttributes();
-               $attribs['class'] = [ 'mw-ui-vform', 'mw-ui-container', 'visualClear' ];
+               $attribs['class'] = [ 'mw-htmlform', 'mw-ui-vform', 'mw-ui-container' ];
                return $attribs;
        }
 
index b0890c6..63e77ce 100644 (file)
@@ -114,7 +114,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
                } elseif ( in_array( strval( $value ), $this->autocompleteData, true ) ) {
                        return true;
                } elseif ( $this->mParams['require-match'] ) {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
 
                return true;
index 64fe7ed..a19bd5a 100644 (file)
@@ -13,6 +13,9 @@
  *   of the value from 'default'. Overrides 'buttonlabel-raw'.
  * - buttonlabel-raw: HTMLto display for the button display text, instead
  *   of the value from 'default'.
+ * - formnovalidate: Set to true if clicking this button should suppress
+ *   client-side form validation. Used in HTMLFormFieldCloner for add/remove
+ *   buttons.
  *
  * Note that the buttonlabel parameters are not supported on IE6 and IE7 due to
  * bugs in those browsers. If detected, they will be served buttons using the
@@ -27,12 +30,18 @@ class HTMLButtonField extends HTMLFormField {
        /** @var array $mFlags Flags to add to OOUI Button widget */
        protected $mFlags = [];
 
+       protected $mFormnovalidate = false;
+
        public function __construct( $info ) {
                $info['nodata'] = true;
                if ( isset( $info['flags'] ) ) {
                        $this->mFlags = $info['flags'];
                }
 
+               if ( isset( $info['formnovalidate'] ) ) {
+                       $this->mFormnovalidate = $info['formnovalidate'];
+               }
+
                # Generate the label from a message, if possible
                if ( isset( $info['buttonlabel-message'] ) ) {
                        $this->buttonLabel = $this->getMessage( $info['buttonlabel-message'] )->parse();
@@ -71,6 +80,7 @@ class HTMLButtonField extends HTMLFormField {
                        'type' => $this->buttonType,
                        'name' => $this->mName,
                        'value' => $this->getDefault(),
+                       'formnovalidate' => $this->mFormnovalidate,
                ] + $this->getAttributes( [ 'disabled', 'tabindex' ] );
 
                if ( $this->isBadIE() ) {
@@ -113,7 +123,7 @@ class HTMLButtonField extends HTMLFormField {
         * @param string $value
         * @param array $alldata
         *
-        * @return bool
+        * @return bool|string|Message
         */
        public function validate( $value, $alldata ) {
                return true;
@@ -127,6 +137,6 @@ class HTMLButtonField extends HTMLFormField {
                $request = $this->mParent
                        ? $this->mParent->getRequest()
                        : RequestContext::getMain()->getRequest();
-               return preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
+               return (bool)preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
        }
 }
index 890cd7c..46172a5 100644 (file)
@@ -65,7 +65,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                if ( count( $validValues ) == count( $value ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
index 88dcd24..7b59a1d 100644 (file)
@@ -36,6 +36,11 @@ class HTMLDateTimeField extends HTMLTextField {
                        throw new InvalidArgumentException( "Invalid type '$this->mType'" );
                }
 
+               if ( $this->mPlaceholder === '' ) {
+                       // Messages: htmlform-date-placeholder htmlform-time-placeholder htmlform-datetime-placeholder
+                       $this->mPlaceholder = $this->msg( "htmlform-{$this->mType}-placeholder" )->text();
+               }
+
                $this->mClass .= ' mw-htmlform-datetime-field';
        }
 
@@ -43,31 +48,20 @@ class HTMLDateTimeField extends HTMLTextField {
                $parentList = array_diff( $list, [ 'min', 'max' ] );
                $ret = parent::getAttributes( $parentList );
 
-               if ( in_array( 'placeholder', $list ) && !isset( $ret['placeholder'] ) ) {
-                       // Messages: htmlform-date-placeholder htmlform-time-placeholder htmlform-datetime-placeholder
-                       $ret['placeholder'] = $this->msg( "htmlform-{$this->mType}-placeholder" )->text();
-               }
-
                if ( in_array( 'min', $list ) && isset( $this->mParams['min'] ) ) {
                        $min = $this->parseDate( $this->mParams['min'] );
                        if ( $min ) {
                                $ret['min'] = $this->formatDate( $min );
-                               // Because Html::expandAttributes filters it out
-                               $ret['data-min'] = $ret['min'];
                        }
                }
                if ( in_array( 'max', $list ) && isset( $this->mParams['max'] ) ) {
                        $max = $this->parseDate( $this->mParams['max'] );
                        if ( $max ) {
                                $ret['max'] = $this->formatDate( $max );
-                               // Because Html::expandAttributes filters it out
-                               $ret['data-max'] = $ret['max'];
                        }
                }
 
                $ret['step'] = 1;
-               // Because Html::expandAttributes filters it out
-               $ret['data-step'] = 1;
 
                $ret['type'] = $this->mType;
                $ret['pattern'] = static::$patterns[$this->mType];
@@ -100,15 +94,14 @@ class HTMLDateTimeField extends HTMLTextField {
                $date = $this->parseDate( $value );
                if ( !$date ) {
                        // Messages: htmlform-date-invalid htmlform-time-invalid htmlform-datetime-invalid
-                       return $this->msg( "htmlform-{$this->mType}-invalid" )->parseAsBlock();
+                       return $this->msg( "htmlform-{$this->mType}-invalid" );
                }
 
                if ( isset( $this->mParams['min'] ) ) {
                        $min = $this->parseDate( $this->mParams['min'] );
                        if ( $min && $date < $min ) {
                                // Messages: htmlform-date-toolow htmlform-time-toolow htmlform-datetime-toolow
-                               return $this->msg( "htmlform-{$this->mType}-toolow", $this->formatDate( $min ) )
-                                       ->parseAsBlock();
+                               return $this->msg( "htmlform-{$this->mType}-toolow", $this->formatDate( $min ) );
                        }
                }
 
@@ -116,8 +109,7 @@ class HTMLDateTimeField extends HTMLTextField {
                        $max = $this->parseDate( $this->mParams['max'] );
                        if ( $max && $date > $max ) {
                                // Messages: htmlform-date-toohigh htmlform-time-toohigh htmlform-datetime-toohigh
-                               return $this->msg( "htmlform-{$this->mType}-toohigh", $this->formatDate( $max ) )
-                                       ->parseAsBlock();
+                               return $this->msg( "htmlform-{$this->mType}-toohigh", $this->formatDate( $max ) );
                        }
                }
 
index d1250c0..d2d54e2 100644 (file)
@@ -20,7 +20,7 @@ class HTMLFloatField extends HTMLTextField {
                # https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers
                # with the addition that a leading '+' sign is ok.
                if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
-                       return $this->msg( 'htmlform-float-invalid' )->parseAsBlock();
+                       return $this->msg( 'htmlform-float-invalid' );
                }
 
                # The "int" part of these message names is rather confusing.
@@ -29,7 +29,7 @@ class HTMLFloatField extends HTMLTextField {
                        $min = $this->mParams['min'];
 
                        if ( $min > $value ) {
-                               return $this->msg( 'htmlform-int-toolow', $min )->parseAsBlock();
+                               return $this->msg( 'htmlform-int-toolow', $min );
                        }
                }
 
@@ -37,7 +37,7 @@ class HTMLFloatField extends HTMLTextField {
                        $max = $this->mParams['max'];
 
                        if ( $max < $value ) {
-                               return $this->msg( 'htmlform-int-toohigh', $max )->parseAsBlock();
+                               return $this->msg( 'htmlform-int-toohigh', $max );
                        }
                }
 
index 5d8f491..8fb840a 100644 (file)
@@ -57,6 +57,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                if ( isset( $this->mParams['fields']['delete'] ) ) {
                        $class = 'mw-htmlform-cloner-delete-button';
                        $info = $this->mParams['fields']['delete'] + [
+                               'formnovalidate' => true,
                                'cssclass' => $class
                        ];
                        unset( $info['name'], $info['class'] );
@@ -96,6 +97,17 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        } else {
                                $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" );
                        }
+                       // Copy the hide-if rules to "child" fields, so that the JavaScript code handling them
+                       // (resources/src/mediawiki/htmlform/hide-if.js) doesn't have to handle nested fields.
+                       if ( $this->mHideIf ) {
+                               if ( isset( $info['hide-if'] ) ) {
+                                       // Hide child field if either its rules say it's hidden, or parent's rules say it's hidden
+                                       $info['hide-if'] = [ 'OR', $info['hide-if'], $this->mHideIf ];
+                               } else {
+                                       // Hide child field if parent's rules say it's hidden
+                                       $info['hide-if'] = $this->mHideIf;
+                               }
+                       }
                        $field = HTMLForm::loadInputFromParameters( $name, $info, $this->mParent );
                        $fields[$fieldname] = $field;
                }
@@ -224,7 +236,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        && $this->mParams['required'] !== false
                        && !$values
                ) {
-                       return $this->msg( 'htmlform-cloner-required' )->parseAsBlock();
+                       return $this->msg( 'htmlform-cloner-required' );
                }
 
                if ( isset( $values['nonjs'] ) ) {
@@ -240,6 +252,9 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                if ( !array_key_exists( $fieldname, $value ) ) {
                                        continue;
                                }
+                               if ( $field->isHidden( $alldata ) ) {
+                                       continue;
+                               }
                                $ok = $field->validate( $value[$fieldname], $alldata );
                                if ( $ok !== true ) {
                                        return false;
@@ -296,6 +311,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                : 'htmlform-cloner-delete';
                        $field = HTMLForm::loadInputFromParameters( $name, [
                                'type' => 'submit',
+                               'formnovalidate' => true,
                                'name' => $name,
                                'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ),
                                'cssclass' => 'mw-htmlform-cloner-delete-button',
@@ -368,6 +384,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        : 'htmlform-cloner-create';
                $field = HTMLForm::loadInputFromParameters( $name, [
                        'type' => 'submit',
+                       'formnovalidate' => true,
                        'name' => $name,
                        'id' => Sanitizer::escapeId( "{$this->mID}--create" ),
                        'cssclass' => 'mw-htmlform-cloner-create-button',
index c87a778..02af7de 100644 (file)
@@ -18,7 +18,7 @@ class HTMLIntField extends HTMLFloatField {
                # input does not require its value to be numeric).  If you want a tidier
                # value to, eg, save in the DB, clean it up with intval().
                if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) ) ) {
-                       return $this->msg( 'htmlform-int-invalid' )->parseAsBlock();
+                       return $this->msg( 'htmlform-int-invalid' );
                }
 
                return true;
index 58de763..23044bd 100644 (file)
@@ -46,7 +46,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                if ( count( $validValues ) == count( $value ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
@@ -149,7 +149,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        /**
         * @param WebRequest $request
         *
-        * @return string
+        * @return string|array
         */
        public function loadDataFromRequest( $request ) {
                if ( $this->isSubmitAttempt( $request ) ) {
index 69dc617..06ec372 100644 (file)
@@ -27,7 +27,7 @@ class HTMLRadioField extends HTMLFormField {
                }
 
                if ( !is_string( $value ) && !is_int( $value ) ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
@@ -35,7 +35,7 @@ class HTMLRadioField extends HTMLFormField {
                if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
index 5a18025..dbf2c8f 100644 (file)
@@ -61,7 +61,7 @@ class HTMLRestrictionsField extends HTMLTextAreaField {
         * @param string|MWRestrictions $value The value the field was submitted with
         * @param array $alldata The data collected from the form
         *
-        * @return bool|string True on success, or String error to display, or
+        * @return bool|string|Message True on success, or String/Message error to display, or
         *   false to fail validation without displaying an error.
         */
        public function validate( $value, $alldata ) {
@@ -73,7 +73,7 @@ class HTMLRestrictionsField extends HTMLTextAreaField {
                        isset( $this->mParams['required'] ) && $this->mParams['required'] !== false
                        && $value instanceof MWRestrictions && !$value->toArray()['IPAddresses']
                ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                if ( is_string( $value ) ) {
@@ -87,7 +87,7 @@ class HTMLRestrictionsField extends HTMLTextAreaField {
                        if ( $status->isOK() ) {
                                $status->fatal( 'unknown-error' );
                        }
-                       return $status->getMessage()->parse();
+                       return $status->getMessage();
                }
 
                if ( isset( $this->mValidationCallback ) ) {
index 86e8e75..9af60e5 100644 (file)
@@ -125,7 +125,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        && $this->mParams['required'] !== false
                        && $value[1] === ''
                ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                return true;
index c1f8e42..18c741b 100644 (file)
@@ -16,7 +16,7 @@ class HTMLSelectField extends HTMLFormField {
                if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
index d94eb8d..5ad7ee3 100644 (file)
@@ -49,7 +49,7 @@ class HTMLSizeFilterField extends HTMLIntField {
        /**
         * @param WebRequest $request
         *
-        * @return string
+        * @return string|int
         */
        public function loadDataFromRequest( $request ) {
                $size = $request->getInt( $this->mName );
index e24541c..f58acbe 100644 (file)
@@ -6,7 +6,8 @@ class HTMLTagFilter extends HTMLFormField {
        protected $tagFilter;
 
        public function getTableRow( $value ) {
-               $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+               $this->tagFilter = ChangeTags::buildTagFilterSelector(
+                       $value, false, $this->mParent->getContext() );
                if ( $this->tagFilter ) {
                        return parent::getTableRow( $value );
                }
@@ -14,7 +15,8 @@ class HTMLTagFilter extends HTMLFormField {
        }
 
        public function getDiv( $value ) {
-               $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+               $this->tagFilter = ChangeTags::buildTagFilterSelector(
+                       $value, false, $this->mParent->getContext() );
                if ( $this->tagFilter ) {
                        return parent::getDiv( $value );
                }
index c3da746..b0b66ca 100644 (file)
@@ -187,6 +187,7 @@ class HTMLTextField extends HTMLFormField {
                        'name' => $this->mName,
                        'value' => $value,
                        'type' => $type,
+                       'dir' => $this->mDir,
                ] + $attribs );
        }
 
index a15b90e..3eb3f5d 100644 (file)
@@ -51,22 +51,22 @@ class HTMLTitleTextField extends HTMLTextField {
                        if ( $params ) {
                                $msg->params( $params );
                        }
-                       return $msg->parse();
+                       return $msg;
                }
 
                $text = $title->getPrefixedText();
                if ( $this->mParams['namespace'] !== false &&
                        !$title->inNamespace( $this->mParams['namespace'] )
                ) {
-                       return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text )->parse();
+                       return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text );
                }
 
                if ( $this->mParams['creatable'] && !$title->canExist() ) {
-                       return $this->msg( 'htmlform-title-not-creatable', $text )->escaped();
+                       return $this->msg( 'htmlform-title-not-creatable', $text );
                }
 
                if ( $this->mParams['exists'] && !$title->exists() ) {
-                       return $this->msg( 'htmlform-title-not-exists', $text )->parse();
+                       return $this->msg( 'htmlform-title-not-exists', $text );
                }
 
                return parent::validate( $value, $alldata );
index 14b5e59..12c09c1 100644 (file)
@@ -28,12 +28,12 @@ class HTMLUserTextField extends HTMLTextField {
                $user = User::newFromName( $value, false );
 
                if ( !$user ) {
-                       return $this->msg( 'htmlform-user-not-valid', $value )->parse();
+                       return $this->msg( 'htmlform-user-not-valid', $value );
                } elseif (
                        ( $this->mParams['exists'] && $user->getId() === 0 ) &&
                        !( $this->mParams['ipallowed'] && User::isIP( $value ) )
                ) {
-                       return $this->msg( 'htmlform-user-not-exists', $user->getName() )->parse();
+                       return $this->msg( 'htmlform-user-not-exists', $user->getName() );
                }
 
                return parent::validate( $value, $alldata );
diff --git a/includes/htmlform/fields/HTMLUsersMultiselectField.php b/includes/htmlform/fields/HTMLUsersMultiselectField.php
new file mode 100644 (file)
index 0000000..8c1241d
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+use MediaWiki\Widget\UsersMultiselectWidget;
+
+/**
+ * Implements a capsule multiselect input field for user names.
+ *
+ * Besides the parameters recognized by HTMLUserTextField, additional recognized
+ * parameters are:
+ *  default - (optional) Array of usernames to use as preset data
+ *  placeholder - (optional) Custom placeholder message for input
+ *
+ * The result is the array of usernames
+ *
+ * @note This widget is not likely to remain functional in non-OOUI forms.
+ */
+class HTMLUsersMultiselectField extends HTMLUserTextField {
+
+       public function loadDataFromRequest( $request ) {
+               if ( !$request->getCheck( $this->mName ) ) {
+                       return $this->getDefault();
+               }
+
+               $usersArray = explode( "\n", $request->getText( $this->mName ) );
+               // Remove empty lines
+               $usersArray = array_values( array_filter( $usersArray, function( $username ) {
+                       return trim( $username ) !== '';
+               } ) );
+               return $usersArray;
+       }
+
+       public function validate( $value, $alldata ) {
+               if ( !$this->mParams['exists'] ) {
+                       return true;
+               }
+
+               if ( is_null( $value ) ) {
+                       return false;
+               }
+
+               foreach ( $value as $username ) {
+                       $result = parent::validate( $username, $alldata );
+                       if ( $result !== true ) {
+                               return $result;
+                       }
+               }
+
+               return true;
+       }
+
+       public function getInputHTML( $values ) {
+               $this->mParent->getOutput()->enableOOUI();
+               return $this->getInputOOUI( $values );
+       }
+
+       public function getInputOOUI( $values ) {
+               $params = [ 'name' => $this->mName ];
+
+               if ( isset( $this->mParams['default'] ) ) {
+                       $params['default'] = $this->mParams['default'];
+               }
+
+               if ( isset( $this->mParams['placeholder'] ) ) {
+                       $params['placeholder'] = $this->mParams['placeholder'];
+               } else {
+                       $params['placeholder'] = $this->msg( 'mw-widgets-usersmultiselect-placeholder' )
+                                                       ->inContentLanguage()
+                                                       ->plain();
+               }
+
+               if ( !is_null( $values ) ) {
+                       $params['default'] = $values;
+               }
+
+               return new UsersMultiselectWidget( $params );
+       }
+
+       protected function shouldInfuseOOUI() {
+               return true;
+       }
+
+       protected function getOOUIModules() {
+               return [ 'mediawiki.widgets.UsersMultiselectWidget' ];
+       }
+
+}
index f58c3a9..f958ff6 100644 (file)
@@ -37,12 +37,17 @@ class CurlHttpRequest extends MWHttpRequest {
                return strlen( $content );
        }
 
+       /**
+        * @see MWHttpRequest::execute
+        *
+        * @throws MWException
+        * @return Status
+        */
        public function execute() {
-
-               parent::execute();
+               $this->prepare();
 
                if ( !$this->status->isOK() ) {
-                       return $this->status;
+                       return Status::wrap( $this->status ); // TODO B/C; move this to callers
                }
 
                $this->curlOptions[CURLOPT_PROXY] = $this->proxy;
@@ -102,7 +107,7 @@ class CurlHttpRequest extends MWHttpRequest {
                $curlHandle = curl_init( $this->url );
 
                if ( !curl_setopt_array( $curlHandle, $this->curlOptions ) ) {
-                       throw new MWException( "Error setting curl options." );
+                       throw new InvalidArgumentException( "Error setting curl options." );
                }
 
                if ( $this->followRedirects && $this->canFollowRedirects() ) {
@@ -140,7 +145,7 @@ class CurlHttpRequest extends MWHttpRequest {
                $this->parseHeader();
                $this->setStatus();
 
-               return $this->status;
+               return Status::wrap( $this->status );  // TODO B/C; move this to callers
        }
 
        /**
index 43ae2d0..779d606 100644 (file)
@@ -51,6 +51,8 @@ class 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
         * @param string $caller The method making this request, for profiling
         * @return string|bool (bool)false on failure or a string on success
         */
@@ -74,7 +76,7 @@ class Http {
                } else {
                        $errors = $status->getErrorsByType( 'error' );
                        $logger = LoggerFactory::getInstance( 'http' );
-                       $logger->warning( $status->getWikiText( false, false, 'en' ),
+                       $logger->warning( Status::wrap( $status )->getWikiText( false, false, 'en' ),
                                [ 'error' => $errors, 'caller' => $caller, 'content' => $req->getContent() ] );
                        return false;
                }
@@ -140,7 +142,7 @@ class Http {
         * @return bool
         */
        public static function isValidURI( $uri ) {
-               return preg_match(
+               return (bool)preg_match(
                        '/^https?:\/\/[^\/\s]\S*$/D',
                        $uri
                );
index 08883ae..fac052f 100644 (file)
@@ -46,9 +46,11 @@ class MWHttpRequest implements LoggerAwareInterface {
        protected $reqHeaders = [];
        protected $url;
        protected $parsedUrl;
+       /** @var callable  */
        protected $callback;
        protected $maxRedirects = 5;
        protected $followRedirects = false;
+       protected $connectTimeout;
 
        /**
         * @var CookieJar
@@ -60,7 +62,8 @@ class MWHttpRequest implements LoggerAwareInterface {
        protected $respStatus = "200 Ok";
        protected $respHeaders = [];
 
-       public $status;
+       /** @var StatusValue */
+       protected $status;
 
        /**
         * @var Profiler
@@ -98,9 +101,9 @@ class MWHttpRequest implements LoggerAwareInterface {
                }
 
                if ( !$this->parsedUrl || !Http::isValidURI( $this->url ) ) {
-                       $this->status = Status::newFatal( 'http-invalid-url', $url );
+                       $this->status = StatusValue::newFatal( 'http-invalid-url', $url );
                } else {
-                       $this->status = Status::newGood( 100 ); // continue
+                       $this->status = StatusValue::newGood( 100 ); // continue
                }
 
                if ( isset( $options['timeout'] ) && $options['timeout'] != 'default' ) {
@@ -116,6 +119,12 @@ class MWHttpRequest implements LoggerAwareInterface {
                if ( isset( $options['userAgent'] ) ) {
                        $this->setUserAgent( $options['userAgent'] );
                }
+               if ( isset( $options['username'] ) && isset( $options['password'] ) ) {
+                       $this->setHeader(
+                               'Authorization',
+                               'Basic ' . base64_encode( $options['username'] . ':' . $options['password'] )
+                       );
+               }
 
                $members = [ "postData", "proxy", "noProxy", "sslVerifyHost", "caInfo",
                                "method", "followRedirects", "maxRedirects", "sslVerifyCert", "callback" ];
@@ -161,7 +170,7 @@ class MWHttpRequest implements LoggerAwareInterface {
         * @param string $url Url to use
         * @param array $options (optional) extra params to pass (see Http::request())
         * @param string $caller The method making this request, for profiling
-        * @throws MWException
+        * @throws DomainException
         * @return CurlHttpRequest|PhpHttpRequest
         * @see MWHttpRequest::__construct
         */
@@ -169,7 +178,7 @@ class MWHttpRequest implements LoggerAwareInterface {
                if ( !Http::$httpEngine ) {
                        Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
                } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
-                       throw new MWException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
+                       throw new DomainException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
                                ' Http::$httpEngine is set to "curl"' );
                }
 
@@ -186,7 +195,7 @@ class MWHttpRequest implements LoggerAwareInterface {
                                return new CurlHttpRequest( $url, $options, $caller, Profiler::instance() );
                        case 'php':
                                if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
-                                       throw new MWException( __METHOD__ . ': allow_url_fopen ' .
+                                       throw new DomainException( __METHOD__ . ': allow_url_fopen ' .
                                                'needs to be enabled for pure PHP http requests to ' .
                                                'work. If possible, curl should be used instead. See ' .
                                                'http://php.net/curl.'
@@ -194,7 +203,7 @@ class MWHttpRequest implements LoggerAwareInterface {
                                }
                                return new PhpHttpRequest( $url, $options, $caller, Profiler::instance() );
                        default:
-                               throw new MWException( __METHOD__ . ': The setting of Http::$httpEngine is not valid.' );
+                               throw new DomainException( __METHOD__ . ': The setting of Http::$httpEngine is not valid.' );
                }
        }
 
@@ -222,7 +231,7 @@ class MWHttpRequest implements LoggerAwareInterface {
         *
         * @return void
         */
-       public function proxySetup() {
+       protected function proxySetup() {
                // If there is an explicit proxy set and proxies are not disabled, then use it
                if ( $this->proxy && !$this->noProxy ) {
                        return;
@@ -300,7 +309,7 @@ class MWHttpRequest implements LoggerAwareInterface {
         * Get an array of the headers
         * @return array
         */
-       public function getHeaderList() {
+       protected function getHeaderList() {
                $list = [];
 
                if ( $this->cookieJar ) {
@@ -333,12 +342,14 @@ class MWHttpRequest implements LoggerAwareInterface {
         * bytes are reported handled than were passed to you, the HTTP fetch
         * will be aborted.
         *
-        * @param callable $callback
-        * @throws MWException
+        * @param callable|null $callback
+        * @throws InvalidArgumentException
         */
        public function setCallback( $callback ) {
-               if ( !is_callable( $callback ) ) {
-                       throw new MWException( 'Invalid MwHttpRequest callback' );
+               if ( is_null( $callback ) ) {
+                       $callback = [ $this, 'read' ];
+               } elseif ( !is_callable( $callback ) ) {
+                       throw new InvalidArgumentException( __METHOD__ . ': invalid callback' );
                }
                $this->callback = $callback;
        }
@@ -350,6 +361,7 @@ class MWHttpRequest implements LoggerAwareInterface {
         * @param resource $fh
         * @param string $content
         * @return int
+        * @internal
         */
        public function read( $fh, $content ) {
                $this->content .= $content;
@@ -359,9 +371,14 @@ class MWHttpRequest implements LoggerAwareInterface {
        /**
         * Take care of whatever is necessary to perform the URI request.
         *
-        * @return Status
+        * @return StatusValue
+        * @note currently returns Status for B/C
         */
        public function execute() {
+               throw new LogicException( 'children must override this' );
+       }
+
+       protected function prepare() {
                $this->content = "";
 
                if ( strtoupper( $this->method ) == "HEAD" ) {
@@ -371,7 +388,7 @@ class MWHttpRequest implements LoggerAwareInterface {
                $this->proxySetup(); // set up any proxy as needed
 
                if ( !$this->callback ) {
-                       $this->setCallback( [ $this, 'read' ] );
+                       $this->setCallback( null );
                }
 
                if ( !isset( $this->reqHeaders['User-Agent'] ) ) {
@@ -494,6 +511,8 @@ class MWHttpRequest implements LoggerAwareInterface {
        /**
         * Tells the MWHttpRequest object to use this pre-loaded CookieJar.
         *
+        * To read response cookies from the jar, getCookieJar must be called first.
+        *
         * @param CookieJar $jar
         */
        public function setCookieJar( $jar ) {
@@ -519,14 +538,18 @@ class MWHttpRequest implements LoggerAwareInterface {
         * Set-Cookie headers.
         * @see Cookie::set
         * @param string $name
-        * @param mixed $value
+        * @param string $value
         * @param array $attr
         */
-       public function setCookie( $name, $value = null, $attr = null ) {
+       public function setCookie( $name, $value, $attr = [] ) {
                if ( !$this->cookieJar ) {
                        $this->cookieJar = new CookieJar;
                }
 
+               if ( $this->parsedUrl && !isset( $attr['domain'] ) ) {
+                       $attr['domain'] = $this->parsedUrl['host'];
+               }
+
                $this->cookieJar->setCookie( $name, $value, $attr );
        }
 
index 2af000f..3f3803b 100644 (file)
@@ -87,15 +87,20 @@ class PhpHttpRequest extends MWHttpRequest {
         * is completely useless (something like "fopen: failed to open stream")
         * so normal methods of handling errors programmatically
         * like get_last_error() don't work.
+        * @internal
         */
        public function errorHandler( $errno, $errstr ) {
                $n = count( $this->fopenErrors ) + 1;
                $this->fopenErrors += [ "errno$n" => $errno, "errstr$n" => $errstr ];
        }
 
+       /**
+        * @see MWHttpRequest::execute
+        *
+        * @return Status
+        */
        public function execute() {
-
-               parent::execute();
+               $this->prepare();
 
                if ( is_array( $this->postData ) ) {
                        $this->postData = wfArrayToCgi( $this->postData );
@@ -227,12 +232,12 @@ class PhpHttpRequest extends MWHttpRequest {
                                        . ': error opening connection: {errstr1}', $this->fopenErrors );
                        }
                        $this->status->fatal( 'http-request-error' );
-                       return $this->status;
+                       return Status::wrap( $this->status ); // TODO B/C; move this to callers
                }
 
                if ( $result['timed_out'] ) {
                        $this->status->fatal( 'http-timed-out', $this->url );
-                       return $this->status;
+                       return Status::wrap( $this->status ); // TODO B/C; move this to callers
                }
 
                // If everything went OK, or we received some error code
@@ -253,6 +258,6 @@ class PhpHttpRequest extends MWHttpRequest {
                }
                fclose( $fh );
 
-               return $this->status;
+               return Status::wrap( $this->status ); // TODO B/C; move this to callers
        }
 }
index e2e8dd5..8034400 100644 (file)
@@ -23,6 +23,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Imports a XML dump from a file (either from file upload, files on disk, or HTTP)
@@ -104,12 +105,21 @@ class ImportStreamSource implements ImportSource {
         * @return Status
         */
        static function newFromURL( $url, $method = 'GET' ) {
+               global $wgHTTPImportTimeout;
                wfDebug( __METHOD__ . ": opening $url\n" );
                # Use the standard HTTP fetch function; it times out
                # quicker and sorts out user-agent problems which might
                # otherwise prevent importing from large sites, such
                # as the Wikimedia cluster, etc.
-               $data = Http::request( $method, $url, [ 'followRedirects' => true ], __METHOD__ );
+               $data = Http::request(
+                       $method,
+                       $url,
+                       [
+                               'followRedirects' => true,
+                               'timeout' => $wgHTTPImportTimeout
+                       ],
+                       __METHOD__
+               );
                if ( $data !== false ) {
                        $file = tmpfile();
                        fwrite( $file, $data );
@@ -139,7 +149,8 @@ class ImportStreamSource implements ImportSource {
                # Look up the first interwiki prefix, and let the foreign site handle
                # subsequent interwiki prefixes
                $firstIwPrefix = strtok( $interwiki, ':' );
-               $firstIw = Interwiki::fetch( $firstIwPrefix );
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
+               $firstIw = $interwikiLookup->fetch( $firstIwPrefix );
                if ( !$firstIw ) {
                        return Status::newFatal( 'importbadinterwiki' );
                }
index d1a9bc5..1769924 100644 (file)
@@ -23,6 +23,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * XML file reader for the page data importer.
@@ -44,6 +45,8 @@ class WikiImporter {
        private $importTitleFactory;
        /** @var array */
        private $countableCache = [];
+       /** @var bool */
+       private $disableStatisticsUpdate = false;
 
        /**
         * Creates an ImportXMLReader drawing from the source provided
@@ -59,7 +62,7 @@ class WikiImporter {
                $this->reader = new XMLReader();
                if ( !$config ) {
                        wfDeprecated( __METHOD__ . ' without a Config instance', '1.25' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
 
@@ -302,6 +305,14 @@ class WikiImporter {
                $this->mImportUploads = $import;
        }
 
+       /**
+        * Statistics update can cause a lot of time
+        * @since 1.29
+        */
+       public function disableStatisticsUpdate() {
+               $this->disableStatisticsUpdate = true;
+       }
+
        /**
         * Default per-page callback. Sets up some things related to site statistics
         * @param array $titleAndForeignTitle Two-element array, with Title object at
@@ -380,21 +391,23 @@ class WikiImporter {
                // suffers from issues of replica DB lag. We let WikiPage handle the total page
                // and revision count, and we implement our own custom logic for the
                // article (content page) count.
-               $page = WikiPage::factory( $title );
-               $page->loadPageData( 'fromdbmaster' );
-               $content = $page->getContent();
-               if ( $content === null ) {
-                       wfDebug( __METHOD__ . ': Skipping article count adjustment for ' . $title .
-                               ' because WikiPage::getContent() returned null' );
-               } else {
-                       $editInfo = $page->prepareContentForEdit( $content );
-                       $countKey = 'title_' . $title->getPrefixedText();
-                       $countable = $page->isCountable( $editInfo );
-                       if ( array_key_exists( $countKey, $this->countableCache ) &&
-                               $countable != $this->countableCache[$countKey] ) {
-                               DeferredUpdates::addUpdate( SiteStatsUpdate::factory( [
-                                       'articles' => ( (int)$countable - (int)$this->countableCache[$countKey] )
-                               ] ) );
+               if ( !$this->disableStatisticsUpdate ) {
+                       $page = WikiPage::factory( $title );
+                       $page->loadPageData( 'fromdbmaster' );
+                       $content = $page->getContent();
+                       if ( $content === null ) {
+                               wfDebug( __METHOD__ . ': Skipping article count adjustment for ' . $title .
+                                       ' because WikiPage::getContent() returned null' );
+                       } else {
+                               $editInfo = $page->prepareContentForEdit( $content );
+                               $countKey = 'title_' . $title->getPrefixedText();
+                               $countable = $page->isCountable( $editInfo );
+                               if ( array_key_exists( $countKey, $this->countableCache ) &&
+                                       $countable != $this->countableCache[$countKey] ) {
+                                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( [
+                                               'articles' => ( (int)$countable - (int)$this->countableCache[$countKey] )
+                                       ] ) );
+                               }
                        }
                }
 
index 1e866f3..23db3e2 100644 (file)
@@ -315,12 +315,8 @@ class WikiRevision {
 
        /**
         * @return string
-        *
-        * @deprecated Since 1.21, use getContent() instead.
         */
        function getText() {
-               wfDeprecated( __METHOD__, '1.21' );
-
                return $this->text;
        }
 
index 50d73de..0305535 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\LBFactorySingle;
 
 /**
  * Base class for DBMS-specific installation helper classes.
index 6a702e9..6a8a99f 100644 (file)
@@ -32,8 +32,6 @@ require_once __DIR__ . '/../../maintenance/Maintenance.php';
  * @since 1.17
  */
 abstract class DatabaseUpdater {
-       protected static $updateCounter = 0;
-
        /**
         * Array of updates to perform on the database
         *
@@ -423,8 +421,6 @@ abstract class DatabaseUpdater {
         * @param array $what What updates to perform
         */
        public function doUpdates( $what = [ 'core', 'extensions', 'stats' ] ) {
-               global $wgVersion;
-
                $this->db->setSchemaVars( $this->getSchemaVars() );
 
                $what = array_flip( $what );
@@ -441,12 +437,9 @@ abstract class DatabaseUpdater {
                        $this->checkStats();
                }
 
-               $this->setAppliedUpdates( $wgVersion, $this->updates );
-
                if ( $this->fileHandle ) {
                        $this->skipSchema = false;
                        $this->writeSchemaUpdateFile();
-                       $this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
                }
        }
 
@@ -482,23 +475,6 @@ abstract class DatabaseUpdater {
                $this->updates = array_merge( $this->updates, $updatesDone );
        }
 
-       /**
-        * @param string $version
-        * @param array $updates
-        */
-       protected function setAppliedUpdates( $version, $updates = [] ) {
-               $this->db->clearFlag( DBO_DDLMODE );
-               if ( !$this->canUseNewUpdatelog() ) {
-                       return;
-               }
-               $key = "updatelist-$version-" . time() . self::$updateCounter;
-               self::$updateCounter++;
-               $this->db->insert( 'updatelog',
-                       [ 'ul_key' => $key, 'ul_value' => serialize( $updates ) ],
-                       __METHOD__ );
-               $this->db->setFlag( DBO_DDLMODE );
-       }
-
        /**
         * Helper function: check if the given key is present in the updatelog table.
         * Obviously, only use this for updates that occur after the updatelog table was
index 03f9974..9c87cf0 100644 (file)
@@ -567,7 +567,7 @@ abstract class Installer {
        /**
         * Determine if LocalSettings.php exists. If it does, return its variables.
         *
-        * @return array
+        * @return array|false
         */
        public static function getExistingLocalSettings() {
                global $IP;
@@ -1080,7 +1080,7 @@ abstract class Installer {
        /**
         * Convert a hex string representing a Unicode code point to that code point.
         * @param string $c
-        * @return string
+        * @return string|false
         */
        protected function unicodeChar( $c ) {
                $c = hexdec( $c );
@@ -1421,6 +1421,7 @@ abstract class Installer {
                $wgAutoloadClasses += $data['autoload'];
 
                $hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
+                       /** @suppress PhanUndeclaredVariable $wgHooks is set by DefaultSettings */
                        $wgHooks['LoadExtensionSchemaUpdates'] : [];
 
                if ( isset( $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
@@ -1655,8 +1656,13 @@ abstract class Installer {
         */
        protected function createMainpage( DatabaseInstaller $installer ) {
                $status = Status::newGood();
+               $title = Title::newMainPage();
+               if ( $title->exists() ) {
+                       $status->warning( 'config-install-mainpage-exists' );
+                       return $status;
+               }
                try {
-                       $page = WikiPage::factory( Title::newMainPage() );
+                       $page = WikiPage::factory( $title );
                        $content = new WikitextContent(
                                wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
                                wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
index a9e3e85..697188e 100644 (file)
@@ -109,7 +109,7 @@ class LocalSettingsGenerator {
         *
         * @param string $string
         *
-        * @return string
+        * @return string|false
         */
        public static function escapePhpString( $string ) {
                if ( is_array( $string ) || is_object( $string ) ) {
index 5e8ed3f..d6efeb2 100644 (file)
@@ -214,6 +214,7 @@ class MssqlInstaller extends DatabaseInstaller {
                try {
                        $db = Database::factory( 'mssql', [
                                'host' => $this->getVar( 'wgDBserver' ),
+                               'port' => $this->getVar( 'wgDBport' ),
                                'user' => $user,
                                'password' => $password,
                                'dbname' => false,
index 1175e9e..968ee15 100644 (file)
@@ -94,6 +94,9 @@ class MssqlUpdater extends DatabaseUpdater {
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
+
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                ];
        }
 
index 5ff47e9..7269773 100644 (file)
@@ -312,7 +312,7 @@ class MysqlInstaller extends DatabaseInstaller {
                                'IS_GRANTABLE' => 1,
                        ], __METHOD__ );
                foreach ( $res as $row ) {
-                       $regex = $conn->likeToRegex( $row->TABLE_SCHEMA );
+                       $regex = $this->likeToRegex( $row->TABLE_SCHEMA );
                        if ( preg_match( $regex, $this->getVar( 'wgDBname' ) ) ) {
                                unset( $grantOptions[$row->PRIVILEGE_TYPE] );
                        }
@@ -325,6 +325,19 @@ class MysqlInstaller extends DatabaseInstaller {
                return true;
        }
 
+       /**
+        * Convert a wildcard (as used in LIKE) to a regex
+        * Slashes are escaped, slash terminators included
+        */
+       protected function likeToRegex( $wildcard ) {
+               $r = preg_quote( $wildcard, '/' );
+               $r = strtr( $r, [
+                       '%' => '.*',
+                       '_' => '.'
+               ] );
+               return "/$r/s";
+       }
+
        /**
         * @return string
         */
index a637ce0..49bfac1 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\Field;
+use Wikimedia\Rdbms\MySQLField;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Mysql update list and mysql-specific update functions.
@@ -291,6 +294,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
                        [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ],
+
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+                       [ 'dropIndex', 'user_groups', 'ug_user_group', 'patch-user_groups-primary-key.sql' ],
+                       [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
                ];
        }
 
@@ -848,7 +856,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        foreach ( $res as $row ) {
                                $count = ( $count + 1 ) % 100;
                                if ( $count == 0 ) {
-                                       wfGetLBFactory()->waitForReplication( [ 'wiki' => wfWikiID() ] );
+                                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                                       $lbFactory->waitForReplication( [ 'wiki' => wfWikiID() ] );
                                }
                                $this->db->insert( 'templatelinks',
                                        [
index e1e0d0f..79ae175 100644 (file)
@@ -119,6 +119,10 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+                       [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
+
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
 
index 6dfa28b..906768f 100644 (file)
@@ -156,10 +156,13 @@ class PostgresInstaller extends DatabaseInstaller {
                try {
                        $db = Database::factory( 'postgres', [
                                'host' => $this->getVar( 'wgDBserver' ),
+                               'port' => $this->getVar( 'wgDBport' ),
                                'user' => $user,
                                'password' => $password,
                                'dbname' => $dbName,
-                               'schema' => $schema ] );
+                               'schema' => $schema,
+                               'keywordTableMap' => [ 'user' => 'mwuser', 'text' => 'pagecontent' ],
+                       ] );
                        $status->value = $db;
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-connection-error', $e->getMessage() );
index 790fbe7..e041fdd 100644 (file)
@@ -443,6 +443,13 @@ class PostgresUpdater extends DatabaseUpdater {
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('change_tag_ct_id_seq')" ],
                        [ 'addPgField', 'tag_summary', 'ts_id',
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('tag_summary_ts_id_seq')" ],
+
+                       // 1.29
+                       [ 'addPgField', 'externallinks', 'el_index_60', "BYTEA NOT NULL DEFAULT ''" ],
+                       [ 'addPgIndex', 'externallinks', 'el_index_60', '( el_index_60, el_id )' ],
+                       [ 'addPgIndex', 'externallinks', 'el_from_index_60', '( el_from, el_index_60, el_id )' ],
+                       [ 'addPgField', 'user_groups', 'ug_expiry', "TIMESTAMPTZ NULL" ],
+                       [ 'addPgIndex', 'user_groups', 'user_groups_expiry', '( ug_expiry )' ],
                ];
        }
 
index 388c034..cdbbfd0 100644 (file)
@@ -158,6 +158,10 @@ class SqliteUpdater extends DatabaseUpdater {
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
+
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+                       [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
                ];
        }
 
index 97d32cd..84c580f 100644 (file)
@@ -10,7 +10,8 @@
                        "محمد أحمد عبد الفتاح",
                        "Maroen1990",
                        "Super ninja2",
-                       "Zpizza"
+                       "Zpizza",
+                       "ديفيد"
                ]
        },
        "config-desc": "مثبت لميدياويكي",
        "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 MediaWiki home]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
        "config-env-good": "جرى التحقق من البيئة. يمكنك تنصيب ميدياويكي.",
        "config-env-bad": "جرى التحقق من البيئة. لا يمكنك تنصيب ميدياويكي.",
        "config-env-php": "بي إتش بي $1 مثبت.",
        "config-env-hhvm": "نصبت HHVM $1.",
+       "config-outdated-sqlite": "<strong>تحذير:</strong> لديك SQLite $1, which وهو أقل من الحد الأدنى المطلوب للنسخة $2. SQLite سوف يكون غير متوفر.",
+       "config-xcache": "تثبيت [http://xcache.lighttpd.net/ XCache]",
+       "config-apc": "تثبيت [http://www.php.net/apc APC]",
+       "config-apcu": "تثبيت [http://www.php.net/apcu APCu]",
+       "config-wincache": "تثبيت [http://www.iis.net/download/WinCacheForPhp WinCache]",
+       "config-diff3-bad": "جنو diff3 غير موجود.",
+       "config-imagemagick": "تم العثور على ImageMagick: <code>$1</code>.\nسيتم تمكين تصغير الصور إذا قمت بتمكين التحميل.",
+       "config-no-scaling": "لا يمكن أن تجد مكتبة GD أو ImageMagick; سيتم تعطيل تصغير الصور.",
+       "config-no-uri": "<strong>خطأ:</strong>  لا يمكن أن تحدد URI الحالي.تم  إحباط التثبيت.",
+       "config-using-server": "باستخدام اسم الخادم \"<nowiki>$1</nowiki\".",
+       "config-using-uri": "باستخدام URL الخادم \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "نوع قاعدة البيانات:",
        "config-db-host": "مضيف قاعدة البيانات:",
+       "config-db-host-oracle": "قاعدة بيانات TNS:",
        "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-db-name": "اسم قاعدة البيانات",
+       "config-db-name-help": "اختر الاسم الذي يعرف الويكي الخاص بك. لا يجب أن يحتوي على مسافات. إذا كنت تستخدم استضافة المواقع المشتركة، مزود الاستضافة إما سيعطيك اسم قاعدة بيانات محددة لاستخدامها أو سيتيح لك إنشاء قواعد بيانات عن طريق لوحة التحكم.",
        "config-db-name-oracle": "سكيما قاعدة البيانات:",
        "config-db-install-account": "حساب المستخدم للتنصيب",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
+       "config-db-install-username": "أدخل اسم المستخدم الذي سيتم استخدامه للاتصال بقاعدة البيانات أثناء عملية التثبيت. هذا ليس اسم مستخدم لحساب ميدياويكي. هذا اسم مستخدم لقاعدة البيانات الخاصة بك.",
+       "config-db-install-password": "أدخل كلمة المرور التي سيتم استخدامها للاتصال بقاعدة البيانات أثناء عملية التثبيت. ليست هذه كلمة مرور لحساب ميدياويكي. هذه كلمة مرور لقاعدة البيانات الخاصة بك.",
+       "config-db-install-help": "أدخل اسم المستخدم وكلمة المرور الذين سيتم استخدامهما للاتصال بقاعدة البيانات أثناء عملية التثبيت.",
+       "config-db-account-lock": "استخدم نفس اسم المستخدم وكلمة المرور أثناء التشغيل العادي",
+       "config-db-wiki-account": "حساب المستخدم للتشغيل العادي",
+       "config-db-wiki-help": "أدخل اسم المستخدم وكلمة المرور التي سيتم استخدامهما للاتصال بقاعدة البيانات أثناء عملية الويكي العادية. في حالة عدم وجود حساب وتثبيت الحساب لديه امتيازات كافية، سيتم إنشاء حساب المستخدم هذا مع الحد الأدنى من الامتيازات المطلوبة لتشغيل الويكي.",
        "config-db-prefix": "بادئة جدول قاعدة البيانات:",
+       "config-db-prefix-help": "إذا كنت بحاجة إلى مشاركة قاعدة بيانات واحدة بين ويكيات متعددة، أو بين ميدياويكي وتطبيق آخر على شبكة الإنترنت، يمكنك الاختيار لإضافة بادئة لجميع أسماء الجداول لتجنب النزاعات. لا تستخدم مسافات. وعادة ما يتم ترك هذا الحقل فارغا.",
+       "config-mysql-old": "MySQL $1 أو لاحق مطلوب.لديك $2.",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-db-schema": "سكيما لميدياويكي",
+       "config-db-schema-help": "هذا المخطط عادة يكون على ما يرام. غيره إذا كنت تعرف أنك في حاجة إلى هذا فقط.",
+       "config-pg-test-error": "لا يمكن الاتصال بقاعدة البيانات <strong>$1</strong>: $2",
+       "config-sqlite-dir": "دليل بيانات SQLite:",
+       "config-oracle-def-ts": "جدولية افتراضية:",
+       "config-oracle-temp-ts": "جدولية مؤقتة:",
        "config-type-mysql": "MySQL (أو متوافق)",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
        "config-type-mssql": "خادم SQL لميكروسوفت",
+       "config-support-info": "ميدياويكي يدعم نظم قواعد البيانات التالية: $1 إذا كنت لا ترى نظام قاعدة البيانات الذي تحاول استخدامه مدرجًا أدناه، اتبع الإرشادات المرتبطة فوق لتمكين الدعم.",
        "config-header-mysql": "إعدادات MySQL",
        "config-header-postgres": "إعدادات PostgreSQL",
        "config-header-sqlite": "إعدادات SQLite",
        "config-header-oracle": "إعدادات أوراكل",
+       "config-header-mssql": "إعدادات خادم Microsoft SQL",
        "config-invalid-db-type": "نوع قاعدة بيانات غير صحيح",
+       "config-missing-db-name": "يجب عليك إدخال قيمة ل\"{{int:config-db-name}}\".",
+       "config-missing-db-server-oracle": "يجب عليك إدخال قيمة ل\"{{int:config-db-host-oracle}}\".",
+       "config-connection-error": "$1.\nتحقق من المضيف، واسم المستخدم وكلمة المرور وحاول مرة أخرى.",
+       "config-db-sys-create-oracle": "المثبت يعتمد باستخدام حساب SYSDBA فقط لإنشاء حساب جديد.",
+       "config-db-sys-user-exists-oracle": "حساب المستخدم \"$1\" موجود بالفعل; يمكن استخدام SYSDBA لإنشاء حساب جديد فقط!",
+       "config-postgres-old": "PostgreSQL $1 أو لاحق مطلوب. لديك $2.",
+       "config-mssql-old": "خادم Microsoft SQL $1 أو لاحق مطلوب. لديك $2.",
+       "config-sqlite-mkdir-error": "خطأ في إنشاء دليل البيانات \"$1\". تحقق من الموقع وحاول مرة أخرى.",
+       "config-sqlite-connection-error": "1$.\nتحقق من اسم دليل البيانات وقواعد البيانات أدناه وحاول مرة أخرى.",
+       "config-sqlite-readonly": "الملف <code>$1</code> غير قابل للكتابة.",
+       "config-sqlite-cant-create-db": "لا يمكن إنشاء ملف قاعدة البيانات <code>$1</code>.",
+       "config-can-upgrade": "هناك جداول ميدياويكي في قاعدة البيانات هذه. للارتقاء بها إلى ميدياويكي $1; انقر على <strong>متابعة</strong>.",
+       "config-regenerate": "إعادة تكوين LocalSettings.php ←",
+       "config-show-table-status": "<code> إظهار جدول الحالة </code> فشل الاستعلام!",
+       "config-unknown-collation": "<strong>تحذير:</strong> قاعدة بيانات يستخدم ترتيبا غير معروف.",
        "config-db-web-account": "حساب قاعدة البيانات للوصول عبر الوب",
+       "config-db-web-help": "حدد اسم المستخدم وكلمة المرور التي سيستخدمهما خادم الويب للاتصال بخادم قاعدة البيانات، أثناء عملية الويكي العادية.",
        "config-db-web-account-same": "استعمل نفس الحساب للتنصيب",
        "config-db-web-create": "إنشئ حساب إذا لم يكن موجودا بالفعل",
        "config-db-web-no-create-privs": "الحساب الذي حددته لتركيب ليس لديه امتيازات كافية لإنشاء حساب.\nالحساب الذي حددته هنا موجود بالفعل.",
        "config-mysql-binary": "ثنائي",
        "config-mysql-utf8": "يو تي إف-8",
        "config-mssql-auth": "نوع الاستيثاق:",
+       "config-mssql-sqlauth": "مصادقة خادم SQL",
+       "config-mssql-windowsauth": "مصادقة ويندوز",
        "config-site-name": "اسم الويكي:",
        "config-site-name-blank": "أدخل اسم موقع.",
        "config-project-namespace": "نطاق المشروع:",
        "config-ns-site-name": "مثل اسم الويكي: $1",
        "config-ns-other": "أخرى (حدد)",
        "config-ns-other-default": "ماي ويكي",
+       "config-ns-invalid": "النطاق المحدد \"<nowiki>$1</nowiki>\" غير صالح.\nحدد نطاق مشروع مختلف.",
+       "config-ns-conflict": "النطاق المحدد \"<nowiki>$1</ nowiki>\" يتعارض مع نطاق ميدياويكي الافتراضي. حدد نطاق مشروع مختلف.",
        "config-admin-box": "حساب إداري",
        "config-admin-name": "اسم المستخدم:",
        "config-admin-password": "كلمة السر:",
        "config-admin-password-confirm": "كلمة المرور مرة أخرى:",
+       "config-admin-help": "أدخل اسم المستخدم المفضل لديك هنا، على سبيل المثال \"جو أشرف فاروق\". هذا هو الاسم الذي ستستخدمه لتسجيل الدخول إلى الويكي.",
        "config-admin-name-blank": "أدخل اسم مستخدم لإداري.",
+       "config-admin-name-invalid": "اسم المستخدم المحدد \"<nowiki>$1</ nowiki>\" غير صالح. حدد اسم مستخدم مختلفا.",
+       "config-admin-password-blank": "أدخل كلمة مرور حساب الإداري.",
        "config-admin-password-mismatch": "كلمات السر اثنين التي أدخلتها لا تتطابق.",
        "config-admin-email": "عنوان البريد الإلكتروني:",
        "config-admin-email-help": "إدخال عنوان البريد الإلكتروني هنا ليسمح لك لتلقي البريد الإلكتروني من المستخدمين الآخرين على ويكي، إعادة تعيين كلمة المرور الخاصة بك، ويتم إخطار من التغييرات للصفحات في قائمة مراقبتك. يمكنك ترك هذا الحقل فارغا.",
+       "config-admin-error-user": "خطأ داخلي عند إنشاء إداري باسم \"<nowiki>$1</ nowiki>\".",
+       "config-admin-error-password": "خطأ داخلي عند عند وضع كلمة مرور للإداري \"<nowiki>$1</nowiki>\": <pre>$2</pre>.",
        "config-admin-error-bademail": "لقد قمت بإدخال عنوان البريد الإلكتروني غير صالح.",
+       "config-subscribe": "اشترك في [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce نشر إعلانات القائمة البريدية].",
+       "config-subscribe-noemail": "حاولت الاشتراك في القائمة البريدية الخاصة بإصدار إعلانات دون تقديم عنوان بريد إلكتروني. يُرجَى إدخال عنوان بريد إلكتروني إذا كنت ترغب في الاشتراك في القائمة البريدية.",
+       "config-pingback": "تبادل البيانات حول هذا التثبيت مع مطوري ميدياويكي.",
+       "config-almost-done": "لقد شارفت على الانتهاء! يمكنك الآن تخطي التكوين المتبقي وتثبيت الويكي الآن.",
        "config-optional-continue": "اسألني المزيد من الأسئلة",
        "config-optional-skip": "إنني أشعر بالملل بالفعل، فقط قم بتثبيت الويكي",
        "config-profile": "ملف صلاحيات المستخدم:",
        "config-license-cc-by-sa": "المشاع الإبداعي النسبة للمؤلف المشاركة بالمثل",
        "config-license-cc-by": "المشاع الإبداعي النسبة للمؤلف",
        "config-license-cc-by-nc-sa": "المشاع الإبداعي النسبة للمؤلف غير تجاري المشاركة بالمثل",
+       "config-license-cc-0": "المشاع الإبداعي صفر (ملكية عامة)",
+       "config-license-gfdl": "رخصة جنو للوثائق الحرة 1.3 أو لاحقة",
        "config-license-pd": "ملكية عامة",
        "config-license-cc-choose": "اختر ترخيص مشاع إبداعي مخصص",
        "config-email-settings": "إعدادات البريد الإلكتروني",
        "config-enable-email": "تمكين البريد الإلكتروني الصادرة",
+       "config-enable-email-help": "إذا كنت تريد إرسال بريد إلكتروني إلى العمل، [http://www.php.net/manual/en/mail.configuration.php إعدات بريد PHP's] تحتاج لأن يتم تكوينها بشكل صحيح. إذا كنت لا تريد أيا من ميزات البريد الإلكتروني، يمكنك تعطيلها هنا.",
        "config-email-user": "تفعيل البريد الإلكتروني من المستخدم إلى مستخدم آخر",
        "config-email-user-help": "يتيح لكل المستخدمين إرسال رسائل بريد إلكتروني إلى بعضهم البعض إذا فعَّلوا هذا الخيار في تفضيلاتهم.",
        "config-email-usertalk": "فعل إخطارات صفحات نقاش المستخدمين",
+       "config-email-usertalk-help": "السماح للمستخدمين بتلقي الإخطارات بشأن تغييرات صفحة نقاش المستخدم، إذا كانوا قد مكنوها في تفضيلاتهم.",
        "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
+       "config-email-watchlist-help": "السماح للمستخدمين بالحصول على إشعارات حول صفحاتهم المراقبة إذا كانوا قد مكنوها في تفضيلاتهم.",
        "config-email-auth": "تمكين مصادقة البريد الإلكتروني",
        "config-email-sender": "يرجع عنوان البريد الإلكتروني:",
        "config-upload-settings": "الصور وتحميل الملفات",
        "config-upload-deleted": "المجلد للملفات المحذوفة:",
        "config-logo": "مسار الشعار:",
        "config-instantcommons": "تمكين الاستخدام الفوري لويكيميديا كومنز InstantCommons",
+       "config-cc-error": "لم يعطِ منتقي رخصة المشاع الإبداعي أية نتيجة; أدخل اسم الترخيص يدويا.",
        "config-cc-again": "اختر مجددًا",
+       "config-cc-not-chosen": "اختر أي ترخيص تريده ثم اضغط على \"متابعة\".",
        "config-advanced-settings": "ضبط متقدم",
        "config-cache-options": "إعدادات التخزين المؤقت الكائن:",
+       "config-cache-none": "لا يوجد تخزين مؤقت (لم تتم إزالة أية وظيفة، لكن قد تتأثر السرعة على مواقع ويكي أكبر)",
+       "config-cache-accel": "كائن التخزين المؤقت PHP (APC أو APCu أو  XCache أو WinCache)",
        "config-extensions": "امتدادات",
+       "config-extensions-help": "تم الكشف عن الملحقات المذكورة أعلاه في دليل <code>./ملحقاتك</code>، ويمكن أن يتطلب تكوينا إضافيا، ولكن يمكنك تمكينها الآن.",
        "config-skins": "الواجهات",
        "config-skins-use-as-default": "استخدم هذه الواجهة كافتراضية",
+       "config-install-alreadydone": "<strong>تحذير:</strong> يبدو أنك قد قمت بالفعل بتثبيت ميدياويكي وتحاول تثبيته مرة أخرى. الرجاء التوجه إلى الصفحة التالية.",
+       "config-install-begin": "عن طريق الضغط على \"{{int:config-continue}}\"، سوف تبدأ تثبيت ميدياويكي. إذا كنت لا تزال ترغب في إجراء تغييرات، اضغط على \"{{int:config-back}}\".",
        "config-install-step-done": "نفذ",
        "config-install-step-failed": "فشل",
        "config-install-extensions": "متضمنا الامتدادات",
        "config-install-database": "إنشاء قاعدة البيانات",
        "config-install-schema": "إنشاء السكيما",
+       "config-install-pg-schema-not-exist": "مخطط PostgreSQL غير موجود.",
        "config-install-pg-commit": "تنفيذ التغييرات",
+       "config-install-pg-plpgsql": "التحقق من لغة PL/pgSQL",
+       "config-pg-no-plpgsql": "تحتاج إلى تثبيت لغة PL/pgSQL في قاعدة البيانات $1",
+       "config-pg-no-create-privs": "الحساب الذي حددته للتنزيل ليست لديه امتيازات كافية لإنشاء حساب.",
        "config-install-user": "إنشاء مستخدم قاعدة البيانات",
        "config-install-user-alreadyexists": "المستخدم \"$1\" موجود بالفعل",
        "config-install-user-create-failed": "إنشاء مستخدم \"$1\" فشل:$2",
+       "config-install-user-grant-failed": "منح الصلاحية للمستخدم \"$1\" فشل: $2",
        "config-install-user-missing": "المستخدم المحدد \"$1\" غير موجود",
+       "config-install-user-missing-create": "المستخدم المحدد \"$1\" غير موجود. يُرجَى النقر على مربع \"إنشاء حساب\" أدناه إذا كنت تريد إنشاءه.",
        "config-install-tables": "إنشاء الجداول",
+       "config-install-tables-exist": "<strong>تحذير:</strong> يبدو أن جداول ميدياويكي موجودة بالفعل; تخطي الإنشاء.",
+       "config-install-tables-failed": "<strong>خطأ:</strong> فشل إنشاء الجدول بسبب الخطأ التالي: $1",
+       "config-install-interwiki": "ملء جدول الإنترويكي الإفتراضي",
+       "config-install-interwiki-list": "لا يمكن قراءة الملف <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "<strong>تحذير:</strong> يبدو أن جدول الإنترويكي به إدخالات بالفعل. تخطي القائمة الافتراضي.",
        "config-install-stats": "بدء الإحصاءات",
        "config-install-keys": "توليد المفاتيح السرية",
+       "config-insecure-keys": "<strong>تحذير:</strong> {{PLURAL:$2|مفتاح الأمان|مفاتيح الأمان}} ($1) التي تم إنشاؤها أثناء التثبيت ليست آمنة تماما; جرب تغيير{{PLURAL:$2|ه|هم}} يدويا.",
        "config-install-updates": "منع تشغيل التحديثات غير الضرورية",
+       "config-install-updates-failed": "<strong>خطأ:</strong> إدخال مفاتيح التحديث إلى الجداول فشلت بسبب الخطأ التالي: $1",
        "config-install-sysop": "إنشاء حساب مستخدم إداري",
+       "config-install-subscribe-fail": "غير قادر على الاشتراك في ميدياويكي-إعلان: $1",
+       "config-install-subscribe-notpossible": "لم يتم تثبيت cURL و <code>allow_url_fopen</code> غير متوفر.",
        "config-install-mainpage": "إنشاء صفحة رئيسية بالمحتوى الافتراضي",
        "config-install-extension-tables": "إنشاء جداول للامتدادات المفعلة",
        "config-install-mainpage-failed": "لم يتمكن من إدراج الصفحة الرئيسية: $1",
index c591f1e..d47334c 100644 (file)
@@ -89,6 +89,7 @@
        "config-db-name": "Nome de base de datos:",
        "config-db-name-help": "Escueye un nome qu'identifique la to wiki. Nun tien de contener espacios. \nSi tas utilizando agospiamientu web compartíu, el to provisor va date un nome específicu de base de datos por que lu utilices, o bien va dexate crear bases de datos al traviés d'un panel de control.",
        "config-db-name-oracle": "Esquema de la base de datos:",
+       "config-db-account-oracle-warn": "Hai tres escenarios compatibles pa la instalación de Oracle como motor de base de datos:\n\nSi desees crear una cuenta de base de datos como parte del procesu d'instalación, por favor apurre una cuenta con rol SYSDBA como cuenta de base de datos pa la instalación y especifica les credenciales que quies tener pal accesu a la web a la cuenta; d'otra miente, puedes crear manualmente la cuenta d'accesu a la web y suministrar namái esa cuenta (si tien los permisos necesarios pa crear los oxetos d'esquema) o dar dos cuentes distintos, una con privilexos de creación y otra con accesu acutáu a la web\n\nLa secuencia de comandos (script) pa crear una cuenta colos privilexos necesarios puede atopase nel direutoriu \"maintenance/oracle/\" d'esta instalación. Ten en cuenta qu'utilizar una cuenta acutada va desactivar toles capacidaes de caltenimientu cola cuenta predeterminada.",
        "config-db-install-account": "Cuenta d'usuariu pa la instalación",
        "config-db-username": "Nome d'usuariu de base de datos:",
        "config-db-password": "Contraseña de base de datos:",
        "config-db-wiki-help": "Escribe'l nome d'usuariu y la contraseña que se van utilizar p'aportar a la base de datos mientres la operación normal de la wiki.\nSi esta cuenta nun esiste y la cuenta d'instalación tien permisos bastante, va crease esta cuenta d'usuariu colos mínimos permisos necesarios pa operar normalmente la wiki.",
        "config-db-prefix": "Prefixu de tables de la base de datos:",
        "config-db-prefix-help": "Si precises compartir una base de datos ente múltiples wikis, o ente MediaWiki y otra aplicación web, puedes optar por amestar un prefixu a tolos nomes de tabla pa evitar conflictos.\nNun utilices espacios.\n\nDe normal déxase esti campu vacío.",
+       "config-mysql-old": "Precísase MySQL $1 o posterior. Tienes $2.",
+       "config-db-port": "Puertu de la base de datos:",
+       "config-db-schema": "Esquema pa MediaWiki:",
+       "config-db-schema-help": "Esti esquema de vezu va tar bien.\nCamúdalos solo si sabes que lo precises.",
+       "config-pg-test-error": "Nun puede coneutase cola base de datos <strong>$1</strong>: $2",
+       "config-sqlite-dir": "Direutoriu de datos SQLite:",
        "config-type-mysql": "MySQL (o compatible)",
        "config-type-mssql": "Microsoft SQL Server",
        "config-invalid-db-type": "Triba non válida de base de datos.",
        "config-help": "Ayuda",
        "config-nofile": "Nun pudo atopase'l ficheru \"$1\". ¿Desaniciose?",
        "mainpagetext": "<strong>Instalóse MediaWiki.</strong>",
-       "mainpagedocfooter": "Consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents] pa saber cómo usar el software wiki.\n\n== Primeros pasos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ EMF de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de llanzamientos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Depriende como combatir la puxarra na to wiki]"
+       "mainpagedocfooter": "Consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía del usuariu] pa saber cómo usar el software wiki.\n\n== Primeros pasos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ EMF de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de llanzamientos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Depriende como combatir la puxarra na to wiki]"
 }
index c17de3f..1335b9c 100644 (file)
        "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Вы ўсталявалі MediaWiki.\n\nПраграма ўсталяваньня стварыла файл <code>LocalSettings.php</code>.\nЁн утрымлівае ўсе Вашыя налады.\n\nВам неабходна загрузіць яго і захаваць у карэнную дырэкторыю Вашай вікі (у тую ж самую дырэкторыю, дзе знаходзіцца index.php). Загрузка павінна пачацца аўтаматычна.\n\nКалі загрузка не пачалася, ці Вы яе адмянілі, Вы можаце перазапусьціць яе націснуўшы на спасылку ніжэй:\n\n$3\n\n<strong>Заўвага</strong>: калі Вы гэтага ня зробіце зараз, то створаны файл ня будзе даступны Вам потым, калі Вы выйдзеце з праграмы ўсталяваньня безь яго загрузкі.\n\nКалі Вы гэта зробіце, Вы можаце <strong>[$2 ўвайсьці ў Вашую вікі]</strong>.",
index 92c00b1..a455879 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Чаховіч Уладзіслаў"
+                       "Чаховіч Уладзіслаў",
+                       "Mechanizatar"
                ]
        },
        "config-desc": "Інсталятар MediaWiki",
@@ -15,6 +16,6 @@
        "config-page-name": "Назва",
        "config-page-options": "Настройкі",
        "config-upload-settings": "Загрузка выяў і файлаў",
-       "mainpagetext": "'''MediaWiki паспяхова ўсталяваная.'''",
-       "mainpagedocfooter": "Гл. [https://meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.\n\n== З чаго пачаць ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]"
+       "mainpagetext": "<strong>MediaWiki паспяхова ўсталяваная.</strong>",
+       "mainpagedocfooter": "Гл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Дапаможнік карыстальніка (англ.)] для атрымання інфармацыі аб карыстанні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на Вашу мову]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца са спамам у Вашай вікі]"
 }
index 5cdb83f..b950420 100644 (file)
@@ -4,7 +4,8 @@
                        "DCLXVI",
                        "아라",
                        "StanProg",
-                       "Vodnokon4e"
+                       "Vodnokon4e",
+                       "Seb35"
                ]
        },
        "config-desc": "Инсталатор на МедияУики",
@@ -53,7 +54,7 @@
        "config-unicode-using-intl": "Използване на разширението [http://pecl.php.net/intl intl PECL] за нормализация на Уникод.",
        "config-unicode-pure-php-warning": "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
        "config-unicode-update-warning": "'''Предупреждение''': Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова верия], в случай че сте загрижени за използването на Unicode.",
-       "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на <code>./configure --with-mysql</code>.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула <code>php5-mysql</code>.",
+       "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на <code>./configure --with-mysqli</code>.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Предупреждение:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
        "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
        "config-pcre-old": "<strong>Фатална грешка:</strong> Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].",
@@ -64,6 +65,7 @@
        "config-apc": "[http://www.php.net/apc APC] е инсталиран",
        "config-apcu": "[http://www.php.net/apc APC] е инсталиран",
        "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 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [http://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.",
        "config-diff3-bad": "GNU diff3 не беше намерен.",
        "config-git": "Налична е системата за контрол на версиите Git: <code>$1</code>.",
@@ -83,6 +85,7 @@
        "config-db-host": "Хост на базата от данни:",
        "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
        "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-type-mssql": "Microsoft SQL сървър",
        "config-support-info": "МедияУики поддържа следните системи за бази от данни:\n\n$1\n\nАко не виждате желаната за използване система в списъка по-долу, следвайте инструкциите за активиране на поддръжка по-горе.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] е най-важна за МедияУики и се поддържа най-добре. МедияУики работи също така с [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona Server], които са съвместими с MySQL.\n([http://www.php.net/manual/bg/mysqli.installation.php Как се компилира PHP с поддръжка на MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популярна система за управление на бази от данни, алтернатива на MySQL. Възможно е все още да има грешки, затова не се препоръчва да се използва в общодостъпна среда.([http://www.php.net/manual/bg/pgsql.installation.php Как се компилира PHP с поддръжка на PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популярна система за управление на бази от данни, алтернатива на MySQL. ([http://www.php.net/manual/bg/pgsql.installation.php Как се компилира PHP с поддръжка на PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] е олекотена система за бази от данни, която е много добре поддържана. ([http://www.php.net/manual/bg/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] е комерсиална корпоративна база от данни за Windows. ([http://www.php.net/manual/bg/sqlsrv.installation.php Как да се компилира PHP с поддръжка на SQLSRV])",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''Предупреждение''': Избрана е MyISAM като система за складиране в MySQL, която не се препоръчва за използване с МедияУики, защото:\n* почти не поддържа паралелност заради заключване на таблиците\n* е по-податлива на повреди в сравнение с други системи\n* кодът на МедияУики не винаги поддържа MyISAM коректно\n\nАко инсталацията на MySQL поддържа InnoDB, силно е препоръчително да се използва тя.\nАко инсталацията на MySQL не поддържа InnoDB, вероятно е време за обновяване.",
+       "config-mysql-only-myisam-dep": "<strong>Внимание:</strong> MyISAM e единственият наличен на тази машина тип на таблиците за MySQL и не е препоръчителен за употреба при МедияУики защото:\n* има слаба поддръжка на конкурентност на заявките, поради закючването на таблиците\n* е много по-податлив на грешки в базите от данни от другите типове таблици\n* кодът на МедияУики не винаги работи с MyISAM както трябва\n\nВашият MySQL не поддържа InnoDB, така че може би е дошло време за актуализиране.",
        "config-mysql-engine-help": "'''InnoDB''' почти винаги е най-добрата възможност заради навременната си поддръжка.\n\n'''MyISAM''' може да е по-бърза при инсталации с един потребител или само за четене.\nБазите от данни MyISAM се повреждат по-често от InnoDB.",
        "config-mysql-charset": "Набор от символи в базата от данни:",
        "config-mysql-binary": "Бинарен",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "В '''бинарен режим''' МедияУики съхранява текстовете в UTF-8 в бинарни полета в базата от данни.\nТова е по-ефективно от UTF-8 режима на MySQL и позволява използването на пълния набор от символи в Уникод.\n\nВ '''UTF-8 режим''' 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-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> Ако това не бъде извършено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\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 разширенията по категория] или [https://www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
        "mainpagetext": "<strong>МедияУики беше успешно инсталирано.</strong>",
-       "mainpagedocfooter": "Разгледайте [https://meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Настройки за конфигуриране]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
+       "mainpagedocfooter": "Разгледайте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Настройки за конфигуриране]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
 }
index f28e2c5..34efde4 100644 (file)
@@ -7,7 +7,8 @@
                        "Tauhid16",
                        "Aftabuzzaman",
                        "Hasive",
-                       "আজিজ"
+                       "আজিজ",
+                       "Elias Ahmmad"
                ]
        },
        "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
        "config-install-user-alreadyexists": "ব্যবহারকারী \"$1\" ইতিমধ্যে বিদ্যমান আছে",
        "config-install-tables": "টেবিল তৈরি",
        "config-install-keys": "গোপন কি তৈরি",
+       "config-install-mainpage-exists": "প্রধান পাতা ইতিমধ্যেই বিদ্যমান, এডিয়ে যাওয়া হচ্ছে",
        "config-help": "সাহায্য",
        "config-help-tooltip": "প্রসারিত করতে ক্লিক করুন",
        "mainpagetext": "<strong>মিডিয়াউইকি ইনস্টল করা হয়েছে।</strong>",
-       "mainpagedocfooter": "কীভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [https://www.mediawiki.org/wiki/Special:MyLanguage/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 মিডিয়াউইকি মুক্তির মেইলিং লিস্ট]\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* [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 1211929..4a54501 100644 (file)
        "config-install-subscribe-fail": "N'haller ket koumanantiñ da mediawiki-announce : $1",
        "config-install-subscribe-notpossible": "cURL n'eo ket staliet ha ne c'haller ket ober gant <code>allow_url_fopen</code>.",
        "config-install-mainpage": "O krouiñ ar bajenn bennañ gant un endalc'had dre ziouer",
+       "config-install-mainpage-exists": "Bez' ez eus eus ar bajenn bennañ c'hoazh, lezel a-gostez",
        "config-install-extension-tables": "O krouiñ taolennoù evit an astennoù gweredekaet",
        "config-install-mainpage-failed": "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
        "config-download-localsettings": "Pellgargañ <code>LocalSettings.php</code>",
index 003583d..559e7dd 100644 (file)
@@ -20,7 +20,7 @@
        "config-localsettings-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>. \nPer tal d'actualitzar la instal·lació, introduïu el valor de <code>$wgUpgradeKey</code> en el quadre a continuació. El trobareu a <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>.\nPer a actualitzar la instal·lació, executeu <code>update.php</code>.",
        "config-localsettings-key": "Clau d'actualització:",
-       "config-localsettings-badkey": "La clau que heu proporcionat no és correcta.",
+       "config-localsettings-badkey": "La clau d'actualització que heu proporcionat no és correcta.",
        "config-upgrade-key-missing": "S'ha detectat una instal·lació ja existent del MediaWiki.\nPer actualitzar-la, poseu la línia següent al final de <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "El <code>LocalSettings.php</code> que hi ha sembla incomplet.\nLa variable $1 no està definida.\nCanvieu <code>LocalSettings.php</code> perquè la variable estigui definida i feu clic a «{{int:Config-continue}}».",
        "config-localsettings-connection-error": "S'ha trobat un error en connectar-se amb la base de dades fent servir els paràmetres especificats a <code>LocalSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
@@ -52,7 +52,7 @@
        "config-restart": "Sí, torna a començar",
        "config-welcome": "=== Comprovacions de l'entorn ===\nS'efectuaran comprovacions bàsiques per veure si l'entorn és adequat per a la instal·lació del MediaWiki.\nRecordeu d'incloure aquesta informació si heu de demanar ajuda sobre com completar la instal·lació.",
        "config-copyright": "=== Drets d'autor i condicions ===\n\n$1\n\nAquest programa és de programari lliure; podeu redistribuir-lo i/o modificar-lo sota les condicions de la Llicència Pública General GNU com es publicada per la Free Software Foundation; qualsevol versió 2 de la llicència, o (opcionalment) qualsevol versió posterior.\n\nAquest programa és distribueix amb l'esperança que serà útil, però <strong>sense cap garantia</strong>; sense ni tan sols la garantia implícita de <strong>\ncomerciabilitat</strong> o <strong>idoneïtat per a un propòsit particular</strong>.\nConsulteu la Llicència Pública General GNU, per a més detalls.\n\nHauríeu d'haver rebut <doclink href=\"Copying\">una còpia de la Llicència Pública General GNU</doclink> amb aquest programa; si no, escriviu a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA o [http://www.gnu.org/copyleft/gpl.html per llegir-lo en línia].",
-       "config-sidebar": "* [https://www.mediawiki.org la Pàgina d'inici]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guia de l'Usuari]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guia de l'Administrador]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Llegeix-me</doclink>\n* <doclink href=ReleaseNotes>Notes de la versió</doclink>\n* <doclink href=Còpia>Còpia</doclink>\n* <doclink href=UpgradeDoc>Actualització</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org la Pàgina d'inici]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guia de l'usuari]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guia de l'administrador]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF]\n----\n* <doclink href=Readme>Llegeix-me</doclink>\n* <doclink href=ReleaseNotes>Notes de la versió</doclink>\n* <doclink href=Còpia>Còpia</doclink>\n* <doclink href=UpgradeDoc>Actualització</doclink>",
        "config-env-good": "S'ha comprovat l'entorn.\nPodeu instal·lar el MediaWiki.",
        "config-env-bad": "S'ha comprovat l'entorn.\nNo podeu instal·lar el MediaWiki.",
        "config-env-php": "El PHP $1 està instal·lat.",
        "config-admin-error-user": "S'ha produït un error intern en crear un administrador amb el nom «<nowiki>$1</nowiki>».",
        "config-admin-error-password": "S'ha produït un error intern en definir una contrasenya per a l'administrador «<nowiki>$1</nowiki>»: <pre>$2</pre>",
        "config-admin-error-bademail": "Heu introduït una adreça electrònica no vàlida.",
+       "config-subscribe": "Subscriu a la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce llista de correu d'anunci de noves versions].",
+       "config-pingback": "Comparteix dades d'aquesta instal·lació amb els desenvolupadors de MediaWiki.",
        "config-almost-done": "Gairebé ja heu acabat!\nPodeu ometre el que queda de la configuració i procedir amb la instal·lació del wiki.",
        "config-optional-continue": "Fes-me més preguntes.",
        "config-optional-skip": "Ja estic avorrit. Simplement instal·leu el wiki.",
        "config-install-subscribe-fail": "No s'ha pogut subscriure a mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "El cURL no està instal·lat i <code>allow_url_fopen</code> no està disponible.",
        "config-install-mainpage": "S'està creant la pàgina principal amb el contingut per defecte",
+       "config-install-mainpage-exists": "La pàgina principal ja existeix, per tant s'omet",
        "config-install-extension-tables": "S'estan creant taules de les extensions habilitades",
        "config-install-mainpage-failed": "No s'ha pogut inserir la pàgina principal: $1",
+       "config-install-done": "<strong>Enhorabona!</strong>\nHeu instal·lat MediaWiki.\n\nL'instal·lador a generat un fitxer <code>LocalSettings.php</code>.\nConté tota la configuració.\n\nCaldrà que el baixeu i el poseu al directori base on heu instal·lat al wiki (el mateix directori on es troba index.php). La baixada hauria d'haver començat automàticament.\n\nSi la baixada no comença, o si l'heu cancel·lat, podeu reiniciar-la fent clic a l'enllaç de sota:\n\n$3\n\n<strong>Nota:</strong> Si no ho feu ara, no podreu accedir a aquest fitxer de configuració més endavant si no l'heu baixat abans.\n\nUna vegada tot això fet, podeu <strong>[$2 entrar al vostre wiki]</strong>.",
        "config-download-localsettings": "Baixa <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-help-tooltip": "feu clic per ampliar",
        "config-nofile": "No s'ha pogut trobar el fitxer «$1». S'ha suprimit?",
-       "mainpagetext": "'''El MediaWiki s'ha instal·lat correctament.'''",
+       "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]"
 }
index 2fee258..2d2f207 100644 (file)
@@ -8,7 +8,8 @@
                        "Matěj Grabovský",
                        "Paxt",
                        "Matěj Suchánek",
-                       "LordMsz"
+                       "LordMsz",
+                       "Seb35"
                ]
        },
        "config-desc": "Instalační program pro MediaWiki",
@@ -57,7 +58,7 @@
        "config-unicode-using-intl": "Pro normalizaci Unicode se používá [http://pecl.php.net/intl PECL rozšíření intl].",
        "config-unicode-pure-php-warning": "<strong>Upozornění:</strong> Není dostupné [http://pecl.php.net/intl PECL rozšíření intl] pro normalizaci Unicode, bude se využívat pomalá implementace v čistém PHP.\nPokud provozujete wiki s velkou návštěvností, měli byste si přečíst něco o [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizaci Unicode].",
        "config-unicode-update-warning": "<strong>Upozornění:</strong> Nainstalovaná verze vrstvy pro normalizaci Unicode používá starší verzi knihovny [http://site.icu-project.org/ projektu ICU].\nPokud vám aspoň trochu záleží na používání Unicode, měli byste [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ji aktualizovat].",
-       "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte nainstalovat databázový ovladač pro PHP.\n{{PLURAL:$2|Je podporován následující typ databáze|Jsou podporovány následující typy databází}}: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul <code>php5-mysql</code>.",
+       "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte nainstalovat databázový ovladač pro PHP.\n{{PLURAL:$2|Je podporován následující typ databáze|Jsou podporovány následující typy databází}}: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysqli</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Upozornění:</strong> Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
        "config-no-fts3": "<strong>Upozornění:</strong> SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
        "config-pcre-old": "<strong>Kritická chyba:</strong> Je vyžadováno PCRE verze $1 nebo novější.\nVaše binárka PHP obsahuje PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Více informací.]",
        "config-install-subscribe-fail": "Nelze se přihlásit k odběru mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "Není nainstalován cURL a není dostupné <code>allow_url_fopen</code>.",
        "config-install-mainpage": "Vytváří se počáteční obsah hlavní strany",
+       "config-install-mainpage-exists": "Hlavní strana již existuje, přeskakuji.",
        "config-install-extension-tables": "Vytvářejí se tabulky pro zapnutá rozšíření",
        "config-install-mainpage-failed": "Nepodařilo se vložit hlavní stranu: $1",
        "config-install-done": "<strong>Gratulujeme!</strong>\nNainstalovali jste MediaWiki.\n\nInstalátor vytvořil soubor <code>LocalSettings.php</code>.\nTen obsahuje veškerou vaši konfiguraci.\n\nBudete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\n<strong>Poznámka</strong>: Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete <strong>[$2 vstoupit do své wiki]</strong>.",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
        "config-extension-link": "Věděli jste, že vaše wiki podporuje [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "<strong>MediaWiki byla úspěšně nainstalována.</strong>",
-       "mainpagedocfooter": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
+       "mainpagedocfooter": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
 }
index c7690e2..3babc3f 100644 (file)
        "config-install-subscribe-fail": "Abonnieren von „mediawiki-announce“ ist gescheitert: $1",
        "config-install-subscribe-notpossible": "cURL ist nicht installiert und <code>allow_url_fopen</code> ist nicht verfügbar.",
        "config-install-mainpage": "Erstellung der Hauptseite mit Standardinhalten",
+       "config-install-mainpage-exists": "Die Hauptseite ist bereits vorhanden. Überspringe.",
        "config-install-extension-tables": "Erstellung der Tabellen für die aktivierten Erweiterungen",
        "config-install-mainpage-failed": "Die Hauptseite konnte nicht erstellt werden: $1",
        "config-install-done": "'''Herzlichen Glückwunsch!'''\nMediaWiki wurde erfolgreich installiert.\n\nDas Installationsprogramm hat die Datei <code>LocalSettings.php</code> erzeugt.\nSie enthält alle vorgenommenen Konfigurationseinstellungen.\n\nDiese Datei muss nun heruntergeladen und anschließend in das Stammverzeichnis der MediaWiki-Installation hochgeladen werden. Dies ist dasselbe Verzeichnis, in dem sich auch die Datei <code>index.php</code> befindet. Das Herunterladen sollte inzwischen automatisch gestartet worden sein.\n\nSofern dies nicht der Fall war, oder das Herunterladen unterbrochen wurde, kann der Vorgang durch einen Klick auf den folgenden Link erneut gestartet werden:\n\n$3\n\n'''Hinweis:''' Die Konfigurationsdatei sollte jetzt unbedingt heruntergeladen werden. Sie wird nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.\n\nSobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.",
index c80d54e..68b4720 100644 (file)
@@ -4,7 +4,8 @@
                        "Erdemaslancan",
                        "Mirzali",
                        "Marmase",
-                       "Kumkumuk"
+                       "Kumkumuk",
+                       "Gambollar"
                ]
        },
        "config-desc": "Qandé MediaWiki sazi",
@@ -26,7 +27,7 @@
        "config-page-install": "Bar ke",
        "config-page-complete": "Temamyayo",
        "config-page-restart": "Barkerdışi fına ser kı",
-       "config-page-readme": "Mı bıwane",
+       "config-page-readme": "Mı bıwan",
        "config-page-releasenotes": "Notë versiyoni",
        "config-page-copying": "Kopyayeno",
        "config-page-upgradedoc": "Berzkerdış",
index a11c301..679c0a8 100644 (file)
        "config-install-subscribe-fail": "Ανίκανος να εγγραφείτε στο mediawiki-ανακοινώση: $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Έχετε εγκαταστήσει με επιτυχία το MediaWiki.\n\nΤο πρόγραμμα εγκατάστασης έχει δημιουργήσει το  αρχείο   <code>LocalSettings.php</code>.\nΠεριέχει όλες τις ρυθμίσεις παραμέτρων σας.\n\nΘα πρέπει να το κατεβάσετε και να το βάλετε στη βάση της εγκατάστασης του  wiki σας (στον ίδιο κατάλογο όπως το  index.php). Η λήψη θα αρχίσει αυτόματα.\n\nΑν η λήψη δεν προσφέφθηκε, ή αν την ακυρώσατε, μπορείτε να επανεκκινήσετε τη λήψη κάνοντας κλικ στο παρακάτω link:\n\n$3\n\n<strong>Σημείωση:</strong> Εάν δεν το κάνετε αυτό τώρα, αυτό το  αρχείο ρύθμισης παραμέτρων δεν θα είναι διαθέσιμο για σας αργότερα, αν βγείτε από την εγκατάσταση, χωρίς να το κατεβάσετε!\n\nΌταν γίνει αυτό, μπορείτε να <strong>[$2 μπείτε στο wiki σας]</strong>.",
index b25ff2c..db92652 100644 (file)
        "config-install-subscribe-fail": "Unable to subscribe to mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL is not installed and <code>allow_url_fopen</code> is not available.",
        "config-install-mainpage": "Creating main page with default content",
+       "config-install-mainpage-exists": "Main page already exists, skipping",
        "config-install-extension-tables": "Creating tables for enabled extensions",
        "config-install-mainpage-failed": "Could not insert main page: $1",
        "config-install-done": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
        "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
        "config-extension-link": "Did you know that your wiki supports [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
        "mainpagetext": "<strong>MediaWiki has been installed.</strong>",
-       "mainpagedocfooter": "Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents] for information on using the wiki software.\n\n== Getting started ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
+       "mainpagedocfooter": "Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 4398492..8c4914c 100644 (file)
@@ -32,7 +32,8 @@
                        "Indiralena",
                        "Peter Bowman",
                        "Dgstranz",
-                       "Irus"
+                       "Irus",
+                       "Tinss"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki es compatible con los siguientes sistemas de bases de datos:\n\n$1\n\nSi no encuentras en el listado el sistema de base de datos que estás intentando utilizar, sigue las instrucciones enlazadas arriba para activar la compatibilidad.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad. MediaWiki también funciona con [{{int:version-db-mariadb-url}} MariaDB] y [{{int:version-db-percona-url}} Percona Server], que son compatibles con MySQL. ([http://www.php.net/manual/es/mysql.installation.php Cómo compilar PHP con compatibilidad MySQL])",
-       "config-dbsupport-postgres": "[{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. Pueden haber algunos fallos menores destacables, y no es recomendable para su uso en un entorno de producción. ([http://www.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).",
+       "config-dbsupport-postgres": "[{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un sistema de base de datos ligero con gran compatibilidad con MediaWiki. ([http://www.php.net/manual/es/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usando PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([http://www.php.net/manual/es/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es una base de datos comercial a nivel empresarial para Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con soporte para SQLSRV])",
        "config-install-subscribe-fail": "No se ha podido suscribir a mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL no está instalado y <code>allow_url_fopen</code> no está disponible.",
        "config-install-mainpage": "Creando página principal con contenido predeterminado",
+       "config-install-mainpage-exists": "La página principal ya existe, se omite",
        "config-install-extension-tables": "Creando las tablas para las extensiones habilitadas",
        "config-install-mainpage-failed": "No se pudo insertar la página principal: $1",
        "config-install-done": "<strong>¡Felicidades!</strong>\nHas instalado MediaWiki.\n\nEl instalador ha generado un archivo <code>LocalSettings.php</code>.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\n<strong>Nota</strong>: si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás <strong>[$2 entrar en tu wiki]</strong>.",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [https://www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "mainpagetext": "<strong>MediaWiki se ha instalado.</strong>",
-       "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [https://www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende cómo combatir el spam en tu wiki]"
+       "mainpagedocfooter": "Consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guía] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki a tu idioma]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende a combatir el spam en tu wiki]"
 }
index 46e8d90..c9d2886 100644 (file)
@@ -79,5 +79,5 @@
        "config-install-tables": "Tabelite loomine",
        "config-help": "abi",
        "mainpagetext": "<strong>MediaWiki tarkvara on paigaldatud.</strong>",
-       "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents siit].\n\n== Alustamine ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Häälestussätete loend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki lokaliseerimine]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loe, kuidas vikis rämpspostitusi tõrjuda]"
+       "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents kasutaja teatmikust].\n\n== Alustamine ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Häälestussätete loend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki lokaliseerimine]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loe, kuidas vikis rämpspostitusi tõrjuda]"
 }
index f812471..7690b01 100644 (file)
        "config-download-localsettings": "Jaitsi <code>LocalSettings.php</code>",
        "config-help": "Laguntza",
        "config-help-tooltip": "sakatu zabaltzeko",
-       "mainpagetext": "'''MediaWiki arrakastaz instalatu da.'''",
+       "mainpagetext": "<strong>MediaWiki instalatu da.</strong>",
        "mainpagedocfooter": "Ikus [https://meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]"
 }
index dae9f2a..5275548 100644 (file)
                        "Macofe",
                        "درفش کاویانی",
                        "Hamisun",
-                       "Alifakoor"
+                       "Alifakoor",
+                       "Seb35"
                ]
        },
-       "config-desc": "Ù\86صب Ú©Ù\86Ù\86دÙ\87Ù\94 Ù\88Û\8cÚ©Û\8câ\80\8cÙ\85دÛ\8cا",
-       "config-title": "Ù\86صب Ù\88Û\8cÚ©Û\8câ\80\8cÙ\85دÛ\8cا $1",
+       "config-desc": "Ù\86صب Ú©Ù\86Ù\86دÙ\87Ù\94 Ù\85دÛ\8cاÙ\88Û\8cÚ©Û\8c",
+       "config-title": "Ù\86صب Ù\85دÛ\8cاÙ\88Û\8cÚ©Û\8c $1",
        "config-information": "اطلاعات",
        "config-localsettings-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده‌است.\nبرای ارتقاء این نصب لطفاً مقدار <code>$wgUpgradeKey</code> در جعبه زیر وارد کنید.\nشما می‌توانید آن را در <code>LocalSettings.php</code> پیدا کنید.",
        "config-localsettings-cli-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده است.\nبرای ارتقاء این نصب، لطفاً <code>update.php</code> را اجرا کنید.",
        "config-page-options": "گزینه‌ها",
        "config-page-install": "نصب",
        "config-page-complete": "کامل!",
-       "config-page-restart": "راÙ\87â\80\8cاÙ\86دازÛ\8c Ø¯Ù\88بارÙ\87 نصب",
+       "config-page-restart": "شرÙ\88ع Ø¯Ù\88بارÙ\87Ù\94 نصب",
        "config-page-readme": "مرا بخوان",
        "config-page-releasenotes": "یادداشت‌های انتشار",
        "config-page-copying": "تکثیر",
        "config-page-upgradedoc": "ارتقاء",
        "config-page-existingwiki": "ویکی موجود",
        "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
-       "config-restart": "بÙ\84Ù\87Ø\8c Ø¯Ù\88بارÙ\87 Ø±Ø§Ù\87â\80\8cاÙ\86دازÛ\8c کن",
+       "config-restart": "بÙ\84Ù\87Ø\8c Ø¯Ù\88بارÙ\87 Ø´Ø±Ù\88ع کن",
        "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
-       "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه، یک نرم‌افزاری آزاد است. شما می‌توانید آن را بازتوزیع کرده و/یا با شرایط نگارش ۲ یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، تغییر دهید.\n\nاین برنامه با امید این که مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیش‌تر پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید <doclink href=Copying> یک نگارش ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کرده باشید. در غیر این صورت با بنیاد نرم‌افزار آزاد، ایالات متحده امریکا، بوستون، خیابان فرانکلین، پلاک ۵۱، طبقه پنجم، صندوق پستی MA۰۲۱۱۰-۱۳۰ مکاتبه کنید، یا [http://www.gnu.org/copyleft/gpl.html در این‌جا به صورت برخط بخوانید].",
+       "config-copyright": "=== حق رونوشت و شرایط ===\n\n$1\n\nاین برنامه، نرم‌افزاری آزاد است. می‌توانید تحت شرایط نگارش ۲ یا (بنا به نظر خود) هر نگارش جدیدتری از پروانهٔ جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، بازنشرش کرده و/یا تغییرش دهید.\n\n\nاین برنامه با این امید توزیع شده که مفید باشد، ولی <strong>بدون هیچ ضمانتی</strong>، حتا ضمانت ضمنی <strong>معامله‌پذیری</strong> یا <strong>تناسب برای کاربردی خاص </strong>.\n\nبرای جزئیات بیشتر، پروانهٔ جامع همگانی گنو را ببینید.\n\n\nباید همراه این برنامه، <doclink href=Copying>نگارشی از پروانهٔ جامع همگانی گنو</doclink> را گرفته باشید. اگر چنین نیست، با بنیاد نرم‌افزار آزاد به نشانی 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA مکاتبه کرده یا [http://www.gnu.org/copyleft/gpl.html پروانه را برخط بخوانید].",
        "config-sidebar": "* [https://www.mediawiki.org صفحهٔ اصلی مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
        "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
        "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
        "config-env-php": "پی‌اچ‌پی $1 نصب شده‌است.",
-       "config-env-hhvm": "HHVM $1 نصب شده‌است.",
-       "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.",
+       "config-env-hhvm": "اچ‌اچ‌وی‌ام $1 نصب شده‌است.",
+       "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl افزونهٔ intl برای PECL] استفاده کنید.",
        "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\n\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
        "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\n\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
-       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|سوأل کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
+       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|سوأل کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysqli</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
        "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
@@ -72,6 +73,7 @@
        "config-memory-bad": "'''هشدار:''' PHP's <code>memory_limit</code> نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.",
        "config-apc": "[http://www.php.net/apc APC] نصب شده‌است.",
+       "config-apcu": "[http://www.php.net/apcu APCu] نصب شده‌است",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شده‌است.",
        "config-no-cache-apcu": "<strong>هشدار:</strong> پیوند [http://www.php.net/apcu APCu]، [http://xcache.lighttpd.net/ XCache] یا [http://www.iis.net/download/WinCacheForPhp WinCache] یافت نشد. ذخیره شی فعال نیست.",
        "config-mod-security": "'''هشدار:''' وب سرور شما [http://modsecurity.org/ mod_security] فعال است.اگر اشتباه پیکربندی شده‌‌ باشد،می تواند باعث ایجاد مشکلاتی برای مدیاویکی یا دیگر نرم‌افزاری شود که به کاربران اجازه می‌دهد پیام دلخواه ارسال کنند.\nبه [http://modsecurity.org/documentation/ mod_security documentation] مراجعه کنید یا اگر با خطاهای اتفاقی مواجه شدید با پشتیبانی میزبان خود در تماس باشید.",
        "config-imagemagick": "ایمیج‌مجیک پیدا شد: <code>$1</code>.\nاگر ارسال‌ها را فعال کنید،تصویر کوچک فعال خواهد‌شد.",
        "config-gd": "گرافیک‌های جی‌دی ساخته‌‌ شده در کتابخانه پیدا شد.\nاگر ارسال‌ها را فعال کنید تصویر کوچک فعال خواهد‌شد.",
        "config-no-scaling": "کتابخانهٔ جی‌دی یا ایمیج‌مجیک نتوانست پیدا شود.\nتصویر کوچک غیر‌فعال خواهد‌شد.",
-       "config-no-uri": "'''خطا:''' یوآرآی فعلی را نتوانست مشخص کند.\nنصب نافرجام ماند.",
+       "config-no-uri": "'''خطا:''' یوآرآی فعلی را نتوانست مشخص کند.\nنصب شکست خورد.",
        "config-no-cli-uri": "<strong>هشدار:</strong> هیچ اسکریپت‌پتی تعیین نشده، از پیش‌فرض استفاده کنید:\n<code>$1</code>.",
        "config-using-server": "از اسم سرور \"<nowiki>$1</nowiki>\" استفاده کنید.",
        "config-using-uri": "از اسم سرور \"<nowiki>$1$2</nowiki>\" استفاده کنید.",
        "config-uploads-not-safe": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های <code>$1</code> شما برای اجرای متون دلخواه آسیب‌پذیر است.\nاگرچه مدیاویکی همهٔ پوشه‌های ارسال‌ شده را برای خطرات امنیتی بررسی می‌کند، پیش از فعال‌سازی ارسال‌ها، بسیار به [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security close this security vulnerability] توصیه شده‌است.",
        "config-no-cli-uploads-check": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های شما (<code>$1</code>) برای آسیب‌پذیری اجرای متن دلخواه در طول نصب سی‌ال آی بررسی نشده‌است.",
-       "config-brokenlibxml": "دستگاه شما دارای تلفیقی از نسخه‌های پی‌اچ‌پی و لیبکسمل۲ است که ناقص است و می‌تواند دلیل از بین رفتن اطلاعات مخفی در مدیاویکی و دیگر برنامه‌های کاربردی شبکه باشد.\nارتقاء به لیبکسمل۲  ۲.۷.۳ یا بالاتر ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]) ارتفاء دهید.\nنصب نافرجام ماند.",
+       "config-brokenlibxml": "دستگاه شما دارای تلفیقی از نسخه‌های پی‌اچ‌پی و لیبکسمل۲ است که ناقص است و می‌تواند دلیل از بین رفتن اطلاعات مخفی در مدیاویکی و دیگر برنامه‌های کاربردی شبکه باشد.\nارتقاء به لیبکسمل۲  ۲.۷.۳ یا بالاتر ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]) ارتفاء دهید.\nنصب شکست خورد ماند.",
        "config-suhosin-max-value-length": "سوهُسین نصب شده‌است و پارامتر جت <code>length</code> را به $1 بایت محدود می‌کند.\n قسمت بارکنندهٔ منبع مدیاویکی پیرامون این محدوده کار خواهد‌کرد، اما عملکرد آن را پایین می‌آورد. اگر به هیچ وجه ممکن نیست، باید <code>suhosin.get.max_value_length</code> را به ۱۰۲۴ یا بالاتر در <code>php.ini</code> تنظیم کنید، و \n<code>$wgResourceLoaderMaxQueryLength</code> را به مقدار مشابه در <code>LocalSettings.php</code> تنظیم کنید.",
        "config-db-type": "نوع پایگاه اطلاعات:",
        "config-db-host": "میزبان پایگاه اطلاعات:",
        "config-type-mssql": "سرور مایکروسافت اس‌کیو‌ال",
        "config-support-info": "مدیاویکی سامانه‌های پایگاه اطلاعاتی زیر را حمایت می‌کند:\n$1\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/mysqli.installation.php چگونه php را با MySQL کامپایل کنیم])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] یک منبع آزاد پر‌طرفدار دستگاه پایگاه اطلاعاتی به عنوان یک غیرمتعارف برای مای‌اس‌کیوال است.ممکن است عیوب بارز مختصری باشد، و برای استفاده در یک محیط تولیدی توصیه نمی‌شود.([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} پستگرس‌کیوال] یک سامانه پایگاه اطلاعات متن‌باز پر‌طرفدار است که جایگزینی برای مای‌اس‌کیوال است. ([http://www.php.net/manual/en/pgsql.installation.php راهنمای تنظیم کردن پی‌اچ‌پی به همراه پستگرس‌کیوال])",
        "config-dbsupport-sqlite": "*[{{int:version-db-sqlite-url}} اس‌کیولایت] یک سامانه پایگاه اطلاعاتی کم حجمی است که بسیار خوب پشتیبانی شده‌است.\n([http://www.php.net/manual/en/pdo.installation.php چگونگی کامپایل پی‌اچ‌پی با اس‌کیولایت]، از PDO استفاده می‌کند)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] یک پایگاه اطلاعاتی کار تبلیغاتی است.\n([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": "تنظیمات برای ذخیره شی:",
        "config-cache-help": "کش شی برای بهتر شدن سرعت مدیا ویکی، از طریق کش کردن داده‌های با بیشترین استفاده انجام می‌گیرد.\nوبگاه‌های متوسط تا بزرگ به انجام این کار شدیدا توصیه می‌شوند، در عین حال وبگاه‌های کوچک نیز می‌توانند از مزایای ایم مورد بهره ببرند.",
        "config-cache-none": "بدون ذخیره (هیچ کارآمدی پاک نشده‌است، اما ممکن است سرعت در سایت‌های بزرگتر ویکی تأثیر داشته باشد)",
-       "config-cache-accel": "ذخیرهٔ موضوع پی‌اچ‌پی (ای‌پی‌سی، ایکس‌کیچ یا وین‌کیچ)",
+       "config-cache-accel": "کاشهٔ اشیای پی‌اچ‌پی (APC یا APCu یا XCache یا WinCahe)",
        "config-cache-memcached": "از ممکچد (که نیازمند تنظیمات اضافی و پیکربندی) استفاده کنید",
        "config-memcached-servers": "سرورهای دریافت حافظه:",
        "config-memcached-help": "فهرست آدرس‌های آی‌پی برای استفاده از ممکچد.\nباید هر یک خط را تعیین کند و درگاه مورد استفاده را تعیین کند.برای مثال: \n۱۲۷.۰.۰.۱:۱۱۲۱۱\n۱۹۲.۱۶۸.۱.۲۵:۱۲۳۴",
        "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://meta.wikimedia.org/wiki/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 MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ارسال نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise مدیاویکی برای زبان شما]\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 5939291..6c99a42 100644 (file)
@@ -20,7 +20,8 @@
                        "Jaakkoh",
                        "Mikahama",
                        "Olimar",
-                       "01miki10"
+                       "01miki10",
+                       "Pyscowicz"
                ]
        },
        "config-desc": "MediaWiki-asennin",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki tukee seuraavia tietokantajärjestelmiä:\n\n$1\n\nJos et näe tietokantajärjestelmää, jota yrität käyttää, listattuna alhaalla, seuraa yläpuolella olevia ohjeita tuen aktivoimiseksi.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] on MediaWikin ensisijainen kohde ja se on myös parhaiten tuettu. MediaWiki voi myös käyttää [{{int:version-db-mariadb-url}} MariaDB]- sekä [{{int:version-db-percona-url}} Percona Server]-järjestelmiä, jotka ovat MySQL-yhteensopivia. ([http://www.php.net/manual/en/mysqli.installation.php Miten käännetään PHP MySQL-tuella])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] on suosittu avoimen lähdekoodin tietokantajärjestelmä vaihtoehtona MySQL:lle. Tuessa saattaa olla pieniä puutteita, eikä sitä suositella käytettäväksi tuotantoympäristössä. ([http://www.php.net/manual/en/pgsql.installation.php Kuinka käännetään PHP PostgreSQL-tuella])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] on suosittu avoimen lähdekoodin tietokantajärjestelmä vaihtoehtona MySQL:lle. ([http://www.php.net/manual/en/pgsql.installation.php Kuinka käännetään PHP PostgreSQL-tuella])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] on kevyt tietokantajärjestelmä, jota tuetaan hyvin. ([http://www.php.net/manual/en/pdo.installation.php Miten käännetään PHP SQLite-tuella], käyttää PDO:ta)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] on kaupallinen yritystietokanta. ([http://www.php.net/manual/en/oci8.installation.php Kuinka käännetään PHP OCI8-tuella])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] on kaupallinen yritystietokanta Windowsille. ([http://www.php.net/manual/en/sqlsrv.installation.php Miten käännetään PHP SQLSRV-tuella])",
        "config-mssql-old": "Vaaditaan Microsoft SQL Server $1 tai uudempi. Sinulla on käytössä $2.",
        "config-sqlite-name-help": "Valitse nimi, joka yksilöi tämän wikin.\nÄlä käytä välilyöntejä tai viivoja.\nNimeä käytetään SQLite-tietokannan tiedostonimessä.",
        "config-sqlite-dir-unwritable": "Hakemistoon ”$1” kirjoittaminen epäonnistui.\nMuuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja yritä uudelleen.",
+       "config-sqlite-connection-error": "$1.\n\nTarkista tietohakemiston ja tietokannan nimi alla ja yritä uudelleen.",
        "config-sqlite-readonly": "Tiedostoon <code>$1</code> ei voi kirjoittaa.",
        "config-sqlite-cant-create-db": "Tietokantatiedostoa <code>$1</code> ei voitu luoda.",
        "config-sqlite-fts3-downgrade": "PHP:stä puuttuu FTS3-tuki. Poistetaan ominaisuus käytöstä tietokantatauluista.",
        "config-mssql-auth": "Varmennuksen tyyppi:",
        "config-mssql-install-auth": "Valitse varmennuksen tyyppi, jota käytetään yhdistäessä tietokantaan asennuksen aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
        "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
+       "config-mssql-sqlauth": "SQL Server varmennus",
        "config-mssql-windowsauth": "Windows-varmennus",
        "config-site-name": "Wikin nimi",
        "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.",
        "config-install-subscribe-fail": "Liittyminen mediawiki-announce listalle epäonnistui: $1",
        "config-install-subscribe-notpossible": "cURL-ohjelmaa ei ole asennettu eikä <code>allow_url_fopen</code> ole saatavilla.",
        "config-install-mainpage": "Luodaan etusivu oletussisällöllä",
+       "config-install-mainpage-exists": "Etusivu on jo olemassa, ohitetaan",
        "config-install-extension-tables": "Luodaan tauluja käyttöönotetuille laajuennuksille",
        "config-install-mainpage-failed": "Etusivun lisääminen ei onnistunut: $1",
        "config-install-done": "<strong>Onnittelut!</strong>\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut <code>LocalSettings.php</code> -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se MediaWikin asennushakemistoon (sama kuin missä on index.php). Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\n<strong>Huom:</strong> Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit <strong>[$2 mennä wikiisi]</strong>.",
        "config-nofile": "Tiedostoa \"$1\" ei löytynyt. Onko se poistettu?",
        "config-extension-link": "Tiesitkö että wiki tukee [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions laajennuksia]?\n\nLaajennuksia voi hakea myös [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category luokittain].",
        "mainpagetext": "<strong>MediaWiki on onnistuneesti asennettu.</strong>",
-       "mainpagedocfooter": "Lisätietoja wiki-ohjelmiston käytöstä on [https://meta.wikimedia.org/wiki/Help:Contents käyttöoppaassa].\n\n=== Aloittaminen ===\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Käännä MediaWikiä kielellesi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Katso, kuinka torjua spämmiä wikissäsi]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
+       "mainpagedocfooter": "Lisätietoja wiki-ohjelmiston käytöstä on [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents käyttöoppaassa].\n\n=== Aloittaminen ===\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Käännä MediaWikiä kielellesi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Katso, kuinka torjua spämmiä wikissäsi]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
 }
index 82a2373..953d427 100644 (file)
@@ -27,7 +27,8 @@
                        "Cl3m3n7",
                        "C13m3n7",
                        "The RedBurn",
-                       "Trial"
+                       "Trial",
+                       "Tinss"
                ]
        },
        "config-desc": "Le programme d’installation de MediaWiki",
        "config-install-subscribe-fail": "Impossible de s'abonner à mediawiki-announce : $1",
        "config-install-subscribe-notpossible": "cURL n’est pas installé et <code>allow_url_fopen</code> n’est pas disponible.",
        "config-install-mainpage": "Création de la page principale avec un contenu par défaut",
+       "config-install-mainpage-exists": "La page principale existe déjà, ignoré",
        "config-install-extension-tables": "Création de tables pour les extensions activées",
        "config-install-mainpage-failed": "Impossible d’insérer la page principale : $1",
        "config-install-done": "<strong>Félicitations!</strong>\nVous avez installé MediaWiki.\n\nLe programme d'installation a généré un fichier <code>LocalSettings.php</code>. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement devrait démarrer automatiquement.\n\nSi le téléchargement n'a pas été proposé, ou que vous l'avez annulé, vous pouvez redémarrer le téléchargement en cliquant ce lien :\n\n$3\n\n<strong>Note :</strong> Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez <strong>[$2 accéder à votre wiki]</strong> .",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
        "config-extension-link": "Saviez-vous que votre wiki prend en charge [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie] ou la [https://www.mediawiki.org/wiki/Extension_Matrix matrice des extensions] pour voir la liste complète des extensions.",
        "mainpagetext": "<strong>MediaWiki a été installé.</strong>",
-       "mainpagedocfooter": "Consultez le [https://meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
+       "mainpagedocfooter": "Consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur du contenu] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
 }
index a2466c3..d4ac7e3 100644 (file)
@@ -6,7 +6,8 @@
                        "아라",
                        "Vivaelcelta",
                        "Macofe",
-                       "Banjo"
+                       "Banjo",
+                       "Seb35"
                ]
        },
        "config-desc": "O programa de instalación de MediaWiki",
@@ -55,7 +56,7 @@
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensión intl PECL] para a normalización Unicode.",
        "config-unicode-pure-php-warning": "<strong>Atención:</strong> A [http://pecl.php.net/intl extensión intl PECL] non está dispoñible para manexar a normalización Unicode; volvendo á execución lenta de PHP puro.\nSe o seu sitio posúe un alto tráfico de visitantes, debería ler un chisco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
        "config-unicode-update-warning": "<strong>Atención:</strong> A versión instalada da envoltura de normalización Unicode emprega unha versión vella da biblioteca [http://site.icu-project.org/ do proxecto ICU].\nDebería [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
-       "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Acéptase o seguinte tipo|Acéptanse os seguintes tipos}} de base de datos: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
+       "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Acéptase o seguinte tipo|Acéptanse os seguintes tipos}} de base de datos: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Atención:</strong> Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
        "config-no-fts3": "<strong>Atención:</strong> O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
        "config-pcre-old": "<strong>Erro fatal:</strong> Necesítase PCRE $1 ou posterior.\nO seu PHP binario está ligado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Máis información].",
        "config-install-subscribe-fail": "Non se puido subscribir á lista mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non está instalado e <code>allow_url_fopen</code> non está dispoñible.",
        "config-install-mainpage": "Creando a páxina principal co contido por defecto",
+       "config-install-mainpage-exists": "A páxina principal xa existe, saltando",
        "config-install-extension-tables": "Creando as táboas para as extensións activadas",
        "config-install-mainpage-failed": "Non se puido inserir a páxina principal: $1",
        "config-install-done": "<strong>Parabéns!</strong>\nInstalou MediaWiki.\n\nO programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\n<strong>Nota:</strong> Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá <strong>[$2 entrar no seu wiki]</strong>.",
index 069bf68..1c5c2ee 100644 (file)
@@ -9,7 +9,8 @@
                        "Tacsipacsi",
                        "Dorgan",
                        "Macofe",
-                       "Máté"
+                       "Máté",
+                       "Seb35"
                ]
        },
        "config-desc": "A MediaWiki telepítője",
@@ -58,7 +59,7 @@
        "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.",
        "config-unicode-pure-php-warning": "<strong>Figyelmeztetés:</strong> Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP-alapú implementáció lesz használatban.\nHa nagy látogatottságú oldalt üzemeltetsz, [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations itt] találhatsz további információkat a témáról.",
        "config-unicode-update-warning": "<strong>Figyelmeztetés:</strong> Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations frissítését].",
-       "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.",
+       "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysqli</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.",
        "config-outdated-sqlite": "<strong>Figyelmeztetés:</strong> SQLite $1 verziód van, ami alacsonyabb a legalább szükséges $2 verziónál. Az SQLite nem lesz elérhető.",
        "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.",
        "config-pcre-old": "<strong>Kritikus hiba:</strong> PCRE $1 vagy későbbi szükséges.\nA Te PHP binárisod PCRE $2-vel lett linkelve.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE További információ].",
@@ -67,6 +68,7 @@
        "config-memory-bad": "'''Figyelmeztetés:''' A PHP <code>memory_limit</code> beállításának értéke $1.\nEz az érték valószínűleg túl kevés, a telepítés sikertelen lehet.",
        "config-xcache": "Az [http://xcache.lighttpd.net/ XCache] telepítve van",
        "config-apc": "Az [http://www.php.net/apc APC] telepítve van",
+       "config-apcu": "Az [http://www.php.net/apcu APCu] telepítve van",
        "config-wincache": "A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van",
        "config-diff3-bad": "GNU diff3 nem található.",
        "config-git": "Megtaláltam a Git verziókezelő szoftvert: <code>$1</code>.",
index 1d52273..13e7a6b 100644 (file)
        "config-install-subscribe-fail": "Impossibile subscriber a mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non es installate e <code>allow_url_fopen</code> non es disponibile.",
        "config-install-mainpage": "Crea pagina principal con contento predefinite",
+       "config-install-mainpage-exists": "Le pagina principal jam existe, es omittite",
        "config-install-extension-tables": "Creation de tabellas pro le extensiones activate",
        "config-install-mainpage-failed": "Non poteva inserer le pagina principal: $1",
        "config-install-done": "<strong>Felicitationes!</strong>\nTu ha installate MediaWiki.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n<strong>Nota:</strong> Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote <strong>[$2 entrar in tu wiki]</strong>.",
index 296ddbd..3717258 100644 (file)
@@ -13,7 +13,8 @@
                        "Bennylin",
                        "WongKentir",
                        "Macofe",
-                       "Rachmat.Wahidi"
+                       "Rachmat.Wahidi",
+                       "Gombang"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
@@ -62,7 +63,7 @@
        "config-unicode-using-intl": "Menggunakan [http://pecl.php.net/intl ekstensi PECL intl] untuk normalisasi Unicode.",
        "config-unicode-pure-php-warning": "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.\nJika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisasi Unicode].",
        "config-unicode-update-warning": "'''Peringatan''': Versi terinstal dari pembungkus normalisasi Unicode menggunakan versi lama pustaka [http://site.icu-project.org/ proyek ICU].\nAnda harus [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations memutakhirkannya] jika Anda ingin menggunakan Unicode.",
-       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\n{{PLURAL:$2|Jenis|Jenis}} basis data yang didukung: $1.\n\nJika Anda mengompilasi PHP sendiri, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal seperti paket <code>php5-mysql</code>.",
+       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\n{{PLURAL:$2|Jenis|Jenis}} basis data yang didukung: $1.\n\nJika Anda mengompilasi PHP sendiri, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysqli</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal seperti paket <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Peringatan:</strong> Anda menggunakan SQLite $1, yang lebih rendah dari versi minimum yang diperlukan $2. SQLite akan tidak tersedia.",
        "config-no-fts3": "'''Peringatan''': SQLite dikompilasi tanpa [//sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.",
        "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 atau kemudian diperlukan.\nBiner PHP Anda dihubungkan dengan PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Selengkapnya].",
        "config-subscribe": "Berlangganan ke [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce milis pengumuman rilis].",
        "config-subscribe-help": "Ini adalah milis bervolume rendah yang digunakan untuk pengumuman rilis, termasuk pengumuman keamanan penting.\nAnda sebaiknya berlangganan dan memperbarui instalasi MediaWiki saat versi baru keluar.",
        "config-subscribe-noemail": "Anda mencoba untuk berlangganan milis pengumuman rilis tanpa menyediakan alamat email.\nHarap berikan alamat surel jika Anda ingin berlangganan ke milis.",
+       "config-pingback": "Bagikan data tentang instalasi ini dengan pengembang MediaWiki",
        "config-almost-done": "Anda hampir selesai!\nAnda sekarang dapat melewati sisa konfigurasi dan menginstal wiki sekarang.",
        "config-optional-continue": "Berikan saya pertanyaan lagi.",
        "config-optional-skip": "Saya sudah bosan, instal saja wikinya.",
        "config-profile-no-anon": "Pembuatan akun diperlukan",
        "config-profile-fishbowl": "Khusus penyunting terdaftar",
        "config-profile-private": "Wiki pribadi",
-       "config-profile-help": "Wiki paling baik bekerja jika Anda membiarkan sebanyak mungkin orang untuk menyunting. Dengan MediaWiki, sangat mudah meninjau perubahan terbaru dan mengembalikan kerusakan yang dilakukan oleh pengguna naif atau berbahaya.\n\nNamun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak mudah untuk meyakinkan semua orang manfaat dari cara wiki. Jadi, Anda yang menentukan.\n\n'''{{int:config-profile-wiki}}''' memungkinkan setiap orang untuk menyunting, bahkan tanpa masuk.\n'''{{int:config-profile-no-anon}}''' menyediakan akuntabilitas tambahan, tetapi dapat mencegah kontributor biasa.\n\n'''{{int:config-profile-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.\n'''{{int:config-profile-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.\n\nKonfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights/id entri manual terkait].",
+       "config-profile-help": "Wiki paling baik bekerja jika Anda membiarkan sebanyak mungkin orang untuk menyunting. Dengan MediaWiki, sangat mudah meninjau perubahan terbaru dan mengembalikan kerusakan yang dilakukan oleh pengguna naif atau berbahaya.\n\nNamun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak mudah untuk meyakinkan semua orang manfaat dari cara wiki. Jadi, Anda yang menentukan.\n\n'''{{int:config-profile-wiki}}''' memungkinkan setiap orang untuk menyunting, bahkan tanpa masuk log.\n'''{{int:config-profile-no-anon}}''' menyediakan akuntabilitas tambahan, tetapi dapat mengurangi semangat kontributor sambil lalu.\n\n'''{{int:config-profile-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.\n'''{{int:config-profile-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.\n\nKonfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights/id entri manual terkait].",
        "config-license": "Hak cipta dan lisensi:",
        "config-license-none": "Tidak ada lisensi",
        "config-license-cc-by-sa": "Creative Commons Atribusi Berbagi Serupa",
index cedccd1..5453e45 100644 (file)
        "config-profile": "Profilo dei diritti utente:",
        "config-profile-wiki": "Wiki aperto",
        "config-profile-no-anon": "Creazione utenza obbligatoria",
-       "config-profile-fishbowl": "Solo editori autorizzati",
+       "config-profile-fishbowl": "Solo utenti autorizzati",
        "config-profile-private": "Wiki privato",
        "config-profile-help": "I wiki funzionano meglio se si permette a molte persone di poterli modificare.\nIn MediaWiki, è semplice controllare le ultime modifiche, e ripristinare i danni causati da utenti inesperti o malintenzionati.\n\nTuttavia, molti hanno trovato MediaWiki essere utile in un'ampia varietà di ruoli, e a volte non è facile convincere tutti dei vantaggi della modalità wiki.\nPerciò, fa' la tua scelta.\n\nIl modello <strong>{{int:config-profile-wiki}}</strong> consente a chiunque di modificare, anche senza effettuare l'accesso.\nUn wiki con <strong>{{int:config-profile-no-anon}}</strong> offre una maggiore responsabilità, ma potrebbe scoraggiare i contributori occasionali.\n\nLo scenario <strong>{{int:config-profile-fishbowl}}</strong> consente agli utenti autorizzati di modificare, ma il pubblico può visualizzare le pagine, compresa la cronologia.\nUn <strong>{{int:config-profile-private}}</strong> consente solo agli utenti autorizzati di visualizzare le pagine, lo stesso gruppo può modificarle.\n\nConfigurazioni di diritti utente più complesse sono disponibili dopo l'installazione, vedi la  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa del manuale].",
        "config-license": "Copyright e licenza:",
        "config-install-subscribe-fail": "Impossibile sottoscrivere mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non è installato e <code>allow_url_fopen</code> non è disponibile.",
        "config-install-mainpage": "Creazione della pagina principale con contenuto predefinito",
+       "config-install-mainpage-exists": "La pagina principale già esiste, saltata",
        "config-install-extension-tables": "Creazione delle tabelle per le estensioni attivate",
        "config-install-mainpage-failed": "Impossibile inserire la pagina principale: $1",
        "config-install-done": "<strong>Complimenti!</strong>\nHai installato MediaWiki.\n\nIl programma di installazione ha generato un file <code>LocalSettings.php</code> che contiene tutte le impostazioni.\n\nDevi scaricarlo ed inserirlo nella directory base del tuo wiki (la stessa dove è presente index.php). Il download dovrebbe partire automaticamente.\n\nSe il download non si avvia, o se è stato annullato, puoi riavviarlo cliccando sul collegamento di seguito:\n\n$3\n\n<strong>Nota:</strong> se esci ora dall'installazione senza scaricare il file di configurazione che è stato generato, questo poi non sarà più disponibile in seguito.\n\nQuando hai fatto, puoi <strong>[$2 entrare nel tuo wiki]</strong>.",
index 2a09893..cf4eb6d 100644 (file)
@@ -20,7 +20,8 @@
                        "Otokoume",
                        "Rxy",
                        "Foresttttttt",
-                       "ネイ"
+                       "ネイ",
+                       "Suchichi02"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
        "config-cache-options": "オブジェクトのキャッシュの設定:",
        "config-cache-help": "オブジェクトのキャッシュを使用すると、頻繁に使用するデータをキャッシュするため MediaWiki の動作速度を改善できます。\n中〜大規模サイトではこれを有効にすることを強くお勧めします。小規模サイトでも同様に効果があります。",
        "config-cache-none": "キャッシングしない(機能は取り払われます、しかもより大きなウィキサイト上でスピードの問題が発生します)",
-       "config-cache-accel": "PHP オブジェクト キャッシュ (APC、XCache、WinCache のいずれか)",
+       "config-cache-accel": "PHPオブジェクトキャッシュ (APC、APCu、XCache、WinCache のいずれか)",
        "config-cache-memcached": "memcached を使用 (追加の設定が必要)",
        "config-memcached-servers": "memcached サーバー:",
        "config-memcached-help": "Memcachedを使用するIPアドレスの一覧。\nカンマ区切りで、利用する特定のポートの指定が必要です。例:\n127.0.0.1:11211\n192.168.1.25:1234",
index ce3ae88..f292ab3 100644 (file)
@@ -11,7 +11,8 @@
                        "Hwangjy9",
                        "Macofe",
                        "Mooozi",
-                       "Ykhwong"
+                       "Ykhwong",
+                       "Jerrykim306"
                ]
        },
        "config-desc": "미디어위키를 위한 설치 관리자",
@@ -60,7 +61,7 @@
        "config-unicode-using-intl": "유니코드 정규화에 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용합니다.",
        "config-unicode-pure-php-warning": "<strong>경고:</strong> 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
        "config-unicode-update-warning": "<strong>경고:</strong> 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
-       "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을 지원합니다}}: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysql</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 모듈도 설치해야 합니다.",
+       "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을}} 지원합니다: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysqli</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 패키지도 설치해야 합니다.",
        "config-outdated-sqlite": "<strong>경고:</strong> 최소 요구 버전 $2 보다 낮은 SQLite $1이(가) 있습니다. SQLite를 사용할 수 없습니다.",
        "config-no-fts3": "<strong>경고:</strong> SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
        "config-pcre-old": "<strong>치명:</strong> PCRE $1 또는 그 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].",
        "config-install-schema": "스키마를 만드는 중",
        "config-install-pg-schema-not-exist": "PostgreSQL 스키마가 존재하지 않습니다.",
        "config-install-pg-schema-failed": "테이블을 만드는 데 실패했습니다.\n\"$2\" 스키마에 쓸 수 있는 \"$1\" 사용자가 있는지 확인하세요.",
-       "config-install-pg-commit": "ë°\94ë\80\90 사항을 적용하는 중",
+       "config-install-pg-commit": "ë³\80ê²½사항을 적용하는 중",
        "config-install-pg-plpgsql": "PL/pgSQL 언어에 대해 확인하는 중",
        "config-pg-no-plpgsql": "$1 데이터베이스에 PL/pgSQL 언어를 설치해야 합니다",
        "config-pg-no-create-privs": "설치를 위한 지정한 계정에 계정을 만드는 데 충분한 권한이 없습니다,",
-       "config-pg-not-in-role": "웹 사용자로 지정한 계정이 이미 존재합니다.\n설치를 위해 지정한 사용자는 슈퍼 사용자와 웹 사용자의 역할 구성원이 아니므로 웹 사용자가 소유한 개체를 만들 수 없습니다.\n\n현재 미디어위키는 테이블을 웹 사용자가 소유해야 합니다. 다른 웹 계정 이름을 지정하거나 \"뒤로\"를 클릭하고 적절한 권한의 설치할 사용자를 지정하세요.",
+       "config-pg-not-in-role": "웹 사용자로 지정한 계정이 이미 존재합니다.\n설치를 위해 지정한 사용자는 슈퍼 사용자와 웹 사용자의 역할 원이 아니므로 웹 사용자가 소유한 개체를 만들 수 없습니다.\n\n현재 미디어위키는 테이블을 웹 사용자가 소유해야 합니다. 다른 웹 계정 이름을 지정하거나 \"뒤로\"를 클릭하고 적절한 권한의 설치할 사용자를 지정하세요.",
        "config-install-user": "데이터베이스 사용자를 만드는 중",
        "config-install-user-alreadyexists": "\"$1\" 사용자가 이미 존재합니다",
        "config-install-user-create-failed": "\"$1\" 사용자 만드는 데 실패: $2",
        "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파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n<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\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 설정하기 목록]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ 미디어위키 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* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 설정하기 목록]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ 미디어위키 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 3343db7..9a33d5b 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Mormegil",
                        "Purodha",
-                       "Reedy"
+                       "Reedy",
+                       "Seb35"
                ]
        },
        "config-desc": "Et Projramm för Mediwiki opzesäze.",
@@ -52,7 +53,7 @@
        "config-unicode-using-intl": "För et <i lang=\"en\">Unicode</i>-Nommaliseere dom_mer dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] nämme.",
        "config-unicode-pure-php-warning": "'''Opjepaß:''' Mer kunnte dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] för et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"a standard for the consistent encoding, representation, and handling of text expressed in most of the world's writing systems\">UNICODE</i>-Nommalisehre nit fenge. Dröm nämme mer dat eijfache, ävver ärsch lahme, <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"PHP Hypertext Preprocessor\">PHP</i>-Projrammschtök doför.\nFör jruuße Wikis met vill Metmaachere doht Üsch di Sigg övver et [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"a standard for the consistent encoding, representation, and handling of text expressed in most of the world's writing systems\">UNICODE</i>-Nommaliseere] (es op Änglesch) aanloore.",
        "config-unicode-update-warning": "'''Opjepaß:''' Dat Projramm för der <i lang=\"en\">Unicode</i> zo normaliseere boud em Momang op en  ählter Version vun dä Bibliothek vum [http://site.icu-project.org/ ICU-Projäk] op.\nDoht di [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations op der neuste Shtand bränge], wann auf dat Wiki em Äänz <i lang=\"en\">Unicode</i> bruche sull.",
-       "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä {{PLURAL:$2|Daatebangk|Daatebangke|Daatebangk}} ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
+       "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä {{PLURAL:$2|Daatebangk|Daatebangke|Daatebangk}} ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysqli</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
        "config-outdated-sqlite": "'''Opjepaß:''' <i lang=\"en\">SQLite</i> $1 es enschtaleert. Avver MediaWiki bruch <i lang=\"en\">SQLite</i> $2 udder hühter. <i lang=\"en\">SQLite</i> kann dröm nit enjesaz wääde.",
        "config-no-fts3": "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
        "config-pcre-old": "<strong>Fähler:</strong> PCRE $1 udder neuer es nüüdesch.\nPHP es jäz ävver met PCRE $2 zesamme jebonge.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mieh dohzoh].",
index d1b1a9b..7859d7a 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Robby",
                        "Soued031",
-                       "아라"
+                       "아라",
+                       "Seb35"
                ]
        },
        "config-desc": "Den Installatiounsprogramm vu MediaWiki",
@@ -45,7 +46,7 @@
        "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.",
        "config-env-php": "PHP $1 ass installéiert.",
        "config-env-hhvm": "HHVM $1 ass installéiert.",
-       "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
+       "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysqli</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
        "config-memory-bad": "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ass installéiert",
        "config-install-updates": "Net néideg Aktualiséierungen net maachen",
        "config-install-sysop": "Administrateur Benotzerkont gëtt ugeluecht",
        "config-install-mainpage": "Haaptsäit mat Standard-Inhalt gëtt ugeluecht",
+       "config-install-mainpage-exists": "Haaptsäit gëtt et schonn, iwwersprangen",
        "config-install-extension-tables": "D'Tabelle fir déi aktivéiert Erweiderunge ginn ugeluecht",
        "config-install-mainpage-failed": "D'Haaptsäit konnt net dragesat ginn: $1",
        "config-download-localsettings": "<code>LocalSettings.php</code> eroflueden",
index 1df843a..45f1331 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Hosseinblue",
                        "Arash71",
-                       "Lakzon"
+                       "Lakzon",
+                       "Seb35"
                ]
        },
        "config-desc": "نۀصب کۀر ویکی‌مدیا",
@@ -52,7 +53,7 @@
        "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.",
        "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
        "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
-       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|پرسش کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
+       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|پرسش کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysqli</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
        "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
index 15ccd01..2a270fc 100644 (file)
@@ -11,6 +11,7 @@
        "config-localsettings-upgrade": "Hita ny <code>LocalSettings.php</code>.\nMba hanavao ity fametrahana ity, atsofohy ny sandan'i <code>$wgUpgradeKey</code> amin'ny saha eo ambany.\nHo hitanao eo amin'i <code>LocalSettings.php</code> ilay izy.",
        "config-localsettings-key": "Lakile fanavaozana:",
        "config-localsettings-badkey": "Diso ilay lakile fanavaozana natsofokao.",
+       "config-localsettings-connection-error": "Nisy hadisoana nitranga teo am-pametrahana ny fifandraisana amin'ny banky angona miaraka amin'ny parametatra voalaza ao amin'i <code>LocalSettings.php</code>. Vahao ny olan'ireo parametatra ireo dia avereno fanindroany.\n\n$1",
        "config-session-error": "Hadisoana teo am-panombohana ny fidirana : $1",
        "config-your-language": "Ny fiteninao :",
        "config-your-language-help": "Hifidy ny teny ilaina amin'ny piraosesy fametrahana.",
        "config-env-hhvm": "Misy ato HHVM $1.",
        "config-unicode-using-intl": "Mampiasa ny [http://pecl.php.net/intl itatra PECL intl] ho an'ny fampifenerana Unicode.",
        "config-unicode-pure-php-warning": "<strong>Fampitandremana: </strong>  Ny [http://pecl.php.net/intl itatra PECL intl] dia tsy misy mba hahazakana ny fampifenerana Unicode, ka mitontona amin'ny implementasiona PHP ranoray noho ny tsifisiany.\nRaha hametraka tranonkala be mpamangy ianao dia tokony mamaky ny [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (amin'ny teny anglisy)",
+       "config-db-type": "Karazana banky angona:",
+       "config-db-host": "Anaran'ny lohamilin'ny banky angona:",
+       "config-db-host-help": "Raha lohamila hafa ny lohamilin'ny banky angona, dia atsofohy eto ny anaran'ilay lohamilina na ny adiresy IP-ny.\n\nRaha mampiasa fampiantranoana iombonana ianao dia tokony hanome anao ny anaran-dohamilina izy ao amin'ny toromariny.\n\nRaha mametraka amin'ny lohamilina Windows ianao sady mampiasa MySQL, dia mety tsy mandeha ny anaran-dohamilina \"localhost\". Raha tsy mandeha ilay izy dia \"127.0.0.1\" no atao adiresy IP an-toerana.\n\nRaha mampiasa PostgreSQL ianao, dia avelaho ho fotsy ity saha ity ahafahana mifandray amin'ny alalan'ny socket Unix.",
+       "config-db-host-oracle": "TNS an'ny banky angona:",
        "config-db-username": "Anaram-pikamban'ny banky angona :",
        "config-db-password": "Tenimiafin'ny banky angona :",
        "config-db-prefix": "Tovom-banky angona:",
index 649d9ce..70ef27a 100644 (file)
@@ -97,7 +97,7 @@
        "config-db-install-help": "Внесете го корисничкото име и лозинката што ќе се користи за поврзување со базата на податоци во текот на воспоставката.",
        "config-db-account-lock": "Користи го истото корисничко име и лозинка за редовна работа",
        "config-db-wiki-account": "Корисничко име за редовна работа",
-       "config-db-wiki-help": "Ð\92неÑ\81еÑ\82е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸ Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\88Ñ\82о Ñ\9cе Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82 Ð·Ð° Ð¿Ð¾Ð²Ñ\80зÑ\83ваÑ\9aе Ñ\81о Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ñ\80едовнаÑ\82а Ñ\80абоÑ\82а Ñ\81о Ð²Ð¸ÐºÐ¸Ñ\82о.\nÐ\90ко Ñ\81меÑ\82каÑ\82а Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82ои, Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86ионаÑ\82а Ñ\81меÑ\82ка Ð¸Ð¼Ð° Ð´Ð¾Ð²Ð¾Ð»Ð½Ð¾ Ð¿Ñ\80ивилегии, Ñ\82огаÑ\88 Ð¾Ð²Ð°Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87ка Ñ\81меÑ\82ка Ñ\9cе Ð±Ð¸Ð´Ðµ Ñ\81оздадена Ñ\81о Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ð½ите привилегии потребни за работа со викито.",
+       "config-db-wiki-help": "Ð\92неÑ\81еÑ\82е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸ Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\88Ñ\82о Ñ\9cе Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82 Ð·Ð° Ð¿Ð¾Ð²Ñ\80зÑ\83ваÑ\9aе Ñ\81о Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ñ\80едовнаÑ\82а Ñ\80абоÑ\82а Ñ\81о Ð²Ð¸ÐºÐ¸Ñ\82о.\nÐ\90ко Ñ\81меÑ\82каÑ\82а Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82ои, Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86ионаÑ\82а Ñ\81меÑ\82ка Ð¸Ð¼Ð° Ð´Ð¾Ð²Ð¾Ð»Ð½Ð¾ Ð¿Ñ\80ивилегии, Ñ\82огаÑ\88 Ð¾Ð²Ð°Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87ка Ñ\81меÑ\82ка Ñ\9cе Ð±Ð¸Ð´Ðµ Ñ\81оздадена Ñ\81о Ð½Ð°Ñ\98малите привилегии потребни за работа со викито.",
        "config-db-prefix": "Претставка на табелата на базата:",
        "config-db-prefix-help": "Ако треба да делите една база на податоци со повеќе викија, или со МедијаВики и друг мрежен програм, тогаш можете да додадете претставка на сите називи на табелите за да спречите проблематични ситуации.\nНе користете празни простори.\n\nОва поле обично се остава празно.",
        "config-mysql-old": "Се бара MySQL $1 или поново, а вие имате $2.",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "МедијаВики ги поддржува следниве системи на бази на податоци:\n\n$1\n\nАко системот што сакате да го користите не е наведен подолу, тогаш проследете ја горенаведената врска со инструкции за да овозможите поддршка за тој систем.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] е главната цел на МедијаВики и најдобро е поддржан. МедијаВики работи и со [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona], кои се складни со MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Како да срочите PHP со поддршка за MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). Може сè уште да има некои грешки. па затоа не се препорачува за употреба во производна средина. ([http://www.php.net/manual/en/pgsql.installation.php Како да срочите PHP со поддршка за PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). ([http://www.php.net/manual/en/pgsql.installation.php Како да срочите PHP со поддршка за PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] е лесен систем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да составите PHP со поддршка за SQLite], користи PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да составите PHP со поддршка за OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]  е база на податоци на комерцијално претпријатиe за Windows ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV поддршка])",
        "config-profile-help": "Викијата функционираат најдобро кога имаат што повеќе уредници.\nВо МедијаВики лесно се проверуваат скорешните промени, и лесно се исправа (технички: „враќа“) штетата направена од неупатени или злонамерни корисници.\n\nМногумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е лесно да убедите некого во предностите на вики-концептот.\nЗначи имате избор.\n\n'''{{int:config-profile-wiki}}''' — модел според кој секој може да уредува, дури и без најавување.\nАко имате вики со '''задолжително отворање на сметка''', тогаш добивате повеќе контрола, но ова може даги одврати спонтаните учесници.\n\n'''{{int:config-profile-fishbowl}}''' — може да уредуваат само уредници што имаат добиено дозвола за тоа, но јавноста може да ги гледа страниците, вклучувајќи ја нивната историја.\n'''{{int:config-profile-private}}''' — страниците се видливи и уредливи само за овластени корисници.\n\nПо воспоставката имате на избор и посложени кориснички права и поставки. Погледајте во [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights прирачникот].",
        "config-license": "Авторски права и лиценца:",
        "config-license-none": "Без подножје за лиценца",
-       "config-license-cc-by-sa": "Криејтив комонс НаведиИзвор СподелиПодИстиУслови",
-       "config-license-cc-by": "Криејтив комонс НаведиИзвор",
-       "config-license-cc-by-nc-sa": "Криејтив комонс НаведиИзвор-Некомерцијално-СподелиПодИстиУслови",
+       "config-license-cc-by-sa": "Криејтив комонс Наведи извор-Сподели под исти услови",
+       "config-license-cc-by": "Криејтив комонс Наведи извор",
+       "config-license-cc-by-nc-sa": "Криејтив комонс Наведи извор-Сподели под исти услови",
        "config-license-cc-0": "Криејтив комонс Нула (јавна сопственост)",
        "config-license-gfdl": "ГНУ-ова лиценца за слободна документација 1.3 или понова",
        "config-license-pd": "Јавна сопственост",
        "config-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>: Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\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://meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [https://meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дознајте како да се борите против спам на вашето вики]"
+       "mainpagedocfooter": "Погледнете го [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Упатството за корисници] за подетални информации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [https://meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [https://meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дознајте како да се борите против спам на вашето вики]"
 }
index 0fc0e9f..a37336e 100644 (file)
@@ -5,5 +5,6 @@
                        "Ninjastrikers"
                ]
        },
+       "config-help": "အကူအညီ",
        "mainpagetext": "<strong>မီဒီယာဝီကီကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။</strong>"
 }
index 1fcb1cb..b7a7289 100644 (file)
@@ -8,7 +8,8 @@
                        "Jeblad",
                        "Macofe",
                        "SuperPotato",
-                       "Jon Harald Søby"
+                       "Jon Harald Søby",
+                       "Seb35"
                ]
        },
        "config-desc": "Installasjonsprogrammet for MediaWiki",
@@ -57,7 +58,7 @@
        "config-unicode-using-intl": "Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "<strong>Advarsel:</strong> Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.\nDu bør [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
-       "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende {{PLURAL:$2|databasetype|databasetyper}} støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
+       "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende {{PLURAL:$2|databasetype|databasetyper}} støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysqli</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
        "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
        "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
        "config-pcre-old": "'''Alvorlig:''' PCRE $1 eller senere kreves.\nDin PHP-kode er lenket med PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Nærmere informasjon].",
        "config-install-subscribe-fail": "Ikke mulig å abonnere på mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL er ikke installert og <code>allow_url_fopen</code> er ikke tilgjengelig.",
        "config-install-mainpage": "Oppretter hovedside med standard innhold",
+       "config-install-mainpage-exists": "Hovedsiden eksisterer allerede, hopper over",
        "config-install-extension-tables": "Oppretter tabeller for aktiviserte utvidelser",
        "config-install-mainpage-failed": "Kunne ikke sette inn hovedside: $1",
        "config-install-done": "<strong>Gratulrerer!</strong>\nDu har lykkes i å installere MediaWiki.\n\nInstallasjonsprogrammet har generert en <code>LocalSettings.php</code>-fil.\nDen inneholder alle dine konfigureringer.\n\nDu må laste den ned og legge den på hovedfolderen for din wiki-installasjon (der index.php ligger). Nedlastingen skulle ha startet automatisk.\n\nHvis ingen nedlasting ble tilbudt, eller du avbrøt den, kan du få den i gang ved å klikke på lenken under:\n\n$3\n\n<strong>OBS:</strong> Hvis du ikke gjør dette nå, vil den genererte konfigurasjonsfilen ikke være tilgjengelig for deg senere.\n\nNår dette er gjort, kan du <strong>[$2 gå inn i wikien]</strong>.",
index 87a176c..f6b1d23 100644 (file)
@@ -17,7 +17,9 @@
                        "Esketti",
                        "JaapDeKleine",
                        "Macofe",
-                       "Hex"
+                       "Hex",
+                       "Mainframe98",
+                       "Rcdeboer"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
        "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
        "config-no-fts3": "<strong>Waarschuwing:</strong> SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; zoekfuncties zijn niet beschikbaar.",
        "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].",
-       "config-pcre-no-utf8": "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
+       "config-pcre-no-utf8": "<strong>Onherstelbare fout:</strong> de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
        "config-memory-raised": "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
        "config-memory-bad": "'''Waarschuwing:''' PHP's <code>memory_limit</code> is $1.\nDit is waarschijnlijk te laag.\nDe installatie kan mislukken!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] is op dit moment geïnstalleerd",
        "config-apc": "[http://www.php.net/apc APC] is op dit moment geïnstalleerd",
+       "config-apcu": "[http://www.php.net/apcu APCu] is geïnstalleerd",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd",
        "config-no-cache-apcu": "<strong>Waarschuwing:</strong> [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] of [http://www.iis.net/download/WinCacheForPhp WinCache] is niet aangetroffen.\nHet cachen van objecten is niet ingeschakeld.",
-       "config-mod-security": "'''Waarschuwing:''' uw webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nLees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
+       "config-mod-security": "<strong>Waarschuwing:</strong> Uw webserver heeft de module [http://modsecurity.org/ mod_security]/mod_security2 ingeschakeld. Veel standaard instellingen hiervan zorgen voor problemen in combinatie met MediaWiki en andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nIndien mogelijk, zou deze moeten worden uitgeschakeld. Lees anders de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
        "config-diff3-bad": "GNU diff3 niet aangetroffen.",
        "config-git": "Versiecontrolesoftware git is aangetroffen: <code>$1</code>",
        "config-git-bad": "Geen git versiecontrolesoftware aangetroffen.",
        "config-subscribe-help": "Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.\nAbonneer uzelf erop en werk uw MediaWiki-installatie bij als er nieuwe versies uitkomen.",
        "config-subscribe-noemail": "U hebt geprobeerd zich te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.\nGeef een e-mailadres op als u zich wilt abonneren op de mailinglijst.",
        "config-pingback": "Gegevens over deze installatie delen met MediaWiki-ontwikkelaars.",
+       "config-pingback-help": "Wanneer deze optie is geselecteerd, zal MediaWiki periodiek https://www.mediawiki.org pingen met informatie over deze MediaWiki instantie. Deze gegevens bevatten bijvoorbeeld het type systeem, de PHP versie, en de gekozen database. De WikiMedia Foundation deelt deze informatie met MediaWiki ontwikkelaars om toekomstige ontwikkeling te ondersteunen. De volgende gegevens zullen worden verstuurd voor uw systeem: \n<pre>$1</pre>",
        "config-almost-done": "U bent bijna klaar!\nAls u wilt kunt u de overige instellingen overslaan en de wiki nu installeren.",
        "config-optional-continue": "Stel me meer vragen.",
        "config-optional-skip": "Laat maar zitten, installeer gewoon de wiki.",
        "config-install-subscribe-fail": "Het is niet mogelijk te abonneren op mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL is niet geïnstalleerd en <code>allow_url_fopen</code> is niet beschikbaar.",
        "config-install-mainpage": "Hoofdpagina aanmaken met standaard inhoud",
+       "config-install-mainpage-exists": "Hoofdpagina bestaat al, overslaan",
        "config-install-extension-tables": "Tabellen voor ingeschakelde uitbreidingen worden aangemaakt",
        "config-install-mainpage-failed": "Het was niet mogelijk de hoofdpagina in te voegen: $1",
-       "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
+       "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsen, in dezelfde map als index.php.\nDe download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
+       "config-install-done-path": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in <code>$4</code> plaatsen. De download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> Als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
        "config-download-localsettings": "<code>LocalSettings.php</code> downloaden",
        "config-help": "hulp",
        "config-help-tooltip": "klik om uit te vouwen",
index e332690..3573c3e 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Cedric31",
                        "Jfblanc",
-                       "Seb35"
+                       "Seb35",
+                       "Nicolas Eynaud"
                ]
        },
        "config-desc": "Lo programa d’installacion de MediaWiki",
        "config-install-user-grant-failed": "Fracàs al moment de l'apondon de permissions a l'utilizaire « $1 » : $2",
        "config-install-user-missing": "L'utilizaire «$1» existís pas.",
        "config-install-tables": "Creacion de las taulas",
+       "config-install-interwiki-list": "Impossible de legir lo fichier <code>interwiki.list</code>.",
        "config-install-stats": "Inicializacion de las estatisticas",
        "config-install-keys": "Generacion de la clau secreta",
        "config-install-updates": "Empachar l’execucion de las mesas a jorn inutilas",
index f224b5d..d712afe 100644 (file)
        "config-install-subscribe-fail": "Nie można zapisać na listę „mediawiki-announce” – $1",
        "config-install-subscribe-notpossible": "cURL nie jest zainstalowany, więc <code>allow_url_fopen</code> nie jest dostępne.",
        "config-install-mainpage": "Tworzenie strony głównej z domyślną zawartością",
+       "config-install-mainpage-exists": "Strona główna już istnieje, pomijanie",
        "config-install-extension-tables": "Tworzenie tabel dla aktywnych rozszerzeń",
        "config-install-mainpage-failed": "Nie udało się wstawić strony głównej: $1",
        "config-install-done": "<strong>'''Gratulacje!</strong>\nUdało Ci się zainstalować MediaWiki.\n\nInstalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.\n\nMusisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.\n\nJeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:\n\n$3\n\n<strong>Uwaga</strong>: Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.\n\nPo załadowaniu pliku konfiguracyjnego możesz <strong>[$2 wejść na wiki]</strong>.",
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozszerzenia]?\n\nMożesz przejrzeć [https://www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix], aby zobaczyć pełną listę rozszerzeń.",
        "mainpagetext": "<strong>Instalacja MediaWiki powiodła się.</strong>",
-       "mainpagedocfooter": "Zapoznaj się z [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents informacjami o działaniu oprogramowania wiki].\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
+       "mainpagedocfooter": "Zapoznaj się z [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Podręcznikiem użytkownika] zawierającym informacje o tym jak korzystać z oprogramowania wiki.\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index 0747672..e97db42 100644 (file)
@@ -6,7 +6,8 @@
                        "Krinkle",
                        "아라",
                        "Amire80",
-                       "Macofe"
+                       "Macofe",
+                       "Seb35"
                ]
        },
        "config-desc": "L'instalador për mediaWiki",
@@ -55,7 +56,7 @@
        "config-unicode-using-intl": "As deuvra l'[http://pecl.php.net/intl estension intl PECL] për la normalisassion Unicode.",
        "config-unicode-pure-php-warning": "'''Avis:''' L'[http://pecl.php.net/intl estension intl PECL] a l'é pa disponìbil për gestì la normalisassion Unicode, da già che l'implementassion an PHP pur a faliss për lentëssa.\nS'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisassion Unicode].",
        "config-unicode-update-warning": "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].\nA dovrìa fé n'[https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
-       "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\n{{PLURAL:$2|La sòrt ëd base ëd dàit mantnùa a l'é costa|Le sòrt ëd base ëd dàit mantùe a son coste}} sì-dapress: $1.\n\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò anstalé, për esempi, ël mòdul <code>php5-mysql</code>.",
+       "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\n{{PLURAL:$2|La sòrt ëd base ëd dàit mantnùa a l'é costa|Le sòrt ëd base ëd dàit mantùe a son coste}} sì-dapress: $1.\n\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysqli</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò anstalé, për esempi, ël mòdul <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Avis''': chiel a l'ha SQLite $1, che a l'é pi vej che la version mìnima dont a-i é damanca $2. SQLite a sarà pa disponìbil.",
        "config-no-fts3": "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
        "config-pcre-no-utf8": "'''Fatal''': ël mòdul PCRE ëd PHP a smija esse compilà sensa l'apògg PCRE_UTF8.\nMediaWiki a ciama l'apògg d'UTF8 për marcé për da bin.",
index 8cf22e2..13944ee 100644 (file)
@@ -19,7 +19,9 @@
                        "Dianakc",
                        "Walesson",
                        "Almondega",
-                       "Luk3"
+                       "Luk3",
+                       "Eduardo Addad de Oliveira",
+                       "Warley Felipe C."
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -77,6 +79,7 @@
        "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
+       "config-apcu": "[http://www.php.net/apcu APCu] está instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
        "config-no-cache-apcu": "<strong>Aviso:</strong> Não se pode encontrar [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nO caching de objetos não foi ativado.",
        "config-mod-security": "<strong>Aviso:</strong> Seu servidor web tem [http://modsecurity.org/ mod_security] habilitado. Se configurado incorretamente, pode causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nConsulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.",
        "config-missing-db-host": "Você deve inserir um valor para \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Você deve inserir um valor para \"{{int:config-db-host-oracle}}\".",
        "config-connection-error": "$1\n\nVerifique o servidor, nome de usuário e senha e tente novamente.",
+       "config-db-sys-create-oracle": "O instalador só permite criar uma conta nova usando uma conta SYSDBA.",
        "config-db-sys-user-exists-oracle": "A conta de usuário $1 já existe. SYSDBA somente pode ser utilizado na criação de uma nova conta!",
        "config-postgres-old": "PostgreSQL $1 ou posterior é necessário. Você tem $2.",
        "config-mssql-old": "Microsoft SQL Server $1 ou posterior é necessário.Você tem $2.",
        "config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
        "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "O PHP não tem suporte FTS3; revertendo o esquema das tabelas para versão anterior",
+       "config-upgrade-done-no-regenerate": "Atualização completa.\n\nAgora pode [$1 começar a usar a sua wiki].",
        "config-regenerate": "Regenerar arquivo LocalSettings.php →",
        "config-show-table-status": "Consulta <code>SHOW TABLE STATUS</code> falhou!",
        "config-unknown-collation": "<strong>Aviso:</strong> O banco de dados está usando agrupamento não reconhecido.",
        "config-admin-error-user": "Erro interno ao criar um administrador com o nome \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Erro interno ao configurar uma senha para o administrador \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Você digitou um endereço de email inválido.",
+       "config-pingback": "Compartilhe dados sobre esta instalação com desenvolvedores do MediaWiki.",
        "config-almost-done": "Você está quase terminando!\nVocê agora pode pular as configurações restantes e instalar a wiki agora mesmo.",
        "config-optional-continue": "Faça-me mais perguntas.",
        "config-optional-skip": "Já estou aborrecido, apenas instale a wiki.",
        "config-profile-private": "Wiki privada",
        "config-license": "Direitos autorais e licenças:",
        "config-license-none": "Sem rodapé com a licença",
+       "config-license-cc-by-sa": "Creative Commons - Atribuição - Compartilha nos Mesmos Termos",
        "config-license-cc-by": "Atribuição Creative Commons",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ou posterior",
        "config-license-pd": "Domínio público",
        "config-license-cc-choose": "Selecionar uma licença personalizada da organização Creative Commons",
        "config-email-settings": "Configurações de email",
+       "config-enable-email": "Ativar mensagens eletrónicas de saída",
        "config-enable-email-help": "Se você quer que o email funcione, estas  [http://www.php.net/manual/en/mail.configuration.php configurações de email PHP] precisam ser configuradas corretamente. \nSe você não quiser usar nenhuma das funcionalidades, você pode desabilitá-las aqui.",
        "config-email-user": "Ativar emails entre usuários",
        "config-email-user-help": "Permitir que todos os usuários enviem email entre si se eles tiverem habilitado este recurso em suas preferências.",
        "config-advanced-settings": "Configuração avançada",
        "config-cache-options": "Configuração da cache de objetos:",
        "config-cache-help": "A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.\nSites de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.",
+       "config-cache-accel": "Cache de objetos PHP (APC, APCu, XCache ou WinCache)",
+       "config-cache-memcached": "Usar Memcached (requer instalação e configurações adicionais)",
+       "config-memcached-servers": "Servidores Memcached:",
+       "config-memcached-help": "Lista de endereços IP a serem usados para Memcached.\nDeve especificar um por linha e especificar a porta a ser utilizada. Por exemplo:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+       "config-memcache-needservers": "Você selecionou Memcached como seu tipo de cache, mas não especificou nenhum servidor.",
+       "config-memcache-badip": "Introduziu um endereço IP inválido para Memcached: $1.",
+       "config-memcache-noport": "Você não especificou uma porta para usar no servidor Memcached: $1.\nSe você não souber a porta, o padrão é 11211.",
+       "config-memcache-badport": "Os números de porta Memcached devem estar entre $1 e $2.",
        "config-extensions": "Extensões",
+       "config-skins": "Peles",
+       "config-skins-use-as-default": "Utilize esta skin como predefinição",
+       "config-skins-missing": "Não foram encontradas peles; MediaWiki usará uma pele de fallback até que você instale algumas adequadas.",
+       "config-skins-must-enable-some": "Você deve escolher pelo menos um skin para habilitar.",
+       "config-skins-must-enable-default": "A pele escolhida como padrão deve ser ativada.",
        "config-install-step-done": "feito",
        "config-install-step-failed": "falhou",
        "config-install-extensions": "Incluindo extensões",
        "config-install-pg-commit": "Enviando alterações",
        "config-install-user": "Criando usuário de banco de dados",
        "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
+       "config-install-user-create-failed": "Criando usuário \"$1\" falhou: $2",
+       "config-install-user-missing": "O usuário especificado, \"$1\", não existe.",
        "config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.",
        "config-install-tables": "Criando tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.",
+       "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
+       "config-install-interwiki": "Preenchendo a tabela padrão de interwiki",
+       "config-install-interwiki-list": "Não foi possível ler o arquivo <code>interwiki.list</code>.",
+       "config-install-stats": "Inicializando estatísticas",
        "config-install-keys": "Gerando senhas secretas",
+       "config-install-updates": "Impedir a execução de atualizações desnecessárias",
        "config-install-sysop": "Criando conta de usuário administrador",
+       "config-install-subscribe-fail": "Não foi possível subscrever o mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL não está instalada e <code>allow_url_fopen</code> não está disponível.",
        "config-install-mainpage": "Criando página principal com o conteúdo padrão",
+       "config-install-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ê concluiu a instalação do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
+       "config-install-done": "<strong>Parabéns!</strong>\nVocê instalou do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
        "config-download-localsettings": "Baixar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-help-tooltip": "clique para expandir",
        "config-nofile": "O arquivo \"$1\" não foi encontrado. Ele foi apagado?",
        "config-extension-link": "Você sabia que sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as  [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [https://www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
-       "mainpagetext": "<strong>O MediaWiki foi instalado com sucesso.</strong>",
+       "mainpagetext": "<strong>O MediaWiki foi instalado.</strong>",
        "mainpagedocfooter": "Consulte o [https://meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]"
 }
index f9a1fef..779a32f 100644 (file)
@@ -17,7 +17,8 @@
                        "Vitorvicentevalente",
                        "Macofe",
                        "Diniscoelho",
-                       "Ruila"
+                       "Ruila",
+                       "Seb35"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-env-php": "O PHP $1 está instalado.",
        "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-intl": "A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
-       "config-unicode-pure-php-warning": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
-       "config-unicode-update-warning": "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
-       "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
-       "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
-       "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
+       "config-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. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
+       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
+       "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
+       "config-outdated-sqlite": "<strong>Aviso:</strong> Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
+       "config-no-fts3": "<strong>Aviso:</strong> O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
-       "config-memory-bad": "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
+       "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
        "config-apc": "[http://www.php.net/apc APC] instalada",
-       "config-apcu": "[http://www.php.net/apcu APCu] está instalado",
+       "config-apcu": "[http://www.php.net/apcu APCu] instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada",
        "config-no-cache-apcu": "<strong>Aviso:</strong> Não foram encontrados o [http://www.php.net/apcu APCu], o [http://xcache.lighttpd.net/ XCache] ou o [http://www.iis.net/download/WinCacheForPhp WinCache].\nA cache de objetos não está ativa.",
-       "config-mod-security": "'''Aviso''': O seu servidor de internet tem o [http://modsecurity.org/ mod_security] ativado. Se este estiver mal configurado, pode causar problemas ao MediaWiki ou a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.\nConsulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
+       "config-mod-security": "<strong>Aviso:</strong> O seu servidor de Internet tem o [http://modsecurity.org/ mod_security]/mod_security2 ativado. Muitas das suas configurações normais podem causar problemas ao MediaWiki e a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.\nSe possível, isto deve ser desativado. Se não, consulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
        "config-diff3-bad": "O GNU diff3 não foi encontrado.",
        "config-git": "Foi encontrado o software de controlo de versões Git: <code>$1</code>.",
        "config-git-bad": "Não foi encontrado o software de controlo de versões Git.",
        "config-gd": "Foi encontrada a biblioteca gráfica GD.\nSe possibilitar uploads, a miniaturização de imagens será ativada.",
        "config-no-scaling": "Não foi encontrada a biblioteca gráfica GD nem o ImageMagick.\nA miniaturização de imagens será desativada.",
        "config-no-uri": "<strong>Erro:</strong> Não foi possível determinar o URI atual.\nA instalação foi abortada.",
-       "config-no-cli-uri": "'''Aviso''':  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
+       "config-no-cli-uri": "<strong>Aviso:</strong>  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
        "config-using-server": "Será usado o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Será usado o URL do servidor \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para carregamentos <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
-       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
-       "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
+       "config-uploads-not-safe": "<strong>Aviso:</strong> O diretório por omissão para carregamentos, <code>$1</code>, está vulnerável à execução arbitrária de listas de comandos (scripts).\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
+       "config-no-cli-uploads-check": "<strong>Aviso:</strong> O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de listas arbitrárias de comandos durante a instalação por CLI (\"Command-line Interface\").",
+       "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da Internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
        "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO componente ResourceLoader do MediaWiki consegue exceder este limite, mas prejudicando o desempenho.\nSe lhe for possível, deve atribuir ao parâmetro <code>suhosin.get.max_value_length</code> o valor 1024 ou maior no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
        "config-db-type": "Tipo da base de dados:",
        "config-db-host": "Servidor da base de dados:",
        "config-db-port": "Porta da base de dados:",
        "config-db-schema": "Esquema ''(schema)'' do MediaWiki",
        "config-db-schema-help": "Normalmente, este esquema estará correto.\nAltere-o só se souber que precisa de o fazer.",
-       "config-pg-test-error": "Não foi possível criar uma ligação à base de dados '''$1''': $2",
+       "config-pg-test-error": "Não foi possível criar uma ligação à base de dados <strong>$1</strong>: $2",
        "config-sqlite-dir": "Diretório de dados do SQLite:",
-       "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de Internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório '''não''' deve poder ser acedido diretamente da Internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-passe encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
+       "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de Internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório <strong>não</strong> deve poder ser acedido diretamente da Internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-passe encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
        "config-oracle-def-ts": "Tablespace padrão:",
        "config-oracle-temp-ts": "Tablespace temporário:",
        "config-type-mysql": "MySQL (ou compatível)",
        "config-skins-missing": "Não foi encontrado nenhum tema; o MediaWiki usará um tema de recurso até instalar temas adequados.",
        "config-skins-must-enable-some": "Deve escolher pelo menos um tema para ativar.",
        "config-skins-must-enable-default": "O tema escolhido como padrão deve ser ativado.",
-       "config-install-alreadydone": "'''Aviso:''' Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.\nPasse para a próxima página, por favor.",
+       "config-install-alreadydone": "<strong>Aviso:</strong> Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.\nPasse para a próxima página, por favor.",
        "config-install-begin": "Ao clicar \"{{int:config-continue}}\", vai iniciar a instalação do MediaWiki.\nSe quiser fazer mais alterações, clique \"{{int:config-back}}\".",
        "config-install-step-done": "terminado",
        "config-install-step-failed": "falhou",
        "config-install-user-missing": "O utilizador especificado, \"$1\", não existe.",
        "config-install-user-missing-create": "O utilizador especificado, \"$1\", não existe.\nMarque a caixa de seleção \"criar conta\" abaixo se pretende criá-la, por favor.",
        "config-install-tables": "A criar as tabelas",
-       "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
-       "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
-       "config-install-interwiki": "A preencher a tabela padrão de interwikis",
-       "config-install-interwiki-list": "Não foi possível encontrar o ficheiro <code>interwiki.list</code>.",
-       "config-install-interwiki-exists": "'''Aviso''': A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
+       "config-install-tables-exist": "<strong>Aviso:</strong> As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
+       "config-install-tables-failed": "<strong>Erro:</strong> A criação das tabelas falhou com o seguinte erro: $1",
+       "config-install-interwiki": "A preencher a tabela padrão de links interwikis",
+       "config-install-interwiki-list": "Não foi possível ler o ficheiro <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "<strong>Aviso:</strong> A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
        "config-install-stats": "A inicializar as estatísticas",
        "config-install-keys": "A gerar as chaves secretas",
-       "config-insecure-keys": "'''Aviso:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
+       "config-insecure-keys": "<strong>Aviso:</strong> {{PLURAL:$2|Uma chave segura|Chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
        "config-install-updates": "Evitar executar atualizações desnecessárias",
        "config-install-updates-failed": "<strong>Erro:</strong> A inserção de chaves de atualização nas tabelas falhou com o seguinte erro: $1",
        "config-install-sysop": "A criar a conta de administrador",
        "config-install-subscribe-fail": "Não foi possível subscrever a lista mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL não está instalado e <code>allow_url_fopen</code> não está disponível.",
-       "config-install-mainpage": "A criar a página principal com o conteúdo padrão.",
+       "config-install-mainpage": "A criar a página principal com o conteúdo padrão",
+       "config-install-mainpage-exists": "A página principal já existe; a saltar este passo",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
        "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de descarregar o ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este descarregamento deverá ter sido iniciado automaticamente.\n\nSe o descarregamento não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não o descarregar agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
index d7e86be..8d10b51 100644 (file)
@@ -17,7 +17,8 @@
                        "Siebrand",
                        "Umherirrender",
                        "Waldir",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Liuxinyu970226"
                ]
        },
        "config-desc": "Short description of the installer.",
        "config-install-subscribe-fail": "{{doc-important|\"[[m:mail:mediawiki-announce|mediawiki-announce]]\" is the name of a mailing list and should not be translated.}}\nA message displayed if the MediaWiki installer encounters an error making a request to lists.wikimedia.org which hosts the mailing list.\n* $1 - the HTTP error encountered, reproduced as is (English string)",
        "config-install-subscribe-notpossible": "Error shown when automatically subscribing to the MediaWiki announcements mailing list fails.",
        "config-install-mainpage": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+       "config-install-mainpage-exists": "Warning shown when installer attempts to create main page but it already exists.",
        "config-install-extension-tables": "Notice shown to the user during the install about progress.",
        "config-install-mainpage-failed": "Used as error message. Parameters:\n* $1 - detailed error message",
        "config-install-done": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.",
        "config-help": "This is used in help boxes.\n{{Identical|Help}}",
        "config-help-tooltip": "Tooltip for the 'help' links ({{msg-mw|config-help}}), to make it clear they'll expand in place rather than open a new page",
        "config-nofile": "Used as failure message. Parameters:\n* $1 - filename",
-       "config-extension-link": "Shown on last page of installation to inform about possible extensions.",
+       "config-extension-link": "Shown on last page of installation to inform about possible extensions.\n{{Identical|Did you know}}",
        "mainpagetext": "Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.",
        "mainpagedocfooter": "Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.\nThis might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example."
 }
index c285e73..fc9984e 100644 (file)
@@ -22,7 +22,8 @@
                        "Ильнар",
                        "Macofe",
                        "StasR",
-                       "Irus"
+                       "Irus",
+                       "Mailman"
                ]
        },
        "config-desc": "Инсталлятор MediaWiki",
@@ -31,7 +32,7 @@
        "config-localsettings-upgrade": "Обнаружен файл <code>LocalSettings.php</code>.\nДля обновления этой установки, пожалуйста, введите значение <code>$wgUpgradeKey</code>.\nЕго можно найти в файле <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Обнаружен файл <code>LocalSettings.php</code>.\nДля обновления этой установки, пожалуйста, запустите <code>update.php</code>",
        "config-localsettings-key": "Ключ обновления:",
-       "config-localsettings-badkey": "Ð\92Ñ\8b Ñ\83казали Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\8bй ÐºÐ»Ñ\8eÑ\87 Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f",
+       "config-localsettings-badkey": "Ð\92Ñ\8b Ñ\83казали Ð½ÐµÐ²ÐµÑ\80нÑ\8bй ÐºÐ»Ñ\8eÑ\87 Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f.",
        "config-upgrade-key-missing": "Обнаружена существующая установленная копия MediaWiki.\nЧтобы обновить обнаруженную установку, пожалуйста, добавьте следующую строку в конец вашего файла <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Похоже, что существующий файл <code>LocalSettings.php</code> неполон.\nНе установлена переменная $1.\nПожалуйста, измените <code>LocalSettings.php</code> так, чтобы значение этой переменной было задано, затем нажмите «{{int:Config-continue}}».",
        "config-localsettings-connection-error": "Произошла ошибка при подключении к базе данных с использованием настроек, указанных в <code>LocalSettings.php</code>. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1",
        "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Вы установили MediaWiki.\n\nВо время установки был создан файл <code>LocalSettings.php</code>.\nОн содержит все ваши настройки.\n\nВам необходимо скачать его и положить в корневую директорию вашей вики (ту же директорию, где находится файл index.php). Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\n<strong>Примечание</strong>: Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете <strong>[$2 войти в вашу вики]</strong>.",
index 21a3297..6dab088 100644 (file)
@@ -6,9 +6,14 @@
                        "Mehtab ahmed"
                ]
        },
+       "config-desc": "ميڊياوڪيءَ لاءِ تنصيبڪار",
+       "config-title": "ميڊياوڪي $1 تنصيب",
        "config-information": "معلومات",
+       "config-localsettings-key": "ڪنجي اپگريڊ ڪريو:",
        "config-localsettings-badkey": "توهان جي سنواري ڏنل ڪنجي غيردرست آهي.",
+       "config-session-error": "سيشن ھلائڻ ۾ خرابي:$1",
        "config-your-language": "توهان جي ٻولي:",
+       "config-your-language-help": "تنصيب جي عمل دوران استعمال ڪرڻ لاءِ ڪا ٻولي چونڊيو.",
        "config-wiki-language": "وڪِي ٻولي:",
        "config-back": "پوئتي ←",
        "config-continue": "اڳتي →",
@@ -16,7 +21,7 @@
        "config-page-welcome": "ذريعات‌وڪي تي ڀلي ڪري آيا!",
        "config-page-dbconnect": "اعدادخاني سان جُڙو",
        "config-page-upgrade": "هاڻوڪي تنصيبڪاريءَ کي سڌاريو",
-       "config-page-dbsettings": "اعدادخاÙ\86Ù\8a Ø¬Ù\88Ù\86 Ø³Ù\8aٽڱس",
+       "config-page-dbsettings": "اعدادخاÙ\86Ù\8a Ø¬Ù\88Ù\86 ØªØ±ØªÙ\8aبÙ\88Ù\86",
        "config-page-name": "نالو",
        "config-page-options": "آپشنس",
        "config-page-install": "تنصيبيو",
@@ -24,7 +29,9 @@
        "config-page-restart": "تنصيبڪاري وري کان شروع ڪريو",
        "config-page-readme": "مون کي پڙهو",
        "config-page-copying": "پرت ڪندي",
+       "config-page-upgradedoc": "اپگريڊڪندي",
        "config-page-existingwiki": "موجوده وڪِي",
+       "config-help-restart": "ڇا توھان سڄي سانڍيل ڊيٽا ختم ڪرڻ چاھيو ٿا جيڪا توھان داخل ڪئي آھي ۽ تنصيبڪاريءَ جي عمل کي ٻيھر شروع ڪرڻ چاھيو ٿا؟",
        "config-restart": "ها، وري کان شروع ڪريو",
        "config-env-php": "PHP $1 تنصيب ٿي چڪو",
        "config-env-hhvm": "HHVM $1 تنصيب ٿي چڪو."
index f434356..41884c6 100644 (file)
@@ -5,7 +5,8 @@
                        "Михајло Анђелковић",
                        "Milicevic01",
                        "Aktron",
-                       "Сербијана"
+                       "Сербијана",
+                       "Zoranzoki21"
                ]
        },
        "config-desc": "Инсталација за Медијавики",
@@ -82,6 +83,7 @@
        "config-skins": "Теме",
        "config-install-step-done": "готово",
        "config-install-step-failed": "није успело",
+       "config-install-mainpage-exists": "Главна страна већ постоји, прескакање",
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да проширите",
        "mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
index 45c5a7d..4f52403 100644 (file)
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki stöder följande databassystem:\n\n$1\n\nOm du inte ser det databassystem som du försöker använda nedanstående, följ då instruktionerna länkade ovan för aktivera stöd för det.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] är det primära målet för MediaWiki och det stöds bäst. MediaWiki fungerar även med [{{int:version-db-mariadb-url}} MariaDB] och [{{int:version-db-percona-url}} Percona Server], som är kompatibla med MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Hur man kompilerar PHP med stöd för MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] är ett populärt databassystem med öppen källkod som ett alternativ till MySQL. Det kan finnas några mindre kvarvarande buggar, och den rekommenderas inte för användning i en produktionsmiljö. ([http://www.php.net/manual/en/pgsql.installation.php Hur man kompilerar PHP med PostgreSQL stöd])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] är ett populärt databassystem med öppen källkod som ett alternativ till MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Hur man kompilerar PHP med PostgreSQL stöd])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] är en lättviktsdatabassystem med väldigt bra stöd. ([http://www.php.net/manual/en/pdo.installation.php Hur man kompilerar PHP med SQLite stöd], använder PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] är en kommersiellt databas för företag. ([http://www.php.net/manual/en/oci8.installation.php Hur man kompilerar PHP med OCI8 stöd])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] är en kommersiellt databas för företag för Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Hur man kompilerar PHP med SQLSRV stöd])",
        "config-install-subscribe-fail": "Det gick inte att prenumerera på mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL är inte installerad och <code>allow_url_fopen</code> är inte tillgänglig.",
        "config-install-mainpage": "Skapa huvudsida med standardinnehåll",
+       "config-install-mainpage-exists": "Huvudsidan finns redan, hoppar över",
        "config-install-extension-tables": "Skapar tabeller för aktiverade tillägg",
        "config-install-mainpage-failed": "Kunde inte infoga huvudsidan: $1",
        "config-install-done": "<strong>Grattis!</strong>\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n<strong>OBS</strong>: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du <strong>[$2 gå in på din wiki]</strong>",
        "config-nofile": "Filen \"$1\" kunde inte hittas. Har den raderats?",
        "config-extension-link": "Visste du att din wiki stödjer [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions tillägg]?\n\nDu kan bläddra [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category tillägg efter kategori].",
        "mainpagetext": "<strong>MediaWiki har installerats utan problem.</strong>",
-       "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [https://meta.wikimedia.org/wiki/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Läs om hur du bekämpar spam på din wiki]"
+       "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Läs om hur du bekämpar spam på din wiki]"
 }
index e68a079..ecb8e87 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Korrawit",
                        "Horus",
-                       "Octahedron80"
+                       "Octahedron80",
+                       "Aefgh39622"
                ]
        },
        "config-desc": "ตัวติดตั้งสำหรับมีเดียวิกิ",
@@ -74,6 +75,7 @@
        "config-admin-password": "รหัสผ่าน:",
        "config-admin-password-confirm": "รหัสผ่านอีกครั้ง:",
        "config-admin-email": "ที่อยู่อีเมล:",
+       "config-optional-continue": "ถามคำถามฉันอีก",
        "config-license-pd": "สาธารณสมบัติ",
        "config-extensions": "ส่วนขยาย",
        "config-install-step-done": "เสร็จสิ้น",
index 2ba2c27..e078752 100644 (file)
@@ -6,7 +6,8 @@
                        "아라",
                        "Amire80",
                        "Jojit fb",
-                       "Macofe"
+                       "Macofe",
+                       "Emem.calist"
                ]
        },
        "config-desc": "Ang tagapagluklok para sa MediaWiki",
        "config-install-subscribe-fail": "Hindi nagawang magpasipi mula sa mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "Hindi nakalagak ang cURL at hindi makukuha ang <code>allow_url_fopen</code>",
        "config-install-mainpage": "Nililikha ang pangunahing pahina na may likas na nakatakdang nilalaman",
+       "config-install-mainpage-exists": "Ang pangunahing pahina ay nakasaad na, ipagpatuloy ang paglalathala",
        "config-install-extension-tables": "Nililikha ang mga talahanayan para sa pinagaganang mga dugtong",
        "config-install-mainpage-failed": "Hindi maisingit ang pangunahing pahina: $1",
        "config-install-done": "'''Maligayang bati!'''\nMatagumpay mong nailuklok ang MediaWiki.\n\nAng tagapagluklok ay nakagawa ng isang talaksan ng <code>LocalSettings.php</code>.\nNaglalaman ito ng lahat ng iyong mga pagsasaayos.\n\nKailangan mo itong ikargang paibaba at ilagay ito sa lipon ng iyong pagluluklok ng wiki (katulad ng direktoryo ng index.php).  Ang pagkakargang paibaba ay dapat na kusang magsimula.\n\nKung ang pagkakargang paibaba ay hindi inialok, o kung hindi mo ito itinuloy, maaari mong muling simulan ang pagkakargang paibaba sa pamamagitan ng pagpindot sa kawing na nasa ibaba:\n\n$3\n\n'''Paunawa''': Kapag hindi mo ito ginawa ngayon, ang nagawang talaksang ito ng pagkakaayos ay hindi mo na makukuha mamaya kapag lumabas ka mula sa pagluluklok na hindi ikinakarga itong paibaba.\n\nKapag nagawa na iyan, maaari ka nang '''[$2 pumasok sa wiki mo]'''.",
index 3a96701..2cc0d1a 100644 (file)
        "config-license-pd": "Җәмгыять мирасы",
        "config-logo": "Логотип URL:",
        "config-cc-again": "Кабат сайлагыз...",
+       "config-advanced-settings": "Өстәмә көйләнмәләр",
        "config-extensions": "Киңәйтүләр",
        "config-skins": "Бизәлеш",
        "config-install-step-done": "әзер",
        "config-install-step-failed": "булмады",
        "config-help": "ярдәм",
        "mainpagetext": "<strong>«MediaWiki» куелды.</strong>",
-       "mainpagedocfooter": "Бу вики турында мәгълүматны [https://meta.wikimedia.org/wiki/Help:Contents/ru биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (рус.)];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru MediaWiki турында еш бирелгән сораулар һәм җаваплар (рус.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki сәхифәсенең яңа юрамалары турында хәбәрләр яздырып алу].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki сәхифәсен туган телегезгә тәрҗемә итү]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Үзегезнең викида ничек спам белән көрәшү турында мәгълүмат]"
+       "mainpagedocfooter": "Бу вики турында мәгълүматны [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (рус.)];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru MediaWiki турында еш бирелгән сораулар һәм җаваплар (рус.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki сәхифәсенең яңа юрамалары турында хәбәрләр яздырып алу].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki сәхифәсен туган телегезгә тәрҗемә итү]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Үзегезнең викида ничек спам белән көрәшү турында мәгълүмат]"
 }
index 7644f41..7873035 100644 (file)
        "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Ви успішно встановили MediaWiki.\n\nІнсталятор згенерував файл <code>LocalSettings.php</code>, який містить усі Ваші налаштування.\n\nВам необхідно завантажити його і помістити у кореневу папку Вашої вікі (туди ж, де index.php). Завантаження мало початись автоматично.\n\nЯкщо завантаження не почалось або Ви його скасували, можете заново його почати, натиснувши на посилання внизу:\n\n$3\n\n<strong>Примітка</strong>: Якщо Ви не зробите цього зараз, цей файл не буде доступним пізніше, коли Ви вийдете з встановлення, не скачавши його.\n\nПісля виконання дій, описаних вище, Ви зможете <strong>[$2 увійти у свою вікі]</strong>.",
index 0820ff5..0a7f8cd 100644 (file)
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki hỗ trợ các hệ thống cơ sở dữ liệu sau đây:\n\n$1\n\nNếu bạn không thấy hệ thống cơ sở dữ liệu mà bạn đang muốn sử dụng được liệt kê dưới đây, thì hãy theo chỉ dẫn được liên kết ở trên để kích hoạt tính năng hỗ trợ.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] là mục tiêu chính cho MediaWiki và được hỗ trợ tốt nhất. MediaWiki cũng làm việc với [{{int:version-db-mariadb-url}} MariaDB] và [{{int:version-db-percona-url}} Percona Server], là những cơ sở dữ liệu tương thích với MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] là một hệ thống cơ sở dữ liệu mã nguồn mở phổ biến như là một thay thế cho MySQL. Có thể có một số lỗi nhỏ lâu đời, và nó không được khuyến cáo sử dụng trong môi trường sản xuất. ([http://www.php.net/manual/en/pgsql.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] là một hệ thống cơ sở dữ liệu mã nguồn mở phổ biến như là một thay thế cho MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] là một hệ thống cơ sở dữ liệu dung lượng nhẹ được hỗ trợ rất tốt. ([http://www.php.net/manual/en/pdo.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của SQLite], sử dụng PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] là một cơ sở dữ liệu doanh nghiệp thương mại. ([http://www.php.net/manual/en/oci8.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] là một cơ sở dữ liệu doanh nghiệp thương mại cho Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của SQLSRV])",
        "config-install-subscribe-fail": "Không thể theo dõi mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL không được cài đặt và <code>allow_url_fopen</code> không có sẵn.",
        "config-install-mainpage": "Đang tạo trang đầu với nội dung mặc định",
+       "config-install-mainpage-exists": "Bỏ qua trang chính đã tồn tại",
        "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
        "config-install-done": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin <code>LocalSettings.php</code>.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
        "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?",
        "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions mở rộng]?\n\nBạn có thể truy cập [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại] hoặc [https://www.mediawiki.org/wiki/Extension_Matrix Ma trận Mở rộng] để xem danh sách đầy đủ các phần mở rộng.",
        "mainpagetext": "'''MediaWiki đã được cài đặt.'''",
-       "mainpagedocfooter": "Xin đọc [https://meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tìm hiểu cách chống spam tại wiki của bạn]"
+       "mainpagedocfooter": "Xin đọc [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tìm hiểu cách chống spam tại wiki của bạn]"
 }
index a3c3d24..ef7694a 100644 (file)
        "config-information": "Impormasyon",
        "config-localsettings-upgrade": "Mayda <code>LocalSettings.php</code> nga paypay nga nabilngan.  Basi ma-upgrade ini nga pag-installar, alayon pagbutáng han value han <code>$wgUpgradeKey</code> ha kahon ha ubós. Mabibilngan mo ini ha <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Mayda <code>LocalSettings.php</code> nga paypay nga nabilngan. Basi ma-upgrade ini nga pag-installar, alayon pagpadalagan lugod han <code>update.php</code>",
-       "config-localsettings-badkey": "An key nga imo ginhatag in diri asya.",
+       "config-localsettings-key": "Upgrade nga yabi:",
+       "config-localsettings-badkey": "Sayop an upgrade nga yabi nga imo ginhátag",
        "config-upgrade-key-missing": "Mayda daan na ng gin-installar nga MediaWiki nga nabilngan.\nBasi ma-upgrade ini nga pag-instalar, alayon pagbutang han nahasunod nga linya ha ubós han imo <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "An yana nga <code>LocalSettings.php</code> in baga diri kompleto.\nAn $1 variable in diri naka-set.\nAlayon igsaliwan an <code>LocalSettings.php</code> para ini nga variable in mai-set, ngan pidlita an \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "May-ada pagsayop an nahitabo han pagpapakabit ngada ha database nga gingagamitan hin mga kamumutangan nga dapat unta ginpapatuman han <code>LocalSettings.php</code>. Alayon ayda ini nga mga kamumutangan ngan utrohon nala.\n\n$1",
        "config-session-error": "Pakyas an pagtikang han session: $1",
+       "config-session-expired": "An imo sesyon nga data baga na hin naglahós na hin panahón\nIt mga sesyon gin-configure hin pagkaiha nga $1\nPuyde mo ini paiha-on ha pagset hit <code>session.gc_maxlifetime</code> ha php.ini.\nIgtikang hin utro an pag-instalar nga proseso.",
+       "config-no-session": "¡Nawarâ an imo sesyon nga data!\nKitaa an imo php.ini ngan siguroa nga an  <code>session.save_path</code> ginkadâ hin naangay nga direktory.",
        "config-your-language": "Imo pinulongán",
+       "config-your-language-help": "Pili-a in yinaknan nga gagamiton dida han proseso han pag-instalar.",
        "config-wiki-language": "Pinulongán han wiki",
        "config-wiki-language-help": "Pilía an pinulongán nga kauróg igsúsurat hit wiki",
        "config-back": "Bálik",
        "config-page-language": "Pinulongán",
        "config-page-welcome": "Maupay nga pag-abot ha MediaWiki!",
        "config-page-dbconnect": "Igsumpay ha database",
+       "config-page-upgrade": "Ig-upgrade it aada nga na-instalar",
+       "config-page-dbsettings": "Mga setting ha database",
        "config-page-name": "Ngaran",
+       "config-page-options": "Mga pagpipilian",
+       "config-page-install": "Ig-instalar",
        "config-page-complete": "Nakompleto!",
+       "config-page-restart": "Igbalik hin utro in pag-instalar",
        "config-page-readme": "Basaha ako",
+       "config-page-releasenotes": "Mga nota han ginpagawás",
        "config-page-copying": "Nagkokopya",
+       "config-page-upgradedoc": "Pag-upgrade",
+       "config-page-existingwiki": "Aada nga wiki",
+       "config-help-restart": "¿Karúyag mo ba ighawan an tanan nga gin-save nga data nga imo gin-enter ngan igbalik hin utro an proseso hin pag-instalar?",
        "config-restart": "Oo, utroha patikanga",
        "config-welcome": "=== Mga pagpanginano panlibong ===\nMagkakamay-ada yano nga panginano para masabtan kun ini nga libong in naaangay para hiton pagtataod hiton MediaWiki. Hinumdomi iton paglakip hinin nga impormasyon kun karuyag mo mangaro hin suporta kun paunan-on humanon an pagtataod.",
        "config-env-php": "Gin-install an PHP $1.",
index 55654bc..d0c0026 100644 (file)
@@ -80,7 +80,7 @@
        "config-memory-bad": "<strong>警告:</strong>PHP的内存使用上限<code>memory_limit</code>为$1。\n该设定可能过低,并导致安装失败!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安装",
        "config-apc": "[http://www.php.net/apc APC]已安装",
-       "config-apcu": "[http://www.php.net/apcu APCu]已安装",
+       "config-apcu": "已安装[http://www.php.net/apcu APCu]",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安装",
        "config-no-cache-apcu": "<strong>警告:</strong>找不到[http://www.php.net/apcu APCu]、[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache]。\n对象缓存未启用。",
        "config-mod-security": "<strong>警告:</strong>您的web服务器已启用[http://modsecurity.org/ mod_security]/mod_security2。它的很多常见配置可能导致MediaWiki及其他软件允许用户发布任意内容的问题。如果可能,这应当被禁用。否则,当您遭遇随机错误时,请参考[http://modsecurity.org/documentation/ mod_security 文档]或联络您的主机支持。",
        "config-profile-help": "如果您允许尽量多的人编写wiki,网站上的内容会更加丰富。在MediaWiki中,您可以轻松地审查最近更改,并轻易回退掉新手或破坏者造成的损害。\n\n然而,许多人觉得让MediaWiki存在多种角色将更加好用;同时,要说服所有人都愿以wiki的方式作贡献并非一件易事。因此,您可以有以下选择:\n\n<strong>{{int:config-profile-wiki}}</strong>模式允许包括未登录用户在内的所有人编辑。<strong>{{int:config-profile-no-anon}}</strong>的wiki需要额外的注册流程,这有可能会阻碍随意贡献者。\n\n<strong>{{int:config-profile-fishbowl}}</strong>方案只允许获批准的用户编辑,但对公众开放页面浏览(包括历史记录)。<strong>{{int:config-profile-private}}</strong>则只允许获批准的用户浏览、编辑页面。\n\n安装完成后,您还可以对用户权限进行更多、更复杂的配置,参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 相关的使用手册]。",
        "config-license": "版权和许可证:",
        "config-license-none": "页脚无许可证",
-       "config-license-cc-by-sa": "知识共享“署名-相同方式共享”",
+       "config-license-cc-by-sa": "知识共享署名-相同方式共享",
        "config-license-cc-by": "知识共享署名",
        "config-license-cc-by-nc-sa": "知识共享署名-非商业性使用-相同方式共享",
        "config-license-cc-0": "知识共享Zero(公有领域)",
        "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您已经安装了MediaWiki。\n\n安装程序已经生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下载该文件,并将其放在您wiki的根目录(index.php的同级目录)中。稍后下载将自动开始。\n\n如果浏览器没有提示您下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n<strong>注意:</strong>如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以<strong>[$2 进入您的wiki]</strong>。",
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
        "config-extension-link": "您是否知道您的wiki支持[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>已安装MediaWiki。</strong>",
-       "mainpagedocfooter": "请查阅[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
+       "mainpagedocfooter": "请查阅[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 用户指导]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
 }
index 2f2e934..faf5194 100644 (file)
@@ -16,7 +16,9 @@
                        "NigelSoft",
                        "Macofe",
                        "Reke",
-                       "Suchichi02"
+                       "Suchichi02",
+                       "Winstonyin",
+                       "Wehwei"
                ]
        },
        "config-desc": "MediaWiki 安裝程式",
@@ -74,7 +76,9 @@
        "config-memory-bad": "<strong>警告:</strong>PHP 的記憶體使用上限 <code>memory_limit</code> 為 $1。\n該設定值可能過低。\n這可能導致後續的安裝失敗!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] 已安裝",
        "config-apc": "[http://www.php.net/apc APC] 已安裝",
+       "config-apcu": "已安裝[http://www.php.net/apcu APCu]",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] 已安裝",
+       "config-no-cache-apcu": "<strong>警告:</strong>找不到[http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache]。未開啟物件緩存。",
        "config-mod-security": "<strong>警告:</strong>您的網頁伺服器已開啟 [http://modsecurity.org/ mod_security] 模組,如果設定不恰當會導致使用者可在 MediaWiki 或其他應用程式發佈任意的內容。\n若您遇到任何問題,請參考 [http://modsecurity.org/documentation/ mod_security 文件] 或聯繫您的伺服器技術支援人員。",
        "config-diff3-bad": "找不到 GNU diff3。",
        "config-git": "找到 Git 版本控制軟體:<code>$1</code>。",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki 支援以下資料庫系統:\n\n$1\n\n如果您下方沒有看到您要使用的資料庫系統,請根據上方連結指示開啟資料庫的支援。",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] 是 MediaWiki 主要支援的資料庫系統。MediaWiki 也同時可運作與於 [{{int:version-db-mariadb-url}} MariaDB] 和[{{int:version-db-percona-url}} Percona 伺服器],上述這些與 MySQL 相容的資料庫系統。([http://www.php.net/manual/en/mysqli.installation.php 如何編譯支援 MySQL 的 PHP])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] 是一套受歡迎的開源資料庫系統,在開源方案當中,可用來替代 MySQL。目前仍有一些次要的問題需要解決,較不建議使用在上線環境當中。 ([http://www.php.net/manual/en/pgsql.installation.php 如何編譯支援 PostgreSQL 的 PHP])。",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]是一套受歡迎的開源資料庫系統,可用來替代 MySQL。([http://www.php.net/manual/en/pgsql.installation.php 如何編譯支援PostgreSQL的PHP])。",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] 是一套輕量級的資料庫系統,MediaWiki 可在此資料庫系統上良好的運作。([http://www.php.net/manual/en/pdo.installation.php 如何編譯支援 SQLite 的 PHP],須透過 PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] 是一套商用企業級的資料庫。([http://www.php.net/manual/en/oci8.installation.php 如何編譯支援 OCI8 的 PHP])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] 是一套 Windows 專用的商用企業級的資料庫。 ([http://www.php.net/manual/en/sqlsrv.installation.php 如何編譯支援 SQLSRV 的 PHP])",
        "config-admin-password-mismatch": "兩次輸入的密碼並不相同。",
        "config-admin-email": "電子郵件地址:",
        "config-admin-email-help": "在此輸入的電子郵件信箱可用來接收 Wiki 上其他使用者所傳送的訊息、重設您的密碼與通知監視清單中頁面更動。您可將此欄位留空。",
-       "config-admin-error-user": "建立管理員帳號 \"<nowiki>$1</nowiki>\" 時發內部錯誤。",
-       "config-admin-error-password": "設定管理員 \"<nowiki>$1</nowiki>\" 的密碼時發內部錯誤:<pre>$2</pre>",
+       "config-admin-error-user": "建立管理員帳號 \"<nowiki>$1</nowiki>\" 時發內部錯誤。",
+       "config-admin-error-password": "設定管理員 \"<nowiki>$1</nowiki>\" 的密碼時發內部錯誤:<pre>$2</pre>",
        "config-admin-error-bademail": "您輸入了不正確的電子郵件地址。",
        "config-subscribe": "訂閱 [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發佈公告郵寄清單]。",
        "config-subscribe-help": "這是一個用於發佈公告的低郵件量郵寄清單,內容包括重要的安全公告。\n您應該訂閱它並在 MediaWiki 發佈新版的時候更新系統。",
        "config-subscribe-noemail": "您正嘗試不填寫電子郵件地址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電子郵件地址。",
+       "config-pingback": "與MediaWiki開發人員分享此安裝過程的數據。",
+       "config-pingback-help": "如果您選擇此項設定,MediaWiki將會定期把有關本MediaWiki實例的基本數據傳送給https://www.mediawiki.org。數據包括系統類型、PHP版本、所選的資料庫後端等等。維基媒體基金會會向MediaWiki的開發人員分享這組數據,以幫助將來的開發計劃。將會傳送以下有關您系統的數據:\n<pre>$1</pre>",
        "config-almost-done": "您快要完成了!\n您現在可以跳過其餘的設定項目並且立即安裝 Wiki。",
        "config-optional-continue": "多問我一些問題吧。",
        "config-optional-skip": "我已經不耐煩了,請趕緊安裝 Wiki。",
        "config-profile-help": "Wiki 最佳的運作方式是盡可能讓大家都可以編輯文件。\n在 MediaWiki,可以很輕易的審查最近做的所有變更動作,並且可以還原由新手或惡意使用者造成的損害。\n\n不論如何,很多人發現 MediaWiki 可以廣泛的運用在各種地方,但並不是很容易可以說服每個人都遵守對 Wiki 有益的方式。\n所以您必須做出以下選擇。\n\n使用 <strong>{{int:config-profile-wiki}}</strong> 模式,允許所有人編輯文章,包含未匿名使用者。\n使用 <strong>{{int:config-profile-no-anon}}</strong> 模式,允許所有人編輯文章,不包含未登入的使用者。此模式較能管理所有使用者的言論,但會扼殺臨時使用者的貢獻機會。\n\n使用 <strong>{{int:config-profile-fishbowl}}</strong> 模式,僅經核准的使用者可以編輯,所有人可以檢視頁面,包含修訂的記錄。\n使用 <strong>{{int:config-profile-private}}</strong> 模式,僅經核准的使用者可以編輯、檢視頁面。\n\n有關更多複雜的使用者權限設定可在安裝程序結束後設定,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 相關文件說明]。",
        "config-license": "版權聲明與授權條款:",
        "config-license-none": "無授權條款頁腳",
-       "config-license-cc-by-sa": "創作共用 姓名標示-相同方式分享",
-       "config-license-cc-by": "創作共用 Attribution",
+       "config-license-cc-by-sa": "創用 CC 姓名標示-相同方式分享",
+       "config-license-cc-by": "創用 CC 姓名標示",
        "config-license-cc-by-nc-sa": "創作共用 Attribution-NonCommercial-ShareAlike",
        "config-license-cc-0": "創作共用 Zero (公有領域)",
        "config-license-gfdl": "GNU 自由文件授權條款 1.3 或更高版本",
        "config-install-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您已經成功地安裝了 MediaWiki。\n\n安裝程式已自動產生 <code>LocalSettings.php</code> 檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在您的 Wiki 的根目錄 (index.php 所在的目錄) 中,下載稍後會自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>若您現在未下載檔案,稍後結束安裝程式之後將無法下載設定檔。\n\n當您完成本步驟後,您可以 <strong>[$2 進入您的 Wiki]</strong>。",
+       "config-install-done": "<strong>恭喜!</strong>\n您已經成功安裝MediaWiki。\n\n安裝程式已自動產生<code>LocalSettings.php</code>檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在您的Wiki的根目錄(index.php所在的目錄)中,下載應已自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>如果您現在不下載此檔案,稍後結束安裝程式之後將無法再下載設定檔。\n\n當您完成本步驟後,您可以<strong>[$2 進入您的Wiki]</strong>。",
+       "config-install-done-path": "<strong>恭喜!</strong>\n您已經成功安裝MediaWiki。\n\n安裝程式已自動產生<code>LocalSettings.php</code>檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在<code>$4</code>中,下載應已自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>如果您現在不下載此檔案,稍後結束安裝程式之後將無法再下載設定檔。\n\n當您完成本步驟後,您可以<strong>[$2 進入您的Wiki]</strong>。",
        "config-download-localsettings": "下載 <code>LocalSettings.php</code>",
        "config-help": "說明",
        "config-help-tooltip": "點選以展開",
        "config-nofile": "查無檔案 \"$1\",是否已被刪除?",
        "config-extension-link": "您是否了解您的 Wiki 支援 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 擴充套件]?\n\n\n您可以瀏覽 [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 擴充套件分類] 或 [https://www.mediawiki.org/wiki/Extension_Matrix 擴充套件資料表] 以取得相關的資訊。",
        "mainpagetext": "<strong>已安裝 MediaWiki。</strong>",
-       "mainpagedocfooter": "請參閱 [https://meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以取得使用 Wiki 的相關訊息!\n\n== 新手入門 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 系統設定]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常見問答集]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵寄清單]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki 介面在地化]"
+       "mainpagedocfooter": "有關使用wiki的訊息,請參閱[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 使用者指南]。\n\n== 新手入門 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 系統設定]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki常見問題]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki郵寄清單]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 將MediaWiki翻譯至您的語言]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上防禦破壞]"
 }
index 0e107b3..4ccca97 100644 (file)
@@ -187,7 +187,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
         * @note More logic is explained in DefaultSettings.
         *
         * @param string $prefix Interwiki prefix
-        * @return Interwiki
+        * @return Interwiki|false
         */
        private function getInterwikiCached( $prefix ) {
                $value = $this->getInterwikiCacheEntry( $prefix );
index 990f112..baff288 100644 (file)
@@ -27,6 +27,7 @@ use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * Job queue runner utility methods
@@ -46,6 +47,7 @@ class JobRunner implements LoggerAwareInterface {
        const MAX_ALLOWED_LAG = 3; // abort if more than this much DB lag is present
        const LAG_CHECK_PERIOD = 1.0; // check replica DB lag this many seconds
        const ERROR_BACKOFF_TTL = 1; // seconds to back off a queue due to errors
+       const READONLY_BACKOFF_TTL = 30; // seconds to back off a queue due to read-only errors
 
        /**
         * @param callable $debug Optional debug output handler
@@ -190,7 +192,7 @@ class JobRunner implements LoggerAwareInterface {
 
                                // Back off of certain jobs for a while (for throttling and for errors)
                                if ( $info['status'] === false && mt_rand( 0, 49 ) == 0 ) {
-                                       $ttw = max( $ttw, self::ERROR_BACKOFF_TTL ); // too many errors
+                                       $ttw = max( $ttw, $this->getErrorBackoffTTL( $info['error'] ) );
                                        $backoffDeltas[$jType] = isset( $backoffDeltas[$jType] )
                                                ? $backoffDeltas[$jType] + $ttw
                                                : $ttw;
@@ -253,6 +255,16 @@ class JobRunner implements LoggerAwareInterface {
                return $response;
        }
 
+       /**
+        * @param string $error
+        * @return int TTL in seconds
+        */
+       private function getErrorBackoffTTL( $error ) {
+               return strpos( $error, 'DBReadOnlyError' ) !== false
+                       ? self::READONLY_BACKOFF_TTL
+                       : self::ERROR_BACKOFF_TTL;
+       }
+
        /**
         * @param Job $job
         * @param LBFactory $lbFactory
index 6ae8837..d9457c6 100644 (file)
@@ -126,7 +126,7 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
 
        /**
         * @param string $name
-        * @return string
+        * @return string[]
         */
        private function decodeQueueName( $name ) {
                list( $type, $wiki ) = explode( '/', $name, 2 );
index a52ff06..3a0063c 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * Job to add recent change entries mentioning category membership changes
index f09ba57..2d816f9 100644 (file)
@@ -22,6 +22,8 @@
  * @ingroup Cache
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Job to purge the cache for all pages that link to or use another page or file
  *
@@ -113,7 +115,7 @@ class HTMLCacheUpdateJob extends Job {
                $touchTimestamp = wfTimestampNow();
 
                $dbw = wfGetDB( DB_MASTER );
-               $factory = wfGetLBFactory();
+               $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
                // Update page_touched (skipping pages already touched since the root job).
                // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
index 0e90674..5c73308 100644 (file)
@@ -128,8 +128,10 @@ class RecentChangesUpdateJob extends Job {
                                $dbw->setSessionOptions( [ 'connTimeout' => 900 ] );
 
                                $lockKey = wfWikiID() . '-activeusers';
-                               if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
-                                       return; // exclusive update (avoids duplicate entries)
+                               if ( !$dbw->lockIsFree( $lockKey, __METHOD__ ) || !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+                                       // Exclusive update (avoids duplicate entries)… it's usually fine to just drop out here,
+                                       // if the Job is already running.
+                                       return;
                                }
 
                                $nowUnix = time();
@@ -168,15 +170,6 @@ class RecentChangesUpdateJob extends Job {
                                        $names[$row->rc_user_text] = $row->lastedittime;
                                }
 
-                               // Rotate out users that have not edited in too long (according to old data set)
-                               $dbw->delete( 'querycachetwo',
-                                       [
-                                               'qcc_type' => 'activeusers',
-                                               'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
-                                       ],
-                                       __METHOD__
-                               );
-
                                // Find which of the recently active users are already accounted for
                                if ( count( $names ) ) {
                                        $res = $dbw->select( 'querycachetwo',
@@ -184,9 +177,13 @@ class RecentChangesUpdateJob extends Job {
                                                [
                                                        'qcc_type' => 'activeusers',
                                                        'qcc_namespace' => NS_USER,
-                                                       'qcc_title' => array_keys( $names ) ],
+                                                       'qcc_title' => array_keys( $names ),
+                                                       'qcc_value >= ' . $dbw->addQuotes( $nowUnix - $days * 86400 ), // TS_UNIX
+                                                ],
                                                __METHOD__
                                        );
+                                       // Note: In order for this to be actually consistent, we would need
+                                       // to update these rows with the new lastedittime.
                                        foreach ( $res as $row ) {
                                                unset( $names[$row->user_name] );
                                        }
@@ -224,6 +221,16 @@ class RecentChangesUpdateJob extends Job {
                                );
 
                                $dbw->unlock( $lockKey, __METHOD__ );
+
+                               // Rotate out users that have not edited in too long (according to old data set)
+                               $dbw->delete( 'querycachetwo',
+                                       [
+                                               'qcc_type' => 'activeusers',
+                                               'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
+                                       ],
+                                       __METHOD__
+                               );
+
                        },
                        __METHOD__
                );
index 5f33ae0..651a332 100644 (file)
@@ -247,6 +247,11 @@ class RefreshLinksJob extends Job {
                        $parserOutput
                );
 
+               // For legacy hook handlers doing updates via LinksUpdateConstructed, make sure
+               // any pending writes they made get flushed before the doUpdate() calls below.
+               // This avoids snapshot-clearing errors in LinksUpdate::acquirePageLock().
+               $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
+
                foreach ( $updates as $key => $update ) {
                        // FIXME: This code probably shouldn't be here?
                        // Needed by things like Echo notifications which need
index 41541ef..0c77a7b 100644 (file)
@@ -216,7 +216,7 @@ class FormatJson {
                        $count = 0;
                        $value =
                                preg_replace( '/,([ \t]*[}\]][^"\r\n]*([\r\n]|$)|[ \t]*[\r\n][ \t\r\n]*[}\]])/', '$1',
-                                       $value, - 1, $count );
+                                       $value, -1, $count );
                        if ( $count > 0 ) {
                                $result = json_decode( $value, $assoc );
                                if ( JSON_ERROR_NONE === json_last_error() ) {
index 910a7ca..8f5700a 100644 (file)
  * @ingroup HTTP
  */
 
+/**
+ * Cookie jar to use with MWHttpRequest. Does not handle cookie unsetting.
+ */
 class CookieJar {
+       /** @var Cookie[] */
        private $cookie = [];
 
        /**
index 3b34d9b..d4abdc8 100644 (file)
@@ -40,7 +40,7 @@ class ExplodeIterator implements Iterator {
        // The position after the end of the next delimiter
        private $endPos;
 
-       // The current token
+       /** @var string|false The current token */
        private $current;
 
        /**
index 70ce31d..4ddb813 100644 (file)
@@ -32,7 +32,7 @@ class HashRing {
        /** @var Array (location => (start, end)) */
        protected $ring = [];
 
-       /** @var Array (location => (start, end)) */
+       /** @var HashRing|null */
        protected $liveRing;
        /** @var Array (location => UNIX timestamp) */
        protected $ejectionExpiries = [];
index 4ba1bc3..1c141ab 100644 (file)
 class HtmlArmor {
 
        /**
-        * @var string
+        * @var string|null
         */
        private $value;
 
        /**
-        * @param string $value
+        * @param string|null $value
         */
        public function __construct( $value ) {
                $this->value = $value;
@@ -44,7 +44,8 @@ class HtmlArmor {
         * and get safe HTML back
         *
         * @param string|HtmlArmor $input
-        * @return string safe for usage in HTML
+        * @return string|null safe for usage in HTML, or null
+        *         if the HtmlArmor instance was wrapping null.
         */
        public static function getHtml( $input ) {
                if ( $input instanceof HtmlArmor ) {
index 16163fb..4a6e3fb 100644 (file)
@@ -253,7 +253,6 @@ class IEUrlExtension {
         *
         * @param $serverSoftware
         * @return bool
-        *
         */
        public static function haveUndecodedRequestUri( $serverSoftware ) {
                static $whitelist = [
index 2f5a454..db6869b 100644 (file)
@@ -58,7 +58,7 @@ class MapCacheLRU {
         * @return void
         */
        public function set( $key, $value ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
+               if ( $this->has( $key ) ) {
                        $this->ping( $key );
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
@@ -75,6 +75,9 @@ class MapCacheLRU {
         * @return bool
         */
        public function has( $key ) {
+               if ( !is_int( $key ) && !is_string( $key ) ) {
+                       throw new MWException( __METHOD__ . ' called with invalid key. Must be string or integer.' );
+               }
                return array_key_exists( $key, $this->cache );
        }
 
@@ -87,7 +90,7 @@ class MapCacheLRU {
         * @return mixed Returns null if the key was not found
         */
        public function get( $key ) {
-               if ( !array_key_exists( $key, $this->cache ) ) {
+               if ( !$this->has( $key ) ) {
                        return null;
                }
 
index 6b10c09..cffb5a3 100644 (file)
@@ -54,6 +54,59 @@ class StringUtils {
                        ( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
        }
 
+       /**
+        * Explode a string, but ignore any instances of the separator inside
+        * the given start and end delimiters, which may optionally nest.
+        * The delimiters are literal strings, not regular expressions.
+        * @param string $startDelim Start delimiter
+        * @param string $endDelim End delimiter
+        * @param string $separator Separator string for the explode.
+        * @param string $subject Subject string to explode.
+        * @param bool $nested True iff the delimiters are allowed to nest.
+        * @return ArrayIterator
+        */
+       static function delimiterExplode( $startDelim, $endDelim, $separator,
+               $subject, $nested = false ) {
+               $inputPos = 0;
+               $lastPos = 0;
+               $depth = 0;
+               $encStart = preg_quote( $startDelim, '!' );
+               $encEnd = preg_quote( $endDelim, '!' );
+               $encSep = preg_quote( $separator, '!' );
+               $len = strlen( $subject );
+               $m = [];
+               $exploded = [];
+               while (
+                       $inputPos < $len &&
+                       preg_match(
+                               "!$encStart|$encEnd|$encSep!S", $subject, $m,
+                               PREG_OFFSET_CAPTURE, $inputPos
+                       )
+               ) {
+                       $match = $m[0][0];
+                       $matchPos = $m[0][1];
+                       $inputPos = $matchPos + strlen( $match );
+                       if ( $match === $separator ) {
+                               if ( $depth === 0 ) {
+                                       $exploded[] = substr(
+                                               $subject, $lastPos, $matchPos - $lastPos
+                                       );
+                                       $lastPos = $inputPos;
+                               }
+                       } elseif ( $match === $startDelim ) {
+                               if ( $depth === 0 || $nested ) {
+                                       $depth++;
+                               }
+                       } else {
+                               $depth--;
+                       }
+               }
+               $exploded[] = substr( $subject, $lastPos );
+               // This method could be rewritten in the future to avoid creating an
+               // intermediate array, since the return type is just an iterator.
+               return new ArrayIterator( $exploded );
+       }
+
        /**
         * Perform an operation equivalent to `preg_replace()`
         *
@@ -115,6 +168,7 @@ class StringUtils {
        ) {
                $inputPos = 0;
                $outputPos = 0;
+               $contentPos = 0;
                $output = '';
                $foundStart = false;
                $encStart = preg_quote( $startDelim, '!' );
index 9c1ec8e..016c9b1 100644 (file)
  * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
  * package for use with PHP5 (Zend PHP) and is built-in to HHVM 3.3.0.
  *
+ * This also supports using the Tideways profiler
+ * <https://github.com/tideways/php-profiler-extension>, which additionally
+ * has support for PHP7.
+ *
  * @since 1.28
  */
 class Xhprof {
@@ -43,10 +47,16 @@ class Xhprof {
         */
        public static function enable( $flags = 0, $options = [] ) {
                if ( self::isEnabled() ) {
-                       throw new Exception( 'Xhprof profiling is already enabled.' );
+                       throw new Exception( 'Profiling is already enabled.' );
                }
                self::$enabled = true;
-               xhprof_enable( $flags, $options );
+               if ( function_exists( 'xhprof_enable' ) ) {
+                       xhprof_enable( $flags, $options );
+               } elseif ( function_exists( 'tideways_enable' ) ) {
+                       tideways_enable( $flags, $options );
+               } else {
+                       throw new Exception( "Neither xhprof nor tideways are installed" );
+               }
        }
 
        /**
@@ -57,7 +67,12 @@ class Xhprof {
        public static function disable() {
                if ( self::isEnabled() ) {
                        self::$enabled = false;
-                       return xhprof_disable();
+                       if ( function_exists( 'xhprof_disable' ) ) {
+                               return xhprof_disable();
+                       } else {
+                               // tideways
+                               return tideways_disable();
+                       }
                }
        }
 }
index b0cd413..304f6c1 100644 (file)
@@ -65,4 +65,3 @@ abstract class EventRelayer implements LoggerAwareInterface {
         */
        abstract protected function doNotify( $channel, array $events );
 }
-
index bd2ce5d..a7ceab2 100644 (file)
@@ -729,7 +729,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * @see FileBackendStore::getFileXAttributes()
         * @param array $params
-        * @return bool|string
+        * @return array[][]
         */
        protected function doGetFileXAttributes( array $params ) {
                return [ 'headers' => [], 'metadata' => [] ]; // not supported
index 08cb388..d40e896 100644 (file)
@@ -1701,7 +1701,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @param array $creds From getAuthentication()
         * @param string $container
         * @param string $object
-        * @return array
+        * @return string
         */
        protected function storageUrl( array $creds, $container = null, $object = null ) {
                $parts = [ $creds['storage_url'] ];
index bee34dc..c629e7d 100644 (file)
@@ -34,7 +34,7 @@ use Wikimedia\WaitConditionLoop;
  *
  * Locks on resource keys can either be shared or exclusive.
  *
- * Implementations must keep track of what is locked by this proccess
+ * Implementations must keep track of what is locked by this process
  * in-memory and support nested locking calls (using reference counting).
  * At least LOCK_UW and LOCK_EX must be implemented. LOCK_SH can be a no-op.
  * Locks should either be non-blocking or have low wait timeouts.
@@ -170,7 +170,7 @@ abstract class LockManager {
        /**
         * Get the base 36 SHA-1 of a string, padded to 31 digits.
         * Before hashing, the path will be prefixed with the domain ID.
-        * This should be used interally for lock key or file names.
+        * This should be used internally for lock key or file names.
         *
         * @param string $path
         * @return string
@@ -182,7 +182,7 @@ abstract class LockManager {
        /**
         * Get the base 16 SHA-1 of a string, padded to 31 digits.
         * Before hashing, the path will be prefixed with the domain ID.
-        * This should be used interally for lock key or file names.
+        * This should be used internally for lock key or file names.
         *
         * @param string $path
         * @return string
index e42d1a9..6ea3c21 100644 (file)
@@ -83,7 +83,7 @@ class MimeAnalyzer implements LoggerAwareInterface {
         * what will break? In practice this probably isn't a problem anyway -- Bryan)
         */
        protected static $wellKnownTypes = <<<EOT
-application/ogg ogx ogg ogm ogv oga spx
+application/ogg ogx ogg ogm ogv oga spx opus
 application/pdf pdf
 application/vnd.oasis.opendocument.chart odc
 application/vnd.oasis.opendocument.chart-template otc
@@ -108,7 +108,8 @@ audio/midi mid midi kar
 audio/mpeg mpga mpa mp2 mp3
 audio/x-aiff aif aiff aifc
 audio/x-wav wav
-audio/ogg oga spx ogg
+audio/ogg oga spx ogg opus
+audio/opus opus ogg oga ogg spx
 image/x-bmp bmp
 image/gif gif
 image/jpeg jpeg jpg jpe
@@ -526,7 +527,7 @@ EOT;
                        'xbm',
 
                        // Formats we recognize magic numbers for
-                       'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx',
+                       'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx', 'opus',
                        'mid', 'pdf', 'wmf', 'xcf', 'webm', 'mkv', 'mka',
                        'webp',
 
@@ -1054,6 +1055,8 @@ EOT;
                                return MEDIATYPE_AUDIO;
                        } elseif ( strpos( $head, 'speex' ) !== false ) {
                                return MEDIATYPE_AUDIO;
+                       } elseif ( strpos( $head, 'opus' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
                        } else {
                                return MEDIATYPE_MULTIMEDIA;
                        }
index 3958f8c..7f2bf5e 100644 (file)
@@ -291,8 +291,6 @@ class XmlTypeCheck {
                $this->stackDepth++;
        }
 
-       /**
-        */
        private function elementClose() {
                list( $name, $attribs ) = array_pop( $this->elementDataContext );
                $data = array_pop( $this->elementData );
index b04d3c6..5edd889 100644 (file)
@@ -35,6 +35,7 @@ audio/wav audio/x-wav audio/wave      [AUDIO]
 audio/midi audio/mid   [AUDIO]
 audio/basic            [AUDIO]
 audio/ogg              [AUDIO]
+audio/opus             [AUDIO]
 audio/x-aiff           [AUDIO]
 audio/x-pn-realaudio   [AUDIO]
 audio/x-realaudio      [AUDIO]
index b4f515a..f1cd59d 100644 (file)
@@ -72,6 +72,7 @@ audio/basic au snd
 audio/midi mid midi kar
 audio/mpeg mpga mp2 mp3
 audio/ogg oga ogg spx opus
+audio/opus opus oga ogg
 video/webm webm
 audio/webm webm
 audio/x-aiff aif aiff aifc
index 02b3c92..6e6a3ad 100644 (file)
@@ -72,7 +72,7 @@ class APCUBagOStuff extends APCBagOStuff {
                if ( apcu_exists( $key . self::KEY_SUFFIX ) ) {
                        return apcu_inc( $key . self::KEY_SUFFIX, $value );
                } else {
-                       return apcu_set( $key . self::KEY_SUFFIX, $value );
+                       return false;
                }
        }
 
@@ -85,7 +85,7 @@ class APCUBagOStuff extends APCBagOStuff {
                if ( apcu_exists( $key . self::KEY_SUFFIX ) ) {
                        return apcu_dec( $key . self::KEY_SUFFIX, $value );
                } else {
-                       return apcu_set( $key . self::KEY_SUFFIX, -$value );
+                       return false;
                }
        }
 }
index 8d3c6d9..75c79a9 100644 (file)
@@ -275,8 +275,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $checkKeysForAll = [];
                $checkKeysByKey = [];
                $checkKeysFlat = [];
-               foreach ( $checkKeys as $i => $keys ) {
-                       $prefixed = self::prefixCacheKeys( (array)$keys, self::TIME_KEY_PREFIX );
+               foreach ( $checkKeys as $i => $checkKeyGroup ) {
+                       $prefixed = self::prefixCacheKeys( (array)$checkKeyGroup, self::TIME_KEY_PREFIX );
                        $checkKeysFlat = array_merge( $checkKeysFlat, $prefixed );
                        // Is this check keys for a specific cache key, or for all keys being fetched?
                        if ( is_int( $i ) ) {
@@ -448,7 +448,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                $wrapExtra[self::FLD_FLAGS] = self::FLG_STALE; // mark as stale
                        // Case B: any long-running transaction; ignore this set()
                        } elseif ( $age > self::MAX_READ_LAG ) {
-                               $this->logger->warning( "Rejected set() for $key due to snapshot lag." );
+                               $this->logger->info( "Rejected set() for $key due to snapshot lag." );
 
                                return true; // no-op the write for being unsafe
                        // Case C: high replication lag; lower TTL instead of ignoring all set()s
@@ -457,7 +457,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                $this->logger->warning( "Lowered set() TTL for $key due to replication lag." );
                        // Case D: medium length request with medium replication lag; ignore this set()
                        } else {
-                               $this->logger->warning( "Rejected set() for $key due to high read lag." );
+                               $this->logger->info( "Rejected set() for $key due to high read lag." );
 
                                return true; // no-op the write for being unsafe
                        }
@@ -1127,6 +1127,65 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                return $values;
        }
 
+       /**
+        * Locally set a key to expire soon if it is stale based on $purgeTimestamp
+        *
+        * This sets stale keys' time-to-live at HOLDOFF_TTL seconds, which both avoids
+        * broadcasting in mcrouter setups and also avoids races with new tombstones.
+        *
+        * @param string $key Cache key
+        * @param int $purgeTimestamp UNIX timestamp of purge
+        * @param bool &$isStale Whether the key is stale
+        * @return bool Success
+        * @since 1.28
+        */
+       public function reap( $key, $purgeTimestamp, &$isStale = false ) {
+               $minAsOf = $purgeTimestamp + self::HOLDOFF_TTL;
+               $wrapped = $this->cache->get( self::VALUE_KEY_PREFIX . $key );
+               if ( is_array( $wrapped ) && $wrapped[self::FLD_TIME] < $minAsOf ) {
+                       $isStale = true;
+                       $this->logger->warning( "Reaping stale value key '$key'." );
+                       $ttlReap = self::HOLDOFF_TTL; // avoids races with tombstone creation
+                       $ok = $this->cache->changeTTL( self::VALUE_KEY_PREFIX . $key, $ttlReap );
+                       if ( !$ok ) {
+                               $this->logger->error( "Could not complete reap of key '$key'." );
+                       }
+
+                       return $ok;
+               }
+
+               $isStale = false;
+
+               return true;
+       }
+
+       /**
+        * Locally set a "check" key to expire soon if it is stale based on $purgeTimestamp
+        *
+        * @param string $key Cache key
+        * @param int $purgeTimestamp UNIX timestamp of purge
+        * @param bool &$isStale Whether the key is stale
+        * @return bool Success
+        * @since 1.28
+        */
+       public function reapCheckKey( $key, $purgeTimestamp, &$isStale = false ) {
+               $purge = $this->parsePurgeValue( $this->cache->get( self::TIME_KEY_PREFIX . $key ) );
+               if ( $purge && $purge[self::FLD_TIME] < $purgeTimestamp ) {
+                       $isStale = true;
+                       $this->logger->warning( "Reaping stale check key '$key'." );
+                       $ok = $this->cache->changeTTL( self::TIME_KEY_PREFIX . $key, 1 );
+                       if ( !$ok ) {
+                               $this->logger->error( "Could not complete reap of check key '$key'." );
+                       }
+
+                       return $ok;
+               }
+
+               $isStale = false;
+
+               return false;
+       }
+
        /**
         * @see BagOStuff::makeKey()
         * @param string ... Key component
@@ -1358,7 +1417,9 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        return false;
                }
 
-               // Lifecycle is: new, ramp-up refresh chance, full refresh chance
+               // Lifecycle is: new, ramp-up refresh chance, full refresh chance.
+               // Note that the "expected # of refreshes" for the ramp-up time range is half of what it
+               // would be if P(refresh) was at its full value during that time range.
                $refreshWindowSec = max( $timeTillRefresh - $ageNew - self::RAMPUP_TTL / 2, 1 );
                // P(refresh) * (# hits in $refreshWindowSec) = (expected # of refreshes)
                // P(refresh) * ($refreshWindowSec * $popularHitsPerSec) = 1
diff --git a/includes/libs/objectcache/WANObjectCacheReaper.php b/includes/libs/objectcache/WANObjectCacheReaper.php
new file mode 100644 (file)
index 0000000..956a3a9
--- /dev/null
@@ -0,0 +1,205 @@
+<?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 Cache
+ * @author Aaron Schulz
+ */
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+use Wikimedia\ScopedCallback;
+
+/**
+ * Class for scanning through chronological, log-structured data or change logs
+ * and locally purging cache keys related to entities that appear in this data.
+ *
+ * This is useful for repairing cache when purges are missed by using a reliable
+ * stream, such as Kafka or a replicated MySQL table. Purge loss between datacenters
+ * is expected to be more common than within them.
+ *
+ * @since 1.28
+ */
+class WANObjectCacheReaper implements LoggerAwareInterface {
+       /** @var WANObjectCache */
+       protected $cache;
+       /** @var BagOStuff */
+       protected $store;
+       /** @var callable */
+       protected $logChunkCallback;
+       /** @var callable */
+       protected $keyListCallback;
+       /** @var LoggerInterface */
+       protected $logger;
+
+       /** @var string */
+       protected $channel;
+       /** @var integer */
+       protected $initialStartWindow;
+
+       /**
+        * @param WANObjectCache $cache Cache to reap bad keys from
+        * @param BagOStuff $store Cache to store positions use for locking
+        * @param callable $logCallback Callback taking arguments:
+        *          - The starting position as a UNIX timestamp
+        *          - The starting unique ID used for breaking timestamp collisions or null
+        *          - The ending position as a UNIX timestamp
+        *          - The maximum number of results to return
+        *        It returns a list of maps of (key: cache key, pos: UNIX timestamp, id: unique ID)
+        *        for each key affected, with the corrosponding event timestamp/ID information.
+        *        The events should be in ascending order, by (timestamp,id).
+        * @param callable $keyCallback Callback taking arguments:
+        *          - The WANObjectCache instance
+        *          - An object from the event log
+        *        It should return a list of WAN cache keys.
+        *        The callback must fully duck-type test the object, since can be any model class.
+        * @param array $params Additional options:
+        *          - channel: the name of the update event stream.
+        *            Default: WANObjectCache::DEFAULT_PURGE_CHANNEL.
+        *          - initialStartWindow: seconds back in time to start if the position is lost.
+        *            Default: 1 hour.
+        *          - logger: an SPL monolog instance [optional]
+        */
+       public function __construct(
+               WANObjectCache $cache,
+               BagOStuff $store,
+               callable $logCallback,
+               callable $keyCallback,
+               array $params
+       ) {
+               $this->cache = $cache;
+               $this->store = $store;
+
+               $this->logChunkCallback = $logCallback;
+               $this->keyListCallback = $keyCallback;
+               if ( isset( $params['channel'] ) ) {
+                       $this->channel = $params['channel'];
+               } else {
+                       throw new UnexpectedValueException( "No channel specified." );
+               }
+
+               $this->initialStartWindow = isset( $params['initialStartWindow'] )
+                       ? $params['initialStartWindow']
+                       : 3600;
+               $this->logger = isset( $params['logger'] )
+                       ? $params['logger']
+                       : new NullLogger();
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       /**
+        * Check and reap stale keys based on a chunk of events
+        *
+        * @param int $n Number of events
+        * @return int Number of keys checked
+        */
+       final public function invoke( $n = 100 ) {
+               $posKey = $this->store->makeGlobalKey( 'WANCache', 'reaper', $this->channel );
+               $scopeLock = $this->store->getScopedLock( "$posKey:busy", 0 );
+               if ( !$scopeLock ) {
+                       return 0;
+               }
+
+               $now = time();
+               $status = $this->store->get( $posKey );
+               if ( !$status ) {
+                       $status = [ 'pos' => $now - $this->initialStartWindow, 'id' => null ];
+               }
+
+               // Get events for entities who's keys tombstones/hold-off should have expired by now
+               $events = call_user_func_array(
+                       $this->logChunkCallback,
+                       [ $status['pos'], $status['id'], $now - WANObjectCache::HOLDOFF_TTL - 1, $n ]
+               );
+
+               $event = null;
+               $keyEvents = [];
+               foreach ( $events as $event ) {
+                       $keys = call_user_func_array(
+                               $this->keyListCallback,
+                               [ $this->cache, $event['item'] ]
+                       );
+                       foreach ( $keys as $key ) {
+                               unset( $keyEvents[$key] ); // use only the latest per key
+                               $keyEvents[$key] = [
+                                       'pos' => $event['pos'],
+                                       'id' => $event['id']
+                               ];
+                       }
+               }
+
+               $purgeCount = 0;
+               $lastOkEvent = null;
+               foreach ( $keyEvents as $key => $keyEvent ) {
+                       if ( !$this->cache->reap( $key, $keyEvent['pos'] ) ) {
+                               break;
+                       }
+                       ++$purgeCount;
+                       $lastOkEvent = $event;
+               }
+
+               if ( $lastOkEvent ) {
+                       $ok = $this->store->merge(
+                               $posKey,
+                               function ( $bag, $key, $curValue ) use ( $lastOkEvent ) {
+                                       if ( !$curValue ) {
+                                               // Use new position
+                                       } else {
+                                               $curCoord = [ $curValue['pos'], $curValue['id'] ];
+                                               $newCoord = [ $lastOkEvent['pos'], $lastOkEvent['id'] ];
+                                               if ( $newCoord < $curCoord ) {
+                                                       // Keep prior position instead of rolling it back
+                                                       return $curValue;
+                                               }
+                                       }
+
+                                       return [
+                                               'pos' => $lastOkEvent['pos'],
+                                               'id' => $lastOkEvent['id'],
+                                               'ctime' => $curValue ? $curValue['ctime'] : date( 'c' )
+                                       ];
+                               },
+                               IExpiringStore::TTL_INDEFINITE
+                       );
+
+                       $pos = $lastOkEvent['pos'];
+                       $id = $lastOkEvent['id'];
+                       if ( $ok ) {
+                               $this->logger->info( "Updated cache reap position ($pos, $id)." );
+                       } else {
+                               $this->logger->error( "Could not update cache reap position ($pos, $id)." );
+                       }
+               }
+
+               ScopedCallback::consume( $scopeLock );
+
+               return $purgeCount;
+       }
+
+       /**
+        * @return array|bool Returns (pos, id) map or false if not set
+        */
+       public function getState() {
+               $posKey = $this->store->makeGlobalKey( 'WANCache', 'reaper', $this->channel );
+
+               return $this->store->get( $posKey );
+       }
+}
index 88af1db..8b1aabe 100644 (file)
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
 use Wikimedia\WaitConditionLoop;
+use BagOStuff;
 
 /**
  * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
@@ -70,9 +75,9 @@ class ChronologyProtector implements LoggerAwareInterface {
        public function __construct( BagOStuff $store, array $client, $posTime = null ) {
                $this->store = $store;
                $this->clientId = md5( $client['ip'] . "\n" . $client['agent'] );
-               $this->key = $store->makeGlobalKey( __CLASS__, $this->clientId );
+               $this->key = $store->makeGlobalKey( __CLASS__, $this->clientId, 'v1' );
                $this->waitForPosTime = $posTime;
-               $this->logger = new \Psr\Log\NullLogger();
+               $this->logger = new NullLogger();
        }
 
        public function setLogger( LoggerInterface $logger ) {
@@ -114,7 +119,10 @@ class ChronologyProtector implements LoggerAwareInterface {
                $this->initPositions();
 
                $masterName = $lb->getServerName( $lb->getWriterIndex() );
-               if ( !empty( $this->startupPositions[$masterName] ) ) {
+               if (
+                       isset( $this->startupPositions[$masterName] ) &&
+                       $this->startupPositions[$masterName] instanceof DBMasterPos
+               ) {
                        $pos = $this->startupPositions[$masterName];
                        $this->logger->info( __METHOD__ . ": LB for '$masterName' set to pos $pos\n" );
                        $lb->waitFor( $pos );
@@ -293,8 +301,9 @@ class ChronologyProtector implements LoggerAwareInterface {
 
                $min = null;
                foreach ( $data['positions'] as $pos ) {
-                       /** @var DBMasterPos $pos */
-                       $min = $min ? min( $pos->asOfTime(), $min ) : $pos->asOfTime();
+                       if ( $pos instanceof DBMasterPos ) {
+                               $min = $min ? min( $pos->asOfTime(), $min ) : $pos->asOfTime();
+                       }
                }
 
                return $min;
@@ -313,8 +322,10 @@ class ChronologyProtector implements LoggerAwareInterface {
                        $curPositions = $curValue['positions'];
                        // Use the newest positions for each DB master
                        foreach ( $shutdownPositions as $db => $pos ) {
-                               if ( !isset( $curPositions[$db] )
-                                       || $pos->asOfTime() > $curPositions[$db]->asOfTime()
+                               if (
+                                       !isset( $curPositions[$db] ) ||
+                                       !( $curPositions[$db] instanceof DBMasterPos ) ||
+                                       $pos->asOfTime() > $curPositions[$db]->asOfTime()
                                ) {
                                        $curPositions[$db] = $pos;
                                }
index bf5e299..5d3534f 100644 (file)
  * @author Aaron Schulz
  */
 
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\NullLogger;
+use RuntimeException;
 
 /**
  * Helper class that detects high-contention DB queries via profiling calls
diff --git a/includes/libs/rdbms/connectionmanager/ConnectionManager.php b/includes/libs/rdbms/connectionmanager/ConnectionManager.php
new file mode 100644 (file)
index 0000000..fc00965
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+namespace Wikimedia\Rdbms;
+
+use Database;
+use DBConnRef;
+use IDatabase;
+use InvalidArgumentException;
+
+/**
+ * Database connection manager.
+ *
+ * This manages access to master and replica databases.
+ *
+ * @since 1.29
+ *
+ * @license GPL-2.0+
+ * @author Addshore
+ */
+class ConnectionManager {
+
+       /**
+        * @var LoadBalancer
+        */
+       private $loadBalancer;
+
+       /**
+        * The symbolic name of the target database, or false for the local wiki's database.
+        *
+        * @var string|false
+        */
+       private $domain;
+
+       /**
+        * @var string[]
+        */
+       private $groups = [];
+
+       /**
+        * @param LoadBalancer $loadBalancer
+        * @param string|bool $domain Optional logical DB name, defaults to current wiki.
+        *        This follows the convention for database names used by $loadBalancer.
+        * @param string[] $groups see LoadBalancer::getConnection
+        *
+        * @throws InvalidArgumentException
+        */
+       public function __construct( LoadBalancer $loadBalancer, $domain = false, array $groups = [] ) {
+               if ( !is_string( $domain ) && $domain !== false ) {
+                       throw new InvalidArgumentException( '$dbName must be a string, or false.' );
+               }
+
+               $this->loadBalancer = $loadBalancer;
+               $this->domain = $domain;
+               $this->groups = $groups;
+       }
+
+       /**
+        * @param int $i
+        * @param string[]|null $groups
+        *
+        * @return Database
+        */
+       private function getConnection( $i, array $groups = null ) {
+               $groups = $groups === null ? $this->groups : $groups;
+               return $this->loadBalancer->getConnection( $i, $groups, $this->domain );
+       }
+
+       /**
+        * @param int $i
+        * @param string[]|null $groups
+        *
+        * @return DBConnRef
+        */
+       private function getConnectionRef( $i, array $groups = null ) {
+               $groups = $groups === null ? $this->groups : $groups;
+               return $this->loadBalancer->getConnectionRef( $i, $groups, $this->domain );
+       }
+
+       /**
+        * Returns a connection to the master DB, for updating. The connection should later be released
+        * by calling releaseConnection().
+        *
+        * @since 1.29
+        *
+        * @return Database
+        */
+       public function getWriteConnection() {
+               return $this->getConnection( DB_MASTER );
+       }
+
+       /**
+        * Returns a database connection for reading. The connection should later be released by
+        * calling releaseConnection().
+        *
+        * @since 1.29
+        *
+        * @param string[]|null $groups
+        *
+        * @return Database
+        */
+       public function getReadConnection( array $groups = null ) {
+               $groups = $groups === null ? $this->groups : $groups;
+               return $this->getConnection( DB_REPLICA, $groups );
+       }
+
+       /**
+        * @since 1.29
+        *
+        * @param IDatabase $db
+        */
+       public function releaseConnection( IDatabase $db ) {
+               $this->loadBalancer->reuseConnection( $db );
+       }
+
+       /**
+        * Returns a connection ref to the master DB, for updating.
+        *
+        * @since 1.29
+        *
+        * @return DBConnRef
+        */
+       public function getWriteConnectionRef() {
+               return $this->getConnectionRef( DB_MASTER );
+       }
+
+       /**
+        * Returns a database connection ref for reading.
+        *
+        * @since 1.29
+        *
+        * @param string[]|null $groups
+        *
+        * @return DBConnRef
+        */
+       public function getReadConnectionRef( array $groups = null ) {
+               $groups = $groups === null ? $this->groups : $groups;
+               return $this->getConnectionRef( DB_REPLICA, $groups );
+       }
+
+}
diff --git a/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php b/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php
new file mode 100644 (file)
index 0000000..fb03182
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+
+namespace Wikimedia\Rdbms;
+
+use Database;
+use DBConnRef;
+
+/**
+ * Database connection manager.
+ *
+ * This manages access to master and replica databases. It also manages state that indicates whether
+ * the replica databases are possibly outdated after a write operation, and thus the master database
+ * should be used for subsequent read operations.
+ *
+ * @note: Services that access overlapping sets of database tables, or interact with logically
+ * related sets of data in the database, should share a SessionConsistentConnectionManager.
+ * Services accessing unrelated sets of information may prefer to not share a
+ * SessionConsistentConnectionManager, so they can still perform read operations against replica
+ * databases after a (unrelated, per the assumption) write operation to the master database.
+ * Generally, sharing a SessionConsistentConnectionManager improves consistency (by avoiding race
+ * conditions due to replication lag), but can reduce performance (by directing more read
+ * operations to the master database server).
+ *
+ * @since 1.29
+ *
+ * @license GPL-2.0+
+ * @author Daniel Kinzler
+ * @author Addshore
+ */
+class SessionConsistentConnectionManager extends ConnectionManager {
+
+       /**
+        * @var bool
+        */
+       private $forceWriteConnection = false;
+
+       /**
+        * Forces all future calls to getReadConnection() to return a write connection.
+        * Use this before performing read operations that are critical for a future update.
+        *
+        * @since 1.29
+        */
+       public function prepareForUpdates() {
+               $this->forceWriteConnection = true;
+       }
+
+       /**
+        * @since 1.29
+        *
+        * @param string[]|null $groups
+        *
+        * @return Database
+        */
+       public function getReadConnection( array $groups = null ) {
+               if ( $this->forceWriteConnection ) {
+                       return parent::getWriteConnection();
+               }
+
+               return parent::getReadConnection( $groups );
+       }
+
+       /**
+        * @since 1.29
+        *
+        * @return Database
+        */
+       public function getWriteConnection() {
+               $this->prepareForUpdates();
+               return parent::getWriteConnection();
+       }
+
+       /**
+        * @since 1.29
+        *
+        * @param string[]|null $groups
+        *
+        * @return DBConnRef
+        */
+       public function getReadConnectionRef( array $groups = null ) {
+               if ( $this->forceWriteConnection ) {
+                       return parent::getWriteConnectionRef();
+               }
+
+               return parent::getReadConnectionRef( $groups );
+       }
+
+       /**
+        * @since 1.29
+        *
+        * @return DBConnRef
+        */
+       public function getWriteConnectionRef() {
+               $this->prepareForUpdates();
+               return parent::getWriteConnectionRef();
+       }
+
+}
index 20198bf..fc3ebe0 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\ILoadBalancer;
+use Wikimedia\Rdbms\DBMasterPos;
+
 /**
  * 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
 class DBConnRef implements IDatabase {
        /** @var ILoadBalancer */
        private $lb;
-
-       /** @var IDatabase|null Live connection handle */
+       /** @var Database|null Live connection handle */
        private $conn;
-
        /** @var array|null N-tuple of (server index, group, DatabaseDomain|string) */
        private $params;
 
@@ -22,12 +25,12 @@ class DBConnRef implements IDatabase {
        const FLD_DOMAIN = 2;
 
        /**
-        * @param ILoadBalancer $lb
-        * @param IDatabase|array $conn Connection or (server index, group, DatabaseDomain|string)
+        * @param ILoadBalancer $lb Connection manager for $conn
+        * @param Database|array $conn New connection handle or (server index, query groups, domain)
         */
        public function __construct( ILoadBalancer $lb, $conn ) {
                $this->lb = $lb;
-               if ( $conn instanceof IDatabase ) {
+               if ( $conn instanceof Database ) {
                        $this->conn = $conn; // live handle
                } elseif ( count( $conn ) >= 3 && $conn[self::FLD_DOMAIN] !== false ) {
                        $this->params = $conn;
@@ -595,7 +598,7 @@ class DBConnRef implements IDatabase {
         * Clean up the connection when out of scope
         */
        function __destruct() {
-               if ( $this->conn !== null ) {
+               if ( $this->conn ) {
                        $this->lb->reuseConnection( $this->conn );
                }
        }
index 3d35d76..1c5c77e 100644 (file)
 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;
 
 /**
  * Relational database abstraction object
@@ -1419,9 +1424,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                $table = $this->tableName( $table );
-               $old = $this->ignoreErrors( true );
-               $res = $this->query( "SELECT 1 FROM $table LIMIT 1", $fname );
-               $this->ignoreErrors( $old );
+               $ignoreErrors = true;
+               $res = $this->query( "SELECT 1 FROM $table LIMIT 1", $fname, $ignoreErrors );
 
                return (bool)$res;
        }
@@ -2314,7 +2318,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $selectOptions );
 
                if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ &$this, 'tableName' ], $srcTable ) );
+                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
                } else {
                        $srcTable = $this->tableName( $srcTable );
                }
@@ -2862,23 +2866,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return $this->mTrxLevel && ( $this->mTrxAtomicLevels || !$this->mTrxAutomatic );
        }
 
-       /**
-        * Creates a new table with structure copied from existing table
-        * Note that unlike most database abstraction functions, this function does not
-        * automatically append database prefix, because it works at a lower
-        * abstraction level.
-        * The table names passed to this function shall not be quoted (this
-        * function calls addIdentifierQuotes when needed).
-        *
-        * @param string $oldName Name of table whose structure should be copied
-        * @param string $newName Name of table to be created
-        * @param bool $temporary Whether the new table should be temporary
-        * @param string $fname Calling function name
-        * @throws RuntimeException
-        * @return bool True if operation was successful
-        */
-       public function duplicateTableStructure( $oldName, $newName, $temporary = false,
-               $fname = __METHOD__
+       public function duplicateTableStructure(
+               $oldName, $newName, $temporary = false, $fname = __METHOD__
        ) {
                throw new RuntimeException( __METHOD__ . ' is not implemented in descendant class' );
        }
@@ -3478,4 +3467,4 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 }
 
-class_alias( 'Database', 'DatabaseBase' );
+class_alias( Database::class, 'DatabaseBase' );
index a3ae6f1..ef6600b 100644 (file)
@@ -18,6 +18,9 @@
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
 
 /**
  * Class to handle database/prefix specification for IDatabase domains
diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php
new file mode 100644 (file)
index 0000000..7c82479
--- /dev/null
@@ -0,0 +1,1360 @@
+<?php
+/**
+ * This is the MS SQL Server Native database abstraction layer.
+ *
+ * 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 Database
+ * @author Joel Penner <a-joelpe at microsoft dot com>
+ * @author Chris Pucci <a-cpucci at microsoft dot com>
+ * @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;
+
+/**
+ * @ingroup Database
+ */
+class DatabaseMssql extends Database {
+       protected $mPort;
+       protected $mUseWindowsAuth = false;
+
+       protected $mInsertId = null;
+       protected $mLastResult = null;
+       protected $mAffectedRows = null;
+       protected $mSubqueryId = 0;
+       protected $mScrollableCursor = true;
+       protected $mPrepareStatements = true;
+       protected $mBinaryColumnCache = null;
+       protected $mBitColumnCache = null;
+       protected $mIgnoreDupKeyErrors = false;
+       protected $mIgnoreErrors = [];
+
+       public function implicitGroupby() {
+               return false;
+       }
+
+       public function implicitOrderby() {
+               return false;
+       }
+
+       public function unionSupportsOrderAndLimit() {
+               return false;
+       }
+
+       public function __construct( array $params ) {
+               $this->mPort = $params['port'];
+               $this->mUseWindowsAuth = $params['UseWindowsAuth'];
+
+               parent::__construct( $params );
+       }
+
+       /**
+        * Usually aborts on failure
+        * @param string $server
+        * @param string $user
+        * @param string $password
+        * @param string $dbName
+        * @throws DBConnectionError
+        * @return bool|resource|null
+        */
+       public function open( $server, $user, $password, $dbName ) {
+               # Test for driver support, to avoid suppressed fatal error
+               if ( !function_exists( 'sqlsrv_connect' ) ) {
+                       throw new DBConnectionError(
+                               $this,
+                               "Microsoft SQL Server Native (sqlsrv) functions missing.
+                               You can download the driver from: http://go.microsoft.com/fwlink/?LinkId=123470\n"
+                       );
+               }
+
+               # e.g. the class is being loaded
+               if ( !strlen( $user ) ) {
+                       return null;
+               }
+
+               $this->close();
+               $this->mServer = $server;
+               $this->mUser = $user;
+               $this->mPassword = $password;
+               $this->mDBname = $dbName;
+
+               $connectionInfo = [];
+
+               if ( $dbName ) {
+                       $connectionInfo['Database'] = $dbName;
+               }
+
+               // Decide which auth scenerio to use
+               // if we are using Windows auth, then don't add credentials to $connectionInfo
+               if ( !$this->mUseWindowsAuth ) {
+                       $connectionInfo['UID'] = $user;
+                       $connectionInfo['PWD'] = $password;
+               }
+
+               MediaWiki\suppressWarnings();
+               $this->mConn = sqlsrv_connect( $server, $connectionInfo );
+               MediaWiki\restoreWarnings();
+
+               if ( $this->mConn === false ) {
+                       throw new DBConnectionError( $this, $this->lastError() );
+               }
+
+               $this->mOpened = true;
+
+               return $this->mConn;
+       }
+
+       /**
+        * Closes a database connection, if it is open
+        * Returns success, true if already closed
+        * @return bool
+        */
+       protected function closeConnection() {
+               return sqlsrv_close( $this->mConn );
+       }
+
+       /**
+        * @param bool|MssqlResultWrapper|resource $result
+        * @return bool|MssqlResultWrapper
+        */
+       protected function resultObject( $result ) {
+               if ( !$result ) {
+                       return false;
+               } elseif ( $result instanceof MssqlResultWrapper ) {
+                       return $result;
+               } elseif ( $result === true ) {
+                       // Successful write query
+                       return $result;
+               } else {
+                       return new MssqlResultWrapper( $this, $result );
+               }
+       }
+
+       /**
+        * @param string $sql
+        * @return bool|MssqlResultWrapper|resource
+        * @throws DBUnexpectedError
+        */
+       protected function doQuery( $sql ) {
+               // several extensions seem to think that all databases support limits
+               // via LIMIT N after the WHERE clause, but  MSSQL uses SELECT TOP N,
+               // so to catch any of those extensions we'll do a quick check for a
+               // LIMIT clause and pass $sql through $this->LimitToTopN() which parses
+               // the LIMIT clause and passes the result to $this->limitResult();
+               if ( preg_match( '/\bLIMIT\s*/i', $sql ) ) {
+                       // massage LIMIT -> TopN
+                       $sql = $this->LimitToTopN( $sql );
+               }
+
+               // MSSQL doesn't have EXTRACT(epoch FROM XXX)
+               if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
+                       // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
+                       $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
+               }
+
+               // perform query
+
+               // SQLSRV_CURSOR_STATIC is slower than SQLSRV_CURSOR_CLIENT_BUFFERED (one of the two is
+               // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED
+               // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty
+               // strings make php throw a fatal error "Severe error translating Unicode"
+               if ( $this->mScrollableCursor ) {
+                       $scrollArr = [ 'Scrollable' => SQLSRV_CURSOR_STATIC ];
+               } else {
+                       $scrollArr = [];
+               }
+
+               if ( $this->mPrepareStatements ) {
+                       // we do prepare + execute so we can get its field metadata for later usage if desired
+                       $stmt = sqlsrv_prepare( $this->mConn, $sql, [], $scrollArr );
+                       $success = sqlsrv_execute( $stmt );
+               } else {
+                       $stmt = sqlsrv_query( $this->mConn, $sql, [], $scrollArr );
+                       $success = (bool)$stmt;
+               }
+
+               // Make a copy to ensure what we add below does not get reflected in future queries
+               $ignoreErrors = $this->mIgnoreErrors;
+
+               if ( $this->mIgnoreDupKeyErrors ) {
+                       // ignore duplicate key errors
+                       // this emulates INSERT IGNORE in MySQL
+                       $ignoreErrors[] = '2601'; // duplicate key error caused by unique index
+                       $ignoreErrors[] = '2627'; // duplicate key error caused by primary key
+                       $ignoreErrors[] = '3621'; // generic "the statement has been terminated" error
+               }
+
+               if ( $success === false ) {
+                       $errors = sqlsrv_errors();
+                       $success = true;
+
+                       foreach ( $errors as $err ) {
+                               if ( !in_array( $err['code'], $ignoreErrors ) ) {
+                                       $success = false;
+                                       break;
+                               }
+                       }
+
+                       if ( $success === false ) {
+                               return false;
+                       }
+               }
+               // remember number of rows affected
+               $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
+
+               return $stmt;
+       }
+
+       public function freeResult( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               sqlsrv_free_stmt( $res );
+       }
+
+       /**
+        * @param MssqlResultWrapper $res
+        * @return stdClass
+        */
+       public function fetchObject( $res ) {
+               // $res is expected to be an instance of MssqlResultWrapper here
+               return $res->fetchObject();
+       }
+
+       /**
+        * @param MssqlResultWrapper $res
+        * @return array
+        */
+       public function fetchRow( $res ) {
+               return $res->fetchRow();
+       }
+
+       /**
+        * @param mixed $res
+        * @return int
+        */
+       public function numRows( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               $ret = sqlsrv_num_rows( $res );
+
+               if ( $ret === false ) {
+                       // we cannot get an amount of rows from this cursor type
+                       // has_rows returns bool true/false if the result has rows
+                       $ret = (int)sqlsrv_has_rows( $res );
+               }
+
+               return $ret;
+       }
+
+       /**
+        * @param mixed $res
+        * @return int
+        */
+       public function numFields( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               return sqlsrv_num_fields( $res );
+       }
+
+       /**
+        * @param mixed $res
+        * @param int $n
+        * @return int
+        */
+       public function fieldName( $res, $n ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               return sqlsrv_field_metadata( $res )[$n]['Name'];
+       }
+
+       /**
+        * This must be called after nextSequenceVal
+        * @return int|null
+        */
+       public function insertId() {
+               return $this->mInsertId;
+       }
+
+       /**
+        * @param MssqlResultWrapper $res
+        * @param int $row
+        * @return bool
+        */
+       public function dataSeek( $res, $row ) {
+               return $res->seek( $row );
+       }
+
+       /**
+        * @return string
+        */
+       public function lastError() {
+               $strRet = '';
+               $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
+               if ( $retErrors != null ) {
+                       foreach ( $retErrors as $arrError ) {
+                               $strRet .= $this->formatError( $arrError ) . "\n";
+                       }
+               } else {
+                       $strRet = "No errors found";
+               }
+
+               return $strRet;
+       }
+
+       /**
+        * @param array $err
+        * @return string
+        */
+       private function formatError( $err ) {
+               return '[SQLSTATE ' .
+                       $err['SQLSTATE'] . '][Error Code ' . $err['code'] . ']' . $err['message'];
+       }
+
+       /**
+        * @return string|int
+        */
+       public function lastErrno() {
+               $err = sqlsrv_errors( SQLSRV_ERR_ALL );
+               if ( $err !== null && isset( $err[0] ) ) {
+                       return $err[0]['code'];
+               } else {
+                       return 0;
+               }
+       }
+
+       /**
+        * @return int
+        */
+       public function affectedRows() {
+               return $this->mAffectedRows;
+       }
+
+       /**
+        * SELECT wrapper
+        *
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options Associative array of options (e.g.
+        *   [ 'GROUP BY' => 'page_title' ]), see Database::makeSelectOptions
+        *   code for list of supported stuff
+        * @param array $join_conds Associative array of table join conditions
+        *   (optional) (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
+        * @return mixed Database result resource (feed to Database::fetchObject
+        *   or whatever), or false on failure
+        * @throws DBQueryError
+        * @throws DBUnexpectedError
+        * @throws Exception
+        */
+       public function select( $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = [], $join_conds = []
+       ) {
+               $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+               if ( isset( $options['EXPLAIN'] ) ) {
+                       try {
+                               $this->mScrollableCursor = false;
+                               $this->mPrepareStatements = false;
+                               $this->query( "SET SHOWPLAN_ALL ON" );
+                               $ret = $this->query( $sql, $fname );
+                               $this->query( "SET SHOWPLAN_ALL OFF" );
+                       } catch ( DBQueryError $dqe ) {
+                               if ( isset( $options['FOR COUNT'] ) ) {
+                                       // likely don't have privs for SHOWPLAN, so run a select count instead
+                                       $this->query( "SET SHOWPLAN_ALL OFF" );
+                                       unset( $options['EXPLAIN'] );
+                                       $ret = $this->select(
+                                               $table,
+                                               'COUNT(*) AS EstimateRows',
+                                               $conds,
+                                               $fname,
+                                               $options,
+                                               $join_conds
+                                       );
+                               } else {
+                                       // someone actually wanted the query plan instead of an est row count
+                                       // let them know of the error
+                                       $this->mScrollableCursor = true;
+                                       $this->mPrepareStatements = true;
+                                       throw $dqe;
+                               }
+                       }
+                       $this->mScrollableCursor = true;
+                       $this->mPrepareStatements = true;
+                       return $ret;
+               }
+               return $this->query( $sql, $fname );
+       }
+
+       /**
+        * SELECT wrapper
+        *
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options Associative array of options (e.g. [ 'GROUP BY' => 'page_title' ]),
+        *   see Database::makeSelectOptions code for list of supported stuff
+        * @param array $join_conds Associative array of table join conditions (optional)
+        *    (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
+        * @return string The SQL text
+        */
+       public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = [], $join_conds = []
+       ) {
+               if ( isset( $options['EXPLAIN'] ) ) {
+                       unset( $options['EXPLAIN'] );
+               }
+
+               $sql = parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+
+               // try to rewrite aggregations of bit columns (currently MAX and MIN)
+               if ( strpos( $sql, 'MAX(' ) !== false || strpos( $sql, 'MIN(' ) !== false ) {
+                       $bitColumns = [];
+                       if ( is_array( $table ) ) {
+                               foreach ( $table as $t ) {
+                                       $bitColumns += $this->getBitColumns( $this->tableName( $t ) );
+                               }
+                       } else {
+                               $bitColumns = $this->getBitColumns( $this->tableName( $table ) );
+                       }
+
+                       foreach ( $bitColumns as $col => $info ) {
+                               $replace = [
+                                       "MAX({$col})" => "MAX(CAST({$col} AS tinyint))",
+                                       "MIN({$col})" => "MIN(CAST({$col} AS tinyint))",
+                               ];
+                               $sql = str_replace( array_keys( $replace ), array_values( $replace ), $sql );
+                       }
+               }
+
+               return $sql;
+       }
+
+       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
+               $fname = __METHOD__
+       ) {
+               $this->mScrollableCursor = false;
+               try {
+                       parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+       }
+
+       public function delete( $table, $conds, $fname = __METHOD__ ) {
+               $this->mScrollableCursor = false;
+               try {
+                       parent::delete( $table, $conds, $fname );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+       }
+
+       /**
+        * Estimate rows in dataset
+        * Returns estimated count, based on SHOWPLAN_ALL output
+        * This is not necessarily an accurate estimate, so use sparingly
+        * Returns -1 if count cannot be found
+        * Takes same arguments as Database::select()
+        * @param string $table
+        * @param string $vars
+        * @param string $conds
+        * @param string $fname
+        * @param array $options
+        * @return int
+        */
+       public function estimateRowCount( $table, $vars = '*', $conds = '',
+               $fname = __METHOD__, $options = []
+       ) {
+               // http://msdn2.microsoft.com/en-us/library/aa259203.aspx
+               $options['EXPLAIN'] = true;
+               $options['FOR COUNT'] = true;
+               $res = $this->select( $table, $vars, $conds, $fname, $options );
+
+               $rows = -1;
+               if ( $res ) {
+                       $row = $this->fetchRow( $res );
+
+                       if ( isset( $row['EstimateRows'] ) ) {
+                               $rows = (int)$row['EstimateRows'];
+                       }
+               }
+
+               return $rows;
+       }
+
+       /**
+        * Returns information about an index
+        * If errors are explicitly ignored, returns NULL on failure
+        * @param string $table
+        * @param string $index
+        * @param string $fname
+        * @return array|bool|null
+        */
+       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
+               # This does not return the same info as MYSQL would, but that's OK
+               # because MediaWiki never uses the returned value except to check for
+               # the existence of indexes.
+               $sql = "sp_helpindex '" . $this->tableName( $table ) . "'";
+               $res = $this->query( $sql, $fname );
+
+               if ( !$res ) {
+                       return null;
+               }
+
+               $result = [];
+               foreach ( $res as $row ) {
+                       if ( $row->index_name == $index ) {
+                               $row->Non_unique = !stristr( $row->index_description, "unique" );
+                               $cols = explode( ", ", $row->index_keys );
+                               foreach ( $cols as $col ) {
+                                       $row->Column_name = trim( $col );
+                                       $result[] = clone $row;
+                               }
+                       } elseif ( $index == 'PRIMARY' && stristr( $row->index_description, 'PRIMARY' ) ) {
+                               $row->Non_unique = 0;
+                               $cols = explode( ", ", $row->index_keys );
+                               foreach ( $cols as $col ) {
+                                       $row->Column_name = trim( $col );
+                                       $result[] = clone $row;
+                               }
+                       }
+               }
+
+               return empty( $result ) ? false : $result;
+       }
+
+       /**
+        * INSERT wrapper, inserts an array into a table
+        *
+        * $arrToInsert may be a single associative array, or an array of these with numeric keys, for
+        * multi-row insert.
+        *
+        * Usually aborts on failure
+        * If errors are explicitly ignored, returns success
+        * @param string $table
+        * @param array $arrToInsert
+        * @param string $fname
+        * @param array $options
+        * @return bool
+        * @throws Exception
+        */
+       public function insert( $table, $arrToInsert, $fname = __METHOD__, $options = [] ) {
+               # No rows to insert, easy just return now
+               if ( !count( $arrToInsert ) ) {
+                       return true;
+               }
+
+               if ( !is_array( $options ) ) {
+                       $options = [ $options ];
+               }
+
+               $table = $this->tableName( $table );
+
+               if ( !( isset( $arrToInsert[0] ) && is_array( $arrToInsert[0] ) ) ) { // Not multi row
+                       $arrToInsert = [ 0 => $arrToInsert ]; // make everything multi row compatible
+               }
+
+               // We know the table we're inserting into, get its identity column
+               $identity = null;
+               // strip matching square brackets and the db/schema from table name
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+               $res = $this->doQuery(
+                       "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS " .
+                               "WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'"
+               );
+               if ( $res && sqlsrv_has_rows( $res ) ) {
+                       // There is an identity for this table.
+                       $identityArr = sqlsrv_fetch_array( $res, SQLSRV_FETCH_ASSOC );
+                       $identity = array_pop( $identityArr );
+               }
+               sqlsrv_free_stmt( $res );
+
+               // Determine binary/varbinary fields so we can encode data as a hex string like 0xABCDEF
+               $binaryColumns = $this->getBinaryColumns( $table );
+
+               // INSERT IGNORE is not supported by SQL Server
+               // remove IGNORE from options list and set ignore flag to true
+               if ( in_array( 'IGNORE', $options ) ) {
+                       $options = array_diff( $options, [ 'IGNORE' ] );
+                       $this->mIgnoreDupKeyErrors = true;
+               }
+
+               $ret = null;
+               foreach ( $arrToInsert as $a ) {
+                       // start out with empty identity column, this is so we can return
+                       // it as a result of the INSERT logic
+                       $sqlPre = '';
+                       $sqlPost = '';
+                       $identityClause = '';
+
+                       // if we have an identity column
+                       if ( $identity ) {
+                               // iterate through
+                               foreach ( $a as $k => $v ) {
+                                       if ( $k == $identity ) {
+                                               if ( !is_null( $v ) ) {
+                                                       // there is a value being passed to us,
+                                                       // we need to turn on and off inserted identity
+                                                       $sqlPre = "SET IDENTITY_INSERT $table ON;";
+                                                       $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
+                                               } else {
+                                                       // we can't insert NULL into an identity column,
+                                                       // so remove the column from the insert.
+                                                       unset( $a[$k] );
+                                               }
+                                       }
+                               }
+
+                               // we want to output an identity column as result
+                               $identityClause = "OUTPUT INSERTED.$identity ";
+                       }
+
+                       $keys = array_keys( $a );
+
+                       // Build the actual query
+                       $sql = $sqlPre . 'INSERT ' . implode( ' ', $options ) .
+                               " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
+
+                       $first = true;
+                       foreach ( $a as $key => $value ) {
+                               if ( isset( $binaryColumns[$key] ) ) {
+                                       $value = new MssqlBlob( $value );
+                               }
+                               if ( $first ) {
+                                       $first = false;
+                               } else {
+                                       $sql .= ',';
+                               }
+                               if ( is_null( $value ) ) {
+                                       $sql .= 'null';
+                               } elseif ( is_array( $value ) || is_object( $value ) ) {
+                                       if ( is_object( $value ) && $value instanceof Blob ) {
+                                               $sql .= $this->addQuotes( $value );
+                                       } else {
+                                               $sql .= $this->addQuotes( serialize( $value ) );
+                                       }
+                               } else {
+                                       $sql .= $this->addQuotes( $value );
+                               }
+                       }
+                       $sql .= ')' . $sqlPost;
+
+                       // Run the query
+                       $this->mScrollableCursor = false;
+                       try {
+                               $ret = $this->query( $sql );
+                       } catch ( Exception $e ) {
+                               $this->mScrollableCursor = true;
+                               $this->mIgnoreDupKeyErrors = false;
+                               throw $e;
+                       }
+                       $this->mScrollableCursor = true;
+
+                       if ( $ret instanceof ResultWrapper && !is_null( $identity ) ) {
+                               // Then we want to get the identity column value we were assigned and save it off
+                               $row = $ret->fetchObject();
+                               if ( is_object( $row ) ) {
+                                       $this->mInsertId = $row->$identity;
+                                       // It seems that mAffectedRows is -1 sometimes when OUTPUT INSERTED.identity is
+                                       // used if we got an identity back, we know for sure a row was affected, so
+                                       // adjust that here
+                                       if ( $this->mAffectedRows == -1 ) {
+                                               $this->mAffectedRows = 1;
+                                       }
+                               }
+                       }
+               }
+
+               $this->mIgnoreDupKeyErrors = false;
+
+               return $ret;
+       }
+
+       /**
+        * INSERT SELECT wrapper
+        * $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
+        * Source items may be literals rather than field names, but strings should
+        * be quoted with Database::addQuotes().
+        * @param string $destTable
+        * @param array|string $srcTable May be an array of tables.
+        * @param array $varMap
+        * @param array $conds May be "*" to copy the whole table.
+        * @param string $fname
+        * @param array $insertOptions
+        * @param array $selectOptions
+        * @return null|ResultWrapper
+        * @throws Exception
+        */
+       public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
+               $insertOptions = [], $selectOptions = []
+       ) {
+               $this->mScrollableCursor = false;
+               try {
+                       $ret = parent::nativeInsertSelect(
+                               $destTable,
+                               $srcTable,
+                               $varMap,
+                               $conds,
+                               $fname,
+                               $insertOptions,
+                               $selectOptions
+                       );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+
+               return $ret;
+       }
+
+       /**
+        * UPDATE wrapper. Takes a condition array and a SET array.
+        *
+        * @param string $table Name of the table to UPDATE. This will be passed through
+        *                Database::tableName().
+        *
+        * @param array $values An array of values to SET. For each array element,
+        *                the key gives the field name, and the value gives the data
+        *                to set that field to. The data will be quoted by
+        *                Database::addQuotes().
+        *
+        * @param array $conds An array of conditions (WHERE). See
+        *                Database::select() for the details of the format of
+        *                condition arrays. Use '*' to update all rows.
+        *
+        * @param string $fname The function name of the caller (from __METHOD__),
+        *                for logging and profiling.
+        *
+        * @param array $options An array of UPDATE options, can be:
+        *                   - IGNORE: Ignore unique key conflicts
+        *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
+        * @return bool
+        * @throws DBUnexpectedError
+        * @throws Exception
+        */
+       function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {
+               $table = $this->tableName( $table );
+               $binaryColumns = $this->getBinaryColumns( $table );
+
+               $opts = $this->makeUpdateOptions( $options );
+               $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET, $binaryColumns );
+
+               if ( $conds !== [] && $conds !== '*' ) {
+                       $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns );
+               }
+
+               $this->mScrollableCursor = false;
+               try {
+                       $this->query( $sql );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+               return true;
+       }
+
+       /**
+        * Makes an encoded list of strings from an array
+        * @param array $a Containing the data
+        * @param int $mode Constant
+        *      - LIST_COMMA:          comma separated, no field names
+        *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
+        *        the documentation for $conds in Database::select().
+        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
+        *      - LIST_SET:            comma separated with field names, like a SET clause
+        *      - LIST_NAMES:          comma separated field names
+        * @param array $binaryColumns Contains a list of column names that are binary types
+        *      This is a custom parameter only present for MS SQL.
+        *
+        * @throws DBUnexpectedError
+        * @return string
+        */
+       public function makeList( $a, $mode = LIST_COMMA, $binaryColumns = [] ) {
+               if ( !is_array( $a ) ) {
+                       throw new DBUnexpectedError( $this, __METHOD__ . ' called with incorrect parameters' );
+               }
+
+               if ( $mode != LIST_NAMES ) {
+                       // In MS SQL, values need to be specially encoded when they are
+                       // inserted into binary fields. Perform this necessary encoding
+                       // for the specified set of columns.
+                       foreach ( array_keys( $a ) as $field ) {
+                               if ( !isset( $binaryColumns[$field] ) ) {
+                                       continue;
+                               }
+
+                               if ( is_array( $a[$field] ) ) {
+                                       foreach ( $a[$field] as &$v ) {
+                                               $v = new MssqlBlob( $v );
+                                       }
+                                       unset( $v );
+                               } else {
+                                       $a[$field] = new MssqlBlob( $a[$field] );
+                               }
+                       }
+               }
+
+               return parent::makeList( $a, $mode );
+       }
+
+       /**
+        * @param string $table
+        * @param string $field
+        * @return int Returns the size of a text field, or -1 for "unlimited"
+        */
+       public function textFieldSize( $table, $field ) {
+               $table = $this->tableName( $table );
+               $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
+                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'";
+               $res = $this->query( $sql );
+               $row = $this->fetchRow( $res );
+               $size = -1;
+               if ( strtolower( $row['DATA_TYPE'] ) != 'text' ) {
+                       $size = $row['CHARACTER_MAXIMUM_LENGTH'];
+               }
+
+               return $size;
+       }
+
+       /**
+        * Construct a LIMIT query with optional offset
+        * This is used for query pages
+        *
+        * @param string $sql SQL query we will append the limit too
+        * @param int $limit The SQL limit
+        * @param bool|int $offset The SQL offset (default false)
+        * @return array|string
+        * @throws DBUnexpectedError
+        */
+       public function limitResult( $sql, $limit, $offset = false ) {
+               if ( $offset === false || $offset == 0 ) {
+                       if ( strpos( $sql, "SELECT" ) === false ) {
+                               return "TOP {$limit} " . $sql;
+                       } else {
+                               return preg_replace( '/\bSELECT(\s+DISTINCT)?\b/Dsi',
+                                       'SELECT$1 TOP ' . $limit, $sql, 1 );
+                       }
+               } else {
+                       // This one is fun, we need to pull out the select list as well as any ORDER BY clause
+                       $select = $orderby = [];
+                       $s1 = preg_match( '#SELECT\s+(.+?)\s+FROM#Dis', $sql, $select );
+                       $s2 = preg_match( '#(ORDER BY\s+.+?)(\s*FOR XML .*)?$#Dis', $sql, $orderby );
+                       $postOrder = '';
+                       $first = $offset + 1;
+                       $last = $offset + $limit;
+                       $sub1 = 'sub_' . $this->mSubqueryId;
+                       $sub2 = 'sub_' . ( $this->mSubqueryId + 1 );
+                       $this->mSubqueryId += 2;
+                       if ( !$s1 ) {
+                               // wat
+                               throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" );
+                       }
+                       if ( !$s2 ) {
+                               // no ORDER BY
+                               $overOrder = 'ORDER BY (SELECT 1)';
+                       } else {
+                               if ( !isset( $orderby[2] ) || !$orderby[2] ) {
+                                       // don't need to strip it out if we're using a FOR XML clause
+                                       $sql = str_replace( $orderby[1], '', $sql );
+                               }
+                               $overOrder = $orderby[1];
+                               $postOrder = ' ' . $overOrder;
+                       }
+                       $sql = "SELECT {$select[1]}
+                                       FROM (
+                                               SELECT ROW_NUMBER() OVER({$overOrder}) AS rowNumber, *
+                                               FROM ({$sql}) {$sub1}
+                                       ) {$sub2}
+                                       WHERE rowNumber BETWEEN {$first} AND {$last}{$postOrder}";
+
+                       return $sql;
+               }
+       }
+
+       /**
+        * If there is a limit clause, parse it, strip it, and pass the remaining
+        * SQL through limitResult() with the appropriate parameters. Not the
+        * prettiest solution, but better than building a whole new parser. This
+        * exists becase there are still too many extensions that don't use dynamic
+        * sql generation.
+        *
+        * @param string $sql
+        * @return array|mixed|string
+        */
+       public function LimitToTopN( $sql ) {
+               // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
+               $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
+               if ( preg_match( $pattern, $sql, $matches ) ) {
+                       $row_count = $matches[4];
+                       $offset = $matches[3] ?: $matches[6] ?: false;
+
+                       // strip the matching LIMIT clause out
+                       $sql = str_replace( $matches[0], '', $sql );
+
+                       return $this->limitResult( $sql, $row_count, $offset );
+               }
+
+               return $sql;
+       }
+
+       /**
+        * @return string Wikitext of a link to the server software's web site
+        */
+       public function getSoftwareLink() {
+               return "[{{int:version-db-mssql-url}} MS SQL Server]";
+       }
+
+       /**
+        * @return string Version information from the database
+        */
+       public function getServerVersion() {
+               $server_info = sqlsrv_server_info( $this->mConn );
+               $version = 'Error';
+               if ( isset( $server_info['SQLServerVersion'] ) ) {
+                       $version = $server_info['SQLServerVersion'];
+               }
+
+               return $version;
+       }
+
+       /**
+        * @param string $table
+        * @param string $fname
+        * @return bool
+        */
+       public function tableExists( $table, $fname = __METHOD__ ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
+
+               if ( $db !== false ) {
+                       // remote database
+                       $this->queryLogger->error( "Attempting to call tableExists on a remote table" );
+                       return false;
+               }
+
+               if ( $schema === false ) {
+                       $schema = $this->mSchema;
+               }
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
+                       WHERE TABLE_TYPE = 'BASE TABLE'
+                       AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
+
+               if ( $res->numRows() ) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Query whether a given column exists in the mediawiki schema
+        * @param string $table
+        * @param string $field
+        * @param string $fname
+        * @return bool
+        */
+       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
+
+               if ( $db !== false ) {
+                       // remote database
+                       $this->queryLogger->error( "Attempting to call fieldExists on a remote table" );
+                       return false;
+               }
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               if ( $res->numRows() ) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       public function fieldInfo( $table, $field ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
+
+               if ( $db !== false ) {
+                       // remote database
+                       $this->queryLogger->error( "Attempting to call fieldInfo on a remote table" );
+                       return false;
+               }
+
+               $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               $meta = $res->fetchRow();
+               if ( $meta ) {
+                       return new MssqlField( $meta );
+               }
+
+               return false;
+       }
+
+       /**
+        * Begin a transaction, committing any previously open transaction
+        * @param string $fname
+        */
+       protected function doBegin( $fname = __METHOD__ ) {
+               sqlsrv_begin_transaction( $this->mConn );
+               $this->mTrxLevel = 1;
+       }
+
+       /**
+        * End a transaction
+        * @param string $fname
+        */
+       protected function doCommit( $fname = __METHOD__ ) {
+               sqlsrv_commit( $this->mConn );
+               $this->mTrxLevel = 0;
+       }
+
+       /**
+        * Rollback a transaction.
+        * No-op on non-transactional databases.
+        * @param string $fname
+        */
+       protected function doRollback( $fname = __METHOD__ ) {
+               sqlsrv_rollback( $this->mConn );
+               $this->mTrxLevel = 0;
+       }
+
+       /**
+        * @param string $s
+        * @return string
+        */
+       public function strencode( $s ) {
+               // Should not be called by us
+
+               return str_replace( "'", "''", $s );
+       }
+
+       /**
+        * @param string|int|null|bool|Blob $s
+        * @return string|int
+        */
+       public function addQuotes( $s ) {
+               if ( $s instanceof MssqlBlob ) {
+                       return $s->fetch();
+               } elseif ( $s instanceof Blob ) {
+                       // this shouldn't really ever be called, but it's here if needed
+                       // (and will quite possibly make the SQL error out)
+                       $blob = new MssqlBlob( $s->fetch() );
+                       return $blob->fetch();
+               } else {
+                       if ( is_bool( $s ) ) {
+                               $s = $s ? 1 : 0;
+                       }
+                       return parent::addQuotes( $s );
+               }
+       }
+
+       /**
+        * @param string $s
+        * @return string
+        */
+       public function addIdentifierQuotes( $s ) {
+               // http://msdn.microsoft.com/en-us/library/aa223962.aspx
+               return '[' . $s . ']';
+       }
+
+       /**
+        * @param string $name
+        * @return bool
+        */
+       public function isQuotedIdentifier( $name ) {
+               return strlen( $name ) && $name[0] == '[' && substr( $name, -1, 1 ) == ']';
+       }
+
+       /**
+        * MS SQL supports more pattern operators than other databases (ex: [,],^)
+        *
+        * @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 '\' ";
+       }
+
+       /**
+        * @param string $db
+        * @return bool
+        */
+       public function selectDB( $db ) {
+               try {
+                       $this->mDBname = $db;
+                       $this->query( "USE $db" );
+                       return true;
+               } catch ( Exception $e ) {
+                       return false;
+               }
+       }
+
+       /**
+        * @param array $options An associative array of options to be turned into
+        *   an SQL query, valid keys are listed in the function.
+        * @return array
+        */
+       public function makeSelectOptions( $options ) {
+               $tailOpts = '';
+               $startOpts = '';
+
+               $noKeyOptions = [];
+               foreach ( $options as $key => $option ) {
+                       if ( is_numeric( $key ) ) {
+                               $noKeyOptions[$option] = true;
+                       }
+               }
+
+               $tailOpts .= $this->makeGroupByWithHaving( $options );
+
+               $tailOpts .= $this->makeOrderBy( $options );
+
+               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
+                       $startOpts .= 'DISTINCT';
+               }
+
+               if ( isset( $noKeyOptions['FOR XML'] ) ) {
+                       // used in group concat field emulation
+                       $tailOpts .= " FOR XML PATH('')";
+               }
+
+               // we want this to be compatible with the output of parent::makeSelectOptions()
+               return [ $startOpts, '', $tailOpts, '', '' ];
+       }
+
+       public function getType() {
+               return 'mssql';
+       }
+
+       /**
+        * @param array $stringList
+        * @return string
+        */
+       public function buildConcat( $stringList ) {
+               return implode( ' + ', $stringList );
+       }
+
+       /**
+        * Build a GROUP_CONCAT or equivalent statement for a query.
+        * MS SQL doesn't have GROUP_CONCAT so we emulate it with other stuff (and boy is it nasty)
+        *
+        * This is useful for combining a field for several rows into a single string.
+        * NULL values will not appear in the output, duplicated values will appear,
+        * and the resulting delimiter-separated values have no defined sort order.
+        * Code using the results may need to use the PHP unique() or sort() methods.
+        *
+        * @param string $delim Glue to bind the results together
+        * @param string|array $table Table name
+        * @param string $field Field name
+        * @param string|array $conds Conditions
+        * @param string|array $join_conds Join conditions
+        * @return string SQL text
+        * @since 1.23
+        */
+       public function buildGroupConcatField( $delim, $table, $field, $conds = '',
+               $join_conds = []
+       ) {
+               $gcsq = 'gcsq_' . $this->mSubqueryId;
+               $this->mSubqueryId++;
+
+               $delimLen = strlen( $delim );
+               $fld = "{$field} + {$this->addQuotes( $delim )}";
+               $sql = "(SELECT LEFT({$field}, LEN({$field}) - {$delimLen}) FROM ("
+                       . $this->selectSQLText( $table, $fld, $conds, null, [ 'FOR XML' ], $join_conds )
+                       . ") {$gcsq} ({$field}))";
+
+               return $sql;
+       }
+
+       /**
+        * Returns an associative array for fields that are of type varbinary, binary, or image
+        * $table can be either a raw table name or passed through tableName() first
+        * @param string $table
+        * @return array
+        */
+       private function getBinaryColumns( $table ) {
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+
+               if ( $this->mBinaryColumnCache === null ) {
+                       $this->populateColumnCaches();
+               }
+
+               return isset( $this->mBinaryColumnCache[$tableRaw] )
+                       ? $this->mBinaryColumnCache[$tableRaw]
+                       : [];
+       }
+
+       /**
+        * @param string $table
+        * @return array
+        */
+       private function getBitColumns( $table ) {
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+
+               if ( $this->mBitColumnCache === null ) {
+                       $this->populateColumnCaches();
+               }
+
+               return isset( $this->mBitColumnCache[$tableRaw] )
+                       ? $this->mBitColumnCache[$tableRaw]
+                       : [];
+       }
+
+       private function populateColumnCaches() {
+               $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
+                       [
+                               'TABLE_CATALOG' => $this->mDBname,
+                               'TABLE_SCHEMA' => $this->mSchema,
+                               'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ]
+                       ] );
+
+               $this->mBinaryColumnCache = [];
+               $this->mBitColumnCache = [];
+               foreach ( $res as $row ) {
+                       if ( $row->DATA_TYPE == 'bit' ) {
+                               $this->mBitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                       } else {
+                               $this->mBinaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                       }
+               }
+       }
+
+       /**
+        * @param string $name
+        * @param string $format
+        * @return string
+        */
+       function tableName( $name, $format = 'quoted' ) {
+               # Replace reserved words with better ones
+               switch ( $name ) {
+                       case 'user':
+                               return $this->realTableName( 'mwuser', $format );
+                       default:
+                               return $this->realTableName( $name, $format );
+               }
+       }
+
+       /**
+        * call this instead of tableName() in the updater when renaming tables
+        * @param string $name
+        * @param string $format One of quoted, raw, or split
+        * @return string
+        */
+       function realTableName( $name, $format = 'quoted' ) {
+               $table = parent::tableName( $name, $format );
+               if ( $format == 'split' ) {
+                       // Used internally, we want the schema split off from the table name and returned
+                       // as a list with 3 elements (database, schema, table)
+                       $table = explode( '.', $table );
+                       while ( count( $table ) < 3 ) {
+                               array_unshift( $table, false );
+                       }
+               }
+               return $table;
+       }
+
+       /**
+        * Delete a table
+        * @param string $tableName
+        * @param string $fName
+        * @return bool|ResultWrapper
+        * @since 1.18
+        */
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               if ( !$this->tableExists( $tableName, $fName ) ) {
+                       return false;
+               }
+
+               // parent function incorrectly appends CASCADE, which we don't want
+               $sql = "DROP TABLE " . $this->tableName( $tableName );
+
+               return $this->query( $sql, $fName );
+       }
+
+       /**
+        * Called in the installer and updater.
+        * Probably doesn't need to be called anywhere else in the codebase.
+        * @param bool|null $value
+        * @return bool|null
+        */
+       public function prepareStatements( $value = null ) {
+               $old = $this->mPrepareStatements;
+               if ( $value !== null ) {
+                       $this->mPrepareStatements = $value;
+               }
+
+               return $old;
+       }
+
+       /**
+        * Called in the installer and updater.
+        * Probably doesn't need to be called anywhere else in the codebase.
+        * @param bool|null $value
+        * @return bool|null
+        */
+       public function scrollableCursor( $value = null ) {
+               $old = $this->mScrollableCursor;
+               if ( $value !== null ) {
+                       $this->mScrollableCursor = $value;
+               }
+
+               return $old;
+       }
+}
index 668443b..61ba498 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\MySQLMasterPos;
+use Wikimedia\Rdbms\MySQLField;
 
 /**
  * Database abstraction object for MySQL.
@@ -756,14 +759,20 @@ abstract class DatabaseMysqlBase extends Database {
         * @see https://www.percona.com/doc/percona-toolkit/2.1/pt-heartbeat.html
         */
        protected function getHeartbeatData( array $conds ) {
-               $whereSQL = $this->makeList( $conds, self::LIST_AND );
-               // Use ORDER BY for channel based queries since that field might not be UNIQUE.
-               // Note: this would use "TIMESTAMPDIFF(MICROSECOND,ts,UTC_TIMESTAMP(6))" but the
-               // percision field is not supported in MySQL <= 5.5.
-               $res = $this->query(
-                       "SELECT ts FROM heartbeat.heartbeat WHERE $whereSQL ORDER BY ts DESC LIMIT 1"
-               );
-               $row = $res ? $res->fetchObject() : false;
+               // Do not bother starting implicit transactions here
+               $this->clearFlag( self::DBO_TRX, self::REMEMBER_PRIOR );
+               try {
+                       $whereSQL = $this->makeList( $conds, self::LIST_AND );
+                       // Use ORDER BY for channel based queries since that field might not be UNIQUE.
+                       // Note: this would use "TIMESTAMPDIFF(MICROSECOND,ts,UTC_TIMESTAMP(6))" but the
+                       // percision field is not supported in MySQL <= 5.5.
+                       $res = $this->query(
+                               "SELECT ts FROM heartbeat.heartbeat WHERE $whereSQL ORDER BY ts DESC LIMIT 1"
+                       );
+                       $row = $res ? $res->fetchObject() : false;
+               } finally {
+                       $this->restoreFlags();
+               }
 
                return [ $row ? $row->ts : null, microtime( true ) ];
        }
@@ -1325,4 +1334,3 @@ abstract class DatabaseMysqlBase extends Database {
                return in_array( $name, $this->listViews( $prefix ) );
        }
 }
-
index cd02177..109f848 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup Database
  */
 use Wikimedia\WaitConditionLoop;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\PostgresBlob;
+use Wikimedia\Rdbms\PostgresField;
 
 /**
  * @ingroup Database
@@ -243,9 +246,7 @@ class DatabasePostgres extends Database {
                }
                /* Transaction stays in the ERROR state until rolled back */
                if ( $this->mTrxLevel ) {
-                       $ignore = $this->ignoreErrors( true );
                        $this->rollback( __METHOD__ );
-                       $this->ignoreErrors( $ignore );
                }
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
@@ -700,7 +701,7 @@ __INDEXATTR__;
                list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) =
                        $this->makeSelectOptions( $selectOptions );
                if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ &$this, 'tableName' ], $srcTable ) );
+                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
                } else {
                        $srcTable = $this->tableName( $srcTable );
                }
@@ -1259,7 +1260,7 @@ SQL;
 
                if ( isset( $options['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE OF ' .
-                               implode( ', ', array_map( [ &$this, 'tableName' ], $options['FOR UPDATE'] ) );
+                               implode( ', ', array_map( [ $this, 'tableName' ], $options['FOR UPDATE'] ) );
                } elseif ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
index 7317d54..30bfcf8 100644 (file)
@@ -21,6 +21,8 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\SQLiteField;
 
 /**
  * @ingroup Database
@@ -41,7 +43,7 @@ class DatabaseSqlite extends Database {
        /** @var resource */
        protected $mLastResult;
 
-       /** @var $mConn PDO */
+       /** @var PDO */
        protected $mConn;
 
        /** @var FSLockManager (hopefully on the same server as the DB) */
@@ -665,7 +667,7 @@ class DatabaseSqlite extends Database {
        }
 
        /**
-        * @param string $sqls
+        * @param string[] $sqls
         * @param bool $all Whether to "UNION ALL" or not
         * @return string
         */
index 48d76c4..f7bb6cf 100644 (file)
  * @ingroup Database
  */
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\LikeMatch;
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\Field;
 
 /**
  * Basic database interface for live and lazy-loaded relation database handles
@@ -905,6 +909,8 @@ interface IDatabase {
         * @param array $values An array of values to SET. For each array element,
         *   the key gives the field name, and the value gives the data to set
         *   that field to. The data will be quoted by IDatabase::addQuotes().
+        *   Values with integer keys form unquoted SET statements, which can be used for
+        *   things like "field = field + 1" or similar computed values.
         * @param array $conds An array of conditions (WHERE). See
         *   IDatabase::select() for the details of the format of condition
         *   arrays. Use '*' to update all rows.
@@ -1148,6 +1154,8 @@ interface IDatabase {
         * @param array $set An array of values to SET. For each array element, the
         *   key gives the field name, and the value gives the data to set that
         *   field to. The data will be quoted by IDatabase::addQuotes().
+        *   Values with integer keys form unquoted SET statements, which can be used for
+        *   things like "field = field + 1" or similar computed values.
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @throws Exception
         * @return bool
@@ -1183,7 +1191,7 @@ interface IDatabase {
        /**
         * DELETE query wrapper.
         *
-        * @param array $table Table name
+        * @param string $table Table name
         * @param string|array $conds Array of conditions. See $conds in IDatabase::select()
         *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname Name of the calling function
index 8395359..43cec28 100644 (file)
@@ -186,4 +186,23 @@ interface IMaintainableDatabase extends IDatabase {
         * @return array
         */
        public function listViews( $prefix = null, $fname = __METHOD__ );
+
+       /**
+        * Creates a new table with structure copied from existing table
+        *
+        * Note that unlike most database abstraction functions, this function does not
+        * automatically append database prefix, because it works at a lower abstraction level.
+        * The table names passed to this function shall not be quoted (this function calls
+        * addIdentifierQuotes() when needed).
+        *
+        * @param string $oldName Name of table whose structure should be copied
+        * @param string $newName Name of table to be created
+        * @param bool $temporary Whether the new table should be temporary
+        * @param string $fname Calling function name
+        * @return bool True if operation was successful
+        * @throws RuntimeException
+        */
+       public function duplicateTableStructure(
+               $oldName, $newName, $temporary = false, $fname = __METHOD__
+       );
 }
diff --git a/includes/libs/rdbms/database/MaintainableDBConnRef.php b/includes/libs/rdbms/database/MaintainableDBConnRef.php
new file mode 100644 (file)
index 0000000..fa3ddf9
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Helper class to handle automatically marking connections as reusable (via RAII pattern)
+ * as well handling deferring the actual network connection until the handle is used
+ *
+ * @note: proxy methods are defined explicity to avoid interface errors
+ * @ingroup Database
+ * @since 1.29
+ */
+class MaintainableDBConnRef extends DBConnRef implements IMaintainableDatabase {
+       public function tableName( $name, $format = 'quoted' ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function tableNames() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function tableNamesN() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function sourceFile(
+               $filename,
+               callable $lineCallback = null,
+               callable $resultCallback = null,
+               $fname = false,
+               callable $inputCallback = null
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function sourceStream(
+               $fp,
+               callable $lineCallback = null,
+               callable $resultCallback = null,
+               $fname = __METHOD__,
+               callable $inputCallback = null
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function deadlockLoop() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function listViews( $prefix = null, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function textFieldSize( $table, $field ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function streamStatementEnd( &$sql, &$newLine ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function duplicateTableStructure(
+               $oldName, $newName, $temporary = false, $fname = __METHOD__
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+}
index eda0ff3..2f79ea9 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * An object representing a master or replica DB position in a replicated setup.
  *
index 7b49ce9..06776fe 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+
 /**
  * DBMasterPos class for MySQL/MariaDB
  *
diff --git a/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php b/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php
new file mode 100644 (file)
index 0000000..dc89a2d
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+namespace Wikimedia\Rdbms;
+
+use Iterator;
+use DBUnexpectedError;
+use stdClass;
+
+/**
+ * Result wrapper for grabbing data queried from an IDatabase object
+ *
+ * Note that using the Iterator methods in combination with the non-Iterator
+ * DB result iteration functions may cause rows to be skipped or repeated.
+ *
+ * By default, this will use the iteration methods of the IDatabase handle if provided.
+ * Subclasses can override methods to make it solely work on the result resource instead.
+ * If no database is provided, and the subclass does not override the DB iteration methods,
+ * then a RuntimeException will be thrown when iteration is attempted.
+ *
+ * The result resource field should not be accessed from non-Database related classes.
+ * It is database class specific and is stored here to associate iterators with queries.
+ *
+ * @ingroup Database
+ */
+interface IResultWrapper extends Iterator {
+       /**
+        * Get the number of rows in a result object
+        *
+        * @return int
+        */
+       public function numRows();
+
+       /**
+        * Fetch the next row from the given result object, in object form. Fields can be retrieved with
+        * $row->fieldname, with fields acting like member variables. If no more rows are available,
+        * false is returned.
+        *
+        * @return stdClass|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       public function fetchObject();
+
+       /**
+        * Fetch the next row from the given result object, in associative array form. Fields are
+        * retrieved with $row['fieldname']. If no more rows are available, false is returned.
+        *
+        * @return array|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       public function fetchRow();
+
+       /**
+        * Change the position of the cursor in a result object.
+        * See mysql_data_seek()
+        *
+        * @param int $row
+        */
+       public function seek( $row );
+
+       /**
+        * Free a result object
+        *
+        * This either saves memory in PHP (buffered queries) or on the server (unbuffered queries).
+        * In general, queries are not large enough in result sets for this to be worth calling.
+        */
+       public function free();
+
+       /**
+        * @return stdClass|array|bool
+        */
+       public function current();
+
+       /**
+        * @return int
+        */
+       public function key();
+
+       /**
+        * @return stdClass
+        */
+       function next();
+}
index 53109c8..88e7cdd 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\IResultWrapper;
+
 /**
  * Result wrapper for grabbing data queried from an IDatabase object
  *
@@ -15,7 +18,7 @@
  *
  * @ingroup Database
  */
-class ResultWrapper implements Iterator {
+class ResultWrapper implements IResultWrapper {
        /** @var resource|array|null Optional underlying result handle for subclass usage */
        public $result;
 
@@ -45,54 +48,22 @@ class ResultWrapper implements Iterator {
                }
        }
 
-       /**
-        * Get the number of rows in a result object
-        *
-        * @return int
-        */
        public function numRows() {
                return $this->getDB()->numRows( $this );
        }
 
-       /**
-        * Fetch the next row from the given result object, in object form. Fields can be retrieved with
-        * $row->fieldname, with fields acting like member variables. If no more rows are available,
-        * false is returned.
-        *
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
        public function fetchObject() {
                return $this->getDB()->fetchObject( $this );
        }
 
-       /**
-        * Fetch the next row from the given result object, in associative array form. Fields are
-        * retrieved with $row['fieldname']. If no more rows are available, false is returned.
-        *
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
        public function fetchRow() {
                return $this->getDB()->fetchRow( $this );
        }
 
-       /**
-        * Change the position of the cursor in a result object.
-        * See mysql_data_seek()
-        *
-        * @param int $row
-        */
        public function seek( $row ) {
                $this->getDB()->dataSeek( $this, $row );
        }
 
-       /**
-        * Free a result object
-        *
-        * This either saves memory in PHP (buffered queries) or on the server (unbuffered queries).
-        * In general, queries are not large enough in result sets for this to be worth calling.
-        */
        public function free() {
                if ( $this->db ) {
                        $this->db->freeResult( $this );
@@ -121,9 +92,6 @@ class ResultWrapper implements Iterator {
                $this->currentRow = null;
        }
 
-       /**
-        * @return stdClass|array|bool
-        */
        function current() {
                if ( is_null( $this->currentRow ) ) {
                        $this->next();
@@ -132,16 +100,10 @@ class ResultWrapper implements Iterator {
                return $this->currentRow;
        }
 
-       /**
-        * @return int
-        */
        function key() {
                return $this->pos;
        }
 
-       /**
-        * @return stdClass
-        */
        function next() {
                $this->pos++;
                $this->currentRow = $this->fetchObject();
index 692a704..c3367e7 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\ILoadBalancer;
+
 /**@{
  * Database related constants
  */
index bd90330..db5b7e5 100644 (file)
@@ -1,19 +1,21 @@
 <?php
-/**
- * Utility class
- * @ingroup Database
- *
- * This allows us to distinguish a blob from a normal string and an array of strings
- */
-class Blob {
+
+namespace Wikimedia\Rdbms;
+
+class Blob implements IBlob {
        /** @var string */
        protected $mData;
 
-       function __construct( $data ) {
+       /**
+        * @param $data string
+        */
+       public function __construct( $data ) {
                $this->mData = $data;
        }
 
-       function fetch() {
+       public function fetch() {
                return $this->mData;
        }
 }
+
+class_alias( Blob::class, 'Blob' );
diff --git a/includes/libs/rdbms/encasing/IBlob.php b/includes/libs/rdbms/encasing/IBlob.php
new file mode 100644 (file)
index 0000000..b1d7aae
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+namespace Wikimedia\Rdbms;
+
+/**
+ * Wrapper allowing us to distinguish a blob from a normal string and an array of strings
+ * @ingroup Database
+ */
+interface IBlob {
+       /**
+        * @return string
+        */
+       public function fetch();
+}
index b0b3c87..98812a5 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * Used by Database::buildLike() to represent characters that have special
  * meaning in SQL LIKE clauses and thus need no escaping. Don't instantiate it
index 35be65c..aacdf40 100644 (file)
@@ -1,5 +1,13 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class MssqlBlob extends Blob {
+       /** @noinspection PhpMissingParentConstructorInspection */
+
+       /**
+        * @param string $data
+        */
        public function __construct( $data ) {
                if ( $data instanceof MssqlBlob ) {
                        return $data;
index cc52336..7994b73 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class PostgresBlob extends Blob {
 
 }
index 9e10884..7d303b1 100644 (file)
@@ -26,7 +26,7 @@
  * @ingroup Database
  * @since 1.23
  */
-class DBExpectedError extends DBError implements MessageSpecifier {
+class DBExpectedError extends DBError implements MessageSpecifier, ILocalizedException {
        /** @var string[] Message parameters */
        protected $params;
 
@@ -42,4 +42,12 @@ class DBExpectedError extends DBError implements MessageSpecifier {
        public function getParams() {
                return $this->params;
        }
+
+       /**
+        * @inheritdoc
+        * @since 1.29
+        */
+       public function getMessageObject() {
+               return Message::newFromSpecifier( $this );
+       }
 }
index ed102f4..7918f36 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * Base for all database-specific classes representing information about database fields
  * @ingroup Database
@@ -28,3 +31,5 @@ interface Field {
         */
        function isNullable();
 }
+
+class_alias( Field::class, 'Field' );
index 80e1924..98cc2b1 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class MssqlField implements Field {
        private $name, $tableName, $default, $max_length, $nullable, $type;
 
@@ -35,4 +38,3 @@ class MssqlField implements Field {
                return $this->type;
        }
 }
-
index 8cf964c..709c61e 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class MySQLField implements Field {
        private $name, $tablename, $default, $max_length, $nullable,
                $is_pk, $is_unique, $is_multiple, $is_key, $type, $binary,
@@ -103,4 +106,3 @@ class MySQLField implements Field {
                return $this->is_zerofill;
        }
 }
-
diff --git a/includes/libs/rdbms/field/ORAField.php b/includes/libs/rdbms/field/ORAField.php
deleted file mode 100644 (file)
index e48310d..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-class ORAField implements Field {
-       private $name, $tablename, $default, $max_length, $nullable,
-               $is_pk, $is_unique, $is_multiple, $is_key, $type;
-
-       function __construct( $info ) {
-               $this->name = $info['column_name'];
-               $this->tablename = $info['table_name'];
-               $this->default = $info['data_default'];
-               $this->max_length = $info['data_length'];
-               $this->nullable = $info['not_null'];
-               $this->is_pk = isset( $info['prim'] ) && $info['prim'] == 1 ? 1 : 0;
-               $this->is_unique = isset( $info['uniq'] ) && $info['uniq'] == 1 ? 1 : 0;
-               $this->is_multiple = isset( $info['nonuniq'] ) && $info['nonuniq'] == 1 ? 1 : 0;
-               $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
-               $this->type = $info['data_type'];
-       }
-
-       function name() {
-               return $this->name;
-       }
-
-       function tableName() {
-               return $this->tablename;
-       }
-
-       function defaultValue() {
-               return $this->default;
-       }
-
-       function maxLength() {
-               return $this->max_length;
-       }
-
-       function isNullable() {
-               return $this->nullable;
-       }
-
-       function isKey() {
-               return $this->is_key;
-       }
-
-       function isMultipleKey() {
-               return $this->is_multiple;
-       }
-
-       function type() {
-               return $this->type;
-       }
-}
index d34c125..c5819a3 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use DatabasePostgres;
+
 class PostgresField implements Field {
        private $name, $tablename, $type, $nullable, $max_length, $deferred, $deferrable, $conname,
                $has_default, $default;
index 0a2389b..39f8f01 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class SQLiteField implements Field {
        private $info, $tableName;
 
index 5288c24..faf7fb1 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+use DBTransactionError;
+use DBReplicationWaitError;
+
 /**
  * An interface for generating database load balancers
  * @ingroup Database
@@ -178,7 +184,7 @@ interface ILBFactory {
         * @param string $fname Caller name
         * @param array $options Options map:
         *   - maxWriteDuration: abort if more than this much time was spent in write queries
-        * @throws Exception
+        * @throws DBTransactionError
         */
        public function commitMasterChanges( $fname = __METHOD__, array $options = [] );
 
index 15a5c0d..c4229bc 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
+use BagOStuff;
+use EmptyBagOStuff;
+use WANObjectCache;
+use Exception;
+use RuntimeException;
+use IDatabase;
+use DBTransactionError;
+use DBReplicationWaitError;
 
 /**
  * An interface for generating database load balancers
@@ -100,7 +110,7 @@ abstract class LBFactory implements ILBFactory {
                                trigger_error( E_USER_WARNING, get_class( $e ) . ': ' . $e->getMessage() );
                        };
 
-               $this->profiler = isset( $params['profiler'] ) ? $params['profiler'] : null;
+               $this->profiler = isset( $conf['profiler'] ) ? $conf['profiler'] : null;
                $this->trxProfiler = isset( $conf['trxProfiler'] )
                        ? $conf['trxProfiler']
                        : new TransactionProfiler();
@@ -111,9 +121,9 @@ abstract class LBFactory implements ILBFactory {
                        'ChronologyProtection' => 'true'
                ];
 
-               $this->cliMode = isset( $params['cliMode'] ) ? $params['cliMode'] : PHP_SAPI === 'cli';
+               $this->cliMode = isset( $conf['cliMode'] ) ? $conf['cliMode'] : PHP_SAPI === 'cli';
                $this->hostname = isset( $conf['hostname'] ) ? $conf['hostname'] : gethostname();
-               $this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
+               $this->agent = isset( $conf['agent'] ) ? $conf['agent'] : '';
 
                $this->ticket = mt_rand();
        }
index 1d22873..447b96f 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use InvalidArgumentException;
+
 /**
  * A multi-database, multi-master factory for Wikimedia and similar installations.
  * Ignores the old configuration globals.
@@ -260,7 +265,7 @@ class LBFactoryMulti extends LBFactory {
                        throw new InvalidArgumentException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
                }
                $template = $this->serverTemplate;
-               if ( isset( $this->externalTemplateOverrides ) ) {
+               if ( $this->externalTemplateOverrides ) {
                        $template = $this->externalTemplateOverrides + $template;
                }
                if ( isset( $this->templateOverridesByCluster[$cluster] ) ) {
@@ -348,7 +353,7 @@ class LBFactoryMulti extends LBFactory {
                        $serverInfo = $template;
                        if ( $master ) {
                                $serverInfo['master'] = true;
-                               if ( isset( $this->masterTemplateOverrides ) ) {
+                               if ( $this->masterTemplateOverrides ) {
                                        $serverInfo = $this->masterTemplateOverrides + $serverInfo;
                                }
                                $master = false;
index 5bf5032..15cd508 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+
 /**
  * A simple single-master LBFactory that gets its configuration from the b/c globals
  */
index 819375d..5931d80 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use InvalidArgumentException;
+use BadMethodCallException;
+
 /**
  * An LBFactory class that always returns a single database object.
  */
index 8854479..4c277ff 100644 (file)
  * @ingroup Database
  * @author Aaron Schulz
  */
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use Database;
+use DBConnRef;
+use MaintainableDBConnRef;
+use DBError;
+use DBAccessError;
+use DBTransactionError;
+use DBExpectedError;
+use Exception;
+use InvalidArgumentException;
 
 /**
  * Database cluster connection, tracking, load balancing, and transaction manager interface
@@ -108,8 +120,9 @@ interface ILoadBalancer {
 
        /**
         * Get the index of the reader connection, which may be a replica DB
+        *
         * This takes into account load ratios and lag times. It should
-        * always return a consistent index during a given invocation
+        * always return a consistent index during a given invocation.
         *
         * Side effect: opens connections to databases
         * @param string|bool $group Query group, or false for the generic reader
@@ -121,8 +134,10 @@ interface ILoadBalancer {
 
        /**
         * Set the master wait position
-        * If a DB_REPLICA connection has been opened already, waits
-        * Otherwise sets a variable telling it to wait if such a connection is opened
+        *
+        * If a DB_REPLICA connection has been opened already, then wait immediately.
+        * Otherwise sets a variable telling it to wait if such a connection is opened.
+        *
         * @param DBMasterPos $pos
         */
        public function waitFor( $pos );
@@ -140,6 +155,7 @@ interface ILoadBalancer {
 
        /**
         * Set the master wait position and wait for ALL replica DBs to catch up to it
+        *
         * @param DBMasterPos $pos
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
@@ -148,30 +164,29 @@ interface ILoadBalancer {
 
        /**
         * Get any open connection to a given server index, local or foreign
-        * Returns false if there is no connection open
         *
-        * @param int $i Server index
-        * @return IDatabase|bool False on failure
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
+        * @return Database|bool False if no such connection is open
         */
        public function getAnyOpenConnection( $i );
 
        /**
         * Get a connection by index
-        * This is the main entry point for this class.
         *
-        * @param int $i Server index
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         *
         * @throws DBError
-        * @return IDatabase
+        * @return Database
         */
        public function getConnection( $i, $groups = [], $domain = false );
 
        /**
-        * Mark a foreign connection as being available for reuse under a different
-        * DB name or prefix. This mechanism is reference-counted, and must be called
-        * the same number of times as getConnection() to work.
+        * Mark a foreign connection as being available for reuse under a different DB domain
+        *
+        * This mechanism is reference-counted, and must be called the same number of times
+        * as getConnection() to work.
         *
         * @param IDatabase $conn
         * @throws InvalidArgumentException
@@ -181,44 +196,55 @@ interface ILoadBalancer {
        /**
         * Get a database connection handle reference
         *
-        * The handle's methods wrap simply wrap those of a IDatabase handle
+        * The handle's methods simply wrap those of a Database handle
         *
-        * @see LoadBalancer::getConnection() for parameter information
+        * @see ILoadBalancer::getConnection() for parameter information
         *
-        * @param int $db
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         * @return DBConnRef
         */
-       public function getConnectionRef( $db, $groups = [], $domain = false );
+       public function getConnectionRef( $i, $groups = [], $domain = false );
 
        /**
         * Get a database connection handle reference without connecting yet
         *
-        * The handle's methods wrap simply wrap those of a IDatabase handle
+        * The handle's methods simply wrap those of a Database handle
         *
-        * @see LoadBalancer::getConnection() for parameter information
+        * @see ILoadBalancer::getConnection() for parameter information
         *
-        * @param int $db
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         * @return DBConnRef
         */
-       public function getLazyConnectionRef( $db, $groups = [], $domain = false );
+       public function getLazyConnectionRef( $i, $groups = [], $domain = false );
+
+       /**
+        * Get a maintenance database connection handle reference for migrations and schema changes
+        *
+        * The handle's methods simply wrap those of a Database handle
+        *
+        * @see ILoadBalancer::getConnection() for parameter information
+        *
+        * @param int $db Server index or DB_MASTER/DB_REPLICA
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $domain Domain ID, or false for the current domain
+        * @return MaintainableDBConnRef
+        */
+       public function getMaintenanceConnectionRef( $db, $groups = [], $domain = false );
 
        /**
         * Open a connection to the server given by the specified index
         * Index must be an actual index into the array.
         * If the server is already open, returns it.
         *
-        * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
-        *
         * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
         *
-        * @param int $i Server index
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @return IDatabase|bool Returns false on errors
+        * @return Database|bool Returns false on errors
         * @throws DBAccessError
         */
        public function openConnection( $i, $domain = false );
@@ -353,7 +379,7 @@ interface ILoadBalancer {
         *
         * Use this only for mutli-database commits
         *
-        * @param integer $type IDatabase::TRIGGER_* constant
+        * @param int $type IDatabase::TRIGGER_* constant
         * @return Exception|null The first exception or null if there were none
         */
        public function runMasterPostTrxCallbacks( $type );
@@ -430,7 +456,7 @@ interface ILoadBalancer {
        /**
         * @note This method may trigger a DB connection if not yet done
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @param IDatabase|null DB master connection; used to avoid loops [optional]
+        * @param IDatabase|null $conn DB master connection; used to avoid loops [optional]
         * @return string|bool Reason the master is read-only or false if it is not
         */
        public function getReadOnlyReason( $domain = false, IDatabase $conn = null );
@@ -515,10 +541,10 @@ interface ILoadBalancer {
         *
         * @param IDatabase $conn Replica DB
         * @param DBMasterPos|bool $pos Master position; default: current position
-        * @param integer|null $timeout Timeout in seconds [optional]
+        * @param int $timeout Timeout in seconds [optional]
         * @return bool Success
         */
-       public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = null );
+       public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = 10 );
 
        /**
         * Set a callback via IDatabase::setTransactionListener() on
index d42fed9..6878712 100644 (file)
  * @file
  * @ingroup Database
  */
+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;
 
 /**
  * Database connection, tracking, load balancing, and transaction manager for a cluster
@@ -31,7 +52,7 @@ use Wikimedia\ScopedCallback;
 class LoadBalancer implements ILoadBalancer {
        /** @var array[] Map of (server index => server config array) */
        private $mServers;
-       /** @var array[] Map of (local/foreignUsed/foreignFree => server index => IDatabase array) */
+       /** @var \Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
        private $mConns;
        /** @var float[] Map of (server index => weight) */
        private $mLoads;
@@ -67,8 +88,8 @@ class LoadBalancer implements ILoadBalancer {
        /** @var LoggerInterface */
        protected $perfLogger;
 
-       /** @var bool|IDatabase Database connection that caused a problem */
-       private $mErrorConnection;
+       /** @var \Database Database connection that caused a problem */
+       private $errorConnection;
        /** @var integer The generic (not query grouped) replica DB index (of $mServers) */
        private $mReadIndex;
        /** @var bool|DBMasterPos False if not set */
@@ -140,7 +161,6 @@ class LoadBalancer implements ILoadBalancer {
                ];
                $this->mLoads = [];
                $this->mWaitForPos = false;
-               $this->mErrorConnection = false;
                $this->mAllowLagged = false;
 
                if ( isset( $params['readOnlyReason'] ) && is_string( $params['readOnlyReason'] ) ) {
@@ -194,7 +214,7 @@ class LoadBalancer implements ILoadBalancer {
                        };
 
                foreach ( [ 'replLogger', 'connLogger', 'queryLogger', 'perfLogger' ] as $key ) {
-                       $this->$key = isset( $params[$key] ) ? $params[$key] : new \Psr\Log\NullLogger();
+                       $this->$key = isset( $params[$key] ) ? $params[$key] : new NullLogger();
                }
 
                $this->host = isset( $params['hostname'] )
@@ -211,7 +231,17 @@ class LoadBalancer implements ILoadBalancer {
         */
        private function getLoadMonitor() {
                if ( !isset( $this->loadMonitor ) ) {
+                       $compat = [
+                               'LoadMonitor' => LoadMonitor::class,
+                               'LoadMonitorNull' => LoadMonitorNull::class,
+                               'LoadMonitorMySQL' => LoadMonitorMySQL::class,
+                       ];
+
                        $class = $this->loadMonitorConfig['class'];
+                       if ( isset( $compat[$class] ) ) {
+                               $class = $compat[$class];
+                       }
+
                        $this->loadMonitor = new $class(
                                $this, $this->srvCache, $this->memCache, $this->loadMonitorConfig );
                        $this->loadMonitor->setLogger( $this->replLogger );
@@ -241,10 +271,14 @@ class LoadBalancer implements ILoadBalancer {
 
                                $host = $this->getServerName( $i );
                                if ( $lag === false && !is_infinite( $maxServerLag ) ) {
-                                       $this->replLogger->error( "Server $host (#$i) is not replicating?" );
+                                       $this->replLogger->error(
+                                               "Server {host} (#$i) is not replicating?", [ 'host' => $host ] );
                                        unset( $loads[$i] );
                                } elseif ( $lag > $maxServerLag ) {
-                                       $this->replLogger->warning( "Server $host (#$i) has >= $lag seconds of lag" );
+                                       $this->replLogger->warning(
+                                               "Server {host} (#$i) has {lag} seconds of lag (>= {maxlag})",
+                                               [ 'host' => $host, 'lag' => $lag, 'maxlag' => $maxServerLag ]
+                                       );
                                        unset( $loads[$i] );
                                }
                        }
@@ -390,6 +424,9 @@ class LoadBalancer implements ILoadBalancer {
                return $i;
        }
 
+       /**
+        * @param DBMasterPos|false $pos
+        */
        public function waitFor( $pos ) {
                $this->mWaitForPos = $pos;
                $i = $this->mReadIndex;
@@ -436,10 +473,17 @@ class LoadBalancer implements ILoadBalancer {
                return $ok;
        }
 
+       /**
+        * @param int $i
+        * @return IDatabase|bool
+        */
        public function getAnyOpenConnection( $i ) {
                foreach ( $this->mConns as $connsByServer ) {
                        if ( !empty( $connsByServer[$i] ) ) {
-                               return reset( $connsByServer[$i] );
+                               /** @var $serverConns IDatabase[] */
+                               $serverConns = $connsByServer[$i];
+
+                               return reset( $serverConns );
                        }
                }
 
@@ -458,10 +502,13 @@ class LoadBalancer implements ILoadBalancer {
 
                // Check if we already know that the DB has reached this point
                $server = $this->getServerName( $index );
-               $key = $this->srvCache->makeGlobalKey( __CLASS__, 'last-known-pos', $server );
+               $key = $this->srvCache->makeGlobalKey( __CLASS__, 'last-known-pos', $server, 'v1' );
                /** @var DBMasterPos $knownReachedPos */
                $knownReachedPos = $this->srvCache->get( $key );
-               if ( $knownReachedPos && $knownReachedPos->hasReached( $this->mWaitForPos ) ) {
+               if (
+                       $knownReachedPos instanceof DBMasterPos &&
+                       $knownReachedPos->hasReached( $this->mWaitForPos )
+               ) {
                        $this->replLogger->debug( __METHOD__ .
                                ": replica DB $server known to be caught up (pos >= $knownReachedPos)." );
                        return true;
@@ -493,8 +540,10 @@ class LoadBalancer implements ILoadBalancer {
 
                if ( $result == -1 || is_null( $result ) ) {
                        // Timed out waiting for replica DB, use master instead
-                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
-                       $this->replLogger->warning( "$msg" );
+                       $this->replLogger->warning(
+                               __METHOD__ . ": Timed out waiting on {host} pos {$this->mWaitForPos}",
+                               [ 'host' => $server ]
+                       );
                        $ok = false;
                } else {
                        $this->replLogger->info( __METHOD__ . ": Done" );
@@ -650,6 +699,12 @@ class LoadBalancer implements ILoadBalancer {
                return new DBConnRef( $this, [ $db, $groups, $domain ] );
        }
 
+       public function getMaintenanceConnectionRef( $db, $groups = [], $domain = false ) {
+               $domain = ( $domain !== false ) ? $domain : $this->localDomain;
+
+               return new MaintainableDBConnRef( $this, $this->getConnection( $db, $groups, $domain ) );
+       }
+
        /**
         * @see ILoadBalancer::openConnection()
         *
@@ -681,17 +736,17 @@ class LoadBalancer implements ILoadBalancer {
                                $this->mConns['local'][$i][0] = $conn;
                        } else {
                                $this->connLogger->warning( "Failed to connect to database $i at '$serverName'." );
-                               $this->mErrorConnection = $conn;
+                               $this->errorConnection = $conn;
                                $conn = false;
                        }
                }
 
-               if ( $conn && !$conn->isOpen() ) {
+               if ( $conn instanceof IDatabase && !$conn->isOpen() ) {
                        // Connection was made but later unrecoverably lost for some reason.
                        // Do not return a handle that will just throw exceptions on use,
                        // but let the calling code (e.g. getReaderIndex) try another server.
                        // See DatabaseMyslBase::ping() for how this can happen.
-                       $this->mErrorConnection = $conn;
+                       $this->errorConnection = $conn;
                        $conn = false;
                }
 
@@ -710,7 +765,7 @@ class LoadBalancer implements ILoadBalancer {
         * it has been freed first with reuseConnection().
         *
         * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
+        * error will be available via $this->errorConnection.
         *
         * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
         *
@@ -742,7 +797,7 @@ class LoadBalancer implements ILoadBalancer {
                        if ( strlen( $dbName ) && !$conn->selectDB( $dbName ) ) {
                                $this->mLastError = "Error selecting database '$dbName' on server " .
                                        $conn->getServer() . " from client host {$this->host}";
-                               $this->mErrorConnection = $conn;
+                               $this->errorConnection = $conn;
                                $conn = false;
                        } else {
                                $conn->tablePrefix( $prefix );
@@ -763,7 +818,7 @@ class LoadBalancer implements ILoadBalancer {
                        $conn = $this->reallyOpenConnection( $server, $dbName );
                        if ( !$conn->isOpen() ) {
                                $this->connLogger->warning( __METHOD__ . ": connection error for $i/$domain" );
-                               $this->mErrorConnection = $conn;
+                               $this->errorConnection = $conn;
                                $conn = false;
                        } else {
                                $conn->tablePrefix( $prefix );
@@ -773,7 +828,7 @@ class LoadBalancer implements ILoadBalancer {
                }
 
                // Increment reference count
-               if ( $conn ) {
+               if ( $conn instanceof IDatabase ) {
                        $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
                        $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
                }
@@ -871,22 +926,13 @@ class LoadBalancer implements ILoadBalancer {
         * @throws DBConnectionError
         */
        private function reportConnectionError() {
-               $conn = $this->mErrorConnection; // the connection which caused the error
+               $conn = $this->errorConnection; // the connection which caused the error
                $context = [
                        'method' => __METHOD__,
                        'last_error' => $this->mLastError,
                ];
 
-               if ( !is_object( $conn ) ) {
-                       // No last connection, probably due to all servers being too busy
-                       $this->connLogger->error(
-                               "LB failure with no last connection. Connection error: {last_error}",
-                               $context
-                       );
-
-                       // If all servers were busy, mLastError will contain something sensible
-                       throw new DBConnectionError( null, $this->mLastError );
-               } else {
+               if ( $conn instanceof IDatabase ) {
                        $context['db_server'] = $conn->getServer();
                        $this->connLogger->warning(
                                "Connection error: {last_error} ({db_server})",
@@ -895,6 +941,15 @@ class LoadBalancer implements ILoadBalancer {
 
                        // throws DBConnectionError
                        $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" );
+               } else {
+                       // No last connection, probably due to all servers being too busy
+                       $this->connLogger->error(
+                               "LB failure with no last connection. Connection error: {last_error}",
+                               $context
+                       );
+
+                       // If all servers were busy, mLastError will contain something sensible
+                       throw new DBConnectionError( null, $this->mLastError );
                }
        }
 
@@ -1314,7 +1369,7 @@ class LoadBalancer implements ILoadBalancer {
 
        /**
         * @param string $domain Domain ID, or false for the current domain
-        * @param IDatabase|null DB master connectionl used to avoid loops [optional]
+        * @param IDatabase|null $conn DB master connectionl used to avoid loops [optional]
         * @return bool
         */
        private function masterRunningReadOnly( $domain, IDatabase $conn = null ) {
@@ -1447,6 +1502,12 @@ class LoadBalancer implements ILoadBalancer {
                }
        }
 
+       /**
+        * @param IDatabase $conn
+        * @param DBMasterPos|bool $pos
+        * @param int $timeout
+        * @return bool
+        */
        public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = 10 ) {
                if ( $this->getServerCount() <= 1 || !$conn->getLBInfo( 'replica' ) ) {
                        return true; // server is not a replica DB
@@ -1544,3 +1605,5 @@ class LoadBalancer implements ILoadBalancer {
                $this->disable();
        }
 }
+
+class_alias( LoadBalancer::class, 'LoadBalancer' );
index 0a05202..b9fefda 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use InvalidArgumentException;
+
 /**
  * Trivial LoadBalancer that always returns an injected connection handle
  */
@@ -72,3 +77,5 @@ class LoadBalancerSingle extends LoadBalancer {
                return $this->db;
        }
 }
+
+class_alias( 'Wikimedia\Rdbms\LoadBalancerSingle', 'LoadBalancerSingle' );
index 14a52c5..4f6701f 100644 (file)
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerAwareInterface;
+use BagOStuff;
 
 /**
  * An interface for database load monitoring
index da4909d..5e92c33 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
+use IDatabase;
+use BagOStuff;
 
 /**
  * Basic DB load monitor with no external dependencies
@@ -49,7 +54,7 @@ class LoadMonitor implements ILoadMonitor {
                $this->parent = $lb;
                $this->srvCache = $srvCache;
                $this->mainCache = $cache;
-               $this->replLogger = new \Psr\Log\NullLogger();
+               $this->replLogger = new NullLogger();
 
                $this->movingAveRatio = isset( $options['movingAveRatio'] )
                        ? $options['movingAveRatio']
index 45b1d83..c0db68c 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use BagOStuff;
+
 /**
  * Basic MySQL load monitor with no external dependencies
  * Uses memcached to cache the replication lag for a short time
@@ -55,8 +60,6 @@ class LoadMonitorMySQL extends LoadMonitor {
                                // https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html
                                if ( $s->Innodb_buffer_pool_pages_total > 0 ) {
                                        $ratio = $s->Innodb_buffer_pool_pages_data / $s->Innodb_buffer_pool_pages_total;
-                               } elseif ( $s->Qcache_total_blocks > 0 ) {
-                                       $ratio = 1.0 - $s->Qcache_free_blocks / $s->Qcache_total_blocks;
                                } else {
                                        $ratio = 1.0;
                                }
index c4e25dc..613dac5 100644 (file)
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
+use BagOStuff;
 
 class LoadMonitorNull implements ILoadMonitor {
        public function __construct(
index 49d09a9..7f43436 100644 (file)
@@ -319,21 +319,6 @@ class RedisConnectionPool implements LoggerAwareInterface {
                }
        }
 
-       /**
-        * The redis extension throws an exception in response to various read, write
-        * and protocol errors. Sometimes it also closes the connection, sometimes
-        * not. The safest response for us is to explicitly destroy the connection
-        * object and let it be reopened during the next request.
-        *
-        * @param string $server
-        * @param RedisConnRef $cref
-        * @param RedisException $e
-        * @deprecated since 1.23
-        */
-       public function handleException( $server, RedisConnRef $cref, RedisException $e ) {
-               $this->handleError( $cref, $e );
-       }
-
        /**
         * The redis extension throws an exception in response to various read, write
         * and protocol errors. Sometimes it also closes the connection, sometimes
index 3b97835..655e771 100644 (file)
@@ -27,7 +27,7 @@ abstract class Replacer {
         * @return array
         */
        public function cb() {
-               return [ &$this, 'replace' ];
+               return [ $this, 'replace' ];
        }
 
        /**
index 3b272e2..fee792f 100644 (file)
@@ -15,7 +15,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         *
         * @param string|array $key The metric(s) to set.
         * @param float $time The elapsed time (ms) to log
-        **/
+        */
        public function timing( $key, $time ) {
        }
 
@@ -24,7 +24,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         *
         * @param string|array $key The metric(s) to set.
         * @param float $value The value for the stats.
-        **/
+        */
        public function gauge( $key, $value ) {
        }
 
@@ -44,7 +44,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param  float $value The value for the stats.
         *
         * @return array
-        **/
+        */
        public function set( $key, $value ) {
                return [];
        }
@@ -56,7 +56,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param float|1      $sampleRate The rate (0-1) for sampling.
         *
         * @return array
-        **/
+        */
        public function increment( $key ) {
                return [];
        }
@@ -69,7 +69,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param float|1      $sampleRate The rate (0-1) for sampling.
         *
         * @return mixed
-        **/
+        */
        public function decrement( $key ) {
                return [];
        }
@@ -81,7 +81,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param integer $delta The delta to add to the each metric
         *
         * @return mixed
-        **/
+        */
        public function updateCount( $key, $delta ) {
                return [];
        }
@@ -95,7 +95,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         *                      ("c" for count, "ms" for timing, "g" for gauge, "s" for set)
         *
         * @return StatsdDataInterface
-        **/
+        */
        public function produceStatsdData(
                $key,
                $value = 1,
index 29bbf40..0d171f5 100644 (file)
@@ -49,7 +49,6 @@ use Wikimedia\ScopedCallback;
  * Note XMP kind of looks like rdf. They are not the same thing - XMP is
  * encoded as a specific subset of rdf. This class can read XMP. It cannot
  * read rdf.
- *
  */
 class XMPReader implements LoggerAwareInterface {
        /** @var array XMP item configuration array */
@@ -492,7 +491,7 @@ class XMPReader implements LoggerAwareInterface {
         * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
         * and are processing the 0/10 bit.
         *
-        * @param XMLParser $parser XMLParser reference to the xml parser
+        * @param resource $parser XMLParser reference to the xml parser
         * @param string $data Character data
         * @throws RuntimeException On invalid data
         */
@@ -777,7 +776,7 @@ class XMPReader implements LoggerAwareInterface {
         * Ignores the outer wrapping elements that are optional in
         * xmp and have no meaning.
         *
-        * @param XMLParser $parser
+        * @param resource $parser
         * @param string $elm Namespace . ' ' . element name
         * @throws RuntimeException
         */
@@ -980,7 +979,6 @@ class XMPReader implements LoggerAwareInterface {
         * Called when processing the <rdf:value> or <foo:someQualifier>.
         *
         * @param string $elm Namespace and tag name separated by a space.
-        *
         */
        private function startElementModeQDesc( $elm ) {
                if ( $elm === self::NS_RDF . ' value' ) {
@@ -1088,7 +1086,7 @@ class XMPReader implements LoggerAwareInterface {
                                }
                        } else {
                                array_unshift( $this->mode, self::MODE_IGNORE );
-                               array_unshift( $this->curItem, $elm );
+                               array_unshift( $this->curItem, $ns . ' ' . $tag );
 
                                return;
                        }
@@ -1190,7 +1188,7 @@ class XMPReader implements LoggerAwareInterface {
         * Generally just calls a helper based on what MODE we're in.
         * Also does some initial set up for the wrapper element
         *
-        * @param XMLParser $parser
+        * @param resource $parser
         * @param string $elm Namespace "<space>" element
         * @param array $attribs Attribute name => value
         * @throws RuntimeException
index 21e40ec..a0bfb59 100644 (file)
@@ -22,6 +22,8 @@
  * @since 1.25
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats block log entries.
  *
@@ -57,9 +59,15 @@ class BlockLogFormatter extends LogFormatter {
                        // The lrm is needed to make sure that the number
                        // is shown on the correct side of the tooltip text.
                        $durationTooltip = '&lrm;' . htmlspecialchars( $params[4] );
-                       $params[4] = Message::rawParam( "<span class='blockExpiry' title='$durationTooltip'>" .
-                               $this->context->getLanguage()->translateBlockExpiry( $params[4],
-                                       $this->context->getUser() ) . '</span>' );
+                       $params[4] = Message::rawParam(
+                               "<span class='blockExpiry' title='$durationTooltip'>" .
+                               $this->context->getLanguage()->translateBlockExpiry(
+                                       $params[4],
+                                       $this->context->getUser(),
+                                       wfTimestamp( TS_UNIX, $this->entry->getTimestamp() )
+                               ) .
+                               '</span>'
+                       );
                        $params[5] = isset( $params[5] ) ?
                                self::formatBlockFlags( $params[5], $this->context->getLanguage() ) : '';
                }
@@ -91,6 +99,7 @@ class BlockLogFormatter extends LogFormatter {
 
        public function getActionLinks() {
                $subtype = $this->entry->getSubtype();
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
                        || !( $subtype === 'block' || $subtype === 'reblock' )
                        || !$this->context->getUser()->isAllowed( 'block' )
@@ -101,13 +110,13 @@ class BlockLogFormatter extends LogFormatter {
                // Show unblock/change block link
                $title = $this->entry->getTarget();
                $links = [
-                       Linker::linkKnown(
+                       $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Unblock', $title->getDBkey() ),
-                               $this->msg( 'unblocklink' )->escaped()
+                               $this->msg( 'unblocklink' )->text()
                        ),
-                       Linker::linkKnown(
+                       $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Block', $title->getDBkey() ),
-                               $this->msg( 'change-blocklink' )->escaped()
+                               $this->msg( 'change-blocklink' )->text()
                        )
                ];
 
index f130740..861ea30 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class ContentModelLogFormatter extends LogFormatter {
        protected function getMessageParameters() {
                $lang = $this->context->getLanguage();
@@ -18,9 +20,9 @@ class ContentModelLogFormatter extends LogFormatter {
                }
 
                $params = $this->extractParameters();
-               $revert = Linker::linkKnown(
+               $revert = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                        SpecialPage::getTitleFor( 'ChangeContentModel' ),
-                       $this->msg( 'logentry-contentmodel-change-revertlink' )->escaped(),
+                       $this->msg( 'logentry-contentmodel-change-revertlink' )->text(),
                        [],
                        [
                                'pagetitle' => $this->entry->getTarget()->getPrefixedText(),
index c205626..05973df 100644 (file)
@@ -23,6 +23,8 @@
  * @since 1.22
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats delete log entries.
  *
@@ -114,6 +116,7 @@ class DeleteLogFormatter extends LogFormatter {
 
        public function getActionLinks() {
                $user = $this->context->getUser();
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( !$user->isAllowed( 'deletedhistory' )
                        || $this->entry->isDeleted( LogPage::DELETED_ACTION )
                ) {
@@ -122,14 +125,15 @@ class DeleteLogFormatter extends LogFormatter {
 
                switch ( $this->entry->getSubtype() ) {
                        case 'delete': // Show undelete link
+                       case 'delete_redir':
                                if ( $user->isAllowed( 'undelete' ) ) {
                                        $message = 'undeletelink';
                                } else {
                                        $message = 'undeleteviewlink';
                                }
-                               $revert = Linker::linkKnown(
+                               $revert = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Undelete' ),
-                                       $this->msg( $message )->escaped(),
+                                       $this->msg( $message )->text(),
                                        [],
                                        [ 'target' => $this->entry->getTarget()->getPrefixedDBkey() ]
                                );
@@ -155,9 +159,9 @@ class DeleteLogFormatter extends LogFormatter {
                                if ( count( $ids ) == 1 ) {
                                        // Live revision diffs...
                                        if ( $key == 'oldid' || $key == 'revision' ) {
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        $this->entry->getTarget(),
-                                                       $this->msg( 'diff' )->escaped(),
+                                                       $this->msg( 'diff' )->text(),
                                                        [],
                                                        [
                                                                'diff' => intval( $ids[0] ),
@@ -166,9 +170,9 @@ class DeleteLogFormatter extends LogFormatter {
                                                );
                                                // Deleted revision diffs...
                                        } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Undelete' ),
-                                                       $this->msg( 'diff' )->escaped(),
+                                                       $this->msg( 'diff' )->text(),
                                                        [],
                                                        [
                                                                'target' => $this->entry->getTarget()->getPrefixedDBkey(),
@@ -180,9 +184,9 @@ class DeleteLogFormatter extends LogFormatter {
                                }
 
                                // View/modify link...
-                               $links[] = Linker::linkKnown(
+                               $links[] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Revisiondelete' ),
-                                       $this->msg( 'revdel-restore' )->escaped(),
+                                       $this->msg( 'revdel-restore' )->text(),
                                        [],
                                        [
                                                'target' => $this->entry->getTarget()->getPrefixedText(),
@@ -205,9 +209,9 @@ class DeleteLogFormatter extends LogFormatter {
                                        $query = implode( ',', $query );
                                }
                                // Link to each hidden object ID, $params[1] is the url param
-                               $revert = Linker::linkKnown(
+                               $revert = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Revisiondelete' ),
-                                       $this->msg( 'revdel-restore' )->escaped(),
+                                       $this->msg( 'revdel-restore' )->text(),
                                        [],
                                        [
                                                'target' => $this->entry->getTarget()->getPrefixedText(),
index 21864ee..c9f1345 100644 (file)
@@ -428,7 +428,7 @@ class ManualLogEntry extends LogEntryBase {
        /** @var int ID of the log entry */
        protected $id;
 
-       /** @var Can this log entry be patrolled? */
+       /** @var bool Can this log entry be patrolled? */
        protected $isPatrollable = false;
 
        /** @var bool Whether this is a legacy log entry */
index 0cf584b..6665336 100644 (file)
@@ -23,6 +23,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 class LogEventsList extends ContextSource {
        const NO_ACTION_LINK = 1;
        const NO_EXTRA_USER_LINKS = 2;
@@ -91,7 +93,7 @@ class LogEventsList extends ContextSource {
                // For B/C, we take strings, but make sure they are converted...
                $types = ( $types === '' ) ? [] : (array)$types;
 
-               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
+               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter, false, $this->getContext() );
 
                $html = Html::hidden( 'title', $title->getPrefixedDBkey() );
 
@@ -142,10 +144,11 @@ class LogEventsList extends ContextSource {
         */
        private function getFilterLinks( $filter ) {
                // show/hide links
-               $messages = [ $this->msg( 'show' )->escaped(), $this->msg( 'hide' )->escaped() ];
+               $messages = [ $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() ];
                // Option value -> message mapping
                $links = [];
                $hiddens = ''; // keep track for "go" button
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                foreach ( $filter as $type => $val ) {
                        // Should the below assignment be outside the foreach?
                        // Then it would have to be copied. Not certain what is more expensive.
@@ -155,7 +158,7 @@ class LogEventsList extends ContextSource {
                        $hideVal = 1 - intval( $val );
                        $query[$queryKey] = $hideVal;
 
-                       $link = Linker::linkKnown(
+                       $link = $linkRenderer->makeKnownLink(
                                $this->getTitle(),
                                $messages[$hideVal],
                                [],
@@ -672,9 +675,9 @@ class LogEventsList extends ContextSource {
                                $urlParam = array_merge( $urlParam, $extraUrlParams );
                        }
 
-                       $s .= Linker::linkKnown(
+                       $s .= MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                                SpecialPage::getTitleFor( 'Log' ),
-                               $context->msg( 'log-fulllog' )->escaped(),
+                               $context->msg( 'log-fulllog' )->text(),
                                [],
                                $urlParam
                        );
index a64fee1..b5af783 100644 (file)
@@ -353,7 +353,11 @@ class LogFormatter {
                                                        $rawDuration = $parameters['5::duration'];
                                                        $rawFlags = $parameters['6::flags'];
                                                }
-                                               $duration = $wgContLang->translateBlockExpiry( $rawDuration );
+                                               $duration = $wgContLang->translateBlockExpiry(
+                                                       $rawDuration,
+                                                       null,
+                                                       wfTimestamp( TS_UNIX, $entry->getTimestamp() )
+                                               );
                                                $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $wgContLang );
                                                $text = wfMessage( 'blocklogentry' )
                                                        ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
@@ -363,7 +367,11 @@ class LogFormatter {
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'reblock':
-                                               $duration = $wgContLang->translateBlockExpiry( $parameters['5::duration'] );
+                                               $duration = $wgContLang->translateBlockExpiry(
+                                                       $parameters['5::duration'],
+                                                       null,
+                                                       wfTimestamp( TS_UNIX, $entry->getTimestamp() )
+                                               );
                                                $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'], $wgContLang );
                                                $text = wfMessage( 'reblock-logentry' )
                                                        ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
index daaff07..64102b7 100644 (file)
@@ -27,7 +27,6 @@
  * Class to simplify the use of log pages.
  * The logs are now kept in a table which is easier to manage and trim
  * than ever-growing wiki pages.
- *
  */
 class LogPage {
        const DELETED_ACTION = 1;
index be73c86..791330c 100644 (file)
@@ -70,7 +70,7 @@ class RightsLogFormatter extends LogFormatter {
        protected function getMessageParameters() {
                $params = parent::getMessageParameters();
 
-               // Really old entries
+               // Really old entries that lack old/new groups
                if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
                        return $params;
                }
@@ -81,25 +81,29 @@ class RightsLogFormatter extends LogFormatter {
                $userName = $this->entry->getTarget()->getText();
                if ( !$this->plaintext && count( $oldGroups ) ) {
                        foreach ( $oldGroups as &$group ) {
-                               $group = User::getGroupMember( $group, $userName );
+                               $group = UserGroupMembership::getGroupMemberName( $group, $userName );
                        }
                }
                if ( !$this->plaintext && count( $newGroups ) ) {
                        foreach ( $newGroups as &$group ) {
-                               $group = User::getGroupMember( $group, $userName );
+                               $group = UserGroupMembership::getGroupMemberName( $group, $userName );
                        }
                }
 
-               $lang = $this->context->getLanguage();
+               // fetch the metadata about each group membership
+               $allParams = $this->entry->getParameters();
+
                if ( count( $oldGroups ) ) {
-                       $params[3] = $lang->listToText( $oldGroups );
+                       $params[3] = [ 'raw' => $this->formatRightsList( $oldGroups,
+                               isset( $allParams['oldmetadata'] ) ? $allParams['oldmetadata'] : [] ) ];
                } else {
                        $params[3] = $this->msg( 'rightsnone' )->text();
                }
                if ( count( $newGroups ) ) {
                        // Array_values is used here because of T44211
                        // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
-                       $params[4] = $lang->listToText( array_values( $newGroups ) );
+                       $params[4] = [ 'raw' => $this->formatRightsList( array_values( $newGroups ),
+                               isset( $allParams['newmetadata'] ) ? $allParams['newmetadata'] : [] ) ];
                } else {
                        $params[4] = $this->msg( 'rightsnone' )->text();
                }
@@ -109,6 +113,42 @@ class RightsLogFormatter extends LogFormatter {
                return $params;
        }
 
+       protected function formatRightsList( $groups, $serializedUGMs = [] ) {
+               $uiLanguage = $this->context->getLanguage();
+               $uiUser = $this->context->getUser();
+               // separate arrays of temporary and permanent memberships
+               $tempList = $permList = [];
+
+               reset( $groups );
+               reset( $serializedUGMs );
+               while ( current( $groups ) ) {
+                       $group = current( $groups );
+
+                       if ( current( $serializedUGMs ) &&
+                               isset( current( $serializedUGMs )['expiry'] ) &&
+                               current( $serializedUGMs )['expiry']
+                       ) {
+                               // there is an expiry date; format the group and expiry into a friendly string
+                               $expiry = current( $serializedUGMs )['expiry'];
+                               $expiryFormatted = $uiLanguage->userTimeAndDate( $expiry, $uiUser );
+                               $expiryFormattedD = $uiLanguage->userDate( $expiry, $uiUser );
+                               $expiryFormattedT = $uiLanguage->userTime( $expiry, $uiUser );
+                               $tempList[] = $this->msg( 'rightslogentry-temporary-group' )->params( $group,
+                                       $expiryFormatted, $expiryFormattedD, $expiryFormattedT )->parse();
+                       } else {
+                               // the right does not expire; just insert the group name
+                               $permList[] = $group;
+                       }
+
+                       next( $groups );
+                       next( $serializedUGMs );
+               }
+
+               // place all temporary memberships first, to avoid the ambiguity of
+               // "adinistrator, bureaucrat and importer (temporary, until X time)"
+               return $uiLanguage->listToText( array_merge( $tempList, $permList ) );
+       }
+
        protected function getParametersForApi() {
                $entry = $this->entry;
                $params = $entry->getParameters();
@@ -126,12 +166,44 @@ class RightsLogFormatter extends LogFormatter {
                        }
                }
 
-               // Really old entries does not have log params
+               // Really old entries do not have log params, so form them from whatever info
+               // we have.
+               // Also walk through the parallel arrays of groups and metadata, combining each
+               // metadata array with the name of the group it pertains to
                if ( isset( $params['4:array:oldgroups'] ) ) {
                        $params['4:array:oldgroups'] = $this->makeGroupArray( $params['4:array:oldgroups'] );
+
+                       $oldmetadata =& $params['oldmetadata'];
+                       // unset old metadata entry to ensure metadata goes at the end of the params array
+                       unset( $params['oldmetadata'] );
+                       $params['oldmetadata'] = array_map( function( $index ) use ( $params, $oldmetadata ) {
+                               $result = [ 'group' => $params['4:array:oldgroups'][$index] ];
+                               if ( isset( $oldmetadata[$index] ) ) {
+                                       $result += $oldmetadata[$index];
+                               }
+                               $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
+                                       $result['expiry'] : null );
+
+                               return $result;
+                       }, array_keys( $params['4:array:oldgroups'] ) );
                }
+
                if ( isset( $params['5:array:newgroups'] ) ) {
                        $params['5:array:newgroups'] = $this->makeGroupArray( $params['5:array:newgroups'] );
+
+                       $newmetadata =& $params['newmetadata'];
+                       // unset old metadata entry to ensure metadata goes at the end of the params array
+                       unset( $params['newmetadata'] );
+                       $params['newmetadata'] = array_map( function( $index ) use ( $params, $newmetadata ) {
+                               $result = [ 'group' => $params['5:array:newgroups'][$index] ];
+                               if ( isset( $newmetadata[$index] ) ) {
+                                       $result += $newmetadata[$index];
+                               }
+                               $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
+                                       $result['expiry'] : null );
+
+                               return $result;
+                       }, array_keys( $params['5:array:newgroups'] ) );
                }
 
                return $params;
@@ -145,6 +217,14 @@ class RightsLogFormatter extends LogFormatter {
                if ( isset( $ret['newgroups'] ) ) {
                        ApiResult::setIndexedTagName( $ret['newgroups'], 'g' );
                }
+               if ( isset( $ret['oldmetadata'] ) ) {
+                       ApiResult::setArrayType( $ret['oldmetadata'], 'array' );
+                       ApiResult::setIndexedTagName( $ret['oldmetadata'], 'g' );
+               }
+               if ( isset( $ret['newmetadata'] ) ) {
+                       ApiResult::setArrayType( $ret['newmetadata'], 'array' );
+                       ApiResult::setIndexedTagName( $ret['newmetadata'], 'g' );
+               }
                return $ret;
        }
 
index 7a228bd..ce1df0d 100644 (file)
  * header format when requested.
  */
 class MailAddress {
+
+       /**
+        * @var string
+        */
+       public $name;
+
+       /**
+        * @var string
+        */
+       public $realName;
+
+       /**
+        * @var string
+        */
+       public $address;
+
        /**
         * @param string $address String with an email address, or a User object
         * @param string $name Human-readable name if a string address is given
index c8e9999..21effa0 100644 (file)
@@ -268,7 +268,14 @@ class UserMailer {
                // Add the envelope sender address using the -f command line option when PHP mail() is used.
                // Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the
                // generated VERP address when the hook runs effectively.
-               $extraParams .= ' -f ' . $returnPath;
+
+               // PHP runs this through escapeshellcmd(). However that's not sufficient
+               // escaping (e.g. due to spaces). MediaWiki's email sanitizer should generally
+               // be good enough, but just in case, put in double quotes, and remove any
+               // double quotes present (" is not allowed in emails, so should have no
+               // effect, although this might cause apostrophees to be double escaped)
+               $returnPathCLI = '"' . str_replace( '"', '', $returnPath ) . '"';
+               $extraParams .= ' -f ' . $returnPathCLI;
 
                $headers['Return-Path'] = $returnPath;
 
index c86eabd..ac0564d 100644 (file)
@@ -541,7 +541,7 @@ class BitmapHandler extends TransformationalImageHandler {
         * @param array $params Rotate parameters.
         *   'rotation' clockwise rotation in degrees, allowed are multiples of 90
         * @since 1.21
-        * @return bool
+        * @return bool|MediaTransformError
         */
        public function rotate( $file, $params ) {
                global $wgImageMagickConvertCommand;
index 18f75ec..a852215 100644 (file)
@@ -170,7 +170,7 @@ class DjVuHandler extends ImageHandler {
                                'thumbnail_error',
                                $width,
                                $height,
-                               wfMessage( 'thumbnail_dest_directory' )->text()
+                               wfMessage( 'thumbnail_dest_directory' )
                        );
                }
 
@@ -197,7 +197,7 @@ class DjVuHandler extends ImageHandler {
 
                        return new MediaTransformError( 'thumbnail_error',
                                $params['width'], $params['height'],
-                               wfMessage( 'filemissing' )->text()
+                               wfMessage( 'filemissing' )
                        );
                }
 
index b8b6f6c..6c857a8 100644 (file)
@@ -130,7 +130,7 @@ class JpegHandler extends ExifBitmapHandler {
         * @param array $params Rotate parameters.
         *    'rotation' clockwise rotation in degrees, allowed are multiples of 90
         * @since 1.21
-        * @return bool
+        * @return bool|MediaTransformError
         */
        public function rotate( $file, $params ) {
                global $wgJpegTran;
index b3a555a..5366c4f 100644 (file)
@@ -439,19 +439,12 @@ class ThumbnailImage extends MediaTransformOutput {
  * @ingroup Media
  */
 class MediaTransformError extends MediaTransformOutput {
-       /** @var string HTML formatted version of the error */
-       private $htmlMsg;
-
-       /** @var string Plain text formatted version of the error */
-       private $textMsg;
+       /** @var Message */
+       private $msg;
 
        function __construct( $msg, $width, $height /*, ... */ ) {
                $args = array_slice( func_get_args(), 3 );
-               $htmlArgs = array_map( 'htmlspecialchars', $args );
-               $htmlArgs = array_map( 'nl2br', $htmlArgs );
-
-               $this->htmlMsg = wfMessage( $msg )->rawParams( $htmlArgs )->escaped();
-               $this->textMsg = wfMessage( $msg )->rawParams( $htmlArgs )->text();
+               $this->msg = wfMessage( $msg )->params( $args );
                $this->width = intval( $width );
                $this->height = intval( $height );
                $this->url = false;
@@ -461,21 +454,29 @@ class MediaTransformError extends MediaTransformOutput {
        function toHtml( $options = [] ) {
                return "<div class=\"MediaTransformError\" style=\"" .
                        "width: {$this->width}px; height: {$this->height}px; display:inline-block;\">" .
-                       $this->htmlMsg .
+                       $this->getHtmlMsg() .
                        "</div>";
        }
 
        function toText() {
-               return $this->textMsg;
+               return $this->msg->text();
        }
 
        function getHtmlMsg() {
-               return $this->htmlMsg;
+               return $this->msg->escaped();
+       }
+
+       function getMsg() {
+               return $this->msg;
        }
 
        function isError() {
                return true;
        }
+
+       function getHttpStatusCode() {
+               return 500;
+       }
 }
 
 /**
@@ -488,7 +489,12 @@ class TransformParameterError extends MediaTransformError {
                parent::__construct( 'thumbnail_error',
                        max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
                        max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
-                       wfMessage( 'thumbnail_invalid_params' )->text() );
+                       wfMessage( 'thumbnail_invalid_params' )
+               );
+       }
+
+       function getHttpStatusCode() {
+               return 400;
        }
 }
 
@@ -501,14 +507,18 @@ class TransformParameterError extends MediaTransformError {
 class TransformTooBigImageAreaError extends MediaTransformError {
        function __construct( $params, $maxImageArea ) {
                $msg = wfMessage( 'thumbnail_toobigimagearea' );
+               $msg->rawParams(
+                       $msg->getLanguage()->formatComputingNumbers( $maxImageArea, 1000, "size-$1pixel" )
+               );
 
                parent::__construct( 'thumbnail_error',
                        max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
                        max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
-                       $msg->rawParams(
-                               $msg->getLanguage()->formatComputingNumbers(
-                                       $maxImageArea, 1000, "size-$1pixel" )
-                               )->text()
-                       );
+                       $msg
+               );
+       }
+
+       function getHttpStatusCode() {
+               return 400;
        }
 }
index f3b33ac..0cea6d8 100644 (file)
@@ -178,14 +178,14 @@ class SvgHandler extends ImageHandler {
 
                $metadata = $this->unpackMetadata( $image->getMetadata() );
                if ( isset( $metadata['error'] ) ) { // sanity check
-                       $err = wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
+                       $err = wfMessage( 'svg-long-error', $metadata['error']['message'] );
 
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $err );
                }
 
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
-                               wfMessage( 'thumbnail_dest_directory' )->text() );
+                               wfMessage( 'thumbnail_dest_directory' ) );
                }
 
                $srcPath = $image->getLocalRefPath();
@@ -196,7 +196,7 @@ class SvgHandler extends ImageHandler {
 
                        return new MediaTransformError( 'thumbnail_error',
                                $params['width'], $params['height'],
-                               wfMessage( 'filemissing' )->text()
+                               wfMessage( 'filemissing' )
                        );
                }
 
@@ -219,7 +219,7 @@ class SvgHandler extends ImageHandler {
                                        wfHostname(), $lnPath, $srcPath ) );
                        return new MediaTransformError( 'thumbnail_error',
                                $params['width'], $params['height'],
-                               wfMessage( 'thumbnail-temp-create' )->text()
+                               wfMessage( 'thumbnail-temp-create' )
                        );
                }
 
index e33c27e..60aec45 100644 (file)
@@ -217,7 +217,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
 
                        return new MediaTransformError( 'thumbnail_error',
                                $scalerParams['clientWidth'], $scalerParams['clientHeight'],
-                               wfMessage( 'filemissing' )->text()
+                               wfMessage( 'filemissing' )
                        );
                }
 
@@ -267,7 +267,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
                        # Thumbnail was zero-byte and had to be removed
                        return new MediaTransformError( 'thumbnail_error',
                                $scalerParams['clientWidth'], $scalerParams['clientHeight'],
-                               wfMessage( 'unknown-error' )->text()
+                               wfMessage( 'unknown-error' )
                        );
                } elseif ( $mto ) {
                        return $mto;
@@ -565,7 +565,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
         * @param array $params Rotate parameters.
         *   'rotation' clockwise rotation in degrees, allowed are multiples of 90
         * @since 1.24 Is non-static. From 1.21 it was static
-        * @return bool
+        * @return bool|MediaTransformError
         */
        public function rotate( $file, $params ) {
                return new MediaTransformError( 'thumbnail_error', 0, 0,
index 47dae78..7e8c2ba 100644 (file)
@@ -22,6 +22,9 @@
  */
 
 use \MediaWiki\MediaWikiServices;
+use \Wikimedia\WaitConditionLoop;
+use \Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class to store objects in the database
index 9a2a8e2..34ff63c 100644 (file)
@@ -197,24 +197,6 @@ class Article implements Page {
                $this->mPage->clear();
        }
 
-       /**
-        * Note that getContent does not follow redirects anymore.
-        * If you need to fetch redirectable content easily, try
-        * the shortcut in WikiPage::getRedirectTarget()
-        *
-        * This function has side effects! Do not use this function if you
-        * only want the real revision text if any.
-        *
-        * @deprecated since 1.21; use WikiPage::getContent() instead
-        *
-        * @return string Return the text of this revision
-        */
-       public function getContent() {
-               wfDeprecated( __METHOD__, '1.21' );
-               $content = $this->getContentObject();
-               return ContentHandler::getContentText( $content );
-       }
-
        /**
         * Returns a Content object representing the pages effective display content,
         * not necessarily the revision's content!
@@ -316,46 +298,6 @@ class Article implements Page {
                return $oldid;
        }
 
-       /**
-        * Get text of an article from database
-        * Does *NOT* follow redirects.
-        *
-        * @protected
-        * @note This is really internal functionality that should really NOT be
-        * used by other functions. For accessing article content, use the WikiPage
-        * class, especially WikiBase::getContent(). However, a lot of legacy code
-        * uses this method to retrieve page text from the database, so the function
-        * has to remain public for now.
-        *
-        * @return string|bool String containing article contents, or false if null
-        * @deprecated since 1.21, use WikiPage::getContent() instead
-        */
-       function fetchContent() {
-               // BC cruft!
-
-               wfDeprecated( __METHOD__, '1.21' );
-
-               if ( $this->mContentLoaded && $this->mContent ) {
-                       return $this->mContent;
-               }
-
-               $content = $this->fetchContentObject();
-
-               if ( !$content ) {
-                       return false;
-               }
-
-               // @todo Get rid of mContent everywhere!
-               $this->mContent = ContentHandler::getContentText( $content );
-               ContentHandler::runLegacyHooks(
-                       'ArticleAfterFetchContent',
-                       [ &$this, &$this->mContent ],
-                       '1.21'
-               );
-
-               return $this->mContent;
-       }
-
        /**
         * Get text content object
         * Does *NOT* follow redirects.
@@ -428,10 +370,12 @@ class Article implements Page {
                $this->mContentObject = $content;
                $this->mRevIdFetched = $this->mRevision->getId();
 
-               ContentHandler::runLegacyHooks(
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $articlePage = $this;
+
+               Hooks::run(
                        'ArticleAfterFetchContentObject',
-                       [ &$this, &$this->mContentObject ],
-                       '1.21'
+                       [ &$articlePage, &$this->mContentObject ]
                );
 
                return $this->mContentObject;
@@ -565,7 +509,9 @@ class Article implements Page {
                while ( !$outputDone && ++$pass ) {
                        switch ( $pass ) {
                                case 1:
-                                       Hooks::run( 'ArticleViewHeader', [ &$this, &$outputDone, &$useParserCache ] );
+                                       // Avoid PHP 7.1 warning of passing $this by reference
+                                       $articlePage = $this;
+                                       Hooks::run( 'ArticleViewHeader', [ &$articlePage, &$outputDone, &$useParserCache ] );
                                        break;
                                case 2:
                                        # Early abort if the page doesn't exist
@@ -621,21 +567,9 @@ class Article implements Page {
                                        # Preload timestamp to avoid a DB hit
                                        $outputPage->setRevisionTimestamp( $this->mPage->getTimestamp() );
 
-                                       # Pages containing custom CSS or JavaScript get special treatment
-                                       if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
-                                               wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
-                                               $this->showCssOrJsPage();
-                                               $outputDone = true;
-                                       } elseif ( !Hooks::run( 'ArticleContentViewCustom',
+                                       if ( !Hooks::run( 'ArticleContentViewCustom',
                                                        [ $this->fetchContentObject(), $this->getTitle(), $outputPage ] ) ) {
 
-                                               # Allow extensions do their own custom view for certain pages
-                                               $outputDone = true;
-                                       } elseif ( !ContentHandler::runLegacyHooks(
-                                               'ArticleViewCustom',
-                                               [ $this->fetchContentObject(), $this->getTitle(), $outputPage ],
-                                               '1.21'
-                                       ) ) {
                                                # Allow extensions do their own custom view for certain pages
                                                $outputDone = true;
                                        }
@@ -736,7 +670,6 @@ class Article implements Page {
        /**
         * Show a diff page according to current request variables. For use within
         * Article::view() only, other callers should use the DifferenceEngine class.
-        *
         */
        protected function showDiffPage() {
                $request = $this->getContext()->getRequest();
@@ -781,47 +714,6 @@ class Article implements Page {
                $this->mPage->doViewUpdates( $user, (int)$new );
        }
 
-       /**
-        * Show a page view for a page formatted as CSS or JavaScript. To be called by
-        * Article::view() only.
-        *
-        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
-        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
-        * more flexibility.
-        *
-        * @param bool $showCacheHint Whether to show a message telling the user
-        *   to clear the browser cache (default: true).
-        */
-       protected function showCssOrJsPage( $showCacheHint = true ) {
-               $outputPage = $this->getContext()->getOutput();
-
-               if ( $showCacheHint ) {
-                       $dir = $this->getContext()->getLanguage()->getDir();
-                       $lang = $this->getContext()->getLanguage()->getHtmlCode();
-
-                       $outputPage->wrapWikiMsg(
-                               "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
-                               'clearyourcache'
-                       );
-               }
-
-               $this->fetchContentObject();
-
-               if ( $this->mContentObject ) {
-                       // Give hooks a chance to customise the output
-                       if ( ContentHandler::runLegacyHooks(
-                               'ShowRawCssJs',
-                               [ $this->mContentObject, $this->getTitle(), $outputPage ],
-                               '1.24'
-                       ) ) {
-                               // If no legacy hooks ran, display the content of the parser output, including RL modules,
-                               // but excluding metadata like categories and language links
-                               $po = $this->mContentObject->getParserOutput( $this->getTitle() );
-                               $outputPage->addParserOutputContent( $po );
-                       }
-               }
-       }
-
        /**
         * Get the robot policy to be used for the current view
         * @param string $action The action= GET parameter
@@ -957,9 +849,12 @@ class Article implements Page {
                $redirectTargetUrl = $this->getTitle()->getLinkURL( $query );
 
                if ( isset( $this->mRedirectedFrom ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $articlePage = $this;
+
                        // This is an internally redirected page view.
                        // We'll need a backlink to the source page for navigation.
-                       if ( Hooks::run( 'ArticleViewRedirect', [ &$this ] ) ) {
+                       if ( Hooks::run( 'ArticleViewRedirect', [ &$articlePage ] ) ) {
                                $redir = Linker::linkKnown(
                                        $this->mRedirectedFrom,
                                        null,
@@ -1389,7 +1284,10 @@ class Article implements Page {
         * @param int $oldid Revision ID of this article revision
         */
        public function setOldSubtitle( $oldid = 0 ) {
-               if ( !Hooks::run( 'DisplayOldSubtitle', [ &$this, &$oldid ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $articlePage = $this;
+
+               if ( !Hooks::run( 'DisplayOldSubtitle', [ &$articlePage, &$oldid ] ) ) {
                        return;
                }
 
@@ -1770,7 +1668,6 @@ class Article implements Page {
                Hooks::run( 'ArticleConfirmDelete', [ $this, $outputPage, &$reason ] );
 
                $user = $this->getContext()->getUser();
-
                if ( $user->isAllowed( 'suppressrevision' ) ) {
                        $suppress = Html::openElement( 'div', [ 'id' => 'wpDeleteSuppressRow' ] ) .
                                Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
@@ -1780,7 +1677,6 @@ class Article implements Page {
                        $suppress = '';
                }
                $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $title );
-
                $form = Html::openElement( 'form', [ 'method' => 'post',
                        'action' => $title->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ] ) .
                        Html::openElement( 'fieldset', [ 'id' => 'mw-delete-table' ] ) .
@@ -1952,7 +1848,9 @@ class Article implements Page {
                                && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
                        // Extension may have reason to disable file caching on some pages.
                        if ( $cacheable ) {
-                               $cacheable = Hooks::run( 'IsFileCacheable', [ &$this ] );
+                               // Avoid PHP 7.1 warning of passing $this by reference
+                               $articlePage = $this;
+                               $cacheable = Hooks::run( 'IsFileCacheable', [ &$articlePage ] );
                        }
                }
 
@@ -2118,22 +2016,13 @@ class Article implements Page {
 
        /**
         * Call to WikiPage function for backwards compatibility.
-        * @see WikiPage::doEdit
-        *
-        * @deprecated since 1.21: use doEditContent() instead.
-        */
-       public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               return $this->mPage->doEdit( $text, $summary, $flags, $baseRevId, $user );
-       }
-
-       /**
-        * Call to WikiPage function for backwards compatibility.
+        * @deprecated since 1.29. Use WikiPage::doEditContent() directly instead
         * @see WikiPage::doEditContent
         */
        public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
                User $user = null, $serialFormat = null
        ) {
+               wfDeprecated( __METHOD__, '1.29' );
                return $this->mPage->doEditContent( $content, $summary, $flags, $baseRevId,
                        $user, $serialFormat
                );
@@ -2331,16 +2220,6 @@ class Article implements Page {
                return $this->mPage->getRevision();
        }
 
-       /**
-        * Call to WikiPage function for backwards compatibility.
-        * @see WikiPage::getText
-        * @deprecated since 1.21 use WikiPage::getContent() instead
-        */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               return $this->mPage->getText( $audience, $user );
-       }
-
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getTimestamp
@@ -2503,15 +2382,6 @@ class Article implements Page {
                );
        }
 
-       /**
-        * Call to WikiPage function for backwards compatibility.
-        * @deprecated since 1.21, use prepareContentForEdit
-        * @see WikiPage::prepareTextForEdit
-        */
-       public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
-               return $this->mPage->prepareTextForEdit( $text, $revid, $user );
-       }
-
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::protectDescription
@@ -2744,15 +2614,5 @@ class Article implements Page {
                WikiPage::onArticleEdit( $title );
        }
 
-       /**
-        * @param string $oldtext
-        * @param string $newtext
-        * @param int $flags
-        * @return string
-        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
-        */
-       public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
-       }
        // ******
 }
index 6d2be51..ccc50f7 100644 (file)
@@ -54,7 +54,10 @@ class CategoryPage extends Article {
                        return;
                }
 
-               if ( !Hooks::run( 'CategoryPageView', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $categoryPage = $this;
+
+               if ( !Hooks::run( 'CategoryPageView', [ &$categoryPage ] ) ) {
                        return;
                }
 
index 6ab3ffc..58f1666 100644 (file)
@@ -42,6 +42,12 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                $this->mImg = null;
                $this->mHist = [];
                $this->mRange = [ 0, 0 ]; // display range
+
+               // Only display 10 revisions at once by default, otherwise the list is overwhelming
+               $this->mLimitsShown = array_merge( [ 10 ], $this->mLimitsShown );
+               $this->mDefaultLimit = 10;
+               list( $this->mLimit, /* $offset */ ) =
+                       $this->mRequest->getLimitOffset( $this->mDefaultLimit, '' );
        }
 
        /**
index db3ec14..c75cfdd 100644 (file)
@@ -69,6 +69,7 @@ class ImagePage extends Article {
                $this->fileLoaded = true;
 
                $this->displayImg = $img = false;
+
                Hooks::run( 'ImagePageFindFile', [ $this, &$img, &$this->displayImg ] );
                if ( !$img ) { // not set by hook?
                        $img = wfFindFile( $this->getTitle() );
@@ -335,7 +336,10 @@ class ImagePage extends Article {
                        $filename = wfEscapeWikiText( $this->displayImg->getName() );
                        $linktext = $filename;
 
-                       Hooks::run( 'ImageOpenShowImageInlineBefore', [ &$this, &$out ] );
+                       // Avoid PHP 7.1 warning from passing $this by reference
+                       $imagePage = $this;
+
+                       Hooks::run( 'ImageOpenShowImageInlineBefore', [ &$imagePage, &$out ] );
 
                        if ( $this->displayImg->allowInlineDisplay() ) {
                                # image
index 74566cb..1fa4bfa 100644 (file)
@@ -224,4 +224,20 @@ class WikiFilePage extends WikiPage {
 
                return TitleArray::newFromResult( $res );
        }
+
+       /**
+        * @since 1.28
+        * @return string
+        */
+       public function getWikiDisplayName() {
+               return $this->getFile()->getRepo()->getDisplayName();
+       }
+
+       /**
+        * @since 1.28
+        * @return string
+        */
+       public function getSourceURL() {
+               return $this->getFile()->getDescriptionUrl();
+       }
 }
index 56a22c5..bc936ab 100644 (file)
@@ -316,11 +316,14 @@ class WikiPage implements Page, IDBAccessObject {
        protected function pageData( $dbr, $conditions, $options = [] ) {
                $fields = self::selectFields();
 
-               Hooks::run( 'ArticlePageDataBefore', [ &$this, &$fields ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
+               Hooks::run( 'ArticlePageDataBefore', [ &$wikiPage, &$fields ] );
 
                $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
 
-               Hooks::run( 'ArticlePageDataAfter', [ &$this, &$row ] );
+               Hooks::run( 'ArticlePageDataAfter', [ &$wikiPage, &$row ] );
 
                return $row;
        }
@@ -579,12 +582,10 @@ class WikiPage implements Page, IDBAccessObject {
                $row = null;
                while ( $continue ) {
                        $row = $db->selectRow(
-                               [ 'page', 'revision' ],
+                               [ 'revision' ],
                                $revSelectFields,
                                [
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
+                                       'rev_page' => $this->getId()
                                ],
                                __METHOD__,
                                [
@@ -685,28 +686,6 @@ class WikiPage implements Page, IDBAccessObject {
                return null;
        }
 
-       /**
-        * Get the text of the current revision. No side-effects...
-        *
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return string|bool The text of the current revision
-        * @deprecated since 1.21, getContent() should be used instead.
-        */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getText( $audience, $user );
-               }
-               return false;
-       }
-
        /**
         * @return string MW timestamp of last article revision
         */
@@ -1143,7 +1122,10 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function doPurge( $flags = self::PURGE_ALL ) {
-               if ( !Hooks::run( 'ArticlePurge', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
+               if ( !Hooks::run( 'ArticlePurge', [ &$wikiPage ] ) ) {
                        return false;
                }
 
@@ -1413,7 +1395,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * @param string|int|null|bool $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
         * or 'new' for a new section.
         * @param Content $sectionContent New content of the section.
@@ -1453,7 +1435,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * @param string|int|null|bool $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
         * or 'new' for a new section.
         * @param Content $sectionContent New content of the section.
@@ -1520,68 +1502,6 @@ class WikiPage implements Page, IDBAccessObject {
                return $flags;
        }
 
-       /**
-        * Change an existing article or create a new article. Updates RC and all necessary caches,
-        * optionally via the deferred update array.
-        *
-        * @param string $text New text
-        * @param string $summary Edit summary
-        * @param int $flags Bitfield:
-        *      EDIT_NEW
-        *          Article is known or assumed to be non-existent, create a new one
-        *      EDIT_UPDATE
-        *          Article is known or assumed to be pre-existing, update it
-        *      EDIT_MINOR
-        *          Mark this edit minor, if the user is allowed to do so
-        *      EDIT_SUPPRESS_RC
-        *          Do not log the change in recentchanges
-        *      EDIT_FORCE_BOT
-        *          Mark the edit a "bot" edit regardless of user rights
-        *      EDIT_AUTOSUMMARY
-        *          Fill in blank summaries with generated text where possible
-        *      EDIT_INTERNAL
-        *          Signal that the page retrieve/save cycle happened entirely in this request.
-        *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
-        * article will be detected. If EDIT_UPDATE is specified and the article
-        * doesn't exist, the function will return an edit-gone-missing error. If
-        * EDIT_NEW is specified and the article does exist, an edit-already-exists
-        * error will be returned. These two conditions are also possible with
-        * auto-detection due to MediaWiki's performance-optimised locking strategy.
-        *
-        * @param bool|int $baseRevId The revision ID this edit was based off, if any.
-        *   This is not the parent revision ID, rather the revision ID for older
-        *   content used as the source for a rollback, for example.
-        * @param User $user The user doing the edit
-        *
-        * @throws MWException
-        * @return Status Possible errors:
-        *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
-        *     set the fatal flag of $status
-        *   edit-gone-missing: In update mode, but the article didn't exist.
-        *   edit-conflict: In update mode, the article changed unexpectedly.
-        *   edit-no-change: Warning that the text was the same as before.
-        *   edit-already-exists: In creation mode, but the article already exists.
-        *
-        * Extensions may define additional errors.
-        *
-        * $return->value will contain an associative array with members as follows:
-        *     new: Boolean indicating if the function attempted to create a new article.
-        *     revision: The revision object for the inserted revision, or null.
-        *
-        * Compatibility note: this function previously returned a boolean value
-        * indicating success/failure
-        *
-        * @deprecated since 1.21: use doEditContent() instead.
-        */
-       public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-
-               return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
-       }
-
        /**
         * Change an existing article or create a new article. Updates RC and all necessary caches,
         * optionally via the deferred update array.
@@ -1620,6 +1540,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param array|null $tags Change tags to apply to this edit
         * Callers are responsible for permission checks
         * (with ChangeTags::canAddTagsAccompanyingChange)
+        * @param Int $undidRevId Id of revision that was undone or 0
         *
         * @throws MWException
         * @return Status Possible errors:
@@ -1641,7 +1562,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function doEditContent(
                Content $content, $summary, $flags = 0, $baseRevId = false,
-               User $user = null, $serialFormat = null, $tags = []
+               User $user = null, $serialFormat = null, $tags = [], $undidRevId = 0
        ) {
                global $wgUser, $wgUseAutomaticEditSummaries;
 
@@ -1670,14 +1591,15 @@ class WikiPage implements Page, IDBAccessObject {
                $user = $user ?: $wgUser;
                $flags = $this->checkFlags( $flags );
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
                // Trigger pre-save hook (using provided edit summary)
                $hookStatus = Status::newGood( [] );
-               $hook_args = [ &$this, &$user, &$content, &$summary,
+               $hook_args = [ &$wikiPage, &$user, &$content, &$summary,
                                                        $flags & EDIT_MINOR, null, null, &$flags, &$hookStatus ];
                // Check if the hook rejected the attempted save
-               if ( !Hooks::run( 'PageContentSave', $hook_args )
-                       || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args, '1.21' )
-               ) {
+               if ( !Hooks::run( 'PageContentSave', $hook_args ) ) {
                        if ( $hookStatus->isOK() ) {
                                // Hook returned false but didn't call fatal(); use generic message
                                $hookStatus->fatal( 'edit-hook-aborted' );
@@ -1720,7 +1642,8 @@ class WikiPage implements Page, IDBAccessObject {
                        'oldId' => $this->getLatest(),
                        'oldIsRedirect' => $this->isRedirect(),
                        'oldCountable' => $this->isCountable(),
-                       'tags' => ( $tags !== null ) ? (array)$tags : []
+                       'tags' => ( $tags !== null ) ? (array)$tags : [],
+                       'undidRevId' => $undidRevId
                ];
 
                // Actually create the revision and create/update the page
@@ -1898,10 +1821,12 @@ class WikiPage implements Page, IDBAccessObject {
                                                        'oldrevision' => $meta['oldRevision']
                                                ]
                                        );
+                                       // Avoid PHP 7.1 warning of passing $this by reference
+                                       $wikiPage = $this;
                                        // Trigger post-save hook
-                                       $params = [ &$this, &$user, $content, $summary, $flags & EDIT_MINOR,
-                                               null, null, &$flags, $revision, &$status, $meta['baseRevId'] ];
-                                       ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+                                       $params = [ &$wikiPage, &$user, $content, $summary, $flags & EDIT_MINOR,
+                                               null, null, &$flags, $revision, &$status, $meta['baseRevId'],
+                                               $meta['undidRevId'] ];
                                        Hooks::run( 'PageContentSaveComplete', $params );
                                }
                        ),
@@ -2018,16 +1943,15 @@ class WikiPage implements Page, IDBAccessObject {
                                ) {
                                        // Update links, etc.
                                        $this->doEditUpdates( $revision, $user, [ 'created' => true ] );
+                                       // Avoid PHP 7.1 warning of passing $this by reference
+                                       $wikiPage = $this;
                                        // Trigger post-create hook
-                                       $params = [ &$this, &$user, $content, $summary,
+                                       $params = [ &$wikiPage, &$user, $content, $summary,
                                                $flags & EDIT_MINOR, null, null, &$flags, $revision ];
-                                       ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $params, '1.21' );
                                        Hooks::run( 'PageContentInsertComplete', $params );
                                        // Trigger post-save hook
                                        $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
-                                       ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params, '1.21' );
                                        Hooks::run( 'PageContentSaveComplete', $params );
-
                                }
                        ),
                        DeferredUpdates::PRESEND
@@ -2062,22 +1986,6 @@ class WikiPage implements Page, IDBAccessObject {
                return $options;
        }
 
-       /**
-        * Prepare text which is about to be saved.
-        * Returns a stdClass with source, pst and output members
-        *
-        * @param string $text
-        * @param int|null $revid
-        * @param User|null $user
-        * @deprecated since 1.21: use prepareContentForEdit instead.
-        * @return object
-        */
-       public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-               return $this->prepareContentForEdit( $content, $revid, $user );
-       }
-
        /**
         * Prepare content which is about to be saved.
         * Returns a stdClass with source, pst and output members
@@ -2178,8 +2086,12 @@ class WikiPage implements Page, IDBAccessObject {
                                );
                        } else {
                                // Try to avoid a second parse if {{REVISIONID}} is used
-                               $edit->popts->setSpeculativeRevIdCallback( function () {
-                                       return 1 + (int)wfGetDB( DB_MASTER )->selectField(
+                               $dbIndex = ( $this->mDataLoadedFrom & self::READ_LATEST ) === self::READ_LATEST
+                                       ? DB_MASTER // use the best possible guess
+                                       : DB_REPLICA; // T154554
+
+                               $edit->popts->setSpeculativeRevIdCallback( function () use ( $dbIndex ) {
+                                       return 1 + (int)wfGetDB( $dbIndex )->selectField(
                                                'revision',
                                                'MAX(rev_id)',
                                                [],
@@ -2312,9 +2224,12 @@ class WikiPage implements Page, IDBAccessObject {
                        }
                }
 
-               Hooks::run( 'ArticleEditUpdates', [ &$this, &$editInfo, $options['changed'] ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
 
-               if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', [ &$this ] ) ) {
+               Hooks::run( 'ArticleEditUpdates', [ &$wikiPage, &$editInfo, $options['changed'] ] );
+
+               if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', [ &$wikiPage ] ) ) {
                        // Flush old entries from the `recentchanges` table
                        if ( mt_rand( 0, 9 ) == 0 ) {
                                JobQueueGroup::singleton()->lazyPush( RecentChangesUpdateJob::newPurgeJob() );
@@ -2358,9 +2273,12 @@ class WikiPage implements Page, IDBAccessObject {
                        if ( !$recipient ) {
                                wfDebug( __METHOD__ . ": invalid username\n" );
                        } else {
+                               // Avoid PHP 7.1 warning of passing $this by reference
+                               $wikiPage = $this;
+
                                // Allow extensions to prevent user notification
                                // when a new message is added to their talk page
-                               if ( Hooks::run( 'ArticleEditUpdateNewTalk', [ &$this, $recipient ] ) ) {
+                               if ( Hooks::run( 'ArticleEditUpdateNewTalk', [ &$wikiPage, $recipient ] ) ) {
                                        if ( User::isIP( $shortTitle ) ) {
                                                // An anonymous user
                                                $recipient->setNewtalk( true, $revision );
@@ -2489,7 +2407,10 @@ class WikiPage implements Page, IDBAccessObject {
                $nullRevision = null;
 
                if ( $id ) { // Protection of existing page
-                       if ( !Hooks::run( 'ArticleProtect', [ &$this, &$user, $limit, $reason ] ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $wikiPage = $this;
+
+                       if ( !Hooks::run( 'ArticleProtect', [ &$wikiPage, &$user, $limit, $reason ] ) ) {
                                return Status::newGood();
                        }
 
@@ -2576,9 +2497,12 @@ class WikiPage implements Page, IDBAccessObject {
                                __METHOD__
                        );
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $wikiPage = $this;
+
                        Hooks::run( 'NewRevisionFromEditComplete',
                                [ $this, $nullRevision, $latest, $user ] );
-                       Hooks::run( 'ArticleProtectComplete', [ &$this, &$user, $limit, $reason ] );
+                       Hooks::run( 'ArticleProtectComplete', [ &$wikiPage, &$user, $limit, $reason ] );
                } else { // Protection of non-existing page (also known as "title protection")
                        // Cascade protection is meaningless in this case
                        $cascade = false;
@@ -2844,7 +2768,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function doDeleteArticleReal(
                $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null,
-               $tags = []
+               $tags = [], $logsubtype = 'delete'
        ) {
                global $wgUser, $wgContentHandlerUseDB;
 
@@ -2858,9 +2782,12 @@ class WikiPage implements Page, IDBAccessObject {
                        return $status;
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
                $user = is_null( $user ) ? $wgUser : $user;
                if ( !Hooks::run( 'ArticleDelete',
-                       [ &$this, &$user, &$reason, &$error, &$status, $suppress ]
+                       [ &$wikiPage, &$user, &$reason, &$error, &$status, $suppress ]
                ) ) {
                        if ( $status->isOK() ) {
                                // Hook aborted but didn't set a fatal status
@@ -2975,7 +2902,7 @@ class WikiPage implements Page, IDBAccessObject {
                // Log the deletion, if the page was suppressed, put it in the suppression log instead
                $logtype = $suppress ? 'suppress' : 'delete';
 
-               $logEntry = new ManualLogEntry( $logtype, 'delete' );
+               $logEntry = new ManualLogEntry( $logtype, $logsubtype );
                $logEntry->setPerformer( $user );
                $logEntry->setTarget( $logTitle );
                $logEntry->setComment( $reason );
@@ -3489,28 +3416,6 @@ class WikiPage implements Page, IDBAccessObject {
                return $result;
        }
 
-       /**
-        * Return an applicable autosummary if one exists for the given edit.
-        * @param string|null $oldtext The previous text of the page.
-        * @param string|null $newtext The submitted text of the page.
-        * @param int $flags Bitmask: a bitmask of flags submitted for the edit.
-        * @return string An appropriate autosummary, or an empty string.
-        *
-        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
-        */
-       public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               // NOTE: stub for backwards-compatibility. assumes the given text is
-               // wikitext. will break horribly if it isn't.
-
-               wfDeprecated( __METHOD__, '1.21' );
-
-               $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
-               $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
-               $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
-
-               return $handler->getAutosummary( $oldContent, $newContent, $flags );
-       }
-
        /**
         * Auto-generates a deletion reason
         *
@@ -3719,4 +3624,41 @@ class WikiPage implements Page, IDBAccessObject {
        public function isLocal() {
                return true;
        }
+
+       /**
+        * The display name for the site this content
+        * come from. If a subclass overrides isLocal(),
+        * this could return something other than the
+        * current site name
+        *
+        * @since 1.28
+        * @return string
+        */
+       public function getWikiDisplayName() {
+               global $wgSitename;
+               return $wgSitename;
+       }
+
+       /**
+        * Get the source URL for the content on this page,
+        * typically the canonical URL, but may be a remote
+        * link if the content comes from another site
+        *
+        * @since 1.28
+        * @return string
+        */
+       public function getSourceURL() {
+               return $this->getTitle()->getCanonicalURL();
+       }
+
+       /*
+        * @param WANObjectCache $cache
+        * @return string[]
+        * @since 1.28
+        */
+       public function getMutableCacheKeys( WANObjectCache $cache ) {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+
+               return $linkCache->getMutableCacheKeys( $cache, $this->getTitle()->getTitleValue() );
+       }
 }
index f2fca68..770c1c6 100644 (file)
@@ -336,7 +336,7 @@ abstract class TablePager extends IndexPager {
        /**
         * Get a "<select>" element which has options for each of the allowed limits
         *
-        * @param string $attribs Extra attributes to set
+        * @param string[] $attribs Extra attributes to set
         * @return string HTML fragment
         */
        public function getLimitSelect( $attribs = [] ) {
index cbacd34..2ef599a 100644 (file)
@@ -38,6 +38,7 @@ class BlockLevelPass {
        const COLON_STATE_COMMENT = 5;
        const COLON_STATE_COMMENTDASH = 6;
        const COLON_STATE_COMMENTDASHDASH = 7;
+       const COLON_STATE_LC = 8;
 
        /**
         * Make lists from lines starting with ':', '*', '#', etc.
@@ -389,15 +390,14 @@ class BlockLevelPass {
         * @return string The position of the ':', or false if none found
         */
        private function findColonNoLinks( $str, &$before, &$after ) {
-               $colonPos = strpos( $str, ':' );
-               if ( $colonPos === false ) {
+               if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE ) ) {
                        # Nothing to find!
                        return false;
                }
 
-               $ltPos = strpos( $str, '<' );
-               if ( $ltPos === false || $ltPos > $colonPos ) {
+               if ( $m[0][0] === ':' ) {
                        # Easy; no tag nesting to worry about
+                       $colonPos = $m[0][1];
                        $before = substr( $str, 0, $colonPos );
                        $after = substr( $str, $colonPos + 1 );
                        return $colonPos;
@@ -405,9 +405,10 @@ class BlockLevelPass {
 
                # Ugly state machine to walk through avoiding tags.
                $state = self::COLON_STATE_TEXT;
-               $level = 0;
+               $ltLevel = 0;
+               $lcLevel = 0;
                $len = strlen( $str );
-               for ( $i = 0; $i < $len; $i++ ) {
+               for ( $i = $m[0][1]; $i < $len; $i++ ) {
                        $c = $str[$i];
 
                        switch ( $state ) {
@@ -418,7 +419,7 @@ class BlockLevelPass {
                                        $state = self::COLON_STATE_TAGSTART;
                                        break;
                                case ":":
-                                       if ( $level === 0 ) {
+                                       if ( $ltLevel === 0 ) {
                                                # We found it!
                                                $before = substr( $str, 0, $i );
                                                $after = substr( $str, $i + 1 );
@@ -428,35 +429,44 @@ class BlockLevelPass {
                                        break;
                                default:
                                        # Skip ahead looking for something interesting
-                                       $colonPos = strpos( $str, ':', $i );
-                                       if ( $colonPos === false ) {
+                                       if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
                                                # Nothing else interesting
                                                return false;
                                        }
-                                       $ltPos = strpos( $str, '<', $i );
-                                       if ( $level === 0 ) {
-                                               if ( $ltPos === false || $colonPos < $ltPos ) {
-                                                       # We found it!
-                                                       $before = substr( $str, 0, $colonPos );
-                                                       $after = substr( $str, $colonPos + 1 );
-                                                       return $i;
-                                               }
+                                       if ( $m[0][0] === '-{' ) {
+                                               $state = self::COLON_STATE_LC;
+                                               $lcLevel++;
+                                               $i = $m[0][1] + 1;
+                                       } else {
+                                               # Skip ahead to next interesting character.
+                                               $i = $m[0][1] - 1;
                                        }
-                                       if ( $ltPos === false ) {
-                                               # Nothing else interesting to find; abort!
-                                               # We're nested, but there's no close tags left. Abort!
-                                               break 2;
+                                       break;
+                               }
+                               break;
+                       case self::COLON_STATE_LC:
+                               # In language converter markup -{ ... }-
+                               if ( !preg_match( '/-\{|\}-/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
+                                       # Nothing else interesting to find; abort!
+                                       # We're nested in language converter markup, but there
+                                       # are no close tags left.  Abort!
+                                       break 2;
+                               } elseif ( $m[0][0] === '-{' ) {
+                                       $i = $m[0][1] + 1;
+                                       $lcLevel++;
+                               } elseif ( $m[0][0] === '}-' ) {
+                                       $i = $m[0][1] + 1;
+                                       $lcLevel--;
+                                       if ( $lcLevel === 0 ) {
+                                               $state = self::COLON_STATE_TEXT;
                                        }
-                                       # Skip ahead to next tag start
-                                       $i = $ltPos;
-                                       $state = self::COLON_STATE_TAGSTART;
                                }
                                break;
                        case self::COLON_STATE_TAG:
                                # In a <tag>
                                switch ( $c ) {
                                case ">":
-                                       $level++;
+                                       $ltLevel++;
                                        $state = self::COLON_STATE_TEXT;
                                        break;
                                case "/":
@@ -486,10 +496,12 @@ class BlockLevelPass {
                        case self::COLON_STATE_CLOSETAG:
                                # In a </tag>
                                if ( $c === ">" ) {
-                                       $level--;
-                                       if ( $level < 0 ) {
+                                       if ( $ltLevel > 0 ) {
+                                               $ltLevel--;
+                                       } else {
+                                               # ignore the excess close tag, but keep looking for
+                                               # colons. (This matches Parsoid behavior.)
                                                wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
-                                               return false;
                                        }
                                        $state = self::COLON_STATE_TEXT;
                                }
@@ -526,8 +538,11 @@ class BlockLevelPass {
                                throw new MWException( "State machine error in " . __METHOD__ );
                        }
                }
-               if ( $level > 0 ) {
-                       wfDebug( __METHOD__ . ": Invalid input; not enough close tags (level $level, state $state)\n" );
+               if ( $ltLevel > 0 || $lcLevel > 0 ) {
+                       wfDebug(
+                               __METHOD__ . ": Invalid input; not enough close tags " .
+                               "(level $ltLevel/$lcLevel, state $state)\n"
+                       );
                        return false;
                }
                return false;
index 01cce02..6aa3acc 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Parser
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Various core parser functions, registered in Parser::firstCallInit()
@@ -275,7 +276,7 @@ class CoreParserFunctions {
                }
                if ( !is_null( $title ) ) {
                        # Convert NS_MEDIA -> NS_FILE
-                       if ( $title->getNamespace() == NS_MEDIA ) {
+                       if ( $title->inNamespace( NS_MEDIA ) ) {
                                $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
                        }
                        if ( !is_null( $arg ) ) {
@@ -340,16 +341,17 @@ class CoreParserFunctions {
                // allow prefix.
                $title = Title::newFromText( $username );
 
-               if ( $title && $title->getNamespace() == NS_USER ) {
+               if ( $title && $title->inNamespace( NS_USER ) ) {
                        $username = $title->getText();
                }
 
                // check parameter, or use the ParserOptions if in interface message
                $user = User::newFromName( $username );
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                if ( $user ) {
-                       $gender = GenderCache::singleton()->getGenderOf( $user, __METHOD__ );
+                       $gender = $genderCache->getGenderOf( $user, __METHOD__ );
                } elseif ( $username === '' && $parser->getOptions()->getInterfaceMessage() ) {
-                       $gender = GenderCache::singleton()->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
+                       $gender = $genderCache->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
                }
                $ret = $parser->getFunctionLang()->gender( $gender, $forms );
                return $ret;
@@ -487,40 +489,66 @@ class CoreParserFunctions {
                return $mwObject->matchStartToEnd( $value );
        }
 
-       public static function formatRaw( $num, $raw ) {
+       /**
+        * Formats a number according to a language.
+        *
+        * @param int|float $num
+        * @param string $raw
+        * @param Language|StubUserLang $language
+        * @return string
+        */
+       public static function formatRaw( $num, $raw, $language ) {
                if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
                        return $num;
                } else {
-                       global $wgContLang;
-                       return $wgContLang->formatNum( $num );
+                       return $language->formatNum( $num );
                }
        }
+
        public static function numberofpages( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::pages(), $raw );
+               return self::formatRaw( SiteStats::pages(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberofusers( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::users(), $raw );
+               return self::formatRaw( SiteStats::users(), $raw, $parser->getFunctionLang() );
        }
        public static function numberofactiveusers( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::activeUsers(), $raw );
+               return self::formatRaw( SiteStats::activeUsers(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberofarticles( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::articles(), $raw );
+               return self::formatRaw( SiteStats::articles(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberoffiles( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::images(), $raw );
+               return self::formatRaw( SiteStats::images(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberofadmins( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::numberingroup( 'sysop' ), $raw );
+               return self::formatRaw(
+                       SiteStats::numberingroup( 'sysop' ),
+                       $raw,
+                       $parser->getFunctionLang()
+               );
        }
+
        public static function numberofedits( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::edits(), $raw );
+               return self::formatRaw( SiteStats::edits(), $raw, $parser->getFunctionLang() );
        }
+
        public static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
-               return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
+               return self::formatRaw(
+                       SiteStats::pagesInNs( intval( $namespace ) ),
+                       $raw,
+                       $parser->getFunctionLang()
+               );
        }
        public static function numberingroup( $parser, $name = '', $raw = null ) {
-               return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
+               return self::formatRaw(
+                       SiteStats::numberingroup( strtolower( $name ) ),
+                       $raw,
+                       $parser->getFunctionLang()
+               );
        }
 
        /**
@@ -727,7 +755,7 @@ class CoreParserFunctions {
 
                $title = Title::makeTitleSafe( NS_CATEGORY, $name );
                if ( !$title ) { # invalid title
-                       return self::formatRaw( 0, $raw );
+                       return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
                }
                $wgContLang->findVariantLink( $name, $title, true );
 
@@ -753,7 +781,7 @@ class CoreParserFunctions {
                }
 
                $count = $cache[$name][$type];
-               return self::formatRaw( $count, $raw );
+               return self::formatRaw( $count, $raw, $parser->getFunctionLang() );
        }
 
        /**
@@ -769,7 +797,7 @@ class CoreParserFunctions {
                $title = Title::newFromText( $page );
 
                if ( !is_object( $title ) ) {
-                       return self::formatRaw( 0, $raw );
+                       return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
                }
 
                // fetch revision from cache/database and return the value
@@ -779,7 +807,7 @@ class CoreParserFunctions {
                        // We've had bugs where rev_len was not being recorded for empty pages, see T135414
                        $length = 0;
                }
-               return self::formatRaw( $length, $raw );
+               return self::formatRaw( $length, $raw, $parser->getFunctionLang() );
        }
 
        /**
index 40da368..76ee525 100644 (file)
  * @ingroup Parser
  */
 class DateFormatter {
-       public $mSource, $mTarget;
-       public $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD;
+       private $mSource, $mTarget;
+       private $monthNames = '';
 
-       public $regexes, $pDays, $pMonths, $pYears;
-       public $rules, $xMonths, $preferences;
+       private $regexes;
+       private $rules, $xMonths, $preferences;
 
-       protected $lang, $mLinked;
+       private $lang, $mLinked;
+
+       /** @var string[] */
+       private $keys;
+
+       /** @var string[] */
+       private $targets;
 
        const ALL = -1;
        const NONE = 0;
@@ -191,17 +197,19 @@ class DateFormatter {
 
                        // Another horrible hack
                        $this->mLinked = $linked;
-                       $text = preg_replace_callback( $regex, [ &$this, 'replace' ], $text );
+                       $text = preg_replace_callback( $regex, [ $this, 'replace' ], $text );
                        unset( $this->mLinked );
                }
                return $text;
        }
 
        /**
+        * Regexp replacement callback
+        *
         * @param array $matches
         * @return string
         */
-       public function replace( $matches ) {
+       private function replace( $matches ) {
                # Extract information from $matches
                $linked = true;
                if ( isset( $this->mLinked ) ) {
@@ -217,15 +225,17 @@ class DateFormatter {
                        }
                }
 
-               return $this->formatDate( $bits, $linked );
+               return $this->formatDate( $bits, $matches[0], $linked );
        }
 
        /**
         * @param array $bits
+        * @param string $orig Original input string, to be returned
+        *  on formatting failure.
         * @param bool $link
         * @return string
         */
-       public function formatDate( $bits, $link = true ) {
+       private function formatDate( $bits, $orig, $link = true ) {
                $format = $this->targets[$this->mTarget];
 
                if ( !$link ) {
@@ -300,8 +310,9 @@ class DateFormatter {
                        }
                }
                if ( $fail ) {
-                       /** @todo FIXME: $matches doesn't exist here, what's expected? */
-                       $text = $matches[0];
+                       // This occurs when parsing a date with day or month outside the bounds
+                       // of possibilities.
+                       $text = $orig;
                }
 
                $isoBits = [];
@@ -323,7 +334,7 @@ class DateFormatter {
         * Return a regex that can be used to find month names in string
         * @return string regex to find the months with
         */
-       public function getMonthRegex() {
+       private function getMonthRegex() {
                $names = [];
                for ( $i = 1; $i <= 12; $i++ ) {
                        $names[] = $this->lang->getMonthName( $i );
@@ -337,7 +348,7 @@ class DateFormatter {
         * @param string $monthName Month name
         * @return string ISO month name
         */
-       public function makeIsoMonth( $monthName ) {
+       private function makeIsoMonth( $monthName ) {
                $n = $this->xMonths[$this->lang->lc( $monthName )];
                return sprintf( '%02d', $n );
        }
@@ -347,7 +358,7 @@ class DateFormatter {
         * @param string $year Year name
         * @return string ISO year name
         */
-       public function makeIsoYear( $year ) {
+       private function makeIsoYear( $year ) {
                # Assumes the year is in a nice format, as enforced by the regex
                if ( substr( $year, -2 ) == 'BC' ) {
                        $num = intval( substr( $year, 0, -3 ) ) - 1;
@@ -366,7 +377,7 @@ class DateFormatter {
         * @return int|string int representing year number in case of AD dates, or string containing
         *   year number and 'BC' at the end otherwise.
         */
-       public function makeNormalYear( $iso ) {
+       private function makeNormalYear( $iso ) {
                if ( $iso[0] == '-' ) {
                        $text = ( intval( substr( $iso, 1 ) ) + 1 ) . ' BC';
                } else {
index e7712f2..d2a0a1a 100644 (file)
@@ -613,7 +613,7 @@ class LinkHolderArray {
        public function replaceText( $text ) {
                $text = preg_replace_callback(
                        '/<!--(LINK|IWLINK) (.*?)-->/',
-                       [ &$this, 'replaceTextCallback' ],
+                       [ $this, 'replaceTextCallback' ],
                        $text );
 
                return $text;
index 10dfd26..86aa06a 100644 (file)
@@ -88,7 +88,7 @@ class Parser {
        # Constants needed for external link processing
        # Everything except bracket, space, or control characters
        # \p{Zs} is unicode 'separator, space' category. It covers the space 0x20
-       # as well as U+3000 is IDEOGRAPHIC SPACE for bug 19052
+       # as well as U+3000 is IDEOGRAPHIC SPACE for T21052
        const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}]';
        # Simplified expression to match an IPv4 or IPv6 address, or
        # at least one character of a host name (embeds EXT_LINK_URL_CLASS)
@@ -224,7 +224,7 @@ class Parser {
        /**
         * @var string Deprecated accessor for the strip marker prefix.
         * @deprecated since 1.26; use Parser::MARKER_PREFIX instead.
-        **/
+        */
        public $mUniqPrefix = Parser::MARKER_PREFIX;
 
        /**
@@ -271,7 +271,7 @@ class Parser {
                        # Preprocessor_Hash is much faster than Preprocessor_DOM under HipHop
                        $this->mPreprocessorClass = 'Preprocessor_Hash';
                } elseif ( extension_loaded( 'domxml' ) ) {
-                       # PECL extension that conflicts with the core DOM extension (bug 13770)
+                       # PECL extension that conflicts with the core DOM extension (T15770)
                        wfDebug( "Warning: you have the obsolete domxml extension for PHP. Please remove it!\n" );
                        $this->mPreprocessorClass = 'Preprocessor_Hash';
                } elseif ( extension_loaded( 'dom' ) ) {
@@ -300,7 +300,7 @@ class Parser {
        public function __clone() {
                $this->mInParse = false;
 
-               // Bug 56226: When you create a reference "to" an object field, that
+               // T58226: When you create a reference "to" an object field, that
                // makes the object field itself be a reference too (until the other
                // reference goes out of scope). When cloning, any field that's a
                // reference is copied as a reference in the new object. Both of these
@@ -330,7 +330,9 @@ class Parser {
                CoreTagHooks::register( $this );
                $this->initialiseVariables();
 
-               Hooks::run( 'ParserFirstCallInit', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserFirstCallInit', [ &$parser ] );
        }
 
        /**
@@ -357,7 +359,7 @@ class Parser {
 
                $this->mStripState = new StripState;
 
-               # Clear these on every parse, bug 4549
+               # Clear these on every parse, T6549
                $this->mTplRedirCache = $this->mTplDomCache = [];
 
                $this->mShowToc = true;
@@ -381,7 +383,9 @@ class Parser {
 
                $this->mProfiler = new SectionProfiler();
 
-               Hooks::run( 'ParserClearState', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserClearState', [ &$parser ] );
        }
 
        /**
@@ -435,11 +439,13 @@ class Parser {
                        $this->mRevisionSize = null;
                }
 
-               Hooks::run( 'ParserBeforeStrip', [ &$this, &$text, &$this->mStripState ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserBeforeStrip', [ &$parser, &$text, &$this->mStripState ] );
                # No more strip!
-               Hooks::run( 'ParserAfterStrip', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterStrip', [ &$parser, &$text, &$this->mStripState ] );
                $text = $this->internalParse( $text );
-               Hooks::run( 'ParserAfterParse', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterParse', [ &$parser, &$text, &$this->mStripState ] );
 
                $text = $this->internalParseHalfParsed( $text, true, $linestart );
 
@@ -547,18 +553,32 @@ class Parser {
                        $limitReport = str_replace( [ '-', '&' ], [ '‐', '&amp;' ], $limitReport );
                        $text .= "\n<!-- \n$limitReport-->\n";
 
-                       // Add on template profiling data
+                       // Add on template profiling data in human/machine readable way
                        $dataByFunc = $this->mProfiler->getFunctionStats();
                        uasort( $dataByFunc, function ( $a, $b ) {
                                return $a['real'] < $b['real']; // descending order
                        } );
-                       $profileReport = "Transclusion expansion time report (%,ms,calls,template)\n";
+                       $profileReport = [];
                        foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
-                               $profileReport .= sprintf( "%6.2f%% %8.3f %6d - %s\n",
+                               $profileReport[] = sprintf( "%6.2f%% %8.3f %6d %s",
                                        $item['%real'], $item['real'], $item['calls'],
                                        htmlspecialchars( $item['name'] ) );
                        }
-                       $text .= "\n<!-- \n$profileReport-->\n";
+                       $text .= "<!--\nTransclusion expansion time report (%,ms,calls,template)\n";
+                       $text .= implode( "\n", $profileReport ) . "\n-->\n";
+
+                       $this->mOutput->setLimitReportData( 'limitreport-timingprofile', $profileReport );
+
+                       // Add other cache related metadata
+                       if ( $wgShowHostnames ) {
+                               $this->mOutput->setLimitReportData( 'cachereport-origin', wfHostname() );
+                       }
+                       $this->mOutput->setLimitReportData( 'cachereport-timestamp',
+                               $this->mOutput->getCacheTime() );
+                       $this->mOutput->setLimitReportData( 'cachereport-ttl',
+                               $this->mOutput->getCacheExpiry() );
+                       $this->mOutput->setLimitReportData( 'cachereport-transientcontent',
+                               $this->mOutput->hasDynamicContent() );
 
                        if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
                                wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
@@ -601,8 +621,10 @@ class Parser {
         * @return string UNSAFE half-parsed HTML
         */
        public function recursiveTagParse( $text, $frame = false ) {
-               Hooks::run( 'ParserBeforeStrip', [ &$this, &$text, &$this->mStripState ] );
-               Hooks::run( 'ParserAfterStrip', [ &$this, &$text, &$this->mStripState ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserBeforeStrip', [ &$parser, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterStrip', [ &$parser, &$text, &$this->mStripState ] );
                $text = $this->internalParse( $text, false, $frame );
                return $text;
        }
@@ -649,8 +671,10 @@ class Parser {
                if ( $revid !== null ) {
                        $this->mRevisionId = $revid;
                }
-               Hooks::run( 'ParserBeforeStrip', [ &$this, &$text, &$this->mStripState ] );
-               Hooks::run( 'ParserAfterStrip', [ &$this, &$text, &$this->mStripState ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserBeforeStrip', [ &$parser, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterStrip', [ &$parser, &$text, &$this->mStripState ] );
                $text = $this->replaceVariables( $text, $frame );
                $text = $this->mStripState->unstripBoth( $text );
                return $text;
@@ -672,7 +696,7 @@ class Parser {
        }
 
        /**
-        * Process the wikitext for the "?preload=" feature. (bug 5210)
+        * Process the wikitext for the "?preload=" feature. (T7210)
         *
         * "<noinclude>", "<includeonly>" etc. are parsed as for template
         * transclusion, comments, templates, arguments, tags hooks and parser
@@ -1181,9 +1205,10 @@ class Parser {
                                        # A cell could contain both parameters and data
                                        $cell_data = explode( '|', $cell, 2 );
 
-                                       # Bug 553: Note that a '|' inside an invalid link should not
+                                       # T2553: Note that a '|' inside an invalid link should not
                                        # be mistaken as delimiting cell parameters
-                                       if ( strpos( $cell_data[0], '[[' ) !== false ) {
+                                       # Bug T153140: Neither should language converter markup.
+                                       if ( preg_match( '/\[\[|-\{/', $cell_data[0] ) === 1 ) {
                                                $cell = "{$previous}<{$last_tag}>{$cell}";
                                        } elseif ( count( $cell_data ) == 1 ) {
                                                $cell = "{$previous}<{$last_tag}>{$cell_data[0]}";
@@ -1244,8 +1269,11 @@ class Parser {
 
                $origText = $text;
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
                # Hook to suspend the parser in this state
-               if ( !Hooks::run( 'ParserBeforeInternalParse', [ &$this, &$text, &$this->mStripState ] ) ) {
+               if ( !Hooks::run( 'ParserBeforeInternalParse', [ &$parser, &$text, &$this->mStripState ] ) ) {
                        return $text;
                }
 
@@ -1265,16 +1293,16 @@ class Parser {
                        $text = $this->replaceVariables( $text );
                }
 
-               Hooks::run( 'InternalParseBeforeSanitize', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'InternalParseBeforeSanitize', [ &$parser, &$text, &$this->mStripState ] );
                $text = Sanitizer::removeHTMLtags(
                        $text,
-                       [ &$this, 'attributeStripCallback' ],
+                       [ $this, 'attributeStripCallback' ],
                        false,
                        array_keys( $this->mTransparentTagHooks ),
                        [],
-                       [ &$this, 'addTrackingCategory' ]
+                       [ $this, 'addTrackingCategory' ]
                );
-               Hooks::run( 'InternalParseBeforeLinks', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'InternalParseBeforeLinks', [ &$parser, &$text, &$this->mStripState ] );
 
                # Tables need to come after variable replacement for things to work
                # properly; putting them before other transformations should keep
@@ -1313,18 +1341,21 @@ class Parser {
        private function internalParseHalfParsed( $text, $isMain = true, $linestart = true ) {
                $text = $this->mStripState->unstripGeneral( $text );
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
                if ( $isMain ) {
-                       Hooks::run( 'ParserAfterUnstrip', [ &$this, &$text ] );
+                       Hooks::run( 'ParserAfterUnstrip', [ &$parser, &$text ] );
                }
 
                # Clean up special characters, only run once, next-to-last before doBlockLevels
                $fixtags = [
-                       # french spaces, last one Guillemet-left
+                       # French spaces, last one Guillemet-left
                        # only if there is something before the space
                        '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;',
                        # french spaces, Guillemet-right
                        '/(\\302\\253) /' => '\\1&#160;',
-                       '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, bug #11874.
+                       '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, T13874.
                ];
                $text = preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text );
 
@@ -1353,7 +1384,7 @@ class Parser {
                $text = $this->mStripState->unstripNoWiki( $text );
 
                if ( $isMain ) {
-                       Hooks::run( 'ParserBeforeTidy', [ &$this, &$text ] );
+                       Hooks::run( 'ParserBeforeTidy', [ &$parser, &$text ] );
                }
 
                $text = $this->replaceTransparentTags( $text );
@@ -1367,14 +1398,14 @@ class Parser {
                        }
                } else {
                        # attempt to sanitize at least some nesting problems
-                       # (bug #2702 and quite a few others)
+                       # (T4702 and quite a few others)
                        $tidyregs = [
                                # ''Something [http://www.cool.com cool''] -->
                                # <i>Something</i><a href="http://www.cool.com"..><i>cool></i></a>
                                '/(<([bi])>)(<([bi])>)?([^<]*)(<\/?a[^<]*>)([^<]*)(<\/\\4>)?(<\/\\2>)/' =>
                                '\\1\\3\\5\\8\\9\\6\\1\\3\\7\\8\\9',
                                # fix up an anchor inside another anchor, only
-                               # at least for a single single nested link (bug 3695)
+                               # at least for a single single nested link (T5695)
                                '/(<a[^>]+>)([^<]*)(<a[^>]+>[^<]*)<\/a>(.*)<\/a>/' =>
                                '\\1\\2</a>\\3</a>\\1\\4</a>',
                                # fix div inside inline elements- doBlockLevels won't wrap a line which
@@ -1394,7 +1425,7 @@ class Parser {
                }
 
                if ( $isMain ) {
-                       Hooks::run( 'ParserAfterTidy', [ &$this, &$text ] );
+                       Hooks::run( 'ParserAfterTidy', [ &$parser, &$text ] );
                }
 
                return $text;
@@ -1432,7 +1463,7 @@ class Parser {
                                        (?: [0-9]  $spdash? ){9} #  9 digits with opt. delimiters
                                        [0-9Xx]                  #  check digit
                                )\b
-                       )!xu", [ &$this, 'magicLinkCallback' ], $text );
+                       )!xu", [ $this, 'magicLinkCallback' ], $text );
                return $text;
        }
 
@@ -1639,7 +1670,7 @@ class Parser {
                        $thislen = strlen( $arr[$i] );
                        // If there are ever four apostrophes, assume the first is supposed to
                        // be text, and the remaining three constitute mark-up for bold text.
-                       // (bug 13227: ''''foo'''' turns into ' ''' foo ' ''')
+                       // (T15227: ''''foo'''' turns into ' ''' foo ' ''')
                        if ( $thislen == 4 ) {
                                $arr[$i - 1] .= "'";
                                $arr[$i] = "'''";
@@ -1647,7 +1678,7 @@ class Parser {
                        } elseif ( $thislen > 5 ) {
                                // If there are more than 5 apostrophes in a row, assume they're all
                                // text except for the last 5.
-                               // (bug 13227: ''''''foo'''''' turns into ' ''''' foo ' ''''')
+                               // (T15227: ''''''foo'''''' turns into ' ''''' foo ' ''''')
                                $arr[$i - 1] .= str_repeat( "'", $thislen - 5 );
                                $arr[$i] = "'''''";
                                $thislen = 5;
@@ -1932,18 +1963,6 @@ class Parser {
                return $attribs;
        }
 
-       /**
-        * Replace unusual escape codes in a URL with their equivalent characters
-        *
-        * @deprecated since 1.24, use normalizeLinkUrl
-        * @param string $url
-        * @return string
-        */
-       public static function replaceUnusualEscapes( $url ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return self::normalizeLinkUrl( $url );
-       }
-
        /**
         * Replace unusual escape codes in a URL with their equivalent characters
         *
@@ -2169,9 +2188,9 @@ class Parser {
                                # If we get a ] at the beginning of $m[3] that means we have a link that's something like:
                                # [[Image:Foo.jpg|[http://example.com desc]]] <- having three ] in a row fucks up,
                                # the real problem is with the $e1 regex
-                               # See bug 1300.
+                               # See T1500.
                                # Still some problems for cases where the ] is meant to be outside punctuation,
-                               # and no image is in sight. See bug 2095.
+                               # and no image is in sight. See T4095.
                                if ( $text !== ''
                                        && substr( $m[3], 0, 1 ) === ']'
                                        && strpos( $text, '[' ) !== false
@@ -2198,7 +2217,7 @@ class Parser {
                                continue;
                        }
 
-                       $origLink = $m[1];
+                       $origLink = ltrim( $m[1], ' ' );
 
                        # Don't allow internal links to pages containing
                        # PROTO: where PROTO is a valid URL protocol; these
@@ -2276,7 +2295,7 @@ class Parser {
                        if ( $wasblank ) {
                                $text = $link;
                        } else {
-                               # Bug 4598 madness. Handle the quotes only if they come from the alternate part
+                               # T6598 madness. Handle the quotes only if they come from the alternate part
                                # [[Lista d''e paise d''o munno]] -> <a href="...">Lista d''e paise d''o munno</a>
                                # [[Criticism of Harry Potter|Criticism of ''Harry Potter'']]
                                #    -> <a href="Criticism of Harry Potter">Criticism of <i>Harry Potter</i></a>
@@ -2292,7 +2311,7 @@ class Parser {
                                                in_array( $iw, $wgExtraInterlanguageLinkPrefixes )
                                        )
                                ) {
-                                       # Bug 24502: filter duplicates
+                                       # T26502: filter duplicates
                                        if ( !isset( $this->mLangLinkLanguages[$iw] ) ) {
                                                $this->mLangLinkLanguages[$iw] = true;
                                                $this->mOutput->addLanguageLink( $nt->getFullText() );
@@ -2324,7 +2343,7 @@ class Parser {
                                                continue;
                                        }
                                } elseif ( $ns == NS_CATEGORY ) {
-                                       $s = rtrim( $s . "\n" ); # bug 87
+                                       $s = rtrim( $s . "\n" ); # T2087
 
                                        if ( $wasblank ) {
                                                $sortkey = $this->getDefaultSort();
@@ -2337,7 +2356,7 @@ class Parser {
                                        $this->mOutput->addCategory( $nt->getDBkey(), $sortkey );
 
                                        /**
-                                        * Strip the whitespace Category links produce, see bug 87
+                                        * Strip the whitespace Category links produce, see T2087
                                         */
                                        $s .= trim( $prefix . $trail, "\n" ) == '' ? '' : $prefix . $trail;
 
@@ -2464,7 +2483,7 @@ class Parser {
         *
         * @private
         *
-        * @param int $index
+        * @param string $index Magic variable identifier as mapped in MagicWord::$mVariableIDs
         * @param bool|PPFrame $frame
         *
         * @throws MWException
@@ -2483,18 +2502,21 @@ class Parser {
                                . ' called while parsing (no title set)' );
                }
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
                /**
                 * Some of these require message or data lookups and can be
                 * expensive to check many times.
                 */
-               if ( Hooks::run( 'ParserGetVariableValueVarCache', [ &$this, &$this->mVarCache ] ) ) {
+               if ( Hooks::run( 'ParserGetVariableValueVarCache', [ &$parser, &$this->mVarCache ] ) ) {
                        if ( isset( $this->mVarCache[$index] ) ) {
                                return $this->mVarCache[$index];
                        }
                }
 
                $ts = wfTimestamp( TS_UNIX, $this->mOptions->getTimestamp() );
-               Hooks::run( 'ParserGetVariableValueTs', [ &$this, &$ts ] );
+               Hooks::run( 'ParserGetVariableValueTs', [ &$parser, &$ts ] );
 
                $pageLang = $this->getFunctionLang();
 
@@ -2606,7 +2628,7 @@ class Parser {
                                $subjPage = $this->mTitle->getSubjectPage();
                                $value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
                                break;
-                       case 'pageid': // requested in bug 23427
+                       case 'pageid': // requested in T25427
                                $pageid = $this->getTitle()->getArticleID();
                                if ( $pageid == 0 ) {
                                        # 0 means the page doesn't exist in the database,
@@ -2717,7 +2739,7 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'H' ), true );
                                break;
                        case 'currentweek':
-                               # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
+                               # @bug T6594 PHP5 has it zero padded, PHP4 does not, cast to
                                # int to remove the padding
                                $value = $pageLang->formatNum( (int)MWTimestamp::getInstance( $ts )->format( 'W' ) );
                                break;
@@ -2743,7 +2765,7 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'H' ), true );
                                break;
                        case 'localweek':
-                               # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
+                               # @bug T6594 PHP5 has it zero padded, PHP4 does not, cast to
                                # int to remove the padding
                                $value = $pageLang->formatNum( (int)MWTimestamp::getLocalInstance( $ts )->format( 'W' ) );
                                break;
@@ -2797,6 +2819,9 @@ class Parser {
                        case 'contentlanguage':
                                global $wgLanguageCode;
                                return $wgLanguageCode;
+                       case 'pagelanguage':
+                               $value = $pageLang->getCode();
+                               break;
                        case 'cascadingsources':
                                $value = CoreParserFunctions::cascadingsources( $this );
                                break;
@@ -2804,7 +2829,7 @@ class Parser {
                                $ret = null;
                                Hooks::run(
                                        'ParserGetVariableValueSwitch',
-                                       [ &$this, &$this->mVarCache, &$index, &$ret, &$frame ]
+                                       [ &$parser, &$this->mVarCache, &$index, &$ret, &$frame ]
                                );
 
                                return $ret;
@@ -2840,7 +2865,7 @@ class Parser {
         *     included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
-        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
         *
         * Any flag added to the $flags parameter here, or any other parameter liable to cause a
         * change in the DOM tree for a given text, must be passed through the section identifier
@@ -3275,7 +3300,7 @@ class Parser {
                        && !$piece['lineStart']
                        && preg_match( '/^(?:{\\||:|;|#|\*)/', $text )
                ) {
-                       # Bug 529: if the template begins with a table or block-level
+                       # T2529: if the template begins with a table or block-level
                        # element, it should be treated as beginning a new line.
                        # This behavior is somewhat controversial.
                        $text = "\n" . $text;
@@ -3284,7 +3309,7 @@ class Parser {
                if ( is_string( $text ) && !$this->incrementIncludeSize( 'post-expand', strlen( $text ) ) ) {
                        # Error, oversize inclusion
                        if ( $titleText !== false ) {
-                               # Make a working, properly escaped link if possible (bug 23588)
+                               # Make a working, properly escaped link if possible (T25588)
                                $text = "[[:$titleText]]";
                        } else {
                                # This will probably not be a working link, but at least it may
@@ -3348,7 +3373,10 @@ class Parser {
                        throw new MWException( "Tag hook for $function is not callable\n" );
                }
 
-               $allArgs = [ &$this ];
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
+               $allArgs = [ &$parser ];
                if ( $flags & self::SFH_OBJECT_ARGS ) {
                        # Convert arguments to PPNodes and collect for appending to $allArgs
                        $funcArgs = [];
@@ -3857,7 +3885,9 @@ class Parser {
                                        throw new MWException( "Tag hook for $name is not callable\n" );
                                }
 
-                               $output = call_user_func_array( $callback, [ &$this, $frame, $content, $attributes ] );
+                               // Avoid PHP 7.1 warning from passing $this by reference
+                               $parser = $this;
+                               $output = call_user_func_array( $callback, [ &$parser, $frame, $content, $attributes ] );
                        } else {
                                $output = '<span class="error">Invalid tag extension name: ' .
                                        htmlspecialchars( $name ) . '</span>';
@@ -3968,9 +3998,8 @@ class Parser {
                ) {
                        $this->addTrackingCategory( 'hidden-category-category' );
                }
-               # (bug 8068) Allow control over whether robots index a page.
-               # @todo FIXME: Bug 14899: __INDEX__ always overrides __NOINDEX__ here!  This
-               # is not desirable, the last one on the page should win.
+               # (T10068) Allow control over whether robots index a page.
+               # __INDEX__ always overrides __NOINDEX__, see T16899
                if ( isset( $this->mDoubleUnderscores['noindex'] ) && $this->mTitle->canUseNoindex() ) {
                        $this->mOutput->setIndexPolicy( 'noindex' );
                        $this->addTrackingCategory( 'noindex-category' );
@@ -4177,11 +4206,11 @@ class Parser {
 
                        # Strip out HTML (first regex removes any tag not allowed)
                        # Allowed tags are:
-                       # * <sup> and <sub> (bug 8393)
-                       # * <i> (bug 26375)
+                       # * <sup> and <sub> (T10393)
+                       # * <i> (T28375)
                        # * <b> (r105284)
-                       # * <bdi> (bug 72884)
-                       # * <span dir="rtl"> and <span dir="ltr"> (bug 35167)
+                       # * <bdi> (T74884)
+                       # * <span dir="rtl"> and <span dir="ltr"> (T37167)
                        # * <s> and <strike> (T35715)
                        # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
                        # to allow setting directionality in toc items.
@@ -4232,7 +4261,7 @@ class Parser {
                                        'noninitial' );
                        }
 
-                       # HTML names must be case-insensitively unique (bug 10721).
+                       # HTML names must be case-insensitively unique (T12721).
                        # This does not apply to Unicode characters per
                        # https://www.w3.org/TR/html5/infrastructure.html#case-sensitivity-and-string-comparison
                        # @todo FIXME: We may be changing them depending on the current locale.
@@ -4463,7 +4492,7 @@ class Parser {
                # the database, we use $wgContLang here in order to give
                # everyone the same signature and use the default one rather
                # than the one selected in each user's preferences.
-               # (see also bug 12815)
+               # (see also T14815)
                $ts = $this->mOptions->getTimestamp();
                $timestamp = MWTimestamp::getLocalInstance( $ts );
                $ts = $timestamp->format( 'YmdHis' );
@@ -4961,7 +4990,9 @@ class Parser {
                }
                $ig->setAdditionalOptions( $params );
 
-               Hooks::run( 'BeforeParserrenderImageGallery', [ &$this, &$ig ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'BeforeParserrenderImageGallery', [ &$parser, &$ig ] );
 
                $lines = StringUtils::explode( "\n", $text );
                foreach ( $lines as $line ) {
@@ -4990,7 +5021,7 @@ class Parser {
                        $descQuery = false;
                        Hooks::run( 'BeforeParserFetchFileAndTitle',
                                [ $this, $title, &$options, &$descQuery ] );
-                       # Don't register it now, as ImageGallery does that later.
+                       # Don't register it now, as TraditionalImageGallery does that later.
                        $file = $this->fetchFileNoRegister( $title, $options );
                        $handler = $file ? $file->getHandler() : false;
 
@@ -5019,7 +5050,10 @@ class Parser {
                                // FIXME: Doing recursiveTagParse at this stage, and the trim before
                                // splitting on '|' is a bit odd, and different from makeImage.
                                $matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
-                               $parameterMatches = StringUtils::explode( '|', $matches[3] );
+                               // Protect LanguageConverter markup
+                               $parameterMatches = StringUtils::delimiterExplode(
+                                       '-{', '}-', '|', $matches[3], true /* nested */
+                               );
 
                                foreach ( $parameterMatches as $parameterMatch ) {
                                        list( $magicName, $match ) = $mwArray->matchVariableStartToEnd( $parameterMatch );
@@ -5036,6 +5070,11 @@ class Parser {
                                                        $addr = self::EXT_LINK_ADDR;
                                                        $prots = $this->mUrlProtocols;
                                                        // check to see if link matches an absolute url, if not then it must be a wiki link.
+                                                       if ( preg_match( '/^-{R|(.*)}-$/', $linkValue ) ) {
+                                                               // Result of LanguageConverter::markNoConversion
+                                                               // invoked on an external link.
+                                                               $linkValue = substr( $linkValue, 4, -2 );
+                                                       }
                                                        if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
                                                                $link = $linkValue;
                                                        } else {
@@ -5151,7 +5190,10 @@ class Parser {
                #  * bottom
                #  * text-bottom
 
-               $parts = StringUtils::explode( "|", $options );
+               # Protect LanguageConverter markup when splitting into parts
+               $parts = StringUtils::delimiterExplode(
+                       '-{', '}-', '|', $options, true /* allow nesting */
+               );
 
                # Give extensions a chance to select the file revision for us
                $options = [];
@@ -5199,7 +5241,7 @@ class Parser {
                                                        $validated = true;
                                                }
                                        }
-                                       # else no validation -- bug 13436
+                                       # else no validation -- T15436
                                } else {
                                        if ( $type === 'handler' ) {
                                                # Validate handler parameter
@@ -5247,7 +5289,7 @@ class Parser {
                                                case 'framed':
                                                case 'thumbnail':
                                                        // use first appearing option, discard others.
-                                                       $validated = ! $seenformat;
+                                                       $validated = !$seenformat;
                                                        $seenformat = true;
                                                        break;
                                                default:
@@ -5438,14 +5480,14 @@ class Parser {
         * External callers should use the getSection and replaceSection methods.
         *
         * @param string $text Page wikitext
-        * @param string|number $sectionId A section identifier string of the form:
+        * @param string|int $sectionId A section identifier string of the form:
         *   "<flag1> - <flag2> - ... - <section number>"
         *
         * Currently the only recognised flag is "T", which means the target section number
         * was derived during a template inclusion parse, in other words this is a template
         * section edit link. If no flags are given, it was an ordinary section edit link.
         * This flag is required to avoid a section numbering mismatch when a section is
-        * enclosed by "<includeonly>" (bug 6563).
+        * enclosed by "<includeonly>" (T8563).
         *
         * The section number 0 pulls the text before the first heading; other numbers will
         * pull the given section along with its lower-level subsections. If the section is
@@ -5579,7 +5621,7 @@ class Parser {
         * If a section contains subsections, these are also returned.
         *
         * @param string $text Text to look in
-        * @param string|number $sectionId Section identifier as a number or string
+        * @param string|int $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1').
         * @param string $defaultText Default to return if section is not found
         *
@@ -5595,7 +5637,7 @@ class Parser {
         * section does not exist, $oldtext is returned unchanged.
         *
         * @param string $oldText Former text of the article
-        * @param string|number $sectionId Section identifier as a number or string
+        * @param string|int $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1').
         * @param string $newText Replacing text
         *
@@ -5986,7 +6028,7 @@ class Parser {
                        return $parsedWidthParam;
                }
                $m = [];
-               # (bug 13500) In both cases (width/height and width only),
+               # (T15500) In both cases (width/height and width only),
                # permit trailing "px" for backward compatibility.
                if ( preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m ) ) {
                        $width = intval( $m[1] );
index d2ef5e3..0c162b4 100644 (file)
@@ -193,6 +193,9 @@ class ParserOutput extends CacheTime {
         */
        private $mLimitReportData = [];
 
+       /** @var array Parser limit report data for JSON */
+       private $mLimitReportJSData = [];
+
        /**
         * @var array $mParseStartTime Timestamps for getTimeSinceStart().
         */
@@ -215,7 +218,7 @@ class ParserOutput extends CacheTime {
        private $mMaxAdaptiveExpiry = INF;
 
        const EDITSECTION_REGEX =
-               '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
+               '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#s';
 
        // finalizeAdaptiveCacheExpiry() uses TTL = MAX( m * PARSE_TIME + b, MIN_AR_TTL)
        // Current values imply that m=3933.333333 and b=-333.333333
@@ -411,6 +414,10 @@ class ParserOutput extends CacheTime {
                return $this->mLimitReportData;
        }
 
+       public function getLimitReportJSData() {
+               return $this->mLimitReportJSData;
+       }
+
        public function getTOCEnabled() {
                return $this->mTOCEnabled;
        }
@@ -689,6 +696,8 @@ class ParserOutput extends CacheTime {
         * to SpecialTrackingCategories::$coreTrackingCategories, and extensions
         * should add to "TrackingCategories" in their extension.json.
         *
+        * @todo Migrate some code to TrackingCategories
+        *
         * @param string $msg Message key
         * @param Title $title title of the page which is being tracked
         * @return bool Whether the addition was successful
@@ -823,7 +832,6 @@ class ParserOutput extends CacheTime {
         * @code
         *    $parser->getOutput()->my_ext_foo = '...';
         * @endcode
-        *
         */
        public function setProperty( $name, $value ) {
                $this->mProperties[$name] = $value;
@@ -1011,6 +1019,26 @@ class ParserOutput extends CacheTime {
         */
        public function setLimitReportData( $key, $value ) {
                $this->mLimitReportData[$key] = $value;
+
+               if ( is_array( $value ) ) {
+                       if ( array_keys( $value ) === [ 0, 1 ]
+                               && is_numeric( $value[0] )
+                               && is_numeric( $value[1] )
+                       ) {
+                               $data = [ 'value' => $value[0], 'limit' => $value[1] ];
+                       } else {
+                               $data = $value;
+                       }
+               } else {
+                       $data = $value;
+               }
+
+               if ( strpos( $key, '-' ) ) {
+                       list( $ns, $name ) = explode( '-', $key, 2 );
+                       $this->mLimitReportJSData[$ns][$name] = $data;
+               } else {
+                       $this->mLimitReportJSData[$key] = $data;
+               }
        }
 
        /**
index cc98abd..426b550 100644 (file)
@@ -48,7 +48,13 @@ abstract class Preprocessor {
                        'names' => [ 2 => null ],
                        'min' => 2,
                        'max' => 2,
-               ]
+               ],
+               '-{' => [
+                       'end' => '}-',
+                       'names' => [ 1 => null ],
+                       'min' => 1,
+                       'max' => 1,
+               ],
        ];
 
        /**
index 5da7cd7..661318b 100644 (file)
@@ -193,6 +193,8 @@ class Preprocessor_DOM extends Preprocessor {
         * @return string
         */
        public function preprocessToXml( $text, $flags = 0 ) {
+               global $wgDisableLangConversion;
+
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -220,6 +222,11 @@ class Preprocessor_DOM extends Preprocessor {
                $stack = new PPDStack;
 
                $searchBase = "[{<\n"; # }
+               if ( !$wgDisableLangConversion ) {
+                       // FIXME: disabled due to T153761
+                       // $searchBase .= '-';
+               }
+
                // For fast reverse searches
                $revText = strrev( $text );
                $lengthText = strlen( $text );
@@ -298,7 +305,10 @@ class Preprocessor_DOM extends Preprocessor {
                                                break;
                                        }
                                } else {
-                                       $curChar = $text[$i];
+                                       $curChar = $curTwoChar = $text[$i];
+                                       if ( ( $i + 1 ) < $lengthText ) {
+                                               $curTwoChar .= $text[$i + 1];
+                                       }
                                        if ( $curChar == '|' ) {
                                                $found = 'pipe';
                                        } elseif ( $curChar == '=' ) {
@@ -311,11 +321,20 @@ class Preprocessor_DOM extends Preprocessor {
                                                } else {
                                                        $found = 'line-start';
                                                }
+                                       } elseif ( $curTwoChar == $currentClosing ) {
+                                               $found = 'close';
+                                               $curChar = $curTwoChar;
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
+                                       } elseif ( isset( $this->rules[$curTwoChar] ) ) {
+                                               $curChar = $curTwoChar;
+                                               $found = 'open';
+                                               $rule = $this->rules[$curChar];
                                        } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
                                                $rule = $this->rules[$curChar];
+                                       } elseif ( $curChar == '-' ) {
+                                               $found = 'dash';
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -595,7 +614,8 @@ class Preprocessor_DOM extends Preprocessor {
                                // input pointer.
                        } elseif ( $found == 'open' ) {
                                # count opening brace characters
-                               $count = strspn( $text, $curChar, $i );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i );
 
                                # we need to add to stack only if opening brace count is enough for one of the rules
                                if ( $count >= $rule['min'] ) {
@@ -615,12 +635,13 @@ class Preprocessor_DOM extends Preprocessor {
                                        # Add literal brace(s)
                                        $accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
                                }
-                               $i += $count;
+                               $i += $curLen * $count;
                        } elseif ( $found == 'close' ) {
                                $piece = $stack->top;
                                # lets check if there are enough characters for closing brace
                                $maxCount = $piece->count;
-                               $count = strspn( $text, $curChar, $i, $maxCount );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount );
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
@@ -643,7 +664,7 @@ class Preprocessor_DOM extends Preprocessor {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
                                        $accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
-                                       $i += $count;
+                                       $i += $curLen * $count;
                                        continue;
                                }
                                $name = $rule['names'][$matchingCount];
@@ -682,7 +703,7 @@ class Preprocessor_DOM extends Preprocessor {
                                }
 
                                # Advance input pointer
-                               $i += $matchingCount;
+                               $i += $curLen * $matchingCount;
 
                                # Unwind the stack
                                $stack->pop();
@@ -716,6 +737,9 @@ class Preprocessor_DOM extends Preprocessor {
                                $stack->getCurrentPart()->eqpos = strlen( $accum );
                                $accum .= '=';
                                ++$i;
+                       } elseif ( $found == 'dash' ) {
+                               $accum .= '-';
+                               ++$i;
                        }
                }
 
index 8a4637e..2666c93 100644 (file)
@@ -117,6 +117,8 @@ class Preprocessor_Hash extends Preprocessor {
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
+               global $wgDisableLangConversion;
+
                $tree = $this->cacheGetTree( $text, $flags );
                if ( $tree !== false ) {
                        $store = json_decode( $tree );
@@ -152,6 +154,11 @@ class Preprocessor_Hash extends Preprocessor {
                $stack = new PPDStack_Hash;
 
                $searchBase = "[{<\n";
+               if ( !$wgDisableLangConversion ) {
+                       // FIXME: disabled due to T153761
+                       // $searchBase .= '-';
+               }
+
                // For fast reverse searches
                $revText = strrev( $text );
                $lengthText = strlen( $text );
@@ -229,7 +236,10 @@ class Preprocessor_Hash extends Preprocessor {
                                                break;
                                        }
                                } else {
-                                       $curChar = $text[$i];
+                                       $curChar = $curTwoChar = $text[$i];
+                                       if ( ( $i + 1 ) < $lengthText ) {
+                                               $curTwoChar .= $text[$i + 1];
+                                       }
                                        if ( $curChar == '|' ) {
                                                $found = 'pipe';
                                        } elseif ( $curChar == '=' ) {
@@ -242,11 +252,20 @@ class Preprocessor_Hash extends Preprocessor {
                                                } else {
                                                        $found = 'line-start';
                                                }
+                                       } elseif ( $curTwoChar == $currentClosing ) {
+                                               $found = 'close';
+                                               $curChar = $curTwoChar;
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
+                                       } elseif ( isset( $this->rules[$curTwoChar] ) ) {
+                                               $curChar = $curTwoChar;
+                                               $found = 'open';
+                                               $rule = $this->rules[$curChar];
                                        } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
                                                $rule = $this->rules[$curChar];
+                                       } elseif ( $curChar == '-' ) {
+                                               $found = 'dash';
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -538,7 +557,8 @@ class Preprocessor_Hash extends Preprocessor {
                                // input pointer.
                        } elseif ( $found == 'open' ) {
                                # count opening brace characters
-                               $count = strspn( $text, $curChar, $i );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i );
 
                                # we need to add to stack only if opening brace count is enough for one of the rules
                                if ( $count >= $rule['min'] ) {
@@ -557,12 +577,13 @@ class Preprocessor_Hash extends Preprocessor {
                                        # Add literal brace(s)
                                        self::addLiteral( $accum, str_repeat( $curChar, $count ) );
                                }
-                               $i += $count;
+                               $i += $curLen * $count;
                        } elseif ( $found == 'close' ) {
                                $piece = $stack->top;
                                # lets check if there are enough characters for closing brace
                                $maxCount = $piece->count;
-                               $count = strspn( $text, $curChar, $i, $maxCount );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount );
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
@@ -585,7 +606,7 @@ class Preprocessor_Hash extends Preprocessor {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
                                        self::addLiteral( $accum, str_repeat( $curChar, $count ) );
-                                       $i += $count;
+                                       $i += $curLen * $count;
                                        continue;
                                }
                                $name = $rule['names'][$matchingCount];
@@ -627,7 +648,7 @@ class Preprocessor_Hash extends Preprocessor {
                                }
 
                                # Advance input pointer
-                               $i += $matchingCount;
+                               $i += $curLen * $matchingCount;
 
                                # Unwind the stack
                                $stack->pop();
@@ -661,6 +682,9 @@ class Preprocessor_Hash extends Preprocessor {
                                $accum[] = [ 'equals', [ '=' ] ];
                                $stack->getCurrentPart()->eqpos = count( $accum ) - 1;
                                ++$i;
+                       } elseif ( $found == 'dash' ) {
+                               self::addLiteral( $accum, '-' );
+                               ++$i;
                        }
                }
 
index 954d403..78d624c 100644 (file)
@@ -79,7 +79,7 @@ abstract class ParameterizedPassword extends Password {
        }
 
        public function needsUpdate() {
-               return parent::needsUpdate() || $this->params !== $this->getDefaultParams();
+               return $this->params !== $this->getDefaultParams();
        }
 
        public function toString() {
@@ -90,7 +90,9 @@ abstract class ParameterizedPassword extends Password {
                        $str .= $this->getDelimiter();
                }
 
-               return $str . $this->hash;
+               $res = $str . $this->hash;
+               $this->assertIsSafeSize( $res );
+               return $res;
        }
 
        /**
index 4e395b5..c8a0267 100644 (file)
@@ -81,6 +81,11 @@ abstract class Password {
         */
        protected $config;
 
+       /**
+        * Hash must fit in user_password, which is a tinyblob
+        */
+       const MAX_HASH_SIZE = 255;
+
        /**
         * Construct the Password object using a string hash
         *
@@ -133,8 +138,7 @@ abstract class Password {
         *
         * @return bool True if needs update, false otherwise
         */
-       public function needsUpdate() {
-       }
+       abstract public function needsUpdate();
 
        /**
         * Compare one Password object to this object
@@ -168,9 +172,28 @@ abstract class Password {
         * are considered equivalent.
         *
         * @return string
+        * @throws PasswordError if password cannot be serialized to fit a tinyblob.
         */
        public function toString() {
-               return ':' . $this->config['type'] . ':' . $this->hash;
+               $result = ':' . $this->config['type'] . ':' . $this->hash;
+               $this->assertIsSafeSize( $result );
+               return $result;
+       }
+
+       /**
+        * Assert that hash will fit in a tinyblob field.
+        *
+        * This prevents MW from inserting it into the DB
+        * and having MySQL silently truncating it, locking
+        * the user out of their account.
+        *
+        * @param string $hash The hash in question.
+        * @throws PasswordError If hash does not fit in DB.
+        */
+       final protected function assertIsSafeSize( $hash ) {
+               if ( strlen( $hash ) > self::MAX_HASH_SIZE ) {
+                       throw new PasswordError( "Password hash is too big" );
+               }
        }
 
        /**
index 5584f6f..bf1f8ac 100644 (file)
@@ -67,12 +67,11 @@ class UserPasswordPolicy {
         * Check if a passwords meets the effective password policy for a User.
         * @param User $user who's policy we are checking
         * @param string $password the password to check
-        * @param string $purpose one of 'login', 'create', 'reset'
         * @return Status error to indicate the password didn't meet the policy, or fatal to
         *      indicate the user shouldn't be allowed to login.
         */
-       public function checkUserPassword( User $user, $password, $purpose = 'login' ) {
-               $effectivePolicy = $this->getPoliciesForUser( $user, $purpose );
+       public function checkUserPassword( User $user, $password ) {
+               $effectivePolicy = $this->getPoliciesForUser( $user );
                return $this->checkPolicies(
                        $user,
                        $password,
@@ -134,20 +133,16 @@ class UserPasswordPolicy {
         * Get the policy for a user, based on their group membership. Public so
         * UI elements can access and inform the user.
         * @param User $user
-        * @param string $purpose one of 'login', 'create', 'reset'
         * @return array the effective policy for $user
         */
-       public function getPoliciesForUser( User $user, $purpose = 'login' ) {
-               $effectivePolicy = $this->policies['default'];
-               if ( $purpose !== 'create' ) {
-                       $effectivePolicy = self::getPoliciesForGroups(
-                               $this->policies,
-                               $user->getEffectiveGroups(),
-                               $this->policies['default']
-                       );
-               }
+       public function getPoliciesForUser( User $user ) {
+               $effectivePolicy = self::getPoliciesForGroups(
+                       $this->policies,
+                       $user->getEffectiveGroups(),
+                       $this->policies['default']
+               );
 
-               Hooks::run( 'PasswordPoliciesForUser', [ $user, &$effectivePolicy, $purpose ] );
+               Hooks::run( 'PasswordPoliciesForUser', [ $user, &$effectivePolicy ] );
 
                return $effectivePolicy;
        }
index 29016a8..534e86b 100644 (file)
@@ -147,6 +147,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        $logger->info( '{time} {title}', [
                                'time' => number_format( $time, 2 ),
                                'title' => $this->page->getTitle()->getPrefixedDBkey(),
+                               'ns' => $this->page->getTitle()->getNamespace(),
                                'trigger' => 'view',
                        ] );
                }
index 8b4f01a..252a227 100644 (file)
@@ -22,6 +22,7 @@
  * @defgroup Profiler Profiler
  */
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\TransactionProfiler;
 
 /**
  * Profiler base class that defines the interface and some trivial
index 8fc0b77..1bf4f54 100644 (file)
  * ($wgProfiler['exclude']) containing an array of function names.
  * Shell-style patterns are also accepted.
  *
+ * It is also possible to use the Tideways PHP extension, which is mostly
+ * a drop-in replacement for Xhprof. Just change the XHPROF_FLAGS_* constants
+ * to TIDEWAYS_FLAGS_*.
+ *
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
  * @ingroup Profiler
  * @see Xhprof
  * @see https://php.net/xhprof
  * @see https://github.com/facebook/hhvm/blob/master/hphp/doc/profiling.md
+ * @see https://github.com/tideways/php-profiler-extension
  */
 class ProfilerXhprof extends Profiler {
        /**
diff --git a/includes/rcfeed/FormattedRCFeed.php b/includes/rcfeed/FormattedRCFeed.php
new file mode 100644 (file)
index 0000000..48a9f94
--- /dev/null
@@ -0,0 +1,68 @@
+<?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
+ */
+
+/**
+ * Base class for RC feed engines that send messages in a freely configurable
+ * format to a uri-addressed engine set in $wgRCEngines.
+ * @since 1.29
+ */
+abstract class FormattedRCFeed extends RCFeed {
+       private $params;
+
+       /**
+        * @param array $params
+        *  - 'uri'
+        *  - 'formatter'
+        * @see $wgRCFeeds
+        */
+       public function __construct( array $params = [] ) {
+               $this->params = $params;
+       }
+
+       /**
+        * Send some text to the specified feed.
+        *
+        * @param array $feed The feed, as configured in an associative array
+        * @param string $line The text to send
+        * @return bool Success
+        */
+       abstract public function send( array $feed, $line );
+
+       /**
+        * @param RecentChange $rc
+        * @param string|null $actionComment
+        * @return bool Success
+        */
+       public function notify( RecentChange $rc, $actionComment = null ) {
+               $params = $this->params;
+               /** @var $formatter RCFeedFormatter */
+               $formatter = is_object( $params['formatter'] ) ? $params['formatter'] : new $params['formatter'];
+
+               $line = $formatter->getLine( $params, $rc, $actionComment );
+               if ( !$line ) {
+                       // @codeCoverageIgnoreStart
+                       // T109544 - If a feed formatter returns null, this will otherwise cause an
+                       // error in at least RedisPubSubFeedEngine. Not sure best to handle this.
+                       return;
+                       // @codeCoverageIgnoreEnd
+               }
+               return $this->send( $params, $line );
+       }
+}
diff --git a/includes/rcfeed/RCFeed.php b/includes/rcfeed/RCFeed.php
new file mode 100644 (file)
index 0000000..284f68a
--- /dev/null
@@ -0,0 +1,59 @@
+<?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
+ */
+
+/**
+ * @see $wgRCFeeds
+ * @since 1.29
+ */
+abstract class RCFeed {
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params = [] ) {
+       }
+
+       /**
+        * Dispatch the recent changes notification.
+        *
+        * @param RecentChange $rc
+        * @param string|null $actionComment
+        * @return bool Success
+        */
+       abstract public function notify( RecentChange $rc, $actionComment = null );
+
+       /**
+        * @param array $params
+        * @return RCFeed
+        * @throws Exception
+        */
+       final public static function factory( array $params ) {
+               if ( !isset( $params['class'] ) ) {
+                       if ( !isset( $params['uri'] ) ) {
+                               throw new Exception( "RCFeeds must have a 'class' or 'uri' set." );
+                       }
+                       return RecentChange::getEngine( $params['uri'], $params );
+               }
+               $class = $params['class'];
+               if ( !class_exists( $class ) ) {
+                       throw new Exception( "Unknown class '$class'." );
+               }
+               return new $class( $params );
+       }
+}
index 0b0cd86..49436fa 100644 (file)
@@ -1,5 +1,4 @@
 <?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
  */
 
 /**
- * Interface for RC feed engines, which send formatted notifications
- *
+ * Backward-compatibility alias.
  * @since 1.22
+ * @deprecated since 1.29 Use FormattedRCFeed instead
  */
-interface RCFeedEngine {
-       /**
-        * Sends some text to the specified live feed.
-        *
-        * @see IRCColourfulRCFeedFormatter::cleanupForIRC
-        * @param array $feed The feed, as configured in an associative array
-        * @param string $line The text to send
-        * @return bool Success
-        */
-       public function send( array $feed, $line );
+abstract class RCFeedEngine extends FormattedRCFeed {
 }
index c10e959..4c011be 100644 (file)
@@ -1,5 +1,4 @@
 <?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
@@ -20,7 +19,7 @@
  */
 
 /**
- * Emit a recent change notification via Redis Pub/Sub
+ * Send recent change notifications via Redis Pub/Sub
  *
  * If the feed URI contains a path component, it will be used to generate a
  * channel name by stripping the leading slash and replacing any remaining
  *
  * @since 1.22
  */
-class RedisPubSubFeedEngine implements RCFeedEngine {
+class RedisPubSubFeedEngine extends RCFeedEngine {
 
        /**
-        * @see RCFeedEngine::send
+        * @see FormattedRCFeed::send
         */
        public function send( array $feed, $line ) {
                $parsed = wfParseUrl( $feed['uri'] );
index 9afae66..61ced5f 100644 (file)
@@ -1,5 +1,4 @@
 <?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
  */
 
 /**
- * Sends the notification to the specified host in a UDP packet.
+ * Send recent change notifications in a UDP packet.
  * @since 1.22
  */
-
-class UDPRCFeedEngine implements RCFeedEngine {
+class UDPRCFeedEngine extends RCFeedEngine {
        /**
         * @see RCFeedEngine::send
         */
diff --git a/includes/registration/CoreVersionChecker.php b/includes/registration/CoreVersionChecker.php
deleted file mode 100644 (file)
index f64d826..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-use Composer\Semver\VersionParser;
-use Composer\Semver\Constraint\Constraint;
-
-/**
- * @since 1.26
- */
-class CoreVersionChecker {
-
-       /**
-        * @var Constraint|bool representing $wgVersion
-        */
-       private $coreVersion = false;
-
-       /**
-        * @var VersionParser
-        */
-       private $versionParser;
-
-       /**
-        * @param string $coreVersion Current version of core
-        */
-       public function __construct( $coreVersion ) {
-               $this->versionParser = new VersionParser();
-               try {
-                       $this->coreVersion = new Constraint(
-                               '==',
-                               $this->versionParser->normalize( $coreVersion )
-                       );
-               } catch ( UnexpectedValueException $e ) {
-                       // Non-parsable version, don't fatal.
-               }
-       }
-
-       /**
-        * Check that the provided constraint is compatible with the current version of core
-        *
-        * @param string $constraint Something like ">= 1.26"
-        * @return bool
-        */
-       public function check( $constraint ) {
-               if ( $this->coreVersion === false ) {
-                       // Couldn't parse the core version, so we can't check anything
-                       return true;
-               }
-
-               return $this->versionParser->parseConstraints( $constraint )
-                       ->matches( $this->coreVersion );
-       }
-}
diff --git a/includes/registration/ExtensionJsonValidationError.php b/includes/registration/ExtensionJsonValidationError.php
new file mode 100644 (file)
index 0000000..897d284
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class ExtensionJsonValidationError extends Exception {
+}
diff --git a/includes/registration/ExtensionJsonValidator.php b/includes/registration/ExtensionJsonValidator.php
new file mode 100644 (file)
index 0000000..8142111
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use Composer\Spdx\SpdxLicenses;
+use JsonSchema\Validator;
+
+/**
+ * @since 1.29
+ */
+class ExtensionJsonValidator {
+
+       /**
+        * @var callable
+        */
+       private $missingDepCallback;
+
+       /**
+        * @param callable $missingDepCallback
+        */
+       public function __construct( callable $missingDepCallback ) {
+               $this->missingDepCallback = $missingDepCallback;
+       }
+
+       /**
+        * @return bool
+        */
+       public function checkDependencies() {
+               if ( !class_exists( Validator::class ) ) {
+                       call_user_func( $this->missingDepCallback,
+                               'The JsonSchema library cannot be found, please install it through composer.'
+                       );
+                       return false;
+               } elseif ( !class_exists( SpdxLicenses::class ) ) {
+                       call_user_func( $this->missingDepCallback,
+                               'The spdx-licenses library cannot be found, please install it through composer.'
+                       );
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * @param string $path file to validate
+        * @return bool true if passes validation
+        * @throws ExtensionJsonValidationError on any failure
+        */
+       public function validate( $path ) {
+               $data = json_decode( file_get_contents( $path ) );
+               if ( !is_object( $data ) ) {
+                       throw new ExtensionJsonValidationError( "$path is not valid JSON" );
+               }
+
+               if ( !isset( $data->manifest_version ) ) {
+                       throw new ExtensionJsonValidationError(
+                               "$path does not have manifest_version set." );
+               }
+
+               $version = $data->manifest_version;
+               $schemaPath = __DIR__ . "/../../docs/extension.schema.v$version.json";
+
+               // Not too old
+               if ( $version < ExtensionRegistry::OLDEST_MANIFEST_VERSION ) {
+                       throw new ExtensionJsonValidationError(
+                               "$path is using a non-supported schema version"
+                       );
+               } elseif ( $version > ExtensionRegistry::MANIFEST_VERSION ) {
+                       throw new ExtensionJsonValidationError(
+                               "$path is using a non-supported schema version"
+                       );
+               }
+
+               $licenseError = false;
+               // Check if it's a string, if not, schema validation will display an error
+               if ( isset( $data->{'license-name'} ) && is_string( $data->{'license-name'} ) ) {
+                       $licenses = new SpdxLicenses();
+                       $valid = $licenses->validate( $data->{'license-name'} );
+                       if ( !$valid ) {
+                               $licenseError = '[license-name] Invalid SPDX license identifier, '
+                                       . 'see <https://spdx.org/licenses/>';
+                       }
+               }
+
+               $validator = new Validator;
+               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
+               if ( $validator->isValid() && !$licenseError ) {
+                       // All good.
+                       return true;
+               } else {
+                       $out = "$path did pass validation.\n";
+                       foreach ( $validator->getErrors() as $error ) {
+                               $out .= "[{$error['property']}] {$error['message']}\n";
+                       }
+                       if ( $licenseError ) {
+                               $out .= "$licenseError\n";
+                       }
+                       throw new ExtensionJsonValidationError( $out );
+               }
+       }
+}
index 207f884..1212f99 100644 (file)
@@ -141,6 +141,7 @@ class ExtensionProcessor implements Processor {
 
        /**
         * Things to be called once registration of these extensions are done
+        * keyed by the name of the extension that it belongs to
         *
         * @var callable[]
         */
@@ -180,11 +181,11 @@ class ExtensionProcessor implements Processor {
                $this->extractResourceLoaderModules( $dir, $info );
                $this->extractServiceWiringFiles( $dir, $info );
                $this->extractParserTestFiles( $dir, $info );
+               $name = $this->extractCredits( $path, $info );
                if ( isset( $info['callback'] ) ) {
-                       $this->callbacks[] = $info['callback'];
+                       $this->callbacks[$name] = $info['callback'];
                }
 
-               $this->extractCredits( $path, $info );
                foreach ( $info as $key => $val ) {
                        if ( in_array( $key, self::$globalSettings ) ) {
                                $this->storeToArray( $path, "wg$key", $val, $this->globals );
@@ -215,13 +216,7 @@ class ExtensionProcessor implements Processor {
        }
 
        public function getRequirements( array $info ) {
-               $requirements = [];
-               $key = ExtensionRegistry::MEDIAWIKI_CORE;
-               if ( isset( $info['requires'][$key] ) ) {
-                       $requirements[$key] = $info['requires'][$key];
-               }
-
-               return $requirements;
+               return isset( $info['requires'] ) ? $info['requires'] : [];
        }
 
        protected function extractHooks( array $info ) {
@@ -335,6 +330,7 @@ class ExtensionProcessor implements Processor {
        /**
         * @param string $path
         * @param array $info
+        * @return string Name of thing
         * @throws Exception
         */
        protected function extractCredits( $path, array $info ) {
@@ -360,6 +356,8 @@ class ExtensionProcessor implements Processor {
 
                $this->credits[$name] = $credits;
                $this->globals['wgExtensionCredits'][$credits['type']][] = $credits;
+
+               return $name;
        }
 
        /**
index b5c70e9..344dd8f 100644 (file)
@@ -31,7 +31,7 @@ class ExtensionRegistry {
        /**
         * Bump whenever the registration cache needs resetting
         */
-       const CACHE_VERSION = 3;
+       const CACHE_VERSION = 5;
 
        /**
         * Special key that defines the merge strategy
@@ -40,11 +40,6 @@ class ExtensionRegistry {
         */
        const MERGE_STRATEGY = '_merge_strategy';
 
-       /**
-        * @var BagOStuff
-        */
-       protected $cache;
-
        /**
         * Array of loaded things, keyed by name, values are credits information
         *
@@ -59,6 +54,13 @@ class ExtensionRegistry {
         */
        protected $queued = [];
 
+       /**
+        * Whether we are done loading things
+        *
+        * @var bool
+        */
+       private $finished = false;
+
        /**
         * Items in the JSON file that aren't being
         * set as globals
@@ -83,16 +85,6 @@ class ExtensionRegistry {
                return self::$instance;
        }
 
-       public function __construct() {
-               // We use a try/catch because we don't want to fail here
-               // if $wgObjectCaches is not configured properly for APC setup
-               try {
-                       $this->cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
-               } catch ( MWException $e ) {
-                       $this->cache = new EmptyBagOStuff();
-               }
-       }
-
        /**
         * @param string $path Absolute path to the JSON file
         */
@@ -114,24 +106,42 @@ class ExtensionRegistry {
                $this->queued[$path] = $mtime;
        }
 
+       /**
+        * @throws MWException If the queue is already marked as finished (no further things should
+        *  be loaded then).
+        */
        public function loadFromQueue() {
                global $wgVersion;
                if ( !$this->queued ) {
                        return;
                }
 
+               if ( $this->finished ) {
+                       throw new MWException(
+                               "The following paths tried to load late: "
+                               . implode( ', ', array_keys( $this->queued ) )
+                       );
+               }
+
                // A few more things to vary the cache on
                $versions = [
                        'registration' => self::CACHE_VERSION,
                        'mediawiki' => $wgVersion
                ];
 
+               // We use a try/catch because we don't want to fail here
+               // if $wgObjectCaches is not configured properly for APC setup
+               try {
+                       $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
+               } catch ( MWException $e ) {
+                       $cache = new EmptyBagOStuff();
+               }
                // See if this queue is in APC
                $key = wfMemcKey(
                        'registration',
                        md5( json_encode( $this->queued + $versions ) )
                );
-               $data = $this->cache->get( $key );
+               $data = $cache->get( $key );
                if ( $data ) {
                        $this->exportExtractedData( $data );
                } else {
@@ -141,7 +151,7 @@ class ExtensionRegistry {
                        // did that, but it should be cached
                        $data['globals']['wgAutoloadClasses'] += $data['autoload'];
                        unset( $data['autoload'] );
-                       $this->cache->set( $key, $data, 60 * 60 * 24 );
+                       $cache->set( $key, $data, 60 * 60 * 24 );
                }
                $this->queued = [];
        }
@@ -164,6 +174,15 @@ class ExtensionRegistry {
                $this->queued = [];
        }
 
+       /**
+        * After this is called, no more extensions can be loaded
+        *
+        * @since 1.29
+        */
+       public function finish() {
+               $this->finished = true;
+       }
+
        /**
         * Process a queue of extensions and return their extracted data
         *
@@ -176,8 +195,9 @@ class ExtensionRegistry {
                $autoloadClasses = [];
                $autoloaderPaths = [];
                $processor = new ExtensionProcessor();
+               $versionChecker = new VersionChecker( $wgVersion );
+               $extDependencies = [];
                $incompatible = [];
-               $coreVersionParser = new CoreVersionChecker( $wgVersion );
                foreach ( $queue as $path => $mtime ) {
                        $json = file_get_contents( $path );
                        if ( $json === false ) {
@@ -188,25 +208,13 @@ class ExtensionRegistry {
                                throw new Exception( "$path is not a valid JSON file." );
                        }
 
-                       // Check any constraints against MediaWiki core
-                       $requires = $processor->getRequirements( $info );
-                       if ( isset( $requires[self::MEDIAWIKI_CORE] )
-                               && !$coreVersionParser->check( $requires[self::MEDIAWIKI_CORE] )
-                       ) {
-                               // Doesn't match, mark it as incompatible.
-                               $incompatible[] = "{$info['name']} is not compatible with the current "
-                                       . "MediaWiki core (version {$wgVersion}), it requires: " . $requires[self::MEDIAWIKI_CORE]
-                                       . '.';
-                               continue;
-                       }
-
                        if ( !isset( $info['manifest_version'] ) ) {
                                // For backwards-compatability, assume a version of 1
                                $info['manifest_version'] = 1;
                        }
                        $version = $info['manifest_version'];
                        if ( $version < self::OLDEST_MANIFEST_VERSION || $version > self::MANIFEST_VERSION ) {
-                               throw new Exception( "$path: unsupported manifest_version: {$version}" );
+                               $incompatible[] = "$path: unsupported manifest_version: {$version}";
                        }
 
                        $autoload = $this->processAutoLoader( dirname( $path ), $info );
@@ -214,12 +222,30 @@ class ExtensionRegistry {
                        $GLOBALS['wgAutoloadClasses'] += $autoload;
                        $autoloadClasses += $autoload;
 
+                       // get all requirements/dependencies for this extension
+                       $requires = $processor->getRequirements( $info );
+
+                       // validate the information needed and add the requirements
+                       if ( is_array( $requires ) && $requires && isset( $info['name'] ) ) {
+                               $extDependencies[$info['name']] = $requires;
+                       }
+
                        // Get extra paths for later inclusion
                        $autoloaderPaths = array_merge( $autoloaderPaths,
                                $processor->getExtraAutoloaderPaths( dirname( $path ), $info ) );
                        // Compatible, read and extract info
                        $processor->extractInfo( $path, $info, $version );
                }
+               $data = $processor->getExtractedInfo();
+
+               // check for incompatible extensions
+               $incompatible = array_merge(
+                       $incompatible,
+                       $versionChecker
+                               ->setLoadedExtensionsAndSkins( $data['credits'] )
+                               ->checkArray( $extDependencies )
+               );
+
                if ( $incompatible ) {
                        if ( count( $incompatible ) === 1 ) {
                                throw new Exception( $incompatible[0] );
@@ -227,7 +253,7 @@ class ExtensionRegistry {
                                throw new Exception( implode( "\n", $incompatible ) );
                        }
                }
-               $data = $processor->getExtractedInfo();
+
                // Need to set this so we can += to it later
                $data['globals']['wgAutoloadClasses'] = [];
                $data['autoload'] = $autoloadClasses;
@@ -285,9 +311,6 @@ class ExtensionRegistry {
                foreach ( $info['autoloaderPaths'] as $path ) {
                        require_once $path;
                }
-               foreach ( $info['callbacks'] as $cb ) {
-                       call_user_func( $cb );
-               }
 
                $this->loaded += $info['credits'];
                if ( $info['attributes'] ) {
@@ -297,6 +320,10 @@ class ExtensionRegistry {
                                $this->attributes = array_merge_recursive( $this->attributes, $info['attributes'] );
                        }
                }
+
+               foreach ( $info['callbacks'] as $name => $cb ) {
+                       call_user_func( $cb, $info['credits'][$name] );
+               }
        }
 
        /**
diff --git a/includes/registration/VersionChecker.php b/includes/registration/VersionChecker.php
new file mode 100644 (file)
index 0000000..5aaaa1b
--- /dev/null
@@ -0,0 +1,211 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @author Legoktm
+ * @author Florian Schmidt
+ */
+
+use Composer\Semver\VersionParser;
+use Composer\Semver\Constraint\Constraint;
+
+/**
+ * Provides functions to check a set of extensions with dependencies against
+ * a set of loaded extensions and given version information.
+ *
+ * @since 1.29
+ */
+class VersionChecker {
+       /**
+        * @var Constraint|bool representing $wgVersion
+        */
+       private $coreVersion = false;
+
+       /**
+        * @var array Loaded extensions
+        */
+       private $loaded = [];
+
+       /**
+        * @var VersionParser
+        */
+       private $versionParser;
+
+       /**
+        * @param string $coreVersion Current version of core
+        */
+       public function __construct( $coreVersion ) {
+               $this->versionParser = new VersionParser();
+               $this->setCoreVersion( $coreVersion );
+       }
+
+       /**
+        * Set an array with credits of all loaded extensions and skins.
+        *
+        * @param array $credits An array of installed extensions with credits of them
+        * @return VersionChecker $this
+        */
+       public function setLoadedExtensionsAndSkins( array $credits ) {
+               $this->loaded = $credits;
+
+               return $this;
+       }
+
+       /**
+        * Set MediaWiki core version.
+        *
+        * @param string $coreVersion Current version of core
+        */
+       private function setCoreVersion( $coreVersion ) {
+               try {
+                       $this->coreVersion = new Constraint(
+                               '==',
+                               $this->versionParser->normalize( $coreVersion )
+                       );
+                       $this->coreVersion->setPrettyString( $coreVersion );
+               } catch ( UnexpectedValueException $e ) {
+                       // Non-parsable version, don't fatal.
+               }
+       }
+
+       /**
+        * Check all given dependencies if they are compatible with the named
+        * installed extensions in the $credits array.
+        *
+        * Example $extDependencies:
+        *      {
+        *              'FooBar' => {
+        *                      'MediaWiki' => '>= 1.25.0',
+        *                      'extensions' => {
+        *                              'FooBaz' => '>= 1.25.0'
+        *                      },
+        *                      'skins' => {
+        *                              'BazBar' => '>= 1.0.0'
+        *                      }
+        *              }
+        *      }
+        *
+        * @param array $extDependencies All extensions that depend on other ones
+        * @return array
+        */
+       public function checkArray( array $extDependencies ) {
+               $errors = [];
+               foreach ( $extDependencies as $extension => $dependencies ) {
+                       foreach ( $dependencies as $dependencyType => $values ) {
+                               switch ( $dependencyType ) {
+                                       case ExtensionRegistry::MEDIAWIKI_CORE:
+                                               $mwError = $this->handleMediaWikiDependency( $values, $extension );
+                                               if ( $mwError !== false ) {
+                                                       $errors[] = $mwError;
+                                               }
+                                               break;
+                                       case 'extensions':
+                                       case 'skin':
+                                               foreach ( $values as $dependency => $constraint ) {
+                                                       $extError = $this->handleExtensionDependency( $dependency, $constraint, $extension );
+                                                       if ( $extError !== false ) {
+                                                               $errors[] = $extError;
+                                                       }
+                                               }
+                                               break;
+                                       default:
+                                               throw new UnexpectedValueException( 'Dependency type ' . $dependencyType .
+                                                       ' unknown in ' . $extension );
+                               }
+                       }
+               }
+
+               return $errors;
+       }
+
+       /**
+        * Handle a dependency to MediaWiki core. It will check, if a MediaWiki version constraint was
+        * set with self::setCoreVersion before this call (if not, it will return an empty array) and
+        * checks the version constraint given against it.
+        *
+        * @param string $constraint The required version constraint for this dependency
+        * @param string $checkedExt The Extension, which depends on this dependency
+        * @return bool|string false if no error, or a string with the message
+        */
+       private function handleMediaWikiDependency( $constraint, $checkedExt ) {
+               if ( $this->coreVersion === false ) {
+                       // Couldn't parse the core version, so we can't check anything
+                       return false;
+               }
+
+               // if the installed and required version are compatible, return an empty array
+               if ( $this->versionParser->parseConstraints( $constraint )
+                       ->matches( $this->coreVersion ) ) {
+                       return false;
+               }
+               // otherwise mark this as incompatible.
+               return "{$checkedExt} is not compatible with the current "
+                       . "MediaWiki core (version {$this->coreVersion->getPrettyString()}), it requires: "
+                       . "$constraint.";
+       }
+
+       /**
+        * Handle a dependency to another extension.
+        *
+        * @param string $dependencyName The name of the dependency
+        * @param string $constraint The required version constraint for this dependency
+        * @param string $checkedExt The Extension, which depends on this dependency
+        * @return bool|string false for no errors, or a string message
+        */
+       private function handleExtensionDependency( $dependencyName, $constraint, $checkedExt ) {
+               // Check if the dependency is even installed
+               if ( !isset( $this->loaded[$dependencyName] ) ) {
+                       return "{$checkedExt} requires {$dependencyName} to be installed.";
+               }
+               // Check if the dependency has specified a version
+               if ( !isset( $this->loaded[$dependencyName]['version'] ) ) {
+                       // If we depend upon any version, and none is set, that's fine.
+                       if ( $constraint === '*' ) {
+                               wfDebug( "{$dependencyName} does not expose it's version, but {$checkedExt}
+                                       mentions it with constraint '*'. Assume it's ok so." );
+                               return false;
+                       } else {
+                               // Otherwise, mark it as incompatible.
+                               return "{$dependencyName} does not expose it's version, but {$checkedExt}
+                                       requires: {$constraint}.";
+                       }
+               } else {
+                       // Try to get a constraint for the dependency version
+                       try {
+                               $installedVersion = new Constraint(
+                                       '==',
+                                       $this->versionParser->normalize( $this->loaded[$dependencyName]['version'] )
+                               );
+                       } catch ( UnexpectedValueException $e ) {
+                               // Non-parsable version, output an error message that the version
+                               // string is invalid
+                               return "$dependencyName does not have a valid version string.";
+                       }
+                       // Check if the constraint actually matches...
+                       if (
+                               !$this->versionParser->parseConstraints( $constraint )->matches( $installedVersion )
+                       ) {
+                               return "{$checkedExt} is not compatible with the current "
+                                       . "installed version of {$dependencyName} "
+                                       . "({$this->loaded[$dependencyName]['version']}), "
+                                       . "it requires: " . $constraint . '.';
+                       }
+               }
+
+               return false;
+       }
+}
index 1073de0..a55cbc1 100644 (file)
@@ -22,6 +22,7 @@
  * @author Trevor Parscal
  */
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
@@ -239,7 +240,7 @@ class ResourceLoader implements LoggerAwareInterface {
 
                if ( !$config ) {
                        $this->logger->debug( __METHOD__ . ' was called without providing a Config instance' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
 
@@ -254,7 +255,10 @@ class ResourceLoader implements LoggerAwareInterface {
                $this->register( include "$IP/resources/ResourcesOOUI.php" );
                // Register extension modules
                $this->register( $config->get( 'ResourceModules' ) );
-               Hooks::run( 'ResourceLoaderRegisterModules', [ &$this ] );
+
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $rl = $this;
+               Hooks::run( 'ResourceLoaderRegisterModules', [ &$rl ] );
 
                if ( $config->get( 'EnableJavaScriptTest' ) === true ) {
                        $this->registerTestModules();
@@ -390,8 +394,6 @@ class ResourceLoader implements LoggerAwareInterface {
                }
        }
 
-       /**
-        */
        public function registerTestModules() {
                global $IP;
 
@@ -405,7 +407,9 @@ class ResourceLoader implements LoggerAwareInterface {
                $testModules = [];
                $testModules['qunit'] = [];
                // Get other test suites (e.g. from extensions)
-               Hooks::run( 'ResourceLoaderTestModules', [ &$testModules, &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $rl = $this;
+               Hooks::run( 'ResourceLoaderTestModules', [ &$testModules, &$rl ] );
 
                // Add the testrunner (which configures QUnit) to the dependencies.
                // Since it must be ready before any of the test suites are executed.
@@ -606,6 +610,25 @@ class ResourceLoader implements LoggerAwareInterface {
                return Wikimedia\base_convert( $hash, 16, 36, 7 );
        }
 
+       /**
+        * Add an error to the 'errors' array and log it.
+        *
+        * Should only be called from within respond().
+        *
+        * @since 1.29
+        * @param Exception $e
+        * @param string $msg
+        * @param array $context
+        */
+       protected function outputErrorAndLog( Exception $e, $msg, array $context = [] ) {
+               MWExceptionHandler::logException( $e );
+               $this->logger->warning(
+                       $msg,
+                       $context + [ 'exception' => $e ]
+               );
+               $this->errors[] = self::formatExceptionNoComment( $e );
+       }
+
        /**
         * Helper method to get and combine versions of multiple modules.
         *
@@ -619,7 +642,20 @@ class ResourceLoader implements LoggerAwareInterface {
                        return '';
                }
                $hashes = array_map( function ( $module ) use ( $context ) {
-                       return $this->getModule( $module )->getVersionHash( $context );
+                       try {
+                               return $this->getModule( $module )->getVersionHash( $context );
+                       } catch ( Exception $e ) {
+                               // If modules fail to compute a version, do still consider the versions
+                               // of other modules - don't set an empty string E-Tag for the whole request.
+                               // See also T152266 and StartupModule::getModuleRegistrations().
+                               $this->outputErrorAndLog( $e,
+                                       'Calculating version for "{module}" failed: {exception}',
+                                       [
+                                               'module' => $module,
+                                       ]
+                               );
+                               return '';
+                       }
                }, $moduleNames );
                return self::makeHash( implode( '', $hashes ) );
        }
@@ -694,11 +730,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        // Preload for getCombinedVersion() and for batch makeModuleResponse()
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
-                       MWExceptionHandler::logException( $e );
-                       $this->logger->warning( 'Preloading module info failed: {exception}', [
-                               'exception' => $e
-                       ] );
-                       $this->errors[] = self::formatExceptionNoComment( $e );
+                       $this->outputErrorAndLog( $e, 'Preloading module info failed: {exception}' );
                }
 
                // Combine versions to propagate cache invalidation
@@ -706,11 +738,7 @@ class ResourceLoader implements LoggerAwareInterface {
                try {
                        $versionHash = $this->getCombinedVersion( $context, array_keys( $modules ) );
                } catch ( Exception $e ) {
-                       MWExceptionHandler::logException( $e );
-                       $this->logger->warning( 'Calculating version hash failed: {exception}', [
-                               'exception' => $e
-                       ] );
-                       $this->errors[] = self::formatExceptionNoComment( $e );
+                       $this->outputErrorAndLog( $e, 'Calculating version hash failed: {exception}' );
                }
 
                // See RFC 2616 § 3.11 Entity Tags
@@ -959,7 +987,9 @@ class ResourceLoader implements LoggerAwareInterface {
                        return MWExceptionHandler::getPublicLogMessage( $e );
                }
 
-               return MWExceptionHandler::getLogMessage( $e );
+               return MWExceptionHandler::getLogMessage( $e ) .
+                       "\nBacktrace:\n" .
+                       MWExceptionHandler::getRedactedTraceAsString( $e );
        }
 
        /**
@@ -1060,11 +1090,7 @@ MESSAGE;
                                $out .= $strContent;
 
                        } catch ( Exception $e ) {
-                               MWExceptionHandler::logException( $e );
-                               $this->logger->warning( 'Generating module package failed: {exception}', [
-                                       'exception' => $e
-                               ] );
-                               $this->errors[] = self::formatExceptionNoComment( $e );
+                               $this->outputErrorAndLog( $e, 'Generating module package failed: {exception}' );
 
                                // Respond to client with error-state instead of module implementation
                                $states[$name] = 'error';
index 91e0b02..29f8cfe 100644 (file)
@@ -56,7 +56,7 @@ class ResourceLoaderClientHtml {
 
        /**
         * @param ResourceLoaderContext $context
-        * @param aray $target [optional] Custom 'target' parameter for the startup module
+        * @param string|null $target [optional] Custom 'target' parameter for the startup module
         */
        public function __construct( ResourceLoaderContext $context, $target = null ) {
                $this->context = $context;
@@ -365,7 +365,11 @@ class ResourceLoaderClientHtml {
                $rl = $mainContext->getResourceLoader();
                $chunks = [];
 
+               // Sort module names so requests are more uniform
+               sort( $modules );
+
                if ( $mainContext->getDebug() && count( $modules ) > 1 ) {
+
                        $chunks = [];
                        // Recursively call us for every item
                        foreach ( $modules as $name ) {
@@ -374,8 +378,6 @@ class ResourceLoaderClientHtml {
                        return new WrappedStringList( "\n", $chunks );
                }
 
-               // Sort module names so requests are more uniform
-               sort( $modules );
                // Create keyed-by-source and then keyed-by-group list of module objects from modules list
                $sortedModules = [];
                foreach ( $modules as $name ) {
index b17200f..a1a89cb 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Object passed around to modules which contains information about the state
@@ -137,7 +138,7 @@ class ResourceLoaderContext {
         */
        public static function newDummyContext() {
                return new self( new ResourceLoader(
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+                       MediaWikiServices::getInstance()->getMainConfig(),
                        LoggerFactory::getInstance( 'resourceloader' )
                ), new FauxRequest( [] ) );
        }
index 4456517..6d2bc0d 100644 (file)
@@ -22,6 +22,7 @@
  * @author Roan Kattouw
  */
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
@@ -187,7 +188,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
        public function getConfig() {
                if ( $this->config === null ) {
                        // Ugh, fall back to default
-                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                return $this->config;
@@ -460,29 +461,47 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * @param array $localFileRefs List of files
         */
        protected function saveFileDependencies( ResourceLoaderContext $context, $localFileRefs ) {
-               // Normalise array
-               $localFileRefs = array_values( array_unique( $localFileRefs ) );
-               sort( $localFileRefs );
 
                try {
+                       // Related bugs and performance considerations:
+                       // 1. Don't needlessly change the database value with the same list in a
+                       //    different order or with duplicates.
+                       // 2. Use relative paths to avoid ghost entries when $IP changes. (T111481)
+                       // 3. Don't needlessly replace the database with the same value
+                       //    just because $IP changed (e.g. when upgrading a wiki).
+                       // 4. Don't create an endless replace loop on every request for this
+                       //    module when '../' is used anywhere. Even though both are expanded
+                       //    (one expanded by getFileDependencies from the DB, the other is
+                       //    still raw as originally read by RL), the latter has not
+                       //    been normalized yet.
+
+                       // Normalise
+                       $localFileRefs = array_values( array_unique( $localFileRefs ) );
+                       sort( $localFileRefs );
+                       $localPaths = self::getRelativePaths( $localFileRefs );
+
+                       $storedPaths = self::getRelativePaths( $this->getFileDependencies( $context ) );
                        // If the list has been modified since last time we cached it, update the cache
-                       if ( $localFileRefs !== $this->getFileDependencies( $context ) ) {
+                       if ( $localPaths !== $storedPaths ) {
+                               $vary = $context->getSkin() . '|' . $context->getLanguage();
                                $cache = ObjectCache::getLocalClusterInstance();
-                               $key = $cache->makeKey( __METHOD__, $this->getName() );
+                               $key = $cache->makeKey( __METHOD__, $this->getName(), $vary );
                                $scopeLock = $cache->getScopedLock( $key, 0 );
                                if ( !$scopeLock ) {
                                        return; // T124649; avoid write slams
                                }
 
-                               $vary = $context->getSkin() . '|' . $context->getLanguage();
+                               $deps = FormatJson::encode( $localPaths );
                                $dbw = wfGetDB( DB_MASTER );
-                               $dbw->replace( 'module_deps',
-                                       [ [ 'md_module', 'md_skin' ] ],
+                               $dbw->upsert( 'module_deps',
                                        [
                                                'md_module' => $this->getName(),
                                                'md_skin' => $vary,
-                                               // Use relative paths to avoid ghost entries when $IP changes (T111481)
-                                               'md_deps' => FormatJson::encode( self::getRelativePaths( $localFileRefs ) ),
+                                               'md_deps' => $deps,
+                                       ],
+                                       [ 'md_module', 'md_skin' ],
+                                       [
+                                               'md_deps' => $deps,
                                        ]
                                );
 
index 8970620..a99305c 100644 (file)
@@ -194,7 +194,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * @return string JavaScript code for registering all modules with the client loader
         */
        public function getModuleRegistrations( ResourceLoaderContext $context ) {
-
                $resourceLoader = $context->getResourceLoader();
                $target = $context->getRequest()->getVal( 'target', 'desktop' );
                // Bypass target filter if this request is Special:JavaScriptTest.
@@ -202,6 +201,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                $byPassTargetFilter = $this->getConfig()->get( 'EnableJavaScriptTest' ) && $target === 'test';
 
                $out = '';
+               $states = [];
                $registryData = [];
 
                // Get registry data
@@ -219,8 +219,23 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                continue;
                        }
 
-                       $versionHash = $module->getVersionHash( $context );
-                       if ( strlen( $versionHash ) !== 7 ) {
+                       try {
+                               $versionHash = $module->getVersionHash( $context );
+                       } catch ( Exception $e ) {
+                               // See also T152266 and ResourceLoader::getCombinedVersion()
+                               MWExceptionHandler::logException( $e );
+                               $context->getLogger()->warning(
+                                       'Calculating version for "{module}" failed: {exception}',
+                                       [
+                                               'module' => $name,
+                                               'exception' => $e,
+                                       ]
+                               );
+                               $versionHash = '';
+                               $states[$name] = 'error';
+                       }
+
+                       if ( $versionHash !== '' && strlen( $versionHash ) !== 7 ) {
                                $context->getLogger()->warning(
                                        "Module '{module}' produced an invalid version hash: '{version}'.",
                                        [
@@ -270,6 +285,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                $out .= "\n" . ResourceLoader::makeLoaderRegisterScript( $registrations );
 
+               if ( $states ) {
+                       $out .= "\n" . ResourceLoader::makeLoaderStateScript( $states );
+               }
+
                return $out;
        }
 
diff --git a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
deleted file mode 100644 (file)
index aef1c74..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * ResourceLoader module for user preference customizations.
- *
- * 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 Trevor Parscal
- * @author Roan Kattouw
- */
-
-/**
- * Module for user preference customizations
- */
-class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
-
-       protected $origin = self::ORIGIN_CORE_INDIVIDUAL;
-
-       /**
-        * @return bool
-        */
-       public function enableModuleContentVersion() {
-               return true;
-       }
-
-       /**
-        * @param ResourceLoaderContext $context
-        * @return array
-        */
-       public function getStyles( ResourceLoaderContext $context ) {
-               if ( !$this->getConfig()->get( 'AllowUserCssPrefs' ) ) {
-                       return [];
-               }
-
-               $options = $context->getUserObj()->getOptions();
-
-               // Build CSS rules
-               $rules = [];
-
-               // Underline: 2 = skin default, 1 = always, 0 = never
-               if ( $options['underline'] < 2 ) {
-                       $rules[] = "a { text-decoration: " .
-                               ( $options['underline'] ? 'underline' : 'none' ) . "; }";
-               }
-               $style = implode( "\n", $rules );
-               if ( $this->getFlip( $context ) ) {
-                       $style = CSSJanus::transform( $style, true, false );
-               }
-               return [ 'all' => $style ];
-       }
-
-       /**
-        * @param ResourceLoaderContext $context
-        * @return bool
-        */
-       public function isKnownEmpty( ResourceLoaderContext $context ) {
-               $styles = $this->getStyles( $context );
-               return isset( $styles['all'] ) && $styles['all'] === '';
-       }
-
-       /**
-        * @return string
-        */
-       public function getGroup() {
-               return 'private';
-       }
-
-       /**
-        * @return string
-        */
-       public function getType() {
-               return self::LOAD_STYLES;
-       }
-}
index 14d6e05..e8574f4 100644 (file)
@@ -357,6 +357,11 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        }
                }
 
+               if ( !$wikiModules ) {
+                       // Nothing to preload
+                       return;
+               }
+
                $pageNames = array_keys( $allPages );
                sort( $pageNames );
                $hash = sha1( implode( '|', $pageNames ) );
index 2d0d690..ab74dbd 100644 (file)
@@ -68,14 +68,14 @@ class RevDelArchiveItem extends RevDelRevisionItem {
        }
 
        protected function getRevisionLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() );
 
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return $date;
+                       return htmlspecialchars( $date );
                }
 
-               return Linker::link(
+               return $this->getLinkRenderer()->makeLink(
                        SpecialPage::getTitleFor( 'Undelete' ),
                        $date,
                        [],
@@ -91,9 +91,9 @@ class RevDelArchiveItem extends RevDelRevisionItem {
                        return $this->list->msg( 'diff' )->escaped();
                }
 
-               return Linker::link(
+               return $this->getLinkRenderer()->makeLink(
                        SpecialPage::getTitleFor( 'Undelete' ),
-                       $this->list->msg( 'diff' )->escaped(),
+                       $this->list->msg( 'diff' )->text(),
                        [],
                        [
                                'target' => $this->list->title->getPrefixedText(),
index 52df2e3..32d4891 100644 (file)
@@ -69,16 +69,16 @@ class RevDelArchivedFileItem extends RevDelFileItem {
        }
 
        protected function getLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->file->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->file->getTimestamp(), $this->list->getUser() );
 
                # Hidden files...
                if ( !$this->canViewContent() ) {
-                       $link = $date;
+                       $link = htmlspecialchars( $date );
                } else {
                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
                        $key = $this->file->getKey();
-                       $link = Linker::link( $undelete, $date, [],
+                       $link = $this->getLinkRenderer()->makeLink( $undelete, $date, [],
                                [
                                        'target' => $this->list->title->getPrefixedText(),
                                        'file' => $key,
@@ -102,10 +102,10 @@ class RevDelArchivedFileItem extends RevDelFileItem {
                        'width' => $file->getWidth(),
                        'height' => $file->getHeight(),
                        'size' => $file->getSize(),
+                       'userhidden' => (bool)$file->isDeleted( Revision::DELETED_USER ),
+                       'commenthidden' => (bool)$file->isDeleted( Revision::DELETED_COMMENT ),
+                       'contenthidden' => (bool)$this->isDeleted(),
                ];
-               $ret += $file->isDeleted( Revision::DELETED_USER ) ? [ 'userhidden' => '' ] : [];
-               $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? [ 'commenthidden' => '' ] : [];
-               $ret += $this->isDeleted() ? [ 'contenthidden' => '' ] : [];
                if ( $this->canViewContent() ) {
                        $ret += [
                                'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL(
index ff01cee..9beafc9 100644 (file)
@@ -116,19 +116,19 @@ class RevDelFileItem extends RevDelItem {
         * @return string
         */
        protected function getLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->file->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->file->getTimestamp(), $this->list->getUser() );
 
                if ( !$this->isDeleted() ) {
                        # Regular files...
-                       return Html::rawElement( 'a', [ 'href' => $this->file->getUrl() ], $date );
+                       return Html::element( 'a', [ 'href' => $this->file->getUrl() ], $date );
                }
 
                # Hidden files...
                if ( !$this->canViewContent() ) {
-                       $link = $date;
+                       $link = htmlspecialchars( $date );
                } else {
-                       $link = Linker::link(
+                       $link = $this->getLinkRenderer()->makeLink(
                                SpecialPage::getTitleFor( 'Revisiondelete' ),
                                $date,
                                [],
@@ -202,10 +202,10 @@ class RevDelFileItem extends RevDelItem {
                        'width' => $file->getWidth(),
                        'height' => $file->getHeight(),
                        'size' => $file->getSize(),
+                       'userhidden' => (bool)$file->isDeleted( Revision::DELETED_USER ),
+                       'commenthidden' => (bool)$file->isDeleted( Revision::DELETED_COMMENT ),
+                       'contenthidden' => (bool)$this->isDeleted(),
                ];
-               $ret += $file->isDeleted( Revision::DELETED_USER ) ? [ 'userhidden' => '' ] : [];
-               $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? [ 'commenthidden' => '' ] : [];
-               $ret += $this->isDeleted() ? [ 'contenthidden' => '' ] : [];
                if ( !$this->isDeleted() ) {
                        $ret += [
                                'url' => $file->getUrl(),
index 674846d..64a6aec 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Abstract base class for a list of deletable items. The list class
  * needs to be able to make a query from a set of identifiers to pull
@@ -97,8 +99,9 @@ abstract class RevDelList extends RevisionListBase {
         *
         * @param array $params Associative array of parameters. Members are:
         *     value:         ExtractBitParams() bitfield array
-        *     comment:       The log comment.
+        *     comment:       The log comment
         *     perItemStatus: Set if you want per-item status reports
+        *     tags:          The array of change tags to apply to the log entry
         * @return Status
         * @since 1.23 Added 'perItemStatus' param
         */
@@ -254,7 +257,8 @@ abstract class RevDelList extends RevisionListBase {
                $status->merge( $this->doPreCommitUpdates() );
                if ( !$status->isOK() ) {
                        // Fatal error, such as no configured archive directory or I/O failures
-                       wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
+                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                       $lbFactory->rollbackMasterChanges( __METHOD__ );
                        return $status;
                }
 
@@ -269,7 +273,8 @@ abstract class RevDelList extends RevisionListBase {
                                'comment' => $comment,
                                'ids' => $idsForLog,
                                'authorIds' => $authorIds,
-                               'authorIPs' => $authorIPs
+                               'authorIPs' => $authorIPs,
+                               'tags' => isset( $params['tags'] ) ? $params['tags'] : [],
                        ]
                );
 
@@ -327,6 +332,7 @@ abstract class RevDelList extends RevisionListBase {
         *     comment:         The log comment
         *     authorsIds:      The array of the user IDs of the offenders
         *     authorsIPs:      The array of the IP/anon user offenders
+        *     tags:            The array of change tags to apply to the log entry
         * @throws MWException
         */
        private function updateLog( $logType, $params ) {
@@ -349,6 +355,8 @@ abstract class RevDelList extends RevisionListBase {
                        'target_author_id' => $params['authorIds'],
                        'target_author_ip' => $params['authorIPs'],
                ] );
+               // Apply change tags to the log entry
+               $logEntry->setTags( $params['tags'] );
                $logId = $logEntry->insert();
                $logEntry->publish( $logId );
        }
index 1ea7271..047d6cf 100644 (file)
@@ -92,9 +92,9 @@ class RevDelLogItem extends RevDelItem {
                $formatter->setAudience( LogFormatter::FOR_THIS_USER );
 
                // Log link for this page
-               $loglink = Linker::link(
+               $loglink = $this->getLinkRenderer()->makeLink(
                        SpecialPage::getTitleFor( 'Log' ),
-                       $this->list->msg( 'log' )->escaped(),
+                       $this->list->msg( 'log' )->text(),
                        [],
                        [ 'page' => $title->getPrefixedText() ]
                );
@@ -119,16 +119,10 @@ class RevDelLogItem extends RevDelItem {
                        'id' => $logEntry->getId(),
                        'type' => $logEntry->getType(),
                        'action' => $logEntry->getSubtype(),
+                       'userhidden' => (bool)$logEntry->isDeleted( LogPage::DELETED_USER ),
+                       'commenthidden' => (bool)$logEntry->isDeleted( LogPage::DELETED_COMMENT ),
+                       'actionhidden' => (bool)$logEntry->isDeleted( LogPage::DELETED_ACTION ),
                ];
-               $ret += $logEntry->isDeleted( LogPage::DELETED_USER )
-                       ? [ 'userhidden' => '' ]
-                       : [];
-               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT )
-                       ? [ 'commenthidden' => '' ]
-                       : [];
-               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION )
-                       ? [ 'actionhidden' => '' ]
-                       : [];
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
                        $ret['params'] = LogFormatter::newFromEntry( $logEntry )->formatParametersForApi();
index d799113..a9753b4 100644 (file)
@@ -107,14 +107,14 @@ class RevDelRevisionItem extends RevDelItem {
         * @return string
         */
        protected function getRevisionLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() );
 
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return $date;
+                       return htmlspecialchars( $date );
                }
 
-               return Linker::linkKnown(
+               return $this->getLinkRenderer()->makeKnownLink(
                        $this->list->title,
                        $date,
                        [],
@@ -134,9 +134,9 @@ class RevDelRevisionItem extends RevDelItem {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->list->msg( 'diff' )->escaped();
                } else {
-                       return Linker::linkKnown(
+                       return $this->getLinkRenderer()->makeKnownLink(
                                        $this->list->title,
-                                       $this->list->msg( 'diff' )->escaped(),
+                                       $this->list->msg( 'diff' )->text(),
                                        [],
                                        [
                                                'diff' => $this->revision->getId(),
@@ -188,10 +188,10 @@ class RevDelRevisionItem extends RevDelItem {
                $ret = [
                        'id' => $rev->getId(),
                        'timestamp' => wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ),
+                       'userhidden' => (bool)$rev->isDeleted( Revision::DELETED_USER ),
+                       'commenthidden' => (bool)$rev->isDeleted( Revision::DELETED_COMMENT ),
+                       'texthidden' => (bool)$rev->isDeleted( Revision::DELETED_TEXT ),
                ];
-               $ret += $rev->isDeleted( Revision::DELETED_USER ) ? [ 'userhidden' => '' ] : [];
-               $ret += $rev->isDeleted( Revision::DELETED_COMMENT ) ? [ 'commenthidden' => '' ] : [];
-               $ret += $rev->isDeleted( Revision::DELETED_TEXT ) ? [ 'texthidden' => '' ] : [];
                if ( $rev->userCan( Revision::DELETED_USER, $user ) ) {
                        $ret += [
                                'userid' => $rev->getUser( Revision::FOR_THIS_USER ),
index a2a6760..3ee3ed5 100644 (file)
@@ -21,7 +21,7 @@ class DummySearchIndexFieldDefinition extends SearchIndexFieldDefinition {
                ];
 
                foreach ( $this->subfields as $subfield ) {
-                       $mapping['subfields'][] = $subfield->getMapping();
+                       $mapping['subfields'][] = $subfield->getMapping( $engine );
                }
 
                return $mapping;
index 350b780..df58e71 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * Augment search results.
- *
  */
 interface ResultAugmentor {
        /**
index 94710a8..e2d79a9 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * Augment search results.
- *
  */
 interface ResultSetAugmentor {
        /**
index 90bfebd..9817b6c 100644 (file)
@@ -104,12 +104,25 @@ abstract class SearchEngine {
         * @since 1.18
         * @param string $feature
         * @param mixed $data
-        * @return bool
         */
        public function setFeatureData( $feature, $data ) {
                $this->features[$feature] = $data;
        }
 
+       /**
+        * Way to retrieve custom data set by setFeatureData
+        * or by the engine itself.
+        * @since 1.29
+        * @param string $feature feature name
+        * @return mixed the feature value or null if unset
+        */
+       public function getFeatureData( $feature ) {
+               if ( isset ( $this->features[$feature] ) ) {
+                       return $this->features[$feature];
+               }
+               return null;
+       }
+
        /**
         * When overridden in derived class, performs database-specific conversions
         * on text to be used for searching or updating search index.
@@ -707,8 +720,21 @@ abstract class SearchEngine {
        public function getSearchIndexFields() {
                $models = ContentHandler::getContentModels();
                $fields = [];
+               $seenHandlers = new SplObjectStorage();
                foreach ( $models as $model ) {
-                       $handler = ContentHandler::getForModelID( $model );
+                       try {
+                               $handler = ContentHandler::getForModelID( $model );
+                       }
+                       catch ( MWUnknownContentModelException $e ) {
+                               // If we can find no handler, ignore it
+                               continue;
+                       }
+                       // Several models can have the same handler, so avoid processing it repeatedly
+                       if ( $seenHandlers->contains( $handler ) ) {
+                               // We already did this one
+                               continue;
+                       }
+                       $seenHandlers->attach( $handler );
                        $handlerFields = $handler->getFieldsForSearchIndex( $this );
                        foreach ( $handlerFields as $fieldName => $fieldData ) {
                                if ( empty( $fields[$fieldName] ) ) {
index dd41a6e..d0e3a24 100644 (file)
@@ -75,10 +75,10 @@ class SearchHighlighter {
                        if ( preg_match( $spat, $text, $matches, PREG_OFFSET_CAPTURE, $start ) ) {
                                $epat = '';
                                foreach ( $matches as $key => $val ) {
-                                       if ( $key > 0 && $val[1] != - 1 ) {
+                                       if ( $key > 0 && $val[1] != -1 ) {
                                                if ( $key == 2 ) {
                                                        // see if this is an image link
-                                                       $ns = substr( $val[0], 2, - 1 );
+                                                       $ns = substr( $val[0], 2, -1 );
                                                        if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) {
                                                                break;
                                                        }
@@ -252,10 +252,10 @@ class SearchHighlighter {
 
                // $snippets = array_map( 'htmlspecialchars', $extended );
                $snippets = $extended;
-               $last = - 1;
+               $last = -1;
                $extract = '';
                foreach ( $snippets as $index => $line ) {
-                       if ( $last == - 1 ) {
+                       if ( $last == -1 ) {
                                $extract .= $line; // first line
                        } elseif ( $last + 1 == $index
                                && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] )
index 80a437b..4e7c782 100644 (file)
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
  */
 
 /**
  * A search suggestion
- *
  */
 class SearchSuggestion {
        /**
index 5a24fd6..caad388 100644 (file)
@@ -17,7 +17,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
  */
 
 /**
index b8e480f..7cc8509 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace MediaWiki\Session;
 
+use MediaWiki\MediaWikiServices;
 use MWException;
 use Psr\Log\LoggerInterface;
 use BagOStuff;
@@ -152,7 +153,7 @@ final class SessionManager implements SessionManagerInterface {
                                );
                        }
                } else {
-                       $this->config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                if ( isset( $options['logger'] ) ) {
@@ -772,7 +773,8 @@ final class SessionManager implements SessionManagerInterface {
                                        return $failHandler();
                                }
                        } elseif ( !$info->getUserInfo()->isVerified() ) {
-                               $this->logger->warning(
+                               // probably just a session timeout
+                               $this->logger->info(
                                        'Session "{session}": Unverified user provided and no metadata to auth it',
                                        [
                                                'session' => $info,
index e5247f2..e106f37 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * Represents the site configuration of a wiki.
  * Holds a list of sites (ie SiteList), stored in the database.
index 198d331..2c7965c 100644 (file)
@@ -37,7 +37,7 @@ class HashSiteStore implements SiteStore {
        private $sites = [];
 
        /**
-        * @param array $sites
+        * @param Site[] $sites
         */
        public function __construct( $sites = [] ) {
                $this->saveSites( $sites );
index 65eb9b7..eef421c 100644 (file)
@@ -112,7 +112,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        $toolbox['info']['id'] = 't-info';
                }
 
-               Hooks::run( 'BaseTemplateToolbox', [ &$this, &$toolbox ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $template = $this;
+               Hooks::run( 'BaseTemplateToolbox', [ &$template, &$toolbox ] );
                return $toolbox;
        }
 
@@ -227,7 +229,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        ob_start();
                        // We pass an extra 'true' at the end so extensions using BaseTemplateToolbox
                        // can abort and avoid outputting double toolbox links
-                       Hooks::run( 'SkinTemplateToolboxEnd', [ &$this, true ] );
+                       // Avoid PHP 7.1 warning from passing $this by reference
+                       $template = $this;
+                       Hooks::run( 'SkinTemplateToolboxEnd', [ &$template, true ] );
                        $hookContents = ob_get_contents();
                        ob_end_clean();
                        if ( !trim( $hookContents ) ) {
index e5d272c..6686ae6 100644 (file)
@@ -17,6 +17,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Generic wrapper for template functions, with interface
@@ -36,7 +37,7 @@ abstract class QuickTemplate {
                $this->translator = new MediaWikiI18N();
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' was called with no Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
        }
index 9c5600d..bc6dfca 100644 (file)
@@ -61,7 +61,7 @@ class SkinTemplate extends Skin {
         *
         * @param OutputPage $out
         */
-       function setupSkinUserCss( OutputPage $out ) {
+       public function setupSkinUserCss( OutputPage $out ) {
                $moduleStyles = [
                        'mediawiki.legacy.shared',
                        'mediawiki.legacy.commonPrint',
@@ -489,8 +489,10 @@ class SkinTemplate extends Skin {
                $tpl->set( 'debughtml', $this->generateDebugHTML() );
                $tpl->set( 'reporttime', wfReportTime() );
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                // original version by hansm
-               if ( !Hooks::run( 'SkinTemplateOutputPageBeforeExec', [ &$this, &$tpl ] ) ) {
+               if ( !Hooks::run( 'SkinTemplateOutputPageBeforeExec', [ &$skinTemplate, &$tpl ] ) ) {
                        wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
                }
 
@@ -768,8 +770,10 @@ class SkinTemplate extends Skin {
                                MWNamespace::getSubject( $title->getNamespace() ) );
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                $result = [];
-               if ( !Hooks::run( 'SkinTemplateTabAction', [ &$this,
+               if ( !Hooks::run( 'SkinTemplateTabAction', [ &$skinTemplate,
                                $title, $message, $selected, $checkEdit,
                                &$classes, &$query, &$text, &$result ] ) ) {
                        return $result;
@@ -870,8 +874,10 @@ class SkinTemplate extends Skin {
 
                $userCanRead = $title->quickUserCan( 'read', $user );
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                $preventActiveTabs = false;
-               Hooks::run( 'SkinTemplatePreventOtherActiveTabs', [ &$this, &$preventActiveTabs ] );
+               Hooks::run( 'SkinTemplatePreventOtherActiveTabs', [ &$skinTemplate, &$preventActiveTabs ] );
 
                // Checks if page is some kind of content
                if ( $title->canExist() ) {
@@ -919,19 +925,18 @@ class SkinTemplate extends Skin {
                                        $content_navigation['views']['view']['redundant'] = true;
                                }
 
-                               $isForeignFile = $title->inNamespace( NS_FILE ) && $this->canUseWikiPage() &&
-                                       $this->getWikiPage() instanceof WikiFilePage && !$this->getWikiPage()->isLocal();
+                               $page = $this->canUseWikiPage() ? $this->getWikiPage() : false;
+                               $isRemoteContent = $page && !$page->isLocal();
 
                                // If it is a non-local file, show a link to the file in its own repository
                                // @todo abstract this for remote content that isn't a file
-                               if ( $isForeignFile ) {
-                                       $file = $this->getWikiPage()->getFile();
+                               if ( $isRemoteContent ) {
                                        $content_navigation['views']['view-foreign'] = [
                                                'class' => '',
                                                'text' => wfMessageFallback( "$skname-view-foreign", 'view-foreign' )->
                                                        setContext( $this->getContext() )->
-                                                       params( $file->getRepo()->getDisplayName() )->text(),
-                                               'href' => $file->getDescriptionUrl(),
+                                                       params( $page->getWikiDisplayName() )->text(),
+                                               'href' => $page->getSourceURL(),
                                                'primary' => false,
                                        ];
                                }
@@ -955,9 +960,9 @@ class SkinTemplate extends Skin {
                                                        && $title->getDefaultMessageText() !== false
                                                )
                                        ) {
-                                               $msgKey = $isForeignFile ? 'edit-local' : 'edit';
+                                               $msgKey = $isRemoteContent ? 'edit-local' : 'edit';
                                        } else {
-                                               $msgKey = $isForeignFile ? 'create-local' : 'create';
+                                               $msgKey = $isRemoteContent ? 'create-local' : 'create';
                                        }
                                        $content_navigation['views']['edit'] = [
                                                'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection )
@@ -967,7 +972,7 @@ class SkinTemplate extends Skin {
                                                'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )
                                                        ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
-                                               'primary' => !$isForeignFile, // don't collapse this in vector
+                                               'primary' => !$isRemoteContent, // don't collapse this in vector
                                        ];
 
                                        // section link
@@ -1075,7 +1080,9 @@ class SkinTemplate extends Skin {
                                }
                        }
 
-                       Hooks::run( 'SkinTemplateNavigation', [ &$this, &$content_navigation ] );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $skinTemplate = $this;
+                       Hooks::run( 'SkinTemplateNavigation', [ &$skinTemplate, &$content_navigation ] );
 
                        if ( $userCanRead && !$wgDisableLangConversion ) {
                                $pageLang = $title->getPageLanguage();
@@ -1117,12 +1124,16 @@ class SkinTemplate extends Skin {
                                'context' => 'subject'
                        ];
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $skinTemplate = $this;
                        Hooks::run( 'SkinTemplateNavigation::SpecialPage',
-                               [ &$this, &$content_navigation ] );
+                               [ &$skinTemplate, &$content_navigation ] );
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                // Equiv to SkinTemplateContentActions
-               Hooks::run( 'SkinTemplateNavigation::Universal', [ &$this, &$content_navigation ] );
+               Hooks::run( 'SkinTemplateNavigation::Universal', [ &$skinTemplate, &$content_navigation ] );
 
                // Setup xml ids and tooltip info
                foreach ( $content_navigation as $section => &$links ) {
@@ -1255,9 +1266,11 @@ class SkinTemplate extends Skin {
                                ];
                        }
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $skinTemplate = $this;
                        // Use the copy of revision ID in case this undocumented, shady hook tries to mess with internals
                        Hooks::run( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink',
-                               [ &$this, &$nav_urls, &$revid, &$revid ] );
+                               [ &$skinTemplate, &$nav_urls, &$revid, &$revid ] );
                }
 
                if ( $out->isArticleRelated() ) {
@@ -1270,7 +1283,7 @@ class SkinTemplate extends Skin {
                                'href' => $this->getTitle()->getLocalURL( "action=info" )
                        ];
 
-                       if ( $this->getTitle()->exists() ) {
+                       if ( $this->getTitle()->exists() || $this->getTitle()->inNamespace( NS_CATEGORY ) ) {
                                $nav_urls['recentchangeslinked'] = [
                                        'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL()
                                ];
@@ -1309,12 +1322,14 @@ class SkinTemplate extends Skin {
                        if ( !$user->isAnon() ) {
                                $sur = new UserrightsPage;
                                $sur->setContext( $this->getContext() );
-                               if ( $sur->userCanExecute( $this->getUser() ) ) {
-                                       $nav_urls['userrights'] = [
-                                               'text' => $this->msg( 'tool-link-userrights', $this->getUser()->getName() )->text(),
-                                               'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
-                                       ];
-                               }
+                               $canChange = $sur->userCanChangeRights( $user );
+                               $nav_urls['userrights'] = [
+                                       'text' => $this->msg(
+                                               $canChange ? 'tool-link-userrights' : 'tool-link-userrights-readonly',
+                                               $rootUser
+                                       )->text(),
+                                       'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
+                               ];
                        }
                }
 
index bdf7638..fbc3022 100644 (file)
@@ -198,9 +198,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
         * @param string $subPage Subpage of the special page.
         * @return string an AuthManager::ACTION_* constant.
         */
-       protected function getDefaultAction( $subPage ) {
-               throw new BadMethodCallException( 'Subclass did not implement getDefaultAction' );
-       }
+       abstract protected function getDefaultAction( $subPage );
 
        /**
         * Return custom message key.
index 01782f3..00439a1 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\Logger\LoggerFactory;
 
 /**
  * Special page which uses a ChangesList to show query results.
@@ -77,6 +78,14 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $this->webOutput( $rows, $opts );
 
                $rows->free();
+
+               if ( $this->getConfig()->get( 'EnableWANCacheReaper' ) ) {
+                       // Clean up any bad page entries for titles showing up in RC
+                       DeferredUpdates::addUpdate( new WANCacheReapUpdate(
+                               $this->getDB(),
+                               LoggerFactory::getInstance( 'objectcache' )
+                       ) );
+               }
        }
 
        /**
@@ -140,15 +149,22 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts = new FormOptions();
 
                $opts->add( 'hideminor', false );
+               $opts->add( 'hidemajor', false );
                $opts->add( 'hidebots', false );
+               $opts->add( 'hidehumans', false );
                $opts->add( 'hideanons', false );
                $opts->add( 'hideliu', false );
                $opts->add( 'hidepatrolled', false );
+               $opts->add( 'hideunpatrolled', false );
                $opts->add( 'hidemyself', false );
+               $opts->add( 'hidebyothers', false );
 
                if ( $config->get( 'RCWatchCategoryMembership' ) ) {
                        $opts->add( 'hidecategorization', false );
                }
+               $opts->add( 'hidepageedits', false );
+               $opts->add( 'hidenewpages', false );
+               $opts->add( 'hidelog', false );
 
                $opts->add( 'namespace', '', FormOptions::INTNULL );
                $opts->add( 'invert', false );
@@ -229,13 +245,24 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                // Toggles
                if ( $opts['hideminor'] ) {
-                       $conds['rc_minor'] = 0;
+                       $conds[] = 'rc_minor = 0';
+               }
+               if ( $opts['hidemajor'] ) {
+                       $conds[] = 'rc_minor = 1';
                }
                if ( $opts['hidebots'] ) {
                        $conds['rc_bot'] = 0;
                }
-               if ( $user->useRCPatrol() && $opts['hidepatrolled'] ) {
-                       $conds['rc_patrolled'] = 0;
+               if ( $opts['hidehumans'] ) {
+                       $conds[] = 'rc_bot = 1';
+               }
+               if ( $user->useRCPatrol() ) {
+                       if ( $opts['hidepatrolled'] ) {
+                               $conds[] = 'rc_patrolled = 0';
+                       }
+                       if ( $opts['hideunpatrolled'] ) {
+                               $conds[] = 'rc_patrolled = 1';
+                       }
                }
                if ( $botsonly ) {
                        $conds['rc_bot'] = 1;
@@ -247,6 +274,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $conds[] = 'rc_user != 0';
                        }
                }
+
                if ( $opts['hidemyself'] ) {
                        if ( $user->getId() ) {
                                $conds[] = 'rc_user != ' . $dbr->addQuotes( $user->getId() );
@@ -254,11 +282,28 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
                        }
                }
+               if ( $opts['hidebyothers'] ) {
+                       if ( $user->getId() ) {
+                               $conds[] = 'rc_user = ' . $dbr->addQuotes( $user->getId() );
+                       } else {
+                               $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
+                       }
+               }
+
                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'] !== '' ) {
@@ -485,4 +530,23 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        protected function getGroupName() {
                return 'changes';
        }
+
+       /**
+        * Get filters that can be rendered.
+        *
+        * Filters with 'msg' => false can be used to filter data but won't
+        * be presented as show/hide toggles in the UI. They are not returned
+        * by this function.
+        *
+        * @param array $allFilters Map of filter URL param names to properties (msg/default)
+        * @return array Map of filter URL param names to properties (msg/default)
+        */
+       protected function getRenderableCustomFilters( $allFilters ) {
+               return array_filter(
+                       $allFilters,
+                       function( $filter ) {
+                               return isset( $filter['msg'] ) && ( $filter['msg'] !== false );
+                       }
+               );
+       }
 }
index 1e03774..c3ee321 100644 (file)
@@ -149,9 +149,9 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $entryWarning = $this->msg( $request->getVal( 'warning', '' ) );
                // bc: provide login link as a parameter for messages where the translation
                // was not updated
-               $loginreqlink = Linker::linkKnown(
+               $loginreqlink = $this->getLinkRenderer()->makeKnownLink(
                        $this->getPageTitle(),
-                       $this->msg( 'loginreqlink' )->escaped(),
+                       $this->msg( 'loginreqlink' )->text(),
                        [],
                        [
                                'returnto' => $this->mReturnTo,
@@ -294,6 +294,14 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        return;
                }
 
+               if ( $this->canBypassForm( $button_name ) ) {
+                       $this->setRequest( [], true );
+                       $this->getRequest()->setVal( $this->getTokenName(), $this->getToken() );
+                       if ( $button_name ) {
+                               $this->getRequest()->setVal( $button_name, true );
+                       }
+               }
+
                $status = $this->trySubmit();
 
                if ( !$status || !$status->isGood() ) {
@@ -366,6 +374,46 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
        }
 
+       /**
+        * Determine if the login form can be bypassed. This will be the case when no more than one
+        * button is present and no other user input fields that are not marked as 'skippable' are
+        * present. If the login form were not bypassed, the user would be presented with a
+        * superfluous page on which they must press the single button to proceed with login.
+        * Not only does this cause an additional mouse click and page load, it confuses users,
+        * especially since there are a help link and forgotten password link that are
+        * provided on the login page that do not apply to this situation.
+        *
+        * @param string|null &$button_name if the form has a single button, returns
+        *   the name of the button; otherwise, returns null
+        * @return bool
+        */
+       private function canBypassForm( &$button_name ) {
+               $button_name = null;
+               if ( $this->isContinued() ) {
+                       return false;
+               }
+               $fields = AuthenticationRequest::mergeFieldInfo( $this->authRequests );
+               foreach ( $fields as $fieldname => $field ) {
+                       if ( !isset( $field['type'] ) ) {
+                               return false;
+                       }
+                       if ( !empty( $field['skippable'] ) ) {
+                               continue;
+                       }
+                       if ( $field['type'] === 'button' ) {
+                               if ( $button_name !== null ) {
+                                       $button_name = null;
+                                       return false;
+                               } else {
+                                       $button_name = $fieldname;
+                               }
+                       } elseif ( $field['type'] !== 'null' ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
        /**
         * Show the success page.
         *
@@ -593,7 +641,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         * @return HTMLForm
         */
        protected function getAuthForm( array $requests, $action, $msg = '', $msgType = 'error' ) {
-               global $wgSecureLogin, $wgLoginLanguageSelector;
+               global $wgSecureLogin;
                // FIXME merge this with parent
 
                if ( isset( $this->authForm ) ) {
@@ -619,7 +667,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $form = HTMLForm::factory( 'vform', $formDescriptor, $context );
 
                $form->addHiddenField( 'authAction', $this->authAction );
-               if ( $wgLoginLanguageSelector && $this->mLanguage ) {
+               if ( $this->mLanguage ) {
                        $form->addHiddenField( 'uselang', $this->mLanguage );
                }
                $form->addHiddenField( 'force', $this->securityLevel );
@@ -654,7 +702,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         */
        protected function getFakeTemplate( $msg, $msgType ) {
                global $wgAuth, $wgEnableEmail, $wgHiddenPrefs, $wgEmailConfirmToEdit, $wgEnableUserEmail,
-                          $wgSecureLogin, $wgLoginLanguageSelector, $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
@@ -712,7 +760,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                # Don't show a "create account" link if the user can't.
                if ( $this->showCreateAccountLink() ) {
                        # Pass any language selection on to the mode switch link
-                       if ( $wgLoginLanguageSelector && $this->mLanguage ) {
+                       if ( $this->mLanguage ) {
                                $linkq .= '&uselang=' . $this->mLanguage;
                        }
                        // Supply URL, login template creates the button.
@@ -844,7 +892,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         * @return array
         */
        protected function getFieldDefinitions( $template ) {
-               global $wgEmailConfirmToEdit, $wgLoginLanguageSelector;
+               global $wgEmailConfirmToEdit;
 
                $isLoggedIn = $this->getUser()->isLoggedIn();
                $continuePart = $this->isContinued() ? 'continue-' : '';
@@ -1040,13 +1088,13 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        // B/C for old extensions that haven't been converted to AuthManager (or have been
                        // but somebody is using the old version) and still use templates via the
                        // UserCreateForm/UserLoginForm hook.
-                       // 'header' used by ConfirmEdit, CondfirmAccount, Persona, WikimediaIncubator, SemanticSignup
+                       // 'header' used by ConfirmEdit, ConfirmAccount, Persona, WikimediaIncubator, SemanticSignup
                        // 'formheader' used by MobileFrontend
                        $fieldDefinitions['header'] = [
                                'type' => 'info',
                                'raw' => true,
                                'default' => $template->get( 'header' ) ?: $template->get( 'formheader' ),
-                               'weight' => - 110,
+                               'weight' => -110,
                        ];
                }
                if ( $this->mEntryError ) {
@@ -1086,9 +1134,9 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                        'type' => 'info',
                                        'raw' => true,
                                        'cssclass' => 'mw-form-related-link-container',
-                                       'default' => Linker::link(
+                                       'default' => $this->getLinkRenderer()->makeLink(
                                                SpecialPage::getTitleFor( 'PasswordReset' ),
-                                               $this->msg( 'userlogin-resetpassword-link' )->escaped()
+                                               $this->msg( 'userlogin-resetpassword-link' )->text()
                                        ),
                                        'weight' => 230,
                                ];
@@ -1100,7 +1148,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                $linkTitle = $this->getTitleFor( $this->isSignup() ? 'Userlogin' :'CreateAccount' );
                                $linkq = $this->getReturnToQueryStringFragment();
                                // Pass any language selection on to the mode switch link
-                               if ( $wgLoginLanguageSelector && $this->mLanguage ) {
+                               if ( $this->mLanguage ) {
                                        $linkq .= '&uselang=' . $this->mLanguage;
                                }
                                $loggedIn = $this->getUser()->isLoggedIn();
@@ -1267,9 +1315,9 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $targetLanguage = Language::factory( $lang );
                $attr['lang'] = $attr['hreflang'] = $targetLanguage->getHtmlCode();
 
-               return Linker::linkKnown(
+               return $this->getLinkRenderer()->makeKnownLink(
                        $this->getPageTitle(),
-                       htmlspecialchars( $text ),
+                       $text,
                        $attr,
                        $query
                );
index 00d8c4a..ba58e92 100644 (file)
@@ -853,7 +853,7 @@ class SpecialPage {
         * @since 1.28
         * @return \MediaWiki\Linker\LinkRenderer
         */
-       protected function getLinkRenderer() {
+       public function getLinkRenderer() {
                if ( $this->linkRenderer ) {
                        return $this->linkRenderer;
                } else {
index 39e3649..00fca12 100644 (file)
@@ -64,14 +64,15 @@ abstract class WantedQueryPage extends QueryPage {
         * @return string
         */
        public function formatResult( $skin, $result ) {
+               $linkRenderer = $this->getLinkRenderer();
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( $title instanceof Title ) {
                        if ( $this->isCached() || $this->forceExistenceCheck() ) {
                                $pageLink = $this->existenceCheck( $title )
-                                       ? '<del>' . Linker::link( $title ) . '</del>'
-                                       : Linker::link( $title );
+                                       ? '<del>' . $linkRenderer->makeLink( $title ) . '</del>'
+                                       : $linkRenderer->makeLink( $title );
                        } else {
-                               $pageLink = Linker::link(
+                               $pageLink = $linkRenderer->makeLink(
                                        $title,
                                        null,
                                        [],
index 7e29be0..e7030c5 100644 (file)
@@ -86,7 +86,7 @@ class SpecialActiveUsers extends SpecialPage {
                $groups = User::getAllGroups();
 
                foreach ( $groups as $group ) {
-                       $msg = User::getGroupName( $group );
+                       $msg = htmlspecialchars( UserGroupMembership::getGroupName( $group ) );
                        $options[$msg] = $group;
                }
 
index 4a2a619..4b8446a 100644 (file)
@@ -204,6 +204,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                                ]
                        );
 
+                       $linkRenderer = $this->getLinkRenderer();
                        if ( $res->numRows() > 0 ) {
                                $out = Html::openElement( 'ul', [ 'class' => 'mw-allpages-chunk' ] );
 
@@ -213,7 +214,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                                                $out .= '<li' .
                                                        ( $s->page_is_redirect ? ' class="allpagesredirect"' : '' ) .
                                                        '>' .
-                                                       Linker::link( $t ) .
+                                                       $linkRenderer->makeLink( $t ) .
                                                        "</li>\n";
                                        } else {
                                                $out .= '<li>[[' . htmlspecialchars( $s->page_title ) . "]]</li>\n";
@@ -269,6 +270,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                $navLinks = [];
                $self = $this->getPageTitle();
 
+               $linkRenderer = $this->getLinkRenderer();
                // Generate a "previous page" link if needed
                if ( $prevTitle ) {
                        $query = [ 'from' => $prevTitle->getText() ];
@@ -281,9 +283,9 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $navLinks[] = Linker::linkKnown(
+                       $navLinks[] = $linkRenderer->makeKnownLink(
                                $self,
-                               $this->msg( 'prevpage', $prevTitle->getText() )->escaped(),
+                               $this->msg( 'prevpage', $prevTitle->getText() )->text(),
                                [],
                                $query
                        );
@@ -304,9 +306,9 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $navLinks[] = Linker::linkKnown(
+                       $navLinks[] = $linkRenderer->makeKnownLink(
                                $self,
-                               $this->msg( 'nextpage', $t->getText() )->escaped(),
+                               $this->msg( 'nextpage', $t->getText() )->text(),
                                [],
                                $query
                        );
index 9ee1b75..ecc030e 100644 (file)
@@ -78,9 +78,10 @@ class AncientPagesPage extends QueryPage {
 
                $d = $this->getLanguage()->userTimeAndDate( $result->value, $this->getUser() );
                $title = Title::makeTitle( $result->namespace, $result->title );
-               $link = Linker::linkKnown(
+               $linkRenderer = $this->getLinkRenderer();
+               $link = $linkRenderer->makeKnownLink(
                        $title,
-                       htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
+                       $wgContLang->convert( $title->getPrefixedText() )
                );
 
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
index 74b474a..5448013 100644 (file)
@@ -77,6 +77,11 @@ class SpecialApiHelp extends UnlistedSpecialPage {
                $main = new ApiMain( $this->getContext(), false );
                try {
                        $module = $main->getModuleFromPath( $moduleName );
+               } catch ( ApiUsageException $ex ) {
+                       $this->getOutput()->addHTML( Html::rawElement( 'span', [ 'class' => 'error' ],
+                               $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
+                       ) );
+                       return;
                } catch ( UsageException $ex ) {
                        $this->getOutput()->addHTML( Html::rawElement( 'span', [ 'class' => 'error' ],
                                $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
index ce7d24e..c18ae0e 100644 (file)
@@ -372,12 +372,13 @@ class SpecialBlock extends FormSpecialPage {
 
                $this->getOutput()->addModuleStyles( 'mediawiki.special' );
 
+               $linkRenderer = $this->getLinkRenderer();
                # Link to the user's contributions, if applicable
                if ( $this->target instanceof User ) {
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->target->getName() );
-                       $links[] = Linker::link(
+                       $links[] = $linkRenderer->makeLink(
                                $contribsPage,
-                               $this->msg( 'ipb-blocklist-contribs', $this->target->getName() )->escaped()
+                               $this->msg( 'ipb-blocklist-contribs', $this->target->getName() )->text()
                        );
                }
 
@@ -392,21 +393,24 @@ class SpecialBlock extends FormSpecialPage {
                        $message = $this->msg( 'ipb-unblock' )->parse();
                        $list = SpecialPage::getTitleFor( 'Unblock' );
                }
-               $links[] = Linker::linkKnown( $list, $message, [] );
+               $links[] = $linkRenderer->makeKnownLink(
+                       $list,
+                       new HtmlArmor( $message )
+               );
 
                # Link to the block list
-               $links[] = Linker::linkKnown(
+               $links[] = $linkRenderer->makeKnownLink(
                        SpecialPage::getTitleFor( 'BlockList' ),
-                       $this->msg( 'ipb-blocklist' )->escaped()
+                       $this->msg( 'ipb-blocklist' )->text()
                );
 
                $user = $this->getUser();
 
                # Link to edit the block dropdown reasons, if applicable
                if ( $user->isAllowed( 'editinterface' ) ) {
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                $this->msg( 'ipbreason-dropdown' )->inContentLanguage()->getTitle(),
-                               $this->msg( 'ipb-edit-dropdown' )->escaped(),
+                               $this->msg( 'ipb-edit-dropdown' )->text(),
                                [],
                                [ 'action' => 'edit' ]
                        );
@@ -824,9 +828,13 @@ class SpecialBlock extends FormSpecialPage {
                $blockIds = array_merge( [ $status['id'] ], $status['autoIds'] );
                $logEntry->setRelations( [ 'ipb_id' => $blockIds ] );
                $logId = $logEntry->insert();
+
+               if ( !empty( $data['Tags'] ) ) {
+                       $logEntry->setTags( $data['Tags'] );
+               }
+
                $logEntry->publish( $logId );
 
-               # Report to the user
                return true;
        }
 
index 1753396..b730ecd 100644 (file)
@@ -109,12 +109,13 @@ class BrokenRedirectsPage extends QueryPage {
                        }
                }
 
+               $linkRenderer = $this->getLinkRenderer();
                // $toObj may very easily be false if the $result list is cached
                if ( !is_object( $toObj ) ) {
-                       return '<del>' . Linker::link( $fromObj ) . '</del>';
+                       return '<del>' . $linkRenderer->makeLink( $fromObj ) . '</del>';
                }
 
-               $from = Linker::linkKnown(
+               $from = $linkRenderer->makeKnownLink(
                        $fromObj,
                        null,
                        [],
@@ -128,28 +129,22 @@ class BrokenRedirectsPage extends QueryPage {
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $fromObj )->supportsDirectEditing()
                ) {
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                $fromObj,
-                               $this->msg( 'brokenredirects-edit' )->escaped(),
+                               $this->msg( 'brokenredirects-edit' )->text(),
                                [],
                                [ 'action' => 'edit' ]
                        );
                }
-               $to = Linker::link(
-                       $toObj,
-                       null,
-                       [],
-                       [],
-                       [ 'broken' ]
-               );
+               $to = $linkRenderer->makeBrokenLink( $toObj );
                $arr = $this->getLanguage()->getArrow();
 
                $out = $from . $this->msg( 'word-separator' )->escaped();
 
                if ( $this->getUser()->isAllowed( 'delete' ) ) {
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                $fromObj,
-                               $this->msg( 'brokenredirects-delete' )->escaped(),
+                               $this->msg( 'brokenredirects-delete' )->text(),
                                [],
                                [ 'action' => 'delete' ]
                        );
index 87276a1..a36b414 100644 (file)
@@ -33,6 +33,18 @@ class SpecialChangeContentModel extends FormSpecialPage {
                }
        }
 
+       protected function postText() {
+               $text = '';
+               if ( $this->title ) {
+                       $contentModelLogPage = new LogPage( 'contentmodel' );
+                       $text = Xml::element( 'h2', null, $contentModelLogPage->getName()->text() );
+                       $out = '';
+                       LogEventsList::showLogExtract( $out, 'contentmodel', $this->title );
+                       $text .= $out;
+               }
+               return $text;
+       }
+
        protected function getDisplayFormat() {
                return 'ooui';
        }
index ff70848..b81ca3d 100644 (file)
@@ -87,6 +87,8 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                        return;
                }
 
+               $this->getOutput()->addBacklinkSubtitle( $this->getPageTitle() );
+
                $status = $this->trySubmit();
 
                if ( $status === false || !$status->isOK() ) {
@@ -135,9 +137,9 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
 
                $form->addPreText(
                        Html::openElement( 'dl' )
-                       . Html::element( 'dt', [], wfMessage( 'credentialsform-provider' ) )
+                       . Html::element( 'dt', [], wfMessage( 'credentialsform-provider' )->text() )
                        . Html::element( 'dd', [], $info['provider'] )
-                       . Html::element( 'dt', [], wfMessage( 'credentialsform-account' ) )
+                       . Html::element( 'dt', [], wfMessage( 'credentialsform-account' )->text() )
                        . Html::element( 'dd', [], $info['account'] )
                        . Html::closeElement( 'dl' )
                );
index 3cd4d4d..766de1b 100644 (file)
@@ -492,7 +492,8 @@ class SpecialContributions extends IncludableSpecialPage {
                        $form .= "\t" . Html::hidden( $name, $value ) . "\n";
                }
 
-               $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
+               $tagFilter = ChangeTags::buildTagFilterSelector(
+                       $this->opts['tagfilter'], false, $this->getContext() );
 
                if ( $tagFilter ) {
                        $filterSelection = Html::rawElement(
@@ -528,7 +529,6 @@ class SpecialContributions extends IncludableSpecialPage {
                        'text',
                        [
                                'size' => '40',
-                               'required' => '',
                                'class' => [
                                        'mw-input',
                                        'mw-ui-input-inline',
index ad12046..5c8b3a6 100644 (file)
  * @ingroup SpecialPage
  */
 class DeletedContributionsPage extends SpecialPage {
+       /** @var FormOptions */
+       protected $mOpts;
+
        function __construct() {
-               parent::__construct( 'DeletedContributions', 'deletedhistory',
-                       /*listed*/true, /*function*/false, /*file*/false );
+               parent::__construct( 'DeletedContributions', 'deletedhistory' );
        }
 
        /**
@@ -40,40 +42,43 @@ class DeletedContributionsPage extends SpecialPage {
        function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
+               $this->checkPermissions();
 
                $user = $this->getUser();
 
-               if ( !$this->userCanExecute( $user ) ) {
-                       $this->displayRestrictionError();
-
-                       return;
-               }
-
-               $request = $this->getRequest();
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'deletedcontributions-title' ) );
 
-               $options = [];
+               $opts = new FormOptions();
+
+               $opts->add( 'target', '' );
+               $opts->add( 'namespace', '' );
+               $opts->add( 'limit', 20 );
+
+               $opts->fetchValuesFromRequest( $this->getRequest() );
+               $opts->validateIntBounds( 'limit', 0, $this->getConfig()->get( 'QueryPageDefaultLimit' ) );
 
                if ( $par !== null ) {
-                       $target = $par;
-               } else {
-                       $target = $request->getVal( 'target' );
+                       $opts->setValue( 'target', $par );
                }
 
+               $ns = $opts->getValue( 'namespace' );
+               if ( $ns !== null && $ns !== '' ) {
+                       $opts->setValue( 'namespace', intval( $ns ) );
+               }
+
+               $this->mOpts = $opts;
+
+               $target = $opts->getValue( 'target' );
                if ( !strlen( $target ) ) {
-                       $out->addHTML( $this->getForm( '' ) );
+                       $this->getForm();
 
                        return;
                }
 
-               $options['limit'] = $request->getInt( 'limit',
-                       $this->getConfig()->get( 'QueryPageDefaultLimit' ) );
-               $options['target'] = $target;
-
                $userObj = User::newFromName( $target, false );
                if ( !$userObj ) {
-                       $out->addHTML( $this->getForm( '' ) );
+                       $this->getForm();
 
                        return;
                }
@@ -82,16 +87,9 @@ class DeletedContributionsPage extends SpecialPage {
                $target = $userObj->getName();
                $out->addSubtitle( $this->getSubTitle( $userObj ) );
 
-               $ns = $request->getVal( 'namespace', null );
-               if ( $ns !== null && $ns !== '' ) {
-                       $options['namespace'] = intval( $ns );
-               } else {
-                       $options['namespace'] = '';
-               }
-
-               $out->addHTML( $this->getForm( $options ) );
+               $this->getForm();
 
-               $pager = new DeletedContribsPager( $this->getContext(), $target, $options['namespace'] );
+               $pager = new DeletedContribsPager( $this->getContext(), $target, $opts->getValue( 'namespace' ) );
                if ( !$pager->getNumRows() ) {
                        $out->addWikiMsg( 'nocontribs' );
 
@@ -187,76 +185,35 @@ class DeletedContributionsPage extends SpecialPage {
 
        /**
         * Generates the namespace selector form with hidden attributes.
-        * @param array $options The options to be included.
-        * @return string
         */
-       function getForm( $options ) {
-               $options['title'] = $this->getPageTitle()->getPrefixedText();
-               if ( !isset( $options['target'] ) ) {
-                       $options['target'] = '';
-               } else {
-                       $options['target'] = str_replace( '_', ' ', $options['target'] );
-               }
-
-               if ( !isset( $options['namespace'] ) ) {
-                       $options['namespace'] = '';
-               }
-
-               if ( !isset( $options['contribs'] ) ) {
-                       $options['contribs'] = 'user';
-               }
-
-               if ( $options['contribs'] == 'newbie' ) {
-                       $options['target'] = '';
-               }
-
-               $f = Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] );
-
-               foreach ( $options as $name => $value ) {
-                       if ( in_array( $name, [ 'namespace', 'target', 'contribs' ] ) ) {
-                               continue;
-                       }
-                       $f .= "\t" . Html::hidden( $name, $value ) . "\n";
-               }
+       function getForm() {
+               $opts = $this->mOpts;
+
+               $formDescriptor = [
+                       'target' => [
+                               'type' => 'user',
+                               'name' => 'target',
+                               'label-message' => 'sp-contributions-username',
+                               'default' => $opts->getValue( 'target' ),
+                               'ipallowed' => true,
+                       ],
 
-               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
-
-               $f .= Xml::openElement( 'fieldset' );
-               $f .= Xml::element( 'legend', [], $this->msg( 'sp-contributions-search' )->text() );
-               $f .= Xml::tags(
-                       'label',
-                       [ 'for' => 'target' ],
-                       $this->msg( 'sp-contributions-username' )->parse()
-               ) . ' ';
-               $f .= Html::input(
-                       'target',
-                       $options['target'],
-                       'text',
-                       [
-                               'size' => '20',
-                               'required' => '',
-                               'class' => [
-                                       'mw-autocomplete-user', // used by mediawiki.userSuggest
-                               ],
-                       ] + ( $options['target'] ? [] : [ 'autofocus' ] )
-               ) . ' ';
-               $f .= Html::namespaceSelector(
-                       [
-                               'selected' => $options['namespace'],
+                       'namespace' => [
+                               'type' => 'namespaceselect',
+                               'name' => 'namespace',
+                               'label-message' => 'namespace',
                                'all' => '',
-                               'label' => $this->msg( 'namespace' )->text()
                        ],
-                       [
-                               'name' => 'namespace',
-                               'id' => 'namespace',
-                               'class' => 'namespaceselector',
-                       ]
-               ) . ' ';
-               $f .= Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() );
-               $f .= Xml::closeElement( 'fieldset' );
-               $f .= Xml::closeElement( 'form' );
-
-               return $f;
+               ];
+
+               HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setWrapperLegendMsg( 'sp-contributions-search' )
+                       ->setSubmitTextMsg( 'sp-contributions-submit' )
+                       // prevent setting subpage and 'target' parameter at the same time
+                       ->setAction( $this->getPageTitle()->getLocalURL() )
+                       ->setMethod( 'get' )
+                       ->prepareForm()
+                       ->displayForm( false );
        }
 
        /**
index 0cec9d0..9140bf1 100644 (file)
@@ -137,14 +137,15 @@ class DoubleRedirectsPage extends QueryPage {
                                $result = $dbr->fetchObject( $res );
                        }
                }
+               $linkRenderer = $this->getLinkRenderer();
                if ( !$result ) {
-                       return '<del>' . Linker::link( $titleA, null, [], [ 'redirect' => 'no' ] ) . '</del>';
+                       return '<del>' . $linkRenderer->makeLink( $titleA, null, [], [ 'redirect' => 'no' ] ) . '</del>';
                }
 
                $titleB = Title::makeTitle( $result->nsb, $result->tb );
                $titleC = Title::makeTitle( $result->nsc, $result->tc, '', $result->iwc );
 
-               $linkA = Linker::linkKnown(
+               $linkA = $linkRenderer->makeKnownLink(
                        $titleA,
                        null,
                        [],
@@ -158,26 +159,24 @@ class DoubleRedirectsPage extends QueryPage {
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $titleA )->supportsDirectEditing()
                ) {
-                       $edit = Linker::linkKnown(
+                       $edit = $linkRenderer->makeKnownLink(
                                $titleA,
-                               $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
+                               $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->text(),
                                [],
-                               [
-                                       'action' => 'edit'
-                               ]
+                               [ 'action' => 'edit' ]
                        );
                } else {
                        $edit = '';
                }
 
-               $linkB = Linker::linkKnown(
+               $linkB = $linkRenderer->makeKnownLink(
                        $titleB,
                        null,
                        [],
                        [ 'redirect' => 'no' ]
                );
 
-               $linkC = Linker::linkKnown( $titleC );
+               $linkC = $linkRenderer->makeKnownLink( $titleC );
 
                $lang = $this->getLanguage();
                $arr = $lang->getArrow() . $lang->getDirMark();
index 252d076..476c452 100644 (file)
@@ -158,10 +158,11 @@ class SpecialEditTags extends UnlistedSpecialPage {
                        // Also set header tabs to be for the target.
                        $this->getSkin()->setRelevantTitle( $this->targetObj );
 
+                       $linkRenderer = $this->getLinkRenderer();
                        $links = [];
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Log' ),
-                               $this->msg( 'viewpagelogs' )->escaped(),
+                               $this->msg( 'viewpagelogs' )->text(),
                                [],
                                [
                                        'page' => $this->targetObj->getPrefixedText(),
@@ -170,17 +171,17 @@ class SpecialEditTags extends UnlistedSpecialPage {
                        );
                        if ( !$this->targetObj->isSpecialPage() ) {
                                // Give a link to the page history
-                               $links[] = Linker::linkKnown(
+                               $links[] = $linkRenderer->makeKnownLink(
                                        $this->targetObj,
-                                       $this->msg( 'pagehist' )->escaped(),
+                                       $this->msg( 'pagehist' )->text(),
                                        [],
                                        [ 'action' => 'history' ]
                                );
                        }
                        // Link to Special:Tags
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Tags' ),
-                               $this->msg( 'tags-edit-manage-link' )->escaped()
+                               $this->msg( 'tags-edit-manage-link' )->text()
                        );
                        // Logs themselves don't have histories or archived revisions
                        $this->getOutput()->addSubtitle( $this->getLanguage()->pipeList( $links ) );
index 0defcd1..b447271 100644 (file)
@@ -149,7 +149,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
        /**
         * Executes an edit mode for the watchlist view, from which you can manage your watchlist
-        *
         */
        protected function executeViewEditWatchlist() {
                $out = $this->getOutput();
@@ -630,7 +629,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                if ( $title->exists() ) {
                        $tools['history'] = $linkRenderer->makeKnownLink(
                                $title,
-                               $this->msg( 'history_short' )->text(),
+                               $this->msg( 'history_small' )->text(),
                                [],
                                [ 'action' => 'history' ]
                        );
index 06be7bc..085b68d 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * A special page that allows users to send e-mails to other users
@@ -52,13 +53,14 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        }
 
        protected function getFormFields() {
+               $linkRenderer = $this->getLinkRenderer();
                return [
                        'From' => [
                                'type' => 'info',
                                'raw' => 1,
-                               'default' => Linker::link(
+                               'default' => $linkRenderer->makeLink(
                                        $this->getUser()->getUserPage(),
-                                       htmlspecialchars( $this->getUser()->getName() )
+                                       $this->getUser()->getName()
                                ),
                                'label-message' => 'emailfrom',
                                'id' => 'mw-emailuser-sender',
@@ -66,9 +68,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        'To' => [
                                'type' => 'info',
                                'raw' => 1,
-                               'default' => Linker::link(
+                               'default' => $linkRenderer->makeLink(
                                        $this->mTargetObj->getUserPage(),
-                                       htmlspecialchars( $this->mTargetObj->getName() )
+                                       $this->mTargetObj->getName()
                                ),
                                'label-message' => 'emailto',
                                'id' => 'mw-emailuser-recipient',
@@ -223,7 +225,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        public static function getPermissionsError( $user, $editToken, Config $config = null ) {
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                if ( !$config->get( 'EnableEmail' ) || !$config->get( 'EnableUserEmail' ) ) {
                        return 'usermaildisabled';
@@ -305,7 +307,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * @since 1.20
         * @param array $data
         * @param HTMLForm $form
-        * @return Status|string|bool
+        * @return Status|bool
         */
        public static function uiSubmit( array $data, HTMLForm $form ) {
                return self::submit( $data, $form->getContext() );
@@ -318,8 +320,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         *
         * @param array $data
         * @param IContextSource $context
-        * @return Status|string|bool Status object, or potentially a String on error
-        * or maybe even true on success if anything uses the EmailUser hook.
+        * @return Status|bool
         */
        public static function submit( array $data, IContextSource $context ) {
                $config = $context->getConfig();
@@ -327,7 +328,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $target = self::getTarget( $data['Target'] );
                if ( !$target instanceof User ) {
                        // Messages used here: notargettext, noemailtext, nowikiemailtext
-                       return $context->msg( $target . 'text' )->parseAsBlock();
+                       return Status::newFatal( $target . 'text' );
                }
 
                $to = MailAddress::newFromUser( $target );
@@ -340,9 +341,33 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $text .= $context->msg( 'emailuserfooter',
                        $from->name, $to->name )->inContentLanguage()->text();
 
-               $error = '';
+               $error = false;
                if ( !Hooks::run( 'EmailUser', [ &$to, &$from, &$subject, &$text, &$error ] ) ) {
-                       return $error;
+                       if ( $error instanceof Status ) {
+                               return $error;
+                       } elseif ( $error === false || $error === '' || $error === [] ) {
+                               // Possibly to tell HTMLForm to pretend there was no submission?
+                               return false;
+                       } elseif ( $error === true ) {
+                               // Hook sent the mail itself and indicates success?
+                               return Status::newGood();
+                       } elseif ( is_array( $error ) ) {
+                               $status = Status::newGood();
+                               foreach ( $error as $e ) {
+                                       $status->fatal( $e );
+                               }
+                               return $status;
+                       } elseif ( $error instanceof MessageSpecifier ) {
+                               return Status::newFatal( $error );
+                       } else {
+                               // Ugh. Either a raw HTML string, or something that's supposed
+                               // to be treated like one.
+                               $type = is_object( $error ) ? get_class( $error ) : gettype( $error );
+                               wfDeprecated( "EmailUser hook returning a $type as \$error", '1.29' );
+                               return Status::newFatal( new ApiRawMessage(
+                                       [ '$1', Message::rawParam( (string)$error ) ], 'hookaborted'
+                               ) );
+                       }
                }
 
                if ( $config->get( 'UserEmailUseReplyTo' ) ) {
index bf535a6..2d6ba4a 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup SpecialPage
  */
 
+use Mediawiki\MediaWikiServices;
+
 /**
  * A special page that allows users to export pages in a XML file
  *
@@ -374,7 +376,7 @@ class SpecialExport extends SpecialPage {
                        $buffer = WikiExporter::BUFFER;
                } else {
                        // Use an unbuffered query; histories may be very long!
-                       $lb = wfGetLBFactory()->newMainLB();
+                       $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->newMainLB();
                        $db = $lb->getConnection( DB_REPLICA );
                        $buffer = WikiExporter::STREAM;
 
index b86a95e..f20829f 100644 (file)
@@ -53,12 +53,6 @@ class FewestrevisionsPage extends QueryPage {
                                'page_namespace' => MWNamespace::getContentNamespaces(),
                                'page_id = rev_page' ],
                        'options' => [
-                               'HAVING' => 'COUNT(*) > 1',
-                               // ^^^ This was probably here to weed out redirects.
-                               // Since we mark them as such now, it might be
-                               // useful to remove this. People _do_ create pages
-                               // and never revise them, they aren't necessarily
-                               // redirects.
                                'GROUP BY' => [ 'page_namespace', 'page_title', 'page_is_redirect' ]
                        ]
                ];
@@ -88,14 +82,14 @@ class FewestrevisionsPage extends QueryPage {
                                )
                        );
                }
+               $linkRenderer = $this->getLinkRenderer();
+               $text = $wgContLang->convert( $nt->getPrefixedText() );
+               $plink = $linkRenderer->makeLink( $nt, $text );
 
-               $text = htmlspecialchars( $wgContLang->convert( $nt->getPrefixedText() ) );
-               $plink = Linker::linkKnown( $nt, $text );
-
-               $nl = $this->msg( 'nrevisions' )->numParams( $result->value )->escaped();
+               $nl = $this->msg( 'nrevisions' )->numParams( $result->value )->text();
                $redirect = isset( $result->redirect ) && $result->redirect ?
                        ' - ' . $this->msg( 'isredirect' )->escaped() : '';
-               $nlink = Linker::linkKnown(
+               $nlink = $linkRenderer->makeKnownLink(
                        $nt,
                        $nl,
                        [],
index 6de127d..8021bc2 100644 (file)
@@ -208,11 +208,12 @@ class FileDuplicateSearchPage extends QueryPage {
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
+               $linkRenderer = $this->getLinkRenderer();
                $nt = $result->getTitle();
                $text = $wgContLang->convert( $nt->getText() );
-               $plink = Linker::link(
+               $plink = $linkRenderer->makeLink(
                        $nt,
-                       htmlspecialchars( $text )
+                       $text
                );
 
                $userText = $result->getUser( 'text' );
index c58af60..a2930fc 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * MediaWiki page data importer
  *
@@ -534,6 +536,7 @@ class SpecialImport extends SpecialPage {
  */
 class ImportReporter extends ContextSource {
        private $reason = false;
+       private $logTags = [];
        private $mOriginalLogCallback = null;
        private $mOriginalPageOutCallback = null;
        private $mLogItemCount = 0;
@@ -556,6 +559,16 @@ class ImportReporter extends ContextSource {
                $this->reason = $reason;
        }
 
+       /**
+        * Sets change tags to apply to the import log entry and null revision.
+        *
+        * @param array $tags
+        * @since 1.29
+        */
+       public function setChangeTags( array $tags ) {
+               $this->logTags = $tags;
+       }
+
        function open() {
                $this->getOutput()->addHTML( "<ul>\n" );
        }
@@ -592,12 +605,12 @@ class ImportReporter extends ContextSource {
                }
 
                $this->mPageCount++;
-
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( $successCount > 0 ) {
                        // <bdi> prevents jumbling of the versions count
                        // in RTL wikis in case the page title is LTR
                        $this->getOutput()->addHTML(
-                               "<li>" . Linker::linkKnown( $title ) . " " .
+                               "<li>" . $linkRenderer->makeLink( $title ) . " " .
                                        "<bdi>" .
                                        $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
                                        "</bdi>" .
@@ -626,14 +639,6 @@ class ImportReporter extends ContextSource {
                                        . $this->reason;
                        }
 
-                       $logEntry = new ManualLogEntry( 'import', $action );
-                       $logEntry->setTarget( $title );
-                       $logEntry->setComment( $this->reason );
-                       $logEntry->setPerformer( $this->getUser() );
-                       $logEntry->setParameters( $logParams );
-                       $logid = $logEntry->insert();
-                       $logEntry->publish( $logid );
-
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
@@ -645,8 +650,9 @@ class ImportReporter extends ContextSource {
                                $this->getUser()
                        );
 
+                       $nullRevId = null;
                        if ( !is_null( $nullRevision ) ) {
-                               $nullRevision->insertOn( $dbw );
+                               $nullRevId = $nullRevision->insertOn( $dbw );
                                $page = WikiPage::factory( $title );
                                # Update page record
                                $page->updateRevisionOn( $dbw, $nullRevision );
@@ -655,8 +661,24 @@ class ImportReporter extends ContextSource {
                                        [ $page, $nullRevision, $latest, $this->getUser() ]
                                );
                        }
+
+                       // Create the import log entry
+                       $logEntry = new ManualLogEntry( 'import', $action );
+                       $logEntry->setTarget( $title );
+                       $logEntry->setComment( $this->reason );
+                       $logEntry->setPerformer( $this->getUser() );
+                       $logEntry->setParameters( $logParams );
+                       $logid = $logEntry->insert();
+                       if ( count( $this->logTags ) ) {
+                               $logEntry->setTags( $this->logTags );
+                       }
+                       // Make sure the null revision will be tagged as well
+                       $logEntry->setAssociatedRevId( $nullRevId );
+
+                       $logEntry->publish( $logid );
+
                } else {
-                       $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
+                       $this->getOutput()->addHTML( "<li>" . $linkRenderer->makeKnownLink( $title ) . " " .
                                $this->msg( 'import-nonewrevisions' )->escaped() . "</li>\n" );
                }
        }
index 0e2e7db..dc6a619 100644 (file)
@@ -137,7 +137,9 @@ class SpecialJavaScriptTest extends SpecialPage {
                $code .= '(function () {'
                        . 'var start = window.__karma__ ? window.__karma__.start : QUnit.start;'
                        . 'try {'
-                       . 'mw.loader.using( ' . Xml::encodeJsVar( $modules ) . ' ).always( start );'
+                       . 'mw.loader.using( ' . Xml::encodeJsVar( $modules ) . ' )'
+                       . '.always( start )'
+                       . '.fail( function ( e ) { throw e; } );'
                        . '} catch ( e ) { start(); throw e; }'
                        . '}());';
 
index 39c8ae8..2c92410 100644 (file)
@@ -71,8 +71,14 @@ class SpecialListGrants extends SpecialPage {
 
                        $id = \Sanitizer::escapeId( $grant );
                        $out->addHTML( \Html::rawElement( 'tr', [ 'id' => $id ],
-                               "<td>" . $this->msg( "grant-$grant" )->escaped() . "</td>" .
-                               "<td>" . $grantCellHtml . '</td>'
+                               "<td>" .
+                               $this->msg(
+                                       "listgrants-grant-display",
+                                       \User::getGrantName( $grant ),
+                                       "<span class='mw-listgrants-grant-name'>" . $id . "</span>"
+                               )->parse() .
+                               "</td>" .
+                               "<td>" . $grantCellHtml . "</td>"
                        ) );
                }
 
index d64306b..7a25e55 100644 (file)
@@ -71,6 +71,8 @@ class SpecialListGroupRights extends SpecialPage {
                ) );
                asort( $allGroups );
 
+               $linkRenderer = $this->getLinkRenderer();
+
                foreach ( $allGroups as $group ) {
                        $permissions = isset( $groupPermissions[$group] )
                                ? $groupPermissions[$group]
@@ -92,22 +94,22 @@ class SpecialListGroupRights extends SpecialPage {
                                // Do not make a link for the generic * group or group with invalid group page
                                $grouppage = htmlspecialchars( $groupnameLocalized );
                        } else {
-                               $grouppage = Linker::link(
+                               $grouppage = $linkRenderer->makeLink(
                                        $grouppageLocalizedTitle,
-                                       htmlspecialchars( $groupnameLocalized )
+                                       $groupnameLocalized
                                );
                        }
 
                        if ( $group === 'user' ) {
                                // Link to Special:listusers for implicit group 'user'
-                               $grouplink = '<br />' . Linker::linkKnown(
+                               $grouplink = '<br />' . $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Listusers' ),
-                                       $this->msg( 'listgrouprights-members' )->escaped()
+                                       $this->msg( 'listgrouprights-members' )->text()
                                );
                        } elseif ( !in_array( $group, $config->get( 'ImplicitGroups' ) ) ) {
-                               $grouplink = '<br />' . Linker::linkKnown(
+                               $grouplink = '<br />' . $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Listusers' ),
-                                       $this->msg( 'listgrouprights-members' )->escaped(),
+                                       $this->msg( 'listgrouprights-members' )->text(),
                                        [],
                                        [ 'group' => $group ]
                                );
@@ -165,7 +167,7 @@ class SpecialListGroupRights extends SpecialPage {
                                $this->msg( 'listgrouprights-namespaceprotection-restrictedto' )->text()
                        )
                );
-
+               $linkRenderer = $this->getLinkRenderer();
                ksort( $namespaceProtection );
                foreach ( $namespaceProtection as $namespace => $rights ) {
                        if ( !in_array( $namespace, MWNamespace::getValidNamespaces() ) ) {
@@ -183,9 +185,9 @@ class SpecialListGroupRights extends SpecialPage {
                                Html::rawElement(
                                        'td',
                                        [],
-                                       Linker::link(
+                                       $linkRenderer->makeLink(
                                                SpecialPage::getTitleFor( 'Allpages' ),
-                                               htmlspecialchars( $namespaceText ),
+                                               $namespaceText,
                                                [],
                                                [ 'namespace' => $namespace ]
                                        )
@@ -271,12 +273,14 @@ class SpecialListGroupRights extends SpecialPage {
                        } elseif ( is_array( $changeGroup ) ) {
                                $changeGroup = array_intersect( array_values( array_unique( $changeGroup ) ), $allGroups );
                                if ( count( $changeGroup ) ) {
+                                       $groupLinks = [];
+                                       foreach ( $changeGroup as $group ) {
+                                               $groupLinks[] = UserGroupMembership::getLink( $group, $this->getContext(), 'wiki' );
+                                       }
                                        // For grep: listgrouprights-addgroup, listgrouprights-removegroup,
                                        // listgrouprights-addgroup-self, listgrouprights-removegroup-self
                                        $r[] = $this->msg( 'listgrouprights-' . $messageKey,
-                                               $lang->listToText( array_map( [ 'User', 'makeGroupLinkWiki' ], $changeGroup ) ),
-                                               count( $changeGroup )
-                                       )->parse();
+                                               $lang->listToText( $groupLinks ), count( $changeGroup ) )->parse();
                                }
                        }
                }
index 1d02a4f..52cb30a 100644 (file)
@@ -111,7 +111,8 @@ class MIMEsearchPage extends QueryPage {
        function getPageHeader() {
                $formDescriptor = [
                        'mime' => [
-                               'type' => 'text',
+                               'type' => 'combobox',
+                               'options' => $this->getSuggestionsForTypes(),
                                'name' => 'mime',
                                'label-message' => 'mimetype',
                                'required' => true,
@@ -119,8 +120,7 @@ class MIMEsearchPage extends QueryPage {
                        ],
                ];
 
-               $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
-                       ->setWrapperLegendMsg( 'mimesearch' )
+               HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
                        ->setSubmitTextMsg( 'ilsubmit' )
                        ->setAction( $this->getPageTitle()->getLocalURL() )
                        ->setMethod( 'get' )
@@ -128,6 +128,33 @@ class MIMEsearchPage extends QueryPage {
                        ->displayForm( false );
        }
 
+       protected function getSuggestionsForTypes() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $lastMajor = null;
+               $suggestions = [];
+               $result = $dbr->select(
+                       [ 'image' ],
+                       // We ignore img_media_type, but using it in the query is needed for MySQL to choose a
+                       // sensible execution plan
+                       [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ],
+                       [],
+                       __METHOD__,
+                       [ 'GROUP BY' => [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ] ]
+               );
+               foreach ( $result as $row ) {
+                       $major = $row->img_major_mime;
+                       $minor = $row->img_minor_mime;
+                       $suggestions[ "$major/$minor" ] = "$major/$minor";
+                       if ( $lastMajor === $major ) {
+                               // If there are at least two with the same major mime type, also include the wildcard
+                               $suggestions[ "$major/*" ] = "$major/*";
+                       }
+                       $lastMajor = $major;
+               }
+               ksort( $suggestions );
+               return $suggestions;
+       }
+
        public function execute( $par ) {
                $this->mime = $par ? $par : $this->getRequest()->getText( 'mime' );
                $this->mime = trim( $this->mime );
@@ -153,11 +180,12 @@ class MIMEsearchPage extends QueryPage {
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
+               $linkRenderer = $this->getLinkRenderer();
                $nt = Title::makeTitle( $result->namespace, $result->title );
                $text = $wgContLang->convert( $nt->getText() );
-               $plink = Linker::link(
+               $plink = $linkRenderer->makeLink(
                        Title::newFromText( $nt->getPrefixedText() ),
-                       htmlspecialchars( $text )
+                       $text
                );
 
                $download = Linker::makeMediaLinkObj( $nt, $this->msg( 'download' )->escaped() );
@@ -166,9 +194,9 @@ class MIMEsearchPage extends QueryPage {
                $bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
                $dimensions = $this->msg( 'widthheight' )->numParams( $result->img_width,
                        $result->img_height )->escaped();
-               $user = Linker::link(
+               $user = $linkRenderer->makeLink(
                        Title::makeTitle( NS_USER, $result->img_user_text ),
-                       htmlspecialchars( $result->img_user_text )
+                       $result->img_user_text
                );
 
                $time = $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() );
index 7683ad8..1cb6549 100644 (file)
@@ -174,10 +174,11 @@ class MediaStatisticsPage extends QueryPage {
         */
        protected function outputTableRow( $mime, $count, $bytes ) {
                $mimeSearch = SpecialPage::getTitleFor( 'MIMEsearch', $mime );
+               $linkRenderer = $this->getLinkRenderer();
                $row = Html::rawElement(
                        'td',
                        [],
-                       Linker::link( $mimeSearch, htmlspecialchars( $mime ) )
+                       $linkRenderer->makeLink( $mimeSearch, $mime )
                );
                $row .= Html::element(
                        'td',
@@ -338,7 +339,7 @@ class MediaStatisticsPage extends QueryPage {
         * we need to implement since abstract in parent class.
         *
         * @param Skin $skin
-        * @param stdObject $result Result row
+        * @param stdClass $result Result row
         * @return bool|string|void
         * @throws MWException
         */
index b916c1f..f122db8 100644 (file)
@@ -277,6 +277,8 @@ class SpecialMergeHistory extends SpecialPage {
        function formatRevisionRow( $row ) {
                $rev = new Revision( $row );
 
+               $linkRenderer = $this->getLinkRenderer();
+
                $stxt = '';
                $last = $this->msg( 'last' )->escaped();
 
@@ -285,9 +287,9 @@ class SpecialMergeHistory extends SpecialPage {
 
                $user = $this->getUser();
 
-               $pageLink = Linker::linkKnown(
+               $pageLink = $linkRenderer->makeKnownLink(
                        $rev->getTitle(),
-                       htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) ),
+                       $this->getLanguage()->userTimeAndDate( $ts, $user ),
                        [],
                        [ 'oldid' => $rev->getId() ]
                );
@@ -299,9 +301,9 @@ class SpecialMergeHistory extends SpecialPage {
                if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $last = $this->msg( 'last' )->escaped();
                } elseif ( isset( $this->prevId[$row->rev_id] ) ) {
-                       $last = Linker::linkKnown(
+                       $last = $linkRenderer->makeKnownLink(
                                $rev->getTitle(),
-                               $this->msg( 'last' )->escaped(),
+                               $this->msg( 'last' )->text(),
                                [],
                                [
                                        'diff' => $row->rev_id,
@@ -359,7 +361,9 @@ class SpecialMergeHistory extends SpecialPage {
                        return false;
                }
 
-               $targetLink = Linker::link(
+               $linkRenderer = $this->getLinkRenderer();
+
+               $targetLink = $linkRenderer->makeLink(
                        $targetTitle,
                        null,
                        [],
index 015701d..6095412 100644 (file)
@@ -91,10 +91,11 @@ class MostcategoriesPage extends QueryPage {
                        );
                }
 
+               $linkRenderer = $this->getLinkRenderer();
                if ( $this->isCached() ) {
-                       $link = Linker::link( $title );
+                       $link = $linkRenderer->makeLink( $title );
                } else {
-                       $link = Linker::linkKnown( $title );
+                       $link = $linkRenderer->makeKnownLink( $title );
                }
 
                $count = $this->msg( 'ncategories' )->numParams( $result->value )->escaped();
index 3e78352..210c4a2 100644 (file)
@@ -97,10 +97,11 @@ class MostinterwikisPage extends QueryPage {
                        );
                }
 
+               $linkRenderer = $this->getLinkRenderer();
                if ( $this->isCached() ) {
-                       $link = Linker::link( $title );
+                       $link = $linkRenderer->makeLink( $title );
                } else {
-                       $link = Linker::linkKnown( $title );
+                       $link = $linkRenderer->makeKnownLink( $title );
                }
 
                $count = $this->msg( 'ninterwikis' )->numParams( $result->value )->escaped();
index 01eb39e..712574c 100644 (file)
@@ -91,7 +91,8 @@ class MostlinkedPage extends QueryPage {
        function makeWlhLink( $title, $caption ) {
                $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
 
-               return Linker::linkKnown( $wlh, $caption );
+               $linkRenderer = $this->getLinkRenderer();
+               return $linkRenderer->makeKnownLink( $wlh, $caption );
        }
 
        /**
@@ -115,10 +116,11 @@ class MostlinkedPage extends QueryPage {
                        );
                }
 
-               $link = Linker::link( $title );
+               $linkRenderer = $this->getLinkRenderer();
+               $link = $linkRenderer->makeLink( $title );
                $wlh = $this->makeWlhLink(
                        $title,
-                       $this->msg( 'nlinks' )->numParams( $result->value )->escaped()
+                       $this->msg( 'nlinks' )->numParams( $result->value )->text()
                );
 
                return $this->getLanguage()->specialList( $link, $wlh );
index 7fcb9d8..d102791 100644 (file)
@@ -104,7 +104,7 @@ class MostlinkedTemplatesPage extends QueryPage {
                }
 
                return $this->getLanguage()->specialList(
-                       Linker::link( $title ),
+                       $this->getLinkRenderer()->makeLink( $title ),
                        $this->makeWlhLink( $title, $result )
                );
        }
@@ -118,9 +118,9 @@ class MostlinkedTemplatesPage extends QueryPage {
         */
        private function makeWlhLink( $title, $result ) {
                $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
-               $label = $this->msg( 'ntransclusions' )->numParams( $result->value )->escaped();
+               $label = $this->msg( 'ntransclusions' )->numParams( $result->value )->text();
 
-               return Linker::link( $wlh, $label );
+               return $this->getLinkRenderer()->makeLink( $wlh, $label );
        }
 
        protected function getGroupName() {
index 298d6c4..0281b15 100644 (file)
@@ -630,7 +630,9 @@ class MovePageForm extends UnlistedSpecialPage {
                        $newLink )->params( $oldText, $newText )->parseAsBlock() );
                $out->addWikiMsg( $msgName );
 
-               Hooks::run( 'SpecialMovepageAfterMove', [ &$this, &$ot, &$nt ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $movePage = $this;
+               Hooks::run( 'SpecialMovepageAfterMove', [ &$movePage, &$ot, &$nt ] );
 
                # Now we move extra pages we've been asked to move: subpages and talk
                # pages.  First, if the old page or the new page is a talk page, we
index 077a5d2..9e3a750 100644 (file)
@@ -108,7 +108,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                        unset( $formDescriptor['hidepatrolled'] );
                }
 
-               $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+               HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
                        ->setWrapperLegendMsg( 'newimages-legend' )
                        ->setSubmitTextMsg( 'ilsubmit' )
                        ->setMethod( 'get' )
index 61b6a8c..db05ebe 100644 (file)
@@ -89,6 +89,12 @@ class SpecialPageLanguage extends FormSpecialPage {
                        'default' => $this->getConfig()->get( 'LanguageCode' ),
                ];
 
+               // Allow user to enter a comment explaining the change
+               $page['reason'] = [
+                       'type' => 'text',
+                       'label-message' => 'pagelang-reason'
+               ];
+
                return $page;
        }
 
@@ -111,68 +117,110 @@ class SpecialPageLanguage extends FormSpecialPage {
        /**
         *
         * @param array $data
-        * @return bool
+        * @return Status
         */
        public function onSubmit( array $data ) {
-               $title = Title::newFromText( $data['pagename'] );
+               $pageName = $data['pagename'];
 
-               // Check if title is valid
-               if ( !$title ) {
-                       return false;
+               // Check if user wants to use default language
+               if ( $data['selectoptions'] == 1 ) {
+                       $newLanguage = 'default';
+               } else {
+                       $newLanguage = $data['language'];
                }
 
+               try {
+                       $title = Title::newFromTextThrow( $pageName );
+               } catch ( MalformedTitleException $ex ) {
+                       return Status::newFatal( $ex->getMessageObject() );
+               }
+
+               // Url to redirect to after the operation
+               $this->goToUrl = $title->getFullURL(
+                       $title->isRedirect() ? [ 'redirect' => 'no' ] : []
+               );
+
+               return self::changePageLanguage(
+                       $this->getContext(),
+                       $title,
+                       $newLanguage,
+                       $data['reason'] === null ? '' : $data['reason']
+               );
+       }
+
+       /**
+        * @param IContextSource $context
+        * @param Title $title
+        * @param string $newLanguage Language code
+        * @param string $reason Reason for the change
+        * @param array $tags Change tags to apply to the log entry
+        * @return Status
+        */
+       public static function changePageLanguage( IContextSource $context, Title $title,
+               $newLanguage, $reason, array $tags = [] ) {
                // Get the default language for the wiki
-               $defLang = $this->getConfig()->get( 'LanguageCode' );
+               $defLang = $context->getConfig()->get( 'LanguageCode' );
 
                $pageId = $title->getArticleID();
 
                // Check if article exists
                if ( !$pageId ) {
-                       return false;
+                       return Status::newFatal(
+                               'pagelang-nonexistent-page',
+                               wfEscapeWikiText( $title->getPrefixedText() )
+                       );
                }
 
                // Load the page language from DB
                $dbw = wfGetDB( DB_MASTER );
-               $langOld = $dbw->selectField(
+               $oldLanguage = $dbw->selectField(
                        'page',
                        'page_lang',
                        [ 'page_id' => $pageId ],
                        __METHOD__
                );
 
-               // Url to redirect to after the operation
-               $this->goToUrl = $title->getFullURL();
-
-               // Check if user wants to use default language
-               if ( $data['selectoptions'] == 1 ) {
-                       $langNew = null;
-               } else {
-                       $langNew = $data['language'];
+               // Check if user wants to use the default language
+               if ( $newLanguage === 'default' ) {
+                       $newLanguage = null;
                }
 
                // No change in language
-               if ( $langNew === $langOld ) {
-                       return false;
+               if ( $newLanguage === $oldLanguage ) {
+                       // Check if old language does not exist
+                       if ( !$oldLanguage ) {
+                               return Status::newFatal( ApiMessage::create(
+                                       [
+                                               'pagelang-unchanged-language-default',
+                                               wfEscapeWikiText( $title->getPrefixedText() )
+                                       ],
+                                       'pagelang-unchanged-language'
+                               ) );
+                       }
+                       return Status::newFatal(
+                               'pagelang-unchanged-language',
+                               wfEscapeWikiText( $title->getPrefixedText() ),
+                               $oldLanguage
+                       );
                }
 
                // Hardcoded [def] if the language is set to null
-               $logOld = $langOld ? $langOld : $defLang . '[def]';
-               $logNew = $langNew ? $langNew : $defLang . '[def]';
+               $logOld = $oldLanguage ? $oldLanguage : $defLang . '[def]';
+               $logNew = $newLanguage ? $newLanguage : $defLang . '[def]';
 
                // Writing new page language to database
-               $dbw = wfGetDB( DB_MASTER );
                $dbw->update(
                        'page',
-                       [ 'page_lang' => $langNew ],
+                       [ 'page_lang' => $newLanguage ],
                        [
                                'page_id' => $pageId,
-                               'page_lang' => $langOld
+                               'page_lang' => $oldLanguage
                        ],
                        __METHOD__
                );
 
                if ( !$dbw->affectedRows() ) {
-                       return false;
+                       return Status::newFatal( 'pagelang-db-failed' );
                }
 
                // Logging change of language
@@ -181,9 +229,11 @@ class SpecialPageLanguage extends FormSpecialPage {
                        '5::newlanguage' => $logNew
                ];
                $entry = new ManualLogEntry( 'pagelang', 'pagelang' );
-               $entry->setPerformer( $this->getUser() );
+               $entry->setPerformer( $context->getUser() );
                $entry->setTarget( $title );
                $entry->setParameters( $logParams );
+               $entry->setComment( $reason );
+               $entry->setTags( $tags );
 
                $logid = $entry->insert();
                $entry->publish( $logid );
@@ -191,7 +241,11 @@ class SpecialPageLanguage extends FormSpecialPage {
                // Force re-render so that language-based content (parser functions etc.) gets updated
                $title->invalidateCache();
 
-               return true;
+               return Status::newGood( (object)[
+                       'oldLanguage' => $logOld,
+                       'newLanguage' => $logNew,
+                       'logId' => $logid,
+               ] );
        }
 
        public function onSuccess() {
index 706a1d7..37006d8 100644 (file)
@@ -133,7 +133,7 @@ class SpecialPagesWithProp extends QueryPage {
         */
        function formatResult( $skin, $result ) {
                $title = Title::newFromRow( $result );
-               $ret = Linker::link( $title, null, [], [], [ 'known' ] );
+               $ret = $this->getLinkRenderer()->makeKnownLink( $title );
                if ( $result->pp_value !== '' ) {
                        // Do not show very long or binary values on the special page
                        $valueLength = strlen( $result->pp_value );
index 5e5f2f1..a4f16bd 100644 (file)
@@ -100,14 +100,6 @@ class SpecialPasswordReset extends FormSpecialPage {
                        ];
                }
 
-               if ( $this->getUser()->isAllowed( 'passwordreset' ) ) {
-                       $a['Capture'] = [
-                               'type' => 'check',
-                               'label-message' => 'passwordreset-capture',
-                               'help-message' => 'passwordreset-capture-help',
-                       ];
-               }
-
                return $a;
        }
 
@@ -144,22 +136,12 @@ class SpecialPasswordReset extends FormSpecialPage {
         * @return Status
         */
        public function onSubmit( array $data ) {
-               if ( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
-                       // The user knows they don't have the passwordreset permission,
-                       // but they tried to spoof the form. That's naughty
-                       throw new PermissionsError( 'passwordreset' );
-               }
-
                $username = isset( $data['Username'] ) ? $data['Username'] : null;
                $email = isset( $data['Email'] ) ? $data['Email'] : null;
-               $capture = !empty( $data['Capture'] );
 
                $this->method = $username ? 'username' : 'email';
                $this->result = Status::wrap(
-                       $this->getPasswordReset()->execute( $this->getUser(), $username, $email, $capture ) );
-               if ( $capture && $this->result->isOK() ) {
-                       $this->passwords = $this->result->getValue();
-               }
+                       $this->getPasswordReset()->execute( $this->getUser(), $username, $email ) );
 
                if ( $this->result->hasMessage( 'actionthrottledtext' ) ) {
                        throw new ThrottledError;
@@ -169,26 +151,6 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        public function onSuccess() {
-               if ( $this->getUser()->isAllowed( 'passwordreset' ) && $this->passwords ) {
-                       if ( $this->result->isGood() ) {
-                               $this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture2',
-                                       count( $this->passwords ) );
-                       } else {
-                               $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture2',
-                                       $this->result->getMessage(), key( $this->passwords ), count( $this->passwords ) );
-                       }
-
-                       $this->getOutput()->addHTML( Html::openElement( 'ul' ) );
-                       foreach ( $this->passwords as $username => $pwd ) {
-                               $this->getOutput()->addHTML( Html::rawElement( 'li', [],
-                                       htmlspecialchars( $username, ENT_QUOTES )
-                                       . $this->msg( 'colon-separator' )->text()
-                                       . htmlspecialchars( $pwd, ENT_QUOTES )
-                               ) );
-                       }
-                       $this->getOutput()->addHTML( Html::closeElement( 'ul' ) );
-               }
-
                if ( $this->method === 'email' ) {
                        $this->getOutput()->addWikiMsg( 'passwordreset-emailsentemail' );
                } else {
index 5e3e430..4671591 100644 (file)
@@ -228,9 +228,9 @@ class SpecialPrefixindex extends SpecialAllPages {
                                                $displayed = substr( $displayed, $prefixLength );
                                        }
                                        $link = ( $title->isRedirect() ? '<div class="allpagesredirect">' : '' ) .
-                                               Linker::linkKnown(
+                                               $this->getLinkRenderer()->makeKnownLink(
                                                        $title,
-                                                       htmlspecialchars( $displayed )
+                                                       $displayed
                                                ) .
                                                ( $title->isRedirect() ? '</div>' : '' );
 
@@ -275,9 +275,9 @@ class SpecialPrefixindex extends SpecialAllPages {
                                $query['namespace'] = $namespace;
                        }
 
-                       $nextLink = Linker::linkKnown(
+                       $nextLink = $this->getLinkRenderer()->makeKnownLink(
                                $this->getPageTitle(),
-                               $this->msg( 'nextpage', str_replace( '_', ' ', $nextRow->page_title ) )->escaped(),
+                               $this->msg( 'nextpage', str_replace( '_', ' ', $nextRow->page_title ) )->text(),
                                [],
                                $query
                        );
index c800d96..fa9033c 100644 (file)
@@ -84,7 +84,7 @@ class SpecialProtectedtitles extends SpecialPage {
                        ) . "\n";
                }
 
-               $link = Linker::link( $title );
+               $link = $this->getLinkRenderer()->makeLink( $title );
                $description_items = [];
                // Messages: restriction-level-sysop, restriction-level-autoconfirmed
                $protType = $this->msg( 'restriction-level-' . $row->pt_create_perm )->escaped();
index cd3299c..975e210 100644 (file)
@@ -91,11 +91,13 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
 
+               $opts->add( 'userExpLevel', 'all' );
+
                return $opts;
        }
 
        /**
-        * Get custom show/hide filters
+        * Get all custom filters
         *
         * @return array Map of filter URL param names to properties (msg/default)
         */
@@ -240,6 +242,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $opts['tagfilter']
                );
 
+               $this->filterOnUserExperienceLevel( $tables, $conds, $join_conds, $opts );
+
                if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds,
                        $opts )
                ) {
@@ -501,7 +505,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $extraOpts['category'] = $this->categoryFilterForm( $opts );
                }
 
-               $tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
+               $tagFilter = ChangeTags::buildTagFilterSelector(
+                       $opts['tagfilter'], false, $this->getContext() );
                if ( count( $tagFilter ) ) {
                        $extraOpts['tagfilter'] = $tagFilter;
                }
@@ -521,6 +526,14 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                parent::addModules();
                $out = $this->getOutput();
                $out->addModules( 'mediawiki.special.recentchanges' );
+               if ( $this->getUser()->getOption(
+                               'rcenhancedfilters',
+                               /*default=*/ null,
+                               /*ignoreHidden=*/ true
+                       )
+               ) {
+                       $out->addModules( 'mediawiki.rcfilters.filters.ui' );
+               }
        }
 
        /**
@@ -664,12 +677,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
                unset( $value );
 
-               $text = htmlspecialchars( $title );
                if ( $active ) {
-                       $text = '<strong>' . $text . '</strong>';
+                       $title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
                }
 
-               return Linker::linkKnown( $this->getPageTitle(), $text, [], $params );
+               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
        }
 
        /**
@@ -747,9 +759,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $showhide = [ 'show', 'hide' ];
 
-               foreach ( $this->getCustomFilters() as $key => $params ) {
+               foreach ( $this->getRenderableCustomFilters( $this->getCustomFilters() ) as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
+
                // Disable some if needed
                if ( !$user->useRCPatrol() ) {
                        unset( $filters['hidepatrolled'] );
@@ -802,4 +815,65 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                return 60 * 5;
        }
 
+       function filterOnUserExperienceLevel( &$tables, &$conds, &$join_conds, $opts ) {
+               global $wgLearnerEdits,
+                          $wgExperiencedUserEdits,
+                          $wgLearnerMemberSince,
+                          $wgExperiencedUserMemberSince;
+
+               $selectedExpLevels = explode( ',', strtolower( $opts['userExpLevel'] ) );
+               // remove values that are not recognized
+               $selectedExpLevels = array_intersect(
+                       $selectedExpLevels,
+                       [ 'newcomer', 'learner', 'experienced' ]
+               );
+               sort( $selectedExpLevels );
+
+               if ( $selectedExpLevels ) {
+                       $tables[] = 'user';
+                       $join_conds['user'] = [ 'LEFT JOIN', 'rc_user = user_id' ];
+
+                       $now = time();
+                       $secondsPerDay = 86400;
+                       $learnerCutoff = $now - $wgLearnerMemberSince * $secondsPerDay;
+                       $experiencedUserCutoff = $now - $wgExperiencedUserMemberSince * $secondsPerDay;
+
+                       $aboveNewcomer = $this->getDB()->makeList(
+                               [
+                                       'user_editcount >= ' . intval( $wgLearnerEdits ),
+                                       'user_registration <= ' . $this->getDB()->timestamp( $learnerCutoff ),
+                               ],
+                               IDatabase::LIST_AND
+                       );
+
+                       $aboveLearner = $this->getDB()->makeList(
+                               [
+                                       'user_editcount >= ' . intval( $wgExperiencedUserEdits ),
+                                       'user_registration <= ' . $this->getDB()->timestamp( $experiencedUserCutoff ),
+                               ],
+                               IDatabase::LIST_AND
+                       );
+
+                       if ( $selectedExpLevels === [ 'newcomer' ] ) {
+                               $conds[] =  "NOT ( $aboveNewcomer )";
+                       } elseif ( $selectedExpLevels === [ 'learner' ] ) {
+                               $conds[] = $this->getDB()->makeList(
+                                       [ $aboveNewcomer, "NOT ( $aboveLearner )" ],
+                                       IDatabase::LIST_AND
+                               );
+                       } elseif ( $selectedExpLevels === [ 'experienced' ] ) {
+                               $conds[] = $aboveLearner;
+                       } elseif ( $selectedExpLevels === [ 'learner', 'newcomer' ] ) {
+                               $conds[] = "NOT ( $aboveLearner )";
+                       } elseif ( $selectedExpLevels === [ 'experienced', 'newcomer' ] ) {
+                               $conds[] = $this->getDB()->makeList(
+                                       [ "NOT ( $aboveNewcomer )", $aboveLearner ],
+                                       IDatabase::LIST_OR
+                               );
+                       } elseif ( $selectedExpLevels === [ 'experienced', 'learner' ] ) {
+                               $conds[] = $aboveNewcomer;
+                       }
+               }
+       }
+
 }
index dcaff4d..4b0fa00 100644 (file)
@@ -241,32 +241,33 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         * Show some useful links in the subtitle
         */
        protected function showConvenienceLinks() {
+               $linkRenderer = $this->getLinkRenderer();
                # Give a link to the logs/hist for this page
                if ( $this->targetObj ) {
                        // Also set header tabs to be for the target.
                        $this->getSkin()->setRelevantTitle( $this->targetObj );
 
                        $links = [];
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Log' ),
-                               $this->msg( 'viewpagelogs' )->escaped(),
+                               $this->msg( 'viewpagelogs' )->text(),
                                [],
                                [ 'page' => $this->targetObj->getPrefixedText() ]
                        );
                        if ( !$this->targetObj->isSpecialPage() ) {
                                # Give a link to the page history
-                               $links[] = Linker::linkKnown(
+                               $links[] = $linkRenderer->makeKnownLink(
                                        $this->targetObj,
-                                       $this->msg( 'pagehist' )->escaped(),
+                                       $this->msg( 'pagehist' )->text(),
                                        [],
                                        [ 'action' => 'history' ]
                                );
                                # Link to deleted edits
                                if ( $this->getUser()->isAllowed( 'undelete' ) ) {
                                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
-                                       $links[] = Linker::linkKnown(
+                                       $links[] = $linkRenderer->makeKnownLink(
                                                $undelete,
-                                               $this->msg( 'deletedhist' )->escaped(),
+                                               $this->msg( 'deletedhist' )->text(),
                                                [],
                                                [ 'target' => $this->targetObj->getPrefixedDBkey() ]
                                        );
@@ -465,9 +466,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                Xml::closeElement( 'form' ) . "\n";
                        // Show link to edit the dropdown reasons
                        if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
-                               $link = Linker::linkKnown(
+                               $link = $this->getLinkRenderer()->makeKnownLink(
                                        $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->getTitle(),
-                                       $this->msg( 'revdelete-edit-reasonlist' )->escaped(),
+                                       $this->msg( 'revdelete-edit-reasonlist' )->text(),
                                        [],
                                        [ 'action' => 'edit' ]
                                );
index e1e2049..761610e 100644 (file)
@@ -41,14 +41,10 @@ class SpecialRunJobs extends UnlistedSpecialPage {
        public function execute( $par = '' ) {
                $this->getOutput()->disable();
                if ( wfReadOnly() ) {
-                       // HTTP 423 Locked
-                       HttpStatus::header( 423 );
-                       print 'Wiki is in read-only mode';
-
+                       wfHttpError( 423, 'Locked', 'Wiki is in read-only mode.' );
                        return;
                } elseif ( !$this->getRequest()->wasPosted() ) {
-                       HttpStatus::header( 400 );
-                       print 'Request must be POSTed';
+                       wfHttpError( 400, 'Bad Request', 'Request must be POSTed.' );
                        return;
                }
 
@@ -58,8 +54,9 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
                $missing = array_diff_key( $required, $params );
                if ( count( $missing ) ) {
-                       HttpStatus::header( 400 );
-                       print 'Missing parameters: ' . implode( ', ', array_keys( $missing ) );
+                       wfHttpError( 400, 'Bad Request',
+                               'Missing parameters: ' . implode( ', ', array_keys( $missing ) )
+                       );
                        return;
                }
 
@@ -71,8 +68,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $verified = is_string( $providedSignature )
                        && hash_equals( $correctSignature, $providedSignature );
                if ( !$verified || $params['sigexpiry'] < time() ) {
-                       HttpStatus::header( 400 );
-                       print 'Invalid or stale signature provided';
+                       wfHttpError( 400, 'Bad Request', 'Invalid or stale signature provided.' );
                        return;
                }
 
index 9280b04..b7356e7 100644 (file)
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Widget\Search\BasicSearchResultSetWidget;
+use MediaWiki\Widget\Search\FullSearchResultWidget;
+use MediaWiki\Widget\Search\InterwikiSearchResultWidget;
+use MediaWiki\Widget\Search\InterwikiSearchResultSetWidget;
+use MediaWiki\Widget\Search\SimpleSearchResultWidget;
+use MediaWiki\Widget\Search\SimpleSearchResultSetWidget;
 
 /**
  * implements Special:Search - Run text & title search and display the output
@@ -75,12 +81,6 @@ class SpecialSearch extends SpecialPage {
         */
        protected $runSuggestion = true;
 
-       /**
-        * Names of the wikis, in format: Interwiki prefix -> caption
-        * @var array
-        */
-       protected $customCaptions;
-
        /**
         * Search engine configurations.
         * @var SearchEngineConfig
@@ -101,35 +101,29 @@ class SpecialSearch extends SpecialPage {
         */
        public function execute( $par ) {
                $request = $this->getRequest();
+               $out = $this->getOutput();
 
                // Fetch the search term
-               $search = str_replace( "\n", " ", $request->getText( 'search' ) );
+               $term = str_replace( "\n", " ", $request->getText( 'search' ) );
 
                // Historically search terms have been accepted not only in the search query
                // parameter, but also as part of the primary url. This can have PII implications
                // in releasing page view data. As such issue a 301 redirect to the correct
                // URL.
-               if ( strlen( $par ) && !strlen( $search ) ) {
+               if ( strlen( $par ) && !strlen( $term ) ) {
                        $query = $request->getValues();
                        unset( $query['title'] );
                        // Strip underscores from title parameter; most of the time we'll want
                        // text form here. But don't strip underscores from actual text params!
                        $query['search'] = str_replace( '_', ' ', $par );
-                       $this->getOutput()->redirect( $this->getPageTitle()->getFullURL( $query ), 301 );
+                       $out->redirect( $this->getPageTitle()->getFullURL( $query ), 301 );
                        return;
                }
 
-               $this->setHeaders();
-               $this->outputHeader();
-               $out = $this->getOutput();
-               $out->allowClickjacking();
-               $out->addModuleStyles( [
-                       'mediawiki.special', 'mediawiki.special.search.styles', 'mediawiki.ui', 'mediawiki.ui.button',
-                       'mediawiki.ui.input', 'mediawiki.widgets.SearchInputWidget.styles',
-               ] );
-               $this->addHelpLink( 'Help:Searching' );
-
+               // Need to load selected namespaces before handling nsRemember
                $this->load();
+               // TODO: This performs database actions on GET request, which is going to
+               // be a problem for our multi-datacenter work.
                if ( !is_null( $request->getVal( 'nsRemember' ) ) ) {
                        $this->saveNamespaces();
                        // Remove the token from the URL to prevent the user from inadvertently
@@ -141,16 +135,48 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
-               $out->addJsConfigVars( [ 'searchTerm' => $search ] );
                $this->searchEngineType = $request->getVal( 'srbackend' );
-
-               if ( $request->getVal( 'fulltext' )
-                       || !is_null( $request->getVal( 'offset' ) )
+               if (
+                       !$request->getVal( 'fulltext' ) &&
+                       $request->getVal( 'offset' ) === null
                ) {
-                       $this->showResults( $search );
-               } else {
-                       $this->goResult( $search );
+                       $url = $this->goResult( $term );
+                       if ( $url !== null ) {
+                               // successful 'go'
+                               $out->redirect( $url );
+                               return;
+                       }
                }
+
+               $this->setupPage( $term );
+
+               if ( $this->getConfig()->get( 'DisableTextSearch' ) ) {
+                       $searchForwardUrl = $this->getConfig()->get( 'SearchForwardUrl' );
+                       if ( $searchForwardUrl ) {
+                               $url = str_replace( '$1', urlencode( $term ), $searchForwardUrl );
+                               $out->redirect( $url );
+                       } else {
+                               $out->addHTML(
+                                       "<fieldset>" .
+                                               "<legend>" .
+                                                       $this->msg( 'search-external' )->escaped() .
+                                               "</legend>" .
+                                               "<p class='mw-searchdisabled'>" .
+                                                       $this->msg( 'searchdisabled' )->escaped() .
+                                               "</p>" .
+                                               $this->msg( 'googlesearch' )->rawParams(
+                                                       htmlspecialchars( $term ),
+                                                       'UTF-8',
+                                                       $this->msg( 'searchbutton' )->escaped()
+                                               )->text() .
+                                       "</fieldset>"
+                               );
+                       }
+
+                       return;
+               }
+
+               $this->showResults( $term );
        }
 
        /**
@@ -209,32 +235,25 @@ class SpecialSearch extends SpecialPage {
         * If an exact title match can be found, jump straight ahead to it.
         *
         * @param string $term
+        * @return string|null The url to redirect to, or null if no redirect.
         */
        public function goResult( $term ) {
-               $this->setupPage( $term );
-               # Try to go to page as entered.
-               $title = Title::newFromText( $term );
                # If the string cannot be used to create a title
-               if ( is_null( $title ) ) {
-                       $this->showResults( $term );
-
-                       return;
+               if ( is_null( Title::newFromText( $term ) ) ) {
+                       return null;
                }
                # If there's an exact or very near match, jump right there.
                $title = $this->getSearchEngine()
                        ->getNearMatcher( $this->getConfig() )->getNearMatch( $term );
-
-               if ( !is_null( $title ) &&
-                       Hooks::run( 'SpecialSearchGoResult', [ $term, $title, &$url ] )
-               ) {
-                       if ( $url === null ) {
-                               $url = $title->getFullURL();
-                       }
-                       $this->getOutput()->redirect( $url );
-
-                       return;
+               if ( is_null( $title ) ) {
+                       return null;
                }
-               $this->showResults( $term );
+               $url = null;
+               if ( !Hooks::run( 'SpecialSearchGoResult', [ $term, $title, &$url ] ) ) {
+                       return null;
+               }
+
+               return $url === null ? $title->getFullURL() : $url;
        }
 
        /**
@@ -243,6 +262,33 @@ class SpecialSearch extends SpecialPage {
        public function showResults( $term ) {
                global $wgContLang;
 
+               if ( $this->searchEngineType !== null ) {
+                       $this->setExtraParam( 'srbackend', $this->searchEngineType );
+               }
+
+               $out = $this->getOutput();
+               $formWidget = new MediaWiki\Widget\Search\SearchFormWidget(
+                       $this,
+                       $this->searchConfig,
+                       $this->getSearchProfiles()
+               );
+               $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
+               if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
+                       // Empty query -- straight view of search form
+                       if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
+                               # Hook requested termination
+                               return;
+                       }
+                       $out->enableOOUI();
+                       // The form also contains the 'Showing results 0 - 20 of 1234' so we can
+                       // only do the form render here for the empty $term case. Rendering
+                       // the form when a search is provided is repeated below.
+                       $out->addHTML( $formWidget->render(
+                               $this->profile, $term, 0, 0, $this->offset, $this->isPowerSearch()
+                       ) );
+                       return;
+               }
+
                $search = $this->getSearchEngine();
                $search->setFeatureData( 'rewrite', $this->runSuggestion );
                $search->setLimitOffset( $this->limit, $this->offset );
@@ -251,34 +297,8 @@ class SpecialSearch extends SpecialPage {
                $term = $search->transformSearchTerm( $term );
 
                Hooks::run( 'SpecialSearchSetupEngine', [ $this, $this->profile, $search ] );
-
-               $this->setupPage( $term );
-
-               $out = $this->getOutput();
-
-               if ( $this->getConfig()->get( 'DisableTextSearch' ) ) {
-                       $searchFowardUrl = $this->getConfig()->get( 'SearchForwardUrl' );
-                       if ( $searchFowardUrl ) {
-                               $url = str_replace( '$1', urlencode( $term ), $searchFowardUrl );
-                               $out->redirect( $url );
-                       } else {
-                               $out->addHTML(
-                                       Xml::openElement( 'fieldset' ) .
-                                       Xml::element( 'legend', null, $this->msg( 'search-external' )->text() ) .
-                                       Xml::element(
-                                               'p',
-                                               [ 'class' => 'mw-searchdisabled' ],
-                                               $this->msg( 'searchdisabled' )->text()
-                                       ) .
-                                       $this->msg( 'googlesearch' )->rawParams(
-                                               htmlspecialchars( $term ),
-                                               'UTF-8',
-                                               $this->msg( 'searchbutton' )->escaped()
-                                       )->text() .
-                                       Xml::closeElement( 'fieldset' )
-                               );
-                       }
-
+               if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
+                       # Hook requested termination
                        return;
                }
 
@@ -295,36 +315,9 @@ class SpecialSearch extends SpecialPage {
                $textStatus = null;
                if ( $textMatches instanceof Status ) {
                        $textStatus = $textMatches;
-                       $textMatches = null;
-               }
-
-               // did you mean... suggestions
-               $didYouMeanHtml = '';
-               if ( $showSuggestion && $textMatches && !$textStatus ) {
-                       if ( $textMatches->hasRewrittenQuery() ) {
-                               $didYouMeanHtml = $this->getDidYouMeanRewrittenHtml( $term, $textMatches );
-                       } elseif ( $textMatches->hasSuggestion() ) {
-                               $didYouMeanHtml = $this->getDidYouMeanHtml( $textMatches );
-                       }
-               }
-
-               if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
-                       # Hook requested termination
-                       return;
+                       $textMatches = $textStatus->getValue();
                }
 
-               // start rendering the page
-               $out->addHTML(
-                       Xml::openElement(
-                               'form',
-                               [
-                                       'id' => ( $this->isPowerSearch() ? 'powersearch' : 'search' ),
-                                       'method' => 'get',
-                                       'action' => wfScript(),
-                               ]
-                       )
-               );
-
                // Get number of results
                $titleMatchesNum = $textMatchesNum = $numTitleMatches = $numTextMatches = 0;
                if ( $titleMatches ) {
@@ -334,112 +327,94 @@ class SpecialSearch extends SpecialPage {
                if ( $textMatches ) {
                        $textMatchesNum = $textMatches->numRows();
                        $numTextMatches = $textMatches->getTotalHits();
+                       if ( $textMatchesNum > 0 ) {
+                               $search->augmentSearchResults( $textMatches );
+                       }
                }
                $num = $titleMatchesNum + $textMatchesNum;
                $totalRes = $numTitleMatches + $numTextMatches;
 
+               // start rendering the page
                $out->enableOOUI();
-               $out->addHTML(
-                       # This is an awful awful ID name. It's not a table, but we
-                       # named it poorly from when this was a table so now we're
-                       # stuck with it
-                       Xml::openElement( 'div', [ 'id' => 'mw-search-top-table' ] ) .
-                       $this->shortDialog( $term, $num, $totalRes ) .
-                       Xml::closeElement( 'div' ) .
-                       $this->searchProfileTabs( $term ) .
-                       $this->searchOptions( $term ) .
-                       Xml::closeElement( 'form' ) .
-                       $didYouMeanHtml
-               );
+               $out->addHTML( $formWidget->render(
+                       $this->profile, $term, $num, $totalRes, $this->offset, $this->isPowerSearch()
+               ) );
 
-               $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
-               if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
-                       // Empty query -- straight view of search form
-                       return;
+               // did you mean... suggestions
+               if ( $textMatches ) {
+                       $dymWidget = new MediaWiki\Widget\Search\DidYouMeanWidget( $this );
+                       $out->addHTML( $dymWidget->render( $term, $textMatches ) );
                }
 
                $out->addHTML( "<div class='searchresults'>" );
 
-               // prev/next links
-               $prevnext = null;
-               if ( $num || $this->offset ) {
-                       // Show the create link ahead
-                       $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                       if ( $totalRes > $this->limit || $this->offset ) {
-                               if ( $this->searchEngineType !== null ) {
-                                       $this->setExtraParam( 'srbackend', $this->searchEngineType );
-                               }
-                               $prevnext = $this->getLanguage()->viewPrevNext(
-                                       $this->getPageTitle(),
-                                       $this->offset,
-                                       $this->limit,
-                                       $this->powerSearchOptions() + [ 'search' => $term ],
-                                       $this->limit + $this->offset >= $totalRes
-                               );
+               $hasErrors = $textStatus && $textStatus->getErrors();
+               $hasOtherResults = $textMatches &&
+                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+
+               if ( $hasErrors ) {
+                       list( $error, $warning ) = $textStatus->splitByErrorType();
+                       if ( $error->getErrors() ) {
+                               $out->addHTML( Html::rawElement(
+                                       'div',
+                                       [ 'class' => 'errorbox' ],
+                                       $error->getHTML( 'search-error' )
+                               ) );
+                       }
+                       if ( $warning->getErrors() ) {
+                               $out->addHTML( Html::rawElement(
+                                       'div',
+                                       [ 'class' => 'warningbox' ],
+                                       $warning->getHTML( 'search-warning' )
+                               ) );
                        }
                }
+
+               // Show the create link ahead
+               $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
+
                Hooks::run( 'SpecialSearchResults', [ $term, &$titleMatches, &$textMatches ] );
 
-               $out->parserOptions()->setEditSection( false );
-               if ( $titleMatches ) {
-                       if ( $numTitleMatches > 0 ) {
-                               $out->wrapWikiMsg( "==$1==\n", 'titlematches' );
-                               $out->addHTML( $this->showMatches( $titleMatches ) );
-                       }
-                       $titleMatches->free();
+               // If we have no results and have not already displayed an error message
+               if ( $num === 0 && !$hasErrors ) {
+                       $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", [
+                               $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
+                               wfEscapeWikiText( $term )
+                       ] );
                }
-               if ( $textMatches && !$textStatus ) {
-                       // output appropriate heading
-                       if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
-                               $out->addHTML( '<div class="mw-search-visualclear"></div>' );
-                               // if no title matches the heading is redundant
-                               $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
-                       }
 
-                       // show results
-                       if ( $numTextMatches > 0 ) {
-                               $search->augmentSearchResults( $textMatches );
-                               $out->addHTML( $this->showMatches( $textMatches ) );
-                       }
+               // Although $num might be 0 there can still be secondary or inline
+               // results to display.
+               $linkRenderer = $this->getLinkRenderer();
+               $mainResultWidget = new FullSearchResultWidget( $this, $linkRenderer );
 
-                       // show secondary interwiki results if any
-                       if ( $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
-                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(
-                                               SearchResultSet::SECONDARY_RESULTS ), $term ) );
-                       }
+               if ( $search->getFeatureData( 'enable-new-crossproject-page' ) ) {
+
+                       $sidebarResultWidget = new InterwikiSearchResultWidget( $this, $linkRenderer );
+                       $sidebarResultsWidget = new InterwikiSearchResultSetWidget(
+                               $this,
+                               $sidebarResultWidget,
+                               $linkRenderer,
+                               MediaWikiServices::getInstance()->getInterwikiLookup()
+                       );
+               } else {
+                       $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer );
+                       $sidebarResultsWidget = new SimpleSearchResultSetWidget(
+                               $this,
+                               $sidebarResultWidget,
+                               $linkRenderer,
+                               MediaWikiServices::getInstance()->getInterwikiLookup()
+                       );
                }
 
-               $hasOtherResults = $textMatches &&
-                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+               $widget = new BasicSearchResultSetWidget( $this, $mainResultWidget, $sidebarResultsWidget );
 
-               if ( $num === 0 ) {
-                       if ( $textStatus ) {
-                               $out->addHTML( '<div class="error">' .
-                                       $textStatus->getMessage( 'search-error' ) . '</div>' );
-                       } else {
-                               if ( !$this->offset ) {
-                                       // If we have an offset the create link was rendered earlier in this function.
-                                       // This class needs a good de-spaghettification, but for now this will
-                                       // do the job.
-                                       $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                               }
-                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
-                                       [ $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
-                                                       wfEscapeWikiText( $term )
-                                       ] );
-                       }
-               }
+               $out->addHTML( $widget->render(
+                       $term, $this->offset, $titleMatches, $textMatches
+               ) );
 
-               if ( $hasOtherResults ) {
-                       foreach ( $textMatches->getInterwikiResults( SearchResultSet::INLINE_RESULTS )
-                                               as $interwiki => $interwikiResult ) {
-                               if ( $interwikiResult instanceof Status || $interwikiResult->numRows() == 0 ) {
-                                       // ignore bad interwikis for now
-                                       continue;
-                               }
-                               // TODO: wiki header
-                               $out->addHTML( $this->showMatches( $interwikiResult, $interwiki ) );
-                       }
+               if ( $titleMatches ) {
+                       $titleMatches->free();
                }
 
                if ( $textMatches ) {
@@ -448,100 +423,24 @@ class SpecialSearch extends SpecialPage {
 
                $out->addHTML( '<div class="mw-search-visualclear"></div>' );
 
-               if ( $prevnext ) {
+               // prev/next links
+               if ( $totalRes > $this->limit || $this->offset ) {
+                       $prevnext = $this->getLanguage()->viewPrevNext(
+                               $this->getPageTitle(),
+                               $this->offset,
+                               $this->limit,
+                               $this->powerSearchOptions() + [ 'search' => $term ],
+                               $this->limit + $this->offset >= $totalRes
+                       );
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
 
+               // Close <div class='searchresults'>
                $out->addHTML( "</div>" );
 
                Hooks::run( 'SpecialSearchResultsAppend', [ $this, $out, $term ] );
        }
 
-       /**
-        * Produce wiki header for interwiki results
-        * @param string $interwiki Interwiki name
-        * @param SearchResultSet $interwikiResult The result set
-        * @return string
-        */
-       protected function interwikiHeader( $interwiki, $interwikiResult ) {
-               // TODO: we need to figure out how to name wikis correctly
-               $wikiMsg = $this->msg( 'search-interwiki-results-' . $interwiki )->parse();
-               return "<p class=\"mw-search-interwiki-header mw-search-visualclear\">\n$wikiMsg</p>";
-       }
-
-       /**
-        * Generates HTML shown to the user when we have a suggestion about a query
-        * that might give more results than their current query.
-        */
-       protected function getDidYouMeanHtml( SearchResultSet $textMatches ) {
-               # mirror Go/Search behavior of original request ..
-               $params = [ 'search' => $textMatches->getSuggestionQuery() ];
-               if ( $this->fulltext === null ) {
-                       $params['fulltext'] = 'Search';
-               } else {
-                       $params['fulltext'] = $this->fulltext;
-               }
-               $stParams = array_merge( $params, $this->powerSearchOptions() );
-
-               $suggest = Linker::linkKnown(
-                       $this->getPageTitle(),
-                       $textMatches->getSuggestionSnippet() ?: null,
-                       [ 'id' => 'mw-search-DYM-suggestion' ],
-                       $stParams
-               );
-
-               # HTML of did you mean... search suggestion link
-               return Html::rawElement(
-                       'div',
-                       [ 'class' => 'searchdidyoumean' ],
-                       $this->msg( 'search-suggest' )->rawParams( $suggest )->parse()
-               );
-       }
-
-       /**
-        * Generates HTML shown to user when their query has been internally rewritten,
-        * and the results of the rewritten query are being returned.
-        *
-        * @param string $term The users search input
-        * @param SearchResultSet $textMatches The response to the users initial search request
-        * @return string HTML linking the user to their original $term query, and the one
-        *  suggested by $textMatches.
-        */
-       protected function getDidYouMeanRewrittenHtml( $term, SearchResultSet $textMatches ) {
-               // Showing results for '$rewritten'
-               // Search instead for '$orig'
-
-               $params = [ 'search' => $textMatches->getQueryAfterRewrite() ];
-               if ( $this->fulltext === null ) {
-                       $params['fulltext'] = 'Search';
-               } else {
-                       $params['fulltext'] = $this->fulltext;
-               }
-               $stParams = array_merge( $params, $this->powerSearchOptions() );
-
-               $rewritten = Linker::linkKnown(
-                       $this->getPageTitle(),
-                       $textMatches->getQueryAfterRewriteSnippet() ?: null,
-                       [ 'id' => 'mw-search-DYM-rewritten' ],
-                       $stParams
-               );
-
-               $stParams['search'] = $term;
-               $stParams['runsuggestion'] = 0;
-               $original = Linker::linkKnown(
-                       $this->getPageTitle(),
-                       htmlspecialchars( $term ),
-                       [ 'id' => 'mw-search-DYM-original' ],
-                       $stParams
-               );
-
-               return Html::rawElement(
-                       'div',
-                       [ 'class' => 'searchdidyoumean' ],
-                       $this->msg( 'search-rewritten' )->rawParams( $rewritten, $original )->escaped()
-               );
-       }
-
        /**
         * @param Title $title
         * @param int $num The number of search results found
@@ -592,10 +491,21 @@ class SpecialSearch extends SpecialPage {
        }
 
        /**
+        * Sets up everything for the HTML output page including styles, javascript,
+        * page title, etc.
+        *
         * @param string $term
         */
        protected function setupPage( $term ) {
                $out = $this->getOutput();
+
+               $this->setHeaders();
+               $this->outputHeader();
+               // TODO: Is this true? The namespace remember uses a user token
+               // on save.
+               $out->allowClickjacking();
+               $this->addHelpLink( 'Help:Searching' );
+
                if ( strval( $term ) !== '' ) {
                        $out->setPageTitle( $this->msg( 'searchresults' ) );
                        $out->setHTMLTitle( $this->msg( 'pagetitle' )
@@ -603,8 +513,13 @@ class SpecialSearch extends SpecialPage {
                                ->inContentLanguage()->text()
                        );
                }
-               // add javascript specific to special:search
+
+               $out->addJsConfigVars( [ 'searchTerm' => $term ] );
                $out->addModules( 'mediawiki.special.search' );
+               $out->addModuleStyles( [
+                       'mediawiki.special', 'mediawiki.special.search.styles', 'mediawiki.ui', 'mediawiki.ui.button',
+                       'mediawiki.ui.input', 'mediawiki.widgets.SearchInputWidget.styles',
+               ] );
        }
 
        /**
@@ -636,17 +551,19 @@ class SpecialSearch extends SpecialPage {
 
        /**
         * Reconstruct the 'power search' options for links
+        * TODO: Instead of exposing this publicly, could we instead expose
+        *  a function for creating search links?
         *
         * @return array
         */
-       protected function powerSearchOptions() {
+       public function powerSearchOptions() {
                $opt = [];
-               if ( !$this->isPowerSearch() ) {
-                       $opt['profile'] = $this->profile;
-               } else {
+               if ( $this->isPowerSearch() ) {
                        foreach ( $this->namespaces as $n ) {
                                $opt['ns' . $n] = 1;
                        }
+               } else {
+                       $opt['profile'] = $this->profile;
                }
 
                return $opt + $this->extraParams;
@@ -689,422 +606,6 @@ class SpecialSearch extends SpecialPage {
                return false;
        }
 
-       /**
-        * Show whole set of results
-        *
-        * @param SearchResultSet $matches
-        * @param string $interwiki Interwiki name
-        *
-        * @return string
-        */
-       protected function showMatches( $matches, $interwiki = null ) {
-               global $wgContLang;
-
-               $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
-               $out = '';
-               $result = $matches->next();
-               $pos = $this->offset;
-
-               if ( $result && $interwiki ) {
-                       $out .= $this->interwikiHeader( $interwiki, $matches );
-               }
-
-               $out .= "<ul class='mw-search-results'>\n";
-               while ( $result ) {
-                       $out .= $this->showHit( $result, $terms, $pos++ );
-                       $result = $matches->next();
-               }
-               $out .= "</ul>\n";
-
-               // convert the whole thing to desired language variant
-               $out = $wgContLang->convert( $out );
-
-               return $out;
-       }
-
-       /**
-        * Format a single hit result
-        *
-        * @param SearchResult $result
-        * @param array $terms Terms to highlight
-        * @param int $position Position within the search results, including offset.
-        *
-        * @return string
-        */
-       protected function showHit( SearchResult $result, $terms, $position ) {
-               if ( $result->isBrokenTitle() ) {
-                       return '';
-               }
-
-               $title = $result->getTitle();
-
-               $titleSnippet = $result->getTitleSnippet();
-
-               if ( $titleSnippet == '' ) {
-                       $titleSnippet = null;
-               }
-
-               $link_t = clone $title;
-               $query = [];
-
-               Hooks::run( 'ShowSearchHitTitle',
-                       [ &$link_t, &$titleSnippet, $result, $terms, $this, &$query ] );
-
-               $link = Linker::linkKnown(
-                       $link_t,
-                       $titleSnippet,
-                       [ 'data-serp-pos' => $position ], // HTML attributes
-                       $query
-               );
-
-               // If page content is not readable, just return the title.
-               // This is not quite safe, but better than showing excerpts from non-readable pages
-               // Note that hiding the entry entirely would screw up paging.
-               if ( !$title->userCan( 'read', $this->getUser() ) ) {
-                       return "<li>{$link}</li>\n";
-               }
-
-               // If the page doesn't *exist*... our search index is out of date.
-               // The least confusing at this point is to drop the result.
-               // You may get less results, but... oh well. :P
-               if ( $result->isMissingRevision() ) {
-                       return '';
-               }
-
-               // format redirects / relevant sections
-               $redirectTitle = $result->getRedirectTitle();
-               $redirectText = $result->getRedirectSnippet();
-               $sectionTitle = $result->getSectionTitle();
-               $sectionText = $result->getSectionSnippet();
-               $categorySnippet = $result->getCategorySnippet();
-
-               $redirect = '';
-               if ( !is_null( $redirectTitle ) ) {
-                       if ( $redirectText == '' ) {
-                               $redirectText = null;
-                       }
-
-                       $redirect = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-redirect' )->rawParams(
-                                       Linker::linkKnown( $redirectTitle, $redirectText ) )->text() .
-                               "</span>";
-               }
-
-               $section = '';
-               if ( !is_null( $sectionTitle ) ) {
-                       if ( $sectionText == '' ) {
-                               $sectionText = null;
-                       }
-
-                       $section = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-section' )->rawParams(
-                                       Linker::linkKnown( $sectionTitle, $sectionText ) )->text() .
-                               "</span>";
-               }
-
-               $category = '';
-               if ( $categorySnippet ) {
-                       $category = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-category' )->rawParams( $categorySnippet )->text() .
-                               "</span>";
-               }
-
-               // format text extract
-               $extract = "<div class='searchresult'>" . $result->getTextSnippet( $terms ) . "</div>";
-
-               $lang = $this->getLanguage();
-
-               // format description
-               $byteSize = $result->getByteSize();
-               $wordCount = $result->getWordCount();
-               $timestamp = $result->getTimestamp();
-               $size = $this->msg( 'search-result-size', $lang->formatSize( $byteSize ) )
-                       ->numParams( $wordCount )->escaped();
-
-               if ( $title->getNamespace() == NS_CATEGORY ) {
-                       $cat = Category::newFromTitle( $title );
-                       $size = $this->msg( 'search-result-category-size' )
-                               ->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
-                               ->escaped();
-               }
-
-               $date = $lang->userTimeAndDate( $timestamp, $this->getUser() );
-
-               $fileMatch = '';
-               // Include a thumbnail for media files...
-               if ( $title->getNamespace() == NS_FILE ) {
-                       $img = $result->getFile();
-                       $img = $img ?: wfFindFile( $title );
-                       if ( $result->isFileMatch() ) {
-                               $fileMatch = "<span class='searchalttitle'>" .
-                                       $this->msg( 'search-file-match' )->escaped() . "</span>";
-                       }
-                       if ( $img ) {
-                               $thumb = $img->transform( [ 'width' => 120, 'height' => 120 ] );
-                               if ( $thumb ) {
-                                       $desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped();
-                                       // Float doesn't seem to interact well with the bullets.
-                                       // Table messes up vertical alignment of the bullets.
-                                       // Bullets are therefore disabled (didn't look great anyway).
-                                       return "<li>" .
-                                               '<table class="searchResultImage">' .
-                                               '<tr>' .
-                                               '<td style="width: 120px; text-align: center; vertical-align: top;">' .
-                                               $thumb->toHtml( [ 'desc-link' => true ] ) .
-                                               '</td>' .
-                                               '<td style="vertical-align: top;">' .
-                                               "{$link} {$redirect} {$category} {$section} {$fileMatch}" .
-                                               $extract .
-                                               "<div class='mw-search-result-data'>{$desc} - {$date}</div>" .
-                                               '</td>' .
-                                               '</tr>' .
-                                               '</table>' .
-                                               "</li>\n";
-                               }
-                       }
-               }
-
-               $html = null;
-
-               $score = '';
-               $related = '';
-               if ( Hooks::run( 'ShowSearchHit', [
-                       $this, $result, $terms,
-                       &$link, &$redirect, &$section, &$extract,
-                       &$score, &$size, &$date, &$related,
-                       &$html
-               ] ) ) {
-                       $html = "<li><div class='mw-search-result-heading'>" .
-                               "{$link} {$redirect} {$category} {$section} {$fileMatch}</div> {$extract}\n" .
-                               "<div class='mw-search-result-data'>{$size} - {$date}</div>" .
-                               "</li>\n";
-               }
-
-               return $html;
-       }
-
-       /**
-        * Extract custom captions from search-interwiki-custom message
-        */
-       protected function getCustomCaptions() {
-               if ( is_null( $this->customCaptions ) ) {
-                       $this->customCaptions = [];
-                       // format per line <iwprefix>:<caption>
-                       $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
-                       foreach ( $customLines as $line ) {
-                               $parts = explode( ":", $line, 2 );
-                               if ( count( $parts ) == 2 ) { // validate line
-                                       $this->customCaptions[$parts[0]] = $parts[1];
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Show results from other wikis
-        *
-        * @param SearchResultSet|array $matches
-        * @param string $query
-        *
-        * @return string
-        */
-       protected function showInterwiki( $matches, $query ) {
-               global $wgContLang;
-
-               $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>" .
-                       $this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
-               $out .= "<ul class='mw-search-iwresults'>\n";
-
-               // work out custom project captions
-               $this->getCustomCaptions();
-
-               if ( !is_array( $matches ) ) {
-                       $matches = [ $matches ];
-               }
-
-               foreach ( $matches as $set ) {
-                       $prev = null;
-                       $result = $set->next();
-                       while ( $result ) {
-                               $out .= $this->showInterwikiHit( $result, $prev, $query );
-                               $prev = $result->getInterwikiPrefix();
-                               $result = $set->next();
-                       }
-               }
-
-               // @todo Should support paging in a non-confusing way (not sure how though, maybe via ajax)..
-               $out .= "</ul></div>\n";
-
-               // convert the whole thing to desired language variant
-               $out = $wgContLang->convert( $out );
-
-               return $out;
-       }
-
-       /**
-        * Show single interwiki link
-        *
-        * @param SearchResult $result
-        * @param string $lastInterwiki
-        * @param string $query
-        *
-        * @return string
-        */
-       protected function showInterwikiHit( $result, $lastInterwiki, $query ) {
-               if ( $result->isBrokenTitle() ) {
-                       return '';
-               }
-
-               $title = $result->getTitle();
-
-               $titleSnippet = $result->getTitleSnippet();
-
-               if ( $titleSnippet == '' ) {
-                       $titleSnippet = null;
-               }
-
-               $link = Linker::linkKnown(
-                       $title,
-                       $titleSnippet
-               );
-
-               // format redirect if any
-               $redirectTitle = $result->getRedirectTitle();
-               $redirectText = $result->getRedirectSnippet();
-               $redirect = '';
-               if ( !is_null( $redirectTitle ) ) {
-                       if ( $redirectText == '' ) {
-                               $redirectText = null;
-                       }
-
-                       $redirect = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-redirect' )->rawParams(
-                                       Linker::linkKnown( $redirectTitle, $redirectText ) )->text() .
-                               "</span>";
-               }
-
-               $out = "";
-               // display project name
-               if ( is_null( $lastInterwiki ) || $lastInterwiki != $title->getInterwiki() ) {
-                       if ( array_key_exists( $title->getInterwiki(), $this->customCaptions ) ) {
-                               // captions from 'search-interwiki-custom'
-                               $caption = $this->customCaptions[$title->getInterwiki()];
-                       } else {
-                               // default is to show the hostname of the other wiki which might suck
-                               // if there are many wikis on one hostname
-                               $parsed = wfParseUrl( $title->getFullURL() );
-                               $caption = $this->msg( 'search-interwiki-default', $parsed['host'] )->text();
-                       }
-                       // "more results" link (special page stuff could be localized, but we might not know target lang)
-                       $searchTitle = Title::newFromText( $title->getInterwiki() . ":Special:Search" );
-                       $searchLink = Linker::linkKnown(
-                               $searchTitle,
-                               $this->msg( 'search-interwiki-more' )->text(),
-                               [],
-                               [
-                                       'search' => $query,
-                                       'fulltext' => 'Search'
-                               ]
-                       );
-                       $out .= "</ul><div class='mw-search-interwiki-project'><span class='mw-search-interwiki-more'>
-                               {$searchLink}</span>{$caption}</div>\n<ul>";
-               }
-
-               $out .= "<li>{$link} {$redirect}</li>\n";
-
-               return $out;
-       }
-
-       /**
-        * Generates the power search box at [[Special:Search]]
-        *
-        * @param string $term Search term
-        * @param array $opts
-        * @return string HTML form
-        */
-       protected function powerSearchBox( $term, $opts ) {
-               global $wgContLang;
-
-               // Groups namespaces into rows according to subject
-               $rows = [];
-               foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) {
-                       $subject = MWNamespace::getSubject( $namespace );
-                       if ( !array_key_exists( $subject, $rows ) ) {
-                               $rows[$subject] = "";
-                       }
-
-                       $name = $wgContLang->getConverter()->convertNamespace( $namespace );
-                       if ( $name == '' ) {
-                               $name = $this->msg( 'blanknamespace' )->text();
-                       }
-
-                       $rows[$subject] .=
-                               Xml::openElement( 'td' ) .
-                               Xml::checkLabel(
-                                       $name,
-                                       "ns{$namespace}",
-                                       "mw-search-ns{$namespace}",
-                                       in_array( $namespace, $this->namespaces )
-                               ) .
-                               Xml::closeElement( 'td' );
-               }
-
-               $rows = array_values( $rows );
-               $numRows = count( $rows );
-
-               // Lays out namespaces in multiple floating two-column tables so they'll
-               // be arranged nicely while still accommodating different screen widths
-               $namespaceTables = '';
-               for ( $i = 0; $i < $numRows; $i += 4 ) {
-                       $namespaceTables .= Xml::openElement( 'table' );
-
-                       for ( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
-                               $namespaceTables .= Xml::tags( 'tr', null, $rows[$j] );
-                       }
-
-                       $namespaceTables .= Xml::closeElement( 'table' );
-               }
-
-               $showSections = [ 'namespaceTables' => $namespaceTables ];
-
-               Hooks::run( 'SpecialSearchPowerBox', [ &$showSections, $term, $opts ] );
-
-               $hidden = '';
-               foreach ( $opts as $key => $value ) {
-                       $hidden .= Html::hidden( $key, $value );
-               }
-
-               # Stuff to feed saveNamespaces()
-               $remember = '';
-               $user = $this->getUser();
-               if ( $user->isLoggedIn() ) {
-                       $remember .= Xml::checkLabel(
-                               $this->msg( 'powersearch-remember' )->text(),
-                               'nsRemember',
-                               'mw-search-powersearch-remember',
-                               false,
-                               // The token goes here rather than in a hidden field so it
-                               // is only sent when necessary (not every form submission).
-                               [ 'value' => $user->getEditToken(
-                                       'searchnamespace',
-                                       $this->getRequest()
-                               ) ]
-                       );
-               }
-
-               // Return final output
-               return Xml::openElement( 'fieldset', [ 'id' => 'mw-searchoptions' ] ) .
-                       Xml::element( 'legend', null, $this->msg( 'powersearch-legend' )->text() ) .
-                       Xml::tags( 'h4', null, $this->msg( 'powersearch-ns' )->parse() ) .
-                       Xml::element( 'div', [ 'id' => 'mw-search-togglebox' ], '', false ) .
-                       Xml::element( 'div', [ 'class' => 'divider' ], '', false ) .
-                       implode( Xml::element( 'div', [ 'class' => 'divider' ], '', false ), $showSections ) .
-                       $hidden .
-                       Xml::element( 'div', [ 'class' => 'divider' ], '', false ) .
-                       $remember .
-                       Xml::closeElement( 'fieldset' );
-       }
-
        /**
         * @return array
         */
@@ -1150,169 +651,6 @@ class SpecialSearch extends SpecialPage {
                return $profiles;
        }
 
-       /**
-        * @param string $term
-        * @return string
-        */
-       protected function searchProfileTabs( $term ) {
-               $out = Html::element( 'div', [ 'class' => 'mw-search-visualclear' ] ) .
-                       Xml::openElement( 'div', [ 'class' => 'mw-search-profile-tabs' ] );
-
-               $bareterm = $term;
-               if ( $this->startsWithImage( $term ) ) {
-                       // Deletes prefixes
-                       $bareterm = substr( $term, strpos( $term, ':' ) + 1 );
-               }
-
-               $profiles = $this->getSearchProfiles();
-               $lang = $this->getLanguage();
-
-               // Outputs XML for Search Types
-               $out .= Xml::openElement( 'div', [ 'class' => 'search-types' ] );
-               $out .= Xml::openElement( 'ul' );
-               foreach ( $profiles as $id => $profile ) {
-                       if ( !isset( $profile['parameters'] ) ) {
-                               $profile['parameters'] = [];
-                       }
-                       $profile['parameters']['profile'] = $id;
-
-                       $tooltipParam = isset( $profile['namespace-messages'] ) ?
-                               $lang->commaList( $profile['namespace-messages'] ) : null;
-                       $out .= Xml::tags(
-                               'li',
-                               [
-                                       'class' => $this->profile === $id ? 'current' : 'normal'
-                               ],
-                               $this->makeSearchLink(
-                                       $bareterm,
-                                       [],
-                                       $this->msg( $profile['message'] )->text(),
-                                       $this->msg( $profile['tooltip'], $tooltipParam )->text(),
-                                       $profile['parameters']
-                               )
-                       );
-               }
-               $out .= Xml::closeElement( 'ul' );
-               $out .= Xml::closeElement( 'div' );
-               $out .= Xml::element( 'div', [ 'style' => 'clear:both' ], '', false );
-               $out .= Xml::closeElement( 'div' );
-
-               return $out;
-       }
-
-       /**
-        * @param string $term Search term
-        * @return string
-        */
-       protected function searchOptions( $term ) {
-               $out = '';
-               $opts = [];
-               $opts['profile'] = $this->profile;
-
-               if ( $this->isPowerSearch() ) {
-                       $out .= $this->powerSearchBox( $term, $opts );
-               } else {
-                       $form = '';
-                       Hooks::run( 'SpecialSearchProfileForm', [ $this, &$form, $this->profile, $term, $opts ] );
-                       $out .= $form;
-               }
-
-               return $out;
-       }
-
-       /**
-        * @param string $term
-        * @param int $resultsShown
-        * @param int $totalNum
-        * @return string
-        */
-       protected function shortDialog( $term, $resultsShown, $totalNum ) {
-               $searchWidget = new MediaWiki\Widget\SearchInputWidget( [
-                       'id' => 'searchText',
-                       'name' => 'search',
-                       'autofocus' => trim( $term ) === '',
-                       'value' => $term,
-                       'dataLocation' => 'content',
-                       'infusable' => true,
-               ] );
-
-               $layout = new OOUI\ActionFieldLayout( $searchWidget, new OOUI\ButtonInputWidget( [
-                       'type' => 'submit',
-                       'label' => $this->msg( 'searchbutton' )->text(),
-                       'flags' => [ 'progressive', 'primary' ],
-               ] ), [
-                       'align' => 'top',
-               ] );
-
-               $out =
-                       Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
-                       Html::hidden( 'profile', $this->profile ) .
-                       Html::hidden( 'fulltext', 'Search' ) .
-                       $layout;
-
-               // Results-info
-               if ( $totalNum > 0 && $this->offset < $totalNum ) {
-                       $top = $this->msg( 'search-showingresults' )
-                               ->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
-                               ->numParams( $resultsShown )
-                               ->parse();
-                       $out .= Xml::tags( 'div', [ 'class' => 'results-info' ], $top );
-               }
-
-               return $out;
-       }
-
-       /**
-        * Make a search link with some target namespaces
-        *
-        * @param string $term
-        * @param array $namespaces Ignored
-        * @param string $label Link's text
-        * @param string $tooltip Link's tooltip
-        * @param array $params Query string parameters
-        * @return string HTML fragment
-        */
-       protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params = [] ) {
-               $opt = $params;
-               foreach ( $namespaces as $n ) {
-                       $opt['ns' . $n] = 1;
-               }
-
-               $stParams = array_merge(
-                       [
-                               'search' => $term,
-                               'fulltext' => $this->msg( 'search' )->text()
-                       ],
-                       $opt
-               );
-
-               return Xml::element(
-                       'a',
-                       [
-                               'href' => $this->getPageTitle()->getLocalURL( $stParams ),
-                               'title' => $tooltip
-                       ],
-                       $label
-               );
-       }
-
-       /**
-        * Check if query starts with image: prefix
-        *
-        * @param string $term The string to check
-        * @return bool
-        */
-       protected function startsWithImage( $term ) {
-               global $wgContLang;
-
-               $parts = explode( ':', $term );
-               if ( count( $parts ) > 1 ) {
-                       return $wgContLang->getNsIndex( $parts[0] ) == NS_FILE;
-               }
-
-               return false;
-       }
-
        /**
         * @since 1.18
         *
index 688a6ef..b18b370 100644 (file)
@@ -118,7 +118,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                        $pageClasses[] = 'mw-specialpagerestricted';
                                }
 
-                               $link = Linker::linkKnown( $title, htmlspecialchars( $desc ) );
+                               $link = $this->getLinkRenderer()->makeKnownLink( $title, $desc );
                                $out->addHTML( Html::rawElement(
                                                'li',
                                                [ 'class' => implode( ' ', $pageClasses ) ],
index 86f1e20..a7a1c58 100644 (file)
@@ -95,8 +95,9 @@ class SpecialStatistics extends SpecialPage {
                        if ( !$msg->isDisabled() ) {
                                $descriptionHtml = $this->msg( 'parentheses' )->rawParams( $msg->parse() )
                                        ->escaped();
-                               $text .= "<br />" . Html::rawElement( 'small', [ 'class' => 'mw-statistic-desc' ],
-                                       " $descriptionHtml" );
+                               $text .= "<br />" .
+                                         Html::rawElement( 'small', [ 'class' => 'mw-statistic-desc' ],
+                                                                               " $descriptionHtml" );
                        }
                }
 
@@ -112,18 +113,22 @@ class SpecialStatistics extends SpecialPage {
         * @return string
         */
        private function getPageStats() {
+               $linkRenderer = $this->getLinkRenderer();
+
                $specialAllPagesTitle = SpecialPage::getTitleFor( 'Allpages' );
                $pageStatsHtml = Xml::openElement( 'tr' ) .
                        Xml::tags( 'th', [ 'colspan' => '2' ], $this->msg( 'statistics-header-pages' )
                                ->parse() ) .
                        Xml::closeElement( 'tr' ) .
-                               $this->formatRow( Linker::linkKnown( $specialAllPagesTitle,
-                                       $this->msg( 'statistics-articles' )->parse(), [], [ 'hideredirects' => 1 ] ),
+                               $this->formatRow( $linkRenderer->makeKnownLink(
+                                       $specialAllPagesTitle,
+                                       $this->msg( 'statistics-articles' )->text(),
+                                       [], [ 'hideredirects' => 1 ] ),
                                        $this->getLanguage()->formatNum( $this->good ),
                                        [ 'class' => 'mw-statistics-articles' ],
                                        'statistics-articles-desc' ) .
-                               $this->formatRow( Linker::linkKnown( $specialAllPagesTitle,
-                                       $this->msg( 'statistics-pages' )->parse() ),
+                               $this->formatRow( $linkRenderer->makeKnownLink( $specialAllPagesTitle,
+                                       $this->msg( 'statistics-pages' )->text() ),
                                        $this->getLanguage()->formatNum( $this->total ),
                                        [ 'class' => 'mw-statistics-pages' ],
                                        'statistics-pages-desc' );
@@ -131,8 +136,8 @@ class SpecialStatistics extends SpecialPage {
                // Show the image row only, when there are files or upload is possible
                if ( $this->images !== 0 || $this->getConfig()->get( 'EnableUploads' ) ) {
                        $pageStatsHtml .= $this->formatRow(
-                               Linker::linkKnown( SpecialPage::getTitleFor( 'MediaStatistics' ),
-                               $this->msg( 'statistics-files' )->parse() ),
+                               $linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'MediaStatistics' ),
+                               $this->msg( 'statistics-files' )->text() ),
                                $this->getLanguage()->formatNum( $this->images ),
                                [ 'class' => 'mw-statistics-files' ] );
                }
@@ -150,9 +155,9 @@ class SpecialStatistics extends SpecialPage {
                                [ 'class' => 'mw-statistics-edits' ]
                        ) .
                        $this->formatRow( $this->msg( 'statistics-edits-average' )->parse(),
-                               $this->getLanguage()
-                                       ->formatNum( sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 ) ),
-                               [ 'class' => 'mw-statistics-edits-average' ]
+                               $this->getLanguage()->formatNum(
+                                       sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 )
+                               ), [ 'class' => 'mw-statistics-edits-average' ]
                        );
        }
 
@@ -166,22 +171,25 @@ class SpecialStatistics extends SpecialPage {
                                [ 'class' => 'mw-statistics-users' ]
                        ) .
                        $this->formatRow( $this->msg( 'statistics-users-active' )->parse() . ' ' .
-                               Linker::linkKnown(
+                               $this->getLinkRenderer()->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Activeusers' ),
-                                       $this->msg( 'listgrouprights-members' )->escaped()
+                                       $this->msg( 'listgrouprights-members' )->text()
                                ),
                                $this->getLanguage()->formatNum( $this->activeUsers ),
                                [ 'class' => 'mw-statistics-users-active' ],
                                'statistics-users-active-desc',
-                               $this->getLanguage()->formatNum( $this->getConfig()->get( 'ActiveUserDays' ) )
+                               $this->getLanguage()->formatNum(
+                                       $this->getConfig()->get( 'ActiveUserDays' ) )
                        );
        }
 
        private function getGroupStats() {
+               $linkRenderer = $this->getLinkRenderer();
                $text = '';
                foreach ( $this->getConfig()->get( 'GroupPermissions' ) as $group => $permissions ) {
                        # Skip generic * and implicit groups
-                       if ( in_array( $group, $this->getConfig()->get( 'ImplicitGroups' ) ) || $group == '*' ) {
+                       if ( in_array( $group, $this->getConfig()->get( 'ImplicitGroups' ) )
+                               || $group == '*' ) {
                                continue;
                        }
                        $groupname = htmlspecialchars( $group );
@@ -193,24 +201,25 @@ class SpecialStatistics extends SpecialPage {
                        }
                        $msg = $this->msg( 'grouppage-' . $groupname )->inContentLanguage();
                        if ( $msg->isBlank() ) {
-                               $grouppageLocalized = MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $groupname;
+                               $grouppageLocalized = MWNamespace::getCanonicalName( NS_PROJECT ) .
+                                       ':' . $groupname;
                        } else {
                                $grouppageLocalized = $msg->text();
                        }
                        $linkTarget = Title::newFromText( $grouppageLocalized );
 
                        if ( $linkTarget ) {
-                               $grouppage = Linker::link(
+                               $grouppage = $linkRenderer->makeLink(
                                        $linkTarget,
-                                       htmlspecialchars( $groupnameLocalized )
+                                       $groupnameLocalized
                                );
                        } else {
                                $grouppage = htmlspecialchars( $groupnameLocalized );
                        }
 
-                       $grouplink = Linker::linkKnown(
+                       $grouplink = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Listusers' ),
-                               $this->msg( 'listgrouprights-members' )->escaped(),
+                               $this->msg( 'listgrouprights-members' )->text(),
                                [],
                                [ 'group' => $group ]
                        );
index ea40cb8..e67356f 100644 (file)
@@ -98,7 +98,7 @@ class SpecialTags extends SpecialPage {
                                ],
                        ];
 
-                       $form = new HTMLForm( $fields, $this->getContext() );
+                       $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                        $form->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
                        $form->setWrapperLegendMsg( 'tags-create-heading' );
                        $form->setHeaderText( $this->msg( 'tags-create-explanation' )->parseAsBlock() );
@@ -312,7 +312,7 @@ class SpecialTags extends SpecialPage {
                                $out->parse( $status->getWikiText() ) .
                                $this->msg( 'tags-create-warnings-below' )->parseAsBlock();
 
-                       $subform = new HTMLForm( $fields, $this->getContext() );
+                       $subform = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                        $subform->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
                        $subform->setWrapperLegendMsg( 'tags-create-heading' );
                        $subform->setHeaderText( $headerText );
@@ -377,7 +377,7 @@ class SpecialTags extends SpecialPage {
                        'required' => true,
                ];
 
-               $form = new HTMLForm( $fields, $this->getContext() );
+               $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( 'delete' )->getLocalURL() );
                $form->tagAction = 'delete'; // custom property on HTMLForm object
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
@@ -428,7 +428,7 @@ class SpecialTags extends SpecialPage {
                        'required' => true,
                ];
 
-               $form = new HTMLForm( $fields, $this->getContext() );
+               $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( $actionStr )->getLocalURL() );
                $form->tagAction = $actionStr;
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
index 4c6a345..e503d92 100644 (file)
@@ -36,26 +36,6 @@ class SpecialTrackingCategories extends SpecialPage {
                parent::__construct( 'TrackingCategories' );
        }
 
-       /**
-        * Tracking categories that exist in core
-        *
-        * @var array
-        */
-       private static $coreTrackingCategories = [
-               'index-category',
-               'noindex-category',
-               'duplicate-args-category',
-               'expensive-parserfunction-category',
-               'post-expand-template-argument-category',
-               'post-expand-template-inclusion-category',
-               'hidden-category-category',
-               'broken-file-category',
-               'node-count-exceeded-category',
-               'expansion-depth-exceeded-category',
-               'restricted-displaytitle-ignored',
-               'deprecated-self-close-category',
-       ];
-
        function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
@@ -76,10 +56,11 @@ class SpecialTrackingCategories extends SpecialPage {
                        </tr></thead>"
                );
 
-               $trackingCategories = $this->prepareTrackingCategoriesData();
+               $trackingCategories = new TrackingCategories( $this->getConfig() );
+               $categoryList = $trackingCategories->getTrackingCategories();
 
                $batch = new LinkBatch();
-               foreach ( $trackingCategories as $catMsg => $data ) {
+               foreach ( $categoryList as $catMsg => $data ) {
                        $batch->addObj( $data['msg'] );
                        foreach ( $data['cats'] as $catTitle ) {
                                $batch->addObj( $catTitle );
@@ -87,21 +68,23 @@ class SpecialTrackingCategories extends SpecialPage {
                }
                $batch->execute();
 
-               Hooks::run( 'SpecialTrackingCategories::preprocess', [ $this, $trackingCategories ] );
+               Hooks::run( 'SpecialTrackingCategories::preprocess', [ $this, $categoryList ] );
+
+               $linkRenderer = $this->getLinkRenderer();
 
-               foreach ( $trackingCategories as $catMsg => $data ) {
+               foreach ( $categoryList as $catMsg => $data ) {
                        $allMsgs = [];
                        $catDesc = $catMsg . '-desc';
 
-                       $catMsgTitleText = Linker::link(
+                       $catMsgTitleText = $linkRenderer->makeLink(
                                $data['msg'],
-                               htmlspecialchars( $catMsg )
+                               $catMsg
                        );
 
                        foreach ( $data['cats'] as $catTitle ) {
-                               $html = Linker::link(
+                               $html = $linkRenderer->makeLink(
                                        $catTitle,
-                                       htmlspecialchars( $catTitle->getText() )
+                                       $catTitle->getText()
                                );
 
                                Hooks::run( 'SpecialTrackingCategories::generateCatLink',
@@ -141,80 +124,6 @@ class SpecialTrackingCategories extends SpecialPage {
                $this->getOutput()->addHTML( Html::closeElement( 'table' ) );
        }
 
-       /**
-        * Read the global and extract title objects from the corresponding messages
-        * @return array Array( 'msg' => Title, 'cats' => Title[] )
-        */
-       private function prepareTrackingCategoriesData() {
-               $categories = array_merge(
-                       self::$coreTrackingCategories,
-                       ExtensionRegistry::getInstance()->getAttribute( 'TrackingCategories' ),
-                       $this->getConfig()->get( 'TrackingCategories' ) // deprecated
-               );
-
-               // Only show magic link tracking categories if they are enabled
-               $enableMagicLinks = $this->getConfig()->get( 'EnableMagicLinks' );
-               if ( $enableMagicLinks['ISBN'] ) {
-                       $categories[] = 'magiclink-tracking-isbn';
-               }
-               if ( $enableMagicLinks['RFC'] ) {
-                       $categories[] = 'magiclink-tracking-rfc';
-               }
-               if ( $enableMagicLinks['PMID'] ) {
-                       $categories[] = 'magiclink-tracking-pmid';
-               }
-
-               $trackingCategories = [];
-               foreach ( $categories as $catMsg ) {
-                       /*
-                        * Check if the tracking category varies by namespace
-                        * Otherwise only pages in the current namespace will be displayed
-                        * If it does vary, show pages considering all namespaces
-                        */
-                       $msgObj = $this->msg( $catMsg )->inContentLanguage();
-                       $allCats = [];
-                       $catMsgTitle = Title::makeTitleSafe( NS_MEDIAWIKI, $catMsg );
-                       if ( !$catMsgTitle ) {
-                               continue;
-                       }
-
-                       // Match things like {{NAMESPACE}} and {{NAMESPACENUMBER}}.
-                       // False positives are ok, this is just an efficiency shortcut
-                       if ( strpos( $msgObj->plain(), '{{' ) !== false ) {
-                               $ns = MWNamespace::getValidNamespaces();
-                               foreach ( $ns as $namesp ) {
-                                       $tempTitle = Title::makeTitleSafe( $namesp, $catMsg );
-                                       if ( !$tempTitle ) {
-                                               continue;
-                                       }
-                                       $catName = $msgObj->title( $tempTitle )->text();
-                                       # Allow tracking categories to be disabled by setting them to "-"
-                                       if ( $catName !== '-' ) {
-                                               $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
-                                               if ( $catTitle ) {
-                                                       $allCats[] = $catTitle;
-                                               }
-                                       }
-                               }
-                       } else {
-                               $catName = $msgObj->text();
-                               # Allow tracking categories to be disabled by setting them to "-"
-                               if ( $catName !== '-' ) {
-                                       $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
-                                       if ( $catTitle ) {
-                                               $allCats[] = $catTitle;
-                                       }
-                               }
-                       }
-                       $trackingCategories[$catMsg] = [
-                               'cats' => $allCats,
-                               'msg' => $catMsgTitle,
-                       ];
-               }
-
-               return $trackingCategories;
-       }
-
        protected function getGroupName() {
                return 'pages';
        }
index cff8bf4..0d42e3f 100644 (file)
@@ -119,14 +119,14 @@ class SpecialUnblock extends SpecialPage {
                                $fields['Target']['type'] = 'hidden';
                                switch ( $type ) {
                                        case Block::TYPE_IP:
-                                               $fields['Name']['default'] = Linker::linkKnown(
+                                               $fields['Name']['default'] = $this->getLinkRenderer()->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Contributions', $target->getName() ),
                                                        $target->getName()
                                                );
                                                $fields['Name']['raw'] = true;
                                                break;
                                        case Block::TYPE_USER:
-                                               $fields['Name']['default'] = Linker::link(
+                                               $fields['Name']['default'] = $this->getLinkRenderer()->makeLink(
                                                        $target->getUserPage(),
                                                        $target->getName()
                                                );
@@ -175,7 +175,7 @@ class SpecialUnblock extends SpecialPage {
         * @param array $data
         * @param IContextSource $context
         * @throws ErrorPageError
-        * @return array|bool Array(message key, parameters) on failure, True on success
+        * @return array|bool Array( Array( message key, parameters ) ) on failure, True on success
         */
        public static function processUnblock( array $data, IContextSource $context ) {
                $performer = $context->getUser();
@@ -209,11 +209,18 @@ class SpecialUnblock extends SpecialPage {
                        return [ 'unblock-hideuser' ];
                }
 
+               $reason = [ 'hookaborted' ];
+               if ( !Hooks::run( 'UnblockUser', [ &$block, &$performer, &$reason ] ) ) {
+                       return $reason;
+               }
+
                # Delete block
                if ( !$block->delete() ) {
-                       return [ 'ipb_cant_unblock', htmlspecialchars( $block->getTarget() ) ];
+                       return [ [ 'ipb_cant_unblock', htmlspecialchars( $block->getTarget() ) ] ];
                }
 
+               Hooks::run( 'UnblockUserComplete', [ $block, $performer ] );
+
                # Unset _deleted fields as needed
                if ( $block->mHideName ) {
                        # Something is deeply FUBAR if this is not a User object, but who knows?
index 1cc40a9..77b6926 100644 (file)
  * @ingroup SpecialPage
  */
 class UncategorizedCategoriesPage extends UncategorizedPagesPage {
+       /**
+        * Holds a list of categories, which shouldn't be listed on this special page,
+        * even if it is uncategorized.
+        * @var array
+        */
+       private $exceptionList = null;
+
        function __construct( $name = 'Uncategorizedcategories' ) {
                parent::__construct( $name );
                $this->requestedNamespace = NS_CATEGORY;
        }
 
+       /**
+        * Returns an array of category titles (usually without the namespace), which
+        * shouldn't be listed on this page, even if they're uncategorized.
+        *
+        * @return array
+        */
+       private function getExceptionList() {
+               if ( $this->exceptionList === null ) {
+                       $exList = $this->msg( 'uncategorized-categories-exceptionlist' )
+                               ->inContentLanguage()->plain();
+                       $proposedTitles = explode( "\n", $exList );
+                       foreach ( $proposedTitles as $count => $titleStr ) {
+                               if ( strpos( $titleStr, '*' ) !== 0 ) {
+                                       continue;
+                               }
+                               $titleStr = preg_replace( "/^\\*\\s*/", '', $titleStr );
+                               $title = Title::newFromText( $titleStr, NS_CATEGORY );
+                               if ( $title && $title->getNamespace() !== NS_CATEGORY ) {
+                                       $title = Title::makeTitleSafe( NS_CATEGORY, $titleStr );
+                               }
+                               if ( $title ) {
+                                       $this->exceptionList[] = $title->getDBKey();
+                               }
+                       }
+               }
+               return $this->exceptionList;
+       }
+
+       public function getQueryInfo() {
+               $dbr = wfGetDB( DB_SLAVE );
+               $query = parent::getQueryInfo();
+               $exceptionList = $this->getExceptionList();
+               if ( $exceptionList ) {
+                       $query['conds'][] = 'page_title not in ( ' . $dbr->makeList( $exceptionList ) . ' )';
+               }
+
+               return $query;
+       }
+
        /**
         * Formats the result
         * @param Skin $skin The current skin
@@ -42,6 +88,6 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
                $title = Title::makeTitle( NS_CATEGORY, $result->title );
                $text = $title->getText();
 
-               return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+               return $this->getLinkRenderer()->makeKnownLink( $title, $text );
        }
 }
index 91753a9..4c6a593 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Used to show archived pages and eventually restore them.
@@ -46,7 +47,7 @@ class PageArchive {
                $this->title = $title;
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
        }
@@ -996,14 +997,15 @@ class SpecialUndelete extends SpecialPage {
 
                $out->addWikiMsg( 'undeletepagetext', $this->getLanguage()->formatNum( $result->numRows() ) );
 
+               $linkRenderer = $this->getLinkRenderer();
                $undelete = $this->getPageTitle();
                $out->addHTML( "<ul>\n" );
                foreach ( $result as $row ) {
                        $title = Title::makeTitleSafe( $row->ar_namespace, $row->ar_title );
                        if ( $title !== null ) {
-                               $item = Linker::linkKnown(
+                               $item = $linkRenderer->makeKnownLink(
                                        $undelete,
-                                       htmlspecialchars( $title->getPrefixedText() ),
+                                       $title->getPrefixedText(),
                                        [],
                                        [ 'target' => $title->getPrefixedText() ]
                                );
@@ -1082,9 +1084,9 @@ class SpecialUndelete extends SpecialPage {
                        }
                }
 
-               $link = Linker::linkKnown(
+               $link = $this->getLinkRenderer()->makeKnownLink(
                        $this->getPageTitle( $this->mTargetObj->getPrefixedDBkey() ),
-                       htmlspecialchars( $this->mTargetObj->getPrefixedText() )
+                       $this->mTargetObj->getPrefixedText()
                );
 
                $lang = $this->getLanguage();
@@ -1139,8 +1141,8 @@ class SpecialUndelete extends SpecialPage {
                                'textarea',
                                [
                                        'readonly' => 'readonly',
-                                       'cols' => $user->getIntOption( 'cols' ),
-                                       'rows' => $user->getIntOption( 'rows' )
+                                       'cols' => 80,
+                                       'rows' => 25
                                ],
                                $content->getNativeData() . "\n"
                        );
@@ -1258,14 +1260,14 @@ class SpecialUndelete extends SpecialPage {
                // FIXME This is reimplementing DifferenceEngine#getRevisionHeader
                // and partially #showDiffPage, but worse
                return '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
-                       Linker::link(
+                       $this->getLinkRenderer()->makeLink(
                                $targetPage,
                                $this->msg(
                                        'revisionasof',
                                        $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
                                        $lang->userDate( $rev->getTimestamp(), $user ),
                                        $lang->userTime( $rev->getTimestamp(), $user )
-                               )->escaped(),
+                               )->text(),
                                [],
                                $targetQuery
                        ) .
@@ -1549,9 +1551,9 @@ class SpecialUndelete extends SpecialPage {
                                $last = $this->msg( 'diff' )->escaped();
                        } elseif ( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
                                $pageLink = $this->getPageLink( $rev, $titleObj, $ts );
-                               $last = Linker::linkKnown(
+                               $last = $this->getLinkRenderer()->makeKnownLink(
                                        $titleObj,
-                                       $this->msg( 'diff' )->escaped(),
+                                       $this->msg( 'diff' )->text(),
                                        [],
                                        [
                                                'target' => $this->mTargetObj->getPrefixedText(),
@@ -1671,9 +1673,9 @@ class SpecialUndelete extends SpecialPage {
                        return '<span class="history-deleted">' . $time . '</span>';
                }
 
-               $link = Linker::linkKnown(
+               $link = $this->getLinkRenderer()->makeKnownLink(
                        $titleObj,
-                       htmlspecialchars( $time ),
+                       $time,
                        [],
                        [
                                'target' => $this->mTargetObj->getPrefixedText(),
@@ -1706,9 +1708,9 @@ class SpecialUndelete extends SpecialPage {
                        return '<span class="history-deleted">' . $time . '</span>';
                }
 
-               $link = Linker::linkKnown(
+               $link = $this->getLinkRenderer()->makeKnownLink(
                        $titleObj,
-                       htmlspecialchars( $time ),
+                       $time,
                        [],
                        [
                                'target' => $this->mTargetObj->getPrefixedText(),
@@ -1795,7 +1797,7 @@ class SpecialUndelete extends SpecialPage {
                                        $this->getUser(), $this->mComment ] );
                        }
 
-                       $link = Linker::linkKnown( $this->mTargetObj );
+                       $link = $this->getLinkRenderer()->makeKnownLink( $this->mTargetObj );
                        $out->addHTML( $this->msg( 'undeletedpage' )->rawParams( $link )->parse() );
                } else {
                        $out->setPageTitle( $this->msg( 'undelete-error' ) );
@@ -1804,11 +1806,9 @@ class SpecialUndelete extends SpecialPage {
                // Show revision undeletion warnings and errors
                $status = $archive->getRevisionStatus();
                if ( $status && !$status->isGood() ) {
-                       $out->addWikiText( '<div class="error">' .
-                               $status->getWikiText(
-                                       'cannotundelete',
-                                       'cannotundelete'
-                               ) . '</div>'
+                       $out->wrapWikiMsg(
+                               "<div class=\"error\" id=\"mw-error-cannotundelete\">\n$1\n</div>",
+                               'cannotundelete'
                        );
                }
 
index 88c0e21..ec39ccf 100644 (file)
@@ -70,7 +70,7 @@ class UnusedCategoriesPage extends QueryPage {
        function formatResult( $skin, $result ) {
                $title = Title::makeTitle( NS_CATEGORY, $result->title );
 
-               return Linker::link( $title, htmlspecialchars( $title->getText() ) );
+               return $this->getLinkRenderer()->makeLink( $title, $title->getText() );
        }
 
        protected function getGroupName() {
index 2cc1a7b..9fcbf15 100644 (file)
@@ -50,8 +50,6 @@ class UnusedimagesPage extends ImageQueryPage {
                                'namespace' => NS_FILE,
                                'title' => 'img_name',
                                'value' => 'img_timestamp',
-                               'img_user', 'img_user_text',
-                               'img_description'
                        ],
                        'conds' => [ 'il_to IS NULL' ],
                        'join_conds' => [ 'imagelinks' => [ 'LEFT JOIN', 'il_to = img_name' ] ]
index ae375b2..96878a3 100644 (file)
@@ -116,10 +116,12 @@ class UnwatchedpagesPage extends QueryPage {
 
                $text = $wgContLang->convert( $nt->getPrefixedText() );
 
-               $plink = Linker::linkKnown( $nt, htmlspecialchars( $text ) );
-               $wlink = Linker::linkKnown(
+               $linkRenderer = $this->getLinkRenderer();
+
+               $plink = $linkRenderer->makeKnownLink( $nt, $text );
+               $wlink = $linkRenderer->makeKnownLink(
                        $nt,
-                       $this->msg( 'watch' )->escaped(),
+                       $this->msg( 'watch' )->text(),
                        [ 'class' => 'mw-watch-link' ],
                        [ 'action' => 'watch' ]
                );
index 4583305..c5a1f27 100644 (file)
@@ -209,7 +209,9 @@ class SpecialUpload extends SpecialPage {
                        $this->processUpload();
                } else {
                        # Backwards compatibility hook
-                       if ( !Hooks::run( 'UploadForm:initial', [ &$this ] ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $upload = $this;
+                       if ( !Hooks::run( 'UploadForm:initial', [ &$upload ] ) ) {
                                wfDebug( "Hook 'UploadForm:initial' broke output of the upload form\n" );
 
                                return;
@@ -483,8 +485,9 @@ class SpecialUpload extends SpecialPage {
 
                        return;
                }
-
-               if ( !Hooks::run( 'UploadForm:BeforeProcessing', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $upload = $this;
+               if ( !Hooks::run( 'UploadForm:BeforeProcessing', [ &$upload ] ) ) {
                        wfDebug( "Hook 'UploadForm:BeforeProcessing' broke processing the file.\n" );
                        // This code path is deprecated. If you want to break upload processing
                        // do so by hooking into the appropriate hooks in UploadBase::verifyUpload
@@ -570,7 +573,9 @@ class SpecialUpload extends SpecialPage {
 
                // Success, redirect to description page
                $this->mUploadSuccessful = true;
-               Hooks::run( 'SpecialUploadComplete', [ &$this ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $upload = $this;
+               Hooks::run( 'SpecialUploadComplete', [ &$upload ] );
                $this->getOutput()->redirect( $this->mLocalFile->getTitle()->getFullURL() );
        }
 
@@ -588,7 +593,7 @@ class SpecialUpload extends SpecialPage {
        ) {
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                $msg = [];
@@ -1085,12 +1090,14 @@ class UploadForm extends HTMLForm {
                                global $wgContLang;
 
                                $mto = $file->transform( [ 'width' => 120 ] );
-                               $this->addHeaderText(
-                                       '<div class="thumb t' . $wgContLang->alignEnd() . '">' .
-                                       Html::element( 'img', [
-                                               'src' => $mto->getUrl(),
-                                               'class' => 'thumbimage',
-                                       ] ) . '</div>', 'description' );
+                               if ( $mto ) {
+                                       $this->addHeaderText(
+                                               '<div class="thumb t' . $wgContLang->alignEnd() . '">' .
+                                               Html::element( 'img', [
+                                                       'src' => $mto->getUrl(),
+                                                       'class' => 'thumbimage',
+                                               ] ) . '</div>', 'description' );
+                               }
                        }
                }
 
@@ -1113,7 +1120,7 @@ class UploadForm extends HTMLForm {
                                        ? 'filereuploadsummary'
                                        : 'fileuploadsummary',
                                'default' => $this->mComment,
-                               'cols' => $this->getUser()->getIntOption( 'cols' ),
+                               'cols' => 80,
                                'rows' => 8,
                        ]
                ];
index 433dcab..454d1e3 100644 (file)
@@ -48,28 +48,26 @@ class UserrightsPage extends SpecialPage {
                return true;
        }
 
-       public function isRestricted() {
-               return true;
-       }
-
-       public function userCanExecute( User $user ) {
-               return $this->userCanChangeRights( $user, false );
-       }
-
        /**
-        * @param User $user
-        * @param bool $checkIfSelf
+        * Check whether the current user (from context) can change the target user's rights.
+        *
+        * @param User $targetUser User whose rights are being changed
+        * @param bool $checkIfSelf If false, assume that the current user can add/remove groups defined
+        *   in $wgGroupsAddToSelf / $wgGroupsRemoveFromSelf, without checking if it's the same as target
+        *   user
         * @return bool
         */
-       public function userCanChangeRights( $user, $checkIfSelf = true ) {
+       public function userCanChangeRights( $targetUser, $checkIfSelf = true ) {
+               $isself = $this->getUser()->equals( $targetUser );
+
                $available = $this->changeableGroups();
-               if ( $user->getId() == 0 ) {
+               if ( $targetUser->getId() == 0 ) {
                        return false;
                }
 
                return !empty( $available['add'] )
                        || !empty( $available['remove'] )
-                       || ( ( $this->isself || !$checkIfSelf ) &&
+                       || ( ( $isself || !$checkIfSelf ) &&
                                ( !empty( $available['add-self'] )
                                        || !empty( $available['remove-self'] ) ) );
        }
@@ -82,21 +80,12 @@ class UserrightsPage extends SpecialPage {
         * @throws UserBlockedError|PermissionsError
         */
        public function execute( $par ) {
-               // If the visitor doesn't have permissions to assign or remove
-               // any groups, it's a bit silly to give them the user search prompt.
-
                $user = $this->getUser();
                $request = $this->getRequest();
+               $session = $request->getSession();
                $out = $this->getOutput();
 
-               /*
-                * If the user is blocked and they only have "partial" access
-                * (e.g. they don't have the userrights permission), then don't
-                * allow them to use Special:UserRights.
-                */
-               if ( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
-                       throw new UserBlockedError( $user->getBlock() );
-               }
+               $out->addModules( [ 'mediawiki.special.userrights' ] );
 
                if ( $par !== null ) {
                        $this->mTarget = $par;
@@ -108,24 +97,11 @@ class UserrightsPage extends SpecialPage {
                        $this->mTarget = trim( $this->mTarget );
                }
 
-               $available = $this->changeableGroups();
-
-               if ( $this->mTarget === null ) {
-                       /*
-                        * If the user specified no target, and they can only
-                        * edit their own groups, automatically set them as the
-                        * target.
-                        */
-                       if ( !count( $available['add'] ) && !count( $available['remove'] ) ) {
-                               $this->mTarget = $user->getName();
-                       }
-               }
-
                if ( $this->mTarget !== null && User::getCanonicalName( $this->mTarget ) === $user->getName() ) {
                        $this->isself = true;
                }
 
-               $fetchedStatus = $this->fetchUser( $this->mTarget );
+               $fetchedStatus = $this->fetchUser( $this->mTarget, true );
                if ( $fetchedStatus->isOK() ) {
                        $this->mFetchedUser = $fetchedStatus->value;
                        if ( $this->mFetchedUser instanceof User ) {
@@ -135,26 +111,14 @@ class UserrightsPage extends SpecialPage {
                        }
                }
 
-               if ( !$this->userCanChangeRights( $user, true ) ) {
-                       if ( $this->isself && $request->getCheck( 'success' ) ) {
-                               // bug 48609: if the user just removed its own rights, this would
-                               // leads it in a "permissions error" page. In that case, show a
-                               // message that it can't anymore use this page instead of an error
-                               $this->setHeaders();
-                               $out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
-                               $out->returnToMain();
-
-                               return;
-                       }
-
-                       // @todo FIXME: There may be intermediate groups we can mention.
-                       $msg = $user->isAnon() ? 'userrights-nologin' : 'userrights-notallowed';
-                       throw new PermissionsError( null, [ [ $msg ] ] );
-               }
-
                // show a successbox, if the user rights was saved successfully
-               if ( $request->getCheck( 'success' ) && $this->mFetchedUser !== null ) {
-                       $out->addModules( [ 'mediawiki.special.userrights' ] );
+               if (
+                       $session->get( 'specialUserrightsSaveSuccess' ) &&
+                       $this->mFetchedUser !== null
+               ) {
+                       // Remove session data for the success message
+                       $session->remove( 'specialUserrightsSaveSuccess' );
+
                        $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' );
                        $out->addHTML(
                                Html::rawElement(
@@ -173,18 +137,13 @@ class UserrightsPage extends SpecialPage {
                        );
                }
 
-               $this->checkReadOnly();
-
                $this->setHeaders();
                $this->outputHeader();
 
                $out->addModuleStyles( 'mediawiki.special' );
                $this->addHelpLink( 'Help:Assigning permissions' );
 
-               // show the general form
-               if ( count( $available['add'] ) || count( $available['remove'] ) ) {
-                       $this->switchForm();
-               }
+               $this->switchForm();
 
                if (
                        $request->wasPosted() &&
@@ -192,6 +151,17 @@ class UserrightsPage extends SpecialPage {
                        $this->mTarget !== null &&
                        $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
                ) {
+                       /*
+                       * If the user is blocked and they only have "partial" access
+                       * (e.g. they don't have the userrights permission), then don't
+                       * allow them to change any user rights.
+                       */
+                       if ( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
+                               throw new UserBlockedError( $user->getBlock() );
+                       }
+
+                       $this->checkReadOnly();
+
                        // save settings
                        if ( !$fetchedStatus->isOK() ) {
                                $this->getOutput()->addWikiText( $fetchedStatus->getWikiText() );
@@ -209,15 +179,22 @@ class UserrightsPage extends SpecialPage {
                        ) {
                                $out->addWikiMsg( 'userrights-conflict' );
                        } else {
-                               $this->saveUserGroups(
+                               $status = $this->saveUserGroups(
                                        $this->mTarget,
                                        $request->getVal( 'user-reason' ),
                                        $targetUser
                                );
 
-                               $out->redirect( $this->getSuccessURL() );
+                               if ( $status->isOK() ) {
+                                       // Set session data for the success message
+                                       $session->set( 'specialUserrightsSaveSuccess', 1 );
 
-                               return;
+                                       $out->redirect( $this->getSuccessURL() );
+                                       return;
+                               } else {
+                                       // Print an error message and redisplay the form
+                                       $out->addWikiText( '<div class="error">' . $status->getWikiText() . '</div>' );
+                               }
                        }
                }
 
@@ -228,7 +205,42 @@ class UserrightsPage extends SpecialPage {
        }
 
        function getSuccessURL() {
-               return $this->getPageTitle( $this->mTarget )->getFullURL( [ 'success' => 1 ] );
+               return $this->getPageTitle( $this->mTarget )->getFullURL();
+       }
+
+       /**
+        * Returns true if this user rights form can set and change user group expiries.
+        * Subclasses may wish to override this to return false.
+        *
+        * @return bool
+        */
+       public function canProcessExpiries() {
+               return !$this->getConfig()->get( 'DisableUserGroupExpiry' );
+       }
+
+       /**
+        * Converts a user group membership expiry string into a timestamp. Words like
+        * 'existing' or 'other' should have been filtered out before calling this
+        * function.
+        *
+        * @param string $expiry
+        * @return string|null|false A string containing a valid timestamp, or null
+        *   if the expiry is infinite, or false if the timestamp is not valid
+        */
+       public static function expiryToTimestamp( $expiry ) {
+               if ( wfIsInfinity( $expiry ) ) {
+                       return null;
+               }
+
+               $unix = strtotime( $expiry );
+
+               if ( !$unix || $unix === -1 ) {
+                       return false;
+               }
+
+               // @todo FIXME: Non-qualified absolute times are not in users specified timezone
+               // and there isn't notice about it in the ui (see ProtectionForm::getExpiry)
+               return wfTimestamp( TS_MW, $unix );
        }
 
        /**
@@ -238,12 +250,14 @@ class UserrightsPage extends SpecialPage {
         * @param string $username Username to apply changes to.
         * @param string $reason Reason for group change
         * @param User|UserRightsProxy $user Target user object.
-        * @return null
+        * @return Status
         */
-       function saveUserGroups( $username, $reason, $user ) {
+       protected function saveUserGroups( $username, $reason, $user ) {
                $allgroups = $this->getAllGroups();
                $addgroup = [];
+               $groupExpiries = []; // associative array of (group name => expiry)
                $removegroup = [];
+               $existingUGMs = $user->getGroupMemberships();
 
                // This could possibly create a highly unlikely race condition if permissions are changed between
                //  when the form is loaded and when the form is saved. Ignoring it for the moment.
@@ -252,42 +266,103 @@ class UserrightsPage extends SpecialPage {
                        // Later on, this gets filtered for what can actually be removed
                        if ( $this->getRequest()->getCheck( "wpGroup-$group" ) ) {
                                $addgroup[] = $group;
+
+                               if ( $this->canProcessExpiries() ) {
+                                       // read the expiry information from the request
+                                       $expiryDropdown = $this->getRequest()->getVal( "wpExpiry-$group" );
+                                       if ( $expiryDropdown === 'existing' ) {
+                                               continue;
+                                       }
+
+                                       if ( $expiryDropdown === 'other' ) {
+                                               $expiryValue = $this->getRequest()->getVal( "wpExpiry-$group-other" );
+                                       } else {
+                                               $expiryValue = $expiryDropdown;
+                                       }
+
+                                       // validate the expiry
+                                       $groupExpiries[$group] = self::expiryToTimestamp( $expiryValue );
+
+                                       if ( $groupExpiries[$group] === false ) {
+                                               return Status::newFatal( 'userrights-invalid-expiry', $group );
+                                       }
+
+                                       // not allowed to have things expiring in the past
+                                       if ( $groupExpiries[$group] && $groupExpiries[$group] < wfTimestampNow() ) {
+                                               return Status::newFatal( 'userrights-expiry-in-past', $group );
+                                       }
+
+                                       // if the user can only add this group (not remove it), the expiry time
+                                       // cannot be brought forward (T156784)
+                                       if ( !$this->canRemove( $group ) &&
+                                               isset( $existingUGMs[$group] ) &&
+                                               ( $existingUGMs[$group]->getExpiry() ?: 'infinity' ) >
+                                                       ( $groupExpiries[$group] ?: 'infinity' )
+                                       ) {
+                                               return Status::newFatal( 'userrights-cannot-shorten-expiry', $group );
+                                       }
+                               }
                        } else {
                                $removegroup[] = $group;
                        }
                }
 
-               $this->doSaveUserGroups( $user, $addgroup, $removegroup, $reason );
+               $this->doSaveUserGroups( $user, $addgroup, $removegroup, $reason, [], $groupExpiries );
+
+               return Status::newGood();
        }
 
        /**
-        * Save user groups changes in the database.
+        * Save user groups changes in the database. This function does not throw errors;
+        * instead, it ignores groups that the performer does not have permission to set.
         *
         * @param User|UserRightsProxy $user
         * @param array $add Array of groups to add
         * @param array $remove Array of groups to remove
         * @param string $reason Reason for group change
+        * @param array $tags Array of change tags to add to the log entry
+        * @param array $groupExpiries Associative array of (group name => expiry),
+        *   containing only those groups that are to have new expiry values set
         * @return array Tuple of added, then removed groups
         */
-       function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
+       function doSaveUserGroups( $user, $add, $remove, $reason = '', $tags = [],
+               $groupExpiries = [] ) {
+
                // Validate input set...
                $isself = $user->getName() == $this->getUser()->getName();
                $groups = $user->getGroups();
+               $ugms = $user->getGroupMemberships();
                $changeable = $this->changeableGroups();
                $addable = array_merge( $changeable['add'], $isself ? $changeable['add-self'] : [] );
                $removable = array_merge( $changeable['remove'], $isself ? $changeable['remove-self'] : [] );
 
                $remove = array_unique(
                        array_intersect( (array)$remove, $removable, $groups ) );
-               $add = array_unique( array_diff(
-                       array_intersect( (array)$add, $addable ),
-                       $groups )
-               );
+               $add = array_intersect( (array)$add, $addable );
+
+               // add only groups that are not already present or that need their expiry updated,
+               // UNLESS the user can only add this group (not remove it) and the expiry time
+               // is being brought forward (T156784)
+               $add = array_filter( $add,
+                       function( $group ) use ( $groups, $groupExpiries, $removable, $ugms ) {
+                               if ( isset( $groupExpiries[$group] ) &&
+                                       !in_array( $group, $removable ) &&
+                                       isset( $ugms[$group] ) &&
+                                       ( $ugms[$group]->getExpiry() ?: 'infinity' ) >
+                                               ( $groupExpiries[$group] ?: 'infinity' )
+                               ) {
+                                       return false;
+                               }
+                               return !in_array( $group, $groups ) || array_key_exists( $group, $groupExpiries );
+                       } );
+
+               Hooks::run( 'ChangeUserGroups', [ $this->getUser(), $user, &$add, &$remove ] );
 
-               $oldGroups = $user->getGroups();
+               $oldGroups = $groups;
+               $oldUGMs = $user->getGroupMemberships();
                $newGroups = $oldGroups;
 
-               // Remove then add groups
+               // Remove groups, then add new ones/update expiries of existing ones
                if ( $remove ) {
                        foreach ( $remove as $index => $group ) {
                                if ( !$user->removeGroup( $group ) ) {
@@ -298,13 +373,15 @@ class UserrightsPage extends SpecialPage {
                }
                if ( $add ) {
                        foreach ( $add as $index => $group ) {
-                               if ( !$user->addGroup( $group ) ) {
+                               $expiry = isset( $groupExpiries[$group] ) ? $groupExpiries[$group] : null;
+                               if ( !$user->addGroup( $group, $expiry ) ) {
                                        unset( $add[$index] );
                                }
                        }
                        $newGroups = array_merge( $newGroups, $add );
                }
                $newGroups = array_unique( $newGroups );
+               $newUGMs = $user->getGroupMemberships();
 
                // Ensure that caches are cleared
                $user->invalidateCache();
@@ -317,24 +394,59 @@ class UserrightsPage extends SpecialPage {
 
                wfDebug( 'oldGroups: ' . print_r( $oldGroups, true ) . "\n" );
                wfDebug( 'newGroups: ' . print_r( $newGroups, true ) . "\n" );
+               wfDebug( 'oldUGMs: ' . print_r( $oldUGMs, true ) . "\n" );
+               wfDebug( 'newUGMs: ' . print_r( $newUGMs, true ) . "\n" );
                // Deprecated in favor of UserGroupsChanged hook
                Hooks::run( 'UserRights', [ &$user, $add, $remove ], '1.26' );
 
-               if ( $newGroups != $oldGroups ) {
-                       $this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
+               // Only add a log entry if something actually changed
+               if ( $newGroups != $oldGroups || $newUGMs != $oldUGMs ) {
+                       $this->addLogEntry( $user, $oldGroups, $newGroups, $reason, $tags, $oldUGMs, $newUGMs );
                }
 
                return [ $add, $remove ];
        }
 
+       /**
+        * Serialise a UserGroupMembership object for storage in the log_params section
+        * of the logging table. Only keeps essential data, removing redundant fields.
+        *
+        * @param UserGroupMembership|null $ugm May be null if things get borked
+        * @return array
+        */
+       protected static function serialiseUgmForLog( $ugm ) {
+               if ( !$ugm instanceof UserGroupMembership ) {
+                       return null;
+               }
+               return [ 'expiry' => $ugm->getExpiry() ];
+       }
+
        /**
         * Add a rights log entry for an action.
-        * @param User $user
+        * @param User|UserRightsProxy $user
         * @param array $oldGroups
         * @param array $newGroups
         * @param array $reason
+        * @param array $tags Change tags for the log entry
+        * @param array $oldUGMs Associative array of (group name => UserGroupMembership)
+        * @param array $newUGMs Associative array of (group name => UserGroupMembership)
         */
-       function addLogEntry( $user, $oldGroups, $newGroups, $reason ) {
+       protected function addLogEntry( $user, $oldGroups, $newGroups, $reason, $tags,
+               $oldUGMs, $newUGMs ) {
+
+               // make sure $oldUGMs and $newUGMs are in the same order, and serialise
+               // each UGM object to a simplified array
+               $oldUGMs = array_map( function( $group ) use ( $oldUGMs ) {
+                       return isset( $oldUGMs[$group] ) ?
+                               self::serialiseUgmForLog( $oldUGMs[$group] ) :
+                               null;
+               }, $oldGroups );
+               $newUGMs = array_map( function( $group ) use ( $newUGMs ) {
+                       return isset( $newUGMs[$group] ) ?
+                               self::serialiseUgmForLog( $newUGMs[$group] ) :
+                               null;
+               }, $newGroups );
+
                $logEntry = new ManualLogEntry( 'rights', 'rights' );
                $logEntry->setPerformer( $this->getUser() );
                $logEntry->setTarget( $user->getUserPage() );
@@ -342,8 +454,13 @@ class UserrightsPage extends SpecialPage {
                $logEntry->setParameters( [
                        '4::oldgroups' => $oldGroups,
                        '5::newgroups' => $newGroups,
+                       'oldmetadata' => $oldUGMs,
+                       'newmetadata' => $newUGMs,
                ] );
                $logid = $logEntry->insert();
+               if ( count( $tags ) ) {
+                       $logEntry->setTags( $tags );
+               }
                $logEntry->publish( $logid );
        }
 
@@ -352,7 +469,7 @@ class UserrightsPage extends SpecialPage {
         * @param string $username Name of the user.
         */
        function editUserGroupsForm( $username ) {
-               $status = $this->fetchUser( $username );
+               $status = $this->fetchUser( $username, true );
                if ( !$status->isOK() ) {
                        $this->getOutput()->addWikiText( $status->getWikiText() );
 
@@ -362,8 +479,8 @@ class UserrightsPage extends SpecialPage {
                }
 
                $groups = $user->getGroups();
-
-               $this->showEditUserGroupsForm( $user, $groups );
+               $groupMemberships = $user->getGroupMemberships();
+               $this->showEditUserGroupsForm( $user, $groups, $groupMemberships );
 
                // This isn't really ideal logging behavior, but let's not hide the
                // interwiki logs if we're using them as is.
@@ -376,9 +493,10 @@ class UserrightsPage extends SpecialPage {
         *
         * Side effects: error output for invalid access
         * @param string $username
+        * @param bool $writing
         * @return Status
         */
-       public function fetchUser( $username ) {
+       public function fetchUser( $username, $writing = true ) {
                $parts = explode( $this->getConfig()->get( 'UserrightsInterwikiDelimiter' ), $username );
                if ( count( $parts ) < 2 ) {
                        $name = trim( $username );
@@ -389,7 +507,7 @@ class UserrightsPage extends SpecialPage {
                        if ( $database == wfWikiID() ) {
                                $database = '';
                        } else {
-                               if ( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
+                               if ( $writing && !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
                                        return Status::newFatal( 'userrights-no-interwiki' );
                                }
                                if ( !UserRightsProxy::validDatabase( $database ) ) {
@@ -484,72 +602,58 @@ class UserrightsPage extends SpecialPage {
                                )
                        ) . ' ' .
                        Xml::submitButton(
-                               $this->msg(
-                                       'editusergroup',
-                                       $this->mFetchedUser === null ? '[]' : $this->mFetchedUser->getName()
-                               )->text()
+                               $this->msg( 'editusergroup' )->text()
                        ) .
                        Html::closeElement( 'fieldset' ) .
                        Html::closeElement( 'form' ) . "\n"
                );
        }
 
-       /**
-        * Go through used and available groups and return the ones that this
-        * form will be able to manipulate based on the current user's system
-        * permissions.
-        *
-        * @param array $groups List of groups the given user is in
-        * @return array Tuple of addable, then removable groups
-        */
-       protected function splitGroups( $groups ) {
-               list( $addable, $removable, $addself, $removeself ) = array_values( $this->changeableGroups() );
-
-               $removable = array_intersect(
-                       array_merge( $this->isself ? $removeself : [], $removable ),
-                       $groups
-               ); // Can't remove groups the user doesn't have
-               $addable = array_diff(
-                       array_merge( $this->isself ? $addself : [], $addable ),
-                       $groups
-               ); // Can't add groups the user does have
-
-               return [ $addable, $removable ];
-       }
-
        /**
         * Show the form to edit group memberships.
         *
         * @param User|UserRightsProxy $user User or UserRightsProxy you're editing
-        * @param array $groups Array of groups the user is in
+        * @param array $groups Array of groups the user is in. Not used by this implementation
+        *   anymore, but kept for backward compatibility with subclasses
+        * @param array $groupMemberships Associative array of (group name => UserGroupMembership
+        *   object) containing the groups the user is in
         */
-       protected function showEditUserGroupsForm( $user, $groups ) {
-               $list = [];
-               $membersList = [];
-               foreach ( $groups as $group ) {
-                       $list[] = self::buildGroupLink( $group );
-                       $membersList[] = self::buildGroupMemberLink( $group );
+       protected function showEditUserGroupsForm( $user, $groups, $groupMemberships ) {
+               $list = $membersList = $tempList = $tempMembersList = [];
+               foreach ( $groupMemberships as $ugm ) {
+                       $linkG = UserGroupMembership::getLink( $ugm, $this->getContext(), 'html' );
+                       $linkM = UserGroupMembership::getLink( $ugm, $this->getContext(), 'html',
+                               $user->getName() );
+                       if ( $ugm->getExpiry() ) {
+                               $tempList[] = $linkG;
+                               $tempMembersList[] = $linkM;
+                       } else {
+                               $list[] = $linkG;
+                               $membersList[] = $linkM;
+
+                       }
                }
 
                $autoList = [];
                $autoMembersList = [];
                if ( $user instanceof User ) {
                        foreach ( Autopromote::getAutopromoteGroups( $user ) as $group ) {
-                               $autoList[] = self::buildGroupLink( $group );
-                               $autoMembersList[] = self::buildGroupMemberLink( $group );
+                               $autoList[] = UserGroupMembership::getLink( $group, $this->getContext(), 'html' );
+                               $autoMembersList[] = UserGroupMembership::getLink( $group, $this->getContext(),
+                                       'html', $user->getName() );
                        }
                }
 
                $language = $this->getLanguage();
                $displayedList = $this->msg( 'userrights-groupsmember-type' )
                        ->rawParams(
-                               $language->listToText( $list ),
-                               $language->listToText( $membersList )
+                               $language->commaList( array_merge( $tempList, $list ) ),
+                               $language->commaList( array_merge( $tempMembersList, $membersList ) )
                        )->escaped();
                $displayedAutolist = $this->msg( 'userrights-groupsmember-type' )
                        ->rawParams(
-                               $language->listToText( $autoList ),
-                               $language->listToText( $autoMembersList )
+                               $language->commaList( $autoList ),
+                               $language->commaList( $autoMembersList )
                        )->escaped();
 
                $grouplist = '';
@@ -578,6 +682,8 @@ class UserrightsPage extends SpecialPage {
                        Linker::TOOL_LINKS_EMAIL /* Add "send e-mail" link */
                );
 
+               list( $groupCheckboxes, $canChangeAny ) =
+                       $this->groupCheckboxes( $groupMemberships, $user );
                $this->getOutput()->addHTML(
                        Xml::openElement(
                                'form',
@@ -598,58 +704,51 @@ class UserrightsPage extends SpecialPage {
                        Xml::element(
                                'legend',
                                [],
-                               $this->msg( 'userrights-editusergroup', $user->getName() )->text()
+                               $this->msg(
+                                       $canChangeAny ? 'userrights-editusergroup' : 'userrights-viewusergroup',
+                                       $user->getName()
+                               )->text()
                        ) .
-                       $this->msg( 'editinguser' )->params( wfEscapeWikiText( $user->getName() ) )
-                               ->rawParams( $userToolLinks )->parse() .
-                       $this->msg( 'userrights-groups-help', $user->getName() )->parse() .
-                       $grouplist .
-                       $this->groupCheckboxes( $groups, $user ) .
-                       Xml::openElement( 'table', [ 'id' => 'mw-userrights-table-outer' ] ) .
-                               "<tr>
-                                       <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'userrights-reason' )->text(), 'wpReason' ) .
-                                       "</td>
-                                       <td class='mw-input'>" .
-                                               Xml::input( 'user-reason', 60, $this->getRequest()->getVal( 'user-reason', false ),
-                                                       [ 'id' => 'wpReason', 'maxlength' => 255 ] ) .
-                                       "</td>
-                               </tr>
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-submit'>" .
-                                               Xml::submitButton( $this->msg( 'saveusergroups', $user->getName() )->text(),
-                                                       [ 'name' => 'saveusergroups' ] +
-                                                               Linker::tooltipAndAccesskeyAttribs( 'userrights-set' )
-                                               ) .
-                                       "</td>
-                               </tr>" .
-                       Xml::closeElement( 'table' ) . "\n" .
+                       $this->msg(
+                               $canChangeAny ? 'editinguser' : 'viewinguserrights'
+                       )->params( wfEscapeWikiText( $user->getName() ) )
+                               ->rawParams( $userToolLinks )->parse()
+               );
+               if ( $canChangeAny ) {
+                       $this->getOutput()->addHTML(
+                               $this->msg( 'userrights-groups-help', $user->getName() )->parse() .
+                               $grouplist .
+                               $groupCheckboxes .
+                               Xml::openElement( 'table', [ 'id' => 'mw-userrights-table-outer' ] ) .
+                                       "<tr>
+                                               <td class='mw-label'>" .
+                                                       Xml::label( $this->msg( 'userrights-reason' )->text(), 'wpReason' ) .
+                                               "</td>
+                                               <td class='mw-input'>" .
+                                                       Xml::input( 'user-reason', 60, $this->getRequest()->getVal( 'user-reason', false ),
+                                                               [ 'id' => 'wpReason', 'maxlength' => 255 ] ) .
+                                               "</td>
+                                       </tr>
+                                       <tr>
+                                               <td></td>
+                                               <td class='mw-submit'>" .
+                                                       Xml::submitButton( $this->msg( 'saveusergroups', $user->getName() )->text(),
+                                                               [ 'name' => 'saveusergroups' ] +
+                                                                       Linker::tooltipAndAccesskeyAttribs( 'userrights-set' )
+                                                       ) .
+                                               "</td>
+                                       </tr>" .
+                               Xml::closeElement( 'table' ) . "\n"
+                       );
+               } else {
+                       $this->getOutput()->addHTML( $grouplist );
+               }
+               $this->getOutput()->addHTML(
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' ) . "\n"
                );
        }
 
-       /**
-        * Format a link to a group description page
-        *
-        * @param string $group
-        * @return string
-        */
-       private static function buildGroupLink( $group ) {
-               return User::makeGroupLinkHTML( $group, User::getGroupName( $group ) );
-       }
-
-       /**
-        * Format a link to a group member description page
-        *
-        * @param string $group
-        * @return string
-        */
-       private static function buildGroupMemberLink( $group ) {
-               return User::makeGroupLinkHTML( $group, User::getGroupMember( $group ) );
-       }
-
        /**
         * Returns an array of all groups that may be edited
         * @return array Array of groups that may be edited.
@@ -661,37 +760,52 @@ class UserrightsPage extends SpecialPage {
        /**
         * Adds a table with checkboxes where you can select what groups to add/remove
         *
-        * @todo Just pass the username string?
-        * @param array $usergroups Groups the user belongs to
+        * @param array $usergroups Associative array of (group name as string =>
+        *   UserGroupMembership object) for groups the user belongs to
         * @param User $user
-        * @return string XHTML table element with checkboxes
+        * @return Array with 2 elements: the XHTML table element with checkxboes, and
+        * whether any groups are changeable
         */
        private function groupCheckboxes( $usergroups, $user ) {
                $allgroups = $this->getAllGroups();
                $ret = '';
 
+               // Get the list of preset expiry times from the system message
+               $expiryOptionsMsg = $this->msg( 'userrights-expiry-options' )->inContentLanguage();
+               $expiryOptions = $expiryOptionsMsg->isDisabled() ?
+                       [] :
+                       explode( ',', $expiryOptionsMsg->text() );
+
                // Put all column info into an associative array so that extensions can
                // more easily manage it.
                $columns = [ 'unchangeable' => [], 'changeable' => [] ];
 
                foreach ( $allgroups as $group ) {
-                       $set = in_array( $group, $usergroups );
+                       $set = isset( $usergroups[$group] );
+                       // Users who can add the group, but not remove it, can only lengthen
+                       // expiries, not shorten them. So they should only see the expiry
+                       // dropdown if the group currently has a finite expiry
+                       $canOnlyLengthenExpiry = ( $set && $this->canAdd( $group ) &&
+                                !$this->canRemove( $group ) && $usergroups[$group]->getExpiry() );
                        // Should the checkbox be disabled?
-                       $disabled = !(
+                       $disabledCheckbox = !(
                                ( $set && $this->canRemove( $group ) ) ||
                                ( !$set && $this->canAdd( $group ) ) );
+                       // Should the expiry elements be disabled?
+                       $disabledExpiry = $disabledCheckbox && !$canOnlyLengthenExpiry;
                        // Do we need to point out that this action is irreversible?
-                       $irreversible = !$disabled && (
+                       $irreversible = !$disabledCheckbox && (
                                ( $set && !$this->canAdd( $group ) ) ||
                                ( !$set && !$this->canRemove( $group ) ) );
 
                        $checkbox = [
                                'set' => $set,
-                               'disabled' => $disabled,
+                               'disabled' => $disabledCheckbox,
+                               'disabled-expiry' => $disabledExpiry,
                                'irreversible' => $irreversible
                        ];
 
-                       if ( $disabled ) {
+                       if ( $disabledCheckbox && $disabledExpiry ) {
                                $columns['unchangeable'][$group] = $checkbox;
                        } else {
                                $columns['changeable'][$group] = $checkbox;
@@ -722,24 +836,116 @@ class UserrightsPage extends SpecialPage {
                        foreach ( $column as $group => $checkbox ) {
                                $attr = $checkbox['disabled'] ? [ 'disabled' => 'disabled' ] : [];
 
-                               $member = User::getGroupMember( $group, $user->getName() );
+                               $member = UserGroupMembership::getGroupMemberName( $group, $user->getName() );
                                if ( $checkbox['irreversible'] ) {
                                        $text = $this->msg( 'userrights-irreversible-marker', $member )->text();
+                               } elseif ( $checkbox['disabled'] && !$checkbox['disabled-expiry'] ) {
+                                       $text = $this->msg( 'userrights-no-shorten-expiry-marker', $member )->text();
                                } else {
                                        $text = $member;
                                }
                                $checkboxHtml = Xml::checkLabel( $text, "wpGroup-" . $group,
                                        "wpGroup-" . $group, $checkbox['set'], $attr );
-                               $ret .= "\t\t" . ( $checkbox['disabled']
-                                       ? Xml::tags( 'span', [ 'class' => 'mw-userrights-disabled' ], $checkboxHtml )
-                                       : $checkboxHtml
-                               ) . "<br />\n";
+                               $ret .= "\t\t" . ( ( $checkbox['disabled'] && $checkbox['disabled-expiry'] )
+                                       ? Xml::tags( 'div', [ 'class' => 'mw-userrights-disabled' ], $checkboxHtml )
+                                       : Xml::tags( 'div', [], $checkboxHtml )
+                               ) . "\n";
+
+                               if ( $this->canProcessExpiries() ) {
+                                       $uiUser = $this->getUser();
+                                       $uiLanguage = $this->getLanguage();
+
+                                       $currentExpiry = isset( $usergroups[$group] ) ?
+                                               $usergroups[$group]->getExpiry() :
+                                               null;
+
+                                       // If the user can't modify the expiry, print the current expiry below
+                                       // it in plain text. Otherwise provide UI to set/change the expiry
+                                       if ( $checkbox['set'] &&
+                                               ( $checkbox['irreversible'] || $checkbox['disabled-expiry'] )
+                                       ) {
+                                               if ( $currentExpiry ) {
+                                                       $expiryFormatted = $uiLanguage->userTimeAndDate( $currentExpiry, $uiUser );
+                                                       $expiryFormattedD = $uiLanguage->userDate( $currentExpiry, $uiUser );
+                                                       $expiryFormattedT = $uiLanguage->userTime( $currentExpiry, $uiUser );
+                                                       $expiryHtml = $this->msg( 'userrights-expiry-current' )->params(
+                                                               $expiryFormatted, $expiryFormattedD, $expiryFormattedT )->text();
+                                               } else {
+                                                       $expiryHtml = $this->msg( 'userrights-expiry-none' )->text();
+                                               }
+                                               $expiryHtml .= "<br />\n";
+                                       } else {
+                                               $expiryHtml = Xml::element( 'span', null,
+                                                       $this->msg( 'userrights-expiry' )->text() );
+                                               $expiryHtml .= Xml::openElement( 'span' );
+
+                                               // add a form element to set the expiry date
+                                               $expiryFormOptions = new XmlSelect(
+                                                       "wpExpiry-$group",
+                                                       "mw-input-wpExpiry-$group", // forward compatibility with HTMLForm
+                                                       $currentExpiry ? 'existing' : 'infinite'
+                                               );
+                                               if ( $checkbox['disabled-expiry'] ) {
+                                                       $expiryFormOptions->setAttribute( 'disabled', 'disabled' );
+                                               }
+
+                                               if ( $currentExpiry ) {
+                                                       $timestamp = $uiLanguage->userTimeAndDate( $currentExpiry, $uiUser );
+                                                       $d = $uiLanguage->userDate( $currentExpiry, $uiUser );
+                                                       $t = $uiLanguage->userTime( $currentExpiry, $uiUser );
+                                                       $existingExpiryMessage = $this->msg( 'userrights-expiry-existing',
+                                                               $timestamp, $d, $t );
+                                                       $expiryFormOptions->addOption( $existingExpiryMessage->text(), 'existing' );
+                                               }
+
+                                               $expiryFormOptions->addOption(
+                                                       $this->msg( 'userrights-expiry-none' )->text(),
+                                                       'infinite'
+                                               );
+                                               $expiryFormOptions->addOption(
+                                                       $this->msg( 'userrights-expiry-othertime' )->text(),
+                                                       'other'
+                                               );
+                                               foreach ( $expiryOptions as $option ) {
+                                                       if ( strpos( $option, ":" ) === false ) {
+                                                               $displayText = $value = $option;
+                                                       } else {
+                                                               list( $displayText, $value ) = explode( ":", $option );
+                                                       }
+                                                       $expiryFormOptions->addOption( $displayText, htmlspecialchars( $value ) );
+                                               }
+
+                                               // Add expiry dropdown
+                                               $expiryHtml .= $expiryFormOptions->getHTML() . '<br />';
+
+                                               // Add custom expiry field
+                                               $attribs = [ 'id' => "mw-input-wpExpiry-$group-other" ];
+                                               if ( $checkbox['disabled-expiry'] ) {
+                                                       $attribs['disabled'] = 'disabled';
+                                               }
+                                               $expiryHtml .= Xml::input( "wpExpiry-$group-other", 30, '', $attribs );
+
+                                               // If the user group is set but the checkbox is disabled, mimic a
+                                               // checked checkbox in the form submission
+                                               if ( $checkbox['set'] && $checkbox['disabled'] ) {
+                                                       $expiryHtml .= Html::hidden( "wpGroup-$group", 1 );
+                                               }
+
+                                               $expiryHtml .= Xml::closeElement( 'span' );
+                                       }
+
+                                       $divAttribs = [
+                                               'id' => "mw-userrights-nested-wpGroup-$group",
+                                               'class' => 'mw-userrights-nested',
+                                       ];
+                                       $ret .= "\t\t\t" . Xml::tags( 'div', $divAttribs, $expiryHtml ) . "\n";
+                               }
                        }
                        $ret .= "\t</td>\n";
                }
                $ret .= Xml::closeElement( 'tr' ) . Xml::closeElement( 'table' );
 
-               return $ret;
+               return [ $ret, (bool)$columns['changeable'] ];
        }
 
        /**
@@ -747,7 +953,6 @@ class UserrightsPage extends SpecialPage {
         * @return bool Can we remove the group?
         */
        private function canRemove( $group ) {
-               // $this->changeableGroups()['remove'] doesn't work, of course. Thanks, PHP.
                $groups = $this->changeableGroups();
 
                return in_array(
index 2cd492e..708eced 100644 (file)
@@ -78,9 +78,16 @@ class SpecialVersion extends SpecialPage {
                // Now figure out what to do
                switch ( strtolower( $parts[0] ) ) {
                        case 'credits':
+                               $out->addModuleStyles( 'mediawiki.special.version' );
+
                                $wikiText = '{{int:version-credits-not-found}}';
                                if ( $extName === 'MediaWiki' ) {
                                        $wikiText = file_get_contents( $IP . '/CREDITS' );
+                                       // Put the contributor list into columns
+                                       $wikiText = str_replace(
+                                               [ '<!-- BEGIN CONTRIBUTOR LIST -->', '<!-- END CONTRIBUTOR LIST -->' ],
+                                               [ '<div class="mw-version-credits">', '</div>' ],
+                                               $wikiText );
                                } elseif ( ( $extNode !== null ) && isset( $extNode['path'] ) ) {
                                        $file = $this->getExtAuthorsFileName( dirname( $extNode['path'] ) );
                                        if ( $file ) {
@@ -785,12 +792,12 @@ class SpecialVersion extends SpecialPage {
                if ( isset( $extension['name'] ) ) {
                        $licenseName = null;
                        if ( isset( $extension['license-name'] ) ) {
-                               $licenseName = $out->parseInline( $extension['license-name'] );
+                               $licenseName = new HtmlArmor( $out->parseInline( $extension['license-name'] ) );
                        } elseif ( $this->getExtLicenseFileName( $extensionPath ) ) {
-                               $licenseName = $this->msg( 'version-ext-license' )->escaped();
+                               $licenseName = $this->msg( 'version-ext-license' )->text();
                        }
                        if ( $licenseName !== null ) {
-                               $licenseLink = Linker::link(
+                               $licenseLink = $this->getLinkRenderer()->makeLink(
                                        $this->getPageTitle( 'License/' . $extension['name'] ),
                                        $licenseName,
                                        [
@@ -956,6 +963,7 @@ class SpecialVersion extends SpecialPage {
         */
        public function listAuthors( $authors, $extName, $extDir ) {
                $hasOthers = false;
+               $linkRenderer = $this->getLinkRenderer();
 
                $list = [];
                foreach ( (array)$authors as $item ) {
@@ -963,9 +971,9 @@ class SpecialVersion extends SpecialPage {
                                $hasOthers = true;
 
                                if ( $extName && $this->getExtAuthorsFileName( $extDir ) ) {
-                                       $text = Linker::link(
+                                       $text = $linkRenderer->makeLink(
                                                $this->getPageTitle( "Credits/$extName" ),
-                                               $this->msg( 'version-poweredby-others' )->escaped()
+                                               $this->msg( 'version-poweredby-others' )->text()
                                        );
                                } else {
                                        $text = $this->msg( 'version-poweredby-others' )->escaped();
@@ -982,9 +990,9 @@ class SpecialVersion extends SpecialPage {
                }
 
                if ( $extName && !$hasOthers && $this->getExtAuthorsFileName( $extDir ) ) {
-                       $list[] = $text = Linker::link(
+                       $list[] = $text = $linkRenderer->makeLink(
                                $this->getPageTitle( "Credits/$extName" ),
-                               $this->msg( 'version-poweredby-others' )->escaped()
+                               $this->msg( 'version-poweredby-others' )->text()
                        );
                }
 
index 9bf44ad..fc0c312 100644 (file)
@@ -91,20 +91,17 @@ class WantedCategoriesPage extends WantedQueryPage {
                global $wgContLang;
 
                $nt = Title::makeTitle( $result->namespace, $result->title );
-               $text = htmlspecialchars( $wgContLang->convert( $nt->getText() ) );
+               $text = $wgContLang->convert( $nt->getText() );
 
                if ( !$this->isCached() ) {
                        // We can assume the freshest data
-                       $plink = Linker::link(
+                       $plink = $this->getLinkRenderer()->makeBrokenLink(
                                $nt,
-                               $text,
-                               [],
-                               [],
-                               [ 'broken' ]
+                               $text
                        );
                        $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
                } else {
-                       $plink = Linker::link( $nt, $text );
+                       $plink = $this->getLinkRenderer()->makeLink( $nt, $text );
 
                        $currentValue = isset( $this->currentCategoryCounts[$result->title] )
                                ? $this->currentCategoryCounts[$result->title]
index c37ecbd..8cea6cc 100644 (file)
@@ -85,7 +85,9 @@ class WantedPagesPage extends WantedQueryPage {
                        ]
                ];
                // Replacement for the WantedPages::getSQL hook
-               Hooks::run( 'WantedPages::getQueryInfo', [ &$this, &$query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $wantedPages = $this;
+               Hooks::run( 'WantedPages::getQueryInfo', [ &$wantedPages, &$query ] );
 
                return $query;
        }
index 4824961..85ac2de 100644 (file)
@@ -52,6 +52,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $this->addHelpLink( 'Help:Watching pages' );
                $output->addModules( [
                        'mediawiki.special.changeslist.visitedstatus',
+                       'mediawiki.special.watchlist',
                ] );
 
                $mode = SpecialEditWatchlist::getMode( $request, $subpage );
@@ -130,7 +131,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        /**
-        * Get custom show/hide filters
+        * Get all custom filters
         *
         * @return array Map of filter URL param names to properties (msg/default)
         */
@@ -421,12 +422,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $user = $this->getUser();
                $out = $this->getOutput();
 
-               // if the user wishes, that the watchlist is reloaded, whenever a filter changes,
-               // add the module for that
-               if ( $user->getBoolOption( 'watchlistreloadautomatically' ) ) {
-                       $out->addModules( [ 'mediawiki.special.watchlist' ] );
-               }
-
                $out->addSubtitle(
                        $this->msg( 'watchlistfor2', $user->getName() )
                                ->rawParams( SpecialEditWatchlist::buildTools(
@@ -465,9 +460,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $filters['hidecategorization'] = 'wlshowhidecategorization';
                }
 
-               foreach ( $this->getCustomFilters() as $key => $params ) {
+               foreach ( $this->getRenderableCustomFilters( $this->getCustomFilters() ) as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
+
                // Disable some if needed
                if ( !$user->useRCPatrol() ) {
                        unset( $filters['hidepatrolled'] );
@@ -608,7 +604,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $form .= Xml::openElement( 'form', [ 'method' => 'post',
                                'action' => $this->getPageTitle()->getLocalURL(),
                                'id' => 'mw-watchlist-resetbutton' ] ) . "\n" .
-                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), [ 'name' => 'dummy' ] ) . "\n" .
+                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(),
+                               [ 'name' => 'mw-watchlist-reset-submit' ] ) . "\n" .
                        Html::hidden( 'reset', 'all' ) . "\n";
                        foreach ( $nondefaults as $key => $value ) {
                                $form .= Html::hidden( $key, $value ) . "\n";
index 1ead290..439b6ab 100644 (file)
@@ -327,7 +327,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        $query = [];
                }
 
-               $link = Linker::linkKnown(
+               $link = $this->getLinkRenderer()->makeKnownLink(
                        $nt,
                        null,
                        $row->page_is_redirect ? [ 'class' => 'mw-redirect' ] : [],
@@ -376,9 +376,15 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        $title = $this->getPageTitle();
                }
 
+               $linkRenderer = $this->getLinkRenderer();
+
+               if ( $text !== null ) {
+                       $text = new HtmlArmor( $text );
+               }
+
                // always show a "<- Links" link
                $links = [
-                       'links' => Linker::linkKnown(
+                       'links' => $linkRenderer->makeKnownLink(
                                $title,
                                $text,
                                [],
@@ -393,7 +399,11 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $target )->supportsDirectEditing()
                ) {
-                       $links['edit'] = Linker::linkKnown(
+                       if ( $editText !== null ) {
+                               $editText = new HtmlArmor( $editText );
+                       }
+
+                       $links['edit'] = $linkRenderer->makeKnownLink(
                                $target,
                                $editText,
                                [],
@@ -406,7 +416,11 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
        }
 
        function makeSelfLink( $text, $query ) {
-               return Linker::linkKnown(
+               if ( $text !== null ) {
+                       $text = new HtmlArmor( $text );
+               }
+
+               return $this->getLinkRenderer()->makeKnownLink(
                        $this->selfTitle,
                        $text,
                        [],
index 645a115..0d6f493 100644 (file)
@@ -101,12 +101,21 @@ 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() );
+                       }
                }
                if ( $this->excludegroups !== [] ) {
                        foreach ( $this->excludegroups as $group ) {
                                $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
-                                               'user_groups', '1', [ 'ug_user = user_id', 'ug_group' => $group ]
-                                       ) . ')';
+                                       '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() )
+                                       ]
+                               ) . ')';
                        }
                }
                if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
@@ -165,9 +174,9 @@ class ActiveUsersPager extends UsersPager {
                $list = [];
                $user = User::newFromId( $row->user_id );
 
-               $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache );
-               foreach ( $groups_list as $group ) {
-                       $list[] = self::buildGroupLink( $group, $userName );
+               $ugms = self::getGroupMemberships( intval( $row->user_id ), $this->userGroupCache );
+               foreach ( $ugms as $ugm ) {
+                       $list[] = $this->buildGroupLink( $ugm, $userName );
                }
 
                $groups = $lang->commaList( $list );
index 5609310..efc51ef 100644 (file)
@@ -25,6 +25,8 @@
  *
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class AllMessagesTablePager extends TablePager {
 
        protected $filter, $prefix, $langcode, $displayPrefix;
@@ -297,6 +299,7 @@ class AllMessagesTablePager extends TablePager {
        }
 
        function formatValue( $field, $value ) {
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                switch ( $field ) {
                        case 'am_title' :
                                $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
@@ -313,25 +316,19 @@ class AllMessagesTablePager extends TablePager {
                                );
 
                                if ( $this->mCurrentRow->am_customised ) {
-                                       $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
+                                       $title = $linkRenderer->makeKnownLink( $title, $this->getLanguage()->lcfirst( $value ) );
                                } else {
-                                       $title = Linker::link(
+                                       $title = $linkRenderer->makeBrokenLink(
                                                $title,
-                                               $this->getLanguage()->lcfirst( $value ),
-                                               [],
-                                               [],
-                                               [ 'broken' ]
+                                               $this->getLanguage()->lcfirst( $value )
                                        );
                                }
                                if ( $this->mCurrentRow->am_talk_exists ) {
-                                       $talk = Linker::linkKnown( $talk, $this->talk );
+                                       $talk = $linkRenderer->makeKnownLink( $talk, $this->talk );
                                } else {
-                                       $talk = Linker::link(
+                                       $talk = $linkRenderer->makeBrokenLink(
                                                $talk,
-                                               $this->talk,
-                                               [],
-                                               [],
-                                               [ 'broken' ]
+                                               $this->talk
                                        );
                                }
 
index d822976..a4124db 100644 (file)
@@ -22,6 +22,8 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class BlockListPager extends TablePager {
 
        protected $conds;
@@ -72,7 +74,7 @@ class BlockListPager extends TablePager {
                        ];
 
                        foreach ( $keys as $key ) {
-                               $msg[$key] = $this->msg( $key )->escaped();
+                               $msg[$key] = $this->msg( $key )->text();
                        }
                }
 
@@ -83,6 +85,8 @@ class BlockListPager extends TablePager {
 
                $formatted = '';
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                switch ( $name ) {
                        case 'ipb_timestamp':
                                $formatted = htmlspecialchars( $language->userTimeAndDate( $value, $this->getUser() ) );
@@ -117,18 +121,18 @@ class BlockListPager extends TablePager {
                                ) );
                                if ( $this->getUser()->isAllowed( 'block' ) ) {
                                        if ( $row->ipb_auto ) {
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Unblock' ),
                                                        $msg['unblocklink'],
                                                        [],
                                                        [ 'wpTarget' => "#{$row->ipb_id}" ]
                                                );
                                        } else {
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Unblock', $row->ipb_address ),
                                                        $msg['unblocklink']
                                                );
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Block', $row->ipb_address ),
                                                        $msg['change-blocklink']
                                                );
@@ -174,21 +178,21 @@ class BlockListPager extends TablePager {
                        case 'ipb_params':
                                $properties = [];
                                if ( $row->ipb_anon_only ) {
-                                       $properties[] = $msg['anononlyblock'];
+                                       $properties[] = htmlspecialchars( $msg['anononlyblock'] );
                                }
                                if ( $row->ipb_create_account ) {
-                                       $properties[] = $msg['createaccountblock'];
+                                       $properties[] = htmlspecialchars( $msg['createaccountblock'] );
                                }
                                if ( $row->ipb_user && !$row->ipb_enable_autoblock ) {
-                                       $properties[] = $msg['noautoblockblock'];
+                                       $properties[] = htmlspecialchars( $msg['noautoblockblock'] );
                                }
 
                                if ( $row->ipb_block_email ) {
-                                       $properties[] = $msg['emailblock'];
+                                       $properties[] = htmlspecialchars( $msg['emailblock'] );
                                }
 
                                if ( !$row->ipb_allow_usertalk ) {
-                                       $properties[] = $msg['blocklist-nousertalk'];
+                                       $properties[] = htmlspecialchars( $msg['blocklist-nousertalk'] );
                                }
 
                                $formatted = $language->commaList( $properties );
index b78fed8..7db90c1 100644 (file)
@@ -52,7 +52,6 @@ class CategoryPager extends AlphabeticPager {
                return [
                        'tables' => [ 'category' ],
                        'fields' => [ 'cat_title', 'cat_pages' ],
-                       'conds' => [ 'cat_pages > 0' ],
                        'options' => [ 'USE INDEX' => 'cat_title' ],
                ];
        }
@@ -93,21 +92,24 @@ class CategoryPager extends AlphabeticPager {
        }
 
        public function getStartForm( $from ) {
-               return Xml::tags(
-                       'form',
-                       [ 'method' => 'get', 'action' => wfScript() ],
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                       Xml::fieldset(
-                               $this->msg( 'categories' )->text(),
-                               Xml::inputLabel(
-                                       $this->msg( 'categoriesfrom' )->text(),
-                                       'from', 'from', 20, $from, [ 'class' => 'mw-ui-input-inline' ] ) .
-                               ' ' .
-                               Html::submitButton(
-                                       $this->msg( 'categories-submit' )->text(),
-                                       [], [ 'mw-ui-progressive' ]
-                               )
-                       )
-               );
+               $formDescriptor = [
+                       'from' => [
+                               'type' => 'title',
+                               'namespace' => NS_CATEGORY,
+                               'relative' => true,
+                               'label-message' => 'categoriesfrom',
+                               'name' => 'from',
+                               'id' => 'from',
+                               'size' => 20,
+                               'default' => $from,
+                       ],
+               ];
+
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setSubmitTextMsg( 'categories-submit' )
+                       ->setWrapperLegendMsg( 'categories' )
+                       ->setMethod( 'get' );
+               return $htmlForm->prepareForm()->getHTML( false );
        }
+
 }
index a145e45..47a2aed 100644 (file)
@@ -23,6 +23,8 @@
  * Pager for Special:Contributions
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class ContribsPager extends ReverseChronologicalPager {
 
        public $mDefaultDirection = IndexPager::DIR_DESCENDING;
@@ -198,7 +200,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        $this->tagFilter
                );
 
-               Hooks::run( 'ContribsPager::getQueryInfo', [ &$this, &$queryInfo ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $pager = $this;
+               Hooks::run( 'ContribsPager::getQueryInfo', [ &$pager, &$queryInfo ] );
 
                return $queryInfo;
        }
@@ -220,7 +224,11 @@ class ContribsPager extends ReverseChronologicalPager {
                                $join_conds['user_groups'] = [
                                        'LEFT JOIN', [
                                                'ug_user = rev_user',
-                                               'ug_group' => $groupsWithBotPermission
+                                               'ug_group' => $groupsWithBotPermission,
+                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
+                                                       '1' :
+                                                       'ug_expiry IS NULL OR ug_expiry >= ' .
+                                                               $this->mDb->addQuotes( $this->mDb->timestamp() )
                                        ]
                                ];
                        }
@@ -347,6 +355,8 @@ class ContribsPager extends ReverseChronologicalPager {
                $ret = '';
                $classes = [];
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                /*
                 * There may be more than just revision rows. To make sure that we'll only be processing
                 * revisions here, let's _try_ to build a revision out of our row (without displaying
@@ -367,9 +377,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        $classes = [];
 
                        $page = Title::newFromRow( $row );
-                       $link = Linker::link(
+                       $link = $linkRenderer->makeLink(
                                $page,
-                               htmlspecialchars( $page->getPrefixedText() ),
+                               $page->getPrefixedText(),
                                [ 'class' => 'mw-contributions-title' ],
                                $page->isRedirect() ? [ 'redirect' => 'no' ] : []
                        );
@@ -389,10 +399,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        }
                        # Is there a visible previous revision?
                        if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
-                               $difftext = Linker::linkKnown(
+                               $difftext = $linkRenderer->makeKnownLink(
                                        $page,
-                                       $this->messages['diff'],
-                                       [],
+                                       new HtmlArmor( $this->messages['diff'] ),
+                                       [ 'class' => 'mw-changeslist-diff' ],
                                        [
                                                'diff' => 'prev',
                                                'oldid' => $row->rev_id
@@ -401,10 +411,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        } else {
                                $difftext = $this->messages['diff'];
                        }
-                       $histlink = Linker::linkKnown(
+                       $histlink = $linkRenderer->makeKnownLink(
                                $page,
-                               $this->messages['hist'],
-                               [],
+                               new HtmlArmor( $this->messages['hist'] ),
+                               [ 'class' => 'mw-changeslist-history' ],
                                [ 'action' => 'history' ]
                        );
 
@@ -434,9 +444,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true );
                        $date = $lang->userTimeAndDate( $row->rev_timestamp, $user );
                        if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                               $d = Linker::linkKnown(
+                               $d = $linkRenderer->makeKnownLink(
                                        $page,
-                                       htmlspecialchars( $date ),
+                                       $date,
                                        [ 'class' => 'mw-changeslist-date' ],
                                        [ 'oldid' => intval( $row->rev_id ) ]
                                );
index 1acbba1..9ffcce9 100644 (file)
@@ -22,6 +22,8 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class DeletedContribsPager extends IndexPager {
 
        public $mDefaultDirection = IndexPager::DIR_DESCENDING;
@@ -39,7 +41,7 @@ class DeletedContribsPager extends IndexPager {
                parent::__construct( $context );
                $msgs = [ 'deletionlog', 'undeleteviewlink', 'diff' ];
                foreach ( $msgs as $msg ) {
-                       $this->messages[$msg] = $this->msg( $msg )->escaped();
+                       $this->messages[$msg] = $this->msg( $msg )->text();
                }
                $this->target = $target;
                $this->namespace = $namespace;
@@ -240,6 +242,8 @@ class DeletedContribsPager extends IndexPager {
        function formatRevisionRow( $row ) {
                $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                $rev = new Revision( [
                        'title' => $page,
                        'id' => $row->ar_rev_id,
@@ -254,7 +258,7 @@ class DeletedContribsPager extends IndexPager {
                $undelete = SpecialPage::getTitleFor( 'Undelete' );
 
                $logs = SpecialPage::getTitleFor( 'Log' );
-               $dellog = Linker::linkKnown(
+               $dellog = $linkRenderer->makeKnownLink(
                        $logs,
                        $this->messages['deletionlog'],
                        [],
@@ -264,7 +268,7 @@ class DeletedContribsPager extends IndexPager {
                        ]
                );
 
-               $reviewlink = Linker::linkKnown(
+               $reviewlink = $linkRenderer->makeKnownLink(
                        SpecialPage::getTitleFor( 'Undelete', $page->getPrefixedDBkey() ),
                        $this->messages['undeleteviewlink']
                );
@@ -272,7 +276,7 @@ class DeletedContribsPager extends IndexPager {
                $user = $this->getUser();
 
                if ( $user->isAllowed( 'deletedtext' ) ) {
-                       $last = Linker::linkKnown(
+                       $last = $linkRenderer->makeKnownLink(
                                $undelete,
                                $this->messages['diff'],
                                [],
@@ -283,17 +287,16 @@ class DeletedContribsPager extends IndexPager {
                                ]
                        );
                } else {
-                       $last = $this->messages['diff'];
+                       $last = htmlspecialchars( $this->messages['diff'] );
                }
 
                $comment = Linker::revComment( $rev );
                $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
-               $date = htmlspecialchars( $date );
 
                if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                       $link = $date; // unusable link
+                       $link = htmlspecialchars( $date ); // unusable link
                } else {
-                       $link = Linker::linkKnown(
+                       $link = $linkRenderer->makeKnownLink(
                                $undelete,
                                $date,
                                [ 'class' => 'mw-changeslist-date' ],
@@ -308,7 +311,7 @@ class DeletedContribsPager extends IndexPager {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
-               $pagelink = Linker::link(
+               $pagelink = $linkRenderer->makeLink(
                        $page,
                        null,
                        [ 'class' => 'mw-changeslist-title' ]
index 7fc4a95..59dea02 100644 (file)
@@ -22,6 +22,8 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class ImageListPager extends TablePager {
 
        protected $mFieldNames = null;
@@ -422,6 +424,7 @@ class ImageListPager extends TablePager {
         * @throws MWException
         */
        function formatValue( $field, $value ) {
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                switch ( $field ) {
                        case 'thumb':
                                $opt = [ 'time' => wfTimestamp( TS_MW, $this->mCurrentRow->img_timestamp ) ];
@@ -449,9 +452,9 @@ class ImageListPager extends TablePager {
                                // Weird files can maybe exist? Bug 22227
                                $filePage = Title::makeTitleSafe( NS_FILE, $value );
                                if ( $filePage ) {
-                                       $link = Linker::linkKnown(
+                                       $link = $linkRenderer->makeKnownLink(
                                                $filePage,
-                                               htmlspecialchars( $filePage->getText() )
+                                               $filePage->getText()
                                        );
                                        $download = Xml::element( 'a',
                                                [ 'href' => wfLocalFile( $filePage )->getUrl() ],
@@ -462,9 +465,9 @@ class ImageListPager extends TablePager {
                                        // Add delete links if allowed
                                        // From https://github.com/Wikia/app/pull/3859
                                        if ( $filePage->userCan( 'delete', $this->getUser() ) ) {
-                                               $deleteMsg = $this->msg( 'listfiles-delete' )->escaped();
+                                               $deleteMsg = $this->msg( 'listfiles-delete' )->text();
 
-                                               $delete = Linker::linkKnown(
+                                               $delete = $linkRenderer->makeKnownLink(
                                                        $filePage, $deleteMsg, [], [ 'action' => 'delete' ]
                                                );
                                                $delete = $this->msg( 'parentheses' )->rawParams( $delete )->escaped();
@@ -479,9 +482,9 @@ class ImageListPager extends TablePager {
                        case 'img_user_text':
                                if ( $this->mCurrentRow->img_user ) {
                                        $name = User::whoIs( $this->mCurrentRow->img_user );
-                                       $link = Linker::link(
+                                       $link = $linkRenderer->makeLink(
                                                Title::makeTitle( NS_USER, $name ),
-                                               htmlspecialchars( $name )
+                                               $name
                                        );
                                } else {
                                        $link = htmlspecialchars( $value );
index 56229b3..bbf97e1 100644 (file)
@@ -54,15 +54,17 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                $batch = new LinkBatch();
                # Give some pointers to make (last) links
                $this->mForm->prevId = [];
+               $rev_id = null;
                foreach ( $this->mResult as $row ) {
                        $batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
                        $batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
 
-                       $rev_id = isset( $rev_id ) ? $rev_id : $row->rev_id;
-                       if ( $rev_id > $row->rev_id ) {
-                               $this->mForm->prevId[$rev_id] = $row->rev_id;
-                       } elseif ( $rev_id < $row->rev_id ) {
-                               $this->mForm->prevId[$row->rev_id] = $rev_id;
+                       if ( isset( $rev_id ) ) {
+                               if ( $rev_id > $row->rev_id ) {
+                                       $this->mForm->prevId[$rev_id] = $row->rev_id;
+                               } elseif ( $rev_id < $row->rev_id ) {
+                                       $this->mForm->prevId[$row->rev_id] = $rev_id;
+                               }
                        }
 
                        $rev_id = $row->rev_id;
index 41819fc..4bf5dff 100644 (file)
 /**
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class NewFilesPager extends ReverseChronologicalPager {
 
        /**
-        * @var ImageGallery
+        * @var ImageGalleryBase
         */
        protected $gallery;
 
@@ -57,13 +59,17 @@ class NewFilesPager extends ReverseChronologicalPager {
                        $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
 
                        if ( count( $groupsWithBotPermission ) ) {
+                               $dbr = wfGetDB( DB_REPLICA );
                                $tables[] = 'user_groups';
                                $conds[] = 'ug_group IS NULL';
                                $jconds['user_groups'] = [
                                        'LEFT JOIN',
                                        [
                                                'ug_group' => $groupsWithBotPermission,
-                                               'ug_user = img_user'
+                                               'ug_user = img_user',
+                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
+                                                       '1' :
+                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ]
                                ];
                        }
@@ -142,7 +148,10 @@ class NewFilesPager extends ReverseChronologicalPager {
                $user = User::newFromId( $row->img_user );
 
                $title = Title::makeTitle( NS_FILE, $name );
-               $ul = Linker::link( $user->getUserPage(), $user->getName() );
+               $ul = MediaWikiServices::getInstance()->getLinkRenderer()->makeLink(
+                       $user->getUserPage(),
+                       $user->getName()
+               );
                $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() );
 
                $this->gallery->add(
index e298f10..dafd244 100644 (file)
@@ -100,8 +100,10 @@ class NewPagesPager extends ReverseChronologicalPager {
                ];
                $join_conds = [ 'page' => [ 'INNER JOIN', 'page_id=rc_cur_id' ] ];
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $pager = $this;
                Hooks::run( 'SpecialNewpagesConditions',
-                       [ &$this, $this->opts, &$conds, &$tables, &$fields, &$join_conds ] );
+                       [ &$pager, $this->opts, &$conds, &$tables, &$fields, &$join_conds ] );
 
                $options = [];
 
index 901be38..12039aa 100644 (file)
@@ -112,6 +112,9 @@ 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() );
+                       }
                }
 
                if ( $this->requestedUser != '' ) {
@@ -177,12 +180,12 @@ class UsersPager extends AlphabeticPager {
                $lang = $this->getLanguage();
 
                $groups = '';
-               $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache );
+               $ugms = self::getGroupMemberships( intval( $row->user_id ), $this->userGroupCache );
 
-               if ( !$this->including && count( $groups_list ) > 0 ) {
+               if ( !$this->including && count( $ugms ) > 0 ) {
                        $list = [];
-                       foreach ( $groups_list as $group ) {
-                               $list[] = self::buildGroupLink( $group, $userName );
+                       foreach ( $ugms as $ugm ) {
+                               $list[] = $this->buildGroupLink( $ugm, $userName );
                        }
                        $groups = $lang->commaList( $list );
                }
@@ -231,15 +234,18 @@ class UsersPager extends AlphabeticPager {
                $dbr = wfGetDB( DB_REPLICA );
                $groupRes = $dbr->select(
                        'user_groups',
-                       [ 'ug_user', 'ug_group' ],
+                       UserGroupMembership::selectFields(),
                        [ 'ug_user' => $userIds ],
                        __METHOD__
                );
                $cache = [];
                $groups = [];
                foreach ( $groupRes as $row ) {
-                       $cache[intval( $row->ug_user )][] = $row->ug_group;
-                       $groups[$row->ug_group] = true;
+                       $ugm = UserGroupMembership::newFromRow( $row );
+                       if ( !$ugm->isExpired() ) {
+                               $cache[$row->ug_user][$row->ug_group] = $ugm;
+                               $groups[$row->ug_group] = true;
+                       }
                }
 
                // Give extensions a chance to add things like global user group data
@@ -250,7 +256,7 @@ class UsersPager extends AlphabeticPager {
 
                // Add page of groups to link batch
                foreach ( $groups as $group => $unused ) {
-                       $groupPage = User::getGroupPage( $group );
+                       $groupPage = UserGroupMembership::getGroupPage( $group );
                        if ( $groupPage ) {
                                $batch->addObj( $groupPage );
                        }
@@ -340,7 +346,7 @@ class UsersPager extends AlphabeticPager {
        function getAllGroups() {
                $result = [];
                foreach ( User::getAllGroups() as $group ) {
-                       $result[$group] = User::getGroupName( $group );
+                       $result[$group] = UserGroupMembership::getGroupName( $group );
                }
                asort( $result );
 
@@ -365,36 +371,30 @@ class UsersPager extends AlphabeticPager {
        }
 
        /**
-        * Get a list of groups the specified user belongs to
+        * Get an associative array containing groups the specified user belongs to,
+        * and the relevant UserGroupMembership objects
         *
         * @param int $uid User id
         * @param array|null $cache
-        * @return array
+        * @return array (group name => UserGroupMembership object)
         */
-       protected static function getGroups( $uid, $cache = null ) {
+       protected static function getGroupMemberships( $uid, $cache = null ) {
                if ( $cache === null ) {
                        $user = User::newFromId( $uid );
-                       $effectiveGroups = $user->getEffectiveGroups();
+                       return $user->getGroupMemberships();
                } else {
-                       $effectiveGroups = isset( $cache[$uid] ) ? $cache[$uid] : [];
+                       return isset( $cache[$uid] ) ? $cache[$uid] : [];
                }
-               $groups = array_diff( $effectiveGroups, User::getImplicitGroups() );
-
-               return $groups;
        }
 
        /**
         * Format a link to a group description page
         *
-        * @param string $group Group name
+        * @param string|UserGroupMembership $group Group name or UserGroupMembership object
         * @param string $username Username
         * @return string
         */
-       protected static function buildGroupLink( $group, $username ) {
-               return User::makeGroupLinkHTML(
-                       $group,
-                       User::getGroupMember( $group, $username )
-               );
+       protected function buildGroupLink( $group, $username ) {
+               return UserGroupMembership::getLink( $group, $this->getContext(), 'html', $username );
        }
-
 }
index 1346e1c..8da1553 100644 (file)
@@ -75,7 +75,7 @@ class BalanceSets {
                self::HTML_NAMESPACE => [
                        'html' => true, 'head' => true, 'body' => true, 'frameset' => true,
                        'frame' => true,
-                       'plaintext' => true, 'isindex' => true,
+                       'plaintext' => true,
                        'xmp' => true, 'iframe' => true, 'noembed' => true,
                        'noscript' => true, 'script' => true,
                        'title' => true
@@ -119,9 +119,9 @@ class BalanceSets {
                        'h2' => true, 'h3' => true, 'h4' => true, 'h5' => true,
                        'h6' => true, 'head' => true, 'header' => true, 'hgroup' => true,
                        'hr' => true, 'html' => true, 'iframe' => true, 'img' => true,
-                       'input' => true, 'isindex' => true, 'li' => true, 'link' => true,
+                       'input' => true, 'li' => true, 'link' => true,
                        'listing' => true, 'main' => true, 'marquee' => true,
-                       'menu' => true, 'menuitem' => true, 'meta' => true, 'nav' => true,
+                       'menu' => true, 'meta' => true, 'nav' => true,
                        'noembed' => true, 'noframes' => true, 'noscript' => true,
                        'object' => true, 'ol' => true, 'p' => true, 'param' => true,
                        'plaintext' => true, 'pre' => true, 'script' => true,
@@ -156,7 +156,8 @@ class BalanceSets {
 
        public static $impliedEndTagsSet = [
                self::HTML_NAMESPACE => [
-                       'dd' => true, 'dt' => true, 'li' => true, 'optgroup' => true,
+                       'dd' => true, 'dt' => true, 'li' => true,
+                       'menuitem' => true, 'optgroup' => true,
                        'option' => true, 'p' => true, 'rb' => true, 'rp' => true,
                        'rt' => true, 'rtc' => true
                ]
@@ -498,6 +499,16 @@ class BalanceElement {
                                        $this->attribs = [ 'class' => "mw-empty-elt" ];
                                }
                                $blank = false;
+                       } elseif (
+                               $this->isA( BalanceSets::$extraLinefeedSet ) &&
+                               count( $this->children ) > 0 &&
+                               substr( $this->children[0], 0, 1 ) == "\n"
+                       ) {
+                               // Double the linefeed after pre/listing/textarea
+                               // according to the (old) HTML5 fragment serialization
+                               // algorithm (see https://github.com/whatwg/html/issues/944)
+                               // to ensure this will round-trip.
+                               array_unshift( $this->children, "\n" );
                        }
                        $flat = $blank ? '' : "{$this}";
                } else {
@@ -529,15 +540,6 @@ class BalanceElement {
                                $out .= "{$elt}";
                        }
                        $out .= "</{$this->localName}>";
-                       if (
-                               $this->isA( BalanceSets::$extraLinefeedSet ) &&
-                               $out[$len] === "\n"
-                       ) {
-                               // Double the linefeed after pre/listing/textarea
-                               // according to the HTML5 fragment serialization algorithm.
-                               $out = substr( $out, 0, $len + 1 ) .
-                                       substr( $out, $len );
-                       }
                } else {
                        $out = "<{$this->localName}{$encAttribs} />";
                        Assert::invariant(
@@ -1410,6 +1412,7 @@ class BalanceActiveFormattingElements {
        private $noahTableStack = [ [] ];
 
        public function __destruct() {
+               $next = null;
                for ( $node = $this->head; $node; $node = $next ) {
                        $next = $node->nextAFE;
                        $node->prevAFE = $node->nextAFE = $node->nextNoah = null;
@@ -1769,7 +1772,7 @@ class BalanceActiveFormattingElements {
  *   and escaped.
  * - All null characters are assumed to have been removed.
  * - The following elements are disallowed: <html>, <head>, <body>, <frameset>,
- *   <frame>, <plaintext>, <isindex>, <xmp>, <iframe>,
+ *   <frame>, <plaintext>, <xmp>, <iframe>,
  *   <noembed>, <noscript>, <script>, <title>.  As a result,
  *   further simplifications can be made:
  *   - `frameset-ok` is not tracked.
@@ -1864,7 +1867,9 @@ class Balancer {
         *         provide historical compatibility with the old "tidy"
         *         program: <p>-wrapping is done to the children of
         *         <body> and <blockquote> elements, and empty elements
-        *         are removed.
+        *         are removed.  The <pre>/<listing>/<textarea> serialization
+        *         is also tweaked to allow lossless round trips.
+        *         (See: https://github.com/whatwg/html/issues/944)
         *     'allowComments': boolean, defaults to true.
         *         When true, allows HTML comments in the input.
         *         The Sanitizer generally strips all comments, so if you
@@ -1996,6 +2001,7 @@ class Balancer {
                // Some hoops we have to jump through
                $adjusted = $this->stack->adjustedCurrentNode( $this->fragmentContext );
 
+               // The spec calls this the "tree construction dispatcher".
                $isForeign = true;
                if (
                        $this->stack->length() === 0 ||
@@ -2036,6 +2042,9 @@ class Balancer {
                if ( $token === 'text' ) {
                        $this->stack->insertText( $value );
                        return true;
+               } elseif ( $token === 'comment' ) {
+                       $this->stack->insertComment( $value );
+                       return true;
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
                        case 'font':
@@ -2467,7 +2476,6 @@ class Balancer {
                        case 'header':
                        case 'hgroup':
                        case 'main':
-                       case 'menu':
                        case 'nav':
                        case 'ol':
                        case 'p':
@@ -2480,6 +2488,16 @@ class Balancer {
                                $this->stack->insertHTMLElement( $value, $attribs );
                                return true;
 
+                       case 'menu':
+                               if ( $this->stack->inButtonScope( "p" ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                       $this->stack->pop();
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
                        case 'h1':
                        case 'h2':
                        case 'h3':
@@ -2655,7 +2673,6 @@ class Balancer {
                                // (hence we don't need to examine the tag's "type" attribute)
                                return true;
 
-                       case 'menuitem':
                        case 'param':
                        case 'source':
                        case 'track':
@@ -2667,6 +2684,9 @@ class Balancer {
                                if ( $this->stack->inButtonScope( 'p' ) ) {
                                        $this->inBodyMode( 'endtag', 'p' );
                                }
+                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                       $this->stack->pop();
+                               }
                                $this->stack->insertHTMLElement( $value, $attribs );
                                $this->stack->pop();
                                return true;
@@ -2675,8 +2695,6 @@ class Balancer {
                                // warts!
                                return $this->inBodyMode( $token, 'img', $attribs, $selfClose );
 
-                       // OMITTED: <isindex>
-
                        case 'textarea':
                                $this->stack->insertHTMLElement( $value, $attribs );
                                $this->ignoreLinefeed = true;
@@ -2714,6 +2732,14 @@ class Balancer {
                                $this->stack->insertHTMLElement( $value, $attribs );
                                return true;
 
+                       case 'menuitem':
+                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                       $this->stack->pop();
+                               }
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
                        case 'rb':
                        case 'rtc':
                                if ( $this->stack->inScope( 'ruby' ) ) {
index 56d5ce7..9f6feb8 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 namespace MediaWiki\Tidy;
 
-use ReplacementArray;
 use ParserOutput;
 use Parser;
 
@@ -20,33 +19,32 @@ use Parser;
 class RaggettWrapper {
 
        /**
-        * @var ReplacementArray
+        * @var array
         */
        protected $mTokens;
 
+       /**
+        * @var int
+        */
        protected $mMarkerIndex;
 
-       public function __construct() {
-               $this->mTokens = null;
-       }
-
        /**
         * @param string $text
         * @return string
         */
        public function getWrapped( $text ) {
-               $this->mTokens = new ReplacementArray;
+               $this->mTokens = [];
                $this->mMarkerIndex = 0;
 
                // Replace <mw:editsection> elements with placeholders
                $wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-                       [ &$this, 'replaceCallback' ], $text );
+                       [ $this, 'replaceCallback' ], $text );
                // ...and <mw:toc> markers
                $wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/',
-                       [ &$this, 'replaceCallback' ], $wrappedtext );
+                       [ $this, 'replaceCallback' ], $wrappedtext );
                // ... and <math> tags
                $wrappedtext = preg_replace_callback( '/\<math(.*?)\<\\/math\>/s',
-                       [ &$this, 'replaceCallback' ], $wrappedtext );
+                       [ $this, 'replaceCallback' ], $wrappedtext );
                // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
                // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
                $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
@@ -66,13 +64,12 @@ class RaggettWrapper {
 
        /**
         * @param array $m
-        *
         * @return string
         */
-       public function replaceCallback( $m ) {
+       private function replaceCallback( array $m ) {
                $marker = Parser::MARKER_PREFIX . "-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
                $this->mMarkerIndex++;
-               $this->mTokens->setPair( $marker, $m[0] );
+               $this->mTokens[$marker] = $m[0];
                return $marker;
        }
 
@@ -88,7 +85,7 @@ class RaggettWrapper {
                $text = str_replace( '<li datafld=""', '<li', $text );
 
                // Restore the contents of placeholder tokens
-               $text = $this->mTokens->replace( $text );
+               $text = strtr( $text, $this->mTokens );
 
                return $text;
        }
index 799961a..2dddac5 100644 (file)
@@ -22,7 +22,7 @@
  * MalformedTitleException is thrown when a TitleParser is unable to parse a title string.
  * @since 1.23
  */
-class MalformedTitleException extends Exception {
+class MalformedTitleException extends Exception implements ILocalizedException {
        private $titleText = null;
        private $errorMessage = null;
        private $errorMessageParameters = [];
@@ -72,4 +72,12 @@ class MalformedTitleException extends Exception {
        public function getErrorMessageParameters() {
                return $this->errorMessageParameters;
        }
+
+       /**
+        * @since 1.29
+        * @return Message
+        */
+       public function getMessageObject() {
+               return wfMessage( $this->getErrorMessage(), $this->getErrorMessageParameters() );
+       }
 }
index a937e75..7a71714 100644 (file)
@@ -21,6 +21,8 @@
  * @license GPL 2+
  * @author Daniel Kinzler
  */
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Linker\LinkTarget;
 
 /**
@@ -50,17 +52,25 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         */
        protected $localInterwikis;
 
+       /**
+        * @var InterwikiLookup
+        */
+       protected $interwikiLookup;
+
        /**
         * @param Language $language The language object to use for localizing namespace names.
         * @param GenderCache $genderCache The gender cache for generating gendered namespace names
         * @param string[]|string $localInterwikis
+        * @param InterwikiLookup|null $interwikiLookup
         */
        public function __construct( Language $language, GenderCache $genderCache,
-               $localInterwikis = []
+               $localInterwikis = [], $interwikiLookup = null
        ) {
                $this->language = $language;
                $this->genderCache = $genderCache;
                $this->localInterwikis = (array)$localInterwikis;
+               $this->interwikiLookup = $interwikiLookup ?:
+                       MediaWikiServices::getInstance()->getInterwikiLookup();
        }
 
        /**
@@ -318,13 +328,13 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                                                if ( $this->language->getNsIndex( $x[1] ) ) {
                                                        # Disallow Talk:File:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
-                                               } elseif ( Interwiki::isValidInterwiki( $x[1] ) ) {
+                                               } elseif ( $this->interwikiLookup->isValidInterwiki( $x[1] ) ) {
                                                        // TODO: get rid of global state!
                                                        # Disallow Talk:Interwiki:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
                                                }
                                        }
-                               } elseif ( Interwiki::isValidInterwiki( $p ) ) {
+                               } elseif ( $this->interwikiLookup->isValidInterwiki( $p ) ) {
                                        # Interwiki link
                                        $dbkey = $m[2];
                                        $parts['interwiki'] = $this->language->lc( $p );
index 597bf2f..7c370f1 100644 (file)
@@ -78,7 +78,8 @@ class TitleValue implements LinkTarget {
                Assert::parameterType( 'string', $interwiki, '$interwiki' );
 
                // Sanity check, no full validation or normalization applied here!
-               Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey', 'invalid DB key' );
+               Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey',
+                       "invalid DB key '$dbkey'" );
                Assert::parameter( $dbkey !== '', '$dbkey', 'should not be empty' );
 
                $this->namespace = $namespace;
index ea6ef30..79166ef 100644 (file)
@@ -775,7 +775,9 @@ abstract class UploadBase {
                                        User::IGNORE_USER_RIGHTS
                                );
                        }
-                       Hooks::run( 'UploadComplete', [ &$this ] );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $uploadBase = $this;
+                       Hooks::run( 'UploadComplete', [ &$uploadBase ] );
 
                        $this->postProcessUpload();
                }
@@ -1438,6 +1440,7 @@ abstract class UploadBase {
                        'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
                        'http://www.w3.org/2000/svg',
                        'http://www.w3.org/tr/rec-rdf-syntax/',
+                       'http://www.w3.org/2000/01/rdf-schema#',
                ];
 
                // Inkscape mangles namespace definitions created by Adobe Illustrator.
index 08cf434..c0c2cb5 100644 (file)
@@ -63,6 +63,52 @@ class UploadFromChunks extends UploadFromFile {
                }
        }
 
+       /**
+        * {@inheritdoc}
+        */
+       public function tryStashFile( User $user, $isPartial = false ) {
+               try {
+                       $this->verifyChunk();
+               } catch ( UploadChunkVerificationException $e ) {
+                       return Status::newFatal( $e->msg );
+               }
+
+               return parent::tryStashFile( $user, $isPartial );
+       }
+
+       /**
+        * {@inheritdoc}
+        * @throws UploadChunkVerificationException
+        * @deprecated since 1.28 Use tryStashFile() instead
+        */
+       public function stashFile( User $user = null ) {
+               wfDeprecated( __METHOD__, '1.28' );
+               $this->verifyChunk();
+               return parent::stashFile( $user );
+       }
+
+       /**
+        * {@inheritdoc}
+        * @throws UploadChunkVerificationException
+        * @deprecated since 1.28
+        */
+       public function stashFileGetKey() {
+               wfDeprecated( __METHOD__, '1.28' );
+               $this->verifyChunk();
+               return parent::stashFileGetKey();
+       }
+
+       /**
+        * {@inheritdoc}
+        * @throws UploadChunkVerificationException
+        * @deprecated since 1.28
+        */
+       public function stashSession() {
+               wfDeprecated( __METHOD__, '1.28' );
+               $this->verifyChunk();
+               return parent::stashSession();
+       }
+
        /**
         * Calls the parent doStashFile and updates the uploadsession table to handle "chunks"
         *
@@ -74,7 +120,6 @@ class UploadFromChunks extends UploadFromFile {
                $this->mChunkIndex = 0;
                $this->mOffset = 0;
 
-               $this->verifyChunk();
                // Create a local stash target
                $this->mStashFile = parent::doStashFile( $user );
                // Update the initial file offset (based on file size)
@@ -113,7 +158,7 @@ class UploadFromChunks extends UploadFromFile {
 
        /**
         * Append the final chunk and ready file for parent::performUpload()
-        * @return FileRepoStatus
+        * @return Status
         */
        public function concatenateChunks() {
                $chunkIndex = $this->getChunkIndex();
@@ -222,7 +267,7 @@ class UploadFromChunks extends UploadFromFile {
                                        $this->verifyChunk();
                                        $this->mTempPath = $oldTemp;
                                } catch ( UploadChunkVerificationException $e ) {
-                                       return Status::newFatal( $e->getMessage() );
+                                       return Status::newFatal( $e->msg );
                                }
                                $status = $this->outputChunk( $chunkPath );
                                if ( $status->isGood() ) {
@@ -313,7 +358,7 @@ class UploadFromChunks extends UploadFromFile {
         *
         * @param string $chunkPath
         * @throws UploadChunkFileException
-        * @return FileRepoStatus
+        * @return Status
         */
        private function outputChunk( $chunkPath ) {
                // Key is fileKey + chunk index
@@ -364,7 +409,7 @@ class UploadFromChunks extends UploadFromFile {
                $this->mDesiredDestName = $oldDesiredDestName;
                $this->mTitle = false;
                if ( is_array( $res ) ) {
-                       throw new UploadChunkVerificationException( $res[0] );
+                       throw new UploadChunkVerificationException( $res );
                }
        }
 }
@@ -376,4 +421,10 @@ class UploadChunkFileException extends MWException {
 }
 
 class UploadChunkVerificationException extends MWException {
+       public $msg;
+       public function __construct( $res ) {
+               $this->msg = call_user_func_array( 'wfMessage', $res );
+               parent::__construct( call_user_func_array( 'wfMessage', $res )
+                       ->inLanguage( 'en' )->useDatabase( false )->text() );
+       }
 }
index 530580d..c1aef22 100644 (file)
@@ -44,8 +44,8 @@ class PasswordReset implements LoggerAwareInterface {
        protected $logger;
 
        /**
-        * In-process cache for isAllowed lookups, by username. Contains pairs of StatusValue objects
-        * (for false and true value of $displayPassword, respectively).
+        * In-process cache for isAllowed lookups, by username.
+        * Contains a StatusValue object
         * @var HashBagOStuff
         */
        private $permissionCache;
@@ -72,13 +72,12 @@ class PasswordReset implements LoggerAwareInterface {
         * @param User $user
         * @param bool $displayPassword If set, also check whether the user is allowed to reset the
         *   password of another user and see the temporary password.
+        * @since 1.29 Second argument for displayPassword removed.
         * @return StatusValue
         */
-       public function isAllowed( User $user, $displayPassword = false ) {
-               $statuses = $this->permissionCache->get( $user->getName() );
-               if ( $statuses ) {
-                       list ( $status, $status2 ) = $statuses;
-               } else {
+       public function isAllowed( User $user ) {
+               $status = $this->permissionCache->get( $user->getName() );
+               if ( !$status ) {
                        $resetRoutes = $this->config->get( 'PasswordResetRoutes' );
                        $status = StatusValue::newGood();
 
@@ -107,19 +106,10 @@ class PasswordReset implements LoggerAwareInterface {
                                $status = StatusValue::newFatal( 'blocked-mailpassword' );
                        }
 
-                       $status2 = StatusValue::newGood();
-                       if ( !$user->isAllowed( 'passwordreset' ) ) {
-                               $status2 = StatusValue::newFatal( 'badaccess' );
-                       }
-
-                       $this->permissionCache->set( $user->getName(), [ $status, $status2 ] );
+                       $this->permissionCache->set( $user->getName(), $status );
                }
 
-               if ( !$displayPassword || !$status->isGood() ) {
-                       return $status;
-               } else {
-                       return $status2;
-               }
+               return $status;
        }
 
        /**
@@ -128,22 +118,22 @@ class PasswordReset implements LoggerAwareInterface {
         * Process the form.  At this point we know that the user passes all the criteria in
         * userCanExecute(), and if the data array contains 'Username', etc, then Username
         * resets are allowed.
+        *
+        * @since 1.29 Fourth argument for displayPassword removed.
         * @param User $performingUser The user that does the password reset
         * @param string $username The user whose password is reset
         * @param string $email Alternative way to specify the user
-        * @param bool $displayPassword Whether to display the password
         * @return StatusValue Will contain the passwords as a username => password array if the
         *   $displayPassword flag was set
         * @throws LogicException When the user is not allowed to perform the action
         * @throws MWException On unexpected DB errors
         */
        public function execute(
-               User $performingUser, $username = null, $email = null, $displayPassword = false
+               User $performingUser, $username = null, $email = null
        ) {
-               if ( !$this->isAllowed( $performingUser, $displayPassword )->isGood() ) {
-                       $action = $this->isAllowed( $performingUser )->isGood() ? 'display' : 'reset';
+               if ( !$this->isAllowed( $performingUser )->isGood() ) {
                        throw new LogicException( 'User ' . $performingUser->getName()
-                               . ' is not allowed to ' . $action . ' passwords' );
+                               . ' is not allowed to reset passwords' );
                }
 
                $resetRoutes = $this->config->get( 'PasswordResetRoutes' )
@@ -169,7 +159,6 @@ class PasswordReset implements LoggerAwareInterface {
                $data = [
                        'Username' => $username,
                        'Email' => $email,
-                       'Capture' => $displayPassword ? '1' : null,
                ];
                if ( !Hooks::run( 'SpecialPasswordResetOnSubmit', [ &$users, $data, &$error ] ) ) {
                        return StatusValue::newFatal( Message::newFromSpecifier( $error ) );
@@ -218,7 +207,6 @@ class PasswordReset implements LoggerAwareInterface {
                        $req = TemporaryPasswordAuthenticationRequest::newRandom();
                        $req->username = $user->getName();
                        $req->mailpassword = true;
-                       $req->hasBackchannel = $displayPassword;
                        $req->caller = $performingUser->getName();
                        $status = $this->authManager->allowsAuthenticationDataChange( $req, true );
                        if ( $status->isGood() && $status->getValue() !== 'ignored' ) {
@@ -239,7 +227,6 @@ class PasswordReset implements LoggerAwareInterface {
                        'targetUsername' => $username,
                        'targetEmail' => $email,
                        'actualUser' => $firstUser->getName(),
-                       'capture' => $displayPassword,
                ];
 
                if ( !$result->isGood() ) {
@@ -253,25 +240,12 @@ class PasswordReset implements LoggerAwareInterface {
                $passwords = [];
                foreach ( $reqs as $req ) {
                        $this->authManager->changeAuthenticationData( $req );
-                       // TODO record mail sending errors
-                       if ( $displayPassword ) {
-                               $passwords[$req->username] = $req->password;
-                       }
                }
 
-               if ( $displayPassword ) {
-                       // The password capture thing is scary, so log
-                       // at a higher warning level.
-                       $this->logger->warning(
-                               "{requestingUser} did password reset of {actualUser} with password capturing!",
-                               $logContext
-                       );
-               } else {
-                       $this->logger->info(
-                               "{requestingUser} did password reset of {actualUser}",
-                               $logContext
-                       );
-               }
+               $this->logger->info(
+                       "{requestingUser} did password reset of {actualUser}",
+                       $logContext
+               );
 
                return StatusValue::newGood( $passwords );
        }
index b69b5bc..d9c2a58 100644 (file)
@@ -66,7 +66,7 @@ class User implements IDBAccessObject {
        /**
         * @const int Serialized record version.
         */
-       const VERSION = 10;
+       const VERSION = 11;
 
        /**
         * Exclude user options that are set to their default value.
@@ -104,7 +104,7 @@ class User implements IDBAccessObject {
                'mRegistration',
                'mEditCount',
                // user_groups table
-               'mGroups',
+               'mGroupMemberships',
                // user_properties table
                'mOptionOverrides',
        ];
@@ -166,7 +166,6 @@ class User implements IDBAccessObject {
                'noratelimit',
                'override-export-depth',
                'pagelang',
-               'passwordreset',
                'patrol',
                'patrolmarks',
                'protect',
@@ -226,8 +225,13 @@ class User implements IDBAccessObject {
        protected $mRegistration;
        /** @var int */
        protected $mEditCount;
-       /** @var array */
-       public $mGroups;
+       /**
+        * @var array No longer used since 1.29; use User::getGroups() instead
+        * @deprecated since 1.29
+        */
+       private $mGroups;
+       /** @var array Associative array of (group name => UserGroupMembership object) */
+       protected $mGroupMemberships;
        /** @var array */
        protected $mOptionOverrides;
        // @}
@@ -284,9 +288,7 @@ class User implements IDBAccessObject {
        /** @var array */
        public $mOptions;
 
-       /**
-        * @var WebRequest
-        */
+       /** @var WebRequest */
        private $mRequest;
 
        /** @var Block */
@@ -302,7 +304,8 @@ class User implements IDBAccessObject {
        protected $queryFlagsUsed = self::READ_NORMAL;
 
        /** @var string Indicates type of block (used for eventlogging)
-        * Permitted values: 'cookie-block', 'proxy-block', 'openproxy-block', 'xff-block'
+        * Permitted values: 'cookie-block', 'proxy-block', 'openproxy-block', 'xff-block',
+        * 'config-block'
         */
        public $blockTrigger = false;
 
@@ -468,6 +471,17 @@ class User implements IDBAccessObject {
                return $cache->makeGlobalKey( 'user', 'id', wfWikiID(), $this->mId );
        }
 
+       /**
+        * @param WANObjectCache $cache
+        * @return string[]
+        * @since 1.28
+        */
+       public function getMutableCacheKeys( WANObjectCache $cache ) {
+               $id = $this->getId();
+
+               return $id ? [ $this->getCacheKey( $cache ) ] : [];
+       }
+
        /**
         * Load user data from shared cache, given mId has already been set.
         *
@@ -678,7 +692,7 @@ class User implements IDBAccessObject {
                );
                if ( !$row ) {
                        // No user. Create it?
-                       return $options['create'] ? self::createNew( $name ) : null;
+                       return $options['create'] ? self::createNew( $name, [ 'token' => self::INVALID_TOKEN ] ) : null;
                }
                $user = self::newFromRow( $row );
 
@@ -1004,11 +1018,10 @@ class User implements IDBAccessObject {
         * able to set their password to this.
         *
         * @param string $password Desired password
-        * @param string $purpose one of 'login', 'create', 'reset'
         * @return Status
         * @since 1.23
         */
-       public function checkPasswordValidity( $password, $purpose = 'login' ) {
+       public function checkPasswordValidity( $password ) {
                global $wgPasswordPolicy;
 
                $upp = new UserPasswordPolicy(
@@ -1025,7 +1038,7 @@ class User implements IDBAccessObject {
                }
 
                if ( $result === false ) {
-                       $status->merge( $upp->checkUserPassword( $this, $password, $purpose ) );
+                       $status->merge( $upp->checkUserPassword( $this, $password ) );
                        return $status;
                } elseif ( $result === true ) {
                        return $status;
@@ -1099,20 +1112,6 @@ class User implements IDBAccessObject {
                return $name;
        }
 
-       /**
-        * Count the number of edits of a user
-        *
-        * @param int $uid User ID to check
-        * @return int The user's edit count
-        *
-        * @deprecated since 1.21 in favour of User::getEditCount
-        */
-       public static function edits( $uid ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               $user = self::newFromId( $uid );
-               return $user->getEditCount();
-       }
-
        /**
         * Return a random password.
         *
@@ -1153,7 +1152,7 @@ class User implements IDBAccessObject {
                $this->mEmailToken = '';
                $this->mEmailTokenExpires = null;
                $this->mRegistration = wfTimestamp( TS_MW );
-               $this->mGroups = [];
+               $this->mGroupMemberships = [];
 
                Hooks::run( 'UserLoadDefaults', [ $this, $name ] );
        }
@@ -1265,7 +1264,7 @@ class User implements IDBAccessObject {
                if ( $s !== false ) {
                        // Initialise user table data
                        $this->loadFromRow( $s );
-                       $this->mGroups = null; // deferred
+                       $this->mGroupMemberships = null; // deferred
                        $this->getEditCount(); // revalidation for nulls
                        return true;
                } else {
@@ -1282,13 +1281,16 @@ class User implements IDBAccessObject {
         * @param stdClass $row Row from the user table to load.
         * @param array $data Further user data to load into the object
         *
-        *      user_groups             Array with groups out of the user_groups table
-        *      user_properties         Array with properties out of the user_properties table
+        *  user_groups   Array of arrays or stdClass result rows out of the user_groups
+        *                table. Previously you were supposed to pass an array of strings
+        *                here, but we also need expiry info nowadays, so an array of
+        *                strings is ignored.
+        *  user_properties   Array with properties out of the user_properties table
         */
        protected function loadFromRow( $row, $data = null ) {
                $all = true;
 
-               $this->mGroups = null; // deferred
+               $this->mGroupMemberships = null; // deferred
 
                if ( isset( $row->user_name ) ) {
                        $this->mName = $row->user_name;
@@ -1357,7 +1359,18 @@ class User implements IDBAccessObject {
 
                if ( is_array( $data ) ) {
                        if ( isset( $data['user_groups'] ) && is_array( $data['user_groups'] ) ) {
-                               $this->mGroups = $data['user_groups'];
+                               if ( !count( $data['user_groups'] ) ) {
+                                       $this->mGroupMemberships = [];
+                               } else {
+                                       $firstGroup = reset( $data['user_groups'] );
+                                       if ( is_array( $firstGroup ) || is_object( $firstGroup ) ) {
+                                               $this->mGroupMemberships = [];
+                                               foreach ( $data['user_groups'] as $row ) {
+                                                       $ugm = UserGroupMembership::newFromRow( (object)$row );
+                                                       $this->mGroupMemberships[$ugm->getGroup()] = $ugm;
+                                               }
+                                       }
+                               }
                        }
                        if ( isset( $data['user_properties'] ) && is_array( $data['user_properties'] ) ) {
                                $this->loadOptions( $data['user_properties'] );
@@ -1381,18 +1394,12 @@ class User implements IDBAccessObject {
         * Load the groups from the database if they aren't already loaded.
         */
        private function loadGroups() {
-               if ( is_null( $this->mGroups ) ) {
+               if ( is_null( $this->mGroupMemberships ) ) {
                        $db = ( $this->queryFlagsUsed & self::READ_LATEST )
                                ? wfGetDB( DB_MASTER )
                                : wfGetDB( DB_REPLICA );
-                       $res = $db->select( 'user_groups',
-                               [ 'ug_group' ],
-                               [ 'ug_user' => $this->mId ],
-                               __METHOD__ );
-                       $this->mGroups = [];
-                       foreach ( $res as $row ) {
-                               $this->mGroups[] = $row->ug_group;
-                       }
+                       $this->mGroupMemberships = UserGroupMembership::getMembershipsForUser(
+                               $this->mId, $db );
                }
        }
 
@@ -1524,7 +1531,7 @@ class User implements IDBAccessObject {
                $this->mRights = null;
                $this->mEffectiveGroups = null;
                $this->mImplicitGroups = null;
-               $this->mGroups = null;
+               $this->mGroupMemberships = null;
                $this->mOptions = null;
                $this->mOptionsLoaded = false;
                $this->mEditCount = null;
@@ -1597,7 +1604,7 @@ class User implements IDBAccessObject {
         *   Check when actually saving should be done against master.
         */
        private function getBlockedStatus( $bFromSlave = true ) {
-               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
+               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff, $wgSoftBlockRanges;
 
                if ( -1 != $this->mBlockedby ) {
                        return;
@@ -1630,45 +1637,29 @@ class User implements IDBAccessObject {
                // User/IP blocking
                $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
 
-               // If no block has been found, check for a cookie indicating that the user is blocked.
-               $blockCookieVal = (int)$this->getRequest()->getCookie( 'BlockID' );
-               if ( !$block instanceof Block && $blockCookieVal > 0 ) {
-                       // Load the Block from the ID in the cookie.
-                       $tmpBlock = Block::newFromID( $blockCookieVal );
-                       if ( $tmpBlock instanceof Block ) {
-                               // Check the validity of the block.
-                               $blockIsValid = $tmpBlock->getType() == Block::TYPE_USER
-                                       && !$tmpBlock->isExpired()
-                                       && $tmpBlock->isAutoblocking();
-                               $config = RequestContext::getMain()->getConfig();
-                               $useBlockCookie = ( $config->get( 'CookieSetOnAutoblock' ) === true );
-                               if ( $blockIsValid && $useBlockCookie ) {
-                                       // Use the block.
-                                       $block = $tmpBlock;
-                                       $this->blockTrigger = 'cookie-block';
-                               } 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).
-                                       $block->setCookie( $this->getRequest()->response(), true );
-                               }
-                       }
+               // Cookie blocking
+               if ( !$block instanceof Block ) {
+                       $block = $this->getBlockFromCookieValue( $this->getRequest()->getCookie( 'BlockID' ) );
                }
 
                // Proxy blocking
                if ( !$block instanceof Block && $ip !== null && !in_array( $ip, $wgProxyWhitelist ) ) {
                        // Local list
                        if ( self::isLocallyBlockedProxy( $ip ) ) {
-                               $block = new Block;
-                               $block->setBlocker( wfMessage( 'proxyblocker' )->text() );
-                               $block->mReason = wfMessage( 'proxyblockreason' )->text();
-                               $block->setTarget( $ip );
+                               $block = new Block( [
+                                       'byText' => wfMessage( 'proxyblocker' )->text(),
+                                       'reason' => wfMessage( 'proxyblockreason' )->text(),
+                                       'address' => $ip,
+                                       'systemBlock' => 'proxy',
+                               ] );
                                $this->blockTrigger = 'proxy-block';
                        } elseif ( $this->isAnon() && $this->isDnsBlacklisted( $ip ) ) {
-                               $block = new Block;
-                               $block->setBlocker( wfMessage( 'sorbs' )->text() );
-                               $block->mReason = wfMessage( 'sorbsreason' )->text();
-                               $block->setTarget( $ip );
+                               $block = new Block( [
+                                       'byText' => wfMessage( 'sorbs' )->text(),
+                                       'reason' => wfMessage( 'sorbsreason' )->text(),
+                                       'address' => $ip,
+                                       'systemBlock' => 'dnsbl',
+                               ] );
                                $this->blockTrigger = 'openproxy-block';
                        }
                }
@@ -1692,6 +1683,21 @@ class User implements IDBAccessObject {
                        }
                }
 
+               if ( !$block instanceof Block
+                       && $ip !== null
+                       && $this->isAnon()
+                       && IP::isInRanges( $ip, $wgSoftBlockRanges )
+               ) {
+                       $block = new Block( [
+                               'address' => $ip,
+                               'byText' => 'MediaWiki default',
+                               'reason' => wfMessage( 'softblockrangesreason', $ip )->text(),
+                               'anonOnly' => true,
+                               'systemBlock' => 'wgSoftBlockRanges',
+                       ] );
+                       $this->blockTrigger = 'config-block';
+               }
+
                if ( $block instanceof Block ) {
                        wfDebug( __METHOD__ . ": Found block.\n" );
                        $this->mBlock = $block;
@@ -1706,8 +1712,47 @@ class User implements IDBAccessObject {
                        $this->blockTrigger = false;
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                // Extensions
-               Hooks::run( 'GetBlockedStatus', [ &$this ] );
+               Hooks::run( 'GetBlockedStatus', [ &$user ] );
+       }
+
+       /**
+        * Try to load a Block from an ID given in a cookie value.
+        * @param string|null $blockCookieVal The cookie value to check.
+        * @return Block|bool The Block object, or false if none could be loaded.
+        */
+       protected function getBlockFromCookieValue( $blockCookieVal ) {
+               // Make sure there's something to check. The cookie value must start with a number.
+               if ( strlen( $blockCookieVal ) < 1 || !is_numeric( substr( $blockCookieVal, 0, 1 ) ) ) {
+                       return false;
+               }
+               // Load the Block from the ID in the cookie.
+               $blockCookieId = Block::getIdFromCookieValue( $blockCookieVal );
+               if ( $blockCookieId !== null ) {
+                       // An ID was found in the cookie.
+                       $tmpBlock = Block::newFromID( $blockCookieId );
+                       if ( $tmpBlock instanceof Block ) {
+                               // Check the validity of the block.
+                               $blockIsValid = $tmpBlock->getType() == Block::TYPE_USER
+                                       && !$tmpBlock->isExpired()
+                                       && $tmpBlock->isAutoblocking();
+                               $config = RequestContext::getMain()->getConfig();
+                               $useBlockCookie = ( $config->get( 'CookieSetOnAutoblock' ) === true );
+                               if ( $blockIsValid && $useBlockCookie ) {
+                                       // Use the block.
+                                       $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 );
+                               }
+                       }
+               }
+               return false;
        }
 
        /**
@@ -1792,21 +1837,22 @@ class User implements IDBAccessObject {
                }
 
                if ( !is_array( $wgProxyList ) ) {
-                       // Load from the specified file
+                       // Load values from the specified file
                        $wgProxyList = array_map( 'trim', file( $wgProxyList ) );
                }
 
-               if ( !is_array( $wgProxyList ) ) {
-                       $ret = false;
-               } elseif ( array_search( $ip, $wgProxyList ) !== false ) {
-                       $ret = true;
-               } elseif ( array_key_exists( $ip, $wgProxyList ) ) {
-                       // Old-style flipped proxy list
-                       $ret = true;
-               } else {
-                       $ret = false;
+               if ( is_array( $wgProxyList ) ) {
+                       if (
+                               // Look for IP as value
+                               array_search( $ip, $wgProxyList ) !== false ||
+                               // Look for IP as key (for backwards-compatility)
+                               array_key_exists( $ip, $wgProxyList )
+                       ) {
+                               return true;
+                       }
                }
-               return $ret;
+
+               return false;
        }
 
        /**
@@ -1816,7 +1862,7 @@ class User implements IDBAccessObject {
         */
        public function isPingLimitable() {
                global $wgRateLimitsExcludedIPs;
-               if ( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
+               if ( IP::isInRanges( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
                        // No other good way currently to disable rate limits
                        // for specific IPs. :P
                        // But this is a crappy hack and should die.
@@ -1840,9 +1886,11 @@ class User implements IDBAccessObject {
         * @return bool True if a rate limiter was tripped
         */
        public function pingLimiter( $action = 'edit', $incrBy = 1 ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                // Call the 'PingLimiter' hook
                $result = false;
-               if ( !Hooks::run( 'PingLimiter', [ &$this, $action, &$result, $incrBy ] ) ) {
+               if ( !Hooks::run( 'PingLimiter', [ &$user, $action, &$result, $incrBy ] ) ) {
                        return $result;
                }
 
@@ -2077,14 +2125,18 @@ class User implements IDBAccessObject {
                } elseif ( !$ip ) {
                        $ip = $this->getRequest()->getIP();
                }
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                $blocked = false;
                $block = null;
-               Hooks::run( 'UserIsBlockedGlobally', [ &$this, $ip, &$blocked, &$block ] );
+               Hooks::run( 'UserIsBlockedGlobally', [ &$user, $ip, &$blocked, &$block ] );
 
                if ( $blocked && $block === null ) {
                        // back-compat: UserIsBlockedGlobally didn't have $block param first
-                       $block = new Block;
-                       $block->setTarget( $ip );
+                       $block = new Block( [
+                               'address' => $ip,
+                               'systemBlock' => 'global-block'
+                       ] );
                }
 
                $this->mGlobalBlock = $blocked ? $block : false;
@@ -2100,7 +2152,9 @@ class User implements IDBAccessObject {
                if ( $this->mLocked !== null ) {
                        return $this->mLocked;
                }
-               $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$this ], null );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
+               $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$user ], null );
                $this->mLocked = $authUser && $authUser->isLocked();
                Hooks::run( 'UserIsLocked', [ $this, &$this->mLocked ] );
                return $this->mLocked;
@@ -2117,7 +2171,9 @@ class User implements IDBAccessObject {
                }
                $this->getBlockedStatus();
                if ( !$this->mHideName ) {
-                       $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$this ], null );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $user = $this;
+                       $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$user ], null );
                        $this->mHideName = $authUser && $authUser->isHidden();
                        Hooks::run( 'UserIsHidden', [ $this, &$this->mHideName ] );
                }
@@ -2236,8 +2292,10 @@ class User implements IDBAccessObject {
         * @return array
         */
        public function getNewMessageLinks() {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                $talks = [];
-               if ( !Hooks::run( 'UserRetrieveNewTalks', [ &$this, &$talks ] ) ) {
+               if ( !Hooks::run( 'UserRetrieveNewTalks', [ &$user, &$talks ] ) ) {
                        return $talks;
                } elseif ( !$this->getNewtalk() ) {
                        return [];
@@ -2493,24 +2551,6 @@ class User implements IDBAccessObject {
                return $this->mTouched;
        }
 
-       /**
-        * @deprecated Removed in 1.27.
-        * @return Password
-        * @since 1.24
-        */
-       public function getPassword() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
-       /**
-        * @deprecated Removed in 1.27.
-        * @return Password
-        * @since 1.24
-        */
-       public function getTemporaryPassword() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
        /**
         * Set the password and reset the random token.
         * Calls through to authentication plugin if necessary;
@@ -2678,16 +2718,6 @@ class User implements IDBAccessObject {
                throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
        }
 
-       /**
-        * Has password reminder email been sent within the last
-        * $wgPasswordReminderResendTime hours?
-        * @deprecated Removed in 1.27. See above.
-        * @return bool
-        */
-       public function isPasswordReminderThrottled() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
        /**
         * Get the user's e-mail address
         * @return string User's email address
@@ -2807,7 +2837,7 @@ class User implements IDBAccessObject {
         * @param string $oname The option to check
         * @param string $defaultOverride A default value returned if the option does not exist
         * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
-        * @return string User's current value for the option
+        * @return string|null User's current value for the option
         * @see getBoolOption()
         * @see getIntOption()
         */
@@ -3231,7 +3261,20 @@ class User implements IDBAccessObject {
        public function getGroups() {
                $this->load();
                $this->loadGroups();
-               return $this->mGroups;
+               return array_keys( $this->mGroupMemberships );
+       }
+
+       /**
+        * Get the list of explicit group memberships this user has, stored as
+        * UserGroupMembership objects. Implicit groups are not included.
+        *
+        * @return array Associative array of (group name as string => UserGroupMembership object)
+        * @since 1.29
+        */
+       public function getGroupMemberships() {
+               $this->load();
+               $this->loadGroups();
+               return $this->mGroupMemberships;
        }
 
        /**
@@ -3247,8 +3290,10 @@ class User implements IDBAccessObject {
                                $this->getGroups(), // explicit groups
                                $this->getAutomaticGroups( $recache ) // implicit groups
                        ) );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $user = $this;
                        // Hook for additional groups
-                       Hooks::run( 'UserEffectiveGroups', [ &$this, &$this->mEffectiveGroups ] );
+                       Hooks::run( 'UserEffectiveGroups', [ &$user, &$this->mEffectiveGroups ] );
                        // Force reindexation of groups when a hook has unset one of them
                        $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
                }
@@ -3340,34 +3385,35 @@ class User implements IDBAccessObject {
        }
 
        /**
-        * Add the user to the given group.
-        * This takes immediate effect.
+        * Add the user to the given group. This takes immediate effect.
+        * If the user is already in the group, the expiry time will be updated to the new
+        * expiry time. (If $expiry is omitted or null, the membership will be altered to
+        * never expire.)
+        *
         * @param string $group Name of the group to add
+        * @param string $expiry Optional expiry timestamp in any format acceptable to
+        *   wfTimestamp(), or null if the group assignment should not expire
         * @return bool
         */
-       public function addGroup( $group ) {
+       public function addGroup( $group, $expiry = null ) {
                $this->load();
+               $this->loadGroups();
 
-               if ( !Hooks::run( 'UserAddGroup', [ $this, &$group ] ) ) {
+               if ( $expiry ) {
+                       $expiry = wfTimestamp( TS_MW, $expiry );
+               }
+
+               if ( !Hooks::run( 'UserAddGroup', [ $this, &$group, &$expiry ] ) ) {
                        return false;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-               if ( $this->getId() ) {
-                       $dbw->insert( 'user_groups',
-                               [
-                                       'ug_user' => $this->getId(),
-                                       'ug_group' => $group,
-                               ],
-                               __METHOD__,
-                               [ 'IGNORE' ] );
+               // create the new UserGroupMembership and put it in the DB
+               $ugm = new UserGroupMembership( $this->mId, $group, $expiry );
+               if ( !$ugm->insert( true ) ) {
+                       return false;
                }
 
-               $this->loadGroups();
-               $this->mGroups[] = $group;
-               // In case loadGroups was not called before, we now have the right twice.
-               // Get rid of the duplicate.
-               $this->mGroups = array_unique( $this->mGroups );
+               $this->mGroupMemberships[$group] = $ugm;
 
                // Refresh the groups caches, and clear the rights cache so it will be
                // refreshed on the next call to $this->getRights().
@@ -3387,29 +3433,19 @@ class User implements IDBAccessObject {
         */
        public function removeGroup( $group ) {
                $this->load();
+
                if ( !Hooks::run( 'UserRemoveGroup', [ $this, &$group ] ) ) {
                        return false;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'user_groups',
-                       [
-                               'ug_user' => $this->getId(),
-                               'ug_group' => $group,
-                       ], __METHOD__
-               );
-               // Remember that the user was in this group
-               $dbw->insert( 'user_former_groups',
-                       [
-                               'ufg_user' => $this->getId(),
-                               'ufg_group' => $group,
-                       ],
-                       __METHOD__,
-                       [ 'IGNORE' ]
-               );
+               $ugm = UserGroupMembership::getMembership( $this->mId, $group );
+               // delete the membership entry
+               if ( !$ugm || !$ugm->delete() ) {
+                       return false;
+               }
 
                $this->loadGroups();
-               $this->mGroups = array_diff( $this->mGroups, [ $group ] );
+               unset( $this->mGroupMemberships[$group] );
 
                // Refresh the groups caches, and clear the rights cache so it will be
                // refreshed on the next call to $this->getRights().
@@ -3615,7 +3651,9 @@ class User implements IDBAccessObject {
 
                // If we're working on user's talk page, we should update the talk page message indicator
                if ( $title->getNamespace() == NS_USER_TALK && $title->getText() == $this->getName() ) {
-                       if ( !Hooks::run( 'UserClearNewTalkNotification', [ &$this, $oldid ] ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $user = $this;
+                       if ( !Hooks::run( 'UserClearNewTalkNotification', [ &$user, $oldid ] ) ) {
                                return;
                        }
 
@@ -3732,6 +3770,42 @@ class User implements IDBAccessObject {
                // user_talk page; it's cleared one page view later in WikiPage::doViewUpdates().
        }
 
+       /**
+        * Compute experienced level based on edit count and registration date.
+        *
+        * @return string 'newcomer', 'learner', or 'experienced'
+        */
+       public function getExperienceLevel() {
+               global $wgLearnerEdits,
+                          $wgExperiencedUserEdits,
+                          $wgLearnerMemberSince,
+                          $wgExperiencedUserMemberSince;
+
+               if ( $this->isAnon() ) {
+                       return false;
+               }
+
+               $editCount = $this->getEditCount();
+               $registration = $this->getRegistration();
+               $now = time();
+               $learnerRegistration = wfTimestamp( TS_MW, $now - $wgLearnerMemberSince * 86400 );
+               $experiencedRegistration = wfTimestamp( TS_MW, $now - $wgExperiencedUserMemberSince * 86400 );
+
+               if (
+                       $editCount < $wgLearnerEdits ||
+                       $registration > $learnerRegistration
+               ) {
+                       return 'newcomer';
+               } elseif (
+                       $editCount > $wgExperiencedUserEdits &&
+                       $registration <= $experiencedRegistration
+               ) {
+                       return 'experienced';
+               } else {
+                       return 'learner';
+               }
+       }
+
        /**
         * Set a cookie on the user's client. Wrapper for
         * WebResponse::setCookie
@@ -3847,7 +3921,9 @@ class User implements IDBAccessObject {
         * Log this user out.
         */
        public function logout() {
-               if ( Hooks::run( 'UserLogout', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
+               if ( Hooks::run( 'UserLogout', [ &$user ] ) ) {
                        $this->doLogout();
                }
        }
@@ -4522,7 +4598,9 @@ class User implements IDBAccessObject {
                        return false;
                }
                $canSend = $this->isEmailConfirmed();
-               Hooks::run( 'UserCanSendEmail', [ &$this, &$canSend ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
+               Hooks::run( 'UserCanSendEmail', [ &$user, &$canSend ] );
                return $canSend;
        }
 
@@ -4548,8 +4626,10 @@ class User implements IDBAccessObject {
        public function isEmailConfirmed() {
                global $wgEmailAuthentication;
                $this->load();
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                $confirmed = true;
-               if ( Hooks::run( 'EmailConfirmed', [ &$this, &$confirmed ] ) ) {
+               if ( Hooks::run( 'EmailConfirmed', [ &$user, &$confirmed ] ) ) {
                        if ( $this->isAnon() ) {
                                return false;
                        }
@@ -4735,25 +4815,27 @@ class User implements IDBAccessObject {
 
        /**
         * Get the localized descriptive name for a group, if it exists
+        * @deprecated since 1.29 Use UserGroupMembership::getGroupName instead
         *
         * @param string $group Internal group name
         * @return string Localized descriptive group name
         */
        public static function getGroupName( $group ) {
-               $msg = wfMessage( "group-$group" );
-               return $msg->isBlank() ? $group : $msg->text();
+               wfDeprecated( __METHOD__, '1.29' );
+               return UserGroupMembership::getGroupName( $group );
        }
 
        /**
         * Get the localized descriptive name for a member of a group, if it exists
+        * @deprecated since 1.29 Use UserGroupMembership::getGroupMemberName instead
         *
         * @param string $group Internal group name
         * @param string $username Username for gender (since 1.19)
         * @return string Localized name for group member
         */
        public static function getGroupMember( $group, $username = '#' ) {
-               $msg = wfMessage( "group-$group-member", $username );
-               return $msg->isBlank() ? $group : $msg->text();
+               wfDeprecated( __METHOD__, '1.29' );
+               return UserGroupMembership::getGroupMemberName( $group, $username );
        }
 
        /**
@@ -4803,34 +4885,33 @@ class User implements IDBAccessObject {
 
        /**
         * Get the title of a page describing a particular group
+        * @deprecated since 1.29 Use UserGroupMembership::getGroupPage instead
         *
         * @param string $group Internal group name
         * @return Title|bool Title of the page if it exists, false otherwise
         */
        public static function getGroupPage( $group ) {
-               $msg = wfMessage( 'grouppage-' . $group )->inContentLanguage();
-               if ( $msg->exists() ) {
-                       $title = Title::newFromText( $msg->text() );
-                       if ( is_object( $title ) ) {
-                               return $title;
-                       }
-               }
-               return false;
+               wfDeprecated( __METHOD__, '1.29' );
+               return UserGroupMembership::getGroupPage( $group );
        }
 
        /**
         * Create a link to the group in HTML, if available;
         * else return the group name.
+        * @deprecated since 1.29 Use UserGroupMembership::getLink instead, or
+        * make the link yourself if you need custom text
         *
         * @param string $group Internal name of the group
         * @param string $text The text of the link
         * @return string HTML link to the group
         */
        public static function makeGroupLinkHTML( $group, $text = '' ) {
+               wfDeprecated( __METHOD__, '1.29' );
+
                if ( $text == '' ) {
-                       $text = self::getGroupName( $group );
+                       $text = UserGroupMembership::getGroupName( $group );
                }
-               $title = self::getGroupPage( $group );
+               $title = UserGroupMembership::getGroupPage( $group );
                if ( $title ) {
                        return Linker::link( $title, htmlspecialchars( $text ) );
                } else {
@@ -4841,16 +4922,20 @@ class User implements IDBAccessObject {
        /**
         * Create a link to the group in Wikitext, if available;
         * else return the group name.
+        * @deprecated since 1.29 Use UserGroupMembership::getLink instead, or
+        * make the link yourself if you need custom text
         *
         * @param string $group Internal name of the group
         * @param string $text The text of the link
         * @return string Wikilink to the group
         */
        public static function makeGroupLinkWiki( $group, $text = '' ) {
+               wfDeprecated( __METHOD__, '1.29' );
+
                if ( $text == '' ) {
-                       $text = self::getGroupName( $group );
+                       $text = UserGroupMembership::getGroupName( $group );
                }
-               $title = self::getGroupPage( $group );
+               $title = UserGroupMembership::getGroupPage( $group );
                if ( $title ) {
                        $page = $title->getFullText();
                        return "[[$page|$text]]";
@@ -5067,61 +5152,27 @@ class User implements IDBAccessObject {
        /**
         * Get the description of a given right
         *
+        * @since 1.29
         * @param string $right Right to query
         * @return string Localized description of the right
         */
        public static function getRightDescription( $right ) {
                $key = "right-$right";
                $msg = wfMessage( $key );
-               return $msg->isBlank() ? $right : $msg->text();
+               return $msg->isDisabled() ? $right : $msg->text();
        }
 
        /**
-        * Make a new-style password hash
+        * Get the name of a given grant
         *
-        * @param string $password Plain-text password
-        * @param bool|string $salt Optional salt, may be random or the user ID.
-        *  If unspecified or false, will generate one automatically
-        * @return string Password hash
-        * @deprecated since 1.24, use Password class
+        * @since 1.29
+        * @param string $grant Grant to query
+        * @return string Localized name of the grant
         */
-       public static function crypt( $password, $salt = false ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               $hash = $passwordFactory->newFromPlaintext( $password );
-               return $hash->toString();
-       }
-
-       /**
-        * Compare a password hash with a plain-text password. Requires the user
-        * ID if there's a chance that the hash is an old-style hash.
-        *
-        * @param string $hash Password hash
-        * @param string $password Plain-text password to compare
-        * @param string|bool $userId User ID for old-style password salt
-        *
-        * @return bool
-        * @deprecated since 1.24, use Password class
-        */
-       public static function comparePasswords( $hash, $password, $userId = false ) {
-               wfDeprecated( __METHOD__, '1.24' );
-
-               // Check for *really* old password hashes that don't even have a type
-               // The old hash format was just an md5 hex hash, with no type information
-               if ( preg_match( '/^[0-9a-f]{32}$/', $hash ) ) {
-                       global $wgPasswordSalt;
-                       if ( $wgPasswordSalt ) {
-                               $password = ":B:{$userId}:{$hash}";
-                       } else {
-                               $password = ":A:{$hash}";
-                       }
-               }
-
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               $hash = $passwordFactory->newFromCiphertext( $hash );
-               return $hash->equals( $password );
+       public static function getGrantName( $grant ) {
+               $key = "grant-$grant";
+               $msg = wfMessage( $key );
+               return $msg->isDisabled() ? $grant : $msg->text();
        }
 
        /**
@@ -5396,10 +5447,10 @@ class User implements IDBAccessObject {
        static function newFatalPermissionDeniedStatus( $permission ) {
                global $wgLang;
 
-               $groups = array_map(
-                       [ 'User', 'makeGroupLinkWiki' ],
-                       User::getGroupsWithPermission( $permission )
-               );
+               $groups = [];
+               foreach ( User::getGroupsWithPermission( $permission ) as $group ) {
+                       $groups[] = UserGroupMembership::getLink( $group, RequestContext::getMain(), 'wiki' );
+               }
 
                if ( $groups ) {
                        return Status::newFatal( 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) );
diff --git a/includes/user/UserGroupMembership.php b/includes/user/UserGroupMembership.php
new file mode 100644 (file)
index 0000000..59ca31c
--- /dev/null
@@ -0,0 +1,475 @@
+<?php
+/**
+ * Represents the membership of a user to a user group.
+ *
+ * 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
+ */
+
+/**
+ * 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
+ * user group membership.
+ *
+ * The class encapsulates rows in the user_groups table. The logic is low-level and
+ * doesn't run any hooks. Often, you will want to call User::addGroup() or
+ * User::removeGroup() instead.
+ *
+ * @since 1.29
+ */
+class UserGroupMembership {
+       /** @var int The ID of the user who belongs to the group */
+       private $userId;
+
+       /** @var string */
+       private $group;
+
+       /** @var string|null Timestamp of expiry in TS_MW format, or null if no expiry */
+       private $expiry;
+
+       /**
+        * @param int $userId The ID of the user who belongs to the group
+        * @param string $group The internal group name
+        * @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;
+       }
+
+       /**
+        * @return int
+        */
+       public function getUserId() {
+               return $this->userId;
+       }
+
+       /**
+        * @return string
+        */
+       public function getGroup() {
+               return $this->group;
+       }
+
+       /**
+        * @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 );
+               }
+       }
+
+       /**
+        * Creates a new UserGroupMembership object from a database row.
+        *
+        * @param stdClass $row The row from the user_groups table
+        * @return UserGroupMembership
+        */
+       public static function newFromRow( $row ) {
+               $ugm = new self;
+               $ugm->initFromRow( $row );
+               return $ugm;
+       }
+
+       /**
+        * Returns the list of user_groups fields that should be selected to create
+        * a new user group membership.
+        * @return array
+        */
+       public static function selectFields() {
+               global $wgDisableUserGroupExpiry;
+               if ( $wgDisableUserGroupExpiry ) {
+                       return [
+                               'ug_user',
+                               'ug_group',
+                       ];
+               } else {
+                       return [
+                               'ug_user',
+                               'ug_group',
+                               'ug_expiry',
+                       ];
+               }
+       }
+
+       /**
+        * Delete the row from the user_groups table.
+        *
+        * @throws MWException
+        * @param IDatabase|null $dbw Optional master database connection to use
+        * @return bool Whether or not anything was deleted
+        */
+       public function delete( IDatabase $dbw = null ) {
+               global $wgDisableUserGroupExpiry;
+               if ( wfReadOnly() ) {
+                       return false;
+               }
+
+               if ( $dbw === null ) {
+                       $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__ );
+               }
+               if ( !$dbw->affectedRows() ) {
+                       return false;
+               }
+
+               // Remember that the user was in this group
+               $dbw->insert(
+                       'user_former_groups',
+                       [ 'ufg_user' => $this->userId, 'ufg_group' => $this->group ],
+                       __METHOD__,
+                       [ 'IGNORE' ] );
+
+               return true;
+       }
+
+       /**
+        * Insert a user right membership into the database. When $allowUpdate is false,
+        * the function fails if there is a conflicting membership entry (same user and
+        * group) already in the table.
+        *
+        * @throws MWException
+        * @param bool $allowUpdate Whether to perform "upsert" instead of INSERT
+        * @param IDatabase|null $dbw If you have one available
+        * @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 );
+               }
+
+               // Purge old, expired memberships from the DB
+               self::purgeExpired( $dbw );
+
+               // Check that the values make sense
+               if ( $this->group === null ) {
+                       throw new UnexpectedValueException(
+                               'Don\'t try inserting an uninitialized UserGroupMembership object' );
+               } elseif ( $this->userId <= 0 ) {
+                       throw new UnexpectedValueException(
+                               'UserGroupMembership::insert() needs a positive user ID. ' .
+                               'Did you forget to add your User object to the database before calling addGroup()?' );
+               }
+
+               $row = $this->getDatabaseArray( $dbw );
+               $dbw->insert( 'user_groups', $row, __METHOD__, [ 'IGNORE' ] );
+               $affected = $dbw->affectedRows();
+
+               // Don't collide with expired user group memberships
+               // Do this after trying to insert, in order to avoid locking
+               if ( !$wgDisableUserGroupExpiry && !$affected ) {
+                       $conds = [
+                               'ug_user' => $row['ug_user'],
+                               'ug_group' => $row['ug_group'],
+                       ];
+                       // if we're unconditionally updating, check that the expiry is not already the
+                       // same as what we are trying to update it to; otherwise, only update if
+                       // the expiry date is in the past
+                       if ( $allowUpdate ) {
+                               if ( $this->expiry ) {
+                                       $conds[] = 'ug_expiry IS NULL OR ug_expiry != ' .
+                                               $dbw->addQuotes( $dbw->timestamp( $this->expiry ) );
+                               } else {
+                                       $conds[] = 'ug_expiry IS NOT NULL';
+                               }
+                       } else {
+                               $conds[] = 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp() );
+                       }
+
+                       $row = $dbw->selectRow( 'user_groups', $this::selectFields(), $conds, __METHOD__ );
+                       if ( $row ) {
+                               $dbw->update(
+                                       'user_groups',
+                                       [ 'ug_expiry' => $this->expiry ? $dbw->timestamp( $this->expiry ) : null ],
+                                       [ 'ug_user' => $row->ug_user, 'ug_group' => $row->ug_group ],
+                                       __METHOD__ );
+                               $affected = $dbw->affectedRows();
+                       }
+               }
+
+               return $affected > 0;
+       }
+
+       /**
+        * Get an array suitable for passing to $dbw->insert() or $dbw->update()
+        * @param IDatabase $db
+        * @return array
+        */
+       protected function getDatabaseArray( IDatabase $db ) {
+               global $wgDisableUserGroupExpiry;
+
+               $a = [
+                       'ug_user' => $this->userId,
+                       'ug_group' => $this->group,
+               ];
+               if ( !$wgDisableUserGroupExpiry ) {
+                       $a['ug_expiry'] = $this->expiry ? $db->timestamp( $this->expiry ) : null;
+               }
+               return $a;
+       }
+
+       /**
+        * Has the membership expired?
+        * @return bool
+        */
+       public function isExpired() {
+               global $wgDisableUserGroupExpiry;
+               if ( $wgDisableUserGroupExpiry || !$this->expiry ) {
+                       return false;
+               } else {
+                       return wfTimestampNow() > $this->expiry;
+               }
+       }
+
+       /**
+        * Purge expired memberships from the user_groups table
+        *
+        * @param IDatabase|null $dbw
+        */
+       public static function purgeExpired( IDatabase $dbw = null ) {
+               global $wgDisableUserGroupExpiry;
+               if ( $wgDisableUserGroupExpiry || wfReadOnly() ) {
+                       return;
+               }
+
+               if ( $dbw === null ) {
+                       $dbw = wfGetDB( DB_MASTER );
+               }
+
+               DeferredUpdates::addUpdate( new AtomicSectionUpdate(
+                       $dbw,
+                       __METHOD__,
+                       function ( IDatabase $dbw, $fname ) {
+                               $expiryCond = [ 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ];
+                               $res = $dbw->select( 'user_groups', self::selectFields(), $expiryCond, $fname );
+
+                               // save an array of users/groups to insert to user_former_groups
+                               $usersAndGroups = [];
+                               foreach ( $res as $row ) {
+                                       $usersAndGroups[] = [ 'ufg_user' => $row->ug_user, 'ufg_group' => $row->ug_group ];
+                               }
+
+                               // delete 'em all
+                               $dbw->delete( 'user_groups', $expiryCond, $fname );
+
+                               // and push the groups to user_former_groups
+                               $dbw->insert( 'user_former_groups', $usersAndGroups, __METHOD__, [ 'IGNORE' ] );
+                       }
+               ) );
+       }
+
+       /**
+        * Returns UserGroupMembership objects for all the groups a user currently
+        * belongs to.
+        *
+        * @param int $userId ID of the user to search for
+        * @param IDatabase|null $db Optional database connection
+        * @return array Associative array of (group name => UserGroupMembership object)
+        */
+       public static function getMembershipsForUser( $userId, IDatabase $db = null ) {
+               if ( !$db ) {
+                       $db = wfGetDB( DB_REPLICA );
+               }
+
+               $res = $db->select( 'user_groups',
+                       self::selectFields(),
+                       [ 'ug_user' => $userId ],
+                       __METHOD__ );
+
+               $ugms = [];
+               foreach ( $res as $row ) {
+                       $ugm = self::newFromRow( $row );
+                       if ( !$ugm->isExpired() ) {
+                               $ugms[$ugm->group] = $ugm;
+                       }
+               }
+
+               return $ugms;
+       }
+
+       /**
+        * Returns a UserGroupMembership object that pertains to the given user and group,
+        * or false if the user does not belong to that group (or the assignment has
+        * expired).
+        *
+        * @param int $userId ID of the user to search for
+        * @param string $group User group name
+        * @param IDatabase|null $db Optional database connection
+        * @return UserGroupMembership|false
+        */
+       public static function getMembership( $userId, $group, IDatabase $db = null ) {
+               if ( !$db ) {
+                       $db = wfGetDB( DB_REPLICA );
+               }
+
+               $row = $db->selectRow( 'user_groups',
+                       self::selectFields(),
+                       [ 'ug_user' => $userId, 'ug_group' => $group ],
+                       __METHOD__ );
+               if ( !$row ) {
+                       return false;
+               }
+
+               $ugm = self::newFromRow( $row );
+               if ( !$ugm->isExpired() ) {
+                       return $ugm;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Gets a link for a user group, possibly including the expiry date if relevant.
+        *
+        * @param string|UserGroupMembership $ugm Either a group name as a string, or
+        *   a UserGroupMembership object
+        * @param IContextSource $context
+        * @param string $format Either 'wiki' or 'html'
+        * @param string|null $userName If you want to use the group member message
+        *   ("administrator"), pass the name of the user who belongs to the group; it
+        *   is used for GENDER of the group member message. If you instead want the
+        *   group name message ("Administrators"), omit this parameter.
+        * @return string
+        */
+       public static function getLink( $ugm, IContextSource $context, $format,
+               $userName = null ) {
+
+               if ( $format !== 'wiki' && $format !== 'html' ) {
+                       throw new MWException( 'UserGroupMembership::getLink() $format parameter should be ' .
+                               "'wiki' or 'html'" );
+               }
+
+               if ( $ugm instanceof UserGroupMembership ) {
+                       $expiry = $ugm->getExpiry();
+                       $group = $ugm->getGroup();
+               } else {
+                       $expiry = null;
+                       $group = $ugm;
+               }
+
+               if ( $userName !== null ) {
+                       $groupName = self::getGroupMemberName( $group, $userName );
+               } else {
+                       $groupName = self::getGroupName( $group );
+               }
+
+               // link to the group description page, if it exists
+               $linkTitle = self::getGroupPage( $group );
+               if ( $linkTitle ) {
+                       if ( $format === 'wiki' ) {
+                               $linkPage = $linkTitle->getFullText();
+                               $groupLink = "[[$linkPage|$groupName]]";
+                       } else {
+                               $groupLink = Linker::link( $linkTitle, htmlspecialchars( $groupName ) );
+                       }
+               } else {
+                       $groupLink = htmlspecialchars( $groupName );
+               }
+
+               if ( $expiry ) {
+                       // format the expiry to a nice string
+                       $uiLanguage = $context->getLanguage();
+                       $uiUser = $context->getUser();
+                       $expiryDT = $uiLanguage->userTimeAndDate( $expiry, $uiUser );
+                       $expiryD = $uiLanguage->userDate( $expiry, $uiUser );
+                       $expiryT = $uiLanguage->userTime( $expiry, $uiUser );
+                       if ( $format === 'html' ) {
+                               $groupLink = Message::rawParam( $groupLink );
+                       }
+                       return $context->msg( 'group-membership-link-with-expiry' )
+                               ->params( $groupLink, $expiryDT, $expiryD, $expiryT )->text();
+               } else {
+                       return $groupLink;
+               }
+       }
+
+       /**
+        * Gets the localized friendly name for a group, if it exists. For example,
+        * "Administrators" or "Bureaucrats"
+        *
+        * @param string $group Internal group name
+        * @return string Localized friendly group name
+        */
+       public static function getGroupName( $group ) {
+               $msg = wfMessage( "group-$group" );
+               return $msg->isBlank() ? $group : $msg->text();
+       }
+
+       /**
+        * Gets the localized name for a member of a group, if it exists. For example,
+        * "administrator" or "bureaucrat"
+        *
+        * @param string $group Internal group name
+        * @param string $username Username for gender
+        * @return string Localized name for group member
+        */
+       public static function getGroupMemberName( $group, $username ) {
+               $msg = wfMessage( "group-$group-member", $username );
+               return $msg->isBlank() ? $group : $msg->text();
+       }
+
+       /**
+        * Gets the title of a page describing a particular user group. When the name
+        * of the group appears in the UI, it can link to this page.
+        *
+        * @param string $group Internal group name
+        * @return Title|bool Title of the page if it exists, false otherwise
+        */
+       public static function getGroupPage( $group ) {
+               $msg = wfMessage( "grouppage-$group" )->inContentLanguage();
+               if ( $msg->exists() ) {
+                       $title = Title::newFromText( $msg->text() );
+                       if ( is_object( $title ) ) {
+                               return $title;
+                       }
+               }
+               return false;
+       }
+}
index 69bc503..d801fa0 100644 (file)
@@ -198,50 +198,47 @@ class UserRightsProxy {
         * @return array
         */
        function getGroups() {
-               $res = $this->db->select( 'user_groups',
-                       [ 'ug_group' ],
-                       [ 'ug_user' => $this->id ],
-                       __METHOD__ );
-               $groups = [];
-               foreach ( $res as $row ) {
-                       $groups[] = $row->ug_group;
-               }
-               return $groups;
+               return array_keys( self::getGroupMemberships() );
        }
 
        /**
-        * Replaces User::addUserGroup()
-        * @param string $group
+        * Replaces User::getGroupMemberships()
+        *
+        * @return array
+        * @since 1.29
+        */
+       function getGroupMemberships() {
+               return UserGroupMembership::getMembershipsForUser( $this->id, $this->db );
+       }
+
+       /**
+        * Replaces User::addGroup()
         *
+        * @param string $group
+        * @param string|null $expiry
         * @return bool
         */
-       function addGroup( $group ) {
-               $this->db->insert( 'user_groups',
-                       [
-                               'ug_user' => $this->id,
-                               'ug_group' => $group,
-                       ],
-                       __METHOD__,
-                       [ 'IGNORE' ] );
+       function addGroup( $group, $expiry = null ) {
+               if ( $expiry ) {
+                       $expiry = wfTimestamp( TS_MW, $expiry );
+               }
 
-               return true;
+               $ugm = new UserGroupMembership( $this->id, $group, $expiry );
+               return $ugm->insert( true, $this->db );
        }
 
        /**
-        * Replaces User::removeUserGroup()
-        * @param string $group
+        * Replaces User::removeGroup()
         *
+        * @param string $group
         * @return bool
         */
        function removeGroup( $group ) {
-               $this->db->delete( 'user_groups',
-                       [
-                               'ug_user' => $this->id,
-                               'ug_group' => $group,
-                       ],
-                       __METHOD__ );
-
-               return true;
+               $ugm = UserGroupMembership::getMembership( $this->id, $group, $this->db );
+               if ( !$ugm ) {
+                       return false;
+               }
+               return $ugm->delete( $this->db );
        }
 
        /**
index 319b5d4..55e228a 100644 (file)
@@ -291,10 +291,6 @@ EOD;
                foreach ( glob( $this->basepath . '/*.php' ) as $file ) {
                        $this->readFile( $file );
                }
-
-               // Legacy aliases
-               $this->forceClassPath( 'DatabaseBase',
-                       $this->basepath . '/includes/libs/rdbms/database/Database.php' );
        }
 }
 
@@ -323,6 +319,11 @@ class ClassCollector {
         */
        protected $tokens;
 
+       /**
+        * @var array Class alias with target/name fields
+        */
+       protected $alias;
+
        /**
         * @var string $code PHP code (including <?php) to detect class names from
         * @return array List of FQCN detected within the tokens
@@ -331,6 +332,7 @@ class ClassCollector {
                $this->namespace = '';
                $this->classes = [];
                $this->startToken = null;
+               $this->alias = null;
                $this->tokens = [];
 
                foreach ( token_get_all( $code ) as $token ) {
@@ -353,6 +355,8 @@ class ClassCollector {
                if ( is_string( $token ) ) {
                        return;
                }
+               // Note: When changing class name discovery logic,
+               // AutoLoaderTest.php may also need to be updated.
                switch ( $token[0] ) {
                case T_NAMESPACE:
                case T_CLASS:
@@ -360,6 +364,12 @@ class ClassCollector {
                case T_TRAIT:
                case T_DOUBLE_COLON:
                        $this->startToken = $token;
+                       break;
+               case T_STRING:
+                       if ( $token[1] === 'class_alias' ) {
+                               $this->startToken = $token;
+                               $this->alias = [];
+                       }
                }
        }
 
@@ -383,6 +393,49 @@ class ClassCollector {
                        }
                        break;
 
+               case T_STRING:
+                       if ( $this->alias !== null ) {
+                               // Flow 1 - Two string literals:
+                               // - T_STRING  class_alias
+                               // - '('
+                               // - T_CONSTANT_ENCAPSED_STRING 'TargetClass'
+                               // - ','
+                               // - T_WHITESPACE
+                               // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
+                               // - ')'
+                               // Flow 2 - Use of ::class syntax for first parameter
+                               // - T_STRING  class_alias
+                               // - '('
+                               // - T_STRING TargetClass
+                               // - T_DOUBLE_COLON ::
+                               // - T_CLASS class
+                               // - ','
+                               // - T_WHITESPACE
+                               // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
+                               // - ')'
+                               if ( $token === '(' ) {
+                                       // Start of a function call to class_alias()
+                                       $this->alias = [ 'target' => false, 'name' => false ];
+                               } elseif ( $token === ',' ) {
+                                       // Record that we're past the first parameter
+                                       if ( $this->alias['target'] === false ) {
+                                               $this->alias['target'] = true;
+                                       }
+                               } elseif ( is_array( $token ) && $token[0] === T_CONSTANT_ENCAPSED_STRING ) {
+                                       if ( $this->alias['target'] === true ) {
+                                               // We already saw a first argument, this must be the second.
+                                               // Strip quotes from the string literal.
+                                               $this->alias['name'] = substr( $token[1], 1, -1 );
+                                       }
+                               } elseif ( $token === ')' ) {
+                                       // End of function call
+                                       $this->classes[] = $this->alias['name'];
+                                       $this->alias = null;
+                                       $this->startToken = null;
+                               }
+                       }
+                       break;
+
                case T_CLASS:
                case T_INTERFACE:
                case T_TRAIT:
index 516e9ae..212f325 100644 (file)
@@ -26,7 +26,6 @@
  *
  * Only a functional interface is provided: ZipFileReader::read(). No access is
  * given to object instances.
- *
  */
 class ZipDirectoryReader {
        /**
index f011f0b..507dab6 100644 (file)
@@ -19,6 +19,7 @@ class DateInputWidget extends \OOUI\TextInputWidget {
 
        protected $inputFormat = null;
        protected $displayFormat = null;
+       protected $longDisplayFormat = null;
        protected $placeholderLabel = null;
        protected $placeholderDateFormat = null;
        protected $precision = null;
@@ -36,6 +37,9 @@ class DateInputWidget extends \OOUI\TextInputWidget {
         *   while the widget is inactive. Should be as unambiguous as possible (for example, prefer
         *   to spell out the month, rather than rely on the order), even if that makes it longer.
         *   Applicable only if the widget is infused. (default: language-specific)
+        * @param string $config['longDisplayFormat'] If a custom displayFormat is not specified, use
+        *   unabbreviated day of the week and month names in the default language-specific
+        *   displayFormat. (default: false)
         * @param string $config['placeholderLabel'] Placeholder text shown when the widget is not
         *   selected. Applicable only if the widget is infused. (default: taken from message
         *   `mw-widgets-dateinput-no-date`)
@@ -58,6 +62,7 @@ class DateInputWidget extends \OOUI\TextInputWidget {
                $config = array_merge( [
                        // Default config values
                        'precision' => 'day',
+                       'longDisplayFormat' => false,
                ], $config );
 
                // Properties
@@ -79,6 +84,9 @@ class DateInputWidget extends \OOUI\TextInputWidget {
                if ( isset( $config['displayFormat'] ) ) {
                        $this->displayFormat = $config['displayFormat'];
                }
+               if ( isset( $config['longDisplayFormat'] ) ) {
+                       $this->longDisplayFormat = $config['longDisplayFormat'];
+               }
                if ( isset( $config['placeholderLabel'] ) ) {
                        $this->placeholderLabel = $config['placeholderLabel'];
                }
@@ -134,6 +142,9 @@ class DateInputWidget extends \OOUI\TextInputWidget {
                if ( $this->displayFormat !== null ) {
                        $config['displayFormat'] = $this->displayFormat;
                }
+               if ( $this->longDisplayFormat !== null ) {
+                       $config['longDisplayFormat'] = $this->longDisplayFormat;
+               }
                if ( $this->placeholderLabel !== null ) {
                        $config['placeholderLabel'] = $this->placeholderLabel;
                }
diff --git a/includes/widget/UsersMultiselectWidget.php b/includes/widget/UsersMultiselectWidget.php
new file mode 100644 (file)
index 0000000..d24ab7b
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * MediaWiki Widgets – UsersMultiselectWidget class.
+ *
+ * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+use \OOUI\TextInputWidget;
+
+/**
+ * Widget to select multiple users.
+ */
+class UsersMultiselectWidget extends \OOUI\Widget {
+
+       protected $usersArray = [];
+       protected $inputName = null;
+       protected $inputPlaceholder = null;
+
+       /**
+        * @param array $config Configuration options
+        * @param array $config['users'] Array of usernames to use as preset data
+        * @param array $config['placeholder'] Placeholder message for input
+        * @param array $config['name'] Name attribute (used in forms)
+        */
+       public function __construct( array $config = [] ) {
+               parent::__construct( $config );
+
+               // Properties
+               if ( isset( $config['default'] ) ) {
+                       $this->usersArray = $config['default'];
+               }
+               if ( isset( $config['name'] ) ) {
+                       $this->inputName = $config['name'];
+               }
+               if ( isset( $config['placeholder'] ) ) {
+                       $this->inputPlaceholder = $config['placeholder'];
+               }
+
+               $textarea = new TextInputWidget( [
+                       'name' => $this->inputName,
+                       'multiline' => true,
+                       'value' => implode( "\n", $this->usersArray ),
+                       'rows' => 25,
+               ] );
+               $this->prependContent( $textarea );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.UsersMultiselectWidget';
+       }
+
+       public function getConfig( &$config ) {
+               if ( $this->usersArray !== null ) {
+                       $config['data'] = $this->usersArray;
+               }
+               if ( $this->inputName !== null ) {
+                       $config['name'] = $this->inputName;
+               }
+               if ( $this->inputPlaceholder !== null ) {
+                       $config['placeholder'] = $this->inputPlaceholder;
+               }
+
+               return parent::getConfig( $config );
+       }
+
+}
diff --git a/includes/widget/search/BasicSearchResultSetWidget.php b/includes/widget/search/BasicSearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..07094af
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Message;
+use SearchResultSet;
+use SpecialSearch;
+use Status;
+
+/**
+ * Renders the search result area. Handles Title and Full-Text search results,
+ * along with inline and sidebar secondary (interwiki) results.
+ */
+class BasicSearchResultSetWidget {
+       /** @var SpecialSearch */
+       protected $specialPage;
+       /** @var SearchResultWidget */
+       protected $resultWidget;
+       /** @var InterwikiSearchResultSetWidget */
+       protected $sidebarWidget;
+
+       public function __construct(
+               SpecialSearch $specialPage,
+               SearchResultWidget $resultWidget,
+               SearchResultSetWidget $sidebarWidget
+       ) {
+               $this->specialPage = $specialPage;
+               $this->resultWidget = $resultWidget;
+               $this->sidebarWidget = $sidebarWidget;
+       }
+
+       /**
+        * @param string $term The search term to highlight
+        * @param int $offset The offset of the first result in the result set
+        * @param SearchResultSet|null $titleResultSet Results of searching only page titles
+        * @param SearchResultSet|null $textResultSet Results of general full text search.
+        * @return string HTML
+        */
+       public function render(
+               $term,
+               $offset,
+               SearchResultSet $titleResultSet = null,
+               SearchResultSet $textResultSet = null
+       ) {
+               global $wgContLang;
+
+               $hasTitle = $titleResultSet ? $titleResultSet->numRows() > 0 : false;
+               $hasText = $textResultSet ? $textResultSet->numRows() > 0 : false;
+               $hasSecondary = $textResultSet
+                       ? $textResultSet->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+                       : false;
+               $hasSecondaryInline = $textResultSet
+                       ? $textResultSet->hasInterwikiResults( SearchResultSet::INLINE_RESULTS )
+                       : false;
+
+               if ( !$hasTitle && !$hasText && !$hasSecondary && !$hasSecondaryInline ) {
+                       return '';
+               }
+
+               $out = '';
+               if ( $hasTitle ) {
+                       $out .= $this->header( $this->specialPage->msg( 'titlematches' ) )
+                               . $this->renderResultSet( $titleResultSet, $offset );
+               }
+
+               if ( $hasText ) {
+                       if ( $hasTitle ) {
+                               $out .= "<div class='mw-search-visualclear'></div>" .
+                                       $this->header( $this->specialPage->msg( 'textmatches' ) );
+                       }
+                       $out .= $this->renderResultSet( $textResultSet, $offset );
+               }
+
+               if ( $hasSecondaryInline ) {
+                       $iwResults = $textResultSet->getInterwikiResults( SearchResultSet::INLINE_RESULTS );
+                       foreach ( $iwResults as $interwiki => $results ) {
+                               if ( $results instanceof Status || $results->numRows() === 0 ) {
+                                       // ignore bad interwikis for now
+                                       continue;
+                               }
+                               $out .=
+                                       "<p class='mw-search-interwiki-header mw-search-visualclear'>" .
+                                               $this->specialPage->msg( "search-interwiki-results-{$interwiki}" )->parse() .
+                                       "</p>";
+                               $out .= $this->renderResultSet( $results, $offset );
+                       }
+               }
+
+               if ( $hasSecondary ) {
+                       $out .= $this->sidebarWidget->render(
+                               $term,
+                               $textResultSet->getInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+                       );
+               }
+
+               // Convert the whole thing to desired language variant
+               // TODO: Move this up to Special:Search?
+               return $wgContLang->convert( $out );
+       }
+
+       /**
+        * Generate a headline for a section of the search results. In prior
+        * implementations this was rendering wikitext of '==$1==', but seems
+        * a waste to call the full parser to generate this tiny bit of html
+        *
+        * @param Message $msg i18n message to use as header
+        * @return string HTML
+        */
+       protected function header( Message $msg ) {
+               return
+                       "<h2>" .
+                               "<span class='mw-headline'>" . $msg->escaped() . "</span>" .
+                       "</h2>";
+       }
+
+       /**
+        * @param SearchResultSet $resultSet The search results to render
+        * @param int $offset Offset of the first result in $resultSet
+        * @return string HTML
+        */
+       protected function renderResultSet( SearchResultSet $resultSet, $offset ) {
+               global $wgContLang;
+
+               $terms = $wgContLang->convertForSearchResult( $resultSet->termMatches() );
+
+               $hits = [];
+               $result = $resultSet->next();
+               while ( $result ) {
+                       $hits[] .= $this->resultWidget->render( $result, $terms, $offset++ );
+                       $result = $resultSet->next();
+               }
+
+               return "<ul class='mw-search-results'>" . implode( '', $hits ) . "</ul>";
+       }
+}
diff --git a/includes/widget/search/DidYouMeanWidget.php b/includes/widget/search/DidYouMeanWidget.php
new file mode 100644 (file)
index 0000000..3aee87b
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Linker;
+use SearchResultSet;
+use SpecialSearch;
+
+/**
+ * Renders a suggested search for the user, or tells the user
+ * a suggested search was run instead of the one provided.
+ */
+class DidYouMeanWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+
+       public function __construct( SpecialSearch $specialSearch ) {
+               $this->specialSearch = $specialSearch;
+       }
+
+       /**
+        * @param string $term The user provided search term
+        * @param SearchResultSet $resultSet
+        * @return string HTML
+        */
+       public function render( $term, SearchResultSet $resultSet ) {
+               if ( $resultSet->hasRewrittenQuery() ) {
+                       $html = $this->rewrittenHtml( $term, $resultSet );
+               } elseif ( $resultSet->hasSuggestion() ) {
+                       $html = $this->suggestionHtml( $resultSet );
+               } else {
+                       return '';
+               }
+
+               return "<div class='searchdidyoumean'>$html</div>";
+       }
+
+       /**
+        * Generates HTML shown to user when their query has been internally
+        * rewritten, and the results of the rewritten query are being returned.
+        *
+        * @param string $term The users search input
+        * @param SearchResultSet $resultSet The response to the search request
+        * @return string HTML Links the user to their original $term query, and the
+        *  one suggested by $resultSet
+        */
+       protected function rewrittenHtml( $term, SearchResultSet $resultSet ) {
+               $params = [
+                       'search' => $resultSet->getQueryAfterRewrite(),
+                       // Don't magic this link into a 'go' link, it should always
+                       // show search results.
+                       'fultext' => 1,
+               ];
+               $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
+
+               $rewritten = Linker::linkKnown(
+                       $this->specialSearch->getPageTitle(),
+                       $resultSet->getQueryAfterRewriteSnippet() ?: null,
+                       [ 'id' => 'mw-search-DYM-rewritten' ],
+                       $stParams
+               );
+
+               $stParams['search'] = $term;
+               $stParams['runsuggestion'] = 0;
+               $original = Linker::linkKnown(
+                       $this->specialSearch->getPageTitle(),
+                       htmlspecialchars( $term, ENT_QUOTES, 'UTF-8' ),
+                       [ 'id' => 'mwsearch-DYM-original' ],
+                       $stParams
+               );
+
+               return $this->specialSearch->msg( 'search-rewritten' )
+                       ->rawParams( $rewritten, $original )
+                       ->escaped();
+       }
+
+       /**
+        * Generates HTML shown to the user when we have a suggestion about
+        * a query that might give more/better results than their current
+        * query.
+        *
+        * @param SearchResultSet $resultSet
+        * @return string HTML
+        */
+       protected function suggestionHtml( SearchResultSet $resultSet ) {
+               $params = [
+                       'search' => $resultSet->getSuggestionQuery(),
+                       'fulltext' => 1,
+               ];
+               $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
+
+               $suggest = Linker::linkKnown(
+                       $this->specialSearch->getPageTitle(),
+                       $resultSet->getSuggestionSnippet() ?: null,
+                       [ 'id' => 'mw-search-DYM-suggestion' ],
+                       $stParams
+               );
+
+               return $this->specialSearch->msg( 'search-suggest' )
+                       ->rawParams( $suggest )->parse();
+       }
+}
diff --git a/includes/widget/search/FullSearchResultWidget.php b/includes/widget/search/FullSearchResultWidget.php
new file mode 100644 (file)
index 0000000..0d0fa12
--- /dev/null
@@ -0,0 +1,284 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Category;
+use Hooks;
+use HtmlArmor;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResult;
+use SpecialSearch;
+use Title;
+
+/**
+ * Renders a 'full' multi-line search result with metadata.
+ *
+ *  The Title
+ *  some *highlighted* *text* about the search result
+ *  5KB (651 words) - 12:40, 6 Aug 2016
+ */
+class FullSearchResultWidget implements SearchResultWidget {
+       /** @var SpecialSearch */
+       protected $specialPage;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+
+       public function __construct( SpecialSearch $specialPage, LinkRenderer $linkRenderer ) {
+               $this->specialPage = $specialPage;
+               $this->linkRenderer = $linkRenderer;
+       }
+
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position ) {
+               // If the page doesn't *exist*... our search index is out of date.
+               // The least confusing at this point is to drop the result.
+               // You may get less results, but... on well. :P
+               if ( $result->isBrokenTitle() || $result->isMissingRevision() ) {
+                       return '';
+               }
+
+               $link = $this->generateMainLinkHtml( $result, $terms, $position );
+               // If page content is not readable, just return ths title.
+               // This is not quite safe, but better than showing excerpts from
+               // non-readable pages. Note that hiding the entry entirely would
+               // screw up paging (really?).
+               if ( !$result->getTitle()->userCan( 'read', $this->specialPage->getUser() ) ) {
+                       return "<li>{$link}</li>";
+               }
+
+               $redirect = $this->generateRedirectHtml( $result );
+               $section = $this->generateSectionHtml( $result );
+               $category = $this->generateCategoryHtml( $result );
+               $date = $this->specialPage->getLanguage()->userTimeAndDate(
+                       $result->getTimestamp(),
+                       $this->specialPage->getUser()
+               );
+               list( $file, $desc, $thumb ) = $this->generateFileHtml( $result );
+               $snippet = $result->getTextSnippet( $terms );
+               if ( $snippet ) {
+                       $extract = "<div class='searchresult'>$snippet</div>";
+               } else {
+                       $extract = '';
+               }
+
+               if ( $thumb === null ) {
+                       // If no thumb, then the description is about size
+                       $desc = $this->generateSizeHtml( $result );
+
+                       // Let hooks do their own final construction if desired.
+                       // FIXME: Not sure why this is only for results without thumbnails,
+                       // but keeping it as-is for now to prevent breaking hook consumers.
+                       $html = null;
+                       $score = '';
+                       $related = '';
+                       if ( !Hooks::run( 'ShowSearchHit', [
+                               $this->specialPage, $result, $terms,
+                               &$link, &$redirect, &$section, &$extract,
+                               &$score, &$size, &$date, &$related, &$html
+                       ] ) ) {
+                               return $html;
+                       }
+               }
+
+               // All the pieces have been collected. Now generate the final HTML
+               $joined = "{$link} {$redirect} {$category} {$section} {$file}";
+               $meta = $this->buildMeta( $desc, $date );
+
+               if ( $thumb === null ) {
+                       $html =
+                               "<div class='mw-search-result-heading'>{$joined}</div>" .
+                               "{$extract} {$meta}";
+               } else {
+                       $html =
+                               "<table class='searchResultImage'>" .
+                                       "<tr>" .
+                                               "<td style='width: 120px; text-align: center; vertical-align: top'>" .
+                                                       $thumb .
+                                               "</td>" .
+                                               "<td style='vertical-align: top'>" .
+                                                       "{$joined} {$extract} {$meta}" .
+                                               "</td>" .
+                                       "</tr>" .
+                               "</table>";
+               }
+
+               return "<li>{$html}</li>";
+       }
+
+       /**
+        * Generates HTML for the primary call to action. It is
+        * typically the article title, but the search engine can
+        * return an exact snippet to use (typically the article
+        * title with highlighted words).
+        *
+        * @param SearchResult $result
+        * @param string $terms
+        * @param int $position
+        * @return string HTML
+        */
+       protected function generateMainLinkHtml( SearchResult $result, $terms, $position ) {
+               $snippet = $result->getTitleSnippet();
+               if ( $snippet === '' ) {
+                       $snippet = null;
+               } else {
+                       $snippet = new HtmlArmor( $snippet );
+               }
+
+               // clone to prevent hook from changing the title stored inside $result
+               $title = clone $result->getTitle();
+               $query = [];
+
+               Hooks::run( 'ShowSearchHitTitle',
+                       [ &$title, &$snippet, $result, $terms, $this->specialPage, &$query ] );
+
+               $link = $this->linkRenderer->makeLink(
+                       $title,
+                       $snippet,
+                       [ 'data-serp-pos' => $position ],
+                       $query
+               );
+
+               return $link;
+       }
+
+       /**
+        * Generates an alternate title link, such as (redirect from <a>Foo</a>).
+        *
+        * @param string $msgKey i18n message  used to wrap title
+        * @param Title|null $title The title to link to, or null to generate
+        *  the message without a link. In that case $text must be non-null.
+        * @param string|null $text The text snippet to display, or null
+        *  to use the title
+        * @return string HTML
+        */
+       protected function generateAltTitleHtml( $msgKey, Title $title = null, $text ) {
+               $inner = $title === null
+                       ? $text
+                       : $this->linkRenderer->makeLink( $title, $text ? new HtmlArmor( $text ) : null );
+
+               return "<span class='searchalttitle'>" .
+                               $this->specialPage->msg( $msgKey )->rawParams( $inner )->text()
+                       . "</span>";
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateRedirectHtml( SearchResult $result ) {
+               $title = $result->getRedirectTitle();
+               return $title === null
+                       ? ''
+                       : $this->generateAltTitleHtml( 'search-redirect', $title, $result->getRedirectSnippet() );
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateSectionHtml( SearchResult $result ) {
+               $title = $result->getSectionTitle();
+               return $title === null
+                       ? ''
+                       : $this->generateAltTitleHtml( 'search-section', $title, $result->getSectionSnippet() );
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateCategoryHtml( SearchResult $result ) {
+               $snippet = $result->getCategorySnippet();
+               return $snippet
+                       ? $this->generateAltTitleHtml( 'search-category', null, $snippet )
+                       : '';
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateSizeHtml( SearchResult $result ) {
+               $title = $result->getTitle();
+               if ( $title->getNamespace() === NS_CATEGORY ) {
+                       $cat = Category::newFromTitle( $title );
+                       return $this->specialPage->msg( 'search-result-category-size' )
+                               ->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
+                               ->escaped();
+               // TODO: This is a bit odd...but requires changing the i18n message to fix
+               } elseif ( $result->getByteSize() !== null || $result->getWordCount() > 0 ) {
+                       $lang = $this->specialPage->getLanguage();
+                       $bytes = $lang->formatSize( $result->getByteSize() );
+                       $words = $result->getWordCount();
+
+                       return $this->specialPage->msg( 'search-result-size', $bytes )
+                               ->numParams( $words )
+                               ->escaped();
+               }
+
+               return '';
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return array Three element array containing the main file html,
+        *  a text description of the file, and finally the thumbnail html.
+        *  If no thumbnail is available the second and third will be null.
+        */
+       protected function generateFileHtml( SearchResult $result ) {
+               $title = $result->getTitle();
+               if ( $title->getNamespace() !== NS_FILE ) {
+                       return [ '', null, null ];
+               }
+
+               if ( $result->isFileMatch() ) {
+                       $html = "<span class='searchalttitle'>" .
+                                       $this->specialPage->msg( 'search-file-match' )->escaped() .
+                               "</span>";
+               } else {
+                       $html = '';
+               }
+
+               $descHtml = null;
+               $thumbHtml = null;
+
+               $img = $result->getFile() ?: wfFindFile( $title );
+               if ( $img ) {
+                       $thumb = $img->transform( [ 'width' => 120, 'height' => 120 ] );
+                       if ( $thumb ) {
+                               $descHtml = $this->specialPage->msg( 'parentheses' )
+                                       ->rawParams( $img->getShortDesc() )
+                                       ->escaped();
+                               $thumbHtml = $thumb->toHtml( [ 'desc-link' => true ] );
+                       }
+               }
+
+               return [ $html, $descHtml, $thumbHtml ];
+       }
+
+       /**
+        * @param string $desc HTML description of result, ex: size in bytes, or empty string
+        * @param string $date HTML representation of last edit date, or empty string
+        * @return string HTML A div combining $desc and $date with a separator in a <div>.
+        *  If either is missing only one will be represented. If both are missing an empty
+        *  string will be returned.
+        */
+       protected function buildMeta( $desc, $date ) {
+               if ( $desc && $date ) {
+                       $meta = "{$desc} - {$date}";
+               } elseif ( $desc ) {
+                       $meta = $desc;
+               } elseif ( $date ) {
+                       $meta = $date;
+               } else {
+                       return '';
+               }
+
+               return "<div class='mw-search-result-data'>{$meta}</div>";
+       }
+}
diff --git a/includes/widget/search/InterwikiSearchResultSetWidget.php b/includes/widget/search/InterwikiSearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..76b9b01
--- /dev/null
@@ -0,0 +1,184 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResultSet;
+use SpecialSearch;
+use Title;
+use Html;
+
+/**
+ * Renders one or more SearchResultSets into a sidebar grouped by
+ * interwiki prefix. Includes a per-wiki header indicating where
+ * the results are from.
+ */
+class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var SearchResultWidget */
+       protected $resultWidget;
+       /** @var string[]|null */
+       protected $customCaptions;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+       /** @var InterwikiLookup */
+       protected $iwLookup;
+       /** @var $output */
+       protected $output;
+       /** @var $iwPrefixDisplayTypes */
+       protected $iwPrefixDisplayTypes;
+
+       public function __construct(
+               SpecialSearch $specialSearch,
+               SearchResultWidget $resultWidget,
+               LinkRenderer $linkRenderer,
+               InterwikiLookup $iwLookup
+       ) {
+               $this->specialSearch = $specialSearch;
+               $this->resultWidget = $resultWidget;
+               $this->linkRenderer = $linkRenderer;
+               $this->iwLookup = $iwLookup;
+               $this->output = $specialSearch->getOutput();
+               $this->iwPrefixDisplayTypes = $specialSearch->getConfig()->get(
+                       'InterwikiPrefixDisplayTypes'
+               );
+       }
+       /**
+        * @param string $term User provided search term
+        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        *  results to render.
+        * @return string HTML
+        */
+       public function render( $term, $resultSets ) {
+               if ( !is_array( $resultSets ) ) {
+                       $resultSets = [ $resultSets ];
+               }
+
+               $this->loadCustomCaptions();
+
+               $this->output->addModules( 'mediawiki.special.search.commonsInterwikiWidget' );
+               $this->output->addModuleStyles( 'mediawiki.special.search.interwikiwidget.styles' );
+
+               $iwResults = [];
+               foreach ( $resultSets as $resultSet ) {
+                       $result = $resultSet->next();
+                       while ( $result ) {
+                               if ( !$result->isBrokenTitle() ) {
+                                       $iwResults[$result->getTitle()->getInterwiki()][] = $result;
+                               }
+                               $result = $resultSet->next();
+                       }
+               }
+
+               $iwResultSetPos = 1;
+               $iwResultListOutput = '';
+
+               foreach ( $iwResults as $iwPrefix => $results ) {
+                       // TODO: Assumes interwiki results are never paginated
+                       $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,
+                                       'data-iw-resultset-pos' => $iwResultSetPos
+                               ],
+                               $headerHtml .
+                               $iwResultItemOutput .
+                               $footerHtml
+                       );
+
+                       $iwResultSetPos++;
+               }
+
+               return Html::rawElement(
+                       'div',
+                       [ 'id' => 'mw-interwiki-results' ],
+                       Html::rawElement(
+                               'p',
+                               [ 'class' => 'iw-headline' ],
+                               $this->specialSearch->msg( 'search-interwiki-caption' )->parse()
+                       ) .
+                       Html::rawElement(
+                               'ul', [ 'class' => 'iw-results', ], $iwResultListOutput
+                       )
+               );
+       }
+
+       /**
+        * 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
+        *
+        * @param string $term User provided search term
+        * @param string $iwPrefix Interwiki prefix of wiki to show footer for
+        * @return string HTML
+        */
+       protected function footerHtml( $term, $iwPrefix ) {
+
+               $href = Title::makeTitle( NS_SPECIAL, 'Search', null, $iwPrefix )->getLocalURL(
+                       [ 'search' => $term, 'fulltext' => 1 ]
+               );
+
+               $searchLink = Html::rawElement(
+                       'a',
+                       [ 'href' => $href ],
+                       $this->specialSearch->msg( 'search-interwiki-more' )->escaped()
+               );
+
+               return Html::rawElement( 'div', [ 'class' => 'iw-result__footer' ], $searchLink );
+       }
+
+       protected function loadCustomCaptions() {
+               if ( $this->customCaptions !== null ) {
+                       return;
+               }
+
+               $this->customCaptions = [];
+               $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->escaped() );
+               foreach ( $customLines as $line ) {
+                       $parts = explode( ':', $line, 2 );
+                       if ( count( $parts ) === 2 ) {
+                               $this->customCaptions[$parts[0]] = $parts[1];
+                       }
+               }
+       }
+}
diff --git a/includes/widget/search/InterwikiSearchResultWidget.php b/includes/widget/search/InterwikiSearchResultWidget.php
new file mode 100644 (file)
index 0000000..6b51db5
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use HtmlArmor;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResult;
+use SpecialSearch;
+use Title;
+use Html;
+
+/**
+ * Renders an enhanced interwiki result
+ */
+class InterwikiSearchResultWidget implements SearchResultWidget {
+       /** @var SpecialSearch */
+       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' );
+       }
+
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position ) {
+
+               $title = $result->getTitle();
+               $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 );
+               } else {
+                       $titleSnippet = null;
+               }
+
+               $link = $this->linkRenderer->makeLink( $title, $titleSnippet );
+
+               $redirectTitle = $result->getRedirectTitle();
+               $redirect = '';
+               if ( $redirectTitle !== null ) {
+
+                       $redirectText = $result->getRedirectSnippet();
+
+                       if ( $redirectText ) {
+                               $redirectText = new HtmlArmor( $redirectText );
+                       } else {
+                               $redirectText = null;
+                       }
+
+                       $redirect = Html::rawElement( 'span', [ 'class' => 'iw-result__redirect' ],
+                               $this->specialSearch->msg( 'search-redirect' )->rawParams(
+                                       $this->linkRenderer->makeLink( $redirectTitle, $redirectText )
+                               )->escaped()
+                       );
+               }
+
+               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>";
+               }
+       }
+}
diff --git a/includes/widget/search/SearchFormWidget.php b/includes/widget/search/SearchFormWidget.php
new file mode 100644 (file)
index 0000000..b8d415f
--- /dev/null
@@ -0,0 +1,315 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Hooks;
+use Html;
+use MediaWiki\Widget\SearchInputWidget;
+use MWNamespace;
+use SearchEngineConfig;
+use SpecialSearch;
+use Xml;
+
+class SearchFormWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var SearchEngineConfig */
+       protected $searchConfig;
+       /** @var array */
+       protected $profiles;
+
+       /**
+        * @param SpecialSearch $specialSearch
+        * @param SearchEngineConfig $searchConfig
+        * @param array $profiles
+        */
+       public function __construct(
+               SpecialSearch $specialSearch,
+               SearchEngineConfig $searchConfig,
+               array $profiles
+       ) {
+               $this->specialSearch = $specialSearch;
+               $this->searchConfig = $searchConfig;
+               $this->profiles = $profiles;
+       }
+
+       /**
+        * @param string $profile The current search profile
+        * @param string $term The current search term
+        * @param int $numResults The number of results shown
+        * @param int $totalResults The total estimated results found
+        * @param int $offset Current offset in search results
+        * @param bool $isPowerSearch Is the 'advanced' section open?
+        * @return string HTML
+        */
+       public function render(
+               $profile,
+               $term,
+               $numResults,
+               $totalResults,
+               $offset,
+               $isPowerSearch
+       ) {
+               return Xml::openElement(
+                               'form',
+                               [
+                                       'id' => $isPowerSearch ? 'powersearch' : 'search',
+                                       'method' => 'get',
+                                       'action' => wfScript(),
+                               ]
+                       ) .
+                               '<div id="mw-search-top-table">' .
+                                       $this->shortDialogHtml( $profile, $term, $numResults, $totalResults, $offset ) .
+                               '</div>' .
+                               "<div class='mw-search-visualclear'></div>" .
+                               "<div class='mw-search-profile-tabs'>" .
+                                       $this->profileTabsHtml( $profile, $term ) .
+                                       "<div style='clear:both'></div>" .
+                               "</div>" .
+                               $this->optionsHtml( $term, $isPowerSearch, $profile ) .
+                       '</form>';
+       }
+
+       /**
+        * @param string $profile The current search profile
+        * @param string $term The current search term
+        * @param int $numResults The number of results shown
+        * @param int $totalResults The total estimated results found
+        * @param int $offset Current offset in search results
+        * @return string HTML
+        */
+       protected function shortDialogHtml( $profile, $term, $numResults, $totalResults, $offset ) {
+               $html = '';
+
+               $searchWidget = new SearchInputWidget( [
+                       'id' => 'searchText',
+                       'name' => 'search',
+                       'autofocus' => trim( $term ) === '',
+                       'value' => $term,
+                       'dataLocation' => 'content',
+                       'infusable' => true,
+               ] );
+
+               $layout = new \OOUI\ActionFieldLayout( $searchWidget, new \OOUI\ButtonInputWidget( [
+                       'type' => 'submit',
+                       'label' => $this->specialSearch->msg( 'searchbutton' )->text(),
+                       'flags' => [ 'progressive', 'primary' ],
+               ] ), [
+                       'align' => 'top',
+               ] );
+
+               $html .= $layout;
+
+               if ( $totalResults > 0 && $offset < $totalResults ) {
+                       $html .= Xml::tags(
+                               'div',
+                               [ 'class' => 'results-info' ],
+                               $this->specialSearch->msg( 'search-showingresults' )
+                                       ->numParams( $offset + 1, $offset + $numResults, $totalResults )
+                                       ->numParams( $numResults )
+                                       ->parse()
+                       );
+               }
+
+               $html .=
+                       Html::hidden( 'title', $this->specialSearch->getPageTitle()->getPrefixedText() ) .
+                       Html::hidden( 'profile', $profile ) .
+                       Html::hidden( 'fulltext', '1' );
+
+               return $html;
+       }
+
+       /**
+        * Generates HTML for the list of available search profiles.
+        *
+        * @param string $profile The currently selected profile
+        * @param string $term The user provided search terms
+        * @return string HTML
+        */
+       protected function profileTabsHtml( $profile, $term ) {
+               $bareterm = $this->startsWithImage( $term )
+                       ? substr( $term, strpos( $term, ':' ) + 1 )
+                       : $term;
+               $lang = $this->specialSearch->getLanguage();
+               $items = [];
+               foreach ( $this->profiles as $id => $profileConfig ) {
+                       $profileConfig['parameters']['profile'] = $id;
+                       $tooltipParam = isset( $profileConfig['namespace-messages'] )
+                               ? $lang->commaList( $profileConfig['namespace-messages'] )
+                               : null;
+                       $items[] = Xml::tags(
+                               'li',
+                               [ 'class' => $profile === $id ? 'current' : 'normal' ],
+                               $this->makeSearchLink(
+                                       $bareterm,
+                                       $this->specialSearch->msg( $profileConfig['message'] )->text(),
+                                       $this->specialSearch->msg( $profileConfig['tooltip'], $tooltipParam )->text(),
+                                       $profileConfig['parameters']
+                               )
+                       );
+               }
+
+               return
+                               "<div class='search-types'>" .
+                                       "<ul>" . implode( '', $items ) . "</ul>" .
+                               "</div>";
+       }
+
+       /**
+        * Check if query starts with image: prefix
+        *
+        * @param string $term The string to check
+        * @return bool
+        */
+       protected function startsWithImage( $term ) {
+               global $wgContLang;
+
+               $parts = explode( ':', $term );
+               return count( $parts ) > 1
+                       ? $wgContLang->getNsIndex( $parts[0] ) === NS_FILE
+                       : false;
+       }
+
+       /**
+        * Make a search link with some target namespaces
+        *
+        * @param string $term The term to search for
+        * @param string $label Link's text
+        * @param string $tooltip Link's tooltip
+        * @param array $params Query string parameters
+        * @return string HTML fragment
+        */
+       protected function makeSearchLink( $term, $label, $tooltip, array $params = [] ) {
+               $params += [
+                       'search' => $term,
+                       'fulltext' => 1,
+               ];
+
+               return Xml::element(
+                       'a',
+                       [
+                               'href' => $this->specialSearch->getPageTitle()->getLocalURL( $params ),
+                               'title' => $tooltip,
+                       ],
+                       $label
+               );
+       }
+
+       /**
+        * Generates HTML for advanced options available with the currently
+        * selected search profile.
+        *
+        * @param string $term User provided search term
+        * @param bool $isPowerSearch Is the advanced search profile enabled?
+        * @param string $profile The current search profile
+        * @return string HTML
+        */
+       protected function optionsHtml( $term, $isPowerSearch, $profile ) {
+               $html = '';
+               $opts = [
+                       'profile' => $profile,
+               ];
+
+               if ( $isPowerSearch ) {
+                       $html .= $this->powerSearchBox( $term, $opts );
+               } else {
+                       $form = '';
+                       Hooks::run( 'SpecialSearchProfileForm', [
+                               $this->specialSearch, &$form, $profile, $term, $opts
+                       ] );
+                       $html .= $form;
+               }
+
+               return $html;
+       }
+
+       /**
+        * @param string $term The current search term
+        * @param array $opts Additional key/value pairs that will be submitted
+        *  with the generated form.
+        * @return string HTML
+        */
+       protected function powerSearchBox( $term, array $opts ) {
+               global $wgContLang;
+
+               $rows = [];
+               $activeNamespaces = $this->specialSearch->getNamespaces();
+               foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) {
+                       $subject = MWNamespace::getSubject( $namespace );
+                       if ( !isset( $rows[$subject] ) ) {
+                               $rows[$subject] = "";
+                       }
+
+                       $name = $wgContLang->getConverter()->convertNamespace( $namespace );
+                       if ( $name === '' ) {
+                               $name = $this->specialSearch->msg( 'blanknamespace' )->text();
+                       }
+
+                       $rows[$subject] .=
+                               '<td>' .
+                                       Xml::checkLabel(
+                                               $name,
+                                               "ns{$namespace}",
+                                               "mw-search-ns{$namespace}",
+                                               in_array( $namespace, $activeNamespaces )
+                                       ) .
+                               '</td>';
+               }
+
+               // Lays out namespaces in multiple floating two-column tables so they'll
+               // be arranged nicely while still accomodating diferent screen widths
+               $tableRows = [];
+               foreach ( $rows as $row ) {
+                       $tableRows[] = "<tr>{$row}</tr>";
+               }
+               $namespaceTables = [];
+               foreach ( array_chunk( $tableRows, 4 ) as $chunk ) {
+                       $namespaceTables[] = implode( '', $chunk );
+               }
+
+               $showSections = [
+                       'namespaceTables' => "<table>" . implode( '</table><table>', $namespaceTables ) . '</table>',
+               ];
+               Hooks::run( 'SpecialSearchPowerBox', [ &$showSections, $term, $opts ] );
+
+               $hidden = '';
+               foreach ( $opts as $key => $value ) {
+                       $hidden .= Html::hidden( $key, $value );
+               }
+
+               $divider = "<div class='divider'></div>";
+
+               // Stuff to feed SpecialSearch::saveNamespaces()
+               $user = $this->specialSearch->getUser();
+               $remember = '';
+               if ( $user->isLoggedIn() ) {
+                       $remember = $divider . Xml::checkLabel(
+                               $this->specialSearch->msg( 'powersearch-remember' )->text(),
+                               'nsRemember',
+                               'mw-search-powersearch-remember',
+                               false,
+                               // The token goes here rather than in a hidden field so it
+                               // is only sent when necessary (not every form submission)
+                               [ 'value' => $user->getEditToken(
+                                       'searchnamespace',
+                                       $this->specialSearch->getRequest()
+                               ) ]
+                       );
+               }
+
+               return
+                       "<fieldset id='mw-searchoptions'>" .
+                               "<legend>" . $this->specialSearch->msg( 'powersearch-legend' )->escaped() . '</legend>' .
+                               "<h4>" . $this->specialSearch->msg( 'powersearch-ns' )->parse() . '</h4>' .
+                               // populated by js if available
+                               "<div id='mw-search-togglebox'></div>" .
+                               $divider .
+                               implode(
+                                       $divider,
+                                       $showSections
+                               ) .
+                               $hidden .
+                               $remember .
+                       "</fieldset>";
+       }
+}
diff --git a/includes/widget/search/SearchResultSetWidget.php b/includes/widget/search/SearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..6df6e65
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use SearchResultSet;
+
+/**
+ * Renders a set of search results to HTML
+ */
+interface SearchResultSetWidget {
+       /**
+        * @param string $term User provided search term
+        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        *  results to render.
+        * @return string HTML
+        */
+       public function render( $term, $resultSets );
+}
diff --git a/includes/widget/search/SearchResultWidget.php b/includes/widget/search/SearchResultWidget.php
new file mode 100644 (file)
index 0000000..3fbdbef
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use SearchResult;
+
+/**
+ * Renders a single search result to HTML
+ */
+interface SearchResultWidget {
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The zero indexed result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position );
+}
diff --git a/includes/widget/search/SimpleSearchResultSetWidget.php b/includes/widget/search/SimpleSearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..04e1e21
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResultSet;
+use SpecialSearch;
+use Title;
+use Html;
+
+/**
+ * Renders one or more SearchResultSets into a sidebar grouped by
+ * interwiki prefix. Includes a per-wiki header indicating where
+ * the results are from.
+ */
+class SimpleSearchResultSetWidget implements SearchResultSetWidget{
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var SearchResultWidget */
+       protected $resultWidget;
+       /** @var string[]|null */
+       protected $customCaptions;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+       /** @var InterwikiLookup */
+       protected $iwLookup;
+
+       public function __construct(
+               SpecialSearch $specialSearch,
+               SearchResultWidget $resultWidget,
+               LinkRenderer $linkRenderer,
+               InterwikiLookup $iwLookup
+       ) {
+               $this->specialSearch = $specialSearch;
+               $this->resultWidget = $resultWidget;
+               $this->linkRenderer = $linkRenderer;
+               $this->iwLookup = $iwLookup;
+       }
+
+       /**
+        * @param string $term User provided search term
+        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        *  results to render.
+        * @return string HTML
+        */
+       public function render( $term, $resultSets ) {
+               if ( !is_array( $resultSets ) ) {
+                       $resultSets = [ $resultSets ];
+               }
+
+               $this->loadCustomCaptions();
+
+               $iwResults = [];
+               foreach ( $resultSets as $resultSet ) {
+                       $result = $resultSet->next();
+                       while ( $result ) {
+                               if ( !$result->isBrokenTitle() ) {
+                                       $iwResults[$result->getTitle()->getInterwiki()][] = $result;
+                               }
+                               $result = $resultSet->next();
+                       }
+               }
+
+               $out = '';
+               foreach ( $iwResults as $iwPrefix => $results ) {
+                       $out .= $this->headerHtml( $iwPrefix, $term );
+                       $out .= "<ul class='mw-search-iwresults'>";
+                       // TODO: Assumes interwiki results are never paginated
+                       $position = 0;
+                       foreach ( $results as $result ) {
+                               $out .= $this->resultWidget->render( $result, $term, $position++ );
+                       }
+                       $out .= "</ul>";
+               }
+
+               return
+                       "<div id='mw-search-interwiki'>" .
+                               "<div id='mw-search-interwiki-caption'>" .
+                                       $this->specialSearch->msg( 'search-interwiki-caption' )->parse() .
+                               '</div>' .
+                               $out .
+                       "</div>";
+       }
+
+       /**
+        * Generates an appropriate HTML header for the given interwiki prefix
+        *
+        * @param string $iwPrefix Interwiki prefix of wiki to show header for
+        * @param string $term User provided search term
+        * @return string HTML
+        */
+       protected function headerHtml( $iwPrefix, $term ) {
+               if ( isset( $this->customCaptions[$iwPrefix] ) ) {
+                       $caption = $this->customCaptions[$iwPrefix];
+               } else {
+                       $interwiki = $this->iwLookup->fetch( $iwPrefix );
+                       $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) );
+                       $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped();
+               }
+
+               $href = Title::makeTitle( NS_SPECIAL, 'Search', null, $iwPrefix )->getLocalURL(
+                       [ 'search' => $term, 'fulltext' => 1 ]
+               );
+               $searchLink = Html::rawElement(
+                       'a',
+                       [ 'href' => $href ],
+                       $this->specialSearch->msg( 'search-interwiki-more' )->escaped()
+               );
+
+               return
+                       "<div class='mw-search-interwiki-project'>" .
+                               "<span class='mw-search-interwiki-more'>{$searchLink}</span>" .
+                               $caption .
+               "</div>";
+       }
+
+       protected function loadCustomCaptions() {
+               if ( $this->customCaptions !== null ) {
+                       return;
+               }
+
+               $this->customCaptions = [];
+               $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->escaped() );
+               foreach ( $customLines as $line ) {
+                       $parts = explode( ':', $line, 2 );
+                       if ( count( $parts ) === 2 ) {
+                               $this->customCaptions[$parts[0]] = $parts[1];
+                       }
+               }
+       }
+}
diff --git a/includes/widget/search/SimpleSearchResultWidget.php b/includes/widget/search/SimpleSearchResultWidget.php
new file mode 100644 (file)
index 0000000..9fe816a
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use HtmlArmor;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResult;
+use SpecialSearch;
+use Title;
+
+/**
+ * Renders a simple one-line result
+ */
+class SimpleSearchResultWidget implements SearchResultWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+
+       public function __construct( SpecialSearch $specialSearch, LinkRenderer $linkRenderer ) {
+               $this->specialSearch = $specialSearch;
+               $this->linkRenderer = $linkRenderer;
+       }
+
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position ) {
+               $title = $result->getTitle();
+               $titleSnippet = $result->getTitleSnippet();
+               if ( $titleSnippet ) {
+                       $titleSnippet = new HtmlArmor( $titleSnippet );
+               } else {
+                       $titleSnippet = null;
+               }
+
+               $link = $this->linkRenderer->makeLink( $title, $titleSnippet );
+
+               $redirectTitle = $result->getRedirectTitle();
+               $redirect = '';
+               if ( $redirectTitle !== null ) {
+                       $redirectText = $result->getRedirectSnippet();
+                       if ( $redirectText ) {
+                               $redirectText = new HtmlArmor( $redirectText );
+                       } else {
+                               $redirectText = null;
+                       }
+                       $redirect =
+                               "<span class='searchalttitle'>" .
+                                       $this->specialSearch->msg( 'search-redirect' )->rawParams(
+                                               $this->linkRenderer->makeLink( $redirectTitle, $redirectText )
+                                       )->text() .
+                               "</span>";
+               }
+
+               return "<li>{$link} {$redirect}</li>";
+       }
+}
index 5b18365..228c5c4 100644 (file)
@@ -9,6 +9,7 @@
        "--warnings-exit-nonzero": true,
        "--external": "Blob,File,HTMLDocument,HTMLElement,HTMLIframeElement,HTMLInputElement,KeyboardEvent,MouseEvent,Node,Window,XMLDocument",
        "--output": "docs/js",
+       "--exclude": "resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js",
        "--": [
                "maintenance/jsduck/external.js",
                "resources/src/mediawiki",
index 2e4ef89..a1cc4bc 100644 (file)
@@ -45,7 +45,9 @@ class Language {
        public $dateFormatStrings = [];
        public $mExtendedSpecialPageAliases;
 
-       protected $namespaceNames, $mNamespaceIds, $namespaceAliases;
+       /** @var array|null */
+       protected $namespaceNames;
+       protected $mNamespaceIds, $namespaceAliases;
 
        /**
         * ReplacementArray object caches
@@ -463,10 +465,11 @@ class Language {
                if ( is_null( $this->namespaceNames ) ) {
                        global $wgMetaNamespace, $wgMetaNamespaceTalk, $wgExtraNamespaces;
 
-                       $this->namespaceNames = self::$dataCache->getItem( $this->mCode, 'namespaceNames' );
                        $validNamespaces = MWNamespace::getCanonicalNamespaces();
 
-                       $this->namespaceNames = $wgExtraNamespaces + $this->namespaceNames + $validNamespaces;
+                       $this->namespaceNames = $wgExtraNamespaces +
+                               self::$dataCache->getItem( $this->mCode, 'namespaceNames' );
+                       $this->namespaceNames += $validNamespaces;
 
                        $this->namespaceNames[NS_PROJECT] = $wgMetaNamespace;
                        if ( $wgMetaNamespaceTalk ) {
@@ -2097,17 +2100,15 @@ class Language {
                $data = explode( '|', $tz, 3 );
 
                if ( $data[0] == 'ZoneInfo' ) {
-                       MediaWiki\suppressWarnings();
-                       $userTZ = timezone_open( $data[2] );
-                       MediaWiki\restoreWarnings();
-                       if ( $userTZ !== false ) {
-                               $date = date_create( $ts, timezone_open( 'UTC' ) );
-                               date_timezone_set( $date, $userTZ );
-                               $date = date_format( $date, 'YmdHis' );
-                               return $date;
+                       try {
+                               $userTZ = new DateTimeZone( $data[2] );
+                               $date = new DateTime( $ts, new DateTimeZone( 'UTC' ) );
+                               $date->setTimezone( $userTZ );
+                               return $date->format( 'YmdHis' );
+                       } catch ( Exception $e ) {
+                               // Unrecognized timezone, default to 'Offset' with the stored offset.
+                               $data[0] = 'Offset';
                        }
-                       # Unrecognized timezone, default to 'Offset' with the stored offset.
-                       $data[0] = 'Offset';
                }
 
                if ( $data[0] == 'System' || $tz == '' ) {
@@ -2577,7 +2578,7 @@ class Language {
 
        /**
         * @param string $key
-        * @return array|null
+        * @return string|null
         */
        public function getMessage( $key ) {
                return self::$dataCache->getSubitem( $this->mCode, 'messages', $key );
@@ -3734,6 +3735,43 @@ class Language {
                        return $wgGrammarForms[$this->getCode()][$case][$word];
                }
 
+               $grammarTransformations = $this->getGrammarTransformations();
+
+               if ( isset( $grammarTransformations[$case] ) ) {
+                       $forms = $grammarTransformations[$case];
+
+                       // Some names of grammar rules are aliases for other rules.
+                       // In such cases the value is a string rather than object,
+                       // so load the actual rules.
+                       if ( is_string( $forms ) ) {
+                               $forms = $grammarTransformations[$forms];
+                       }
+
+                       foreach ( array_values( $forms ) as $rule ) {
+                               $form = $rule[0];
+
+                               if ( $form === '@metadata' ) {
+                                       continue;
+                               }
+
+                               $replacement = $rule[1];
+
+                               $regex = '/' . addcslashes( $form, '/' ) . '/u';
+                               $patternMatches = preg_match( $regex, $word );
+
+                               if ( $patternMatches === false ) {
+                                       wfLogWarning(
+                                               'An error occurred while processing grammar. ' .
+                                               "Word: '$word'. Regex: /$form/."
+                                       );
+                               } elseif ( $patternMatches === 1 ) {
+                                       $word = preg_replace( $regex, $replacement, $word );
+
+                                       break;
+                               }
+                       }
+               }
+
                return $word;
        }
 
@@ -3937,10 +3975,11 @@ class Language {
         *
         * @param string $str The validated block duration in English
         * @param User $user User object to use timezone from or null for $wgUser
+        * @param int $now Current timestamp, for formatting relative block durations
         * @return string Somehow translated block duration
         * @see LanguageFi.php for example implementation
         */
-       function translateBlockExpiry( $str, User $user = null ) {
+       function translateBlockExpiry( $str, User $user = null, $now = 0 ) {
                $duration = SpecialBlock::getSuggestedDurations( $this );
                foreach ( $duration as $show => $value ) {
                        if ( strcmp( $str, $value ) == 0 ) {
@@ -3957,12 +3996,13 @@ class Language {
                }
 
                // If all else fails, return a standard duration or timestamp description.
-               $time = strtotime( $str, 0 );
+               $time = strtotime( $str, $now );
                if ( $time === false ) { // Unknown format. Return it as-is in case.
                        return $str;
-               } elseif ( $time !== strtotime( $str, 1 ) ) { // It's a relative timestamp.
-                       // $time is relative to 0 so it's a duration length.
-                       return $this->formatDuration( $time );
+               } elseif ( $time !== strtotime( $str, $now + 1 ) ) { // It's a relative timestamp.
+                       // The result differs based on current time, so the difference
+                       // is a fixed duration length.
+                       return $this->formatDuration( $time - $now );
                } else { // It's an absolute timestamp.
                        if ( $time === 0 ) {
                                // wfTimestamp() handles 0 as current time instead of epoch.
@@ -4468,7 +4508,7 @@ class Language {
                # such as action=raw much more expensive than they need to be.
                # This will hopefully cover most cases.
                $talk = preg_replace_callback( '/{{grammar:(.*?)\|(.*?)}}/i',
-                       [ &$this, 'replaceGrammarInNamespace' ], $talk );
+                       [ $this, 'replaceGrammarInNamespace' ], $talk );
                return str_replace( ' ', '_', $talk );
        }
 
index 5a9f652..06fec44 100644 (file)
@@ -415,8 +415,6 @@ class LanguageConverter {
                                                $attr = $this->recursiveConvertTopLevel( $attr, $toVariant );
                                        }
 
-                                       // Remove HTML tags to avoid disrupting the layout
-                                       $attr = preg_replace( '/<[^>]+>/', '', $attr );
                                        if ( $attr !== $attrs[$attrName] ) {
                                                $attrs[$attrName] = $attr;
                                                $changed = true;
index 3388536..54ff421 100644 (file)
@@ -85,9 +85,10 @@ class LanguageFi extends Language {
        /**
         * @param string $str
         * @param User $user User object to use timezone from or null for $wgUser
+        * @param int $now Current timestamp, for formatting relative block durations
         * @return string
         */
-       function translateBlockExpiry( $str, User $user = null ) {
+       function translateBlockExpiry( $str, User $user = null, $now = 0 ) {
                /*
                        'ago', 'now', 'today', 'this', 'next',
                        'first', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth',
diff --git a/languages/classes/LanguageHe.php b/languages/classes/LanguageHe.php
deleted file mode 100644 (file)
index a6aaf6d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Hebrew (עברית) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Rotem Liss
- * @ingroup Language
- */
-
-/**
- * Hebrew (עברית)
- *
- * @ingroup Language
- */
-class LanguageHe extends Language {
-
-       /**
-        * Convert grammar forms of words.
-        *
-        * Available cases:
-        * "prefixed" (or "תחילית") - when the word has a prefix
-        *
-        * @param string $word The word to convert
-        * @param string $case The case
-        *
-        * @return string
-        */
-       public function convertGrammar( $word, $case ) {
-               global $wgGrammarForms;
-               if ( isset( $wgGrammarForms['he'][$case][$word] ) ) {
-                       return $wgGrammarForms['he'][$case][$word];
-               }
-
-               switch ( $case ) {
-                       case 'prefixed':
-                       case 'תחילית':
-                               # Duplicate the "Waw" if prefixed, but not if it is already double.
-                               if ( substr( $word, 0, 2 ) === "ו" && substr( $word, 0, 4 ) !== "וו" ) {
-                                       $word = "ו" . $word;
-                               }
-
-                               # Remove the "He" article if prefixed.
-                               if ( substr( $word, 0, 2 ) === "ה" ) {
-                                       $word = substr( $word, 2 );
-                               }
-
-                               # Add a hyphen (maqaf) before non-Hebrew letters.
-                               if ( substr( $word, 0, 2 ) < "א" || substr( $word, 0, 2 ) > "ת" ) {
-                                       $word = "־" . $word;
-                               }
-               }
-
-               return $word;
-       }
-}
index a2288d0..e8731dc 100644 (file)
@@ -96,44 +96,6 @@ class IuConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{Syllabic | Latin-} -or-
-        * -{code:text | code:text | ...}-
-        * update: delete all rule parsing because it's not used
-        * currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
-       /**
-        * Do not convert content on talk pages
-        *
-        * @param string $text
-        * @param Parser $parser
-        * @return string
-        */
-       function parserConvert( $text, &$parser ) {
-               $this->mDoContentConvert = !( is_object( $parser->getTitle() )
-                       && $parser->getTitle()->isTalkPage() );
-
-               return parent::parserConvert( $text, $parser );
-       }
-
        /**
         * A function wrapper:
         *   - if there is no selected variant, leave the link
index 548c9a0..3605e8d 100644 (file)
@@ -216,31 +216,6 @@ class KkConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{ekavian | iyekavian-} -or-
-        * -{code:text | code:text | ...}-
-        *
-        * update: delete all rule parsing because it's not used
-        *      currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
        /**
         * A function wrapper:
         *  - if there is no selected variant, leave the link
index 62de390..7b15721 100644 (file)
  * @ingroup Language
  */
 class LanguageRu extends Language {
-       /**
-        * Convert from the nominative form of a noun to some other case
-        * Invoked with {{grammar:case|word}}
-        *
-        * @param string $word
-        * @param string $case
-        * @return string
-        */
-       function convertGrammar( $word, $case ) {
-               global $wgGrammarForms;
-               if ( isset( $wgGrammarForms['ru'][$case][$word] ) ) {
-                       return $wgGrammarForms['ru'][$case][$word];
-               }
-
-               $grammarTransformations = $this->getGrammarTransformations();
-
-               if ( isset( $grammarTransformations[$case] ) ) {
-                       foreach ( array_values( $grammarTransformations[$case] ) as $rule ) {
-                               $form = $rule[0];
-
-                               if ( $form === '@metadata' ) {
-                                       continue;
-                               }
-
-                               $replacement = $rule[1];
-
-                               $regex = "/$form/";
-
-                               if ( preg_match( $regex, $word ) ) {
-                                       $word = preg_replace( $regex, $replacement, $word );
-
-                                       break;
-                               }
-                       }
-               }
-
-               return $word;
-       }
-
        /**
         * Four-digit number should be without group commas (spaces)
         * See manual of style at https://ru.wikipedia.org/wiki/Википедия:Оформление_статей
index 0de396d..36821b0 100644 (file)
@@ -72,44 +72,6 @@ class ShiConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{Tifinagh | Latin-} -or-
-        * -{code:text | code:text | ...}-
-        * update: delete all rule parsing because it's not used
-        * currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
-       /**
-        * Do not convert content on talk pages
-        *
-        * @param string $text
-        * @param Parser $parser
-        * @return string
-        */
-       function parserConvert( $text, &$parser ) {
-               $this->mDoContentConvert = !( is_object( $parser->getTitle() )
-                       && $parser->getTitle()->isTalkPage() );
-
-               return parent::parserConvert( $text, $parser );
-       }
-
        /**
         * A function wrapper:
         *   - if there is no selected variant, leave the link
index 886ee94..6491f55 100644 (file)
@@ -75,31 +75,6 @@ class SrConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{ekavian | iyekavian-} -or-
-        * -{code:text | code:text | ...}-
-        *
-        * update: delete all rule parsing because it's not used
-        * currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
        /**
         * A function wrapper:
         *   - if there is no selected variant, leave the link
index 72bde40..a155d03 100644 (file)
  * @ingroup Language
  */
 class LanguageUk extends Language {
-
-       /**
-        * Convert from the nominative form of a noun to some other case
-        * Invoked with {{grammar:case|word}}
-        *
-        * @param string $word
-        * @param string $case
-        * @return string
-        */
-       function convertGrammar( $word, $case ) {
-               global $wgGrammarForms;
-               if ( isset( $wgGrammarForms['uk'][$case][$word] ) ) {
-                       return $wgGrammarForms['uk'][$case][$word];
-               }
-
-               # These rules don't cover the whole language.
-               # They are used only for site names.
-
-               # join and array_slice instead mb_substr
-               $ar = [];
-               preg_match_all( '/./us', $word, $ar );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
-                       switch ( $case ) {
-                               case 'genitive': # родовий відмінок
-                                       if ( implode( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'ії';
-                                       } elseif ( implode( '', array_slice( $ar[0], -2 ) ) === 'ти' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'т';
-                                       } elseif ( implode( '', array_slice( $ar[0], -2 ) ) === 'ди' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
-                                       } elseif ( implode( '', array_slice( $ar[0], -3 ) ) === 'ник' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
-                                       }
-                                       break;
-                               case 'accusative': # знахідний відмінок
-                                       if ( implode( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
-                                       }
-                                       break;
-                       }
-               }
-               return $word;
-       }
-
        /**
         * Ukrainian numeric format is "12 345,67" but "1234,56"
         *
index a15d910..a3cd622 100644 (file)
@@ -542,7 +542,6 @@ public static $zh2Hant = [
 '帼' => '幗',
 '幂' => '冪',
 '并' => '並',
-'幺' => '么',
 '广' => '廣',
 '庄' => '莊',
 '庆' => '慶',
@@ -3110,7 +3109,6 @@ public static $zh2Hant = [
 '一干部下' => '一干部下',
 '一年' => '一年',
 '一年里' => '一年裡',
-'一别头' => '一彆頭',
 '一斗斗' => '一斗斗',
 '一树百获' => '一樹百穫',
 '一准' => '一準',
@@ -3162,6 +3160,7 @@ public static $zh2Hant = [
 '上梁山' => '上梁山',
 '上梁' => '上樑',
 '上台面' => '上檯面',
+'上签了' => '上簽了',
 '上签名' => '上簽名',
 '上签字' => '上簽字',
 '上签定' => '上簽定',
@@ -3179,6 +3178,7 @@ public static $zh2Hant = [
 '下于' => '下於',
 '下梁' => '下樑',
 '下注解' => '下注解',
+'下签了' => '下簽了',
 '下签名' => '下簽名',
 '下签字' => '下簽字',
 '下签定' => '下簽定',
@@ -3255,6 +3255,7 @@ public static $zh2Hant = [
 '中庄子' => '中庄子',
 '中文里' => '中文裡',
 '中于' => '中於',
+'中签了' => '中簽了',
 '中签名' => '中簽名',
 '中签字' => '中簽字',
 '中签定' => '中簽定',
@@ -3287,20 +3288,34 @@ public static $zh2Hant = [
 '主钟差' => '主鐘差',
 '主钟曲线' => '主鐘曲線',
 '乃系' => '乃係',
-'么么唱唱' => '么么唱唱',
 '么九' => '么九',
-'么儿' => '么兒',
+'么二三' => '么二三',
+'么元' => '么元',
+'么兒' => '么兒',
 '么半' => '么半',
+'么叔' => '么叔',
 '么喝' => '么喝',
 '么女' => '么女',
 '么妹' => '么妹',
+'么姓' => '么姓',
+'么姨' => '么姨',
+'么娘' => '么娘',
+'么媽' => '么媽',
+'么孃' => '么孃',
 '么子' => '么子',
+'么小' => '么小',
 '么弟' => '么弟',
 '么正' => '么正',
-'么爷' => '么爺',
+'么氏' => '么氏',
+'么爸' => '么爸',
+'么爹' => '么爹',
+'么爺' => '么爺',
+'么篇' => '么篇',
+'么舅' => '么舅',
+'么蛾子' => '么蛾子',
 '么雞' => '么雞',
-'么么小丑' => '么麼小丑',
-'么麼小丑' => '么麼小丑',
+'么鳳' => '么鳳',
+'么麼' => '么麼',
 '之一只' => '之一只',
 '之二只' => '之二只',
 '之八九只' => '之八九只',
@@ -3342,7 +3357,6 @@ public static $zh2Hant = [
 '干嚎' => '乾嚎',
 '干回付' => '乾回付',
 '干圆洁净' => '乾圓潔淨',
-'干地' => '乾地',
 '干坞' => '乾塢',
 '干女' => '乾女',
 '干奴才' => '乾奴才',
@@ -4124,11 +4138,12 @@ public static $zh2Hant = [
 '划過' => '划過',
 '划龍舟' => '划龍舟',
 '划龙舟' => '划龍舟',
+'划龍船' => '划龍船',
+'划龙船' => '划龍船',
 '判断发' => '判斷發',
 '别辟' => '別闢',
 '利欲' => '利慾',
 '利于' => '利於',
-'刮来刮去' => '刮來刮去',
 '刮起来' => '刮起來',
 '刮胡' => '刮鬍',
 '到山里' => '到山裡',
@@ -4430,7 +4445,6 @@ public static $zh2Hant = [
 '吸干' => '吸乾',
 '吹干' => '吹乾',
 '吹发' => '吹髮',
-'吹胡' => '吹鬍',
 '吾为之范我驰驱' => '吾爲之範我馳驅',
 '吕后' => '呂后',
 '呂后' => '呂后',
@@ -4460,6 +4474,8 @@ public static $zh2Hant = [
 '哀挽' => '哀輓',
 '品鉴' => '品鑑',
 '哄堂大笑' => '哄堂大笑',
+'哈啰喂' => '哈囉喂',
+'哈囉喂' => '哈囉喂',
 '員山庄' => '員山庄',
 '哪里' => '哪裡',
 '唁吊' => '唁弔',
@@ -4483,7 +4499,6 @@ public static $zh2Hant = [
 '喂!' => '喂!',
 '喂,' => '喂,',
 '善于' => '善於',
-'喜向往' => '喜向往',
 '喜欢表' => '喜歡錶',
 '喜欢钟' => '喜歡鐘',
 '喜欢钟表' => '喜歡鐘錶',
@@ -4494,6 +4509,8 @@ public static $zh2Hant = [
 '乔岳' => '喬嶽',
 '单于' => '單于',
 '單于' => '單于',
+'单向' => '單向',
+'單向' => '單向',
 '单单于' => '單單於',
 '单干' => '單幹',
 '单打独斗' => '單打獨鬥',
@@ -4583,7 +4600,6 @@ public static $zh2Hant = [
 '在于' => '在於',
 '地图里' => '地圖裡',
 '地心历表' => '地心曆表',
-'地方志' => '地方志',
 '地志' => '地誌',
 '地丑德齐' => '地醜德齊',
 '坏于' => '坏於',
@@ -4722,7 +4738,6 @@ public static $zh2Hant = [
 '天后宫' => '天后宮',
 '天地志狼' => '天地志狼',
 '天地为范' => '天地為範',
-'天干地支' => '天干地支',
 '天后来' => '天後來',
 '天后半' => '天後半',
 '天后天' => '天後天',
@@ -4777,6 +4792,7 @@ public static $zh2Hant = [
 '妖气冲天' => '妖氣衝天',
 '妆台' => '妝檯',
 '始于' => '始於',
+'姓么' => '姓么',
 '委托' => '委託',
 '委托书' => '委託書',
 '奸夫' => '姦夫',
@@ -4866,7 +4882,6 @@ public static $zh2Hant = [
 '封為后' => '封為后',
 '封面里' => '封面裡',
 '射雕' => '射鵰',
-'专向往' => '專向往',
 '专辑里' => '專輯裡',
 '尊后' => '尊后',
 '对不准' => '對不準',
@@ -4947,6 +4962,7 @@ public static $zh2Hant = [
 '山里的' => '山裡的',
 '山谷' => '山谷',
 '山重水复' => '山重水複',
+'岩松了' => '岩松了',
 '岫岩' => '岫巖',
 '岱岳' => '岱嶽',
 '峇里海' => '峇里海',
@@ -4987,6 +5003,7 @@ public static $zh2Hant = [
 '已占卜' => '已占卜',
 '已占算' => '已占算',
 '巴尔干' => '巴爾幹',
+'巴而术' => '巴而朮',
 '巷里' => '巷裡',
 '市里的' => '市裡的',
 '布谷' => '布穀',
@@ -5011,6 +5028,7 @@ public static $zh2Hant = [
 '年代里' => '年代裡',
 '年历' => '年曆',
 '年历史' => '年歷史',
+'年历次' => '年歷次',
 '年谷' => '年穀',
 '年里' => '年裡',
 '年鉴' => '年鑑',
@@ -5166,8 +5184,6 @@ public static $zh2Hant = [
 '强奸' => '強姦',
 '强干' => '強幹',
 '强于' => '強於',
-'别口气' => '彆口氣',
-'别强' => '彆強',
 '别扭' => '彆扭',
 '别拗' => '彆拗',
 '别气' => '彆氣',
@@ -5403,6 +5419,7 @@ public static $zh2Hant = [
 '怠于' => '怠於',
 '急于' => '急於',
 '急冲而下' => '急衝而下',
+'性别扭曲' => '性別扭曲',
 '性征' => '性徵',
 '性欲' => '性慾',
 '怨气冲天' => '怨氣衝天',
@@ -5573,7 +5590,6 @@ public static $zh2Hant = [
 '抓奸' => '抓姦',
 '抓斗' => '抓鬥',
 '抗御' => '抗禦',
-'折向往' => '折向往',
 '折子戏' => '折子戲',
 '折子戲' => '折子戲',
 '折戟沈河' => '折戟沈河',
@@ -5682,6 +5698,7 @@ public static $zh2Hant = [
 '卷款' => '捲款',
 '卷毛' => '捲毛',
 '卷烟盒' => '捲煙盒',
+'卷瓣' => '捲瓣',
 '卷积云' => '捲積雲',
 '卷筒' => '捲筒',
 '卷帘' => '捲簾',
@@ -5927,10 +5944,8 @@ public static $zh2Hant = [
 '断发' => '斷髮',
 '断发文身' => '斷髮文身',
 '方便面' => '方便麵',
-'方向往' => '方向往',
-'方志恒' => '方志恒',
+'方向' => '方向',
 '方法里' => '方法裡',
-'方志' => '方誌',
 '于后' => '於後',
 '于征' => '於徵',
 '于海上' => '於海上',
@@ -6071,6 +6086,7 @@ public static $zh2Hant = [
 '本庄' => '本庄',
 '本征' => '本徵',
 '本出戏' => '本齣戲',
+'术虎高' => '朮虎高',
 '术赤' => '朮赤',
 '朱庆余' => '朱慶餘',
 '朱理安历' => '朱理安曆',
@@ -6625,6 +6641,7 @@ public static $zh2Hant = [
 '煮面' => '煮麵',
 '熊杰' => '熊杰',
 '荧郁' => '熒鬱',
+'熬制' => '熬製',
 '炖制' => '燉製',
 '燎发' => '燎髮',
 '烧干' => '燒乾',
@@ -6791,7 +6808,6 @@ public static $zh2Hant = [
 '白里透红' => '白裡透紅',
 '白面包青天' => '白面包青天',
 '白发' => '白髮',
-'白胡' => '白鬍',
 '白霉' => '白黴',
 '百个' => '百個',
 '百只可' => '百只可',
@@ -6836,7 +6852,6 @@ public static $zh2Hant = [
 '皮里阳秋' => '皮裡陽秋',
 '皮制' => '皮製',
 '皮松' => '皮鬆',
-'皱别' => '皺彆',
 '皱折' => '皺摺',
 '盆吊' => '盆弔',
 '盈余' => '盈餘',
@@ -7224,7 +7239,6 @@ public static $zh2Hant = [
 '编码表' => '編碼表',
 '编钟' => '編鐘',
 '编余' => '編餘',
-'编发' => '編髮',
 '缓征' => '緩徵',
 '缓冲' => '緩衝',
 '致密' => '緻密',
@@ -7272,6 +7286,7 @@ public static $zh2Hant = [
 '系紧' => '繫緊',
 '系绳' => '繫繩',
 '系累' => '繫纍',
+'系膜' => '繫膜',
 '系舟' => '繫舟',
 '系船' => '繫船',
 '系辞' => '繫辭',
@@ -7327,6 +7342,7 @@ public static $zh2Hant = [
 '耍斗' => '耍鬥',
 '耕获' => '耕穫',
 '耳余' => '耳餘',
+'耶律术烈' => '耶律朮烈',
 '耿于' => '耿於',
 '聊斋志异' => '聊齋志異',
 '圣人历' => '聖人曆',
@@ -7468,7 +7484,6 @@ public static $zh2Hant = [
 '艸木丰丰' => '艸木丰丰',
 '芒果干' => '芒果乾',
 '花不要采' => '花不要採',
-'花卷' => '花捲',
 '花盆里' => '花盆裡',
 '花菴词选' => '花菴詞選',
 '花药' => '花葯',
@@ -7512,6 +7527,7 @@ public static $zh2Hant = [
 '庄里' => '莊裡',
 '茎干' => '莖幹',
 '莜面' => '莜麵',
+'莪术' => '莪朮',
 '莽荡' => '莽蕩',
 '菜干' => '菜乾',
 '菜坛' => '菜罈',
@@ -7851,7 +7867,10 @@ public static $zh2Hant = [
 '西昆' => '西崑',
 '西岳' => '西嶽',
 '西历' => '西曆',
+'西历代' => '西歷代',
+'西历任' => '西歷任',
 '西历史' => '西歷史',
+'西历次' => '西歷次',
 '西湖里' => '西湖里',
 '西西里' => '西西里',
 '西谷米' => '西谷米',
@@ -8154,7 +8173,8 @@ public static $zh2Hant = [
 '轻松松' => '輕鬆鬆',
 '轮奸' => '輪姦',
 '轮回' => '輪迴',
-'转向往' => '轉向往',
+'轉向' => '轉向',
+'转向' => '轉向',
 '转托' => '轉託',
 '转斗千里' => '轉鬥千里',
 '辛丑' => '辛丑',
@@ -8627,7 +8647,6 @@ public static $zh2Hant = [
 '长发公主' => '長髮公主',
 '长发妹' => '長髮妹',
 '长发姑娘' => '長髮姑娘',
-'长胡' => '長鬍',
 '门帘' => '門帘',
 '门吊儿' => '門弔兒',
 '门里' => '門裡',
@@ -8872,7 +8891,6 @@ public static $zh2Hant = [
 '台风后' => '颱風後',
 '刮了' => '颳了',
 '刮倒' => '颳倒',
-'刮去' => '颳去',
 '刮大风' => '颳大風',
 '刮得' => '颳得',
 '刮走' => '颳走',
@@ -13448,11 +13466,11 @@ public static $zh2Hans = [
 '乾,健也' => '乾,健也',
 '乾,天也' => '乾,天也',
 '五箇山' => '五箇山',
-'什么' => '什么',
 '仇讎' => '仇雠',
 '以微知著' => '以微知著',
 '仰屋著書' => '仰屋著书',
 '彷彿' => '仿佛',
+'伊東豊雄' => '伊东丰雄',
 '夥計' => '伙计',
 '佛頭著糞' => '佛头著粪',
 '偵蒐' => '侦搜',
@@ -13525,7 +13543,6 @@ public static $zh2Hans = [
 '覆核' => '复核',
 '覆检' => '复检',
 '復甦' => '复苏',
-'多么' => '多么',
 '大麴' => '大曲',
 '天道为乾' => '天道为乾',
 '天道為乾' => '天道为乾',
@@ -13556,13 +13573,12 @@ public static $zh2Hans = [
 '年陞' => '年升',
 '么九' => '幺九',
 '么二三' => '幺二三',
+'么兒' => '幺儿',
 '么元' => '幺元',
 '么鳳' => '幺凤',
 '么半' => '幺半',
-'么半群' => '幺半群',
-'么廝' => '幺厮',
-'幺厮' => '幺厮',
 '么叔' => '幺叔',
+'么喝' => '幺喝',
 '么女' => '幺女',
 '么媽' => '幺妈',
 '么妹' => '幺妹',
@@ -13570,22 +13586,20 @@ public static $zh2Hans = [
 '么姨' => '幺姨',
 '么娘' => '幺娘',
 '么孃' => '幺娘',
-'幺孃' => '幺娘',
 '么子' => '幺子',
 '么小' => '幺小',
 '么弟' => '幺弟',
 '么正' => '幺正',
 '么氏' => '幺氏',
+'么爺' => '幺爷',
 '么爸' => '幺爸',
 '么爹' => '幺爹',
 '么篇' => '幺篇',
 '么舅' => '幺舅',
 '么蛾子' => '幺蛾子',
-'么謙' => '幺谦',
+'么雞' => '幺鸡',
 '么麼' => '幺麽',
-'么麽' => '幺麽',
 '幺麽' => '幺麽',
-'么麽小丑' => '幺麽小丑',
 '慶餘' => '庆馀',
 '康乾' => '康乾',
 '张法乾' => '张法乾',
@@ -13594,7 +13608,6 @@ public static $zh2Hans = [
 '待覆' => '待复',
 '後姓' => '後姓',
 '慫慂' => '怂恿',
-'怎么' => '怎么',
 '恩威並著' => '恩威并著',
 '噁心' => '恶心',
 '情蒐' => '情搜',
@@ -13821,11 +13834,8 @@ public static $zh2Hans = [
 '躊躇滿志' => '踌躇滿志',
 '較著' => '较著',
 '近角聪信' => '近角聪信',
-'这么' => '这么',
 '造麴' => '造曲',
 '遺著' => '遗著',
-'那么' => '那么',
-'那麽' => '那麽',
 '郭子乾' => '郭子乾',
 '酒麴' => '酒曲',
 '醉瀋' => '醉渖',
@@ -13889,9 +13899,8 @@ public static $zh2Hans = [
 '鬱氏' => '鬱氏',
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
+'麼氏' => '麽氏',
 '麽氏' => '麽氏',
-'麼麼' => '麽麽',
-'麽麽' => '麽麽',
 '黃麴毒素' => '黄曲毒素',
 '黃潤乾' => '黄润乾',
 '黄润乾' => '黄润乾',
@@ -13940,6 +13949,7 @@ public static $zh2TW = [
 '落車' => '下車',
 '不來梅' => '不萊梅',
 '不来梅' => '不萊梅',
+'幺' => '么',
 '以太网' => '乙太網',
 '九杆' => '九桿',
 '了結他' => '了結他',
@@ -14723,6 +14733,7 @@ public static $zh2HK = [
 'C肝' => '丙肝',
 '并发布' => '並發佈',
 '中文里' => '中文裏',
+'幺' => '么',
 '乘著' => '乘着',
 '乘著作' => '乘著作',
 '乘著名' => '乘著名',
@@ -16589,7 +16600,7 @@ public static $zh2HK = [
 '著法' => '着法',
 '著涼' => '着涼',
 '著火' => '着火',
-'è\91\97ç\94\9a麽' => 'ç\9d\80ç\94\9a麽',
+'è\91\97ç\94\9a麼' => 'ç\9d\80ç\94\9a麼',
 '著眼' => '着眼',
 '著祂' => '着祂',
 '著筆' => '着筆',
@@ -18216,6 +18227,7 @@ public static $zh2CN = [
 '叫著稱' => '叫著称',
 '叫著者' => '叫著者',
 '叫著述' => '叫著述',
+'台北韓' => '台北韩',
 '桌上型電腦' => '台式电脑',
 '撞球' => '台球',
 '台帳' => '台账',
@@ -19420,8 +19432,8 @@ public static $zh2CN = [
 '著絲' => '着丝',
 '著麼' => '着么',
 '著人' => '着人',
-'著什麼' => '着什么',
-'è\91\97ç\94\9a麽' => '着什么',
+'著什' => '着什',
+'è\91\97ç\94\9a麼' => '着什么',
 '著他' => '着他',
 '著令' => '着令',
 '著位' => '着位',
@@ -20066,6 +20078,7 @@ public static $zh2CN = [
 '軟體' => '软件',
 '軟體動物' => '软体动物',
 '軟體家具' => '软体家具',
+'軟體生物' => '软体生物',
 '軟碟機' => '软驱',
 '載著' => '载着',
 '載著書' => '载著书',
diff --git a/languages/data/grammarTransformations/he.json b/languages/data/grammarTransformations/he.json
new file mode 100644 (file)
index 0000000..e127f8b
--- /dev/null
@@ -0,0 +1,26 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Rotem Liss",
+                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)"
+               ]
+       },
+       "prefixed": "תחילית",
+       "תחילית": [
+               [ "@metadata", [
+                       "comment", "הכפלת ו, מחיקת ה הידיעה, הוספת מקף"
+               ] ],
+               [
+                       "^(ו[^ו].+)$",
+                       "ו$1"
+               ],
+               [
+                       "^ה(.+)$",
+                       "$1"
+               ],
+               [
+                       "^([^א-ת].+)$",
+                       "־$1"
+               ]
+       ]
+}
diff --git a/languages/data/grammarTransformations/uk.json b/languages/data/grammarTransformations/uk.json
new file mode 100644 (file)
index 0000000..6512225
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gutsul",
+                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)"
+               ],
+               "comment": "These rules don't cover the whole grammar of the language, and are intended only for names of languages and Wikimedia projects."
+       },
+       "genitive": [
+               [ "(.+)ія$", "$1ії" ],
+               [ "(.+)ти$", "$1т" ],
+               [ "(.+)ди$", "$1дів" ],
+               [ "(.+)ник$", "$1ника" ]
+       ],
+       "accusative": [
+               [ "(.+)ія$", "$1ію" ]
+       ]
+}
index 4f0b535..9d10b51 100644 (file)
        "passwordreset-emaildisabled": "Tanda e-surat ka geupeumaté lam wiki nyoë",
        "passwordreset-username": "Ureueng ngui:",
        "passwordreset-domain": "Domain",
-       "passwordreset-capture": "Eu hasé surat-e?",
-       "passwordreset-capture-help": "Meunyoë droëneuh neuceuë kutak nyoë, e-surat (ngon narit rahsia siat) ka geupeuleumah keudroëneuh ngon geukirém cit keu ureuëng ngui",
        "passwordreset-email": "Alamat surat-e:",
        "passwordreset-emailtitle": "Teuneurang nan ureueng ngui bak {{SITENAME}}",
        "passwordreset-emailelement": "Nan ureuëng ngui: \n$1\n\nLageuëm rahsia sijamong: \n$2",
        "searchprofile-advanced-tooltip": "Mita bak ruweuëng nan meupat-pat",
        "search-result-size": "$1 ({{PLURAL:$2|1 narit|$2 narit}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})",
-       "search-redirect": "(peuninah $1)",
+       "search-redirect": "(geupupinah nibak $1)",
        "search-section": "(bideuëng $1)",
        "search-suggest": "Kadang meukeusud Droëneuh nakeuh: $1",
        "search-interwiki-caption": "Buët la’én",
        "prefs-rendering": "Seuneudeuh",
        "saveprefs": "Keubah",
        "prefs-editing": "Neuandam",
-       "rows": "Baréh:",
        "searchresultshead": "Mita",
        "stub-threshold-disabled": "Geupeumaté",
        "timezoneuseoffset": "La'én (peuteuntèe bidajih)",
        "userrights-groupsmember": "Anggèeta nibak:",
        "userrights-reason": "Dalèh:",
        "userrights-no-interwiki": "Droeneuh hana izin keu neuubah khut ureueng ngui bak wiki la'én.",
-       "userrights-notallowed": "Droeneuh hana izin keu neutamah atawa neupeugadöh khut ureueng ngui.",
        "userrights-changeable-col": "Kawan nyang jeut neugantoe",
        "userrights-unchangeable-col": "Kawan nyang han jeut neugantoe",
        "group": "Kawan:",
        "rcnotefrom": "Di yup nyoë nakeuh neuubah yôh <strong>$2</strong> (geupeudeuh trôh ‘an <strong>$1</strong> neuubah).",
        "rclistfrom": "Peudeuih neuubah barô yôh $3 $2 kön",
        "rcshowhideminor": "$1 andam bacut",
+       "rcshowhideminor-show": "Peuleumah",
        "rcshowhideminor-hide": "Peusom",
        "rcshowhidebots": "$1 bot",
        "rcshowhidebots-show": "Peuleumah",
+       "rcshowhidebots-hide": "Peusom",
        "rcshowhideliu": "$1 ureuëng ngui tamöng",
        "rcshowhideliu-hide": "Peusom",
        "rcshowhideanons": "$1 ureuëng ngui hana nan",
+       "rcshowhideanons-show": "Peuleumah",
        "rcshowhideanons-hide": "Peusom",
        "rcshowhidepatr": "$1 andam teurunda",
        "rcshowhidemine": "$1 atra lôn andam",
+       "rcshowhidemine-show": "Peuleumah",
        "rcshowhidemine-hide": "Peusom",
        "rclinks": "Peudeuih $1 neuubah barô lam $2 uroë nyoë<br />$3",
        "diff": "bida",
        "deleteotherreason": "Nyang la’én/choë la’én:",
        "deletereasonotherlist": "Choë la’én",
        "rollbacklink": "pulang",
+       "rollbacklinkcount": "peuriwang $1 {{PLURAL:$1|neuandam}}",
        "protectlogpage": "Log lindông",
        "protectedarticle": "peulindông \"[[$1]]\"",
        "modifiedarticleprotection": "Ubah tingkat lindông \"[[$1]]\"",
        "contributions": "Beuneuri {{GENDER:$1|ureuëng ngui}}",
        "contributions-title": "Beuneuri ureuëng ngui keu $1",
        "mycontris": "Beuneuri",
+       "anoncontribs": "Beuneuri",
        "contribsub2": "Keu {{GENDER:$3|$1}} ($2)",
        "uctop": "(jinoë)",
        "month": "Mula phôn buleuën (ngön sigohlomjih)",
        "thumbnail-more": "Peurayek",
        "thumbnail_error": "Salah bak peugöt gamba cut: $1",
        "importlogpage": "Log impor",
-       "tooltip-pt-userpage": "Laman ureuëng ngui droëneuh",
+       "tooltip-pt-userpage": "Mieng {{GENDER:|ureueng ngui Droeneuh}}",
        "tooltip-pt-mytalk": "Laman marit droëneuh",
-       "tooltip-pt-preferences": "Geunalak",
+       "tooltip-pt-preferences": "Atô",
        "tooltip-pt-watchlist": "Dapeuta laman nyang lônkalön",
        "tooltip-pt-mycontris": "Dapeuta beuneuri Droëneuh",
        "tooltip-pt-login": "Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.",
        "exif-software": "Software geungui",
        "exif-exifversion": "Versi Exif",
        "exif-colorspace": "Ruweuëng wareuna",
+       "exif-datetimeoriginal": "Uroe buleuen ngön watèe peugöt data",
        "exif-datetimedigitized": "Uroë buleuën ngön watèë digital",
        "exif-orientation-1": "Biasa",
        "namespacesall": "ban dum",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
        "logentry-delete-delete": "$1 {{GENDER:$2|geusampôh}} miëng $3",
        "logentry-newusers-create": "$1 {{GENDER:$2|geupeugöt}} akun ureuëng ngui",
-       "searchsuggest-search": "Mita",
+       "logentry-upload-upload": "$1 {{GENDER:$2|geupasoe}} $3",
+       "searchsuggest-search": "Mita {{SITENAME}}",
        "duration-seconds": "{{PLURAL:$1|deutik}}",
        "duration-minutes": "{{PLURAL:$1|minèt}}",
        "duration-hours": "{{PLURAL:$1|jeum}}",
index a905b3c..d435dbb 100644 (file)
        "passwordreset-emaildisabled": "E-posfunksies is afgeskakel op hierdie wiki.",
        "passwordreset-username": "Gebruiker:",
        "passwordreset-domain": "Domein:",
-       "passwordreset-capture": "Wys resulterende e-pos?",
-       "passwordreset-capture-help": "As u die boks merk, word die e-pos (met die tydelike wagwoord) aan u getoon en aan die gebruiker gestuur.",
        "passwordreset-email": "E-posadres:",
        "passwordreset-emailtitle": "Gebruiker se details op {{site name}}",
        "passwordreset-emailtext-ip": "Iemand, waarskynlik u vanaf die IP-adres $1, het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.\nDie volgende {{PLURAL:$3|gebruiker is|gebruikers is}} aan die e-posadres gekoppel:\n\n$2\n\n{{PLURAL:$3|Die tydelike wagwoord verval|Hierdie tydelike wagwoorde verval}} oor {{PLURAL:$5|een dag|$5 dae}}.\nMeld asseblief nou aan en wysig u wagwoord. As u dit nie versoek het nie, of as u die oorspronklike wagwoord nog ken en dit nie wil verander nie, ignoreer die berig en hou aan om u ou wagwoord te gebruik.",
        "userrights-reason": "Rede:",
        "userrights-no-interwiki": "U het nie toestemming om gebruikersregte op ander wiki's te verander nie.",
        "userrights-nodatabase": "Databasis $1 bestaan nie of is nie hier beskikbaar nie.",
-       "userrights-nologin": "U moet as 'n administrateur [[Special:UserLogin|aanmeld]] om gebruikersregte te kan toeken.",
-       "userrights-notallowed": "U het nie magtiging om gebruikersregte by te sit of weg te neem nie.",
        "userrights-changeable-col": "Groepe wat u kan verander",
        "userrights-unchangeable-col": "Groepe wat u nie kan verander nie",
        "userrights-conflict": "Konflik met gebruikersregte! Pas asseblief weer u wysigings toe.",
-       "userrights-removed-self": "U het u eie regte suksesvol verwyder. Gevolglik het u nie meer toegang tot hierdie bladsy nie.",
        "group": "Groep:",
        "group-user": "Gebruikers",
        "group-autoconfirmed": "Bevestigde gebruikers",
        "right-siteadmin": "Sluit en ontsluit die datbasis",
        "right-override-export-depth": "Eksporteer bladsye insluitend geskakelde bladsye tot 'n diepte van 5",
        "right-sendemail": "Stuur e-pos aan ander gebruikers",
-       "right-passwordreset": "Wys e-posse vir herstel van wagwoord",
        "newuserlogpage": "Logboek van nuwe gebruikers",
        "newuserlogpagetext": "Dit is 'n logboek van gebruikers wat onlangs ingeteken het.",
        "rightslog": "Gebruikersregtelogboek",
        "trackingcategories-disabled": "Kategorie is gedeaktiveer",
        "mailnologin": "Geen versendadres beskikbaar",
        "mailnologintext": "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in u [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te kan stuur.",
-       "emailuser": "Stuur e-pos na hierdie gebruiker",
+       "emailuser": "Stuur e-pos na dié gebruiker",
        "emailuser-title-target": "E-pos die {{GENDER:$1|gebruiker}}",
        "emailuser-title-notarget": "E-pos gebruiker",
        "emailpagetext": "As {{GENDER:$1|dié gebruiker}} 'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm 'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verskyn as die \"Van\"-adres van die pos. Dus sal die ontvanger kan terug antwoord.",
        "namespace_association": "Gekoppelde naamruimte",
        "tooltip-namespace_association": "Merk die boks om die besprekings- en onderwerpnaamruimte die by die geselekteerde naamruimte in te sluit",
        "blanknamespace": "(Hoof)",
-       "contributions": "{{GENDER:$1|Gebruikersbydraes}}",
+       "contributions": "{{GENDER:$1|Gebruikers­bydraes}}",
        "contributions-title": "$1 se bydraes",
        "mycontris": "Bydraes",
        "anoncontribs": "Bydraes",
        "specialpage-securitylevel-not-allowed-title": "Nie toegestaan",
        "cannotauth-not-allowed-title": "Geen toegang",
        "cannotauth-not-allowed": "U word nie toegelaat om die bladsy te gebruik nie",
-       "credentialsform-account": "Gebruikersnaam:",
-       "edit-error-short": "Fout: $1",
-       "edit-error-long": "Foute:\n\n$1"
+       "credentialsform-account": "Gebruikersnaam:"
 }
index e7e53b7..f3d19ec 100644 (file)
        "passwordreset-disabled": "S'ha desactivau o restablimiento de claus en ista wiki.",
        "passwordreset-username": "Nombre d'usuario:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Veyer o mensache resultant?",
-       "passwordreset-capture-help": "Si marca ista caixeta, se li amostrará o correu electronico (con a clau temporal) amás de ninviar-lo ta l'usuario.",
        "passwordreset-email": "Adreza de correu electronico:",
        "passwordreset-emailtitle": "Detalles d'a cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Belún (probablement vusté, dende l'adreza IP $1) ha demandau un recordatorio d'a información d'a suya cuenta en  {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:\n\n$2\n\n{{PLURAL:$3|Ista clau temporal circumducirá|Istas claus temporals circumducirán}} en {{PLURAL:$5|un día|$5 días}}. Habría de connectar-se agora y trigar una nueva clau. Si ista demanda no dimana de vusté, u ya se'n ha acordau d'a suya clau inicial y ya no deseya modificar-la, puet ignorar iste mensache y continar emplegando a suya viella clau.",
        "userrights-reason": "Razón:",
        "userrights-no-interwiki": "No tiene premiso ta editar os dreitos d'usuario en atras wikis.",
        "userrights-nodatabase": "A base de datos $1 no existe u no ye local.",
-       "userrights-nologin": "Ha d'[[Special:UserLogin|encetar una sesión]] con una cuenta d'almenistrador ta poder dar dreitos d'usuario.",
-       "userrights-notallowed": "A suya cuenta no tien permisos ta asignar u desasignar permisos d'usuario.",
        "userrights-changeable-col": "Grupos que puede cambiar",
        "userrights-unchangeable-col": "Collas que no puede cambiar",
        "group": "Colla:",
        "right-siteadmin": "Trancar y destrancar a base de datos",
        "right-override-export-depth": "Exporta pachinas que incluigan as enlazadas dica un fundaria de 5",
        "right-sendemail": "Ninviar un correu electronico a atros usuarios",
-       "right-passwordreset": "Veyer os correus electronicos de restabimiento de claus",
        "newuserlogpage": "Rechistro de nuevos usuarios",
        "newuserlogpagetext": "Isto ye un rechistro de creyación d'usuarios.",
        "rightslog": "Rechistro de cambios en os dreitos d'os usuarios",
        "booksources-search": "Mirar",
        "booksources-text": "Contino ye una lista de vinclos ta atros puestos an que venden libros nuevos y usatos, talment bi haiga más información sobre os libros que ye mirando.",
        "booksources-invalid-isbn": "O numero d'ISBN dato pareix que no ye conforme; comprebe si no bi ha garra error en copiar d'a fuent orichinal.",
+       "magiclink-tracking-rfc": "Pachinas que fan servir vinclos machicos RFC",
+       "magiclink-tracking-rfc-desc": "Ista pachina fa servir vinclos machicos de RFC. Se veiga [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
+       "magiclink-tracking-pmid": "Pachinas que fan servir vinclos machicos PMID",
+       "magiclink-tracking-pmid-desc": "Ista pachina fa servir vinclos machicos de PMID. Se veiga [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
+       "magiclink-tracking-isbn": "Pachinas que fan servir vinclos machicos d'ISBN",
+       "magiclink-tracking-isbn-desc": "Ista pachina fa servir vinclos machicos d'ISBN. Se veiga [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
        "specialloguserlabel": "Fedor:",
        "speciallogtitlelabel": "Obchectivo (titol u usuario):",
        "log": "Rechistros",
index e7415f5..2da2b7f 100644 (file)
        "missingarticle-rev": "(nīwung#: $1)",
        "internalerror": "Inweard wōh",
        "internalerror_info": "Inweard wōh: $1",
+       "internalerror-fatal-exception": "Wælgescead þæs cynn is \"$1\"",
        "filecopyerror": "Nē cūðe biwrītan þā ymelan \"$1\" tō \"$2\".",
        "filerenameerror": "Ne cūðe ednemnan ymelan \"$1\" tō \"$2\".",
        "filedeleteerror": "Ne cūðe forlēosan þā ymelan \"$1\".",
+       "directorycreateerror": "We ne mot scieppan ymbfeng \"$1\"",
        "filenotfound": "Ne cūðe findan ymelan \"$1\".",
        "formerror": "Wōh: ne cūðe cȳþþugewrit forþsendan.",
        "badarticleerror": "Þēos dǣd ne cann bēon gefremed on þissum tramete.",
        "prefs-rc": "Nīwa andwendunga",
        "prefs-watchlist": "Wæccgetæl",
        "saveprefs": "Hordian",
-       "rows": "Rǣwa:",
-       "columns": "Sȳla:",
        "searchresultshead": "Sōcn",
        "recentchangescount": "Hū mæniga adihtunga to īwenne gewunelīce:",
        "savedprefs": "Þīna foreberunga wurdon gehordod.",
index 6b042e4..d2d6a98 100644 (file)
@@ -69,7 +69,9 @@
                        "باسم",
                        "Moud hosny",
                        "ديفيد",
-                       "Super ninja2"
+                       "Super ninja2",
+                       "Mr. Ibrahem",
+                       "Aboulouei1"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "tog-enotifrevealaddr": "أظهر عنوان بريدي الإلكتروني في إشعارات البريد الإلكتروني",
        "tog-shownumberswatching": "اعرض عدد المستخدمين المراقبين",
        "tog-oldsig": "توقيعك الحالي:",
-       "tog-fancysig": "وضع الوصلة يدوياً واستعمال نص الويكي",
+       "tog-fancysig": "جعل التوقيع  مثل نص الويكي  (دون  وصلة تلقائية)",
        "tog-uselivepreview": "استعمال المعاينة المباشرة",
        "tog-forceeditsummary": "نبهني عند عدم إدخال ملخص تعديل",
        "tog-watchlisthideown": "أخف تعديلاتي من قائمة المراقبة",
        "tog-watchlisthidebots": "أخف تعديلات البوتات من قائمة المراقبة",
-       "tog-watchlisthideminor": "أخÙ\81 Ø§Ù\84تعدÙ\8aÙ\84ات Ø§Ù\84Ø·Ù\81Ù\8aÙ\81Ø© Ù\81Ù\8a قائمة المراقبة",
-       "tog-watchlisthideliu": "أخف تعديلات المستخدمين المسجلين في قائمة المراقبة",
+       "tog-watchlisthideminor": "أخÙ\81 Ø§Ù\84تعدÙ\8aÙ\84ات Ø§Ù\84Ø·Ù\81Ù\8aÙ\81Ø© Ù\85Ù\86 قائمة المراقبة",
+       "tog-watchlisthideliu": "أخف تعديلات المستخدمين المسجلين في قائمة المراقبة\n\n\nإخفاء التعديلات التي كتبها تسجيل الدخول للمستخدمين من قائمة المراقبة",
        "tog-watchlistreloadautomatically": "أعد تحميل قائمة المراقبة بصفة آلية حينما يتغير مرشح ما (يتطلب جافاسكربت)",
        "tog-watchlisthideanons": "أخف تعديلات المستخدمين المجهولين في قائمة المراقبة",
        "tog-watchlisthidepatrolled": "أخف التعديلات المراجعة في قائمة المراقبة",
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
-       "tog-norollbackdiff": "عدم إظهار الاختلافات بعد تنفيذ التراجع",
+       "tog-norollbackdiff": "لا تظهر الفروق بعد إجراء التراجع",
        "tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
        "tog-prefershttps": "دائما استخدم اتصالا آمنا عند تسجيل الدخول",
        "underline-always": "دائما",
        "oct": "تشرين الأول",
        "nov": "تشرين الثاني",
        "dec": "كانون الأول",
-       "january-date": "Ù\83اÙ\86Ù\88Ù\86 Ø§Ù\84ثاÙ\86Ù\8a\8aÙ\86اÙ\8aر $1",
-       "february-date": "شباط/فبراير $1",
-       "march-date": "آذار/مارس $1",
-       "april-date": "نيسان/أبريل $1",
-       "may-date": "أيار/مايو $1",
-       "june-date": "حزيران/يونيو $1",
-       "july-date": "تموز/يوليو $1",
-       "august-date": "آب/أغسطس $1",
-       "september-date": "Ø£Ù\8aÙ\84Ù\88Ù\84/سبتÙ\85بر $1",
-       "october-date": "تشرÙ\8aÙ\86 Ø§Ù\84Ø£Ù\88Ù\84/Ø£Ù\83تÙ\88بر $1",
-       "november-date": "تشرين الثاني/نوفمبر $1",
-       "december-date": "كانون الأول/ديسمبر $1",
+       "january-date": "Ù\8aÙ\86اÙ\8aر/Ù\83اÙ\86Ù\88Ù\86 Ø§Ù\84ثاÙ\86Ù\8a $1",
+       "february-date": "فبراير/شباط $1",
+       "march-date": "مارس/آذار $1",
+       "april-date": "أبريل/نيسان $1",
+       "may-date": "مايو/أيار $1",
+       "june-date": "يونيو/حزيران $1",
+       "july-date": "يوليو/تموز $1",
+       "august-date": "أغسطس/آب $1",
+       "september-date": "سبتÙ\85بر/Ø£Ù\8aÙ\84Ù\88Ù\84 $1",
+       "october-date": "Ø£Ù\83تÙ\88بر/تشرÙ\8aÙ\86 Ø§Ù\84Ø£Ù\88Ù\84 $1",
+       "november-date": "نوفمبر/تشرين الثاني $1",
+       "december-date": "ديسمبر/كانون الأول $1",
        "period-am": "صباحًا",
        "period-pm": "مساءً",
        "pagecategories": "{{PLURAL:$1|بلا تصنيف|تصنيف|تصنيفان|تصنيفات}}",
        "go": "اذهب",
        "searcharticle": "اذهب",
        "history": "تاريخ الصفحة",
-       "history_short": "تاريخ",
+       "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": "طالع صفحة المشروع",
        "aboutsite": "عن {{SITENAME}}",
        "aboutpage": "Project:عن",
        "copyright": "المحتوى منشور وفق $1 إن لم يرد خلاف ذلك.",
-       "copyrightpage": "{{ns:project}}:حقوق النسخ",
+       "copyrightpage": "{{ns:project}}:حقوق التأليف و النشر",
        "currentevents": "الأحداث الجارية",
        "currentevents-url": "Project:الأحداث الجارية",
        "disclaimers": "إخلاء مسؤولية",
        "cannotcreateaccount-title": "لا يمكن إنشاء الحسابات",
        "cannotcreateaccount-text": "إنشاء الحسابات المباشر غير مفعل على هذه الويكي.",
        "yourdomainname": "نطاقك:",
-       "password-change-forbidden": "أنت لا يمكنك تغيير كلمات السر على هذا الويكي.",
+       "password-change-forbidden": "لا يمكنك تغيير كلمات السر على هذا الويكي.",
        "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
        "login": "تسجيل الدخول",
        "login-security": "توكيد هويتك",
        "userloginnocreate": "تسجيل الدخول",
        "logout": "تسجيل الخروج",
        "userlogout": "اخرج",
-       "notloggedin": "غير مسجل الدخول",
+       "notloggedin": "غير مسجل للدخول",
        "userlogin-noaccount": "ليس لديك حساب؟",
        "userlogin-joinproject": "انضم إلى {{SITENAME}}",
        "nologin": "ليس لديك حساب؟ '''$1'''.",
        "passwordreset-emaildisabled": "تم تعطيل ميزات البريد الإلكتروني على هذه الويكي.",
        "passwordreset-username": "اسم المستخدم:",
        "passwordreset-domain": "النطاق:",
-       "passwordreset-capture": "أأعرض البريد الإلكتروني الناتج؟",
-       "passwordreset-capture-help": "إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.",
        "passwordreset-email": "عنوان البريد الإلكتروني:",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
        "passwordreset-emailtext-ip": "أحد ما (قد يكون أنت، من العنوان $1)  طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
        "passwordreset-emailelement": "اسم {{GENDER:$1\n|المستخدم|المستخدمة}}: \n$1\n\nكلمة السر المؤقتة: \n$2",
        "passwordreset-emailsentemail": "إذا كان هذا العنوان البريد مرتبط بحسابك، من ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
        "passwordreset-emailsentusername": "إذا كان هناك عنوان بريد إلكتروني مرتبط بهذا المستخدم، ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|رسالة|رسائل}} البريد الإلكتروني لضبط كلمة السر تم إرسالها. {{PLURAL:$1|اسم المستخدم وكلمة السر معروضان|قائمة أسماء المستخدمين وكلمات السر معروضة}} هنا.",
-       "passwordreset-emailerror-capture2": "إرسال بريد إلى {{GENDER:$2|المستخدم|المستخدمة}} فشل: $1 {{PLURAL:$3|اسم المستخدم وكلمة السر معروضان|قائمة أسماء المستخدمين وكلمات السر معروضة}} هنا.",
        "passwordreset-nocaller": "يجب أن يتم توفير مستدعي",
        "passwordreset-nosuchcaller": "المستدعي غير موجود: $1",
        "passwordreset-ignored": "إعادة ضبط كلمة السر لم تتم التعامل معها. ربما لا موفر تم ضبطه؟",
        "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «{{int:savearticle}}» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
        "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
        "missingcommentheader": "<strong>تنبيه:</strong>  لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
-       "summary-preview": "معاينة الملخص:",
-       "subject-preview": "معاينة للموضوع/العنوان:",
+       "summary-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عنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "autoblockedtext": "مُنِع عنوان آيبيك تلقائيا لأن مستخدما آخرا منعه $1 استخدمه.\nالسبب المعطى هو التالي:\n\n:''$2''\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"إرسال رسالة لهذا المستخدم\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "systemblockedtext": "اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه تلقائيا بواسطة ميدياويكي.\nالسبب المعطى هو:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* نهاية المنع: $6\n* المقصود بالمنع: $7\n\nعنوان الأيبي الحالي الخاص بك هو $3.\nمن فضلك ضمن كل التفاصيل بالأعلى في أي استعلام تقوم به.",
        "blockednoreason": "لا سبب معطى",
        "whitelistedittext": "يجب عليك $1 لتتمكن من تعديل الصفحات.",
        "confirmedittext": "يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصفحات.\nمن فضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تفضيلاتك]].",
        "search-interwiki-caption": "المشاريع الشقيقة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
+       "search-interwiki-more-results": "المزيد من النتائج",
        "search-relatedarticle": "مرتبطة",
        "searchrelated": "مرتبطة",
        "searchall": "الكل",
        "search-external": "بحث خارجي",
        "searchdisabled": "البحث في {{SITENAME}} معطل.\nيمكنك البحث من خلال جوجل في الوقت الحالي.\nلاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.",
        "search-error": "حدث خطأ ما أثناء البحث: $1",
+       "search-warning": "حدث خطأ أثناء البحث: $1",
        "preferences": "تفضيلات",
        "mypreferences": "تفضيلات",
        "prefs-edits": "عدد التعديلات:",
        "saveprefs": "احفظ",
        "restoreprefs": "استرجع كل الإعدادات الافتراضية",
        "prefs-editing": "التحرير",
-       "rows": "صفوف:",
-       "columns": "أعمدة:",
        "searchresultshead": "بحث",
        "stub-threshold": "الحد لتنسيق وصلة البذرة ($1):",
        "stub-threshold-sample-link": "عينة",
        "prefs-help-recentchangescount": "بما في ذلك أحدث التغييرات وتاريخ الصفحات والسجلات.",
        "prefs-help-watchlist-token2": "هذا هو المفتاح السري لتغذية الويب لقائمة مراقبتك.\nيمكن لأي شخص يعرفه أن يقرأ قائمة مراقبتك، ولذا لا تتشاركه مع أحد. [[Special:ResetTokens|انقر هنا إذا أردت إعادة ضبطه]].",
        "savedprefs": "تم حفظ تفضيلاتك.",
-       "savedrights": "حُفظت الصلاحيات الجديدة {{GENDER:$1|للمستخدم|للمستخدمة}} $1.",
+       "savedrights": "حُفظت المجموعات الجديدة {{GENDER:$1|للمستخدم|للمستخدمة}} $1.",
        "timezonelegend": "المنطقة الزمنية:",
        "localtime": "الوقت المحلي:",
        "timezoneuseserverdefault": "استخدام الويكي الافتراضي ($1)",
        "youremail": "البريد:",
        "username": "{{GENDER:$1|اسم المستخدم|اسم المستخدمة}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو|عضوة}} في {{PLURAL:$1|مجموعة|مجموعة|مجموعتي|مجموعات}}:",
+       "group-membership-link-with-expiry": "$1 (حتى $2)",
        "prefs-registration": "وقت التسجيل:",
        "yourrealname": "الاسم الحقيقي:",
        "yourlanguage": "اللغة:",
        "prefswarning-warning": "لقد أجريت تعديلات على تفضيلاتك، ولم تُحفَظ بعد.\nإذا غادرت هذه الصفحة دون أن تنقر على «$1» لن يتم تحديث تفضيلاتك.",
        "prefs-tabs-navigation-hint": "تلميح: يمكنك استخدام مفتاحي السهمين الأيمن والأيسر للتنقل بين الألسنة في قائمة الألسنة.",
        "userrights": "صلاحيات المستخدم",
-       "userrights-lookup-user": "أدÙ\90ر Ù\85جÙ\85Ù\88عات المستخدم",
+       "userrights-lookup-user": "اختÙ\8aار المستخدم",
        "userrights-user-editname": "أدخل اسم مستخدم:",
-       "editusergroup": "عدÙ\84 Ù\85جÙ\85Ù\88عات {{GENDER:$1|اÙ\84Ù\85ستخدÙ\85|اÙ\84Ù\85ستخدÙ\85Ø©}}",
+       "editusergroup": "تحÙ\85Ù\8aÙ\84 Ù\85جÙ\85Ù\88عات Ø§Ù\84Ù\85ستخدÙ\85",
        "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-nologin": "يجب عليك [[Special:UserLogin|تسجيل الدخول]] بحساب إداري لتعديل صلاحيات المستخدم.",
-       "userrights-notallowed": "ليس لديك إذن لإضافة أو إزالة صلاحيات المستخدمين.",
        "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": "تضارب في تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.",
-       "userrights-removed-self": "أزلت بنجاح صلاحياتك، ولن تتمكن من الوصول لهذه الصفحة مجددا.",
        "group": "المجموعة:",
        "group-user": "مستخدمون",
        "group-autoconfirmed": "مستخدمون مؤكدون تلقائيا",
        "right-siteadmin": "غلق ورفع غلق قاعدة البيانات",
        "right-override-export-depth": "تصدير الصفحات متضمنة الصفحات الموصولة حتى عمق 5",
        "right-sendemail": "إرسال رسائل بريد إلكتروني إلى مستخدمين آخرين",
-       "right-passwordreset": "عرض رسائل إعادة ضبط كلمات السر",
        "right-managechangetags": "إنشاء وتعطيل [[Special:Tags|الوسوم]]",
        "right-applychangetags": "تطبيق [[Special:Tags|الوسوم]]  مع التغييرات التي أجريتها.",
        "right-changetags": "إضافة وإزالة [[Special:Tags|وسوم]] في مراجعات ومدخلات سجل فردية",
        "action-upload_by_url": "رفع هذا الملف من عنوان مسار",
        "action-writeapi": "استخدام API الكتابة",
        "action-delete": "حذف هذه الصفحة",
-       "action-deleterevision": "حذف هذه المراجعة",
-       "action-deletedhistory": "رؤية تاريخ هذه الصفحة المحذوف",
+       "action-deleterevision": "حذف المراجعات",
+       "action-deletelogentry": "حذف مدخلات السجل",
+       "action-deletedhistory": "رؤية تاريخ الصفحات المحذوف",
+       "action-deletedtext": "رؤية تاريخ المراجعات المحذوف",
        "action-browsearchive": "البحث في الصفحات المحذوفة",
-       "action-undelete": "استرجاع هذه الصفحة",
-       "action-suppressrevision": "مراجعة واسترجاع هذه المراجعة المخفية",
+       "action-undelete": "استرجاع الصفحات",
+       "action-suppressrevision": "مراجعة واسترجاع المراجعات المخفية",
        "action-suppressionlog": "رؤية هذا السجل الخاص",
        "action-block": "منع هذا المستخدم من التعديل",
        "action-protect": "تغيير مستويات الحماية لهذه الصفحة",
        "action-userrights-interwiki": "تعديل صلاحيات المستخدم للمستخدمين في الويكيات الأخرى",
        "action-siteadmin": "غلق أو رفع غلق قاعدة البيانات",
        "action-sendemail": "إرسال رسائل بريد إلكتروني",
+       "action-editmyoptions": "تعديل تفضيلاتك",
        "action-editmywatchlist": "تعديل قائمة مراقبتك",
        "action-viewmywatchlist": "مشاهدة قائمة مراقبتك",
        "action-viewmyprivateinfo": "مشاهدة معلوماتك الخاصة",
        "recentchanges-legend-heading": "<strong>شرح:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
        "recentchanges-submit": "أظهر",
+       "rcfilters-activefilters": "المرشحات النشطة",
+       "rcfilters-restore-default-filters": "استرجاع المرشحات الافتراضية",
+       "rcfilters-clear-all-filters": "مسح كل المرشحات",
+       "rcfilters-search-placeholder": "رشح أحدث التغييرات (تصفح أو ابدأ الكتابة)",
+       "rcfilters-invalid-filter": "مرشح غير صحيح",
+       "rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
+       "rcfilters-filterlist-title": "مرشحات",
+       "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
+       "rcfilters-filtergroup-registration": "تسجيل المستخدم",
+       "rcfilters-filter-registered-label": "مسجل",
+       "rcfilters-filter-registered-description": "المحررون مسجلو الدخول.",
+       "rcfilters-filter-unregistered-label": "غير مسجل",
+       "rcfilters-filter-unregistered-description": "المحررون غير مسجلي الدخول.",
+       "rcfilters-filtergroup-authorship": "ملكية التعديلات",
+       "rcfilters-filter-editsbyself-label": "تعديلاتك الشخصية",
+       "rcfilters-filter-editsbyself-description": "التعديلات بواسطتك.",
+       "rcfilters-filter-editsbyother-label": "التعديلات بواسطة الآخرين",
+       "rcfilters-filter-editsbyother-description": "التعديلات المنشأة بواسطة المستخدمين الآخرين (ليس أنت).",
+       "rcfilters-filtergroup-userExpLevel": "مستوى الخبرة (للمستخدمين المسجلين فقط)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "القادمون الجدد",
+       "rcfilters-filter-userExpLevel-newcomer-description": "أقل من 10 تعديلات و4 أيام من النشاط.",
+       "rcfilters-filter-userExpLevel-learner-label": "المتعلمون",
+       "rcfilters-filter-userExpLevel-learner-description": "المزيد من أيام النشاط والتعديلات أكثر من \"القادمين الجدد\" ولكن أقل من \"المستخدمين ذوي الخبرة\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "المستخدمون ذوو الخبرة",
+       "rcfilters-filter-userExpLevel-experienced-description": "أكثر من 30 يوما من النشاط و500 تعديل.",
+       "rcfilters-filtergroup-automated": "المساهمات الأوتوماتيكية",
+       "rcfilters-filter-bots-label": "بوت",
+       "rcfilters-filter-bots-description": "التعديلات بواسطة الأدوات الأوتوماتيكية.",
+       "rcfilters-filter-humans-label": "بشري (ليس بوت)",
+       "rcfilters-filter-humans-description": "التعديلات بواسطة المحررين البشريين.",
+       "rcfilters-filtergroup-significance": "الأهمية",
+       "rcfilters-filter-minor-label": "تعديلات طفيفة",
+       "rcfilters-filter-minor-description": "التعديلات التي علم عليها المستخدم كطفيفة.",
+       "rcfilters-filter-major-label": "التعديلات غير الطفيفة",
+       "rcfilters-filter-major-description": "التعديلات غير المعلم عليها كطفيفة.",
+       "rcfilters-filtergroup-changetype": "نوع التغيير",
+       "rcfilters-filter-pageedits-label": "تعديلات الصفحة",
+       "rcfilters-filter-pageedits-description": "التعديلات لمحتوى الويكي، النقاشات، وصوفات التصنيفات....",
+       "rcfilters-filter-newpages-label": "إنشاء الصفحات",
+       "rcfilters-filter-newpages-description": "التعديلات التي تصنع صفحات جديدة.",
+       "rcfilters-filter-categorization-label": "تغييرات التصنيفات",
+       "rcfilters-filter-categorization-description": "سجلات إضافة أو إزالة الصفحات من التصنيفات.",
+       "rcfilters-filter-logactions-label": "الأفعال المسجلة",
+       "rcfilters-filter-logactions-description": "الأفعال الإدارية، إنشاء الحسابات، حذف الصفحات، عمليات الرفع....",
        "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhidebots": "$1 البوتات",
        "rcshowhidebots-show": "أظهر",
        "rcshowhidebots-hide": "أخف",
-       "rcshowhideliu": "$1 {{GENDER:$1|مستخدمين مسجلين|مستخدمات مسجلات|مستخدمون مسجلون}}",
+       "rcshowhideliu": "$1 المستخدمين المسجلين",
        "rcshowhideliu-show": "أظهر",
        "rcshowhideliu-hide": "أخف",
        "rcshowhideanons": "$1 المستخدمين المجهولين",
        "uploaded-setting-handler-svg": "SVG الذي يضبط سمة \"handler\" مع خارجي/بيانات/سكريبت ممنوع. تم العثور على <code>$1=\"$2\"</code> في ملف SVG المرفوع.",
        "uploaded-remote-url-svg": "SVG الذي يضبط أي سمة شكل مع URL خارجي ممنوع. تم العثور على <code>$1=\"$2\"</code> في ملف SVG المرفوع.",
        "uploaded-image-filter-svg": "تم العثور على فلتر صورة مع URL: <code>&lt;$1 $2=\"$3\"&gt;</code> في ملف SVG المرفوع.",
-       "uploadscriptednamespace": "يحتوي ملف SVG هذا على اسم نطاق غير مشروع \" $1 \"",
+       "uploadscriptednamespace": "يحتوي ملف SVG هذا على اسم نطاق غير مشروع \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "تعذر تحليل XML في الملف المرفوع.",
        "uploadvirus": "الملف يحتوي على فيروس! التفاصيل: $1",
        "uploadjava": "يحتوي ملف ZIP هذا على ملفات جافا .class.\nلا يسمح برفع ملفات جافا لأنها تتيح تخطي القيود الأمنية.",
        "uncategorizedcategories": "تصنيفات غير مصنفة",
        "uncategorizedimages": "ملفات غير مصنفة",
        "uncategorizedtemplates": "قوالب غير مصنفة",
+       "uncategorized-categories-exceptionlist": " # يحتوي على قائمة بالتصنيفات، التي لا ينبغي أن تكون موجودة في Special:UncategorizedCategories. واحد لكل سطر، مع البدء ب \"*\". السطور التي تبدأ بحرف آخر (بما في ذلك الفراغ) سيتم تجاهلها. استخدم \"#\" للتعليقات.",
        "unusedcategories": "تصنيفات غير مستخدمة",
        "unusedimages": "ملفات غير مستخدمة",
        "wantedcategories": "تصنيفات مطلوبة",
        "apisandbox-sending-request": "إرسال طلب API ...",
        "apisandbox-loading-results": "استقبال طلبات API ...",
        "apisandbox-results-error": "حدث خطأ أثناء تحميل رد استعدلام الAPI: $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\"",
        "apisandbox-continue-clear": "إفراغ",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} س [https://www.mediawiki.org/wiki/API:Query#Continuing_queries يستمر] في الطلب الأخير؛ {{int:apisandbox-continue-clear}} سيفرغ المعاملات المرتبطة بالاستمرار.",
        "apisandbox-param-limit": "أدخل <kbd>max</kbd> لاستخدام الحد الأقصى.",
+       "apisandbox-multivalue-all-namespaces": "$1 (كل النطاقات)",
+       "apisandbox-multivalue-all-values": "$1 (كل القيم)",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "البحث عن مصادر الكتب",
        "booksources-isbn": "ردمك:",
        "booksources-search": "بحث",
        "booksources-text": "توجد أدناه قائمة بوصلات لمواقع أخرى تبيع الكتب الجديدة والمستعملة، أيضا يمكنك أن تحصل على معلومات إضافية عن الكتب التي تبحث عنها من هناك:",
        "booksources-invalid-isbn": "رقم ISBN المعطى لا يبدو صحيحا؛ تحقق من أخطاء النسخ من المصدر الأصلي.",
-       "magiclink-tracking-rfc": "الصفحات التي تستخدم الوصلات السحرية لRFC",
+       "magiclink-tracking-rfc": "الصفحات التي تستخدم وصلات RFC السحرية",
        "magiclink-tracking-rfc-desc": "هذه الصفحة تستخدم الوصلات السحرية لRFC. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
-       "magiclink-tracking-pmid": "الصفحات التي تستخدم الوصلات السحرية لPMID",
+       "magiclink-tracking-pmid": "الصفحات التي تستخدم وصلات PMID السحرية",
        "magiclink-tracking-pmid-desc": "هذه الصفحة تستخدم الوصلات السحرية لPMID. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
-       "magiclink-tracking-isbn": "الصفحات التي تستخدم الوصلات السحرية لISBN",
+       "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}}:اسم المستخدم للمستخدم):",
        "activeusers-count": "{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلا|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوما|$1 يوم}}",
        "activeusers-from": "اعرض المستخدمين ابتداء من:",
        "activeusers-groups": "عرض المستخدمين المنتمين للمجموعات:",
+       "activeusers-excludegroups": "استثن المستخدمين المنتمين للمجموعات:",
        "activeusers-noresult": "لم يعثر على أي مستخدمين",
        "activeusers-submit": "عرض المستخدمين النشطين",
        "listgrouprights": "صلاحيات مجموعات المستخدمين",
        "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:$2|بك}} سيتم إرساله مباشرة {{GENDER:$1|للمرسل الأصلي|للمرسلة الأصلية}}، مما يكشف عنوان البريد الإلكتروني الخاص {{GENDER:$2|بك}} {{GENDER:$1|لهم}}.",
        "usermessage-summary": "ترك رسالة نظام.",
        "usermessage-editor": "مراسل النظام",
        "watchlist": "قائمة مراقبتي",
        "confirm": "أكد",
        "excontent": "المحتوى كان: '$1'",
        "excontentauthor": "المحتوى كان: \"$1\" والمساهم الوحيد كان \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
-       "exbeforeblank": "المحتوى قبل الإفراغ كان: '$1'",
+       "exbeforeblank": "المحتوى قبل الإفراغ كان: \"$1\"",
        "delete-confirm": "حذف \"$1\"",
        "delete-legend": "حذف",
        "historywarning": "'''تنبيه:''' الصفحة التي تريد حذفها بها {{PLURAL:$1|نسخة|نسخة واحدة|نسختان|$1 نسخ|$1 نسخة}}. انظر",
        "changecontentmodel-emptymodels-title": "لا موديلات محتوى متوفرة",
        "changecontentmodel-emptymodels-text": "المحتوى على[[:$1]] لا يمكن تغييره لأي نوع.",
        "log-name-contentmodel": "سجل تغيير نموذج المحتوى",
-       "log-description-contentmodel": "الأحداث المرتبطة بنماذج المحتوى لصفحة",
+       "log-description-contentmodel": "هذه الصفحة تعرض التغييرات لموديل المحتوى للصفحات، والصفحات التي تم إنشاؤها بموديل محتوى يختلف عن الافتراضي",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|أنشأ|أنشأت}} الصفحة $3 باستخدام موديل محتوى غير قياسي \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|غير|غيرت}} موديل المحتوى للصفحة $3 من \"$4\" إلى \"$5\"",
        "logentry-contentmodel-change-revertlink": "استرجع",
        "modifiedarticleprotection": "غير مستوى حماية \"[[$1]]\"",
        "unprotectedarticle": "أزال الحماية من \"[[$1]]\"",
        "movedarticleprotection": "نقل إعدادات الحماية من \"[[$2]]\" إلى \"[[$1]]\"",
-       "protectedarticle-comment": "{{GENDER:$2|محمي}} \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|حمى}} \"[[$1]]\"",
        "modifiedarticleprotection-comment": "{{GENDER:$2|غير مستوى الحماية|غيرت مستوى الحماية}} ل\"[[$1]]\"",
        "unprotectedarticle-comment": "{{GENDER:$2|أزال الحماية|أزالت الحماية}} من \"[[$1]]\"",
        "protect-title": "ضبط حماية \"$1\"",
        "sorbs": "دي إن إس بي إل",
        "sorbsreason": "عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.",
        "sorbs_create_account_reason": "عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.\nلا يمكنك إنشاء حساب.",
+       "softblockrangesreason": "المساهمات بدون تسجيل الدخول غير مسموح بها من عنوان الأيبي الخاص بك ($1). من فضلك سجل الدخول.",
        "xffblockreason": "عنوان آي‌بي مذكور في ترويسة X-Forwarded-For، الذي ربما يخصّك أو يخصّ خادوما وسيطا تستخدمه، قد حُظِر. السبب الأصلي للحظر كان: $1",
        "cant-see-hidden-user": "المستخدم الذي تحاول منعه تم منعه سابقاً وإخفاؤه. بما أنك لا تمتلك صلاحية إخفاء المستخدم، لا يمكنك مشاهدة المنع أو تعديله.",
        "ipbblocked": "لا يمكنك منع أو رفع منع مستخدمين آخرين لأنك ممنوع",
        "cant-move-to-user-page": "أنت لا تمتلك الصلاحية لنقل صفحة إلى صفحة مستخدم (ماعدا إلى صفحة مستخدم فرعية).",
        "cant-move-category-page": "أنت لا تمتلك صلاحية نقل صفحات التصانيف.",
        "cant-move-to-category-page": "أنت لا تمتلك صلاحية نقل صفحة إلى صفحة تصنيف.",
+       "cant-move-subpages": "أنت لا تمتلك الصلاحية لنقل الصفحات الفرعية.",
+       "namespace-nosubpages": "النطاق \"$1\" لا يسمح بالصفحات الفرعية.",
        "newtitle": "عنوان جديد:",
        "move-watch": "راقب هذه الصفحة",
        "movepagebtn": "انقل الصفحة",
        "pageinfo-length": "حجم الصفحة (بالبايت)",
        "pageinfo-article-id": "معرف الصفحة (ID)",
        "pageinfo-language": "لغة محتوى الصفحة",
+       "pageinfo-language-change": "غير",
        "pageinfo-content-model": "نموذج محتوى الصفحة",
        "pageinfo-content-model-change": "تغيير",
        "pageinfo-robot-policy": "فهرسة الروبوتات",
        "htmlform-user-not-exists": "<strong>$1</strong> غير موجود",
        "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-event": "{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4",
        "logentry-delete-revision": "غيّر{{GENDER:$2||ت}} $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|غير|غيرت}} مستوى الحماية ل$3 $4 [مضمن]",
        "logentry-rights-rights": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية {{GENDER:$6|$3}} من $4 إلى $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3",
-       "logentry-rights-autopromote": "تمت تلقائيا ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
+       "logentry-rights-autopromote": "تمَ تلقائياً ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
        "logentry-upload-upload": " {{GENDER:$2|رفع|رفعت}} $1 $3",
        "logentry-upload-overwrite": "{{GENDER:$2|رفع|رفعت}} $1 نسخة جديدة من  $3",
        "logentry-upload-revert": "{{GENDER:$2|رفع|رفعت}} $1 $3",
        "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-useragent": "وكيل المستخدم:",
        "searchsuggest-search": "ابحث في {{SITENAME}}",
        "searchsuggest-containing": "يحتوي...",
-       "api-error-autoblocked": "عنوان الأيبي الخاص بك تم منعه تلقائيا، لأنه تم استخدامه بواسطة مستخدم ممنوع",
-       "api-error-badaccess-groups": "لا يسمح لك بتحميل الملفات إلى هذه الويكي.",
        "api-error-badtoken": "خطأ داخلي: رمز مميز غير صحيح.",
-       "api-error-blocked": "لقد منعت من التحرير.",
-       "api-error-copyuploaddisabled": "تم تعطيل تحميل من رابط على هذا الخادم.",
-       "api-error-duplicate": "هناك {{PLURAL:$1|ملف آخر|بعض الملفات الأخرى}} مسبقا على الموقع بنفس المحتوى.",
-       "api-error-duplicate-archive": "هناك {{PLURAL:$1|كان ملف آخر |كذلك بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
-       "api-error-empty-file": "كان ملف الذي قمت بإرسال فارغة.",
        "api-error-emptypage": "إنشاء صفحات فارغة جديدة، غير مسموح به.",
-       "api-error-fetchfileerror": "خطأ داخلي: قد حدث خطأ أثناء إحضار الملف.",
-       "api-error-fileexists-forbidden": "يوجد مسبقا ملف باسم \"$1\"، ولا يمكن استبداله.",
-       "api-error-fileexists-shared-forbidden": "يوجد مسبقا ملف باسم \"$1\" في مستودع الملفات المشتركة، ولا يمكن استبداله.",
-       "api-error-file-too-large": "الملف الذي أرسلته كان كبيرا جدا.",
-       "api-error-filename-tooshort": "اسم الملف قصير جدا.",
-       "api-error-filetype-banned": "نوع الملف هذا ممنوع.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ليس نوع ملف مسموح به|ليست أنواع ملفات مسموح بها}}. {{PLURAL:$3|نوع الملف المسموح به هو|أنواع الملفات المسموح بها هي}} $2.",
-       "api-error-filetype-missing": "يفتقد الملفّ ملحق نوعيّته.",
-       "api-error-hookaborted": "التعديل الذي تحاول أن تقوم به تم إحباطه",
-       "api-error-http": "خطأ داخلي: تعذر الاتصال بالخادم.",
-       "api-error-illegal-filename": "اسم الملف غير مسموح به.",
-       "api-error-internal-error": "خطأ داخلي: حدث خطأ عند معالجة التحميل الخاص بك على الويكي.",
-       "api-error-invalid-file-key": "خطأ داخلي: لم يتم العثور على الملف في التخزين المؤقت.",
-       "api-error-missingparam": "خطأ داخلي : متغيرات مفقودة ضمن الطلب.",
-       "api-error-missingresult": "خطأ داخلي : لا يمكن التحديد ما إذا كان النسخ ناجحاً.",
-       "api-error-mustbeloggedin": "يجب أن تكون مسجلا في لتحميل الملفات.",
-       "api-error-mustbeposted": "خطأ داخلي: الطلب يتطلب HTTP POST.",
-       "api-error-noimageinfo": "نجح التحميل، ولكن الخادم لم يقدم لنا أي معلومات حول الملف.",
-       "api-error-nomodule": "خطأ داخلي: لم يتم تعيين تحميل الوحدة النمطية.",
-       "api-error-ok-but-empty": "خطأ داخلي : لم يكن هناك استجابة من الملقم.",
-       "api-error-overwrite": "لا يسمح بالكتابة فوق ملف موجود.",
-       "api-error-ratelimited": "أنت تحاول رفع الكثير من الملفات في فترة زمنية قصيرة أقصر مما تسمح به هذه الويكي.\nمن فضلك حاول مرة ثانية خلال عدة دقائق.",
-       "api-error-stashfailed": "خطأ داخلي: فشل الملقم في تخزين الملفات المؤقتة.",
        "api-error-publishfailed": "خطأ داخلي: لم ينجح الخادوم في نشر ملف مؤقت",
-       "api-error-stasherror": "حدث خطأ أثناء رفع الملف لتخزينه.",
-       "api-error-stashedfilenotfound": "لم يعثر على الملف المحجوب عند محاولة رفعه من الحجب.",
-       "api-error-stashpathinvalid": "وكان الطريق الذي يجب أن يتم العثور على ملف مخبئ غير صالح.",
-       "api-error-stashfilestorage": "حدث خطأ أثناء رفع الملف لتخزينه.",
-       "api-error-stashzerolength": "لا يمكن أن خادم تخبئة الملف، لأنه يحتوي على طول صفري.",
-       "api-error-stashnotloggedin": "يجب عليك تسجيل الدخول لحفظ الملفات في مرفوعاتك.",
-       "api-error-stashwrongowner": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك ليس لك.",
-       "api-error-stashnosuchfilekey": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك غير موجود.",
-       "api-error-timeout": "لم يستجب الملقم في الوقت المتوقع.",
-       "api-error-unclassified": "حدث خطأ غير معروف",
-       "api-error-unknown-code": "خطأ غير معروف: \"$1\"",
-       "api-error-unknown-error": "خطأ داخلي: قد حدث خطأ عند محاولة تحميل الملف الخاص بك.",
-       "api-error-unknown-warning": "تحذير غير معروف: \"$1\"",
+       "api-error-stashfailed": "خطأ داخلي: فشل الملقم في تخزين الملفات المؤقتة.",
+       "api-error-unknown-warning": "تحذير غير معروف: \"$1\".",
        "api-error-unknownerror": "خطأ غير معروف: \"$1\"",
-       "api-error-uploaddisabled": "تم تعطيل الرفع على هذه الويكي.",
-       "api-error-verification-error": "هذا الملف قد يكون معطوباً أو يحتوي على امتداد غير صحيح.",
-       "api-error-was-deleted": "تم رفع ملف بهذا الاسم سابقا ثم تم حذفه بعد هذا.",
        "duration-seconds": "{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}",
        "duration-minutes": "{{PLURAL:$1|أقل من دقيقة|دقيقة واحدة|دقيقتان|$1 دقائق|$1 دقيقة}}",
        "duration-hours": "({{PLURAL:$1||ساعة واحدة|ساعتان|$1 ساعات|$1 ساعة}})",
        "pagelang-language": "اللغة",
        "pagelang-use-default": "استخدام اللغة الافتراضية",
        "pagelang-select-lang": "اختر اللغة",
+       "pagelang-reason": "السبب",
        "pagelang-submit": "إرسال",
+       "pagelang-nonexistent-page": "الصفحة $1 غير موجودة.",
+       "pagelang-unchanged-language": "الصفحة $1 مضبوطة فعلا للغة $2.",
+       "pagelang-unchanged-language-default": "الصفحة $1 مضبوطة فعلا للغة المحتوى الافتراضية الخاصة بالويكي.",
+       "pagelang-db-failed": "قاعدة البيانات فشلت في تغيير لغة الصفحة.",
        "right-pagelang": "تغيير لغة الصفحة",
        "action-pagelang": "تغيير لغة الصفحة",
        "log-name-pagelang": "سجل تغيير اللغة",
        "special-characters-title-emdash": "واصلة طويلة",
        "special-characters-title-minus": "علامة الطرح",
        "mw-widgets-dateinput-no-date": "لا تاريخ تم اختياره",
+       "mw-widgets-mediasearch-input-placeholder": "البحث عن ملفات",
+       "mw-widgets-mediasearch-noresults": "لم يتم العثور على نتائج.",
        "mw-widgets-titleinput-description-new-page": "الصفحة غير موجودة بعد",
        "mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "أضف تصنيفا...",
+       "mw-widgets-usersmultiselect-placeholder": "أضف المزيد...",
        "sessionmanager-tie": "لا يمكن جمع أنواع استيثاق متعددة: $1.",
        "sessionprovider-generic": "جلسات $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
        "log-action-filter-newusers": "نوع إنشاء الحساب:",
        "log-action-filter-patrol": "نوع الخفر:",
        "log-action-filter-protect": "نوع الحماية:",
-       "log-action-filter-rights": "نوع تغيير الصلاحية",
+       "log-action-filter-rights": "نوع تغيير الصلاحية:",
        "log-action-filter-suppress": "نوع الإخفاء:",
        "log-action-filter-upload": "نوع الرفع:",
        "log-action-filter-all": "الكل",
        "log-action-filter-block-reblock": "منع التعديل",
        "log-action-filter-block-unblock": "رفع المنع",
        "log-action-filter-contentmodel-change": "تغيير موديل المحتوى",
-       "log-action-filter-contentmodel-new": "إنشاء صفحة بموديل محتوى غير قياسي",
+       "log-action-filter-contentmodel-new": "إنشاء صفحة بموديل محتوى غير افتراضي",
        "log-action-filter-delete-delete": "حذف الصفحات",
+       "log-action-filter-delete-delete_redir": "إعادة الكتابة فوق التحويلة",
        "log-action-filter-delete-restore": "استرجاع الصفحات",
        "log-action-filter-delete-event": "حذف السجلات",
        "log-action-filter-delete-revision": "حذف المراجعات",
        "usercssispublic": "من فضل لاحظ: صفحات الCSS الفرعية لا ينبغي أن تحتوي على بيانات سرية بما أنها يمكن رؤيتها بواسطة المستخدمين الآخرين.",
        "restrictionsfield-badip": "عنوان أيبي أو نطاق غير صحيح: $1",
        "restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
-       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "خطأ: $1",
-       "edit-error-long": "الأخطاء:\n\n$1"
+       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "المراجعة $1",
+       "pageid": "معرف الصفحة $1"
 }
index dd96161..44b0f68 100644 (file)
@@ -7,11 +7,12 @@
                        "Lin linao",
                        "Poquil",
                        "Remember the dot",
-                       "아라"
+                       "아라",
+                       "Angel sm"
                ]
        },
        "tog-underline": "Miñcewirilpe lasun",
-       "tog-showtoolbar": "Pengelün kümeelün ñi chemkün",
+       "tog-showtoolbar": "Pengelün kümeelkünun ñi chemkün",
        "tog-editondblclick": "Wirin pakina epu klik mew",
        "underline-always": "Rumel",
        "underline-never": "Turpu",
@@ -89,7 +90,7 @@
        "and": "&#32;ka",
        "qbfind": "Kintupe",
        "qbbrowse": "Kintun",
-       "qbedit": "Pepikape",
+       "qbedit": "Kümelkünun",
        "qbpageoptions": "Tüfachi wülngiñ",
        "qbmyoptions": "tañi nütramkawe",
        "faq": "Rumelfemkelu ramtun",
        "permalink": "Mülekalelu lasun",
        "print": "Wirinentupe",
        "view": "Pen",
-       "edit": "Kümeelün",
+       "edit": "Kümelkünun",
        "create": "Dewman",
-       "editthispage": "Wirin tüfachi wülngiñ",
+       "editthispage": "Kümelkünufinge tüfachi wirin zungu",
        "create-this-page": "Llitun tüfachi pakina",
        "delete": "Liftun",
        "deletethispage": "Ñamümün tüfachi pakina",
        "currentevents-url": "Project:Fantepu chemkün",
        "disclaimers": "Tukuldungun ñi pin ley",
        "disclaimerpage": "Project:Katrütuwün ñi llowdüngun",
-       "edithelp": "Kellü wirin",
-       "mainpage": "Ñidol Wülngiñ",
+       "edithelp": "Kellun kümeelkünuam",
+       "mainpage": "Ñizol Wvbgiñ",
        "mainpage-description": "Ñidol Wülngiñ",
        "portal": "Lofche ñi wülngiñ",
        "portal-url": "Project:Lofche ñi wülngiñ",
        "youhavenewmessages": "Nieymi $1 ($2).",
        "newmessagesdifflinkplural": "we {{PLURAL:$1|kalekünuy|kalekünuy}}",
        "youhavenewmessagesmulti": "Nieymi we yefalzugu $1 mew.",
-       "editsection": "Wirin",
+       "editsection": "Kümeelkünun",
        "editold": "kümeelün",
        "viewsourceold": "Kimam chew küpan chi wirin",
-       "editlink": "kümeelün",
+       "editlink": "kümeelkünun",
        "viewsourcelink": "kimam chew küpan chi wirin",
-       "editsectionhint": "Kümeelan katrüntuku: $1",
+       "editsectionhint": "Kümeelkünun trokiñ: $1",
        "toc": "Trokiñdungu",
        "showtoc": "pegelpe",
        "hidetoc": "ellkangepe",
        "hr_tip": "Kakül wif (Pünengelayafuy rumel)",
        "summary": "Pichi trokiñündungu:",
        "subject": "Dungu/üy:",
-       "minoredit": "Tüfachi ta kiñe pichi wirin",
+       "minoredit": "Püchin kümeelkünungey",
        "watchthis": "Llaytun tüfachi pakina",
        "savearticle": "Eltukawün wülngiñ",
        "preview": "Pen chum müley",
        "noarticletext": "Iney no rume wirilay tüfachi wülngiñ mew. Eymi [[Special:Search/{{PAGENAME}}|pepikintuymi tüfachi üy]] kake wülngiñ mew,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} kintuymi koneltuyelelu wirintukun],\nkam [{{fullurl:{{FULLPAGENAME}}|action=edit}} kümeelaymi tüfachi wülngiñ]</span>.",
        "noarticletext-nopermission": "Iney no rume wirilay tüfachi wülngiñ mew. \nEymi [[Special:Search/{{PAGENAME}}|pepikintuymi tüfachi üy]] kake wülngiñ mew,\nkam <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} kintuymi koneltuyelelu wirintukun]</span>.",
        "previewnote": "'''Ngüneduamimi tüfachi wüne pen petu eltukawam!'''\nEltukawlelay feychi kalekünun!",
-       "editing": "Kümeelngey $1",
+       "editing": "Kümeelngekey $1",
        "editingsection": "Wirin $1 (Dungu)",
        "editingcomment": "Wirin $1 (we dungu)",
        "yourtext": "Tami wirin",
        "randompage": "Tuchi wülngiñ rume",
        "statistics": "Chuntelen",
        "statistics-pages": "Pakina",
-       "brokenredirects-edit": "pepikan",
+       "brokenredirects-edit": "Kümeelkünun",
        "brokenredirects-delete": "ñamümün",
        "withoutinterwiki-submit": "Pegelpe",
        "nbytes": "$1 {{PLURAL:$1 byte}}",
        "protect-level-sysop": "Pu ngünefe müṯen",
        "protect-summary-cascade": "Trayengko",
        "protect-expiry-options": "1 ora:1 hour,1 aṉtü:1 day,1 semana:1 week,2 semanas:2 weeks,1 küyeṉ:1 month,3 küyeṉ:3 months,6 küyeṉ:6 months,1 tripantu:1 year,Rumel:infinite",
-       "restriction-edit": "Pepiwelukay",
+       "restriction-edit": "Kümeelkünun",
        "restriction-move": "Pepiwiñami",
        "restriction-create": "Llitun",
        "viewdeletedpage": "Pen pakina ñamümüngelu",
        "siteuser": "Kellufe $1 {{SITENAME}}",
        "others": "fill",
        "siteusers": "{{PLURAL:$2|Kellufe|Kellufe}} $1 {{SITENAME}}",
-       "previousdiff": "← Füta wirin",
+       "previousdiff": "← Kuyfi kümeelkünun wirin",
        "nextdiff": "We wirin →",
        "file-info-size": "$1 × $2 adentun piküsel, eltukawün ñi tunte ngen: $3, MIME ñi chumngen: $4",
        "file-nohires": "Pepiduamngefalay chum pengeam.",
index dcab5ec..b490f27 100644 (file)
@@ -8,7 +8,8 @@
                        "Zanatos",
                        "زكريا",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "MtDu"
                ]
        },
        "tog-underline": "Ṣetter l-lyanaṫ:",
        "variants": "lhja:",
        "errorpagetitle": "ĥata'",
        "returnto": "Rjeĝ le $1",
-       "tagline": "Men",
+       "tagline": "Men {{SITENAME}}",
        "help": "Mosaĝada",
        "search": "Qelleb",
        "searchbutton": "Qelleb",
        "userrights-reason": "S-Sbab:",
        "userrights-no-interwiki": "ma msmoḫ-likċ ṫĝddel hoqoq l-mosṫĥdim fl-wikiat loĥra.",
        "userrights-nodatabase": "qaĝidaṫ l-bayanaṫ $1 ma kayna-ċ wlla kayna walakin maċi f-had l-wiki.",
-       "userrights-nologin": "ĥaṣṣk [[Special:UserLogin|ṫdĥol]] b-ĥisab idari baċ ṫĝti hoqoq l-mosṫĥdim.",
-       "userrights-notallowed": "l-ḫisab ṫaĝk ma mṣmoh-lihċ iĝti ḫoqoq l-mosṫĥdim.",
        "userrights-changeable-col": "lmojmoat li imkn li tghiyrha",
        "userrights-unchangeable-col": "lmjmoat li maymknch lik tghyrha",
        "userrights-irreversible-marker": "$1*",
index 947d17d..0120e9b 100644 (file)
        "navigation-heading": "لستة التصفح",
        "errorpagetitle": "غلطه",
        "returnto": "ارجع ل $1.",
-       "tagline": "من ويكيبيديا, الموسوعه الحره",
+       "tagline": "من {{SITENAME}}",
        "help": "مساعده",
        "search": "تدوير",
        "searchbutton": "تدوير",
        "saveprefs": "حفظ",
        "restoreprefs": "استرجع التظبيطات الاصليه",
        "prefs-editing": "تعديل",
-       "rows": "صفوف:",
-       "columns": "عمدان:",
        "searchresultshead": "تدوير",
        "stub-threshold": "الحد لتنسيق <a href=\"#\" class=\"stub\">لينك البذرة</a>:",
        "stub-threshold-disabled": "معطل",
        "userrights-reason": "السبب:",
        "userrights-no-interwiki": "أنت  مش من حقك تعدل صلاحيات اليوزرز على الويكيات التانية.",
        "userrights-nodatabase": "قاعدة البيانات $1  مش موجودة أو مش محلية.",
-       "userrights-nologin": "انت لازم [[Special:UserLogin|تسجيل الدخول]] بحساب  مدير لتعديل حقوق اليوزر.",
-       "userrights-notallowed": "حسابك  ماعندوش  إذن لتعديل حقوق اليوزر.",
        "userrights-changeable-col": "المجموعات اللى تقدر تغييرها",
        "userrights-unchangeable-col": "المجموعات اللى مش ممكن انك تغيرها",
        "group": "المجموعة:",
        "right-siteadmin": "قفل وفتح قاعدة البيانات",
        "right-override-export-depth": "تصدير الصفحات مع الصفحات الموصوله لحد عمق 5",
        "right-sendemail": "يبعت إيميل لليوزرز التانيين",
-       "right-passwordreset": "إعادة ضبط كلمة سر يوزر",
        "right-managechangetags": "إنشاء و مسح [[Special:Tags|الوسوم]] من قاعدة البيانات",
        "newuserlogpage": "سجل اليوزرز الجداد",
        "newuserlogpagetext": "دا سجل لليوزرز الجداد",
        "sp-contributions-blocked-notice": "اليوزر ده ممنوع دلوقتى.\nآخر عمليه منع في السجل موجوده تحت كمرجع:",
        "sp-contributions-search": "دور على مساهمات",
        "sp-contributions-username": "عنوان أيبى أو اسم يوزر:",
-       "sp-contributions-toponly": "اظÙ\87ر Ø§Ø®ØªÙ\8aر ØªØ¹Ø¯Ù\8aÙ\84  Ø¨Ø³",
+       "sp-contributions-toponly": "اظهر اخر تعديل  بس",
        "sp-contributions-submit": "تدوير",
        "whatlinkshere": "ايه بيوصل هنا",
        "whatlinkshere-title": "الصفحات اللى بتوصل لـ \"$1\"",
index df7652d..4f8b695 100644 (file)
        "searcharticle": "Dir",
        "history": "Historial de la páxina",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "anovada dende la mio visita cabera",
        "printableversion": "Versión pa imprentar",
        "permalink": "Enllaz permanente",
        "views": "Vistes",
        "toolbox": "Ferramientes",
        "tool-link-userrights": "Cambiar los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
+       "tool-link-userrights-readonly": "Ver los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
        "tool-link-emailuser": "Unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}",
        "userpage": "Ver la páxina d'usuariu",
        "projectpage": "Ver la páxina del proyeutu",
        "passwordreset-emaildisabled": "Les funciones de corréu electrónicu tan desactivaes nesta wiki.",
        "passwordreset-username": "Nome d'usuariu:",
        "passwordreset-domain": "Dominiu:",
-       "passwordreset-capture": "¿Ver el corréu electrónicu resultante?",
-       "passwordreset-capture-help": "Si marques esta caxella, podrás ver el corréu (cola contraseña temporal) amás d'unvialu al usuariu.",
        "passwordreset-email": "Direición de corréu electrónicu:",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).\n{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}\na esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,\no si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir\nusando la contraseña antigua.",
        "passwordreset-emailelement": "Nome d'usuariu: \n$1\n\nContraseña temporal: \n$2",
        "passwordreset-emailsentemail": "Si esta direición de corréu electrónicu ta asociada cola to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
        "passwordreset-emailsentusername": "Si hai una direición de corréu electrónicu asociada con esti nome d'usuariu, unviaráse un corréu electrónicu pa reaniciar la contraseña.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Unvióse'l corréu|Unviáronse los correos}} de reaniciu de contraseña. {{PLURAL:$1|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase equí.",
-       "passwordreset-emailerror-capture2": "Nun pudo unviase un corréu electrónicu {{GENDER:$2|al usuariu|a la usuaria}}: $1 {{PLURAL:$3|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase equí.",
        "passwordreset-nocaller": "Tien d'apurrise un llamador",
        "passwordreset-nosuchcaller": "El llamador nun esiste: $1",
        "passwordreset-ignored": "Nun se llogró'l reaniciu de la contraseña. ¿Seique nun se configuró un proveedor?",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "blockedtext": "'''El to nome d'usuariu o direición IP ta bloquiáu.'''\n\nEl bloquéu fexolu $1.\nEl motivu conseñáu ye ''$2''.\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.\nNun pues usar la función 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de\ncorréu electrónicu válida nes tos [[Special:Preferences|preferencies de cuenta]] y que nun tengas torgao usala.\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
        "autoblockedtext": "La to direición IP bloquióse automáticamente porque usóla otru usuariu que foi bloquiáu por $1.\nEl motivu conseñáu ye:\n\n:''$2''\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru de los [[{{MediaWiki:Grouppage-sysop}}|alministradores]] p'aldericar sobre'l bloquéu.\n\nTen en cuenta que nun pues usar la función «manda-y un corréu electrónicu a esti usuariu» a nun ser que tengas rexistrada una direición de corréu electrónicu válida nes [[Special:Preferences|preferencies d'usuariu]] y que nun tengas torgao usala.\n\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
+       "systemblockedtext": "El to nome d'usuariu o dirección IP bloquióse automáticamente pol software MediaWiki.\nEl motivu dau ye:\n\n:<em>$2</em>\n\n* Entamu del bloquéu: $8\n* Caducidá de bloquéu: $6\n* Destinatariu del bloquéu: $7\n\nLa to dirección IP actual ye $3.\nPor favor, incluye tolos anteriores en cualquier consulta que faigas.",
        "blockednoreason": "nun se dio nengún motivu",
        "whitelistedittext": "Tienes d'$1 pa editar páxines.",
        "confirmedittext": "Tienes de confirmar la direición de corréu electrónicu enantes d'editar páxines.\nPor favor, configura y valida la direición de corréu nes [[Special:Preferences|preferencies d'usuariu]].",
        "search-interwiki-caption": "Proyeutos hermanos",
        "search-interwiki-default": "Resultaos de $1:",
        "search-interwiki-more": "(más)",
+       "search-interwiki-more-results": "más resultaos",
        "search-relatedarticle": "Rellacionáu",
        "searchrelated": "rellacionáu",
        "searchall": "toos",
        "search-external": "Busca esterna",
        "searchdisabled": "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google.\nHas fixate en que'l conteníu de los sos índices de {{SITENAME}} pué tar desfasáu.",
        "search-error": "Hebo un error al buscar: $1",
+       "search-warning": "Hebo un avisu al buscar: $1",
        "preferences": "Preferencies",
        "mypreferences": "Preferencies",
        "prefs-edits": "Númberu d'ediciones:",
        "saveprefs": "Guardar",
        "restoreprefs": "Restaurar tolos axustes predeterminaos (en toles seiciones)",
        "prefs-editing": "Edición",
-       "rows": "Fileres:",
-       "columns": "Columnes:",
        "searchresultshead": "Buscar",
        "stub-threshold": "Llende superior pa dar formatu d'entamu a un enllaz ($1):",
        "stub-threshold-sample-link": "exemplu",
        "prefs-help-recentchangescount": "Incluye los cambios recientes, los historiales de páxines y los rexistros.",
        "prefs-help-watchlist-token2": "Esta ye la clave secreta pa la canal de noticies web de la so llista de vixilancia.\nCualquiera que la sepa podrá lleer la so llista de vixilancia; nun la comparta.\n[[Special:ResetTokens|Calque equí si necesita reaniciala]].",
        "savedprefs": "Guardáronse les preferencies.",
-       "savedrights": "Guardáronse los permisos d'{{GENDER:$1|usuariu|usuaria}} de $1.",
+       "savedrights": "Guardáronse los grupos {{GENDER:$1|del usuariu|de la usuaria}} $1.",
        "timezonelegend": "Estaya horaria:",
        "localtime": "Hora llocal:",
        "timezoneuseserverdefault": "Usar la predeterminada de la wiki ($1)",
        "youremail": "Corréu electrónicu:",
        "username": "Nome d'{{GENDER:$1|usuariu|usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Miembru}} {{PLURAL:$1|del grupu|de los grupos}}:",
+       "group-membership-link-with-expiry": "$1 (ata'l $2)",
        "prefs-registration": "Hora del rexistru:",
        "yourrealname": "Nome real:",
        "yourlanguage": "Llingua:",
        "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-lookup-user": "Xestión de grupos del usuariu",
+       "userrights-lookup-user": "Seleiciona un usuariu",
        "userrights-user-editname": "Escribe un nome d'usuariu:",
-       "editusergroup": "Editar los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
+       "editusergroup": "Cargar los grupos d'usuariu",
        "editinguser": "Camudando los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar los grupos d'usuariu",
+       "viewinguserrights": "Viendo los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Editar los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
+       "userrights-viewusergroup": "Ver los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
        "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 eliminalu del grupu una vegada tea inxeríu, o viceversa.",
+       "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-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-nologin": "Tien d'[[Special:UserLogin|aniciar sesión]] con una cuenta d'alministrador pa dar permisos d'usuariu.",
-       "userrights-notallowed": "Nun tien autorización p'amestar o desaniciar permisos d'usuariu.",
        "userrights-changeable-col": "Grupos que pues camudar",
        "userrights-unchangeable-col": "Grupos que nun pues camudar",
+       "userrights-expiry-current": "Caduca el $1",
+       "userrights-expiry-none": "Nun caduca",
+       "userrights-expiry": "Caduca:",
+       "userrights-expiry-existing": "Hora de caducidá actual: $3 del $2",
+       "userrights-expiry-othertime": "Otru periodu:",
+       "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-conflict": "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.",
-       "userrights-removed-self": "Desaniciasti los tos propios permisos. Poro, yá nun tienes accesu a esta páxina.",
        "group": "Grupu:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Usuarios autoconfirmaos",
        "right-siteadmin": "Candar y descandar la base de datos",
        "right-override-export-depth": "Esportar páxines, incluyendo páxines enllazaes fasta una fondura de 5",
        "right-sendemail": "Unviar corréu a otros usuarios",
-       "right-passwordreset": "Ver los correos de reestablecimientu de contraseña",
        "right-managechangetags": "Crear y (des)activar [[Special:Tags|etiquetes]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetes]] xunto colos cambios propios",
        "right-changetags": "Amestar y desaniciar [[Special:Tags|etiquetes]] arbitraries en revisiones individuales y entraes del rexistru",
        "action-upload_by_url": "xubir esti ficheru dende una URL",
        "action-writeapi": "usar l'API d'escritura",
        "action-delete": "desaniciar esta páxina",
-       "action-deleterevision": "desaniciar esta revisión",
-       "action-deletedhistory": "ver l'historial elimináu d'esta páxina",
+       "action-deleterevision": "desaniciar revisiones",
+       "action-deletelogentry": "desaniciar les entraes del rexistru",
+       "action-deletedhistory": "ver l'historial elimináu d'una páxina",
+       "action-deletedtext": "ver el testu d'una revisión desaniciada",
        "action-browsearchive": "buscar páxines desaniciaes",
-       "action-undelete": "restaurar esta páxina",
-       "action-suppressrevision": "revisar y restaurar esta revisión tapecida",
+       "action-undelete": "restaurar páxines",
+       "action-suppressrevision": "revisar y restaurar revisiones tapecíes",
        "action-suppressionlog": "ver esti rexistru priváu",
        "action-block": "bloquiar qu'esti usuariu edite",
        "action-protect": "camudar los niveles de proteición pa esta páxina",
        "action-userrights-interwiki": "editar los permisos d'usuariu de los usuarios d'otres wikis",
        "action-siteadmin": "candar o descandar la base de datos",
        "action-sendemail": "unviar correos",
+       "action-editmyoptions": "editar les preferencies propies",
        "action-editmywatchlist": "editar la llista de vixilancia",
        "action-viewmywatchlist": "ver la llista de vixilancia propia",
        "action-viewmyprivateinfo": "ver la so información privada",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Amosar",
+       "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-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-noresults": "Nun s'alcontraron filtros",
+       "rcfilters-filtergroup-registration": "Rexistru del usuariu",
+       "rcfilters-filter-registered-label": "Rexistraos",
+       "rcfilters-filter-registered-description": "Editores coneutaos.",
+       "rcfilters-filter-unregistered-label": "Non rexistraos",
+       "rcfilters-filter-unregistered-description": "Editores ensin coneutar.",
+       "rcfilters-filtergroup-authorship": "Editar autoría",
+       "rcfilters-filter-editsbyself-label": "Les tos propies ediciones",
+       "rcfilters-filter-editsbyself-description": "Ediciones de to",
+       "rcfilters-filter-editsbyother-label": "Ediciones d'otros",
+       "rcfilters-filter-editsbyother-description": "Ediciones creaes por otros usuarios (non por ti).",
+       "rcfilters-filtergroup-userExpLevel": "Nivel d'esperiencia (solo pa usuarios rexistraos)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Recién llegaos",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 ediciones y 4 díes d'actividá.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendices",
+       "rcfilters-filter-userExpLevel-learner-description": "Más díes d'actividá y ediciones que los «Recién llegaos», pero menos que los «Usuarios espertos».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuarios espertos",
+       "rcfilters-filter-userExpLevel-experienced-description": "Más de 30 díes d'actividá y 500 ediciones.",
+       "rcfilters-filtergroup-automated": "Contribuciones automátiques",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Ediciones feches con ferramientes automátiques.",
+       "rcfilters-filter-humans-label": "Ser humanu (non bot)",
+       "rcfilters-filter-humans-description": "Ediciones feches por editores humanos.",
+       "rcfilters-filtergroup-significance": "Significación",
+       "rcfilters-filter-minor-label": "Ediciones menores",
+       "rcfilters-filter-minor-description": "Ediciones que l'autor etiquetó como menores.",
+       "rcfilters-filter-major-label": "Ediciones non menores",
+       "rcfilters-filter-major-description": "Ediciones ensin etiquetar como menores.",
+       "rcfilters-filtergroup-changetype": "Tipu de cambéu",
+       "rcfilters-filter-pageedits-label": "Ediciones de páxines",
+       "rcfilters-filter-pageedits-description": "Ediciones del conteníu wiki, alderiques, descripciones de categoríes...",
+       "rcfilters-filter-newpages-label": "Creaciones de páxines",
+       "rcfilters-filter-newpages-description": "Ediciones nes que se creen páxines nueves.",
+       "rcfilters-filter-categorization-label": "Cambeos de categoríes",
+       "rcfilters-filter-categorization-description": "Rexistros de les páxines que s'añaden o borren de categoríes.",
+       "rcfilters-filter-logactions-label": "Aiciones rexistraes",
+       "rcfilters-filter-logactions-description": "Aiciones alministratives, creación de cuentes, desanicios de páxines, xubíes de ficheros...",
        "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l <strong>$3</strong>, a les <strong>$4</strong> (s'amuesen un máximu de <strong>$1</strong>).",
        "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "rcshowhideminor": "$1 ediciones menores",
        "uploaded-setting-handler-svg": "Tán bloquiaos los ficheros SVG que configuren l'atributu «handler» con remote/data/script. Alcontróse <code>$1=\"$2\"</code> nel ficheru SVG xubíu.",
        "uploaded-remote-url-svg": "Tán bloquiaos los ficheros SVG que configuren atributos d'estilu con URL remotes. Alcontróse <code>$1=\"$2\"</code> nel ficheru SVG xubíu.",
        "uploaded-image-filter-svg": "Alcontróse un filtru d'imaxe con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel ficheru SVG xubíu.",
-       "uploadscriptednamespace": "Esti ficheru SVG contien l'espaciu de nomes illegal «$1»",
+       "uploadscriptednamespace": "Esti ficheru SVG contien l'espaciu de nomes illegal «<nowiki>$1</nowiki>»",
        "uploadinvalidxml": "Nun pudo interpretase'l XML del ficheru cargáu.",
        "uploadvirus": "¡El ficheru tien un virus!\nDetalles: $1",
        "uploadjava": "El ficheru ye un archivu ZIP que contien un ficheru .class de Java.\nXubir ficheros Java nun ta permitío, porque puede facer que se salten les torgues de seguridá.",
        "uncategorizedcategories": "Categoríes non categorizaes",
        "uncategorizedimages": "Archivos non categorizaos",
        "uncategorizedtemplates": "Plantíes non categorizaes",
+       "uncategorized-categories-exceptionlist": "# Contien una llista de categoríes que nun tendríen d'apaecer en Special:UncategorizedCategories. Una categoría per llinia, empezando por «*». Nun se tienen en cuenta les llinies qu'empiecen con otru caráuter (espacios en blancu incluyíos). Usa «#» p'añadir comentarios.",
        "unusedcategories": "Categoríes non usaes",
        "unusedimages": "Imáxenes non usaes",
        "wantedcategories": "Categoríes buscaes",
        "apisandbox-sending-request": "Unviando solicitú a la API...",
        "apisandbox-loading-results": "Recibiendo los resultaos de la API...",
        "apisandbox-results-error": "Asocedió un error al cargar la respuesta de la consulta API: $1.",
+       "apisandbox-request-selectformat-label": "Amosar los datos de la solicitú como:",
+       "apisandbox-request-format-url-label": "Cadena de consulta como URL",
        "apisandbox-request-url-label": "URL de la solicitú:",
+       "apisandbox-request-json-label": "JSON de la solicitú:",
        "apisandbox-request-time": "Duración de la solicitú: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Igua'l token y vuelve a unviar",
        "apisandbox-results-fixtoken-fail": "Nun pudo recuperase'l token «$1».",
        "apisandbox-continue-clear": "Llimpiar",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries siguirá] cola última solicitú; {{int:apisandbox-continue-clear}} llimpiará los parámetros rellacionaos con siguir.",
        "apisandbox-param-limit": "Escribe <kbd>max</kbd> pa usar la llende máxima.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tolos espacios de nomes)",
+       "apisandbox-multivalue-all-values": "$1 (Tolos valores)",
        "booksources": "Fontes de llibros",
        "booksources-search-legend": "Busca de fontes de llibros",
        "booksources-search": "Buscar",
        "activeusers-count": "$1 {{PLURAL:$1|edición|ediciones}} {{PLURAL:$3|nel caberu día|nos caberos $3 díes}}",
        "activeusers-from": "Amosar usuarios principiando dende:",
        "activeusers-groups": "Amosar los usuarios que pertenecen a los grupos:",
+       "activeusers-excludegroups": "Excluir a los usuarios que pertenezan a los grupos:",
        "activeusers-noresult": "Nun s'alcontraron usuarios.",
        "activeusers-submit": "Amosar los usuarios activos",
        "listgrouprights": "Drechos de los grupos d'usuariu",
        "emailccsubject": "Copia del to mensaxe a $1: $2",
        "emailsent": "Corréu unviáu",
        "emailsenttext": "Unviose'l to mensaxe de corréu.",
-       "emailuserfooter": "Esti corréu electrónicu {{GENDER:$1|unviólu}} $1 a {{GENDER:$2|$2}} per aciu de la función «{{int:emailuser}}» de {{SITENAME}}.",
+       "emailuserfooter": "Esti corréu electrónicu {{GENDER:$1|unviólu}} $1 a {{GENDER:$2|$2}} per aciu de la función «{{int:emailuser}}» de {{SITENAME}}. Si {{GENDER:$2|contestes}} a esti corréu, el {{GENDER:$2|to}} corréu unviaráse direutamente {{GENDER:$1|al remitente|a la remitente}} orixinal, {{GENDER:$1|revelando-y}} la {{GENDER:$2|to}} direición de corréu.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
        "watchlist": "Llista de siguimientu",
        "changecontentmodel-emptymodels-title": "Nun hai modelos de conteníu disponibles",
        "changecontentmodel-emptymodels-text": "El conteníu de [[:$1]] nun pue convertise a nengún tipu.",
        "log-name-contentmodel": "Rexistru de cambios del modelu de conteníu",
-       "log-description-contentmodel": "Socesos rellacionaos colos modelos de conteníu d'una páxina",
+       "log-description-contentmodel": "Esta páxina recueye los cambeos nel modelu de conteníu de les páxines, y les páxines creaes con un modelu de conteníu distintu del predetermináu.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la páxina $3 usando un modelu de conteníu non predetermináu «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}}'l modelu de conteníu de la páxina $3 dende «$4» a «$5»",
        "logentry-contentmodel-change-revertlink": "revertir",
        "proxyblockreason": "La to direición IP foi bloquiada porque ye un proxy abiertu. Por favor contauta col to proveedor de serviciones d'Internet o col to servicio d'asistencia téunica y infórmalos d'esti seriu problema de seguridá.",
        "sorbsreason": "La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}.",
        "sorbs_create_account_reason": "La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}. Nun pues crear una cuenta",
+       "softblockrangesreason": "Nun se permiten les contribuciones anónimes dende la to dirección IP ($1). Por favor, anicia sesión.",
        "xffblockreason": "Una direición IP presente na testera X-Forwarded-For, o suya o d'un sirvidor proxy que ta usando, ta bloquiada. El motivu orixinal del bloquéu foi: $1",
        "cant-see-hidden-user": "L'usuariu que tentes bloquiar yá ta bloquiáu y anubríu.\nComo nun tienes permisos p'anubrir usuarios, nun pues ver o editar el bloquéu del usuariu.",
        "ipbblocked": "Nun pues bloquiar o desbloquiar a otros usuarios, porque tas bloquiáu tu mesmu",
        "cant-move-to-user-page": "Nun tienes permisu pa treslladar una páxina a una páxina d'usuariu (sacante a una subpáxina d'usuariu).",
        "cant-move-category-page": "Nun tienes permisu pa treslladar páxines de categoría.",
        "cant-move-to-category-page": "Nun tienes permisu pa treslladar una páxina a una páxina de categoría.",
+       "cant-move-subpages": "Nun tienes permisu pa mover subpáxines.",
+       "namespace-nosubpages": "L'espaciu de nomes «$1» nun permite subpáxines.",
        "newtitle": "Títulu nuevu:",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "pageinfo-length": "Llonxitú de la páxina (en bytes)",
        "pageinfo-article-id": "ID de la páxina",
        "pageinfo-language": "Llingua del conteníu de la páxina",
+       "pageinfo-language-change": "camudar",
        "pageinfo-content-model": "Plantía del conteníu de la páxina",
        "pageinfo-content-model-change": "camudar",
        "pageinfo-robot-policy": "Indexación por robots",
        "pageinfo-few-visiting-watchers": "Puede haber, o non, un usuariu que vixila páxines que visita les ediciones recientes",
        "pageinfo-redirects-name": "Númberu de redireiciones a esta páxina",
        "pageinfo-subpages-name": "Subpáxines d'esta páxina",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redireición|redireiciones}}; $3 {{PLURAL:$3|non-redireición|non-redireiciones}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redireición|redireiciones}}; $3 {{PLURAL:$3|non redireición|non redireiciones}})",
        "pageinfo-firstuser": "Creador de la páxina",
        "pageinfo-firsttime": "Data de creación de la páxina",
        "pageinfo-lastuser": "Caberu editor",
        "htmlform-user-not-exists": "<strong>$1</strong> nun esiste.",
        "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-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-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",
        "feedback-bugcheck": "¡Perfeuto! Comprueba que nun tea yá ente los [$1 fallos conocíos].",
        "feedback-useragent": "Axente d'usuariu:",
        "searchsuggest-search": "Buscar en {{SITENAME}}",
        "searchsuggest-containing": "que contien...",
-       "api-error-autoblocked": "La to dirección IP bloquióse automáticamente porque la usó un usuariu bloquiáu.",
-       "api-error-badaccess-groups": "Nun tienes permisu pa xubir ficheros a esta wiki.",
        "api-error-badtoken": "Fallu internu: token incorreutu.",
-       "api-error-blocked": "Tas bloquiáu pa editar.",
-       "api-error-copyuploaddisabled": "Xubir d'una URL ta desactivao nesti sirvidor.",
-       "api-error-duplicate": "Yá hai {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu.",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu, pero se {{PLURAL:$1|desanició|desaniciaron}}.",
-       "api-error-empty-file": "El ficheru qu'unviasti taba baleru.",
        "api-error-emptypage": "Nun se permite la creación de páxines nueves baleres.",
-       "api-error-fetchfileerror": "Fallu internu: daqué nun funcionó al buscar el ficheru.",
-       "api-error-fileexists-forbidden": "Yá esiste un ficheru col nome «$1» y nun se pue sobrescribir.",
-       "api-error-fileexists-shared-forbidden": "Yá esiste un ficheru col nome «$1» nel repositoriu de ficheros compartíos, y nun se pue sobrescribir.",
-       "api-error-file-too-large": "El ficheru qu'unviasti yera demasiao grande.",
-       "api-error-filename-tooshort": "El nome de ficheru ye demasiao curtiu.",
-       "api-error-filetype-banned": "Esta triba de ficheru ta torgada.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun ye una triba de ficheru permitida|nun son tribes de ficheru permitíes}}. {{PLURAL:$3|La triba de ficheru permitida ye|Les tribes de ficheru permitíes son}} $2.",
-       "api-error-filetype-missing": "Al ficheru falta-y una estensión.",
-       "api-error-hookaborted": "La conexón con una estensión encaboxó el cambéu que tentasti facer.",
-       "api-error-http": "Fallu internu: Nun se pudo coneutar col sirvidor.",
-       "api-error-illegal-filename": "El nome de ficheru nun ta permitíu.",
-       "api-error-internal-error": "Fallu internu: daqué nun funcionó al procesar la xubida na wiki.",
-       "api-error-invalid-file-key": "Fallu internu: nun s'atopó el ficheru nel depósitu temporal.",
-       "api-error-missingparam": "Fallu internu: falten parámetros na solicitú.",
-       "api-error-missingresult": "Fallu internu: nun se pudo determinar si la copia foi bien.",
-       "api-error-mustbeloggedin": "Tienes de tar autenticáu pa xubir ficheros.",
-       "api-error-mustbeposted": "Fallu internu: la solicitú necesita HTTP POST.",
-       "api-error-noimageinfo": "La xubida foi correuta, pero el sirvidor nun dio información dala del ficheru.",
-       "api-error-nomodule": "Fallu internu: nun se configuró dengún módulu de xubíes.",
-       "api-error-ok-but-empty": "Fallu internu: nun hai respuesta del sirvidor.",
-       "api-error-overwrite": "Nun ta permitío sobroscribir un ficheru esistente.",
-       "api-error-ratelimited": "Tas tentando xubir más ficheros nun espaciu de tiempu más pequeñu del que permite esta wiki.\nTéntalo otra vuelta en dellos minutos.",
-       "api-error-stashfailed": "Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.",
        "api-error-publishfailed": "Fallu internu: el sirvidor nun pudo espublizar el ficheru temporal.",
-       "api-error-stasherror": "Hebo un error al xubir el ficheru al almacén.",
-       "api-error-stashedfilenotfound": "Nun s'alcontró'l ficheru na reserva al intentar cargalu dende allí.",
-       "api-error-stashpathinvalid": "El camín onde tenía qu'alcontrase'l ficheru de la reserva ye inválidu.",
-       "api-error-stashfilestorage": "Hebo un error al atroxar el ficheru nel depósitu.",
-       "api-error-stashzerolength": "El sirvidor nun pudo atroxar el ficheru nel depósitu porque tien tamañu cero.",
-       "api-error-stashnotloggedin": "Tienes d'aniciar sesión p'atroxar ficheros nel depósitu de carga.",
-       "api-error-stashwrongowner": "El ficheru al qu'intentabes acceder nel depósitu nun te pertenez.",
-       "api-error-stashnosuchfilekey": "La clave de ficheru a la qu'intentabes acceder nel depósitu nun esiste.",
-       "api-error-timeout": "El sirvidor nun respondió nel tiempu esperáu.",
-       "api-error-unclassified": "Hebo un fallu desconocíu",
-       "api-error-unknown-code": "Fallu desconocíu: «$1»",
-       "api-error-unknown-error": "Fallu internu: daqué nun funcionó al tentar xubir el ficheru.",
-       "api-error-unknown-warning": "Avisu desconocíu: $1",
+       "api-error-stashfailed": "Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.",
+       "api-error-unknown-warning": "Avisu desconocíu: «$1».",
        "api-error-unknownerror": "Fallu desconocíu: «$1».",
-       "api-error-uploaddisabled": "Les xubíes tan desactivaes nesta wiki.",
-       "api-error-verification-error": "Esti ficheru pudiera tar corrompíu, o tien una estensión incorreuta.",
-       "api-error-was-deleted": "Anteriormente xubióse y desanicióse dempués un ficheru con esti nome.",
        "duration-seconds": "$1 {{PLURAL:$1|segundu|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|hores}}",
        "pagelang-language": "Llingua",
        "pagelang-use-default": "Usar la llingua predeterminada",
        "pagelang-select-lang": "Escoyer llingua",
+       "pagelang-reason": "Motivu",
        "pagelang-submit": "Unviar",
+       "pagelang-nonexistent-page": "La páxina $1 nun esiste.",
+       "pagelang-unchanged-language": "La páxina $1 yá ta configurada pal idioma $2.",
+       "pagelang-unchanged-language-default": "La páxina $1 yá ta configurada pal idioma del conteníu predetermináu de la wiki.",
+       "pagelang-db-failed": "La base de datos nun pudo camudar l'idioma de la páxina.",
        "right-pagelang": "Cambiar la llingua de la páxina",
        "action-pagelang": "cambiar la llingua de la páxina",
        "log-name-pagelang": "Rexistru de cambeos d'idioma",
        "mw-widgets-dateinput-no-date": "Nenguna data seleicionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Buscar multimedia",
+       "mw-widgets-mediasearch-noresults": "Nun s'alcontraron resultaos.",
        "mw-widgets-titleinput-description-new-page": "la páxina inda nun esiste",
        "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...",
        "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",
        "log-action-filter-block-reblock": "Cambiu de bloquéu",
        "log-action-filter-block-unblock": "Desbloquéu",
        "log-action-filter-contentmodel-change": "Cambéu de modelu de conteníu",
-       "log-action-filter-contentmodel-new": "Creación de páxina con modelu de conteníu non estándar",
+       "log-action-filter-contentmodel-new": "Creación de páxina con modelu de conteníu non predetermináu",
        "log-action-filter-delete-delete": "Desaniciu de páxines",
+       "log-action-filter-delete-delete_redir": "Sobreescritura de redireición",
        "log-action-filter-delete-restore": "Restauración de páxines",
        "log-action-filter-delete-event": "Desaniciu de rexistros",
        "log-action-filter-delete-revision": "Desaniciu de revisión",
        "usercssispublic": "Atención: les subpáxines CSS nun tendríen de contener datos acutaos porque son visibles pa otros usuarios.",
        "restrictionsfield-badip": "Direición o rangu IP inválidu: $1",
        "restrictionsfield-label": "Rangos d'IP permitíos:",
-       "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errores:\n\n$1"
+       "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revisión $1",
+       "pageid": "ID de páxina $1"
 }
index e2ea9aa..c335429 100644 (file)
@@ -12,7 +12,7 @@
                        "Аль-Гимравий"
                ]
        },
-       "tog-underline": "Ð\9bинкал Ð³Ñ\8aоÑ\80кÑ\8cмÑ\83Ñ\85Ñ\8aизе",
+       "tog-underline": "РегÐ\86елазда Ð³Ñ\8aоÑ\80кÑ\8c Ð¼Ñ\83Ñ\85Ñ\8a Ð»Ñ\8aезе:",
        "tog-hideminor": "ЧӀахӀиял хиса-басиязул сияхӀалда дагьа-макъал хиса-басиял рахчизе",
        "tog-showtoolbar": "Хиса-басиял гьарулеб мехалда тӀасияб алатазул панель бихьизабизе",
        "tog-editondblclick": "КӀиго кӀутӀиялдалъун гьумералъул хиса-баси гьабизе",
        "moredotdotdot": "Жеги...",
        "morenotlisted": "Гьаб сияхӀ цӀураб гьечӀо",
        "mypage": "Гьумер",
-       "mytalk": "БахӀс",
+       "mytalk": "Гьоркьоб лъей",
+       "anontalk": "Гьоркьоб лъей",
        "navigation": "Навигация",
        "and": "&#32;ва",
        "qbfind": "ЦӀехезе",
        "qbbrowse": "Балагьизе",
        "qbedit": "Хисизабизе",
-       "qbpageoptions": "Гьемералъул рекъезаби",
+       "qbpageoptions": "Гьумералъул рекъезаби",
        "qbmyoptions": "Дур рекъезаби",
        "faq": "FAQ",
        "namespaces": "ЦӀаразул сияхӀ",
        "searchbutton": "Хъирщизе",
        "go": "Ине",
        "searcharticle": "Ине",
-       "history": "ХиÑ\81а-баÑ\81азул тарих",
+       "history": "ХиÑ\81а-баÑ\81иÑ\8fзул тарих",
        "history_short": "Тарих",
        "printableversion": "Басмалъул версия",
-       "permalink": "Даимаб линк",
+       "permalink": "Даимаб регІел",
        "print": "Басмаялда бахъизе",
        "view": "Балагьи",
        "view-foreign": "$1 сайталда балагьизе",
        "unprotectthispage": "Гьаб гьумералъул цӀуни хисизабизе",
        "newpage": "ЦIияб гьумер",
        "talkpage": "БахӀс",
-       "talkpagelinktext": "Ð\91аÑ\85\81",
+       "talkpagelinktext": "Ð\93Ñ\8cоÑ\80кÑ\8cоб Ð»Ñ\8aей",
        "specialpage": "Хъулухъияб гьумер",
        "personaltools": "Дур алатал",
-       "articlepage": "Ð\91алагÑ\8cизе Ð¼Ð°ÐºÑ\8aалаÑ\8fлда",
-       "talk": "Ð\91аÑ\85Ð\86Ñ\81",
+       "articlepage": "Ð\9cакÑ\8aалаÑ\8fлде Ð±Ð°Ð»Ð°Ð³Ñ\8cизе",
+       "talk": "Ð\93Ñ\8cоÑ\80кÑ\8cоб Ð»Ñ\8aей",
        "views": "Балагьиял",
        "toolbox": "Алатал",
-       "userpage": "ГӀахьалчиясул гьумер",
+       "userpage": "ГӀахьалчиясул гьумералъухъ балагьизе",
        "projectpage": "Проекталъул гьумералъухъ балагьизе",
        "imagepage": "Файлалъул гьумер балагьизе",
        "mediawikipage": "Кагъаталъул гьумер балагьизе",
        "otherlanguages": "Цоги мацӀазда",
-       "redirectedfrom": "(«$1» гьемералдасан гьаниб битӀана)",
+       "redirectedfrom": "(«$1» гьумералдасан гьаниб битӀана)",
        "redirectpagesub": "Цоги гьумералда сверизабураб гьумер",
        "redirectto": "Редирект:",
        "lastmodifiedat": "Ахирисеб нухалъ гьаб гьумералъул хиса-баси гьабуна:  $2, $1.",
        "jumptonavigation": "навигация",
        "jumptosearch": "хъирщизе",
        "pool-errorunknown": "Лъалареб гъалатӀ",
-       "aboutsite": "{{SITENAME}} хӀакъалъулъ",
+       "aboutsite": "{{GRAMMAR:prepositional|{{SITENAME}}}} хІакъалъулъ",
        "aboutpage": "Project:ХӀакъалъулъ",
        "currentevents": "Жакъасел лъугьа-бахъинал",
        "currentevents-url": "Project:Гьанжесел лъугьа-бахъинал",
        "disclaimerpage": "Project:Жавабчилъиялдасан инкар гьаби",
        "edithelp": "Хисизабиялъе кумек",
        "helppage-top-gethelp": "Кумек",
-       "mainpage": "БетӀераб гьумер",
-       "mainpage-description": "БетӀераб гьумер",
+       "mainpage": "БетІераб гьумер",
+       "mainpage-description": "БетІераб гьумер",
        "policy-url": "Project:КъагӀидаби",
        "portal": "ЖамгӀияб портал",
        "portal-url": "Project:Майдан",
        "createacct-reason-ph": "Щай дуца цогияб аккаунт гIуцIулеб бугеб",
        "createacct-submit": "Аккаунт гIуцIизе",
        "createacct-another-submit": "Цоги аккаунт гIуцIизе",
-       "createacct-benefit-heading": "{{SITENAME}} гӀуцӀун буго нужго гӀадинал гӀадамаца.",
+       "createacct-benefit-heading": "{{SITENAME}} — ккола нужго гӀадинал гӀадамазулги нужерги гІахьалаб хІалтІи.",
        "createacct-benefit-body1": "{{PLURAL:$1|хиса-баси}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|гьумер}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|гьумер|гьумерал}}",
        "createacct-benefit-body3": "Ахирисеб заманаялда жаниб {{PLURAL:$1|гIахьалчи}}",
        "badretype": "Дуца рихьизарурал паролал данде кколел гьечIо",
        "userexists": "Бихьизабураб гIахьалчиясул цIар цогияс хIалтIизабулеб буго.\nБегьулеб батани, дуего батIияб цIар бище.",
        "pt-createaccount": "Аккаунт рагьизе",
        "pt-userlogout": "КъватӀиве инзе",
        "passwordreset": "Парол хисизе",
+       "passwordreset-username": "ГІахьалчиясул цІар:",
        "resettokens-tokens": "Токенал:",
        "italic_sample": "Курсивалъулаб хъвай",
        "italic_tip": "Курсивалъулаб хъвай",
        "link_sample": "Линкалъул бетӀер",
-       "link_tip": "Ð\96аниÑ\81аб Ð»Ð¸Ð½Ðº",
+       "link_tip": "Ð\96аниÑ\81еб Ñ\80егÐ\86ел",
        "headline_sample": "БетIералъул текст",
        "headline_tip": "2-еб даражаялъул бетIер",
-       "media_tip": "Файлалъе линк",
+       "media_tip": "Файлалде регІел",
        "sig_tip": "Дур гъулбас ва гьабсагӀаталъ заман",
        "summary": "Дуца гьарурал хиса-басиял:",
        "subject": "Тема/бетӀер",
        "showdiff": "Гьарурал хиса-басиял",
        "loginreqlink": "Жаниве лъугьине",
        "newarticle": "(ЦIияб)",
+       "newarticletext": "РегІелаздасан нуж лъугьана жеги гІуцІун гьечІеб гьумералде.\nГьеб гІуцІизе бокьани, гъоркьехун текст хъвай (цІикІкІун лъазе бл. [$1 баяналъулаб гьумералде]).\nНуж гьанире гъалатІ ккун щварал ратани, гІицІго '''нахъе''' абураб кнопка мерхье дурго браузералъул.",
        "updated": "(ЦӀигьабуна)",
        "note": "<strong>ХӀужа:</strong>",
        "previewnote": "<strong>КӀочоге, мун гьабсагӀаталъ балагьула вуго макъалаялъул букӀине бугеб куцалъухъ.</strong>\nДуца гьарурал хиса-басиял цӀунун гьечӀо!",
        "lineno": "Мухъ $1:",
        "editundo": "нахъчӀвазе",
        "diff-empty": "(БатӀалъи гьечӀо)",
-       "searchresults": "ЦӀех-рехалъул хӀасилал",
+       "searchresults": "ЦІех-рехалъул хІасилал",
        "prevn": "{{PLURAL:$1|1=цебесалаб|цересел}} $1",
        "nextn": "{{PLURAL:$1|1=хадусалаб|хадусел}} $1",
        "prev-page": "Цебесеб гьумер",
        "searchprofile-everything-tooltip": "Киналго гьумеразда хъирщизе (бахӀсазул гьумераздагицин)",
        "search-result-size": "$1 ({{PLURAL:$2|$2 рагӀи|$2 рагӀи|$2 рагӀи}})",
        "searchall": "киналго",
+       "search-nonefound": "Дуца гьабураб цІех-рехалда данде кколеб щибго батичІо.",
+       "powersearch-ns": "ЦІарал рищун хъирщи:",
+       "powersearch-togglelabel": "ГІуж лъезе:",
        "powersearch-toggleall": "Киналго",
        "powersearch-togglenone": "Щибниги",
+       "powersearch-remember": "Дуца тІаса бищараб рекъезаби цІунизе хадубккун букІине бугеб хъирщиялъе",
        "search-external": "КъватIисеб цIехей",
        "preferences": "Рекъезаби",
        "mypreferences": "Рекъезаби",
        "action-upload": "гьаб файл жанибе цIазе",
        "enhancedrc-history": "тарих",
        "recentchanges": "ЦӀиял хиса-басиял",
+       "recentchanges-legend": "ЦІиял хиса-басиязул рекъезариял",
        "recentchanges-label-newpage": "Гьаб хиса-басигун цӀияб гьумер рагьана.",
        "recentchanges-label-minor": "Гьаб буго дагьа-макъаб хиса-баси",
        "recentchanges-label-bot": "Гьаб хиса-баси ботас гьабуна",
+       "recentchanges-label-unpatrolled": "Гьаб хиса-басиялъул жеги лъицаниги хал гьабичІо",
+       "recentchanges-label-plusminus": "байт роценалдалъун кIодолъи-гьитIинлъи хисизаби",
+       "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гьединго балагье [[Special:NewPages|цІиял гьумеразул сияхІалъухъ]])",
        "rcshowhideminor": "$1 гӀиси-микъинал хиса-басиял",
        "rcshowhideminor-show": "Бихьизабизе",
        "rcshowhideminor-hide": "Бахчизе",
        "rcshowhidemine": "$1 дир хиса-басиял",
        "rcshowhidemine-show": "Бихьизабизе",
        "rcshowhidemine-hide": "Бахчизе",
+       "rcshowhidecategorization": "Гьумерал категориязде бикьи $1",
+       "rclinks": "$2 къояйида жаниб гьабураб, ахирисеб $1 хиса-баси бихьизабизе<br />$3",
        "diff": "батӀалъи",
        "hist": "тарих",
        "hide": "Бахчизе",
        "booksources-search": "Хъирщизе",
        "specialloguserlabel": "ГӀахьалчи:",
        "log": "Журналал",
+       "logempty": "Журналалда данде кколел хъвай-хъвагІаял гьечІо.",
        "allarticles": "Киналго макъалаби",
-       "allpagessubmit": "Ð\98нзе",
+       "allpagessubmit": "ТÓ\80Ñ\83базабизе",
        "categories": "Категориял",
-       "watchlist": "Халгьабиялъул сияхӀ",
-       "mywatchlist": "Халгьабиялъул сияхӀ",
+       "watchlist": "Халгьабиялъул сияхІ",
+       "mywatchlist": "Халгьабиялъул сияхІ",
        "watch": "Хал кквезе",
        "namespace": "ЦӀаразул сияхӀ:",
+       "invert": "ТІасабищараб сверизабизе",
        "blanknamespace": "(Аслияб)",
        "contributions": "{{GENDER:$1|ГӀахьалчиясул}} хӀалтӀи",
        "mycontris": "Дур хӀалтӀи",
+       "sp-contributions-newbies": "ГІицІго, цІиял гІахьалчагІаз гьабураб хІалтІи бихьизабизе",
+       "sp-contributions-talk": "гьоркьоб лъей",
        "sp-contributions-userrights": "ГІахьалчиясул ихтиярал",
-       "whatlinkshere": "Гьанире линкал",
+       "sp-contributions-search": "ХІалтІи хъирщизе",
+       "sp-contributions-hideminor": "ГІиси-бикъинал хиса-басиял рахчизе",
+       "whatlinkshere": "Гьанире регІелал",
        "whatlinkshere-title": "«$1» гьумералда бухьен гьабулел гьумерал",
        "whatlinkshere-page": "Гьумер:",
+       "nolinkshere": "'''[[:$1]]''' гьумералде цоги гьумераздасан регІелал гьечІо.",
        "isredirect": "редирект-гьумер",
-       "isimage": "файлалъул линк",
+       "isimage": "файлалъул регІел",
        "whatlinkshere-prev": "{{PLURAL:$1|1=цебесеб|цересел}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|1=хадусеб|хадусел}} $1",
-       "whatlinkshere-links": "← линкал",
+       "whatlinkshere-links": "← регІелал",
        "whatlinkshere-hideredirs": "$1 редиректал",
        "whatlinkshere-hidelinks": "$1 линкал",
        "whatlinkshere-filters": "Фильтрал",
+       "whatlinkshere-submit": "ТӀубазабизе",
        "blockip": "ГІахьалчи блокалда лъезе",
        "ipbsubmit": "Гьав гІахьалчи/адрес блокалда лъезе",
        "ipb-confirmhideuser": "Нужеда ракІалда буго гІахьалчи блокалда лъезе ва гьесул цмар бахчизе. Гьеб загьирлъуларо сияхІазда ва журналазда. Гьеб гьабизе бокьун бугищ нужее?",
        "blocklink": "Блокалда лъезе",
        "contribslink": "хӀалтӀи",
        "move-page-legend": "Гьумералъул цӀар хисизе",
+       "newtitle": "ЦІияб цІар:",
+       "move-watch": "Басрияб ва цІияб цІаразул гьумерал дурго халкквеязул сияхІалде журазе",
        "movepagebtn": "Гьумералъул цӀар хисизе",
-       "movelogpage": "ЦӀарал хисиялъул журнал",
+       "movetalk": "Гьелдаго данде кколеб гьоркьоб лъеялъул гьумералъулги цІар хисизе",
+       "move-subpages": "($1 щвезегІан) гъоркьгьумеразул цІарал хисизе",
+       "movelogpage": "ЦІарал хисиялъул журнал",
+       "movesubpagetext": "Гьаб гьумералъул $1 {{PLURAL:$1|гъоркьгьумер|гъоркьгьумер|гъоркьгьумер}} буго.",
+       "move-leave-redirect": "Цоги рахъалдехун сверизабунин абураб ишара лъезе",
        "thumbnail-more": "КӀодолъизабизе",
        "tooltip-pt-userpage": "Дур гӀахьалчиясул гьумер",
        "tooltip-pt-mytalk": "Дур бахӀсалъул гьумер",
        "tooltip-n-recentchanges": "Ахирисел хиса-басиязул сияхӀ",
        "tooltip-n-randompage": "Цебе ккараб гьумералда балагьизе",
        "tooltip-n-help": "Баянал росизе кӀолеб бакӀ",
-       "tooltip-t-whatlinkshere": "Гьаб гьумералда линк гьабулелщинал гьумеразул сияхӀ",
+       "tooltip-t-whatlinkshere": "Гьаб гьумералда регІелал гьарулелщинал гьумеразул сияхІ",
        "tooltip-t-upload": "Файлал цІазе",
        "tooltip-t-specialpages": "Хъулухъиял гьумеразул сияхӀ",
        "tooltip-t-print": "Гьаб гьумералъул басмаялъул сверел",
        "tooltip-ca-nstab-main": "Аслияб гьумер бихьизабизе",
-       "tooltip-ca-nstab-user": "ГӀахьалчиясул гьумер",
+       "tooltip-ca-nstab-user": "ГІахьалчиясул хасаб гьумер",
        "tooltip-ca-nstab-special": "Гьаб буго хъулухъияб гьумер. Гьаб хисизабизе данде кколаро.",
        "tooltip-ca-nstab-image": "Файлалъул гьумер",
        "tooltip-save": "Дуца гьарурал хиса-басиял цӀунизе",
        "exif-orientation-1": "Нормалияб",
        "namespacesall": "киналго",
        "monthsall": "киналго",
+       "table_pager_limit_submit": "ТӀубазабизе",
        "hijri-calendar-m1": "МухІаррам",
        "hijri-calendar-m3": "РабигІул-Аввал",
        "hijri-calendar-m4": "РабигІу Ссани",
index 96529ac..9e40aca 100644 (file)
        "passwordreset-emaildisabled": "इ विकि पे ई-मेल सुविधा अक्षम कई दीहा है।",
        "passwordreset-username": "सदस्यनाँव:",
        "passwordreset-domain": "डोमेन:",
-       "passwordreset-capture": "परिणामस्वरूप बनावल ई-मेल देखा जाय?",
-       "passwordreset-capture-help": "अगर आप इ चेकबॉक्स कय टिक करा जाइ तव ई-मेल (अस्थायी गुप्तकुंजी कय साथे) आप कय देखाई अव सदस्य कय भी भेजी जाइ।",
        "passwordreset-email": "ई-मेल ठाँव:",
        "passwordreset-emailtitle": "{{SITENAME}} पे खाता कय विवरण",
        "passwordreset-emailtext-ip": "केहु (शायद आप कय, $1 आइ॰पी ठहर से) {{SITENAME}} ($4) पे अपने {{PLURAL:$3|गुप्त कुंजी}} कय रीसेट करेक अनुरोध करे है। इ ई-मेल ठहर से निचे  कय{{PLURAL:$3|खाता जोड़ान् है}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्त कुंजी {{PLURAL:$5|दिन}} कय बाद काम नाइ करि। आप लॉग इन कई कय एकठु नँवा गुप्त कुंजी अभीनै चुन लुहा जाए। यदि इ अनुरोध केहु अउर करे है, या फिर आप कय आपन गुप्त कुंजी याद आइ गा है, औ आप {{PLURAL:$3|आपन}} गुप्त कुंजी नाइ बदलेक चाहा जात है तव आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कै सका जात है।",
        "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-siteadmin": "डाटाबेस कय ताला लगावा जाय या खोला जाय",
        "right-override-export-depth": "पन्ना निर्यात करा जाय, पाँच स्तर कय गहराई तक जुड़ल पन्ना लइकय",
        "right-sendemail": "अउर सदस्यन् कय ई-मेल पठवा जाय",
-       "right-passwordreset": "गुप्तकुंजी रीसेट ई-मेल देखा जाय",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "newuserlogpage": "सदस्य खाता बनावे कय लॉग",
        "newuserlogpagetext": "ई सदस्य खाता बनावे कय लॉग होय।",
        "uploaddisabledtext": "फ़ाइल अपलोड अक्षम हैं।",
        "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद है।\nकृपया file_uploads जमाव कय जाँच करा जाय।",
        "uploadscripted": "इ फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जवन वेब ब्राउज़र गलत पढि सकत है।",
-       "uploadscriptednamespace": "इ एस॰वी॰जी फ़ाइल में अमान्य नामजगह \"$1\" है।",
+       "uploadscriptednamespace": "इ एस॰वी॰जी फ़ाइल में अमान्य नामजगह \"<nowiki>$1</nowiki>\" है।",
        "uploadinvalidxml": "अपलोड करल फ़ाइल कय XML पार्स नाइ होई।",
        "uploadvirus": "इ फ़ाइल में भाईरस हैं!ढेर जानकारी: $1",
        "uploadjava": "ई फ़ाइल एकठु ज़िप फ़ाइल होय जवने मे एकठु जावा .class फ़ाइल है।\nजावा फ़ाइलन् कय अपलोड नाई कै सका जात है, काहेसे एकरे कारण सुरक्षा बाधा पार होइ जाई।",
        "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
        "searchsuggest-search": "खोज",
        "searchsuggest-containing": "...से युक्त",
-       "api-error-badaccess-groups": "इ विकि मा आप कय फाइल अपलोड करेक अनुमति नाइ है",
        "api-error-badtoken": "आंतरिक त्रुटि: खराब टोकन।",
-       "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
-       "api-error-duplicate": "वहाँ {{PLURAL:$1| अन्य फ़ाइल | रहे हैं कुछ अन्य फ़ाइलों}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
-       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था कुछ अन्य फ़ाइल|कुछ अन्य फ़ाइलें}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
-       "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 d16eafd..4aa597b 100644 (file)
@@ -28,7 +28,8 @@
                        "Sayginer",
                        "Şeyx Şamil",
                        "Serkanland",
-                       "Macofe"
+                       "Macofe",
+                       "Archaeodontosaurus"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "aboutpage": "Project:İzah",
        "copyright": "Bu məzmun $1 əhatəsindədir.",
        "copyrightpage": "{{ns:project}}:Müəllif",
-       "currentevents": "Güncəl hadisələr",
-       "currentevents-url": "Project:Güncəl hadisələr",
+       "currentevents": "Aktual hadisələr",
+       "currentevents-url": "Project:Aktual hadisələr",
        "disclaimers": "Məsuliyyətdən imtina",
        "disclaimerpage": "Project:Məsuliyyətdən imtina",
        "edithelp": "Redaktə kömək",
        "saveprefs": "Qeyd et",
        "restoreprefs": "Bütün nizamlamaları bərpa et (bütün bölmələrdə)",
        "prefs-editing": "Redaktə",
-       "rows": "Sıralar:",
-       "columns": "Sütunlar:",
        "searchresultshead": "Axtar",
        "stub-threshold": "Qaralama məqalələrə keçidlərin tərtibatını təyinetmə diapazonu ($1):",
        "stub-threshold-sample-link": "nümunə",
        "userrights-reason": "Səbəb:",
        "userrights-no-interwiki": "Sizə başqa vikilayihələrdəki istifadəçilərin statusunu dəyişməyə icazə verilməyib",
        "userrights-nodatabase": "$1 verilənlər bazası ya mövcud deyil, ya da lokal deyil.",
-       "userrights-nologin": "Siz istifadəçilərin hüquqlarını dəyişmək üçün sistemə idarəçi olaraq [[Special:UserLogin|daxil olmalısınız]].",
-       "userrights-notallowed": "Sizin digər istifadəçilərə hüquqlar vermək və ya almaq icazəniz yoxdur.",
        "userrights-changeable-col": "Dəyişdirə bildiyiniz qruplar",
        "userrights-unchangeable-col": "Dəyişdirə bilmədiyiniz qruplar",
        "userrights-irreversible-marker": "$1*",
        "contributions": "{{GENDER:$1|İstifadəçinin}} fəaliyyəti",
        "contributions-title": "$1 istifadəçi fəaliyyətləri",
        "mycontris": "Fəaliyyətim",
+       "anoncontribs": "Fəaliyyətim",
        "contribsub2": "{{GENDER:$3|$1}} ($2) adlı istifadəçinin fəaliyyəti",
        "nocontribs": "Bu kriteriyaya uyğun redaktələr tapılmadı",
        "uctop": "(hal-hazırkı)",
        "feedback-subject": "Mövzu:",
        "feedback-thanks-title": "Təşəkkür!",
        "searchsuggest-search": "Axtar",
-       "api-error-filename-tooshort": "Fayl adı qısadır.",
-       "api-error-filetype-banned": "Bu tip fayllar qadağandır.",
-       "api-error-illegal-filename": "Fayl adına icazə yoxdur.",
-       "api-error-unknown-code": "Naməlum xəta: \"$1\".",
        "api-error-unknown-warning": "Naməlum xəbərdarlıq: \"$1\".",
        "api-error-unknownerror": "Naməlum xəta: \"$1\".",
-       "api-error-uploaddisabled": "Bu vikidə fayl yükləmə mümkün deyil.",
        "duration-seconds": "$1 {{PLURAL:$1|saniyə|saniyə}}",
        "duration-minutes": "$1 {{PLURAL:$1|dəqiqə|dəqiqə}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
index db8036e..fa43219 100644 (file)
        "hidden-category-category": "گیزلی بؤلمه‌لر",
        "category-subcat-count": "{{PLURAL:$2|بۇ بؤلمه‌ده تکجه آشاغیداکی آلت‌بؤلمه واردیر.|بۇ بؤلمه‌ده، جمعی $2-دن، آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.}}",
        "category-subcat-count-limited": "بۇ بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.",
-       "category-article-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی صحیفه واردیر.|بۇ بؤلمه‌ده توْپلام $2 صحیفه‌دن، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.}}",
-       "category-article-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.",
+       "category-article-count": "{{PLURAL:$2|بۇ بؤلمه‌ده تکجه آشاغیداکی صفحه واردیر.|بۇ بؤلمه‌ده جمعی $2 صفحه‌دن، آشاغیداکی {{PLURAL:$1|صفحه|$1 صفحه}} واردیر.}}",
+       "category-article-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|صفحه|$1 صفحه}} واردیر.",
        "category-file-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی فایل واردیر.|بۇ بؤلمه‌ده توْپلام $1-دن، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.}}",
        "category-file-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.",
        "listingcontinuesabbrev": "(قالانی)",
        "virus-badscanner": "پیس تنظیملر: تانینمامیش ویروس یوخلایان: ''$1''",
        "virus-scanfailed": "یوخلاماق باشا چاتمادی (کود $1)",
        "virus-unknownscanner": "تانینمامیش آنتی‌ویروس:",
-       "logouttext": "<strong>سÛ\8cز Ø§Û\8cÙ\86دÛ\8c Ø³Û\8cستÙ\90Ù\85â\80\8cدÙ\86 Ú\86Û\8cخدÛ\8cÙ\86Û\8cز.</strong>\n\nبÙ\88Ù\86ا Ø¯Û\8cÙ\82ت Ø§Ø¦Ø¯Û\8cÙ\86 Ú©Û\8c Ù\88ب Ø­Ø§Ù\81Û\8cظÙ\87 Ù\86Û\8cزÛ\8c Ø³Û\8cÙ\84Ù\85Ù\87 Û\8cÙ\86Ø\8cبعضÛ\8c ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84ر Ú©Ù\8eØ´-Û\8cÙ\86Û\8cزÛ\8c Ø³Û\8cÙ\84Ù\85Ù\87â\80\8cÙ\85Û\8cØ´ Ú©Û\8cÙ\85Û\8cØ\8c Ù\87Ù\84Ù\87 Ø¯Ù\87 Ø³Û\8cزÛ\8cÙ\86 Ú¯Û\8cرÛ\8cØ´ Ø§Ø¦ØªØ¯Û\8cÚ¯Û\8cÙ\86Û\8cز Ú©Û\8cÙ\85Û\8c Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Ù\87â\80\8cجکلر.",
+       "logouttext": "<strong>سÛ\8cز Ø§Û\8cÙ\86دÛ\8c Ø³Û\8cستÙ\90Ù\85â\80\8cدÙ\86 Ú\86Û\8cخدÛ\8cÙ\86Û\8cز.</strong>\n\nدÛ\8cÙ\82تï¼\9aÙ\88ب Ø­Ø§Ù\81Û\8cظÙ\87 Ù\86Û\8cزÛ\8c Ø³Û\8cÙ\84Ù\85Ù\87 Û\8cÙ\86Ù\87 Ù\82درØ\8cبعضÛ\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\84ر Ù\87Ù\84Ù\87 Ø¯Ù\87 Ø³Û\8cستÙ\85دÛ\8cÙ\85Û\8cشسÛ\8cÙ\86ز Ú©Û\8cÙ\85Û\8c Ú¯Ø¤Ø±Ù\88Ù\86Ù\87 Ø¨Û\8cلر.",
        "cannotlogoutnow-title": "ایندی چیخیش اوْلونمازدیر",
        "cannotlogoutnow-text": "$1-ی ایشلدرکن چیخیش اوْلونمازدیر.",
        "welcomeuser": "خوش گلمیسینیز، $1!",
        "userlogin-yourpassword-ph": "رمزینیزی یازین",
        "createacct-yourpassword-ph": "رمزی یازین",
        "yourpasswordagain": "رمزی یئنی‌دن یازین:",
-       "createacct-yourpasswordagain": "رÙ\85زÛ\8c Ø¯Ù\88غرÙ\88Ù\84اÛ\8cین",
+       "createacct-yourpasswordagain": "رÙ\85زÛ\8c ØªØ£Û\8cÛ\8cد Ø§Ø¦Ø¯ین",
        "createacct-yourpasswordagain-ph": "رمزی یئنی‌دن یازین",
        "userlogin-remembermypassword": "منی ایچری‌ده ساخلا",
        "userlogin-signwithsecure": "آرخایین باغلانتی ایشلدین",
        "botpasswords-updated-title": "روْبات پسووْردو آپدئیت اوْلوندو.",
        "botpasswords-deleted-title": "روْبات پسووْردو سیلیندی",
        "resetpass_forbidden": "رمزلر دَییشیلمز",
-       "resetpass-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
+       "resetpass-no-info": "بو صفحه‌نی بیرباشا آچماق اوچون سیستمه گیرمه‌لیسینیز.",
        "resetpass-submit-loggedin": "رمزی دَییشدیر",
        "resetpass-submit-cancel": "وازگئچ",
        "resetpass-wrong-oldpass": "یانلیش گئچیجی و یا ایندیکی رمز.\nسیز باجارییلا رمزینیزی دَییشدیریب یوخسا یئنی گئچرلی رمز ایسته‌میش اوْلدوغونوز مؤحتمل‌دیر.",
        "passwordreset-emaildisabled": "ایمیل اؤزل‌لیکلری بو ویکی‌ده باغلانیب‌دیر.",
        "passwordreset-username": "ایشلدن آدی:",
        "passwordreset-domain": "دامنه:",
-       "passwordreset-capture": "سون نتیجه ایمیل گؤستریلسین؟",
-       "passwordreset-capture-help": "بو قوطویا علامت قویساز، (گئچیجی رمزی اولان) ایمیل ایستیفاده‌چی‌یه گؤندریلن کیمی بوردا سیزه گؤستریله‌جکدیر.",
        "passwordreset-email": "ایمیل آدرسی:",
        "passwordreset-emailtitle": "{{SITENAME}}-ده حساب بیلگیلری",
        "passwordreset-emailtext-ip": "بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.\nسیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
        "passwordreset-emailsentemail": "بۇ ایمئیل آدرسی حسابینیزا ثبت اوْلونموشسا٬ بیر رمز یئنیله‌مه ایمئیلی گؤندریله‌جکدیر.",
        "changeemail": "ایمیل آدرسینی دَییشدیر یا سیل",
        "changeemail-header": "ایمیل آدرسیزی دَییشدیرمک اوچون بو فورمو دولدورون. حسابیزا بوتون ایمیل‌لرین ارتباطینی کسمک اوچون، یئنی ایمیل آدرسینی بوش ساخلایین.",
-       "changeemail-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
+       "changeemail-no-info": "بو صفحه‌نی بیرباشا آچماق اوچون سیستمه گیرمه‌لیسینیز.",
        "changeemail-oldemail": "ایندیکی ایمیل آدرس:",
        "changeemail-newemail": "یئنی ایمیل آدرسی:",
        "changeemail-none": "(هئچ)",
        "accmailtext": "[[User talk:$1|$1]] اوچون بیر راست‌گله رمز یارادیلیب و $2-ه گؤندریلدی.\n\nبو یئنی حسابین رمزی، گیرندن سونرا <em>[[Special:ChangePassword|رمز دَییشدیرمه]]</em> صحیفه‌سیندن دَییشیله بیلر.",
        "newarticle": "(یئنی)",
        "newarticletext": "مووجود اوْلمايان صفحه‌‌يه اوْلان لینکی ایزله‌دینیز. \nآشاغیداکی یئره یازیلارینیزی يازیب، بۇ صفحه‌‌نی '''سیز''' يارادا بیلرسینیز. (آرتیق معلومات اۆچون [$1 کؤمک صفحه‌‌سینه] باخین). اگر بۇ صفحه‌‌يه ایشتباه گلمیسینیزسه تکجه براوزرین '''قایید''' دۆيمه‌سینه وۇرون.",
-       "anontalkpagetext": "''بو صحیفه قئیدیات‌دان کئچممیش و یا داخیل اولمامیش آنونیم ایستیفادچییه عایید موذاکیره صحیفه‌سی‌دیر.\nاونا گؤره بو ایستیفادچینی رقم‌لردن عبارت ایپ اونوانی ایله معین ائتمک مجبوریتیندییک.\nبئله ایپ اونوان بیر نئچه فرد طرفین‌دن ایستیفاده‌ده اولا بیلر.\nاگر سیز آنونیم ایستیفادچیسینیزسه و بو مئساژین سیزه عایید اولمادیغینی دوشونورسونوزسه، اوندا  [[Special:CreateAccount|قئیدیات‌دان کئچین]] و یا [[Special:UserLogin|داخی اولون]].''",
+       "anontalkpagetext": "----<em>بو صفحه حسابسیز و یا سیستمه گیرمه میش تانیلماز ایشلدنه مربوط دانیشیق صفحه‌سی‌دیر.\nاونا گؤره بو ایشلدنی رقم‌لردن عبارت ایپی آدرسی ایله بللیلشدیریلیبدیر.</em>\nبئله آیپی آدرسی بیر نئچه فرد طرفین‌دن ایستیفاده‌ده اولا بیلر.\nاگر سیز تانیلماز ایشلدنسینیز و بو پیامین سیزه مربوط اولمادیغینی دوشونورسونوزسه، اوندا  [[Special:CreateAccount|حساب یارادین]] و یا [[Special:UserLogin|سیستمه گیرین]].''",
        "noarticletext": "ایندی بو صفحه‌ده یازی یوخدور.\nسیز آیری صفحه‌‌لرده [[Special:Search/{{PAGENAME}}|بو باشلیق اوچون آختارا بیلرسیز]]،\nیا دا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باغلی قئیدلری آختارا بیلرسیز]،\nیا دا [{{fullurl:{{FULLPAGENAME}}|action=edit}} بو صفحه‌نی دَییشدیره بیلرسیز]</span>.",
        "noarticletext-nopermission": "بو صحیفه‌‌ ایندی بوشدور. \nباشقا صحیفه‌‌لرده عینی آددا صحیفه‌‌نی  [[Special:Search/{{PAGENAME}}| آختار]], علاقه‌‌لی قئيدلره \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باخا],\nو يا صحیفه‌‌نی  [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> ائده بیلرسینیز.",
        "missing-revision": "«{{FULLPAGENAME}}» صحیفه‌سی اوچون $1 نومره‌لی نوسخه یوخدور.\n\nعموماُ بو ایشکال، واختی گئچمیش بیر باغلانتی ایله سیلینمیش بیر صحیفه‌یه گلنده، قاباغا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمک سیاهی]‌سینده باشقا بیلگیلر اولا بیلر.",
        "userinvalidcssjstitle": "خاتیرلادیرق:' '\"$1\" آدییلا بیر پوشه یوخ‌دور. پوشه-آدی.css و. js فایل‌لارینین آدلاری کیچیک حرف ایله یازماسی لازیم‌دیر، یعنی {{ns:user}}: تمل / vector.css دئییل، {{ns:user}}: تمل / Vector.css.",
        "updated": "(گونجل‌لندی)",
        "note": "'''دیقت:'''",
-       "previewnote": "'''بونون ساده‌جه بیر سیناق گؤستریشی اولدوغونو نظرده آلین.'''\nسیزین دییشیکلرینیز هله قئید اولونماییب!",
+       "previewnote": "<strong>بونون تکجه بیر سیناق گؤستریشی اولدوغونو نظرده آلین.</strong>\nسیزین دییشیکلرینیز هله ذخیره اولونماییب!",
        "continue-editing": "دَییشدیرمه یئرینه گئت",
        "previewconflict": "بو سیناق گؤستریشی‌دیر و یادداشدا ساخلایاجاغینیز تق‌دیرده متنین دییشدیر صحیفه‌سی‌نین یوخاری حیسه‌سینده نتیجه‌نین نئجه اولاجاغینی گؤستریر.",
        "session_fail_preview": "'''عۆذر ایسته‌ییریک! سیزین دییشدیرمه‌نیز یازدیریلمادی. \nسیستمدن چیخمیش اوْلدوغونوز مؤحتمل‌دیر. لۆطفاً سیستمه گیرمیش اوْلدوغونوزدان آرخایین اوْلوب بیر داها تکرار ائدین. \nمۆشکول حل اوْلونماسا حسابینیزدان [[Special:UserLogout|چیخیب]] یئنی‌دن گیریش ائدین٬ براوزرینیزین بۇ سایتا کوکی وئرمه ایجازه‌سینی وئردیگیندن ده آرخایین اوْلون.'''",
        "longpageerror": "خطا: داخیل متنین اوزون‌لوغو قبول ائدیله بیلر ان چوخ اوزونلوق اولان {{PLURAL:$2 | بیر کیلوبایت | $2 کیلوبایت}} دان چوخ‌دور و {{PLURAL:$1 | بیر کیلوبایت | $1 کیلوبایت}} بؤیوکلوگونده‌دیر.'\nدییشیک‌لیگی‌نین کایدئدیلئمئز.",
        "readonlywarning": "'''دیقت: باخیم سببی ایله دیتابیس بو آندا قیفیللی‌دیر. بو سببله دییشیک‌لیکلری‌نین بو آندا قئید ائدیل میه‌جکدیر. یازدیقلارینیزی باشقا بیر فایل‌دا آلیب ساخلایا و داها سونرا یئنی‌دن بورا گتیریب یازا بیلرسینیز.\n\nاونو قیفیل‌لایان ایداره‌چی، بو شرحی وئریب‌دیر: $1",
        "protectedpagewarning": "' 'خاطیرلیریق: بو ​​صحیفه باغلانیب دیر و یالنیز مودیر اولان‌لار طرفین‌دن دییش‌دیریله بیلر.'\nسون گونده‌لیک گیردی‌سی ایستیناد مقصدلی آشاغیدا وئریلمیش‌دیر:",
-       "semiprotectedpagewarning": "'قئید:' بو صحیفه محافظه‌لی اولدوغو اوچون یالنیز قئیدیات‌دان کئچمیش ایستیفاده‌چی‌لر دییشدیر ائده بیلرلر.",
+       "semiprotectedpagewarning": "<strong>دیقت:</strong> بو صفحه نی قوروندوغو اوچون تکجه تایید اولونموش ایشلدنلر دییشدیره بیلر.\n\nسون قورومالار ژورنالی آشاغیدا گلیبدیر:",
        "cascadeprotectedwarning": "<strong>خاطیرلایریق:</strong> بو صحیفه بو یئرده {{PLURAL:$1|صحیفهٔ|صحیفه‌لر}} یئرلشمگه گوره آبشاری حفظ اولونوب آلتیندا باغلانیب بونجه مودیر فقط ائلیه بیله‌لر دییشدیر ائده بیلسینلر",
        "titleprotectedwarning": "'دیققت! بو صحیفه محافظه‌لی‌دیر، یالنیز [[Special:ListGroupRights|ایجازه سی اولان]] ایستیفاده‌چی‌لر اونو دییشدیر ائده بیلرلر.'",
        "templatesused": "{{PLURAL:$1|شابلون}} بو صفحه‌ده ایشلنیب‌دیر:",
        "content-failed-to-parse": "تجزیه محتوای $2  مدل اوچون $1: $3 موفقیت اله گلمه دی",
        "invalid-content-data": "اعتبارسیز مضمون معلوماتی",
        "content-not-allowed-here": "\"$1\" مقاله‌سینه، [[$2]] صحیفه‌سینده ایجازه وئریلممیش دیر.",
-       "editwarning-warning": "بو صحیفه‌نی ترک ائتمک، دَییشدیرمه‌لرینیزی الدن وئرمگه سبب اولا بیلر. اگر گیریش ائتمیسینیز بو ایخطاری، ترجیحلرینیزین «دَییشدیرمک» بؤلوموندن، \"{{int:prefs-editing}}\"ایشدن سالا بیلرسینیز.",
+       "editwarning-warning": "بو صفحه‌دن چیخماق، دَییشدیرمه‌لرینیزی الدن وئرمگه سبب اولا بیلر. اگر گیریش ائتمیسینیز بو ایخطاری، ترجیحلرینیزین «دَییشدیرمک» بؤلوموندن، \"{{int:prefs-editing}}\"ایشدن سالا بیلرسینیز.",
        "editpage-notsupportedcontentformat-title": "فایلین فرمتی دستکلنمیر.",
        "editpage-notsupportedcontentformat-text": "$1 فایلین فرمتی  $2 فایل مدلی ایله دستکلنمیر.",
        "content-model-wikitext": "ویکی‌یازی",
        "page_last": "سون",
        "histlegend": "فرقلری سئچمه: موقاییسه ائتمک ایسته‌دیگینیز دییشیک‌لیکلرین یانینداکی گیرده دۆیمه‌لره علامت قویون و سوْنرا Enter-ی وۇروب یوْخسا آشاغیداکی دۆیمه‌نی وورون.<br />\nآچیقلاما:'''({{int:cur}})''' =سون نوسخه ایله فرقلر ، '''({{int:last}})''' = قاباقکی نوسخه ایله فرقلر، '''{{int:minoreditletter}}''' = کیچیک دییشیک‌لیک.",
        "history-fieldset-title": "گئچمیشی آختار",
-       "history-show-deleted": "یالنیز سیلینَنلر",
+       "history-show-deleted": "تکجه سیلینَنلر",
        "histfirst": "ان اسکی",
        "histlast": "ان یئنی",
        "historysize": "({{PLURAL:$1|بیر|$1}} بایت)",
        "saveprefs": "ذخیره ائت",
        "restoreprefs": "بوتون ایلک ترجیح‌لری قایتار",
        "prefs-editing": "دَییشدیرمک‌ده",
-       "rows": "سطرلر:",
-       "columns": "سوتون‌لار",
        "searchresultshead": "آختار",
        "stub-threshold": "<a href=\"#\" class=\"stub\">باغلانتی‌سیز لینکی</a> دییشدیرمک اوچون حدود (بایت‌لارلا):",
        "stub-threshold-sample-link": "میثال",
        "userrights-reason": "ندن:",
        "userrights-no-interwiki": "سیزه باشقا ویکی لايیهه‌لرده‌کی ایستیفاده‌چیلرین ائستاتوسونو ديَیشمه‌يه ایزین وئریلمه‌يیب",
        "userrights-nodatabase": "$1 وئریلنلر بازاسی يا مؤوجود دئيیل، يا دا لوکال دئيیل.",
-       "userrights-nologin": "سیز ایستیفاده‌چی‌لرین حقوق‌لارینی دییشمک اوچون سیستئمه ایداره‌چی اولا‌راق [[Special:UserLogin|daxil olmalısınız]].",
-       "userrights-notallowed": "سیزین ایستیفاده‌چی حسابینیزا دیگر ایستیفاده‌چی‌لره حقوق‌لار وئرمک و یا آلماغا ایجازه وئریلمه‌ییب.",
        "userrights-changeable-col": "ديَیشدیره بیلدیگینیز قروپلار",
        "userrights-unchangeable-col": "ديَیشدیره بیلمه‌دیگینیز قروپلار",
        "userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً گوزله ین و دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
-       "userrights-removed-self": "سیز باشاریلیق‌لا اؤز حاق‌لارینیزی قالدیردینیز. اونا گؤره داها بو صحیفه‌یه یول تاپماغا قادیر دئییل‌سینیز.",
        "group": "گروه:",
        "group-user": "ایستفاده‌چیلر",
        "group-autoconfirmed": "اوتوماتیک دوغرولانمیش ایستیفاده‌چیلر",
-       "group-bot": "بÙ\88تلار",
+       "group-bot": "رÙ\88باتلار",
        "group-sysop": "ایداره‌چیلر",
        "group-bureaucrat": "بوروکراتلار",
        "group-suppress": "باخانلار",
        "right-siteadmin": "دیتابیسی قیفیل‌لا و قیفیلینی آچ",
        "right-override-export-depth": "ایچری باغلانتیلاری اولان صحیفه‌لری، چوخو ۵ درجه درینلیگی ایله، ایخراج ائت",
        "right-sendemail": "باشقا ایستیفاده‌چیلره ایمیل گؤندر",
-       "right-passwordreset": "رمز یئنی‌له‌مه ایمیل‌لرینه باخ",
        "grant-group-email": "ایمئیل گؤندر",
        "newuserlogpage": "ایشلدن یارادیلما ژورنالی",
        "newuserlogpagetext": "بۇ ایشلدن یارادماق لیستی‌دیر.",
        "uploaddisabledtext": "فايل يوکلنمه‌سی باش توتمادی.",
        "php-uploaddisabledtext": "پی اچ پی فایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.",
        "uploadscripted": "بو فایل بیر اینتئرنئت آختاریش برنامه سی طرفین‌دن سهو چئوریلبیلجک بیر HTML و یا ایسکریپت کودو عبارت‌دیر.",
-       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی ($1) واردیر.",
+       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی (<nowiki>$1</nowiki>) واردیر.",
        "uploadinvalidxml": "یۆکله‌نیلن فایل‌دا XML تحلیل اولونانمادی.",
        "uploadvirus": "فايلدا ویروس وار!  \nدئتاللار: $1",
        "uploadjava": "فایل، بیر جاوا. نوع ‎‎class ائهتیوا ائدن بیر زیپ فایلی‌دیر.\nجاوا فایل‌لارینین یوکلنمه‌سینه ایجازه وئریلمیر، چونکی تهلوکه‌سیزلیک محدودلاشدیرما‌لارینین آتلانماسینا سبب اولا بیلمکده‌دیرلر.",
        "brokenredirectstext": "آشاغی‌داکی ایستیقامتلندیرمه‌لر مؤوجود اولمایان صحیفه‌لره کئچید وئریر:",
        "brokenredirects-edit": "دَییشدیر",
        "brokenredirects-delete": "سیل",
-       "withoutinterwiki": "دیل باغلانتیلاری اولمایان صحیفه‌لر",
+       "withoutinterwiki": "دیل باغلانتیلاری اولمایان صفحه‌لر",
        "withoutinterwiki-summary": "آشاغیداکی صفحه‌لر، آیری دیل‌لره باغلانتیلاری یوخدور.",
        "withoutinterwiki-legend": "اؤن‌اَک",
        "withoutinterwiki-submit": "گؤستر",
        "protectedpages-reason": "نَدَن‌لیگی",
        "protectedpages-unknown-timestamp": "بیلینمه‌ین",
        "protectedpages-unknown-performer": "بیلینمه‌ین ایستیفاده‌چی",
-       "protectedtitles": "Ù\85حاÙ\81ظÙ\87â\80\8cÙ\84Û\8c Ø¨Ø§Ø´â\80\8cÙ\84Û\8cÙ\82â\80\8cلار",
+       "protectedtitles": "Ù\82Ù\88Ù\92رÙ\88Ù\86اÙ\86 Ø¨Ø§Ø´Ù\84Û\8cÙ\82لار",
        "protectedtitles-summary": "بۇ صحیفه، ایندیکی یارانماق‌دان قوْرونان باشلیقلاری لیست ائدیر. ایندیکی قوْرونان موْجود اوْلان صحیفه‌لرین لیستینی گؤرمک اۆچون، [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]-ه باخین.",
        "protectedtitlesempty": "حال-حاضردا، بو پارامئترلری قورونان هئچ بیر موضوع یوخ‌دور.",
        "listusers": "ایشلدن لیستی",
        "watchlist-hide": "گیزلت",
        "wlshowtime": "بو تاریخه قدر گؤستر:",
        "wlshowhideminor": "کیچیک دَییشدیرمه‌لر",
+       "wlshowhidebots": "روباتلار",
        "wlshowhideliu": "یازیلمیش ایشلدنلر",
        "wlshowhidemine": "منیم دَییشدیرمه‌لریم",
        "wlshowhidecategorization": "صفحه‌ بؤلمه‌لندیرمه‌سی",
        "rollbacklinkcount-morethan": "$1-دن چوْخ دییشدیرمه‌نی قایتار",
        "rollbackfailed": "گئری قایتارما اوغورسوزدور",
        "cantrollback": "دییشدیر گئری قایتاریلا بیلمز؛ آخیرینجی دییشدیر صحیفه‌ده اولان یئگانه فالیت‌دیر.",
-       "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}}]] ).",
+       "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]]}} ایله ائدیلمیش سون نوسخه‌یه، بیر گیزلی ایشلدن طرفین‌دن قایتاریلان دییشیکلیک‌لر",
        "protect-expiry-options": "1 ساهات:1 hour,1 گون:1 day,1 هفته:1 week,2 هفته:2 weeks,1 آی:1 month,3 آی:3 months,6 آی:6 months,1 ایل:1 year,سون سوز:infinite",
        "restriction-type": "حقوقلار",
        "restriction-level": "محدودیت درجه‌‌سی:",
-       "minimum-size": "ان کوچیک بویوت",
-       "maximum-size": "اÙ\86 Ø¨Ù\88Û\8cÙ\88Ú© Ø¨Ù\88Û\8cÙ\88ت",
+       "minimum-size": "ان کیچیک حجم",
+       "maximum-size": "اÙ\86 Ø¨Ù\88Û\8cÙ\88Ú© Ø­Ø¬Ù\85ï¼\9a",
        "pagesize": "(بایت)",
        "restriction-edit": "دَییشدیر",
        "restriction-move": "آدینی دَییشدیر",
        "sp-contributions-username": "آی‌پی آدرسی یوْخسا ایشلدن آدی:",
        "sp-contributions-toponly": "تکجه سون نوسخه اولان دییشیکلری گؤستر",
        "sp-contributions-newonly": "تکجه صفحه یاراتماق دَییشیکلیکلرینی گؤستر",
+       "sp-contributions-hideminor": "کیچیک دییشیکلیکلری گیزلت",
        "sp-contributions-submit": "آختار",
        "whatlinkshere": "بۇ صفحه‌‌يه باغلانتیلار",
        "whatlinkshere-title": "«$1»-ه باغلانان صفحه‌لر",
        "whatlinkshere-hidelinks": "$1 باغلانتیلاری",
        "whatlinkshere-hideimages": "فایل باغلانتیلارینی $1",
        "whatlinkshere-filters": "سۆزگَجلر",
+       "whatlinkshere-submit": "گئت",
        "autoblockid": "اوتوماتیک باغلانما #$1",
        "block": "ایستیفادچینی باغلاما",
        "unblock": "ایستیفاده‌چی‌نین باغلانماسین گؤتور",
        "tooltip-compareselectedversions": "بو صحیفه‌نین ایکی سئچیلمیش نوسخه‌لری‌نین فرقلرینه باخ",
        "tooltip-watch": "بو صفحه‌نی ایزله‌دیکلرینیزه آرتیر",
        "tooltip-watchlistedit-normal-submit": "باشلیغین سیلینمه‌سی",
-       "tooltip-watchlistedit-raw-submit": "ایزلدیگیم صحیفه‌لرین سیاهی‌سینین یئنی‌لنمه‌سی",
+       "tooltip-watchlistedit-raw-submit": "ایزلدیگیم صفحه‌لرین لیستینی یئنی‌له",
        "tooltip-recreate": "اول سیلینمه‌سینه باخمایا‌راق صحیفنی برپا ائت",
        "tooltip-upload": "یوکلمنی باشلات",
        "tooltip-rollback": "سوْنونجو ایشلدن طرفیندن ائدیلمیش بۆتون ديَیشیکلیک‌لری بیر دفعه‌‌يه گئری قايتار",
        "pageinfo-category-subcats": "آلت‌بؤلمه‌لرین سایی",
        "pageinfo-category-files": "فایل‌لارین سایی",
        "markaspatrolleddiff": "ایداره ائدیلمیش اولا‌راق ایشاره‌له",
-       "markaspatrolledtext": "صحیفنی پاتروللانمیش کیمی ایشاره‌له",
+       "markaspatrolledtext": "صفحه‌نی یوخلانیلمیش کیمی علامتله",
        "markedaspatrolled": "یوخلانیلدی",
        "markedaspatrolledtext": "[[:$1]] اوچون سئچیلمیش نوسخه گؤزدن کئچیریله‌رک ایشاره‌لندی.",
        "rcpatroldisabled": "سون دییشیک‌لیک‌لرین پاتروللانماسی قاداغان‌دیر",
        "markedaspatrollederrornotify": "دولانماق برچسبی مووفقیت سیز اولدو",
        "patrol-log-page": "دولانما ژورنالی",
        "patrol-log-header": "بو یوخلانمیش دییشیک‌لیک‌لرین ژورنالی‌دیر.",
-       "log-show-hide-patrol": "$1 پاترول گونده‌لیگی",
+       "log-show-hide-patrol": "$1 دولانما ژورنالی",
        "log-show-hide-tag": "اِتیکت ژورنالی $1",
        "deletedrevision": "کؤهنه نوسخه لری سیلیندی $1.",
        "filedeleteerror-short": "فایل سیلینرکن ختا: $1",
        "lag-warn-normal": "$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|سطرلر سیياهیسینی]] ده تشکیل ائده بیلرسینیز",
+       "watchlistedit-normal-legend": "ایزله‌مه لیستیندن عونوانلارین سیلینمه‌سی",
+       "watchlistedit-normal-explain": "ایزله‌مه لیستینیزدکی عونوانلار آشاغیدا گؤستریلمیشدیر. \nبیر باشلیغی سیلمک اوچون، يانینداکی قوتونو علامتله‌يین و «{{int:Watchlistedit-normal-submit}}» دويمه‌سینی باسین. \n[[Special:EditWatchlist/raw|چی لیستی]] ده دییشدیره بیلرسینیز.",
        "watchlistedit-normal-submit": "باشلیقین سیلینمه‌سی",
        "watchlistedit-normal-done": "{{PLURAL:$1|$1 صحیفه‌‌}} ایزله‌مه صحیفه‌‌لرینیزدن سیلیندی:",
        "watchlistedit-raw-title": "چیی ایزله‌دیکلری دَییشدیر",
        "watchlistedit-raw-legend": "چیی ایزله‌دیکلری دَییشدیر",
        "watchlistedit-raw-explain": "ایزله‌مه سیياهینیزدا باشلیقلار آشاغیدا گؤستریلیر. هر سطرده بیر باشلیق اولماق عذره، باشلیقلاری علاوه‌‌ ائده‌رک يا دا سیله‌رک سیياهینی تشکیل ائده بیلرسینیز. \nبیتدیگینده «{{int:Watchlistedit-raw-submit}}» يئ تیکلايینیز. \nآيریجا [[Special:EditWatchlist|استاندارت تنزیمله‌مه صحیفه‌‌سینی]] دا ایستیفاده ائده بیلرسینیز.",
-       "watchlistedit-raw-titles": "باشÙ\84Û\8cÙ\82لار:",
-       "watchlistedit-raw-submit": "ایزلدیگیم صحیفه‌لرین سیاهی‌سینین یئنی‌لنمه‌سی",
+       "watchlistedit-raw-titles": "عÙ\88Ù\86Ù\88اÙ\86لار:",
+       "watchlistedit-raw-submit": "ایزلدیگیم صفحه‌لرین لیستینی یئنی‌له",
        "watchlistedit-raw-done": "ایزله‌دیکلرینیز گونجل‌لندی.",
        "watchlistedit-raw-added": "{{PLURAL:$1|بیر|$1}} باشلیق آرلیریلدی:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|بیر|$1}} باشلیق چیخاریلدی:",
+       "watchlistedit-clear-title": "ایزلدیکلریمین لیستین سیل",
        "watchlistedit-clear-legend": "ایزلدیکلریمین لیستین سیل",
        "watchlistedit-clear-titles": "باشلیق‌لار:",
        "watchlisttools-clear": "ایزلدیکلریمین لیستین سیل",
        "feedback-thanks-title": "تشکورلر!",
        "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": "سیز وئردیگینیز دَییشیکلیکلرین قاباغی، بیر extension ایله قاباغی آلیندی.",
-       "api-error-http": "ایچری خطا: خیدمتچی‌یه باغلانماق اولونمادیر.",
-       "api-error-illegal-filename": "بو فایل آدینا ایجازه یوخدور.",
-       "api-error-internal-error": "ایچری خطا: سیزین فایلینیزی بو ویکی‌یه یوکله‌مک‌ده بیر ایشکال قاباغا گلدی.",
-       "api-error-invalid-file-key": "ایچری خطا: فایل، گئچرلی آنباردا تاپیلانمادی.",
-       "api-error-missingparam": "ایچری خطا: ایستک‌ده بعضی پارامترلر وئریلمه‌ییبلر.",
-       "api-error-missingresult": "ایچری خطا: کوپی‌نین باشاریلی اولدوغو بیلینمیر.",
-       "api-error-mustbeloggedin": "فایل یوکله‌مک اوچون، گیریش ائتمه‌لیسینیز.",
-       "api-error-mustbeposted": "ایچری خطا: بو ایستک اوچون HTTP POST لازیم‌دیر.",
-       "api-error-noimageinfo": "یوکله‌مک باشاریلی اولدور، اما خیدمت‌چی فایلا گؤره هئچ بیر بیلگیلر وئرمه‌دی.",
-       "api-error-nomodule": "ایچری خطا: هئچ بیر آپلود ماژولی یوخدور.",
-       "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": "{{PLURAL:$1|بیر|$1}} ثانیه",
        "duration-minutes": "{{PLURAL:$1|بیر|$1}} دقیقه",
        "duration-hours": "{{PLURAL:$1|بیر|$1}} ساعات",
index b4699c2..5470783 100644 (file)
@@ -27,7 +27,8 @@
                        "Кутлубаева Кунсулу Закиевна",
                        "Вильданова Гюзель",
                        "Ilmira",
-                       "Irus"
+                       "Irus",
+                       "Khanmarat"
                ]
        },
        "tog-underline": "Һылтанмалар аҫтына һыҙыу:",
        "about": "Тасуирлау",
        "article": "Мәҡәлә",
        "newwindow": "(яңы биттә)",
-       "cancel": "Ð\91Ó©Ñ\82Ó©Ñ\80Ó©Ñ\80гÓ\99",
+       "cancel": "Ð\9aиÑ\80е Ð°Ð»Ñ\8bÑ\80Ò\93а",
        "moredotdotdot": "Дауамы...",
        "morenotlisted": "Был исемлек тулы түгел",
        "mypage": "Бит",
        "talk": "Әңгәмә",
        "views": "Ҡарауҙар",
        "toolbox": "Ҡоралдар",
+       "tool-link-userrights": "{{GENDER:$1|Ҡатнашыусы}} төркөмдәрен үҙгәртергә",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Ҡатнашыусы|Ҡатнашыулар}} төркөмдәрен ҡарарға",
+       "tool-link-emailuser": "{{GENDER:$1|Ҡатнашыусыға}} хат яҙырға",
        "userpage": "Ҡулланыусы битен ҡарарға",
        "projectpage": "Проект битен ҡарарға",
        "imagepage": "Файл битен ҡарарға",
        "title-invalid-too-long": "Һоралған бит исеме бик оҙон. $1 {{PLURAL:$1|байттан}} артмаҫҡа тейеш.",
        "title-invalid-leading-colon": "Һораған бит башында ярамаған ике нөктә бар.",
        "perfcached": "Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.",
-       "perfcachedts": "Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе  {{PLURAL:$4|язма}} һаҡлана",
+       "perfcachedts": "Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе $4 {{PLURAL:$4|яҙма}} һаҡлана.",
        "querypage-no-updates": "Был битте яңыртыу хәҙер тыйылған.\nБында күрһәтелгән мәғлүмәттәр яңыртылмаясаҡ.",
        "viewsource": "Сығанаҡты ҡарау",
        "viewsource-title": "$1 битенең сығанаҡ текстын ҡарарға",
        "createacct-yourpasswordagain-ph": "Серһүҙҙе тағы бер тапҡыр яҙығыҙ",
        "userlogin-remembermypassword": "Системала ҡалырға",
        "userlogin-signwithsecure": "Һаҡланыулы тоташыу",
+       "cannotlogin-title": "инеп булмай",
+       "cannotlogin-text": "Инеү мөмкин түгел",
        "cannotloginnow-title": "Хәҙер үк инеп булмай",
        "cannotloginnow-text": "$1 файҙалланған ваҡытта инергә ярамай",
+       "cannotcreateaccount-title": "Иҫәп яҙмаһын булдырып булмай",
+       "cannotcreateaccount-text": "Был викила иҫәп яҙмаһын булдырыу ҡаралмаған.",
        "yourdomainname": "Һеҙҙең домен",
        "password-change-forbidden": "Был викиҙа серһүҙегеҙҙе үҙгәртә алмайһығыҙ.",
        "externaldberror": "Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.",
        "eauthentsent": "Күрһәтелгән электрон почта адресына адресты үҙгәртеүҙе раҫлауығыҙ өсөн хат ебәрелде. Хатта был адрес һеҙҙеке булғанын раҫлау өсөн ниндәй ғәмәлдәрҙе үтәү кәрәклеге тураһында мәғлүмәт бар.",
        "throttled-mailpassword": "Серһүҙҙе иҫләтеү ғәмәле {{PLURAL:$1|һуңғы $1 сәғәт}} эсенде ҡулланылды инде.\nНасар ниәтле ҡулланыуҙарға ҡаршы, Серһүҙ иҫләтеү ғәмәлен {{PLURAL:$1|1=сәғәт|$1 сәғәт}} эсендә бер тапҡыр ғына ҡулланырға була.",
        "mailerror": "Хат ебәреү хатаһы: $1",
-       "acct_creation_throttle_hit": "Һеҙҙең IP-адрестан бер тәүлек эсендә {{PLURAL:$1|$1 иҫәп яҙыуы}} яһалды инде, был һан был ваҡыт аралығы өсөн максимум һан. Шул сәбәпле, был IP-адресына эйә ҡулланыусылар, хәҙерге ваҡытта яңы иҫәп яҙыуы яһай алмайҙар.",
+       "acct_creation_throttle_hit": "Һеҙҙең IP-адрестан бер тәүлек эсендә {{PLURAL:$1|$1 иҫәп яҙыуы}} яһалды инде, был һан был ваҡыт аралығы өсөн максимум һан. Шул сәбәпле, был IP-адресына эйә ҡулланыусылар, хәҙерге ваҡытта яңы иҫәп яҙыуы яһай алмайҙар. Был ваҡыт эсендә $2 тапҡыр инеп була.",
        "emailauthenticated": "Электрон почта адресығыҙ раҫланды: $3, $2.",
        "emailnotauthenticated": "Электрон почта адресығыҙ раҫланмаған әле. Киләһе ғәмәлдәр өсөн электрон почта эшләмәйәсәк.",
        "noemailprefs": "Электрон почта адресығыҙ күрһәтелмәгән, шул сәбәпле викиның электрон почта функциялары ябыҡ.",
        "resetpass_submit": "Серһүҙ ҡуйырға һәм танышырға",
        "changepassword-success": "Серһүҙегеҙ уңышлы үҙгәртелде!",
        "changepassword-throttled": "Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.\nТағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.",
-       "botpasswords": "Роботтар серһүҙе.",
+       "botpasswords": "Роботтар серһүҙе",
        "botpasswords-summary": "<em>ПРобот пароле</em> API иҫәп яҙмаһына логин һәм паролһыҙ инергә мөмкинлек бирә. Робот пароле менән ингәндә ҡулланыусы хоҡуғы сикләнгән булыуы мөмкин.\n\nНи өсөн икәнен белмәһәгеҙ, быны эшләмәүегеҙ яҡшыраҡ.",
        "botpasswords-disabled": "Роботтар серһүҙе һүндерелгән.",
        "botpasswords-no-central-id": "Робот серһүҙен ҡулланыу өсөн үҙәк иҫәп яҙмаһына инергә кәрәк.",
        "botpasswords-updated-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе яңыртылды.",
        "botpasswords-deleted-title": "Робот серһүҙе юйылды.",
        "botpasswords-deleted-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе юйылды.",
-       "botpasswords-newpassword": "Инеү өсөн яңы серһүҙ <strong>$1</strong> — <strong>$2</strong>. <em>Артабан ҡулланыу өсөн яһып алығыҙ.</em>",
+       "botpasswords-newpassword": "Инеү өсөн яңы серһүҙ <strong>$1</strong> — <strong>$2</strong>. <em>Артабан ҡулланыу өсөн яһып алығыҙ.</em><strong>$3</strong> ҡатнашыусы исеме <strong>$4</strong> пароль сифаты)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ғәмәлдә түгел.",
        "botpasswords-restriction-failed": "Робот серһүҙе менән бәйле сәбәптәр булғанға инеү башҡарылманы.",
        "botpasswords-invalid-name": "Күрһәтелгән ҡулланыусы исемендә робот $1 серһүҙен бүлеүсе тамға юҡ.",
        "resetpass_forbidden-reason": "Серһүҙҙәр үҙгәртелә алмай: $1",
        "resetpass-no-info": "Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.",
        "resetpass-submit-loggedin": "Серһүҙҙе үҙгәртергә",
-       "resetpass-submit-cancel": "Ð\91Ó©Ñ\82Ó©Ñ\80Ó©Ñ\80гÓ\99",
+       "resetpass-submit-cancel": "Ð\9aиÑ\80е Ð°Ð»Ñ\8bÑ\80Ò\93а",
        "resetpass-wrong-oldpass": "Хаталы ваҡытлыса йәки ағымдағы серһүҙ.\nҺеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.",
        "resetpass-recycled": "Үҙегеҙҙекенән айырмалы серһүҙ һайлағыҙ.",
        "resetpass-temp-emailed": "Һеҙ электорон почта аша ебәрелгән ваҡытлыса серһүҙ менән индегеҙ. Инеүҙе башҡарыу өсөн яңы серһүҙ яҙығыҙ.",
        "passwordreset-emaildisabled": "Был викиҙа электрон почта функцияһы һүндерелгән.",
        "passwordreset-username": "Ҡулланыусы исеме:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Хәбәрҙең һуңғы хәлен ҡарарғамы?",
-       "passwordreset-capture-help": "Әгәр был билдәне ҡуйһағыҙ, ҡулланыусыға ебәрелгән ваҡытлыса серһүҙ һеҙгә күрһәтеләсәк.",
        "passwordreset-email": "Электрон почта адресы:",
        "passwordreset-emailtitle": "{{SITENAME}} иҫәп яҙыуы мәғлүмәттәре",
        "passwordreset-emailtext-ip": "Берәү (бәлки һәҙ, $1 IP-адресынан ) {{SITENAME}} ($4) проектындағы иҫәп яҙыуығыҙҙы хәтерләтеүҙе һоратты.\nКиләһе ҡулланыусы {{PLURAL:$3|1=иҫәп яҙыуы|иҫәп яҙыуҙары}} был электрон почта адресы менән бәйле:\n\n$2\n\nБыл ваҡытлыса {{PLURAL:$3|1=серһүҙ|серһүҙҙәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.\nҺеҙ системала танылырға һәм яңы серһүҙ һайларға тейешһегеҙ.\nӘгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙегеҙҙе ҡулланыуҙы дауам итегеҙ.",
        "minoredit": "Әҙ генә үҙгәрештәр",
        "watchthis": "Күҙәтеү исемлегенә",
        "savearticle": "Яҙҙырып ҡуйырға",
+       "savechanges": "Яҙҙырып ҡуйырға",
        "publishpage": "Битте баҫтырырға",
+       "publishchanges": "Яҙҙырып ҡуйырға",
        "preview": "Ҡарап сығыу",
        "showpreview": "Ҡарап сығырға",
        "showdiff": "Индерелгән үҙгәрештәр",
        "searchprofile-advanced-tooltip": "Махсус исем арауыҡтарында эҙләргә",
        "search-result-size": "$1 ({{PLURAL:$2|1=$2 һүҙ|$2 һүҙ}})",
        "search-result-category-size": "{{PLURAL:$1|1=$1 ағза}} ({{PLURAL:$2|$2 эске категория}}, {{PLURAL:$3|$3 файл}})",
-       "search-redirect": "(йүнәлтеү $1)",
+       "search-redirect": "($1 битенән йүнәлтеү)",
        "search-section": "($1 бүлеге)",
        "search-category": "(категория $1)",
        "search-file-match": "(файл эстәлеге менән тура килә)",
        "saveprefs": "Һаҡларға",
        "restoreprefs": "Алдан ҡуйылған көйләүҙәрҙе тергеҙергә",
        "prefs-editing": "Мөхәррирләү",
-       "rows": "Юлдар:",
-       "columns": "Бағаналар:",
        "searchresultshead": "Эҙләү",
        "stub-threshold": "Яһалма һылтамаларҙың биҙәлеше буйынса сикләүҙәр ($1):",
        "stub-threshold-sample-link": "миҫал",
        "userrights-reason": "Сәбәп:",
        "userrights-no-interwiki": "Һеҙҙең башҡа вики-проекттарҙа ҡатнашыусыларҙың хоҡуҡтарын үҙгәртергә хоҡуҡтарығыҙ юҡ.",
        "userrights-nodatabase": "$1 базаһы юҡ йәки урындағы (локаль) база түгел.",
-       "userrights-nologin": "Ҡатнашыусыларҙың хоҡуҡтарын билдәләр өсөн, һеҙ хаким хоҡуҡтары менән [[Special:UserLogin|танылырға]] тейешһегеҙ.",
-       "userrights-notallowed": "Һеҙгә ҡатнашыусыларҙың хоҡуҡтарын өҫтәргә йәки юҡ итергә рөхсәт ителмәгән.",
        "userrights-changeable-col": "Һеҙ үҙгәртә алған төркөмдәр",
        "userrights-unchangeable-col": "Һеҙ үҙгәртә алмаған төркөмдәр",
        "userrights-conflict": "Ҡатнашыусының хоҡуҡтарын үҙгәртеү яраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм яңынан индерегеҙ.",
-       "userrights-removed-self": "Һеҙ үҙ хоҡуҡтарығыҙҙы уңышлы юҡ иттегеҙ. Шулай итеп, был биткә башҡаса инә алмаясаҡһығыҙ.",
        "group": "Төркөм:",
        "group-user": "Ҡулланыусылар",
        "group-autoconfirmed": "Автоматик раҫланған ҡулланыусылар",
        "right-siteadmin": "Мәғлүмәттәр базаһын асыу һәм ябыу",
        "right-override-export-depth": "5-се тәрәнлеккә тиклем бәйле биттәре менән бергә биттәрҙе сығарыу",
        "right-sendemail": "Башҡа ҡатнашыусыларға электрон почта аша хат ебәреү",
-       "right-passwordreset": "Серһүҙҙе яңыртыу осраҡтарын ҡарау",
        "right-managechangetags": "[[Special:Tags|Билдәләрҙе]] төҙөү һәм (де)активация",
        "right-applychangetags": " [[Special:Tags|тамғаһын]] үҙегеҙҙең төҙөтеү менән ҡулланырға",
        "right-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда[[Special:Tags|тамғаһын]] өҫтәү һәм юйыу",
        "uploaded-setting-handler-svg": "SVG«handler» атрибутын өҫтәүсе SVG блокланды.Тейәлгән SVG-файлда  <code>$1=\"$2\"</code> конструкцияһы табылды.",
        "uploaded-remote-url-svg": "SVG«handler» атрибутын өҫтәүсе SVG блокланды.Тейәлгән SVG-файлда  <code>$1=\"$2\"</code> конструкцияһы табылды.",
        "uploaded-image-filter-svg": "Тейәлгән SVG-файлда рәсемдәр фильтры табылды URL-адресом <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": " SVG-файлында ярамаған исем бар '$1'",
+       "uploadscriptednamespace": " SVG-файлында ярамаған исем бар '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "Тейәлгән файлда анализлап булмай XML .",
        "uploadvirus": "Файлда вирус бар!\nТулыраҡ мәғлүмәт: $1",
        "uploadjava": "Был, эсендә Java .class файлы булған ZIP-архив.\nИменлек өсөн Java-файлдарын тейәү тыйылған.",
        "contributions": "{{GENDER:$1|Ҡатнашыусы}} башҡарған эш",
        "contributions-title": "$1 исемле ҡатнашыусы башҡарған эш",
        "mycontris": "Башҡарған эштәр",
-       "anoncontribs": "Ð\98Ò\93Ó\99нÓ\99ләр",
+       "anoncontribs": "Ð\91аÑ\88ҡаÑ\80Ò\93ан Ñ\8dÑ\88Ñ\82әр",
        "contribsub2": "{{GENDER:$3|$1}} башҡарған эше ($2)",
        "contributions-userdoesnotexist": "«$1» исемле иҫәп яҙыуы юҡ.",
        "nocontribs": "Күрһәтелгән шарттарға яуап биргән үҙгәртеүҙәр табылманы.",
        "feedback-thanks": "Рәхмәт! Һеҙҙең фекерегеҙ «[$2 $1]» битенә өҫтәлде.",
        "feedback-thanks-title": "Рәхмәт!",
        "feedback-useragent": "Браузер:",
-       "searchsuggest-search": "Эҙләү",
+       "searchsuggest-search": "{{SITENAME}} эсендә эҙләү",
        "searchsuggest-containing": "эстәлегендә...",
-       "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
-       "api-error-blocked": "Мөхәррирләү һеҙҙең өсөн бикләнде.",
-       "api-error-copyuploaddisabled": "Был серверҙа URL адрес буйынса йөкләү өҙөлгән",
-       "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|файл}}  бар.",
-       "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|башҡа файл}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
-       "api-error-empty-file": "Һеҙ ебәргән файл буш.",
        "api-error-emptypage": "Яңы буш биттәр яһау тыйыла.",
-       "api-error-fetchfileerror": "Эске хата: файлды күсергән ваҡытта хата китте",
-       "api-error-fileexists-forbidden": "«$1» исемле файл бар һәм өҫтөнә яҙып булмай.",
-       "api-error-fileexists-shared-forbidden": "«$1» исемле файл уртаҡ файлдар һаҡлағысында бар һәм өҫтөнә яҙып булмай.",
-       "api-error-file-too-large": "Һеҙ ебәргән файл үтә ҙур.",
-       "api-error-filename-tooshort": "Файл исеме бик ҡыҫҡа.",
-       "api-error-filetype-banned": "Был файл төрө тыйылған.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|1=тыйылған файл төрө|тыйылған файл төрҙәре}}. Рөхсәт ителгән {{PLURAL:$3|1=файл төрө|файл төрҙәре}} $2.",
-       "api-error-filetype-missing": "Был файлдың ҡушымтаһы юҡ",
-       "api-error-hookaborted": "Һеҙ эшләргә теләгән үҙгәртеүҙәр ҡушымтаны тикшереүсе тарафынан өҙөлдө",
-       "api-error-http": "Эске хата: серверға бәйләнеп булмай.",
-       "api-error-illegal-filename": "Рөхсәт ителмәгән файл исеме.",
-       "api-error-internal-error": "Эске хата: һеҙ викиға йөкләгәнде тикшергән ваҡытта хата китте",
-       "api-error-invalid-file-key": "Эске хата: ваҡытлыса һаҡлағыста файл табылманы",
-       "api-error-missingparam": "Эске хата: мөрәжәғеттең параматрҙары юҡ.",
-       "api-error-missingresult": "Эске хата: күсереү уңышлы булыуын билдәләп булманы.",
-       "api-error-mustbeloggedin": "Файлдарҙы йөкмәтеү өсөн һеҙ сисемаға танышырға тейешһегеҙ.",
-       "api-error-mustbeposted": "Эске хата: мөрәжәғәт HTTP POST адресын талап итә.",
-       "api-error-noimageinfo": "Йөкләү уңышлы тамамланды, әммә сервер файл тураһында бер ниндәйҙә мәғлүмәт бирмәне.",
-       "api-error-nomodule": "Эске хата: тейәү модуле көйләнмәгән.",
-       "api-error-ok-but-empty": "Эске хата: серверҙан яуап юҡ.",
-       "api-error-overwrite": "Булған файлды алыштырыу рөхсәт ителмәй.",
-       "api-error-stashfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
        "api-error-publishfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
-       "api-error-stasherror": "Файлы һаҡлағысҡа тейәгән ваҡытта хата китте.",
-       "api-error-stashedfilenotfound": "Ваҡытлыса һаҡлағыстан файлы тейәгән ваҡытта сығанаҡ файл табылманы.",
-       "api-error-stashpathinvalid": "Ваҡытлыса һаҡлағыста урынлашҡан файл юлы дөрөҫ түгел.",
-       "api-error-stashfilestorage": "Файлды һаҡлағысҡа тейәгән ваҡытта хата китте.",
-       "api-error-stashzerolength": "Сервер файлды ваҡытлыса һаҡлағыста һаҡлау алмай, сөнкт оҙонлоғо 0.",
-       "api-error-stashnotloggedin": "Файлды ваҡытлыса һаҡлағысҡа урынлаштырыу өсөн һеҙ системаҡа инергә тейешһегеҙ.",
-       "api-error-stashwrongowner": "Ваҡытлыса һаҡлағыстағы файлда асырға теләнегеҙ, был файл һеҙҙеке түгел",
-       "api-error-stashnosuchfilekey": "Ваҡытлыса һаҡлағыста һеҙ асырға теләгән файлдың асҡысы юҡ.",
-       "api-error-timeout": "Көтөлгән ваҡыт эсендә сервер яуып бирмәне.",
-       "api-error-unclassified": "Билдәһеҙ хата барлыҡҡа килде.",
-       "api-error-unknown-code": "Билдәһеҙ хата: «$1»",
-       "api-error-unknown-error": "Эске хата: файлды йөкләгәндә ниндәйҙер хата китте.",
+       "api-error-stashfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
        "api-error-unknown-warning": "Билдәһеҙ белдереү: \"$1\".",
        "api-error-unknownerror": "Билдәһеҙ хата: «$1»",
-       "api-error-uploaddisabled": "Был викила файл тейәү мөмкинлеге ябылған.",
-       "api-error-verification-error": "Был файл боҙолған, йәки дөрөҫ булмаған ҡушымтаһы бар.",
        "duration-seconds": "$1 {{PLURAL:$1|1=секунд|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|1=минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|1=сәғәт|сәғәт}}",
        "changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
        "removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
        "removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
-       "credentialsform-account": "Иҫәп яҙмаһы исеме:",
-       "edit-error-short": "Хата: $1"
+       "credentialsform-account": "Иҫәп яҙмаһы исеме:"
 }
index 23b877e..0fec39a 100644 (file)
        "passwordreset-emaildisabled": "ایمیلء حالتان مان ائ ویکیء نافعال بیتگ انت.",
        "passwordreset-username": "کار زوروکی نام:",
        "passwordreset-domain": "دامین:",
-       "passwordreset-capture": "آسریگین ایمیل پیش دارگ بیت؟",
-       "passwordreset-capture-help": "اگان ائ گزینگ رء نشانیگ بهل ات، یک ایمیلء (گون موکتین پسوردء) شما رء پیش دارگ بیت ءُ هنچوش پر کاربرء راهیگ بیت انت.",
        "passwordreset-email": "ایمیل ادرس:",
        "passwordreset-emailtitle": "اکانتء جزئیات مان {{SITENAME}}",
        "passwordreset-emailtext-ip": "یک شهسء (بلکین شما، گون آی‌پیء نشانیگ $1) شمئی پسوردء واترء {{SITENAME}} ($4) لوٹتگ انت. {{PLURAL:$3|اکانت|اکانتان}} گون ائ ایمیل ادرسء همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما پیکن انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان شمئی پگر انت که ادگر شهسء ائ لوٹء راهیگ کتگ یانکه وتی پیسریگین پسوردء هیال کت ات ءُ رندء نلوٹیت آئرا ٹگل دئیت، بیت که ائ پیگامء ناگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
        "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-siteadmin": "کبل و پچ دیتابیس",
        "right-override-export-depth": "درگیزگ صفحات گون صفحاتی لینک بوتگین ته سطح ۵",
        "right-sendemail": "پر ادگران ایمیلء راهیگ بکن ات",
-       "right-passwordreset": "ایمیل پر پسوردء واترء بچار ات",
        "newuserlogpage": "ورود شرکتن کاربر",
        "newuserlogpagetext": ".شی یک ورودی چه شرکتن کاربر",
        "rightslog": "ورودان حقوق کاربر",
        "uploaddisabledtext": "آپلود فایل غیر فعال انت.",
        "php-uploaddisabledtext": "آپلود کتن فایل ته پی‌اچ‌پی فعال نهنت. تنظیم file_uploads کنترل کنیت.",
        "uploadscripted": "ای فایل شامل کد HTML یا اسکریپت انت که شاید گون وب بروزر اشتباهی وانگ بیت.",
-       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
+       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '<nowiki>$1</nowiki>' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "فایل یک ویروسی داریتن! جزییات: $1",
        "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
index 65ab9e5..563a628 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": "Паказаць старонку праекту",
        "passwordreset-emaildisabled": "Функцыі электроннай пошты ў гэтай вікі былі адключаныя.",
        "passwordreset-username": "Імя ўдзельніка:",
        "passwordreset-domain": "Дамэн:",
-       "passwordreset-capture": "Паказаць выніковы электронны ліст?",
-       "passwordreset-capture-help": "Калі Вы пазначыце гэтае поле, электронны ліст (з часовым паролем) будзе паказаны Вам, як толькі ён будзе дасланы ўдзельніку.",
        "passwordreset-email": "Адрас электроннай пошты:",
        "passwordreset-emailtitle": "Падрабязнасьці рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Нехта (магчыма Вы, з IP-адрасу $1) зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
        "passwordreset-emailsentemail": "Калі гэты адрас электроннай пошты далучаны да вашага рахунку, тады будзе дасланы ліст пра скідваньне паролю.",
        "passwordreset-emailsentusername": "Калі ёсьць адрас электроннай пошты, злучаны з гэтым імем удзельніка, тады будзе дасланы ліст пра скідваньне паролю.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|1=Электронны ліст|Электронныя лісты}} скіданьня паролю {{PLURAL:$1|1=быў дасланы|былі дасланыя}}. {{PLURAL:$1|1=Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя тут.",
-       "passwordreset-emailerror-capture2": "Не атрымалася даслаць {{GENDER:$2|удзельніку|удзельніцы}} ліст электроннай поштай: $1 {{PLURAL:$3|1=Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя тут.",
        "passwordreset-nocaller": "Мусіць быць пададзены той, хто робіць выклік",
        "passwordreset-nosuchcaller": "Аўтар выкліку не існуе: $1",
        "passwordreset-ignored": "Скіданьне паролю не адбылося. Магчыма, ня быў наладжаны пастаўшчык?",
        "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
        "missingcommentheader": "<strong>Напамін:</strong> Вы не пазначылі загаловак камэнтара. Калі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Вашая зьмена будзе захаваная без камэнтара.",
-       "summary-preview": "Папярэдні прагляд апісаньня:",
+       "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}}|адміністратараў]], каб абмеркаваць блякаваньне. Заўважце, што Вы ня зможаце ўжыць магчымасьць «даслаць ліст па электроннай пошце», пакуль не пазначыце сапраўдны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], і калі гэта Вам не было забаронена.\nВаш IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што Вы будзеце рабіць.",
        "autoblockedtext": "Ваш IP-адрас быў аўтаматычна заблякаваны, таму што ён ужываўся іншым удзельнікам, які быў заблякаваны $1.\nПрычына гэтага:\n\n:<em>$2</em>\n\n* Блякаваньне пачалося: $8\n* Блякаваньне скончыцца: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці з адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне.\n\nЗаўважце, што Вы ня зможаце ўжываць магчымасьць «даслаць ліст праз электронную пошту», пакуль ня будзе пазначаны дзейны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах удзельніка]], і калі гэта Вам не было забаронена.\n\nВаш цяперашні IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што Вы будзеце рабіць.",
+       "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблякаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:<em>$2</em>\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.",
        "blockednoreason": "прычына не пазначана",
        "whitelistedittext": "Вам трэба $1, каб рэдагаваць старонкі.",
        "confirmedittext": "Вы мусіце пацьвердзіць Ваш адрас электроннай пошты перад рэдагаваньнем старонак. Калі ласка, пазначце і пацьвердзіце адрас электроннай пошты праз Вашы [[Special:Preferences|налады]].",
        "userinvalidcssjstitle": "<strong>Папярэджаньне:</strong> няма тэмы афармленьня «$1».\nПамятайце, што ўласныя старонкі .css і .js павінны мець назву, якая складаецца з малых літараў, напрыклад, {{ns:user}}:Хтосьці/vector.css, а не {{ns:user}}:Хтосьці/Vector.css.",
        "updated": "(Абноўлена)",
        "note": "<strong>Заўвага:</strong>",
-       "previewnote": "'''Гэта толькі папярэдні прагляд.'''\nВашыя зьмены яшчэ не былі захаваныя!",
+       "previewnote": "<strong>Гэта толькі папярэдні прагляд.</strong>\nВашыя зьмены яшчэ не былі захаваныя!",
        "continue-editing": "Перайсьці да рэдагаваньня",
        "previewconflict": "Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.",
        "session_fail_preview": "Выбачайце! Мы не змаглі апрацаваць вашую праўку праз страту зьвестак сэсіі.\n\nМагчыма, вы выйшлі з сыстэмы. <strong>Калі ласка, праверце, што вы знаходзіцеся ў сыстэме і паспрабуйце яшчэ раз<strong>. Калі не спрацуе, паспрабуйце [[Special:UserLogout|выйсьці]] і ўвайсьці яшчэ раз, а таксама праверце, што ваш браўзэр дазваляе файлы-кукі з гэтага сайту.",
        "session_fail_preview_html": "Выбачайце! Мы не змаглі апрацаваць вашую праўку праз страту зьвестак сэсіі.\n\n<em>Таму што ў {{GRAMMAR:месны|{{SITENAME}}}} дазволена выкарыстоўваць чысты HTML, папярэдні прагляд быў адключаны для засьцярогі ад атакаў праз JavaScript.</em>\n\n<strong>Калі гэта сапраўдная спроба рэдагаваньня, калі ласка, паспрабуйце яшчэ раз.</strong>\nКалі гэта не дапамагае, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў, а таксама праверце, што ваш браўзер дазваляе кукі-файлы з гэтага сайту.",
-       "token_suffix_mismatch": "'''Вашае рэдагаваньне было адхіленае, таму што Ваш кліент ня можа апрацоўваць знакі пунктуацыі ў акне рэдагаваньня.\nРэдагаваньне было скасаванае для таго, каб пазьбегнуць зьнішчэньня тэксту старонкі.\nТакія памылкі здараюцца, калі Вы выкарыстоўваеце ананімны проксі-сэрвэр, які ўтрымлівае памылкі.'''",
-       "edit_form_incomplete": "'''Некаторыя часткі формы рэдагаваньня не дасягнулі сэрвэра. Упэўніцеся, што Вашыя рэдагаваньні не пашкоджаныя і паспрабуйце зноў.'''",
+       "token_suffix_mismatch": "<strong>Вашае рэдагаваньне было адхіленае, таму што Ваш кліент псуе знакі пунктуацыі ў жэтоне рэдагаваньня.</strong>\nРэдагаваньне было скасаванае для таго, каб пазьбегнуць зьнішчэньня тэксту старонкі.\nТакія памылкі здараюцца, калі Вы выкарыстоўваеце ананімны проксі-сэрвэр, які ўтрымлівае памылкі.",
+       "edit_form_incomplete": "<strong>Некаторыя часткі формы рэдагаваньня не дасягнулі сэрвэра. Упэўніцеся, што Вашыя рэдагаваньні не пашкоджаныя і паспрабуйце зноў.</strong>",
        "editing": "Рэдагаваньне: $1",
        "creating": "Стварэньне «$1»",
        "editingsection": "Рэдагаваньне $1 (разьдзел)",
-       "editingcomment": "Рэдагаваньне: $1 (новая сэкцыя)",
+       "editingcomment": "Рэдагаваньне $1 (новы разьдзел)",
        "editconflict": "Канфлікт рэдагаваньняў: $1",
-       "explainconflict": "Ð\9dеÑ\85Ñ\82а Ð·Ñ\8cмÑ\8fнÑ\96Ñ\9e Ñ\81Ñ\82аÑ\80онкÑ\83 Ð¿Ð°Ð´Ñ\87аÑ\81 Ð\92аÑ\88ага Ñ\80Ñ\8dдагаванÑ\8cнÑ\8f.\nУ Ð²ÐµÑ\80Ñ\85нÑ\96м Ñ\82Ñ\8dкÑ\81Ñ\82авÑ\8bм Ð°ÐºÐ½Ðµ Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\86а Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82 Ñ\81Ñ\82аÑ\80онкÑ\96.\nÐ\92аÑ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ\8bÑ\8f Ñ\9e Ð½Ñ\96жнÑ\96м Ð°ÐºÐ½Ðµ.\nÐ\92ам Ñ\82Ñ\80Ñ\8dба Ð¿ÐµÑ\80анеÑ\81Ñ\8cÑ\86Ñ\96 Ð\92аÑ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ñ\9e Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ñ\82Ñ\8dкÑ\81Ñ\82.\nÐ\9aалÑ\96 Ð\92Ñ\8b Ð½Ð°Ñ\86Ñ\96Ñ\81Ñ\8cнÑ\96Ñ\86е Â«{{int:savearticle}}», Ð±Ñ\83дзе Ð·Ð°Ñ\85аванÑ\8b '''Ñ\82олÑ\8cкÑ\96''' тэкст верхняга вакна.",
+       "explainconflict": "Ð\9dеÑ\85Ñ\82а Ð·Ñ\8cмÑ\8fнÑ\96Ñ\9e Ñ\81Ñ\82аÑ\80онкÑ\83 Ð¿Ð°Ð´Ñ\87аÑ\81 Ð²Ð°Ñ\88ага Ñ\80Ñ\8dдагаванÑ\8cнÑ\8f.\nУ Ð²ÐµÑ\80Ñ\85нÑ\96м Ñ\82Ñ\8dкÑ\81Ñ\82авÑ\8bм Ð°ÐºÐ½Ðµ Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\86а Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82 Ñ\81Ñ\82аÑ\80онкÑ\96.\nÐ\92аÑ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ\8bÑ\8f Ñ\9e Ð½Ñ\96жнÑ\96м Ð°ÐºÐ½Ðµ.\nÐ\92ам Ñ\82Ñ\80Ñ\8dба Ð¿ÐµÑ\80анеÑ\81Ñ\8cÑ\86Ñ\96 Ð²Ð°Ñ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ñ\9e Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ñ\82Ñ\8dкÑ\81Ñ\82.\nÐ\9aалÑ\96 Ð²Ñ\8b Ð½Ð°Ñ\86Ñ\96Ñ\81Ñ\8cнÑ\96Ñ\86е Â«{{int:savearticle}}», Ð±Ñ\83дзе Ð·Ð°Ñ\85аванÑ\8b <strong>Ñ\82олÑ\8cкÑ\96</strong> тэкст верхняга вакна.",
        "yourtext": "Ваш тэкст",
        "storedversion": "Захаваная вэрсія",
-       "nonunicodebrowser": "'''ПАПЯРЭДЖАНЬНЕ: Ваш браўзэр не працуе з кадаваньнем UTF-8 (Unicode).\nУ выніку гэтага ўсе сымбалі ня ўключаныя ў ASCII будуць замененыя на іх шаснаццаткавыя коды.'''",
-       "editingold": "'''ПАПЯРЭДЖАНЬНЕ: Вы рэдагуеце састарэлую вэрсію гэтай старонкі.\nКалі Вы паспрабуеце захаваць яе, любыя зьмены, зробленыя пасьля гэтай вэрсіі, будуць страчаныя.'''",
+       "nonunicodebrowser": "<strong>Папярэджаньне: ваш браўзэр не падтрымлівае Unicode-кадаваньне.</strong>\nУ выніку гэтага ўсе сымбалі ў полі рэдагаваньня, ня ўключаныя ў ASCII, будуць замененыя на іх шаснаццаткавыя коды.",
+       "editingold": "<strong>Папярэджаньне: вы рэдагуеце састарэлую вэрсію гэтай старонкі.</strong>\nКалі вы паспрабуеце захаваць яе, любыя зьмены, зробленыя пасьля гэтай вэрсіі, будуць страчаныя.",
        "yourdiff": "Адрозьненьні",
-       "copyrightwarning": "Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð·Ñ\8cвÑ\8fÑ\80нÑ\96Ñ\86е Ñ\9eвагÑ\83 Ð½Ð° Ñ\82ое, Ñ\88Ñ\82о Ñ\9eÑ\81е Ð´Ð°Ð´Ð°Ñ\82кÑ\96 Ñ\96 Ð·Ñ\8cменÑ\8b Ñ\9e {{GRAMMAR:меÑ\81нÑ\8b|{{SITENAME}}}} Ñ\80азглÑ\8fдаÑ\8eÑ\86Ñ\86а Ñ\8fк Ð²Ñ\8bдадзенÑ\8bÑ\8f Ñ\9e Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ð°Ñ\81Ñ\8cÑ\86Ñ\96 Ð· Ñ\83мовамÑ\96 Ð»Ñ\96Ñ\86Ñ\8dнзÑ\96Ñ\96 $2 (глÑ\8fдзÑ\96Ñ\86е Ð¿Ð°Ð´Ñ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\96 Ð½Ð° $1). Ð\9aалÑ\96 Ð\92Ñ\8b Ñ\81Ñ\83пÑ\80аÑ\86Ñ\8c Ñ\82аго, ÐºÐ°Ð± Ð\92аÑ\88Ñ\8bÑ\8f Ð¼Ð°Ñ\82Ñ\8dÑ\80Ñ\8bÑ\8fлÑ\8b Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð° Ñ\80Ñ\8dдагавалаÑ\81Ñ\8f Ñ\96 Ñ\80аÑ\81паÑ\9eÑ\81Ñ\8eджвалаÑ\81Ñ\8f, Ð½Ðµ Ð´Ð°Ð´Ð°Ð²Ð°Ð¹Ñ\86е Ñ\96Ñ\85.<br />\nÐ\92Ñ\8b Ñ\82акÑ\81ама Ð°Ð±Ð°Ð²Ñ\8fзÑ\83еÑ\86еÑ\81Ñ\8f, Ñ\88Ñ\82о Ð\92аÑ\88 Ð¼Ð°Ñ\82Ñ\8dÑ\80Ñ\8bÑ\8fл Ð½Ð°Ð¿Ñ\96Ñ\81анÑ\8b Ð°Ñ\81абÑ\96Ñ\81Ñ\82а Ð\92амÑ\96 Ð°Ð±Ð¾ Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86Ñ\86а Ð³Ñ\80амадзкÑ\96м Ð½Ð°Ð±Ñ\8bÑ\82кам, Ð°Ð»Ñ\8cбо Ñ\9eзÑ\8fÑ\82Ñ\8b Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ñ\8bÑ\85 Ð²Ð¾Ð»Ñ\8cнÑ\8bÑ\85 ÐºÑ\80Ñ\8bнÑ\96Ñ\86аÑ\9e.\n'''Ð\9dÐ\95Ð\9bЬÐ\93Ð\90 Ð\91Ð\95Ð\97 Ð\94Ð\90Ð\97Ð\92Ð\9eÐ\9bУ Ð\94Ð\90Ð\94Ð\90Ð\92Ð\90ЦЬ Ð\9cÐ\90ТЭРЫЯÐ\9bЫ, Ð\90Ð\91Ð\90РÐ\9eÐ\9dÐ\95Ð\9dЫЯ Ð\90Ð\8eТÐ\90РСÐ\9aÐ\86Ð\9c Ð\9fРÐ\90Ð\92Ð\90Ð\9c!'''",
-       "copyrightwarning2": "Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð·Ð°Ñ\9eважÑ\86е, Ñ\88Ñ\82о Ñ\9eвеÑ\81Ñ\8c Ñ\83нÑ\91Ñ\81ак Ñ\9e {{GRAMMAR:вÑ\96навалÑ\8cнÑ\8b|{{SITENAME}}}} Ð¼Ð¾Ð¶Ð° Ñ\80Ñ\8dдагаваÑ\86Ñ\86а, Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\86а Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\86а Ñ\96нÑ\88Ñ\8bмÑ\96 Ñ\9eдзелÑ\8cнÑ\96камÑ\96.\nÐ\9aалÑ\96 Ð\92Ñ\8b Ð· Ð³Ñ\8dÑ\82Ñ\8bм Ð½Ñ\8f Ð·Ð³Ð¾Ð´Ð½Ñ\8bÑ\8f, ÐºÐ°Ð»Ñ\96 Ð»Ð°Ñ\81ка, Ð½Ðµ Ð·Ñ\8cмÑ\8fÑ\88Ñ\87айÑ\86е Ñ\81Ñ\8eдÑ\8b Ð\92аÑ\88Ñ\8bÑ\8f Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\8b.<br />\nРазÑ\8cмÑ\8fÑ\88Ñ\87Ñ\8dнÑ\8cнем Ñ\82Ñ\83Ñ\82 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e, Ð\92Ñ\8b Ð´Ñ\8dклÑ\8fÑ\80Ñ\83еÑ\86е, Ñ\88Ñ\82о Ð\92Ñ\8b Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86еÑ\81Ñ\8f Ñ\96Ñ\85 Ð°Ñ\9eÑ\82аÑ\80ам, Ñ\86Ñ\96 Ð\92Ñ\8b Ñ\81капÑ\96Ñ\8fвалÑ\96 Ñ\96Ñ\85 Ð· ÐºÑ\80Ñ\8bнÑ\96Ñ\86Ñ\8b, Ñ\8fкаÑ\8f Ð´Ð°Ð·Ð²Ð°Ð»Ñ\8fе Ð²Ð¾Ð»Ñ\8cнае Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне Ñ\81ваÑ\96Ñ\85 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e (дзелÑ\8f Ð¿Ð°Ð´Ñ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\8fÑ\9e Ð³Ð»Ñ\8fдзÑ\96Ñ\86е $1).\n\n'''Ð\9aÐ\90Ð\9bÐ\86 Ð\9bÐ\90СÐ\9aÐ\90, Ð\9dÐ\95 Ð\97ЬÐ\9cЯШЧÐ\90Ð\99ЦÐ\95 Ð¢Ð£Ð¢ Ð\91Ð\95Ð\97 Ð\94Ð\90Ð\97Ð\92Ð\9eÐ\9bУ Ð\9cÐ\90ТЭРЫЯÐ\9bЫ, Ð¯Ð\9aÐ\86Я Ð\90Ð¥Ð\9eÐ\8eÐ\92Ð\90ЮЦЦÐ\90 Ð\90Ð\8eТÐ\90РСÐ\9aÐ\86Ð\9c Ð\9fРÐ\90Ð\92Ð\90Ð\9c!'''",
+       "copyrightwarning": "Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð·Ñ\8cвÑ\8fÑ\80нÑ\96Ñ\86е Ñ\9eвагÑ\83 Ð½Ð° Ñ\82ое, Ñ\88Ñ\82о Ñ\9eÑ\81е Ð´Ð°Ð´Ð°Ñ\82кÑ\96 Ñ\96 Ð·Ñ\8cменÑ\8b Ñ\9e {{GRAMMAR:меÑ\81нÑ\8b|{{SITENAME}}}} Ñ\80азглÑ\8fдаÑ\8eÑ\86Ñ\86а Ñ\8fк Ð²Ñ\8bдадзенÑ\8bÑ\8f Ñ\9e Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ð°Ñ\81Ñ\8cÑ\86Ñ\96 Ð· Ñ\83мовамÑ\96 Ð»Ñ\96Ñ\86Ñ\8dнзÑ\96Ñ\96 $2 (глÑ\8fдзÑ\96Ñ\86е Ð¿Ð°Ð´Ñ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\96 Ð½Ð° $1). Ð\9aалÑ\96 Ð²Ñ\8b Ñ\81Ñ\83пÑ\80аÑ\86Ñ\8c Ñ\82аго, ÐºÐ°Ð± Ð²Ð°Ñ\88Ñ\8bÑ\8f Ð¼Ð°Ñ\82Ñ\8dÑ\80Ñ\8bÑ\8fлÑ\8b Ð½ÐµÐ°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð° Ñ\80Ñ\8dдагавалаÑ\81Ñ\8f Ñ\96 Ñ\80аÑ\81паÑ\9eÑ\81Ñ\8eджвалаÑ\81Ñ\8f, Ð½Ðµ Ð´Ð°Ð´Ð°Ð²Ð°Ð¹Ñ\86е Ñ\96Ñ\85.<br />\nÐ\92Ñ\8b Ñ\82акÑ\81ама Ð°Ð±Ð°Ð²Ñ\8fзÑ\83еÑ\86еÑ\81Ñ\8f, Ñ\88Ñ\82о Ð²Ð°Ñ\88 Ð¼Ð°Ñ\82Ñ\8dÑ\80Ñ\8bÑ\8fл Ð½Ð°Ð¿Ñ\96Ñ\81анÑ\8b Ð°Ñ\81абÑ\96Ñ\81Ñ\82а Ð²Ð°Ð¼Ñ\96 Ð°Ð±Ð¾ Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86Ñ\86а Ð³Ñ\80амадзкÑ\96м Ð½Ð°Ð±Ñ\8bÑ\82кам, Ð°Ð»Ñ\8cбо Ñ\9eзÑ\8fÑ\82Ñ\8b Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ñ\8bÑ\85 Ð²Ð¾Ð»Ñ\8cнÑ\8bÑ\85 ÐºÑ\80Ñ\8bнÑ\96Ñ\86аÑ\9e.\n<strong>Ð\9dелÑ\8cга Ð±ÐµÐ· Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c Ð¼Ð°Ñ\82Ñ\8dÑ\80Ñ\8bÑ\8fлÑ\8b, Ð°Ð±Ð°Ñ\80оненÑ\8bÑ\8f Ð°Ñ\9eÑ\82аÑ\80Ñ\81кÑ\96м Ð¿Ñ\80авам!</strong>",
+       "copyrightwarning2": "Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð·Ð°Ñ\9eважÑ\86е, Ñ\88Ñ\82о Ñ\9eвеÑ\81Ñ\8c Ñ\83нÑ\91Ñ\81ак Ñ\9e {{GRAMMAR:вÑ\96навалÑ\8cнÑ\8b|{{SITENAME}}}} Ð¼Ð¾Ð¶Ð° Ñ\80Ñ\8dдагаваÑ\86Ñ\86а, Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\86а Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\86а Ñ\96нÑ\88Ñ\8bмÑ\96 Ñ\9eдзелÑ\8cнÑ\96камÑ\96.\nÐ\9aалÑ\96 Ð²Ñ\8b Ð· Ð³Ñ\8dÑ\82Ñ\8bм Ð½Ñ\8f Ð·Ð³Ð¾Ð´Ð½Ñ\8bÑ\8f, ÐºÐ°Ð»Ñ\96 Ð»Ð°Ñ\81ка, Ð½Ðµ Ð·Ñ\8cмÑ\8fÑ\88Ñ\87айÑ\86е Ñ\81Ñ\8eдÑ\8b Ð\92аÑ\88Ñ\8bÑ\8f Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\8b.<br />\nРазÑ\8cмÑ\8fÑ\88Ñ\87Ñ\8dнÑ\8cнем Ñ\82Ñ\83Ñ\82 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e, Ð²Ñ\8b Ð´Ñ\8dклÑ\8fÑ\80Ñ\83еÑ\86е, Ñ\88Ñ\82о Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86еÑ\81Ñ\8f Ñ\96Ñ\85 Ð°Ñ\9eÑ\82аÑ\80ам, Ñ\86Ñ\96 Ñ\81капÑ\96Ñ\8fвалÑ\96 Ñ\96Ñ\85 Ð· ÐºÑ\80Ñ\8bнÑ\96Ñ\86Ñ\8b, Ñ\8fкаÑ\8f Ð´Ð°Ð·Ð²Ð°Ð»Ñ\8fе Ð²Ð¾Ð»Ñ\8cнае Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне Ñ\81ваÑ\96Ñ\85 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e (дзелÑ\8f Ð¿Ð°Ð´Ñ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\8fÑ\9e Ð³Ð»Ñ\8fдзÑ\96Ñ\86е $1).\n\n<strong>Ð\9dе Ð·Ñ\8cмÑ\8fÑ\88Ñ\87айÑ\86е Ñ\82Ñ\83Ñ\82 Ð±ÐµÐ· Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ð¼Ð°Ñ\82Ñ\8dÑ\80Ñ\8bÑ\8fлÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð°Ñ\85оÑ\9eваÑ\8eÑ\86Ñ\86а Ð°Ñ\9eÑ\82аÑ\80Ñ\81кÑ\96м Ð¿Ñ\80авам!</strong>",
        "editpage-cannot-use-custom-model": "Мадэль зьместу гэтай старонкі ня можа быць зьмененая.",
-       "longpageerror": "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілябайт|кілябайты|кілябайтаў}}, што болей устаноўленага абмежаваньня на $2 {{PLURAL:$2|кілябайт|кілябайты|кілябайтаў}}.'''\nСтаронка ня можа быць захаваная.",
+       "longpageerror": "<strong>Памылка: аб’ём тэксту, які вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілябайт|кілябайты|кілябайтаў}}, што болей за ўсталяванае абмежаваньне на $2 {{PLURAL:$2|кілябайт|кілябайты|кілябайтаў}}.</strong>\nСтаронка ня можа быць захаваная.",
        "readonlywarning": "<strong>Папярэджаньне: База зьвестак была заблякаваная для тэхнічнага абслугоўваньня, таму немагчыма цяпер захаваць Вашыя зьмены.</strong>\nВы можаце скапіяваць тэкст у файл на Вашым кампутары, а пазьней захаваць сюды.\n\nСыстэмны адміністратар, які заблякаваў базу зьвестак, прапанаваў наступнае тлумачэньне: $1",
-       "protectedpagewarning": "'''Папярэджаньне: Гэтая старонка была абароненая, таму толькі адміністратары могуць рэдагаваць яе.'''\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
-       "semiprotectedpagewarning": "'''Заўвага:''' Гэтая старонка была абароненая, і рэдагаваць яе могуць толькі зарэгістраваныя ўдзельнікі.\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
+       "protectedpagewarning": "<strong>Папярэджаньне: гэтая старонка была абароненая, таму толькі адміністратары могуць рэдагаваць яе.</strong>\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
+       "semiprotectedpagewarning": "<strong>Заўвага:</strong> гэтая старонка была абароненая, таму рэдагаваць яе могуць толькі зарэгістраваныя ўдзельнікі.\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
        "cascadeprotectedwarning": "'''Папярэджаньне:''' гэтая старонка абароненая, толькі ўдзельнікі з правамі адміністратараў могуць рэдагаваць яе, таму што яна ўключаная ў {{PLURAL:$1|1=наступную старонку|наступныя старонкі}} з каскаднай абаронай:",
-       "titleprotectedwarning": "'''Папярэджаньне: гэтая старонка была абароненая і для яе стварэньня патрабуюцца [[Special:ListGroupRights|адпаведныя правы]].'''\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
+       "titleprotectedwarning": "<strong>Папярэджаньне: гэтая старонка была абароненая і для яе стварэньня патрабуюцца [[Special:ListGroupRights|адпаведныя правы]].</strong>\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
        "templatesused": "{{PLURAL:$1|Шаблён, які ўжываецца|Шаблёны, якія ўжываюцца}} на гэтай старонцы:",
        "templatesusedpreview": "У гэтым папярэднім праглядзе {{PLURAL:$1|1=выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:",
        "templatesusedsection": "У гэтай сэкцыі {{PLURAL:$1|1=выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:",
        "template-protected": "(абаронены)",
        "template-semiprotected": "(часткова абароненая)",
        "hiddencategories": "Гэтая старонка належыць да $1 {{PLURAL:$1|схаванай катэгорыі|схаваных катэгорыяў}}:",
-       "nocreatetext": "У {{GRAMMAR:месны|{{SITENAME}}}} абмежаванае стварэньне новых старонак.\nВы можаце вярнуцца і рэдагаваць існуючую старонку, альбо [[Special:UserLogin|ўвайсьці ў сыстэму ці стварыць рахунак]].",
+       "nocreatetext": "У {{GRAMMAR:месны|{{SITENAME}}}} абмежаванае стварэньне новых старонак.\nВы можаце вярнуцца і рэдагаваць існую старонку, альбо [[Special:UserLogin|ўвайсьці ў сыстэму ці стварыць рахунак]].",
        "nocreate-loggedin": "Вы ня маеце дазволу на стварэньне новых старонак.",
        "sectioneditnotsupported-title": "Рэдагаваньне сэкцыяў не падтрымліваецца",
-       "sectioneditnotsupported-text": "Рэдагаваньне сэкцыяў не падтрымліваецца ў гэтай старонцы рэдагаваньня",
+       "sectioneditnotsupported-text": "Рэдагаваньне сэкцыяў не падтрымліваецца на гэтай старонцы.",
        "permissionserrors": "Памылка дазволу",
        "permissionserrorstext": "Вы ня маеце дазволу на гэтае дзеяньне з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "permissionserrorstext-withaction": "Вы ня маеце дазволу на $2 з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "contentmodelediterror": "Вы ня можаце рэдагаваць гэтую вэрсію, бо яе мадэль зьместу — <code>$1</code>, якая адрозьніваецца ад цяперашняй мадэлі зьместу старонкі — <code>$2</code>.",
-       "recreate-moveddeleted-warn": "'''Увага: Вы ствараеце старонку, якая раней была выдаленая.'''\n\nУпэўніцеся, што стварэньне гэтай старонкі неабходнае.\nНіжэй пададзеныя журналы выдаленьняў і пераносаў гэтай старонкі:",
+       "recreate-moveddeleted-warn": "<strong>Увага: вы ствараеце старонку, якая раней была выдаленая.</strong>\n\nУпэўніцеся, што стварэньне гэтай старонкі неабходнае.\nНіжэй пададзеныя журналы выдаленьняў і пераносаў гэтай старонкі:",
        "moveddeleted-notice": "Гэта старонка была выдаленая. Журналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй.",
        "moveddeleted-notice-recent": "Выбачайце, гэтая старонка была нядаўна выдаленая (цягам апошніх 24 гадзінаў).\nЖурналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй для даведкі.",
        "log-fulllog": "Паказаць журнал цалкам",
        "postedit-confirmation-saved": "Вашая праўка была захаваная.",
        "edit-already-exists": "Немагчыма стварыць новую старонку.\nЯна ўжо існуе.",
        "defaultmessagetext": "Перадвызначаны тэкст паведамленьня",
-       "content-failed-to-parse": "Зьмест «$2» не адпавядае тыпу $1: $3.",
+       "content-failed-to-parse": "Зьмест «$2» не адпавядае мадэлі $1: $3.",
        "invalid-content-data": "Няслушныя зьвесткі",
        "content-not-allowed-here": "Зьмест тыпу «$1» на старонцы [[$2]] не дазволены",
        "editwarning-warning": "Пакінуўшы гэтую старонку, вы можаце страціць усе ўнесеныя зьмены.\nКалі вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне ў сэкцыі «{{int:prefs-editing}}» вашых наладаў.",
        "editpage-invalidcontentmodel-text": "Мадэль зьместу «$1» не падтрымліваецца.",
        "editpage-notsupportedcontentformat-title": "Фармат зьмесьціва не падтрымліваецца",
        "editpage-notsupportedcontentformat-text": "Фармат зьмесьціва $1 не падтрымліваецца мадэльлю зьмесьціва $2.",
-       "content-model-wikitext": "вікі-тэкст",
+       "content-model-wikitext": "вікітэкст",
        "content-model-text": "просты тэкст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.\n\nПавінна быць ня болей за $2 {{PLURAL:$2|зварот|звароты|зваротаў}}, а цяпер ўтрымліваецца {{PLURAL:$1|$1 зварот|$1 звароты|$1 зваротаў}}.",
        "expensive-parserfunction-category": "Старонкі, якія ўтрымліваюць зашмат працаёмістых зваротаў да функцыяў парсэра",
-       "post-expand-template-inclusion-warning": "Папярэджаньне: Памер уключаемых шаблёнаў занадта вялікі.\nНекаторыя шаблёны ня будуць уключаныя.",
+       "post-expand-template-inclusion-warning": "<strong>Папярэджаньне</strong>: памер выкарыстаных шаблёнаў занадта вялікі.\nНекаторыя шаблёны ня будуць уключаныя.",
        "post-expand-template-inclusion-category": "Старонкі, у якіх перавышаны дапушчальны памер уключаных шаблёнаў",
-       "post-expand-template-argument-warning": "Увага: Гэтая старонка ўтрымлівае прынамсі адзін парамэтар шаблёна, які мае занадта вялікі выгляд у разгорнутым выглядзе.\nГэтыя парамэтры былі прапушчаныя.",
+       "post-expand-template-argument-warning": "<strong>Увага</strong>: гэтая старонка ўтрымлівае прынамсі адзін парамэтар шаблёну, які мае занадта вялікі выгляд у разгорнутым выглядзе.\nГэтыя парамэтры былі прапушчаныя.",
        "post-expand-template-argument-category": "Старонкі, у якіх прапушчаныя парамэтры шаблёнаў",
        "parser-template-loop-warning": "Выяўлены цыкль у шаблёнах: [[$1]]",
-       "parser-template-recursion-depth-warning": "Перавышана мяжа глыбіні рэкурсіі шаблёнаў ($1)",
+       "parser-template-recursion-depth-warning": "Перавышаны ліміт глыбіні рэкурсіі шаблёну ($1)",
        "language-converter-depth-warning": "Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)",
        "node-count-exceeded-category": "Старонкі зь перавышанай колькасьцю вузлоў",
        "node-count-exceeded-category-desc": "На старонцы перавышаная максымальная колькасьць вузлоў.",
        "node-count-exceeded-warning": "Старонка перавысіла дазволеную колькасьць вузлоў",
        "expansion-depth-exceeded-category": "Старонкі зь перавышанай глыбінёй уключэньня",
        "expansion-depth-exceeded-category-desc": "Старонка перавышае максымальную глыбіню раскрыцьця.",
-       "expansion-depth-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80авÑ\8bÑ\81Ñ\96ла Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\83Ñ\8e Ð³Ð»Ñ\8bбÑ\96нÑ\8e Ñ\9eклÑ\8eÑ\87Ñ\8dнÑ\8cнÑ\8fÑ\9e",
-       "parser-unstrip-loop-warning": "Ð\92Ñ\8bзнаÑ\87анаÑ\8f Ð½ÐµÐ·Ð°Ñ\87Ñ\8bненаÑ\8f Ð¿Ñ\8fÑ\82лÑ\8f",
-       "parser-unstrip-recursion-limit": "Перавышанае абмежаваньне глыбіні рэкурсіі ($1)",
-       "converter-manual-rule-error": "Знойдзеная памылка ў ручным правіле моўнага канвэртара",
+       "expansion-depth-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80авÑ\8bÑ\81Ñ\96ла Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\83Ñ\8e Ð³Ð»Ñ\8bбÑ\96нÑ\8e Ñ\80азгоÑ\80Ñ\82ванÑ\8cнÑ\8f",
+       "parser-unstrip-loop-warning": "Ð\92Ñ\8bзнаÑ\87анаÑ\8f Ð¿Ñ\8fÑ\82лÑ\8f unstrip",
+       "parser-unstrip-recursion-limit": "Перавышаны ліміт рэкурсіі unstrip ($1)",
+       "converter-manual-rule-error": "Знойдзеная памылка ў ручным правіле моўнага канвэртару",
        "undo-success": "Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.",
        "undo-failure": "Рэдагаваньне ня можа быць скасаванае праз канфлікт паміж папярэднімі рэдагаваньнямі.",
        "undo-norev": "Рэдагаваньне ня можа быць адмененае, таму што яно не існуе альбо было выдаленае.",
        "undo-nochange": "Выглядае, што праўка ўжо была адмененая.",
        "undo-summary": "Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])",
-       "undo-summary-username-hidden": "Ð\92Ñ\8dÑ\80Ñ\81Ñ\96Ñ\8f $1 Ñ\81каÑ\81аванаÑ\8f Ñ\81Ñ\85аванÑ\8bм Ñ\83дзелÑ\8cнÑ\96кам",
+       "undo-summary-username-hidden": "СкаÑ\81аванÑ\8cне Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\96 $1 Ñ\81Ñ\85аванага Ñ\9eдзелÑ\8cнÑ\96ка",
        "cantcreateaccount-text": "Стварэньне рахункаў з гэтага IP-адрасу ('''$1''') было заблякаванае [[User:$3|$3]].\n\nПрычына блякаваньня пададзеная $3: ''$2''",
        "cantcreateaccount-range-text": "Стварэньне рахункаў з IP-адрасоў у дыяпазоне <strong>$1</strong>, у які ўваходзіць ваш IP-адрас (<strong>$4</strong>), было забароненае {{GENDER:$3|ўдзельнікам|ўдзельніцай}} [[User:$3|$3]].\n\n{{GENDER:$3|Удзельнікам|Удзельніцай}} $3 была пададзеная наступная прычына: <em>$2</em>.",
        "viewpagelogs": "Паказаць журналы падзеяў для гэтай старонкі",
        "last": "папярэдняя",
        "page_first": "першая",
        "page_last": "апошняя",
-       "histlegend": "Параўнаньне: пазначце кропкамі дзьве вэрсіі для параўнаньня і націсьніце enter альбо кнопку ўнізе.<br />\nТлумачэньне: (цяп) = адрозьненьні ад цяперашняй вэрсіі, (папярэдняя) = адрозьненьні ад папярэдняй вэрсіі, д = дробная праўка.",
+       "histlegend": "Параўнаньне: пазначце кропкамі дзьве вэрсіі для параўнаньня і націсьніце «ўвод» альбо кнопку ўнізе.<br />\nТлумачэньне: <strong>({{int:cur}})</strong> = адрозьненьні ад цяперашняй вэрсіі, <strong>({{int:last}})</strong> = адрозьненьні ад папярэдняй вэрсіі, <strong>{{int:minoreditletter}}</strong> = дробная праўка.",
        "history-fieldset-title": "Пошук у гісторыі",
        "history-show-deleted": "Толькі выдаленыя",
        "histfirst": "найстарэйшыя",
-       "histlast": "найнавейшыя",
+       "histlast": "найноÑ\9eшыя",
        "historysize": "($1 {{PLURAL:$1|байт|байты|байтаў}})",
        "historyempty": "(пуста)",
        "history-feed-title": "Гісторыя зьменаў",
-       "history-feed-description": "Гісторыя зьменаў гэтай старонкі",
+       "history-feed-description": "Гісторыя зьменаў гэтай старонкі ў вікі",
        "history-feed-item-nocomment": "$1 у $2",
        "history-feed-empty": "Запатрабаванай старонкі не існуе.\nМагчыма, яна была выдаленая альбо яе перанесьлі.\nПаспрабуйце [[Special:Search|пашукаць]] падобныя старонкі.",
        "history-edit-tags": "Рэдагаваць меткі абраных вэрсіяў",
        "rev-deleted-user": "(імя ўдзельніка выдаленае)",
        "rev-deleted-event": "(падрабязнасьці выдаленыя з журнала падзеяў)",
        "rev-deleted-user-contribs": "[імя ўдзельніка альбо IP-адрас выдалены — рэдагаваньне схаванае з унёску]",
-       "rev-deleted-text-permission": "Гэтая вэрсія старонкі была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-deleted-text-permission": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\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-suppressed-text-unhide": "Гэтая вэрсія старонкі была '''схаваная'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
-       "rev-deleted-text-view": "Гэтая вэрсія старонкі была '''выдаленая'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
-       "rev-suppressed-text-view": "Гэтая вэрсія старонкі была '''схаваная'''.\nВы можаце яе праглядзець; падрабязнасьці могуць быць знойдзеныя ў  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
-       "rev-deleted-no-diff": "Вы ня можаце праглядаць гэтую розьніцу паміж вэрсіямі, таму што адна з вэрсіяў была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-deleted-text-unhide": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
+       "rev-suppressed-text-unhide": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
+       "rev-deleted-text-view": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\nВы можаце праглядзець яе; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-suppressed-text-view": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nВы можаце яе праглядзець; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
+       "rev-deleted-no-diff": "Вы ня можаце праглядаць гэтую розьніцу паміж вэрсіямі, таму што адна з вэрсіяў была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "rev-suppressed-no-diff": "Вы ня можаце праглядзець гэтую розьніцу, таму што адна з вэрсіяў была '''выдаленая'''.",
        "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 паглядзець гэту розьніцу], калі жадаеце.",
        "search-interwiki-caption": "Сумежныя праекты",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
+       "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Зьвязаны",
        "searchrelated": "зьвязаны",
        "searchall": "усе",
        "search-external": "Вонкавы пошук",
        "searchdisabled": "Функцыя пошуку ў {{GRAMMAR:месны|{{SITENAME}}}} адключаная.\nВы можаце пашукаць з дапамогай Google, але заўважце, што там інфармацыя пра старонкі {{GRAMMAR:родны|{{SITENAME}}}} можа быць састарэлай.",
        "search-error": "Узьнікла памылка пры пошуку: $1",
+       "search-warning": "Пры пошуку зьявілася папярэджаньне: $1",
        "preferences": "Налады",
        "mypreferences": "Налады",
        "prefs-edits": "Колькасьць рэдагаваньняў:",
        "saveprefs": "Захаваць",
        "restoreprefs": "Аднавіць усе стандартныя налады (ва ўсіх разьдзелах)",
        "prefs-editing": "Рэдагаваньне",
-       "rows": "Радкоў:",
-       "columns": "Слупкоў:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Максымальны памер старонкі для паказу спасылак як на накід ($1):",
        "stub-threshold-sample-link": "прыклад",
        "prefs-help-recentchangescount": "Гэта датычыцца апошніх зьменах, гісторый старонак і журналаў.",
        "prefs-help-watchlist-token2": "Гэта сакрэтны ключ да стужкі вашага сьпісу назіраньня.\nКожны, хто ведае яго, можа набыць доступ да вашага сьпісу назіраньня, таму не дзяліцеся ім.\n[[Special:ResetTokens|Пстрыкніце тут, калі вам трэба скінуць яго]].",
        "savedprefs": "Вашыя налады былі захаваныя.",
-       "savedrights": "Ð\9fÑ\80авы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 былі захаваныя.",
+       "savedrights": "Ð\93Ñ\80Ñ\83пы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 былі захаваныя.",
        "timezonelegend": "Часавы пояс:",
        "localtime": "Мясцовы час:",
        "timezoneuseserverdefault": "Выкарыстоўваць стандартныя налады {{GRAMMAR:родны|{{SITENAME}}}} ($1)",
        "youremail": "Адрас электроннай пошты:",
        "username": "Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:",
        "prefs-memberingroups": "{{GENDER:$2|Удзельнік|Удзельніца}} {{PLURAL:$1|1=групы|групаў}}:",
+       "group-membership-link-with-expiry": "$1 (да $2)",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "yourlanguage": "Мова інтэрфэйсу:",
        "prefswarning-warning": "Вы зрабілі зьмены ў вашых наладах, якія яшчэ не былі захаваныя.\nКалі вы закрыеце гэтую старонку і не націсьніце «$1», вашыя налады ня будуць абноўленыя.",
        "prefs-tabs-navigation-hint": "Падказка: вы можаце пераходзіць паміж укладкамі ў сьпісе ўкладак з дапамогай клявішаў налева і направа.",
        "userrights": "Кіраваньне правамі ўдзельнікаў і ўдзельніц",
-       "userrights-lookup-user": "Ð\9aÑ\96Ñ\80аванÑ\8cне Ð³Ñ\80Ñ\83памÑ\96 Ñ\9eдзелÑ\8cнÑ\96каÑ\9e Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86",
+       "userrights-lookup-user": "Ð\92Ñ\8bбаÑ\80 Ñ\83дзелÑ\8cнÑ\96ка",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
-       "editusergroup": "РÑ\8dдагаваÑ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b {{GENDER:$1|Ñ\9eдзелÑ\8cнÑ\96каÑ\9e Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86}}",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зÑ\96Ñ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b Ñ\9eдзелÑ\8cнÑ\96ка",
        "editinguser": "Зьмена правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
-       "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": "ТÑ\83Ñ\82 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b, Ð´Ð° Ñ\8fкÑ\96Ñ\85 Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\9eдзелÑ\8cнÑ\96к:\n* Ð\90дзнаÑ\87анае Ð¿Ð¾Ð»Ðµ Ð¿Ð¾Ð±Ð°Ñ\87 Ð· Ð½Ð°Ð·Ð²Ð°Ð¹ Ð³Ñ\80Ñ\83пÑ\8b Ð¿Ð°Ð·Ð½Ð°Ñ\87ае Ð¿Ñ\80Ñ\8bналежнаÑ\81Ñ\8cÑ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\9fÑ\83Ñ\81Ñ\82ое Ð¿Ð¾Ð»Ðµ Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ñ\9eдзелÑ\8cнÑ\96к Ð½Ðµ Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\97нак * Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ð\92Ñ\8b Ð½Ñ\8f Ð·Ð¼Ð¾Ð¶Ð°Ñ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð· Ð³Ñ\80Ñ\83пÑ\8b, ÐºÐ°Ð»Ñ\96 Ð´Ð°Ð´Ð°Ð´Ð·Ñ\96Ñ\86е Ñ\8fго Ð´Ð° Ñ\8fе, Ñ\96 Ð½Ð°Ð°Ð´Ð²Ð°Ñ\80оÑ\82.",
+       "userrights-groups-help": "ТÑ\83Ñ\82 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b, Ð´Ð° Ñ\8fкÑ\96Ñ\85 Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\9eдзелÑ\8cнÑ\96к:\n* Ð\90дзнаÑ\87анае Ð¿Ð¾Ð»Ðµ Ð¿Ð¾Ð±Ð°Ñ\87 Ð· Ð½Ð°Ð·Ð²Ð°Ð¹ Ð³Ñ\80Ñ\83пÑ\8b Ð¿Ð°Ð·Ð½Ð°Ñ\87ае Ð¿Ñ\80Ñ\8bналежнаÑ\81Ñ\8cÑ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\9fÑ\83Ñ\81Ñ\82ое Ð¿Ð¾Ð»Ðµ Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ñ\9eдзелÑ\8cнÑ\96к Ð½Ðµ Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\97нак * Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ð²Ñ\8b Ð½Ñ\8f Ð·Ð¼Ð¾Ð¶Ð°Ñ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð· Ð³Ñ\80Ñ\83пÑ\8b, ÐºÐ°Ð»Ñ\96 Ð´Ð°Ð´Ð°Ð´Ð·Ñ\96Ñ\86е Ñ\8fго Ð´Ð° Ñ\8fе, Ñ\96 Ð½Ð°Ð°Ð´Ð²Ð°Ñ\80оÑ\82.\n* Ð\97нак # Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ð²Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\82олÑ\8cкÑ\96 Ð·Ñ\8cменÑ\88Ñ\8bÑ\86Ñ\8c Ñ\87аÑ\81 Ñ\81канÑ\87Ñ\8dнÑ\8cнÑ\8f Ñ\82Ñ\8dÑ\80мÑ\96нÑ\83 Ð´Ð·ÐµÑ\8fнÑ\8cнÑ\8f Ð³Ñ\8dÑ\82ай Ð³Ñ\80Ñ\83пÑ\8b, Ð²Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿Ð°Ð²Ñ\8fлÑ\96Ñ\87Ñ\8bÑ\86Ñ\8c Ñ\8fго.",
        "userrights-reason": "Прычына:",
        "userrights-no-interwiki": "Вы ня маеце дазволу зьмяняць правы ўдзельнікаў іншых вікаў.",
        "userrights-nodatabase": "Базы зьвестак $1 не існуе альбо яна не зьяўляецца лякальнай.",
-       "userrights-nologin": "Вы павінны [[Special:UserLogin|ўвайсьці ў сыстэму]] як адміністратар, каб прызначаць правы ўдзельнікам.",
-       "userrights-notallowed": "Вы ня маеце права прызначаць ці выдаляць правы ўдзельнікам.",
        "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": "Канфлікт пры зьмене правоў удзельнікаў! Калі ласка, праверце і захавайце вашыя зьмены.",
-       "userrights-removed-self": "Вы пазбавілі сябе ўласных правоў. З гэтай прычыны вы больш ня маеце доступу да гэтай старонкі.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "group-autoconfirmed": "Аўтаматычна пацьверджаныя ўдзельнікі",
        "right-siteadmin": "блякаваньне і разблякаваньне базы зьвестак",
        "right-override-export-depth": "экспартаваньне старонак, уключаючы зьвязаныя старонкі з глыбінёй да 5",
        "right-sendemail": "адпраўка электронных лістоў іншым удзельнікам",
-       "right-passwordreset": "прагляд электронных лістоў з ачысткай паролю",
        "right-managechangetags": "стварэньне і (дэ)актывацыя [[Special:Tags|метак]]",
        "right-applychangetags": "дадаваць [[Special:Tags|меткі]] пры рэдагаваньні",
        "right-changetags": "дадаваць і выдаляць адвольныя [[Special:Tags|меткі]] да асобных вэрсіяў і запісаў у журнале падзеяў",
        "action-upload_by_url": "загрузку гэтага файла з URL-адрасу",
        "action-writeapi": "выкарыстаньне API для запісаў",
        "action-delete": "выдаленьне гэтай старонкі",
-       "action-deleterevision": "выдаленьне гэтай вэрсіі",
+       "action-deleterevision": "выдаленьне вэрсіяў",
+       "action-deletelogentry": "выдаленьне запісаў у журнале",
        "action-deletedhistory": "прагляд выдаленай гісторыі гэтай старонкі",
+       "action-deletedtext": "прагляд тэксту выдаленай вэрсіі",
        "action-browsearchive": "пошук выдаленых старонак",
-       "action-undelete": "аднаўленьне гэтай старонкі",
-       "action-suppressrevision": "прагляд і аднаўленьне гэтай схаванай вэрсіі",
+       "action-undelete": "аднаўленьне старонак",
+       "action-suppressrevision": "прагляд і аднаўленьне схаваных вэрсіяў",
        "action-suppressionlog": "прагляд гэтага прыватнага журнала",
        "action-block": "блякаваньне гэтага ўдзельніка ад рэдагаваньняў",
        "action-protect": "зьмену ўзроўню абароны гэтай старонкі",
        "action-userrights-interwiki": "рэдагаваньне правоў удзельнікаў у іншых вікі",
        "action-siteadmin": "блякаваньне і разблякаваньне базы зьвестак",
        "action-sendemail": "адпраўляць лісты іншым удзельнікам",
+       "action-editmyoptions": "рэдагаваньне вашых наладаў",
        "action-editmywatchlist": "рэдагаваць ваш сьпіс назіраньня",
        "action-viewmywatchlist": "праглядаць ваш сьпіс назіраньня",
        "action-viewmyprivateinfo": "прагляд вашых прыватных зьвестак",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "recentchanges-submit": "Паказаць",
+       "rcfilters-activefilters": "Актыўныя фільтры",
+       "rcfilters-restore-default-filters": "Аднавіць фільтры па змоўчаньні",
+       "rcfilters-clear-all-filters": "Ачысьціць усе фільтры",
+       "rcfilters-search-placeholder": "Фільтар апошніх зьменаў (праглядзець або пачніце друкаваць)",
+       "rcfilters-invalid-filter": "Няслушны фільтар",
+       "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
+       "rcfilters-filterlist-title": "Фільтры",
+       "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
+       "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
+       "rcfilters-filter-registered-label": "Зарэгістраваныя",
+       "rcfilters-filter-registered-description": "Рэдактары, якія ўвайшлі ў сыстэму.",
+       "rcfilters-filter-unregistered-label": "Незарэгістраваныя",
+       "rcfilters-filter-unregistered-description": "Рэдактары, якія не ўвайшлі ў сыстэму",
+       "rcfilters-filtergroup-authorship": "Рэдагаваць аўтарства",
+       "rcfilters-filter-editsbyself-label": "Вашыя праўкі",
+       "rcfilters-filter-editsbyself-description": "Праўкі, зробленыя вамі",
+       "rcfilters-filter-editsbyother-label": "Праўкі іншых удзельнікаў",
+       "rcfilters-filter-editsbyother-description": "Праўкі, зробленыя іншымі ўдзельнікамі (ня вамі).",
+       "rcfilters-filtergroup-userExpLevel": "Узровень досьведу (толькі для зарэгістраваных удзельнікаў)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Навічкі",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Менш за 10 правак і 4 дні актыўнасьці.",
+       "rcfilters-filter-userExpLevel-learner-label": "Вучні",
+       "rcfilters-filter-userExpLevel-learner-description": "Болей дзён актыўнасьці і правак, чым у «навічкоў», але меней чым у «дасьведчаных удзельнікаў».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Дасьведчаныя ўдзельнікі",
+       "rcfilters-filter-userExpLevel-experienced-description": "Больш за 30 дзён актыўнасьці і 500 правак.",
+       "rcfilters-filtergroup-automated": "Аўтаматычны ўнёсак",
+       "rcfilters-filter-bots-label": "Робат",
+       "rcfilters-filter-bots-description": "Праўкі, зробленыя з дапамогай аўтаматызаваных інструмэнтаў.",
+       "rcfilters-filter-humans-label": "Чалавек (ня робат)",
+       "rcfilters-filter-humans-description": "Праўкі, зробленыя людзьмі.",
+       "rcfilters-filtergroup-significance": "Значэньне",
+       "rcfilters-filter-minor-label": "Дробныя праўкі",
+       "rcfilters-filter-minor-description": "Праўкі, якія аўтар пазначыў як дробныя.",
+       "rcfilters-filter-major-label": "Звычайныя праўкі",
+       "rcfilters-filter-major-description": "Праўкі, не пазначаныя як дробныя.",
+       "rcfilters-filtergroup-changetype": "Тып зьмены",
+       "rcfilters-filter-pageedits-label": "Рэдагаваньні старонкі",
+       "rcfilters-filter-pageedits-description": "Рэдагаваньні вікізьместу, абмеркаваньняў, апісаньняў катэгорыяў…",
+       "rcfilters-filter-newpages-label": "Стварэньні старонак",
+       "rcfilters-filter-newpages-description": "Праўкі, якімі створаныя новыя старонкі.",
+       "rcfilters-filter-categorization-label": "Зьмены катэгорыяў",
+       "rcfilters-filter-categorization-description": "Запісы пра дадаваньне і выдаленьне старонак з катэгорыяў.",
+       "rcfilters-filter-logactions-label": "Журнальныя дзеяньні",
+       "rcfilters-filter-logactions-description": "Адміністрацыйныя дзеяньні, стварэньні рахункаў, выдаленьні старонак, загрузкі…",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "uploaded-setting-handler-svg": "SVG, які выстаўляе атрыбут «handler» з дапамогай аддаленага адрасу/зьвестак/скрыпту, блякуецца. У загружаным SVG-файле знойдзена <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, які выстаўляе любы атрыбут з дапамогай аддаленага URL-адрасу, блякуецца. У загружаным SVG-файле знойдзена <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "У загружаным SVG-файле знойдзены фільтар выяваў з URL-адрасам: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Гэты SVG-файл утрымлівае няслушную прастору назваў «$1»",
+       "uploadscriptednamespace": "Гэты SVG-файл утрымлівае няслушную прастору назваў «<nowiki>$1</nowiki>»",
        "uploadinvalidxml": "Не атрымалася прааналізаваць XML у загружаным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасьці: $1",
        "uploadjava": "Файл зьяўляецца ZIP-архівам, які зьмяшчае .class-файл Java.\nЗагрузка Java-файлаў забароненая ў мэтах бясьпекі.",
        "uncategorizedcategories": "Некатэгарызаваныя катэгорыі",
        "uncategorizedimages": "Некатэгарызаваныя файлы",
        "uncategorizedtemplates": "Некатэгарызаваныя шаблёны",
+       "uncategorized-categories-exceptionlist": "# Утрымлівае сьпіс катэгорыяў, якія не павінны згадвацца на Special:UncategorizedCategories. Па адной на радок, пачынаецца з «*». Радкі, якія пачынаюцца зь іншага сымбалю (у тым ліку і з прабелу) ігнаруюцца. Ужывайце «#» для камэнтароў.",
        "unusedcategories": "Катэгорыі, якія не выкарыстоўваюцца",
        "unusedimages": "Файлы, якія не выкарыстоўваюцца",
        "wantedcategories": "Запатрабаваныя катэгорыі",
        "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 мс}}",
        "apisandbox-results-fixtoken": "Выпраўце токен і паўтарыце адпраўку",
        "apisandbox-results-fixtoken-fail": "Памылка пры атрыманьні токену «$1».",
        "apisandbox-continue-clear": "Ачысьціць",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries працягне] апошні запыт; {{int:apisandbox-continue-clear}} ачысьціць парамэтры, зьвязаныя з працягам.",
        "apisandbox-param-limit": "Увядзіце <kbd>max</kbd>, каб выкарыстаць максымальны ліміт.",
+       "apisandbox-multivalue-all-namespaces": "$1 (усе прасторы назваў)",
+       "apisandbox-multivalue-all-values": "$1 (усе значэньні)",
        "booksources": "Крыніцы кніг",
        "booksources-search-legend": "Пошук кніг",
        "booksources-isbn": "ISBN:",
        "activeusers-count": "$1 {{PLURAL:$1|дзеяньне|дзеяньні|дзеяньняў}} за $3 {{PLURAL:$3|апошні дзень|апошнія дні|апошніх дзён}}",
        "activeusers-from": "Паказваць ўдзельнікаў, пачынаючы з:",
        "activeusers-groups": "Паказаць удзельнікаў, якія належаць да групаў:",
+       "activeusers-excludegroups": "Выключыць удзельнікаў, якія належаць да групаў:",
        "activeusers-noresult": "Удзельнікі ня знойдзеныя.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Правы групаў удзельнікаў",
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Ліст адасланы",
        "emailsenttext": "Ваш ліст быў адасланы.",
-       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}. Калі вы адкажаце на гэты ліст, {{GENDER:$2|ваш}} ліст у адказ будзе дасланы непасрэдна {{GENDER:$1|адпраўніку|адпраўніцы}}, і {{GENDER:$1|яму|ёй}} будзе бачны {{GENDER:$2|ваш}} адрас электроннай пошты.",
        "usermessage-summary": "Паведамленьне пра выхад з сыстэмы.",
        "usermessage-editor": "Дастаўка сыстэмных паведамленьняў",
        "watchlist": "Сьпіс назіраньня",
        "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": "Ð\9fадзеÑ\96, Ð·Ñ\8cвÑ\8fзанÑ\8bÑ\8f Ð· Ð¼Ð°Ð´Ñ\8dлÑ\8fмÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83 Ñ\81Ñ\82аÑ\80онак",
+       "log-description-contentmodel": "Ð\93Ñ\8dÑ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка Ñ\9eÑ\82Ñ\80Ñ\8bмлÑ\96вае Ð·Ñ\8cменÑ\8b Ð¼Ð°Ð´Ñ\8dлÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83 Ñ\81Ñ\82аÑ\80онак, Ð° Ñ\82акÑ\81ама Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð±Ñ\8bлÑ\96 Ñ\81Ñ\82воÑ\80анÑ\8bÑ\8f Ð· Ð¼Ð°Ð´Ñ\8dлÑ\8cлÑ\8e Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83, Ð°Ð´Ñ\80ознай Ð°Ð´ Ñ\81Ñ\82андаÑ\80Ñ\82най.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|стварыў|стварыла}} старонку $3 з дапамогай нестандартнай мадэлі зьместу «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мадэль зьместу старонкі $3 з «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "адкаціць",
        "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]]",
        "proxyblockreason": "Ваш IP-адрас быў заблякаваны таму што ён належыць адкрытаму проксі.\nКалі ласка, зьвяжыцеся з Вашым Інтэрнэт-правайдарам альбо са службай тэхнічнай падтрымкі і паведаміце ім пра гэтую сур'ёзную праблему бясьпекі.",
        "sorbsreason": "Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.",
        "sorbs_create_account_reason": "Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.\nВы ня зможаце стварыць рахунак",
+       "softblockrangesreason": "Ананімны ўнёсак не дазволены з вашага IP-адрасу ($1). Калі ласка, увайдзіце ў сыстэму.",
        "xffblockreason": "IP-адрас, прыведзены ў загалоўку X-Forwarded-For, які належыць або вам, або проксі-сэрвэру, быў заблякаваны. Прычынай блякаваньня было: $1",
        "cant-see-hidden-user": "Удзельнік, якога Вы спрабуеце заблякаваць, ужо заблякаваны і схаваны. З-за таго, што Вы ня маеце правоў хаваньня ўдзельнікаў, Вы ня можаце бачыць альбо зьмяняць блякаваньне удзельніка.",
        "ipbblocked": "Вы ня можаце блякаваць ці раблякоўваць іншых удзельнікаў, таму што заблякаваныя самі",
        "cant-move-to-user-page": "Вы ня маеце правоў для пераносу старонкі ў прастору ўдзельніка (апрача падстаронак).",
        "cant-move-category-page": "Вы ня маеце правоў для пераносу старонак катэгорыяў.",
        "cant-move-to-category-page": "Вы ня маеце правоў для пераносу старонак у прастору назваў катэгорыяў.",
+       "cant-move-subpages": "Вы ня маеце дазволу на перанос падстаронак.",
+       "namespace-nosubpages": "Прастора назваў «$1» не дазваляе выкарыстаньне падстаронак.",
        "newtitle": "Новая назва:",
        "move-watch": "Назіраць за гэтай старонкай",
        "movepagebtn": "Перанесьці старонку",
        "movelogpagetext": "Ніжэй пададзены сьпіс перанесеных старонак.",
        "movesubpage": "{{PLURAL:$1|1=Падстаронка|Падстаронкі}}",
        "movesubpagetext": "Гэтая старонка мае $1 {{PLURAL:$1|падстаронку|падстаронкі|падстаронак}}, {{PLURAL:$1|1=якая паказаная ніжэй|якія паказаныя ніжэй}}.",
+       "movesubpagetalktext": "Адпаведная старонка абмеркаваньня мае $1 {{PLURAL:$1|падстаронку, паказаную|падстаронкі, паказаныя|падстаронак, паказаныя}} ніжэй.",
        "movenosubpage": "Гэтая старонка ня мае падстаронак.",
        "movereason": "Прычына:",
        "revertmove": "адкат",
        "pageinfo-length": "Памер старонкі (у байтах)",
        "pageinfo-article-id": "Ідэнтыфікатар старонкі",
        "pageinfo-language": "Мова зьместу старонкі",
+       "pageinfo-language-change": "зьмяніць",
        "pageinfo-content-model": "Мадэль зьместу старонкі",
        "pageinfo-content-model-change": "зьмяніць",
        "pageinfo-robot-policy": "Індэксацыя пашукавікамі",
        "pageinfo-category-pages": "Колькасьць старонак",
        "pageinfo-category-subcats": "Колькасьць падкатэгорыяў",
        "pageinfo-category-files": "Колькасьць файлаў",
+       "pageinfo-user-id": "Ідэнтыфікатар удзельніка",
        "markaspatrolleddiff": "Пазначыць як «патруляваную»",
        "markaspatrolledtext": "Пазначыць гэтую старонку як «патруляваную»",
        "markaspatrolledtext-file": "Пазначыць гэтую вэрсію файлу як патруляваную",
        "log-show-hide-patrol": "$1 журнал патруляваньняў",
        "log-show-hide-tag": "$1 журнал метак",
        "confirm-markpatrolled-button": "Добра",
+       "confirm-markpatrolled-top": "Пазначыць вэрсію $3 старонкі $2 як патруляваную?",
        "deletedrevision": "Выдаленая старая вэрсія $1",
        "filedeleteerror-short": "Памылка выдаленьня файла: $1",
        "filedeleteerror-long": "У часе выдаленьня файла ўзьніклі наступныя памылкі:\n\n$1",
        "tags-apply-not-allowed-one": "Метка «$1» ня можа быць прызначаная ўручную.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Наступную метку|Наступныя меткі}} нельга дадаваць уручную: $1",
        "tags-update-no-permission": "Вы ня маеце права на дадаваньне ці выдаленьне метак зьменаў для асобных вэрсіяў ці запісаў журналаў.",
-       "tags-update-blocked": "Ð\9fакÑ\83лÑ\8c Ð\92Ñ\8b Ð·Ð°Ð±Ð»Ñ\8fкаванÑ\8bÑ\8f, Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\8c Ð¼ÐµÑ\82кÑ\96 Ð·Ñ\8cменаÑ\9e.",
+       "tags-update-blocked": "Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\8c Ð¼ÐµÑ\82кÑ\96 Ð·Ñ\8cменаÑ\9e, Ð¿Ð°ÐºÑ\83лÑ\8c {{GENDER:$1|вÑ\8b}} Ð·Ð°Ð±Ð»Ñ\8fкаванÑ\8bÑ\8f.",
        "tags-update-add-not-allowed-one": "Метка «$1» ня можа быць дададзеная ўручную.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|1=Наступную метку|Наступныя меткі}} нельга дадаваць уручную: $1",
        "tags-update-remove-not-allowed-one": "Метка «$1» ня можа быць выдаленая.",
        "htmlform-user-not-exists": "<strong>$1</strong> не існуе.",
        "htmlform-user-not-valid": "<strong>$1</strong> — некарэктнае імя карыстальніка.",
        "logentry-delete-delete": "$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|выдаліў|выдаліла}} перанакіраваньне $3 шляхам перазапісу",
        "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
        "logentry-delete-event": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=падзеі ў журнале|падзеяў у журнале}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў}} старонкі $3: $4",
        "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-useragent": "Агент удзельніка:",
        "searchsuggest-search": "Пошук у {{GRAMMAR:месны|{{SITENAME}}}}",
        "searchsuggest-containing": "утрымлівае...",
-       "api-error-autoblocked": "Ваш IP-адрас быў аўтаматычна заблякаваны, бо ён быў выкарыстаны заблякаваным удзельнікам.",
-       "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
-       "api-error-blocked": "Рэдагаваньне было для вас заблякаванае.",
-       "api-error-copyuploaddisabled": "Загрузка з URL-адрасу забароненая на гэтым сэрвэры.",
-       "api-error-duplicate": "На сайце ўжо {{PLURAL:$1|1=існуе іншы файл|існуюць іншыя файлы}} з такім жа зьместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|1=быў файл|былі файлы}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэньне новых пустых старонак забаронена.",
-       "api-error-fetchfileerror": "Унутраная памылка: падчас атрыманьня файла штосьці здарылася.",
-       "api-error-fileexists-forbidden": "Файл з назвай «$1» ужо існуе і ня можа быць перазапісаны.",
-       "api-error-fileexists-shared-forbidden": "Файл з назвай «$1» ужо існуе ў супольным сховішчы файлаў і ня можа быць перазапісаны.",
-       "api-error-file-too-large": "Дасланы Вамі файл занадта вялікі.",
-       "api-error-filename-tooshort": "Назва файла занадта кароткая.",
-       "api-error-filetype-banned": "Гэты тып файла забаронены.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|1=забаронены тып файлаў|забароненыя тыпы файлаў}}. {{PLURAL:$3|1=Дазволены тып файлаў|Дазволеныя тыпы файлаў}}: $2.",
-       "api-error-filetype-missing": "У файла няма пашырэньня.",
-       "api-error-hookaborted": "Прапанаваная Вамі зьмена была адхіленая апрацоўшчыкам пашырэньня.",
-       "api-error-http": "Унутраная памылка: немагчыма далучыцца да сэрвэра.",
-       "api-error-illegal-filename": "Недазволеная назва файла.",
-       "api-error-internal-error": "Унутраная памылка: падчас апрацоўкі Вашага файла штосьці здарылася.",
-       "api-error-invalid-file-key": "Унутраная памылка: ня быў знойдзены часовы файл.",
-       "api-error-missingparam": "Унутраная памылка: запыт бракуе парамэтраў.",
-       "api-error-missingresult": "Унутраная памылка: немагчыма вызначыць, ці пасьпяхова зробленае капіяваньне.",
-       "api-error-mustbeloggedin": "Для загрузкі файлаў неабходна ўвайсьці ў сыстэму.",
-       "api-error-mustbeposted": "Памылка гэтага праграмнага забесьпячэньня; яно не выкарыстоўвае слушны HTTP-мэтад.",
-       "api-error-noimageinfo": "Файл загружаны, але сэрвэр ня даў пра яго ніякай інфармацыі.",
-       "api-error-nomodule": "Унутраная памылка: ня выбраны модуль загрузкі.",
-       "api-error-ok-but-empty": "Унутраная памылка: няма адказу ад сэрвэра.",
-       "api-error-overwrite": "Замена існуючага файла забароненая.",
-       "api-error-ratelimited": "Вы спрабуеце загрузіць за кароткі час болей файлаў, чым дазваляе вікі.\nКалі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.",
-       "api-error-stashfailed": "Унутраная памылка: сэрвэр ня змог захаваць часовы файл.",
        "api-error-publishfailed": "Унутраная памылка: сэрвэр ня змог захаваць часловы файл.",
-       "api-error-stasherror": "Падчас загрузкі файла ў сховішча адбылася памылка.",
-       "api-error-stashedfilenotfound": "Схаваны файл ня быў знойдзены пры спробе загрузіць яго з схованкі.",
-       "api-error-stashpathinvalid": "Шлях, дзе павінен быў знаходзіцца схаваны файл, апынуўся няслушным.",
-       "api-error-stashfilestorage": "Адбылася памылка пры захаваньні файла ў схованку.",
-       "api-error-stashzerolength": "Сэрвэр ня змог схаваць файл, бо ён мае нулявы памер.",
-       "api-error-stashnotloggedin": "Вы мусіце ўвайсьці ў сыстэму, каб захоўваць файлы ў схованку загрузкі.",
-       "api-error-stashwrongowner": "Файл, да якога вы спрабуеце атрымаць доступ у схованцы, не належыць вам.",
-       "api-error-stashnosuchfilekey": "Ключ файла, да якога вы спрабуеце атрымаць доступ у схованцы, не існуе.",
-       "api-error-timeout": "Сэрвэр не адказаў у чаканы тэрмін.",
-       "api-error-unclassified": "Узьнікла невядомая памылка",
-       "api-error-unknown-code": "Невядомая памылка: «$1».",
-       "api-error-unknown-error": "Унутраная памылка: падчас загрузкі файла здарылася штосьці невядомае.",
-       "api-error-unknown-warning": "Невядомае папярэджаньне: $1",
+       "api-error-stashfailed": "Унутраная памылка: сэрвэр ня змог захаваць часовы файл.",
+       "api-error-unknown-warning": "Невядомае папярэджаньне: «$1».",
        "api-error-unknownerror": "Невядомая памылка: «$1».",
-       "api-error-uploaddisabled": "Загрузка ў гэтую вікі адключаная.",
-       "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушнае пашырэньне.",
-       "api-error-was-deleted": "Файл з такой назвай ужо загружаўся раней і быў потым выдалены.",
        "duration-seconds": "$1 {{PLURAL:$1|сэкунда|сэкунды|сэкундаў}}",
        "duration-minutes": "$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}",
        "duration-hours": "$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}",
        "pagelang-language": "Мова",
        "pagelang-use-default": "Ужываць мову па змоўчаньні",
        "pagelang-select-lang": "Абярыце мову",
+       "pagelang-reason": "Прычына",
        "pagelang-submit": "Адправіць",
+       "pagelang-nonexistent-page": "Старонка $1 не існуе.",
+       "pagelang-unchanged-language": "Мова старонкі $1 ужо вызначаная як $2.",
+       "pagelang-unchanged-language-default": "Мова старонкі $1 ужо вызначаная як мова па змоўчаньні гэтай вікі.",
+       "pagelang-db-failed": "База зьвестак не змагла зьмяніць мову старонкі.",
        "right-pagelang": "Зьмяніць мову старонкі",
        "action-pagelang": "зьмену мовы старонкі",
        "log-name-pagelang": "Журнал зьменаў мовы",
        "mw-widgets-dateinput-no-date": "Дата не абраная",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
+       "mw-widgets-mediasearch-input-placeholder": "Пошук мультымэдыя",
+       "mw-widgets-mediasearch-noresults": "Нічога ня знойдзена.",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
        "mw-widgets-titleinput-description-redirect": "перанакіраваньне на $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Дадаць катэгорыю…",
+       "mw-widgets-usersmultiselect-placeholder": "Дадаць яшчэ…",
        "sessionmanager-tie": "Немагчыма выкарыстаць адначасова некалькі тыпаў аўтэнтыфікацыі: $1.",
        "sessionprovider-generic": "$1 сэсіі",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сэсіі на падставе файлаў-кукі",
        "sessionprovider-nocookies": "Файлы-кукі могуць быць адключаныя. Упэўніцеся, што ў вас уключаныя файлы-кукі і пачніце спачатку.",
        "randomrootpage": "Выпадковая карэнная старонка",
        "log-action-filter-block": "Тып блякаваньня:",
-       "log-action-filter-contentmodel": "ТÑ\8bп Ð¼Ð°Ð´Ñ\8bÑ\84Ñ\96каÑ\86Ñ\8bÑ\96 contentmodel:",
+       "log-action-filter-contentmodel": "ТÑ\8bп Ð·Ñ\8cменÑ\8b Ð¼Ð°Ð´Ñ\8dлÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83:",
        "log-action-filter-delete": "Тып выдаленьня:",
        "log-action-filter-import": "Тып імпарту:",
        "log-action-filter-managetags": "Тып дзеяньня кіраваньня меткамі:",
        "log-action-filter-contentmodel-change": "Зьмена мадэлі зьместу",
        "log-action-filter-contentmodel-new": "Стварэньне старонкі зь нестандартнай мадэльлю зьместу",
        "log-action-filter-delete-delete": "Выдаленьне старонкі",
+       "log-action-filter-delete-delete_redir": "Перазапіс перанакіраваньня",
        "log-action-filter-delete-restore": "Аднаўленьне старонкі",
        "log-action-filter-delete-event": "Выдаленьне журналу",
        "log-action-filter-delete-revision": "Выдаленьне вэрсіі",
        "log-action-filter-patrol-patrol": "Ручное патруляваньне",
        "log-action-filter-patrol-autopatrol": "Аўтаматычнае патруляваньне",
        "log-action-filter-protect-protect": "Абарона",
+       "log-action-filter-protect-modify": "Зьмена абароны",
        "log-action-filter-protect-unprotect": "Зьняцьце абароны",
+       "log-action-filter-protect-move_prot": "Перанос абароны",
+       "log-action-filter-rights-rights": "Ручная зьмена",
        "log-action-filter-rights-autopromote": "Аўтаматычнае зьмяненьне",
+       "log-action-filter-suppress-event": "Утойваньне журнала",
+       "log-action-filter-suppress-revision": "Утойваньне вэрсіі",
+       "log-action-filter-suppress-delete": "Утойваньне старонкі",
+       "log-action-filter-suppress-block": "Утойваньне ўдзельніка праз блякаваньне",
+       "log-action-filter-suppress-reblock": "Утойваньне ўдзельніка праз паўторнае блякаваньне",
        "log-action-filter-upload-upload": "Новая загрузка",
+       "log-action-filter-upload-overwrite": "Паўторная загрузка",
+       "authmanager-authn-not-in-progress": "Аўтэнтыфікацыя не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце зноў з самага пачатку.",
+       "authmanager-authn-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць правераныя на сапраўднасьць.",
+       "authmanager-authn-no-local-user": "Пададзеныя ўліковыя зьвесткі не зьвязаныя зь ніводным удзельнікам гэтай вікі.",
+       "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэньне лякальнага рахунку не атрымалася: $1",
+       "authmanager-change-not-supported": "Пададзеныя ўліковыя зьвесткі ня могуць быць зьмененыя, бо яны ня будуць выкарыстаныя.",
+       "authmanager-create-disabled": "Стварэньне рахункаў адключанае.",
        "authmanager-realname-label": "Сапраўднае імя",
        "authmanager-provider-temporarypassword": "Часовы пароль",
        "changecredentials": "Зьмена ўліковых зьвестак",
index 81ec1cf..5abee6a 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": "Паказаць старонку праекта",
        "eauthentsent": "Пацверджанне было адасланае электроннай поштай на азначаны адрас эл.пошты.\nКаб туды, у далейшым, трапляла іншая пошта адсюль, патрабуецца выканаць інструкцыі, выкладзеныя ў тым эл.паведамленні, каб пацвердзіць сваё права на рахунак эл.пошты.",
        "throttled-mailpassword": "Нагаданне пра пароль ужо адсылалася на працягу апошн{{PLURAL:$1|яй гадзіны|іх $1 гадзін}}. Дзеля абароны ад злоўжыванняў, дазваляецца атрымліваць толькі адно такое нагаданне за {{PLURAL:$1|гадзіну|$1 гадзіны|$1 гадзін}}.",
        "mailerror": "Памылка адсылання эл.пошты: $1",
-       "acct_creation_throttle_hit": "На гэтай вікі за апошні дзень створаны {{PLURAL:$1|1 рахунак|$1 рахункаў}} наведвальнікамі з вашага адрасу IP. Больш за такі час не дазваляецца. Таму на пэўны час з гэтага адрасу IP нельга ствараць новых рахункаў.",
+       "acct_creation_throttle_hit": "Наведвальнікі гэтай вікі, якія карысталіся Вашым ІР-адрасам, ужо стварылі {{PLURAL:$1|рахунак|рахункі|рахункаў}} за $2. Больш за такі час не дазваляецца. Таму на пэўны час з гэтага адрасу IP нельга ствараць новых рахункаў.",
        "emailauthenticated": "Ваш адрас эл.пошты быў пацверджаны на пляцоўцы $2 ($3).",
        "emailnotauthenticated": "Адрас эл.пошты яшчэ не пацверджаны. \nЭл.пошта ў гэтых магчымасцях адсылацца не будзе.",
        "noemailprefs": "Патрэбны адрас эл.пошты, каб дзейнічалі гэтыя магчымасці.",
        "passwordreset-emaildisabled": "Функцыі эл.пошты адключаны на гэтай Вікі.",
        "passwordreset-username": "Імя ўдзельніка:",
        "passwordreset-domain": "Дамен:",
-       "passwordreset-capture": "Праглядзець напісаны ліст?",
-       "passwordreset-capture-help": "Калі вы паставіце адзнаку, то вам будзе паказаны ліст з часовым паролем, які адпраўляецца ўдзельніку.",
        "passwordreset-email": "Адрас электроннай пошты:",
        "passwordreset-emailtitle": "Інфармацыя пра рахунак на сайце {{SITENAME}}",
        "passwordreset-emailtext-ip": "Нехта (магчыма вы, з IP-адрасу $1) запытаў скід  вашага пароля ў праекце {{SITENAME}} ($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя ўліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|адзін дзень|$5 дні|$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і абраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягнуць выкарыстоўваць свой стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
        "passwordreset-emailsentemail": "Калі гэты адрас электроннай пошты злучаны з вашым уліковым запісам, будзе адпраўлены ліст пра скід пароля.",
        "passwordreset-emailsentusername": "Калі ёсць адрас электроннай пошты, злучаны з гэтым імем удзельніка, то будзе дасланы ліст пра скід пароля.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Электронны ліст|электронныя лісты}} скіду пароля адпраўлены. {{PLURAL:$1|Імя ўдзельніка і пароль|Спіс імён удзельнікаў і паролі}} паказаны ніжэй.",
-       "passwordreset-emailerror-capture2": "Не ўдалося даслаць {{GENDER:$2|удзельніку|удзельніцы}} ліст электроннай поштай: $1 {{PLURAL:$3|Імя ўдзельніка і пароль|Спіс імён удзельнікаў і паролі}} паказаны ніжэй.",
        "passwordreset-nocaller": "Мусіць быць указана, хто выклікае",
        "passwordreset-nosuchcaller": "Аўтар выкліку не існуе: $1",
        "passwordreset-ignored": "Скід пароля не быў апрацаваны. Магчыма, не настроены пастаўшчык?",
        "blockedtitle": "Удзельнік заблакаваны",
        "blockedtext": "'''Ваша імя ўдзельніка або адрас IP былі пастаўлены пад блок.'''\n\nБлок быў пастаўлены ўдзельнікам: $1. Пададзеная прычына: ''$2''.\n\n* Блок пастаўлены: $8\n* Блок канчаецца: $6\n* Атрымальнік блока: $7\n\nВы можаце звярнуцца да $1 або да аднаго з іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб паразмаўляць пра гэты блок.\nВы не зможаце дзеля гэтага карыстацца функцыяй ''{{:{{ns:mediawiki}}:emailuser/be}}'', калі гэта вам забаронена, або калі вы не наставілі правільнага пацверджанага адрасу эл.пошты ў сваіх [[Special:Preferences|настаўленнях]].\nВаш адрас IP: $3, нумар блоку: #$5. Падавайце ўсе гэтыя звесткі ў кожным сваім звароце адносна гэтага блоку.",
        "autoblockedtext": "Ваш адрас IP быў аўтаматычна заблакаваны, таму што ім карыстаўся ўдзельнік, заблакаваны адміністратарам $1.\nПададзеная прычына блоку:\n\n:''$2''\n\n* Блок пастаўлены: $8\n* Блок канчаецца: $6\n* Атрымальнік блоку: $7\n\nВы можаце звярнуцца да $1 або да аднаго з іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб паразмаўляць пра гэты блок.\n\nВы не зможаце дзеля гэтага карыстацца функцыяй ''{{:{{ns:mediawiki}}:emailuser/be}}'', калі гэта вам забаронена, або калі вы не наставілі правільнага пацверджанага адрасу эл.пошты ў сваіх [[Special:Preferences|настаўленнях]].\n\nВаш адрас IP: $3. Ваш нумар блоку: $5. Падавайце ўсе гэтыя звесткі ў кожным сваім звароце адносна гэтага блоку.",
+       "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблакаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:<em>$2</em>\n\n* Пачатак блакіроўкі: $8\n* Заканчэнне блакіроўкі: $6\n* Мэта блакіравання: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.",
        "blockednoreason": "прычына не вызначана",
        "whitelistedittext": "Належыць $1 каб правіць старонкі.",
        "confirmedittext": "Вам трэба пацвердзіць свой адрас эл.пошты перад тым, як правіць старонкі.\nВызначце і пацвердзіце адрас ў сваіх [[Special:Preferences|настáўленнях]].",
        "session_fail_preview": "Не ўдалося апрацаваць вашу праўку, таму што сервер згубіў звесткі аб вашым сеансе.\n\nМагчыма, вы выйшлі з сістэмы. <strong>Калі ласка, праверце, што вы ўвайшлі ў сістэму і паспрабуйце яшчэ раз.</strong>\nКалі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў, таксама праверце, што ваш браўзер дазваляе кукі з гэтага сайта.",
        "session_fail_preview_html": "Не ўдалося апрацаваць вашу праўку з-за таго, што згубіліся даныя аб сеансе.\n\n<em>Перадпаказ не зроблены, бо на пляцоўцы {{SITENAME}} дазволены сыры код HTML, што робіць магчымымі атакі праз Яваскрыпт.</em>\n\n<strong>Калі гэта нармальная спроба праўкі, паспрабуйце паўтарыць запісванне.</strong>\nКалі і гэта не дапаможа, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і ўвайсці ізноў, таксама праверце, што ваш браўзер дазваляе кукі з гэтага сайта.",
        "token_suffix_mismatch": "'''Ваша праўка была адхілена, каб пазбегнуць сапсавання тэксту старонкі, таму што ваш браўзер папсаваў знакі прыпынку ў квітку праўкі.\nМагчыма, прычына ў выкарыстанні вамі ананімнага проксі-сервера, праграмы якога працуюць некарэктна.'''",
-       "edit_form_incomplete": "'''Некаторыя часткі формы рэдагавання не дасягнулі сервера. Упэўніцеся, што Вашыя рэдагаванні не пашкоджаныя і паспрабуйце зноў.'''",
+       "edit_form_incomplete": "<strong>Некаторыя часткі формы рэдагавання не дасягнулі сервера. Упэўніцеся, што Вашыя рэдагаванні не пашкоджаныя і паспрабуйце зноў.</strong>",
        "editing": "Правім $1",
        "creating": "Стварэнне старонкі «$1»",
        "editingsection": "Правім $1 (раздзел)",
        "explainconflict": "Нехта іншы змяніў старонку пасля таго, як вы пачалі працу з ёю.\nВерхняе тэкставае поле паказвае актуальны зыходны тэкст старонкі.\nВашы праўкі паказаны ў ніжнім тэкставым полі.\nВам трэба будзе далучыць іх да актуальнага зыходнага тэксту.\nКалі націснуць \"{{int:savearticle}}\", будзе запісаны '''толькі''' тэкст у верхнім полі.",
        "yourtext": "Свой тэкст",
        "storedversion": "Захаваная версія",
-       "nonunicodebrowser": "'''УВАГА: ваш браўзер не працуе з Унікодам. Каб вы маглі карэктна  правіць старонкі, ужываецца такая штука, што знакі з па-за абсягу ASCII паказваюцца ў рэдактарскім акне як шаснаццаткавыя коды.'''",
-       "editingold": "'''УВАГА: Вы правіце такую версію артыкула, якая не з'яўляецца актуальнай.\nКалі вы яе зараз запішаце, то страціце змены ў артыкуле, зробленыя пасля колішняга запісу гэтай версіі.'''",
+       "nonunicodebrowser": "<strong>Увага: ваш браўзер не працуе з Unicode-кадаваннем.</strong> Каб вы маглі карэктна правіць старонкі, усе знакі, не ўключаныя ў ASCII, паказваюцца ў рэдактарскім акне як шаснаццаткавыя коды.",
+       "editingold": "<strong>Увага: Вы правіце састарэлую версію гэтай старонкі.</strong>\nКалі Вы паспрабуеце захаваць яе, то страціце змены ў артыкуле, зробленыя пасля колішняга запісу гэтай версіі.",
        "yourdiff": "Адрозненні",
-       "copyrightwarning": "Заўважце, што ўсе ўклады на {{SITENAME}} лічацца выданымі на ўмовах $2 (бач падрабязнасці на $1). Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, і свабодна распаўсюджваліся, то і не аддавайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу.\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
-       "copyrightwarning2": "Заўважце, што кожны ўклад на {{SITENAME}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, то і не давайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу (бач падрабязнасці на $1).\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
+       "copyrightwarning": "Заўважце, што ўсе ўклады на {{GRAMMAR:месны|{{SITENAME}}}} лічацца выданымі на ўмовах $2 (гл. падрабязнасці на $1). Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, і свабодна распаўсюджваліся, то і не аддавайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу.\n<strong>Нельга без дазволу дадаваць матэрыялы, абароненыя аўтарскім правам!</strong>",
+       "copyrightwarning2": "Заўважце, што кожны ўклад на {{GRAMMAR:месны|{{SITENAME}}}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, то і не давайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу (гл. падрабязнасці на $1).\n<strong>Не змяшчайце тут без дазволу матэрыялы, якія ахоўваюцца аўтарскім правам!</strong>",
        "editpage-cannot-use-custom-model": "Мадэль зместу гэтай старонкі не можа быць зменена.",
-       "longpageerror": "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей устаноўленага абмежавання на $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.'''\nСтаронка не можа быць захаваная.",
+       "longpageerror": "<strong>Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей устаноўленага абмежавання на $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.</strong>\nСтаронка не можа быць захаваная.",
        "readonlywarning": "<strong>Увага: зараз вы не можаце запісаць свае праўкі, таму што база звестак зачынена на абслугоўванне.</strong>\nМагчыма, варта перанесці ваш тэкст у асобны файл і запісаць на потым.\n\nСістэмны адміністратар, які зачыніў базу, растлумачыў гэта так: $1",
-       "protectedpagewarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць правіць толькі адміністратары.'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
-       "semiprotectedpagewarning": "'''Увага:''' старонка пастаўлена пад ахову, таму яе могуць правіць толькі зарэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журнала:",
+       "protectedpagewarning": "<strong>Увага: старонка пастаўлена пад ахову, таму яе могуць правіць толькі адміністратары.</strong>\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
+       "semiprotectedpagewarning": "<strong>Увага:</strong> старонка пастаўлена пад ахову, таму яе могуць правіць толькі зарэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журнала:",
        "cascadeprotectedwarning": "<strong>Увага:</strong> гэтая старонка ахоўваецца, таму яе могуць правіць толькі ўдзельнікі з правамі адміністратара. Прычына аховы: улучэнне гэтай старонкі ў {{PLURAL:$1|старонку, якая стаіць|старонкі, якія стаяць}} пад каскаднай аховай:",
        "titleprotectedwarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць ствараць толькі ўдзельнікі з [[Special:ListGroupRights|адмысловымі правамі]].'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
        "templatesused": "Шабло{{PLURAL:$1|н|ны}} на гэтай старонцы:",
        "parser-template-loop-warning": "Цыклічнае ўключэнне шаблона: [[$1]]",
        "parser-template-recursion-depth-warning": "Вычарпаны ліміт глыбіні ўключэння шаблонаў ($1)",
        "language-converter-depth-warning": "Перавышана глыбіня моўнага канвертэра ($1)",
-       "node-count-exceeded-category": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83лÑ\96 ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c ÐºÑ\80опак",
+       "node-count-exceeded-category": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83лÑ\96 ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c Ð²Ñ\83злоÑ\9e",
        "node-count-exceeded-category-desc": "На старонцы перавышана максімальная колькасць кропак.",
-       "node-count-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83ла ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c ÐºÑ\80опак",
+       "node-count-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83ла ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c Ð²Ñ\83злоÑ\9e",
        "expansion-depth-exceeded-category": "Старонкі, якія перасягнулі глыбіню разгортвання",
        "expansion-depth-exceeded-category-desc": "На старонцы перасягнута максімальная глыбіня разгортвання.",
        "expansion-depth-exceeded-warning": "Старонка перасягнула глыбіню разгортвання",
        "search-external": "Вонкавы пошук",
        "searchdisabled": "Функцыя пошуку {{SITENAME}} не працуе. Тымчасова можна шукаць з дапамогай Google. Заўважце, што тамтэйшыя індэксы зместу {{SITENAME}} могуць не быць актуальнымі.",
        "search-error": "Памылка пошуку: $1",
+       "search-warning": "Пры пошуку з'явілася папярэджанне: $1",
        "preferences": "Настройкі",
        "mypreferences": "Настройкі",
        "prefs-edits": "Колькасць правак:",
        "saveprefs": "Запісаць",
        "restoreprefs": "Аднавіць усе прадвызначэнні (ва ўсіх раздзелах)",
        "prefs-editing": "Праца",
-       "rows": "Радкі:",
-       "columns": "Калонкі:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Парог для паказу спасылкі як на пачатковы артыкул ($1):",
        "stub-threshold-sample-link": "прыклад",
        "prefs-help-recentchangescount": "Гэта ўключае ў сябе апошнія змены, гісторыі старонак, журналы.",
        "prefs-help-watchlist-token2": "Гэта сакрэтны ключ к сеціўнай стужцы з вашага спіса назірання.\nКожны, хто ведае гэты ключ, будзе мець магчымасць чытаць ваш спіс назірання, таму не дзяліцеся ім.\nКалі трэба, можна [[Special:ResetTokens|скінуць яго]].",
        "savedprefs": "Настройкі замацаваныя.",
-       "savedrights": "Ð\94азволы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 захаваныя.",
+       "savedrights": "Ð\93Ñ\80Ñ\83пы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 захаваныя.",
        "timezonelegend": "Часавы пояс:",
        "localtime": "Мясцовы час:",
        "timezoneuseserverdefault": "Карыстацца настаўленнямі серверу ($1)",
        "youremail": "Эл.пошта *",
        "username": "Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:",
        "prefs-memberingroups": "Уваходзіць у {{PLURAL:$1|групу|групы}}:",
+       "group-membership-link-with-expiry": "$1 (да $2)",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "yourlanguage": "Мова:",
        "prefswarning-warning": "Вы зрабілі змены ў сваіх настройках, якія яшчэ не былі запісаныя.\nКалі вы закрыеце гэту старонку, не націснуўшы \"$1\", вашы настройкі не будуць абноўлены.",
        "prefs-tabs-navigation-hint": "Падказка: Вы можаце карыстацца клавішамі са стрэлкамі ўлева і ўправа для навігацыі паміж карткамі ў спісе картак.",
        "userrights": "Распараджэнне правамі ўдзельніка",
-       "userrights-lookup-user": "РаÑ\81паÑ\80аджаÑ\86Ñ\86а Ð³Ñ\80Ñ\83памÑ\96 Ñ\9eдзелÑ\8cнÑ\96каÑ\9e",
+       "userrights-lookup-user": "Ð\92Ñ\8bбеÑ\80Ñ\8bÑ\86е Ñ\9eдзелÑ\8cнÑ\96ка",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
-       "editusergroup": "Ð\9fÑ\80авÑ\96Ñ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b {{GENDER:$1|Ñ\9eдзелÑ\8cнÑ\96каÑ\9e\9eдзелÑ\8cнÑ\96Ñ\86}}",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зÑ\96Ñ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b Ñ\9eдзелÑ\8cнÑ\96ка",
        "editinguser": "Змена праў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Прагляд правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Распараджацца групамі ўдзельніка",
+       "userrights-viewusergroup": "Прагляд груп удзельніка",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў|ўдзельніц}}",
        "userrights-groupsmember": "У групе:",
        "userrights-groupsmember-auto": "Няяўны член:",
        "userrights-reason": "Прычына:",
        "userrights-no-interwiki": "Вам не дазволена мяняць дазволаў карыстальнікам на іншых Вікі-ах.",
        "userrights-nodatabase": "Не знойдзена тут, або не існуе база даных $1.",
-       "userrights-nologin": "Належыць [[Special:UserLogin|увайсці ў сістэму]] на рахунак адміністратара, каб прызначаць дазволы ўдзельнікам.",
-       "userrights-notallowed": "Вам не дазволена дадаваць ці выдаляць правы ўдзельнікаў.",
        "userrights-changeable-col": "Групы, якія вам дазволена мяняць",
        "userrights-unchangeable-col": "Групы, якія вам не дазволена мяняць",
+       "userrights-expiry-current": "Канчаецца $1",
+       "userrights-expiry-none": "Бестэрмінова",
+       "userrights-expiry": "Канчаецца:",
+       "userrights-expiry-existing": "Цяперашні час сканчэння: $3, $2",
+       "userrights-expiry-othertime": "Іншы час:",
        "userrights-conflict": "Канфлікт змянення ўдзельніцкіх дазволаў! Калі ласка, праверце і пацвердзіце змены.",
-       "userrights-removed-self": "Вы выдалілі свае ўласныя правы. Такім чынам, Вы больш не зможаце атрымаць доступ да гэтай старонкі.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "group-autoconfirmed": "Аўта-пацверджаныя ўдзельнікі",
        "right-siteadmin": "Замыкаць і адмыкаць базу даных",
        "right-override-export-depth": "Экспартаваць старонкі, у тым ліку звязаныя, да глыбіні спасылак 5.",
        "right-sendemail": "Адпраўляць электронныя лісты іншым удзельнікам",
-       "right-passwordreset": "Бачыць электронныя лісты аб змяненні пароля",
        "right-managechangetags": "Ствараць і (дэ)актываваць [[Special:Tags|біркі]]",
        "right-applychangetags": "Прымяняць [[Special:Tags|біркі]] са сваімі праўкамі",
        "right-changetags": "Дадаваць і выдаляць адвольныя [[Special:Tags|біркі]] да асобных версій і запісаў у журнале падзей",
        "action-upload_by_url": "загрузіць гэты файл з адраса URL",
        "action-writeapi": "ужываць API запісвання",
        "action-delete": "сціраць гэтую старонку",
-       "action-deleterevision": "сціраць гэтую версію",
+       "action-deleterevision": "сціраць версіі старонак",
+       "action-deletelogentry": "выдаленне запісаў у журнале",
        "action-deletedhistory": "бачыць сцёртую гісторыю гэтай старонкі",
+       "action-deletedtext": "прагляд тэксту выдаленай версіі",
        "action-browsearchive": "шукаць у сцёртых старонках",
-       "action-undelete": "аднаўляць гэтую старонку",
+       "action-undelete": "аднаўленне старонак",
        "action-suppressrevision": "бачыць і аднаўляць гэтую схаваную версію",
        "action-suppressionlog": "бачыць гэты прыватны журнал",
        "action-block": "блакаваць праўкі гэтага ўдзельніка",
        "action-userrights-interwiki": "мяняць дазволы ўдзельнікаў на іншых вікі",
        "action-siteadmin": "зачыняць і адчыняць базу даных",
        "action-sendemail": "адпраўка электронных пісем",
+       "action-editmyoptions": "змяненне Вашых наладаў",
        "action-editmywatchlist": "правіць свой спіс назірання",
        "action-viewmywatchlist": "глядзець свой спіс назірання",
        "action-viewmyprivateinfo": "бачыць свае асабістыя звесткі",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
        "recentchanges-submit": "Паказаць",
+       "rcfilters-filter-userExpLevel-learner-description": "Болей дзён актыўнасці і правак, чым у «навічкоў», але меней чым у «дасведчаных удзельнікаў».",
+       "rcfilters-filter-userExpLevel-experienced-description": "Больш за 30 дзён актыўнасці і 500 правак.",
+       "rcfilters-filter-bots-label": "Бот",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "uploaded-setting-event-handler-svg": "Устаноўка атрыбутаў апрацоўкі падзей заблакавана, у ўкладзеным SVG-файле знойдзены код <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-href-svg": "Выкарыстанне тэга \"set\" для дадання атрыбута \"href\" у бацькоўскі элемент заблакавана.",
        "uploaded-wrong-setting-svg": "Ужыванне тэга \"set\" для задання ў якасці мэты аддаленага адраса/звестак/сцэнарыя для любога атрыбута заблакавана. У ўкладзеным SVG-файле знойдзены <code>&lt;set to=\"$1\"&gt;</code>.",
-       "uploadscriptednamespace": "Гэты файл SVG утрымлівае недапушчальную прастору імёнаў \"$1\".",
+       "uploadscriptednamespace": "Гэты файл SVG утрымлівае недапушчальную прастору імёнаў \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Немагчыма прааналізаваць XML ва ўкладзеным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасці: $1",
        "uploadjava": "Файл ўяўляе сабой ZIP-архіў, які змяшчае .class файл Java.",
        "apisandbox-submit-invalid-fields-title": "Некаторыя палі недапушчальныя",
        "apisandbox-submit-invalid-fields-message": "Калі ласка, выпраўце адзначаныя палі і паспрабуйце ізноў.",
        "apisandbox-results": "Вынікі",
+       "apisandbox-sending-request": "Адпраўка API-запыту…",
+       "apisandbox-loading-results": "Атрымліваем API-вынікі…",
        "apisandbox-request-url-label": "URL-адрас запыту:",
        "apisandbox-request-time": "Час запыту: {{PLURAL:$1|$1 мс}}",
        "apisandbox-results-fixtoken": "Папраўце токен і паўтарыце адпраўку",
        "apisandbox-continue": "Працягнуць",
        "apisandbox-continue-clear": "Ачысціць",
        "apisandbox-param-limit": "Увядзіце <kbd>max</kbd>, каб выкарыстаць максімальны ліміт.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Усе прасторы назваў)",
+       "apisandbox-multivalue-all-values": "$1 (Усе значэнні)",
        "booksources": "Кнігі",
        "booksources-search-legend": "Знайсці, дзе купіць кнігі",
        "booksources-search": "Пошук",
        "activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дзеянне|дзеянні|дзеянняў}} за апошні{{PLURAL:$3| дзень|я $3 дні|я $3 дзён}}",
        "activeusers-from": "Паказ, пачынаючы з:",
-       "activeusers-groups": "Паказаць удзельнікаў, якія належаць да групаў:",
+       "activeusers-groups": "Паказаць удзельнікаў, якія належаць да груп:",
        "activeusers-noresult": "Няма такіх удзельнікаў.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Дазволы для груп удзельнікаў",
        "listgrouprights-namespaceprotection-header": "Абмежаванні прасторы назваў",
        "listgrouprights-namespaceprotection-namespace": "Прастора назваў",
        "listgrouprights-namespaceprotection-restrictedto": "Дазвол(ы), неабходныя для праўкі",
+       "listgrants": "Дазволы",
+       "listgrants-grant": "Дазвол",
        "listgrants-rights": "Правы",
        "trackingcategories": "Катэгорыі для асочвання",
        "trackingcategories-summary": "На гэтай старонцы пералічаны катэгорыі для асочвання, якія аўтаматычна напаўняюцца праграмным забеспячэннем MediaWiki. Іх можна перайменаваць, змяніўшы адпаведныя сістэмныя паведамленні ў прасторы назваў {{ns:8}}.",
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Эл.пошта адаслана",
        "emailsenttext": "Ваш ліст эл.пошты быў адасланы.",
-       "emailuserfooter": "Гэты эл.ліст быў высланы ад $1 да $2 праз функцыю \"{{:{{ns:mediawiki}}:emailuser/be}}\" пляцоўкі {{SITENAME}}.",
+       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}. {{GENDER:$2|Ваш}} ліст у адказ будзе дасланы {{GENDER:$1|адпраўніку|адпраўніцы}}, і {{GENDER:$1|яму|ёй}} будзе бачны {{GENDER:$2|ваш}} адрас электроннай пошты.",
        "usermessage-summary": "Пакінуць адмысловае паведамленне.",
        "usermessage-editor": "Адмысловая дастаўка",
        "watchlist": "Мой спіс назірання",
        "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]]",
        "sp-contributions-newbies-sub": "З новых рахункаў",
        "sp-contributions-newbies-title": "Уклады ўдзельнікаў з новых рахункаў",
        "sp-contributions-blocklog": "блакіроўкі",
-       "sp-contributions-suppresslog": "заглушаны ўклад удзельніка",
-       "sp-contributions-deleted": "сцёрты ўклад удзельніка",
+       "sp-contributions-suppresslog": "схаваны ўклад {{GENDER:$1|удзельніка|удзельніцы}}",
+       "sp-contributions-deleted": "сцёрты ўклад {{GENDER:$1|удзельніка|удзельніцы}}",
        "sp-contributions-uploads": "укладанні",
        "sp-contributions-logs": "журналы",
        "sp-contributions-talk": "размовы",
        "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка <strong>не будзе</strong> перанесена, калі пад новай назвай ужо існуе старонка, і гэта не перасылка без гісторыі правак.\nТакім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n</strong>Увага!</strong>\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetext-noredirectfixer": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetalktext": "Звязаная старонка размовы будзе аўтаматычна перанесена разам з асноўнай, '''апроч тых выпадкаў, калі:'''\n*Існуе непустая старонка размовы звязаная з новай назвай, або\n*З боксу, што ніжэй, знятая адзнака.\n\nУ такіх выпадках, калі гэта неабходна, трэба пераносіць або аб'ядноўваць старонку размовы самастойна.",
-       "moveuserpage-warning": "'''Увага.''' Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік '''не''' будзе пераназваны.",
+       "moveuserpage-warning": "<strong>Увага:</strong> Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік <em>не</em> будзе пераназваны.",
        "movecategorypage-warning": "<strong>Увага:</strong> Вы збіраецеся перанесці старонку катэгорыі. Заўважце, што толькі гэта старонка будзе перанесена, і ніводная старонка са старой катэгорыі <em>не будзе</em> катэгарызавана ў новай.",
        "movenologintext": "Вы павінны быць зарэгістраваным удзельнікам, і [[Special:UserLogin|ўвайсці ў сістэму]], каб пераносіць старонкі.",
        "movenotallowed": "Вам не дазволена пераносіць старонкі.",
        "cant-move-to-user-page": "Вам не дазволена пераносіць старонку ў старонку карыстальніка (не лічачы пад-старонак карыстальніка).",
        "cant-move-category-page": "Вам не дазволена пераносіць старонкі катэгорый.",
        "cant-move-to-category-page": "Вам не дазволена пераносіць старонку ў старонку катэгорыі.",
+       "cant-move-subpages": "Вам не дазволена пераносіць падстаронкі.",
+       "namespace-nosubpages": "Прастора назваў \"$1\" не дазваляе падстаронкі.",
        "newtitle": "Новая назва:",
        "move-watch": "Назіраць за старонкай",
        "movepagebtn": "Перанесці старонку",
        "movelogpagetext": "Ніжэй пададзены спіс пераносаў старонак.",
        "movesubpage": "{{PLURAL:$1|Пад-старонка|Пад-старонкі}}",
        "movesubpagetext": "Старонка мае $1 {{PLURAL:$1|пад-старонку, паказаную ніжэй|пад-старонкі, паказаныя ніжэй}}.",
+       "movesubpagetalktext": "Адпаведная старонка размоў мае $1 {{PLURAL:$1|падстаронку, паказаную|падстаронкі, паказаныя|падстаронак, паказаныя}} ніжэй.",
        "movenosubpage": "Старонка не мае пад-старонак.",
        "movereason": "Прычына:",
        "revertmove": "адкат",
-       "delete_and_move_text": "==Патрабуецца сціранне==\n\nУжо існуе артыкул з мэтавай назвай \"[[:$1]]\". Дык ці жадаеце сцерці яго, каб зрабіць месца для пераносу?",
+       "delete_and_move_text": "Ужо існуе артыкул з мэтавай назвай \"[[:$1]]\".\nХочаце сцерці яго, каб зрабіць месца для пераносу?",
        "delete_and_move_confirm": "Так, сцерці старонку",
        "delete_and_move_reason": "Сцёрта, каб зрабіць месца для пераносу \"[[$1]]\"",
        "selfmove": "Назвы вытока і мэты такія самыя; нельга пераносіць старонку саму на сябе.",
        "pageinfo-length": "Аб'ём старонкі (у байтах)",
        "pageinfo-article-id": "Ідэнтыфікатар старонкі",
        "pageinfo-language": "Мова змесціва старонкі",
+       "pageinfo-language-change": "змяніць",
        "pageinfo-content-model": "Мадэль змесціва старонкі",
        "pageinfo-content-model-change": "змяніць",
        "pageinfo-robot-policy": "Індэксаванне робатамі",
        "pageinfo-category-pages": "Колькасць старонак",
        "pageinfo-category-subcats": "Колькасць падкатэгорый",
        "pageinfo-category-files": "Колькасць файлаў",
+       "pageinfo-user-id": "Ідэнтыфікатар удзельніка",
        "markaspatrolleddiff": "Пазначыць як ухваленае",
        "markaspatrolledtext": "Пазначыць старонку як ухваленую",
        "markaspatrolledtext-file": "Пазначыць версію файла як ухваленую",
        "log-show-hide-patrol": "$1 журнал ухваленняў",
        "log-show-hide-tag": "$1 журнал бірак",
        "confirm-markpatrolled-button": "Добра",
+       "confirm-markpatrolled-top": "Пазначыць версію $3 старонкі $2 як патруляваную?",
        "deletedrevision": "Сцёрта старая версія $1",
        "filedeleteerror-short": "Памылка пры сціранні файла: $1",
        "filedeleteerror-long": "Памылкі пры спробе сцірання файла:\n\n$1",
        "tags-actions-header": "Дзеянні",
        "tags-active-yes": "Да",
        "tags-active-no": "Не",
-       "tags-source-extension": "Ð\92Ñ\8bзнаÑ\87аеÑ\86Ñ\86а ÐºÐ°Ð½Ñ\87аÑ\82кам Ð½Ð°Ð·Ð²Ñ\8b",
+       "tags-source-extension": "Ð\92Ñ\8bзнаÑ\87аеÑ\86Ñ\86а Ð¿Ñ\80агÑ\80амнÑ\8bм Ð·Ð°Ð±ÐµÑ\81пÑ\8fÑ\87Ñ\8dннем",
        "tags-source-manual": "Ставіцца ўручную ўдзельнікамі і робатамі",
        "tags-source-none": "Больш не выкарыстоўваецца",
        "tags-edit": "правіць",
        "tags-activate": "актываваць",
        "tags-deactivate": "адключыць",
        "tags-hitcount": "$1 {{PLURAL:$1|змена|змены|змен}}",
+       "tags-manage-no-permission": "У вас няма дазволу на кіраванне біркамі змен.",
        "tags-manage-blocked": "Вы не можаце мяняць меткі, калі {{GENDER:$1|Вы}} заблакаваныя.",
        "tags-create-heading": "Стварыць новую бірку",
        "tags-create-explanation": "Калі не ўказана іншае, новыя біркі будуць даступны для выкарыстання ўдзельнікам і робатам.",
        "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-not-found": "Бірка \"$1\" не існуе.",
        "tags-delete-too-many-uses": "Бірка \"$1\" прыменена ў больш чым $2 {{PLURAL:$2|версіі|версіях}}, а значыць, яна не можа быць сцёрта.",
        "tags-delete-warnings-after-delete": "Бірка \"$1\" была сцёрта, але {{PLURAL:$2|1=атрымана наступнае папярэджанне|атрыманы наступныя папярэджанні}}:",
+       "tags-delete-no-permission": "У вас няма дазволу на выдаленне бірак змен.",
        "tags-activate-title": "Актываваць бірку",
        "tags-activate-question": "Вы збіраецеся актываваць бірку \"$1\".",
        "tags-activate-reason": "Прычына:",
        "tags-deactivate-reason": "Прычына:",
        "tags-deactivate-not-allowed": "Немагчыма дэактываваць бірку \"$1\".",
        "tags-deactivate-submit": "Дэактываваць",
-       "tags-apply-blocked": "Вы не можаце мяняць меткі да Вашых зменаў, калі вы заблакаваныя.",
+       "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-update-remove-not-allowed-multi": "{{PLURAL:$2|Наступную бірку|Наступныя біркі}} нельга выдаляць уручную: $1",
        "tags-edit-title": "Правіць біркі",
        "htmlform-user-not-exists": "<strong>$1</strong> не існуе.",
        "htmlform-user-not-valid": "<strong>$1</strong> - недапушчальная назва уліковага запісу.",
        "logentry-delete-delete": "$1 {{GENDER:$2|сцёр|сцёрла}} старонку $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|выдаліў|выдаліла}} перанакіраванне $3 шляхам перазапісу",
        "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
        "logentry-delete-event": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|запісу журнала|$5 запісаў журнала}} $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|версіі|$5 версій|$5 версій}} старонкі $3: $4",
        "feedback-submit": "Даслаць",
        "feedback-thanks": "Дзякуй! Ваш водгук размешчаны на старонцы «[$2 $1]».",
        "feedback-thanks-title": "Дзякуем!",
-       "searchsuggest-search": "Шукаць у {{SITENAME}}",
+       "searchsuggest-search": "Шукаць у {{GRAMMAR:месны|{{SITENAME}}}}",
        "searchsuggest-containing": "змяшчае...",
-       "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
-       "api-error-copyuploaddisabled": "Загрузка з URL-адраса забаронена на гэтым серверы.",
-       "api-error-duplicate": "Ужо {{PLURAL:$1|існуе іншы файл|існуюць іншыя файлы}} з такім жа зместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|ўжо быў файл|былі файлы}} з дакладна такім жа зместам, але {{PLURAL:$1|ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэнне новых пустых старонак забаронена.",
-       "api-error-fetchfileerror": "Унутраная памылка: падчас атрымання файла штосьці здарылася.",
-       "api-error-fileexists-forbidden": "Файл з назвай \"$1\" ужо ёсць і не можа быць перапісаны.",
-       "api-error-fileexists-shared-forbidden": "Файл з назвай \"$1\" ужо ёсць у супольным сховішчы файлаў, ён не можа быць перапісаны.",
-       "api-error-file-too-large": "Дасланы Вамі файл занадта вялікі.",
-       "api-error-filename-tooshort": "Імя файла занадта кароткае.",
-       "api-error-filetype-banned": "Гэты тып файлаў забаронены.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|належыць да недазволенага тыпу файлаў|належаць да недазволеных тыпаў файлаў}}. Пералік дазволеных тыпаў складаецца з {{PLURAL:$3|тыпу|тыпаў}}: $2.",
-       "api-error-filetype-missing": "У файла няма пашырэння.",
-       "api-error-hookaborted": "Прапанаванае вамі змяненне было адменена ў апрацоўшчыку пашырэння.",
-       "api-error-http": "Унутраная памылка: немагчыма далучыцца да сервера.",
-       "api-error-illegal-filename": "Імя файла не дапускаецца.",
-       "api-error-internal-error": "Унутраная памылка: падчас апрацоўкі Вашага файла штосьці здарылася.",
-       "api-error-invalid-file-key": "Унутраная памылка: не быў знойдзены часовы файл.",
-       "api-error-missingparam": "Унутраная памылка: запыт бракуе параметраў.",
-       "api-error-missingresult": "Унутраная памылка: немагчыма вызначыць, ці паспяхова зробленае капіяванне.",
-       "api-error-mustbeloggedin": "Для загрузкі файлаў неабходна ўвайсці ў сістэму.",
-       "api-error-mustbeposted": "Памылка гэтага праграмнага забеспячэння; яно не выкарыстоўвае слушны HTTP-метад.",
-       "api-error-noimageinfo": "Файл загружаны, але сервер не даў пра яго ніякай інфармацыі.",
-       "api-error-nomodule": "Унутраная памылка: не выбраны модуль загрузкі.",
-       "api-error-ok-but-empty": "Унутраная памылка: няма адказу ад сервера.",
-       "api-error-overwrite": "Замена існуючага файла не дапускаецца.",
-       "api-error-stashfailed": "Унутраная памылка: сервер не змог захаваць часовы файл.",
        "api-error-publishfailed": "Унутраная памылка: сервер не змог апублікаваць тымчасовы файл.",
-       "api-error-stasherror": "У час укладання файла ў сховішча здарылася памылка.",
-       "api-error-timeout": "Сервер не адказаў у чаканы тэрмін.",
-       "api-error-unclassified": "Узнікла невядомая памылка",
-       "api-error-unknown-code": "Невядомая памылка: «$1».",
-       "api-error-unknown-error": "Унутраная памылка: падчас загрузкі файла здарылася штосьці невядомае.",
+       "api-error-stashfailed": "Унутраная памылка: сервер не змог захаваць часовы файл.",
        "api-error-unknown-warning": "Невядомае папярэджанне: $1",
        "api-error-unknownerror": "Невядомая памылка: «$1».",
-       "api-error-uploaddisabled": "Загрузка ў гэтую вікі адключаная.",
-       "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушны канчатак назвы.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|мінута|мінуты|мінут}}",
        "duration-hours": "$1 {{PLURAL:$1|гадзіна|гадзіны|гадзін}}",
        "special-characters-title-emdash": "доўгі працяжнік",
        "special-characters-title-minus": "мінус",
        "mw-widgets-dateinput-no-date": "Дата не выбрана",
+       "mw-widgets-mediasearch-input-placeholder": "Пошук мультымедыя",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
        "mw-widgets-titleinput-description-redirect": "перанакіраванне на $1",
        "log-action-filter-all": "Усе",
        "log-action-filter-protect-move_prot": "Ахова старонкі",
        "log-action-filter-rights-rights": "Ручное змяненне",
        "log-action-filter-rights-autopromote": "Аўтаматычнае змяненне",
+       "log-action-filter-suppress-event": "Cкрыванне журнала",
+       "log-action-filter-suppress-revision": "Скрыванне версіі",
+       "log-action-filter-suppress-delete": "Cкрыванне старонкі",
+       "log-action-filter-suppress-block": "Скрыванне ўдзельніка праз блакіраванне",
+       "log-action-filter-suppress-reblock": "Скрыванне ўдзельніка праз паўторнае блакіраванне",
        "log-action-filter-upload-upload": "Новая перадача",
-       "log-action-filter-upload-overwrite": "Ð\92Ñ\8bкладванне",
+       "log-action-filter-upload-overwrite": "Ð\9fаÑ\9eÑ\82оÑ\80наÑ\8f Ð·Ð°Ð³Ñ\80Ñ\83зка",
        "authmanager-authn-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
        "authmanager-authn-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць завераны.",
-       "authmanager-authn-no-local-user": "Прадастаўленыя ўліковыя дадзеныя не звязаныя з нікодным удзельнікам на гэтай Вікі.",
+       "authmanager-authn-no-local-user": "Пададзеныя ўліковыя дадзеныя не звязаныя з ніводным удзельнікам на гэтай Вікі.",
        "authmanager-authn-no-local-user-link": "Прадастаўленыя ўліковыя дадзеныя сапраўдныя, але не звязаныя з ніводным удзельнікам гэтай Вікі. Увайдзіце іншым спосабам або стварыце новы акаўнт і ў вас з'явіцца магчымасць звязаць свае папярэднія ўліковыя дадзеныя для гэтага ўліковага запісу.",
        "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэнне лакальнага ўліковага запісу не ўдалося: $1",
        "authmanager-change-not-supported": "Прадастаўленыя ўліковыя дадзеныя не могуць быць зменены, як нішто не будзе іх выкарыстоўваць.",
        "authmanager-autocreate-noperm": "Аўтаматычнае стварэнне уліковых запісаў не дапускаецца.",
        "authmanager-autocreate-exception": "Аўтаматычнае стварэнне уліковых запісаў часова адключана з-за памылак папярэдніх.",
        "authmanager-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
+       "authmanager-userlogin-remembermypassword-help": "Ці трэба памятаць пароль даўжэй за працягласць сеанса.",
        "authmanager-username-help": "Імя карыстальніка для праверкі сапраўднасці.",
        "authmanager-password-help": "Пароль для праверкі сапраўднасці.",
        "authmanager-domain-help": "Дамен для знешняй праверкі сапраўднасці.",
        "linkaccounts-success-text": "Акаўнт быў звязаны.",
        "linkaccounts-submit": "Звязаць акаўнты",
        "unlinkaccounts": "Адмяніць сувязь уліковых запісаў",
-       "unlinkaccounts-success": "Сувязь акаўнтаў была выдалена."
+       "unlinkaccounts-success": "Сувязь акаўнтаў была выдалена.",
+       "userjsispublic": "Звярніце ўвагу: укладзеныя JavaScript-старонкі не павінны ўтрымліваць канфідэнцыйныя звесткі, бо іх могуць бачыць іншыя ўдзельнікі.",
+       "usercssispublic": "Звярніце ўвагу: укладзеныя CSS-старонкі не павінны ўтрымліваць канфідэнцыйныя звесткі, бо іх могуць бачыць іншыя ўдзельнікі.",
+       "restrictionsfield-badip": "Няслушны IP-адрас ці дыяпазон: $1",
+       "restrictionsfield-label": "Дазволеныя дыяпазоны IP-адрасоў:"
 }
index 75266e8..0f96934 100644 (file)
        "qbpageoptions": "Тази страница",
        "qbmyoptions": "Моите страници",
        "faq": "ЧЗВ",
-       "faqpage": "Проект:ЧЗВ",
+       "faqpage": "Project:ЧЗВ",
        "actions": "Действия",
        "namespaces": "Именни пространства",
        "variants": "Варианти",
        "searcharticle": "Отваряне",
        "history": "История",
        "history_short": "История",
+       "history_small": "история",
        "updatedmarker": "има промяна (от последното ви влизане)",
        "printableversion": "Версия за печат",
        "permalink": "Постоянна препратка",
        "unprotectthispage": "Промяна на защитата на тази страница",
        "newpage": "Нова страница",
        "talkpage": "Дискусионна страница",
-       "talkpagelinktext": "Ð\91еседа",
+       "talkpagelinktext": "беседа",
        "specialpage": "Специална страница",
        "personaltools": "Лични инструменти",
        "articlepage": "Преглед на страница",
        "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Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
        "previewnote": "<strong>Обърнете внимание, че това е само предварителен преглед.</strong>\nПромените все още не са съхранени!",
        "continue-editing": "Продължаване към полето за редактиране",
        "previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
-       "session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново. \nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
-       "session_fail_preview_html": "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''\n\n''Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез Джаваскрипт.''\n\n'''Опитайте отново. Ако все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново.'''",
+       "session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново.</strong>\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
+       "session_fail_preview_html": "За съжаление редакцията ви не беше записана поради изтичането на сесията ви.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
        "token_suffix_mismatch": "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
        "edit_form_incomplete": "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
        "editing": "Редактиране на „$1“",
        "search-interwiki-caption": "Сродни проекти",
        "search-interwiki-default": "Резултати от $1:",
        "search-interwiki-more": "(още)",
+       "search-interwiki-more-results": "повече резултати",
        "search-relatedarticle": "Свързани",
        "searchrelated": "свързани",
        "searchall": "всички",
        "saveprefs": "Съхраняване",
        "restoreprefs": "Възстановяване на всички настройки по подразбиране (за всички раздели)",
        "prefs-editing": "Редактиране",
-       "rows": "Редове:",
-       "columns": "Колони:",
        "searchresultshead": "Търсене",
        "stub-threshold": "Праг за форматиране на препратки към мъничета ($1):",
        "stub-threshold-sample-link": "пример",
        "youremail": "Е-поща:",
        "username": "{{GENDER:$1|Потребителско име}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} на {{PLURAL:$1|група|групи}}:",
+       "group-membership-link-with-expiry": "$1 (до $2)",
        "prefs-registration": "Регистрация:",
        "yourrealname": "Истинско име:",
        "yourlanguage": "Език:",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.",
        "userrights": "Управление на потребителските права",
-       "userrights-lookup-user": "УпÑ\80авлÑ\8fване Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е Ð³Ñ\80Ñ\83пи",
+       "userrights-lookup-user": "Ð\98збеÑ\80еÑ\82е Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ел",
        "userrights-user-editname": "Потребителско име:",
-       "editusergroup": "РедакÑ\82иÑ\80ане Ð½Ð° {{GENDER:$1|поÑ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е}} групи",
+       "editusergroup": "Ð\97аÑ\80еждане Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е групи",
        "editinguser": "Промяна на потребителските права на {{GENDER:$1|потребител }} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Редактиране на потребителските групи",
-       "saveusergroups": "Съхраняване на потребителските групи",
+       "userrights-editusergroup": "Редактиране на {{GENDER:$1|потребителските}} групи",
+       "userrights-viewusergroup": "Преглед на {{GENDER:$1|потребителските}} групи",
+       "saveusergroups": "Съхраняване на {{GENDER:$1|потребителските}} групи",
        "userrights-groupsmember": "Член на:",
        "userrights-groupsmember-auto": "Подразбиращ се член на:",
        "userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Нямате права да редактирате потребителските групи на други уикита.",
        "userrights-nodatabase": "Базата данни $1 не съществува или не е на локалния сървър.",
-       "userrights-nologin": "За управление на потребителските права е необходимо [[Special:UserLogin|влизане]] с администраторска сметка.",
-       "userrights-notallowed": "Нямате права да добавяте или премахвате потребителски права.",
        "userrights-changeable-col": "Групи, които можете да променяте",
        "userrights-unchangeable-col": "Групи, които не можете да променяте",
+       "userrights-expiry-current": "Изтича на $1",
+       "userrights-expiry": "Изтича на:",
+       "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": "Потребителска група:",
        "group-user": "Потребители",
        "group-autoconfirmed": "Автоматично одобрени потребители",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократи",
        "grouppage-suppress": "{{ns:project}}:Ревизори",
        "right-read": "Четене на страници",
-       "right-edit": "редактиране на страници",
+       "right-edit": "Редактиране на страници",
        "right-createpage": "Създаване на страници (които не са беседи)",
        "right-createtalk": "Създаване на дискусионни страници",
        "right-createaccount": "Създаване на нови потребителски сметки",
        "right-reupload": "Презаписване на съществуващ файл",
        "right-reupload-own": "Презаписване на съществуващ файл, качен от същия потребител",
        "right-reupload-shared": "Предефиниране на едноименните файлове от общото мултимедийно хранилище с локални",
-       "right-upload_by_url": "качване на файл от URL адрес",
+       "right-upload_by_url": "Ð\9aачване на файл от URL адрес",
        "right-purge": "изчистване на складираното съдържание на страниците без показване на страница за потвърждение",
        "right-autoconfirmed": "Редактиране на полузащитени страници",
        "right-bot": "Третиране като автоматизиран процес",
        "right-suppressionlog": "Преглеждане на тайните дневници",
        "right-block": "спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
-       "right-hideuser": "блокиране и скриване на потребителско име",
-       "right-ipblock-exempt": "пренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали",
+       "right-hideuser": "Ð\91локиране и скриване на потребителско име",
+       "right-ipblock-exempt": "Ð\9fренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали",
        "right-unblockself": "Собствено отблокиране",
-       "right-protect": "пÑ\80оменÑ\8fне Ð½Ð° Ð½Ð¸Ð²Ð¾Ñ\82о Ð½Ð° Ð·Ð°Ñ\89иÑ\82а Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ð·Ð°Ñ\89иÑ\82ени страници",
+       "right-protect": "Ð\9fÑ\80оменÑ\8fне Ð½Ð° Ð½Ð¸Ð²Ð¾Ñ\82о Ð½Ð° Ð·Ð°Ñ\89иÑ\82а Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° ÐºÐ°Ñ\81кадно-заÑ\89иÑ\82ениÑ\82е страници",
        "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“",
        "right-editinterface": "Редактиране на потребителския интерфейс",
        "right-editusercssjs": "редактиране на CSS и JS файловете на други потребители",
        "right-rollback": "Бърза отмяна на промените, направени от последния потребител, редактирал дадена страница",
        "right-markbotedits": "отбелязване на възвърнатите редакции като редакции на ботове",
        "right-noratelimit": "Пренебрегване на всякакви ограничения",
-       "right-import": "внасяне на страници от други уикита",
-       "right-importupload": "внасяне на страници от качен файл",
-       "right-patrol": "отбелязване на редакциите като проверени",
+       "right-import": "Ð\92насяне на страници от други уикита",
+       "right-importupload": "Ð\92насяне на страници от качен файл",
+       "right-patrol": "Ð\9eтбелязване на редакциите като проверени",
        "right-autopatrol": "Автоматично отбелязване на редакции като проверени",
        "right-patrolmarks": "Показване на отбелязаните като патрулирани последни промени",
        "right-unwatchedpages": "преглеждане на списъка с ненаблюдаваните страници",
        "right-mergehistory": "сливане на редакционни истории на страници",
-       "right-userrights": "редактиране на потребителските права",
+       "right-userrights": "Редактиране на потребителските права",
        "right-userrights-interwiki": "редактиране на потребителски права на потребители в други уикита",
        "right-siteadmin": "заключване и отключване на базата от данни",
        "right-override-export-depth": "Изнасяне на страници, включително свързаните с тях в дълбочина до пето ниво",
        "right-sendemail": "Изпращане на е-писма до другите потребители",
-       "right-passwordreset": "Преглеждане на е-писма за възстановяване на парола",
        "grant-group-email": "Изпращане на е-писмо",
        "grant-blockusers": "Блокиране и отблокиране на потребители",
        "grant-createaccount": "Създаване на сметки",
        "action-upload_by_url": "качване на този файл от URL адрес",
        "action-writeapi": "използване на API за писане",
        "action-delete": "изтриване на страницата",
-       "action-deleterevision": "изтриване на тази версия",
-       "action-deletedhistory": "преглеждане на изтритата история на тази страница",
+       "action-deleterevision": "изтриване на версии",
+       "action-deletelogentry": "изтриване на записи от дневника",
+       "action-deletedhistory": "преглед на изтритата история на тази страница",
        "action-browsearchive": "търсене на изтрити страници",
-       "action-undelete": "вÑ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а",
-       "action-suppressrevision": "пÑ\80еглеждане Ð¸ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\82ази Ñ\81кÑ\80иÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f",
+       "action-undelete": "вÑ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и",
+       "action-suppressrevision": "пÑ\80еглеждане Ð¸ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\81кÑ\80иÑ\82и Ð²ÐµÑ\80Ñ\81ии",
        "action-suppressionlog": "преглеждане на този поверителен дневник",
        "action-block": "блокиране на редакциите на този потребител",
        "action-protect": "променяне на нивото на защита на тази страница",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вижте също [[Special:NewPages|списъка с нови страници]])",
        "recentchanges-submit": "Покажи",
+       "rcfilters-clear-all-filters": "Изчистване на всички филтри",
+       "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-noresults": "Не са намерени филтри",
+       "rcfilters-filtergroup-registration": "Регистрация на потребители",
+       "rcfilters-filter-unregistered-label": "Нерегистрирани",
+       "rcfilters-filter-editsbyself-label": "Ваши собствени редакции",
+       "rcfilters-filter-editsbyself-description": "Ваши редакции.",
+       "rcfilters-filter-editsbyother-label": "Чужди редакции",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новодошли",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-humans-label": "Човек (не бот)",
+       "rcfilters-filter-minor-label": "Малки промени",
+       "rcfilters-filter-major-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 на малки промени",
        "uploaddisabledtext": "Качването на файлове е забранено.",
        "php-uploaddisabledtext": "Качванията на файлове са спрени през PHP. Проверете настройката file_uploads.",
        "uploadscripted": "Файлът съдържа HTML или скриптов код, който може да бъде погрешно  интерпретиран от браузъра.",
-       "uploadscriptednamespace": "Този SVG файл съдържа неправилно именно пространство „$1“",
+       "uploadscriptednamespace": "Този SVG файл съдържа неправилно именно пространство „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "XML-кода в качения файл не може да бъде анализиран.",
        "uploadvirus": "Файлът съдържа вирус! Подробности: $1",
        "uploadjava": "Файлът е ZIP файл, който съдържа Java .class файл.\nКачването на Java файлове не е позволено, тъй като могат да причинят заобикаляне на ограниченията за сигурност.",
        "uploadnewversion-linktext": "Качване на нова версия на файла",
        "shared-repo-from": "от $1",
        "shared-repo": "споделено хранилище",
+       "shared-repo-name-wikimediacommons": "Общомедия",
        "upload-disallowed-here": "Не можете да презапишете файла.",
        "filerevert": "Възвръщане на $1",
        "filerevert-legend": "Възвръщане на файла",
        "protectedpages-performer": "Защитаващ потребител",
        "protectedpages-params": "Параметри на защита",
        "protectedpages-reason": "Причина",
+       "protectedpages-submit": "Показване на страниците",
        "protectedpages-unknown-timestamp": "Неизвестни",
        "protectedpages-unknown-performer": "Неизвестен потребител",
        "protectedtitles": "Защитени заглавия",
        "protectedtitlesempty": "В момента няма заглавия, защитени с тези параметри.",
+       "protectedtitles-submit": "Показване на заглавията",
        "listusers": "Списък на потребителите",
        "listusers-editsonly": "Показване само на потребители с редакции",
        "listusers-creationsort": "Сортиране по дата на създаване",
        "nopagetext": "Посочената целева страница не съществува.",
        "pager-newer-n": "{{PLURAL:$1|по-нова 1|по-нови $1}}",
        "pager-older-n": "{{PLURAL:$1|по-стара 1|по-стари $1}}",
-       "suppress": "Премахване от публичния архив",
+       "suppress": "Подтискане",
        "querypage-disabled": "Тази специална страница е изключена, защото затруднява производителността на уикито.",
        "apihelp": "Помощ за API",
        "apihelp-no-such-module": "Модул \"$1\" не беше намерен.",
        "apisandbox-request-url-label": "URL-адрес на заявката:",
        "apisandbox-continue": "Продължаване",
        "apisandbox-continue-clear": "Изчистване",
+       "apisandbox-multivalue-all-namespaces": "$1 (Всички именни пространства)",
+       "apisandbox-multivalue-all-values": "$1 (Всички стойности)",
        "booksources": "Източници на книги",
        "booksources-search-legend": "Търсене на информация за книга",
        "booksources-search": "Търсене",
        "activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
        "activeusers-from": "Показване на потребителите, започвайки от:",
        "activeusers-noresult": "Няма намерени потребители.",
+       "activeusers-submit": "Показване на активните потребители",
        "listgrouprights": "Права по потребителски групи",
        "listgrouprights-summary": "По-долу на тази страница е показан списък на групите потребители в това уики и права им за достъп. Допълнителна информация за отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].",
-       "listgrouprights-key": "Ð\9bегенда:\n* <span class=\"listgrouprights-granted\">Ð\9fовеÑ\80ено право</span>\n* <span class=\"listgrouprights-revoked\">Отнето право</span>",
+       "listgrouprights-key": "Ð\9bегенда:\n* <span class=\"listgrouprights-granted\">Ð\94адено право</span>\n* <span class=\"listgrouprights-revoked\">Отнето право</span>",
        "listgrouprights-group": "Група",
        "listgrouprights-rights": "Права",
        "listgrouprights-helppage": "Help:Права на групите",
        "listgrouprights-removegroup-self-all": "Може да премахва всички групи от собствената сметка",
        "listgrouprights-namespaceprotection-header": "Ограничения на именните пространства",
        "listgrouprights-namespaceprotection-namespace": "Именно пространство",
+       "listgrants": "Разрешения",
+       "listgrants-grant": "Разрешение",
        "listgrants-rights": "Права",
        "trackingcategories": "Категории за проследяване",
        "trackingcategories-summary": "Тази страница съдържа списък на категории за проследяване, които се попълват автоматично от софтуера на МедияУики. Имената им могат да се променят чрез съответните системни съобщения в именното пространство {{ns:8}}.",
        "sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
        "changecontentmodel-title-label": "Заглавие на страницата",
        "changecontentmodel-reason-label": "Причина:",
+       "changecontentmodel-submit": "Променяне",
        "changecontentmodel-success-text": "Типът на съдържанието на [[:$1]] е успешно променен.",
        "log-name-contentmodel": "Дневник на cъдържанието промяна модела",
        "log-description-contentmodel": "Събития, отнасящи се до модели на съдържанието на страницата",
        "undeletedrevisions": "{{PLURAL:$1|Една версия беше възстановена|$1 версии бяха възстановени}}",
        "undeletedrevisions-files": "{{PLURAL:$1|Една версия|$1 версии}} и {{PLURAL:$1|един файл|$2 файла}} бяха възстановени",
        "undeletedfiles": "{{PLURAL:$1|Един файл беше възстановен|$1 файла бяха възстановени}}",
-       "cannotundelete": "Ð\92Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð±ÐµÑ\88е Ð½ÐµÑ\83Ñ\81пеÑ\88но:\n$1",
+       "cannotundelete": "Ð\95дна Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ð¿ÐµÑ\80аÑ\86ии Ð¿Ð¾ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ñ\81е Ð¿Ñ\80овалиÑ\85а:\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": "Ð\94невник на блокиранията",
+       "sp-contributions-blocklog": "дневник на блокиранията",
        "sp-contributions-deleted": "изтрити приноси на {{GENDER:$1|потребител}}",
        "sp-contributions-uploads": "качвания",
        "sp-contributions-logs": "дневници",
        "ipb-unblock": "Отблокиране на потребителско име IP-адрес",
        "ipb-blocklist": "Преглед на текущите блокирания",
        "ipb-blocklist-contribs": "Приноси на {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "{{PLURAL:$1|остава още $1|остават още $1}}",
        "unblockip": "Отблокиране на потребител",
        "unblockiptext": "Използвайте долния формуляр, за да възстановите правото на писане на по-рано блокиран IP-адрес или потребител.",
        "ipusubmit": "Сваляне на блокирането",
        "block-log-flags-hiddenname": "скрито потребителско име",
        "range_block_disabled": "Възможността на администраторите да задават интервали при IP-адресите е изключена.",
        "ipb_expiry_invalid": "Невалиден срок на изтичане.",
+       "ipb_expiry_old": "Срокът на изтичане е минал.",
        "ipb_expiry_temp": "Скритите потребителски имена трябва да се блокират безсрочно.",
        "ipb_hide_invalid": "Тази потребителска сметка не може да бъде прикрита; с нея са направени повече от {{PLURAL:$1|една редакция|$1 редакции}}.",
        "ipb_already_blocked": "„$1“ е вече блокиран",
        "lockdbsuccesstext": "Базата данни на {{SITENAME}} беше заключена.\n<br />Не забравяйте да я [[Special:UnlockDB|отключите]] когато привършите с работата по поддръжката.",
        "unlockdbsuccesstext": "Базата от данни на {{SITENAME}} беше отключена.",
        "lockfilenotwritable": "Няма права за писане върху файла за заключване на базата данни. За да заключи или отключи базата данни, уеб-сървърът трябва да има тези права.",
+       "databaselocked": "Базата от данни е вече заключена.",
        "databasenotlocked": "Базата от данни не е заключена.",
        "lockedbyandtime": "(от $1 на $2 в $3)",
        "move-page": "Преместване на $1",
        "pageinfo-category-pages": "Брой страници",
        "pageinfo-category-subcats": "Брой подкатегории",
        "pageinfo-category-files": "Брой файлове",
+       "pageinfo-user-id": "Потребителски номер",
        "markaspatrolleddiff": "Отбелязване като проверена редакция",
        "markaspatrolledtext": "Отбелязване на редакцията като проверена",
        "markaspatrolledtext-file": "Маркирай версията на файла като проверена",
        "exif-dc-rights": "Права",
        "exif-dc-source": "Източник медия",
        "exif-dc-type": "Вид медия",
+       "exif-rating-rejected": "Отхвърлен",
        "exif-isospeedratings-overflow": "По-голяма от 65535",
        "exif-iimcategory-ace": "Изкуствa, култура и забавление",
        "exif-iimcategory-clj": "Престъпност и право",
        "tags-deactivate": "спиране",
        "tags-hitcount": "$1 {{PLURAL:$1|промяна|промени}}",
        "tags-manage-no-permission": "Нямате права за управление на етикети за промени.",
-       "tags-manage-blocked": "Ð\92ие Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\83пÑ\80авлÑ\8fваÑ\82е ÐµÑ\82икеÑ\82и Ð·Ð° Ð¿Ñ\80омени, Ð´Ð¾ÐºÐ°Ñ\82о Ñ\81Ñ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани.",
+       "tags-manage-blocked": "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\83пÑ\80авлÑ\8fваÑ\82е ÐµÑ\82икеÑ\82и Ð·Ð° Ð¿Ñ\80омени, Ð´Ð¾ÐºÐ°Ñ\82о Ñ\81Ñ\82е {{GENDER:$1|блокиÑ\80ани}}.",
        "tags-create-heading": "Създаване на нов етикет",
        "tags-create-explanation": "По подразбиране, новосъздадените етикети са достъпни за използване от потребители и ботове.",
        "tags-create-tag-name": "Име на етикета:",
        "tags-edit-revision-selected": "{{PLURAL:$1|Избрана версия|Избрани версии}} от [[:$2]]:",
        "tags-edit-revision-legend": "Добавяне или премахване на етикети от {{PLURAL:$1|тази редакция|всичките $1 редакции}}",
        "tags-edit-existing-tags": "Съществуващи етикети:",
+       "tags-edit-existing-tags-none": "<em>Няма</em>",
        "tags-edit-new-tags": "Нови етикети:",
        "tags-edit-add": "Добавете тези етикети:",
        "tags-edit-remove": "Премахнете тези етикети:",
        "feedback-submit": "Изпращане",
        "feedback-thanks": "Благодарности! Вашата обратна информация е публикувана на страницата „[$2  $1]“.",
        "feedback-thanks-title": "Благодарим ви!",
+       "feedback-useragent": "Браузър:",
        "searchsuggest-search": "Търсене в {{SITENAME}}",
        "searchsuggest-containing": "съдържа...",
-       "api-error-autoblocked": "Вашият IP адрес е блокиран автоматично, тъй като е бил използван от блокиран потребител.",
-       "api-error-badaccess-groups": "Нямате необходимите права, за да качвате файлове в това уики.",
        "api-error-badtoken": "Вътрешна грешка: неправилен маркер.",
-       "api-error-blocked": "Блокирани сте да редактирате.",
-       "api-error-copyuploaddisabled": "Качването през URL е забранено на този сървър.",
-       "api-error-duplicate": "На сайта вече има {{PLURAL:$1|качен друг файл|качени други файлове}} с идентично съдържание.",
-       "api-error-duplicate-archive": "На сайта вече е имало {{PLURAL:$1|качен друг файл|качени други файла}} с идентично съдържание, {{PLURAL:$1|който е бил изтрит|които са били изтрити}}.",
-       "api-error-empty-file": "Заявеният за качване файл беше празен.",
        "api-error-emptypage": "Създаването на нови, празени страници, не е разрешено.",
-       "api-error-fetchfileerror": "Вътрешна грешка: Нещо се обърка при извличане на файла.",
-       "api-error-fileexists-forbidden": "Вече съществува файл с име „$1“ и той не може да бъде заменен.",
-       "api-error-fileexists-shared-forbidden": "В споделеното хранилище вече съществува файл с име „$1“ и той не може да бъде заменен.",
-       "api-error-file-too-large": "Заявеният за качване файл беше твърде голям.",
-       "api-error-filename-tooshort": "Името на файла е твърде кратко.",
-       "api-error-filetype-banned": "Този файлов тип не е позволен за качване.",
-       "api-error-filetype-banned-type": "$1 не {{PLURAL:$4|е позволен файлов формат|са позволени файлови формати}}. {{PLURAL:$3|Позволеният файлов формат е|Позволените файлови формати са}} $2.",
-       "api-error-filetype-missing": "Липсва разширение на файла.",
-       "api-error-hookaborted": "Промените, които опитахте да направите, бяха отменени от някое разширение.",
-       "api-error-http": "Вътрешна грешка: Грешка при свързането със сървъра.",
-       "api-error-illegal-filename": "Непозволено име на файл.",
-       "api-error-internal-error": "Вътрешна грешка: Нещо се обърка при обработката на качването в уикито.",
-       "api-error-invalid-file-key": "Вътрешна грешка: Файлът не беше открит във временното хранилище.",
-       "api-error-missingparam": "Вътрешна грешка: Липсващи параметри на заявката.",
-       "api-error-missingresult": "Вътрешна грешка: Не може да се определи дали копирането е успешно.",
-       "api-error-mustbeloggedin": "Трябва да сте влезли в системата, за да можете да качвате файлове.",
-       "api-error-mustbeposted": "Вътрешна грешка: Заявката изисква HTTP POST.",
-       "api-error-noimageinfo": "Качването беше успешно, но сървърът не подаде никаква информация за файла.",
-       "api-error-nomodule": "Вътрешна грешка: Липсва настроен модул за качвания.",
-       "api-error-ok-but-empty": "Вътрешна грешка: Няма отговор от сървъра.",
-       "api-error-overwrite": "Не е позволено презаписването върху съществуващ файл.",
-       "api-error-stashfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
        "api-error-publishfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
-       "api-error-stasherror": "Имаше грешка при качване на файла в хранилището.",
-       "api-error-stashedfilenotfound": "Скритият файл не беше открит при опита за качването му от временното хранилище.",
-       "api-error-stashfilestorage": "Имаше грешка при съхраняването на файла в хранилището.",
-       "api-error-stashnotloggedin": "Трябва да сте влезли в системата за да съхранявате файлове във временното хранилище.",
-       "api-error-timeout": "Сървърът не отговори в рамките на предвиденото време.",
-       "api-error-unclassified": "Възникна непозната грешка.",
-       "api-error-unknown-code": "Непозната грешка: „$1“",
-       "api-error-unknown-error": "Вътрешна грешка: Нещо се обърка по време на качването на файла ви.",
+       "api-error-stashfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
        "api-error-unknown-warning": "Непознато предупреждение: „$1“",
        "api-error-unknownerror": "Неизвестна грешка: „$1“.",
-       "api-error-uploaddisabled": "Достъпът за качване на файлове в това уики е прекратен.",
-       "api-error-verification-error": "Файлът може би е повреден или има грешно разширение.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунди}}",
        "duration-minutes": "$1 {{PLURAL:$1|минута|минути}}",
        "duration-hours": "$1 {{PLURAL:$1|час|часа}}",
        "pagelang-language": "Език",
        "pagelang-use-default": "Използване на езика по подразбиране",
        "pagelang-select-lang": "Избиране на език",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Изпращане",
        "right-pagelang": "Промяна езика на страница",
        "action-pagelang": "промяна езика на страницата",
        "authmanager-provider-temporarypassword": "Временна парола",
        "authprovider-resetpass-skip-label": "Пропусни",
        "specialpage-securitylevel-not-allowed-title": "Не е позволено",
-       "cannotauth-not-allowed-title": "Достъпът е отказан",
-       "edit-error-short": "Грешка: $1",
-       "edit-error-long": "Грешки:\n\n$1"
+       "cannotauth-not-allowed-title": "Достъпът е отказан"
 }
index db79800..af8c1e1 100644 (file)
        "october-date": "$1 اکتوبر",
        "november-date": "$1 نوامبر",
        "december-date": "$1 ڈ\tسمبر",
+       "period-am": "سوب",
+       "period-pm": "دي‌گر/نواشام",
        "pagecategories": "{{PLURAL:$1|تهر|تهرئان}}",
        "category_header": "تهرِ تاکدیمان «$1»",
        "subcategories": "گونڈ\t تهرئان",
        "category-file-count-limited": "{{PLURAL:$1|جهلگین فایل|$1 جهلگین فایلان}} بی انونین تهرئ تا قرار دارنت.",
        "listingcontinuesabbrev": "(ادامه)",
        "index-category": "آ تاکدیمان که دیسته بوته گنت",
-       "noindex-category": "Ø¢ ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86 Ú©Ù\87 Ø¯Û\8cستÙ\87 Ù\86Ù\87 Ø¨Ù\88تÙ\87 Ú¯نت",
+       "noindex-category": "Ø¢ ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86 Ú©Ù\87 Ø§Û\8cÙ\86دÛ\8cکس Ù\86Ù\87 Ø¨Ù\88تÙ\87â\80\8cانت",
        "broken-file-category": "تاکدیمان گو خرابین لینکان بی فایلا",
-       "about": "بی باره ها",
+       "about": "بِه باره‌ئا",
        "article": "محتوائین تاکدیم",
        "newwindow": "(نوکین دروازگئ تا پاچ بکنێت)",
        "cancel": "کنسیل",
        "moredotdotdot": "گیشتیر...",
-       "morenotlisted": "ای لڑ\t لیست کامل نه اینت.",
+       "morenotlisted": "ای لڑ\t لیست مومکین اینت که کامل مه‌بيت.",
        "mypage": "تاکدیم",
-       "mytalk": "گپ",
-       "anontalk": "اÛ\8c Ø¢Û\8c Ù¾Û\8c Ù\86شاÙ\86Û\8c Ø¦Û\8c Ø¨Ø§Ø±Ù\87 Ø¦Ø§ گپ",
+       "mytalk": "حبر/گپ",
+       "anontalk": "حبر/گپ",
        "navigation": "جهت یابي",
        "and": "&#32;و",
        "qbfind": "ودی کورتین",
        "unprotectthispage": "ای تاکدیمی قُلپئ ٹگل داتین",
        "newpage": "نوکین تاکدیم",
        "talkpage": "ای تاکدیم باره ئا هبر و گپ",
-       "talkpagelinktext": "گپ",
+       "talkpagelinktext": "حبر/گپ",
        "specialpage": "خاصین تاکدیم",
        "personaltools": "شخصین وسایل",
        "articlepage": "تاکدیمی محتوائانی نمایش",
        "talk": "هبر و گپ",
        "views": "دیستینین",
        "toolbox": "وسایللان",
+       "tool-link-userrights": "{{GENDER:$1|کار زوروکین}} گروپاني تغیر داتین",
+       "tool-link-emailuser": "په ای {{GENDER:$1|کار زوروکا}} ایمیلئ دیم داتین",
        "userpage": "کارزوروکین تاکدیمی دیستین",
        "projectpage": "پروژه ئی تاکدیمی دیستین",
        "imagepage": "فایلی تاکدیما نشان داتین",
        "pool-errorunknown": "ناشناخته ئین خطا",
        "pool-servererror": "پول سنتر سرویس بی دسترس ئا نه اینت ( $1 ).",
        "poolcounter-usage-error": "خطا استفاده شه: $1",
-       "aboutsite": "بی بارها {{SITENAME}}",
+       "aboutsite": "مالومات بِه {{SITENAME}}ئي باره‌ئا",
        "aboutpage": "Project:بِه باره‌ئا",
        "copyright": "محتوایات بی  $1 اجازه نامه ئا هستنت مگه ای که آی خلاف ئا ذکر بوته بیئنت .",
        "copyrightpage": "{{ns:project}}:کاپی رایت یا باز کورتینی حق",
        "nocookieslogin": "{{SITENAME}} په کارزوروکانی لوگین بوتینا شه کوکی ئان ایستیپاده ئه کننت.\nشما کوکی ئانه شه کار پرینته ایت.\nمهربانی بکنیت کوکی ئانه په کار بگریت و پدا کوشش بکنیت.",
        "nocookiesfornew": "کارزوروکی هیساب جۆڑ نه بوت، په خاتیریکه نتوانتن آیی منبه ئا تایید بکنن.\nموتمه ئین به یت که کوکی په ئال انت، آ وختا شه سری ن\tۆک بارگیری بکینت و پدا امتیهان بکنیت .",
        "noname": "شما یک موتبرین کار زوروکی ئین نامی ئا مشخص نه کورته ئیت.",
-       "loginsuccesstitle": "کامیابین لوگین",
+       "loginsuccesstitle": "لوگین بوتین",
        "loginsuccess": "'''شما انون گو «$1» ئی نا بی {{SITENAME}} ئی تا داخل بوته ایت.'''",
-       "nosuchuser": "کار زوروکئ گۆ «$1» ئی ناما موجود نه اینت.\nکار زورکئ نام گۆ گۆنڈی یا توُهی ئا هوروپ ئان هساس اینت.\nنامی املا ئا بگنیدیت، یا [[Special:CreateAccount|یک نوکین کار زورکی هسابئ جۆڑ بکنیت]].",
+       "nosuchuser": "کار زوروکئ گۆ «$1»‌ئی ناما موجود نه اینت.\nکار زورکئ نام گۆ گۆنڈین یا ٹوُهین حروفان حساس اینت.\nنامی املا ئا بگنیدیت، یا [[Special:CreateAccount|یک نوکین کار زورکی حسابئ جۆڑ بکنیت]].",
        "nosuchusershort": "هیچ کار زوروکئ بی نامئ  ''$1'' ئا وجود نداریت.\nوتئ املا ئا چیک بکنیت.",
        "nouserspecified": "باید یک کار زوروکئ نام مشخص بکنیت.",
        "login-userblocked": "ای کار زوروک بلاک بوته، په داخل بوتینا اجازه نه اینت.",
        "resetpass_submit": "پاسوردی تنظیم و داخل بوتین",
        "changepassword-success": "شمی پاسوردئ تغیر کامیاب بوت و پاسورد تغیر کورت",
        "changepassword-throttled": "شما بیخی باز وار په لوگین بوتینا کوشش کورته ایت.\nمهربانئ بکنیت دیم شه آیی که پدا کوشش بکنیت $1 صبر کنیت.",
+       "botpasswords-label-create": "جوڑ\t کورتین",
+       "botpasswords-label-update": "اپڈیٹ",
+       "botpasswords-label-cancel": "کنسیل",
+       "botpasswords-label-delete": "پاک کورتین",
+       "botpasswords-label-resetpassword": "پاسوردئ پاک کورتین",
        "resetpass_forbidden": "نه توانیت که پاسوردا تغیر بدهیت",
        "resetpass-no-info": "په ای تاکدیمی دسترسی ئی خاتیرا داخل بئیت.",
        "resetpass-submit-loggedin": "پاسوردی تغیر داتین",
        "passwordreset-emaildisabled": "ایمیلی گزینه بی ای یکی ئی تا پئال نه ونت.",
        "passwordreset-username": "کار زوروکین نام:",
        "passwordreset-domain": "دامنه:",
-       "passwordreset-capture": "ایمیلی آخیر نشان داته بیئت؟",
-       "passwordreset-capture-help": "اگه ای گزینه ئا بگیندیت ، ایمیل (گو موقتین پاسوردا) بی شما نشان داته ئه بیئت و په کار زوروکا هم دیم داته ئه بیئت.",
        "passwordreset-email": "ایمیل ادرس:",
        "passwordreset-emailtitle": "حسابئ مئلومات بی {{SITENAME}}",
        "passwordreset-emailelement": "کار زوروکئ نام: \n$1\n\nموقت ئین چیهرگال: \n$2",
        "revdelete-unsuppress": "محدودیتانئ پاک بوتین بئ پدا دیستین ئی تا ترمیم بوته",
        "revdelete-log": "دلیل:",
        "revdelete-submit": "اعمال بئ {{PLURAL:$1|نخسه|نخسه هان}} ئی سرا انتخاب بوته",
-       "revdelete-success": "'''نخسه ئی ودی بوتین گو کامیابیا اپڈیٹ بوت.'''",
+       "revdelete-success": "'''نخسه‌ئی ودي بوتین گو کامیابیا اپڈیٹ بوت.'''",
        "revdelete-failure": "'''نخسه ئی ودی بوتینئ اپڈیٹ بوتن امکان وجود نداریت :'''\n$1",
-       "logdelete-success": "Ù\84Ù\88Ú¯Û\8cÙ\86 Ø¦Û\8c Ù\82ابÙ\84Û\8cت Ø¯Û\8cست Ú¯Ù\88 Ú©Ø§Ù\85Û\8cابÛ\8cا انجام بوت.",
+       "logdelete-success": "Ù\85Ù\88رÛ\8cدئ Ù\88دÙ\8a Ø¨Ù\88تÛ\8cÙ\86 ØªØºÛ\8cر انجام بوت.",
        "logdelete-failure": "'''لوگین ئی قابلیت دیست تنظیم ئه نه بیئنت:'''\n$1",
        "revdel-restore": "نمایش/نهفتن",
        "pagehist": "تاکدیمی تاریخچه",
        "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": "تائید بُوته ئین کار زوروکان",
        "group-sysop-member": "{{GENDER:$1|مدیر}}",
        "group-bureaucrat-member": "{{GENDER:$1|دیوان‌سالار}}",
        "group-suppress-member": "{{GENDER:$1|نظارت}}",
-       "grouppage-user": "{{ns:project}}:کارزورک ئان",
+       "grouppage-user": "{{ns:project}}:کارزورکئان",
        "grouppage-autoconfirmed": "{{ns:project}}:تائید بُوته ئین کار زوروک ئان",
        "grouppage-bot": "{{ns:project}}:ربات‌ ئان",
        "grouppage-sysop": "{{ns:project}}:مدیر ئان",
        "right-userrights-interwiki": "دیگه ویکی ئی کار زوروکانئ اختیارانی ایڈیٹ کورتین",
        "right-siteadmin": "مئلومات ئین بانکئ قُلپ و یا پاچ کورتین",
        "right-sendemail": "دیم داتین ایمل په دیگه کار زوروکان",
-       "right-passwordreset": "پاسوردی نوک تنظیم کورتینی ایمیل",
        "right-managechangetags": "[[Special:Tags|برچسپ ئانی]] جۆڑ و پاک کورتین مه لوماتین بانکا",
        "newuserlogpage": "کار زوروکئ جوڑ کورتینی سیاه چال",
        "newuserlogpagetext": "ای سیاه چال شه نوکین کار زوروکئ ناما جوڑ بوته.",
        "uploaddisabled": "بُرز کورتین غیر پئال اینت.",
        "copyuploaddisabled": "بُرز کورتین شه اینترنیتی ادرسا غیرفعال اینت.",
        "uploaddisabledtext": "فایل ئی بُرز کورتین غیر فعال اینت.",
-       "uploadscriptednamespace": "این اس‌وی‌جی ئی پوشه شامل غیرقانونی ئین  '$1' ئی پزای نام ئا اینت",
+       "uploadscriptednamespace": "این اس‌وی‌جی ئی پوشه شامل غیرقانونی ئین  '<nowiki>$1</nowiki>' ئی پزای نام ئا اینت",
        "uploadinvalidxml": "XML بئ بُرز بوته ئین پایل تا نتوانت تجزیه بیئت.",
        "uploadvirus": "ای پایل ویروس داریت!\nگیشتیرین مه لومات : $1",
        "upload-source": "فایلی منشا",
        "all-logs-page": "عمومین موچین سیاه چال هان",
        "logempty": "شمی منطبقین آیتم بی سیاه چالئ تا ودی نه بوت.",
        "log-title-wildcard": "آ تاکدیمیانی پدا بگرد که آوانی ئنوان که گۆ ای ئبارت ئا شرو ئه بیئت",
+       "checkbox-all": "موچ",
        "allpages": "موچین تاکدیمان",
        "nextpage": "بعدین تاکدیم ($1)",
        "prevpage": "دیمی تاکدیم ($1)",
        "actionfailed": "کار نه بوت",
        "deletedtext": "«$1» پاک بوت.\nپه آخیرین پاک بوتینین سابقه ئا بئ $2 ئی تا مراجعه بکنیت.",
        "dellogpage": "پاک بوته‌ئانی کورم",
-       "dellogpagetext": "جهلگین لڑلیستا که گیندیت په آخیرئین پاک بوته‌ئین فابلاني خاتیرا اینت.\nموچین نشان داته بوته‌ئین وخت گو (گرینویچ‌ئی وختا) مطابق انت.",
+       "dellogpagetext": "جهلگین لڑلیستا که گیندیت په آخیرئین پاک بوته‌ئین فایلاني خاتیرا اینت.\nموچین نشان داته بوته‌ئین وخت گو (گرینویچ‌ئی وختا) مطابق انت.",
        "deletionlog": "پاک بوته‌ئانی کورم",
        "reverted": "بی دیمتیرین نخسه ئا بیئرگردینته بوت",
        "deletecomment": "دلیل:",
        "sp-contributions-newbies": "فقط نوکین مشارکتان نشان داته بیئنت",
        "sp-contributions-newbies-sub": "په نوک کاران",
        "sp-contributions-newbies-title": "په نوک کارین حسابانی خاتیرا کار زوروکئ شراکت ئان",
-       "sp-contributions-blocklog": "بلاک بوته ئین ئانی سیاهه",
+       "sp-contributions-blocklog": "بلاک بوته ئین‌ئانی کورم‌جاه",
        "sp-contributions-suppresslog": "کار زوروکئ کومک اوشتاته انت",
-       "sp-contributions-deleted": "کار زوروکئ پاک بوئین شراکت ئان",
-       "sp-contributions-uploads": "بُرز بوته هان",
-       "sp-contributions-logs": "سیاهه‌ها",
-       "sp-contributions-talk": "گپ",
-       "sp-contributions-userrights": "کار گیروکی اختیارانی مدیریت",
+       "sp-contributions-deleted": "{{GENDER:$1|کار زوروکئ}} پاک بوته‌ئین دستکاریان",
+       "sp-contributions-uploads": "بُرز بوته‌ئین فایلان",
+       "sp-contributions-logs": "کورم",
+       "sp-contributions-talk": "حبر/گپ",
+       "sp-contributions-userrights": "کار زوروکاني اختیاراني مدیریت کورتین",
        "sp-contributions-blocked-notice": "ای کار زوروکئ دسترسی بی انونین وختا بسته بوته.\nآخرین مورد شه دسترسی ئی سیستین به جهلگا آته:",
        "sp-contributions-blocked-notice-anon": "ای کار زوروکئ دسترسی بی انونین وختا بسته بوته.\nآخرین مورد شه دسترسی ئی سیستین به جهلگا آته:",
        "sp-contributions-search": "گشتین په شراکتان",
        "blocklist-nousertalk": "وتئ گپ ئی تاکدیما نتوان ایڈیٹ کورت",
        "ipblocklist-empty": "بسته بوته ئین ئانی لیست خالی اینت.",
        "blocklink": "بلاک یا بستین",
-       "unblocklink": "پاچ یا انبلاک بێت",
-       "change-blocklink": "بلاک ئی تغیرداتین",
+       "unblocklink": "پاچ کورتین",
+       "change-blocklink": "بلاک‌ئی تغیر داتین",
        "contribslink": "شراکت‌ئان",
        "emaillink": "ایمیلی دیم داتین",
        "blocklogpage": "بستینئ کورم",
        "javascripttest-qunit-intro": "[$1 آزمایشی مشتندانا] بئ mediawiki.org تا بگیندیت.",
        "tooltip-pt-userpage": "{{GENDER:|شمئ کار زُورۆکین}} تاکدیم",
        "tooltip-pt-mytalk": "{{GENDER:|شمئ}} حبر و گپئ تاکدیم",
+       "tooltip-pt-anontalk": "ای آی‌پی ادرس‌ئی دستکاریاني موریدا حبر/گپ",
        "tooltip-pt-preferences": "{{GENDER:|شمئ}} تنظیماتان",
        "tooltip-pt-watchlist": "آ دیمانی لیست که شما آوانی تغیرانا پدگیری ئا کنیت",
        "tooltip-pt-mycontris": "{{GENDER:|شمئ}} شراکتاني لڑ",
        "feedback-useragent": "کارزوروکی آگینت:",
        "searchsuggest-search": "گشتین",
        "searchsuggest-containing": "شامیلین دیمان...",
-       "api-error-badaccess-groups": "شما اجازه په پایلی ئی بُرز کورتین ئا بئ ای ویکی ای تا نداریت.",
        "api-error-badtoken": "داخیلی ئین خه تا: امنیتی ئین کوڈ سه ئی نه اینت (Bad token).",
-       "api-error-empty-file": "فایلی که دیم داته بوت خالی ات.",
        "api-error-emptypage": "خالی ئین دیمانی جۆڑ کورتین جایز نه اینت.",
-       "api-error-file-too-large": "فایلی که دیم داتیت بئ حد ٹوو ات.",
-       "api-error-filename-tooshort": "فایلی نام بئ شه اندازگ ئا گۆنڈ ات.",
-       "api-error-filetype-banned": "ایرنگین فایل ئی اجازه نه اینت.",
-       "api-error-filetype-missing": "فایل ئی نام فرمت نه داریت.",
-       "api-error-hookaborted": "تغیر که شما لۆٹیت جۆڑ کنیت شه یک جنگک یی نیمگا بند بوت.",
-       "api-error-http": "داخلین خطا:وصل بوتین بئ سرویس ئا ممکن نه اینت.",
-       "api-error-illegal-filename": "فایل ئی نام غیرمجاز اینت.",
-       "api-error-invalid-file-key": "داخلین خطا: فایل نام بئ موقت ئین حافظه ئی تا موجود نه اینت.",
-       "api-error-missingparam": "داخلین خطا: ناموجودین پارامیترئان بئ ریکویست ئی تا.",
-       "api-error-mustbeloggedin": "په فایلی بُرز کورتینا، شما باید بئ سایٹ ئی تا داخل بئیت.",
-       "api-error-mustbeposted": "داخلین خطا: ریکویست باید شه POST HTTP ئی روش ئا دیم داته بیئت.",
-       "api-error-unclassified": "یک نا زانتین خطائی رخ دات.",
-       "api-error-unknown-code": "نازانتین خطای: \" $1 \"",
        "api-error-unknown-warning": "نادروستئ ئین ایختار: $1",
        "api-error-unknownerror": "نادروستئ ئین خه تا: «$1».",
-       "api-error-uploaddisabled": "پایلانی بُرز کورتین بئ ای ویکی تا غیر په هال اینت.",
        "duration-seconds": "$1 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "duration-hours": "$1 سائت",
        "special-characters-title-endash": "پاسیله خت",
        "special-characters-title-emdash": "تچکین پاسیله خت",
        "special-characters-title-minus": "منپی نشانگ",
-       "mw-widgets-titleinput-description-redirect": "گردینتین به $1 یی تا"
+       "mw-widgets-titleinput-description-redirect": "گردینتین به $1 یی تا",
+       "log-action-filter-delete": "پاک بوتین‌ئی رقم:",
+       "log-action-filter-all": "موچ"
 }
index e137ee9..f63d25e 100644 (file)
        "tog-numberheadings": "हेडिंग के ऑटो-नंबरिंग",
        "tog-showtoolbar": "संपादन औजारपट्टी के देखावल जाव",
        "tog-editondblclick": "दुइ क्लिक पर पन्ना सभ के संपादन करीं",
-       "tog-editsectiononrightclick": "à¤\96à¤\82ड à¤\95à¥\80 à¤¹à¥\87डिà¤\82à¤\97 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95à¤\87 à¤\95à¥\87 à¤\96à¤\82ड à¤\95à¥\87 à¤¸à¤®à¥\8dपादित करीं",
-       "tog-watchcreations": "हमार बनावल पन्ना आ हमार अपलोड कइल फाइल सभ के हमरी धियानसूची में जोड़ दिहल जाव",
-       "tog-watchdefault": "हम जौना पन्ना आ फाइलन के संपादित करीं उनहन के हमरी धियानसूची में जोड़ दिहल जाव",
-       "tog-watchmoves": "हमरा द्वारा स्थानांतरित पन्ना आ फाइलन के हमरा धियानसूची में जोड़ दिहल जाव",
-       "tog-watchdeletion": "हमरा द्वारा हटावल पन्ना आ फाइल सभ के हमार धियानसूची में जोड़ दिहल जाव",
+       "tog-editsectiononrightclick": "हà¥\87डिà¤\82à¤\97 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95à¤\87 à¤\95à¥\87 à¤\96à¤\82ड à¤\95à¥\87 à¤¸à¤\82पादन à¤¸à¤\82भव करीं",
+       "tog-watchcreations": "हमार बनावल पन्ना आ हमार अपलोड कइल फाइल सभ के हमरी धियानसूची में जोड़ल जाव",
+       "tog-watchdefault": "हम जौना पन्ना आ फाइलन के संपादित करीं उनहन के हमरी धियानसूची में जोड़ल जाव",
+       "tog-watchmoves": "हमरा द्वारा स्थानांतरित पन्ना आ फाइलन के हमरा धियानसूची में जोड़ल जाव",
+       "tog-watchdeletion": "हमरा द्वारा हटावल पन्ना आ फाइल सभ के हमार धियानसूची में जोड़ल जाव",
        "tog-watchuploads": "हम नया फाइल अपलोड करीं त उनहना के हमार धियानसूची में जोड़ल जाय",
-       "tog-watchrollback": "हमरा द्वारा रोलबैक कइल गइल पन्ना सभ के हमार धियानसूची में जोड़ दिहल जाव",
-       "tog-minordefault": "डिफालà¥\8dà¤\9f à¤°à¥\82प à¤¸à¥\87 à¤¸à¤\97रà¥\80 à¤¸à¤\82पादन à¤\95à¥\81ल à¤\95à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन à¤\95à¥\80 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\9aिनà¥\8dहित à¤\95à¤\87ल à¤\9cाव",
-       "tog-previewontop": "झलक (प्रीव्यू) संपादन बक्सा से पहिले देखावल जाय",
-       "tog-previewonfirst": "पहिला संपादन पर झलक (प्रीव्यू) देखावल जाय",
-       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤¹à¥\8bà¤\96ला à¤ªà¤° à¤¹à¤®à¤\95à¥\87 à¤\88-मेल कइल जाव",
-       "tog-enotifusertalkpages": "अगर हमरे बातचीत पन्ना पर कौनो बदलाव होखे त हमके ई-मेल कइल जाव",
-       "tog-enotifminoredits": "पन्ना आ फाइल पर छोटो बदलाव होखे त हमके ई-मेल कइल जाव",
-       "tog-enotifrevealaddr": "नोटिफिकेशन ई-मेल में हमार ई-मेल पता देखावल जाव",
-       "tog-shownumberswatching": "धियान à¤°à¤\96à¥\87 à¤µà¤¾à¤²à¤¨ à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 देखावल जाव",
+       "tog-watchrollback": "हमरा द्वारा रोलबैक कइल गइल पन्ना सभ के हमार धियानसूची में जोड़ल जाव",
+       "tog-minordefault": "डिफाल्ट रूप से सगरी संपादन के छोट संपादन की रुप में चिन्हित कइल जाव",
+       "tog-previewontop": "झलक के संपादन बक्सा से पहिले देखावल जाय",
+       "tog-previewonfirst": "पहिला संपादन पर झलक देखावल जाय",
+       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\81ड़ल à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤¹à¥\8bà¤\96ला à¤ªà¤° à¤¹à¤®à¤\95à¥\87 à¤\88मेल कइल जाव",
+       "tog-enotifusertalkpages": "अगर हमरे बातचीत पन्ना पर कौनो बदलाव होखे त हमके ईमेल कइल जाव",
+       "tog-enotifminoredits": "पन्ना आ फाइल पर छोट बदलाव होखे तबो हमके ईमेल कइल जाव",
+       "tog-enotifrevealaddr": "नोटिफिकेशन ईमेल में हमार ईमेल पता देखावल जाव",
+       "tog-shownumberswatching": "धियान à¤°à¤\96à¥\87 à¤µà¤¾à¤²à¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤¸à¤\82à¤\96à¥\8dया देखावल जाव",
        "tog-oldsig": "राउर वर्तमान दसखत:",
        "tog-fancysig": "दसखत के विकी पाठ के रुप में उपयोग करीं (बिना ऑटोमेटिक कड़ी के)",
        "tog-uselivepreview": "लगातार झलक (लाइव प्रीव्यू) इस्तेमाल कइल जाव",
-       "tog-forceeditsummary": "यदि à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¾ à¤¦à¤¿à¤¹ल होखे त हमके सूचित कइल जाय",
-       "tog-watchlisthideown": "हमरà¥\80 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¹à¤®à¤¾à¤° à¤\96à¥\81द à¤\95à¥\87 à¤¸à¤\82पादन à¤\9bिपाà¤\88à¤\82",
+       "tog-forceeditsummary": "सà¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¾ à¤­à¤°à¤² à¤\97à¤\87ल होखे त हमके सूचित कइल जाय",
+       "tog-watchlisthideown": "धियानसà¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¹à¤®à¤¾à¤° à¤\96à¥\81द à¤\95à¥\87 à¤¸à¤\82पादन à¤\9bिपावल à¤\9cाय",
        "tog-watchlisthidebots": "धियानसूची से बॉट संपादन छिपावल जाय",
        "tog-watchlisthideminor": "धियानसूची से छोट संपादन छिपावल जाय",
-       "tog-watchlisthideliu": "धियानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97-à¤\87न à¤­à¤\87ल à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤\82पादन छिपावल जाय",
+       "tog-watchlisthideliu": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤­à¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤¸à¤\82पादन à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 छिपावल जाय",
        "tog-watchlistreloadautomatically": "जब कौनों फिल्टर बदलल जाय तब धियानसूची ऑटोमेटिक दोबारा लोड होखे (जावास्क्रिप्ट जरूरी)",
-       "tog-watchlisthideanons": "à¤\86à¤\87॰पà¥\80॰ à¤¸à¤¦à¤¸à¥\8dयन à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 से छिपावल जाय",
-       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 से छिपावल जाय",
+       "tog-watchlisthideanons": "बà¥\87नाम à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤¸à¤\82पादन à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 से छिपावल जाय",
+       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\87ल à¤¸à¤\82पादन à¤\95à¥\87 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 से छिपावल जाय",
        "tog-watchlisthidecategorization": "पन्ना श्रेणीकरण छिपावल जाय",
-       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\87ल à¤\88मà¥\87ल à¤\95à¥\87 à¤\95à¥\89पà¥\80 à¤¹à¤®à¤°à¥\8b के भेजल जाय",
+       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\87ल à¤\88मà¥\87ल à¤\95à¥\87 à¤\95à¥\89पà¥\80 à¤¹à¤®के भेजल जाय",
        "tog-diffonly": "अंतर देखावत समय नीचे पन्ना के सामग्री न देखावल जाय",
-       "tog-showhiddencats": "à¤\9bिपल à¤¶à¥\8dरà¥\87णियन à¤\95à¥\87 à¤­à¥\80 à¤¦à¥\87à¤\96ावल à¤\9cाय",
+       "tog-showhiddencats": "छिपल श्रेणी देखावल जाय",
        "tog-norollbackdiff": "रोलबैक कइला के बाद अंतर न देखावल जाय",
-       "tog-useeditwarning": "à¤\9cà¥\8b à¤¹à¤® à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cलà¥\87 छोड़ देईं त हमके खबर कइल जाय",
-       "tog-prefershttps": "लà¥\89à¤\97िन रहले पर हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
+       "tog-useeditwarning": "à¤\95à¥\8cनà¥\8bà¤\82 à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cलà¥\87 à¤ªà¤¨à¥\8dना छोड़ देईं त हमके खबर कइल जाय",
+       "tog-prefershttps": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श रहले पर हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "underline-never": "कभी ना",
-       "underline-default": "à¤\9cिलà¥\8dद (सà¥\8dà¤\95िन) या ब्राउजर डिफॉल्ट",
+       "underline-default": "सà¥\8dà¤\95िन या ब्राउजर डिफॉल्ट",
        "editfont-style": "संपादन क्षेत्र के फॉन्ट स्टाइल:",
        "editfont-default": "ब्राउजर डिफाल्ट",
        "editfont-monospace": "मोनोस्पेस्ड फोंट",
        "december-date": "दिसंबर $1",
        "period-am": "AM",
        "period-pm": "PM",
-       "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणी}}",
-       "category_header": "\"$1\" श्रेणी में पन्ना",
+       "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणीसभ}}",
+       "category_header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤ªà¤¨à¥\8dना",
        "subcategories": "उपश्रेणी",
-       "category-media-header": "\"$1\" श्रेणी में मीडिया",
-       "category-empty": "''इ श्रेणी में इ समय कउनो पन्ना या मीडिया नइखे।''",
+       "category-media-header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤®à¥\80डिया",
+       "category-empty": "<em>ए श्रेणी में एह समय कौनों पन्ना भा मीडिया नइखे।</em>",
        "hidden-categories": "{{PLURAL:$1|छिपावल गइल श्रेणी|छिपावल गइल श्रेणी सब}}",
        "hidden-category-category": "छिपावल गइल श्रेणी",
-       "category-subcat-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\96ालà¥\80 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤¶à¥\8dरà¥\87णà¥\80 à¤¬à¤¾|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¸à¤¬}} बा।}}",
-       "category-subcat-count-limited": "à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 बाड़ीं।}}",
-       "category-article-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¤¾à¤¤à¥\8dर à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤ªà¤¨à¥\8dन à¤¬à¤¾à¥¤|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dना à¤¬à¤¾à¤¡à¤¼à¥\87}}, à¤\95à¥\81ल à¤ªà¤¨à¥\8dना $2}}",
-       "category-article-count-limited": "निमà¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना|$1 à¤ªà¤¨à¥\8dना}} à¤\87 à¤¶à¥\8dरà¥\87णà¥\80à¤\82 à¤®à¥\87à¤\82 à¤¬à¤¾।",
-       "category-file-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\96ालà¥\80 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤«à¤\87ल à¤¬à¤¾à¥¤|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤\95à¥\81ल à¤«à¤¼à¤¾à¤\87लà¤\82 $2 {{PLURAL:$1|फाà¤\87ल|$1फाà¤\87लà¤\82}} à¤¬à¤¾à¤¡à¤¼à¥\87}}",
-       "category-file-count-limited": "वरà¥\8dतमान à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना|$1 à¤ªà¤¨à¥\8dनाà¤\82}} à¤\87 à¤¶à¥\8dरà¥\87णà¥\80à¤\82 à¤®à¥\87à¤\82 à¤¬à¤¾à¤¡à¤¼à¥\87।",
+       "category-subcat-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\96ालà¥\80 à¤\8fà¤\95 à¤ à¥\8b à¤¶à¥\8dरà¥\87णà¥\80 à¤¬à¤¾|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¸à¤¬}} à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात बा।}}",
+       "category-subcat-count-limited": "à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 à¤\95à¥\81ल बाड़ीं।}}",
+       "category-article-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\8fà¤\95हà¥\80 à¤ à¥\8b à¤ªà¤¨à¥\8dना à¤­à¤° à¤¬à¤¾à¤\9fà¥\87।|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|पनà¥\8dना à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dनासभ à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾à¤¡à¤¼à¥\87à¤\82}}।}}",
+       "category-article-count-limited": "वरà¥\8dतमान à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² {{PLURAL:$1|पनà¥\8dना à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dना à¤¬à¤¾à¤¡à¤¼à¥\87à¤\82}}।",
+       "category-file-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\8fà¤\95हà¥\80 à¤ à¥\8b à¤«à¤¾à¤\87ल à¤­à¤° à¤¬à¤¾à¤\9fà¥\87।|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|फाà¤\87ल à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾|$1 à¤«à¤¾à¤\87लसभ à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾à¤¡à¤¼à¥\80à¤\82}}।}}",
+       "category-file-count-limited": "वरà¥\8dतमान à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² {{PLURAL:$1|फाà¤\87ल à¤¬à¤¾|$1 à¤«à¤¾à¤\87ल à¤¬à¤¾à¤¡à¤¼à¥\80à¤\82}}।",
        "listingcontinuesabbrev": "जारी...",
        "index-category": "सूचीबद्ध पन्ना",
        "noindex-category": "बिनासूचीबद्ध पन्ना",
-       "broken-file-category": "à¤\9fà¥\82à¤\9fल à¤«à¤¾à¤\87ल à¤\95ड़ियन वाला पन्ना",
+       "broken-file-category": "à¤\97ायब à¤«à¤¾à¤\87ल वाला पन्ना",
        "about": "बारे में",
        "article": "सामग्री पन्ना",
        "newwindow": "(नया विंडो में खोलीं)",
        "moredotdotdot": "अउर...",
        "morenotlisted": "हो सकेला कि ई लिस्ट पूरा न होखे।",
        "mypage": "पन्ना",
-       "mytalk": "हमार à¤¬à¤¾à¤¤à¤\9aà¥\80त à¤ªà¤¨à¥\8dना",
+       "mytalk": "बातà¤\9aà¥\80त",
        "anontalk": "बातचीत",
        "navigation": "नेविगेशन",
        "and": "&#32;अउर",
        "qbedit": "संपादन",
        "qbpageoptions": "ई पन्ना",
        "qbmyoptions": "हमार पन्ना",
-       "faq": "साधारण सवाल",
+       "faq": "à¤\86म सवाल",
        "faqpage": "Project:अक्सर पूछल जाए वाला सवाल",
-       "actions": "à¤\95ारà¥\8dयवाहà¥\80",
+       "actions": "à¤\8fà¤\95à¥\8dशन",
        "namespaces": "नाँवस्थान",
        "variants": "अउरी प्रकार",
-       "navigation-heading": "नà¥\87विà¤\97à¥\87शन à¤®à¥\87नà¥\81",
+       "navigation-heading": "नà¥\87विà¤\97à¥\87शन à¤®à¥\87नà¥\82",
        "errorpagetitle": "खराबी",
-       "returnto": "$1 à¤ªà¤° à¤²à¥\8cà¤\9f à¤\9cाà¤\88ं।",
+       "returnto": "$1 à¤ªà¤° à¤²à¤µà¤\9fà¥\80ं।",
        "tagline": "भोजपुरी {{SITENAME}} से",
        "help": "मदद",
        "search": "खोज",
        "searcharticle": "जाईं",
        "history": "पन्ना के इतिहास",
        "history_short": "इतिहास",
-       "updatedmarker": "हमार अन्तिम आगमन से बदलाव",
+       "history_small": "इतिहास",
+       "updatedmarker": "हमरे अंतिम बेर देखले के बाद के बदलाव",
        "printableversion": "छापे लायक संस्करण",
        "permalink": "स्थायी कड़ी",
        "print": "छापीं",
        "view": "देखीं",
        "view-foreign": "$1 पर देखीं",
        "edit": "संपादन",
-       "edit-local": "लà¥\8bà¤\95ल à¤µà¤¿à¤µà¤°à¤£ à¤¦à¥\87à¤\96à¥\80à¤\82",
+       "edit-local": "लà¥\8bà¤\95ल à¤µà¤¿à¤µà¤°à¤£ à¤¸à¤\82पादन",
        "create": "बनाईं",
        "create-local": "लोकल विवरण जोड़ीं",
-       "editthispage": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤®à¥\8dपादन करीं",
-       "create-this-page": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¨à¤¿à¤°à¥\8dमाण à¤\95रà¥\80ं",
-       "delete": "मिटाईं",
-       "deletethispage": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤®à¤¿टाईं",
-       "undeletethispage": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¸à¥\8dथापित à¤\95रà¥\80ं",
-       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\97à¥\8b à¤¹à¤\9fावल à¤\97à¤\88ल|$1 à¤¹à¤\9fावल à¤\97à¤\88लà¤\82}} à¤¬à¤¦à¤²à¤¾à¤µ à¤µà¤¾à¤ªà¤¸ à¤²à¤¾ईं",
-       "viewdeleted_short": "देखें {{PLURAL:$1|एगो हटावल गईल सम्पादन|$1 हटावल गईल कुल सम्पादन}}",
-       "protect": "सà¤\82रà¤\95à¥\8dषण करीं",
+       "editthispage": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन करीं",
+       "create-this-page": "à¤\88 à¤ªà¤¨à¥\8dना à¤¬à¤¨à¤¾à¤\88ं",
+       "delete": "हटाईं",
+       "deletethispage": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¹टाईं",
+       "undeletethispage": "हà¤\9fावल à¤ªà¤¨à¥\8dना à¤µà¤¾à¤ªà¤¸ à¤²à¥\87 à¤\86à¤\88ं",
+       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन|$1 à¤ à¥\87 à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन à¤\95à¥\81ल}} à¤µà¤¾à¤ªà¤¸ à¤²à¥\87 à¤\86ईं",
+       "viewdeleted_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 हटावल गइल संपादन}} देखीं",
+       "protect": "सà¥\81रà¤\95à¥\8dषित करीं",
        "protect_change": "बदलीं",
-       "protectthispage": "à¤\87 पन्ना के सुरक्षित करीं।",
+       "protectthispage": "à¤\8f पन्ना के सुरक्षित करीं।",
        "unprotect": "सुरक्षा बदलीं",
-       "unprotectthispage": "à¤\87 पन्ना के सुरक्षा बदलीं",
+       "unprotectthispage": "à¤\8f पन्ना के सुरक्षा बदलीं",
        "newpage": "नया पन्ना",
-       "talkpage": "à¤\87 पन्ना पर चर्चा करीं",
-       "talkpagelinktext": "बात-चीत",
+       "talkpage": "à¤\8f पन्ना पर चर्चा करीं",
+       "talkpagelinktext": "बातचीत",
        "specialpage": "खास पन्ना",
-       "personaltools": "वà¥\8dयà¤\95à¥\8dतिà¤\97त औजार",
+       "personaltools": "निà¤\9cà¥\80 औजार",
        "articlepage": "सामग्री पन्ना देखीं",
-       "talk": "बात-चीत",
-       "views": "à¤\95à¤\87सन à¤²à¤\89à¤\95à¥\80?",
+       "talk": "बातचीत",
+       "views": "बिबिध à¤°à¥\82प",
        "toolbox": "औजार",
-       "tool-link-userrights": "{{GENDER:$1|प्रयोगकर्ता}} के सदस्यसमूह बदलीं",
+       "tool-link-userrights": "{{GENDER:$1|प्रयोगकर्ता}} के मंडली बदलीं",
+       "tool-link-userrights-readonly": "{{GENDER:$1|प्रयोगकर्ता}} मंडली देखीं",
        "tool-link-emailuser": "{{GENDER:$1|प्रयोगकर्ता}} के ईमेल करीं",
        "userpage": "प्रयोगकर्ता पन्ना देखीं",
-       "projectpage": "परियà¥\8bà¤\9cना पन्ना देखीं",
+       "projectpage": "पà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f पन्ना देखीं",
        "imagepage": "फाइल पन्ना देखीं",
-       "mediawikipage": "सनà¥\8dदà¥\87श पन्ना देखीं",
+       "mediawikipage": "सनà¥\87सा पन्ना देखीं",
        "templatepage": "टेम्पलेट पन्ना देखीं",
        "viewhelppage": "मदद पन्ना देखीं",
        "categorypage": "श्रेणी पन्ना देखीं",
-       "viewtalkpage": "बात-à¤\9aà¥\80त देखीं",
+       "viewtalkpage": "à¤\9aरà¥\8dà¤\9aा देखीं",
        "otherlanguages": "दुसरी भाषा में",
        "redirectedfrom": "($1 से अनुप्रेषित)",
        "redirectpagesub": "अनुप्रेषण पन्ना",
        "redirectto": "अनुप्रेषित:",
-       "lastmodifiedat": "$1 à¤\95à¥\87 $2 à¤ªà¤° à¤\8f à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\85नà¥\8dतिम बेर बदलाव भइल।",
-       "viewcount": "à¤\88 à¤ªà¤¨à¥\8dना {{PLURAL:$1|à¤\8fà¤\95|$1}} à¤¬à¤¾à¤° à¤¦à¥\87à¤\96ल à¤\97à¤\88ल बा।",
+       "lastmodifiedat": "$1 à¤\95à¥\87 $2 à¤¬à¤\9cà¥\87 à¤\8f à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\85à¤\82तिम बेर बदलाव भइल।",
+       "viewcount": "à¤\88 à¤ªà¤¨à¥\8dना {{PLURAL:$1|à¤\8fà¤\95|$1}} à¤¬à¥\87र à¤¦à¥\87à¤\96ल à¤\97à¤\87ल बा।",
        "protectedpage": "सुरक्षित पन्ना",
        "jumpto": "इहाँ जाईं:",
        "jumptonavigation": "नेविगेशन",
        "jumptosearch": "खोजीं",
-       "view-pool-error": "à¤\95à¥\8dषमा à¤\95रà¥\80à¤\82, à¤\88 à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\88ल à¤¬à¤¾à¥¤\nà¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nà¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¦à¥\87à¤\96à¥\87 à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87नà¥\8dतजार करीं।\n\n$1",
-       "generic-pool-error": "à¤\95à¥\8dषमा à¤\95रà¥\80à¤\82, à¤\88 à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\88ल à¤¬à¤¾à¥¤\nà¤\88 à¤¸à¤\82साधन à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nà¤\88 à¤¸à¤\82साधन à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\81à¤\9a à¤¬à¤¨à¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87नà¥\8dतजार करीं।",
-       "pool-timeout": "तालाबनà¥\8dदà¥\80 à¤\96ातिर à¤ªà¥\8dरतà¥\80à¤\95à¥\8dषा समय समाप्त",
-       "pool-queuefull": "पà¥\82ल à¤ªà¤\82à¤\95à¥\8dति à¤­à¤° à¤\97à¤\87ल",
-       "pool-errorunknown": "à¤\85à¤\9cà¥\8dà¤\9eात à¤¤à¥\8dरà¥\81à¤\9fि",
-       "pool-servererror": "पà¥\82ल à¤\95ाà¤\89à¤\82à¤\9fर à¤¸à¥\87वा à¤\89पलबà¥\8dध à¤¨à¤¾à¤¹à¥\80 à¤¬à¤¾ ($1)।",
-       "poolcounter-usage-error": "à¤\89पयà¥\8bà¤\97 à¤¤à¥\8dरà¥\81à¤\9fि: $1",
+       "view-pool-error": "माफ à¤\95रà¥\80à¤\82, à¤\8f à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\87ल à¤¬à¤¾à¥¤\nà¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¥¤\nà¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¦à¥\87à¤\96à¥\87 à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87à¤\82तजार करीं।\n\n$1",
+       "generic-pool-error": "माफ à¤\95रà¥\80à¤\82, à¤\8f à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\87ल à¤¬à¤¾à¥¤\nà¤\8f à¤¸à¤\82साधन à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¥¤\nà¤\8f à¤¸à¤\82साधन à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\81à¤\9a à¤¬à¤¨à¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87à¤\82तजार करीं।",
+       "pool-timeout": "तालाबà¤\82दà¥\80 à¤\96à¥\81लà¥\87 à¤\95à¥\87 à¤\87à¤\82तà¤\9cार समय समाप्त",
+       "pool-queuefull": "पà¥\82ल à¤\95तार à¤­à¤°à¤² à¤¬à¤¾",
+       "pool-errorunknown": "नामालà¥\82म à¤\96राबà¥\80",
+       "pool-servererror": "पà¥\82ल à¤\95ाà¤\89à¤\82à¤\9fर à¤¸à¤°à¥\8dविस à¤\89पलबà¥\8dध à¤¨à¤\87à¤\96à¥\87 ($1)।",
+       "poolcounter-usage-error": "à¤\87सà¥\8dतमाल à¤\96राबà¥\80: $1",
        "aboutsite": "{{SITENAME}} के बारे में",
        "aboutpage": "Project:बारे में",
-       "copyright": "à¤\89पलबà¥\8dध à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 $1 à¤\95à¥\87 à¤\85धà¥\80न à¤\89पलबà¥\8dध à¤¬à¤¾ à¤\9cब à¤¤à¤\95 à¤\95à¥\80 à¤\85लà¤\97 à¤¸à¥\87 à¤\89लà¥\8dलà¥\87à¤\96 à¤¨à¤¾ à¤\95रल à¤\97à¤\88ल à¤¹à¥\8bà¤\96à¥\87 ।",
+       "copyright": "à¤\89पलबà¥\8dध à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 $1 à¤\95à¥\87 à¤\85धà¥\80न à¤\89पलबà¥\8dध à¤¬à¤¾ à¤\9cब à¤¤à¤\95 à¤\95à¥\80 à¤\85लà¤\97 à¤¸à¥\87 à¤\89लà¥\8dलà¥\87à¤\96 à¤¨à¤¾ à¤\95à¤\87ल à¤\97à¤\87ल à¤¹à¥\8bà¤\96à¥\87।",
        "copyrightpage": "{{ns:project}}:कापीराइट सब",
        "currentevents": "हाल के घटना सब",
        "currentevents-url": "Project:हाल के घटना सब",
        "portal-url": "Project:सदस्य-समाज मुख्यपन्ना",
        "privacy": "गोपनीयता नीति",
        "privacypage": "Project:गोपनीयता नीति",
-       "badaccess": "à¤\85नà¥\81मति à¤¤à¥\8dरà¥\81à¤\9fी",
-       "badaccess-group0": "रà¤\89à¤\86 à¤\9cवन à¤\95ारà¥\8dरवाà¤\88 à¤\96ातिर à¤\85नà¥\81रà¥\8bध à¤\95à¤\88लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤\89 à¤\95à¥\87 à¤¨à¤¿à¤·à¥\8dपादन à¤\95रà¥\87 à¤\95à¥\87 à¤\85नà¥\81मति à¤¨à¤\88खे।",
-       "badaccess-groups": "रà¤\89à¤\86 à¤\9cà¥\8cन à¤\95à¥\8dरिया à¤\95à¥\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤\89 à¤®à¤¾à¤¤à¥\8dर {{PLURAL:$2|$1 à¤¸à¤®à¥\82ह|$1 à¤¸à¤®à¥\82हà¤\82}} à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤¹à¥\80 à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¡à¤¼à¥\87।",
-       "versionrequired": "मिडà¥\80याविà¤\95à¥\80 à¤\95à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण $1 के होखल जरुरी बा",
-       "versionrequiredtext": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤®à¥\80डियाविà¤\95à¥\80 à¤\95à¥\87 $1 à¤¸à¤\82सà¥\8dà¤\95रण à¤\9c़रà¥\82रà¥\80 à¤¬à¤¾à¥¤\nदà¥\87à¤\96à¥\80à¤\82 [[Special:Version|सà¤\82सà¥\8dà¤\95रण à¤ªà¤¨à¥\8dना]]।",
-       "ok": "ठिक",
+       "badaccess": "परमà¥\80शन à¤\96राबी",
+       "badaccess-group0": "à¤\9cवन à¤\95ारà¥\8dरवाà¤\88 à¤\95à¥\87 à¤®à¤¾à¤\81à¤\97 à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80, à¤\93à¤\95रा à¤²à¤¾à¤\97à¥\82 à¤\95रà¥\87 à¤\95à¥\87 à¤\87à¤\9cाà¤\9cत à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤¨à¤\87खे।",
+       "badaccess-groups": "रà¤\89à¤\86 à¤\9cà¥\8cन à¤\95ारवाà¤\88 à¤\95à¥\87 à¤®à¤¾à¤\81à¤\97 à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤\8a {{PLURAL:$2|$1 à¤®à¤\82डलà¥\80|$1 à¤®à¤\82डलà¥\80 à¤¸à¤­}} à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤²à¥\8bà¤\97 à¤­à¤° à¤\95र à¤¸à¤\95त à¤¬à¤¾।",
+       "versionrequired": "मिडà¥\80याविà¤\95à¥\80 à¤\95à¥\87 à¤µà¤°à¥\8dशन $1 के होखल जरुरी बा",
+       "versionrequiredtext": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤®à¥\80डियाविà¤\95à¥\80 à¤\95à¥\87 à¤µà¤°à¥\8dशन $1 à¤\9cरà¥\82रà¥\80 à¤¬à¤¾à¥¤\n[[Special:Version|वरà¥\8dशन à¤ªà¤¨à¥\8dना]] à¤¦à¥\87à¤\96à¥\80à¤\82।",
+       "ok": "ठà¥\80क",
        "retrievedfrom": "\"$1\" से लिहल गइल",
-       "youhavenewmessages": "रउआ लगे बा $1 ($2).",
-       "youhavenewmessagesfromusers": "रउआ खातिर {{PLURAL:$3|एगो अन्य सदस्य|$3 अन्य सदस्यन}} के $1 बा। ($2)",
-       "youhavenewmessagesmanyusers": "रà¤\89à¤\86 à¤\96ातिर à¤\95à¤\88 à¤¸à¤¦à¤¸à¥\8dयन à¤¦à¥\8dवारा $1 à¤¬à¤¾à¥¤ ($2)",
-       "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤¸à¤¨à¥\8dदà¥\87श|999=नयà¤\95ा à¤¸à¤¨à¥\8dदà¥\87श}}",
-       "newmessagesdifflinkplural": "पिछला {{PLURAL:$1|बदलाव|999=बदलाव}}",
-       "youhavenewmessagesmulti": "रà¤\89à¤\86 à¤²à¤\97à¥\87 $1 à¤ªà¤° à¤¨à¤¯à¤¾ à¤¸à¤¨à¥\8dदà¥\87श बा",
+       "youhavenewmessages": "{{PLURAL:$3|रउआँ खातिर}} $1 ($2) बा।",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|रउवाँ खातिर}}{{PLURAL:$3|केहू प्रयोगकर्ता के|$3 प्रयोगकर्ता लोग}} के $1 बा ($2)।",
+       "youhavenewmessagesmanyusers": "रà¤\89वाà¤\81 à¤\96ातिर à¤\95à¤\88 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤­à¥\87à¤\9cल $1 à¤¬à¤¾ ($2)।",
+       "newmessageslinkplural": "{{PLURAL:$1|नया à¤¸à¤¨à¥\87सा|999=नया à¤¸à¤¨à¥\87सा à¤¸à¤­}}",
+       "newmessagesdifflinkplural": "पिछला {{PLURAL:$1|बदलाव|999=बदलाव}}",
+       "youhavenewmessagesmulti": "राà¤\89वाà¤\81 à¤\96ातिर $1 à¤ªà¤° à¤¨à¤¯à¤¾ à¤¸à¤¨à¥\87सा बा",
        "editsection": "संपादन",
        "editold": "संपादन",
        "viewsourceold": "स्रोत देखीं",
        "editlink": "संपादन",
        "viewsourcelink": "स्रोत देखीं",
-       "editsectionhint": "सà¤\82पादन à¤\96à¤\82ड: $1",
-       "toc": "सामà¤\97à¥\8dरी",
-       "showtoc": "दà¥\87à¤\96ाà¤\88ं",
-       "hidetoc": "à¤\9bà¥\81पाईं",
+       "editsectionhint": "à¤\96à¤\82ड à¤\95à¥\87 à¤¸à¤\82पादन: $1",
+       "toc": "बिसयसà¥\82à¤\9aी",
+       "showtoc": "दà¥\87à¤\96à¥\80ं",
+       "hidetoc": "à¤\9bिपाईं",
        "collapsible-collapse": "सेकुड़ीं",
-       "collapsible-expand": "फà¥\88लाईं",
+       "collapsible-expand": "फà¤\87लाईं",
        "confirmable-confirm": "का {{GENDER:$1|आप}} निश्चित बानी?",
        "confirmable-yes": "जी",
        "confirmable-no": "ना",
-       "thisisdeleted": "दà¥\87à¤\96à¥\80à¤\82 à¤¯à¤¾ à¤­à¤\82डार करीं $1?",
-       "viewdeleted": "$1 à¤¦à¥\87à¤\96ब?",
-       "restorelink": "देखीं {{PLURAL:$1|एगो हटावल गईल सम्पादन|$1 हटावल गईल कुल सम्पादन}}",
-       "feedlinks": "फ़à¥\80ड:",
-       "feed-invalid": "à¤\97लत à¤¸à¤¬à¥\8dसà¥\8dà¤\95à¥\8dरà¥\80पà¥\8dशन à¤«à¤¼à¥\80ड à¤ªà¥\8dरà¤\95ार",
-       "feed-unavailable": "सà¤\82à¤\98 à¤«à¤¼à¥\80ड à¤\89पलबà¥\8dध à¤¨à¤\87à¤\96à¥\87",
-       "site-rss-feed": "$1 आर एस एस फिड",
+       "thisisdeleted": "दà¥\87à¤\96à¥\80à¤\82 à¤¯à¤¾ à¤°à¤¿à¤¸à¥\8dà¤\9fà¥\8bर करीं $1?",
+       "viewdeleted": "$1 à¤¦à¥\87à¤\96ावल à¤\9cाय?",
+       "restorelink": "{{PLURAL:$1|एक ठो हटावल संपादन|$1 ठे हटावल संपादन}}",
+       "feedlinks": "फीड:",
+       "feed-invalid": "à¤\85वà¥\88ध à¤¸à¤¬à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dशन à¤«à¥\80ड à¤ªà¥\8dरà¤\95ार।",
+       "feed-unavailable": "सिà¤\82डिà¤\95à¥\87शन à¤«à¥\80ड à¤\89पलबà¥\8dध à¤¨à¤\87à¤\96à¥\87à¤\82",
+       "site-rss-feed": "$1 आरएसएस फीड",
        "site-atom-feed": "$1 एटम फीड",
-       "page-rss-feed": "\"$1\" आर एस एस फिड",
+       "page-rss-feed": "\"$1\" आरएसएस फीड",
        "page-atom-feed": "\"$1\" एटम फीड",
-       "red-link-title": "$1 (पन्ना मौजूद नइखे)",
+       "red-link-title": "$1 (पन्ना मौजूद नइखे)",
        "sort-descending": "उतरत क्रम में",
        "sort-ascending": "चढ़त क्रम में",
        "nstab-main": "पन्ना",
-       "nstab-user": "सदसà¥\8dय पन्ना",
+       "nstab-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता पन्ना",
        "nstab-media": "मीडिया पन्ना",
        "nstab-special": "विशेष पन्ना",
        "nstab-project": "प्रोजेक्ट पन्ना",
        "nstab-image": "फाइल",
-       "nstab-mediawiki": "सनà¥\8dदà¥\87श",
+       "nstab-mediawiki": "सनà¥\87सा",
        "nstab-template": "टेम्पलेट",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
        "mainpage-nstab": "मुख्य पन्ना",
-       "nosuchaction": "à¤\85à¤\88सन à¤\95à¥\8cनà¥\8b à¤\95ारà¥\8dरवाà¤\88 à¤¨à¤¾à¤¹à¤¿",
-       "nosuchactiontext": "à¤\87 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95à¥\8dरिया à¤\85वà¥\88ध à¤¬à¤¾à¥¤\nरà¤\89à¤\86 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤\97लत à¤²à¤¿à¤\96लà¥\87 à¤¹à¥\8bà¤\96ब, à¤¯à¤¾ à¤\95à¤\89नà¥\8b à¤\97लत à¤\95ड़à¥\80 à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95à¤\87लà¥\87 à¤¹à¥\8bà¤\96ब।\nà¤\87 {{SITENAME}} à¤\95à¥\87 à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤®à¥\87à¤\82 à¤¤à¥\8dरà¥\81à¤\9fि भी हो सकत बा।",
-       "nosuchspecialpage": "à¤\85à¤\88सन à¤\95à¥\8cनà¥\8b à¤\96़ाश à¤ªà¤¨à¥\8dना à¤¨à¤¾à¤¹à¤¿",
-       "nospecialpagetext": "<strong>रउआ एगो अवैद्य विशेष पन्ना के अनुरोध कईले बानी।</strong>\n\nवैद्य विशेष पन्ना के सूची मिल सकत बा [[Special:SpecialPages|{{int:specialpages}}]] पर।",
-       "error": "तà¥\8dरà¥\81à¤\9fी",
-       "databaseerror": "डà¥\87à¤\9fाबà¥\87स à¤¤à¥\8dरà¥\81à¤\9fी",
-       "databaseerror-text": "डाà¤\9fाबà¥\87स à¤\85नà¥\81रà¥\8bध à¤¤à¥\8dरà¥\81à¤\9fि  à¤­à¤\87ल à¤¬à¤¾à¥¤\nसà¤\82भवतà¤\83 à¤¸à¥\89फ़्टवेयर में गड़बड़ी बा।",
-       "databaseerror-textcl": "डाà¤\9fाबà¥\87स à¤\85नà¥\81रà¥\8bध à¤¤à¥\8dरà¥\81à¤\9fि à¤\89तà¥\8dतà¥\8dपनà¥\8dन à¤¹à¥\8b à¤\97à¤\88ल बा।",
+       "nosuchaction": "à¤\85à¤\87सन à¤\95à¥\8cनà¥\8b à¤\95ारà¥\8dरवाà¤\88 à¤¨à¤\87à¤\96à¥\87",
+       "nosuchactiontext": "à¤\8f à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤¦à¥\8dवारा à¤¬à¤¤à¤¾à¤µà¤² à¤\95ारà¥\8dरवाà¤\88 à¤\85वà¥\88ध à¤¬à¤¾à¥¤\nरà¤\89वाà¤\81 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤\97लत à¤²à¤¿à¤\96लà¥\87 à¤¹à¥\8bà¤\96ब, à¤¯à¤¾ à¤\95à¥\8cनà¥\8bà¤\82 à¤\97लत à¤\95ड़à¥\80 à¤\95à¥\87 à¤\87सà¥\8dतà¥\87माल à¤\95à¤\87लà¥\87 à¤¹à¥\8bà¤\96ब।\n{{SITENAME}} à¤®à¥\87à¤\82 à¤\87सà¥\8dतमाल à¤¹à¥\8b à¤°à¤¹à¤² à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤®à¥\87à¤\82 à¤\96राबà¥\80 à¤\95à¥\87 à¤²à¤\9aà¥\8dà¤\9bन भी हो सकत बा।",
+       "nosuchspecialpage": "à¤\85à¤\87सन à¤\95à¥\8cनà¥\8b à¤\96ास à¤ªà¤¨à¥\8dना à¤¨à¤\87à¤\96à¥\87",
+       "nospecialpagetext": "<strong>रउआँ एगो अवैध खास पन्ना के अनुरोध कइले बानी।</strong>\n\nबैध खास पन्नासभ के लिस्ट [[Special:SpecialPages|{{int:specialpages}}]] पर देखल जा सकत बा।",
+       "error": "à¤\96राबी",
+       "databaseerror": "डà¥\87à¤\9fाबà¥\87स à¤\96राबी",
+       "databaseerror-text": "à¤\95à¥\8cनà¥\8bà¤\82 à¤¡à¤¾à¤\9fाबà¥\87स à¤\95à¥\8dवà¥\88रà¥\80 à¤\96राबà¥\80 à¤­à¤\87ल à¤¬à¤¾à¥¤\nसà¤\82भवतà¤\83 à¤¸à¥\89फ्टवेयर में गड़बड़ी बा।",
+       "databaseerror-textcl": "à¤\95à¥\8cनà¥\8bà¤\82 à¤¡à¤¾à¤\9fाबà¥\87स à¤\85नà¥\81रà¥\8bध à¤\96राबà¥\80 à¤\89तà¥\8dतà¥\8dपनà¥\8dन à¤¹à¥\8b à¤\97à¤\87ल बा।",
        "databaseerror-query": "अनुरोध: $1",
-       "databaseerror-function": "फ़à¤\82à¤\95à¥\8dशन: $1",
-       "databaseerror-error": "तà¥\8dरà¥\81à¤\9fि: $1",
-       "transaction-duration-limit-exceeded": "हाई रिप्लिकेशन लैग बनावे से बचे खातिर ई ट्रांजेक्शन निरस्त कर दिहल गइल, काहें से की राइट करे में लागे वाला समय ($1), $2 के सीमा से अधिक रहल।\nअगर आ कई ठो आइटम एकही साथ बदलत होखीं, तब कई टुकड़ा में ई काम करे के कोसिस करीं।",
-       "laggedslavemode": "'''चेतावनी:''' इ पन्ना पर हाल के बदलाव ना होखे के आशंका बा।",
-       "readonly": "डà¥\87à¤\9fाबà¥\87स à¤²à¥\89à¤\95 बा",
-       "enterlockreason": "लà¥\89à¤\95 à¤\95रà¥\87 à¤\95à¥\87 à¤\95ारण à¤¦à¤¿à¤¹à¥\80à¤\82, à¤¸à¤¾à¤¥à¥\87 à¤²à¥\89à¤\95 à¤\96à¥\81लà¥\87 à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95à¥\87 à¤²à¤\97भà¤\97 à¤\86à¤\95लन à¤¦à¤¿à¤¹à¥\80à¤\82।",
-       "readonlytext": "डाà¤\9fाबà¥\87स à¤¨à¤¯à¤¾ à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤\96ातिर à¤²à¥\89à¤\95 à¤\95रल à¤\97à¤\87ल à¤¬à¤¾, à¤¶à¤¾à¤¯à¤¦ à¤°à¥\81à¤\9fà¥\80न à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\8f à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nà¤\9cà¤\89न à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरबà¤\82धà¤\95 à¤\8fह à¤\95à¥\87 à¤²à¥\89à¤\95 à¤\95à¤\87लà¥\87 à¤°à¤¹à¤²à¤¨ à¤\95ारण à¤¦à¥\87हलà¥\87 à¤¬à¤¾à¤¡à¤¼à¤¨ à¤\95ि: $1",
-       "missing-article": "डà¥\87à¤\9fाबास à¤\8a à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤ à¥\8dय à¤\95à¥\87 à¤¨à¤¾ à¤\96à¥\8bà¤\9c à¤ªà¤¾à¤\88ल à¤\9cà¥\8cन à¤\88 à¤\95à¥\87 à¤\96à¥\8bà¤\9cà¥\87 à¤\95à¥\87 à¤°à¤¹à¤², à¤¨à¤¾à¤®à¤¿à¤¤ \"$1\" $2.\nà¤\88 à¤¸à¤¬ à¤¸à¤¾à¤§à¤¾à¤°à¤£à¤¤: à¤¨à¤¿à¤®à¥\8dनलिà¤\96à¥\80त à¤\85पà¥\8dरà¤\9aलित à¤\85नà¥\8dतर à¤\85थवा à¤\8fà¤\97à¥\8b à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\87तिहास à¤\95à¥\87 à¤²à¤¿à¤\82à¤\95 à¤\9cà¥\8cन à¤®à¤¿à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¬à¤¾ à¤\95à¥\87 à¤\95ारण à¤­à¤\88ल।\n\nयदि à¤\88 à¤¬à¤¾à¤¤ à¤¨à¤\88à¤\96à¥\87, à¤¤ à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾ à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤®à¥\87à¤\82 à¤¬à¤\97 à¤ªà¤¾à¤µà¤¤ à¤¹à¥\8bà¤\96ब।\nà¤\95à¥\83पया à¤\88 à¤\8fà¤\97à¥\8b  [[Special:ListUsers/sysop|पà¥\8dरबनà¥\8dधà¤\95]] à¤\95à¥\87 à¤¯à¥\82 à¤\86र à¤\8fल à¤\95à¥\87 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82 à¤\8fà¤\97à¥\8b à¤¨à¥\8bà¤\9f à¤¬à¤¨à¤¾के खबर करीं।",
-       "missingarticle-rev": "(सà¤\82शà¥\8bधन#: $1)",
+       "databaseerror-function": "फंक्शन: $1",
+       "databaseerror-error": "à¤\96राबà¥\80: $1",
+       "transaction-duration-limit-exceeded": "हाई रिप्लिकेशन लैग बनावे से बचे खातिर ई ट्रांजेक्शन निरस्त कर दिहल गइल, काहें से की राइट करे में लागे वाला समय ($1), $2 के सीमा से अधिक रहल ह।\nअगर आप कई ठो आइटम एकही साथ बदलत होखीं, तब कई टुकड़ा में ई काम करे के कोसिस करीं।",
+       "laggedslavemode": "<strong>चेतावनी:</strong> अइसन भी हो सकेला कि पन्ना पर हाल के अपडेट न होखे।",
+       "readonly": "डà¥\87à¤\9fाबà¥\87स à¤¤à¤¾à¤²à¤¾à¤¬à¤\82द बा",
+       "enterlockreason": "तालाबà¤\82दà¥\80 à¤\95à¥\87 à¤\95ारण à¤¦à¥\80à¤\82, à¤\86 à¤\85नà¥\81मान à¤¬à¤¤à¤¾à¤\88à¤\82 à¤\95ि à¤\95ब à¤¤à¤¾à¤²à¤¾à¤¬à¤\82दà¥\80 à¤¹à¤\9fà¥\80",
+       "readonlytext": "नया à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤\96ातिर à¤¡à¤¾à¤\9fाबà¥\87स à¤ªà¤° à¤¤à¤¾à¤²à¤¾à¤¬à¤\82दà¥\80 à¤¬à¤¾, à¤¶à¤¾à¤¯à¤¦ à¤°à¥\81à¤\9fà¥\80न à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\8f à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nतालाबà¤\82दà¥\80 à¤\95रà¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरबà¤\82धà¤\95 à¤\95à¥\87 à¤¬à¤¤à¤¾à¤µà¤² à¤\95ारण: $1",
+       "missing-article": "डà¥\87à¤\9fाबास à¤\95à¥\87 à¤\93 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤  à¤¨à¤¾ à¤®à¤¿à¤²à¤² à¤\9cवन à¤®à¤¿à¤²à¥\87 à¤\95à¥\87 à¤\9aाहत à¤°à¤¹à¤², à¤\8fà¤\95र à¤¨à¤¾à¤\81व à¤°à¤¹à¤² \"$1\" $2।\nà¤\86मतà¥\8cर à¤ªà¤° à¤\85à¤\87सन à¤¤à¤¬ à¤¹à¥\8bला à¤ªà¥\81रान à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤\85à¤\82तर à¤¯à¤¾ à¤¹à¤\9fावल à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤\87तिहास à¤\95à¥\87 à¤\95ड़à¥\80 à¤\95à¥\87 à¤ªà¥\80à¤\9bा à¤\95à¤\87ल à¤\9cा à¤°à¤¹à¤² à¤¹à¥\8bà¤\96à¥\87।\n\nयदि à¤\88 à¤¬à¤¾à¤¤ à¤¨à¤\87à¤\96à¥\87, à¤¤à¤¬ à¤¹à¥\8b à¤¸à¤\95à¥\87ला à¤\86पà¤\95à¥\87 à¤\95à¥\8cनà¥\8bà¤\82 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤¬à¤\97 à¤®à¤¿à¤² à¤\97à¤\87ल à¤¹à¥\8bà¤\96à¥\87।\n[[Special:ListUsers/sysop|पà¥\8dरबà¤\82धà¤\95]] à¤\95à¥\87 à¤\88 à¤¯à¥\82à¤\86रà¤\8fल à¤¦à¥\87 के खबर करीं।",
+       "missingarticle-rev": "(बदलाव#: $1)",
        "missingarticle-diff": "(अंतर: $1, $2)",
-       "readonly_lag": "à¤\89पमà¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर à¤®à¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤\95à¥\87 à¤¬à¤°à¤¾à¤¬à¤° à¤ªà¤°à¤¾à¤µà¤°à¥\8dतित à¤¹à¥\8bत à¤¸à¤®à¤¯ à¤®à¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर अपने आप लॉक हो गइल।",
+       "readonly_lag": "निà¤\9aला à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर à¤\9cबलà¥\87 à¤®à¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर à¤\95à¥\87 à¤\97ति à¤ªà¤\95ड़ à¤ªà¤¾à¤µà¥\87, à¤¡à¤¾à¤\9fाबà¥\87स अपने आप लॉक हो गइल।",
        "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' ऍचटीटीपी हेडर भेजल गइल रहल बाकी ई रिक्वेस्ट एपीआइ राइट मॉड्यूल खातिर रहल।",
-       "internalerror": "à¤\86नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fि",
-       "internalerror_info": "à¤\86नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fि: $1",
-       "internalerror-fatal-exception": "प्रकार के गंभीर अपवाद \"$1\"",
-       "filecopyerror": "\"$1\" फ़ाइल के \"$2\" पर प्रतिलिपि ना बन पाईल।",
-       "filerenameerror": "\"$1\" फ़ाइल के नाम बदल के \"$2\" नइखे रखल जा सकत।",
-       "filedeleteerror": "\"$1\" फ़ाइल के ना हटावल जा सकल।",
+       "internalerror": "à¤\85à¤\82दरà¥\82नà¥\80 à¤\96राबà¥\80",
+       "internalerror_info": "à¤\85à¤\82दरà¥\82नà¥\80 à¤\96राबà¥\80: $1",
+       "internalerror-fatal-exception": "\"$1\" प्रकार के घातक अपवाद",
+       "filecopyerror": "फाइल \"$1\" के \"$2\" पर नकल ना बन पावल।",
+       "filerenameerror": "फाइल \"$1\" के नाँव बदल के \"$2\" नइखे रखल जा सकत।",
+       "filedeleteerror": "फाइल \"$1\" के हटावल ना जा सकल।",
        "directorycreateerror": "\"$1\" डाइरेक्टरी ना बनावल जा सकल।",
-       "directoryreadonlyerror": "निरà¥\8dदà¥\87शिà¤\95ा \"$1\" à¤¸à¤¿à¤°à¥\8dफ à¤ªà¤ à¤¨à¥\80य बा।",
-       "directorynotreadableerror": "निरà¥\8dदà¥\87शिà¤\95ा \"$1\" à¤ªà¤ à¤¨à¥\80य नइखे।",
-       "filenotfound": "\"$1\" फ़ाइल ना मिलल।",
-       "unexpected": "à¤\85नपà¥\87à¤\95à¥\8dषित à¤®à¥\82लà¥\8dय: \"$1\"=\"$2\".",
-       "formerror": "तà¥\8dरà¥\81à¤\9fि: à¤«à¤¼à¥\89रà¥\8dम à¤¸à¤¬à¤®à¤¿à¤\9f à¤¨à¤¾ à¤\95रल जा सकल।",
-       "badarticleerror": "à¤\87 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\87 à¤\95ारà¥\8dय à¤¨à¤\87à¤\96à¥\87 à¤\95रल à¤\9cा à¤¸à¤\95त।",
-       "cannotdelete": "\"$1\" à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤\95à¥\87 à¤¹à¤\9fावल à¤¨à¤\87à¤\96à¥\87 à¤\9cा à¤¸à¤\95त।\nशायद à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\87 à¤\95à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¹à¤¿ हटा चुकल होखे।",
+       "directoryreadonlyerror": "डाà¤\87रà¥\87à¤\95à¥\8dà¤\9fरà¥\80 \"$1\" à¤\96ालà¥\80 à¤ªà¤¢à¤¼à¥\87 à¤\96ातिर बा।",
+       "directorynotreadableerror": "डाà¤\87रà¥\87à¤\95à¥\8dà¤\9fरà¥\80 \"$1\" à¤ªà¤¢à¤¼à¥\87 à¤²à¤¾à¤¯à¤\95 नइखे।",
+       "filenotfound": "फाइल \"$1\" ना मिलल।",
+       "unexpected": "à¤\89मà¥\87द à¤¸à¥\87 à¤¹à¤\9f à¤\95à¥\87 à¤µà¥\88लà¥\8dयà¥\82: \"$1\"=\"$2\".",
+       "formerror": "à¤\96राबà¥\80: à¤«à¤¾à¤°à¥\8dम à¤\9cमा à¤¨à¤¾ à¤\95à¤\87ल जा सकल।",
+       "badarticleerror": "à¤\8f à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\88 à¤\95ाम à¤¨à¤¾ à¤¹à¥\8b à¤¸à¤\95à¥\80।",
+       "cannotdelete": "\"$1\" à¤¨à¤¾à¤\81व à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤\95à¥\87 à¤¨à¤¾ à¤¹à¤\9fावल à¤\9cा à¤¸à¤\95त à¤¬à¤¾à¥¤\nहà¥\8b à¤¸à¤\95à¥\87ला à¤\95à¥\87हà¥\82 à¤ªà¤¹à¤¿à¤²à¤¹à¥\80à¤\82 à¤\8fà¤\95रा à¤\95à¥\87 हटा चुकल होखे।",
        "cannotdelete-title": "\"$1\" पन्ना के हटावल नइखे जा सकत",
-       "delete-hook-aborted": "हà¥\81à¤\95 à¤¦à¥\8dवारा à¤¹à¤\9fायà¥\87à¤\95à¥\87 à¤\95à¥\8dरिया à¤¬à¥\80à¤\9aà¥\87 à¤®à¥\87à¤\82 à¤\9bà¥\8bड़ल à¤\97à¤\88ल।\nà¤\87 à¤\95à¤\89नà¥\8b à¤\95ारण à¤¨à¤\88à¤\96à¥\87 बतवले।",
-       "no-null-revision": "पनà¥\8dना \"$1\" à¤\96ातिर à¤¨à¤¯à¤¾ à¤\85शà¤\95à¥\8dत à¤¸à¤\82शोधन ना बन सकल",
+       "delete-hook-aborted": "हà¥\81à¤\95 à¤¦à¥\8dवारा à¤¹à¤\9fावà¥\87 à¤\95à¥\87 à¤\95ारà¥\8dरवाà¤\88 à¤¬à¥\80à¤\9aà¥\87 à¤®à¥\87à¤\82 à¤\9bà¥\8bड़ल à¤\97à¤\87ल।\nबिना à¤\95à¥\8cनà¥\8bà¤\82 à¤\95ारण बतवले।",
+       "no-null-revision": "पनà¥\8dना \"$1\" à¤\96ातिर à¤¨à¤¯à¤¾ à¤\96ालà¥\80 à¤¸à¤\82सोधन ना बन सकल",
        "badtitle": "खराब टाइटिल",
-       "badtitletext": "रà¤\89à¤\86 à¤¦à¥\8dवारा à¤\85नà¥\81रà¥\8bधित à¤¶à¥\80रà¥\8dषà¤\95 à¤\85यà¥\8bà¤\97à¥\8dय, à¤\96़ालà¥\80 à¤¯à¤¾ à¤\97लत à¤\9cà¥\81ड़ल à¤\85à¤\82तर-भाषà¥\80य à¤¯à¤¾ à¤\85à¤\82तर-विà¤\95ि à¤¶à¥\80रà¥\8dषà¤\95 à¤¬à¤¾à¥¤\nà¤\8f à¤®à¥\87à¤\82 à¤\8fà¤\95 à¤¯à¤¾ à¤\8fà¤\95 à¤¸à¥\87 à¤¢à¥\87र à¤\85à¤\87सन à¤\95à¥\85रà¥\87à¤\95à¥\8dà¤\9fर à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾ à¤\9cवन à¤¶à¥\80रà¥\8dषà¤\95 à¤®à¥\87à¤\82 à¤ªà¥\8dरयà¥\8bà¤\97 à¤¨à¤\87à¤\96à¥\87 à¤\95à¤\87ल à¤\9cा à¤¸à¤\95त।",
-       "title-invalid-empty": "माà¤\81à¤\97ल à¤\9cा à¤°à¤¹à¤² à¤ªà¤¨à¥\8dना à¤\9fाà¤\87à¤\9fिल à¤¯à¤¾ à¤¤ à¤\96ालà¥\80 à¤¬à¤¾ à¤¯à¤¾ à¤«à¤¿à¤° à¤\96ालà¥\80 à¤\95à¥\8cनà¥\8bà¤\82 à¤¨à¤¾à¤\81वसà¥\8dथान à¤\95à¥\87 à¤¨à¤¾à¤\81व à¤­à¤° à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¤\9fà¥\87।",
+       "badtitletext": "à¤\85नà¥\81रà¥\8bधित à¤\9fाà¤\87à¤\9fिल à¤\85वà¥\88ध, à¤\96ालà¥\80 à¤¯à¤¾ à¤\97लत à¤\9cà¥\81ड़ल à¤\85à¤\82तर-भाषà¥\80य à¤¯à¤¾ à¤\85à¤\82तर-विà¤\95ि à¤\9fाà¤\87à¤\9fिल à¤¬à¤¾à¥¤\nबà¥\81à¤\9dात à¤¬à¤¾ à¤\95ि à¤\8fह à¤®à¥\87à¤\82 à¤\9fाà¤\87à¤\9fिल à¤®à¥\87à¤\82 à¤¨à¤¾ à¤\87सà¥\8dतà¥\87माल à¤¹à¥\8b à¤¸à¤\95à¥\87 à¤²à¤¾à¤¯à¤\95 à¤\8fà¤\95 à¤¯à¤¾ à¤\8fà¤\95 à¤¸à¥\87 à¤¢à¥\87र à¤\95à¥\85रà¥\87à¤\95à¥\8dà¤\9fर à¤¬à¤¾।",
+       "title-invalid-empty": "माँगल जा रहल पन्ना टाइटिल या त खाली बा या फिर कौनों नाँवस्थान के नाँव भर दिहल गइल बाटे।",
        "title-invalid-utf8": "माँगल जा रहल पन्ना टाइटिल में अइसन UTF-8 सीक्वेंस बा जेवन मान्य नइखे।",
        "title-invalid-interwiki": "माँगल जा रहल पन्ना टाइटिल में इंटरविकि कड़ी बा जेवन टाइटिल में ना प्रयोग कइल जा सकत बा।",
        "title-invalid-talk-namespace": "माँगल जा रहल पन्ना टाइटिल एगो अइसन वार्ता पन्ना के रेफर करत बा जेवना के होखल संभव नइखे।",
        "title-invalid-magic-tilde": "माँगल जा रहल पन्ना टाइटिल में अमान्य जादुई टिल्ड सीक्वेंस (<nowiki>~~~</nowiki>) बाटे।",
        "title-invalid-too-long": "माँगल जा रहल पन्ना टाइटिल बहुत ढेर लंबा बा। ई UTF-8 की एनकोडिंग में $1 {{PLURAL:$1|बाइट|बाइट्स}} से ढेर ना होखे के चाहीं।",
        "title-invalid-leading-colon": "माँगल जा रहल पन्ना टाइटिल में सुरुआते में अमान्य कोलन (:) बाटे।",
-       "perfcached": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¡à¥\87à¤\9fा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤²à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾, à¤\85तà¤\83 à¤¹à¥\8b à¤¸à¤\95ता à¤¬à¤¾ à¤\95ि à¤\87 à¤\95à¥\87 à¤ªà¥\82रà¥\8dण à¤\85दà¥\8dयतन à¤¨à¤¾ à¤­à¤\87ल à¤¹à¥\8bà¤\96à¥\87। à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$1|à¤\8fà¤\95  à¤¨à¤¤à¥\80à¤\9cा|$1 à¤¨à¤¤à¥\80à¤\9cà¤\82}} à¤\89पलबà¥\8dध à¤¬à¤¾à¤¡à¤¼à¥\87।",
-       "perfcachedts": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¡à¥\87à¤\9fा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤¬à¤¾, à¤\86 à¤\8fà¤\95र à¤\85à¤\82तिम à¤\85पडà¥\87à¤\9f $1 à¤\95à¥\87 à¤­à¤\87ल à¤°à¤¹à¤²à¥¤ à¤\95à¥\88श à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$4|à¤\8fà¤\95  à¤¨à¤¤à¥\80à¤\9cा|$4 à¤¨à¤¤à¥\80à¤\9cाà¤\82}} उपलब्ध बा।",
-       "querypage-no-updates": "à¤\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤\85पडà¥\87à¤\9f à¤\95रल à¤\85यà¥\8bà¤\97à¥\8dय à¤¬à¤¾à¥¤ à¤\85भà¥\80 à¤\85हिà¤\9cा à¤\95à¥\87 à¤¡à¤¾à¤\9fा à¤\95à¥\87 à¤¤à¤¾à¤\9c़ा à¤¨à¤\87à¤\96à¥\87 à¤\95रल जा सकत।",
+       "perfcached": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\86à¤\81à¤\95ड़ा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤²à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾, à¤¹à¥\8b à¤¸à¤\95ता à¤¬à¤¾ à¤\95ि à¤\88 à¤\8fà¤\95दम à¤\85पडà¥\87à¤\9f à¤¨à¤¾ à¤¹à¥\8bà¤\96à¥\87। à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b  à¤¨à¤¤à¥\80à¤\9cा|$1 à¤¨à¤¤à¥\80à¤\9cा}} à¤\89पलबà¥\8dध à¤¬à¤¾।",
+       "perfcachedts": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\86à¤\81à¤\95ड़ा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤¬à¤¾, à¤\86 à¤\8fà¤\95र à¤\85à¤\82तिम à¤\85पडà¥\87à¤\9f $1 à¤\95à¥\87 à¤­à¤\87ल à¤°à¤¹à¤²à¥¤ à¤\95à¥\88श à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$4|à¤\8fà¤\95 à¤ à¥\8b à¤¨à¤¤à¥\80à¤\9cा|$4 à¤¨à¤¤à¥\80à¤\9cा}} उपलब्ध बा।",
+       "querypage-no-updates": "à¤\8fह à¤ªà¤¨à¥\8dना à¤¸à¥\87 à¤¸à¤\82बà¤\82धित à¤\85पडà¥\87à¤\9f à¤µà¤°à¥\8dतमान à¤®à¥\87à¤\82 à¤¨à¤¿à¤°à¤¸à¥\8dत à¤¬à¤¾à¥¤ à¤\85भà¥\80 à¤\85हिà¤\9cा à¤\95à¥\87 à¤¡à¤¾à¤\9fा à¤\95à¥\87 à¤¤à¤¾à¤\9cा à¤¨à¤\87à¤\96à¥\87 à¤\95à¤\87ल जा सकत।",
        "viewsource": "स्रोत देखीं",
        "viewsource-title": "$1 के स्रोत देखीं",
-       "actionthrottled": "à¤\95ारà¥\8dय समाप्त कर दिहल गइल बा",
-       "actionthrottledtext": "दुरुपयोग रोकथाम उपाय के रूप में, एह काम के बहुत कम समय में एक सीमा से अधिक बे करे के मना बा, आ रउआ ई सीमा के पार कर चुकल बानी।\nकृपया कुछ समय बाद दोबारा कोसिस करीं।",
-       "protectedpagetext": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤\95ारà¥\8dयà¤\82 à¤¸à¥\87 à¤¬à¤\9aाव खातिर सुरक्षित कर दिहल गइल बा।",
+       "actionthrottled": "à¤\95ारà¥\8dरवाà¤\88 समाप्त कर दिहल गइल बा",
+       "actionthrottledtext": "दुरुपयोग रोकथाम उपाय के रूप में, एह काम के बहुत कम समय में एक सीमा से अधिक बे करे के मना बा, आ रउआ ई सीमा के पार कर चुकल बानी।\nकृपया कुछ समय बाद दोबारा कोसिस करीं।",
+       "protectedpagetext": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤\95ारà¥\8dरवाà¤\88 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 खातिर सुरक्षित कर दिहल गइल बा।",
        "viewsourcetext": "रउआँ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
-       "viewyourtext": "à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° <strong>राà¤\89र à¤\86पन à¤¸à¤\82पादन à¤¸à¤¬</strong>के स्रोत देख सकत बानी आ ओकर नकल ले सकत बानी।",
-       "protectedinterface": "à¤\87 à¤ªà¤¨à¥\8dना à¤\87 à¤µà¤¿à¤\95à¥\80 à¤\95à¥\87 à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤ à¥\8dय à¤\95à¥\87 à¤¦à¥\87वà¥\87ला, à¤\86 à¤\87 à¤\95à¥\87 à¤\97लत à¤ªà¥\8dरयà¥\8bà¤\97 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 à¤\96ातिर à¤¸à¥\81रà¤\95à¥\8dषित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤\nसभन à¤µà¤¿à¤\95ियन à¤\96ातिर à¤\85नà¥\81वाद à¤\9cà¥\8bड़à¥\87 à¤¯à¤¾ à¤¬à¤¦à¤²à¥\87 à¤\96ातिर à¤\95à¥\83पया à¤®à¥\80डियाविà¤\95ि à¤\95à¥\87 à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80यà¤\95रण à¤ªà¥\8dरà¤\95लà¥\8dप [https://translatewiki.net/ translatewiki.net] à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 करीं।",
-       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\97à¥\8b à¤\85à¤\87सन à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¦à¤² à¤¬à¤¦à¤² à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80 à¤\9cवन à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤  à¤ªà¥\8dरदान à¤\95रà¥\87ला। à¤\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤¬à¤¦à¤²à¥\87 à¤¸à¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयवन à¤\95à¥\87 à¤ªà¥\8dरदरà¥\8dशित à¤\87à¤\82à¤\9fरफ़à¥\87स à¤\95à¥\87 à¤¶à¤\95à¥\8dलà¥\8bसà¥\82रत à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\86à¤\88।",
+       "viewyourtext": "à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° <strong>à¤\86पन à¤\96à¥\81द à¤\95à¥\87 à¤¸à¤\82पादन</strong>के स्रोत देख सकत बानी आ ओकर नकल ले सकत बानी।",
+       "protectedinterface": "à¤\88 à¤ªà¤¨à¥\8dना à¤\8fह à¤µà¤¿à¤\95ि à¤\95à¥\87 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफà¥\87स à¤ªà¤¾à¤  à¤\89पलबà¥\8dध à¤\95रावà¥\87 à¤²à¤¾, à¤\86 à¤¦à¥\81रà¥\82पयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर à¤\8fà¤\95रा à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤\nबिनमà¥\8dर à¤\85नà¥\81रà¥\8bध à¤¬à¤¾ à¤\95ि, à¤¸à¤\97रà¥\80 à¤µà¤¿à¤\95ि à¤¸à¤­ à¤\96ातिर à¤\85नà¥\81वाद à¤\95रà¥\87 à¤¯à¤¾ à¤\85नà¥\81वाद à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95रà¥\87 à¤\96ातिर à¤®à¥\80डियाविà¤\95ि à¤\95à¥\87 à¤²à¥\8bà¤\95लाà¤\87à¤\9cà¥\87शन à¤ªà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f [https://translatewiki.net/ translatewiki.net] à¤\95à¥\87 à¤\87सà¥\8dतà¥\87माल करीं।",
+       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\97à¥\8b à¤\85à¤\87सन à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80 à¤\9cवन à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफà¥\87स à¤ªà¤¾à¤  à¤\89पलबà¥\8dध à¤\95रावà¥\87 à¤²à¤¾à¥¤ à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¹à¥\8bà¤\96à¥\87 à¤µà¤¾à¤²à¤¾ à¤¬à¤¦à¤²à¤¾à¤µ à¤\8fह à¤µà¤¿à¤\95ि à¤ªà¤° à¤\95à¥\87 à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤²à¤\89à¤\95à¥\87 à¤µà¤¾à¤²à¤¾ à¤\87à¤\82à¤\9fरफà¥\87स à¤\95à¥\87 à¤¸à¤\95लसà¥\82रत à¤\95à¥\87 à¤ªà¤°à¤­à¤¾à¤µà¤¿à¤¤ à¤\95रà¥\80।",
        "translateinterface": "सभन विकियन खातिर अनुवाद जोड़े या बदले खातिर मीडियाविकि क्षेत्रीयकरण परियोजना [https://translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
        "cascadeprotected": "ए पन्ना के संपादन कइल सुरक्षित क दिहल गइल बा काहें कि ई {{PLURAL:$1|पन्ना में, जौना के|पन्ना सब में, जिन्हन के}} \"कैस्केडिंग\" (बिस्तारित) सुरक्षा चालू क के सुरक्षित कइल गइल बा, में समाइल बाटे:\n$2",
        "namespaceprotected": "रउआ के '''$1''' नामस्थान के पन्नं में सम्पादन करे के अधिकार नइखे दिहल गइल।",
        "cannotlogoutnow-text": "$1 के इस्तेमाल करत समय लॉगआउट नइखे संभव।",
        "welcomeuser": "राउर स्वागत बा, $1!",
        "welcomecreation-msg": "राउर खाता बना दिहल गईल बा।\nआपन [[Special:Preferences|{{SITENAME}} वरीयतां]] के बदले के ना भूलब।",
-       "yourname": "सदसà¥\8dयनाम:",
-       "userlogin-yourname": "सदसà¥\8dयनाँव",
-       "userlogin-yourname-ph": "à¤\86पन à¤¸à¤¦à¤¸à¥\8dयनाँव लिखीं",
-       "createacct-another-username-ph": "सदसà¥\8dयनाम लिखीं",
-       "yourpassword": "गुप्त शब्द",
+       "yourname": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व:",
+       "userlogin-yourname": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव",
+       "userlogin-yourname-ph": "à¤\86पन à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव लिखीं",
+       "createacct-another-username-ph": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व लिखीं",
+       "yourpassword": "गुप्तशब्द:",
        "userlogin-yourpassword": "गुप्तशब्द (पासवर्ड)",
        "userlogin-yourpassword-ph": "आपन गुप्तशब्द लिखीं",
        "createacct-yourpassword-ph": "एगो गुप्तशब्द (पासवर्ड) प्रवेश करीं",
-       "yourpasswordagain": "गुप्त-शब्द पुन:डालीं:",
+       "yourpasswordagain": "गुप्तशब्द दोबारा डालीं:",
        "createacct-yourpasswordagain": "गुप्तशब्द (पासवर्ड) के पुष्टि करीं",
        "createacct-yourpasswordagain-ph": "गुप्तशब्द (पासवर्ड) फेर से प्रवेश करीं",
        "userlogin-remembermypassword": "हमके लॉग इन रहे दीं",
        "userloginnocreate": "खाता में प्रवेश",
        "logout": "खाता से बाहर",
        "userlogout": "खाता से बाहर",
-       "notloggedin": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¨à¤\88à¤\96à¥\80à¤\82 à¤­à¤\88ल",
+       "notloggedin": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¨à¤\87à¤\96à¥\80à¤\82 à¤­à¤\87ल",
        "userlogin-noaccount": "का एगो खाता नइखे?",
        "userlogin-joinproject": "{{SITENAME}} से जुड़ीं",
        "nologin": "का एगो खाता नईखे? $1.",
        "createaccount": "खाता बनाईं",
        "gotaccount": "का पहिले से एगो खाता बा? $1.",
        "gotaccountlink": "खाता में प्रवेश",
-       "userlogin-resetlink": "à¤\95ा à¤°à¤\89à¤\86 à¤\86पन à¤ªà¥\8dरवà¥\87श à¤\9cानà¤\95ारà¥\80 à¤­à¥\82ला गइल बानी?",
-       "userlogin-resetpassword-link": "à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤­à¥\82ला à¤\97à¤\88नी का?",
-       "userlogin-helplink2": "लà¥\89à¤\97 à¤\87न में मदद",
-       "userlogin-loggedin": "रà¤\89à¤\86 {{GENDER:$1|$1}} à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤²à¥\89à¤\97à¥\8dड à¤\87न à¤¬à¤¾à¤¨à¥\80à¤\82।\nà¤\95à¥\8cनà¥\8b à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤²à¥\89à¤\97 à¤\87न à¤\95रà¥\87 à¤\96ातिर à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤«à¤¼à¥\89रà¥\8dम के प्रयोग करीं।",
-       "userlogin-reauth": "à¤\86प à¤\95à¥\87 à¤\88 à¤¸à¤¾à¤¬à¤¿à¤¤ à¤\95रà¥\87 à¤\96ातिर à¤\95à¥\80 à¤\86पà¥\87 {{GENDER:$1|$1}} à¤¬à¤¾à¤¨à¥\80, à¤¦à¥\81बारा à¤²à¥\89à¤\97िन करे के पड़ी।",
+       "userlogin-resetlink": "à¤\95ा à¤°à¤\89à¤\86 à¤\86पन à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤µà¤¾à¤²à¥\80 à¤\9cानà¤\95ारà¥\80 à¤­à¥\81ला गइल बानी?",
+       "userlogin-resetpassword-link": "à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤­à¥\81ला à¤\97à¤\87नी का?",
+       "userlogin-helplink2": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श में मदद",
+       "userlogin-loggedin": "रà¤\89à¤\86 {{GENDER:$1|$1}} à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95 à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80à¤\82।\nà¤\95à¥\8cनà¥\8b à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\96ातिर à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤«à¤¾à¤°म के प्रयोग करीं।",
+       "userlogin-reauth": "à¤\86प à¤\95à¥\87 à¤\88 à¤¸à¤¾à¤¬à¤¿à¤¤ à¤\95रà¥\87 à¤\96ातिर à¤\95à¥\80 à¤\86पà¥\87 {{GENDER:$1|$1}} à¤¬à¤¾à¤¨à¥\80, à¤¦à¥\81बारा à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श करे के पड़ी।",
        "userlogin-createanother": "एगो दूसर खाता बनाईं",
-       "createacct-emailrequired": "ई-मेल पता",
-       "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
-       "createacct-email-ph": "आपन ई-मेल पता लिखीं",
-       "createacct-another-email-ph": "ई-मेल पता लिखीं",
-       "createaccountmail": "à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95 (रà¥\88नà¥\8dडम) à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 à¤\86 à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\88-मेल पता पर भेजीं",
+       "createacct-emailrequired": "ईमेल पता",
+       "createacct-emailoptional": "ईमेल पता (वैकल्पिक)",
+       "createacct-email-ph": "आपन ईमेल पता लिखीं",
+       "createacct-another-email-ph": "ईमेल पता लिखीं",
+       "createaccountmail": "à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95 (रà¥\88नà¥\8dडम) à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 à¤\86 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\88मेल पता पर भेजीं",
        "createaccountmail-help": "एकर इस्तेमाल केहू दुसरा खातिर खाता बनावे में कइल जा सके ला, बिना पासवर्ड जनले।",
        "createacct-realname": "असली नाम (वैकल्पिक)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
-       "createacct-reason-ph": "रउआ एगो अन्य खाता काहे बना रहल बानी",
-       "createacct-reason-help": "à¤\96ाता à¤¬à¤¨à¤µà¤²à¥\87 à¤\95à¥\87 à¤²à¥\89à¤\97 à¤®à¥\87à¤\82 à¤¦à¥\87à¤\96ाà¤\88 à¤ªà¤¡à¤¼à¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤\82दà¥\87स",
+       "createacct-reason-ph": "रउआ एगो अन्य खाता काहे बना रहल बानी",
+       "createacct-reason-help": "à¤\96ाता à¤¬à¤¨à¤µà¤²à¥\87 à¤\95à¥\87 à¤²à¥\89à¤\97 à¤®à¥\87à¤\82 à¤¦à¥\87à¤\96ाà¤\88 à¤ªà¤¡à¤¼à¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤¨à¥\87सा",
        "createacct-submit": "आपन खाता बनाईं",
        "createacct-another-submit": "खाता बनाईं",
        "createacct-continue-submit": "खाता बनावल जारी राखीं",
        "createacct-another-continue-submit": "खाता बनावल जारी राखीं",
-       "createacct-benefit-heading": "{{SITENAME}} à¤°à¤\89à¤\86 à¤\9cà¤\87सन à¤²à¥\8bà¤\97न à¤¦à¥\8dवारा à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\88ल बा।",
+       "createacct-benefit-heading": "{{SITENAME}} à¤°à¤\89à¤\86 à¤\9cà¤\87सन à¤²à¥\8bà¤\97न à¤¦à¥\8dवारा à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\87ल बा।",
        "createacct-benefit-body1": "{{PLURAL:$1|संपादन}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}",
        "createacct-benefit-body3": "हाल के {{PLURAL:$1|योगदानकर्ता}}",
-       "badretype": "रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।",
-       "usernameinprogress": "à¤\8fहà¥\80 à¤¸à¤¦à¤¸à¥\8dयनाँव खातिर खाता खोले के काम पहिलहीं चालू बा।\nइंतजार करीं।",
-       "userexists": "लिà¤\96ल à¤\97à¤\88ल à¤¸à¤¦à¤¸à¥\8dय à¤¨à¤¾à¤® à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤®à¥\87à¤\82 à¤¬à¤¾à¥¤ à¤\95à¥\83पया à¤\95à¥\8cनà¥\8b à¤¦à¥\8bसर à¤¨à¤¾à¤® à¤\9aà¥\81नीं।",
-       "loginerror": "à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤®à¥\87à¤\82 à¤¤à¥\8dरà¥\81à¤\9fि",
-       "createacct-error": "à¤\96ाता à¤¨à¤¿à¤°à¥\8dमाण à¤¤à¥\8dरà¥\81à¤\9fि",
-       "createaccounterror": "à¤\88 à¤\96ाता à¤¨à¤¾ à¤¬à¤¨ à¤ªà¤¾à¤\88ल: $1",
-       "nocookiesnew": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\96ाता à¤¤ à¤¬à¤¨ à¤\97à¤\88ल, à¤¬à¤¾à¤\81à¤\95à¥\80 à¤°à¤\89à¤\86 à¤ªà¥\8dरवà¥\87श à¤¨à¤\88à¤\96à¥\80à¤\82 à¤­à¤\88ल।\n{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95िà¤\9c à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87ला।\nराà¤\89र à¤\95à¥\81à¤\95िà¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\83पया à¤\89 à¤\95à¥\87 à¤¸à¤\95à¥\8dषम à¤\95रà¥\80à¤\82, à¤\89 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤°à¤¾à¤\89र à¤¨à¤¯à¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤\86 à¤\97à¥\81पà¥\8dत शब्द के साथ प्रवेश करीं।",
-       "nocookieslogin": "{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95िà¤\9c à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87ला।\nराà¤\89र à¤\95à¥\81à¤\95िà¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\83पया à¤\89 के सक्षम करीं आ फिर से कोशिश करीं",
-       "nocookiesfornew": "सà¥\8dरà¥\8bत à¤\95à¥\87 à¤ªà¥\81षà¥\8dà¤\9fि à¤¨à¤¾ à¤¹à¥\8b à¤ªà¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95ारण à¤\87 à¤\96ाता à¤¨à¤¿à¤°à¥\8dमित à¤¨à¤¾ à¤\95रल à¤\97à¤\87ल। \nसà¥\81निशà¥\8dà¤\9aित à¤\95रà¥\80à¤\82 à¤\95ि à¤°à¤\89à¤\86 à¤\95à¥\81à¤\95à¥\80à¤\9c़ à¤¸à¤\95à¥\8dषम à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80, à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤ªà¥\81नà¤\83 à¤²à¥\8bड à¤\95रà¥\80à¤\82 à¤\86 à¤ªà¥\81नà¤\83 à¤ªà¥\8dरयास करीं।",
+       "badretype": "रउआँ जौन गुप्तशब्द डालत बानी उ मेल नइखे खात।",
+       "usernameinprogress": "à¤\8fहà¥\80 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव खातिर खाता खोले के काम पहिलहीं चालू बा।\nइंतजार करीं।",
+       "userexists": "लिà¤\96ल à¤\97à¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤®à¥\87à¤\82 à¤¬à¤¾à¥¤ à¤\95à¥\8cनà¥\8bà¤\82 à¤¦à¥\82सर à¤¨à¤¾à¤® à¤¬à¥\80à¤\9bीं।",
+       "loginerror": "à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤®à¥\87à¤\82 à¤\96राबà¥\80",
+       "createacct-error": "à¤\96ाता à¤¬à¤¨à¤¾à¤µà¥\87 à¤®à¥\87à¤\82 à¤\96राबà¥\80",
+       "createaccounterror": "à¤\88 à¤\96ाता à¤¨à¤¾ à¤¬à¤¨ à¤ªà¤¾à¤µल: $1",
+       "nocookiesnew": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\96ाता à¤¤ à¤¬à¤¨ à¤\97à¤\87ल, à¤¬à¤¾à¤\95à¥\80 à¤°à¤\89à¤\86 à¤ªà¥\8dरवà¥\87श à¤¨à¤\87à¤\96à¥\80à¤\82 à¤­à¤\88ल।\n{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95à¥\80 à¤¸à¤¬ à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤²à¤¾à¥¤\nराà¤\89र à¤\95à¥\81à¤\95à¥\80à¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\81à¤\95à¥\80à¤\9c à¤¸à¤\95à¥\8dषम à¤\95रà¥\80à¤\82, à¤\8fà¤\95रा à¤¬à¤¾à¤¦ à¤\86पन à¤¨à¤¯à¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤\86 à¤\97à¥\81पà¥\8dतशब्द के साथ प्रवेश करीं।",
+       "nocookieslogin": "{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95à¥\80 à¤¸à¤­ à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87ला।\nराà¤\89र à¤\95à¥\81à¤\95à¥\80à¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\83पया à¤\95à¥\81à¤\95à¥\80 के सक्षम करीं आ फिर से कोशिश करीं",
+       "nocookiesfornew": "सà¥\8dरà¥\8bत à¤\95à¥\87 à¤ªà¥\81षà¥\8dà¤\9fि à¤¨à¤¾ à¤¹à¥\8b à¤ªà¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95ारण à¤\87 à¤\96ाता à¤¨à¤¾ à¤¬à¤¨à¤¾à¤µà¤²à¤² à¤\97à¤\87ल। \nसà¥\81निशà¥\8dà¤\9aित à¤\95रà¥\80à¤\82 à¤\95ि à¤°à¤\89à¤\86à¤\81 à¤\95à¥\81à¤\95à¥\80à¤\9c à¤¸à¤\95à¥\8dषम à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80, à¤ªà¤¨à¥\8dना à¤¦à¥\8bबारा à¤²à¥\8bड à¤\95रà¥\80à¤\82 à¤\86 à¤«à¤¿à¤° à¤¸à¥\87 à¤\95à¥\8bसिस करीं।",
        "createacct-loginerror": "खाता बनावल सफल भइल बाकी रउआँ अपने-आप लॉगिन ना हो पवलीं। [[Special:UserLogin|मैनुअल लॉगिन]] करीं।",
-       "noname": "रà¤\89à¤\86 à¤\89पयà¥\81à¤\95à¥\8dत à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¨à¤\88à¤\96à¥\80à¤\82 à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95à¤\88ले।",
-       "loginsuccesstitle": "लà¥\89à¤\97िन à¤ªà¥\82रा",
-       "loginsuccess": "''' \"$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
-       "nosuchuser": "\"$1\" नाँव के कौनो प्रयोगकर्ता नइखन।\nप्रयोगकर्ता नाम संवेदनशील मामला बा।\nशब्द आ इस्पेलिंग के जाँच करीं, या [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
-       "nosuchusershort": "ई नाम से कौनो प्रयोगकर्ता नईखन \"$1\".\nआपन शब्द-वर्तनी के जाँच करीं।",
-       "nouserspecified": "रà¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95रà¥\87 à¤\95à¥\87 à¤¬à¤¾।",
-       "login-userblocked": "à¤\88 प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।",
-       "wrongpassword": "गलत गुप्त-शब्द डलले बानी।\nकृपया फिर से कोशिश करीं।",
-       "wrongpasswordempty": "गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।",
-       "passwordtooshort": "गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
-       "passwordtoolong": "गुप्त-शब्द {{PLURAL:$1|$1 अक्षर}} से अधिक लमहर नइखे हो सकत।",
-       "passwordtoopopular": "à¤\85à¤\95à¥\8dसरहा à¤¬à¥\80à¤\9bल à¤\9cाà¤\8f à¤µà¤¾à¤²à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¨à¤¾ à¤\87सà¥\8dतà¥\87माल à¤¹à¥\8bà¤\96à¥\80। à¤\95à¥\8cनà¥\8bà¤\82 à¤\85à¤\89रà¥\80 à¤\96ास à¤\85लà¤\97 à¤\9fाà¤\87प à¤\95à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड चुनीं।",
-       "password-name-match": "राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।",
-       "password-login-forbidden": "à¤\87स à¤¸à¤¦à¤¸à¥\8dयनाम आ गुप्तशब्द के प्रयोग वर्जित बा।",
+       "noname": "रà¤\89à¤\86 à¤¬à¥\88ध à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤¨à¤\87à¤\96à¥\80à¤\82 à¤¦à¤¿à¤¹ले।",
+       "loginsuccesstitle": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¹à¥\8b à¤\97à¤\87ल",
+       "loginsuccess": "''' \"$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
+       "nosuchuser": "\"$1\" नाँव के कौनो प्रयोगकर्ता नइखन।\nप्रयोगकर्तानाँव संवेदनशील मामला बा।\nशब्द आ इस्पेलिंग के जाँच करीं, या [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
+       "nosuchusershort": "\"$1\" नाँव के कौनो प्रयोगकर्ता नइखन।\nआपन इस्पेलिंग (हिज्जे) जाँचीं।",
+       "nouserspecified": "à¤\8fà¤\97à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤ªà¤°à¥\80।",
+       "login-userblocked": "à¤\8f प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।",
+       "wrongpassword": "गलत गुप्तशब्द डलले बानी।\nकृपया फिर से कोसिस करीं।",
+       "wrongpasswordempty": "गुप्तशब्द खाली बा। कृपया फिर से कोसिस करीं।",
+       "passwordtooshort": "गुप्तशब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
+       "passwordtoolong": "गुप्तशब्द {{PLURAL:$1|$1 अक्षर}} से लमहर ना चाहीं।",
+       "passwordtoopopular": "à¤\85à¤\95à¥\8dसरहा à¤¬à¥\80à¤\9bल à¤\9cाà¤\8f à¤µà¤¾à¤²à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¨à¤¾ à¤\87सà¥\8dतà¥\87माल à¤¹à¥\8b à¤¸à¤\95à¥\87 à¤²à¤¾à¥¤ à¤\95à¥\8cनà¥\8bà¤\82 à¤\85à¤\89रà¥\80 à¤\96ास à¤\85लà¤\97 à¤\95िसिम à¤\95à¥\87 à¤\97à¥\81पà¥\8dतशबà¥\8dद चुनीं।",
+       "password-name-match": "राउर गुप्तशब्द राउर प्रयोगकर्तानाँव से अलग होखे के चाहीं।",
+       "password-login-forbidden": "à¤\87स à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व आ गुप्तशब्द के प्रयोग वर्जित बा।",
        "mailmypassword": "गुप्तशब्द रिसेट करीं",
-       "passwordremindertitle": "{{SITENAME}} खातिर नया अस्थायी गुप्त-शब्द",
-       "passwordremindertext": "à¤\95à¥\87हà¥\81 (शायद à¤°à¤\89à¤\8f, $1 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87) {{SITENAME}} ($4) à¤ªà¤° à¤ªà¥\8dरयà¥\8bà¤\97 à¤\96ातिर à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¤\88लà¥\87 à¤¬à¤¾à¤¨à¥\80। à¤¸à¤¦à¤¸à¥\8dय \"$2\" à¤\96ातिर à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¬à¤¾, à¤\86 à¤\88 à¤\85भà¥\80 \"$3\" à¤¬à¤¾à¥¤ à¤¯à¤¦à¤¿ à¤\88 à¤°à¤¾à¤\89रà¥\87 à¤\86शय à¤°à¤¹à¤², à¤¤ à¤\85ब à¤°à¤\89à¤\86 à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80।\nराà¤\89र à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤\85वधि {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨à¤\82}} à¤®à¥\87à¤\82 à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9cाà¤\88।\n\nयदि à¤\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤°à¤¹à¤², à¤¯à¤¾ à¤°à¤\89à¤\86 à¤\86पन à¤ªà¥\81रान à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85ब à¤¨à¤\87à¤\96à¥\80 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤\9aाहत à¤\95ाहà¥\87 à¤\95ि à¤°à¤\89à¤\86 à¤°à¤¾à¤\89र à¤ªà¥\81रनà¤\95ा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¸à¥\8dमरण à¤¹à¥\8b à¤\86à¤\87ल à¤¬à¤¾, à¤¤ à¤°à¤\89à¤\86 à¤\87 à¤¸à¤\82दà¥\87श à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80, à¤\86 à¤\86पन à¤ªà¥\81रान à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¹à¤¿ à¤\9cà¤\87सन कर सकत बानी।",
-       "noemail": "\"$1\" à¤¸à¤¦à¤¸à¥\8dय à¤\96ातिर à¤\95à¤\89नà¥\8b à¤­à¥\80 à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¦à¤°à¥\8dà¤\9c à¤¨à¤\87à¤\96à¥\87 à¤\95रल à¤\97à¤\87ल।",
-       "noemailcreate": "रउआ एगो जायज ई-मेल पता उपलब्ध करावे के पड़ी।",
-       "passwordsent": "\"$1\" के ई-मेल पता पर एगो नया गुप्तशब्द भेज दिहल गइल बा।\nई-मेल पावे के बाद कृपया दुबारा खाता में प्रवेश करब।",
-       "blocked-mailpassword": "राà¤\89र à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤¸à¤\82पादन à¤\95रà¥\87 à¤¸à¥\87 à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤ à¤¦à¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर, à¤\8f à¤\86à¤\87पà¥\80 à¤¸à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤°à¤¿à¤\95वरà¥\80 à¤\95à¥\87 à¤\85नà¥\81मति नइखे।",
-       "eauthentsent": "दर्ज करावल गइल ई-मेल पता पर एगो पुष्टिकरण ई-मेल भेज दिहल गइल बा।\nउ खाता पर कौनो दुसर ईमेल भेजल जाओ उ से पहिले, रउआ भेजल गईल ई-मेल पर दिहल गइल निर्देश के अनुसरण कर के ई-मेल पता के पुष्टिकरण करावे के पड़ी ताकि पता चले की सही में उ राउरे खाता ह।",
-       "throttled-mailpassword": "पिà¤\9bला {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤\95à¥\87 à¤\85à¤\82दर à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\88-मà¥\87ल à¤­à¥\87à¤\9cल à¤\9cा à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤\nदà¥\81रà¥\81पयà¥\8bà¤\97 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 à¤\96ातिर {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤®à¥\87à¤\82 à¤¸à¤¿à¤°à¥\8dफ à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\88-मेल भेजल जाई।",
-       "mailerror": "ई-मेल भेजे में त्रुटि: $1",
+       "passwordremindertitle": "{{SITENAME}} खातिर नया अस्थायी गुप्तशब्द",
+       "passwordremindertext": "à¤\95à¥\87हà¥\82 (शायद à¤°à¤\89à¤\8f, $1 à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87) {{SITENAME}} ($4) à¤ªà¤° à¤ªà¥\8dरयà¥\8bà¤\97 à¤\96ातिर à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¤\87लà¥\87 à¤¬à¤¾à¥¤ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता \"$2\" à¤\96ातिर à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾, à¤\86 à¤\88 \"$3\" à¤¬à¤¾à¥¤ à¤¯à¤¦à¤¿ à¤\88 à¤°à¤\89वà¥\87à¤\82 à¤\9aाहत à¤°à¤¹à¤²à¥\80à¤\82, à¤¤ à¤\85ब à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95 à¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80।\nराà¤\89र à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤\85वधि {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨}} à¤®à¥\87à¤\82 à¤\96तम à¤¹à¥\8b à¤\9cाà¤\88।\n\nयदि à¤\88 à¤¨à¤¿à¤µà¥\87दन à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤°à¤¹à¤², à¤¯à¤¾ à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\86पन à¤ªà¥\81रनà¤\95ा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\87याद à¤\86 à¤\97à¤\87ल à¤¬à¤¾ à¤\86 à¤¬à¤¦à¤²à¤¾à¤µ à¤¨à¤\87à¤\96à¥\80à¤\82 à¤\9aाहत, à¤¤ à¤°à¤\89à¤\86à¤\81 à¤\8f à¤¸à¤¨à¥\87सा à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80, à¤\86 à¤\86पन à¤ªà¥\81रनà¤\95ा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¨à¤¿à¤¯à¤° कर सकत बानी।",
+       "noemail": "\"$1\" à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\96ातिर à¤\95à¥\8cनà¥\8bà¤\82 à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤°à¤¿à¤\95ारà¥\8dड à¤®à¥\87à¤\82 à¤¨à¤\87à¤\96à¥\87।",
+       "noemailcreate": "रउआँ के एगो जायज ईमेल पता देवे के पड़ी।",
+       "passwordsent": "\"$1\" के ईमेल पता पर एगो नया गुप्तशब्द भेज दिहल गइल बा।\nईमेल पावे के बाद कृपया दुबारा खाता में प्रवेश करीं।",
+       "blocked-mailpassword": "राà¤\89र à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤¸à¤\82पादन à¤\95रà¥\87 à¤¸à¥\87 à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤ à¤¦à¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर, à¤\8f à¤\86à¤\87पà¥\80 à¤¸à¥\87 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¦à¥\8bबारा à¤¹à¤¾à¤¸à¤¿à¤² à¤\95रà¥\87 à¤\95à¥\87 à¤\87à¤\9cाà¤\9cत नइखे।",
+       "eauthentsent": "दर्ज करावल गइल ईमेल पता पर एगो पुष्टिकरण ईमेल भेज दिहल गइल बा।\nउ खाता पर कौनो दूसर ईमेल भेजल जाव ओ से पहिले, रउआँ भेजल गइल ईमेल पर दिहल गइल निर्देश के अनुसार ईमेल पता के पुष्टिकरण करावे के पड़ी ताकि पता चले की सही में ऊ राउरे खाता हऽ।",
+       "throttled-mailpassword": "पिà¤\9bला {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤\95à¥\87 à¤\85à¤\82दर à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤²à¤¾à¤µ à¤\88मà¥\87ल à¤­à¥\87à¤\9cल à¤\9cा à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤\nदà¥\81रà¥\81पयà¥\8bà¤\97 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 à¤\96ातिर {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤®à¥\87à¤\82 à¤¸à¤¿à¤°à¥\8dफ à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤²à¤¾à¤µ à¤\88मेल भेजल जाई।",
+       "mailerror": "ईमेल भेजे में गड़बड़ी: $1",
        "acct_creation_throttle_hit": "राउर आइपी पता से आइल आगंतुक लोग पिछला $2 में एह विकि पर {{PLURAL:$1|एक ठो खाता|$1 खाता}} बना चुकल बा जवन एह समयअवधि में अधिकतम सीमा बा।\nएही कारण, एह आइपी पता के इस्तेमाल करे वाला आगंतुक अब कौनों अउरी खाता एह समय नइखें बना सकत।",
-       "emailauthenticated": "$2 के $3 पर राउर ई-मेल पता के पुष्टीकरण हो चुकल बा।",
-       "emailnotauthenticated": "राउर ई-मेल पता के अभी तक प्रमाणिकरण नइखे भईल।\nनिम्नलिखित कउनो भी सुविधा खातिर रउआ के कौनो भी ई-मेल ना भेजल जाई।",
-       "noemailprefs": "à¤\87 à¤¸à¥\81विधा à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤\86पन à¤µà¤°à¤¿à¤¯à¤¤à¤¾ à¤®à¥\87à¤\82 à¤\8fà¤\97à¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¦à¤¿à¤¹à¥\80ं।",
-       "emailconfirmlink": "अपना ई-मेल पता कन्फर्म करीं",
-       "invalidemailaddress": "राउर ई-मेल पता स्वीकार करल नइखे जा सकत काहे कि ई-मेल के जउन रुप दिखाई दे रहल बा उ गलत लागत बा।\nकृपया एगो सहि ई-मेल पता उपलब्ध कराईं या उ जगह के खाली छोड़ दिहीं।",
-       "cannotchangeemail": "à¤\87 à¤µà¤¿à¤\95à¥\80 à¤ªà¤° à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¬à¤¦à¤²à¤² à¤¨à¤\88à¤\96à¥\87 à¤\9cा à¤¸à¤\95त।",
-       "emaildisabled": "à¤\87 à¤¸à¤¾à¤\88à¤\9f à¤¸à¥\87 à¤\88-मà¥\87ल à¤¨à¤\88खे भेजल जा सकत।",
-       "accountcreated": "à¤\96ाता à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\88ल",
-       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वारà¥\8dता]]) à¤\96ातिर à¤\96ाता à¤¨à¤¿à¤°à¥\8dमित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¬à¤¾।",
+       "emailauthenticated": "$2 के $3 पर राउर ईमेल पता के पुष्टीकरण हो चुकल बा।",
+       "emailnotauthenticated": "राउर ईमेल पता के अभी तक प्रमाणिकरण नइखे भइल।\nनीचे लिखल कौनों भी सुविधा खातिर रउआ के कौनो भी ईमेल ना भेजल जाई।",
+       "noemailprefs": "à¤\8f à¤¸à¥\81विधा à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤\86पन à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤®à¥\87à¤\82 à¤\8fà¤\97à¥\8b à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤¦à¥\87à¤\88ं।",
+       "emailconfirmlink": "अपना ईमेल पता के पुष्टी करीं",
+       "invalidemailaddress": "राउर ईमेल पता अबैध फॉरमैट में बुझात बा आ स्वीकार नइखे हो सकत।\nसही-फॉरमैट में ईमेल पता देईं या जगह के खाली छोड़ देईं।",
+       "cannotchangeemail": "à¤\8f à¤µà¤¿à¤\95à¥\80 à¤ªà¤° à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤¨à¤¾ à¤¬à¤¦à¤²à¤² à¤\9cा à¤¸à¤\95त à¤¬à¤¾।",
+       "emaildisabled": "à¤\87 à¤¸à¤¾à¤\87à¤\9f à¤¸à¥\87 à¤\88मà¥\87ल à¤¨à¤\87खे भेजल जा सकत।",
+       "accountcreated": "à¤\96ाता à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\87ल",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वारà¥\8dता]]) à¤\96ातिर à¤\96ाता à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल।",
        "createaccount-title": "{{SITENAME}} खातिर खाता बनाईं",
-       "createaccount-text": "राउर ई-मेल पता खातिर {{SITENAME}} ($4) पर \"$2\" सदस्य नाम से \"$3\" गुप्तशब्द (पासवर्ड) सहित खाता खोलले बानी। रउआ खाता में प्रवेश कर के आपन गुप्तशब्द (पासवर्ड) तुरंत बदल लेवे के चाहीं।\n\nयदि इ खाता गलती से खोलल गईल बा, त रउआ इ संदेश के अनदेखा कर सकत बानी।",
-       "login-throttled": "रà¤\89à¤\86 à¤¹à¤¾à¤²à¥\87 à¤®à¥\87à¤\82 à¤\95à¤\88यन à¤¬à¤¾à¤° à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80।\nà¤\95à¥\83पया $1 à¤ªà¥\8dरतिà¤\95à¥\8dषा à¤\95रला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤«à¤¿à¤° à¤¸à¥\87 à¤ªà¥\8dरयास करब।",
-       "login-abort-generic": "राà¤\89र à¤²à¥\89à¤\97िन बिफल रहल - रद्द कइल गइल",
-       "login-migrated-generic": "à¤\86प à¤\95à¥\87 à¤\96ाता à¤®à¤¾à¤\87à¤\97à¥\8dरà¥\87à¤\9f à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\85à¤\89र à¤\86प à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤\87 विकी पर अब मौजूद नइखे।",
+       "createaccount-text": "राउर ईमेल पता खातिर {{SITENAME}} ($4) पर \"$2\" प्रयोगकर्तानाँव से \"$3\" गुप्तशब्द के साथ केहू खाता खोलले बा।\nरउआँ के खाता में प्रवेश कर के आपन गुप्तशब्द तुरंत बदल लेवे के चाहीं।\n\nयदि ई खाता गलती से खोलल गइल बा, त रउआ ए सनेसा के अनदेखा कर सकत बानी।",
+       "login-throttled": "रà¤\89à¤\86 à¤¹à¤¾à¤²à¥\87 à¤®à¥\87à¤\82 à¤\95à¤\87यन à¤¬à¥\87र à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95 à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80।\nà¤\95à¥\83पया $1 à¤\87à¤\82तà¤\9cार à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤«à¤¿à¤° à¤¸à¥\87 à¤\95à¥\8bसिस करब।",
+       "login-abort-generic": "राà¤\89र à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श बिफल रहल - रद्द कइल गइल",
+       "login-migrated-generic": "à¤\86प à¤\95à¥\87 à¤\96ाता à¤®à¤¾à¤\87à¤\97à¥\8dरà¥\87à¤\9f à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\85à¤\89र à¤\86प à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤\8f विकी पर अब मौजूद नइखे।",
        "loginlanguagelabel": "भाषा: $1",
-       "suspicious-userlogout": "राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि  अइसन लग रहल बा कि इ कउनो खराब ब्राउज़र या कैश करे वाली प्रॉक्सी द्वारा भेजल गईल रहल।",
-       "createacct-another-realname-tip": "à¤\85सलà¥\80 à¤¨à¤¾à¤® à¤µà¥\88à¤\95लà¥\8dपिà¤\95 à¤¬à¤¾à¥¤\nयदि à¤°à¤\89à¤\86 à¤\87 à¤\95à¥\87 à¤\89पलबà¥\8dध à¤\95रावà¥\87 à¤\95à¥\87 à¤\9aà¥\81नत à¤¬à¤¾à¤¨à¥\80 à¤¤, à¤\8fà¤\95र à¤ªà¥\8dरयà¥\8bà¤\97 à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤\93à¤\95रा à¤\95ाम à¤\95à¥\87 à¤\85धिà¤\95ार देवे खातिर होखी।",
+       "suspicious-userlogout": "राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि अइसन बुझाता कि ई कौनों खराब ब्राउजर या कशे करे वाली प्रॉक्सी द्वारा भेजल गइल रहल।",
+       "createacct-another-realname-tip": "à¤\85सलà¥\80 à¤¨à¤¾à¤® à¤µà¥\88à¤\95लà¥\8dपिà¤\95 à¤¬à¤¾à¥¤\nà¤\85à¤\97र à¤°à¤\89à¤\86à¤\81 à¤\85सलà¥\80 à¤¨à¤¾à¤\81व à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤¬à¤¿à¤\95लà¥\8dप à¤\9aà¥\81नब, à¤\8fà¤\95र à¤\87सà¥\8dतà¥\87माल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\87 à¤\93à¤\95रा à¤\95ाम à¤\95à¥\87 à¤¶à¥\8dरà¥\87य देवे खातिर होखी।",
        "pt-login": "खाता में प्रवेश",
-       "pt-login-button": "लà¥\89à¤\97 à¤\87न",
-       "pt-login-continue-button": "लà¥\89à¤\97िन जारी राखीं",
+       "pt-login-button": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श",
+       "pt-login-continue-button": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श जारी राखीं",
        "pt-createaccount": "खाता बनाईं",
-       "pt-userlogout": "लà¥\89à¤\97 à¤\86à¤\89à¤\9f",
-       "php-mail-error-unknown": "PHP à¤\95à¥\87 mail() à¤«à¤¼à¤\82à¤\95à¥\8dशन à¤®à¥\87à¤\82 à¤\85à¤\9cà¥\8dà¤\9eात à¤¤à¥\8dरà¥\81à¤\9fि बा।",
-       "user-mail-no-addy": "बिना à¤\95à¤\89नà¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤\88-मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤ªà¥\8dरयतà¥\8dन à¤­à¤\88ल बा।",
-       "user-mail-no-body": "à¤\8fà¤\97à¥\8b à¤\96ालà¥\80 à¤\85थवा à¤¬à¤¹à¥\81त à¤\9bà¥\8bà¤\9f à¤\88-मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤ªà¥\8dरयतà¥\8dन à¤­à¤\88ल बा।",
-       "changepassword": "गुप्त शब्द बदलीं",
-       "resetpass_announce": "लà¥\89à¤\97 à¤\87न à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रà¥\87 à¤\96ातिर à¤°à¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤¹à¥\8bà¤\88।",
+       "pt-userlogout": "à¤\96ाता à¤¸à¥\87 à¤¬à¤¾à¤¹à¤°",
+       "php-mail-error-unknown": "PHP à¤\95à¥\87 mail() à¤«à¤\82à¤\95à¥\8dशन à¤®à¥\87à¤\82 à¤¨à¤¾à¤®à¤¾à¤²à¥\82म à¤\97ड़बड़à¥\80 बा।",
+       "user-mail-no-addy": "बिना à¤\95à¥\8cनà¥\8b à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤\88मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤\95à¥\8bसिस à¤­à¤\87ल बा।",
+       "user-mail-no-body": "à¤\8fà¤\97à¥\8b à¤\96ालà¥\80 à¤¯à¤¾ à¤¬à¤¹à¥\81त à¤\9bà¥\8bà¤\9f à¤\88मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤\95à¥\8bसिस à¤­à¤\87ल बा।",
+       "changepassword": "गुप्तशब्द बदलीं",
+       "resetpass_announce": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤ªà¥\82रा à¤\95रà¥\87 à¤\96ातिर à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80।",
        "resetpass_header": "खाता के गुप्तशब्द बदलीं",
-       "oldpassword": "पुराना गुप्त-शब्द:",
-       "newpassword": "नया गुप्त-शब्द:",
-       "retypenew": "नया गुप्त-शब्द पुन: डालीं:",
+       "oldpassword": "पुरान गुप्तशब्द:",
+       "newpassword": "नया गुप्तशब्द:",
+       "retypenew": "नया गुप्तशब्द फिर डालीं:",
        "resetpass_submit": "गुप्तशब्द बनाईं आ खाता में प्रवेश करीं",
-       "changepassword-success": "राà¤\89र à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड बदल दिहल गइल बा!",
-       "changepassword-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
+       "changepassword-success": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद बदल दिहल गइल बा!",
+       "changepassword-throttled": "रउआँ हाले में कइयन बेर खाता में प्रवेश करे के कोसिस क चुकल बानी।\nकृपया $1 इंतजार के बाद फिर से कोसिस करब।",
        "botpasswords": "बॉट पासवर्ड",
+       "botpasswords-summary": "<em>बॉट पासवर्ड</em> खाता के मुख्य प्रवेश-पहिचान-जानकारी के बिना, सीधे एपीआई के माध्यम से खाता ले पहुँच देवे लें। बॉट पासवर्ड दे के खाता में प्रवेश के बाद खाता के प्रयोगकर्ता अधिकार कुछ सीमित हो सकेला।\n\nअगर आपके ई नइखे मालूम कि ई करे के आपके का जरूरत बा, साइद आपके ई ना करे के चाहीं। केहू भी रउवाँ से कबो ई पासवर्ड जनरेट करे के ना कही न आपसे ई पासवर्ड माँगी।",
        "botpasswords-disabled": "बॉट पासवर्ड अक्षम कइल गइल बा।",
        "botpasswords-no-central-id": "बॉट पासवर्ड के प्रयोग करे खातिर आपके सेंट्रलाइज्ड खाता से लॉगिन होखल जरूरी बा।",
        "botpasswords-existing": "मौजूद बॉट पासवर्ड",
        "botpasswords-deleted-title": "बॉट पासवर्ड मिटावल गइल",
        "botpasswords-deleted-body": "प्रयोगकर्ता \"$2\" के बॉट नाँव \"$1\" खातिर बॉट पासवर्ड मिटावल गइल।",
        "resetpass_forbidden": "गुप्तशब्द बदलल नइखे जा सकत",
-       "resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
-       "resetpass-submit-loggedin": "गुप्त शब्द बदलीं",
+       "resetpass_forbidden-reason": "गुप्तशब्द बदलल नइखे जा सकत:$1",
+       "resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआँ के पहिले खाता में प्रवेश करे के पड़ी।",
+       "resetpass-submit-loggedin": "गुप्तशब्द बदलीं",
        "resetpass-submit-cancel": "रद्द करीं",
-       "resetpass-wrong-oldpass": "à¤\85वà¥\88दà¥\8dय à¤\85सà¥\8dथायà¥\80 à¤¯à¤¾ à¤µà¤°à¥\8dतमान à¤\97à¥\81पà¥\8dतशबà¥\8dद।\nरà¤\89à¤\86 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¹à¤¿à¤\82 à¤¸à¤«à¤²à¤¤à¤¾à¤ªà¥\82रà¥\8dवà¤\95 à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤² à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80, à¤¯à¤¾ à¤°à¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤\85नà¥\81रà¥\8bध à¤\95à¤\87लà¥\87 à¤¹à¥\8bà¤\96ब।",
+       "resetpass-wrong-oldpass": "à¤\85बà¥\88ध à¤\85सà¥\8dथायà¥\80 à¤¯à¤¾ à¤µà¤°à¥\8dतमान à¤\97à¥\81पà¥\8dतशबà¥\8dद।\nरà¤\89à¤\86 à¤ªà¤¹à¤¿à¤²à¤¹à¥\80à¤\82 à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤² à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80, à¤¯à¤¾ à¤°à¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤\85नà¥\81रà¥\8bध à¤\95à¤\87लà¥\87 à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।",
        "resetpass-recycled": "रीसेट करे खातिर नया पासवर्ड में कृपया आपन वर्तमान पासवर्ड के अलावा कौनो अन्य पासवर्ड के प्रयोग करीं।",
-       "resetpass-temp-emailed": "à¤\85सà¥\8dथाà¤\88 à¤\88मà¥\87ल à¤\95à¥\8bड à¤\95à¥\87 à¤¦à¥\8dवारा à¤°à¤\89à¤\86 à¤²à¥\89à¤\97 à¤\87न à¤­à¤\87ल à¤¬à¤¾à¤¨à¥\80।\nलà¥\89à¤\97 à¤\87न à¤ªà¥\82रा à¤\95रà¥\87 à¤\96ातिर, à¤°à¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड सेट करे के पड़ी:",
+       "resetpass-temp-emailed": "à¤\85सà¥\8dथाà¤\88 à¤\88मà¥\87ल à¤\95à¥\8bड à¤\95à¥\87 à¤¦à¥\8dवारा à¤°à¤\89à¤\86 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80।\nà¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤ªà¥\82रा à¤\95रà¥\87 à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद सेट करे के पड़ी:",
        "resetpass-temp-password": "अस्थायी गुप्तशब्द:",
-       "resetpass-abort-generic": "à¤\95à¤\89नà¥\8b à¤\8fà¤\95à¥\8dसà¤\9fà¥\87à¤\82शन à¤¦à¥\8dवारा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल बा।",
-       "resetpass-expired": "राà¤\89र à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\80 à¤µà¥\88धता à¤\85वधि à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤ à¤\95à¥\83पया à¤²à¥\89à¤\97 à¤\87न à¤\95रà¥\87 à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड सेट करीं।",
-       "resetpass-expired-soft": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85मानà¥\8dय à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\87 à¤\95à¥\87 à¤ªà¥\81नà¤\83 à¤¸à¥\8dथापित à¤\95रà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80। à¤\95à¥\83पया à¤\85भà¥\80 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\80à¤\82 à¤¯à¤¾ \"{{int:authprovider-resetpass-skip-label}}\" à¤ªà¤° à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤ªà¥\81नà¤\83 à¤¸à¥\8dथापित à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।",
-       "resetpass-validity-soft": "राà¤\89र à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤®à¤¾à¤¨à¥\8dय à¤¨à¤\88à¤\96à¥\87: $1 \n\nà¤\95à¥\83पया à¤\85ब à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\9aà¥\81नà¥\80à¤\82, à¤¯à¤¾ à¤\89 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\87 à¤\96ातिर \"{{int:authprovider-resetpass-skip-label}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रà¥\80à¤\82।",
-       "passwordreset": "गुप्तशब्द (पासवर्ड) रिसेट करीं",
-       "passwordreset-text-one": "à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\87 à¤\96ातिर à¤\87 à¤«à¥\89रà¥\8dम भरीं।",
-       "passwordreset-text-many": "{{PLURAL:$1|à¤\88मà¥\87ल à¤¦à¥\8dवारा à¤\85सà¥\8dथाà¤\88 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤¾à¤µà¥\87 à¤\96ातिर à¤¨à¤¿à¤®à¥\8dन à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\95à¤\89नो एगो स्थान भरीं।}}",
-       "passwordreset-disabled": "à¤\87 à¤µà¤¿à¤\95à¥\80 à¤ªà¤° à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\85à¤\95à¥\8dषम बा।",
-       "passwordreset-emaildisabled": "à¤\87 à¤µà¤¿à¤\95ि à¤ªà¤° à¤\88-मà¥\87ल à¤¸à¥\81विधा à¤\85à¤\95à¥\8dषम à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल बा।",
-       "passwordreset-username": "प्रयोगकर्ता नाम",
+       "resetpass-abort-generic": "à¤\95à¤\89नà¥\8b à¤\8fà¤\95à¥\8dसà¤\9fà¥\87à¤\82शन à¤¦à¥\8dवारा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल बा।",
+       "resetpass-expired": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤µà¥\88धता à¤¸à¤®à¤¯ à¤\96तम à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤ à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद सेट करीं।",
+       "resetpass-expired-soft": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\96तम à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\86 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤\9cरà¥\82रत à¤¬à¤¾à¥¤ à¤\85बà¥\8dबà¥\87 à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\80à¤\82, à¤¯à¤¾ à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤\95à¥\8dलिà¤\95 à¤\95रà¥\80à¤\82 \"{{int:authprovider-resetpass-skip-label}}\"।",
+       "resetpass-validity-soft": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤®à¤¾à¤¨à¥\8dय à¤¨à¤\87à¤\96à¥\87: $1 \n\nà¤\85ब à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\80à¤\82, à¤¯à¤¾ \"{{int:authprovider-resetpass-skip-label}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रà¥\80à¤\82 à¤\85à¤\97र à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤¹à¥\8bà¤\96à¥\87।",
+       "passwordreset": "गुप्तशब्द रिसेट करीं",
+       "passwordreset-text-one": "à¤\88मà¥\87ल à¤¸à¥\87 à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤ªà¤¾à¤µà¥\87 à¤\96ातिर à¤\88 à¤«à¤¾à¤°म भरीं।",
+       "passwordreset-text-many": "{{PLURAL:$1|à¤\88मà¥\87ल à¤¦à¥\8dवारा à¤\85सà¥\8dथाà¤\88 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤¾à¤µà¥\87 à¤\96ातिर à¤¨à¥\80à¤\9aà¥\87 à¤\95à¥\87 à¤\95à¥\8cनो एगो स्थान भरीं।}}",
+       "passwordreset-disabled": "à¤\8f à¤µà¤¿à¤\95ि à¤ªà¤° à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤²à¤² à¤\85à¤\95à¥\8dषम à¤\95à¤\87ल à¤\97à¤\87ल बा।",
+       "passwordreset-emaildisabled": "à¤\8f à¤µà¤¿à¤\95ि à¤ªà¤° à¤\88मà¥\87ल à¤¸à¥\81बिधा à¤\85à¤\95à¥\8dषम à¤\95à¤\87ल à¤\97à¤\87ल बा।",
+       "passwordreset-username": "प्रयोगकर्तानाँव:",
        "passwordreset-domain": "डोमेन:",
-       "passwordreset-capture": "परिणामस्वरूप बनल ई-मेल देखब?",
-       "passwordreset-capture-help": "अगर रउआ इ चेकबॉक्स पर टिक करत बानी त ई-मेल (अस्थायी गुप्तशब्द के साथ) रउआ के दिखावल जाई आ सदस्य के भेजल भी जाई।",
-       "passwordreset-email": "ई-मेल पता:",
+       "passwordreset-email": "ईमेल पता:",
        "passwordreset-emailtitle": "{{SITENAME}} पर खाता विवरण",
-       "passwordreset-emailtext-ip": "केहु (शायद रउए, $1 आइ॰पी पता से) {{SITENAME}} ($4) पर आपन {{PLURAL:$3|गुप्तशब्द}} के रीसेट करे के अनुरोध कईले बानी। इ ई-मेल पता से निम्न {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी। रउआ खाता में प्रवेश करके एगो नया गुप्तशब्द अभी चुन लेवे के चाहीं। यदि इ अनुरोध केहु अउर कइले बा, या फिर रउआ आपन मूल गुप्तशब्द याद आ गईल बा, अउर आप {{PLURAL:$3|आपन}} गुप्तशब्द नइखी बदले के चाहत त, रउआ इ संदेश के अनदेखा कर के आपन पुरानका गुप्तशब्द के प्रयोग जारी रख सकत बानी।",
-       "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 राउर {{PLURAL:$3|खाता}} के गुप्तशब्द के पुनर्स्थापित करे के अनुरोध कइले बानी। इ ई-मेल पता से निम्न {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी।\nरउआ खाता में प्रवेश करके एगो नया गुप्तशब्द अभीये चुन लेवे के चाहीं। यदि इ अनुरोध केहु अउर कइले बा, या फिर रउआ आपन मूल गुप्तशब्द याद आ गईल बा, अउर रउआ {{PLURAL:$3|आपन}} गुप्तशब्द नईखीं बदले के चाहत त, रउआ इ संदेश के अनदेखा कर के आपन पुरनका गुप्तशब्द के प्रयोग जारी रख सकत बानीं।",
-       "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
-       "passwordreset-emailsentemail": "एगो गुप्तशब्द रिसेट ई-मेल भेजल जा चुकल बा।",
+       "passwordreset-emailtext-ip": "केहु (शायद रउए, $1 आइपी पता से) {{SITENAME}} ($4) पर आपन {{PLURAL:$3|गुप्तशब्द}} के रीसेट करे के अनुरोध कइले बा। ए ईमेल पता से नीचे दिहल {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी। रउआँ के खाता में प्रवेश क के एगो नया गुप्तशब्द अब्बे चुन लेवे के चाहीं। यदि ई अनुरोध केहु अउर कइले बा, या फिर रउआँ के आपन मूल गुप्तशब्द इयाद आ गइल बा, आ आप {{PLURAL:$3|आपन}} गुप्तशब्द नइखीं बदलल चाहत त ए सनेसा के अनदेखा क के आपन पुरानका गुप्तशब्द के प्रयोग जारी रख सकत बानी।",
+       "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 राउर {{PLURAL:$3|खाता}} के गुप्तशब्द के पुनर्स्थापित करे के अनुरोध कइले बानी। ए ईमेल पता से नीचे दिहल {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी।\nरउआँ के खाता में प्रवेश करके एगो नया गुप्तशब्द अब्बे चुन लेवे के चाहीं। यदि ई अनुरोध केहु अउर कइले बा, या फिर रउआँ के आपन मूल गुप्तशब्द इयाद आ गइल बा, आ रउआँ {{PLURAL:$3|आपन}} गुप्तशब्द नइखीं बदलल चाहत त ए सनेसा के अनदेखा क के आपन पुरनका गुप्तशब्द के प्रयोग जारी रख सकत बानीं।",
+       "passwordreset-emailelement": "प्रयोगकर्तानाँव: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
+       "passwordreset-emailsentemail": "अगर दिहल गइल ईमेल पता आपके खाता के साथ जुड़ल होखी, गुप्तशब्द दुबारा सेट करे खातिर एक ठो ईमेल भेज दिहल जाई।",
+       "passwordreset-emailsentusername": "अगर एह प्रयोगकर्तानाँव के साथ कौनों ईमेल जुड़ल होखी, गुप्तशब्द बदले खातिर एक ठो ईमेल भेज दिहल जाई।",
+       "passwordreset-nocaller": "एक ठो काल करे वाला दिहल जरूरी बाटे",
+       "passwordreset-nosuchcaller": "काल करे वाला मौजूद नइखे:$1",
+       "passwordreset-ignored": "गुप्तशब्द दुबारा सेट कइले के हैंडिल ना कइल गइल। शाइत केहू उपलब्ध करावे वाला ना बुझाइल?",
        "passwordreset-invalidemail": "अवैध ईमेल पता",
-       "changeemail": "ई-मेल पता बदलीं",
-       "changeemail-header": "खाता के ई-मेल पता बदलीं",
+       "passwordreset-nodata": "प्रयोगकर्ता नाँव या ई मेल कुच्छू ना दिहल गइल रहल",
+       "changeemail": "ईमेल पता बदलीं या हटाईं",
+       "changeemail-header": "आपन ईमेल पता बदले खातिर ई फार्म भरीं। अगर आप अपना खाता से जुड़ल ईमेल हटावल चाहत बानी, तब नया ईमेल वाला बिकल्प के फार्म में खाली छोड़ देईं।",
        "changeemail-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
        "changeemail-oldemail": "वर्तमान ई-मेल पता:",
-       "changeemail-newemail": "नया ई-मेल पता:",
-       "changeemail-none": "(कउनो नाहीं)",
+       "changeemail-newemail": "नया ईमेल पता:",
+       "changeemail-newemail-help": "ई बिकल्प के खाली तबे छोड़ल जाय जब आप आपन ईमेल खाता से हटावल चाहत होखीं। एकरा बाद आपन भुलाइल पासवर्ड बदले खातिर ईमेल ना माँग पाइब, न एह विकि से कौनों ईमेल आपके भेजल जा पाई अगर आप आपन ईमेल पता इहाँ से हटा देइब।",
+       "changeemail-none": "(कौनो ना)",
        "changeemail-password": "राउर {{SITENAME}} गुप्तशब्द:",
-       "changeemail-submit": "ई-मेल बदलीं",
-       "changeemail-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
+       "changeemail-submit": "ईमेल बदलीं",
+       "changeemail-throttled": "रउआँ हाले में कइयन बेर खाता में प्रवेश करे के कोसिस क चुकल बानी।\nकृपया $1 इंतजार के बाद फिर से कोसिस करब।",
+       "changeemail-nochange": "इहाँ एक ठो दूसर ईमेल भरीं।",
        "resettokens": "टोकन रीसेट करीं",
-       "resettokens-text": "à¤\9cà¥\8cन à¤\9fà¥\8bà¤\95न à¤°à¤¾à¤\89र à¤\96ाता à¤¸à¥\87 à¤¸à¤®à¥\8dबदà¥\8dध à¤\95à¥\81à¤\9b à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80 à¤ªà¥\8dरदान à¤\95रà¥\87ला, à¤\86प à¤\89 à¤\95à¥\87 à¤\85हिà¤\9cा à¤°à¥\80सà¥\87à¤\9f à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।\n\nयदि à¤°à¤\89à¤\86 à¤\88 à¤\95à¥\87 à¤\97लतà¥\80 à¤¸à¥\87 à¤\95à¥\87हà¥\82 à¤\95à¥\87 à¤¦à¤¿à¤\96ा à¤¦à¥\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤¾à¤\89र à¤\96ाता à¤¹à¥\88à¤\95 à¤¹à¥\8b à¤\97à¤\88ल à¤¬à¤¾ à¤¤ à¤°à¤\89à¤\86 à¤\88 के रीसेट कर देवे के चाहीं।",
+       "resettokens-text": "à¤\9cà¥\8cन à¤\9fà¥\8bà¤\95न à¤°à¤¾à¤\89र à¤\96ाता à¤¸à¥\87 à¤¸à¤®à¥\8dबदà¥\8dध à¤\95à¥\81à¤\9b à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80 à¤ªà¥\8dरदान à¤\95रà¥\87ला, à¤\86प à¤\87नहन à¤\95à¥\87 à¤\8fहिà¤\9cा à¤°à¥\80सà¥\87à¤\9f à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।\n\nयदि à¤°à¤\89à¤\86à¤\81 à¤\8fà¤\95रा à¤\95à¥\87 à¤\97लतà¥\80 à¤¸à¥\87 à¤\95à¥\87हà¥\82 à¤\95à¥\87 à¤¦à¥\87à¤\96ा à¤¦à¥\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤¾à¤\89र à¤\96ाता à¤¹à¥\88à¤\95 à¤¹à¥\8b à¤\97à¤\87ल à¤¬à¤¾ à¤¤ à¤\8fà¤\95रा के रीसेट कर देवे के चाहीं।",
        "resettokens-no-tokens": "रीसेट करे खातिर कउनो टोकन नइखे।",
        "resettokens-tokens": "टोकन:",
-       "resettokens-token-label": "$1 (वरà¥\8dतमान à¤®à¥\82लà¥\8dय: $2)",
-       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पà¤\95à¥\87 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤ªà¤¨à¥\8dनन à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µà¤¸à¤­]] à¤\95à¥\87 à¤µà¥\87ब à¤«à¤¼à¥\80ड (Atom/RSS) à¤¹à¥\87तà¥\81 टोकन",
+       "resettokens-token-label": "$1 (वरà¥\8dतमान à¤µà¥\88लà¥\8dयà¥\82: $2)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पà¤\95à¥\87 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤ªà¤¨à¥\8dनन à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µà¤¸à¤­]] à¤\95à¥\87 à¤µà¥\87ब à¤«à¥\80ड (à¤\8fà¤\9fम/à¤\86रà¤\8dसà¤\8dस) à¤\96ातिर टोकन",
        "resettokens-done": "टोकन रीसेट हो चुकल बा।",
        "resettokens-resetbutton": "चुनल गइल टोकन रीसेट करीं",
        "bold_sample": "मोट अच्छर में",
        "media_tip": "फाइल कड़ी",
        "sig_tip": "समय मोहर की संघे राउर दस्खत",
        "hr_tip": "पड़ी लकीर (कम प्रयोग करीं)",
-       "summary": "à¤\9bà¥\8bà¤\9f à¤µà¤¿à¤µà¤°à¤£ (साराà¤\82श):",
+       "summary": "साराà¤\82श:",
        "subject": "बिसय:",
        "minoredit": "छोट परिवर्तन",
        "watchthis": "धियानसूची में डालीं",
        "savechanges": "बदलाव सहेजीं",
        "publishpage": "पन्ना प्रकाशित करीं",
        "publishchanges": "बदलाव प्रकाशित करीं",
-       "preview": "पà¥\82रà¥\8dवावलà¥\8bà¤\95न",
+       "preview": "à¤\9dलà¤\95",
        "showpreview": "झलक देखीं",
        "showdiff": "बदलाव देखीं",
-       "blankarticle": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\97à¥\8b à¤\96ालà¥\80 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¨à¤¾à¤µà¥\87 à¤\9cा à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nयदि à¤\86प \"{{int:savearticle}}\" à¤\95à¥\87 à¤«à¥\87र à¤¸à¥\87 à¤¦à¤¬à¤¾à¤¯à¥\87ब à¤¤ à¤ªà¤¨à¥\8dना à¤¬à¤¿à¤¨à¤¾ à¤\95à¤\89नà¥\8b à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95à¥\87 à¤¬à¤¨ à¤\9cाà¤\88।",
-       "anoneditwarning": "<strong>चेतावनी:</strong> रउआ आपन खाता में प्रवेश नइखीं कइले। अगर रउआ कौनों बदलाव करत बानी त राउर आईपी पता दर्ज होई। अगर रउआ <strong>[$1 लॉग इन]</strong> या <strong>[$2 नया खाता बनाइब]</strong> त, अउरी सुबिधा सब की संघे राउर संपादन के श्रेय भी राउर सदस्य-नाँव से जुड़ जाई!",
-       "anonpreviewwarning": "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
-       "missingsummary": "'''सà¥\8dमरणपतà¥\8dर:'''रà¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤¨à¤\88à¤\96à¥\80à¤\82 à¤ªà¥\8dरदान à¤\95à¤\88लà¥\87। à¤\85à¤\97र à¤°à¤\89à¤\86 \"फिर à¤¸à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95रà¥\80à¤\82\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रà¥\87ब, à¤¤ à¤°à¤¾à¤\89र à¤¸à¤®à¥\8dपादन à¤¬à¤¿à¤¨à¤¾ à¤\8fà¤\97à¥\8b à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\8b जाई।",
-       "selfredirect": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\96à¥\81द à¤\95à¥\87 à¤\87 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤ªà¥\81नà¤\83 à¤¨à¤¿à¤°à¥\8dदà¥\87शित à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nà¤\86प à¤\85नà¥\81पà¥\8dरà¥\87षित à¤\96ातिर à¤\97लत à¤²à¤\95à¥\8dषà¥\8dय à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80, à¤¯à¤¾ à¤\86प à¤\95à¥\87 à¤¦à¥\8dवारा à¤\97लत à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾à¥¤\nà¤\86प à¤¯à¤¦à¤¿ à¤«à¥\87र à¤¸à¥\87 \"{{int:savearticle}}\" à¤\95à¥\8dलिà¤\95 à¤\95रत à¤¬à¤¾à¤¨à¥\80 à¤¤, à¤ªà¥\81न: à¤¨à¤¿à¤°à¥\8dदà¥\87षण à¤\93à¤\87सहà¥\81 à¤¬à¤¨à¤¾à¤µल जाई।",
-       "missingcommenttext": "à¤\95à¥\83पया à¤¨à¤¿à¤\9aà¥\87 à¤\8fà¤\97à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤\95रीं।",
+       "blankarticle": "<strong>चेतावनी:</strong> आप एगो खाली पन्ना बनावे जा रहल बानी।\nयदि आप \"{{int:savearticle}}\" के फेर से दबायेब त पन्ना बिना कउनो सामग्री के बन जाई।",
+       "anoneditwarning": "<strong>चेतावनी:</strong> रउआँ आपन खाता में प्रवेश नइखीं कइले। अगर रउआँ कौनों बदलाव करब त राउर आईपी पता सभके लउकी। अगर रउआ <strong>[$1 खाता में प्रवेश करब]</strong> या <strong>[$2 नया खाता बनाइब]</strong> त, अउरी सुबिधा सब की संघे राउर संपादन के श्रेय भी राउर प्रयोगकर्तानाँव के मिली!",
+       "anonpreviewwarning": "''रउआँ खाता में प्रवेश नइखीं भइल। सहेजब तब ए पन्ना के संपादन इतिहास में राउर आईपी पता दर्ज हो जाई।\"",
+       "missingsummary": "'''याद à¤¦à¤¿à¤¯à¤¾à¤µà¤² à¤\9cात à¤¬à¤¾:'''रà¤\89à¤\86à¤\81 à¤\8fà¤\97à¥\8b à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤\87à¤\96à¥\80à¤\82 à¤¦à¤¿à¤¹à¤²à¥\87। à¤\85à¤\97र à¤«à¤¿à¤° \"{{int:savearticle}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रब, à¤¤ à¤°à¤¾à¤\89र à¤¸à¤\82पादन à¤\8fà¤\95रà¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cा जाई।",
+       "selfredirect": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤\96à¥\81दà¥\87 à¤\8fहà¥\80 à¤ªà¤° à¤\85नà¥\81पà¥\8dरà¥\87षण à¤\95 à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nया à¤¤ à¤\86प à¤\85नà¥\81पà¥\8dरà¥\87षण à¤\96ातिर à¤\97लत à¤²à¤\95à¥\8dषà¥\8dय à¤¦à¥\87त à¤¬à¤¾à¤¨à¥\80, à¤¯à¤¾ à¤\86प à¤\97लत à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\95रत à¤¬à¤¾à¤¨à¥\80।\nà¤\8fà¤\95 à¤¬à¥\87र à¤\85à¤\89रà¥\80 \"{{int:savearticle}}\" à¤\95à¥\8dलिà¤\95 à¤\95रब à¤¤, à¤\93à¤\87सहà¥\82à¤\81 à¤\88 à¤\85नà¥\81पà¥\8dरà¥\87षण à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹ल जाई।",
+       "missingcommenttext": "नà¥\80à¤\9aà¥\87 à¤\8fà¤\97à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤­रीं।",
        "missingcommentheader": "'''याद दियावल जात बा:''' रउआँ एह कमेंट खातिर कौनों बिसय नइखीं दिहले। अगर आप \"{{int:savearticle}}\" पर क्लिक करब तब राउर संपादन एकरे बिना सहेजा जाई।",
-       "summary-preview": "साराà¤\82श à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न:",
+       "summary-preview": "साराà¤\82श à¤\9dलà¤\95:",
        "subject-preview": "बिसय के झलक:",
-       "previewerrortext": "à¤\9cब à¤\86प à¤\86पन à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤ªà¥\81रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96à¥\87 à¤\96ातिर à¤ªà¥\8dरयास à¤\95à¤\87नà¥\80 à¤¹ à¤¤à¤µà¤¨à¥\87 à¤\98ड़à¥\80 à¤\8fà¤\97à¥\8b à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\89तà¥\8dपनà¥\8dन à¤¹à¥\8b à¤\97à¤\87ल à¤¬à¤¾।",
-       "blockedtitle": "निषà¥\8dà¤\95à¥\8dरिय à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता",
+       "previewerrortext": "राà¤\89र à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96ावà¥\87 à¤\95à¥\87 à¤\95à¥\8bसिस à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95à¥\81à¤\9b à¤\97ड़बड़à¥\80 à¤¹à¥\8b à¤\97à¤\87ल।",
+       "blockedtitle": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬ा",
        "blockedtext": "'''राउर सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिहल गईल बा ।'''\n\nअवरोध $1 द्वारा करल गईल रहल।\nअवरोध के कारण बा ''$2''\n\n* अवरोध के आरंभ: $8\n* अवरोध के समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइ अवरोध के बारे में चर्चा करे खातिर रउआ $1 या केहु अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकत बानी।\nअगर रउआ [[Special:Preferences|आपन वरीयता]] में वैद्य ई-मेल पता प्रविष्ट कइले होखब तबे 'इ प्रयोक्ता के ई-मेल भेजीं' वाला सुविधा के प्रयोग कर सकत बानी अउर रउआ एकर प्रयोग करे से ना रोकल गईल होखे।\nराउर हाल के आइ॰पी पता $3 ह अउर अवरोध क्रमांक #$5 ह।\nआपन कउनो भी प्रश्न में कृपया इ सब जानकारी भी शामिल करब।",
        "autoblockedtext": "राउर आइ॰पी पता अपने आप अवरुद्ध हो गईल बा काहे कि एकर प्रयोग केहु अन्य सदस्य द्वारा होत रहल,\nजे $1 द्वारा अवरोधित करल गईल रहलन। \nअवरोध करे के कारण बा:\n\n:''$2''\n\n* अवरोध प्रारंभ: $8\n* अवरोध समाप्ति: $6\n* अवरोधित सदस्य: $7\n\nअवरोध के चर्चा करे खातिर रउआ $1 या केहु अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबंधक]] से संपर्क कर सकत बानी।\n\nकृपया ध्यान रहे कि यदि रउआ \"इ सदस्य के ई-मेल भेजीं\" वाला सुविधा के प्रयोग करे के चाहत बानी त राउर [[Special:Preferences|वरीयता]] में वैद्य ई-मेल पता होखे के चाहीं अउर एकर प्रयोग रउआ खातिर अवरोधित ना भईल होखे।\n\nराउर हाल के आइ॰पी पता $3 ह अउर अवरोध क्रमांक #$5 ह।\nआपन कउनो भी प्रश्न में कृपया इ सब जानकारी शामिल करब।",
+       "systemblockedtext": "राउर खाता या आइपी पता के मीडियाविकि द्वारा ऑटोमेटिक रूप से रोक दिहल गइल बा।\nएकरा खातिर कारण दिहल गइल बा:\n\n\n:<em>$2</em>\n\n* रोक के सुरुआत: $8\n* रोक समाप्त होखी: $6\n* रोक लगावे वाला: $7\n\nराउर वर्तमान आइपी पता $3 बा।\nअगर कौनों सवाल करीं तब ऊपर बतावल सगरी जानकारी देईं।",
        "blockednoreason": "कउनो कारण उल्लेखित नईखे",
        "whitelistedittext": "रउआ पन्ना सम्पादन करे खातिर $1 करे के पड़ी।",
        "confirmedittext": "संपादन करे से पहिले आपके अापना ई-मेल पता प्रमाणित करावल जरुरी बा।\nकृपया आपन [[Special:Preferences|राउर पसन्द]] में जाके अापन ई-मेल पता दिहीं अउर उके प्रमाणित करीं।",
        "accmailtext": "[[User talk:$1|$1]] खातिर एगो यंत्र जनित गुप्तशब्द $2 के भेज दिहल गइल बा। खाता में प्रवेश कइला के बाद इ '''[[Special:ChangePassword|गुप्तशब्द बदल लीं]]'' वाला पन्ना पर बदलल जा सकत बा।",
        "newarticle": "(नया)",
        "newarticletext": "रउआ एगो अइसन कड़ी के पन्ना के अनुसरण कइले बानी जवन अभी तक उपलब्ध नइखे।\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}}}} या संबंधित लॉग खोज सकत बानी]</span>, बाकी रउआ के ई पन्ना बनावे के परमीशन नइखे।",
        "noarticletext-nopermission": "ए पन्ना मे अभी कौनों सामग्री नइखे।\nरउआँ दुसरा पन्ना में [[Special:Search/{{PAGENAME}}|ए टाइटिल के खोज]] कर सकत बानीं,\nया <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कृपया जाँच लीं कि आप इ पन्ना संपादित अथवा निर्मित करे के चाहत बानी कि ना।",
        "userpage-userdoesnotexist-view": "सदस्य खाता \"$1\" पंजीकृत नईखे भईल।",
        "blocked-notice-logextract": "ई प्रयोगकर्ता के ई समय निष्क्रीय कर दिहल गईल बा।\nनविनतम नष्ट लौग प्रविष्टी उद्धरण खातिर निचे दिहल बा:",
-       "clearyourcache": "'''ध्यान दिं:'''  पन्ना सुरक्षित कइला के बाद बदलाव देखे खातिर आपके आपन ब्राउज़र के कैश खाली करे के पड़ सकत बा।\n* '''फ़ायरफ़ॉक्स / सफ़ारी:''' ''Reload'' (रीलोड) दबाते समय ''Shift'' (शिफ़्ट) दबा के रखीं, या फिर ''Ctrl-F5'' (कंट्रोल-F5) या ''Ctrl-R'' (कंट्रोल-R) दबाईं (मैक पर ''⌘-R'')\n* '''गूगल क्रोम:''' ''Ctrl-Shift-R'' (कंट्रोल-शिफ़्ट-R) दबाईं (मैक पर ''⌘-Shift-R'')\n* '''इन्टर्नेट एक्सप्लोरर:''' ''Ctrl'' (कंट्रोल) दबाके ''Refresh'' (रिफ़्रेश) करीं या ''Ctrl-F5'' (कंट्रोल-F5) दबाईं\n* '''ऑपेरा:''' ''Tools → Preferences'' (उपकरण → पसन्द) में कैश साफ़ करीं",
+       "clearyourcache": "<strong>नोट:</strong> सहेजे के बाद, बदलाव देखे खातिर आपके अपने ब्राउजर के कैशे खाली करे के पड़ सकत बा।\n* <strong>फायरफॉक्स / सफारी:</strong><em>शिफ्ट</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>Menu → Settings</em> में जाईं (मैक में <em>Opera → Preferences</em>) आ एकरे बाद <em>Privacy & security → Clear browsing data → Cached images and files</em> क्लिक करीं।",
        "usercssyoucanpreview": "<strong>टिप:</strong> आपन नया CSS के टेस्ट करे खातिर सहेजे से पहिले \"{{int:showpreview}}\" बटन के प्रयोग करीं।",
        "userjsyoucanpreview": "<strong>टिप:</strong> आपन नया जावास्क्रिप्ट के टेस्ट करे खातिर सहेजे से पहिले \"{{int:showpreview}}\" बटन के प्रयोग करीं।",
        "usercsspreview": "<strong>याद रहे की आप अपनी सदस्य CSS के खाली नमूना भर देखत बानी।\nई अबहिन ले सहेजल ना गइल बाटे।</strong>",
        "continue-editing": "संपादन क्षेत्र में जाईं",
        "previewconflict": "ई नमूना ई देखावत बा की अगर रउआँ ए संपादन बक्सा में मौजूद पाठ के सहेजब त ऊ कइसन देखाई पड़ी।",
        "session_fail_preview": "माफ करीं! एह सत्र के आँकड़ा के गायब हो गइला के कारण आपके संपादन के प्रॉसेस करे में हमनी के असमर्थ बानी जा।\nहो सकेला आप लॉगआउट हो गइल होखीं।\n<strong>जाँच लेईं कि आप अभी लॉगिन बानी आ दुबारा कोसिस करीं</strong>।\nअगर तबो काम ना होखे तब [[Special:UserLogout|लॉगआउट कइके]] आ दोबारा लॉग इन कइ के कोसिस करी, आ जाँच करीं कि आपके ब्राउजर एह साइट से कुकीज सभ के मंजूर करत बा।",
-       "session_fail_preview_html": "<strong>माफ à¤\95रà¥\80à¤\82! à¤¸à¤¤à¥\8dर à¤\86à¤\81à¤\95ड़ा à¤\95à¥\87 à¤\97ायब à¤¹à¥\8bà¤\96ला à¤\95à¥\80 à¤\95ारन à¤\86पà¤\95à¥\87 à¤¸à¤\82पादन à¤¸à¤¹à¥\87à¤\9cल à¤¨à¤\87à¤\96à¥\87 à¤\9cा à¤¸à¤\95त।</strong>\n\n<em>à¤\9aà¥\82à¤\81à¤\95ि, {{SITENAME}} à¤®à¥\87à¤\82 à¤®à¥\82ल HTML à¤¸à¤\95à¥\8dषम à¤\95à¤\87ल à¤¬à¤¾à¤\9fà¥\87, à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤¹à¤®à¤²à¤¾ à¤¸à¥\87 à¤¬à¤\9aाव à¤\95à¥\80 à¤\96ातिर à¤¨à¤®à¥\82ना à¤¦à¥\87à¤\96ावà¥\87 à¤\95à¥\87 à¤\9bिपावल à¤\97à¤\87ल à¤¬à¤¾à¥¤</em>\n\n<strong>à¤\85à¤\97र à¤\88 à¤\8fà¤\97à¥\8b à¤µà¥\88ध à¤¸à¤\82पादन à¤¬à¤¾à¤\9fà¥\87 à¤¤à¤¬ à¤\8fà¤\95 à¤¬à¥\87र à¤«à¤¿à¤° à¤¸à¥\87 à¤\95à¥\8bसिस à¤\95रà¥\80à¤\82।</strong>\nà¤\85à¤\97र à¤¤à¤¬à¥\8b à¤ªà¤° à¤\95ाम à¤¨à¤\87à¤\96à¥\87 à¤¹à¥\8b à¤ªà¤¾à¤µà¤¤ à¤¤ [[Special:UserLogout|लà¥\89à¤\97 à¤\86à¤\89à¤\9f à¤\95रà¥\80à¤\82]] à¤\86 à¤¦à¥\81बारा à¤²à¥\89à¤\97िन à¤\95 à¤\95à¥\87 à¤\95à¥\8bसिस à¤\95रà¥\80à¤\82।",
+       "session_fail_preview_html": "<strong>माफ à¤\95रà¥\80à¤\82! à¤¸à¤¤à¥\8dर à¤\86à¤\81à¤\95ड़ा à¤\95à¥\87 à¤\97ायब à¤¹à¥\8bà¤\96ला à¤\95à¥\80 à¤\95ारन à¤\86पà¤\95à¥\87 à¤¸à¤\82पादन à¤¸à¤¹à¥\87à¤\9cल à¤¨à¤\87à¤\96à¥\87 à¤\9cा à¤¸à¤\95त।</strong>\n\n<em>à¤\9aà¥\82à¤\81à¤\95ि, {{SITENAME}} à¤®à¥\87à¤\82 à¤®à¥\82ल HTML à¤¸à¤\95à¥\8dषम à¤\95à¤\87ल à¤¬à¤¾à¤\9fà¥\87, à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤¹à¤®à¤²à¤¾ à¤¸à¥\87 à¤¬à¤\9aाव à¤\96ातिर à¤\9dलà¤\95 à¤\9bिपावल à¤\97à¤\87ल à¤¬à¤¾à¥¤</em>\n\n<strong>à¤\85à¤\97र à¤\88 à¤\8fà¤\97à¥\8b à¤µà¥\88ध à¤¸à¤\82पादन à¤¬à¤¾à¤\9fà¥\87 à¤¤à¤¬ à¤\8fà¤\95 à¤¬à¥\87र à¤«à¤¿à¤° à¤¸à¥\87 à¤\95à¥\8bसिस à¤\95रà¥\80à¤\82।</strong>\nà¤\85à¤\97र à¤¤à¤¬à¥\8b à¤ªà¤° à¤\95ाम à¤¨à¤\87à¤\96à¥\87 à¤¹à¥\8b à¤ªà¤¾à¤µà¤¤ à¤¤ [[Special:UserLogout|लà¥\89à¤\97 à¤\86à¤\89à¤\9f à¤\95रà¥\80à¤\82]] à¤\86 à¤¦à¥\81बारा à¤²à¥\89à¤\97िन à¤\95 à¤\95à¥\87 à¤\95à¥\8bसिस à¤\95रà¥\80à¤\82, à¤\86 à¤\88हà¥\8b à¤\9cाà¤\81à¤\9a à¤²à¥\87à¤\88à¤\82 à¤\95à¥\80 à¤\86पà¤\95à¥\87 à¤¬à¥\8dराà¤\89à¤\9cर à¤\8fह à¤¸à¤¾à¤\87à¤\9f à¤¸à¥\87 à¤\95à¥\81à¤\95à¥\80 à¤¸à¤­ à¤\95à¥\87 à¤\8fलाà¤\8a à¤\95रत à¤¬à¤¾ à¤\95ि à¤¨à¤¾।",
        "token_suffix_mismatch": "<strong>राउर संपादन रिजेक्ट कइल जात बा काहें से की राउर क्लायंट संपादन टोकन में विराम चीन्हा सब से गड़बड़ क दिहले बा।</strong>\nपन्ना के पाठ के तहस-नहस होखे से बचावे खाती ई संपादन रिजेक्ट कइल गइल बा।\nकबो-कबो अइसन एहू दसा में हो सकेला जब आप खराबी-युक्त वेबआधारित बेनाम प्रॉक्सी सर्वर के इस्तेमाल करत होखीं।",
        "edit_form_incomplete": "<strong>संपादन के कुछ हिस्सा सर्वर ले ना पहुँच पावल ह; दोहरा के चेक करीं की राउर संपादन बदलल न होखे आ एक बेर फिर से सहेजे के कोसिस करीं।</strong>",
        "editing": "$1 संपादन",
        "copyrightwarning2": "ई नोट कर लीं कि {{SITENAME}} पर सगरी योगदान के दुसरा योगदानकर्ता लोगन द्वारा संपादित कइल जा सकेला, बदलल या हटावल जा सकेला।\nअगर आप ई नइखीं चाहत की राउर लिखल चीज के केहू भी बे-मोहछोह के संपादित क दे, तब ए के इहाँ मत डालीं।<br />\nरउआँ इहो वादा करत बानी की आप ई खुद लिखले बानी या फिर पब्लिक पहुँच में मौजूद या अइसने कौनों फ्री स्रोत से नकल कइले बानी (ढेर जानकारी खातिर $1 देखीं)।\n<strong>बिना परमीशन के कॉपीराइट वाली चीज इहाँ कब्बो मत डालीं!</strong>",
        "editpage-cannot-use-custom-model": "ए पन्ना के सामग्री के मॉडल के ना बदलल जा सकत बा।",
        "longpageerror": "<strong>खराबी: आप जवन पाठ लिख के दिहले बानी ऊ {{PLURAL:$1|एक किलोबाइट|$1 किलोबाइट्स}} के बाटे, जेवन अधिकतम सीमा {{PLURAL:$2|एक किलोबाइट|$2 किलोबाइट्स}} से ढेर बा।</strong>\nई सहेजल ना जा सकेला।",
-       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¡à¥\87à¤\9fाबà¥\87स à¤\8f à¤¸à¤®à¤¯ à¤®à¤°à¤®à¥\8dमत à¤\96ातिर à¤²à¥\89à¤\95 à¤\95à¤\87ल à¤\97à¤\87ल à¤¬à¤¾, à¤\86 à¤\8fहà¥\80 à¤\95ारण à¤\86प à¤¤à¥\81रà¤\82तà¥\87 à¤\8fहà¥\80 à¤¸à¤®à¤¯ à¤\86पन à¤¸à¤®à¥\8dपादन à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9c à¤ªà¤¾à¤\87ब।</strong>\nरà¤\89à¤\86à¤\81 à¤\85पनà¥\80 à¤ªà¤¾à¤  (text) à¤\95à¥\87 à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¾à¤  à¤«à¤¾à¤\87ल (text file) à¤®à¥\87à¤\82 à¤¬à¤¾à¤¦ à¤\96ातिर à¤¸à¤¹à¥\87à¤\9c à¤\95à¥\87 à¤°à¤\96 à¤²à¥\80à¤\82।\n\nà¤\9cà¥\87 à¤\8fडमिनिसà¥\8dà¤\9fà¥\8dरà¥\87à¤\9fर एकरा के लॉक कइले बा ऊ नीचे लिखल कारण दिहले बा: $1",
+       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤\8fह à¤¸à¤®à¤¯ à¤®à¤°à¤®à¥\8dमत à¤\96ातिर à¤¡à¥\87à¤\9fाबà¥\87स à¤²à¥\89à¤\95 à¤\95à¤\87ल à¤\97à¤\87ल à¤¬à¤¾, à¤\8fहà¥\80 à¤\95ारन à¤\86प à¤¤à¥\81रà¤\82तà¥\87 à¤\8fहà¥\80 à¤¸à¤®à¤¯ à¤\86पन à¤¸à¤\82पादन à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9c à¤ªà¤¾à¤\87ब।</strong>\nरà¤\89à¤\86à¤\81 à¤\85पनà¥\80 à¤ªà¤¾à¤  (à¤\9fà¥\87à¤\95à¥\8dसà¥\8dà¤\9f) à¤\95à¥\87 à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¾à¤  à¤«à¤¾à¤\87ल (à¤\9fà¥\87à¤\95à¥\8dसà¥\8dà¤\9f à¤«à¤¾à¤\87ल) à¤®à¥\87à¤\82 à¤¬à¤¾à¤¦ à¤\96ातिर à¤¸à¤¹à¥\87à¤\9c à¤\95à¥\87 à¤°à¤\96 à¤²à¥\80à¤\82।\n\nà¤\9cà¥\87 à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरबà¤\82धà¤\95 एकरा के लॉक कइले बा ऊ नीचे लिखल कारण दिहले बा: $1",
        "protectedpagewarning": "<strong>चेतावनी: ई पन्ना सुरक्षित कइल गइल बा जेवना से कि एकरा के खाली प्रबंधक (Admin) विशेषाधिकार वाला सदस्य लोग संपादित क सकत बा।</strong>\nप्रसंग बूझे खातिर सबसे नया लॉग एंट्री नीचे दिहल जात बा:",
        "semiprotectedpagewarning": "<strong>नोट:</strong> ई पन्ना सुरक्षित कइल गइल बा कि एकरा के खाली रजिस्टर्ड सदस्य लोग संपादित क सकत बा।\nसभसे नया लॉग एंट्री नीचे प्रसंग बतावे खातिर दिहल जात बा:",
        "cascadeprotectedwarning": "<strong>चेतावनी:</strong> ई पन्ना सुरक्षित क दिहल गइल बा कि एकरा के खाली प्रबंधक (Admin) विशेषाधिकार वाला सदस्य लोग संपादित क सकेला काहें से की ई नीचे दिहल बिस्तारित(कैस्केडिंग)-सुरक्षा वाला {{PLURAL:$1|पन्ना|पन्नवन}} में समाइल बाटे:",
        "history-title": "''$1'' के संशोधन इतिहास",
        "difference-title": "\"$1\" की अवतरण में अंतर",
        "lineno": "लाइन $1:",
-       "compareselectedversions": "à¤\9aà¥\81नल à¤\97à¤\88ल à¤¸à¤\82शà¥\8bधन à¤®à¥\87à¤\82 à¤\85नà¥\8dतर देखीं",
-       "showhideselectedversions": "à¤\9aà¥\81नल à¤\97à¤\88ल à¤¸à¤\82शà¥\8bधन à¤¦à¤¿à¤\96ाà¤\88à¤\82/à¤\9bà¥\81पाà¤\88ं",
+       "compareselectedversions": "à¤\9aà¥\81नल à¤\97à¤\87ल à¤¸à¤\82शà¥\8bधन à¤®à¥\87à¤\82 à¤\85à¤\82तर देखीं",
+       "showhideselectedversions": "à¤\9aà¥\81नल à¤\97à¤\87ल à¤¸à¤\82शà¥\8bधन à¤\95à¥\87 à¤¦à¥\83शà¥\8dयता à¤¬à¤¦à¤²à¥\80ं",
        "editundo": "वापस लीं",
-       "diff-multi-sameuser": "(एही सदस्य द्वारा कइल {{PLURAL:$1|बीच के एगो बदलाव|$1 बीच के बदलाव सब}} नइखे देखावल जात)",
+       "diff-multi-sameuser": "(एही सदस्य द्वारा कइल {{PLURAL:$1|बीच के एगो बदलाव|बीच के $1 बदलाव}} नइखे देखावल जात)",
        "searchresults": "खोज परिणाम",
        "searchresults-title": "$1 खातिर खोज परिणाम",
-       "titlematches": "पनà¥\8dना à¤\95à¥\87 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤®à¤¿à¤²à¤¤ à¤¬à¤¾à¥¤",
-       "textmatches": "पनà¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤ à¥\8dय à¤®à¤¿à¤²à¤¤ à¤¬à¤¾",
-       "notextmatches": "पनà¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤ à¥\8dय à¤¨à¤\88à¤\96à¥\87 à¤®à¤¿à¤²à¤¤",
+       "titlematches": "पनà¥\8dना à¤\9fाà¤\87à¤\9fिल à¤®à¤¿à¤²à¤¾à¤¨",
+       "textmatches": "पनà¥\8dना à¤ªà¤¾à¤  à¤®à¤¿à¤²à¤¾à¤¨",
+       "notextmatches": "à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¨à¥\8dना à¤ªà¤¾à¤  à¤®à¤¿à¤²à¤¾à¤¨ à¤¨à¤\87à¤\96à¥\87",
        "prevn": "पछिला {{PLURAL:$1|$1}}",
        "nextn": "अगिला {{PLURAL:$1|$1}}",
        "prev-page": "पिछलका पन्ना",
        "next-page": "अगला पन्ना",
        "prevn-title": "पिछला $1 {{PLURAL:$1|परिणाम}}",
        "nextn-title": "अगिला $1 {{PLURAL:$1|परिणाम}}",
-       "shown-title": "à¤\8fà¤\95 à¤ªà¤¨à¥\8dना à¤ªà¤° $1 {{PLURAL:$1|परिणाम}} देखाईं",
+       "shown-title": "पà¥\8dरति à¤ªà¤¨à¥\8dना $1 {{PLURAL:$1|परिणाम}} देखाईं",
        "viewprevnext": "देखीं ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
        "searchmenu-new": "<strong> ए विकि पर \"[[:$1]]\" नाँव के पन्ना बनाईं !</strong> {{PLURAL:$2|0=|अपनी खोज से मिलल पन्ना भी देखीं|खोज के परिणाम भी देखीं।}}",
        "skin-preview": "पूर्वावलोकन",
        "datedefault": "वरीयता नईखे",
        "prefs-user-pages": "सदस्य पन्ना",
-       "prefs-personal": "सदसà¥\8dय à¤ªà¥\8dरà¥\8bफाà¤\88ल",
-       "prefs-rc": "तà¥\81रà¤\82त à¤­à¤\87ल à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन",
+       "prefs-personal": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\8dरà¥\8bफाà¤\87ल",
+       "prefs-rc": "हाल à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ",
        "prefs-watchlist": "धियानसूची",
        "prefs-editwatchlist": "धियानसूची संपादन",
        "prefs-editwatchlist-label": "अपनी धियानसूची के चीज संपादित करीं:",
        "prefs-watchlist-edits": "बिस्तारित धियानसूची में देखावे खातिर अधिकतम बदलाव संख्या:",
        "prefs-watchlist-edits-max": "अधिकतम संख्या:1000",
        "prefs-watchlist-token": "धियानसूची टोकन:",
-       "prefs-misc": "à¤\85à¤\89रà¥\80 à¤\95à¥\81ल",
-       "prefs-resetpass": "पासवरà¥\8dड बदलीं",
+       "prefs-misc": "बिबिध",
+       "prefs-resetpass": "à¤\97à¥\81पà¥\8dतशबà¥\8dद बदलीं",
        "prefs-changeemail": "ईमेल पता बदलीं",
        "prefs-setemail": "ईमेल पता सेट करीं",
        "prefs-email": "ईमेल बिकल्प",
        "prefs-rendering": "रंगरूप",
-       "saveprefs": "सà¥\81रà¤\95à¥\8dषित à¤\95रीं",
+       "saveprefs": "सहà¥\87à¤\9cीं",
        "restoreprefs": "सगरी डिफाल्ट सेटिंग पहिले जइसन करीं (सगरी खंड में)",
        "prefs-editing": "संपादन",
-       "rows": "रो कुल:",
-       "columns": "कालम कुल:",
        "searchresultshead": "खोज",
-       "stub-threshold-disabled": "निरसà¥\8dत",
+       "stub-threshold-disabled": "à¤\85à¤\95à¥\8dषम",
        "recentchangesdays": "हाल में भइल परिवर्तन में देखावे खातिर दिन:",
        "recentchangesdays-max": "अधिकतम $1{{PLURAL:$1|दिन}}",
        "recentchangescount": "डिफाल्ट में देखावे खातिर संपादन संख्या:",
        "prefs-reset-intro": "रउआँ आपन पसंद बदल के डिफाल्ट करे खातिर ए पन्ना के इस्तेमाल नइखीं कर सकत।\n\nई फिर से वापस ना हो पाई।",
        "prefs-emailconfirm-label": "ईमेल जाँच:",
        "youremail": "ईमेल:",
+       "username": "{{GENDER:$1|प्रयोगकर्तानाँव}}:",
        "prefs-registration": "रजिस्ट्रेशन के समय:",
        "yourrealname": "असली नाम",
        "yourlanguage": "भाषा:",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "अंतर",
        "prefs-help-prefershttps": "राउर ई पसंद के सेटिंग अगिला बेर लॉग इन कइले पर लागू होई।",
+       "userrights": "प्रयोगकर्ता अधिकार मैनेजमेंट",
+       "userrights-lookup-user": "प्रयोगकर्ता चुनीं",
+       "userrights-user-editname": "प्रयोगकर्ता नाँव लिखीं:",
+       "editusergroup": "प्रयोगकर्ता मंडली लोड करीं",
+       "editinguser": "अधिकार बदलाव {{GENDER:$1|प्रयोगकर्ता}}<strong>[[User:$1|$1]]</strong> $2",
+       "userrights-reason": "कारण:",
        "group": "मंडली (ग्रुप):",
        "group-user": "सदस्य",
        "group-autoconfirmed": "खुद परीक्षित सदस्य",
        "listusers-desc": "घटत क्रम से सरियाईं",
        "usereditcount": "$1 {{PLURAL:$1|संपादन|संपादन सभ}}",
        "newpages": "नया पन्ना",
-       "newpages-username": "सदसà¥\8dयनाँव:",
+       "newpages-username": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव:",
        "ancientpages": "पुरान पन्ना",
        "move": "स्थानांतरण",
        "movethispage": "एह पन्ना के स्थानांतरण करीं",
        "trackingcategories-msg": "निगरानी श्रेणी",
        "trackingcategories-name": "संदेस नाँव",
        "emailuser": "ई प्रयोगकर्ता के ईमेल करीं",
+       "emailusername": "प्रयोगकर्तानाँव:",
        "watchlist": "धियानसूची",
        "mywatchlist": "धियानसूची",
        "watch": "धियानसूची में डालीं",
        "tooltip-p-logo": "मुख्य पन्ना पर जाईं",
        "tooltip-n-mainpage": "मुख्य पन्ना पर जाईं",
        "tooltip-n-mainpage-description": "मुख्य पन्ना पर जाईं",
-       "tooltip-n-portal": "पà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f à¤\95à¥\80 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\81, रउआँ का कर सकत बानी, कौनों चीज कहाँ खोजब",
+       "tooltip-n-portal": "पà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f à¤\95à¥\80 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82, रउआँ का कर सकत बानी, कौनों चीज कहाँ खोजब",
        "tooltip-n-currentevents": "वर्तमान के घटना पर पृष्ठभूमी जानकारी खोजीं",
        "tooltip-n-recentchanges": "विकि पर तुरंत भइल बदलाव के लिस्ट",
        "tooltip-n-randompage": "बेतरतीब पन्ना लोड करीं",
        "logentry-newusers-create": "खाता $1 {{GENDER:$2|बनावल गइल}}",
        "revdelete-summary": "सारांश संपादन",
        "searchsuggest-search": "खोजीं",
-       "api-error-nomodule": "भितरी खराबी:कउनो अपलोड मॉड्युल सेट नइखे",
        "expandtemplates": "टेम्पलेट बिस्तार",
        "mediastatistics": "मीडिया सांख्यिकी"
 }
index a893682..2fb3622 100644 (file)
@@ -31,7 +31,8 @@
                        "Matma Rex",
                        "আজিজ",
                        "Kayser Ahmad",
-                       "NahidSultan"
+                       "NahidSultan",
+                       "Elias Ahmmad"
                ]
        },
        "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": "মেটা-পাতা দেখুন",
        "nosuchaction": "এমন কোন কাজ নেই",
        "nosuchactiontext": "এই উআরএল এ নির্ধারিত কাজটি অবৈধ।\nআপনি হয়তো একটি ভুল লিঙ্ক দিয়েছেন অথবা ইউআরএল লিখতে ভুল করেছেন।\nএটি এমনও নির্দেশ করে যে {{SITENAME}} সাইটে ব্যবহৃত সফটওয়্যারটিতে একটি ত্রুটি রয়েছে।",
        "nosuchspecialpage": "এমন কোন বিশেষ পাতা নেই",
-       "nospecialpagetext": "<strong>আপনি একটি অবৈধ বিশেষ পাতা অনুরোধ করেছেন।</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]-এ বৈধ বিশেষ পাতাগুলির একটি তালিকা পাবেন।",
+       "nospecialpagetext": "<strong>আপনি একটি অবৈধ বিশেষ পাতা অনুরোধ করেছেন।</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]-এ বৈধ বিশেষ পাতাগুলির একটি তালিকা পাবেন।",
        "error": "ত্রুটি",
        "databaseerror": "ডাটাবেস ত্রুটি",
        "databaseerror-text": "ডাটাবেজ অনুসন্ধান ত্রুটি।\nএটি সফটওয়্যারের একটি ত্রুটি হতে পারে।",
        "emailnotauthenticated": "আপনার ই-মেইলের ঠিকানা এখনও যাচাই করা হয়নি।\nনিচের বৈশিষ্ট্যগুলোর (features) জন্য কোনো ই-মেইল পাঠানো হবে না।",
        "noemailprefs": "এই বৈশিষ্টটি কাজ করাতে হলে একটি ই-মেইল ঠিকানা নির্ধারণ করতে হবে।",
        "emailconfirmlink": "আপনার ই-মেইলের ঠিকানা নিশ্চিত করুন",
-       "invalidemailaddress": "এই ই-মেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক ফরম্যাটে লেখা হয়নি। অনুগ্রহ করে সঠিক ফরম্যাটে লেখা ই-মেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।",
+       "invalidemailaddress": "এই ইমেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক বিন্যাসে লেখা হয়নি। অনুগ্রহ করে সঠিক বিন্যাসে লেখা ইমেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।",
        "cannotchangeemail": "একাউন্ট ইমেইল ঠিকানা এই উইকিতে পরিবর্তন করা যাবে না।",
        "emaildisabled": "এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।",
        "accountcreated": "অ্যাকাউন্ট তৈরি করা হয়েছে",
        "resetpass-submit-cancel": "বাতিল",
        "resetpass-wrong-oldpass": "ভুল অস্থায়ী অথবা বর্তমান পাসওয়ার্ড।\nসম্ভবতঃ আপনি ইতোমধ্যেই আপনার পাসওয়ার্ডটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী পাসওয়ার্ডের জন্য অনুরোধ করেছেন।",
        "resetpass-recycled": "অনুগ্রহ করে বর্তমানে ব্যবহার করছেন এমন পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।",
-       "resetpass-temp-emailed": "à¦\86পনি à¦\87মà§\87à¦\87লà¦\95à§\83ত à¦¸à¦¾à¦®à¦¯à¦¼à¦¿à¦\95 à¦\95à§\8bড à¦¦à¦¿à¦¯à¦¼à§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87à¦\9bà§\87ন।\nপà§\8dরবà§\87শ à¦\95রার à¦\9cনà§\8dয à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারন করতে হবে:",
+       "resetpass-temp-emailed": "à¦\86পনি à¦\87মà§\87à¦\87লà¦\95à§\83ত à¦¸à¦¾à¦®à¦¯à¦¼à¦¿à¦\95 à¦\95à§\8bড à¦¦à¦¿à¦¯à¦¼à§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87à¦\9bà§\87ন।\nপà§\8dরবà§\87শ à¦\95রার à¦\9cনà§\8dয à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ করতে হবে:",
        "resetpass-temp-password": "অস্থায়ী পাসওয়ার্ড:",
        "resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
        "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
        "resetpass-expired-soft": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে \"{{int:authprovider-resetpass-skip-label}}\" বাটনে ক্লিক করুন।",
        "resetpass-validity-soft": "আপনার পাসওয়ার্ড বৈধ নয়: $1\n\nদয়া করে একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
        "passwordreset": "পাসওয়ার্ড রিসেট",
-       "passwordreset-text-one": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\81নরায় à¦¸à§\87à¦\9f à¦\95রতà§\87 à¦\8fà¦\87 à¦«à¦°à§\8dমà¦\9fি পূরণ করুন।",
+       "passwordreset-text-one": "à¦\87মà§\87à¦\87লà§\87র à¦®à¦¾à¦§à§\8dযমà§\87 à¦\8fà¦\95à¦\9fি à¦\85সà§\8dথায়à§\80 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\87তà§\87 à¦\8fà¦\87 à¦«à¦°à¦® পূরণ করুন।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলের মাধ্যমে একটি অস্থায়ী পাসওয়ার্ড পেতে ঘরগুলির একটি পূরণ করুন।}}",
        "passwordreset-disabled": "এই উইকিতে পাসওয়ার্ড রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।",
        "passwordreset-emaildisabled": "এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।",
        "passwordreset-username": "ব্যবহারকারী নাম:",
        "passwordreset-domain": "ডোমেইন:",
-       "passwordreset-capture": "অনুসন্ধানের ফলাফলের ইমেইল দেখুন?",
-       "passwordreset-capture-help": "আপনি যদি এই পরীক্ষা বক্সে ক্লিক করেন, তবে অস্থায়ী পাসওয়ার্ডসহ একটি ইমেইল আপনাকে দেখানো হবে ও সেইসাথে ব্যবহারকারীকে তা পাঠানো হবে।",
        "passwordreset-email": "ইমেইল ঠিকানা:",
        "passwordreset-emailtitle": "{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি",
        "passwordreset-emailtext-ip": "কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার\nপাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailelement": "ব্যবহারকারী নাম: \n$1\n\nঅস্থায়ী পাসওয়ার্ড: \n$2",
        "passwordreset-emailsentemail": "যদি এই ই-মেইল ঠিকানা আপনার অ্যাকাউন্টের সাথে সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
        "passwordreset-emailsentusername": "যদি এই ব্যবহারকারী নামের সাথে ই-মেইল ঠিকানা সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
-       "passwordreset-emailsent-capture2": "পাসওয়ার্ড পুনঃধার্যকরণের {{PLURAL:$1|ইমেইল পাঠানো}} হয়েছে। {{PLURAL:$1|ব্যবহারকারী নাম ও পাসওয়ার্ড|ব্যবহারকারী নাম ও পাসওয়ার্ডের তালিকা}} এখানে দেখা যাবে।",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|ব্যবহারকারীকে}} ইমেইল পাঠানো যায়নি: $1 {{PLURAL:$3|ব্যবহারকারী নাম ও পাসওয়ার্ড|ব্যবহারকারী নাম ও পাসওয়ার্ডের তালিকা}} এখানে দেখা যাবে।",
        "passwordreset-nocaller": "একটি আহ্বানকারী প্রদান করা আবশ্যক",
        "passwordreset-nosuchcaller": "আহ্বানকারীর অস্তিত্ব নেই: $1",
        "passwordreset-ignored": "পাসওয়ার্ড পুনঃধার্যকরণ করা যায়নি। হয়তো কোন প্রদানকারী কনফিগার করা হয়েনি?",
        "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
        "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোন বিষয় প্রদান করেননি।আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
-       "summary-preview": "সারাà¦\82শ প্রাকদর্শন:",
-       "subject-preview": "বিষয় প্রাকদর্শন:",
+       "summary-preview": "সমà§\8dপাদনা à¦¸à¦¾à¦°à¦¾à¦\82শà§\87র প্রাকদর্শন:",
+       "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": "à¦\86পনার à¦\86à¦\87পি à¦ à¦¿à¦\95ানাà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fà¦\95à¦\87 à¦\86à¦\87পি à¦ à¦¿à¦\95ানার à¦\86রà§\87à¦\95à¦\9cন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¬à§\8dযবহার à¦\95রà¦\9bà§\87ন à¦¯à¦¾à¦\95à§\87 $1  à¦¦à§\8dবারা à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nবাধাদানà§\87র à¦¯à§\87 à¦\95ারণ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87:\n\n:''$2''\n\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\81রà§\81র à¦¸à¦®à¦¯à¦¼: $8\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\87ষà§\87র à¦¸à¦®à¦¯à¦¼: $6\n* à¦¯à¦¾à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়ার à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $7\n\nà¦\86পনি $1-à¦\8fর à¦¸à¦¾à¦¥à§\87 à¦\95িà¦\82বা à¦\85নà§\8dয à¦¯à§\87à¦\95à§\8bন [[{{MediaWiki:Grouppage-sysop}}|পà§\8dরশাসà¦\95à§\87র]] à¦¸à¦¾à¦¥à§\87 à¦¯à§\8bà¦\97াযà§\8bà¦\97 à¦\95রà§\87 à¦¬à¦¾à¦§à¦¾à¦° à¦¬à§\8dযাপারà¦\9fি à¦\86লà§\8bà¦\9aনা à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nলà¦\95à§\8dষà§\8dয à¦\95রà§\81ন, à¦¯à¦¦à¦¿ à¦\86পনি \"à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87-মà§\87à¦\87ল à¦\95রà§\81ন\" à¦«à¦¿à¦\9aারà¦\9fি à¦¬à§\8dযবহার à¦\95রতà§\87 à¦\9aান, à¦¤à¦¬à§\87 à¦\86পনার [[Special:Preferences|পà¦\9bনà§\8dদ]] à¦\85পশনà§\87 à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87 à¦\8fবà¦\82 à¦\86পনার à¦¸à§\87à¦\9fি à¦¬à§\8dযবহারà§\87 à¦\95à§\8bন à¦¬à¦¾à¦§à¦¾ à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à¦¬à§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦¬à¦°à§\8dতমান IP à¦ à¦¿à¦\95ানা à¦¹à¦\9aà§\8dà¦\9bà§\87 $3, à¦\8fবà¦\82 à¦¯à¦¾ à¦¬à¦¾à¦§à¦¾ à¦¦à¦¾à¦¨à§\87র à¦\86à¦\87ডি à¦¹à¦² $5।\nযেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।",
+       "autoblockedtext": "à¦\86পনার à¦\86à¦\87পি à¦ à¦¿à¦\95ানাà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fà¦\9fি à¦\86রà§\87à¦\95à¦\9cন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¦à§\8dবারা à¦¬à§\8dযবহà§\83ত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¯à¦¾à¦\95à§\87 $1 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87ন।\nযà§\87 à¦\95ারণà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87:\n\n:''$2''\n\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\81রà§\81র à¦¸à¦®à¦¯à¦¼: $8\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\87ষà§\87র à¦¸à¦®à¦¯à¦¼: $6\n* à¦¯à¦¾à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়ার à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $7\n\nà¦\86পনি $1-à¦\8fর à¦¸à¦¾à¦¥à§\87 à¦\95িà¦\82বা à¦\85নà§\8dয à¦¯à§\87à¦\95à§\8bন [[{{MediaWiki:Grouppage-sysop}}|পà§\8dরশাসà¦\95à§\87র]] à¦¸à¦¾à¦¥à§\87 à¦¯à§\8bà¦\97াযà§\8bà¦\97 à¦\95রà§\87 à¦¬à¦¾à¦§à¦¾à¦° à¦¬à§\8dযাপারà¦\9fি à¦\86লà§\8bà¦\9aনা à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nলà¦\95à§\8dষà§\8dয à¦\95রà§\81ন, à¦¯à¦¦à¦¿ à¦\86পনি \"à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87-মà§\87à¦\87ল à¦\95রà§\81ন\" à¦¬à§\88শিষà§\8dà¦\9fà§\8dযà¦\9fি à¦¬à§\8dযবহার à¦\95রতà§\87 à¦\9aান, à¦¤à¦¬à§\87 à¦\86পনার [[Special:Preferences|পà¦\9bনà§\8dদ]] à¦\85পশনà§\87 à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦¨à¦¿à¦¬à¦¨à§\8dধিত à¦¥à¦¾à¦\95তà§\87 à¦¹à¦¬à§\87 à¦\8fবà¦\82 à¦\86পনার à¦¸à§\87à¦\9fি à¦¬à§\8dযবহারà§\87 à¦\95à§\8bন à¦¬à¦¾à¦§à¦¾ à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à¦¬à§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦¬à¦°à§\8dতমান à¦\86à¦\87পি à¦ à¦¿à¦\95ানা à¦¹à¦\9aà§\8dà¦\9bà§\87 $3, à¦\8fবà¦\82 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¾à¦¨à§\87র à¦\86à¦\87ডি à¦¹à¦² #$5।\nযেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।",
        "blockednoreason": "কোন কারণ দেওয়া হয়নি",
        "whitelistedittext": "পাতায় সম্পাদনা করতে আবশ্যই $1 করতে হবে।",
        "confirmedittext": "কোন সম্পাদনা করার আগে আপনার ই-মেইল ঠিকানাটি অবশ্যই নিশ্চিত করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|ব্যবহারকারীর পছন্দতালিকায়]] ঠিকমত দিন।",
        "yourdiff": "পার্থক্য",
        "copyrightwarning": "অনুগ্রহ করে লক্ষ্য করুন {{SITENAME}}-তে সমস্ত অবদান $2-এর আওতায় প্রাপ্য (বিস্তারিত $1-তে দেখুন)। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে পুনর্বিতরণ করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না।<br />\nআপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।\n'''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
        "copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
-       "editpage-cannot-use-custom-model": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87ল পরিবর্তন করা যাবে না।",
+       "editpage-cannot-use-custom-model": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦°à§\82প পরিবর্তন করা যাবে না।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
        "readonlywarning": "<strong>সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনি আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।</strong>\nআপনি চাইলে লেখাটি অনুলিপি করে ও কোন টেক্সট ফাইলে প্রতিলেপন করার দ্বারা ভবিষ্যতের জন্য সংরক্ষণ করতে পারেন।\n\nসিস্টেম প্রশাসক যিনি এটি বন্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "revdelete-modify-missing": "$1 আইডি সম্বলিত তথ্যটি সম্পাদনা করা যাচ্ছে না: এটি ডাটাবেজ থেকে হারিয়ে গিয়েছে!",
        "revdelete-no-change": "'''সতর্কতা:''' $2, $1 তারিখ সম্বলিত তথ্যটিতে পূর্বেই অনুরোধকৃত সেটিংস রয়েছে।",
        "revdelete-concurrent-change": "$2, $1 তারিখ সম্বলিত তথ্যটি সম্পাদনা করা যাচ্ছে না: আপনার সম্পাদনা শুরুর আগে কেউ এটির অবস্থা পরিবর্তন করেছেন।\nঅনুগ্রহ করে লগ দেখুন।",
-       "revdelete-only-restricted": "$2, $1 à¦¤à¦¾à¦°à¦¿à¦\96 à¦¸à¦®à§\8dবলিত à¦¤à¦¥à§\8dযà¦\9fি à¦²à§\81à¦\95ানà§\8b à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾: à¦¤à¦¥à§\8dয à¦ªà§\8dরদরà§\8dশনà§\87র à¦\85নà§\8dযানà§\8dয à¦\85পশনà¦\97à§\81লà§\8b à¦¨à¦¿à¦°à§\8dধারন করা ব্যতিত আপনি এটি শুধুমাত্র প্রশাসকদের জন্য দেখার উপযোগী করতে পারবেন না।",
+       "revdelete-only-restricted": "$2, $1 à¦¤à¦¾à¦°à¦¿à¦\96 à¦¸à¦®à§\8dবলিত à¦¤à¦¥à§\8dযà¦\9fি à¦²à§\81à¦\95ানà§\8b à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾: à¦¤à¦¥à§\8dয à¦ªà§\8dরদরà§\8dশনà§\87র à¦\85নà§\8dযানà§\8dয à¦¬à¦¿à¦\95লà§\8dপà¦\97à§\81লি à¦¨à¦¿à¦°à§\8dধারণ করা ব্যতিত আপনি এটি শুধুমাত্র প্রশাসকদের জন্য দেখার উপযোগী করতে পারবেন না।",
        "revdelete-reason-dropdown": "*সাধারণ অপসারণের কারণসমূহ\n** কপিরাইট লঙ্ঘন\n** অনুপযুক্ত ব্যক্তিগত তথ্য\n** অনুপযুক্ত ব্যবহারকারী নাম\n** সম্ভাব্য ক্ষতিকারক তথ্য",
        "revdelete-otherreason": "অন্য/বাড়তি কারণ:",
        "revdelete-reasonotherlist": "অন্য কারণ",
        "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}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
+       "difference-missing-revision": "$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "search-interwiki-caption": "সহপ্রকল্পসমূহ",
        "search-interwiki-default": "$1 থেকে ফলাফলসমূহ:",
        "search-interwiki-more": "(আরও)",
+       "search-interwiki-more-results": "আরও ফলাফল",
        "search-relatedarticle": "সম্পর্কিত",
        "searchrelated": "সম্পর্কিত",
        "searchall": "সমস্ত",
        "search-external": "বহিঃস্থ অনুসন্ধান",
        "searchdisabled": "{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।",
        "search-error": "অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1",
+       "search-warning": "অনুসন্ধানের সময় একটি সতর্কীকরণ দেখিয়েছে: $1",
        "preferences": "আমার পছন্দ",
        "mypreferences": "পছন্দসমূহ",
        "prefs-edits": "সম্পাদনা সংখ্যা:",
        "saveprefs": "সংরক্ষণ",
        "restoreprefs": "সকল পূর্বনির্ধারিত সেটিং ফিরিয়ে আনো (সকল অনুচ্ছেদে)",
        "prefs-editing": "সম্পাদনা",
-       "rows": "সারি:",
-       "columns": "কলাম:",
        "searchresultshead": "অনুসন্ধান",
        "stub-threshold": "অসম্পূর্ণ লিঙ্ক বিন্যাসের জন্য প্রান্তিক মাপ ($1):",
        "stub-threshold-sample-link": "নমুনা",
        "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
        "recentchangescount": "সাম্প্রতিক পরিবর্তনে প্রদর্শিত সম্পাদনার সংখ্যা:",
        "prefs-help-recentchangescount": "এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।",
-       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন à¦¤à¦¿à¦¨à¦¿ à¦\86পনার à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¡à¦¼à¦¤à§\87 à¦¸à¦\95à§\8dষম à¦¹à¦¬à§\87ন, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রবà§\87ন à¦¨à¦¾à¥¤ [[Special:ResetTokens|à¦\86পনার à¦\8fà¦\9fি à¦ªà§\81নরায় à¦¸à§\87à¦\9f করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
+       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন à¦¤à¦¿à¦¨à¦¿ à¦\86পনার à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¡à¦¼à¦¤à§\87 à¦¸à¦\95à§\8dষম à¦¹à¦¬à§\87ন, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রবà§\87ন à¦¨à¦¾à¥¤ [[Special:ResetTokens|à¦\86পনার à¦\8fà¦\9fি à¦ªà§\81নà¦\83নিরà§\8dধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "savedprefs": "আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।",
-       "savedrights": "{{GENDER:$1|$1}}-à¦\8fর à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\85ধিà¦\95ার সংরক্ষিত হয়েছে।",
+       "savedrights": "{{GENDER:$1|$1}}-à¦\8fর à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¦à¦² সংরক্ষিত হয়েছে।",
        "timezonelegend": "সময়স্থান:",
        "localtime": "স্থানীয় সময়:",
        "timezoneuseserverdefault": "উইকির পূর্বনির্ধারিত সময় ব্যবহার করো ($1)",
        "youremail": "ইমেইল *",
        "username": "{{GENDER:$1|ব্যবহারকারী নাম}}:",
        "prefs-memberingroups": "{{PLURAL:$1|দলের|দলসমূহের}} {{GENDER:$2|সদস্য}}:",
+       "group-membership-link-with-expiry": "$1 ($2 পর্যন্ত)",
        "prefs-registration": "নিবন্ধনের সময়:",
        "yourrealname": "আসল নাম *",
        "yourlanguage": "ভাষা:",
        "gender-unknown": "যখন আপনাকে উল্লেখ করা হবে, সফটওয়্যার যখনই সম্ভব লিঙ্গ নিরপেক্ষ শব্দ ব্যবহার করবে",
        "gender-male": "তিনি (পুরুষ) উইকি পাতা সম্পাদনা করেন",
        "gender-female": "তিনি (মহিলা) উইকি পাতা সম্পাদনা করেন",
-       "prefs-help-gender": "সেটিংসের এই পরিবর্তন ঐচ্ছিক।\nসফটওয়্যারে মাধ্যমে লিঙ্গ অনুযায়ী সম্বধনের ক্ষেত্রে এটি ব্যবহৃত হয়।\nএই তথ্য সকলের জন্য উন্মুক্ত থাকেবে।",
+       "prefs-help-gender": "সà§\87à¦\9fিà¦\82সà§\87র à¦\8fà¦\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\90à¦\9aà§\8dà¦\9bিà¦\95।\nসফà¦\9fà¦\93য়à§\8dযারà§\87 à¦®à¦¾à¦§à§\8dযমà§\87 à¦²à¦¿à¦\99à§\8dà¦\97 à¦\85নà§\81যায়à§\80 à¦¸à¦®à§\8dবà§\8bধনà§\87র à¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\8fà¦\9fি à¦¬à§\8dযবহà§\83ত à¦¹à¦¯à¦¼à¥¤\nà¦\8fà¦\87 à¦¤à¦¥à§\8dয à¦¸à¦\95লà§\87র à¦\9cনà§\8dয à¦\89নà§\8dমà§\81à¦\95à§\8dত à¦¥à¦¾à¦\95à§\87বà§\87।",
        "email": "ই-মেইল",
        "prefs-help-realname": "আসল নাম দেওয়া অনাবশ্যক।\nযদি আসল নাম দেন, তবে আপনার কাজের স্বীকৃতি দানে তা ব্যবহার করা হবে।",
        "prefs-help-email": "ইমেইল ঠিকানা ঐচ্ছিক, তবে পাসওয়ার্ড ভুলে গেলে নতুন করে পাসওয়ার্ড নিতে এটির প্রয়োজন হবে।",
        "prefs-help-email-others": "আপনি আপনার পরিচয় প্রকাশ না করেও আপনার ব্যবহারকারী অথবা আলাপ পাতাটির মাধ্যমে অন্যদেরকে আপনার সাথে যোগাযোগ করতে দিতে পারেন।",
        "prefs-help-email-required": "ই-মেইল ঠিকানা আবশ্যক।",
        "prefs-info": "সাধারণ তথ্য",
-       "prefs-i18n": "à¦\86নà§\8dতরà§\8dà¦\9cাতিà¦\95িকরণ",
+       "prefs-i18n": "à¦\86নà§\8dতরà§\8dà¦\9cাতিà¦\95à§\80করণ",
        "prefs-signature": "স্বাক্ষর",
        "prefs-dateformat": "তারিখ বিন্যাস",
        "prefs-timeoffset": "সময় অফসেট",
        "prefswarning-warning": "আপানি পছন্দসমূহ পাতায় পাতায় পরিবর্তন করেছেন যেগুলো সংরক্ষণ করা হয়নি। আপনি যদি এই পাতাটি ছেড়ে যাওয়ার আগে \"$1\" ক্লিক না করেন তবে পছন্দসমূহ হালনাগাদ হবে না।",
        "prefs-tabs-navigation-hint": "সাহায্য: আপনি ডান এবং বাম অ্যারো বাটন ব্যবহার করে বিভিন্ন ট্যাবগুলোতে যেতে পারবেন।",
        "userrights": "ব্যবহারকারী অধিকার ব্যবস্থাপনা",
-       "userrights-lookup-user": "বà§\8dযবহারà¦\95ারà§\80 à¦¦à¦² à¦¬à§\8dযবসà§\8dথাপনা করুন",
+       "userrights-lookup-user": "à¦\8fà¦\95à¦\9cন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¿à¦°à§\8dবাà¦\9aন করুন",
        "userrights-user-editname": "ব্যবহারকারীর নাম লিখুন:",
-       "editusergroup": "{{GENDER:$1|ব্যবহারকারীর}} দল সম্পাদনা করো",
-       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} জন্য ব্যবহারকারী অধিকার পরিবর্তন করছেন",
-       "userrights-editusergroup": "ব্যবহারকারীর দল সম্পাদনা করো",
+       "editusergroup": "ব্যবহারকারী দল লোড করুন",
+       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার পরিবর্তন করছেন",
+       "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার দেখছেন",
+       "userrights-editusergroup": "{{GENDER:$1|ব্যবহারকারী}} দল সম্পাদনা করে",
+       "userrights-viewusergroup": "{{GENDER:$1|ব্যবহারকারী}} দল দেখা",
        "saveusergroups": "{{GENDER:$1|ব্যবহারকারীর}} দল সংরক্ষণ করো",
        "userrights-groupsmember": "সদস্য:",
        "userrights-groupsmember-auto": "শর্তহীন সদস্য",
-       "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 à¦\8fà¦\96ন à¦\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রতে পারবেন না।",
+       "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র à¦®à§\87য়াদ à¦¶à§\87ষ à¦¹à¦\93য়ার à¦¸à¦®à¦¯à¦¼ à¦ªà¦¿à¦\9bনà§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à¦¬à§\87ন; à¦\95িনà§\8dতà§\81 à¦¸à¦¾à¦®à¦¨à§\87 à¦¨à¦¿তে পারবেন না।",
        "userrights-reason": "কারণ (বাংলায় লিখুন):",
        "userrights-no-interwiki": "আপনার অন্য উইকিতে ব্যবহারকারী অধিকার সম্পাদনা করার অনুমতি নেই।",
        "userrights-nodatabase": "$1 ডাটাবেজটির হয় কোন অস্তিত্ব নেই অথবা এটি স্থানীয় ডাটাবেজ নয়।",
-       "userrights-nologin": "ব্যবহারকারী অধিকার প্রযুক্ত করতে হলে আপনাকে কোন প্রশাসকের অ্যাকাউন্টে [[Special:UserLogin|প্রবেশ]] করতে হবে।",
-       "userrights-notallowed": "আপনার, ব্যবহারকারী অধিকার যুক্ত বা অপসারণ করার অনুমতি নেই।",
        "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 day,১ সপ্তাহ:1 week,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year",
+       "userrights-invalid-expiry": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অবৈধ।",
+       "userrights-expiry-in-past": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অতীতে।",
        "userrights-conflict": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।",
-       "userrights-removed-self": "আপনি আপনার নিজের অধিকার পরিবর্তন করেছেন। এর ফলে এখন থেকে আপনি আর এই পাতায় প্রবেশ করতে পারবেন না।",
        "group": "দল:",
        "group-user": "ব্যবহারকারীগণ",
-       "group-autoconfirmed": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারীগণ",
+       "group-autoconfirmed": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
        "group-bot": "বট",
        "group-sysop": "প্রশাসক",
        "group-bureaucrat": "ব্যুরোক্র্যাট",
        "group-suppress": "দমনকারী",
        "group-all": "(সমস্ত)",
        "group-user-member": "{{GENDER:$1|ব্যবহারকারী}}",
-       "group-autoconfirmed-member": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
+       "group-autoconfirmed-member": "{{GENDER:$1|স্বয়ংনিশ্চিতকৃত ব্যবহারকারী}}",
        "group-bot-member": "বট",
        "group-sysop-member": "প্রশাসক",
        "group-bureaucrat-member": "ব্যুরোক্র্যাট",
        "right-siteadmin": "ডাটাবেজ বন্ধ এবং খুলুন",
        "right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
        "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
-       "right-passwordreset": "পাসওয়ার্ড পুনঃস্থাপনের ইমেইল দেখুন",
        "right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
        "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-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
        "grant-highvolume": "উচ্চ-মাত্রার সম্পাদনা",
        "grant-oversight": "ব্যবহারকারী লুকান ও ইতিহাস অপসারণ",
+       "grant-patrol": "পাতার পরিবর্তনে টহল দেয়া",
        "grant-privateinfo": "ব্যক্তিগত তথ্যে প্রবেশাধিকার",
        "grant-protect": "পাতাসমূহ সুরক্ষা ও অরক্ষিত করুন",
+       "grant-rollback": "পাতার পরিবর্তন ফেরত নেয়া",
        "grant-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
        "grant-uploadeditmovefile": "ফাইল আপলোড, প্রতিস্থাপন এবং স্থানান্তর",
        "grant-uploadfile": "নতুন ফাইল আপলোড করুন",
        "grant-basic": "মৌলিক অধিকার",
        "grant-viewdeleted": "অপসারিত ফাইল ও পাতাগুলি দেখুন",
        "grant-viewmywatchlist": "আপনার নজরতালিকা দেখুন",
+       "grant-viewrestrictedlogs": "লগের সীমাবদ্ধ ভুক্তিগুলি দেখুন",
        "newuserlogpage": "ব্যবহারকারী সৃষ্টির লগ",
        "newuserlogpagetext": "এটি নতুন ব্যবহারকারী সৃষ্টির লগ",
        "rightslog": "ব্যবহারকারীর অধিকার লগ",
        "action-upload_by_url": "কোন ইউআরএল থেকে ফাইলটি আপলোড করো",
        "action-writeapi": "রাইট এপিআই ব্যবহার করুন",
        "action-delete": "পাতাটি মুছে ফেলো",
-       "action-deleterevision": "এই সংশোধনটি মুছে ফেলার",
-       "action-deletedhistory": "পাতার মুছে ফেলা ইতিহাস দেখাও",
+       "action-deleterevision": "সংশোধনটি মুছে ফেলার",
+       "action-deletelogentry": "লগের ভুক্তি অপসারণ করার",
+       "action-deletedhistory": "পাতার অপসারিত ইতিহাস দেখার",
+       "action-deletedtext": "অপসারিত সংশোধনের লেখা দেখার",
        "action-browsearchive": "অপসারিত পাতায় অনুসন্ধান করুন",
-       "action-undelete": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\8b",
-       "action-suppressrevision": "লà§\81à¦\95ানà§\8b à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦ªà¦°à§\8dযালà§\8bà¦\9aনা à¦\8fবà¦\82 à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রà§\81ন",
+       "action-undelete": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রার",
+       "action-suppressrevision": "লà§\81à¦\95ানà§\8b à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦ªà¦°à§\8dযালà§\8bà¦\9aনা à¦\8fবà¦\82 à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রার",
        "action-suppressionlog": "এই ব্যক্তিগত লগ দেখার",
        "action-block": "এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দেয়ার",
        "action-protect": "এই পাতার সুরক্ষার মাত্রা পরিবর্তন করার",
        "action-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন",
        "action-siteadmin": "ডাটাবেজ বন্ধ অথবা খুলুন",
        "action-sendemail": "ই-মেইল পাঠাও",
+       "action-editmyoptions": "নিজের পছন্দসমূহ সম্পাদনা করার",
        "action-editmywatchlist": "আপনার নজরতালিকা পরিবর্তন করুন",
        "action-viewmywatchlist": "আপনার নজরতালিকা দেখুন",
        "action-viewmyprivateinfo": "আপনার ব্যক্তিগত তথ্য দেখুন",
        "nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}} $1টি",
        "enhancedrc-history": "ইতিহাস",
-       "recentchanges": "সাম্প্রতিক পরিবর্তনসমূহ",
+       "recentchanges": "সাম্প্রতিক পরিবর্তন",
        "recentchanges-legend": "সাম্প্রতিক পরিবর্তনের পছন্দসমূহ",
        "recentchanges-summary": "এই পাতায় উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।",
        "recentchanges-noresult": "নির্ধারিত সময়ের মধ্যে কোনো পরিবর্তন পাওয়া যায়নি।",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "recentchanges-submit": "দেখাও",
+       "rcfilters-activefilters": "সক্রিয় ফিল্টার",
+       "rcfilters-restore-default-filters": "পূর্বনির্ধারিত ছাঁকনি পুনরুদ্ধার করুন",
+       "rcfilters-clear-all-filters": "সমস্ত ফিল্টার অপসারণ",
+       "rcfilters-search-placeholder": "সাম্প্রতিক পরিবর্তনসমূহ ছাঁকুন (ব্রাউজ বা টাইপ করা শুরু করুন)",
+       "rcfilters-invalid-filter": "অকার্যকর ফিল্টার",
+       "rcfilters-empty-filter": "কোনো সক্রিয় ফিল্টার নেই। সমস্ত অবদান দেখানো হয়েছে।",
+       "rcfilters-filterlist-title": "ছাঁকনি",
+       "rcfilters-filterlist-noresults": "কোনও ফিল্টার পাওয়া যায়নি",
+       "rcfilters-filtergroup-registration": "ব্যবহারকারী নিবন্ধন",
+       "rcfilters-filter-registered-label": "নিবন্ধিত",
+       "rcfilters-filter-registered-description": "প্রবেশকৃত সম্পাদকবৃন্দ।",
+       "rcfilters-filter-unregistered-label": "অনিবন্ধিত",
+       "rcfilters-filter-unregistered-description": "সম্পাদক যারা প্রবেশ করেন নি।",
+       "rcfilters-filtergroup-authorship": "কৃতি সম্পাদনা",
+       "rcfilters-filter-editsbyself-label": "আপনার নিজস্ব সম্পাদনা",
+       "rcfilters-filter-editsbyself-description": "আপনার দ্বারা সম্পাদনা।",
+       "rcfilters-filter-editsbyother-label": "অন্যদের দ্বারা সম্পাদনা",
+       "rcfilters-filter-editsbyother-description": "অন্য ব্যবহারকারীদের দ্বারা করা সম্পাদনা (আপনার না)।",
+       "rcfilters-filtergroup-userExpLevel": "অভিজ্ঞতার স্তর (শুধু মাত্র নিবন্ধিত ব্যবহারকারীর জন্য)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "নতুন আগত",
+       "rcfilters-filter-userExpLevel-newcomer-description": "১০টি সম্পাদনার কম ও ৪ দিনের কার্যকলাপ।",
+       "rcfilters-filter-userExpLevel-learner-label": "শিক্ষার্থী",
+       "rcfilters-filter-userExpLevel-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-major-label": "অ-অনুল্লেখ্য সম্পাদনা",
+       "rcfilters-filtergroup-changetype": "পরিবর্তনের ধরন",
+       "rcfilters-filter-pageedits-label": "পাতার সম্পাদনা",
+       "rcfilters-filter-pageedits-description": "উইকি বিষয়বস্তু, আলোচনা, বিষয়শ্রেণীর বিবরণ.... ইত্যাদিতে সম্পাদনা",
+       "rcfilters-filter-newpages-label": "পাতার সৃষ্টিকরণ",
+       "rcfilters-filter-newpages-description": "সম্পাদনা যা নতুন পাতা তৈরি করেছে।",
+       "rcfilters-filter-categorization-label": "বিষয়শ্রেণীর পরিবর্তন",
+       "rcfilters-filter-logactions-label": "প্রবেশকৃত কার্য",
+       "rcfilters-filter-logactions-description": "প্রশাসনিক কর্ম, অ্যাকাউন্ট সৃষ্টিকরণ, পাতা অপসারণ, আপলোড....",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
        "uploaded-href-unsafe-target-svg": "অনিরাপদ উপাত্তে href পাওয়া গেছে: আপলোডকৃত SVG ফাইলে URI লক্ষ্য ছিল <code>&lt;$1 $2=\"$3\"&gt;</code>।",
        "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
-       "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"$1\" রয়েছে",
+       "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"<nowiki>$1</nowiki>\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "uploadvirus": "এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1",
        "uploadjava": "এটি একটি ZIP ফরম্যাটের ফাইল, যেখানে একটি জাভা .class ফরম্যাটের ফাইল রয়েছে।\nজাভা ফাইল আপলোডের কোনো অনুমতি নেই, কারণ এই ধরনের ফাইল সিস্টেমে নিরাপত্তা ত্রুটি তৈরী করতে পারে।",
        "backend-fail-store": "\"$2\"-এ \"$1\" ফাইলটি সংরক্ষন করা সম্ভব নয়।",
        "backend-fail-copy": "\"$1\" ফাইলটি \"$2\"-তে অনুলিপি করা সম্ভব নয়।",
        "backend-fail-move": "\"$2\"-এ \"$1\" ফাইলটি স্থানান্তর করা সম্ভব নয়।",
-       "backend-fail-opentemp": "à¦\85সà§\8dথায়à§\80 à¦«à¦¾à¦\87লà¦\9fি à¦\93পà§\87ন à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bে না।",
+       "backend-fail-opentemp": "à¦\85সà§\8dথায়à§\80 à¦«à¦¾à¦\87লà¦\9fি à¦\96à§\8bলা à¦¯à¦¾à¦¬ে না।",
        "backend-fail-writetemp": "অস্থায়ী ফাইলটিতে লেখা যাচ্ছে না।",
        "backend-fail-closetemp": "অস্থায়ী ফাইলটি বন্ধ করা যাচ্ছে না।",
-       "backend-fail-read": "$1 ফাইলটি ওপেন করা যাচ্ছে না।",
+       "backend-fail-read": "\"$1\" ফাইলটি পড়া যাচ্ছে না।",
        "backend-fail-create": "$1 ফাইলটি তৈরী করা যাচ্ছে না।",
        "backend-fail-maxsize": "\"$1\" ফাইলে লেখা যাচ্ছে না কারণ এটি {{PLURAL:$2|এক বাইট|$2 বাইট}} থেকে বড়।",
        "backend-fail-readonly": "\"$1\" স্টোরেজ ব্যাকএন্ড থেকে বর্তমানে শুধু-পঠনে রয়েছে। প্রদত্ত কারণ: <em>$2</em>",
        "apisandbox-results": "ফলাফল",
        "apisandbox-sending-request": "API অনুরোধ পাঠানো হচ্ছে...",
        "apisandbox-loading-results": "API ফলাফল গ্রহণ করা হচ্ছে...",
+       "apisandbox-results-error": "এপিআই কুয়েরির প্রতিক্রিয়া লোড করার সময় একটি ত্রুটি ঘটেছে: $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 মি.সে.}}",
        "apisandbox-results-fixtoken": "টোকেন সংশোধন ও পুনরায় জমা",
+       "apisandbox-results-fixtoken-fail": "\"$1\" টোকেন আনতে ব্যর্থ হয়েছে।",
        "apisandbox-alert-page": "এই পাতার ঘরগুলো বৈধ নয়।",
        "apisandbox-alert-field": "এই ক্ষেত্রের মান বৈধ নয়।",
        "apisandbox-continue": "অব্যাহত",
        "apisandbox-continue-clear": "পরিস্কার",
+       "apisandbox-param-limit": "সর্বোচ্চ সীমা ব্যবহার করতে <kbd>max</kbd> লিখুন।",
+       "apisandbox-multivalue-all-namespaces": "$1 (সব নামস্থান)",
+       "apisandbox-multivalue-all-values": "$1 (সব মান)",
        "booksources": "বইয়ের উৎস",
        "booksources-search-legend": "বইয়ের উৎসের জন্য অনুসন্ধান করা হোক",
        "booksources-isbn": "আইএসবিএন:",
        "booksources-text": "নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:",
        "booksources-invalid-isbn": "উল্লেখিত ISBN সঠিক নয়; অনুগ্রহ করে মূল উৎস থেকে আবার পরীক্ষা করুন।",
        "magiclink-tracking-rfc": "আরএফসি জাদু সংযোগ ব্যবহার করা পাতা",
+       "magiclink-tracking-rfc-desc": "এই পাতাটি RFC যাদু সংযোগ ব্যবহার করে। কিভাবে মাইগ্রেট করবেন জানতে [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": "লক্ষ্য (শিরোনাম বা {{ns:user}}:ব্যবহারকারীর জন্য ব্যবহারকারী নাম):",
        "log": "লগগুলি",
        "logempty": "মিলে যায় এমন কিছু লগে পাওয়া যায়নি।",
        "log-title-wildcard": "এই টেক্সট দিয়ে শুরু হওয়া শিরোনামগুলি অনুসন্ধান করা হোক",
        "showhideselectedlogentries": "নির্বাচিত লগগুলো দেখাও/লুকাও",
+       "log-edit-tags": "নির্বাচিত লগের ভুক্তির ট্যাগ সম্পাদনা করুন",
        "checkbox-select": "নির্বাচন: $1",
        "checkbox-all": "সব",
        "checkbox-none": "কোনটিই নয়",
        "allpagesbadtitle": "প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।",
        "allpages-bad-ns": "{{SITENAME}}-এ \"$1\" নামের কোন নামস্থান নেই।",
        "allpages-hide-redirects": "পুনর্নির্দেশনাগুলো লুকাও",
-       "cachedspecial-viewing-cached-ttl": "à¦\86পনার à¦\93পà§\87ন à¦\95রা à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\95à§\8dযাশ à¦¥à§\87à¦\95à§\87 à¦ªà§\8dরদরà§\8dশিত à¦¹à¦\9aà§\8dà¦\9bà§\87, à¦\8fà¦\9fি $1 দিনের পুরানো হতে পারে।",
-       "cachedspecial-viewing-cached-ts": "à¦\86পনার à¦\93পà§\87ন à¦\95রা à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\95à§\8dযাশ à¦¥à§\87à¦\95à§\87 à¦ªà§\8dরদরà§\8dশিত à¦¹à¦\9aà§\8dà¦\9bà§\87, à¦\8fà¦\9fি à¦¸à¦®à§\8dপà§\82রà§\8dণ à¦¨à¦¤à§\81ন হতে পারে।",
+       "cachedspecial-viewing-cached-ttl": "à¦\86পনি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠায় à¦\8fà¦\95à¦\9fি à¦\95à§\8dযাশà§\87 à¦¸à¦\82সà§\8dà¦\95রণ à¦¦à§\87à¦\96à¦\9bà§\87ন, à¦¯à¦¾ $1 দিনের পুরানো হতে পারে।",
+       "cachedspecial-viewing-cached-ts": "à¦\86পনি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠায় à¦\8fà¦\95à¦\9fি à¦\95à§\8dযাশà§\87 à¦¸à¦\82সà§\8dà¦\95রণ à¦¦à§\87à¦\96à¦\9bà§\87ন, à¦¯à¦¾ à¦¸à¦®à§\8dপà§\82রà§\8dণরà§\82পà§\87 à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদà¦\95à§\83ত à¦¨à¦¾à¦\93 হতে পারে।",
        "cachedspecial-refresh-now": "সাম্প্রতিকগুলো প্রদর্শন করো।",
        "categories": "বিষয়শ্রেণীসমূহ",
        "categories-submit": "দেখাও",
        "activeusers-intro": "এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।",
        "activeusers-count": "গত {{PLURAL:$3|কালে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মের}} সংখ্যা $1টি",
        "activeusers-from": "ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:",
+       "activeusers-groups": "এই দলভুক্ত ব্যবহারকারী দেখান:",
+       "activeusers-excludegroups": "এই দলভুক্ত ব্যবহারকারী বাদ দিন:",
        "activeusers-noresult": "কোনো ব্যবহারকারী পাওয়া যায়নি।",
        "activeusers-submit": "সক্রিয় ব্যবহারকারী প্রদর্শন করুন",
        "listgrouprights": "দলগত ব্যবহারকারী অধিকার",
        "listgrouprights-removegroup-self-all": "নিজের অ্যাকাউন্ট থেকে সকল দল অপসারণ",
        "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
        "listgrouprights-namespaceprotection-namespace": "নামস্থান",
+       "listgrouprights-namespaceprotection-restrictedto": "অধিকার যা ব্যবহারকারীকে সম্পাদনা করার অনুমতি দেয়",
        "listgrants": "কার্যভার",
        "listgrants-summary": "নিম্নে ব্যবহারকারী অধিকারের সাথে যুক্ত প্রবেশাধিকারসহ তাদের কার্যভারের একটি তালিকা দেয়া হয়েছে। ব্যবহারকারীরা তাদের অ্যাকাউন্ট ব্যবহার করতে অ্যাপ্লিকেশনকে অনুমোদন দিতে পারে, কিন্তু কার্যভারের উপর ভিত্তি করে সীমিত অনুমতি ব্যবহারকারীরা অ্যাপ্লিকেশনকে দিতে পারবেন। মূলত, একটি অ্যাপ্লিকেশন একজন ব্যবহারকারীর দেয়া অধিকারের অতিরিক্ত অধিকার ব্যবহার করতে পারবে না। পৃথক অধিকার সম্পর্কে [[{{MediaWiki:Listgrouprights-helppage}}|অতিরিক্ত তথ্য]] দেখুন।",
        "listgrants-grant": "কার্যভার",
        "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
-       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}।",
+       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}। যদি {{GENDER:$2|আপনি}} এই ইমেইলটির উত্তর দেন, তাহলে {{GENDER:$2|আপনার}} উত্তরের ইমেইলটি সরাসরি {{GENDER:$1|মূল প্রেরকের}} কাছে পাঠানো হবে, সেই সাথে {{GENDER:$2|আপনার}} ইমেল ঠিকানা {{GENDER:$1|তাঁর}} কাছে প্রকাশ করা হবে।",
        "usermessage-summary": "বাদবাকি সিস্টেম বার্তা",
        "usermessage-editor": "সিস্টেম ম্যাসেঞ্জার",
+       "usermessage-template": "MediaWiki:ব্যবহারকারী বার্তা",
        "watchlist": "নজর তালিকা",
        "mywatchlist": "নজর তালিকা",
        "watchlistfor2": "$1 ($2)-এর জন্য",
        "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"পিছনে\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা পুনঃলোড করুন এবং আবার চেষ্টা করুন।",
-       "changecontentmodel": "à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87ল পরিবর্তন",
-       "changecontentmodel-legend": "বিষয়বসà§\8dতà§\81র à¦®à¦¡à§\87ল পরিবর্তন করুন",
+       "changecontentmodel": "à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦°à§\82প পরিবর্তন",
+       "changecontentmodel-legend": "বিষয়বসà§\8dতà§\81র à¦°à§\82প পরিবর্তন করুন",
        "changecontentmodel-title-label": "পাতার শিরোনাম",
        "changecontentmodel-model-label": "পাতার বিষয়বস্তুর প্রতিরূপ",
        "changecontentmodel-reason-label": "কারণ:",
        "changecontentmodel-submit": "পরিবর্তন করুন",
        "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
        "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
-       "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর মডেল উপলব্ধ নয়",
-       "log-name-contentmodel": "বিষয়বস্তুর মডেল পরিবর্তন লগ",
-       "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর মডেল \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
+       "changecontentmodel-nodirectediting": "$1 বিষয়বস্তুর রূপ সরাসরি সম্পাদনা করা সমর্থন করে না",
+       "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর রূপ উপলব্ধ নয়",
+       "log-name-contentmodel": "বিষয়বস্তুর রূপ পরিবর্তন লগ",
+       "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর রূপ \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
        "logentry-contentmodel-change-revertlink": "প্রত্যাবর্তন",
        "logentry-contentmodel-change-revert": "প্রত্যাবর্তন",
        "protectlogpage": "সুরক্ষা লগ",
        "undeletehistorynoadmin": "এই পাতাটি মুছে ফেলা হয়েছে। মুছে ফেলার কারণ নিচের সারাংশে দেখানো হল। সেই সাথে মুছে ফেলার আগে যেসমস্ত ব্যবহারকারী পাতাটি সম্পাদনা করেছেন, তাদের সম্পর্কেও বিস্তারিত দেখানো হল। এই মুছে ফেলা সংশোধনগুলির বিষয়বস্তু  কেবল প্রশাসকদের কাছে লভ্য।",
        "undelete-revision": "$3-এর করা $1 সংশোধন ($4 তারিখে, $5 সময়ের) মুছে ফেলা হয়েছে:",
        "undeleterevision-missing": "সংশোধনটি অবৈধ কিংবা হারানো গেছে। আপনি হয়ত অচল সংযোগে ক্লিক করেছেন, কিংবা সংশোধনটি হয়ত বাতিল করে পাতাটি পূর্বাবস্থায় নেওয়া হয়েছে, অথবা সংশোধনটি আর্কাইভ থেকে মুছে ফেলা হয়েছে।",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|একটি সংশোধন|$1টি সংশোধন}} পুনরুদ্ধার করা যাবে না, কারণ {{PLURAL:$1|এটির|এগুলির}} <code>rev_id</code> ইতিমধ্যেই ব্যবহৃত হয়েছে।",
        "undelete-nodiff": "পূর্বের কোন সংশোধন খুঁজে পাওয়া যায়নি।",
        "undeletebtn": "পুনরুদ্ধার",
        "undeletelink": "দেখুন/পুনর্বহাল করুন",
        "ipboptions": "২ ঘণ্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "ipbhidename": "সম্পাদনা ও তালিকা থেকে ব্যবহারকারী নাম লুকিয়ে রাখা হোক",
        "ipbwatchuser": "এই ব্যবহাকারীর পাতা এবং আলাপের পাতা নজরতালিকায় রাখো",
-       "ipb-disableusertalk": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨à¦\95à§\83ত à¦\85বসà§\8dথায় à¦¨à¦¿à¦\9aের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
+       "ipb-disableusertalk": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨à¦\95à§\83ত à¦\85বসà§\8dথায় à¦¨à¦¿à¦\9cের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
        "ipb-change-block": "এই একই সেটিংসসহ ব্যবহারকারীকে আবারও বাধা প্রদান করো",
        "ipb-confirm": "বাধা নিশ্চিতকরণ",
        "badipaddress": "আইপি (IP) ঠিকানাটি অগ্রহনযোগ্য",
        "proxyblockreason": "আপনার আইপি ঠিকানাকে বাধা দেয়া হয়েছে কারণ এটি একটি উন্মুক্ত প্রক্সি। অনুগ্রহ করে আপনার ইন্টারনেট সেবা প্রদানকারী কোম্পানির সাথে কারিগরি সহায়তার ব্যাপারে যোগাযোগ করুন এবং এই গুরুত্বপূর্ণ নিরাপত্তা সমস্যার ব্যাপারে তাদেরকে অবহিত করুন।",
        "sorbsreason": "আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে।",
        "sorbs_create_account_reason": "আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে। আপনি কোন অ্যাকাউন্ট সৃষ্টি করতে পারবেন না।",
+       "softblockrangesreason": "বেনামী অবদান আপনার আইপি ঠিকানা থেকে অনুমোদিত নয় ($1)। দয়া করে প্রবেশ করুন।",
        "xffblockreason": "X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1",
        "cant-see-hidden-user": "আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার 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": "পাতা স্থানান্তর করুন",
        "movelogpagetext": "সরানো পাতাগুলির একটি তালিকা নিচে দেয়া হল।",
        "movesubpage": "{{PLURAL:$1|উপপাতা|উপপাতাসমূহ}}",
        "movesubpagetext": "এই পাতার $1টি {{PLURAL:$1|উপপাতা}} রয়েছে যেগুলো নিচে দেখানো হচ্ছে।",
+       "movesubpagetalktext": "সংশ্লিষ্ট আলাপ পাতার $1টি {{PLURAL:$1|উপপাতা}} রয়েছে যেগুলো নিচে দেখানো হচ্ছে।",
        "movenosubpage": "এই পাতাটির কোনো উপপাতা নেই।",
        "movereason": "কারণ:",
        "revertmove": "পূর্বাবস্থায় ফেরত নেওয়া হোক",
        "pageinfo-header-restrictions": "পাতা সুরক্ষা",
        "pageinfo-header-properties": "পাতা বৈশিষ্টসমূহ",
        "pageinfo-display-title": "শিরনাম প্রদর্শন",
-       "pageinfo-default-sort": "ডিফলà§\8dà¦\9f à¦¸à¦°à§\8dà¦\9f à¦\95ি",
+       "pageinfo-default-sort": "পà§\82রà§\8dবনিরà§\8dধারিত à¦¬à¦¾à¦\9bাà¦\87য়à§\87র à¦\9aাবি",
        "pageinfo-length": "পাতার দৈর্ঘ্য (বাইটে)",
        "pageinfo-article-id": "পাতার আইডি",
        "pageinfo-language": "পাতার তথ্যের ভাষা",
-       "pageinfo-content-model": "পাতার বিষয়বস্তুর মডেল",
+       "pageinfo-language-change": "পরিবর্তন",
+       "pageinfo-content-model": "পাতার বিষয়বস্তুর রূপ",
        "pageinfo-content-model-change": "পরিবর্তন",
        "pageinfo-robot-policy": "রোবটের মাধ্যমে ইন্ডেক্স করা হচ্ছে",
        "pageinfo-robot-index": "অনুমোদিত",
        "table_pager_prev": "পূর্ববর্তী পাতা",
        "table_pager_first": "প্রথম পাতা",
        "table_pager_last": "শেষ পাতা",
-       "table_pager_limit": "প্রতি পাতায় $1 গুলো বিষয়বস্তু দেখাও",
+       "table_pager_limit": "প্রতি পাতায় $1টি উপাদান দেখাও",
        "table_pager_limit_label": "প্রতি পাতায় আইটেম সংখ্যা:",
        "table_pager_limit_submit": "চলো",
        "table_pager_empty": "ফলাফল শূন্য",
        "hijri-calendar-m11": "জ্বিলকদ",
        "hijri-calendar-m12": "জ্বিলহজ্জ",
        "hebrew-calendar-m1": "তিশরেই",
+       "hebrew-calendar-m2": "হেশভান",
+       "hebrew-calendar-m3": "কিসলেভ",
+       "hebrew-calendar-m4": "তেভেত",
+       "hebrew-calendar-m5": "শেভাত",
+       "hebrew-calendar-m6": "আদার",
+       "hebrew-calendar-m6a": "আদার ১",
+       "hebrew-calendar-m6b": "আদার ২",
+       "hebrew-calendar-m7": "নিসান",
+       "hebrew-calendar-m8": "ইয়্যার",
+       "hebrew-calendar-m9": "সিভান",
        "hebrew-calendar-m10": "তামুয",
        "hebrew-calendar-m11": "আভ",
        "hebrew-calendar-m12": "এলুল",
+       "hebrew-calendar-m1-gen": "তিশরি",
+       "hebrew-calendar-m2-gen": "হেশভান",
+       "hebrew-calendar-m3-gen": "কিসলেভ",
+       "hebrew-calendar-m4-gen": "তেভেত",
+       "hebrew-calendar-m5-gen": "শেভাত",
+       "hebrew-calendar-m6-gen": "আদার",
+       "hebrew-calendar-m6a-gen": "আদার ১",
+       "hebrew-calendar-m6b-gen": "আদার ২",
        "hebrew-calendar-m7-gen": "নিসান",
+       "hebrew-calendar-m8-gen": "ইয়্যার",
+       "hebrew-calendar-m9-gen": "সিভান",
+       "hebrew-calendar-m10-gen": "তামুয",
+       "hebrew-calendar-m11-gen": "আভ",
+       "hebrew-calendar-m12-gen": "এলুল",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|আলাপ]])",
        "timezone-utc": "ইউটিসি",
        "timezone-local": "স্থানীয়",
        "tag-filter": "[[Special:Tags|ট্যাগ]] ছাকনী:",
        "tag-filter-submit": "ছাকনী",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ট্যাগ}}]]: $2)",
+       "tag-mw-contentmodelchange": "বিষয়বস্তুর রূপ পরিবর্তন",
+       "tag-mw-contentmodelchange-description": "সম্পাদনা যা একটি পাতার [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel বিষয়বস্তুর রূপ পরিবর্তন] করে",
        "tags-title": "ট্যাগসমূহ",
        "tags-intro": "এই পাতায় সফটওয়্যারটি একটি সম্পাদনা চিহ্নিত করার জন্য যে সকল ট্যাগ ব্যবহার করে তার তালিকা ও বর্ণনা রয়েছে।",
        "tags-tag": "ট্যাগ নাম",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
        "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
+       "tags-delete-too-many-uses": "\"$1\" ট্যাগটি $2টিরও অধিক {{PLURAL:$2|সংশোধনে}} প্রয়োগ করা হয়েছে, যার অর্থ এটি অপসারণ করা যাবে না।",
        "tags-delete-no-permission": "আপনার পরিবর্তন ট্যাগ মুছে ফেলার অনুমতি নেই।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-question": "আপনি ট্যাগ \"$1\" সক্রিয় করতে চলেছেন।",
        "tags-deactivate-reason": "কারণ:",
        "tags-deactivate-not-allowed": "ট্যাগ \"$1\" নিষ্ক্রিয় করা সম্ভব নয়।",
        "tags-deactivate-submit": "নিষ্ক্রিয়",
+       "tags-apply-no-permission": "আপনার পরিবর্তনসহ আপনার ট্যাগ পরিবর্তন প্রয়োগ করার অনুমতি নেই।",
+       "tags-apply-not-allowed-one": "\"$1\" ট্যাগটি ম্যানুয়ালি প্রয়োগ করা যাবে না।",
+       "tags-apply-not-allowed-multi": "নিন্মলিখিত {{PLURAL:$2|ট্যাগটি|ট্যাগগুলি}} ম্যানুয়ালি প্রয়োগ করা যাবে না: $1",
+       "tags-update-no-permission": "স্বতন্ত্র সংশোধন বা লগের ভুক্তি থেকে আপনার ট্যাগ পরিবর্তন যোগ বা বাতিল করার অনুমতি নেই।",
+       "tags-update-add-not-allowed-one": "\"$1\" ট্যাগটি ম্যানুয়ালি যোগ করা যাবে না।",
+       "tags-update-add-not-allowed-multi": "নিন্মলিখিত {{PLURAL:$2|ট্যাগটি|ট্যাগগুলি}} ম্যানুয়ালি যোগ করা যাবে না: $1",
+       "tags-update-remove-not-allowed-one": "\"$1\" ট্যাগটি বাতিল করা যাবে না।",
+       "tags-update-remove-not-allowed-multi": "নিন্মলিখিত {{PLURAL:$2|ট্যাগটি|ট্যাগগুলি}} ম্যানুয়ালি বাতিল করা যাবে না: $1",
        "tags-edit-title": "ট্যাগ সম্পাদনা করুন",
        "tags-edit-manage-link": "ট্যাগ পরিচালনা করুন",
        "tags-edit-revision-selected": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|নির্বাচিত লগ ইভেন্ট}}:",
+       "tags-edit-logentry-legend": "{{PLURAL:$1|এই লগের ভুক্তি|$1টি লগের ভুক্তি}} থেকে ট্যাগ যোগ বা বাতিল করুন",
        "tags-edit-existing-tags": "বিদ্যমান ট্যাগ:",
        "tags-edit-existing-tags-none": "<em>কোনটি নয়</em>",
        "tags-edit-new-tags": "নতুন ট্যাগ:",
        "tags-edit-chosen-placeholder": "কিছু ট্যাগ নির্বাচন করুন",
        "tags-edit-chosen-no-results": "কোন ট্যাগ মিল পাওয়া যায়নি",
        "tags-edit-reason": "কারণ:",
-       "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|এই সংশোধনে|$1 সংশোধনসমূহে}} পরিবর্তন প্রয়োগ করুন",
+       "tags-edit-revision-submit": "{{PLURAL:$1|এই সংশোধনে|$1টি সংশোধনে}} পরিবর্তন প্রয়োগ করুন",
+       "tags-edit-logentry-submit": "{{PLURAL:$1|এই লগের ভুক্তিতে|$1টি লগের ভুক্তিতে}} পরিবর্তন প্রয়োগ করুন",
        "tags-edit-success": "পরিবর্তন প্রয়োগ করা হয়েছে।",
        "tags-edit-failure": "পরিবর্তন প্রয়োগ করা যায়নি: $1",
        "tags-edit-nooldid-title": "লক্ষ্য সংশোধন অবৈধ",
        "htmlform-date-placeholder": "বববব-মম-দদ",
        "htmlform-time-placeholder": "ঘঘ:মম:সস",
        "htmlform-datetime-placeholder": "বববব-মম-দদ ঘঘ:মম:সস",
+       "htmlform-date-invalid": "প্রদানকৃত মানটি স্বীকৃত তারিখ নয়। বববব-মম-দদ বিন্যাস ব্যবহার করে চেষ্টা করুন।",
+       "htmlform-time-invalid": "প্রদানকৃত মানটি স্বীকৃত সময় নয়। ঘঘ:মম:সস বিন্যাস ব্যবহার করে চেষ্টা করুন।",
+       "htmlform-datetime-invalid": "প্রদানকৃত মানটি স্বীকৃত তারিখ ও সময় নয়। বববব-মম-দদ ঘঘ:মম:সস বিন্যাস ব্যবহার করে চেষ্টা করুন।",
+       "htmlform-date-toolow": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ $1-এর অনেক আগের।",
+       "htmlform-date-toohigh": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ $1-এর অনেক পরের।",
+       "htmlform-time-toolow": "আপনার প্রদানকৃত মানটি অনুমোদিত সময় $1-এর অনেক আগের।",
+       "htmlform-time-toohigh": "আপনার প্রদানকৃত মানটি অনুমোদিত সময় $1-এর অনেক পরের।",
+       "htmlform-datetime-toolow": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ ও সময় $1-এর অনেক আগের।",
+       "htmlform-datetime-toohigh": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ ও সময় $1-এর অনেক পরের।",
        "htmlform-title-badnamespace": "[[:$1]] \"{{ns:$2}}\" নামস্থানে খুঁজে পাওয়া যায়নি।",
        "htmlform-title-not-creatable": "\"$1\" সৃষ্টিযোগ্য পাতার শিরোনাম নয়",
        "htmlform-title-not-exists": "$1-এর অস্তিত্ব নেই।",
        "htmlform-user-not-exists": "<strong>$1</strong>-এর অস্তিত্ব নেই।",
        "htmlform-user-not-valid": "<strong>$1</strong> একটি বৈধ ব্যবহারকারীর নাম নয়।",
        "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে",
+       "logentry-delete-delete_redir": "$1 পুনর্লিখনের দ্বারা $3 পুনর্নির্দেশ {{GENDER:$2|অপসারণ করেছেন}}",
        "logentry-delete-restore": "$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে",
        "logentry-delete-event": "$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-delete-revision": "$1 {{PLURAL:$5|একটি সংস্করণের|$5টি সংস্করণের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-upload-overwrite": "$1 $3-এর একটি নতুন সংস্করণ {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
-       "logentry-managetags-create": "$1 \"$4\" ট্যাগ {{GENDER:$2|তৈরি করেছে}}",
+       "logentry-managetags-create": "$1 \"$4\" ট্যাগটি {{GENDER:$2|তৈরি করেছেন}}",
        "logentry-managetags-delete": "$1 \"$4\" ট্যাগটি {{GENDER:$2|অপসারণ করেছেন}} ($5টি {{PLURAL:$5|সংস্করণ বা লগ ভুক্তি|সংস্করণ ও/বা লগ ভুক্তি}} সরানো হয়েছে)",
+       "logentry-managetags-deactivate": "$1 \"$4\" ট্যাগটি ব্যবহারকারী ও বট দ্বারা ব্যবহারের জন্য {{GENDER:$2|নিষ্ক্রিয়}} করেছেন",
        "log-name-tag": "ট্যাগ লগ",
        "rightsnone": "(কিছু নাই)",
        "revdelete-summary": "সম্পাদনা সারাংশ",
+       "rightslogentry-temporary-group": "$1 (সাময়িক, $2 পর্যন্ত)",
        "feedback-adding": "পাতায় প্রতিক্রিয়া যোগ হচ্ছে...",
        "feedback-back": "পিছনে",
        "feedback-bugcheck": "উত্তম! যাচাই করুন যে এই [$1  জানা বাগের] কোন একটি কিনা।",
        "feedback-useragent": "ব্যবহারকারী এজেন্ট:",
        "searchsuggest-search": "{{SITENAME}} অনুসন্ধান",
        "searchsuggest-containing": "যা আছে...",
-       "api-error-badaccess-groups": "আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।",
        "api-error-badtoken": "অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।",
-       "api-error-blocked": "আপনাকে সম্পাদনা করা থেকে বাধা দেয়া হয়েছে।",
-       "api-error-copyuploaddisabled": "এই সার্ভারে ইউআরএল-এর মাধ্যমে আপলোড করার সুবিধা নিস্ক্রিয় রয়েছে।",
-       "api-error-duplicate": "ইতোমধ্যে এই সাইটে একই রকমের বিষয় সমৃদ্ধ {{PLURAL:$1|অন্য ফাইল|কিছু অন্য ফাইল}} রয়েছে।",
-       "api-error-duplicate-archive": "একই নাম ও বিষয়বস্তু বিশিষ্ট {{PLURAL:$1|অপর একটি ফাইল|কয়েকটি ফাইল}} পূর্বে এই উইকিতে ছিলো, এবং {{PLURAL:$1|সেটিকে|সেগুলোকে}} অপসারণ করা হয়েছে।",
-       "api-error-empty-file": "আপনার জমাকৃত ফাইলটি খালি।",
        "api-error-emptypage": "নতুন পাতা তৈরি হচ্ছে, খালি পাতা গ্রহণযোগ্য নয়।",
-       "api-error-fetchfileerror": "অভ্যন্তরীণ ত্রুটি: ফাইল নিয়ে আসার সময় কোনো সমস্যা হয়েছিলো।",
-       "api-error-fileexists-forbidden": "\"$1\" নামের একটি ফাইল রয়েছে, প্রতিস্থাপন সম্ভব নয়।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" নামে শেয়ার্ড রিপোজিরীতে একটি ফাইল রয়েছে, প্রতিস্থাপন সম্ভব নয়।",
-       "api-error-file-too-large": "আপনার জমাকৃত ফাইলটি অনেক বড়।",
-       "api-error-filename-tooshort": "এই ফাইল নামটি খুবই ছোট।",
-       "api-error-filetype-banned": "এই ধরনের ফাইল নিষিদ্ধ।",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2।",
-       "api-error-filetype-missing": "এই ফাইলটির কোনো এক্সটেনশন নেই।",
-       "api-error-hookaborted": "যে পরিবর্তনটি আপনি করার চেষ্টা করেছিলেন তা এক্সটেনশন হুক দ্বারা বাতিলকৃত হয়েছে।",
-       "api-error-http": "অভ্যন্তরীণ ত্রুটি: সার্ভারে সংযোগ প্রদান করা সম্ভব হচ্ছে না।",
-       "api-error-illegal-filename": "ফাইলের এই নামটি গ্রহণযোগ্য নয়।",
-       "api-error-internal-error": "অভ্যন্তরীণ ত্রুটি: এই উইকিতে আপনার আপলোড প্রক্রিয়াকরণ করার সময় কোনো ত্রুটি দেখা দিয়েছে।",
-       "api-error-invalid-file-key": "অভ্যন্তরীণ ত্রুটি: অস্থায়ী সংরক্ষণশালায় ফাইলটি খুঁজে পাওয়া যায়নি।",
-       "api-error-missingparam": "অভ্যন্তরীণ ত্রুটি: অনুরোধে কিছু প্যারামিটারের ঘাটতি রয়েছে।",
-       "api-error-missingresult": "অভ্যন্তরীণ ত্রুটি: সফলভাবে অনুলিপি করা হয়েছে কিনা তা নিশ্চিত করা সম্ভব হয়নি।",
-       "api-error-mustbeloggedin": "ফাইল আপলোড করার জন্য আপনাকে অবশ্যই এই উইকিতে প্রবেশ করতে হবে।",
-       "api-error-mustbeposted": "অভ্যন্তরীণ ত্রুটি: এই অনুরোধের জন্য এইচটিটিপি পোস্ট প্রয়োজন।",
-       "api-error-noimageinfo": "আপলোড সফল হয়েছে, কিন্তু ফাইলটি সম্পর্কে সার্ভার কোন তথ্য প্রদান করে নি।",
-       "api-error-nomodule": "অভ্যন্তরীণ ত্রুটি: কোন আপলোড মডিউল সেট করা হয়নি।",
-       "api-error-ok-but-empty": "অভ্যন্তরীণ ত্রুটি: সার্ভার হতে কোন সাড়া পাওয়া যাচ্ছে না।",
-       "api-error-overwrite": "ইতিমধ্যেই রয়েছে এমন কোনো ফাইলের প্রতিস্থাপন গ্রহণযোগ্য নয়।",
-       "api-error-stashfailed": "অভ্যন্তরীণ ত্রুটি: সার্ভার অস্থায়ী ফাইলটি সংরক্ষণ করতে ব্যর্থ হয়েছে।",
        "api-error-publishfailed": "অভ্যন্তরীন ত্রুটি: সার্ভার অস্থায়ী ফাইলটি প্রকাশ করতে ব্যর্থ হয়েছে।",
-       "api-error-stasherror": "স্ট্যাশে আপলোডের সময় চিত্র আপলোডের সময় একটি সমস্যা দেখা দিয়েছে।",
-       "api-error-stashfilestorage": "স্ট্যাশে ফাইল সংরক্ষণের সময় একটি ত্রুটি হয়েছে।",
-       "api-error-timeout": "কাঙ্খিত সময়ের মধ্যে সার্ভারের কোন সাড়া পাওয়া যায়নি।",
-       "api-error-unclassified": "একটি অজানা ত্রুটি দেখা দিয়েছে",
-       "api-error-unknown-code": "অজানা ত্রুটি: \"$1\"",
-       "api-error-unknown-error": "অভ্যন্তরীণ ত্রুটি: আপনার ফাইলটি আপলোড করার সময় কিছু সমস্যা হয়েছে।",
-       "api-error-unknown-warning": "অজানা সতর্কীকরণ: $1",
+       "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|ঘণ্টা}}",
        "expand_templates_generate_xml": "XML পার্স বৃক্ষ দেখাও",
        "expand_templates_generate_rawhtml": "এইচটিএমএল দেখাও",
        "expand_templates_preview": "প্রাকদর্শন",
+       "expand_templates_preview_fail_html": "<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে ও সেশন উপাত্ত হারিয়ে গিয়েছে, জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি লুকায়িত আছে।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন।</strong>\nযদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে [[Special:UserLogout|বেরিয়ে গিয়ে]] আবার প্রবেশ করুন, এবং পরীক্ষা করে দেখুন যে আপনার ব্রাউজারে এই সাইট থেকে কুকি অনুমতি দেয়।",
+       "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে ও আপনি প্রবেশ করেন নি, জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি লুকায়িত আছে।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে  [[Special:UserLogin|প্রবেশ করুন]] ও আবার চেষ্টা করুন।</strong>",
        "expand_templates_input_missing": "আপনাকে অন্তত কিছু ইনপুট লেখা প্রদান করতে হবে।",
        "pagelanguage": "পাতার ভাষা পরিবর্তন করুন",
        "pagelang-name": "পাতা",
        "pagelang-language": "ভাষা",
        "pagelang-use-default": "ডিফল্ট ভাষা ব্যবহার করুন",
        "pagelang-select-lang": "ভাষা নির্বাচন করুন",
+       "pagelang-reason": "কারণ",
        "pagelang-submit": "জমা দাও",
+       "pagelang-nonexistent-page": "$1 শিরোনামে কোন পাতা নেই।",
+       "pagelang-db-failed": "ডাটাবেস পৃষ্ঠার ভাষা পরিবর্তন করতে ব্যর্থ হয়েছে।",
        "right-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "action-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "log-name-pagelang": "ভাষা পরিবর্তন লগ",
        "mw-widgets-dateinput-no-date": "কোন তারিখ নির্বাচন করা হয়নি",
        "mw-widgets-dateinput-placeholder-day": "বববব-মম-দদ",
        "mw-widgets-dateinput-placeholder-month": "বববব-মম",
+       "mw-widgets-mediasearch-input-placeholder": "মিডিয়ার জন্য অনুসন্ধান",
+       "mw-widgets-mediasearch-noresults": "কোনো ফলাফল পাওয়া যায়নি।",
        "mw-widgets-titleinput-description-new-page": "পাতা এখনো বিদ্যমান নয়",
        "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
+       "mw-widgets-categoryselector-add-category-placeholder": "একটি বিষয়শ্রেণী যোগ করুন...",
+       "mw-widgets-usersmultiselect-placeholder": "আরও যোগ করুন...",
        "sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1।",
        "sessionprovider-generic": "$1টি সেশন",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "কুকি-ভিত্তিক সেশন",
        "sessionprovider-nocookies": "কুকি নিষ্ক্রিয় করা। নিশ্চিত করুন যে আপনার কুকি সক্রিয় আছে এবং আবার শুরু করুন।",
        "randomrootpage": "অজানা মূল পাতা",
        "log-action-filter-block": "বাধাদানের ধরন:",
+       "log-action-filter-contentmodel": "বিষয়বস্তুর রূপ পরিবর্তনের ধরন:",
        "log-action-filter-delete": "অপসারণের ধরন:",
        "log-action-filter-import": "আমদানির ধরন:",
        "log-action-filter-managetags": "ট্যাগ ব্যবস্থাপনা কার্যের ধরন:",
        "log-action-filter-block-block": "বাধাদান",
        "log-action-filter-block-reblock": "বাধাদান পরিবর্তন",
        "log-action-filter-block-unblock": "বাধা অপসারণ",
-       "log-action-filter-contentmodel-change": "বিষয়বস্তুর মডেল পরিবর্তন",
+       "log-action-filter-contentmodel-change": "বিষয়বস্তুর রূপ পরিবর্তন",
+       "log-action-filter-contentmodel-new": "অ-মানক বিষয়বস্তুর রূপসহ পাতা তৈরি",
        "log-action-filter-delete-delete": "পাতা অপসারণ",
        "log-action-filter-delete-restore": "পাতা পুনঃরুদ্ধার",
        "log-action-filter-delete-event": "লগ অপসারণ",
        "authmanager-create-disabled": "অ্যাকাউন্ট সৃষ্টিকরণ নিষ্ক্রিয় করা হয়েছে।",
        "authmanager-create-from-login": "আপনার একাউন্ট তৈরি করতে, ক্ষেত্রগুলি পূরণ করুন।",
        "authmanager-authplugin-setpass-failed-title": "পাসওয়ার্ড পরিবর্তন ব্যর্থ হয়েছে",
+       "authmanager-authplugin-setpass-failed-message": "প্রমাণীকরণ প্লাগইন পাসওয়ার্ড পরিবর্তন করতে অস্বীকৃতি জানিয়েছে।",
+       "authmanager-authplugin-create-fail": "প্রমাণীকরণ প্লাগইন অ্যাকাউন্ট তৈরি করতে অস্বীকৃতি জানিয়েছে।",
        "authmanager-authplugin-setpass-bad-domain": "অবৈধ ডোমেইন।",
        "authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
        "authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
        "authmanager-provider-password": "পাসওয়ার্ড-ভিত্তিক প্রমাণীকরণ।",
        "authmanager-provider-password-domain": "পাসওয়ার্ড ও ডোমেইন-ভিত্তিক প্রমাণীকরণ।",
        "authmanager-provider-temporarypassword": "অস্থায়ী পাসওয়ার্ড",
+       "authprovider-confirmlink-request-label": "অ্যাকাউন্ট যা সংযুক্ত হওয়া উচিত",
        "authprovider-confirmlink-success-line": "$1: সংযোগ করা সফল হয়েছে।",
+       "authprovider-confirmlink-failed": "অ্যাকাউন্ট সংযোগ করা সম্পূর্ণরূপে সফল হয়নি: $1",
+       "authprovider-confirmlink-ok-help": "সংযোগ করা ব্যর্থতাসূচক বার্তাগুলি প্রদর্শন করার পরেও চালিয়ে যান।",
        "authprovider-resetpass-skip-label": "উপেক্ষা করো",
        "authprovider-resetpass-skip-help": "পাসওয়ার্ড পুনঃস্থাপন করা উপেক্ষা করুন।",
+       "authform-nosession-login": "প্রমাণীকরণ সফল ছিল, কিন্তু আপনার ব্রাউজার \"স্মরণ\" রাখতে পারবে না যে আপনি প্রবেশ করেছেন।\n\n$1",
+       "authform-nosession-signup": "অ্যাকাউন্ট তৈরি করা হয়েছে, কিন্তু আপনার ব্রাউজার \"স্মরণ\" রাখতে পারবে না যে আপনি প্রবেশ করেছেন।\n\n$1",
        "authform-newtoken": "টোকেন অনুপস্থিত। $1",
        "authform-notoken": "টোকেন অনুপস্থিত",
        "authform-wrongtoken": "ভুল টোকেন",
        "specialpage-securitylevel-not-allowed-title": "অনুমতি নেই",
        "specialpage-securitylevel-not-allowed": "দুঃখিত, আপনি এই পাতা ব্যবহার করতে অনুমতিপ্রাপ্ত নন কারণ আপনার পরিচয় যাচাই করা যায়নি।",
        "authpage-cannot-login": "প্রবেশ শুরু করা সম্ভন নয়।",
+       "authpage-cannot-login-continue": "প্রবেশ অব্যাহত রাখা সম্ভব নয়। সম্ভবত আপনার সেশনের সময় শেষ হয়েছে।",
+       "authpage-cannot-create": "অ্যাকাউন্ট সৃষ্টি আরম্ভ করা সম্ভব নয়।",
+       "authpage-cannot-create-continue": "অ্যাকাউন্ট সৃষ্টি অব্যাহত রাখা সম্ভব নয়। সম্ভবত আপনার সেশনের সময় শেষ হয়েছে।",
+       "authpage-cannot-link": "অ্যাকাউন্ট সংযোগ করা আরম্ভ করা সম্ভব নয়।",
+       "authpage-cannot-link-continue": "অ্যাকাউন্ট সংযোগ করা অব্যাহত রাখা সম্ভব নয়। সম্ভবত আপনার সেশনের সময় শেষ হয়েছে।",
        "cannotauth-not-allowed-title": "অনুমতি অস্বীকৃত",
        "cannotauth-not-allowed": "আপনি এই পাতাটি ব্যবহার করতে অনুমতিপ্রাপ্ত নন।",
        "changecredentials": "পরিচয়পত্র পরিবর্তন করুন",
        "removecredentials-success": "আপনার পরিচয়পত্র সরানো হয়েছে।",
        "credentialsform-provider": "পরিচয়পত্রের ধরন:",
        "credentialsform-account": "অ্যাকাউন্টের নাম:",
+       "cannotlink-no-provider-title": "আর কোন সংযোগযোগ্য অ্যাকাউন্ট নেই",
+       "cannotlink-no-provider": "আর কোন সংযোগযোগ্য অ্যাকাউন্ট নেই।",
        "linkaccounts": "অ্যাকাউন্ট সংযোগ করুন",
        "linkaccounts-success-text": "অ্যাকাউন্টটি সংযোগ করা হয়েছে।",
        "linkaccounts-submit": "অ্যাকাউন্ট সংযুক্ত করুন",
        "usercssispublic": "অনুগ্রহ করে লক্ষ্য করুন: সিএসএসের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
-       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন",
-       "edit-error-short": "ত্রুটি: $1",
-       "edit-error-long": "ত্রুটিসমূহ:\n\n$1"
+       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "সংশোধন $1",
+       "pageid": "পাতার আইডি $1"
 }
index 0bdaf65..f1b084d 100644 (file)
@@ -4,7 +4,8 @@
                        "Usingha",
                        "Uttam Singha, Dec 2006",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "MtDu"
                ]
        },
        "tog-underline": "লিঙ্কর তলে দুরগ দিক:",
        "variants": "ভেরিয়েন্টহানি",
        "errorpagetitle": "লাল",
        "returnto": "$1-ত আলথকে যাগা।",
-       "tagline": "মুক্ত বিশ্বকোষ উইকিপিডিয়াত্ত",
+       "tagline": "মুক্ত বিশ্বকোষ উইকিপিডিয়াত্ত {{SITENAME}}",
        "help": "পাংলাক",
        "search": "বিসারিয়া চা",
        "searchbutton": "বিসারানি",
index e18bf6c..c1a13dd 100644 (file)
@@ -44,7 +44,9 @@
        "tog-showhiddencats": "نشودادن دسته بندیهای قایم شده",
        "underline-always": "همیشه",
        "underline-never": "هرگز",
-       "underline-default": "پیش نمایش مرورگر",
+       "underline-default": "پۈسدإ آ دوڤارتإ نيأر پيش فرز",
+       "editfont-sansserif": "فونت سان سئریف",
+       "editfont-serif": "فونت سريف",
        "sunday": "یکشنبه",
        "monday": "دوشنبه",
        "tuesday": "سه‌شنبه",
        "oct": "ئوکتوبر",
        "nov": "نوڤامر",
        "dec": "دئسامر",
+       "january-date": "جانڤيأ $1",
+       "february-date": "فإڤريأ $1",
+       "march-date": "مارس  $1",
+       "april-date": "آڤريل $1",
+       "may-date": "مإی $1",
+       "june-date": "جۈأن $1",
+       "july-date": "جۈلای $1",
+       "august-date": "آگوست $1",
+       "september-date": "سپتامر $1",
+       "october-date": "اوکتوبر $1",
+       "november-date": "نوڤامر $1",
+       "december-date": "دسامر $1",
        "period-am": "دم سوڤ",
        "period-pm": "پسين",
        "pagecategories": "{{PLURAL:$1|دسته|دسته ها}}",
        "category-file-count-limited": "ذیل الذکر {{PLURAL:$1|فایل است|$1 فایلها هستند}} درآن دسته جریانی.",
        "listingcontinuesabbrev": "دنباله",
        "about": "درباره",
+       "article": "بلگه آ مینونه دار",
        "newwindow": "(پنجره تازه واز کن)",
        "cancel": "لغو",
+       "moredotdotdot": "بيشدر",
        "mypage": "بألگأ",
        "mytalk": "چأک چنأ",
        "anontalk": "چأک چنأ",
        "qbbrowse": "قأرز کردن",
        "qbedit": "اصلاح",
        "qbpageoptions": "اي بألگأ",
+       "qbmyoptions": "بألگإ آ مو",
        "faq": "اف ای کیو",
        "faqpage": "Project:اف ای کیو",
+       "actions": "کونئشتکاریا",
        "namespaces": "نوم ڤأرگأ آ",
        "variants": "آلشدگأرا",
        "navigation-heading": "نوم جاگأ ناڤگردي",
        "help": "راهنما",
        "search": "پئی جوٙری",
        "searchbutton": "پئی جوٙری",
+       "go": "رۉ",
        "searcharticle": "برو",
        "history": "گزارش صفحه",
        "history_short": "گزارش تاریخی",
+       "history_small": "ڤیرگار",
        "printableversion": "نوسقئ پئلا ڤابیدٙئنی",
        "permalink": "لینک دایمی",
+       "print": "چاپ گرهڌن",
        "view": "ديئن",
        "view-foreign": "مئن $1 نه بوینین",
        "edit": "اصلاح",
+       "create": "راس كردن",
+       "create-local": "یأ توزی ڤولات نشيني إزافإ کونين",
        "editthispage": "اصلاح ای صفحه",
        "delete": "حذف",
+       "deletethispage": "اي بلگأ نأ پاکسا کونين",
+       "undeletethispage": "اي بلگأ نأ پاکسا نکونين",
        "protect": "حفاظت وحمایت",
+       "protect_change": "آلإشت کونين",
+       "protectthispage": "ز اي بلگأ هامينداري کونين",
        "newpage": "صفحه تازه",
        "talkpage": "بحث ای صفحه",
        "talkpagelinktext": "چأک چئنە",
        "otherlanguages": "درزبانهای دیگر",
        "redirectedfrom": "(تصحیح مجدداز$1)",
        "redirectpagesub": "صفحه تصحیح وهدایت مجدد",
+       "redirectto": "ڤاگردۈنی سی:",
        "lastmodifiedat": "این صفحه اخیرا تغییر واصلاح شددر $1, در $2.",
        "viewcount": "این صفحه قابل دسترسی شده است {{PLURAL:$1|once|$1 times}}.",
        "protectedpage": "صفحه حمایت شده",
        "jumpto": "پریدن به:",
        "jumptonavigation": "راندن یا هدایت کردن",
        "jumptosearch": "جستن",
+       "pool-errorunknown": "خطا نادیار",
        "aboutsite": "راجوڤ بئ {{SITENAME}}",
        "aboutpage": "Project:راجڤ بئ",
        "copyright": "محتوا باای شماره قابل دسترسیه\n $1.",
        "disclaimers": "تیە پوٙشنا",
        "disclaimerpage": "Project: تیە پوشنیدٙئنئ کولی",
        "edithelp": "کمک برای اصلاح",
+       "helppage-top-gethelp": "هومیاري",
        "mainpage": "سأرآسوٙنە",
        "mainpage-description": "صفحه اصلی",
        "policy-url": "Project:خط مشی",
        "toc": "محتواها",
        "showtoc": "نمایش",
        "hidetoc": "قایم",
+       "collapsible-collapse": "جأم كردن",
+       "collapsible-expand": "گأپ کلۈن کردن",
+       "confirmable-yes": "هرإ",
+       "confirmable-no": "نأ",
        "thisisdeleted": "دیدن یا اعاده $1?",
        "viewdeleted": "دیدن$1?",
        "restorelink": "{{PLURAL:$1|پاک کردن یه اصلاح|$1 پاک کردن اصلاحات}}",
        "red-link-title": "$1 (چونو بألگئ یی نیدٙئس)",
        "nstab-main": "بلگه",
        "nstab-user": "صفحه کاربر",
+       "nstab-media": "بلگأ ڤارسگأري",
        "nstab-special": "بألگه ڤیجه",
        "nstab-project": "صفحه پروژه",
        "nstab-image": "فایل",
+       "nstab-mediawiki": "پیغوم",
        "nstab-template": "قالب یا الگو",
+       "nstab-help": "بألگإ هومیاری",
        "nstab-category": "دسته",
        "mainpage-nstab": "سأرآسوٙنە",
+       "error": "خطا",
+       "databaseerror-query": "جوستکاری: $1",
+       "databaseerror-error": "خطا: $1",
+       "internalerror": "خطا مإنجقایي",
        "badtitle": "عنوان بد",
        "badtitletext": "عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرسته\nو ممکنه دارای یک یا چند کاراکتر بوه که در عنوان مربوط نوا زش استفاده کنین",
        "viewsource": "مشاهده منبع",
        "viewsourcetext": "ایسا ترین بوینین وکپی کنین منبع ای صفحه را:",
+       "welcomeuser": "خۈش أڤوڌين،$1!",
        "yourname": "نام کاربر:",
        "userlogin-yourname": "نوم کارياري",
        "userlogin-yourname-ph": "نوم کاریاريتونأ بزنين",
        "yourpassword": "رمز:",
        "userlogin-yourpassword": "رازينإ گوڤأرتن",
+       "userlogin-yourpassword-ph": "رازينإ گوڤأرتن نأ بزأ",
+       "createacct-yourpassword-ph": "رازينإ گوڤأرتن نأ بزأ",
+       "createacct-yourpasswordagain": "پشت راسدکاري رازينإ گوڤأرتن",
+       "createacct-yourpasswordagain-ph": "ز نۉ رازينإ گوڤأرتن نأ بزأ",
+       "userlogin-remembermypassword": "مۈنإ مإن سامۈنإ ڤاڌار",
+       "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-emailoptional": "تيرنشۈن أنجومانامأ",
+       "createacct-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
+       "createaccountreason": "دلیل:",
+       "createacct-reason": "دلیل",
+       "createacct-submit": "هساڤ خوتۈنإ راسد کونين",
+       "createacct-another-submit": "راسد کردن هساڤ کارياري",
+       "createacct-benefit-body1": "{{PLURAL:$1|ڤيرایشد|ڤيرایشدا}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|بألگأ|بألگإ آ}}",
+       "createacct-benefit-body3": "تازأ{{PLURAL:$1|هوميار|هوميارا}}",
        "loginsuccesstitle": "اویدن با بخت وتوفیق به سیستم",
        "loginsuccess": "''' ایسا اویدن به داخل سایت {{SITENAME}} بعنوان \"$1\".'''",
        "nosuchuser": "کاربری به ای نام وجود نداره \"$1\".\nحروف نام را چک کنین, یا [[Special:CreateAccount|درست کنین یه حساب کاربری تازه]].",
        "wrongpassword": "رمز وارد وابیده درست نه.\nلطفا دوباره سعی کنین.",
        "wrongpasswordempty": "رمز وارد وابیده عقیم یامبهم بی.\nلطفا دوباره سعی کنین.",
        "passwordtooshort": "رمز ایسا غیر معتبر یا کوتاه هده.\nآن وا داشته بوه حداقل {{PLURAL:$1|1 کاراکتر|$1 کاراکترها}} همچنین وا زه نام کاربریتو متفاوت بوه.",
-       "mailmypassword": "اÙ\85Û\8cÙ\84 Ø±Ù\85ز ØªØ§Ø²Ù\87",
+       "mailmypassword": "ز Ù\86Û\89 Ø¯Ø§Ú\8cÙ\86 Ø±Ø§Ø²Ù\8aÙ\86Ø¥ Ú¯Ù\88أرتÙ\86",
        "passwordremindertitle": "رمز موقتی تازه سی {{SITENAME}}",
        "passwordremindertext": "یه نفر (شاید خودتو, زه نشانی آی پی$1) درخواست یه رمز تازه کرده سی {{SITENAME}} ($4). یه رمز موقتی سی کاربر\n\"$2\" درست شده وگذاشته وابیده به\"$3\". ایر مطابق میل ایسا بوه, نیازه که داخل سیستم بوین ویه رمز تازه انتخاب کنین.\n\nایر آن فرد همچنین درخواست کرده بوه  یونه, یا ایر ایسا رمزتو را به خاط داشته این ,\nوسی مدت طولانی نه خوین هونه تغییر بدین, ایسا وا نادیده بگیرین ای پیام  را وهمچنان زه رمز قدیمی خوتو استفاده کنین",
        "noemail": "وجود نداره نشانی امیل ضبط وابده زه کاریر \"$1\".",
        "passwordsent": "یه رمز تازه ارسال وابید به نشانی امیل ثبت وابده سی \"$1\".\nلطفا بعد از دریافت آن داخل سیستم بوین.",
        "eauthentsent": "یه ایمیل سی تایید آدرس ایمیل به آدرس مورنظر ارسال وابید. قبل زه یو که ایمیل دیگری قابل ارسال به این آدرس بوه، وا دستورهایی که در آن ایمیل اویده را جهت تأیید ای مساله که ای آدرس مال ایسانه اجرا کنین.",
+       "accountcreated": "هساڤ راسد ڤابي",
        "loginlanguagelabel": "زۈن:$1",
        "pt-login": "ڤامین اوڤیڌن",
+       "pt-login-button": "ڤامین اوڤیڌن",
        "pt-createaccount": "راسد کردن هساڤ کارياري",
        "pt-userlogout": "ز سامۈنإ درأڤوڌن",
+       "changepassword": "آلشد کردن رازينإ گوڤأرتن",
+       "oldpassword": "رازينإ گوڤأرتن ديندایي:",
+       "newpassword": "رازينإ گوڤأرتن تازأ:",
        "retypenew": "تایپ دوباره رمز:",
+       "botpasswords": "رازينإیل گوڤأرتن بوتا",
+       "botpasswords-label-appid": "نوم بوت:",
+       "botpasswords-label-create": "راس كردن",
+       "botpasswords-label-update": "ب هنگوم سازی",
+       "botpasswords-label-cancel": "أنجومشيڤ کردن",
+       "botpasswords-label-delete": "پاکسا کردن",
+       "botpasswords-label-resetpassword": "ز نۉ داڌن رازينإ گوأرتن",
+       "botpasswords-label-grants-column": "داڌإ ڤابي",
+       "resetpass-submit-loggedin": "آلشد کردن رازينإ گوڤأرتن",
+       "resetpass-submit-cancel": "أنجومشيڤ کردن",
+       "passwordreset": "ز نۉ داڌن رازينإ گوأرتن",
+       "passwordreset-username": "نوم کارياري",
+       "passwordreset-domain": "پوشگر",
+       "passwordreset-email": "تيرنشۈن أنجومانامأ",
+       "changeemail-none": "(هيش كوم)",
        "bold_sample": "متن گپ نما",
        "bold_tip": "متن گپ نما",
        "italic_sample": "متن شکسته",
        "sig_tip": "امضای ایسا و برچسب زمان",
        "hr_tip": "خط افقی (کم استفاده کنین)",
        "summary": "خلاصه:",
-       "subject": "موضوع/سرخط:",
+       "subject": "داسۈن",
        "minoredit": "ای یه اصلاح ریزه-رز",
        "watchthis": "پیگیری ای صفحه",
        "savearticle": "صفحه ضبط بوه",
        "anoneditwarning": "'''توجه:''' ایسا داخل سیستم نوابیدین.\nآی پی آدرستو درگزارش اصلاح صفحه ضبط ابوه.",
        "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": "ڤامإن إڤوڌن لازومإ",
        "loginreqlink": "ڤامین اوڤیڌن",
+       "accmailtitle": "رازينإ گوڤأرتن فرشناڌإ ڤابيڌإ",
        "newarticle": "(تازه)",
-       "newarticletext": "ایسا لینکی را دنبال کردین و به صفحه‌ای رسیدین که هنی درست نوابیده.\nسی ایجاد صفحه، داخل مستطیل زیر شروع به تایپ کنین (سی اطلاعات بیشتر به [[{{ns:project}}:راهنما|صفحه راهنما] برین).\nایر اشتباهی ایچو اویدین دکمه «برگشت» مرورگرتو را بزنین.",
-       "noarticletext": " Ø§Ù\84اÙ\86 Ø§Û\8c ØµÙ\81Ø­Ù\87 Ù\85تÙ\86Û\8c Ù\86دارÙ\87Ø\8c Ø§Û\8cسا ØªØ±Û\8cÙ\86 [[Special:Search/{{PAGENAME}}عÙ\86Ù\88اÙ\86 Ø§Û\8c ØµÙ\81Ø­Ù\87 Ø±Ø§ Ø¯Ø± ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ø¯Û\8cگر Ø¬Ø³ØªØ¬Ù\88 Ú©Ù\86Û\8cÙ\86]] Û\8cا [{{fullurl:{{FULLPAGENAME}}|action=edit}} Ø§Û\8c ØµÙ\81Ø­Ù\87 Ø±Ø§ Ø§ØµÙ\84اح Ú©Ù\86Û\8cن].",
+       "newarticletext": "ايسا ز دين یأ هومپیڤأندي هڌين کإ نيڌس. سي رأڤأندياري بألگإ شورۈ کونين مإن اي جأڤإ دإڤۈني بنڤيسين(سي دونسدن بیشدر سإیل [$1]کونین).\nأر ايسا سي إشتڤاکاري ايچونين، دوگمإ رأهڌن ڤاپوشد نأ بپۈرنين.",
+       "noarticletext": " Ø§Ù\8aسإ Ø§Ù\8a Ø¨Ø£Ù\84گإ Ù\86إڤشدإÛ\8cÙ\8a Ù\86ارإØ\8c Ø§Ù\8aسا ØªØ¥Ø±Ù\8aÙ\86 [[Special:Search/{{PAGENAME}}داسÛ\88Ù\86 Ø§Ù\8a Ø¨Ø£Ù\84گإ Ù\86Ø¥ Ù\85Ø¥Ù\86 Ø¨Ø£Ù\84گإآ Ø¯Ù\8aأرÙ\8a Ù¾Û\8c Ø¬Û\88رÙ\8a Ú©Ù\88Ù\86Ù\8aÙ\86]] Û\8cا [{{fullurl:{{FULLPAGENAME}}|action=edit}} Ø§Ù\8a Ø¨Ø£Ù\84گإ Ù\86Ø£ Ú¤Ù\8aراÛ\8cشد Ú©Ù\88Ù\86Ù\8aن].",
        "previewnote": "'''ای فقط یه پیش نمایشه;\nتغییراتی که ایسا دادین هنی ضبط نوابیده!'''",
        "editing": "درحال اصلاح $1",
+       "creating": "راسد کردن $1",
        "editingsection": "درحال اصلاح $1 (قسمت)",
+       "yourtext": "متن ايسا",
        "copyrightwarning": "لطفاً دقت کنین که درنظر گریده ابوه که همه شراکتهای ایسا  {{SITENAME}} تحت «$2» منتشر ابون ).\n\n\n(سی دیدن  جزئیات بیشتر به $1 برین\n\nایر نه خوین نوشته‌هاتو بی‌رحمانه اصلاح بوه و به دلخواه ارسال بوه، ایچو نفرستن.<br />\nدرضمن ایسادارین به ایما قول ادین که خودتو یونه نوشتین یا هونه زه یک منبع آزاد با مالکیت عمومی یا مثل هو ورداشتین. '''کارهای دارای کارهای دارای حق کپی رایت را بی‌اجازه نفرستین!'''',",
-       "templatesused": "قالبهای استفاده شده من ای صفحه:",
+       "templatesused": "{{PLURAL:$1|چوٙأ|چوٙأیل}} ب کار گرهڌأ ڤابيڌإ مإن اي بألگأ:",
        "templatesusedpreview": "قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:",
        "template-protected": "(تحت حمایت)",
        "template-semiprotected": "(نیمه حمایت وابیده)",
        "nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
+       "permissionserrorstext-withaction": "ايسا سی نياگري $2 سإلا\nنارين {{PLURAL:$1|دلیل|دليلا}}:",
        "recreate-moveddeleted-warn": "'''هشدار: ایسا در حال درست کردن دوباره صفحه‌ای هدین که قبلاً حذف وابیده '''در نظر داشته بوین که ادامه اصلاح ای صفحه کار درستی هده یا نه. نمایه حذف مربوط به ای صفحه سی راحتی کار در ادامه اویده",
+       "content-model-wikitext": "ڤيکي تکست",
+       "content-model-javascript": "جاڤا إسکريپت",
        "viewpagelogs": "نشودادن نمایه ها سی ای صفحه",
        "currentrev": "نسخه جاری",
+       "currentrev-asof": "آخرين ڤانيأري جۈر $1",
        "revisionasof": "اصلاح $1",
-       "revision-info": "یه نسخه اصلاح شده درتاریخ  $1 بوسیله $2",
+       "revision-info": "نوسقإ ڤانيأري ڤابيڌإ جۈر $1 ڤا $2",
        "previousrevision": "← اصلاح قبلی",
        "nextrevision": "نسخه بعدی →",
        "currentrevisionlink": "نسخه جاری",
        "cur": "فعلی",
+       "next": "نيایي",
        "last": "قبلی",
        "page_first": "اولین",
        "page_last": "آخری",
        "histlegend": "انتخاب متفاوت: علامت بنین رو رادیو جعبه ها زه آن نسخه ها سی مقایسه وامتیاز دادن ویا داخل تکمه های زیر سی مسابقه بوین  .<br />\n'شرح: (فعلی) = تفاوت با نسخه جاری\n(قبلی) = تفاوت با نسخه قبلی، جز = ویرایش جزئی',",
-       "histfirst": "کهنه ترین",
-       "histlast": "تازه ترین",
+       "histfirst": "دينداتري",
+       "histlast": "تازإترين",
+       "historyempty": "(هالي)",
        "history-feed-item-nocomment": "$1 در $2",
-       "history-title": "گزارش تاریخی نسخه زه \"$1\"",
+       "rev-delundel": "آلشد هال و بال ديإن",
+       "rev-showdeleted": "دياري کردن",
+       "revdelete-show-file-submit": "هأرإ",
+       "revdelete-log": "دلیل:",
+       "mergehistory-from": "بألگإ سرچشمأ:",
+       "mergehistory-reason": "دلیل:",
+       "history-title": "دڤارتإ دیئن ڤيرگار $1",
+       "difference-title": "فرخ مإنجقا ڤانإیريا \"$1\"",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
        "editundo": "لغو اصلاح آخر",
        "prevn": "قبلی {{PLURAL:$1|$1}}",
        "nextn": "بعدی {{PLURAL:$1|$1}}",
        "nextn-title": "نيایي $1 {{PLURAL:$1|نتيجه|نتيجإآ}}",
+       "shown-title": "نإشۈن دائن $1 {{PLURAL:$1|نتيجأ|نتيجإ آ}} سي هر بألگأ",
        "viewprevnext": "مشاهده ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "بلگه آ مینونه دار",
        "searchprofile-images": "ڤارسگرا خلکمند",
        "searchprofile-advanced": "پیشکرده",
        "searchprofile-articles-tooltip": "بگرد مئن $1",
        "searchprofile-images-tooltip": "جانیاانه پی جوری کو",
+       "searchprofile-everything-tooltip": "همإ مإنۈنإ آ نأ پی جۈري کو(د ڤر گرهڌإ بألگإیل چأک چنأ)",
+       "searchprofile-advanced-tooltip": "نوم جایل نوم ديار نأ بگرد.",
        "search-result-size": "$1 ({{PLURAL:$2|1 ڤاجه یل|$2 ڤاجه یل}})",
        "search-redirect": "(ڤاگردۈني ز $1)",
        "search-section": "(بهرجا $1)",
+       "search-suggest": "منزۈرت یو بي:$1",
+       "search-interwiki-more": "(بيشدر)",
        "searchall": "همه",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
+       "powersearch-toggleall": "همأ",
+       "powersearch-togglenone": "هيش کوم",
        "preferences": "اولویتها",
        "mypreferences": "خوصوٙیات هأنی",
+       "prefs-skin": "پۈسدأ",
+       "skin-preview": "پيش سإیل",
+       "prefs-watchlist": "سإیل برگ",
+       "prefs-editwatchlist": "ڤيرایشد سإیل برگ",
+       "prefs-misc": "شيڤسدن",
+       "prefs-resetpass": "آلشد کردن رازينإ گوڤأرتن",
+       "saveprefs": "إمایإ کردن",
+       "searchresultshead": "پی جۈري",
+       "stub-threshold-sample-link": "نمۈنأ",
+       "timezoneregion-africa": "إفرقا",
+       "timezoneregion-america": "إمرکا",
+       "timezoneregion-asia": "آسيا",
        "yourrealname": "نام واقعی:",
        "prefs-help-realname": "ذکر نام واقعی اختیاریه ایر تصمیم به گدن بگیرین هنگام ارجاع به آثارتو و انتساب هونو به ایسا زه نام واقعیتو استفاده ابوه",
        "grouppage-sysop": "{{ns:project}}:مدیران",
        "recentchanges-feed-description": "ردیابی آخرین تغییرات  ویکی در ای خورد",
        "recentchanges-label-newpage": "ای ويرايشت يه بلگه تازه راس كرده",
        "recentchanges-label-minor": "یو یه ويرايشت کوچيره",
+       "recentchanges-label-bot": "اي ڤيرایشد نأ یأ بوت أنجوم داڌإ",
        "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نوابيه",
+       "recentchanges-label-plusminus": "أندازإ بألگأ ب شومار اي بایتا آلشد کردإ.",
        "recentchanges-legend-heading": "<strong>میراث:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو سإیل کونين ب[[Special:بألگإیل تازأ|نومگأ بإلگإیل تازأ]])",
        "rcnotefrom": "در زیر تغییرات زه تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشو داده ابوه).",
        "rclistfrom": "نشودادن تغییرات تازه با شروع زه $3 $2",
        "rcshowhideminor": "اصلاحات کوچیک $1",
+       "rcshowhideminor-show": "نشون دائن",
        "rcshowhideminor-hide": "قام کردن",
        "rcshowhidebots": "$1 ربات‌ها یا بوتها",
        "rcshowhidebots-show": "نشون دائن",
+       "rcshowhidebots-hide": "قام کردن",
        "rcshowhideliu": "$1 کاریارا ثوت نام کرده",
        "rcshowhideliu-hide": "قام کئردئن",
        "rcshowhideanons": "$1 کاربران داخل نوابیده",
+       "rcshowhideanons-show": "نشون دائن",
        "rcshowhideanons-hide": "قام کئردئن",
        "rcshowhidepatr": "$1 اصلاحات پاسداری شده",
        "rcshowhidemine": "$1 اصلاحات مو",
+       "rcshowhidemine-show": "نشون دائن",
        "rcshowhidemine-hide": "قام کئردئن",
        "rclinks": "نشودادن آخرین $1 تغییر در $2 روز اخیر؛ $3",
        "diff": "تفاوت",
        "filehist-current": "جاری",
        "filehist-datetime": "تاریخ/زمان",
        "filehist-thumb": "عسگ کۈچير وابيه",
+       "filehist-thumbtext": "كۈچير کردن سی نوسقإ $1",
        "filehist-user": "کاربر",
        "filehist-dimensions": "ابعاد",
        "filehist-filesize": "اندازه فایل",
        "linkstoimage": "ذیل الذکر {{PLURAL:$1|لینکهای صفحه|$1 لینک صفحات}} به ای فایل:",
        "nolinkstoimage": "هیچ صفحه ای نه که لینک وابیده بوه به ای فایل",
        "sharedupload": "ای فایل یک آپلود اشتراکی هده و ممکنه زه طریق  پروژه‌های دیگه  هم قابل دسترسی بوه",
+       "sharedupload-desc-here": "جانيایي کإ مإن $1 گاشا مإن پوروجأیل هإني ب کار گرهڌإ وابيڌإ.\nتۉزي سي [$2 file description page] مإن دإڤۈن دياري کردإ",
        "uploadnewversion-linktext": "آپلود کردن یه نسخه تازه زه ای فایل",
+       "upload-disallowed-here": "ايسا نترين اي جانيا نأ ز نۉ سوڤار کونين",
        "mimesearch": "MIME جستجو رو پایه",
        "listredirects": "لیست تغییر مسیرها",
        "unusedtemplates": "قالبها یا الگوهای استفاده نوابیده",
        "ancientpages": "کهنه ترین صفحات",
        "move": "جابجا کردن",
        "movethispage": "جابجایی ای صفحه",
+       "pager-older-n": "{{PLURAL:$1|گپسالتر 1|گپسالتر $1}}",
        "booksources": "منابع کتاب",
+       "booksources-search-legend": "پی جۈري سي سرچشمإیل کتاڤ",
+       "booksources-search": "پی جۈري",
        "specialloguserlabel": "کاربر:",
        "speciallogtitlelabel": "عنوان:",
        "log": "نمایه ها",
        "deleteotherreason": "دیه/دلیل اضافی:",
        "deletereasonotherlist": "دلیل دیه",
        "rollbacklink": "عقب گرد",
+       "rollbacklinkcount": "چڤاسإ کردن $1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
        "protectlogpage": "نمایه حفاظت وحمایت",
        "prot_1movedto2": "[[$1]] جابجا وابید به[[$2]]",
        "protectcomment": "دلیل:",
        "undeletebtn": "بازیافت",
        "namespace": "فضای نام:",
        "invert": "انتخاب برعکس بوه",
+       "tooltip-invert": "ز ري اي جأڤأ بپۈرنين و آلشدایي نأ کإ مإنجقا نوم ڤأرگأ إنتخاڤ ڤابيڌن أنجوم داڌإ ڤابيڌنإ قام کونين.",
        "namespace_association": "نوم جایل یأکاگرهڌأ",
+       "tooltip-namespace_association": "اي جأڤإ نأ ڤارسي کونين اي جأڤأ د ڤأرگرهڌإ چأک چنإ آ داسۈن نوم ڤأرگأ شريکي و نوم ڤأرگأ گولإڤورچينإ.",
        "blanknamespace": "(اصلی)",
        "contributions": "{{GENDER:$1|کاریار}} هومیاریا",
        "mycontris": "هومياریا",
        "nolinkshere": "هیچ صفحه ای پیوند نداردبه '''[[:$1]]'''.",
        "isredirect": "صفحه تغییر مسیر",
        "istemplate": "استفاده‌ وابیده داخل صفحه",
+       "isimage": "جانیا هوم پیوند",
        "whatlinkshere-prev": "{{PLURAL:$1|قبلی |مورد قبلی$1}}",
        "whatlinkshere-next": "{{PLURAL:$1|بعدی |مورد بعدی $1}}",
        "whatlinkshere-links": "← لینکها",
        "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidetrans": "ڤارو گونجایشدا $1",
        "whatlinkshere-hidelinks": "هوم پیڤأندا $1",
        "whatlinkshere-filters": "فيلترا",
        "blockip": "بستن کاربر",
        "thumbnail_error": "خطا سی درست کردن ناخن دانه: $1",
        "importlogpage": "داخل نمایه کردن",
        "tooltip-pt-userpage": "{{GENDER:|بألگأ کارياريتۈن}} بألگأ",
-       "tooltip-pt-mytalk": "صفحه صحبت مو",
+       "tooltip-pt-mytalk": "{{GENDER:|بألگأ چأک چنإ کارياري مو}}",
        "tooltip-pt-preferences": "{{GENDER:|ايسا}} أصل کاريا",
        "tooltip-pt-watchlist": "لیست صفحه‌هایی که ایسا تغییرات هونو  دنبال اکنین",
-       "tooltip-pt-mycontris": "لیست شراکتهای مو",
+       "tooltip-pt-mycontris": "یأ نومگأ ز هومياري {{GENDER:|ايسا}}",
        "tooltip-pt-login": "توصیه ابوه که به سیستم داخل بوین اما اجباری نه.",
        "tooltip-pt-logout": "رهدن زه سیستم",
+       "tooltip-pt-createaccount": "ايسا پشت گرم ڤابيڌينإ کإ یأ هساڤ راسد کونين و بياین ڤامإن. ب هرهال اي کار إژباري نارإ.",
        "tooltip-ca-talk": "صحبت درباره صفحه محتوا",
        "tooltip-ca-edit": "ڤيرایشت اي بلگه",
        "tooltip-ca-addsection": "شورۈ کردن یه بهرجا دیه",
        "tooltip-ca-watch": "اضاف کردن ای صفحه به لیست پیگیریهاتو",
        "tooltip-ca-unwatch": "حذف ای صفحه زه لیست پی‌گیری‌های ایسا",
        "tooltip-search": "جستن {{SITENAME}}",
+       "tooltip-search-go": "رۉ مإن بألگإیي کإ یأ نوم راستکي داشدإ بۈ.",
        "tooltip-search-fulltext": "بألگأ آنأ سي چونو نإڤشدإیي پإی جۈري کو",
        "tooltip-p-logo": "بإنیرين بإ سرآسۈنأ",
        "tooltip-n-mainpage": "دیدن صفحه اصلی",
        "tooltip-t-recentchangeslinked": "تغییرات آخری  درصفحاتی که لینک شده اند به ای صفحه",
        "tooltip-feed-rss": "تغذیه آراس اس برای ای صفحه",
        "tooltip-feed-atom": "تغذیه کوچیک ترین جزء  ای صفحه",
-       "tooltip-t-contributions": "دیدن فهرست مشارکت کننده ها ومقاله دهنده های ای صفحه",
+       "tooltip-t-contributions": "ديإن نومگأآیي کإ {{GENDER:$1|اي کاریار}} هومياريسۈن کردإ",
        "tooltip-t-emailuser": "ارسال یه امیل به ای کاربر",
        "tooltip-t-upload": "آپلودکردن فایلها",
        "tooltip-t-specialpages": "فهرست همه صفحات مخصوص",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"اعاده\" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک",
        "tooltip-summary": "یأ چکسدأ کۈچير ڤارڌ کونين",
+       "simpleantispam-label": "Anti-spam check.\nپور<strong>نکنين</strong> ايچو نأ!",
        "pageinfo-toolboxlink": "دونسمندیا بلگه",
        "previousdiff": "← اصلاح قدیمی",
        "nextdiff": "تفاوت بعدی→",
        "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": "رشنه یا یا گپ دونسمنیا که د ای پیغوم نومگه کاری بینه د ور گرته بلگه عسگ ن که گات وختی که جدول گپ دونسمنیا واز بوئه نشون دئیه بوئن.\nچی یا هنی سی یه که پیش فرضن قام بوئن.\n*راست کو\n*مدل\n*دم وخت اصل\n*وخت آشگار\n*اف ان شماره\n*ایزو نرخ من سرعت\n*فوکالنس\n*هنرمن\n*کپی رایت\n*حالت جی پی اس \n*جی پی اس گپ حالت\n*جی پی اس همه حالت",
        "exif-orientation": "سرچشمأ",
        "exif-xresolution": "گپ نما کردن اوفقي",
        "exif-yresolution": "گپ نما کردن ز وارو",
+       "exif-datetime": "آلشد داین گات و مجال جانيا",
        "exif-make": "سازیار دیربین",
        "exif-model": "مودل ديربين",
        "exif-software": "نرم افزار ب کارگرهڌني",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "version": "ترجمه یا تفسیر",
        "specialpages": "صفحات ویژه",
-       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر:",
+       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر :",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2)",
        "logentry-delete-delete": "$1 بألگأ {{GENDER:$2|پاکسا ڤابيأ}} $3",
+       "logentry-move-move": "$1 {{GENDER:$2|جا ب جا کردإ}} بألگأ $3 نأ سي $4",
+       "logentry-newusers-create": "هساڤ کارياري $1 {{GENDER:$2|راسد ڤابي}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|سوڤار کرده}} $3",
        "searchsuggest-search": "جستن {{SITENAME}}"
 }
index 8962400..8e26e30 100644 (file)
@@ -17,7 +17,8 @@
                        "아라",
                        "Pymouss",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Trizek (WMF)"
                ]
        },
        "tog-underline": "Liammoù islinennet",
@@ -35,6 +36,8 @@
        "tog-watchdefault": "Ouzhpennañ ar pajennoù kemmet ganin da'm roll evezhiañ",
        "tog-watchmoves": "Ouzhpennañ ar pajennoù dilec'hiet ganin da'm roll evezhiañ",
        "tog-watchdeletion": "Ouzhpennañ ar pajennoù diverket ganin da'm roll evezhiañ",
+       "tog-watchuploads": "Ouzhpennañ em roll-evezhiañ ar restroù nevez a enporzhian.",
+       "tog-watchrollback": "Ouzhpennañ ar pajennoù ma'z on distro war ma roll evezhiañ.",
        "tog-minordefault": "Sellet ouzh ar c'hemmoù degaset ganin<br /> evel kemmoù dister dre ziouer",
        "tog-previewontop": "Rakwelet tres ar bajenn a-us ar prenestr skridaozañ",
        "tog-previewonfirst": "Rakwelet tres ar bajenn kerkent hag an aozadenn gentañ",
        "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister",
        "tog-enotifrevealaddr": "Lakaat ma chomlec'h postel war wel er posteloù kemenn-diwall",
        "tog-shownumberswatching": "Diskouez an niver a lennerien",
-       "tog-oldsig": "Ar sinadur zo evit poent :",
+       "tog-oldsig": "Ho sinadur evit poent :",
        "tog-fancysig": "Ober gant ar sinadur evel pa vefe wikitestenn (hep liamm emgefre)",
-       "tog-uselivepreview": "Implijout Rakwelet prim (taol-arnod)",
+       "tog-uselivepreview": "Ober gant ar Rakwel prim",
        "tog-forceeditsummary": "Kemenn din pa ne skrivan netra er stern diverrañ",
        "tog-watchlisthideown": "Kuzhat ma c'hemmoù er rollad evezhiañ",
        "tog-watchlisthidebots": "Kuzhat kemmoù ar botoù er rollad evezhiañ",
        "tog-watchlisthideminor": "Kuzhat ar c'hemmoù dister er rollad evezhiañ",
        "tog-watchlisthideliu": "Er roll evezhiañ, kuzhat kemmoù an implijerien kevreet.",
+       "tog-watchlistreloadautomatically": "Adkargañ ar roll-evezhiañ bep tro ma vez cheñchet ur sil (rekis eo kaout JavaScript)",
        "tog-watchlisthideanons": "Er roll evezhiañ, kuzhat kemmoù an implijerien dianav",
        "tog-watchlisthidepatrolled": "Kuzhat ar c'hemmoù evezhiet diouzh ar roll evezhiañ",
+       "tog-watchlisthidecategorization": "Kuzhat rummatadur ar pajennoù",
        "tog-ccmeonemails": "Kas din un eilskrid eus ar posteloù a gasan da implijerien all",
        "tog-diffonly": "Arabat diskouez danvez ar pennadoù dindan an diforc'hioù",
        "tog-showhiddencats": "Diskouez ar rummadoù kuzhet",
-       "tog-norollbackdiff": "Na ziskouez an diff goude un distaoladenn",
+       "tog-norollbackdiff": "Na ziskouez an diforc'hioù goude un distro",
        "tog-useeditwarning": "Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ",
        "tog-prefershttps": "Implijout bepred ur c'hevreadur suraet pa vezit kevreet",
        "underline-always": "Atav",
        "newwindow": "(digeriñ en ur prenestr nevez)",
        "cancel": "Nullañ",
        "moredotdotdot": "Ha muioc'h c'hoazh...",
-       "morenotlisted": "N'eo ket klok ar roll-mañ.",
+       "morenotlisted": "Marteze eo diglok ar roll-mañ.",
        "mypage": "Ma zammig pajenn",
        "mytalk": "Ma c'haozeadennoù",
-       "anontalk": "Kaozeal gant ar chomlec'h IP-mañ",
+       "anontalk": "Kaozeal",
        "navigation": "Merdeiñ",
        "and": "&#32;ha(g)",
        "qbfind": "Klask",
        "searcharticle": "Mont",
        "history": "Istor ar bajenn",
        "history_short": "Istor",
+       "history_small": "istor",
        "updatedmarker": "kemmet abaoe ma zaol-sell diwezhañ",
        "printableversion": "Stumm da voullañ",
        "permalink": "Chomlec'h ar stumm-mañ",
        "talk": "Kaozeadenn",
        "views": "Gweladennoù",
        "toolbox": "Ostilhoù",
+       "tool-link-userrights": "Kemmañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "tool-link-userrights-readonly": "Gwelet strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "tool-link-emailuser": "Kas ur postel d'an {{PLURAL:$1|an implijer-mañ|an implijerez-mañ}}",
        "userpage": "Pajenn implijer",
        "projectpage": "Pajenn meta",
        "imagepage": "Gwelet pajenn ar restr",
        "pool-timeout": "Aet eur dreist d'an termen gortoz evit ar stankadenn",
        "pool-queuefull": "Soulgarget eo ar servijerioù",
        "pool-errorunknown": "Fazi dianav",
+       "pool-servererror": "N'eo ket hegerz ar servij kontañ ($1).",
        "poolcounter-usage-error": "Fazi implij : $1",
        "aboutsite": "Diwar-benn {{SITENAME}}",
        "aboutpage": "Project:Diwar-benn",
        "laggedslavemode": "Diwallit : marteze a-walc'h n'emañ ket ar c'hemmoù diwezhañ war ar bajenn-mañ",
        "readonly": "Hizivadurioù stanket war ar bank roadennoù",
        "enterlockreason": "Merkit perak eo stanket hag istimit pegeit e chomo evel-henn",
-       "readonlytext": "Evit poent n'haller ket ouzhpennañ pe gemmañ netra er bank roadennoù mui. Un tamm kempenn boutin d'ar bank moarvat. goude-se e vo plaen an traoù en-dro.\n\nSetu displegadenn ar merour bet prennet ar bank gantañ : $1",
+       "readonlytext": "Evit poent n'haller ket ouzhpennañ pe gemmañ netra en diaz roadennoù mui. Un tamm kempenn boutin d'an diaz moarvat. Goude-se e vo plaen an traoù en-dro.\n\nSetu displegadenn ar merour bet prennet an diaz gantañ : $1",
        "missing-article": "N'eo ket bet kavet gant an diaz titouroù testenn ur bajenn en dije dleet kavout hag anvet \"$1\" $2.\n\nPeurliesañ e c'hoarvez evit bezañ heuliet liamm dispredet un diforc'h pe an istor war-du ur bajenn bet diverket abaoe.\n\nMard ned eo ket se eo, hoc'h eus marteze kavet un draen er meziant.\nKasit keloù d'ur [[Special:ListUsers/sysop|merer]], en ur verkañ dezhañ chomlec'h an URL.",
        "missingarticle-rev": "(adweladenn # : $1)",
        "missingarticle-diff": "(Dif : $1, $2)",
        "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeut munutennoù.",
        "protectedpagetext": "Prennet eo bet ar bajenn-mañ kuit na vefe skrivet pe cheñchet un dra bennak enni",
        "viewsourcetext": "Gallout a rit gwelet hag eilañ danvez ar bajenn-mañ",
-       "viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho '''kemmoù''' d'ar bajenn-mañ :",
+       "viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho <strong>kemmoù</strong> d'ar bajenn-mañ.",
        "protectedinterface": "Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.",
        "editinginterface": "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [https://translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
        "cascadeprotected": "Gwarezet eo ar bajenn-mañ; n'haller ket kemmañ anezhi ken p'he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
        "virus-scanfailed": "Skannadenn c'hwitet (kod $1)",
        "virus-unknownscanner": "diviruzer dianav :",
        "logouttext": "'''Digevreet oc'h bremañ.'''\n\nNotit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h kevreet c'hoazh, betek ma vo riñset krubuilh ho merdeer ganeoc'h.",
+       "cannotlogoutnow-title": "N'haller ket digevreañ bremañ",
+       "cannotlogoutnow-text": "N'haller ket digevreañ pa vezer oc'h implijout $1.",
        "welcomeuser": "Degemer mat $1 !",
        "welcomecreation-msg": "Krouet eo bet ho kont implijer.\nNa zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].",
        "yourname": "Anv implijer :",
        "userlogin-yourname": "Anv implijer",
        "userlogin-yourname-ph": "Merkit hoc'h anv implijer",
-       "createacct-another-username-ph": "Ebarzhiñ an anv implijer",
+       "createacct-another-username-ph": "Merkañ an anv implijer",
        "yourpassword": "Ger-tremen :",
        "userlogin-yourpassword": "Ger-tremen",
        "userlogin-yourpassword-ph": "Merkit ho ker-tremen",
        "createacct-yourpasswordagain-ph": "Skrivit ar ger-tremen adarre",
        "userlogin-remembermypassword": "Derc'hel ac'hanon kevreet",
        "userlogin-signwithsecure": "Implijout ur gevreadenn suraet",
+       "cannotlogin-title": "N'haller ket kevreañ",
+       "cannotlogin-text": "N'haller ket kevreañ.",
+       "cannotloginnow-title": "N'haller ket kevreañ bremañ",
+       "cannotloginnow-text": "N'haller ket kevreañ pa vezer oc'h implijout $1.",
+       "cannotcreateaccount-title": "N'haller ket krouiñ kontoù",
+       "cannotcreateaccount-text": "N'eo ket gweredekaet ar c'hrouiñ kontoù war-eeun er wiki-mañ.",
        "yourdomainname": "Ho tomani",
        "password-change-forbidden": "Ne c'hallit ket kemmañ ar gerioù-tremen er wiki-mañ.",
        "externaldberror": "Pe ez eus bet ur fazi gwiriekaat diavaez er bank titouroù pe n'oc'h ket aotreet da nevesaat ho kont diavaez.",
        "login": "Kevreañ",
+       "login-security": "Gwiriit hoc'h identelezh",
        "nav-login-createaccount": "Krouiñ ur gont pe kevreañ",
        "userlogin": "Kevreañ / krouiñ ur gont",
        "userloginnocreate": "Kevreañ",
        "userlogin-resetpassword-link": "Ankouaet ho ker-tremen ganeoc'h ?",
        "userlogin-helplink2": "Skoazell evit kevreañ",
        "userlogin-loggedin": "Kevreet oc'h dija evel {{GENDER:$1|$1}}.\nImplijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
+       "userlogin-reauth": "Ret eo deoc'h adkevreañ evit prouiñ ez oc'h mat {{GENDER:$1|$1}}",
        "userlogin-createanother": "Krouiñ ur gont all",
        "createacct-emailrequired": "Chomlec'h postel",
        "createacct-emailoptional": "Chomlec'h postel (diret)",
        "createacct-email-ph": "Skrivit ho chomlec'h postel",
-       "createacct-another-email-ph": "Ebarzhiñ ur chomlec'h postel",
+       "createacct-another-email-ph": "Merkañ ur chomlec'h postel",
        "createaccountmail": "Implijout ur ger-tremen dibad ha kas anezhañ d'ar chomlec'h postel diferetDre bostel",
+       "createaccountmail-help": "Gallout a ra bezañ implijet evit krouiñ ur gont evit unan bennak all hep gouzout ar ger-tremen.",
        "createacct-realname": "Anv gwir (diret)",
        "createaccountreason": "Abeg :",
        "createacct-reason": "Abeg",
        "createacct-reason-ph": "Perak emaoc'h o krouiñ ur gont all",
+       "createacct-reason-help": "Kemennadenn embannet e marilh ar c'hrouiñ kontoù",
        "createacct-submit": "Krouiñ ho kont",
        "createacct-another-submit": "Krouiñ ur gont",
+       "createacct-continue-submit": "Kenderc'hel da grouiñ ar gont",
+       "createacct-another-continue-submit": "Kenderc'hel da grouiñ ar gont",
        "createacct-benefit-heading": "{{SITENAME}} zo graet gant tud eveldoc'h.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|kemm}}",
        "createacct-benefit-body2": "pajenn{{PLURAL:$1|}}",
        "createacct-benefit-body3": "{{PLURAL:$1|c'henlabourer|kenlabourer}} nevez",
        "badretype": "Ne glot ket ar gerioù-tremen an eil gant egile.",
+       "usernameinprogress": "Emeur c'hoazh oc'h ober war-dro krouiñ ur gont evit an anv implijer-mañ. Gortozit un tamm bihan.",
        "userexists": "Implijet eo an anv implijer lakaet ganeoc'h dija.\nDibabit un anv all mar plij.",
        "loginerror": "Kudenn gevreañ",
        "createacct-error": "Ur fazi 'zo bet o krouiñ ar gont",
        "nocookiesnew": "Krouet eo bet ar gont implijer met n'oc'h ket kevreet. {{SITENAME}} a implij toupinoù evit ar c'hevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
        "nocookieslogin": "{{SITENAME}} a implij toupinoù evit kevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
        "nocookiesfornew": "N'eo ket bet krouet ar gont implijer peogwir n'eus ket bet gallet gwiriañ an orin anezhi.\nGwiriit eo bet gweredekaet an toupinoù, adkargit ar bajenn ha klaskit en-dro.",
+       "createacct-loginerror": "Krouet eo bet ar gont ervat met n'hallit ket kevreañ en un doare emgefre. [[Special:UserLogin|Kevreit gant an dorn]].",
        "noname": "N'hoc'h eus lakaet anv implijer ebet.",
        "loginsuccesstitle": "Kevreet oc'h.",
        "loginsuccess": "'''Kevreet oc'h bremañ ouzh {{SITENAME}} evel \"$1\".'''",
-       "nosuchuser": "N'eus ket eus an implijer \"$1\".\nKizidik eo anv an implijer ouzh ar pennlizherennoù\nGwiriit eo bet skrivet mat an anv ganeoc'h pe [[Special:CreateAccount|krouit ur gont nevez]].",
+       "nosuchuser": "N'eus ket eus an implijer \"$1\".\nKizidik eo anv an implijerien ouzh ar pennlizherennoù.\nGwiriit eo bet skrivet mat an anv ganeoc'h pe [[Special:CreateAccount|krouit ur gont nevez]].",
        "nosuchusershort": "N'eus perzhiad ebet gantañ an anv « $1 ». Gwiriit ar reizhskrivadur.",
        "nouserspecified": "Ret eo deoc'h spisaat un anv implijer.",
        "login-userblocked": "Stanket eo an implijer-mañ. N'eo ket aotret da gevreañ.",
        "wrongpassword": "Ger-tremen kamm. Klaskit en-dro.",
        "wrongpasswordempty": "Ger-tremen ebet. Lakait unan mar plij.",
        "passwordtooshort": "{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.",
+       "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 arouezenn.",
        "password-name-match": "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
        "password-login-forbidden": "Berzet eo ober gant an anv implijer hag ar ger-tremen-mañ.",
        "mailmypassword": "Adderaouekaat ar ger-tremen",
        "createaccount-text": "Unan bennak en deus krouet ur gont gant ho chomlec'h postel war {{SITENAME}} ($4) zo e anv \"$2\" hag a ra gant ar ger-tremen \"$3\".\nMat e vefe deoc'h kevreañ ha cheñch ho ker-tremen bremañ.\n\nNa daolit ket evezh ouzh ar c'hemenn-mañ m'eo bet krouet ar gont dre fazi.",
        "login-throttled": "Betek re oc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
        "login-abort-generic": "Dibosupl ho kevreañ - Dilezet",
+       "login-migrated-generic": "Dilec'hiet eo bet ho kont ha n'eus ket eus hoc'h anv implijer war ar wiki-mañ ken.",
        "loginlanguagelabel": "Yezh : $1",
        "suspicious-userlogout": "Distaolet eo bet ho koulenn digevreañ rak kaset e oa bet gant ur merdeer direizhet pe krubuilhadenn ur proksi, evit doare.",
        "createacct-another-realname-tip": "Diret eo skrivañ hoc'h anv gwir. Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset ganeoc'h.",
        "pt-login": "Kevreañ",
        "pt-login-button": "Kevreañ",
+       "pt-login-continue-button": "Kenderc'hel da gevreañ",
        "pt-createaccount": "Krouiñ ur gont",
        "pt-userlogout": "Digevreañ",
        "php-mail-error-unknown": "Fazi dianav en arc'hwel postel () PHP",
        "newpassword": "Ger-tremen nevez :",
        "retypenew": "Adskrivañ ar ger-tremen nevez :",
        "resetpass_submit": "Cheñch ar ger-tremen ha kevreañ",
-       "changepassword-success": "Cheñchet eo bet ho ker-tremen !",
+       "changepassword-success": "Cheñchet eo bet ho ker-tremen ervat !",
        "changepassword-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
+       "botpasswords": "Gerioù-tremen ar botoù",
+       "botpasswords-summary": "Aotren a ra <em>gerioù-tremen ar botoù</em> implijout kont un implijer dre an API hep ober gant titouroù-kred pennañ ar gont. Ur wech kevreet dre ger-tremen ur bot e c'hall gwirioù an implijer bezañ strishaet.\n\nMa n'ouzit ket mat perak e c'hallfec'h kaout c'hoant d'ober se, eo furoc'h chom hep en ober. Den ebet ne zlefe goulenn diganeoc'h biken genel unan hag e reiñ dezhañ.",
+       "botpasswords-disabled": "Diweredekaet eo gerioù-tremen ar botoù.",
+       "botpasswords-no-central-id": "Evit gallout implijout gerioù-tremen botoù e ranker kevreañ gant ur gont kreizennet.",
+       "botpasswords-existing": "Gerioù-tremen botoù a zo anezho",
+       "botpasswords-createnew": "Krouiñ ur ger-tremen bot nevez",
+       "botpasswords-editexisting": "Cheñch ger-tremen ur bot a zo anezhañ c'hoazh",
        "botpasswords-label-appid": "Anv ar robot",
        "botpasswords-label-create": "Krouiñ",
        "botpasswords-label-update": "Hizivaat",
        "botpasswords-label-cancel": "Nullañ",
        "botpasswords-label-delete": "Dilemel",
        "botpasswords-label-resetpassword": "Adderaouekaat ar ger-tremen",
+       "botpasswords-label-grants": "Aotreoù a c'haller ober ganto :",
+       "botpasswords-label-grants-column": "Aotreet",
        "botpasswords-bad-appid": "N'eo ket reizh anv ar robot « $1 »",
        "botpasswords-insert-failed": "C'hwitet eo ouzhpennadenn ar robot « $1 ». Hag ouzhpennet eo bet ?",
        "botpasswords-update-failed": "C'hwitet eo bet hizivadur anv ar robot « $1 ». Ha dilamet eo bet ?",
        "botpasswords-deleted-body": "Ar ger-tremen robotoù « $1 » zo bet dilamet.",
        "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen evit kevreañ gant <strong>$1</strong>. Enrollit anezhañ, par plij, evit ober dave dezhañ diwezhatoc'h.</em>",
        "botpasswords-no-provider": "N'eo ket hegerz BotPasswordsSessionProvider.",
+       "botpasswords-not-exist": "N'eus ger-tremen bot ebet anvet \"$2\" gant an implijer \"$1\".",
        "resetpass_forbidden": "N'haller ket cheñch ar gerioù-termen",
+       "resetpass_forbidden-reason": "N'haller ket cheñch ar gerioù-termen : $1",
        "resetpass-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "resetpass-submit-loggedin": "Cheñch ger-tremen",
        "resetpass-submit-cancel": "Nullañ",
-       "resetpass-wrong-oldpass": "Direizh eo ar ger-tremen a-vremañ pe da c'hortoz.",
+       "resetpass-wrong-oldpass": "Direizh eo ar ger-tremen dibad pe an hini a-vremañ. Moarvat ez eus bet cheñchet ger-tremen ganeoc'h c'hoazh pe goulennet ur ger-tremen dibad nevez.",
        "resetpass-recycled": "Ret eo d'ho ker-tremen nevez bezañ disheñvel diouzh ho ker-tremen a vremañ.",
        "resetpass-temp-emailed": "Kevreet e oac'h bet gant ur c'hod dibad kaset deoc'h dre bostel.\nEvit echuiñ kevreañ e rankit lakaat ur ger-tremen nevez amañ :",
        "resetpass-temp-password": "Ger-tremen da c'hortoz :",
        "passwordreset-emaildisabled": "Ne c'haller ket ober gant posteloù er wiki-mañ.",
        "passwordreset-username": "Anv implijer :",
        "passwordreset-domain": "Domani :",
-       "passwordreset-capture": "Gwelet ar postel ?",
-       "passwordreset-capture-help": "Ma askit al logell-mañ e vo diskouezet deoc'h ar postel (gant ar ger-tremen da c'hortoz) war un dro pa vo kaset d'an implijer.",
        "passwordreset-email": "Postel :",
        "passwordreset-emailtitle": "Titouroù kont war {{SITENAME}}",
        "passwordreset-emailtext-ip": "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailtext-user": "Goulennet en deus an implijer $1 war  {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailelement": "Anv implijer :           \n$1\n\nGer-tremen da c'hortoz : \n$2",
        "passwordreset-emailsentemail": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
-       "changeemail": "Kemmañ ar chomlec'h postel",
+       "passwordreset-nocaller": "Ret eo merkañ anv ur galver",
+       "passwordreset-nosuchcaller": "N'eus ket eus ar galver : $1",
+       "passwordreset-invalidemail": "Chomlec'h postel direizh",
+       "passwordreset-nodata": "N'eus bet lakaet anv implijer na chomlec'h postel ebet",
+       "changeemail": "Kemmañ pe dilemel ar chomlec'h postel",
        "changeemail-header": "Kemmañ chomlec'h postel ar gont",
        "changeemail-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "changeemail-oldemail": "Chomlec'h postel a-vremañ :",
        "changeemail-password": "Ho ker-tremen war {{SITENAME}}:",
        "changeemail-submit": "Cheñch chomlec'h postel",
        "changeemail-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
+       "changeemail-nochange": "Merkit ur chomlec'h postel all.",
        "resettokens": "Adderaouekaat ar jedoueroù",
        "resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
        "resettokens-tokens": "Jedoueroù :",
        "missingcommenttext": "Skrivit hoc'h evezhiadenn a-is.",
        "missingcommentheader": "'''Taolit evezh :''' N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
        "summary-preview": "Rakwelet an diverrañ :",
-       "subject-preview": "Rakwelet danvez/titl :",
+       "subject-preview": "Rakwelet an danvez :",
+       "previewerrortext": "C'hoarvezet ez eus ur fazi e-ser klask rakwelet ho kemmoù",
        "blockedtitle": "Implijer stanket",
        "blockedtext": "'''Stanket eo bet ho kont implijer pe ho chomlec'h IP'''\n\nGant $1 eo bet graet.\nSetu an abeg evit se : ''$2''.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Pad ar stankadenn : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel 'kas ur postel d'an implijer-mañ' nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
        "autoblockedtext": "Stanket eo bet ho chomlec'h IP ent emgefreek rak implijet e veze gant un implijer all bet stanket gant $1.\nSetu aze an abeg :\n\n: ''$2''\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar\n[[{{MediaWiki:Grouppage-sysop}}|verourien]] all ma kavit abeg er stankadenn.\n\nNotennit mat ne c'hallot implijout an dibarzh \"kas ur postel d'an implijer\" nemet ma'z eus bet merket ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù implijer]] ha ma n'eo ket bet stanket ivez.\n\n$3 eo ho chomlec'h IP evit poent ha #$5 ho niverenn stankadenn.\nMerkit mat an titouroù-se war kement goulenn savet ganeoc'h.\n\n$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
        "content-model-javascript": "Javascript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Elfenn goullo",
+       "content-json-empty-array": "Taolenn c'houllo",
+       "deprecated-self-close-category": "Pajennoù a ra gant tikedennoù HTML emserriñ direizh",
        "expensive-parserfunction-warning": "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv|galv}}, ha {{PLURAL:$1|$1 galv|$1 galv}} zo.",
        "expensive-parserfunction-category": "Pagjennoù enno re a c'halvoù koustus e-keñver an arc'hwelioù parser.",
        "post-expand-template-inclusion-warning": "Diwallit : re a batromoù zo war ar bajenn-mañ.\nLod anezho a vo lakaet a-gostez.",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
        "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
        "mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
+       "mergehistory-fail-bad-timestamp": "Merk amzer direizh.",
+       "mergehistory-fail-invalid-source": "Pajenn darzh direizh.",
+       "mergehistory-fail-invalid-dest": "Pajenn vuket direizh.",
        "mergehistory-fail-toobig": "Ne c'haller ket kendeuziñ an istorioù o vezañ ma vefe mont en tu all d'ar harzh a $1 reizhadenn da zilec'hiañ.",
        "mergehistory-no-source": "N'eus ket eus ar bajenn orin $1.",
        "mergehistory-no-destination": "N'eus ket eus ar bajenn dal $1.",
        "searchprofile-advanced-tooltip": "Klask en esaouennoù anv personelaet",
        "search-result-size": "$1 ({{PLURAL:$2|1 ger|$2 ger}})",
        "search-result-category-size": "{{PLURAL:$1|1|$1}} ezel ({{PLURAL:$2|1|$2}} is-rummad, {{PLURAL:$3|1|$3}} restr)",
-       "search-redirect": "(adkas $1)",
+       "search-redirect": "(adkas adal $1)",
        "search-section": "(rann $1)",
        "search-category": "(rummad $1)",
        "search-file-match": "(klotañ a ra gant endalc'had ar restr)",
        "search-interwiki-caption": "Raktresoù kar",
        "search-interwiki-default": "Disoc'hoù eus $1 :",
        "search-interwiki-more": "(muioc'h)",
+       "search-interwiki-more-results": "Muioc'h a zisoc'hoù",
        "search-relatedarticle": "Disoc'hoù kar",
        "searchrelated": "disoc'hoù kar",
        "searchall": "An holl",
        "showingresultsinrange": "O tiskouez amañ dindan betek {{PLURAL:$1|<strong>1</strong> disoc'h|<strong>$1</strong> a zisoc'hoù}} etre #<strong>$2</strong> ha #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Disoc'h <strong>$1</strong> of <strong>$3</strong>|a zisoc'hoù <strong>$1 - $2</strong> diwar <strong>$3</strong>}}",
        "search-nonefound": "An enklask-mañ ne zisoc'h war netra.",
+       "search-nonefound-thiswiki": "N'eus bet kavet disoc'h ebet o klotañ gant ar reked el lec'hienn-mañ.",
        "powersearch-legend": "Klask araokaet",
        "powersearch-ns": "Klask en esaouennoù anv :",
        "powersearch-togglelabel": "Dibab :",
        "search-external": "Klask diavaez",
        "searchdisabled": "<p>Diweredekaet eo bet an arc'hwel klask war an destenn a-bezh evit ur frapad rak ur samm re vras e oa evit ar servijer. Emichañs e vo tu d'e adlakaat pa vo ur servijer galloudusoc'h ganeomp. Da c'hortoz e c'hallit klask gant Google:</p>",
        "search-error": "Ur fazi a zo bet e-ser klask : $1",
+       "search-warning": "Ur c'hemenn-diwall zo bet e-ser klask : $1",
        "preferences": "Penndibaboù",
        "mypreferences": "Penndibaboù",
        "prefs-edits": "Niver a zegasadennoù :",
        "prefs-rc": "Kemmoù diwezhañ",
        "prefs-watchlist": "Roll evezhiañ",
        "prefs-editwatchlist": "Kemmañ ar roll evezhiañ",
+       "prefs-editwatchlist-label": "Kemmañ titloù eus ho roll evezhiañ :",
+       "prefs-editwatchlist-edit": "Gwelet ha lemel titloù a-ziwar ho roll evezhiañ",
        "prefs-editwatchlist-raw": "Kemmañ ar roll evezhiañ (mod diginkl)",
        "prefs-editwatchlist-clear": "Diverkañ ho roll evezhiañ",
        "prefs-watchlist-days": "Niver a zevezhioù da ziskouez er rollad evezhiañ :",
        "prefs-watchlist-token": "Jedouer evit ar roll evezhiañ :",
        "prefs-misc": "Penndibaboù liesseurt",
        "prefs-resetpass": "Cheñch ar ger-tremen",
-       "prefs-changeemail": "Cheñch chomlec'h postel",
+       "prefs-changeemail": "Cheñch ar chomlec'h postel pe dilemel anezhañ",
        "prefs-setemail": "Termeniñ ur chomlec'h postel",
        "prefs-email": "Dibarzhioù postel",
        "prefs-rendering": "Neuz",
        "saveprefs": "Enrollañ ar penndibaboù",
        "restoreprefs": "Adlakaat an holl arventennoù dre ziouer (en holl gevrennoù)",
        "prefs-editing": "Prenestr skridaozañ",
-       "rows": "Linennoù :",
-       "columns": "Bannoù",
        "searchresultshead": "Klask",
        "stub-threshold": "Bevenn uhelañ evit al liammoù war-du an danvez pennadoù ($1) :",
+       "stub-threshold-sample-link": "skouer",
        "stub-threshold-disabled": "Diweredekaet",
        "recentchangesdays": "Niver a zevezhioù da ziskouez er c'hemmoù diwezhañ :",
        "recentchangesdays-max": "D'ar muiañ $1 {{PLURAL:$1|deiz|deiz}}",
        "prefs-help-recentchangescount": "Kemer a ra an dra-mañ e kont ar c'hemmoù diwezhañ, istor ar pajennoù hag ar marilhoù.",
        "prefs-help-watchlist-token2": "Homañ zo an alc'hwez kuzh d'ho roll-evezhiañ davit boued war ar web. Forzh piv a anavez anezhañ a c'hall lenn ho roll-evezhiañ, setu na lavarit grit diwar e benn. M'ho pez ezhomm, e c'hallit [[Special:ResetTokens|assevel anezhañ]].",
        "savedprefs": "Enrollet eo bet ar penndibaboù.",
+       "savedrights": "Enrollet eo bet strolladoù implijer {{GENDER:$1|$1}}.",
        "timezonelegend": "Takad eur :",
        "localtime": "Eur lec'hel :",
        "timezoneuseserverdefault": "Ober gant talvoudenn dre ziouer ar wiki ($1)",
        "youremail": "Postel :",
        "username": "{{GENDER:$1|Anv implijer|Anv implijerez}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezel}} eus {{PLURAL:$1|ar strollad|ar strolladoù}}:",
+       "group-membership-link-with-expiry": "$1 (betek $2)",
        "prefs-registration": "Deiziad enskrivañ :",
        "yourrealname": "Anv gwir*",
        "yourlanguage": "Yezh an etrefas&nbsp;",
        "badsig": "Direizh eo ho sinadur kriz; gwiriit ho palizennoù HTML.",
        "badsiglength": "Re hir eo ho sinadur.\nDre ret e rank bezañ nebeutoc'h eget {{PLURAL:$1|arouezenn|arouezenn}} ennañ.",
        "yourgender": "Penaos eo plij deoc'h bezañ deskrivet ?",
-       "gender-unknown": "Gwell eo ganin tevel war se",
+       "gender-unknown": "Pa vo graet anv ac'hanoc'h gant ar meziant e vo graet gant gerioù dic'hour bep tro ma vo posupl",
        "gender-male": "Aozañ a ra-eñ pajennoù wiki",
        "gender-female": "Aozañ a ra-hi pajennoù wiki",
        "prefs-help-gender": "Diret : implijet evit kenglotadurioù gour e troidigezh etrefas ar meziant.\nA-wel d'an holl e vo an titour-mañ.",
        "email": "Postel",
-       "prefs-help-realname": "Diret eo skrivañ hoc'h anv gwir.\nMa skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset ganeoc'h.",
+       "prefs-help-realname": "Diret eo skrivañ e anv gwir.\nMa rit gantañ e c'hall bezañ implijet evit reiñ hoc'h anv d'ar pezh a vo bet degaset ganeoc'h.",
        "prefs-help-email": "Diret eo merkañ ur chomlec'h postel met ma lakait unan e vo tu da adkas ur ger-tremen nevez deoc'h ma tichañsfe deoc'h disoñjal ho hini.",
        "prefs-help-email-others": "Gallout a rit lezel tud all da vont e darempred ganeoc'h dre ho pajennoù implijer ha kaozeal hep na vefe ret deoc'h diskuliañ piv oc'h ivez.",
        "prefs-help-email-required": "Ezhomm zo eus ur chomlec'h postel.",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
        "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
        "userrights": "Merañ statud an implijerien",
-       "userrights-lookup-user": "Merañ strolladoù an implijer",
+       "userrights-lookup-user": "Diuzañ un implijer",
        "userrights-user-editname": "Lakait un anv implijer :",
-       "editusergroup": "Kemmañ ar strolladoù implijerien",
-       "editinguser": "Kemmañ gwirioù an implijer '''[[User:$1|$1]]''' $2",
+       "editusergroup": "Kargañ strolladoù implijerien",
+       "editinguser": "O kemmañ gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Kemmañ strolladoù an implijer",
-       "saveusergroups": "Enrollañ ar strolladoù implijer",
+       "userrights-viewusergroup": "Gwelet ar strolladoù implijerien",
+       "saveusergroups": "Enrollañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "userrights-groupsmember": "Ezel eus :",
        "userrights-groupsmember-auto": "Ezel emplegat eus :",
        "userrights-groups-help": "Cheñch strollad an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet, pe ar c'hontrol.",
        "userrights-reason": "Abeg :",
        "userrights-no-interwiki": "N'oc'h ket aotreet da gemmañ ar gwirioù implijer war wikioù all.",
        "userrights-nodatabase": "N'eus ket eus an diaz titouroù $1 pe n'eo ket lec'hel.",
-       "userrights-nologin": "Ret eo deoc'h [[Special:UserLogin|bezañ enrollet]] gant ur gont merour a-benn reiñ gwirioù implijer.",
-       "userrights-notallowed": "N'oc'h ket aotreet da ouzhpennañ na da lemel gwirioù an implijerien.",
        "userrights-changeable-col": "Ar strolladoù a c'hallit cheñch",
        "userrights-unchangeable-col": "Ar strolladoù n'hallit ket cheñch",
+       "userrights-expiry-current": "A ya d'e dermen d'an $1",
+       "userrights-expiry-none": "Didermen",
+       "userrights-expiry": "Termen :",
+       "userrights-expiry-existing": "Termen echuiñ merket : $3, $2",
+       "userrights-expiry-othertime": "Termen all :",
+       "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-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
-       "userrights-removed-self": "Lamet ho peus ho kwirioù deoc'h-c'hwi. Dre se ne c'hallit ket ken mont d'ar bajenn-mañ.",
        "group": "Strollad :",
        "group-user": "Implijerien",
        "group-autoconfirmed": "Implijerien bet kadarnaet ent emgefre",
        "group-bot": "Robotoù",
        "group-sysop": "Merourien",
        "group-bureaucrat": "Burevidi",
-       "group-suppress": "Dindan evezh",
+       "group-suppress": "Diverkerien",
        "group-all": "(pep tra)",
        "group-user-member": "{{GENDER:$1|implijer}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Implijer bet kadarnaet ent emgefre}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|merour}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureviad}}",
-       "group-suppress-member": "{{GENDER:$1|evezhier}}",
+       "group-suppress-member": "{{GENDER:$1|diverker|diverkerez}}",
        "grouppage-user": "{{ns:project}}:Implijerien",
        "grouppage-autoconfirmed": "{{ns:project}}: Implijerien bet kadarnaet ent emgefre",
        "grouppage-bot": "{{ns:project}}:Botoù",
        "grouppage-sysop": "{{ns:project}}:Merourien",
        "grouppage-bureaucrat": "{{ns:project}}: Burevidi",
-       "grouppage-suppress": "{{ns:project}}: Dindan evezh",
+       "grouppage-suppress": "{{ns:project}}: Diverkerien",
        "right-read": "Lenn ar pajennoù",
        "right-edit": "Kemmañ ar pajennoù",
        "right-createpage": "Krouiñ pajennoù (estreget pajennoù kaozeal)",
        "right-createtalk": "Krouiñ pajennoù kaozeal",
        "right-createaccount": "Krouiñ kontoù implijer nevez",
+       "right-autocreateaccount": "Kevreañ ent emgefre gant ur gont implijer diavaez",
        "right-minoredit": "Merkañ ar c'hemmoù evel kemmoù dister",
        "right-move": "Adenvel pajennoù",
        "right-move-subpages": "Dilec'hiañ ar pajennoù gant o ispajennoù",
        "right-siteadmin": "Prennañ ha dibrennañ ar bank-titouroù",
        "right-override-export-depth": "Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live",
        "right-sendemail": "Kas ur postel d'an implijerien all",
-       "right-passwordreset": "Gwelet ar posteloù assevel gerioù-tremen",
        "grant-group-email": "Kas ur postel",
+       "grant-group-other": "Obererezh liesseurt",
+       "grant-blockusers": "Stankañ ha distankañ implijerien",
        "grant-createaccount": "Krouiñ kontoù",
        "grant-createeditmovepage": "Krouiñ, aozañ ha dilec'hiañ pajennoù",
-       "grant-editmywatchlist": "Aozañ ho roll evezhiañ",
-       "grant-editpage": "Aoañ pajennoù a zo anezho dija",
-       "grant-editprotected": "Aozañ pajennoù gwarezet",
+       "grant-delete": "Diverkañ ar pajennoù, an adweladennoù hag an enmontoù er marilh",
+       "grant-editinterface": "Kemmañ esaouenn anvioù MediaWiki hag ar CSS/JavaScript implijer",
+       "grant-editmycssjs": "Kemmañ ho CSS/JavaScript implijer",
+       "grant-editmyoptions": "Kemmañ ho penndibaboù implijer.",
+       "grant-editmywatchlist": "Kemmañ ho roll evezhiañ",
+       "grant-editpage": "Kemmañ pajennoù a zo anezho c'hoazh",
+       "grant-editprotected": "Kemmañ pajennoù gwarezet",
+       "grant-highvolume": "Kemmañ kementadoù bras",
+       "grant-oversight": "Kuzhat an implijerien ha diverkañ an adweladennoù",
+       "grant-patrol": "Gwiriañ ar c'hemmoù graet d'ar pajennoù",
+       "grant-privateinfo": "Gwelet an titouroù prevez",
+       "grant-protect": "Gwareziñ ha diwareziñ pajennoù",
+       "grant-rollback": "Distreiñ war ar c'hemmoù er pajennoù",
        "grant-sendemail": "Kas ur postel d'an implijerien all",
-       "grant-viewdeleted": "Gwelet an titouroù dilamet",
+       "grant-uploadeditmovefile": "Enporzhiañ, erlec'hiañ hag adenvel restroù",
+       "grant-uploadfile": "Enporzhiañ restroù nevez",
+       "grant-basic": "Gwirioù diazez",
+       "grant-viewdeleted": "Gwelet ar restroù ha pajennoù dilamet",
        "grant-viewmywatchlist": "Gwelet ho roll evezhiañ",
+       "grant-viewrestrictedlogs": "Diskouez an enmontoù marilh kuzh",
        "newuserlogpage": "Marilh ar c'hontoù krouet",
        "newuserlogpagetext": "Marilh krouiñ ar c'hontoù implijer.",
        "rightslog": "Marilh statud an implijerien",
        "rightslogtext": "Setu marilh ar c'hemmoù statud bet c'hoarvezet d'an implijerien.",
        "action-read": "lenn ar bajenn-mañ",
        "action-edit": "kemmañ ar bajenn-mañ",
-       "action-createpage": "krouiñ pajennoù",
-       "action-createtalk": "krouiñ pajennoù kaozeal",
+       "action-createpage": "krouiñ ar bajenn-mañ",
+       "action-createtalk": "krouiñ ar bajenn-gaozeal-mañ",
        "action-createaccount": "krouiñ ar gont implijer-mañ",
+       "action-autocreateaccount": "Krouiñ ent emgefre ar gont implijer diavaez-mañ",
        "action-history": "gwelet istor ar bajenn-mañ",
        "action-minoredit": "merkañ ar c'hemm-mañ evel dister",
        "action-move": "dilec'hiañ ar bajenn-mañ",
        "action-upload_by_url": "pellgargañ ar restr-mañ adal ur chomlec'h URL",
        "action-writeapi": "Ober gant an API skrivañ",
        "action-delete": "diverkañ ar bajenn-mañ",
-       "action-deleterevision": "diverkañ ar stumm-mañ",
-       "action-deletedhistory": "Gwelet istor diverket ar bajenn-mañ",
+       "action-deleterevision": "diverkañ adweladennoù",
+       "action-deletelogentry": "Diverkañ enmontoù ar marilh",
+       "action-deletedhistory": "Gwelet istor diverket ur bajenn",
+       "action-deletedtext": "gwelet testenn diverket ar stumm-mañ",
        "action-browsearchive": "Klask pajennoù bet diverket",
-       "action-undelete": "diziverkañ ar bajenn-mañ",
-       "action-suppressrevision": "gwelet hag assevel ar stumm diverket-mañ",
+       "action-undelete": "diziverkañ pajennoù",
+       "action-suppressrevision": "gwiriañ hag assevel an adweladennoù kuzh",
        "action-suppressionlog": "gwelet ar marilh prevez-mañ",
        "action-block": "mirout ouzh an impplijer-mañ da zegas kemmoù",
        "action-protect": "kemmañ liveoù gwareziñ ar bajenn-mañ",
        "action-userrights-interwiki": "Kemmañ gwirioù an implijerien war wikioù all",
        "action-siteadmin": "Prennañ pe dibrennañ ar bank roadennoù",
        "action-sendemail": "Kas posteloù",
+       "action-editmyoptions": "Kemmañ ho penndibaboù",
        "action-editmywatchlist": "kemmañ ho roll evezhiañ",
        "action-viewmywatchlist": "gwelet ho roll evezhiañ",
        "action-viewmyprivateinfo": "Gwelet ho titouroù prevez",
        "action-editmyprivateinfo": "aozañ ho titouroù prevez",
+       "action-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-deletechangetags": "Diverkañ tikedennoù a-ziwar an diaz-roadennoù",
+       "action-purge": "spurjañ ar bajenn-mañ",
        "nchanges": "$1 {{PLURAL:$1|kemm|kemm}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|abaoe ho kweladenn diwezhañ}}",
        "enhancedrc-history": "istor",
        "recentchanges-label-plusminus": "Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù",
        "recentchanges-legend-heading": "<strong>Alc'hwez :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
-       "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
+       "recentchanges-submit": "Diskouez",
+       "rcfilters-activefilters": "Siloù oberiant",
+       "rcfilters-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-noresults": "N'eus bet kavet sil ebet",
+       "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-editsbyself-label": "Kemmet ganeoc'h",
+       "rcfilters-filter-editsbyself-description": "Kemmet ganeoc'h",
+       "rcfilters-filter-editsbyother-label": "Kemmet gant tud all",
+       "rcfilters-filter-editsbyother-description": "Kemmoù graet gant implijerien all (ket ganeoc'h).",
+       "rcfilters-filtergroup-userExpLevel": "Live skiant-prenañ (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-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-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-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-newpages-label": "Krouidigezhioù pajennoù",
+       "rcfilters-filter-newpages-description": "Kemmoù a grou pajennoù nevez.",
+       "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",
+       "rcnotefrom": "Setu aze {{PLURAL:$5|ar c'hemm|ar c'hemmoù}} c'hoarvezet abaoe an <strong>$3, $4</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "rcshowhideminor-show": "Diskouez",
        "rcshowhidemine": "$1 ma c'hemmoù",
        "rcshowhidemine-show": "Diskouez",
        "rcshowhidemine-hide": "Kuzhat",
+       "rcshowhidecategorization": "$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",
        "diff": "diforc'h",
        "hist": "ist",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|implijer o heuliañ|implijer}} o heuliañ]",
-       "rc_categories": "Bevenn ar rummadoù (dispartiañ gant \"|\")",
-       "rc_categories_any": "An holl",
+       "rc_categories": "Bevenniñ d'ar rummadoù (dispartiet gant \"|\") :",
+       "rc_categories_any": "Unan e-touez ar re zibabet",
        "rc-change-size-new": "$1 {{PLURAL:$1|okted|okted}} goude kemmañ",
        "newsectionsummary": "/* $1 */ rann nevez",
        "rc-enhanced-expand": "Diskouez ar munudoù",
        "recentchangeslinked-feed": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-toolbox": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-title": "Kemmoù a denn da \"$1\"",
-       "recentchangeslinked-summary": "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).\nE '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
+       "recentchangeslinked-summary": "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).\nE <strong>tev</strong> emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
        "recentchangeslinked-page": "Anv ar bajenn :",
        "recentchangeslinked-to": "Diskouez ar c'hemmoù war-du ar pajennoù liammet kentoc'h eget re ar bajenn lakaet",
+       "recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
+       "recentchanges-page-removed-from-category": "Diverket eo bet [[$1]] diouzh ar rummad",
+       "autochange-username": "Kemm emgefre gant MediaWiki",
        "upload": "Kargañ war ar servijer",
        "uploadbtn": "Kargañ ur restr",
        "reuploaddesc": "Distreiñ d'ar furmskrid.",
        "upload-too-many-redirects": "Re a adkasoù zo en URL-mañ.",
        "upload-http-error": "Ur fazi HTTP zo bet : $1",
        "upload-copy-upload-invalid-domain": "N'haller ket seveniñ enporzhiadennoù a-bell adalek an domani-mañ.",
+       "upload-dialog-title": "Kargañ ar restr",
        "upload-dialog-button-cancel": "Nullañ",
+       "upload-dialog-button-back": "Kent",
        "upload-dialog-button-done": "Graet",
        "upload-dialog-button-save": "Enrollañ",
        "upload-dialog-button-upload": "Enporzhiañ",
        "upload-form-label-infoform-description": "Deskrivadur",
        "upload-form-label-usage-title": "Implij",
        "upload-form-label-usage-filename": "Anv ar restr",
+       "upload-form-label-own-work": "Setu aze ma zammig labour din-me",
        "upload-form-label-infoform-categories": "Rummadoù",
        "upload-form-label-infoform-date": "Deiziad",
        "backend-fail-stream": "Dibosupl eo lenn ar restr $1.",
        "uploadstash-badtoken": "N'haller ket kas an ober-mañ da benn vat, marteze a-walc'h abalamour m'eo aet d'o zermen an titouroù kred ho poa roet. Klaskit en-dro.",
        "uploadstash-errclear": "N'eus ket bet gallet riñsañ ar restroù.",
        "uploadstash-refresh": "Freskaat roll ar restroù",
+       "uploadstash-thumbnail": "gwelet ar munud",
        "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",
        "listfiles-delete": "dilemel",
        "listfiles-summary": "Diskouez a ra ar bajenn dibar-mañ an holl restroù bet ezporzhiet.",
        "listfiles_search_for": "Klask anv ar skeudenn :",
+       "listfiles-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
        "imgfile": "restr",
        "listfiles": "Roll ar skeudennoù",
        "listfiles_thumb": "Munud",
        "protectedpages-performer": "Gwareziñ an implijer",
        "protectedpages-params": "Arventennoù gwareziñ",
        "protectedpages-reason": "Abeg",
+       "protectedpages-submit": "Diskwel ar pajennoù",
        "protectedpages-unknown-timestamp": "Dianav",
        "protectedpages-unknown-performer": "Implijer dianav",
        "protectedtitles": "Titloù gwarezet",
        "protectedtitlesempty": "N'eus bet gwarezet titl ebet dezhañ an arventennoù-se evit poent.",
+       "protectedtitles-submit": "Diskwel an titloù",
        "listusers": "Roll an implijerien",
        "listusers-editsonly": "Na ziskouez nemet an implijerien o deus degaset un dra bennak",
        "listusers-creationsort": "Renket dre urzh krouiñ",
        "nopagetext": "N'eus ket eus ar bajenn dal merket ganeoc'h.",
        "pager-newer-n": "{{PLURAL:$1|1 nevesoc'h|$1 nevesoc'h}}",
        "pager-older-n": "{{PLURAL:$1|1 koshoc'h|$1 koshoc'h}}",
-       "suppress": "Dindan evezh",
+       "suppress": "Dilemel",
        "querypage-disabled": "Diweredekaet eo bet ar bajenn dibar-mañ evit aesaat d'ar reizhiad un tammig.",
+       "apihelp": "Skoazell an API",
        "apihelp-no-such-module": "N'eo ket bet kavet ar vodulenn \"$1\".",
        "apisandbox": "Poull-traezh API",
        "apisandbox-api-disabled": "Diweredekaet eo API war al lec'hienn-mañ.",
        "apisandbox-submit": "Sevel ar goulenn",
        "apisandbox-reset": "Riñsañ",
        "apisandbox-retry": "Klask en-dro",
+       "apisandbox-helpurls": "Liammoù skoazell",
        "apisandbox-examples": "Skouerioù",
        "apisandbox-dynamic-parameters": "Arventenn ouzhpenn",
        "apisandbox-dynamic-parameters-add-label": "Ouzhpennañ un arventenn:",
        "apisandbox-results": "Disoc'hoù",
        "apisandbox-request-url-label": "Goulenn URL :",
        "apisandbox-request-time": "Pad ar goulenn: $1",
+       "apisandbox-alert-field": "Talvoud ar vaezienn-mañ n'eo ket reizh.",
+       "apisandbox-continue": "Kenderc'hel",
+       "apisandbox-continue-clear": "Riñsañ",
+       "apisandbox-multivalue-all-namespaces": "$1 (An holl esaouennoù anv)",
+       "apisandbox-multivalue-all-values": "$1 (An holl dalvoudoù)",
        "booksources": "Oberennoù dave",
        "booksources-search-legend": "Klask en oberennoù dave",
        "booksources-isbn": "ISBN :",
        "booksources-search": "Klask",
        "booksources-text": "Ur roll liammoù a gas da lec'hiennoù all ma werzher levrioù kozh ha nevez a gavot a-is; marteze e kavot eno titouroù pelloc'h war al levrioù a glaskit :",
        "booksources-invalid-isbn": "Evit doare n'eo ket reizh an ISBN merket; gwiriit ha n'oc'h ket faziet en ur eilañ adal ar vammenn orin.",
+       "magiclink-tracking-isbn": "Pajennoù a ra gant liammoù burzhudus ISBN",
        "specialloguserlabel": "Implijer :",
        "speciallogtitlelabel": "Bukadenn (titl pe implijer) :",
        "log": "Marilhoù",
        "activeusers-count": "$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ",
        "activeusers-from": "Diskouez an implijerien adal :",
        "activeusers-noresult": "N'eus bet kavet implijer ebet.",
+       "activeusers-submit": "Diskouez an implijerien oberiant",
        "listgrouprights": "Gwirioù ar strolladoù implijer",
        "listgrouprights-summary": "Da-heul ez eus ur roll eus ar strolladoù implijerien termenet war ar wiki-mañ, gant ar gwirioù moned stag outo.\nGallout a ra bezañ [[{{MediaWiki:Listgrouprights-helppage}}|titouroù ouzhpenn]] diwar-benn ar gwirioù hiniennel.",
        "listgrouprights-key": "Alc'hwez :\n* <span class=\"listgrouprights-granted\">Gwirioù grataet</span>\n* <span class=\"listgrouprights-revoked\">Gwirioù lamet</span>",
        "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
        "listgrouprights-namespaceprotection-namespace": "Esaouenn anv",
        "listgrouprights-namespaceprotection-restrictedto": "Gwir(ioù) hag a aotre an implijer da aozañ",
+       "listgrants": "Aotreoù",
+       "listgrants-grant": "Aotren",
        "listgrants-rights": "Gwirioù",
        "trackingcategories": "Rummadoù evezhiañ",
        "trackingcategories-msg": "Rummad evezhiañ",
        "trackingcategories-name": "Anv ar gemennadenn",
+       "trackingcategories-desc": "Dezverkoù evit degemer rummadoù",
        "broken-file-category-desc": "Er bajenn-mañ ez eus ul liamm restr torr (ul liamm da enframmañ ur restr pa n'eus ket eus ar restr-se).",
        "trackingcategories-nodesc": "N'eus deskrivadur ebet.",
        "trackingcategories-disabled": "Diweredekaet eo ar rummad",
        "wlshowhideliu": "implijerien enrollet",
        "wlshowhideanons": "implijerien dizanv",
        "wlshowhidemine": "ma c'hemmoù",
+       "wlshowhidecategorization": "rummatadur ar bajenn",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "watching": "Heuliet...",
        "unwatching": "Paouez da evezhiañ...",
        "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
        "changecontentmodel-title-label": "Anv ar bajenn",
        "changecontentmodel-reason-label": "Abeg :",
+       "changecontentmodel-submit": "Kemmañ",
+       "logentry-contentmodel-change-revertlink": "disteuler",
+       "logentry-contentmodel-change-revert": "disteuler",
        "protectlogpage": "Log_gwareziñ",
        "protectlogtext": "Setu aze a-is roll ar c'hemmoù degaset ouzh live gwareziñ ar pajennoù.\nSellet ouzh ar [[Special:ProtectedPages|roll ar pajennoù gwarezet]] evit kaout roll ar pajennoù gwarezet bremañ.",
        "protectedarticle": "{{Gender:.|en|he}} deus gwarezet [[$1]]",
        "sp-contributions-username": "Anv implijer pe chomlec'h IP :",
        "sp-contributions-toponly": "Na ziskouez nemet an adweladennoù diwezhañ",
        "sp-contributions-newonly": "Diskouez an aozadennoù a zo krouidigezhioù pajennoù hepken",
+       "sp-contributions-hideminor": "Kuzhat ar c'hemmoù dister",
        "sp-contributions-submit": "Klask",
        "whatlinkshere": "Pajennoù liammet",
        "whatlinkshere-title": "Pajennoù liammet ouzh \"$1\"",
        "whatlinkshere-hideredirs": "$1 adkas",
        "whatlinkshere-hidetrans": "$1 treuzkluzadur",
        "whatlinkshere-hidelinks": "$1 liamm",
-       "whatlinkshere-hideimages": "$1 ar restroù liammet",
+       "whatlinkshere-hideimages": "$1 al liammoù war-zu ar restr",
        "whatlinkshere-filters": "Siloù",
        "whatlinkshere-submit": "Mont",
        "autoblockid": "Emstankañ #$1",
        "ipb-unblock": "Distankañ un implijer pe ur chomlec'h IP",
        "ipb-blocklist": "Teuler ur sell ouzh roll an dud stanket evit poent",
        "ipb-blocklist-contribs": "Degasadennoù evit $1",
+       "ipb-blocklist-duration-left": "$1 a chom",
        "unblockip": "Distankañ ur chomlec'h IP",
        "unblockiptext": "Grit gant ar furmskrid a-is evit adsevel ar moned skrivañ ouzh ur chomlec'h IP bet stanket a-gent.",
        "ipusubmit": "Paouez gant ar stankadenn-mañ",
        "lockdbsuccesstext": "Prennet eo bank roadennnoù {{SITENAME}}.\n\n<br />Na zisoñjit ket e zibrennañ pa vo bet kaset da benn vat hoc'h oberiadenn drezalc'h.",
        "unlockdbsuccesstext": "Dibrennet eo bank roadennoù {{SITENAME}}.",
        "lockfilenotwritable": "N'haller ket skrivañ war restr prennañ ar bank roadennoù. A-benn prennañ-dibrennañ ar bank e rankit bezañ aotreet da skrivañ war ar servijer Kenrouedad.",
+       "databaselocked": "Prennet eo an diaz roadennoù c'hoazh.",
        "databasenotlocked": "N'eo ket prennet an diaz roadennoù.",
        "lockedbyandtime": "(gant $1 d'an $2 da $3)",
        "move-page": "Dilec'hiañ $1",
        "export-download": "Aotren enrollañ evel ur restr",
        "export-templates": "Lakaat ar patromoù e-barzh ivez",
        "export-pagelinks": "Lakaat ar pajennoù liammet e-barzh betek un donder a :",
+       "export-manual": "Ouzhpennañ pajennoù gant an dorn :",
        "allmessages": "Roll kemennoù ar reizhiad",
        "allmessagesname": "Anv",
        "allmessagesdefault": "Kemennadenn dre ziouer",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet eus $2",
        "javascripttest": "Amprouadenn JavaScript",
+       "javascripttest-pagetext-unknownaction": "Obererezh dianav \"$1\".",
        "javascripttest-qunit-intro": "Sellet ouzh [$1 an teulioù amprouiñ] e mediawiki.org.",
        "tooltip-pt-userpage": "{{GENDER:|Ho pajenn}} implijer",
        "tooltip-pt-anonuserpage": "Ar bajenn implijer evit ar c'homlec'h IP implijet ganeoc'h",
        "tooltip-pt-preferences": "{{GENDER:|Ma}} fenndibaboù",
        "tooltip-pt-watchlist": "Roll ar pajennoù evezhiet ganeoc'h.",
        "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-logout": "Digevreañ",
        "tooltip-pt-createaccount": "Erbedet eo deoc'h krouiñ ur gont ha kevreañ ; n'eo ket ret koulskoude.",
        "tooltip-feed-rss": "Magañ ar red RSS evit ar bajenn-mañ",
        "tooltip-feed-atom": "Magañ ar red Atom evit ar bajenn-mañ",
        "tooltip-t-contributions": "Gwelet roll degasadennoù {{GENDER:$1|this user}} an implijer-mañ",
-       "tooltip-t-emailuser": "Kas ur postel d'an implijer-mañ",
+       "tooltip-t-emailuser": "Kas ur postel d'an {{GENDER:$1|implijer-mañ|implijerez-mañ}}",
+       "tooltip-t-info": "Titouroù ouzhpenn a-zivout ar bajenn-mañ",
        "tooltip-t-upload": "Enporzhiañ ur skeudenn pe ur restr media war ar servijer",
        "tooltip-t-specialpages": "Roll an holl bajennoù dibar",
        "tooltip-t-print": "Stumm moulladus ar bajenn-mañ",
        "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": "$1 {{PLURAL:$2|implijer|implijer}} eus {{SITENAME}}",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|An implijer|An implijerez}}|{{GENDER:$1|An implijerien|An implijerezed}}}} $1 eus {{SITENAME}}",
        "anonusers": "{{PLURAL:$2|implijer dizanv|implijerien dizanv}} $1 eus {{SITENAME}}",
        "creditspage": "Pajennoù kredoù",
        "nocredits": "N'eus tamm titour kred hegerz ebet evit ar bajenn-mañ.",
        "spam_reverting": "Distreiñ d'ar stumm diwezhañ hep liamm davet $1",
        "spam_blanking": "Diverkañ an holl stummoù enno liammoù davet $1",
        "spam_deleting": "An holl stummoù enno liammoù war-zu $1, o tiverkañ",
-       "simpleantispam-label": "Taol gwiriañ eneb-strob.\n<trong>Arabat<strong> merkañ tra pe dra amañ !",
+       "simpleantispam-label": "Taol gwiriañ eneb-strob.\n<strong>Arabat</strong> merkañ tra pe dra amañ !",
        "pageinfo-title": "Titouroù evit \"$1\"",
        "pageinfo-not-current": "Hon digarezit, ne c'haller ket reiñ an titouroù-mañ evit an adweloù kozh.",
        "pageinfo-header-basic": "Titouroù diazez",
        "pageinfo-length": "Ment ar bajenn (en oktedoù)",
        "pageinfo-article-id": "Niverenn ar bajenn",
        "pageinfo-language": "Yezh ar bajenn",
+       "pageinfo-language-change": "kemmañ",
        "pageinfo-content-model": "Patrom endalc'had ar bajenn",
+       "pageinfo-content-model-change": "kemmañ",
        "pageinfo-robot-policy": "Menegeriñ gant robotoù",
        "pageinfo-robot-index": "Aotreet",
        "pageinfo-robot-noindex": "Diaotreet",
        "pageinfo-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-redirects-name": "Niver a adkasoù war-zu ar bajenn-mañ",
        "pageinfo-subpages-name": "Ispajennoù eus ar bajenn-mañ",
        "pageinfo-contentpage-yes": "Ya",
        "pageinfo-protect-cascading-yes": "Ya",
        "pageinfo-category-info": "Titouroù ar rummad",
+       "pageinfo-category-total": "Niver hollek a izili",
        "pageinfo-category-pages": "Niver a bajennoù",
        "pageinfo-category-subcats": "Niver a isrummadoù",
        "pageinfo-category-files": "Niver a restroù",
+       "pageinfo-user-id": "ID an implijer",
        "markaspatrolleddiff": "Merkañ evel gwiriet",
        "markaspatrolledtext": "Merkañ ar pennad-mañ evel gwiriet",
        "markedaspatrolled": "Merkañ evel gwiriet",
        "patrol-log-page": "Log gwiriañ",
        "patrol-log-header": "Setu ur marilh eus ar stummoù patrouilhet.",
        "log-show-hide-patrol": "$1 istor ar stummoù gwiriet",
+       "confirm-markpatrolled-button": "Mat eo",
        "deletedrevision": "Diverket stumm kozh $1.",
        "filedeleteerror-short": "Fazi e-ser diverkañ ar restr : $1",
        "filedeleteerror-long": "Fazioù zo bet kavet e-ser diverkañ ar restr :\n\n$1",
        "exif-compression-4": "CCITT Strollad 4 kodañ ar pelleiler",
        "exif-copyrighted-true": "Pep gwir miret strizh",
        "exif-copyrighted-false": "Domani foran",
+       "exif-photometricinterpretation-1": "Gwenn ha du (0 zo evit du)",
        "exif-unknowndate": "Deiziad dianav",
        "exif-orientation-1": "Boutin",
        "exif-orientation-2": "Eilpennet a-hed",
        "confirmemail_body_set": "Unan bennak, c'hwi moarvat, gant ar chomlec'h IP $1,\nen deus enrollet ur gont \"$2\" gant ar chomlec'h postel-mañ war lec'hienn {{SITENAME}}.\n\nEvit kadarnaat eo deoc'h ar gont-se ha gweredekaat en-dro\nan arc'hwelioù postelerezh war {{SITENAME}}, digorit al liamm-mañ en ho merdeer :\n\n$3\n\nMa n'eo *ket* deoc'h ar gont heuilhit al liamm-mañ\nevit nullañ kadarnaat ar chomlec'h postel :\n\n$5\n\nMont a raio ar c'hod-mañ d'e dermen d'ar $4.",
        "confirmemail_invalidated": "Nullet eo bet kadarnaat ar chomlec'h postel",
        "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}}",
        "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]",
        "confirm-unwatch-button": "Mat eo",
        "confirm-unwatch-top": "Lemel ar bajenn-mañ a-ziwar ho roll evezhiañ",
        "confirm-rollback-button": "Mat eo",
+       "confirm-rollback-top": "Disteurel ar c'hemmoù graet er bajenn-mañ ?",
        "quotation-marks": "« $1 »",
        "imgmultipageprev": "&larr; pajenn gent",
        "imgmultipagenext": "pajenn war-lerc'h &rarr;",
        "watchlistedit-raw-done": "Nevesaet eo bet ho roll evezhiañ.",
        "watchlistedit-raw-added": "Ouzhpennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
        "watchlistedit-raw-removed": "Tennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
-       "watchlistedit-clear-title": "Roll evezhiañ goulloet",
+       "watchlistedit-clear-title": "Diverkañ ar roll-evezhiañ",
        "watchlistedit-clear-legend": "Diverkañ ar roll-evezhiañ",
        "watchlistedit-clear-explain": "Lamet e vo an holl ditloù eus ho roll evezhiañ",
        "watchlistedit-clear-titles": "Titloù :",
+       "watchlistedit-clear-submit": "Riñsañ ar roll-evezhiañ (da vat e vo !)",
        "watchlistedit-clear-done": "Goulloet eo bet ho roll evezhiañ.",
        "watchlistedit-clear-removed": "Dilamet ez eus bet {{PLURAL:$1|1 titl|$1 a ditloù}} :",
        "watchlistedit-too-many": "Re a bajennoù zo da ziskwel amañ.",
        "version-entrypoints": "URLoù ar poent mont e-barzh",
        "version-entrypoints-header-entrypoint": "Poent mont e-barzh",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Levraouegoù staliet",
        "version-libraries-library": "Levraoueg",
        "version-libraries-version": "Stumm",
        "version-libraries-license": "Aotre-implijout",
        "version-libraries-description": "Deskrivadur",
+       "version-libraries-authors": "Aozerien",
        "redirect-submit": "Mont",
        "redirect-lookup": "Klask :",
        "redirect-value": "Talvoud :",
        "redirect-page": "ID ar bajenn",
        "redirect-revision": "Adwel ar bajenn",
        "redirect-file": "Anv ar restr",
+       "redirect-logid": "ID ar marilh",
        "redirect-not-exists": "Talvoud n'eo ket bet kavet",
        "fileduplicatesearch": "Klask ar restroù e doubl",
        "fileduplicatesearch-summary": "Klask restroù e doubl war diazez talvoudennoù krennet.",
        "tags-actions-header": "Oberoù",
        "tags-active-yes": "Ya",
        "tags-active-no": "Ket",
+       "tags-source-extension": "Termenet gant ar meziant",
+       "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-create-heading": "Krouiñ un dikedenn nevez",
+       "tags-create-tag-name": "Anv an dikedenn :",
        "tags-create-reason": "Abeg :",
        "tags-create-submit": "Krouiñ",
+       "tags-create-no-name": "Rekis eo merkañ anv un dikedenn.",
+       "tags-delete-title": "Diverkañ an dikedenn",
        "tags-delete-reason": "Abeg :",
+       "tags-delete-not-found": "N'eus ket eus an dikedenn \"$1\".",
+       "tags-activate-title": "Gweredekaat an dikedenn",
        "tags-activate-reason": "Abeg :",
        "tags-activate-submit": "Gweredekaat",
+       "tags-deactivate-title": "Diweredekaat an dikedenn",
        "tags-deactivate-reason": "Abeg :",
        "tags-deactivate-submit": "Diweredekaat",
-       "tags-edit-existing-tags-none": "''Hini ebet''",
+       "tags-edit-title": "Kemmañ an tikedennoù",
+       "tags-edit-manage-link": "Merañ an tikedennoù",
+       "tags-edit-existing-tags": "Tikedennoù zo anezho :",
+       "tags-edit-existing-tags-none": "<em>Hini ebet</em>",
+       "tags-edit-new-tags": "Tikedennoù nevez :",
+       "tags-edit-add": "Ouzhpennañ an tikedennoù-mañ :",
+       "tags-edit-remove": "Dilemel an tikedennoù-mañ :",
+       "tags-edit-remove-all-tags": "(dilemel an holl dikedennoù)",
+       "tags-edit-chosen-placeholder": "Diuzañ un nebeud tikedennoù",
        "tags-edit-reason": "Abeg :",
+       "tags-edit-success": "Lakaet eo bet ar c'hemmoù da dalvezout",
        "comparepages": "Keñveriañ pajennoù",
        "compare-page1": "Pajenn 1",
        "compare-page2": "Pajenn 2",
        "htmlform-cloner-create": "Ouzhpennañ muioc'h",
        "htmlform-cloner-delete": "Dilemel",
        "htmlform-cloner-required": "Un dalvoudenn a zo ret da vihanañ.",
+       "htmlform-date-placeholder": "BBBB-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "BBBB-MM-DD HH:MM:SS",
+       "htmlform-title-not-exists": "N'eus ket eus $1.",
+       "htmlform-user-not-exists": "N'eus ket eus <strong>$1</strong>.",
+       "htmlform-user-not-valid": "Un anv implijer direizh eo <strong>$1</strong>.",
        "logentry-delete-delete": "Diverket eo bet ar bajenn $3 gant $1",
        "logentry-delete-restore": "Assavet eo bet ar bajenn $3 gant $1",
        "logentry-delete-event": "Kemmet eo bet gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
        "logentry-upload-revert": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "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-bugcheck": "Eus ar c'hentañ ! Gwiriit mat n'emañ ket e-touez an [$1 draen diskoachet c'hoazh].",
        "feedback-submit": "Kas",
        "feedback-thanks": "Ho trugarekaat ! Postet eo bet hoc'h evezhiadenn d'ar bajenn \"[$2 $1]\".",
        "feedback-thanks-title": "Trugarez !",
-       "searchsuggest-search": "Klask",
+       "searchsuggest-search": "Klask e {{SITENAME}}",
        "searchsuggest-containing": "ennañ...",
-       "api-error-badaccess-groups": "N'oc'h ket aotreet da enporzhiañ restroù war ar wiki-mañ.",
        "api-error-badtoken": "Fazi diabarzh : \"jedouer\" fall.",
-       "api-error-copyuploaddisabled": "Diweredekaet eo an enporzhioù dre URL war ar servijer-mañ.",
-       "api-error-duplicate": "Bez' {{PLURAL:$1|ez eus restr all|restr all}} gant an hevelep danvez war al lec'hienn-mañ c'hoazh",
-       "api-error-duplicate-archive": "Bez' e oa {{PLURAL:$1|ur restr all|restroù all}} c'hoazh enno an hevelep danvez, nemet {{PLURAL:$1|eo bet diverket|int bet diverket}}.",
-       "api-error-empty-file": "Ar restr hoc'h eus roet a oa goullo.",
        "api-error-emptypage": "N'eo ket aotreet krouiñ pajennoù goullo.",
-       "api-error-fetchfileerror": "Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask adtapout ar restr.",
-       "api-error-fileexists-forbidden": "Bez' ez eus c'hoazh eus ur restr anvet \"$1\" ha n'hall ket bezañ friket.",
-       "api-error-fileexists-shared-forbidden": "Bez' ez eus c'hoazh eus ur restr anvet \"$1\" er c'havlec'h kenrannañ restroù ha n'hall ket bezañ friket anezhi.",
-       "api-error-file-too-large": "Ar restr hoc'h eus roet a oa re vras.",
-       "api-error-filename-tooshort": "Re verr eo anv ar restr.",
-       "api-error-filetype-banned": "Difennet eo ar seurt restroù",
-       "api-error-filetype-banned-type": "N'eo ket $1{{PLURAL:$4|ur seurt restr aotreet | seurtoù restroù aotreet}}. $2 zo {{PLURAL:$3|ar seurt restroù|ar seurtoù restroù}} degemeret.?",
-       "api-error-filetype-missing": "Un astenn a vank d'ar restr.",
-       "api-error-hookaborted": "Ar c'hemm hoc'h eus klasket degas zo bet harzet gant ur c'hrog astenn.",
-       "api-error-http": "Fazi diabarzh : dibosupl kevreañ d'ar servijer.",
-       "api-error-illegal-filename": "N'eo ket aotreet anv ar restr.",
-       "api-error-internal-error": "Fazi diabarzh : aet ez eus un dra bennak a dreuz en ur dretiñ hoc'h enporzhiadenn war ar wiki.",
-       "api-error-invalid-file-key": "Fazi diabarzh : n'eo ket bet kavet ar restr er stokañ da c'hortoz.",
-       "api-error-missingparam": "Fazi diabarzh : Arventennoù a vank er reked.",
-       "api-error-missingresult": "Fazi diabarzh : dibosupl termeniñ hag eilet eo bet an traoù ervat.",
-       "api-error-mustbeloggedin": "Ret eo deoc'h bezañ kevreet evit pellgargañ restroù.",
-       "api-error-mustbeposted": "Un draen a zo er poellad-mañ ; ne implij ket an hentenn HTTP ret.",
-       "api-error-noimageinfo": "Kaset eo bet ar pellgargañ ervat met n'eus ket bet roet tamm titour ebet deomp diwar-benn ar restr gant ar servijer",
-       "api-error-nomodule": "Fazi diabarzh : tamm modulenn enporzhiañ ebet.",
-       "api-error-ok-but-empty": "Fazi diabarzh : respont ebet a-berzh ar servijer.",
-       "api-error-overwrite": "N'eo ket aotreet frikañ ur restr zo anezhi c'hoazh.",
-       "api-error-stashfailed": "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
        "api-error-publishfailed": "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
-       "api-error-timeout": "N'eo ket bet ar servijer evit respont en termen lakaet.",
-       "api-error-unclassified": "C'hoarvezet ez eus ur gudenn dianav.",
-       "api-error-unknown-code": "Fazi dianav : \"$1\"",
-       "api-error-unknown-error": "Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask enporzhiañ ho restr.",
+       "api-error-stashfailed": "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
        "api-error-unknown-warning": "Kemenn diwall dianav : $1",
        "api-error-unknownerror": "Fazi dianav : \"$1\".",
-       "api-error-uploaddisabled": "Diweredekaat eo an enporzh war ar wiki-mañ.",
-       "api-error-verification-error": "Pe eo brein ar restr pe eo fall an astenn anezhi.",
        "duration-seconds": "$1 {{PLURAL:$1|eilenn|eilenn}}",
        "duration-minutes": "$1 {{PLURAL:$1|munut|munut}}",
        "duration-hours": "($1 {{PLURAL:$1|eurvezh|eurvezh}})",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
-       "pagelanguage": "Diuzañ yezh ar bajenn",
+       "pagelanguage": "Kemmañ yezh ar bajenn",
        "pagelang-name": "Pajenn",
        "pagelang-language": "Yezh",
        "pagelang-use-default": "Implijout ar yezh dre ziouer",
        "pagelang-select-lang": "Dibab ar yezh",
+       "pagelang-reason": "Abeg",
+       "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.",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
-       "log-name-pagelang": "Cheñch yezh",
+       "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 evit $3 eus $4 da $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|en deus|he deus}} cheñchet yezh ar bajenn $3 eus $4 da $5.",
        "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-header-office": "Burev",
        "mediastatistics-header-text": "Testenn",
        "mediastatistics-header-archive": "Furmadoù gwasket",
+       "mediastatistics-header-total": "An holl restroù",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgulenn|a virgulennoù}} dibenn zo bet lamet eus JSON",
        "json-error-unknown": "Ur gudenn a oa gant ar JSON. Fazi : $1",
        "json-error-depth": "Aet eur en tu all da zonder brasañ an torn",
        "json-error-state-mismatch": "JSON direizh pe stummet fall",
        "json-error-syntax": "Fazi ereadur",
        "json-error-utf8": "Arouezennoù UTF-8 stummet fall, enkodet en un doare direizh marteze",
+       "headline-anchor-title": "Liamm war-zu ar rannbennad-mañ",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin astennet",
        "special-characters-group-ipa": "LFE (IPA)",
        "special-characters-group-symbols": "Arouezennoù",
        "special-characters-group-greek": "Gresianek",
+       "special-characters-group-greekextended": "Gresianeg astennet",
        "special-characters-group-cyrillic": "Kirillek",
        "special-characters-group-arabic": "Arabeg",
        "special-characters-group-arabicextended": "Arabeg astennet",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
        "special-characters-group-khmer": "Khmer",
-       "randomrootpage": "Pajenn wrizienn dargouezhek"
+       "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...",
+       "sessionprovider-generic": "$1 estez",
+       "randomrootpage": "Pajenn wrizienn dargouezhek",
+       "log-action-filter-block": "Seurt bloc'had :",
+       "log-action-filter-import": "Seurt enporzhiadur :",
+       "log-action-filter-newusers": "Seurt krouidigezh kont :",
+       "log-action-filter-all": "An holl",
+       "log-action-filter-block-block": "Stankañ",
+       "log-action-filter-block-unblock": "Distankañ",
+       "log-action-filter-managetags-create": "Krouiñ tikedenn",
+       "log-action-filter-managetags-delete": "Diverkañ tikedenn",
+       "log-action-filter-managetags-activate": "Gweredekaat tikedenn",
+       "log-action-filter-managetags-deactivate": "Diweredekaat tikedenn",
+       "log-action-filter-move-move": "Dilec'hiañ hep frikañ an adkasoù",
+       "log-action-filter-move-move_redir": "Dilec'hiañ en ur frikañ an adkasoù",
+       "log-action-filter-newusers-create": "Krouiñ gant un implijer dizanv",
+       "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-protect-protect": "Gwarez",
+       "log-action-filter-protect-unprotect": "Diwarez",
+       "log-action-filter-rights-autopromote": "Kemm emgefre",
+       "log-action-filter-upload-upload": "Enporzhiadenn nevez",
+       "log-action-filter-upload-overwrite": "Adenporzhiañ",
+       "authmanager-authn-no-primary": "N'eus ket bet gallet gwiriañ an titouroù kred lakaet.",
+       "authmanager-authn-no-local-user-link": "Reizh eo an titouroù kred lakaet met n'int ket liammet ouzh implijer ebet eus ar wiki-mañ. Ma kevreit en ur mod all pe ma krouit ur gont implijer nevez e c'hallot liammañ ho titouroù kred kent ouzh ar gont-mañ.",
+       "authmanager-change-not-supported": "N'haller ket cheñch an titouroù kred rak netra na rafe ganto.",
+       "authmanager-create-disabled": "Diweredekaet eo ar c'hrouiñ kontoù.",
+       "authmanager-create-from-login": "Evit krouiñ ho kont, leuniit ar maeziennoù.",
+       "authmanager-create-no-primary": "N'eus ket bet gallet implijout an titouroù kred lakaet evit krouiñ ur gont.",
+       "authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
+       "authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
+       "authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
+       "authmanager-retype-help": "Adkadarnaat ar ger-tremen.",
+       "authmanager-email-label": "Postel",
+       "authmanager-email-help": "Chomlec'h postel",
+       "authmanager-realname-label": "Anv gwir",
+       "authmanager-realname-help": "Anv gwir an implijer",
+       "authmanager-provider-password": "Gwiriekadur diazezet war ur ger-termen",
+       "authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+       "authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
+       "authprovider-resetpass-skip-label": "Lammat",
+       "authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
+       "authform-newtoken": "Jedouer a vank. $1",
+       "authform-notoken": "Jedouer a vank",
+       "authform-wrongtoken": "Jedouer fall",
+       "specialpage-securitylevel-not-allowed-title": "Berzet",
+       "authpage-cannot-login": "N'haller ket kregiñ da gevreañ",
+       "authpage-cannot-create": "N'haller ket kregiñ da grouiñ ar gont.",
+       "cannotauth-not-allowed-title": "Aotre nac'het",
+       "cannotauth-not-allowed": "N'oc'h ket aotreet d'ober gant ar bajenn-mañ",
+       "changecredentials": "Kemmañ an titouroù kred",
+       "changecredentials-submit": "Kemmañ an titouroù kred",
+       "changecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "removecredentials": "Lemel an titouroù kred",
+       "removecredentials-submit": "Lemel an aotreoù",
+       "removecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "credentialsform-provider": "Seurt titouroù kred :",
+       "credentialsform-account": "Anv ar gont :",
+       "cannotlink-no-provider-title": "N'eus kont ebet da liammañ",
+       "cannotlink-no-provider": "N'eus kont ebet da liammañ.",
+       "linkaccounts": "Kontoù liammet",
+       "linkaccounts-success-text": "Liammet eo bet ar gont.",
+       "linkaccounts-submit": "Liammañ ar c'hontoù",
+       "unlinkaccounts": "Diliammañ ar c'hontoù",
+       "unlinkaccounts-success": "Diliammet eo bet ar gont.",
+       "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"
 }
index 60a4de7..f765098 100644 (file)
@@ -23,7 +23,8 @@
                        "Emir Mujadzic",
                        "Srdjan m",
                        "Semso98",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Podvuci veze:",
@@ -40,7 +41,7 @@
        "tog-watchcreations": "Dodaj stranice i datoteke koje napravim na moj spisak praćenih članaka",
        "tog-watchdefault": "Dodaj stranice i datoteke koje uređujem na moj spisak praćenih članaka",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenih članaka",
-       "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenih članaka",
+       "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem na moj spisak praćenja",
        "tog-watchuploads": "Dodaj datoteke koje postavim na moj spisak praćenja",
        "tog-watchrollback": "Sve stranice za koje sam izvršio povrat izmjena stavi na spisak praćenja",
        "tog-minordefault": "Označi sve izmjene manjim isprva",
@@ -74,7 +75,7 @@
        "underline-default": "Prema predodređenim postavkama teme ili preglednika",
        "editfont-style": "Stil fonta u okviru za uređivanje:",
        "editfont-default": "Po postavkama preglednika",
-       "editfont-monospace": "Slova sa jednostrukim razmakom",
+       "editfont-monospace": "Neproporcionalni font",
        "editfont-sansserif": "Beserifni font",
        "editfont-serif": "Serifni font",
        "sunday": "nedjelja",
        "searcharticle": "Idi",
        "history": "Historija stranice",
        "history_short": "Historija",
+       "history_small": "historija",
        "updatedmarker": "promjene od moje posljednje posjete",
        "printableversion": "Za štampanje",
        "permalink": "Trajni link",
        "views": "Pregledi",
        "toolbox": "Alati",
        "tool-link-userrights": "Promijeni {{GENDER:$1|korisničke}} grupe",
+       "tool-link-userrights-readonly": "Vidi {{GENDER:$1|korisničke}} grupe",
        "tool-link-emailuser": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici}}",
        "userpage": "Pogledaj korisničku stranicu",
        "projectpage": "Pogledaj stranicu projekta",
        "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",
-       "missing-article": "U bazi podataka nije pronađen tekst stranice tražen pod nazivom \"$1\" $2.\n\nDo ovoga dolazi kad se prati pomjeranje ili historija linka za stranicu koja je pobrisana.\n\n\nU slučaju da se ne radi o gore navedenom moguće je da ste pronašli grešku u programu.\nMolimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] s navođenjem tačne adrese stranice.",
-       "missingarticle-rev": "(revizija#: $1)",
+       "missing-article": "U bazi podataka nije pronađen tekst stranice koji je trebao biti pronađen pod nazivom \"$1\" $2.\n\nNajčešći uzrok ove greške jest zastarjela razlika izmjena ili link ka obrisanoj stranici.\n\nU slučaju da se ne radi o gore navedenom moguće je da ste pronašli grešku u programu.\nMolimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] uz odgovarajuću adresu stranice.",
+       "missingarticle-rev": "(izmjena#: $1)",
        "missingarticle-diff": "(Razlika: $1, $2)",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Unutrašnja greška",
        "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\".",
-       "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
+       "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.",
        "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.",
-       "cannotdelete-title": "Ne mogu izbrisati stranicu \"$1\"",
+       "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\"",
        "badtitle": "Loš naslov",
        "virus-scanfailed": "skeniranje nije uspjelo (code $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",
        "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:",
        "createacct-yourpasswordagain-ph": "Unesite lozinku opet",
        "userlogin-remembermypassword": "Ostavi me prijavljenog/-u",
        "userlogin-signwithsecure": "Koristite sigurnu konekciju",
+       "cannotlogin-title": "Prijava nije moguća",
+       "cannotlogin-text": "Prijava nija moguća.",
+       "cannotloginnow-title": "Prijava trenutno nije moguća",
+       "cannotcreateaccount-title": "Pravljenje računa nije moguće",
+       "cannotcreateaccount-text": "Direktno pravljenje računa nije omogućeno na ovom wikiju.",
        "yourdomainname": "Vaš domen:",
        "password-change-forbidden": "Ne možete da promjenite lozinku na ovom wikiju.",
        "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",
+       "login-security": "Potvrdite svoj identitet",
        "nav-login-createaccount": "Prijavi se / Registruj se",
        "userlogin": "Prijavi se / Registruj se",
        "userloginnocreate": "Prijavi se",
        "userlogin-reauth": "Morate se ponovo prijaviti da bismo potvrdili da ste zaista {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Napravi još jedan račun",
        "createacct-emailrequired": "Adresa e-pošte",
-       "createacct-emailoptional": "Adresa e-pošte (opcionalno)",
+       "createacct-emailoptional": "Adresa e-pošte (neobavezno)",
        "createacct-email-ph": "Unesite Vašu adresu e-pоšte",
        "createacct-another-email-ph": "Unesite adresu e-pošte",
        "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-submit": "Napravite svoj korisnički račun",
+       "createacct-reason-help": "Poruka koja se prikazuje u zapisniku stvaranja korisničkih računa",
+       "createacct-submit": "Napravi račun",
        "createacct-another-submit": "Napravi korisnički račun",
+       "createacct-continue-submit": "Nastavi sa stvaranjem računa",
+       "createacct-another-continue-submit": "Nastavi sa stvaranjem računa",
        "createacct-benefit-heading": "{{GRAMMAR:akuzativ|{{SITENAME}}}} stvaraju ljudi poput Vas.",
-       "createacct-benefit-body1": "{{PLURAL:$1|izmjena|izmjene}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
-       "createacct-benefit-body3": "nedavnih {{PLURAL:$1|doprinosa}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|nedavni korisnik|nedavnih korisnika}}",
        "badretype": "Lozinke koje ste unijeli se ne poklapaju",
        "usernameinprogress": "Račun za ovo korisničko ime već se pravi. Molimo sačekajte.",
        "userexists": "Korisničko ime je već u upotrebi.\nIzaberite drugo.",
        "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.",
        "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",
-       "loginsuccess": "'''Sad ste prijavljeni na {{SITENAME}} kao \"$1\".'''",
+       "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.",
        "eauthentsent": "Na navedenu adresu e-pošte poslana je poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaš.",
        "throttled-mailpassword": "Već Vam je poslana e-poruka za promjenu lozinke u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedna e-poruka za promjenu lozinke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "mailerror": "Greška pri slanju e-pošte: $1",
-       "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
+       "acct_creation_throttle_hit": "Posjetioci ovog wikija koji koriste Vašu IP-adresu već su napravili {{PLURAL:$1|$1 račun|$1 računa}} u posljednjih $2, što je najveći dozvoljeni broj u tom vremenskom periodu.\nZbog toga posjetioci s ove IP-adrese trenutno ne mogu praviti više računa.",
        "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.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "pt-login": "Prijavi me",
        "pt-login-button": "Prijavi me",
+       "pt-login-continue-button": "Nastavi prijavljivanje",
        "pt-createaccount": "Napravi korisnički račun",
        "pt-userlogout": "Odjavi me",
        "php-mail-error-unknown": "Nepoznata greška u PHP funkciji mail()",
        "resetpass_submit": "Postavi lozinku i prijavi se",
        "changepassword-success": "Vaša lozinka je promijenjena.",
        "changepassword-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "botpasswords": "Lozinke botova",
+       "botpasswords-disabled": "Lozinke botova su onemogućene.",
+       "botpasswords-no-central-id": "Da biste koristili lozinke botova, morate biti prijavljeni na središnji račun.",
+       "botpasswords-existing": "Postojeće lozinke botova",
+       "botpasswords-createnew": "Napravi novu lozinku bota",
+       "botpasswords-editexisting": "Uredi postojeću lozinku bota",
+       "botpasswords-label-appid": "Ime bota:",
+       "botpasswords-label-create": "Napravi",
+       "botpasswords-label-update": "Ažuriraj",
+       "botpasswords-label-cancel": "Otkaži",
+       "botpasswords-label-delete": "Obriši",
+       "botpasswords-label-resetpassword": "Ponovo postavi lozinku",
+       "botpasswords-label-grants": "Primjenjive dozvole:",
+       "botpasswords-label-grants-column": "Odobreno",
+       "botpasswords-bad-appid": "Ime bota \"$1\" nije ispravno.",
+       "botpasswords-insert-failed": "Ne mogu dodati bota pod nazivom \"$1\". Možda je već dodano?",
+       "botpasswords-update-failed": "Ne mogu ažurirati bota pod nazivom \"$1\". Možda je obrisan?",
+       "botpasswords-created-title": "Napravljena lozinka bota",
+       "botpasswords-created-body": "Napravljena lozinka za bota \"$1\" korisnika \"$2\".",
+       "botpasswords-updated-title": "Ažurirana lozinka bota",
+       "botpasswords-updated-body": "Ažurirana lozinka za bota \"$1\" korisnika \"$2\".",
+       "botpasswords-deleted-title": "Obrisana lozinka bota",
        "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",
        "passwordreset-emaildisabled": "E-pošta je onemogućena na ovom wikiju.",
        "passwordreset-username": "Korisničko ime:",
        "passwordreset-domain": "Domen:",
-       "passwordreset-capture": "Pogledati krajnji e-mail?",
-       "passwordreset-capture-help": "Ako označite ovu kućicu, e-poruka (s privremenom lozinkom) će biti prikazana i poslata korisniku.",
        "passwordreset-email": "Adresa e-pošte:",
        "passwordreset-emailtitle": "Detalji računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Neko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik Vaših detalja računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika 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 početne šifre, a ne želite je promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "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-nocaller": "Mora se navesti pozivalac",
+       "passwordreset-nosuchcaller": "Pozivalac ne postoji: $1",
+       "passwordreset-invalidemail": "Neispravna adresa 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.",
        "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisnicima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} napraviti ovu stranicu]</span>.",
        "noarticletext-nopermission": "Trenutno nema teksta na ovoj stranici.\nMožete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Uređivanje broj $1 na stranici \"{{FULLPAGENAME}}\" ne postoji.\n\nOvo se obično dešava kad pratite zastarjelu vezu na stranicu koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu brisanja].",
-       "userpage-userdoesnotexist": "Korisnički račun \"<nowiki>$1</nowiki>\" nije registrovan.\nMolimo provjerite da li želite napraviti/izmijeniti ovu stranicu.",
-       "userpage-userdoesnotexist-view": "Korisnički račun \"$1\" nije registrovan.",
+       "userpage-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.\nRazmislite želite li zaista napraviti/izmijeniti ovu stranicu.",
+       "userpage-userdoesnotexist-view": "Korisnički račun \"$1\" nije registriran.",
        "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nPosljednje stavke zapisnika blokiranja možete pogledati ispod:",
-       "clearyourcache": "'''Pažnja:''' Nakon što sačuvate izmjene, morate \"osvježiti\" keš memoriju vašeg pretraživača da bi ste vidjeli nova podešenja.'''\n*'''Firefox / Safari:''' držite ''Shift'' tipku i kliknite na ''Reload'' dugme ili pritisnite ''Ctrl-F5'' ili ''Ctrl-R'' (''⌘-R'' na Macu)\n*'''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Macu)\n*'''Internet Explorer:''' držite tipku ''Ctrl'' i kliknite na ''Refresh'' ili pritisnite ''Ctrl-F5''\n*'''Opera:''' očistite \"keš\" preko izbornika ''Tools → Preferences''",
+       "clearyourcache": "<strong>Napomena:</strong> Nakon što sačuvate izmjene, možda ćete morati osvježiti keš preglednika da biste vidjeli izmjene.\n* <strong>Firefox / Safari:</strong> Držite <em>Shift</em> i kliknite na <em>Reload</em> ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R</em> (<em>⌘-R</em> na Macu)\n* <strong>Google Chrome:</strong> Pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Macu)\n* <strong>Internet Explorer:</strong> Držite <em>Ctrl</em> i kliknite na <em>Refresh</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Idite na <em>Menu → Settings</em> (<em>Opera → Preferences</em> na Macu) i zatim <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi CSS prije nego što sačuvate.",
        "userjsyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi JavaScript prije nego što sačuvate.",
        "usercsspreview": "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''\n'''Ovaj pregled još uvijek nije sačuvan!'''",
        "copyrightwarning2": "Zapamtite da svi doprinosi na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE AUTORSKIM PRAVOM ZAŠTIĆENE TEKSTOVE BEZ DOZVOLE!'''",
        "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promijeniti.",
        "longpageerror": "'''Greška: Tekst, koji ste poslali, je dug {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je veće od maksimuma, koji iznosi {{PLURAL:$2|jedan kilobajt|$2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
-       "readonlywarning": "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.'''\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 slijedeće objašnjenje: $1",
+       "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}}:",
        "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>.",
-       "recreate-moveddeleted-warn": "'''Upozorenje: Postavljate stranicu koja je prethodno brisana.'''\n\nRazmotrite da li je nastavljanje uređivanja ove stranice u skladu s pravilima.\nOvdje je naveden zapisnik brisanja i premještanja s obrazloženjem:",
+       "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.",
        "log-fulllog": "Prikaži cijeli zapisnik",
        "invalid-content-data": "Nevaljani podaci sadržaja",
        "content-not-allowed-here": "Sadržaj napisan u obliku \"$1\" nije dozvoljen na stranici [[$2]]",
        "editwarning-warning": "Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.\nAko ste prijavljeni, možete isključiti ovo upozorenje u Sekciji za \"{{int:prefs-editing}}\" vaših opcija.",
+       "editpage-invalidcontentmodel-title": "Model sadržaja nije podržan",
+       "editpage-invalidcontentmodel-text": "Model sadržaja \"$1\" nije podržan.",
        "editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
        "editpage-notsupportedcontentformat-text": "Format sadržaja $1 nije podržan za model sadržaja $2.",
        "content-model-wikitext": "wikitekst",
        "content-model-css": "CSS",
        "content-json-empty-object": "Prazan objekat",
        "content-json-empty-array": "Prazan niz",
+       "deprecated-self-close-category": "Stranice s neispravnim samozatvorenim HTML oznakama",
        "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>.",
        "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: '''(tren)''' = razlika sa trenutnom verzijom,\n'''(preth)''' = razlika sa prethodnom verzijom, '''m''' = mala izmjena.",
+       "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-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "history-feed-title": "Historija izmjena",
        "history-feed-description": "Historija promjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u $2",
-       "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
+       "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-deleted-comment": "(sažetak izmjene uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
-       "rev-deleted-event": "(stavka zapisa obrisana)",
+       "rev-deleted-event": "(detalji unosa uklonjeni)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa uklonjeni - izmjena sakrivena u spisku doprinosa]",
-       "rev-deleted-text-permission": "Revizija ove stranice je '''obrisana'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
+       "rev-deleted-text-permission": "Izmjena ove stranice je <strong>obrisana</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
        "rev-suppressed-text-permission": "Revizija ove stranice je <strong>prekrivena</strong>.\nDetalji se mogu naći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku prekrivanja].",
-       "rev-deleted-text-unhide": "Izmjena ove stranice je <strong>obrisana</strong>.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nIpak možete [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
-       "rev-suppressed-text-unhide": "Ova revizija stranice je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].\nVi i dalje možete [$1 vidjeti ovu reviziju] ako želite.",
+       "rev-deleted-text-unhide": "Izmjena ove stranice je <strong>obrisana</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nIpak možete [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
+       "rev-suppressed-text-unhide": "Izmjena ove stranice je <strong>sakrivena</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].\nIpak možete [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
        "rev-deleted-text-view": "Revizija ove stranice je '''obrisana'''.\nVi je možete vidjeti; detalji o tome mogu se vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
-       "rev-suppressed-text-view": "Ova revizija stranice je '''uklonjena'''.\nVi je možete vidjeti; možete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].",
+       "rev-suppressed-text-view": "Izmjena ove stranice je <strong>sakrivena</strong>.\nMožete je pogledati; detalje možete pronaći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].",
        "rev-deleted-no-diff": "Ne možete vidjeti ovu razliku jer je jedna od izmjena '''obrisana'''.\nDetalji se nalaze u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
        "rev-suppressed-no-diff": "Ne možete vidjeti ove razlike jer je jedna od revizija '''obrisana'''.",
-       "rev-deleted-unhide-diff": "Jedna od revizija u ovom pregledu razlika je '''obrisana'''.\nMožete pregledati detalje u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nVi još uvijek možete [$1 vidjeti ove razlike] ako želite nastaviti.",
-       "rev-suppressed-unhide-diff": "Jedna od revizija ove razlike je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku uklanjanja].\nVi i dalje možete [$1 vidjeti ove razlike] ako želite nastaviti.",
-       "rev-deleted-diff-view": "Jedna od revizija u ovoj razlici je '''obrisana'''.\nVi možete vidjeti ovu razliku; detalji o tome mogu se vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
-       "rev-suppressed-diff-view": "Jedna od revizija u ovoj razlici je '''sakrivena'''.\nVi možete vidjeti ovu razliku; detalji se mogu vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].",
+       "rev-deleted-unhide-diff": "Jedna od izmjena u ovom pregledu razlika je <strong>obrisana</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nIpak možete [$1 vidjeti ovaj pregled razlika] ako želite nastaviti.",
+       "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-showdeleted": "prikaži",
-       "revisiondelete": "Obriši/vrati revizije",
+       "revisiondelete": "Obriši/vrati izmjene",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
        "revdelete-nooldid-text": "Niste odredili odredišnu verziju da se izvrši ova funkcija, ili ta verzija ne postoji, ili pokušavate sakriti trenutnu verziju.",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
-       "revdelete-selected-text": "{{PLURAL:$1|Odabrana revizija|Odabrane revizije}} od [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmjena|Izabrane izmjene}} stranice [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Odabrana vezija datoteke|Odabrane verzije datoteke}} [[:$2]]:",
-       "logdelete-selected": "{{PLURAL:$1|Označena stavka zapisa|Označene stavke zapisa}}:",
-       "revdelete-text-text": "Obrisane revizije i dalje su prikazane u historiji stranice, ali dijelovi njihovog sadržaja neće biti dostupni javnosti.",
+       "logdelete-selected": "{{PLURAL:$1|Izabrana stavka zapisnika|Izabrane stavke zapisnika}}:",
+       "revdelete-text-text": "Obrisane izmjene i dalje će biti vidljive u historiji stranice, ali dijelovi njihovog sadržaja neće biti dostupni javnosti.",
        "revdelete-text-file": "Obrisane verzije datoteke i dalje su prikazane u historiji datoteke, ali dijelovi njihovog sadržaja nisu dostupni javnosti.",
        "logdelete-text": "Obrisani događaji zapisnika i dalje se pojavljuju u zapisniku, ali dijelovi njihovih sadržaja nisu dostupni javnosti.",
-       "revdelete-text-others": "Drugi administratori će i dalje moći pristupiti sakrivenom sadržaju i vratiti ga, bez obzira na postavljena dodatna ograničenja.",
-       "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
+       "revdelete-text-others": "Ostali administratori i dalje će moći pristupiti sakrivenom sadržaju i vratiti ga, osim ako se postave dodatna ograničenja.",
+       "revdelete-confirm": "Potvrdite da namjeravate ovo uraditi, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Ograničenja bi trebala biti korištena <strong>samo</strong> u sijedećim slučajevima:\n* Potencijalni klevetnički podaci\n* Osjetljive korisničke informacije\n*: <em>kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
-       "revdelete-hide-text": "Tekst revizije",
+       "revdelete-hide-text": "Tekst izmjene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij cilj i parametre",
-       "revdelete-hide-comment": "Uredi sažetak",
-       "revdelete-hide-user": "Korisničko ime urednika/IP",
+       "revdelete-hide-comment": "Sažetak izmjene",
+       "revdelete-hide-user": "Korisničko ime urednika/IP-adresa",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "revdelete-radio-same": "(ne mijenjaj)",
        "revdelete-radio-set": "Sakriveno",
        "revdelete-suppress": "Sakrij podatke od administratora kao i od drugih",
        "revdelete-unsuppress": "Ukloni ograničenja na vraćenim revizijama",
        "revdelete-log": "Razlog:",
-       "revdelete-submit": "Primijeni na odabrane {{PLURAL:$1|reviziju|revizije}}",
+       "revdelete-submit": "Primijeni na {{PLURAL:$1|izabranu izmjenu|izabrane izmjene}}",
        "revdelete-success": "'''Vidljivost izmjene je ažurirana.'''",
-       "revdelete-failure": "'''Vidljivost revizije nije mogla biti ažurirana:'''\n$1",
+       "revdelete-failure": "Ne mogu ažurirati vidljivost izmjene:\n$1",
        "logdelete-success": "Postavljena je vidljivost unosa u zapisniku.",
        "logdelete-failure": "'''Zapisnik vidljivosti nije mogao biti postavljen:'''\n$1",
-       "revdel-restore": "Promijeni dostupnost",
+       "revdel-restore": "promijeni vidljivost",
        "pagehist": "Historija stranice",
-       "deletedhist": "Izbrisana historija",
+       "deletedhist": "Obrisana historija",
        "revdelete-hide-current": "Greška pri sakrivanju stavke od $2, $1: ovo je trenutna verzija.\nNe može biti sakrivena.",
        "revdelete-show-no-access": "Greška pri prikazivanju stavke od $2, $1: ova stavka je označena kao \"zaštićena\".\nNemate pristup do ove stavke.",
        "revdelete-modify-no-access": "Greška pri izmjeni stavke od $2, $1: ova stavka je označena kao \"zaštićena\".\nNemate pristup ovoj stavci.",
        "revdelete-modify-missing": "Greška pri mijenjanju stavke ID $1: nedostaje u bazi podataka!",
        "revdelete-no-change": "'''Upozorenje:''' stavka od $2, $1 već posjeduje zatražene postavke vidljivosti.",
-       "revdelete-concurrent-change": "Greška pri mijenjanju stavke od $2, $1: njen status je izmijenjen od strane nekog drugog dok ste je pokušavali mijenjati.\nMolimo provjerite zapise.",
+       "revdelete-concurrent-change": "Greška pri mijenjanju stavke od $2, $1: Izgleda da je neko drugi promijenio njen status dok ste je pokušavali mijenjati.\nProvjerite zapisnike.",
        "revdelete-only-restricted": "Greška pri sakrivanju stavke od dana $2, $1: ne možete ukloniti stavke od pregledavanja administratora bez da odaberete neku od drugih opcija za uklanjanje.",
        "revdelete-reason-dropdown": "*Uobičajeni razlozi brisanja\n** Kršenje autorskih prava\n** Neprikladan komentar ili lični podac\n** Neprikladno korisničko ime\n** Uvredljivi podaci",
        "revdelete-otherreason": "Drugi/dodatni razlog:",
        "revdelete-reasonotherlist": "Ostali razlozi",
        "revdelete-edit-reasonlist": "Uredi razloge brisanja",
-       "revdelete-offender": "Autor revizije:",
-       "suppressionlog": "Zapisi sakrivanja",
+       "revdelete-offender": "Autor izmjene:",
+       "suppressionlog": "Zapisnik sakrivanja",
        "suppressionlogtext": "Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. \nVidi [[Special:BlockList|spisak blokiranja]] za pregled trenutno važećih blokada.",
        "mergehistory": "Spoji historije stranice",
        "mergehistory-header": "Ova stranica Vam omogućuje spajanje revizija historije neke izvorne stranice u novu stranicu. Zapamtite da će ova promjena ostaviti nepromjenjen sadržaj historije stranice.",
        "mergehistory-list": "Historija izmjena koja se može spojiti",
        "mergehistory-merge": "Slijedeće revizije stranice [[:$1]] mogu biti spojene u [[:$2]].\nKoristite dugmiće u stupcu da bi ste spojili revizije koje su napravljene prije navedenog vremena.\nKorištenje navigacionih linkova će resetovati ovaj stupac.",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
-       "mergehistory-submit": "Spoji revizije",
-       "mergehistory-empty": "Nema revizija za spajanje.",
+       "mergehistory-submit": "Spoji izmjene",
+       "mergehistory-empty": "Nema izmjena za spajanje.",
        "mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene|izmjena}} stranice $1 uspješno je spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
+       "mergehistory-fail-bad-timestamp": "Vremenska oznaka nije ispravna.",
+       "mergehistory-fail-invalid-source": "Izvorna stranica nije ispravna.",
+       "mergehistory-fail-invalid-dest": "Odredišna stranica nije ispravna.",
+       "mergehistory-fail-no-change": "Spajanje historije nije spojilo nijednu izmjenu. Provjerite parametre stranice i vremena.",
+       "mergehistory-fail-permission": "Nemate dopuštenje da spojite historiju.",
+       "mergehistory-fail-self-merge": "Izvorna i odredišna stranica su iste.",
        "mergehistory-fail-toobig": "Ne može se izvršiti spajanje historije jer će se više premjestiti više od ograničenja od $1 {{PLURAL:$1|revizije|revizija}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
        "showhideselectedversions": "Prikaži/sakrij izabrane izmjene",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije}} istog korisnika)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međuizmjena|Nisu prikazane $1 međuizmjene|Nije prikazano $1 međuizmjena}} istog korisnika)",
        "diff-multi-otherusers": "(Nije prikazana {{PLURAL:$1|jedna međuverzija|$1 međuverzija}} {{PLURAL:$2|drugog korisnika|$2 korisnika}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})",
        "difference-missing-revision": "{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
+       "search-interwiki-more-results": "više rezultata",
        "search-relatedarticle": "Povezano",
        "searchrelated": "povezano",
        "searchall": "sve",
        "search-external": "Vanjska pretraga",
        "searchdisabled": "Pretraga na stranici {{SITENAME}} je onemogućena.\nU međuvremenu možete tražiti preko Googlea.\nUpamtite da ispisi stranice {{SITENAME}} mogu biti zastarjeli.",
        "search-error": "Desila se greška prilikom pretraživanja: $1",
+       "search-warning": "Došlo je do upozorenja prilikom pretraživanja: $1",
        "preferences": "Postavke",
        "mypreferences": "Postavke",
        "prefs-edits": "Broj izmjena:",
        "saveprefs": "Sačuvaj",
        "restoreprefs": "Vrati sve postavke na podrazumijevane (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
-       "rows": "Redova:",
-       "columns": "Kolona:",
        "searchresultshead": "Pretraga",
        "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
        "stub-threshold-sample-link": "primjer",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i zapisnike.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ sažetka vašeg spiska izmjena. Ko god da ga zna, moći će ga čitati. Ne dijelite ga ni s kim. Ako je potrebno, [[Special:ResetTokens|možete ga ponovo postaviti]].",
        "savedprefs": "Vaše postavke su sačuvane.",
-       "savedrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} $1 su sačuvana.",
+       "savedrights": "Korisničke grupe {{GENDER:$1|korisnika|korisnice}} $1 su sačuvana.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "youremail": "Adresa e-pošte:",
        "username": "{{GENDER:$1|Korisničko}} ime:",
        "prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Vrijeme registracije:",
        "yourrealname": "Vaše pravo ime:",
        "yourlanguage": "Jezik:",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
+       "gender-unknown": "Kad Vas spominje, softver će pokušati izbjegavati rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Postavljanje ovih podešavanja nije obavezno.\nSoftver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova će informacija biti javna.",
        "prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: Možete koristiti tipke sa lijevom i desnom strelicom za kretanje kroz kartice.",
        "userrights": "Postavke korisničkih prava",
-       "userrights-lookup-user": "Menadžment korisničkih grupa",
+       "userrights-lookup-user": "Izaberi korisnika",
        "userrights-user-editname": "Upišite korisničko ime:",
-       "editusergroup": "Uredi {{GENDER:$1|korisničke}} grupe",
-       "editinguser": "Mijenjate korisnička prava korisnika <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Uredi korisničke grupe",
+       "editusergroup": "Učitaj korisničke grupe",
+       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Pregledavate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Uredi {{GENDER:$1|korisničke}} grupe",
+       "userrights-viewusergroup": "Vidi {{GENDER:$1|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čen kvadratić znači da korisnik nije u toj grupi.\n* Oznaka * (zvjezdica) označava da Vi ne možete izbrisati ovu grupu ako je dodate i obrnutno.",
+       "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-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
-       "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] sa administratorskim računom da bi ste mogli postavljati korisnička prava.",
-       "userrights-notallowed": "Nemate dopuštenje za dodavanje ili uklanjanje korisničkih prava.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
+       "userrights-expiry-current": "Ističe $1",
+       "userrights-expiry-none": "Ne ističe",
+       "userrights-expiry": "Ističe:",
+       "userrights-expiry-existing": "Postojeće vrijeme isticanja: $3, $2",
+       "userrights-expiry-othertime": "Drugo vrijeme:",
+       "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-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
-       "userrights-removed-self": "Uklonili ste vlastita prava. Zbog toga više ne možete pristupiti ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
-       "group-autoconfirmed": "Potvrđeni korisnici",
+       "group-autoconfirmed": "Automatski potvrđeni korisnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
        "group-suppress": "Skrivači",
        "group-all": "(sve)",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica}}",
-       "group-autoconfirmed-member": "Potvrđeni korisnik",
-       "group-bot-member": "bot",
+       "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica}}",
+       "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|skrivač|skrivačica}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
-       "grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
+       "grouppage-autoconfirmed": "{{ns:project}}:Automatski potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
        "grouppage-suppress": "{{ns:project}}:Skrivač",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
-       "right-createpage": "Pravljenje stranica (neuključujući stranice za razgovor)",
+       "right-createpage": "Pravljenje stranica (izuzev stranica za razgovor)",
        "right-createtalk": "Pravljenje stranica za razgovor",
-       "right-createaccount": "Pravljenje korisničkog računa",
-       "right-minoredit": "Označavanje izmjena kao malih",
+       "right-createaccount": "Pravljenje novih korisničkih računa",
+       "right-minoredit": "Označavanje izmjena manjim",
        "right-move": "Premještanje stranica",
-       "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
-       "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
-       "right-move-categorypages": "Pomakni stranice kategorije",
+       "right-move-subpages": "Premještanje stranica s njihovim podstranicama",
+       "right-move-rootuserpages": "Premještanje osnovnih korisničkih stranica",
+       "right-move-categorypages": "Premještanje kategorija",
        "right-movefile": "Premještanje datoteka",
-       "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
+       "right-suppressredirect": "Premještanje stranica bez ostavljanja preusmjerenja",
        "right-upload": "Postavljanje datoteka",
-       "right-reupload": "Postavljanje nove verzije datoteke",
-       "right-reupload-own": "Postavljanje nove verzije datoteke koju je postavio korisnik",
-       "right-reupload-shared": "Postavljanje novih lokalnih verzija datoteka identičnih onima u zajedničkoj ostavi",
+       "right-reupload": "Postavljanje novih verzija datoteka",
+       "right-reupload-own": "Postavljanje novih verzija vlastitih datoteka",
+       "right-reupload-shared": "Lokalno premošćivanje datoteka sa zajedničke ostave",
        "right-upload_by_url": "Postavljanje datoteke sa URL adrese",
-       "right-purge": "Osvježavanje keša za stranice bez konfirmacije",
-       "right-autoconfirmed": "Bez ograničavanja stavki za IP adrese",
+       "right-purge": "Osvježavanje keša stranice bez potvrde",
+       "right-autoconfirmed": "Izbjegavanje ograničenja stavki za IP adrese",
        "right-bot": "Postavljen kao automatski proces",
-       "right-nominornewtalk": "Male izmjene na stranici za razgovor ne uzrokuju prikazivanje oznake ''nova poruka'' na stranici za razgovor",
+       "right-nominornewtalk": "Izbjegavanje prikazivanja obavještenja o novim porukama kad je označeno da je izmjena manja",
        "right-apihighlimits": "Korištenje viših ograničenja u API upitima",
-       "right-writeapi": "Korištenje opcije ''write API''",
+       "right-writeapi": "Korištenje API-ja za pisanje",
        "right-delete": "Brisanje stranica",
        "right-bigdelete": "Brisanje stranica sa velikom historijom",
-       "right-deletelogentry": "Brisanje i vraćanje određenih zapisa u evidenciji",
-       "right-deleterevision": "Brisanje i vraćanje određenih revizija stranice",
-       "right-deletedhistory": "Pregled stavki obrisane historije, bez povezanog teksta",
-       "right-deletedtext": "Pregled obrisanog teksta i izmjena između obrisanih revizija",
+       "right-deletelogentry": "Brisanje i vraćanje određenih stavki u zapisniku",
+       "right-deleterevision": "Brisanje i vraćanje određenih izmjena stranice",
+       "right-deletedhistory": "Pregledanje stavki obrisane historije, bez povezanog teksta",
+       "right-deletedtext": "Pregledanje obrisanog teksta i izmjena između obrisanih izmjena",
        "right-browsearchive": "Pretraživanje obrisanih stranica",
        "right-undelete": "Vraćanje obrisanih stranica",
-       "right-suppressrevision": "Pregled, sakrivanje i povratak određenih revizija stranice od svih korisnika",
+       "right-suppressrevision": "Pregledanje, sakrivanje i vraćanje određenih verzija stranica od svih korisnika",
        "right-viewsuppressed": "Pregledaj izmjene skrivene od svih korisnika",
-       "right-suppressionlog": "Gledanje privatnih zapisa",
-       "right-block": "Blokiranje uređivanja drugih korisnika",
-       "right-blockemail": "Blokiranje korisnika da šalje e-mail",
-       "right-hideuser": "Blokiranje korisničkog imena, i njegovo sakrivanje od javnosti",
-       "right-ipblock-exempt": "Zaobilaženje IP blokada, autoblokada i blokada IP grupe",
-       "right-unblockself": "Deblokiraj samog sebe",
-       "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
-       "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
+       "right-suppressionlog": "Pregledanje privatnih zapisnika",
+       "right-block": "Blokiranje mogućnosti uređivanja drugim korisnicima",
+       "right-blockemail": "Blokiranje korisnikove mogućnosti da šalje e-poštu",
+       "right-hideuser": "Blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
+       "right-ipblock-exempt": "Zaobilaženje IP-blokada, autoblokada i blokada opsega",
+       "right-unblockself": "Deblokiranje samog sebe",
+       "right-protect": "Mijenjanje nivoâ zaštite i uređivanje stranica pod prenosivom zaštitom",
+       "right-editprotected": "Uređivanje stranica pod zaštitom \"{{int:protect-level-sysop}}\"",
+       "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 CSS datoteka drugih korisnika",
-       "right-edituserjs": "Uređivanje JS datoteka drugih korisnika",
-       "right-editmyusercss": "Uredite svoje vlastite korisničke CSS datoteke",
-       "right-editmyuserjs": "Uredite vlastite korisničke JavaScript datoteke",
-       "right-viewmywatchlist": "Pogledaj svoj spisak praćenih stranica",
-       "right-editmywatchlist": "Uredite vlastiti spisak praćenja. Važno je spomenuti da će neke radnje dodati stranice na spisak, čak i bez ovog prava.",
-       "right-viewmyprivateinfo": "Pogledajte Vaše privatne podatke (npr, adresa e-pošte, pravo ime)",
-       "right-editmyprivateinfo": "Uredite svoje privatne podatke (npr. adresa e-pošte, pravo ime)",
-       "right-editmyoptions": "Uredite svoje postavke",
+       "right-editusercss": "Uređivanje tuđih CSS datoteka",
+       "right-edituserjs": "Uređivanje tuđih JavaScript datoteka",
+       "right-editmyusercss": "Uređivanje vlastitih CSS datoteka",
+       "right-editmyuserjs": "Uređivanje vlastitih JavaScript datoteka",
+       "right-viewmywatchlist": "Pregledanje vlastitog spiska praćenja",
+       "right-editmywatchlist": "Uređivanje vlastitog spiska praćenja. Važno je spomenuti da će neke radnje dodati stranice na spisak, čak i bez ovog prava.",
+       "right-viewmyprivateinfo": "Pregledanje vlastitih ličnih podataka (npr, adresa e-pošte, pravo ime)",
+       "right-editmyprivateinfo": "Uređivanje vlastitih ličnih podataka (npr. adresa e-pošte, pravo ime)",
+       "right-editmyoptions": "Uređivanje vlastitih postavki",
        "right-rollback": "Brzo vraćanje izmjena posljednjeg korisnika koji je uređivao određenu stranicu",
        "right-markbotedits": "Označavanje vraćenih izmjena kao izmjene bota",
        "right-noratelimit": "Izbjegavanje ograničenja uzrokovanih brzinom",
-       "right-import": "Uvoz stranica iz drugih wikija",
-       "right-importupload": "Uvoz stranica putem postavljanja datoteke",
-       "right-patrol": "Označavanje izmjena drugih korisnika patroliranim",
-       "right-autopatrol": "Vlastite izmjene se automatski označavaju kao patrolirane",
+       "right-import": "Uvoženje stranica iz drugih wikija",
+       "right-importupload": "Uvoženje stranica putem postavljanja datoteke",
+       "right-patrol": "Označavanje tuđih izmjena patroliranim",
+       "right-autopatrol": "Automatsko označavanje vlastitih izmjena patroliranim",
        "right-patrolmarks": "Pregled oznaka patroliranja u spisku nedavnih izmjena",
-       "right-unwatchedpages": "Gledanje spiska nepraćenih stranica",
+       "right-unwatchedpages": "Pregledanje spiska nepraćenih stranica",
        "right-mergehistory": "Spajanje historije stranica",
        "right-userrights": "Uređivanje svih korisničkih prava",
        "right-userrights-interwiki": "Uređivanje korisničkih prava korisnika na drugim wikijima",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvoz stranica uključujući povezane stranice do dubine od 5 linkova",
-       "right-sendemail": "Slanje e-maila drugim korisnicima",
-       "right-passwordreset": "Pogledaj e-mailove za obnavljanje šifre",
-       "right-managechangetags": "Napravi i (de)aktiviraj [[Special:Tags|oznake]]",
-       "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
-       "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
+       "right-sendemail": "Slanje e-pošte drugim korisnicima",
+       "right-managechangetags": "Pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
+       "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-group-page-interaction": "Upravljanje stranicama",
+       "grant-group-file-interaction": "Rad s medijskim datotekama",
        "grant-group-watchlist-interaction": "Upravljanje Vašim spiskom praćenja",
+       "grant-group-email": "Slanje e-pošte",
        "grant-group-high-volume": "Izvršavanje velikog broja radnji",
        "grant-group-customization": "Prilagodbe i postavke",
+       "grant-group-administration": "Izvršavanje administrativnih radnji",
+       "grant-group-private-information": "Pristupanje Vašim ličnim podacima",
        "grant-group-other": "Raznovrsno djelovanje",
+       "grant-blockusers": "Blokiranje i deblokiranje korisnika",
+       "grant-createaccount": "Stvaranje računa",
        "grant-createeditmovepage": "Pravljenje, uređivanje i premještanje stranica",
+       "grant-delete": "Brisanje stranica, izmjena i unosa u zapisnicima",
+       "grant-editinterface": "Uređivanje imenskog prostora MediaWiki i korisničkih CSS/JavaScript stranica",
        "grant-editmycssjs": "Uređivanje Vašeg korisničkog CSS-a ili JavaScripta",
        "grant-editmyoptions": "Uređivanje Vaših postavki",
        "grant-editmywatchlist": "Uređivanje Vašeg spiska praćenja",
        "grant-editpage": "Uređivanje postojećih stranica",
        "grant-editprotected": "Uređivanje zaštićenih stranica",
        "grant-highvolume": "Veliki broj izmjena",
+       "grant-oversight": "Skrivanje korisnika i izmjena",
        "grant-patrol": "Patroliranje izmjena stranica",
+       "grant-privateinfo": "Pristupanje ličnim podacima",
+       "grant-protect": "Dodavanje i uklanjanje zaštita sa stranica",
+       "grant-rollback": "Vraćanje izmjena",
+       "grant-sendemail": "Slanje e-pošte drugim korisnicima",
        "grant-uploadeditmovefile": "Postavljanje, zamjena i premještanje datoteka",
        "grant-uploadfile": "Postavljanje novih datoteka",
        "grant-basic": "Osnovna prava",
+       "grant-viewdeleted": "Pregledanje obrisanih datoteka i stranica",
        "grant-viewmywatchlist": "Pregled Vašeg spiska praćenja",
+       "grant-viewrestrictedlogs": "Pregledanje ograničenih unosa u zapisniku",
        "newuserlogpage": "Zapisnik novih korisnika",
        "newuserlogpagetext": "Ovo je zapisnik o registraciji novih korisnika.",
        "rightslog": "Zapisnik korisničkih prava",
        "rightslogtext": "Ovo je zapisnik promjena korisničkih prava.",
        "action-read": "čitate ovu stranicu",
-       "action-edit": "uređujete ovu stranicu",
+       "action-edit": "uredite ovu stranicu",
        "action-createpage": "napravite ovu stranicu",
-       "action-createtalk": "pravite stranice za razgovor",
+       "action-createtalk": "napravite ovu stranicu za razgovor",
        "action-createaccount": "napravite ovaj korisnički račun",
        "action-history": "gledate historiju ove stranice",
-       "action-minoredit": "da označite ovu izmjenu kao malu",
+       "action-minoredit": "označite ovu izmjenu manjom",
        "action-move": "premjestite ovu stranicu",
-       "action-move-subpages": "premjestite ovu stranicu, i njene podstranice",
-       "action-move-rootuserpages": "premjestite stranice osnovnog korisnika",
-       "action-move-categorypages": "pomakni stranice kategorije",
-       "action-movefile": "premjesti ovu datoteku",
-       "action-upload": "postavljate ovu datoteku",
-       "action-reupload": "stavite novu verziju postojeće datoteke",
-       "action-reupload-shared": "postavite ovu datoteku iz zajedničke ostave",
+       "action-move-subpages": "premjestite ovu stranicu i njene podstranice",
+       "action-move-rootuserpages": "premještate osnovne korisničke stranice",
+       "action-move-categorypages": "premještate kategorije",
+       "action-movefile": "premjestite ovu datoteku",
+       "action-upload": "postavite ovu datoteku",
+       "action-reupload": "postavite novu verziju postojeće datoteke",
+       "action-reupload-shared": "premostite ovu datoteku sa zajedničke ostave",
        "action-upload_by_url": "postavite ovu datoteku putem URL adrese",
-       "action-writeapi": "koristite ''write API'' opciju",
+       "action-writeapi": "koristite API za pisanje",
        "action-delete": "obrišete ovu stranicu",
-       "action-deleterevision": "obrišete ovu reviziju",
-       "action-deletedhistory": "gledate obrisanu historiju ove stranice",
+       "action-deleterevision": "brišete izmjene",
+       "action-deletelogentry": "brišete stavke u zapisniku",
+       "action-deletedhistory": "pregledate obrisanu historiju ove stranice",
+       "action-deletedtext": "pregledate obrisani tekst izmjene",
        "action-browsearchive": "pretražujete obrisane stranice",
-       "action-undelete": "vratite ovu stranicu",
-       "action-suppressrevision": "pregledate i vratite ovu skrivenu reviziju",
-       "action-suppressionlog": "vidite ovaj privatni zapis",
-       "action-block": "blokirate uređivanje ovog korisnika",
-       "action-protect": "promijeniti nivo zaštite za ovu stranicu",
-       "action-rollback": "brzo vraćanje izmjena posljednjeg korisnika koji je uređivao određenu stranicu",
-       "action-import": "uvozite stranice iz druge wiki",
-       "action-importupload": "uvoz stranica putem postavljanja datoteke",
-       "action-patrol": "označite izmjene drugih kao patrolirane",
-       "action-autopatrol": "da Vaše izmjene budu označene kao patrolirane",
+       "action-undelete": "vraćate stranice",
+       "action-suppressrevision": "pregledate i vraćate sakrivene izmjene",
+       "action-suppressionlog": "pregledate ovaj privatni zapisnik",
+       "action-block": "blokirate mogućnost uređivanja ovom korisniku",
+       "action-protect": "promijenite nivoe zaštite ove stranice",
+       "action-rollback": "brzo vratite izmjenu posljednjeg korisnika koji je uređivao određenu stranicu",
+       "action-import": "uvozite stranice iz drugih wikija",
+       "action-importupload": "uvozite stranice putem postavljanja datoteke",
+       "action-patrol": "označite tuđe izmjene patroliranim",
+       "action-autopatrol": "označite vlastite izmjene patroliranim",
        "action-unwatchedpages": "pregledate spisak nepraćenih stranica",
        "action-mergehistory": "spajate historiju ove stranice",
        "action-userrights": "uređujete sva korisnička prava",
        "action-userrights-interwiki": "uređujete korisnička prava korisnika na drugim wikijima",
        "action-siteadmin": "zaključavate ili otključavate bazu podataka",
-       "action-sendemail": "pošalji e-mail poruke",
-       "action-editmywatchlist": "uredite svoj spisak praćenih stranica",
-       "action-viewmywatchlist": "pogledajte svoj spisak praćenih stranica",
-       "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
-       "action-editmyprivateinfo": "uredite svoje privatne podatke",
-       "action-editcontentmodel": "uredi model sadržaja stranice",
+       "action-sendemail": "šaljete e-poštu",
+       "action-editmyoptions": "uređujete vlastite postavke",
+       "action-editmywatchlist": "uredite vlastiti spisak praćenja",
+       "action-viewmywatchlist": "pregledate vlastiti spisak praćenja",
+       "action-viewmyprivateinfo": "pregledate vlastite lične podatke",
+       "action-editmyprivateinfo": "uređujete vlastite lične podatke",
+       "action-editcontentmodel": "uređujete model sadržaja stranice",
        "action-managechangetags": "pravite i (de)aktivirate oznake",
-       "action-applychangetags": "dodate oznake uz ve izmjene",
+       "action-applychangetags": "dodate oznake uz vlastite izmjene",
        "action-changetags": "dodate ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
-       "nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
+       "action-deletechangetags": "brišete oznake iz baze podataka",
+       "action-purge": "osvježite keš ove stranice",
+       "nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges": "Nedavne izmjene",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-activefilters": "Aktivni filteri",
+       "rcfilters-restore-default-filters": "Vrati predodređene filtere",
+       "rcfilters-clear-all-filters": "Ukloni sve filtere",
+       "rcfilters-invalid-filter": "Neispravan filter",
+       "rcfilters-empty-filter": "Nema aktivnih filtera. Svi doprinosi su prikazani.",
+       "rcfilters-filterlist-title": "Filteri",
+       "rcfilters-filterlist-noresults": "Nema filtera",
+       "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-filter-editsbyother-label": "Tuđe izmjene",
+       "rcfilters-filter-editsbyother-description": "Izmjene koje su napravili drugi korisnici (ne Vi).",
+       "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-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-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-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-logactions-label": "Zapisane radnje",
+       "rcfilters-filter-logactions-description": "Administrativne radnje, pravljenje računa, brisanje stranica, postavljenje datoteka....",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmjene počev od $3 u $2",
        "rcshowhideminor": "$1 manje izmjene",
        "rcshowhidebots": "$1 botove",
        "rcshowhidebots-show": "Prikaži",
        "rcshowhidebots-hide": "Sakrij",
-       "rcshowhideliu": "$1 registrovane korisnike",
+       "rcshowhideliu": "$1 registrirane korisnike",
        "rcshowhideliu-show": "Prikaži",
        "rcshowhideliu-hide": "Sakrij",
        "rcshowhideanons": "$1 anonimne korisnike",
        "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
-       "recentchanges-page-added-to-category": "[[:$1]] dodana je u kategoriju",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] i još [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}}]] su dodane u kategoriju",
-       "recentchanges-page-removed-from-category": "[[:$1]] je uklonjena iz kategorije",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}} su uklonjene iz kategorije",
+       "recentchanges-page-added-to-category": "Stranica [[:$1]] dodana je u kategoriju",
+       "recentchanges-page-added-to-category-bundled": "Stranica [[:$1]] dodana je u kategoriju, [[Special:WhatLinksHere/$1|ovu stranicu sadrže druge stranice]]",
+       "recentchanges-page-removed-from-category": "Stranica [[:$1]] uklonjena je iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "Stranica [[:$1]] uklonjena je iz kategorije, [[Special:WhatLinksHere/$1|ovu stranicu sadrže druge stranice]]",
        "autochange-username": "Automatska promjena MediaWikija",
        "upload": "Postavi datoteku",
        "uploadbtn": "Postavi datoteku",
        "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
-       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor \"$1\".",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Nije moguće raščlaniti XML postavljene datoteke.",
        "uploadvirus": "Datoteka sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati da se zaobiđu sigurnosne zabrane.",
        "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
        "upload-http-error": "Desila se HTTP greška: $1",
        "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-back": "Nazad",
        "upload-dialog-button-done": "Gotovo",
        "upload-dialog-button-save": "Sačuvaj",
        "upload-dialog-button-upload": "Postavi",
        "backend-fail-hashes": "Nisam našao datoteku disperzije radi usporedbe.",
        "backend-fail-notsame": "Već postoji različita datoteka $1.",
        "backend-fail-invalidpath": "$1 nije valjana putanja za skladištenje.",
-       "backend-fail-delete": "Ne može se izbrisati datoteka $1.",
+       "backend-fail-delete": "Ne mogu obrisati datoteku \"$1\".",
        "backend-fail-describe": "Ne mogu promijeniti metapodatke za datoteku \"$1\".",
        "backend-fail-alreadyexists": "Datoteka $1 već postoji.",
        "backend-fail-store": "Ne može se spremiti datoteka $1 na $2.",
        "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži medije po imenu:",
-       "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
+       "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
        "listfiles_thumb": "Smanjeni pregled",
        "file-anchor-link": "Datoteka",
        "filehist": "Historija datoteke",
        "filehist-help": "Kliknite na datum/vrijeme da vidite verziju datoteke iz tog vremena.",
-       "filehist-deleteall": "izbriši sve",
+       "filehist-deleteall": "obriši sve",
        "filehist-deleteone": "obriši",
        "filehist-revert": "vrati",
        "filehist-current": "trenutno",
        "filerevert-submit": "Vrati",
        "filerevert-success": "'''Datoteka [[Media:$1|$1]]''' je vraćena na [$4 verziju od $3, $2].",
        "filerevert-badversion": "Ne postoji ranija lokalna verzija ove datoteke sa navedenim vremenskim podacima.",
+       "filerevert-identical": "Trenutna verzija datoteke identična je izabranoj.",
        "filedelete": "Obriši $1",
        "filedelete-legend": "Obriši datoteku",
        "filedelete-intro": "Brišete datoteku '''[[Media:$1|$1]]''' zajedno sa svom njenom historijom.",
        "statistics-files": "Broj postavljenih datoteka",
        "statistics-edits": "Broj izmjena od kako je instalirana {{SITENAME}}",
        "statistics-edits-average": "Prosječno izmjena po stranici",
-       "statistics-users": "Registrovani [[Special:ListUsers|korisnici]]",
+       "statistics-users": "Registrirani [[Special:ListUsers|korisnici]]",
        "statistics-users-active": "Aktivni korisnici",
        "statistics-users-active-desc": "Korisnici koji su izvršili akciju u toku {{PLURAL:$1|posljednjeg dana|posljednja $1 dana|posljednjih $1 dana}}",
        "pageswithprop": "Stranice sa svojstvom stranice",
        "ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "specialpage-empty": "Nema rezultata za ovaj izvještaj.",
        "lonelypages": "Siročad",
-       "lonelypagestext": "Slijedeće stranice nemaju linkove na ostalim stranicama na ovoj {{SITENAME}}.",
+       "lonelypagestext": "Sljedeće stranice nisu povezane niti su uključene transkluzijom u druge stranice na {{GRAMMAR:dativ|{{SITENAME}}}}.",
        "uncategorizedpages": "Nekategorisane stranice",
        "uncategorizedcategories": "Nekategorisane kategorije",
        "uncategorizedimages": "Slike bez kategorije",
        "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": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze u [[:$1]].",
+       "wantedfiletext-cat": "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. Pored toga, stranice koje sadrže nepostojeće datoteke nalaze se u [[:$1]].",
        "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 ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska.",
+       "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",
        "protectedpages-performer": "Zaštita korisnika",
        "protectedpages-params": "Parametri zaštite",
        "protectedpages-reason": "Razlog",
+       "protectedpages-submit": "Prikaži stranice",
        "protectedpages-unknown-timestamp": "Nepoznato",
        "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
        "protectedtitles-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih naslova. Za spisak trenutno zaštićenih stranica vidi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nijedan naslov članka trenutno nije zaštićen ovim parametrima.",
+       "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
+       "apisandbox-unfullscreen": "Prikaži stranicu",
+       "apisandbox-reset": "Očisti",
+       "apisandbox-retry": "Pokušaj ponovo",
+       "apisandbox-loading": "Učitavam podatke o API modulu \"$1\"...",
+       "apisandbox-examples": "Primjeri",
+       "apisandbox-dynamic-parameters": "Dodatni parametri",
+       "apisandbox-dynamic-parameters-add-label": "Dodaj parametar:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Ime parametra",
+       "apisandbox-dynamic-error-exists": "Parametar pod nazivom \"$1\" već postoji.",
+       "apisandbox-deprecated-parameters": "Zastarjeli parametri",
+       "apisandbox-fetch-token": "Automatski ispuni žeton",
+       "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-continue": "Nastavi",
+       "apisandbox-continue-clear": "Očisti",
+       "apisandbox-multivalue-all-values": "$1 (sve vrijednosti)",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
        "booksources-search": "Traži",
        "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 zapise u evidenciji",
+       "showhideselectedlogentries": "Pokaži/sakrij izabrane unose u zapisniku",
        "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "checkbox-select": "Izaberi: $1",
        "checkbox-all": "Sve",
        "activeusers-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike koji počinju sa:",
        "activeusers-noresult": "Nije pronađen korisnik.",
+       "activeusers-submit": "Prikaži aktivne korisnike",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pripadajućim pravima pristupa.\nMoguće je da o svakoj grupi postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
        "listgrouprights-rights": "Prava",
        "listgrouprights-helppage": "Help:Prava grupe",
        "listgrouprights-members": "(spisak članova)",
-       "listgrouprights-addgroup": "Mogu dodati {{PLURAL:$2|grupu|grupe}}: $1",
-       "listgrouprights-removegroup": "Mogu ukloniti {{PLURAL:$2|grupu|grupe}}: $1",
+       "listgrouprights-addgroup": "Dodavanje {{PLURAL:$2|sljedeće grupe|sljedećih grupa}}: $1",
+       "listgrouprights-removegroup": "Uklanjanje {{PLURAL:$2|sljedeće grupe|sljedećih grupa}}: $1",
        "listgrouprights-addgroup-all": "Može dodavati sve grupe",
        "listgrouprights-removegroup-all": "Može ukloniti sve grupe",
        "listgrouprights-addgroup-self": "Može dodati {{PLURAL:$2|grupu|grupe|grupa}} na svoj račun: $1",
        "listgrouprights-namespaceprotection-header": "Ograničenja imenskog prostora",
        "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-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-msg": "Praćenje kategorije",
        "emailccsubject": "Kopiraj Vašu poruku za $1: $2",
        "emailsent": "Poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s {{GRAMMAR:genitiv|{{SITENAME}}}}. Ako {{GENDER:$2|odgovorite}} na ovu e-poruku, {{GENDER:$2|Vaša}} će se poruka direktno poslati {{GENDER:$1|originalnom pošiljaocu|originalnoj pošiljatejici}} i otkrit ćete {{GENDER:$1|mu|joj}} {{GENDER:$2|svoju}} adresu e-pošte.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja",
        "unwatch": "Prestani pratiti",
        "unwatchthispage": "Prestani pratiti",
        "notanarticle": "Nije članak",
-       "notvisiblerev": "Revizija je obrisana",
+       "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>.",
        "wlshowtime": "Vremensko razdoblje za prikaz:",
        "wlshowhideminor": "manje izmjene",
        "wlshowhidebots": "botove",
-       "wlshowhideliu": "registrovane korisnike",
+       "wlshowhideliu": "registrirane korisnike",
        "wlshowhideanons": "anonimne korisnike",
        "wlshowhidepatr": "patrolirane izmjene",
        "wlshowhidemine": "moje izmjene",
+       "wlshowhidecategorization": "kategorizaciju stranica",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "unwatching": "Ne pratim...",
        "delete-toobig": "Ova stranica ima veliku historiju promjena, preko $1 {{PLURAL:$1|revizije|revizija}}.\nBrisanje takvih stranica nije dopušteno da bi se spriječilo slučajno preopterećenje servera na kojem je {{SITENAME}}.",
        "delete-warning-toobig": "Ova stranica ima veliku historiju izmjena, preko $1 {{PLURAL:$1|izmjene|izmjena}}.\nNjeno brisanje može dovesti do opterećenja operacione baze na {{SITENAME}};\nnastavite s oprezom.",
        "deleteprotected": "Ne možete obrisati ovu stranicu jer je zaštićena.",
-       "deleting-backlinks-warning": "'''Upozorenje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge stranice]] sadrže link ili vode na stranicu koju brišete.",
+       "deleting-backlinks-warning": "<strong>Upozorenje:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge stranice]] sadrže link ili vode na stranicu koju brišete.",
        "rollback": "Vrati izmjene",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}",
        "rollbacklinkcount-morethan": "vrati više od $1 {{PLURAL:$1|izmjene|izmjene|izmjena}}",
-       "rollbackfailed": "Neuspešno vraćanje",
+       "rollbackfailed": "Neuspješno vraćanje",
+       "rollback-missingrevision": "Ne mogu učitati podatke o izmjeni.",
        "cantrollback": "Ne mogu vratiti izmjenu;\nposljednji autor je ujedno i jedini.",
        "alreadyrolled": "Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko je već izmijenio ili vratio članak na prethodnu provjerenu verziju.\n\nPosljednju izmjenu napravio je korisnik [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak izmjene je bio: <em>$1</em>.",
        "changecontentmodel-title-label": "Naslov stranice",
        "changecontentmodel-model-label": "Novi model sadržaja",
        "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-submit": "Promijeni",
        "changecontentmodel-success-title": "Model sadržaja je promijenjen",
        "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promijenjen.",
        "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
        "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "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",
+       "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",
        "logentry-contentmodel-change-revert": "vrati",
        "unprotectedarticle": "uklonjena zaštita sa stranice \"[[$1]]\"",
        "movedarticleprotection": "podešavanja zaštite premještena sa \"[[$2]]\" na \"[[$1]]\"",
        "protectedarticle-comment": "{{GENDER:$2|Zaštitio|Zaštitila}} je stranicu \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Promijenjen nivo zaštite}} za \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Uklonjena zaštita}} sa stranice \"[[$1]]\"",
        "protect-title": "Mijenjate nivo zašite za \"$1\"",
        "protect-title-notallowed": "Pregled stepena zaštite za \"$1\"",
        "prot_1movedto2": "članak [[$1]] premješten na [[$2]]",
        "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": "'''$1 je vraćena'''\n\nProvjerite [[Special:Log/delete|zapis brisanja]] za zapise najskorijih brisanja i vraćanja.",
+       "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.",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "undelete-search-box": "Pretraga obrisanih stranica",
        "mycontris": "Doprinosi",
        "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
+       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
        "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
        "uctop": "(trenutno)",
        "month": "Od mjeseca (i ranije):",
        "whatlinkshere-hidelinks": "$1 linkove",
        "whatlinkshere-hideimages": "$1 linkova do datoteke",
        "whatlinkshere-filters": "Filteri",
+       "whatlinkshere-submit": "Idi",
        "autoblockid": "Automatska blokada #$1",
        "block": "Blokiraj korisnika",
        "unblock": "Odblokiraj korisnika",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Vidi postojeće blokade",
        "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "još $1",
        "unblockip": "Odblokiraj korisnika",
        "unblockiptext": "Upotrebite donji upitnik da bi ste vratili\npravo pisanja ranije blokiranoj IP adresi\nili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocklink": "deblokiraj",
        "change-blocklink": "promijeni blokadu",
        "contribslink": "doprinosi",
-       "emaillink": "pošalji e-mail",
+       "emaillink": "pošalji e-poruku",
        "autoblocker": "Automatski ste blokirani jer dijelite IP-adresu sa \"[[User:$1|$1]]\".\nRazlog za blokiranje korisnika $1 je ''$2''",
        "blocklogpage": "Zapisnik blokiranja",
        "blocklog-showlog": "Ovaj korisnik je ranije blokiran. Zapisnik blokiranja je prikazan ispod kao referenca:",
        "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.",
        "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
-       "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
+       "movenologintext": "Morate biti registrirani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještanje datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (bez podstranica).",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
        "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
        "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
+       "cant-move-subpages": "Nemate dopuštenje da premještate podstranice.",
+       "namespace-nosubpages": "Imenski prostor \"$1\" ne dozvoljava podstranice.",
        "newtitle": "Novi naslov:",
        "move-watch": "Prati izvornu i odredišnu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "movelogpagetext": "Ispod je spisak premještenih stranica.",
        "movesubpage": "{{PLURAL:$1|Podstranica|Podstranice}}",
        "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.",
+       "movesubpagetalktext": "Odgovarajuća stranica za razgovor ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.",
        "movenosubpage": "Ova stranica nema podstranica.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
        "move-leave-redirect": "Ostavi preusmjerenje",
        "protectedpagemovewarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je mogu premještati samo korisnici sa ovlastima administratora.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
        "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": "== Datoteka postoji ==\n[[:$1]] postoji na dijeljenom repozitorijumu. Premještanje datoteke na ovaj naslov će prepisati dijeljenu datoteku.",
+       "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",
        "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}}]].",
        "export-download": "Spremi kao datoteku",
        "export-templates": "Uključi šablone",
        "export-pagelinks": "Uključi povezane stranice do dubine od:",
+       "export-manual": "Ručno dodaj stranice:",
        "allmessages": "Sve sistemske poruke",
        "allmessagesname": "Naziv",
        "allmessagesdefault": "Uobičajeni tekst",
        "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...",
-       "import-revision-count": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
+       "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",
        "import-rootpage-nosubpage": "Imenski prostor \"$1\" osnovne stranice ne dozvoljava podstranice.",
        "importlogpage": "Zapisnik uvoza",
        "importlogpagetext": "Administrativni uvozi stranica sa historijom izmjena sa drugih wikija.",
-       "import-logentry-upload-detail": "{{PLURAL:$1|Uvezena jedna revizija|Uvezene $1 revizije|Uvezeno $1 revizija}}",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvezena $1 revizija|Uvezene $1 revizije|Uvezeno $1 revizija}} od $2",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Uvezena jedna izmjena|Uvezene $1 izmjene|Uvezeno $1 izmjena}}",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvezena $1 izmjena|Uvezene $1 izmjene|Uvezeno $1 izmjena}} sa $2",
        "javascripttest": "Testiranje JavaScript-e",
        "javascripttest-pagetext-unknownaction": "Nepoznata radnja \"$1\".",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
        "tooltip-ca-nstab-category": "Pogledajte stranicu kategorije",
        "tooltip-minoredit": "Označi kao manju izmjenu",
        "tooltip-save": "Sačuvaj moje izmjene",
+       "tooltip-publish": "Objavi svoje izmjene",
        "tooltip-preview": "Pregledajte svoje izmjene. Preporučeno pri bilo kakvom uređivanju!",
        "tooltip-diff": "Prikaži moje izmjene u tekstu",
        "tooltip-compareselectedversions": "Uporedi razliku između dvije izabrane verzije ove stranice",
        "pageinfo-length": "Dužina stranice (u bajtovima)",
        "pageinfo-article-id": "ID stranice",
        "pageinfo-language": "Jezik sadržaja stranice",
+       "pageinfo-language-change": "promijeni",
        "pageinfo-content-model": "Model sadržaj stranice",
+       "pageinfo-content-model-change": "promijeni",
        "pageinfo-robot-policy": "Indeksiranje od strane robota",
        "pageinfo-robot-index": "Dozvoljeno",
        "pageinfo-robot-noindex": "Nije dozvoljeno",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj potkategorija",
        "pageinfo-category-files": "Broj datoteka",
+       "pageinfo-user-id": "Korisnički ID",
        "markaspatrolleddiff": "Označi kao patrolirano",
        "markaspatrolledtext": "Označi stranicu kao patroliranu",
+       "markaspatrolledtext-file": "Označi ovu verziju datoteke kao patroliranu",
        "markedaspatrolled": "Označeno kao patrolirano",
-       "markedaspatrolledtext": "Izabrana revizija [[:$1]] je bila označena kao patrolirana.",
+       "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",
-       "markedaspatrollederrortext": "Morate naglasiti reviziju koju treba označiti kao patroliranu.",
+       "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.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
-       "log-show-hide-patrol": "$1 zapis patroliranja",
+       "log-show-hide-patrol": "$1 zapisnik patroliranja",
        "log-show-hide-tag": "$1 zapisnik oznaka",
-       "deletedrevision": "Obrisana stara revizija $1",
+       "confirm-markpatrolled-button": "U redu",
+       "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 patroliranom?",
+       "deletedrevision": "Obrisana stara izmjena $1",
        "filedeleteerror-short": "Greška pri brisanju datoteke: $1",
        "filedeleteerror-long": "Desile su se greške pri brisanju datoteke:\n\n$1",
        "filedelete-missing": "Datoteka \"$1\" ne može biti obrisana, jer ne postoji.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
        "newimages-showbots": "Pokaži datoteke koje su poslali botovi",
+       "newimages-hidepatrolled": "Sakrij patrolirana postavljanja",
        "noimages": "Nema ništa.",
+       "gallery-slideshow-toggle": "Uključi/isključi sličice",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
        "sp-newimages-showfrom": "Prikaz novih datoteka počev od $2, $1",
        "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_pending": "Konfirmacioni kod Vam je već poslan putem e-maila;\nako ste nedavno otvorili Vaš račun, trebali bi pričekati par minuta da poslana pošta stigne, prije nego što ponovno zahtijevate novi kod.",
+       "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.",
        "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!",
-       "confirmrecreate": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) obrisao je ovaj članak pošto ste počeli uređivanje s razlogom:\n: ''$2''\n\nMolimo Vas da potvrdite da stvarno želite ponovo napraviti ovaj članak.",
-       "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) obrisao je ovaj članak nakon što ste ga počeli uređivati. Molimo Vas da potvrdite da stvarno želite ponovo napraviti ovaj članak.",
+       "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_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.",
        "confirm-watch-button": "U redu",
-       "confirm-watch-top": "Dodajte ovu stranu na Vaš spisak praćenih članaka",
+       "confirm-watch-top": "Dodati ovu stranicu na spisak praćenja?",
        "confirm-unwatch-button": "U redu",
-       "confirm-unwatch-top": "Izbrišite ovu stranu sa Vašeg spiska praćenih članaka",
+       "confirm-unwatch-top": "Ukloniti ovu stranicu sa spiska praćenja?",
+       "confirm-rollback-button": "U redu",
+       "confirm-rollback-top": "Ukloniti izmjene na ovoj stranici?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← prethodna stranica",
        "imgmultipagenext": "slijedeća stranica →",
        "autoredircomment": "Preusmjereno na [[$1]]",
        "autosumm-new": "Nova stranica: $1",
        "autosumm-newblank": "Napravljena prazna stranica",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "KSV",
+       "timezone-local": "Lokalno",
        "duplicate-defaultsort": "Upozorenje: Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
        "duplicate-displaytitle": "<strong>Upozorenje:</strong> Prikazivani naslov \"$2\" poništava prethodni naslov \"$1\".",
+       "restricted-displaytitle": "<strong>Upozorenje:</strong> Naslov za prikaz \"$1\" zanemaren je jer ne odgovara stvarnom naslovu stranice.",
        "invalid-indicator-name": "<strong>Greška:</strong> <code>Imena</code> pokazatelja stanja strance ne smiju biti prazna.",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja",
        "version-libraries-license": "Licenca",
        "version-libraries-description": "Opis",
        "version-libraries-authors": "Autori",
-       "redirect": "Preusmjerenje na datoteku, korisnika, stranicu ili oznaku izmjene",
+       "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-submit": "Idi",
        "redirect-lookup": "Tip vrijednosti:",
        "tag-filter": "Filter [[Special:Tags|oznaka]]:",
        "tag-filter-submit": "Filter",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|oznaka|oznake}}]]: $2)",
+       "tag-mw-contentmodelchange": "promjena modela sadržaja",
        "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-manual": "Ručno postavili korisnici ili botovi",
        "tags-source-none": "Više se ne koristi",
        "tags-edit": "uređivanje",
-       "tags-delete": "izbriši",
+       "tags-delete": "obriši",
        "tags-activate": "aktiviraj",
        "tags-deactivate": "dekativiraj",
        "tags-hitcount": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "tags-manage-no-permission": "Nemate pravo upravljati promjenama oznaka.",
+       "tags-manage-blocked": "Ne možete mijenjati oznake za promjenu dok {{GENDER:$1|ste}} blokirani.",
        "tags-create-heading": "Napravi novu oznaku",
        "tags-create-explanation": "Predoređeno je da će korisnici i botovi moći koristiti novonapravljene oznake.",
        "tags-create-tag-name": "Naziv oznake:",
        "tags-create-already-exists": "Oznaka \"$1\" već postoji.",
        "tags-create-warnings-above": "{{PLURAL:$2|Dogodila se sljedeća greška|Dogodile su se sljedeće greške}} pri stvaranju oznake \"$1\":",
        "tags-create-warnings-below": "Želite li nastaviti stvaranje oznake?",
-       "tags-delete-title": "Izbriši oznaku",
+       "tags-delete-title": "Brisanje oznaka",
        "tags-delete-explanation-initial": "Brišete oznaku \"$1\" iz baze podataka.",
        "tags-delete-explanation-in-use": "Bit će obrisana sa {{PLURAL:$2|$2 verzije ili unosa u zapisniku|svih $2 verzija i/ili unosa u zapisniku}} na kojima se trenutno koristi.",
        "tags-delete-explanation-warning": "Ova radnja se <strong>ne može povratiti</strong> te se <strong>ne može poništiti</strong>. Ovo ne mogu uraditi čak ni administratori baze podataka. Budite sigurni da je ovo oznaka koju želite obrisati.",
        "tags-delete-not-allowed": "Oznake koje su definirane proširenjem se ne mogu obrisati ukoliko to proširenje isključivo ne dopušta.",
        "tags-delete-not-found": "Oznaka \"$1\" ne postoji.",
        "tags-delete-too-many-uses": "Oznaka \"$1\" je primjenjena na više od {{PLURAL:$2|revizija|revizijǎ}}, što znači da se ne može obrisati.",
-       "tags-delete-warnings-after-delete": "Oznaka \"$1\" uspješno je obrisana. Međutim, došlo je do {{PLURAL:$2|sljedećeg upozorenja|sljedećih upozorenja}}:",
+       "tags-delete-warnings-after-delete": "Oznaka \"$1\" je obrisana. Međutim, došlo je do {{PLURAL:$2|sljedećeg upozorenja|sljedećih upozorenja}}:",
+       "tags-delete-no-permission": "Nemate dopuštenje da brišete oznake za promjenu.",
        "tags-activate-title": "Aktiviraj oznaku",
        "tags-activate-question": "Aktivirate oznaku \"$1\".",
        "tags-activate-reason": "Razlog:",
        "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",
        "tags-edit-title": "Uredi oznake",
        "tags-edit-manage-link": "Upravljaj oznakama",
-       "tags-edit-revision-selected": "{{PLURAL:$1|Izabrana verzija|Izabrane verzije}} od [[:$2]]:",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Izabrana verzija|Izabrane verzije}} stranice [[:$2]]:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|Izabran unos zapisnika|Izabrani unosi zapisnika}}:",
        "tags-edit-revision-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove verzije|svih $1 verzija}}",
        "tags-edit-logentry-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove zapisničke stavke|svih $1 zapisničkih stavki}}",
        "htmlform-cloner-create": "Dodaj još",
        "htmlform-cloner-delete": "Ukloni",
        "htmlform-cloner-required": "Potrebna je barem jedna vrijednost.",
+       "htmlform-date-placeholder": "GGGG-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "GGGG-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "Ne mogu prepoznati uneseni format datuma. Koristite format GGGG-MM-DD.",
+       "htmlform-time-invalid": "Ne mogu prepoznati uneseni format vremena. Koristite format GGGG-MM-DD.",
+       "htmlform-datetime-invalid": "Ne mogu prepoznati uneseni format za datum i vrijeme. Koristite format GGGG-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "Navedena vrijednost je prije najranijeg dopuštenog datuma – $1.",
+       "htmlform-date-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog datuma – $1.",
+       "htmlform-time-toolow": "Navedena vrijednost je prije najranijeg dopuštenog vremena – $1.",
+       "htmlform-time-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog vremena – $1.",
+       "htmlform-datetime-toolow": "Navedena vrijednost je prije najranijeg dopuštenog datuma i vremena – $1.",
+       "htmlform-datetime-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog datuma i vremena – $1.",
        "htmlform-title-badnamespace": "[[:$1]] nije u imenskom prostoru \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Stranica \"$1\" se ne može napraviti",
        "htmlform-title-not-exists": "$1 ne postoji.",
        "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 {{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-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-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 postavljanjem datoteke",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 postavljanjem datoteke ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 s drugog wikija",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 sa $5 ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|spojio|spojila}} je $3 u $4 (sve do izmjene $5)",
        "logentry-move-move": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 bez ostavljanja preusmjerenja",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zaštitio|zaštitila}} je $3 $4 [prenosiva zaštita]",
        "logentry-protect-modify": "$1 {{GENDER:$2|promijenio|promijenila}} je stepen zaštite za $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|promijenio|promijenila}} je nivo zaštite za $3 $4 [prenosiva zaštita]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|promijenio|promijenila}} je članstvo grupe za $3 iz $4 u $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|promijenio|promijenila}} je članstvo grupe {{GENDER:$6|korisnika|korisnice}} $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|postavio|postavila}} је novu verziju $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|postavio|postavila}} је $3",
        "log-name-managetags": "Zapisnik upravljanja oznaka",
-       "log-description-managetags": "Ovaj zapisnik sadrži spisak izmjena u vezi [[Special:Tags|oznaka]]. Zapisnik sadrži samo radnje izvršene od strane administratora; unosi za oznake napravljene ili obrisane od strane wiki softvera se ne nalaze u ovom zapisniku.",
+       "log-description-managetags": "Ovaj zapisnik sadrži spisak izmjena u vezi s [[Special:Tags|oznakama]]. Zapisnik sadrži samo radnje koje su ručno izvršili administratori; unosi za oznake koje je napravio ili obrisao wiki softver ne nalaze se u ovom zapisniku.",
        "logentry-managetags-create": "$1 {{GENDER:$2|napravio|napravila}} je oznaku \"$4\"",
-       "logentry-managetags-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je oznaku \"$4\" (uklonjena je iz $5 {{PLURAL:$5|izmjene ili zapisnika|izmjena i/ili zapisnikǎ}})",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je oznaku \"$4\" (uklonjena je iz $5 {{PLURAL:$5|izmjene ili zapisnika|izmjena i/ili zapisnika}})",
        "logentry-managetags-activate": "$1 {{GENDER:$2|aktivirao|aktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivirao|deaktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "log-name-tag": "Zapisnik oznaka",
        "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-useragent": "Korisnički agent:",
        "searchsuggest-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "searchsuggest-containing": "sadrži...",
-       "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
-       "api-error-copyuploaddisabled": "Postavljanja putem URL-a su onemogućena na ovom serveru.",
-       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici s istim sadržajem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Datoteka koju ste poslali je bila prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
-       "api-error-fetchfileerror": "Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.",
-       "api-error-fileexists-forbidden": "Datoteka s imenom \"$1\" već postoji i ne može biti zamijenjena.",
-       "api-error-fileexists-shared-forbidden": "Datoteka s imenom \"$1\" već postoji u zajedničkom spremištu i ne može biti prepisana.",
-       "api-error-file-too-large": "Datoteka koju ste poslali je bila prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nije dopušteni vrsta datoteke|su nedopušteni vrste datoteke|su nedopušteni vrste datoteka}}. {{PLURAL:$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmjena koji ste pokušali načiniti je obustavljena preko kuke proširenja.",
-       "api-error-http": "Unutrašnja greška: ne može se spojiti na server.",
-       "api-error-illegal-filename": "Ime datoteke nije dopušteno.",
-       "api-error-internal-error": "Unutrašnja greška: pojavio se neki problem sa obradom vašeg postavljanja na wiki.",
-       "api-error-invalid-file-key": "Unutrašnja greška: datoteka nije pronađena u privremenom skladištu.",
-       "api-error-missingparam": "Unutrašnja greška: nedostaju parametri u zahtjevu.",
-       "api-error-missingresult": "Unutrašnja greška: ne može se otkriti da li je kopiranje uspjelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da biste postavljali datoteke.",
-       "api-error-mustbeposted": "Postoji greška u ovom softveru; ne koristi pravilan HTTP metod.",
-       "api-error-noimageinfo": "Postavljanje je uspjelo, ali server nam nije dao nikakvu informaciju o datoteci.",
-       "api-error-nomodule": "Unutrašnja greška: nije postavljen modul za postavljanje.",
-       "api-error-ok-but-empty": "Unutrašnja greška: nema odgovora od servera.",
-       "api-error-overwrite": "Pisanje preko postojeće datoteke nije dopušteno.",
-       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: Server nije uspio objaviti privremenu datoteku.",
-       "api-error-stasherror": "Dogodila se greška pri postavljaju datoteke u skladište.",
-       "api-error-stashedfilenotfound": "Skladištena datoteka nije pronađena pri pokušaju postavljanja iste iz skladišta.",
-       "api-error-stashpathinvalid": "Putanja na kojoj je trebala biti skladištena datoteka je neispravna.",
-       "api-error-stashfilestorage": "Dogodila se greška pri postavljaju datoteke u skladište.",
-       "api-error-stashzerolength": "Server nije mogao skladištiti datoteku jer joj je veličina iznosila 0.",
-       "api-error-stashnotloggedin": "Morate biti prijavljeni kako biste sačuvali datoteke u skladište postavljanja.",
-       "api-error-stashwrongowner": "Datoteka kojoj ste pokušali pristupiti u skladištu ne pripada vama.",
-       "api-error-stashnosuchfilekey": "Datotečni ključ kome ste pokušali pristupiti u skladištu ne pripada vama.",
-       "api-error-timeout": "Server nije odgovorio unutar očekivanog vremena.",
-       "api-error-unclassified": "Desila se nepoznata greška",
-       "api-error-unknown-code": "Nepoznata greška: \"$1\"",
-       "api-error-unknown-error": "Unutrašnja greška: desila se neka greška pri pokušaju postavljanja vaše datoteke.",
-       "api-error-unknown-warning": "Nepoznato upozorenje: $1",
+       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
+       "api-error-unknown-warning": "Nepoznato upozorenje: \"$1\".",
        "api-error-unknownerror": "Nepoznata greška: \"$1\"",
-       "api-error-uploaddisabled": "Postavljanje je onemogućeno na ovoj wiki.",
-       "api-error-verification-error": "Ova datoteka je možda oštećenja ili ima pogrešan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minute|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
        "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_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": "Odabir jezika stranice",
+       "pagelanguage": "Promijeni jezik stranice",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
        "pagelang-use-default": "Koristi podrazumijevani jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "pagelang-reason": "Razlog",
+       "pagelang-submit": "Pošalji",
+       "pagelang-nonexistent-page": "Stranica $1 ne postoji.",
+       "pagelang-unchanged-language": "Stranica $1 već je postavljena na jezik $2.",
+       "pagelang-unchanged-language-default": "Stranica $1 već je postavljena na predodređeni jezik sadržaja ovog wikija.",
+       "pagelang-db-failed": "Baza podataka nije uspjela promijeniti jezik stranice.",
        "right-pagelang": "promjena jezika stranice",
        "action-pagelang": "promijenite jezik stranice",
        "log-name-pagelang": "Zapisnik promjene jezika",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Statistike o tipovima poslanih datoteka. Ovdje su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajt|$1 bajtova}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Ukupna veličina datoteke ovog odlomka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ukupna veličina svih datoteka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2).",
        "mediastatistics-table-mimetype": "MIME tip",
        "mediastatistics-table-extensions": "Moguća proširenja",
        "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-header-text": "Tekstualno",
        "mediastatistics-header-executable": "Izvršni",
        "mediastatistics-header-archive": "Kompresovani formati",
+       "mediastatistics-header-total": "Sve datoteke",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|prateća tačka uklonjena je|pratećih tački uklonjeno je}} iz JSON-a",
        "json-error-unknown": "Dogodio se problem s JSON-om. Greška: $1",
        "json-error-depth": "Prekoračena je maksimalna dubina",
        "special-characters-group-arabicextended": "prošireni arapski",
        "special-characters-group-persian": "Perzijski",
        "special-characters-group-hebrew": "hebrejski",
-       "special-characters-group-bangla": "bangladeški",
+       "special-characters-group-bangla": "bengalski",
        "special-characters-group-tamil": "tamilski",
        "special-characters-group-telugu": "telugu",
        "special-characters-group-sinhala": "sinhalski",
-       "special-characters-group-gujarati": "gujarati",
+       "special-characters-group-gujarati": "guarati",
        "special-characters-group-devanagari": "devanagari",
        "special-characters-group-thai": "tajlandski",
        "special-characters-group-lao": "laoski",
        "special-characters-title-emdash": "duga crta",
        "special-characters-title-minus": "minus",
        "mw-widgets-dateinput-no-date": "Nikakav datum nije izabran",
+       "mw-widgets-mediasearch-noresults": "Nema rezultata.",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
-       "randomrootpage": "Slučajna root stranica",
+       "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategoriju...",
+       "mw-widgets-usersmultiselect-placeholder": "Dodaj više...",
+       "sessionmanager-tie": "Ne možete istovremeno koristiti nekoliko vrsta provjera autentičnosti: $1.",
+       "randomrootpage": "Slučajna korijenska stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
        "log-action-filter-contentmodel": "Vrsta izmjene modela sadržaja:",
        "log-action-filter-delete": "Vrsta brisanja:",
        "log-action-filter-patrol": "Vrsta patroliranja:",
        "log-action-filter-protect": "Vrsta zaštite:",
        "log-action-filter-rights": "Vrsta izmjene korisničkih prava:",
+       "log-action-filter-suppress": "Vrsta skrivanja:",
        "log-action-filter-upload": "Vrsta postavljanja:",
        "log-action-filter-all": "Sve",
        "log-action-filter-block-block": "Blokiranje",
        "log-action-filter-contentmodel-change": "Izmjena modela sadržaja",
        "log-action-filter-contentmodel-new": "Nova stranica s nestandardnim modelom sadržaja",
        "log-action-filter-delete-delete": "Brisanje stranice",
+       "log-action-filter-delete-delete_redir": "Prepisivanje preusmjerenja",
        "log-action-filter-delete-restore": "Vraćanje obrisane stranice",
        "log-action-filter-delete-event": "Brisanje unosa u zapisniku",
        "log-action-filter-delete-revision": "Brisanje izmjene",
        "log-action-filter-protect-move_prot": "Premještanje zaštite",
        "log-action-filter-rights-rights": "Ručna izmjena",
        "log-action-filter-rights-autopromote": "Automatska izmjena",
+       "log-action-filter-suppress-event": "Skrivanje unosa u zapisniku",
+       "log-action-filter-suppress-revision": "Skrivanje izmjene",
+       "log-action-filter-suppress-delete": "Skrivanje stranice",
+       "log-action-filter-suppress-block": "Skrivanje korisnika blokiranjem",
+       "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"
+       "log-action-filter-upload-overwrite": "Izmjena postojeće datoteke",
+       "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-authplugin-setpass-failed-title": "Promjena lozinke nije uspjela",
+       "authmanager-authplugin-setpass-bad-domain": "Neispravna domena.",
+       "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-email-help": "Adresa e-pošte",
+       "authmanager-realname-label": "Pravo ime",
+       "authmanager-realname-help": "Korisnikovo pravo ime",
+       "authmanager-provider-temporarypassword": "Privremena lozinka",
+       "authprovider-resetpass-skip-label": "Preskoči",
+       "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.",
+       "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.",
+       "credentialsform-account": "Naziv računa:",
+       "cannotlink-no-provider-title": "Nema spojivih računa",
+       "cannotlink-no-provider": "Nema spojivih računa.",
+       "linkaccounts": "Spajanje računa",
+       "linkaccounts-success-text": "Račun je spojen.",
+       "linkaccounts-submit": "Spoji račune",
+       "unlinkaccounts": "Razdvajanje računa",
+       "unlinkaccounts-success": "Račun je razdvojen.",
+       "restrictionsfield-badip": "Neispravna IP-adresa ili opseg: $1",
+       "restrictionsfield-label": "Dozvoljeni IP-opsezi:",
+       "revid": "izmjena $1",
+       "pageid": "ID stranice $1"
 }
index 3fc6bea..8171411 100644 (file)
        "searcharticle": "Vés-hi",
        "history": "Historial de canvis",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "actualitzat des de la darrera visita",
        "printableversion": "Versió per a impressora",
        "permalink": "Enllaç permanent",
        "views": "Vistes",
        "toolbox": "Eines",
        "tool-link-userrights": "Canvia els grups de l'{{GENDER:$1|usuari|usuària}}",
+       "tool-link-userrights-readonly": "Mostra els grups d'{{GENDER:$1|usuari}}",
        "tool-link-emailuser": "Envia un missatge electrònic a l'{{GENDER:$1|usuari|usuària}}",
        "userpage": "Visualitza la pàgina d'usuari",
        "projectpage": "Visualitza la pàgina del projecte",
        "missingarticle-rev": "(revisió#: $1)",
        "missingarticle-diff": "(dif: $1, $2)",
        "readonly_lag": "La base de dades s'ha bloquejat automàticament mentre els servidors esclaus se sincronitzen amb el mestre",
+       "nonwrite-api-promise-error": "L'encapçalament HTTP 'Promise-Non-Write-API-Action' ha estat enviat però la petició era a mòdul d'escriptura de l'API.",
        "internalerror": "Error intern",
        "internalerror_info": "Error intern: $1",
        "internalerror-fatal-exception": "Excepció fatal del tipus «$1»",
        "createacct-email-ph": "Introduïu la vostra adreça de correu electrònic",
        "createacct-another-email-ph": "Introduïu una adreça de correu electrònic",
        "createaccountmail": "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
+       "createaccountmail-help": "Pot utilitzar-se per crear un compte per a una altra persona sense necessitar una contrasenya.",
        "createacct-realname": "Nom real (opcional)",
        "createaccountreason": "Motiu:",
        "createacct-reason": "Motiu",
        "eauthentsent": "S'ha enviat un correu electrònic a la direcció especificada. Abans no s'enviï cap altre correu electrònic a aquesta adreça, cal verificar que és realment vostra. Per tant, cal que seguiu les instruccions presents en el correu electrònic que se us ha enviat.",
        "throttled-mailpassword": "Ja se us ha enviat un correu electrònic de reinicialització de contrasenya en {{PLURAL:$1|l'última hora|les últimes $1 hores}}.\nPer a prevenir abusos, només s'envia un correu electrònic de reinicialització de contrasenya cada {{PLURAL:$1|hora|$1 hores}}.",
        "mailerror": "S'ha produït un error en enviar el missatge: $1",
-       "acct_creation_throttle_hit": "Des de la vostra adreça IP ja {{PLURAL:$1|s'ha creat un compte|s'han creat $1 comptes}} en l'últim dia i aquest és el màxim permès en aquest wiki per aquest període de temps.\nAixí, des d'aquesta adreça IP no es poden crear més comptes actualment.",
+       "acct_creation_throttle_hit": "Des de la vostra adreça IP {{PLURAL:$1|s'ha creat un compte|s'han creat $1 comptes}} en aquest wiki durant $2 i aquest és el màxim permès per aquest període de temps.\nAixí, des d'aquesta adreça IP no es poden crear més comptes actualment.",
        "emailauthenticated": "S'ha autenticat la vostra adreça electrònica el $2 a les $3.",
        "emailnotauthenticated": "La vostra adreça de correu electrònic <strong>encara no està autenticada</strong>. No rebrà cap missatge de correu electrònic per a cap de les següents funcionalitats.",
        "noemailprefs": "Especifiqueu una adreça electrònica per activar aquestes característiques.",
        "botpasswords-created-title": "S'ha creat la contrasenya del bot",
        "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».",
        "botpasswords-updated-title": "Contrasenya de bot actualitzada",
+       "botpasswords-updated-body": "La contrasenya pel bot «$1» de l'usuari «$2» ha estat actualitzada.",
        "botpasswords-deleted-title": "S'ha eliminat la contrasenya del bot",
        "botpasswords-deleted-body": "La contrasenya del bot \"$1\", pertanyent a l'usuari \"$2\", ha estat eliminada.",
-       "botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb <strong>$1</strong> és <strong>$2</strong>. Si us plau, guardeu-la de cara al futur.",
+       "botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb <strong>$1</strong> és <strong>$2</strong>. <em>Guardeu-la de cara al futur.</em><br> (Per a bots vells que necessiten que el nom per a iniciar sessió sigui el mateix que el nom d'usuari, també podeu usar <strong>$3</strong> com a nom d'usuari i <strong>$4</strong> com a contrasenya.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider no està disponible.",
        "botpasswords-restriction-failed": "Les restriccions de contrasenyes de bots impedeixen aquest inici de sessió.",
+       "botpasswords-invalid-name": "El nom d'usuari especificat no conté el separador de contrasenya de bot («$1»).",
        "botpasswords-not-exist": "L'usuari «$1» no té una contrasenya de bot anomenada «$2».",
        "resetpass_forbidden": "No poden canviar-se les contrasenyes",
        "resetpass_forbidden-reason": "Les contrasenyes no es poden canviar: $1",
        "passwordreset-emaildisabled": "Les opcions de correu electrònic no estan habilitades en aquest wiki.",
        "passwordreset-username": "Nom d'usuari:",
        "passwordreset-domain": "Domini",
-       "passwordreset-capture": "Veure el missatge de correu electrònic?",
-       "passwordreset-capture-help": "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
        "passwordreset-email": "Adreça electrònica:",
        "passwordreset-emailtitle": "Detalls del compte a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat una reinicialització de la vostra contrasenya al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar al compte per a fixar-hi una nova contrasenya al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailelement": "Nom d'usuari: \n$1\n\nContrasenya temporal: \n$2",
        "passwordreset-emailsentemail": "Si aquesta adreça electrònica està associada al vostre compte, s’enviarà un missatge de restabliment de contrasenya.",
        "passwordreset-emailsentusername": "Si existeix una adreça electrònica associada a aquest nom d'usuari, s’hi enviarà un missatge de reestabliment de contrasenya.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|S'ha enviat el correu|S'han enviat els correus}} de restabliment de {{PLURAL:$1|contrasenya|contrasenyes}}. A continuació es mostra {{PLURAL:$1|l'usuari i contrasenya|la llista d'usuaris i contrasenyes}}.",
        "passwordreset-invalidemail": "Adreça de correu electrònic no vàlida",
        "passwordreset-nodata": "No s'ha proporcionat cap nom d'usuari ni adreça electrònica",
        "changeemail": "Canvia o elimina l’adreça electrònica",
        "blockedtitle": "L'usuari està blocat",
        "blockedtext": "'''S'ha procedit al blocatge del vostre compte d'usuari o la vostra adreça IP.'''\n\nEl blocatge l'ha dut a terme l'usuari $1.\nEl motiu donat és ''$2''.\n\n* Inici del blocatge: $8\n* Final del blocatge: $6\n* Compte blocat: $7\n\nPodeu contactar amb $1 o un dels [[{{MediaWiki:Grouppage-sysop}}|administradors]] per a discutir-ho.\n\nTingueu en compte que no podeu fer servir el formulari d'enviament de missatges de correu electrònic a cap usuari, a menys que tingueu una adreça de correu vàlida registrada a les vostres [[Special:Preferences|preferències d'usuari]] i no ho tingueu tampoc blocat.\n\nLa vostra adreça IP actual és $3, i el número d'identificació del blocatge és #$5.\nSi us plau, incloeu aquestes dades en totes les consultes que feu.",
        "autoblockedtext": "La vostra adreça IP ha estat blocada automàticament perquè va ser usada per un usuari actualment bloquejat. Aquest usuari va ser blocat per l'{{GENDER:$1|administrador|administradora}} $1. El motiu donat per al bloqueig ha estat:\n\n:''$2''\n\n* Inici del bloqueig: $8\n* Final del bloqueig: $6\n* Usuari bloquejat: $7\n\nPodeu contactar l'usuari $1 o algun altre dels [[{{MediaWiki:Grouppage-sysop}}|administradors]] per a discutir el bloqueig.\n\nRecordeu que per a poder usar l'opció «Envia un missatge de correu electrònic a aquest usuari» haureu d'haver validat una adreça de correu electrònic a les vostres [[Special:Preferences|preferències]].\n\nEl número d'identificació de la vostra adreça IP és $3, i l'ID del bloqueig és #$5. Si us plau, incloeu aquestes dades en totes les consultes que feu.",
+       "systemblockedtext": "El vostre nom d'usuari o adreça IP ha estat bloquejada automàticament pel MediaWiki.\nEl motiu donat és:\n\n:<em>$2</em>\n\n* Inici del bloqueig: $8\n* Caducitat del bloqueig: $6\n* Destinatari del bloqueig: $7\n\nLa vostra adreça IP actual és $3.\nAfegiu les dades de més amunt en qualsevol consulta que feu al respecte.",
        "blockednoreason": "no s'ha donat cap motiu",
        "whitelistedittext": "Heu de $1 per modificar pàgines.",
        "confirmedittext": "Heu de confirmar la vostra adreça electrònica abans de poder modificar les pàgines. Definiu i valideu la vostra adreça electrònica a través de les vostres [[Special:Preferences|preferències d'usuari]].",
        "invalid-content-data": "Dades de contingut no vàlides",
        "content-not-allowed-here": "No és permès el contingut \"$1\" a la pàgina [[$2]]",
        "editwarning-warning": "Si sortiu d'aquesta pàgina, perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís en la secció «{{int:prefs-editing}}» de les vostres preferències.",
+       "editpage-invalidcontentmodel-title": "Model de contingut no permès",
+       "editpage-invalidcontentmodel-text": "El model de contingut «$1» no és permès.",
        "editpage-notsupportedcontentformat-title": "No s'admet el format del contingut",
        "editpage-notsupportedcontentformat-text": "No s'admet el format del contingut $1 pel model de contingut $2.",
        "content-model-wikitext": "wikitext",
        "content-json-empty-object": "Objecte buit",
        "content-json-empty-array": "Matriu buida",
        "deprecated-self-close-category": "Pàgines que usen etiquetes HTML autotancades no vàlides",
+       "deprecated-self-close-category-desc": "La pàgina conté etiquetes HTML auto-tancades no vàlides, com ara <code>&lt;b/></code> o <code>&lt;span/></code>.  El seu comportament canviarà aviat per ser consistents amb l'especificació HTML5, per tant el seu ús en text wiki és obsolet.",
        "duplicate-args-warning": "<strong>Avís:</strong> [[:$1]] crida [[:$2]] amb més d'un valor pel paràmetre «$3». Només s'utilitzarà el darrer valor proporcionat.",
        "duplicate-args-category": "Pàgines amb arguments duplicats en utilització de plantilles",
        "duplicate-args-category-desc": "La pàgina conté crides a plantilles que fan servir duplicats d'arguments, com ara <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "mergehistory-fail-bad-timestamp": "La marca horària no és vàlida.",
        "mergehistory-fail-invalid-source": "La pàgina font no és vàlida.",
        "mergehistory-fail-invalid-dest": "La pàgina de destinació no és vàlida.",
+       "mergehistory-fail-no-change": "La fusió d'historial no ha fusionat cap revisió. Comproveu de nou la pàgina i els paràmetres temporals.",
        "mergehistory-fail-permission": "No hi ha permisos suficients per fusionar l'historial.",
        "mergehistory-fail-self-merge": "Les pàgines d'origen i de destinació no poden ser la mateixa",
        "mergehistory-fail-toobig": "No s'ha pogut fer la fusió de l'historial perquè es mourien més del límit de $1 {{PLURAL:$1|revisió|revisions}}.",
        "search-interwiki-caption": "Projectes germans",
        "search-interwiki-default": "Resultats de $1:",
        "search-interwiki-more": "(més)",
+       "search-interwiki-more-results": "més resultats",
        "search-relatedarticle": "Relacionat",
        "searchrelated": "relacionat",
        "searchall": "tots",
        "search-external": "Cerca externa",
        "searchdisabled": "La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.",
        "search-error": "S'ha produït un error durant la recerca: $1",
+       "search-warning": "S'ha produït un avís en cercar: $1",
        "preferences": "Preferències",
        "mypreferences": "Preferències",
        "prefs-edits": "Nombre d'edicions:",
        "saveprefs": "Desa les preferències",
        "restoreprefs": "Restaura les preferències per defecte",
        "prefs-editing": "Caixa d'edició",
-       "rows": "Files",
-       "columns": "Columnes",
        "searchresultshead": "Preferències de la cerca",
        "stub-threshold": "Límit per a formatar com a enllaç a esborrany ($1):",
        "stub-threshold-sample-link": "mostra",
        "prefs-help-recentchangescount": "Inclou els canvis recents, els historials de pàgines i els registres.",
        "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\n[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].",
        "savedprefs": "S’han desat les vostres preferències.",
-       "savedrights": "S'han desat els permisos d'usuari de {{GENDER:$1|$1}}.",
+       "savedrights": "S'han desat els grups d'usuari de {{GENDER:$1|$1}}.",
        "timezonelegend": "Fus horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Utilitza l'hora per defecte del wiki ($1)",
        "username": "{{GENDER:$1|Nom d'usuari}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|del grup|dels grups}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (fins el $2)",
        "prefs-registration": "Hora de registre:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Nom real*:",
        "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-lookup-user": "Gestiona els grups d'usuari",
+       "userrights-lookup-user": "Seleccioneu un usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
-       "editusergroup": "Edita els grups d'{{GENDER:$1|usuari}}",
+       "editusergroup": "Carrega els grups d'usuari",
        "editinguser": "Modificació dels permisos de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong>$2",
-       "userrights-editusergroup": "Edita els grups d'usuaris",
+       "viewinguserrights": "Visualització del drets de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Edita els grups de l'{{GENDER:$1|usuari|usuària}}",
+       "userrights-viewusergroup": "Mostra els grups de l'{{GENDER:$1|usuari|usuària}}",
        "saveusergroups": "Desa els grups d'{{GENDER:$1|usuari}}",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre implícit de:",
        "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-nologin": "Heu [[Special:UserLogin|d'iniciar una sessió]] amb un compte d'administrador per a poder assignar permisos d'usuari.",
-       "userrights-notallowed": "No teniu autorització per concedir o retirar permisos d'usuari.",
        "userrights-changeable-col": "Grups que podeu canviar",
        "userrights-unchangeable-col": "Grups que no podeu canviar",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Venç el $1",
+       "userrights-expiry-none": "No venç",
+       "userrights-expiry": "Venciment:",
+       "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-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
-       "userrights-removed-self": "Heu suprimit els vostres propis permisos. Per tant, ja no podeu tornar a accedir a aquesta pàgina.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "group-autoconfirmed": "Usuaris autoconfirmats",
        "right-siteadmin": "Blocar i desblocar la base de dades",
        "right-override-export-depth": "Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5",
        "right-sendemail": "Enviar missatges de correu electrònic a altres usuaris",
-       "right-passwordreset": "Veure les sol·licituds de restabliment de contrasenya per correu electrònic",
        "right-managechangetags": "Crear, activar i desactivar [[Special:Tags|etiquetes]]",
        "right-applychangetags": "Aplica les [[Special:Tags|etiquetes]] juntament amb els canvis propis",
        "right-changetags": "Afegeix i suprimeix [[Special:Tags|etiquetes]] en revisions individuals i entrades de registre",
        "grant-basic": "Permisos bàsics",
        "grant-viewdeleted": "Mostra fitxers eliminats i pàgines",
        "grant-viewmywatchlist": "Modifica la llista de seguiment",
+       "grant-viewrestrictedlogs": "Visualització d'entrades de registre restringides",
        "newuserlogpage": "Registre de creació d'usuaris",
        "newuserlogpagetext": "Aquest és un registre de creació de nous usuaris.",
        "rightslog": "Registre dels permisos d'usuari",
        "action-upload_by_url": "carregar aquest fitxer des d'una adreça URL",
        "action-writeapi": "fer servir l'API d'escriptura",
        "action-delete": "esborrar aquesta pàgina",
-       "action-deleterevision": "esborrar aquesta revisió",
-       "action-deletedhistory": "visualitzar l'historial esborrat d'aquesta pàgina",
+       "action-deleterevision": "suprimeix les revisions",
+       "action-deletelogentry": "suprimeix les entrades de registre",
+       "action-deletedhistory": "mostra l'historial esborrat d'una pàgina",
+       "action-deletedtext": "mostra el text de la revisió eliminada",
        "action-browsearchive": "cercar pàgines esborrades",
-       "action-undelete": "recuperar aquesta pàgina",
-       "action-suppressrevision": "revisar i recuperar aquesta revisió oculta",
+       "action-undelete": "restaura les pàgines",
+       "action-suppressrevision": "revisa i restaura les revisions ocultes",
        "action-suppressionlog": "visualitzar aquest registre privat",
        "action-block": "blocar aquest usuari perquè no pugui editar",
        "action-protect": "canviar els nivells de protecció d'aquesta pàgina",
        "action-userrights-interwiki": "modificar permisos d'usuari en altres wikis",
        "action-siteadmin": "bloquejar o desbloquejar la base de dades",
        "action-sendemail": "enviar missatges de correu",
+       "action-editmyoptions": "modifiqueu les vostres preferències",
        "action-editmywatchlist": "edita la llista de seguiment",
        "action-viewmywatchlist": "mostra la llista de seguiment",
        "action-viewmyprivateinfo": "mostra la informació personal",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostra",
+       "rcfilters-activefilters": "Filtres actius",
+       "rcfilters-restore-default-filters": "Restaura els filtres per defecte",
+       "rcfilters-clear-all-filters": "Esborra tots els filtres",
+       "rcfilters-search-placeholder": "Canvis recents dels filtres (navegueu o comenceu a escriure)",
+       "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-noresults": "No s'ha trobat cap filtre",
+       "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-filter-editsbyself-label": "Les vostres modificacions",
+       "rcfilters-filter-editsbyself-description": "Modificacions vostres.",
+       "rcfilters-filter-editsbyother-label": "Modificacions d'altres",
+       "rcfilters-filter-editsbyother-description": "Modificacions creades per altres usuaris (no vostres).",
+       "rcfilters-filtergroup-userExpLevel": "Nivell d'experiència (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-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-significance": "Significació",
+       "rcfilters-filter-minor-label": "Modificacions menors",
+       "rcfilters-filter-minor-description": "Modificacions que l'autor va etiquetar com a menors.",
+       "rcfilters-filter-major-label": "Modificacions no menors",
+       "rcfilters-filter-major-description": "Modificacions no etiquetades com a menors.",
+       "rcfilters-filtergroup-changetype": "Tipus de canvi",
+       "rcfilters-filter-pageedits-label": "Modificacions de pàgina",
+       "rcfilters-filter-pageedits-description": "Modificacions al contingut del wiki, discussions, descripcions de categories...",
+       "rcfilters-filter-newpages-label": "Creacions de pàgines",
+       "rcfilters-filter-newpages-description": "Edicions que creen noves pàgines.",
+       "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",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
        "rclistfrom": "Mostra els canvis nous des de $3, $2",
        "rcshowhideminor": "$1 edicions menors",
        "fileexists-forbidden": "Ja hi existeix un fitxer amb aquest nom i no es pot sobreescriure.\nSi us plau, torneu enrere i carregueu aquest fitxer sota un altre nom. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ja hi ha un fitxer amb aquest nom en el fons comú de fitxers.\nSi encara voleu pujar el fitxer, torneu enrere i pugeu-ne una còpia amb un altre nom. [[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "La càrrega és un duplicat exacte de la versió actual de <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "La càrrega és un duplicat exacte {{PLURAL:$2|d'una versió antiga|de versions antigues}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Aquest fitxer és un duplicat {{PLURAL:$1|del fitxer |dels següents fitxers:}}",
        "file-deleted-duplicate": "S'ha suprimit anteriorment un fitxer idèntic a aquest ([[:$1]]). Hauríeu de comprovar el registre de supressions del fitxer abans de tornar-lo a carregar.",
        "file-deleted-duplicate-notitle": "Un fitxer idèntic a aquest fitxer havia estat suprimit abans, i també el títol. Hauríeu de demanar a algú que pugui veure les dades suprimides del fitxer que revisi la situació abans de procedir a tornar a carregar-lo.",
        "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’esdeveniments <code>$1=\"$2\"</code> en fitxers SVG.",
        "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb dades no segures: destinació URI <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
        "uploaded-animate-svg": "S'ha trobat l'etiqueta «animate» que pot estar canviant l'href mitjançant l'atribut <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
-       "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
+       "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"<nowiki>$1</nowiki>\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "uploadvirus": "El fitxer conté un virus! Detalls: $1",
        "uploadjava": "El fitxer és un arxiu ZIP que conté un fitxer .class de Java. No està permesa la càrrega de fitxers Java, perquè poden passar per alt les restriccions de seguretat.",
        "filerevert-submit": "Reverteix",
        "filerevert-success": "S'ha revertit '''[[Media:$1|$1]]''' a la [$4 versió de $3, $2].",
        "filerevert-badversion": "No hi ha cap versió local anterior d'aquest fitxer amb la marca horària que es proporciona.",
+       "filerevert-identical": "La versió actual del fitxer ja és idèntica a la seleccionada.",
        "filedelete": "Suprimeix $1",
        "filedelete-legend": "Suprimeix el fitxer",
        "filedelete-intro": "Esteu eliminant el fitxer '''[[Media:$1|$1]]''' juntament amb el seu historial.",
        "unusedtemplates": "Plantilles no utilitzades",
        "unusedtemplatestext": "Aquesta pàgina mostra les pàgines en l'espai de noms {{ns:template}}, que no estan incloses en cap altra pàgina. Recordeu de comprovar les pàgines que hi enllacen abans d'esborrar-les.",
        "unusedtemplateswlh": "altres enllaços",
-       "randompage": "Pàgina a l'atzar",
+       "randompage": "Pàgina a latzar",
        "randompage-nopages": "No hi ha cap pàgina en {{PLURAL:$2|l'espai de noms següent|els espais de noms següents}}: $1.",
        "randomincategory": "Pàgina aleatòria en una categoria",
        "randomincategory-invalidcategory": "«$1» no és un nom de categoria vàlid.",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Pàgina a l’atzar en la categoria",
        "randomincategory-submit": "Vés-hi",
-       "randomredirect": "Redirecció a l'atzar",
+       "randomredirect": "Redirecció a latzar",
        "randomredirect-nopages": "No hi ha cap redirecció a l'espai de noms «$1».",
        "statistics": "Estadístiques",
        "statistics-header-pages": "Estadístiques de pàgines",
        "uncategorizedcategories": "Categories sense categoria",
        "uncategorizedimages": "Fitxers sense categoria",
        "uncategorizedtemplates": "Plantilles sense categoria",
+       "uncategorized-categories-exceptionlist": " # Conté una llista de categories no no s'haurien de mencionar a Special:UncategorizedCategories. Una per línia, començant amb «*». Les línies que comencin amb un altre caràcter (incloent l'espai en blanc) són ignorades. Utilitzeu «#» per a comentaris.",
        "unusedcategories": "Categories sense cap ús",
        "unusedimages": "Fitxers no utilitzats",
        "wantedcategories": "Categories demanades",
        "apihelp": "Ajuda de l'API",
        "apihelp-no-such-module": "No s'ha trobat el mòdul \"$1\".",
        "apisandbox": "Pàgina de proves de l'API",
+       "apisandbox-jsonly": "Es necessita JavaScript per utilitzar l'espai de proves API.",
        "apisandbox-api-disabled": "L'API està desactivada en aquest lloc.",
-       "apisandbox-intro": "Utilitzeu aquesta pàgina per experimentar amb l'<nowiki />'''API de web service de MediaWiki'''.\nVisiteu [https://www.mediawiki.org/wiki/API:Main_page la documentació de l'API] per a més informació sobre l'ús de l'API. Exemple: [https://www.mediawiki.org/wiki/API#A_simple_example recuperar el contingut d'una Pàgina Principal]. Seleccioneu una acció per veure més exemples.\n\nTingueu en compte que, encara que això és una pàgina de proves, les accions que feu en aquesta pàgina poden modificar la wiki.",
+       "apisandbox-intro": "Utilitzeu aquesta pàgina per experimentar amb l'<strong>API de servei web de MediaWiki</strong>.\nVegeu la [[mw:API:Main page|documentació de l'API]] per a més informació sobre l'ús de l'API. Exemple: [https://www.mediawiki.org/wiki/API#A_simple_example recuperar el contingut d'una Pàgina Principal]. Seleccioneu una acció per veure més exemples.\n\nTingueu en compte que, encara que això és una pàgina de proves, les accions que feu en aquesta pàgina poden modificar la wiki.",
+       "apisandbox-fullscreen": "Expandeix el plafó",
+       "apisandbox-fullscreen-tooltip": "Expandeix el plafó de l'entorn de proves per tal que ocupi la finestra del navegador.",
        "apisandbox-unfullscreen": "Mostra la pàgina",
+       "apisandbox-unfullscreen-tooltip": "Redueix el plafó de l'entorn de proves per tal que els enllaços de navegació de MediaWiki siguin disponibles.",
        "apisandbox-submit": "Fes sol·licitud",
        "apisandbox-reset": "Neteja",
        "apisandbox-retry": "Torna a provar",
        "apisandbox-dynamic-error-exists": "Ja existeix un paràmetre anomenat \"$1\".",
        "apisandbox-deprecated-parameters": "Paràmetres obsolets",
        "apisandbox-submit-invalid-fields-title": "Alguns camps no són vàlids",
+       "apisandbox-submit-invalid-fields-message": "Corregiu els camps marcats i torneu-ho a provar.",
        "apisandbox-results": "Resultats",
        "apisandbox-sending-request": "S'està enviant una sol·licitud API...",
+       "apisandbox-loading-results": "S'estan reben els resultats de l'API...",
+       "apisandbox-results-error": "S'ha produït un error en carregar la resposta de la consulta de l'API: $1.",
        "apisandbox-request-url-label": "Sol·licita URL:",
+       "apisandbox-request-json-label": "JSON de sol·licitud:",
        "apisandbox-request-time": "Temps de sol·licitud: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Corregeix el testimoni i torna-ho a enviar",
+       "apisandbox-results-fixtoken-fail": "No s'ha pogut recuperar el testimoni «$1».",
+       "apisandbox-alert-page": "Els camps en aquesta pàgina no són vàlids.",
+       "apisandbox-alert-field": "El valor d'aquest camp no és vàlid.",
        "apisandbox-continue": "Continua",
        "apisandbox-continue-clear": "Neteja",
+       "apisandbox-multivalue-all-namespaces": "$1 (tots els espais de noms)",
+       "apisandbox-multivalue-all-values": "$1 (tots els valors)",
        "booksources": "Obres de referència",
        "booksources-search-legend": "Cerca fonts de llibres",
        "booksources-isbn": "ISBN:",
        "booksources-text": "A sota hi ha una llista d'enllaços d'altres llocs que venen llibres nous i de segona mà, i també podrien tenir més informació dels llibres que esteu cercant:",
        "booksources-invalid-isbn": "El codi ISBN donat no és vàlid. Comproveu si l'heu copiat correctament.",
        "magiclink-tracking-rfc": "Pàgines que usen enllaços màgics RFC",
+       "magiclink-tracking-rfc-desc": "Aquesta pàgina utilitza enllaços màgics RFC. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] per saber com canviar-los.",
        "magiclink-tracking-pmid": "Pàgines que usen enllaços màgics PMID",
+       "magiclink-tracking-pmid-desc": "Aquesta pàgina utilitza enllaços màgics PMID. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] per saber com canviar-los.",
        "magiclink-tracking-isbn": "Pàgines que usen enllaços màgics d'ISBN",
+       "magiclink-tracking-isbn-desc": "Aquesta pàgina utilitza enllaços màgics ISBN. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] per saber com canviar-los.",
        "specialloguserlabel": "Realitzador:",
        "speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
        "log": "Registres",
        "linksearch-error": "Els caràcters comodí només poden aparèixer a l'inici de l'url.",
        "listusersfrom": "Mostra usuaris començant per:",
        "listusers-submit": "Mostra",
-       "listusers-noresult": "No s'han trobat coincidències de noms d'usuaris. Si us plau, busqueu també amb variacions per majúscules i minúscules.",
+       "listusers-noresult": "No s’ha trobat cap usuari.",
        "listusers-blocked": "({{GENDER:$1|blocat|blocada}})",
        "activeusers": "Llista d'usuaris actius",
        "activeusers-intro": "Aquí hi ha una llista d'usuaris que han tingut algun tipus d'activitat en {{PLURAL:$1|el darrer dia|els darrers $1 dies}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acció|accions}} en {{PLURAL:$3|el darrer dia|els $3 darrers dies}}",
        "activeusers-from": "Mostra els usuaris començant per:",
+       "activeusers-groups": "Mostra els usuaris que pertanyen als grups:",
+       "activeusers-excludegroups": "Exclou els usuaris que pertanyen als grups:",
        "activeusers-noresult": "No s'han trobat usuaris.",
        "activeusers-submit": "Mostra els usuaris actius",
        "listgrouprights": "Drets dels grups d'usuaris",
        "trackingcategories-name": "Nom del missatge",
        "trackingcategories-desc": "Criteris d'inclusió de categoria",
        "restricted-displaytitle-ignored": "Pàgines amb títols a mostrar ignorats",
+       "restricted-displaytitle-ignored-desc": "La pàgina té un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> que ha estat ignorat perquè no és equivalent al títol actual de la pàgina.",
        "noindex-category-desc": "La pàgina conté una paraula màgica <code><nowiki>__NOINDEX__</nowiki></code> (i és en un espai de noms on està permesa) i per tant no està indexada per robots.",
        "index-category-desc": "La pàgina conté un <code><nowiki>__INDEX__</nowiki></code> (i és en un espai de noms on està permès) i per tant està indexat per robots quan normalment no ho seria.",
        "post-expand-template-inclusion-category-desc": "La mida de la pàgina és més gran que <code>$wgMaxArticleSize</code> un cop expandides totes les plantilles, per tant algunes plantilles no s'han expandit.",
        "emailccsubject": "Còpia del vostre missatge a $1: $2",
        "emailsent": "Correu electrònic enviat",
        "emailsenttext": "S'ha enviat el vostre correu electrònic.",
-       "emailuserfooter": "Aquest missatge de correu electrònic l'ha {{GENDER:$1|enviat}} $1 a {{GENDER:$2|$2}} amb la funció «{{int:emailuser}}» de {{SITENAME}}.",
+       "emailuserfooter": "Aquest correu electrònic l'ha {{GENDER:$1|enviat}} $1 a {{GENDER:$2|$2}} amb la funció «{{int:emailuser}}» de {{SITENAME}}. Si {{GENDER:$2|responeu}} a aquest correu electrònic, {{GENDER:$2|la vostra resposta}} serà enviada directament {{GENDER:$1|al remitent|a la remitent}} original revelant-li {{GENDER:$2|la vostra}} adreça de correu.",
        "usermessage-summary": "Deixant missatges de sistema.",
        "usermessage-editor": "Missatger del sistema",
        "watchlist": "Llista de seguiment",
        "watchnologin": "No heu iniciat la sessió",
        "addwatch": "Afegeix a llista de seguiment",
        "addedwatchtext": "S'ha afegit «[[:$1]]» i la seva pàgina de discussió a la vostra [[Special:Watchlist|llista de seguiment]].",
+       "addedwatchtext-talk": "«[[:$1]]» i la seva pàgina associada han estat afegides a la vostra [[Special:Watchlist|llista de seguiment]].",
        "addedwatchtext-short": "S’ha afegit la pàgina «$1» a la vostra llista de seguiment.",
        "removewatch": "Treu de la llista de seguiment",
        "removedwatchtext": "S'ha tret «[[:$1]]» i la seva pàgina de discussió de la vostra [[Special:Watchlist|llista de seguiment]].",
+       "removedwatchtext-talk": "S'ha tret «[[:$1]]» i la seva pàgina associada de la vostra [[Special:Watchlist|llista de seguiment]].",
        "removedwatchtext-short": "S’ha tret la pàgina «$1» de la vostra llista de seguiment.",
        "watch": "Vigila",
        "watchthispage": "Vigila aquesta pàgina",
        "rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}",
        "rollbacklinkcount-morethan": "reverteix més de $1 {{PLURAL:$1|edició|edicions}}",
        "rollbackfailed": "No s'ha pogut revocar",
+       "rollback-missingparam": "Paràmetres necessaris que falten en la sol·licitud.",
        "rollback-missingrevision": "No es poden carregar les dades de revisió.",
        "cantrollback": "No s'han pogut revertir les edicions; el darrer col·laborador és l'únic autor de la pàgina.",
        "alreadyrolled": "No es pot revertir la darrera modificació de [[:$1]]\nde l'usuari [[User:$2|$2]] ([[User talk:$2|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]). Algú altre ja ha modificat o revertit la pàgina.\n\nLa darrera modificació l'ha fet l'usuari [[User:$3|$3]] ([[User talk:$3|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "revertpage": "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
        "revertpage-nouser": "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
+       "rollback-success-notify": "Modificacions revertides per $1;\ns'ha revertit a la darrera versió de $2. [$3 Mostra els canvis]",
        "sessionfailure-title": "Error de sessió",
        "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
        "changecontentmodel": "Canvia el model de contingut d'una pàgina",
        "changecontentmodel-emptymodels-title": "No hi ha models de contingut",
        "changecontentmodel-emptymodels-text": "El contingut a [[:$1]] no pot convertir-se a cap tipus.",
        "log-name-contentmodel": "Registre de canvis del model de contingut",
-       "log-description-contentmodel": "Esdeveniments relacionats amb els models de contingut d'una pàgina",
+       "log-description-contentmodel": "Aquesta pàgina llista els canvis al model de contingut de les pàgines, i les pàgines que van ser creades amb un model de contingut diferent del que és per defecte.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|va crear}} la pàgina $3 utilitzant un model de contingut no per defecte («$5»)",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha canviat}} el model de contingut de la pàgina $3 de «$4» a «$5»",
        "logentry-contentmodel-change-revertlink": "reverteix",
        "logentry-contentmodel-change-revert": "reverteix",
        "modifiedarticleprotection": "ha canviat el nivell de protecció de «[[$1]]»",
        "unprotectedarticle": "ha desprotegit \"[[$1]]\"",
        "movedarticleprotection": "ha traslladat els ajustaments de protecció des de «[[$2]]» a «[[$1]]»",
+       "protectedarticle-comment": "{{GENDER:$2|Ha protegit}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Ha canviat el nivell de protecció}} de «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Ha suprimit la protecció}} de «[[$1]]»",
        "protect-title": "Canviant la protecció de «$1»",
        "protect-title-notallowed": "Mostra el nivell de protecció de \" $1 \"",
        "prot_1movedto2": "[[$1]] mogut a [[$2]]",
        "sp-contributions-newbies-sub": "Per a novells",
        "sp-contributions-newbies-title": "Contribucions dels comptes d'usuari més nous",
        "sp-contributions-blocklog": "Registre de bloquejos",
-       "sp-contributions-suppresslog": "contribucions suprimides de l'usuari",
-       "sp-contributions-deleted": "contribucions d'usuari esborrades",
+       "sp-contributions-suppresslog": "contribucions suprimides de {{GENDER:$1|l'usuari|la usuària}}",
+       "sp-contributions-deleted": "Contribucions de {{GENDER:$1|l’usuari|la usuària}} esborrades",
        "sp-contributions-uploads": "càrregues",
        "sp-contributions-logs": "registres",
        "sp-contributions-talk": "discussió",
        "move-page": "Reanomena $1",
        "move-page-legend": "Reanomena la pàgina",
        "movepagetext": "Amb el formulari següent reanomenareu una pàgina, movent tot el seu historial al nou nom.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol.\nPodeu actualitzar automàticament les redireccions que apuntin al títol original.\nSi no ho feu, assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nSerà de la vostra responsabilitat verificar que els enllaços segueixin apuntant cap a on se suposa que ho han de fer.\n\nTingueu en compte que la pàgina <strong>no</strong> serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció sense més historial.\nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n\n<strong>Nota:</strong>\nAçò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; \nassegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
-       "movepagetext-noredirectfixer": "Amb el formulari següent podeu reanomenar una pàgina movent tot el seu historial al nom nou.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol. \nAssegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nÉs responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. \n\nTingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. \nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n \n'''Atenció!''' \nAixò pot ser un canvi dràstic i inesperat per una pàgina popular; \nassegureu-vos que sabeu el que feu abans de continuar.",
-       "movepagetalktext": "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':\n* Ja existeixi una pàgina de discussió no buida amb el nou nom, o\n* Desactiveu l'opció de més avall.\n\nEn aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
+       "movepagetext-noredirectfixer": "Amb el formulari següent podeu reanomenar una pàgina movent tot el seu historial al nom nou.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol. \nAssegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nÉs responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. \n\nTingueu en compte que la pàgina <strong>no</strong> serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. \nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n \n<strong>Nota:</strong>\nAixò pot ser un canvi dràstic i inesperat per una pàgina popular; \nassegureu-vos que sabeu el que feu abans de continuar.",
+       "movepagetalktext": "Si marqueu aquesta casella, la pàgina de discussió associada també serà traslladada automàticament al nou títol, tret que ja existeixi allà una pàgina de discussió no buida.\n\nEn aquest cas, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
        "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es mourà aquesta pàgina, i que les pàgines dins la categoria antiga <em>no</em> es recategoritzaran automàticament en la nova.",
        "movenologintext": "Heu de ser un usuari registrat i estar [[Special:UserLogin|dintre d'una sessió]]\nper reanomenar una pàgina.",
        "cant-move-to-user-page": "No teniu permís per a moure una pàgina a una pàgina d'usuari (independentment de poder fer-ho cap a una subpàgina d'usuari).",
        "cant-move-category-page": "No teniu permisos per a moure pàgines de categoria.",
        "cant-move-to-category-page": "No teniu permisos per a moure una pàgina a una pàgina de categoria.",
+       "cant-move-subpages": "No teniu permís per a traslladar subpàgines.",
+       "namespace-nosubpages": "L'espai de noms «$1» no permet subpàgines.",
        "newtitle": "Títol nou:",
        "move-watch": "Vigila aquesta pàgina",
        "movepagebtn": "Reanomena la pàgina",
        "movelogpagetext": "Vegeu la llista de les darreres pàgines reanomenades.",
        "movesubpage": "{{PLURAL:$1|Subpàgina|Subpàgines}}",
        "movesubpagetext": "Aquesta pàgina té {{PLURAL:$1|una subpàgina|$1 subpàgines}} que es mostren a continuació.",
+       "movesubpagetalktext": "La pàgina de discussió corresponent té $1 {{PLURAL:$1|subpàgina mostrada|subpàgines mostrades}} a continuació.",
        "movenosubpage": "Aquesta pàgina no té subpàgines.",
        "movereason": "Motiu:",
        "revertmove": "reverteix",
-       "delete_and_move_text": "==Cal l'eliminació==\n\nLa pàgina de destinació, «[[:$1]]», ja existeix. Voleu eliminar-la per a fer lloc al trasllat?",
+       "delete_and_move_text": "La pàgina de destinació, «[[:$1]]», ja existeix.\nVoleu eliminar-la per a fer lloc al trasllat?",
        "delete_and_move_confirm": "Sí, esborra la pàgina",
        "delete_and_move_reason": "S'ha eliminat per a permetre el reanomenament de \" [[$1]] \"",
        "selfmove": "Els títols d'origen i de destinació coincideixen: no és possible de reanomenar una pàgina a si mateixa.",
        "move-leave-redirect": "Deixa enrere una redirecció",
        "protectedpagemovewarning": "'''AVÍS: Aquesta pàgina està bloquejada i només els usuaris que tenen drets d'administrador la poden reanomenar.\nA continuació es mostra la darrera entrada del registre com a referència:",
        "semiprotectedpagemovewarning": "'''Nota:''' Aquesta pàgina està bloquejada i només els usuaris registrats la poden moure.\nA continuació es mostra la darrera entrada del registre com a referència:",
-       "move-over-sharedrepo": "== El fitxer ja existeix ==\n[[:$1]] ja existeix al dipòsit compartit. Moure un fitxer a aquest títol impedirà d'ús del fitxer compartit.",
+       "move-over-sharedrepo": "[[:$1]] ja existeix al repositori compartit. Traslladant un fitxer a aquest títol se substituirà el fitxer compartit.",
        "file-exists-sharedrepo": "El nom de fitxer escollit ja s'utilitza al dipòsit compartit. Escolliu un altre nom.",
        "export": "Exportació de pàgines",
        "exporttext": "Podeu exportar a XML el text i l'historial d'una pàgina en concret o d'un conjunt de pàgines; aleshores el resultat pot importar-se en un altre lloc web basat en wiki amb programari de MediaWiki mitjançant la [[Special:Import|pàgina d'importació]].\n\nPer a exportar pàgines, escriviu els títols que desitgeu al quadre de text de sota, un títol per línia, i seleccioneu si desitgeu o no la versió actual juntament amb totes les versions antigues, amb la pàgina d'historial, o només la pàgina actual amb la informació de la darrera modificació.\n\nEn el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per a la pàgina «[[{{MediaWiki:Mainpage}}]]».",
        "import-nonewrevisions": "No s'ha importat cap revisió (ja hi eren abans o s'han omès a causa d'errors).",
        "xml-error-string": "$1 a la línia $2, columna $3 (byte $4): $5",
        "import-upload": "Carrega dades XML",
-       "import-token-mismatch": "Pèrdua de dades de sessió. Torneu-ho a intentar.",
+       "import-token-mismatch": "Pèrdua de dades de sessió.\n\nPotser heu finalitzat la sessió. <strong>Comproveu si encara teniu la sessió iniciada i torneu-ho a intentar</strong>.\nSi encara no funciona, proveu de [[Special:UserLogout|finalitzar la sessió]] i inicieu-la de nou, comprovant que el vostre navegador permeti les galetes per a aquest lloc.",
        "import-invalid-interwiki": "No es pot importar des del wiki especificat.",
        "import-error-edit": "La pàgina «$1» no s'ha importat perquè no teniu permís per modificar-la.",
        "import-error-create": "La pàgina «$1» no s'ha importat perquè no teniu permís per crear-la.",
        "tooltip-n-portal": "Sobre el projecte, què podeu fer, on podeu trobar coses",
        "tooltip-n-currentevents": "Per trobar informació general sobre l'actualitat",
        "tooltip-n-recentchanges": "Llista de canvis recents al wiki",
-       "tooltip-n-randompage": "Pàgina a l'atzar",
+       "tooltip-n-randompage": "Carrega una pàgina a l’atzar",
        "tooltip-n-help": "El lloc per saber més coses",
        "tooltip-t-whatlinkshere": "Llista de totes les pàgines wiki que enllacen aquí",
        "tooltip-t-recentchangeslinked": "Canvis recents a pàgines enllaçades des d'aquesta pàgina",
        "tooltip-minoredit": "Marca-ho com una modificació menor",
        "tooltip-save": "Deseu els canvis",
        "tooltip-publish": "Publica els canvis",
-       "tooltip-preview": "Reviseu els vostres canvis, feu-ho abans de desar res!",
+       "tooltip-preview": "Previsualitzeu els vostres canvis. Feu-ho abans de desar res.",
        "tooltip-diff": "Mostra quins canvis heu fet al text",
        "tooltip-compareselectedversions": "Vegeu les diferències entre les dues versions seleccionades d'aquesta pàgina.",
        "tooltip-watch": "Afegiu aquesta pàgina a la vostra llista de seguiment",
        "pageinfo-length": "Mida de la pàgina (en bytes)",
        "pageinfo-article-id": "ID de la pàgina",
        "pageinfo-language": "Llengua del contingut de la pàgina",
+       "pageinfo-language-change": "canvia",
        "pageinfo-content-model": "Plantilla de contingut de pàgina",
        "pageinfo-content-model-change": "canvia",
        "pageinfo-robot-policy": "Indexació per robots",
        "patrol-log-header": "Això és un registre de les revisions patrullades.",
        "log-show-hide-patrol": "$1 el registre de patrulla",
        "log-show-hide-tag": "$1 el registre d’etiquetes",
+       "confirm-markpatrolled-button": "D'acord",
+       "confirm-markpatrolled-top": "Voleu marcar la revisió $3 de $2 com a patrullada?",
        "deletedrevision": "S'ha eliminat la revisió antiga $1.",
        "filedeleteerror-short": "Error en suprimir el fitxer: $1",
        "filedeleteerror-long": "S'han produït errors en suprimir el fitxer:\n\n$1",
        "tags-actions-header": "Accions",
        "tags-active-yes": "Sí",
        "tags-active-no": "No",
-       "tags-source-extension": "Definit per una extensió",
+       "tags-source-extension": "Definit pel programari",
        "tags-source-manual": "Aplicat manualment per usuaris i bots",
        "tags-source-none": "Ja no està en ús",
        "tags-edit": "modifica",
        "tags-deactivate": "desactiva",
        "tags-hitcount": "$1 {{PLURAL:$1|canvi|canvis}}",
        "tags-manage-no-permission": "No teniu permisos per administrar etiquetes de canvi",
+       "tags-manage-blocked": "No podeu canviar etiquetes mentre esteu {{GENDER:$1|blocat|blocada}}.",
        "tags-create-heading": "Crea una nova etiqueta",
        "tags-create-explanation": "Per defecte, les etiquetes acabades de crear estaran disponibles per usuaris i bots",
        "tags-create-tag-name": "Nom de l'etiqueta:",
        "htmlform-cloner-create": "Afegeix més",
        "htmlform-cloner-delete": "Suprimeix",
        "htmlform-cloner-required": "Cal com a mínim un valor.",
+       "htmlform-date-placeholder": "AAAA-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "El valor que heu especificat no és una data reconeguda. Proveu d'utilitzar el format AAAA-MM-DD.",
+       "htmlform-time-invalid": "El valor que heu especificat no és una hora reconeguda. Proveu d'utilitzar el format HH:MM:SS.",
+       "htmlform-datetime-invalid": "El valor que heu especificat no és una data i hora reconeguda. Proveu d'utilitzar el format AAAA-MM-DD HH:MM:SS.",
        "htmlform-title-badnamespace": "[[:$1]] no es troba en l'espai de noms \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" és un títol de pàgina no editable",
        "htmlform-title-not-exists": "$1 no existeix.",
        "htmlform-user-not-exists": "<strong>$1</strong> no existeix.",
        "htmlform-user-not-valid": "<strong>$1</strong> no és nom d'usuari vàlid.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha esborrat}} la pàgina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|ha esborrat}} la redirecció $3 sobreescrivint-la",
        "logentry-delete-restore": "$1 ha restaurat $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
        "logentry-newusers-create2": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1",
        "logentry-newusers-byemail": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1 i la contrasenya ha estat enviada per correu electrònic",
        "logentry-newusers-autocreate": "El compte d'usuari $1 {{GENDER:$2|ha estat creat}} automàticament",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|ha traslladat}} els valors de protecció de $4 a $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|ha protegit}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protegit}} $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4",
        "feedback-useragent": "Agent d'usuari:",
        "searchsuggest-search": "Cerca a {{SITENAME}}",
        "searchsuggest-containing": "que conté ...",
-       "api-error-autoblocked": "S'ha blocat la vostra IP automàticament perquè la va utilitzar un usuari blocat.",
-       "api-error-badaccess-groups": "No teniu permís per a carregar fitxers en aquest wiki.",
        "api-error-badtoken": "Error intern: argument incorrecte.",
-       "api-error-copyuploaddisabled": "Les càrregues via URL estan desactivades en aquest servidor.",
-       "api-error-duplicate": "Ja hi ha {{PLURAL:$1|un altre fitxer|altres fitxers}} en aquest lloc web amb el mateix contingut.",
-       "api-error-duplicate-archive": "Aquí ja hi ha hagut {{PLURAL:$1|un altre fitxer|altres fitxers}} amb el mateix contingut, i {{PLURAL:$1|va ser esborrat|varen ser esborrats}}.",
-       "api-error-empty-file": "El fitxer que heu tramès està buit.",
        "api-error-emptypage": "No es permet la creació de pàgines noves en blanc.",
-       "api-error-fetchfileerror": "Error intern: quelcom no ha funcionat en accedir al fitxer.",
-       "api-error-fileexists-forbidden": "Ja existeix un fitxer amb el nom «$1» i no pot sobreescriure's.",
-       "api-error-fileexists-shared-forbidden": "Ja existeix un fitxer amb el nom «$1» al repositori de fitxers compartits i no pot sobreescriure's.",
-       "api-error-file-too-large": "El fitxer que heu tramès és massa gran.",
-       "api-error-filename-tooshort": "El nom del fitxer és massa curt.",
-       "api-error-filetype-banned": "Aquest tipus de fitxer està prohibit.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|no és un tipus de fitxer permès|no són tipus de fitxer permesos}}. {{PLURAL:$3|El tipus de fitxer permès és|Els tipus de fitxer permesos són}} $2.",
-       "api-error-filetype-missing": "El nom de fitxer no té extensió.",
-       "api-error-hookaborted": "Un mòdul d'extensió ha cancel·lat la modificació que heu intentat fer.",
-       "api-error-http": "Error intern: no es pot connectar al servidor.",
-       "api-error-illegal-filename": "El nom del fitxer no està permès.",
-       "api-error-internal-error": "Error intern: el procés de càrrega en el wiki no ha funcionat.",
-       "api-error-invalid-file-key": "Error intern: no s'ha trobat el fitxer al dipòsit temporal.",
-       "api-error-missingparam": "Error intern: falten paràmetres a la petició.",
-       "api-error-missingresult": "Error intern: no s'ha pogut determinar si la còpia ha reeixit.",
-       "api-error-mustbeloggedin": "Cal que estigueu autenticats en un compte d'usuari per a poder carregar fitxers.",
-       "api-error-mustbeposted": "Error intern: la sol·licitud necessita HTTP POST.",
-       "api-error-noimageinfo": "La pujada s'ha realitzat amb èxit, però el servidor no ha proporcionat cap informació del fitxer.",
-       "api-error-nomodule": "Error intern: no està definit el mòdul de càrregues.",
-       "api-error-ok-but-empty": "Error intern: no hi ha resposta del servidor.",
-       "api-error-overwrite": "No està permès sobreescriure un fitxer existent.",
-       "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
-       "api-error-stasherror": "S'ha produït un error en carregar el fitxer al dipòsit.",
-       "api-error-stashedfilenotfound": "No s'ha trobat el fitxer de l'espai temporal quan es provava de carregar-lo d'allà.",
-       "api-error-stashpathinvalid": "El camí on s'havia de trobar el fitxer de l'espai temporal no és vàlid.",
-       "api-error-stashfilestorage": "S'ha produït un error en emmagatzemar el fitxer en l'espai temporal.",
-       "api-error-stashzerolength": "El servidor no ha pogut desar el fitxer a l'espai temporal perquè tenia longitud zero.",
-       "api-error-stashnotloggedin": "Cal haver iniciat una sessió per desar fitxers en l'espai temporal de càrrega.",
-       "api-error-stashwrongowner": "El fitxer que provàveu d'accedir en l'espai temporal no us pertany.",
-       "api-error-stashnosuchfilekey": "La clau de fitxer que provàveu d'accedir en l'espai temporal no existeix.",
-       "api-error-timeout": "El servidor no ha respost en el temps esperat.",
-       "api-error-unclassified": "S'ha produït un error desconegut",
-       "api-error-unknown-code": "Error desconegut: «$1»",
-       "api-error-unknown-error": "Error intern: quelcom no ha funcionat en intentar carregar el fitxer.",
+       "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
        "api-error-unknown-warning": "Avís desconegut: $1",
        "api-error-unknownerror": "Error desconegut: «$1».",
-       "api-error-uploaddisabled": "Estan desactivades les càrregues en aquest wiki",
-       "api-error-verification-error": "Aquest fitxer pot estar danyat, o tenir una extensió incorrecta.",
        "duration-seconds": "$1 {{PLURAL:$1|segon|segons}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuts}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|hores}}",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Utilitza l'idioma per defecte",
        "pagelang-select-lang": "Selecciona un idioma",
+       "pagelang-reason": "Motiu",
        "pagelang-submit": "Envia",
+       "pagelang-nonexistent-page": "La pàgina $1 no existeix.",
+       "pagelang-unchanged-language": "La pàgina $1 ja està configurada en la llengua: $2.",
+       "pagelang-unchanged-language-default": "La pàgina $1 ja està configurada en la llengua de contingut per defecte del wiki.",
+       "pagelang-db-failed": "La base de dades no ha pogut canviar la llengua de la pàgina.",
        "right-pagelang": "Canvia l'idioma de la pàgina",
        "action-pagelang": "canvia l'idioma de la pàgina",
        "log-name-pagelang": "Registre de canvi de llengua",
        "mw-widgets-dateinput-no-date": "No s'ha seleccionat cap data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Cerca de fitxers multimèdia",
+       "mw-widgets-mediasearch-noresults": "No s'han trobat resultats.",
        "mw-widgets-titleinput-description-new-page": "la pàgina no existeix encara",
        "mw-widgets-titleinput-description-redirect": "redirigeix a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Afegeix una categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Afegeix-ne més...",
        "sessionmanager-tie": "No es poden combinar diferents tipus de sol·licituds d'autenticació: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basades en galetes",
        "sessionprovider-nocookies": "Pot ser que les galetes estiguin inhabilitades. Assegureu-vos que teniu les galetes habilitades i inicieu de nou.",
        "randomrootpage": "Pàgina arrel aleatòria",
        "log-action-filter-block": "Tipus de blocatge:",
+       "log-action-filter-contentmodel": "Tipus de modificació del model de contingut:",
        "log-action-filter-delete": "Tipus de supressió:",
        "log-action-filter-import": "Tipus d'importació:",
        "log-action-filter-managetags": "Tipus d'acció de gestió d'etiquetes:",
        "log-action-filter-block-block": "Bloca",
        "log-action-filter-block-reblock": "Bloca la modificació",
        "log-action-filter-block-unblock": "Desbloca",
+       "log-action-filter-contentmodel-change": "Canvi del model de contingut",
        "log-action-filter-delete-delete": "Supressió de pàgines",
+       "log-action-filter-delete-delete_redir": "Sobreescriptura de la redirecció",
        "log-action-filter-delete-restore": "Restauració de pàgines",
        "log-action-filter-delete-event": "Registre de supressió",
        "log-action-filter-delete-revision": "Supressió de revisions",
+       "log-action-filter-import-upload": "Importació mitjançant càrrega d'XML",
        "log-action-filter-managetags-create": "Creació de l'etiqueta",
        "log-action-filter-managetags-delete": "Supressió de l'etiqueta",
        "log-action-filter-managetags-activate": "Activació de l'etiqueta",
+       "log-action-filter-managetags-deactivate": "Desactivació d'etiquetes",
+       "log-action-filter-newusers-create2": "Creació per usuari registrat",
        "log-action-filter-newusers-autocreate": "Creació automàtica",
        "log-action-filter-patrol-patrol": "Patrullatge manual",
        "log-action-filter-patrol-autopatrol": "Patrullatge automàtic",
        "log-action-filter-protect-protect": "Protecció",
        "log-action-filter-protect-modify": "Modificació de la protecció",
        "log-action-filter-protect-unprotect": "Desprotecció",
+       "log-action-filter-protect-move_prot": "Protecció de reanomenaments",
        "log-action-filter-rights-rights": "Canvi manual",
        "log-action-filter-rights-autopromote": "Canvi automàtic",
        "log-action-filter-suppress-event": "Supressió de registres",
        "authmanager-authn-no-primary": "Les dades credencials no s'han pogut autenticar.",
        "authmanager-authn-autocreate-failed": "Ha fallat la creació automàtica d'un compte local: $1",
        "authmanager-create-disabled": "S'ha inhabilitat la creació de comptes.",
-       "authmanager-create-from-login": "Per crear un compte, ompliu els camps de sota.",
+       "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-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
+       "authmanager-username-help": "Nom d'usuari per a l'autenticació.",
+       "authmanager-password-help": "Contrasenya per a l'autenticació.",
+       "authmanager-domain-help": "Domini per a l'autenticació externa.",
        "authmanager-retype-help": "Contrasenya de nou per confirmar",
        "authmanager-email-label": "Correu electrònic",
        "authmanager-email-help": "Adreça electrònica",
        "authmanager-provider-password": "Autenticació basada en contrasenya",
        "authmanager-provider-password-domain": "Autenticació basada en contrasenya i en domini",
        "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-resetpass-skip-label": "Omet",
+       "authprovider-resetpass-skip-help": "Omet el restabliment de contrasenya.",
        "specialpage-securitylevel-not-allowed-title": "No permès",
        "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.",
        "cannotauth-not-allowed": "No teniu permisos per utilitzar la pàgina",
        "changecredentials": "Canvi de dades credencials",
        "changecredentials-submit": "Canvia les dades credencials",
+       "changecredentials-success": "Les vostres credencials han estat canviades.",
+       "removecredentials": "Suprimeix les credencials",
+       "removecredentials-submit": "Suprimeix les credencials",
+       "removecredentials-invalidsubpage": "$1 no és un tipus de credencial vàlid.",
+       "removecredentials-success": "S'ha suprimit les vostres credencials.",
        "credentialsform-provider": "Tipus de dades credencials:",
        "credentialsform-account": "Nom del compte:",
        "cannotlink-no-provider-title": "No hi ha cap compte enllaçable",
        "unlinkaccounts": "Desenllaça els comptes",
        "unlinkaccounts-success": "El compte s'ha desenllaçat.",
        "authenticationdatachange-ignored": "No s'ha gestionat el canvi de dades d'autenticació. Potser no s'ha configurat cap proveïdor?",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errors:\n\n$1"
+       "userjsispublic": "Tingueu en compte que les subpàgines de JavaScript no haurien de contenir dades confidencials perquè poden ser visibles per altres usuaris.",
+       "restrictionsfield-badip": "Adreça o interval d'IP no vàlid: $1",
+       "restrictionsfield-label": "Intervals d'IP permesos:",
+       "revid": "revisió $1",
+       "pageid": "ID de pàgina $1"
 }
index c5df957..1533127 100644 (file)
@@ -18,7 +18,7 @@
        "tog-hideminor": "Къайладаха жима нисдарш керла могӀам юкъара",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
        "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
-       "tog-hidecategorization": "Ð\9aÑ\8aайлаÑ\8fÑ\85а Ð°Ð³Ó\80онийн ÐºÐ°Ñ\82егоÑ\80еÑ\88",
+       "tog-hidecategorization": "Ð\90гÓ\80онаÑ\88на Ñ\82Ó\80е ÐºÐ°Ñ\82егоÑ\80еÑ\88 Ñ\82оÑ\85аÑ\80 ÐºÑ\8aайладаккÑ\85а",
        "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а, хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
@@ -29,6 +29,7 @@
        "tog-watchdefault": "ТӀетоха ас нисйина агӀонаш тергаме могӀам чу",
        "tog-watchmoves": "ТӀетоха ас цӀерш хийцина агӀонаш тергаме могӀам чу",
        "tog-watchdeletion": "ТӀетоха ас дӀаяьхна агӀонаш тергаме могӀанан чу",
+       "tog-watchuploads": "Аса чуяьхна файлаш тергаме могӀам юкъатоха",
        "tog-watchrollback": "Аса нисдар юхудаькхина агӀо сан тергаме могӀанан тӀетуху",
        "tog-minordefault": "Къастам бе нисйиначарн хlумцадеш кегийра долушсанна",
        "tog-previewontop": "Чуяккха хьалххьажар тадаран кора хьалха",
        "tog-watchlisthidebots": "Къайладаха тергаме могӀам чура ботан нисдинарш",
        "tog-watchlisthideminor": "Къайладаха кегийра нисдарш тергаме могӀам чура",
        "tog-watchlisthideliu": "Къайладаха бовзийтина болу декъашхойн нисдарш тергаме могӀам чура",
+       "tog-watchlistreloadautomatically": "Литтарна хийцам хилча авто-карлабаккха тергаме могӀам (оьшу JavaScript)",
        "tog-watchlisthideanons": "Къайладаха къайлаха болу декъашхойн нисдарш тергаме могӀам чура",
        "tog-watchlisthidepatrolled": "Къайладаха хьаьжина долу нисдарш тергаме могӀам чура",
+       "tog-watchlisthidecategorization": "АгӀонашна тӀе категореш тохар къайладаккха",
        "tog-ccmeonemails": "Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.",
        "tog-diffonly": "Ма гайта агlон чулацам шина башхонца цхьатерра йолуш",
        "tog-showhiddencats": "Гайта къайлаха йолу категореш",
        "listingcontinuesabbrev": "(кхин дlа)",
        "index-category": "Меттигтерахьйо агӀонаш",
        "noindex-category": "ДӀахьушйоцу агӀонаш",
-       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх цабеш файлийн хьажоргаш йолу агӀонаш}}",
+       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх ца бен файлийн хьажоргаш йолу агӀонаш}}",
        "about": "Цуьнах лаьцна",
        "article": "Яззам",
        "newwindow": "(керлачу корехь)",
        "views": "Хьажарш",
        "toolbox": "ГӀирсаш",
        "tool-link-userrights": "{{GENDER:$1|Декъашхочун}} бакъо хийцар",
+       "tool-link-userrights-readonly": "Хьажа {{GENDER:$1|декъашхочун}} тобанаш",
        "tool-link-emailuser": "Язде {{GENDER:$1|декъашхочунга}} кехат",
        "userpage": "Хьажа декъашхочуьна агӀоне",
        "projectpage": "Хьажа кхолламан агӀоне",
        "createacct-yourpasswordagain-ph": "Кхин цкъа язъе пароль",
        "userlogin-remembermypassword": "Системин чохь Ӏойла",
        "userlogin-signwithsecure": "Ларийна цхьаьнакхетар",
+       "cannotlogin-title": "Чудаха таро яц",
+       "cannotlogin-text": "Чудаха таро яц",
        "cannotloginnow-title": "ХӀинца чудаха таро яц",
+       "cannotloginnow-text": "$1 лелочу хенахь чудаха таро яц.",
+       "cannotcreateaccount-title": "Декъашхочун дӀаяздар кхолла йиш яц",
        "yourdomainname": "Хьан машан меттиг:",
        "password-change-forbidden": "Хьан йиш яц хӀокху вики чохь пароль хийца.",
        "externaldberror": "Арахьара хаамийн базан гӀоьнца аутентификаци ечу хенахь гӀалат даьлла я хьа дӀаяздаран хийцам бан бакъонаш яц.",
        "passwordreset-emaildisabled": "Электронан поштан функцеш хӀокху вики чохь дӀаяйина ю.",
        "passwordreset-username": "Декъашхочун цӀе:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Хьажа беанчу хааме?",
-       "passwordreset-capture-help": "Ахьа хӀара билгало хӀотта яхь хьона гур бу декъашхочо баийта чохь хана пароль йолу хаам.",
        "passwordreset-email": "Электронан поштан адрес:",
        "passwordreset-emailtitle": "{{SITENAME}}: декъашхочун дӀаяздарх лаьцна хаам",
        "passwordreset-emailtext-ip": "{{SITENAME}} ($4) проектехь цхьам я ахьа хӀокху IP-адрес $1 тӀера хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
        "savearticle": "АгӀо дӀаязъян",
        "savechanges": "Ӏалашбе хийцамаш",
        "publishpage": "АгӀо кхолла",
+       "publishchanges": "АгӀо дӀаязъян",
        "preview": "Хьалххе хьажар",
        "showpreview": "Хьалха хьажар",
        "showdiff": "Бина болу хийцамашка хьажар",
        "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.",
        "anonpreviewwarning": "''Системин чу цагӀахь хьан IP-адрес агӀона истори чу дӀаяз лур ду.''",
        "missingsummary": "'''Дагадаийтар.''' Ахьа хийцамаш лаьцна доца яздина дац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
+       "selfredirect": "<strong>Тергам бе:</strong> Ахьа кхуллуш ю из-за цӀе йолу агӀонан тӀе дӀасхьажорг.\nХийла мега, ДӀасхьажорг кхолла я таян ахьа хаьржина нийса йоцу агӀо.\nАхьа «{{int:savearticle}}» кнопка юха а тӀетаӀа яхь агӀо кхуллура ю.",
        "missingcommenttext": "Дехар до дӀаязбе хайн хаам лахахь.",
        "missingcommentheader": "'''Дагадаийтар.''' Ахьа хӀокху къамелан дӀахьедар/корта билгал бина бац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
        "summary-preview": "Цуьнах лаьцна хирду:",
        "content-model-text": "цхьалхе йоза",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Еса объект",
+       "content-json-empty-array": "Еса меттиг",
        "duplicate-args-warning": "Тидам: [[:$1]] кхойкху [[:$2]] «дегӀан_хатӀ» «$3» параметран цхьаннал сов маьӀна долу карточка.\nТӀаьххьара къастийна долу маьӀна бен лелор дац.",
        "duplicate-args-category": "Кепийн кхайкхамашкахь аргументаш юх-юха лелош йолу агӀонаш",
        "expensive-parserfunction-warning": "'''Тидам бе!''' Ресурсийн функцийн дехарш сов даьлла агӀонаш .\n\nДукху хилла ца деза {{PLURAL:$2|$2 дехар|$2 дехарш|1=цхьана дехар}}, хӀинца $1 {{PLURAL:$1|дехар}} ду.",
        "prefs-personal": "Долахь болу хаамаш",
        "prefs-rc": "Керла нисдарш",
        "prefs-watchlist": "Тергаме могӀам",
+       "prefs-editwatchlist": "Тергаме могӀаман хийцам",
+       "prefs-editwatchlist-label": "Сан тергаме могӀаман чура дӀаяздаршна хийцам:",
+       "prefs-editwatchlist-edit": "Сан тергаме могӀамам чура цӀерш дӀаяхар а, хьажар а",
+       "prefs-editwatchlist-raw": "Тергаме могӀам йоза санна нисбан",
+       "prefs-editwatchlist-clear": "Тергаме могӀам цӀанбан",
        "prefs-watchlist-days": "Денойн дукхалла:",
        "prefs-watchlist-days-max": "Къезиг $1 {{PLURAL:$1|дена}}",
        "prefs-watchlist-edits": "Тергаме могӀам чохь гойтучу нисдарийн максимум дукхалла:",
        "saveprefs": "Ӏалашдан",
        "restoreprefs": "МеттахӀоттабе гӀирс Iад битарца",
        "prefs-editing": "Тадар",
-       "rows": "МогӀанаш:",
-       "columns": "БӀогӀамаш:",
        "searchresultshead": "Лахар",
-       "stub-threshold": "Кеч яран доза <a href=\"#\" class=\"stub\">коьртамогӀамна хьажоргаш</a> (байташках):",
+       "stub-threshold": "Кеч яран доза коьртан хьажоргашна ($1):",
        "stub-threshold-sample-link": "масала",
        "stub-threshold-disabled": "ДӀадайина",
        "recentchangesdays": "Керла нисдар гайта динахь:",
        "userrights-groups-help": "Хьоьга хийцалун хӀокху декъашхочун бакъонаш.\n* Бакъона цӀера юххехь билгало елахь, цуна и бакъо йолуш ю.\n* Билгало яцахь — декъашхочун и бакъо яц.\n* Хьаьрко * билгала до ахьа бакъо еллачул тӀаьхьа хьуна и дӀаяккха цалуш хилар.",
        "userrights-reason": "Бахьана:",
        "userrights-no-interwiki": "Хьан бакъо яц декъашхой бакъо хийца кхечу википеди чохь.",
-       "userrights-nologin": "Куьйгалхочунна бакъо йолу [[Special:UserLogin|дӀаяздарца]] ло декъашхочун бакъо.",
-       "userrights-notallowed": "Хьан дӀаяздарца магийна дац декъашхошна бакъо яла а дӀаяккха а.",
        "userrights-changeable-col": "Хьоьга хийцалун бакъонаш",
        "userrights-unchangeable-col": "Хьоьга хийцалун бакъонаш",
        "group": "Тоба:",
        "right-siteadmin": "хаамийн гуламан блоктохар а, блокдӀаяккхар а",
        "right-override-export-depth": "агӀонаш экспорт ян, 5 кхаччалц къорга агӀонаш цхьан",
        "right-sendemail": "кхечу декъашхошка электронан хаамаш кхехьийта",
-       "right-passwordreset": "пароль хийцарца электроннан хаамашка хьажар",
        "right-managechangetags": "Хаамийн базан чохь [[Special:Tags|билгалонаш]] кхолла а, дӀаяха а",
        "grant-generic": "Бакъонийн гулам «$1»",
        "grant-group-page-interaction": "АгӀонашца зӀе",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "recentchanges-submit": "Гайта",
+       "rcfilters-filterlist-title": "Литтарш",
+       "rcfilters-filterlist-noresults": "Литтарш цакарий",
+       "rcfilters-filtergroup-authorship": "Нисде авторалла",
+       "rcfilters-filter-editsbyself-label": "Хьан дисдарш",
+       "rcfilters-filter-editsbyself-description": "Хьан нисдарш.",
+       "rcfilters-filter-editsbyother-label": "Кхечу декъашхойн нисдарш",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Керланиш",
+       "rcfilters-filter-userExpLevel-learner-label": "Доьшуш берш",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "rclistfrom": "Гайта хийцам {{CURRENTYEAR}} шеран {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTTIME}} бина болу",
        "rcshowhideminor": "$1 кегийра нисдарш",
        "uploaddisabled": "Чуяккхар магийна дац",
        "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.",
        "uploaddisabledtext": "Файлаш чуяхар дӀадайина ду.",
-       "uploadscriptednamespace": "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '$1'",
+       "uploadscriptednamespace": "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '<nowiki>$1</nowiki>'",
        "upload-source": "ДIайолалун файл",
        "sourcefilename": "ДIайолалун файл:",
        "sourceurl": "Хьостан URL-адрес:",
        "uploadstash-nofiles": "Хьан къайла файлаш яц.",
        "uploadstash-errclear": "Файлаш дӀацӀанъян цаелира.",
        "uploadstash-refresh": "Карлабаккха файлийн могӀам",
+       "uploadstash-thumbnail": "гайта миниатюра",
        "img-auth-accessdenied": "ТӀекхача магийна дац",
        "img-auth-streaming": "Тоба дӀаелар «$1».",
        "http-invalid-url": "ГӀалате URL: $1",
        "undelete-show-file-submit": "ХӀаъ",
        "namespace": "ЦӀерийн меттигаш:",
        "invert": "Хаьржинарг къайлаяккха",
-       "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн анан агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)",
+       "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн меттигийн агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)",
+       "tooltip-whatlinkshere-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн меттигийн агӀонийн хьажоргаш къайлаяха.",
        "namespace_association": "Йихкина меттиг",
        "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн меттиг юкъахь хилийта",
        "blanknamespace": "(Коьрта)",
        "revertmove": "юхаяккха",
        "delete_and_move_text": "== ДӀаяккха хьокъ ю ==\nИ цӀе йолу аг1о «[[:$1]]» йолуш ю. \nЛаьий хьуна и дӀаяккха, цӀе хийца таро хилийта?",
        "delete_and_move_confirm": "ХӀаъ, дӀаяккха хӀара агӀо",
-       "delete_and_move_reason": "Ð\94Ó\80аÑ\8fÑ\8cккÑ\85ина Ñ\86Ó\80е Ñ\85ийÑ\86а Ñ\8f Ñ\82аÑ\80о Ñ\85илийÑ\82а  Â«[[$1]]»",
+       "delete_and_move_reason": "ДӀаяьккхина цӀе хийца таро хилийта  «[[$1]]»",
        "selfmove": "АгӀона цӏе хийца йиш яц: и цӏе хӏокху агӏона йолуш ю.",
        "immobile-source-page": "ХӀокху агӏона цӏе хийца йиш яц.",
        "bad-target-model": "Йиш яц хийца $1 оцу $2: цхьаьна ца догӀу моделин хаамаш.",
        "exif-copyright": "Авторан бакъо ерг",
        "exif-exifversion": "Верси Exif",
        "exif-flashpixversion": "Ловш йолу верси FlashPix",
-       "exif-colorspace": "Ð\91еÑ\81наÑ\88ан Ñ\85Ñ\8cал",
+       "exif-colorspace": "Ð\91еÑ\81нийн Ð¼ÐµÑ\82Ñ\82иг",
        "exif-componentsconfiguration": "Бесара компонентин конфигураци",
-       "exif-compressedbitsperpixel": "Бесан кIоргалла дацдина чул тӀехьа",
+       "exif-compressedbitsperpixel": "Бесан кӀоргалла дацдиначул - цхьаьна",
        "exif-pixelxdimension": "Суьртан шоралла",
        "exif-pixelydimension": "Суьртан локхалла",
        "exif-usercomment": "Кхин тӀе къамел",
        "exif-relatedsoundfile": "Къамелан аьзнийн файл",
-       "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
+       "exif-datetimeoriginal": "Дуьххьарлера терахь а, хан а",
        "exif-datetimedigitized": "Оцифровк йина терахь а, хан а",
        "exif-subsectime": "Файлан хийцам баран хан секундашкахь",
        "exif-subsectimeoriginal": "Оригинал хенан секундан дакъа",
        "exif-exposurebiasvalue": "Сурт доккхуш яла оьшу серло меттаяло",
        "exif-maxaperturevalue": "Минимальни оьзан дукхалла",
        "exif-meteringmode": "Сурт доккхуш яла серло юьстаран хьал",
-       "exif-flash": "Серлона статус",
+       "exif-lightsource": "Серло схьайолу меттиг",
+       "exif-flash": "Серлонан статус",
        "exif-focallength": "Фокусни бохалла",
        "exif-focalplanexresolution": "X магийна фокалан тӀапа",
        "exif-focalplaneyresolution": "Y магийна фокалан тӀапа",
        "exif-exposuremode": "Сурт доккхуш йолу серлон хьал харжар",
        "exif-whitebalance": "Къайн баланс",
        "exif-digitalzoomratio": "Терхьаш дукха хиларан коэффициент",
-       "exif-scenecapturetype": "СÑ\83Ñ\80Ñ\82 Ð´Ð¾ÐºÐºÑ\85Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ð¼ÐµÑ\82Ñ\82иган Ñ\82айп",
+       "exif-scenecapturetype": "СÑ\86енан ÐºÐµп",
        "exif-contrast": "Къастам",
        "exif-saturation": "Ӏаьбна",
        "exif-sharpness": "Къаьсташ хилар",
        "exif-xyresolution-i": "$1 тӏадамаш дюйман",
        "exif-xyresolution-c": "$1 тӀадамаш сантиметрна",
        "exif-exposureprogram-1": "Куьйгаца",
+       "exif-exposureprogram-2": "Программин раж (лартӀахь)",
        "exif-subjectdistance-value": "$1 {{PLURAL:$1|метр}}",
        "exif-meteringmode-0": "Хууш дац",
        "exif-meteringmode-1": "Юкъара",
        "exif-flash-function-1": "Серло яц",
        "exif-focalplaneresolutionunit-2": "дюйм",
        "exif-sensingmethod-1": "Билгала ца йинарг",
-       "exif-filesource-3": "Терахьийн суртдохку аппарат",
+       "exif-filesource-3": "Терахьийн суртдокху аппарат",
        "exif-scenetype-1": "Сурт даьккхина нис дуьххьал",
        "exif-customrendered-0": "ХӀума дийна дац",
        "exif-customrendered-1": "Нийса доцу кечдар",
        "confirm-watch-top": "ТӀетоха хӀара агӀо хьан тергаме могӀам юкъа?",
        "confirm-unwatch-button": "ХӀаъ",
        "confirm-unwatch-top": "ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар?",
-       "comma-separator": ",&#32;",
+       "comma-separator": " a,&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← хьалха йоьду агӀо",
        "imgmultipagenext": "тӀаьхьа йоьгӀу агӀо →",
        "autosumm-newblank": "Кхоьллина еса агӀо",
        "lag-warn-normal": "{{PLURAL:$1|$1 Секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
        "lag-warn-high": "Сервераш синхронизаци еш тӀехьайисарна, {{PLURAL:$1|$1 секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
-       "watchlistedit-normal-title": "ТеÑ\80гаме Ð¼Ð¾Ð³Ó\80анийн Ñ\85ийÑ\86амаÑ\88",
+       "watchlistedit-normal-title": "ТеÑ\80гаме Ð¼Ð¾Ð³Ó\80аман Ñ\85ийÑ\86ам",
        "watchlistedit-normal-legend": "Тергаме могӀам юкъар дӀаяккхар",
        "watchlistedit-normal-explain": "Лахахь гойту хьан тергаме могӀамехь йолу агӀонаш.\nДӀаяздарш дӀадаха билгалде уьш такха тӀетаӀе кнопка «{{int:Watchlistedit-normal-submit}}».\nКхин хьа йиш ю [[Special:EditWatchlist/raw|йозан кепар могӀом нисба ]].",
        "watchlistedit-normal-submit": "ДӀадаха дӀаяздарш",
        "htmlform-user-not-exists": "<strong>$1</strong> яц.",
        "htmlform-user-not-valid": "<strong>$1</strong> — декъашхочун магийна йоцу цӀе.",
        "logentry-delete-delete": "$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|дӀаяьккхина}} $3 дӀасахьажорг гӀоьнца",
        "logentry-delete-restore": "$1 {{GENDER:$2|меттахӀоттайина|меттахӀоттайина}} агӀо $3",
        "logentry-delete-event": "$1 {{GENDER:$2|хийцина}} гуш хилар {{PLURAL:$5|1=$5 дӀаяздаран|$5 дӀаяздаршан}} тептаран → $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|хийцина}} {{PLURAL:$5|1=$5 верси|$5 версеш}} гуш хилар $3: $4 агӀорахь",
        "revdelete-unrestricted": "куьйгалхойн доза тохар дӀаяьккхина",
        "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",
        "logentry-merge-merge": "$1 {{GENDER:$2|вовшахтоьхна}} $3 $4 чохь ($5 кхаччалц версеш)",
        "logentry-move-move": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажорг цаюьтуш",
        "feedback-useragent": "Браузер:",
        "searchsuggest-search": "Лахар",
        "searchsuggest-containing": "чуьраниг…",
-       "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|кхин файл|кхин файлаш}} йолуш ю.",
-       "api-error-empty-file": "Ахьа яхьийтина файл еса ю.",
-       "api-error-mustbeposted": "Чоьхьара гӀалат: дехаро хьехам схьабоьху HTTP POST.",
-       "api-error-noimageinfo": "Кхиамца чуяьккхина, амма серверо файлахь лаьцна цхьаа хаам битина бац.",
-       "api-error-nomodule": "Чоьхьара гӀалат: чуйокху модуль нисйина яц.",
-       "api-error-ok-but-empty": "Чоьхьара гӀалат: серверара жоп дац.",
-       "api-error-overwrite": "йолуш йолу файл хийца магийна дац.",
-       "api-error-stashfailed": "Чоьхьара гӀалат: серверна хана йолу файл Ӏалашъян цаелира.",
        "api-error-publishfailed": "Чоьхьара гӀалат: серверна хана йолу файл Ӏалашъян цаелира.",
-       "api-error-stasherror": "Файл чуйоккхуш Ӏалашечехь гӀалат даьлла.",
-       "api-error-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|сахьт}}",
        "removecredentials": "ДӀадаха декъашхойн дӀаяздарш",
        "removecredentials-submit": "ДӀадаха декъашхойн дӀаяздарш",
        "credentialsform-provider": "ДӀаяздарийн тайпа:",
-       "credentialsform-account": "Декъашхочун цӀе:"
+       "credentialsform-account": "Декъашхочун цӀе:",
+       "userjsispublic": "Тергам бе: JavaScript бухара агӀонаш чохь къайлаха хаамаш хийла ца беза, уьш массо декъашхойн тӀекхочуш йолу дера.",
+       "usercssispublic": "Тергам бе: CSS бухара агӀонаш чохь къайлаха хаамаш хийла ца беза, уьш массо декъашхойн тӀекхочуш йолу дера."
 }
index f025419..2ae2a77 100644 (file)
@@ -18,7 +18,8 @@
                        "Macofe",
                        "Pirehelokan",
                        "Diyariq",
-                       "Sarchia"
+                       "Sarchia",
+                       "Lost Whispers"
                ]
        },
        "tog-underline": "ھێڵ ھێنان بەژێر بەستەرەکان:",
        "loginerror": "ھەڵەی چوونەژوورەوە",
        "createacct-error": "ھەڵە لە دروستکردنی ھەژمار",
        "createaccounterror": "ناتوانیت هەژماری بەکارهێنەر دروست بکەیت: $1",
-       "nocookiesnew": "ھەژماری بەکارھێنەر دروست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر لە شەکرۆکە کەڵک وەردەگرێت.\nتۆ شەکرۆکەکەت لەکارخستووە.\nتکایە شەکرۆکەکە کارا بکە و پاشان بە ناوی بەکارھێنەر و تێپەڕوشە بچۆ ژوورەوە.",
+       "nocookiesnew": "ھەژماری بەکارھێنەری دروست کرا، بەڵام نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر کوکی بەکاردەھێنێت.\nتۆ کوکییەکەکەت لەکارخستووە.\nتکایە کوکییەکە کارا بکە، پاشان بە ناوی بەکارھێنەری و تێپەڕوشەکەت بچۆ ژوورەوە.",
        "nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکی‌یەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.",
        "nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.",
        "noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.",
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
-       "passwordreset-capture": "بینینی ئیمەیڵی ئەنجام؟",
        "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یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "saveprefs": "پاشەکەوت",
        "restoreprefs": "ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی (لە ھەموو بەشەکاندا)",
        "prefs-editing": "دەستکاریکردن",
-       "rows": "ڕیزەکان:",
-       "columns": "ستوونەکان:",
        "searchresultshead": "گەڕان",
        "stub-threshold": "سنوور بۆ شێوازی <a href=\"#\" class=\"stub\">بەستەری کۆڵکە</a> (بایت):",
        "stub-threshold-disabled": "ناچالاک",
        "userrights-reason": "هۆکار:",
        "userrights-no-interwiki": "دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.",
        "userrights-nodatabase": "بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.",
-       "userrights-nologin": "بۆ دانانی مافەکانی بەکارهێنەر دەبێ بە هەژماری بەڕێوبەری [[Special:UserLogin|بچیتە ژووروە]].",
-       "userrights-notallowed": "تۆ دەسەڵاتی دانان یان لابردنی مافەکانی بەکارھێنەرانت نییە.",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
        "group": "گرووپ:",
        "right-siteadmin": "داخستن و کردنەوەی بنکەدراو",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
-       "right-passwordreset": "دیتنی ئیمەیلەکانی ڕێکخستنەوەی تێپەڕوشە",
        "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "tooltip-pt-mycontris": "پێڕستی بەشدارییەکان",
        "tooltip-pt-login": "پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ",
        "tooltip-pt-logout": "دەرچوون",
+       "tooltip-pt-createaccount": "تۆ ھان دەدرێیت کە ھەژمارێک دروست بکەیت و بچیتە ژوورەوە، ئەمە سەرەکی نییە بەھەرحاڵ",
        "tooltip-ca-talk": "وتووێژ سەبارەت بە پەڕەی ناوەڕۆک",
        "tooltip-ca-edit": "دەستکاری ئەم پەڕەیە بکە‌",
        "tooltip-ca-addsection": "بەشێکی نوێ دەست پێ بکە",
        "feedback-message": "پەیام:",
        "feedback-subject": "بابەت:",
        "feedback-submit": "ناردن",
-       "searchsuggest-search": "لە {{SITENAME}} بگەڕێ",
+       "searchsuggest-search": "لە {{SITENAME}}دا بگەڕێ",
        "searchsuggest-containing": "بە لەبەرگرتنەوەی ...",
-       "api-error-empty-file": "ئەو پەڕگەیە کە ناردووتە واڵا بوو.",
-       "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-illegal-filename": "ناوی پەڕگە رێگەپێ‌نەدراوە.",
-       "api-error-unclassified": "ھەڵەیەکی نەزانراو ڕوویداوە.",
-       "api-error-unknown-code": "ھەڵەی نەزانراو: «$1».",
        "api-error-unknownerror": "ھەڵەی نەزانراو: «$1».",
        "duration-seconds": "$1 {{PLURAL:$1|چرکە|چرکە}}",
        "duration-minutes": "$1 {{PLURAL:$1|خولەک|خولەک}}",
index ddced48..3e1aa18 100644 (file)
        "sig_tip": "Имзанъыз ве тарих",
        "hr_tip": "Горизонталь сызыкъ (пек сыкъ къулланманъыз)",
        "summary": "Денъиштирменинъ къыскъа тарифи:",
-       "subject": "Мевзу/серлева:",
+       "subject": "Мевзу:",
        "minoredit": "Бу, кичик денъиштирмедир",
        "watchthis": "Саифени козет",
        "savearticle": "Саифени сакъла",
+       "savechanges": "Денъиштирмелерни сакъла",
        "preview": "Бакъып чыкъув",
        "showpreview": "Бакъып чыкъ",
        "showdiff": "Денъиштирмелерни косьтер",
        "saveprefs": "Сакъла",
        "restoreprefs": "Бутюн ог бельгиленген сазламаларны къайтар",
        "prefs-editing": "Саифелерни денъиштирюв",
-       "rows": "Сатыр",
-       "columns": "Сутун",
        "searchresultshead": "Къыдырув",
        "recentchangesdays": "Сонъки денъиштирмелер саифесинде косьтериледжек кунь сайысы:",
        "recentchangesdays-max": "(энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}})",
index e48be9f..3054c1b 100644 (file)
        "sig_tip": "İmzañız ve tarih",
        "hr_tip": "Gorizontal sızıq (pek sıq qullanmañız)",
        "summary": "Deñiştirmeniñ qısqa tarifi:",
-       "subject": "Mevzu/serleva:",
+       "subject": "Mevzu:",
        "minoredit": "Bu, kiçik deñiştirmedir",
        "watchthis": "Saifeni közet",
        "savearticle": "Saifeni saqla",
+       "savechanges": "Deñiştirmelerni saqla",
        "preview": "Baqıp çıquv",
        "showpreview": "Baqıp çıq",
        "showdiff": "Deñiştirmelerni köster",
        "saveprefs": "Saqla",
        "restoreprefs": "Bütün ög belgilengen sazlamalarnı qaytar",
        "prefs-editing": "Saifelerni deñiştirüv",
-       "rows": "Satır",
-       "columns": "Sutun",
        "searchresultshead": "Qıdıruv",
        "recentchangesdays": "Soñki deñiştirmeler saifesinde kösterilecek kün sayısı:",
        "recentchangesdays-max": "(eñ çoq $1 {{PLURAL:$1|kün|kün}})",
index cd5784c..d8e1bb9 100644 (file)
        "searcharticle": "Jít na",
        "history": "Historie stránky",
        "history_short": "Historie",
+       "history_small": "historie",
        "updatedmarker": "změněno od poslední návštěvy",
        "printableversion": "Verze k tisku",
        "permalink": "Trvalý odkaz",
        "views": "Zobrazení",
        "toolbox": "Nástroje",
        "tool-link-userrights": "Změnit uživatelské skupiny {{GENDER:$1|tohoto uživatele|této uživatelky}}",
+       "tool-link-userrights-readonly": "Zobrazit {{GENDER:$1|uživatelské}} skupiny",
        "tool-link-emailuser": "Poslat e-mail {{GENDER:$1|tomuto uživateli|této uživatelce}}",
        "userpage": "Prohlédnout si uživatelskou stránku",
        "projectpage": "Prohlédnout si stránku projektu",
        "eauthentsent": "Na zadanou adresu byl zaslán potvrzovací e-mail.\nŽádné další zprávy vám však na tuto adresu nebudou odeslány, dokud podle instrukcí v e-mailu nepotvrdíte, že tato adresa skutečně patří vám.",
        "throttled-mailpassword": "Během {{PLURAL:$1|poslední hodiny|posledních $1 hodin}} již bylo heslo jednou zasláno.\nKvůli prevenci zneužívání lze heslo zaslat jen jednou za $1 {{PLURAL:$1|hodinu|hodiny|hodin}}.",
        "mailerror": "Chyba při zasílání e-mailu: $1",
-       "acct_creation_throttle_hit": "Uživatelé používající vaši IP adresu už dnes vytvořili $1 {{PLURAL:$1|účet|účty|účtů}}, což je dovolené maximum.\nProto není v tuto chvíli dovoleno z této IP adresy zakládat další účty.",
+       "acct_creation_throttle_hit": "Uživatelé používající vaši IP adresu za poslední $2 vytvořili už $1 {{PLURAL:$1|účet|účty|účtů}}, což je pro toto období maximum.\nProto není v tuto chvíli dovoleno z této IP adresy zakládat další účty.",
        "emailauthenticated": "Vaše e-mailová adresa byla ověřena $2 v $3.",
        "emailnotauthenticated": "Vaše e-mailová adresa dosud nebyla ověřena.\nU následujících funkcí nebudou zasílány žádné e-maily.",
        "noemailprefs": "Pro zprovoznění následujících možností musíte zadat svou e-mailovou adresu.",
        "passwordreset-emaildisabled": "E-mailové funkce byly na této wiki vypnuty.",
        "passwordreset-username": "Uživatelské jméno:",
        "passwordreset-domain": "Doména:",
-       "passwordreset-capture": "Prohlédnout si výsledný e-mail?",
-       "passwordreset-capture-help": "Pokud zaškrtnete toto políčko, bude e-mail (s dočasným heslem) kromě zaslání uživateli zobrazen i vám.",
        "passwordreset-email": "E-mailová adresa:",
        "passwordreset-emailtitle": "Informace k účtu na {{grammar:6sg|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu účtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dnů}}.\nNyní byste se měli přihlásit a zvolit si nové heslo. Pokud tento požadavek poslal někdo jiný nebo jste si na své staré heslo vzpomněli, a nechcete ho tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailelement": "Uživatelské jméno: \n$1\n\nDočasné heslo: \n$2",
        "passwordreset-emailsentemail": "Pokud je u vašeho účtu nastavena tato e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
        "passwordreset-emailsentusername": "Pokud je u tohoto účtu nastavena e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Byl odeslán e-mail|Byly odeslány e-maily}} pro získání nového hesla. Zde {{PLURAL:$1|jsou zobrazeny uživatelské jméno a heslo|je zobrazen seznam uživatelských jmen a hesel}}.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|Uživateli|Uživatelce}} se nepodařilo odeslat e-mail: $1 Zde {{PLURAL:$3|jsou zobrazeny uživatelské jméno a heslo|je zobrazen seznam uživatelských jmen a hesel}}.",
        "passwordreset-nocaller": "Musí být uveden volající",
        "passwordreset-nosuchcaller": "Volající neexistuje: $1",
        "passwordreset-ignored": "Žádost o nové heslo nebyla zpracována. Možná není nakonfigurován žádný poskytovatel?",
        "blockedtitle": "Uživatel zablokován",
        "blockedtext": "<strong>Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.</strong>\n\nZablokování {{GENDER:$4|provedl|provedla}} $1.\nUdaným důvodem bylo <em>$2</em>.\n\n* Začátek blokování: $8\n* Zablokování vyprší: $6\n* Blokovaný uživatel: $7\n\nPokud chcete zablokování prodiskutovat, můžete kontaktovat {{GENDER:$4|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].\nUvědomte si, že nemůžete použít funkci „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.\nVaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
        "autoblockedtext": "Vaše IP adresa byla automaticky zablokována, protože ji používal jiný uživatel, kterého zablokoval $1.\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec blokování: $6\n* Původně blokovaný uživatel: $7\n\nZablokování můžete prodiskutovat se správcem $1 nebo některým z dalších [[{{MediaWiki:Grouppage-sysop}}|správců]].\n\nUvědomte si však, že funkci „Poslat e-mail tomuto uživateli“ nemůžete použít, pokud nemáte ve svém [[Special:Preferences|uživatelském nastavení]] zadaný platný e-mail a nebylo vám zablokováno jeho užívání.\n\nVaše současná IP adresa je $3, číslo vašeho zablokování je #$5.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
+       "systemblockedtext": "Vaše IP adresa byla automaticky zablokována softwarem MediaWiki.\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec blokování: $6\n* Původně blokovaný uživatel: $7\n\nVaše současná IP adresa je $3.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
        "blockednoreason": "důvod nebyl zadán",
        "whitelistedittext": "Pro editaci se musíte $1.",
        "confirmedittext": "Pro editaci stránek je vyžadováno potvrzení vaší e-mailové adresy.\nNa stránce [[Special:Preferences|nastavení]] zadejte a nechte potvrdit svou e-mailovou adresu.",
        "revdelete-failure": "'''Nepodařilo se nastavit viditelnost revize:'''\n$1",
        "logdelete-success": "Viditelnost události úspěšně nastavena.",
        "logdelete-failure": "'''Nepodařilo se nastavit viditelnost protokolu:'''\n$1",
-       "revdel-restore": "Změnit viditelnost",
+       "revdel-restore": "změnit viditelnost",
        "pagehist": "Historie stránky",
        "deletedhist": "Smazaná historie",
        "revdelete-hide-current": "Chyba při skrývání položky z $1 $2: jedná se o současnou revizi.\nTu nelze skrýt.",
        "difference-title": "$1: Porovnání verzí",
        "difference-title-multipage": "$1 a $2: Porovnání stránek",
        "difference-multipage": "(Rozdíly mezi stránkami)",
-       "lineno": "Řádka $1:",
+       "lineno": "Řádek $1:",
        "compareselectedversions": "Porovnat vybrané verze",
        "showhideselectedversions": "Zobrazit/skrýt vybrané revize",
        "editundo": "zrušit editaci",
        "search-interwiki-caption": "Sesterské projekty",
        "search-interwiki-default": "Výsledky z $1:",
        "search-interwiki-more": "(více)",
+       "search-interwiki-more-results": "další výsledky",
        "search-relatedarticle": "Související",
        "searchrelated": "související",
        "searchall": "vše",
        "search-external": "Externí hledání",
        "searchdisabled": "<p>Omlouváme se. Plnotextové vyhledávání je dočasně nedostupné. Zatím můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.</p>",
        "search-error": "Při hledání došlo k chybě: $1",
+       "search-warning": "Při hledání došlo k varování: $1",
        "preferences": "Nastavení",
        "mypreferences": "Nastavení",
        "prefs-edits": "Počet editací:",
        "saveprefs": "Uložit nastavení",
        "restoreprefs": "Obnovit všechna výchozí nastavení (ve všech sekcích)",
        "prefs-editing": "Editace",
-       "rows": "Řádky:",
-       "columns": "Sloupce:",
        "searchresultshead": "Vyhledávání",
        "stub-threshold": "Limit pro formátování odkazu jako pahýl ($1):",
        "stub-threshold-sample-link": "příklad",
        "prefs-help-recentchangescount": "Týká se posledních změn, historie stránek a protokolovacích záznamů.",
        "prefs-help-watchlist-token2": "Toto je tajný klíč k webovému kanálu vašich sledovaných stránek. Kdokoli, kdo bude tento klíč znát, bude moci váš seznam sledovaných stránek číst, takže ho nešiřte.\n[[Special:ResetTokens|Kliknutím sem ho můžete reinicializovat.]]",
        "savedprefs": "Nastavení byla uložena.",
-       "savedrights": "Práva {{GENDER:$1|uživatele|uživatelky}} $1 byla uložena.",
+       "savedrights": "Skupiny {{GENDER:$1|uživatele|uživatelky}} $1 byly uloženy.",
        "timezonelegend": "Časové pásmo:",
        "localtime": "Místní čas:",
        "timezoneuseserverdefault": "Použít časové pásmo wiki ($1)",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Uživatelské jméno}}:",
        "prefs-memberingroups": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Čas registrace:",
        "yourrealname": "Vaše skutečné jméno:",
        "yourlanguage": "Jazyk rozhraní:",
        "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-lookup-user": "Spravovat uživatelské skupiny",
+       "userrights-lookup-user": "Vybrat uživatele",
        "userrights-user-editname": "Zadejte uživatelské jméno:",
-       "editusergroup": "Upravit {{GENDER:$1|uživatelské}} skupiny",
+       "editusergroup": "Načíst uživatelské skupiny",
        "editinguser": "Úprava práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Upravit uživatelské skupiny",
+       "viewinguserrights": "Prohlížení práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Upravit {{GENDER:$1|uživatelské}} skupiny",
+       "userrights-viewusergroup": "Zobrazit {{GENDER:$1|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.",
+       "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-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-nologin": "Musíte se [[Special:UserLogin|přihlásit]] k účtu správce, abyste mohli měnit uživatelská práva.",
-       "userrights-notallowed": "Nemáte oprávnění měnit uživatelská práva.",
        "userrights-changeable-col": "Skupiny, které můžete měnit",
        "userrights-unchangeable-col": "Skupiny, které nemůžete měnit",
+       "userrights-expiry-current": "Vyprší $1",
+       "userrights-expiry-none": "Bez vypršení",
+       "userrights-expiry": "Čas vypršení:",
+       "userrights-expiry-existing": "Současný čas vypršení: $2, $3",
+       "userrights-expiry-othertime": "Jiný čas:",
+       "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-conflict": "Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.",
-       "userrights-removed-self": "Odebrali jste si vlastní práva. Tudíž už nemáte k této stránce přístup.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "group-autoconfirmed": "Automaticky schválení uživatelé",
        "right-siteadmin": "Zamykání a odemykání databáze",
        "right-override-export-depth": "Exportovat stránky včetně odkazovaných stránek až do hloubky 5",
        "right-sendemail": "Odesílání e-mailů ostatním uživatelům",
-       "right-passwordreset": "Prohlížení e-mailů pro znovunastavení hesla",
        "right-managechangetags": "Vytváření a (de)aktivace [[Special:Tags|značek]]",
        "right-applychangetags": "Přidávání [[Special:Tags|značek]] k vlastním změnám",
        "right-changetags": "Přidávání libovolných [[Special:Tags|značek]] na jednotlivé revize a protokolovací záznamy a jejich odebírání",
        "action-upload_by_url": "nahrát tento soubor z URL adresy",
        "action-writeapi": "používat API pro zápis",
        "action-delete": "smazat tuto stránku",
-       "action-deleterevision": "smazat tuto revizi",
-       "action-deletedhistory": "zobrazit historii smazaných revizí této stránky",
+       "action-deleterevision": "mazat revize",
+       "action-deletelogentry": "mazat protokolovací záznamy",
+       "action-deletedhistory": "prohlížet si smazanou historii stránky",
+       "action-deletedtext": "prohlížet si smazané texty revizí",
        "action-browsearchive": "hledat smazané stránky",
-       "action-undelete": "obnovit tuto stránku",
-       "action-suppressrevision": "zkontrolovat a obnovit tuto skrytou revizi",
+       "action-undelete": "obnovovat stránky",
+       "action-suppressrevision": "prohlížet si a obnovovat skryté revize",
        "action-suppressionlog": "prohlédnout si tento skrytý protokolovací záznam",
        "action-block": "znemožnit tomuto uživateli editování",
        "action-protect": "změnit úrovně ochrany této stránky",
        "action-userrights-interwiki": "upravovat práva uživatelů na jiných wiki",
        "action-siteadmin": "zamykat nebo odemykat databázi",
        "action-sendemail": "posílat e-maily",
+       "action-editmyoptions": "měnit svá uživatelská nastavení",
        "action-editmywatchlist": "upravovat vlastní seznam sledovaných stránek",
        "action-viewmywatchlist": "prohlížet vlastní seznam sledovaných stránek",
        "action-viewmyprivateinfo": "prohlížet si své soukromé údaje",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vizte též [[Special:NewPages|seznam nových stránek]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Zobrazit",
+       "rcfilters-activefilters": "Aktivní filtry",
+       "rcfilters-filtergroup-authorship": "Autorství editace",
        "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od <strong>$3, $4</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "rcshowhideminor": "$1 malé editace",
        "uploaded-setting-handler-svg": "SVG, které nastavuje atribut „handler“ na nelokální/data/skript, je zablokováno. V načteném SVG souboru bylo nalezeno <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, které nastavuje libovolný stylový atribut se vzdáleným URL, je zablokováno. V načteném SVG souboru bylo nalezeno <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "V načteném SVG souboru byl nalezen obrazový filtr s URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Tento SVG soubor obsahuje nedovolený jmenný prostor „$1“",
+       "uploadscriptednamespace": "Tento SVG soubor obsahuje nedovolený jmenný prostor „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "XML v načteném souboru nelze zpracovat.",
        "uploadvirus": "Tento soubor obsahuje virus! Podrobnosti: $1",
        "uploadjava": "Tento soubor je ZIP, který obsahuje javový soubor .class.\nNačítání javových souborů není dovoleno, neboť by mohly umožnit obcházení bezpečnostních omezení.",
        "withoutinterwiki-summary": "Tyto stránky neobsahují žádný mezijazykový odkaz:",
        "withoutinterwiki-legend": "Prefix",
        "withoutinterwiki-submit": "Zobrazit",
-       "fewestrevisions": "Stránky s nejméně verzemi",
+       "fewestrevisions": "Stránky s nejméně editacemi",
        "nbytes": "$1 {{PLURAL:$1|bajt|bajty|bajtů}}",
        "ncategories": "$1 {{PLURAL:$1|kategorie|kategorie|kategorií}}",
        "ninterwikis": "$1 {{PLURAL:$1|mezijazykový odkaz|mezijazykové odkazy|mezijazykových odkazů}}",
        "uncategorizedcategories": "Nekategorizované kategorie",
        "uncategorizedimages": "Nekategorizované soubory",
        "uncategorizedtemplates": "Nekategorizované šablony",
+       "uncategorized-categories-exceptionlist": " # Obsahuje seznam kategorií, které se nemají objevovat na Speciální:Nekategorizované kategorie. Jedna kategorie na každém řádku, uvozená pomocí „*“. Řádky začínající jiným znakem (včetně bílých znaků) se ignorují. Komentáře vkládejte za „#“.",
        "unusedcategories": "Nepoužívané kategorie",
        "unusedimages": "Nepoužívané soubory",
        "wantedcategories": "Chybějící kategorie",
        "apisandbox-sending-request": "Odesílá se API požadavek…",
        "apisandbox-loading-results": "Přijímají se API výsledky…",
        "apisandbox-results-error": "Došlo k chybě při načítání odpovědi na API dotaz: $1.",
+       "apisandbox-request-selectformat-label": "Zobrazit data požadavku jako:",
+       "apisandbox-request-format-url-label": "řetězec dotazu do URL",
        "apisandbox-request-url-label": "URL požadavku:",
+       "apisandbox-request-json-label": "JSON požadavku:",
        "apisandbox-request-time": "Trvání požadavku: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Opravit token a znovu odeslat",
        "apisandbox-results-fixtoken-fail": "Nepodařilo se načíst token „$1“.",
        "apisandbox-continue": "Pokračovat",
        "apisandbox-continue-clear": "Vymazat",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} bude [https://www.mediawiki.org/wiki/API:Query#Continuing_queries pokračovat] v posledním požadavku; {{int:apisandbox-continue-clear}} vymaže parametry související s pokračováním.",
+       "apisandbox-param-limit": "Pro použití maximálního limitu zadejte <kbd>max</kbd>.",
+       "apisandbox-multivalue-all-namespaces": "$1 (všechny jmenné prostory)",
+       "apisandbox-multivalue-all-values": "$1 (všechny hodnoty)",
        "booksources": "Zdroje knih",
        "booksources-search-legend": "Vyhledat knižní zdroje",
        "booksources-search": "Hledat",
        "activeusers-count": "$1 {{PLURAL:$1|akce|akce|akcí}} během {{PLURAL:$3|posledního dne|posledních $3 dnů}}",
        "activeusers-from": "Zobrazit uživatele počínaje od:",
        "activeusers-groups": "Zobrazit uživatele patřící do skupin:",
+       "activeusers-excludegroups": "Nezobrazovat uživatele patřící do skupin:",
        "activeusers-noresult": "Nenalezen žádný uživatel.",
        "activeusers-submit": "Zobrazit aktivní uživatele",
        "listgrouprights": "Práva skupin uživatelů",
        "emailccsubject": "Kopie Vaší zprávy pro uživatele $1: $2",
        "emailsent": "E-mail odeslán",
        "emailsenttext": "Váš e-mail byl odeslán.",
-       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „{{int:emailuser}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2.",
+       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „{{int:emailuser}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2. Pokud na něj odpovíte, bude váš e-mail odeslán přímo {{GENDER:$1|původnímu odesílateli, čímž mu|původní odesílatelce, čímž jí}} prozradíte svou e-mailovou adresu.",
        "usermessage-summary": "Doručena zpráva od systému.",
        "usermessage-editor": "Systémový poslíček",
        "watchlist": "Sledované stránky",
        "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
        "sessionfailure-title": "Chyba relace",
        "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
-       "changecontentmodel": "Změna modelu obsahu stránky",
+       "changecontentmodel": "Změnit model obsahu stránky",
        "changecontentmodel-legend": "Změnit model obsahu",
        "changecontentmodel-title-label": "Název stránky",
        "changecontentmodel-model-label": "Nový model obsahu",
        "changecontentmodel-emptymodels-title": "Nejsou k dispozici žádné modely obsahu",
        "changecontentmodel-emptymodels-text": "Obsah stránky [[:$1]] nelze zkonvertovat na žádný typ.",
        "log-name-contentmodel": "Kniha změn modelů obsahu",
-       "log-description-contentmodel": "Události týkající se modelů obsahu stránek",
+       "log-description-contentmodel": "Na této stránce jsou zaznamenány změny modelu obsahu stránek a stránky, které byly vytvořeny s modelem obsahu různým od výchozího.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|založil|založila}} stránku $3 za použití nestandardního modelu obsahu „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|změnil|změnila}} model obsahu stránky $3 z „$4“ na „$5“",
        "logentry-contentmodel-change-revertlink": "vrátit",
        "proxyblockreason": "Vaše IP adresa byla zablokována, protože funguje jako otevřený proxy server. Kontaktujte svého poskytovatele internetového připojení nebo technickou podporu a informujte je o tomto vážném bezpečnostním problému.",
        "sorbsreason": "Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server.",
        "sorbs_create_account_reason": "Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet",
+       "softblockrangesreason": "Anonymní příspívání z vaší IP adresy ($1) není dovoleno. Prosíme přihlaste se.",
        "xffblockreason": "IP adresa uvedená v hlavičce X-Forwarded-For, ať už vaše, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1",
        "cant-see-hidden-user": "Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.",
        "ipbblocked": "Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}.",
        "cant-move-to-user-page": "Nemáte oprávnění přesouvat na uživatelskou stránku (pouze na podstránku uživatelské stránky).",
        "cant-move-category-page": "Nemáte oprávnění přesouvat stránky kategorií.",
        "cant-move-to-category-page": "Nemáte oprávnění přesunout stránku na stránku kategorie.",
+       "cant-move-subpages": "Nemáte oprávnění přesouvat podstránky.",
+       "namespace-nosubpages": "Ve jmenném prostoru „$1“ nejsou podstránky povoleny.",
        "newtitle": "Nový název:",
        "move-watch": "Sledovat tuto stránku",
        "movepagebtn": "Přesunout stránku",
        "pageinfo-length": "Velikost stránky (v bajtech)",
        "pageinfo-article-id": "ID stránky",
        "pageinfo-language": "Jazyk obsahu stránky",
+       "pageinfo-language-change": "změnit",
        "pageinfo-content-model": "Model obsahu stránky",
        "pageinfo-content-model-change": "změnit",
        "pageinfo-robot-policy": "Indexování roboty",
        "htmlform-user-not-exists": "Uživatel <strong>$1</strong> neexistuje.",
        "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-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-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",
        "feedback-bugcheck": "Skvělé! Jen zkontrolujte, zda se nejedná o jednu z [$1 už známých chyb].",
        "feedback-useragent": "Uživatelský agent:",
        "searchsuggest-search": "Hledat na {{GRAMMAR:6sg|{{SITENAME}}}}",
        "searchsuggest-containing": "obsahující…",
-       "api-error-autoblocked": "Vaše IP adresa byla automaticky zablokována, protože ji používal zablokovaný uživatel.",
-       "api-error-badaccess-groups": "Nemáte povoleno nahrávat soubory na tuto wiki.",
        "api-error-badtoken": "Vnitřní chyba: špatný token.",
-       "api-error-blocked": "Byla vám zablokována možnost editace.",
-       "api-error-copyuploaddisabled": "Načítání z URL je na tomto severu zakázáno.",
-       "api-error-duplicate": "Na této wiki již {{PLURAL:$1|existuje jiný soubor|existují jiné soubory}} se shodným obsahem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Soubor|Soubory}} se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.",
-       "api-error-empty-file": "Načtený soubor je prázdný.",
        "api-error-emptypage": "Zakládání prázdných stránek není dovoleno.",
-       "api-error-fetchfileerror": "Vnitřní chyba: došlo k chybě při stahování souboru.",
-       "api-error-fileexists-forbidden": "Soubor s názvem „$1“ už existuje a nelze ho přepsat.",
-       "api-error-fileexists-shared-forbidden": "Soubor s názvem „$1“ už existuje ve sdíleném úložišti a nelze ho přepsat.",
-       "api-error-file-too-large": "Načtený soubor je příliš velký.",
-       "api-error-filename-tooshort": "Název souboru je příliš krátký.",
-       "api-error-filetype-banned": "Tento typ souboru je zakázán.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|je nedovolený formát souborů|jsou nedovolené formáty souborů}}. {{PLURAL:$3|Povolený formát souborů je|Povolené formáty souborů jsou}} $2.",
-       "api-error-filetype-missing": "Tento soubor nemá příponu.",
-       "api-error-hookaborted": "Zamýšlená úprava byla zakázána rozšiřujícím modulem.",
-       "api-error-http": "Vnitřní chyba: nepodařilo se připojit k serveru.",
-       "api-error-illegal-filename": "Tento název souboru není dovolen.",
-       "api-error-internal-error": "Vnitřní chyba: došlo k chybě při zpracování vašeho načteného souboru.",
-       "api-error-invalid-file-key": "Vnitřní chyba: soubor nebyl nalezen v dočasném úložišti.",
-       "api-error-missingparam": "Vnitřní chyba: chybí parametry požadavku.",
-       "api-error-missingresult": "Vnitřní chyba: nelze určit, zda kopírování bylo úspěšné.",
-       "api-error-mustbeloggedin": "K načtení souborů musíte být přihlášen.",
-       "api-error-mustbeposted": "Vnitřní chyba: požadavek musí být prostřednictvím HTTP POST.",
-       "api-error-noimageinfo": "Načtení bylo úspěšné, ale server neposkytl o souboru žádné informace.",
-       "api-error-nomodule": "Interní chyba: není nastaven načítací modul.",
-       "api-error-ok-but-empty": "Interní chyba: ze serveru nepřišla odpověď.",
-       "api-error-overwrite": "Není dovoleno přepsat existující soubor.",
-       "api-error-ratelimited": "Pokoušíte se načíst v krátkém časovém rozmezí načíst více souborů, než je na této wiki dovoleno.\nZkuste to znovu za několik minut.",
-       "api-error-stashfailed": "Vnitřní chyba: Serveru se nepodařilo uložit dočasný soubor.",
        "api-error-publishfailed": "Vnitřní chyba: Serveru se nepodařilo zveřejnit dočasný soubor.",
-       "api-error-stasherror": "Při načítání souboru do skrýše došlo k chybě.",
-       "api-error-stashedfilenotfound": "Při pokusu o načtení souboru ze skrýše nebyl uložený soubor nalezen.",
-       "api-error-stashpathinvalid": "Cesta, na které měl být soubor uložen ve skrýši, je neplatná.",
-       "api-error-stashfilestorage": "Při ukládání souboru do skrýše došlo k chybě.",
-       "api-error-stashzerolength": "Server nemohl soubor uložit do skrýše, protože má nulovou délku.",
-       "api-error-stashnotloggedin": "Pro ukládání souboru do skrýše musíte být přihlášeni.",
-       "api-error-stashwrongowner": "Soubor, ke kterému se ve skrýši pokoušíte přistoupit, vám nepatří.",
-       "api-error-stashnosuchfilekey": "Klíč souboru, ke kterému se ve skrýši pokoušíte přistoupit, neexistuje.",
-       "api-error-timeout": "Server neodpověděl v očekávaném čase.",
-       "api-error-unclassified": "Došlo k neznámé chybě.",
-       "api-error-unknown-code": "Neznámá chyba: „$1“.",
-       "api-error-unknown-error": "Vnitřní chyba: došlo k chybě při pokusu o načtení souboru.",
-       "api-error-unknown-warning": "Neznámé varování: $1",
+       "api-error-stashfailed": "Vnitřní chyba: Serveru se nepodařilo uložit dočasný soubor.",
+       "api-error-unknown-warning": "Neznámé varování: „$1“.",
        "api-error-unknownerror": "Neznámá chyba: „$1“.",
-       "api-error-uploaddisabled": "Načítání souborů je na této wiki vypnuto.",
-       "api-error-verification-error": "Soubor je možná poškozen nebo má špatnou příponu.",
-       "api-error-was-deleted": "Soubor s tímto názvem byl již dříve načten a později smazán.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundy|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuty|minut}}",
        "duration-hours": "$1 {{PLURAL:$1|hodina|hodiny|hodin}}",
        "pagelang-language": "Jazyk",
        "pagelang-use-default": "Použít implicitní jazyk",
        "pagelang-select-lang": "Vybrat jazyk",
+       "pagelang-reason": "Důvod",
        "pagelang-submit": "Odeslat",
+       "pagelang-nonexistent-page": "Stránka $1 neexistuje.",
+       "pagelang-unchanged-language": "Stránka $1 již má nastavený jazyk $2.",
+       "pagelang-unchanged-language-default": "Stránka $1 již má jako jazyk nastavený výchozí jazyk obsahu wiki.",
+       "pagelang-db-failed": "Databázi se nepodařilo změnit jazyk stránky.",
        "right-pagelang": "Změnit jazyk stránky",
        "action-pagelang": "měnit jazyk stránky",
        "log-name-pagelang": "Kniha změn jazyků",
        "mw-widgets-dateinput-no-date": "Nevybráno žádné datum",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Hledat média",
+       "mw-widgets-mediasearch-noresults": "Nebyly nalezeny žádné výsledky.",
        "mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
        "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ší…",
        "sessionmanager-tie": "Nelze kombinovat několik typů autentizace požadavků: $1.",
        "sessionprovider-generic": "relace pomocí $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "relace pomocí cookies",
        "log-action-filter-contentmodel-change": "Změna modelu obsahu",
        "log-action-filter-contentmodel-new": "Založení stránky s nestandardním modelem obsahu",
        "log-action-filter-delete-delete": "Smazání stránky",
+       "log-action-filter-delete-delete_redir": "Smazání přesměrování",
        "log-action-filter-delete-restore": "Obnovení stránky",
        "log-action-filter-delete-event": "Smazání záznamu",
        "log-action-filter-delete-revision": "Smazání revize",
        "usercssispublic": "Uvědomte si prosím, že podstránky s CSS by neměly obsahovat tajné údaje, protože jsou viditelné ostatním uživatelům.",
        "restrictionsfield-badip": "Neplatná IP adresa nebo rozsah: $1",
        "restrictionsfield-label": "Povolené rozsahy IP adres:",
-       "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Chyba: $1",
-       "edit-error-long": "Chyby:\n\n$1"
+       "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"
 }
index 8877f73..daebbc1 100644 (file)
@@ -8,48 +8,52 @@
                        "MinuteElectron",
                        "Warszk",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Kirsan",
+                       "Ankry"
                ]
        },
        "tog-underline": "Pòdsztrëchiwùjë lënczi:",
        "tog-hideminor": "Zatacë môłi edicëje w slédnëch zmianach",
        "tog-hidepatrolled": "Zatacë sprôdzoné edicëje slédnych zjinakach",
        "tog-newpageshidepatrolled": "Zatacë sprôdzoné edicëje w lësce nowich starnów",
+       "tog-hidecategorization": "Zatacë kategòrizacjã strón",
        "tog-extendwatchlist": "Rozwinie lëstã ùzérónëch artiklów bë wëskrzënic wszëtczé zmianë, ni le blós slédné",
        "tog-usenewrc": "Ùżëjé rozwinãti wëzdrzatk slédnych zjinaków (nót je JavaScript)",
        "tog-numberheadings": "Aùtomatné numerowanié nôgłówków",
-       "tog-showtoolbar": "Wëskrzrni listwã nôrzãdzów edicëji (nót je JavaScript)",
-       "tog-editondblclick": "Editëjë starnë przez dëbeltné klëkniãcé (nót je JavaScript)",
-       "tog-editsectiononrightclick": "Włączë edicëjã sekcëji bez klëkniãcé prawą knąpą mëszë<br />na titlu sekcëji (JavaScript)",
-       "tog-watchcreations": "Dodôwôj starnë, chtërné ùsôdzã, do mòji lëstë ùzérónëch artiklów",
-       "tog-watchdefault": "Dodôwôj starnë, chtërné editëjã do mòji lëstë ùzérónëch artiklów",
-       "tog-watchmoves": "Dodôwôj starnë jaczé przenoszã do mòji lëstë ùzérónëch artiklów",
-       "tog-watchdeletion": "Dodôwôj starnë jaczé rëmóm do mòji lëstë ùzérónëch artiklów",
+       "tog-showtoolbar": "Wëskrzëni listwã nôrzãdzów edicje",
+       "tog-editondblclick": "Editëjë starnë przez dëbeltné klëkniãcé",
+       "tog-editsectiononrightclick": "Włączë edicjã sekcji bez klëkniãcé prawą knąpą mëszë na titlu sekcje",
+       "tog-watchcreations": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë, chtërné ùsôdzã, i lopczi, chtërné wladëjã",
+       "tog-watchdefault": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë i lopczi, chtërné editëjã.",
+       "tog-watchmoves": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë i lopczi, jaczé przenoszã.",
+       "tog-watchdeletion": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë i lopczi, jaczé rëmóm.",
        "tog-minordefault": "Zaznaczë wszëtczé edicëje domëslno jakno môłé",
        "tog-previewontop": "Pòkażë pòdzérk przed kastką edicëji",
        "tog-previewonfirst": "Pòkażë pòdzérk ju przed pierszą edicëją",
-       "tog-enotifwatchlistpages": "Wëslë mie e-mail czedë starna jaką ùzéróm je zmieniwónô",
+       "tog-enotifwatchlistpages": "Wësli mie e-mail czedë je zmieniwónô starna abò lopk, jaczi ùzéróm.",
        "tog-enotifusertalkpages": "Wëslë mie e-mail czedë zmieniwónô je mòja starna diskùsëji",
-       "tog-enotifminoredits": "Wëslë mie e-mail téż dlô môłich zmianów starnów",
+       "tog-enotifminoredits": "Wësli mie e-mail téż dlô môłich zmianów starnów i lopków.",
        "tog-enotifrevealaddr": "Pòkażë mòją adresã e-mail w òdkôzëwùjącym mailu",
        "tog-shownumberswatching": "Pòkażë lëczba ùzérającëch brëkòwników",
-       "tog-oldsig": "Pòdzérk wëzdrzatkù twòjegò pòdpisënka",
+       "tog-oldsig": "Wëzdrzatk twòjegò pòdpisënkù:",
        "tog-fancysig": "Wzérôj na pòdpisënk jakno na wikikòd (bez aùtomatnych lënków)",
-       "tog-uselivepreview": "Brëkùjë wtimczasnegò pòdzérkù (JavaScript) (eksperimentalné)",
+       "tog-uselivepreview": "Brëkùjë wtimczasnegò pòdzérkù",
        "tog-forceeditsummary": "Pëtôj przed wéńdzenim do pùstégò pòdrechòwania edicëji",
-       "tog-watchlisthideown": "Zatacë mòjé edicëje z lëstë ùzérónëch artiklów",
+       "tog-watchlisthideown": "Zatacë mòje edicje z lëstë ùzérónëch artiklów",
        "tog-watchlisthidebots": "Zatacë edicëje botów z lëstë ùzérónëch artiklów",
        "tog-watchlisthideminor": "Zatacë môłi zmianë z lëstë ùzérónëch artiklów",
        "tog-watchlisthideliu": "Zatacë edicëje wlogòwónych brëkòwników na lësce ùzérónych artiklów",
        "tog-watchlisthideanons": "Zatacë edicëje anonimòwich brëkòwników na lësce ùzérónych artiklów",
        "tog-watchlisthidepatrolled": "Zatacë sprôwdzoné edicëje z lëstë ùzérónych artiklów",
+       "tog-watchlisthidecategorization": "Zatacë kategòrizacjã strón",
        "tog-ccmeonemails": "Sélôj do mie kòpije e-mailów, chtërné sélóm do jinych brëkòwników",
        "tog-diffonly": "Nie wëskrzëniôj zamkłoscë starnë niżi przërónaniô zjinaków",
        "tog-showhiddencats": "Wëskrzëni zataconé kategòrëje",
        "tog-norollbackdiff": "Pòcësni wëskrzënianié zjinaków pò copniãcô sã",
        "underline-always": "Wiedno",
        "underline-never": "Nigdë",
-       "underline-default": "Domëslny przezérnik",
+       "underline-default": "Tak jak w domëslnym przezérnikù abò skórczi.",
        "editfont-style": "Sztél fònta w edicjowim pòlu:",
        "editfont-default": "Domëslny przezérnik",
        "editfont-monospace": "fònt ò stałi szérzé",
        "oct": "ruj",
        "nov": "lës",
        "dec": "gòd",
+       "january-date": "$1 stëcznika",
+       "february-date": "$1 gromicznika",
+       "march-date": "$1 strëmiannika",
+       "april-date": "$1 łżëkwiata",
+       "may-date": "$1 maja",
+       "june-date": "$1 czerwińca",
+       "july-date": "$1 lëpińca",
+       "august-date": "$1 zélnika",
+       "september-date": "$1 séwnika",
+       "october-date": "$1 pazdzérznika",
+       "november-date": "$1 lëstopadnika",
+       "december-date": "$1 gòdnika",
        "pagecategories": "{{PLURAL:$1|Kategòrëjô|Kategòrëje}}",
        "category_header": "Artikle w kategòrëji \"$1\"",
        "subcategories": "Pòdkategòrëje",
        "newwindow": "(òtmëkô sã w nowim òczenkù)",
        "cancel": "Anulujë",
        "moredotdotdot": "Wicy...",
-       "mypage": "Mòja starna",
-       "mytalk": "Diskùsëjô",
-       "anontalk": "Diskùsëjô dlô ti IP-adresë",
+       "mypage": "Starna",
+       "mytalk": "Diskùsjô",
+       "anontalk": "Diskùs",
        "navigation": "Nawigacëjô",
        "and": "&#32;ë",
        "qbfind": "Nalézë",
        "actions": "Dzéjania",
        "namespaces": "Rum mionów:",
        "variants": "Wariantë",
+       "navigation-heading": "Nawigacyjné menu",
        "errorpagetitle": "Fela",
        "returnto": "Nazôd do starnë $1.",
        "tagline": "Z {{SITENAME}}",
        "history": "Historëjô starnë",
        "history_short": "Historëjô",
        "updatedmarker": "zaktualnioné òd mòji slédny gòscënë",
-       "printableversion": "Wersëjô do drëkù",
+       "printableversion": "Wersjô do drëkù",
        "permalink": "Prosti lënk",
        "print": "Drëkùjë",
+       "view": "Pòdzér",
        "edit": "Edicëjô",
-       "create": "Ùsôdzë",
+       "create": "Ùsadzë",
        "editthispage": "Editëjë nã starnã",
-       "create-this-page": "Ùsôdzë nã starnã",
+       "create-this-page": "Ùsadzë nã starnã",
        "delete": "Rëmôj",
        "deletethispage": "Rëmôj nã starnã",
-       "undelete_short": "Doprowôdzë nazôd {{PLURAL:$1|1 edicëjã|$1 edicëje|$1 edicëjów}}",
+       "undelete_short": "Doprowadzë nazôd {{PLURAL:$1|1 edicjã|$1 edicje|$1 edicjów}}",
        "protect": "Zazychrëjë",
        "protect_change": "zmieni",
        "protectthispage": "Zazychrëjë nã starnã",
        "unprotect": "Òdzychrëjë",
        "unprotectthispage": "Òdzychrëjë nã starnã",
        "newpage": "Nowô starna",
-       "talkpage": "Diskùsëjô starnë",
-       "talkpagelinktext": "Diskùsëjô",
+       "talkpage": "Diskùsjô starnë",
+       "talkpagelinktext": "diskùsjô",
        "specialpage": "Specjalnô starna",
        "personaltools": "Priwatné przërëchtënczi",
        "articlepage": "Starna artikla",
-       "talk": "Diskùsëjô",
+       "talk": "Diskùsjô",
        "views": "Pòdzérków",
        "toolbox": "Przërëchtënczi",
        "userpage": "Wëskrzëni starnã brëkòwnika",
        "jumptosearch": "szëkbë",
        "aboutsite": "Ò {{SITENAME}}",
        "aboutpage": "Project:Ò_{{SITENAME}}",
-       "copyright": "Zamkłosc hewòtny starnë je ùżëczónô wedle reglów $1.",
+       "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",
        "currentevents": "Aktualné wëdarzenia",
        "currentevents-url": "Project:Aktualné wëdarzenia",
        "disclaimers": "Prawné zastrzedżi",
        "disclaimerpage": "Project:Prawné zastrzedżi",
        "edithelp": "Pòmòc do edicëji",
+       "helppage-top-gethelp": "Pòmòc",
        "mainpage": "Przédnô starna",
        "mainpage-description": "Przédnô starna",
        "policy-url": "Project:Regle",
        "toc": "Spisënk zamkłoscë",
        "showtoc": "pokôż",
        "hidetoc": "zatacë",
+       "confirmable-yes": "Jo",
        "thisisdeleted": "Wëskrzënic abò dobëc nazôd $1?",
        "viewdeleted": "Òbaczë $1",
        "restorelink": "{{PLURAL:$1|jednô rëmniãtô wersëjô|$1 rëmniãté wersëje|$1 rëmniãtich wersëjów}}",
        "nstab-special": "Specjalnô starna",
        "nstab-project": "meta-starna",
        "nstab-image": "Òbrôzk",
-       "nstab-mediawiki": "Òłosënk",
+       "nstab-mediawiki": "Ògłosënk",
        "nstab-template": "Szablóna",
        "nstab-help": "Pòmòc",
        "nstab-category": "Kategòrëjô",
+       "mainpage-nstab": "Przédnô starna",
        "nosuchaction": "Felënk taczégò dzéjaniô",
        "nosuchactiontext": "Dzéjanié pòdóné w adrese URL nie je dobré.\nMòzlëwą przëczëną je lëterowô zmiłka w URL abò lëchi lënk.\nTo mòże bëc téż fela softwôrë brëkòwóny przez {{SITENAME}}.",
        "nosuchspecialpage": "Nie da taczi specjalny starnë",
        "editinginterface": "'''ÒSTRZÉGA:''' Editëjesz starnã, jakô zamëkô w se tekst interfejsu softwôrë. Wszëtczé zmianë tu zrobioné bãdze widzec na interfejse jinszëch brëkòwników.\nPrzemëszlë dolmaczënié na [https://translatewiki.net/wiki/Main_Page?setlang=csb translatewiki.net], ekstra ùdbie lokalizacëji softwôrë MediaWiki.",
        "logouttext": "'''Jes wëlogòwóny.'''\nMòżesz robic dali na {{SITENAME}} jakno anonimòwi brëkòwnik abò sã <span class='plainlinks'>[$1 wlogòwac]</span> znowa jakno równy, a bò jinszi brëkòwnik.\nBôczë, że do czasu wëczëszczenia pòdrãczny pamiãcë przezérnika, niejedné starnë bãdą wëzdrzëc jakbë të bëł wlogòwóny.",
        "yourname": "Miono brëkòwnika",
+       "userlogin-yourname": "Pòzwa brëkòwnika",
        "yourpassword": "Twòja parola",
+       "createacct-yourpassword-ph": "Wprowadzë hasło do przistãpù",
        "yourpasswordagain": "Pòwtórzë parolã",
+       "createacct-yourpasswordagain": "Pòcwierdzë hasło",
+       "createacct-yourpasswordagain-ph": "Wprowadzë hasło do przistãpù jesz rôz",
+       "userlogin-remembermypassword": "Nie wëlogòwùj mie",
        "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",
+       "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": "Ùsôdzë kònto",
+       "nologinlink": "Ùsadzë kònto",
        "createaccount": "Założë nowé kònto",
        "gotaccount": "Masz ju kònto? '''$1'''.",
        "gotaccountlink": "Wlogùjë",
-       "createaccountmail": "òb e-mail",
+       "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ą.",
        "userexists": "To miono brëkòwnika je ju w ùżëcym. Proszã wëbrac jiné miono.",
        "loginerror": "Fela logòwaniô",
-       "loginsuccesstitle": "ùdałé logòwanié",
+       "loginsuccesstitle": "Ã\99dałé logòwanié",
        "loginsuccess": "Të jes wlogòwóny do {{SITENAME}} jakno \"$1\".",
-       "nosuchuser": "Nie dô brëkòwnika ò mionie \"$1\".\nSprôwdzë pisënk abò [[Special:CreateAccount|ùsôdzë nowé kònto]].",
+       "nosuchuser": "Nie mô brëkòwnika ò mionie \"$1\".\nW pòzwie brëkòwnika mô znaczenié wiôlgòsc lëtrów.\nSprawdzë pisënk abò [[Special:CreateAccount|ùsadzë nowé kònto]].",
        "nouserspecified": "Mùszisz pòdac miono brëkòwnika.",
        "wrongpassword": "Lëchô parola.\nSpróbùjë znowa.",
        "wrongpasswordempty": "Wpisónô parola je pùstô\nSpróbùjë znowa.",
        "passwordtooshort": "Parola mùszi zamëkac w se co nômni $1 {{PLURAL:$1|céch|céchë|céchów}}.",
-       "mailmypassword": "Wëslë nową parolã e-mailą",
+       "mailmypassword": "Zetrzéc hasło.",
        "passwordremindertitle": "Nowô doczasnô parola dlô {{SITENAME}}",
        "passwordremindertext": "Chtos (gwës Të, z adresë $1) pòprosëł ò wësłanié nowi\nparolë dlô {{SITENAME}} ($4). Aktualnô parola dlô brëkòwnika\n\"$2\" òsta ùsôdzonô ë nastôwionô jakno \"$3\". Jeżlë to bëło twòją\njintencëją, mùszisz sã terô wlogòwac ë zmienic swòją parolã.\nNowô parola je wôznô {{PLURAL:$5|dzéń|$5 dni}}.\nJeżlë chto jinszi wësłôł to zapëtanié, abò pamiãtôsz swòją parolã\në chcesz jã dali bez zmianë brëkòwac, zjignorëje to wiadło ë\nrobi dali ze starną parolą.",
        "noemail": "W baze ni ma email-adresë dlô brëkòwnika \"$1\".",
        "acct_creation_throttle_hit": "Môsz ùsôdzoné ju {{PLURAL:$1|1 kònto|$1 kontów}}.\nNi mòżesz miec ju wicy.",
-       "emailauthenticated": "Twòjô adresa e-mail Ã²sta pòcwierdzonô $2 ò $3.",
+       "emailauthenticated": "Twój adres e-mail Ã²stôÅ\82 pòcwierdzóny $2 ò $3.",
        "accountcreated": "Konto założone",
-       "accountcreatedtext": "Konto brëkòwnika dlô $1 je założone.",
+       "accountcreatedtext": "Kònto brëkòwnika dlô [[{{ns:User}}:$1|$1]], [[{{ns:User talk}}:$1|talk]] òstało ùsadzóné.",
        "createaccount-title": "Kònto ùsôdzoné dlô {{SITENAME}}",
        "loginlanguagelabel": "Jãzëk: $1",
+       "pt-login": "Wlogùj mie",
+       "pt-createaccount": "Ùsadzë kònto",
+       "pt-userlogout": "Wëlogùj",
        "changepassword": "Zmiana parolë",
        "oldpassword": "Stôrô parola:",
        "newpassword": "Nowô parola",
        "retypenew": "Napiszë nową parolã jesz rôz",
        "resetpass-submit-loggedin": "Zmiana parolë",
        "resetpass-submit-cancel": "Anulujë",
+       "passwordreset-username": "Pòzwa brëkòwnika",
        "bold_sample": "Wëtłëszczony drëk",
        "bold_tip": "Wëtłëszczony drëk",
        "italic_sample": "Ùchëłi tekst",
        "sig_tip": "Twój pòdpisënk z datumã a czasã",
        "hr_tip": "Hòrizontalnô linijô (brëkùjë szpórowno)",
        "summary": "Pòdrechòwanié:",
-       "subject": "Téma/nagłówk:",
-       "minoredit": "To je drobnô edicëjô",
+       "subject": "Téma:",
+       "minoredit": "To je drobnô edicjô",
        "watchthis": "Ùzérôj",
        "savearticle": "Zapiszë artikel",
        "preview": "Pòdzérk",
        "showpreview": "Wëskrzëni pòdzérk",
        "showdiff": "Wëskrzëni zmianë",
-       "anoneditwarning": "'''Bôczë:''' Të nie je wlogòwóny. Twòjô adresa IP mdze zapisónô w historëji edicëji ti starnë.",
+       "anoneditwarning": "<strong>Bôczë:</strong> Të nie jes wlogòwóny. Jeżlë wëkònôsz jakąs zmianã, twòja adresa IP mdze widocznô dlô wszëtczich. Jeżlë <strong>[$1 wlogùjesz sã]</strong> abò <strong>[$2 ùsadzysz kònto]</strong>twòje zjinaczi òstóną przëpisóné do kònta, co wicy mającë kònto òtrzimôsz rozmajité ùdogòdnienia.",
+       "anonpreviewwarning": "Të nie jes wlogòwóny. Jeżlë wprowadzysz jaczés zjinaczi, twòja adresa IP mdze ùmieszczónô w historie edicji starnë.",
        "summary-preview": "Pòdzérk òpisënka:",
        "blockedtitle": "Brëkòwnik je zascëgóny",
        "blockedtext": "'''Twòje kònto abò ë IP-adresa òstałë zablokòwóné.'''\n\nZablokòwôł je $1.\nPòdónô przëczëna to:''$2''.\n\n * Zôczątk blokadë: $8\n * Kùńc blokadë: $6\n * Cél blokadë: $7\n\n\nBë zgwësnic sprawã zablokòwaniô mòżesz skòntaktowac sã z $1 abò jińszim [[{{MediaWiki:Grouppage-sysop}}|administratorã]].\nBoczë, że të ni mòżesz stądka sélac e-mailów, jeżlë nié môsz jesz zaregisterowóné e-mailowé adresë w [[Special:Preferences|nastôwach]].\nTwòjô aktualnô adresa IP to $3, a zablokòwónô adresa ID to #$5.\nProszëmë pòdac wëższé pòdôłczi przë wszëtczich pëtaniach.",
        "loginreqlink": "Wlogùjë",
        "loginreqpagetext": "$1 sã, żebë przezérac jinszé starnë.",
        "accmailtitle": "Parola wësłónô.",
-       "accmailtext": "Przëtrôfkòwò wëgenerowónô parola dlô [[User talk:$1|$1]] òsta wësłónô do $2.\n\nParolã dlô negò nowégò kònta mòże zmienic pò wlogòwaniu na starnie ''[[Special:ChangePassword|zjinaka parolë]]''.",
+       "accmailtext": "Przëtrôfkòwò wëgenerowónô parola dlô [[User talk:$1|$1]] òsta wësłónô do $2. Parolã dlô negò nowégò kònta mòże zmienic pò wlogòwaniu na starnie <em>[[Special:ChangePassword|zjinaka parolë]]</em> .",
        "newarticle": "(Nowi)",
        "newarticletext": "Môsz przëszłi z lënkù do starnë jaka jesz nie òbstoji.\nBë ùsôdzëc artikel, naczni pisac w kastce niżi (òb. [$1 starnã pòmòcë]\ndlô wicy wëdowiédzë).\nJeżlë jes të tuwò bez zmiłkã, le klëkni w swòjim przezérnikù knąpã '''nazôd'''.",
-       "anontalkpagetext": "----''To je starna dyskùsëji anonimòwiégò brëkòwnika, chtëren nie ùsôdzëł jesz swòjegò kòntae, abò gò nie brëkùje.\nAbë gò rozpòznac, ùżëwómë adresów IP.\nTakô adresa IP, mòże bëc równak brëkòwónô przez wiele lëdzy.\nJeżlë jes anonimòwim brëkòwnikã ë ùwôżôsz, że ne wiadła nie są do ce sczerowóne, tedë [[Special:CreateAccount|ùsôdzë nowé kònto]] abò [[Special:UserLogin|wlogùjë sã]], bë niechac niezrozmeiniô z jinyma anonimòwima brëkòwnikama.''",
-       "noarticletext": "Felëje starna ò tim titlu.\nMòżesz [[Special:Search/{{PAGENAME}}|szëkac za {{PAGENAME}} na jinych starnach]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} szëkac w logù] abò [{{fullurl:{{FULLPAGENAME}}|action=edit}} ùsôdzëc nã starnã]</span>",
+       "anontalkpagetext": "----\n<em>To je starna diskùsje anonimòwégò brëkòwnika, chtëren nie ùsadzëł jesz swòjegò kònta, abò gò nie brëkùje.</em>\nAbë gò rozpòznac, ùżëwómë adresów IP.\nTakô adresa IP mòże bëc równak brëkòwónô przez wiele lëdzy.\nJeżlë jes anonimòwim brëkòwnikã i ùwôżôsz, że ne wiadła nie są do ce sczerowóné, tedë [[Special:CreateAccount|ùsadzë nowé kònto]] abò [[Special:UserLogin|wlogùj sã]], bë niechac niezrozmieniô z jinyma anonimòwima brëkòwnikama.''",
+       "noarticletext": "Felëje starna ò tim titlu.\nMòżesz [[Special:Search/{{PAGENAME}}|szëkac za {{PAGENAME}} na jinych starnach]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} szëkac w logù] abò [{{fullurl:{{FULLPAGENAME}}|action=edit}} ùsadzëc nã starnã]</span>",
        "clearyourcache": "'''Bôczë: Pò zapisanim, mòże bãdzesz mùszôł òminąc pamiãc przezérnika bë òbaczëc zmianë.'''\n'''Mozilla / Firefox / Safari:''' przëtrzëmôj ''Shift'' òbczas klëkaniô na ''Zladëjë znowa'', abò wcësni ''Ctrl-F5'' abò ''Ctrl-R'' (''Command-R'' na kòmpùtrach Mac);\n'''Konqueror:''': klëkni na knąpã ''Zladëjë znowa'', abò wcësni ''F5'';\n'''Opera:''' wëczëszczë pòdrãczną pamiãc w ''Tools→Preferences'';\n'''Internet Explorer:'''przëtrzëmôj ''Ctrl'' òbczas klëkaniô na ''Zladëjë znowa'', abò wcësni ''Ctrl-F5''.",
        "updated": "(Zaktualnioné)",
-       "previewnote": "'''To je blós pòdzérk - artikel jesz nie je zapisóny!'''",
+       "previewnote": "<strong>To je blós pòdzérk.</strong>\n Artikel jesz nie je zapisóny!",
+       "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}}\".",
        "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Ô!'''",
        "copyrightwarning2": "Bôczë, że wszëtczé edicëje w {{SITENAME}} mògą bëc editowóné, zmienióné abò rëmniãté bez jinëch brëkòwników.\nJeżlë nie chcesz bë Twòja robòta bëła editowónô, tedë nie dodôwôj ji tuwò.<br />\nZacwierdzając zmianë dôwôsz zgòdã na to, ż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 (zdrzë za detalama na $1).\n'''NIE DODÔWÔJ ROBÒTË CHRONIONY ÙSÔDZKÒWIMA PRAWAMA BEZ ZEZWÒLENIÔ!'''",
        "readonlywarning": "'''BÔCZËNK: Pòdôwkòwô baza òsta sztërkòwô zablokòwónô dlô administracjowich célów. Ni mòże tej timczasã zapisac nowi wersëji artikla.\nBédëjemë przeniesc ji tekst do priwatnégò lopka (wëtnij/wstôw) ë ùchòwac na pózni.'''\n\nAdministrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
+       "titleprotectedwarning": "'''Czó! Starna ò ti pòzwie òsta zazychrowónô. Dlô ùsadzeniô ti starnë pòtrzébné są [[Special:ListGroupRights|apartné ùdowierzenia]].'''\nNiżi  je widzec slédny wpisënk z registru:",
        "templatesused": "{{PLURAL:$1|Ùżëtô szablona|Ùżëté szablónë}} w tim artiklu:",
        "templatesusedpreview": "{{PLURAL:$1|Szablóna ùżëtô|Szablónë użëté}} w tim pòdzérkù:",
        "template-protected": "(zazychrowónô)",
        "template-semiprotected": "(dzélowò zazychrowóné)",
        "hiddencategories": "Na starna przënôleżi do w {{PLURAL:$1|1 zatacony kategòrëji|$1 zataconych kategòrëjów}}:",
        "permissionserrorstext-withaction": "Ni môsz przëstãpù do $2, z {{PLURAL:$1|nôslédny przëczënë|nôslédnych przëczënów}}:",
+       "recreate-moveddeleted-warn": "'''Bôczënk! Chcesz usadzëc starnã, chtërna wczasni òsta rëmniãtô.'''\n\nÙgwësni sã, czë pònowné ùsôdzenié ti starnë je kònieczné. \nNiżi je widzec register rëmaniów i zmian pòzwë ti starnë:",
+       "undo-summary": "Anulowanié wersje $1 aùtora [[Special:Contributions/$2|$2]] ([[User talk:$2|diskùsjô]])",
        "viewpagelogs": "Òbôczë rejestrë dzéjanió dlô ti starnë",
        "currentrev": "Aktualnô wersëjô",
        "currentrev-asof": "Aktualnô wersëjô na dzéń $1",
        "page_last": "kùńc",
        "histlegend": "Legenda: (aktualnô) = różnice w przërównanim do aktualny wersëje,\n(wczasniészô) = różnice w przërównanim do wczasniészi wersëje, D = drobné edicëje",
        "history-fieldset-title": "Przezérôj historëjã",
-       "histfirst": "Stôrszé",
-       "histlast": "Nowszé",
+       "history-show-deleted": "Leno rëmniãté",
+       "histfirst": "òd nôstarszich",
+       "histlast": "òd nônowszich",
        "history-feed-item-nocomment": "$1 ò $2",
        "rev-delundel": "pòkażë/zatacë",
        "rev-showdeleted": "pokôż",
        "revdelete-show-file-submit": "Jo",
-       "revdelete-radio-set": "Jo",
-       "revdelete-radio-unset": "Nié",
+       "revdelete-radio-set": "ùtacony",
+       "revdelete-radio-unset": "widzawny",
+       "revdelete-log": "Przëczëna:",
        "revdel-restore": "Zjinaczë widzawnotã",
        "pagehist": "Historëjô starnë",
        "deletedhist": "Rëmniãtô historëjô edicëji",
        "revdelete-hide-current": "Pòkôza sã fela przë taceniu wersëji datowóny na $2, $1. To je nônowszô wersëjô starnë, chtërnô ni mòże bëc zataconô.",
        "revdelete-show-no-access": "Pòkôza sã fela przë próbie wëskrzënieniô elementu datowónegò na $2, $1. Widzawnota negò elementu òsta ògrańczonô - ni môsz przëstãpù.",
+       "mergehistory-reason": "Przëczëna:",
        "revertmerge": "Rozdzélë",
-       "history-title": "Historëjô wersëji dlô \"$1\"",
+       "history-title": "Historiô zjinaków dlô \"$1\"",
+       "difference-title": "$1 — rozeszłoscë midzë wersjama",
        "lineno": "Lëniô $1:",
        "compareselectedversions": "Przërównôj wëbróné wersëje",
        "editundo": "doprowadzë nazôd",
        "prevn": "wczasniészé {{PLURAL:$1|$1}}",
        "nextn": "nôslédné {{PLURAL:$1|$1}}",
        "viewprevnext": "Òbaczë ($1 {{int:pipe-separator}} $2) ($3).",
+       "searchprofile-articles": "Artikle",
+       "searchprofile-everything": "na wszëtczich starnach",
        "searchprofile-advanced": "Awansowóné",
        "search-result-size": "$1 ({{PLURAL:$2|1 słowò|$2 słowa|$2 słów}})",
-       "search-redirect": "(przeczérowanié $1)",
+       "search-redirect": "(przeczérowanié $1)",
        "search-section": "(dzél $1)",
        "search-suggest": "Të mëszlôł ò: $1",
        "search-interwiki-caption": "Sosterné ùdbë",
-       "search-interwiki-default": "Skùtczi dlô $1:",
+       "search-interwiki-default": "Wëniczi òd $1:",
        "search-interwiki-more": "(wicy)",
        "searchall": "wszëtczé",
        "powersearch-legend": "Awansowónô szëkba",
        "powersearch-ns": "Szëkba w rumach mionów:",
        "preferences": "Preferencëje",
-       "mypreferences": "Mòje nastôwë",
+       "mypreferences": "Nastôwë",
        "prefs-edits": "Lëczba edicëjów:",
        "prefs-skin": "Wëzdrzatk",
        "skin-preview": "Pòdzérk",
        "datedefault": "Felëje preferencëji",
        "prefs-personal": "Pòdôwczi brëkòwnika",
-       "prefs-rc": "Slédné edicëje",
+       "prefs-rc": "Slédné edicje",
        "prefs-watchlist": "Lësta ùzérónëch artiklów",
        "prefs-watchlist-days": "Wielëna dniów dlô wëskrzëniwaniô na lësce ùzérónëch artiklów:",
        "prefs-watchlist-edits": "Maksymalnô lëczba edicëjów do pòkazaniô w rozszérzoné lësce ùzérónëch artiklów:",
        "prefs-misc": "Jine",
        "saveprefs": "Zapiszë",
        "prefs-editing": "Edicëjô",
-       "rows": "Régów:",
-       "columns": "Kòlumnów:",
        "searchresultshead": "Szëkba",
        "stub-threshold": "Greńca dlô fòrmatowaniô <a href=\"#\" class=\"stub\">lënków stubów</a>:",
        "recentchangesdays": "Kùli dni pòkazëwac w slédnëch edicëjach:",
        "savedprefs": "Twòjé nastôwë òstałë zapisóné.",
        "timezonelegend": "Czasowô cona:",
        "localtime": "Môlowi czas:",
-       "timezoneuseserverdefault": "Ùżëjë domëslnégò czasu serwera",
+       "timezoneuseserverdefault": "Ùżij domëslny dlô ti wiki ($1)",
        "timezoneuseoffset": "Jinô (specyfikùjë różnicã)",
        "servertime": "Czas serwera:",
        "guesstimezone": "Wezmi z przezérnika",
        "timezoneregion-indian": "Indijsczi Òcean",
        "timezoneregion-pacific": "Spòkójny Òcean",
        "allowemail": "Włączë mòżlewòtã sélaniô e-mailów òd jinëch brëkòwników",
-       "prefs-searchoptions": "Òptacëje szëkbë",
+       "prefs-searchoptions": "Szëkba",
        "prefs-namespaces": "Rum mionów",
        "default": "domëszlné",
        "prefs-files": "Lopczi",
        "prefs-reset-intro": "Na ti starnie mòże doprowôdzëc nazôd domëslné nastôwë dlô ti starnë.\nNegò dzéjaniô ni mòżé pòzdze ju copnąc.",
        "prefs-emailconfirm-label": "Pòcwierdzenié e-mailowi adresë:",
        "youremail": "E-mail:",
-       "username": "Miono brëkòwnika:",
-       "prefs-memberingroups": "Nôlëżnik {{PLURAL:$1|karna|karnów}}",
+       "username": "{{GENDER:$1|Miono brëkòwnika}}:",
+       "prefs-memberingroups": "{{GENDER:$2| Nôlëżnik}}{{PLURAL:$1|karna|karnów}}",
        "prefs-registration": "Czas registracëji:",
        "yourrealname": "Miono ë nôzwëskò:",
        "yourlanguage": "Jãzëk:",
-       "yourvariant": "Wariant:",
+       "yourvariant": "Wariant jãzëka zamkłoscë:",
        "yournick": "Pòdpisënk:",
        "badsig": "Òchëbny pòdpisënk, sprôwdzë tadżi HTML.",
        "badsiglength": "Pòdpisënk je za dłudżi.\nMô bëc mni jakno $1 {{PLURAL:$1|znak|znaczi/znaków}}.",
        "gender-male": "Chłop",
        "gender-female": "Białka",
        "email": "E-mail",
-       "prefs-help-realname": "Prôwdzewi miono je òptacjowé a czej je dôsz, òstanié ùżëté do pòdpisaniô Twòjégò wkłôdu",
+       "prefs-help-realname": "Prôwdzëwé miono je òptacjowé, a czej je dôsz, òstanié ùżëté do pòdpisaniô Twòjégò wkładu",
        "prefs-help-email": "Adresa e-mail je òptacëjnô, zezwôlô równak sélac do ce nową parolã jak tã zabëjesz.\nMòżesz zezwòlëc jinszim brëkòwniką na łączbã z Tobą przez Twòją starnã abò starnã diskùsëji, bez mùszebnotë wëskrzënianiô swòjich pòdôwków.",
        "editinguser": "Zmiana praw brëkòwnika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+       "userrights-reason": "Przëczëna:",
        "group": "Karno:",
        "group-user": "Brëkòwnicë",
        "group-autoconfirmed": "Aùtomatno zacwierdzony brëkòwnicë",
        "group-bot": "Bòtë",
        "group-sysop": "Sprôwnicë",
-       "group-bureaucrat": "Biurokracë",
+       "group-bureaucrat": "Biórokracë",
        "group-suppress": "Rewizorzë",
        "group-all": "(wszëtcë)",
-       "group-user-member": "{{GENDER:$1|Brëkòwnik}}",
-       "group-autoconfirmed-member": "aùtomatno zacwierdzony brëkòwnik",
-       "group-bot-member": "bòt",
-       "group-sysop-member": "sprôwnik",
-       "group-bureaucrat-member": "biurokrata",
+       "group-user-member": "{{GENDER:$1|brëkòwnik|brëkòwniczka}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|aùtomatno zacwierdzony brëkòwnik|aùtomatno zacwierdzonô brëkòwniczka}}",
+       "group-bot-member": "{{GENDER:$1|bòt}}",
+       "group-sysop-member": "{{GENDER:$1|sprôwnik}}",
+       "group-bureaucrat-member": "{{GENDER:$1|biórokrata|biórokratka}}",
        "group-suppress-member": "rewizora",
        "grouppage-user": "{{ns:project}}:Brëkòwnicë",
        "grouppage-autoconfirmed": "{{ns:project}}:Aùtomatno zacwierdzeni brëkòwnicë",
        "grouppage-bot": "{{ns:project}}:Bòtë",
        "grouppage-sysop": "{{ns:project}}:Sprôwnicë",
-       "grouppage-bureaucrat": "{{ns:project}}:Biurokracë",
+       "grouppage-bureaucrat": "{{ns:project}}:Biórokracë",
        "grouppage-suppress": "{{ns:project}}:Rewizorzë",
        "right-read": "Czëtanié starnów",
        "right-edit": "Edicëjô starnów",
        "rightslog": "Prawa brëkòwnika",
        "action-edit": "editëjë tã starnã",
        "nchanges": "{{PLURAL:$1|zjinaka|zjinaczi|zjinaków}}",
-       "recentchanges": "Slédné edicëje",
+       "enhancedrc-history": "Historiô",
+       "recentchanges": "Slédné edicje",
        "recentchanges-legend": "Òptacëje slédnych zjinaków",
-       "recentchanges-summary": "Na starna prezentérëje historëjã slédnëch edicëjów w {{SITENAME}}.",
+       "recentchanges-summary": "Na starna prezentérëje historiã slédnëch edicjów w ti wiki.",
        "recentchanges-feed-description": "Pòdstrzegô slédny zmianë w tim pòwrózkù.",
-       "recentchanges-label-minor": "To je drobnô edicëjô",
+       "recentchanges-label-newpage": "W ti edicje ùsadzóno nową starnã",
+       "recentchanges-label-minor": "To je drobnô edicjô",
+       "recentchanges-label-bot": "Tã edicjã wëkònôł bòt.",
+       "recentchanges-label-unpatrolled": "Ta edicjô jesz nie òsta sprawdzónô",
+       "recentchanges-label-plusminus": "Zjinaczónô wiôlgòsc starnë (lëczba bajtów)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (òbaczë téż [[Special:NewPages|lëstã nowëch strón]])",
        "rcnotefrom": "Niżi są zmianë òd '''$2''' (pòkazóné do '''$1''').",
        "rclistfrom": "Pòkażë nowé zmianë òd $3 $2",
        "rcshowhideminor": "$1 môłé zmianë",
+       "rcshowhideminor-hide": "Zatacë",
        "rcshowhidebots": "$1 botë",
-       "rcshowhideliu": "$1 zalogòwónëch brëkòwników",
-       "rcshowhideanons": "$1 anonymòwëch brëkòwników",
+       "rcshowhidebots-show": "pokôż",
+       "rcshowhideliu": "$1 zaregistrowónëch brëkòwników",
+       "rcshowhideliu-hide": "Zatacë",
+       "rcshowhideanons": "$1 anonimòwëch brëkòwników",
+       "rcshowhideanons-hide": "Zatacë",
        "rcshowhidepatr": "$1 òbzérónë edicëje",
-       "rcshowhidemine": "$1 mòjé edicëje",
+       "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",
        "diff": "jinosc",
        "hist": "hist.",
        "filehist-dimensions": "Miara",
        "filehist-filesize": "Miara lopka",
        "filehist-comment": "Òpisënk",
-       "imagelinks": "Lënczi lopka",
+       "imagelinks": "Wëkòrzëstanie lopka",
        "linkstoimage": "{{PLURAL:$1|Hewò je starna jakô òdwòłëje|Hewò są starnë jaczé òdwòłëją}} sã do negò lopka:",
        "nolinkstoimage": "Niżódnô starna nie òdwòłëje sã do negò lopka.",
        "sharedupload": "Nen lopk je na $1 ë mòże bëc brëkòwóny w jinych ùdbach.",
        "uploadnewversion-linktext": "Wladëjë nową wersëjã negò lopka",
+       "filerevert-comment": "Przëczëna:",
+       "filedelete-comment": "Przëczëna:",
        "listredirects": "Lësta przeczerowaniów",
        "unusedtemplates": "Pùsté szablónë",
        "randompage": "Kawlowô starna",
        "statistics": "Statisticzi",
+       "statistics-header-pages": "Statistika starnów",
+       "statistics-header-edits": "Statistika edicji",
        "statistics-header-users": "Statistika brëkòwników",
+       "statistics-pages-desc": "Wszëtczé starnë na wiki, w tim starnë diskùsje, przeczerowania itd.",
+       "statistics-files": "Wësłóné lopczi",
+       "statistics-edits": "Edicje wëkònané òd pòwstaniégò {{grammar:genitive|{{SITENAME}}}}",
+       "statistics-edits-average": "Strzédnô lëczba edicji na starnã",
+       "statistics-users": "Zaregistrowónëch [[Special:ListUsers|brëkòwników]]",
+       "statistics-users-active": "Aktiwnëch brëkòwników",
+       "statistics-users-active-desc": "Brekòwnicë, jaczi bëlë aktiwni òb òstatné $1 dni",
        "doubleredirects": "Dëbeltné przeczérowania",
        "brokenredirects": "Zerwóné przeczerowania",
        "withoutinterwiki": "Starnë bez jãzëkòwich lënków",
        "shortpages": "Nôkrótszé starnë",
        "longpages": "Nôdłëgszé starnë",
        "protectedpages": "Zazychrowóné starnë",
+       "protectedpages-timestamp": "Czasowô sygnatura",
+       "protectedpages-reason": "Przëczëna",
        "listusers": "Lësta brëkòwników",
        "newpages": "Nowé starnë",
-       "newpages-username": "Miono brëkòwnika:",
+       "newpages-username": "Pòzwa brëkòwnika:",
        "ancientpages": "Nôstarszé starnë",
        "move": "Przeniesë",
        "movethispage": "Przeniesë",
        "allpagessubmit": "Pòkôżë",
        "allpagesprefix": "Pòkôżë naczënającë sã òd:",
        "categories": "Kategòrëje",
+       "deletedcontributions": "Rëmniãti wkłôd brëkòwnika",
+       "deletedcontributions-title": "Rëmniãti wkłôd brëkòwnika",
        "linksearch": "Bùtnowé lënczi",
+       "activeusers": "Lësta aktiwnëch brëkòwników",
        "listgrouprights-members": "(lësta nôlëżników karna)",
        "emailuser": "Wëslë e-maila do negò brëkòwnika",
        "defemailsubject": "E-mail òd {{SITENAME}}",
        "noemailtitle": "Felënk email-adresë",
+       "emailusername": "Pòzwa brëkòwnika",
        "emailfrom": "Òd:",
        "emailto": "Do:",
        "emailsubject": "Téma:",
        "unwatchthispage": "Òprzestôj ùzerac ną starnã",
        "notanarticle": "To nie je artikel",
        "watchlist-details": "Ùzérôsz {{PLURAL:$1|$1 artikel|$1 artikle/-ów}}, nie rechùjąc diskùsëjów.",
-       "wlheader-showupdated": "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
+       "wlheader-showupdated": "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné <strong>pògrëbieniém</strong>",
        "wlnote": "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|'''$1''' slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|'''$2''' gòdzënë/gòdzënów}}.",
        "wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni",
+       "wlshowhidecategorization": "kategòrizacjã strón",
        "watchlist-options": "Òptacëje ùzérónych",
        "watching": "Ùzéróm...",
        "unwatching": "Ju ni ùzéróm...",
        "rollbacklink": "copnij",
        "rollbackfailed": "Nie szło copnąc zmianë",
        "alreadyrolled": "Ni mòże copnąc slédny edicëji starnë [[:$1]], chtërny ùsôdzcą je [[User:$2|$2]] ([[User talk:$2|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nchtos jiny ju zeditowôł starnã abò copnął zmianë.\n\nSlédnym ùsódzcą starnë bëł [[User:$3|$3]] ([[User talk:$3|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "revertpage": "Edicje brëkòwnika [[Special:Contributions/$2|$2]] ([[User talk:$2|diskùsjô]]) òstałë òdrzucóné. Aùtorã przëwrócóny wersji je [[User:$1|$1]].",
+       "rollback-success": "Edicje brëkòwnika $1 òstałë òdrzucóné; \nòsta przëwrócónô òstatnô wersjô, aùtorã chtërny je $2.",
+       "rollback-success-notify": "Edicje brëkòwnika $1 òstałë òdrzucóné; \nòsta przëwrócónô òstatnô wersjô, aùtorã chtërny je $2. [$3 Pòkażë zjinaczi]",
        "protectlogpage": "Zazychrowóné",
        "protectedarticle": "zazychrowónô [[$1]]",
        "modifiedarticleprotection": "zmienionô léga zazychrowaniô [[$1]]",
        "unprotectedarticle": "òdzychrowóny [[$1]]",
+       "protectedarticle-comment": "{{GENDER:$2|Zazychrowôł|Zazychrowała}} „[[$1]]”",
        "prot_1movedto2": "$1 przeniesłé do $2",
        "protect-legend": "Pòcwierdzë zazychrowanié",
        "protectcomment": "Przëczëna:",
        "protect-level-sysop": "blós sprôwnicë (sysopë)",
        "protect-summary-cascade": "kaskadowanié",
        "protect-expiring": "wëgasô $1 (UTC)",
+       "protect-expiry-indefinite": "na wiedno",
        "protect-cascade": "Zazychrëjë wszëtczé starnë zamkłé na ti starnie (kaskadowé zazychrowanié)",
        "protect-cantedit": "Ni mòżesz zmieniac lédżi zazychrowaniô ti starnë, kò ni môsz dosc prawa do ji edicëji.",
        "restriction-type": "Przistãp:",
        "restriction-level": "Léga bezpieczi:",
        "viewdeletedpage": "Òbaczë rëmóne starnë",
-       "undeletebtn": "Doprowôdzë nazôd",
-       "undeletelink": "wëskrzëni abò doprowôdzë nazôd",
+       "undeletebtn": "Doprowadzë nazôd",
+       "undeletelink": "wëskrzëni abò doprowadzë nazôd",
+       "undeletecomment": "Przëczëna:",
        "undelete-show-file-submit": "Jo",
        "namespace": "Rum mionów:",
        "invert": "Òdwrócë zaznaczenié",
+       "namespace_association": "sparłãczóné òbrëmié mionów",
        "blanknamespace": "(Przédnô)",
-       "contributions": "Wkłôd brëkòwników",
+       "contributions": "Wkłôd {{GENDER:$1|brëkòwnika|brëkòwniczczi}}",
        "contributions-title": "Wkłôd brëkòwnika $1",
-       "mycontris": "Mòje edicëje",
+       "mycontris": "Mój wkłôd",
+       "anoncontribs": "Mój wkłôd",
        "contribsub2": "Dlô brëkòwnika $1 ($2)",
        "uctop": "(slédnô)",
        "month": "Òd miesąca (ë wczasni):",
        "sp-contributions-newbies": "Pòkażë edicëjã blós nowich brëkòwników",
        "sp-contributions-newbies-sub": "Dlô nowich brëkòwników",
        "sp-contributions-blocklog": "historëjô blokòwaniô",
-       "sp-contributions-talk": "diskùsëjô",
+       "sp-contributions-deleted": "rëmniãti wkłôd brëkòwnika",
+       "sp-contributions-talk": "diskùsjô",
+       "sp-contributions-blocked-notice-anon": "Ta adresa IP je w tim sztërkù zablokòwónô.\nSlédny wpisënk z registru blokòwaniów je widzec niżi:",
        "sp-contributions-search": "Szëkba za edicëjama",
        "sp-contributions-username": "Adresa IP abò miono brëkòwnika:",
+       "sp-contributions-toponly": "Pòkażë leno slédné wersje",
+       "sp-contributions-newonly": "Pòkażë leno te edicje, jaczé twòrzą nową starnã",
+       "sp-contributions-hideminor": "Zatacy drobné zjinaczi",
        "sp-contributions-submit": "Szëkôj",
        "whatlinkshere": "Lënkùjącé",
        "whatlinkshere-title": "Starnë lënkùjącé do \"$1\"",
        "nolinkshere": "Niżódnô starna nie lënkùje do '''[[:$1]]'''.",
        "isredirect": "starna przeczerowaniô",
        "istemplate": "doparłãczony",
-       "isimage": "lënk òbrôzka",
+       "isimage": "lënk do lopka",
        "whatlinkshere-prev": "{{PLURAL:$1|wczasniészé|wczasniészé $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nôslédné|nôslédné $1}}",
        "whatlinkshere-links": "← lëkùjącé",
-       "whatlinkshere-hideredirs": "$1 przeczérownia",
+       "whatlinkshere-hideredirs": "$1 przeczérowania",
        "whatlinkshere-hidetrans": "$1 doparłãczenia",
        "whatlinkshere-hidelinks": "$1 lënczi",
        "whatlinkshere-filters": "Filtrë",
        "blockipsuccesssub": "Zascëgónié dało sã",
        "blockipsuccesstext": "Brëkòwnik [[Special:Contributions/$1|$1]] òstał zascëgóny.<br />\nBiéj do [[Special:BlockList|lëstë zascëgónëch adresów IP]] abë òbaczëc zascëdżi.",
        "ipblocklist": "Lësta zablokòwónëch adresów IP ë mionów brëkòwników",
+       "blocklist-timestamp": "Czasowô sygnatura",
+       "blocklist-target": "Cél",
+       "blocklist-expiry": "Ùpłiwô",
+       "blocklist-by": "Blokùjący sprôwnik",
+       "blocklist-params": "Paramétrë blokòwaniô",
+       "blocklist-reason": "Przëczëna",
+       "infiniteblock": "na wiedno",
+       "createaccountblock": "blokada ùsadzaniô kòntów",
+       "emailblock": "zablokòwónô adresa e-mail",
+       "blocklist-nousertalk": "ni mòże editowac gwôsny starnë diskùsje",
        "blocklink": "blokùjë",
        "unblocklink": "òdblokùjë",
        "change-blocklink": "zmieni blokòwanié",
        "blocklogpage": "Historëjô blokòwaniô",
        "blocklogentry": "zablokòwôł [[$1]], czas blokadë: $2 $3",
        "unblocklogentry": "òdblokòwôł $1",
+       "block-log-flags-anononly": "leno anonimòwi",
        "block-log-flags-nocreate": "blokada ùsôdzaniô kònta",
+       "block-log-flags-noemail": "zablokòwónô adresa e-mail",
        "lockbtn": "Zascëgôj bazã pòdôwków",
        "move-page-legend": "Przeniesë starnã",
        "movepagetext": "Z pòmòcą ùiższegò fòrmùlôra zjinaczisz miono starnë, przenosząc równoczasno ji historëjã.\nPòd stôrim titlã bãdze ùsôdzonô przeczérowùjącô starna.\nMòżesz aùtomatno zaktualniac przeczérowania wskazëwôjące titel przed zjinaką.\nJeżlë nie wëbiérzesz ti òptacëji, ùgwësni sã pò przenieseniu starnë, czë nie òstałé ùsôdzoné [[Special:DoubleRedirects|dëbeltné]] abò [[Special:BrokenRedirects|zerwóné przeczérowania]].\nJes òdpòwiedzalny za to, abë lënczi dali robiłë tam dze mają.\n\nStarna '''ni''' bãdze przeniosłô, jeżlë starna ò nowim mionie ju je, chòba że je òna pùstô abò je przeczérowaniém ë mô pùstą historëjã edicëji.\nTo òznôczô, że lëchą òperacëjã zjinaczi miona mòże doprowôdzëc bezpieczno nazôd, zjinaczając nowé miono starnë nawczasniészą, ë że ni mòże nadpisac stranë chtërną ju dô.\n\n'''BÔCZËNK!'''\nTo mòże bëc drasticznô abò nieprzewidëwólnô zjinaka w przëtrôfkù pòpùlarnych starnów.\nÙgwësni sã co do skùtków ti òperacëji, niglë to zrobisz.",
        "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' nie mòże bëc brëkòwónô, temù że '''$wgUseDatabaseMessages''' je wëłączony.",
        "thumbnail-more": "Zwiszi",
        "import": "Impòrtëjë starnë",
-       "tooltip-pt-userpage": "Twòja starna brëkòwnika",
-       "tooltip-pt-mytalk": "Twòjô starna diskùsëji",
-       "tooltip-pt-preferences": "Mòje nastôwë",
+       "tooltip-pt-userpage": "{{GENDER:|Twòja}} starna brëkòwnika",
+       "tooltip-pt-mytalk": "{{GENDER:|Twòja}} starna diskùsje",
+       "tooltip-pt-anontalk": "Diskùsjô brëkòwnika dlô ti adresë IP",
+       "tooltip-pt-preferences": "{{GENDER:|Mòje}}nastôwë",
        "tooltip-pt-watchlist": "Lësta artiklów jaczé òbzérôsz za zmianama",
-       "tooltip-pt-mycontris": "Lësta twòjich edicëjów",
+       "tooltip-pt-mycontris": "Lësta {{GENDER:|twòjich}} edicji",
+       "tooltip-pt-anoncontribs": "Lësta edicji, jaczé bëłë zrobióné spòd ti adresë IP.",
        "tooltip-pt-login": "Rôczimë do wlogòwaniô sã, nie je to równak mùszebné.",
        "tooltip-pt-logout": "Wëlogòwanié",
-       "tooltip-ca-talk": "Diskùsëjô zamkłoscë ti starnë",
-       "tooltip-ca-edit": "Mòżesz editowac nã starnã.\nProszã brëkòwac knąpë pòdzérkù przed zapisaniém.",
+       "tooltip-pt-createaccount": "Zachãcëwómë do ùsadzeniô kònta i wlogòwaniô, chòc nie je to òbrzészk.",
+       "tooltip-ca-talk": "Diskùsjô zamkłoscë ti starnë",
+       "tooltip-ca-edit": "Edituj nã starnã.",
        "tooltip-ca-addsection": "Zrëszë nowi dzél",
        "tooltip-ca-viewsource": "Na starna je zazychrowónô.\nMòżesz òbaczëc ji zdrój.",
        "tooltip-ca-history": "Stôrszé wersëje ti starnë",
        "tooltip-search": "Szëkba {{SITENAME}}",
        "tooltip-search-go": "Biéj do starnë z akùratno taczim mionã, jeżlë takô je",
        "tooltip-search-fulltext": "Szëkba za wpisónym tesktã na starnach",
-       "tooltip-n-mainpage": "Òbôczë przédną starnã",
+       "tooltip-p-logo": "Òbaczë przédną starnã",
+       "tooltip-n-mainpage": "Òbaczë przédną starnã",
        "tooltip-n-mainpage-description": "Biéj do przédny starnë",
        "tooltip-n-portal": "Ò ti ùdbie, co mòżesz zrobic, co a gdze mòżesz nalezc.",
        "tooltip-n-currentevents": "Dobëjë spódkòwą wëdowiédzã ò slédnych wëdarzeniach",
        "tooltip-t-recentchangeslinked": "Slédné zjinaczi na starnach, do chtërnëch na starna lënkùje",
        "tooltip-feed-rss": "Pòwrózk RSS dlô ti starnë",
        "tooltip-feed-atom": "Pòwrôzk Atom dlô ti starnë",
-       "tooltip-t-contributions": "Wëskrzëni lëstã edicëji negò brëkòwnika",
+       "tooltip-t-contributions": "Wëskrzëni lëstã edicji {{GENDER:$1|negò brëkòwnika|ti brëkòwniczczi}}",
        "tooltip-t-emailuser": "Wëslë e-mail do tegò brëkòwnika",
        "tooltip-t-upload": "Wladëjë lopczi",
        "tooltip-t-specialpages": "Lësta specjalnëch starnów",
        "tooltip-t-permalink": "Prosti lënk do ti wersëji starnë",
        "tooltip-ca-nstab-main": "Wëskrzëni starnã zamkłoscë",
        "tooltip-ca-nstab-user": "Wëskrzëni starnã brëkòwnika",
-       "tooltip-ca-nstab-special": "To je specjlanô starna, chtërny ni mòżesz editowac",
+       "tooltip-ca-nstab-special": "To je specjalnô starna, chtërny ni mòżesz editowac",
        "tooltip-ca-nstab-project": "Òbôczë starnã ùdbë",
        "tooltip-ca-nstab-image": "Wëskrzëni starnã lopka",
        "tooltip-ca-nstab-template": "Wëskrzëni szablónã",
        "othercontribs": "Òpiarté na prôcë $1.",
        "others": "jiné",
        "spamprotectiontitle": "Anti-spamòwi filter",
+       "pageinfo-toolboxlink": "Jinfòrmacje ò ti starnie.",
        "previousdiff": "← Pòprzédnô edicëjô",
        "nextdiff": "Nôslédnô edicëjô →",
        "imagemaxsize": "Ògrańczë na starnie òpisënkù òbrôzków jich miarã do:",
        "file-info-size": "$1 × $2 pikslów, miara lopka: $3, ôrt MIME: $4",
        "file-nohires": "Felëje wikszô miara.",
        "svg-long-desc": "Lopk SVG, nominalno $1 × $2 pikslów, miara lopka: $3",
-       "show-big-image": "Fùl miara",
+       "show-big-image": "Pierwòszny lopk",
        "newimages": "Galerëjô nowich lopków",
        "ilsubmit": "Szëkôj",
        "bydate": "wedle datumù",
        "metadata-help": "Nen lopk zamëkô w se dodôwną wëdowiédzã, prôwdopòdobno dodóné przez cyfrową kamerã abò skaner ùżëti do ùsôdzeniô abò digitalizacëji.\nJeżlë lopk bëł mòdifikòwóny, pòdôwczi mògą bëc w dzéłu nierówné z paramétrama przerôbionegò lopka.",
        "metadata-expand": "Wëskrzëni detale",
        "metadata-collapse": "Zatacë detale",
-       "metadata-fields": "Wëskrzënioné niżi pòla EXIF bãdą widzawné na starnie graficzi.\nJinszé pòla bãdą domëslno zataconé.\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": "Wëskrzënioné niżi pòla metadanëch bãdą widzawné na starnie graficzi.\nJinszé pòla bãdą domëslno zataconé.\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-source": "Zdrój",
        "exif-languagecode": "Jãzëk",
        "exif-iimcategory-spo": "Szpòrt",
        "watchlisttools-raw": "Editëjë sërą lëstã",
        "version": "Wersëjô",
        "specialpages": "Specjalné starnë",
+       "tags-create-reason": "Przëczëna:",
+       "tags-delete-reason": "Przëczëna:",
+       "tags-activate-reason": "Przëczëna:",
+       "tags-deactivate-reason": "Przëczëna:",
+       "logentry-delete-delete": "$1 {{GENDER:$2|rëmnął|rëmnãła}} starnã $3",
        "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ë",
        "special-characters-group-greek": "Grecczi",
index 1ef05f9..455195f 100644 (file)
        "passwordreset-emaildisabled": "Analluogwyd offer e-bost ar y wici hwn.",
        "passwordreset-username": "Eich enw defnyddiwr:",
        "passwordreset-domain": "Parth:",
-       "passwordreset-capture": "Gweld yr e-bost a gaiff ei anfon?",
-       "passwordreset-capture-help": "Os y ticiwch y blwch hwn, bydd yr e-bost (gyda'r cyfrinair dros dro) yn cael ei ddangos i chi yn ogystal a chael ei anfon at y defnyddiwr.",
        "passwordreset-email": "Eich cyfeiriad e-bost:",
        "passwordreset-emailtitle": "Manylion eich cyfrif ar {{SITENAME}}",
        "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.",
        "saveprefs": "Cadw",
        "restoreprefs": "Adfer yr holl osodiadau diofyn (ymhob adran)",
        "prefs-editing": "Golygu",
-       "rows": "Rhesi:",
-       "columns": "Colofnau:",
        "searchresultshead": "Chwilio",
        "stub-threshold": "Trothwy ar gyfer fformatio cyswllt egin ($1):",
        "stub-threshold-sample-link": "sampl",
        "userrights-reason": "Rheswm:",
        "userrights-no-interwiki": "Nid yw'r gallu ganddoch i newid galluoedd defnyddwyr ar wicïau eraill.",
        "userrights-nodatabase": "Nid yw'r bas data $1 yn bod neu nid yw'n un lleol.",
-       "userrights-nologin": "Rhaid i chi [[Special:UserLogin|fewngofnodi]] ar gyfrif gweinyddwr er mwyn pennu galluoedd defnyddwyr.",
-       "userrights-notallowed": "Nid oes ganiatâd priodol gennych i ychwanegu neu dynnu hawliau defnyddwyr.",
        "userrights-changeable-col": "Grwpiau y gallwch eu newid",
        "userrights-unchangeable-col": "Grwpiau na allwch eu newid",
        "userrights-conflict": "Gwrthdaro oherwydd newid i hawliau defnyddiwr! Adolygwch eich newidiadau a'u cadarnhau.",
-       "userrights-removed-self": "Rydych wedi rhoi'r gorau i'ch galluoedd. Gan hynny, ni allwch gyrchu'r ddalen hon bellach.",
        "group": "Grŵp:",
        "group-user": "Defnyddwyr",
        "group-autoconfirmed": "Defnyddwyr wedi eu cadarnhau'n awtomatig",
        "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-passwordreset": "Gweld e-byst sy'n ailosod cyfrinair",
        "right-managechangetags": "Creu a dileu [[Special:Tags|tagiau]] o'r gronfa ddata",
        "grant-group-email": "Danfon ebost",
        "grant-basic": "Hawliau sylfaenol",
        "uploaddisabledtext": "Analluogwyd uwchlwytho ffeiliau ar y wefan hon.",
        "php-uploaddisabledtext": "Anablwyd uwchlwytho ffeiliau yn PHP.\nGwiriwch y gosodiad ar file_uploads.",
        "uploadscripted": "Mae'r ffeil hon yn cynnwys HTML neu sgript a all achosi problemau i borwyr gwe.",
-       "uploadscriptednamespace": "Mae'r ffeil SVG hon yn cynnwys yr enw '$1' sy'n enw annilys ar barth",
+       "uploadscriptednamespace": "Mae'r ffeil SVG hon yn cynnwys yr enw '<nowiki>$1</nowiki>' sy'n enw annilys ar barth",
        "uploadinvalidxml": "Ni ellid dosrannu'r XML yn y ffeil a uwchlwythwyd.",
        "uploadvirus": "Mae firws gan y ffeil hon! Manylion: $1",
        "uploadjava": "Ffeil ZIP yw hwn sy'n cynnwys ffeil Java .class.\nNi chaniateir uwchlwytho ffeiliau Java, oherwydd y gallant osgoi cyfyngiadau diogelwch.",
        "feedback-thanks": "Diolch! Gosodwyd eich adborth ar y dudalen \"[$2 $1]\".",
        "searchsuggest-search": "Chwilio",
        "searchsuggest-containing": "yn cynnwys...",
-       "api-error-badaccess-groups": "Nid oes caniatad gennych i uwchlwytho ffeiliau ar y wici hwn.",
        "api-error-badtoken": "Gwall mewnol: tocyn gwael.",
-       "api-error-copyuploaddisabled": "Nid oes modd uwchlwytho drwy URL ar y gweinydd hwn",
-       "api-error-duplicate": "Mae {{PLURAL:$1||ffeil arall|ffeiliau eraill}} yn bodoli'n barod ar y wefan gyda'r un cynnwys.",
-       "api-error-duplicate-archive": "Fe fu {{PLURAL:$1|ffeil arall gyda'r un cynnwys ynddi|ffeiliau eraill gyda'r un cynnwys ynddynt}} ar y safle, ond fe'{{PLURAL:$1|i|u}} dilëwyd.",
-       "api-error-empty-file": "Mae'r ffeil a gyflwynwyd gennych yn wag.",
        "api-error-emptypage": "Ni chaniateir dechrau tudalen newydd, a honno'n wag.",
-       "api-error-fetchfileerror": "Gwall mewnol: aeth rhywbeth o'i le tra'n cywain y ffeil.",
-       "api-error-fileexists-forbidden": "Mae ffeil o'r enw \"$1\" ar gael yn barod, ac ni ellir ei throsysgrifo.",
-       "api-error-fileexists-shared-forbidden": "Mae ffeil o'r enw \"$1\" eisoes ar gael yn y storfa ffeiliau gyfrannol, ac ni ellir ei throsysgrifo.",
-       "api-error-file-too-large": "Mae'r ffeil a gyflwynwyd gennych yn rhy fawr.",
-       "api-error-filename-tooshort": "Mae enw'r ffeil yn rhy fyr.",
-       "api-error-filetype-banned": "Mae'r math hwn o ffeil wedi ei wahardd.",
-       "api-error-filetype-banned-type": "Ni chaniateir ffeiliau o'r {{PLURAL:$4|math|math|mathau}} $1.  $2 yw'r {{PLURAL:$3|math|math|mathau}} o ffeiliau a ganiateir.",
-       "api-error-filetype-missing": "Mae estyniad yn eisiau ar y ffeil.",
-       "api-error-hookaborted": "Cafodd y darpar newid ei derfynu gan estyniad.",
-       "api-error-http": "Gwall mewnol: ni ellir cysylltu â'r gweinydd.",
-       "api-error-illegal-filename": "Nid yw'r enw ffeil hwn yn cael ei ganiatáu.",
-       "api-error-internal-error": "Gwall mewnol: aeth rhywbeth o'i le wrth brosesu'ch uwchlwythiad ar y wici.",
-       "api-error-invalid-file-key": "Gwall mewnol: nid oedd modd dod o hyd i'r ffeil yn y storfa dros dro.",
-       "api-error-missingparam": "Gwall mewnol: paramedrau yn eisiau ar y cais.",
-       "api-error-missingresult": "Gwall mewnol: ni allem ddarganfod a lwyddodd y gwaith copïo ai pheidio.",
-       "api-error-mustbeloggedin": "Rhaid i chi fewngofnodi er mwyn uwchlwytho ffeiliau.",
-       "api-error-mustbeposted": "Gwall mewnol: mae angen HTTP POST ar y cais hwn.",
-       "api-error-noimageinfo": "Llwyddodd yr uwchlwytho, ond ni roddodd y gweinydd unrhyw wybodaeth i ni am y ffeil.",
-       "api-error-nomodule": "Gwall mewnol: nid oes pecyn uwchlwytho wedi ei osod yn y meddalwedd.",
-       "api-error-ok-but-empty": "Gwall mewnol: dim ymateb gan y gweinydd.",
-       "api-error-overwrite": "Ni chaniateir trosysgrifo ffeil sydd eisoes yn bod.",
-       "api-error-stashfailed": "Gwall mewnol: methodd y gweinydd â rhoi'r ffeil dros dro ar gadw.",
        "api-error-publishfailed": "Gwall mewnol: methodd y gweinydd â chyhoeddi'r ffeil dros dro.",
-       "api-error-stasherror": "Cafwyd gwall wrth uwchlwytho'r ffeil i'w gelcio.",
-       "api-error-stashedfilenotfound": "Methwyd a dod o hyd i'r ffeil a gadwyd pan ymdrechwyd i'w uwchlwytho.",
-       "api-error-stashpathinvalid": "Roedd y llwybr i'r ffeil a gadwyd yn wallus.",
-       "api-error-stashfilestorage": "Cafwyd gwall wrth geisio cadw'r ffeil.",
-       "api-error-stashzerolength": "Methodd ein gweinydda chadw'r ffeil, oherwydd nad oedd yn bodoli.",
-       "api-error-stashnotloggedin": "Mae;n hanfodol eich bod wedi mewngofnodi cyn y medrwch gadw ffeiliau.",
-       "api-error-stashwrongowner": "Nid eich heiddo chi mo'r ffeil y ceisiwch ei drin.",
-       "api-error-stashnosuchfilekey": "Dydy'r ffeil rydych yn ceisio'i gael yn y cuddfan celc ddim yn bodoli.",
-       "api-error-timeout": "Ni chafwyd ymateb gan y gweinydd mewn da bryd.",
-       "api-error-unclassified": "Cafwyd gwall anhysbys",
-       "api-error-unknown-code": "Gwall anhysbys: \"$1\"",
-       "api-error-unknown-error": "Gwall mewnol: aeth rhywbeth o'i le wrth geisio llwytho eich ffeil.",
+       "api-error-stashfailed": "Gwall mewnol: methodd y gweinydd â rhoi'r ffeil dros dro ar gadw.",
        "api-error-unknown-warning": "Rhybudd anhysbys: $1",
        "api-error-unknownerror": "Gwall anhysbys: \"$1\".",
-       "api-error-uploaddisabled": "Analluogwyd uwchlwytho ar y wici hwn.",
-       "api-error-verification-error": "Gallai'r ffeil hon fod wedi ei llygru, neu gall fod estyniad anghywir iddi.",
        "duration-seconds": "$1 {{PLURAL:$1|eiliad}}",
        "duration-minutes": "$1 {{PLURAL:$1|munud|munud|funud|munud|munud|munud}}",
        "duration-hours": "$1 {{PLURAL:$1|awr}}",
index df0b4e1..351ac32 100644 (file)
@@ -58,7 +58,8 @@
                        "Ribewiki",
                        "Jens Jensen",
                        "Nemo bis",
-                       "Anders Feder"
+                       "Anders Feder",
+                       "Jhertel"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "searcharticle": "Gå til",
        "history": "Historik",
        "history_short": "Historik",
+       "history_small": "historik",
        "updatedmarker": "opdateret siden seneste besøg",
        "printableversion": "Udskriftsvenlig udgave",
        "permalink": "Permanent henvisning",
        "talk": "Diskussion",
        "views": "Visninger",
        "toolbox": "Værktøjer",
+       "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",
        "createacct-yourpasswordagain-ph": "Indtast adgangskode igen",
        "userlogin-remembermypassword": "Husk mig",
        "userlogin-signwithsecure": "Brug sikker forbindelse",
+       "cannotlogin-title": "Kan ikke logge ind",
+       "cannotlogin-text": "Det er ikke muligt at logge ind.",
        "cannotloginnow-title": "Kan ikke logge ind på nuværende tidspunkt",
        "cannotloginnow-text": "Det er ikke muligt at logge på når du bruger $1.",
+       "cannotcreateaccount-title": "Kan ikke oprette konti",
+       "cannotcreateaccount-text": "Direkte kontooprettelse er ikke aktiveret på denne wiki.",
        "yourdomainname": "Dit domænenavn:",
        "password-change-forbidden": "Du kan ikke ændre adgangskoder på denne wiki.",
        "externaldberror": "Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.",
        "createaccountreason": "Begrundelse:",
        "createacct-reason": "Årsag",
        "createacct-reason-ph": "Hvorfor du vil oprette endnu en konto",
+       "createacct-reason-help": "Besked vist i kontooprettelsesloggen.",
        "createacct-submit": "Opret din konto",
        "createacct-another-submit": "Opret konto",
+       "createacct-continue-submit": "Fortsæt kontooprettelse",
+       "createacct-another-continue-submit": "Fortsæt kontooprettelse",
        "createacct-benefit-heading": "{{SITENAME}} laves af mennesker som dig.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "nocookiesnew": "Din brugerkonto er nu oprettet, men du er ikke logget på. {{SITENAME}} bruger cookies til at logge brugere på.\nDu har slået cookies fra. \nVær venlig at slå cookies til og log derefter på med dit nye brugernavn og adgangskode.",
        "nocookieslogin": "{{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Slå dem venligst til og prøv igen.",
        "nocookiesfornew": "Denne brugerkonto er ikke oprettet, da vi ikke kunne bekræfte dens kilde.\nSørg for, at du har aktivereret cookies, genindlæs siden og prøv igen.",
+       "createacct-loginerror": "Kontoen blev oprettet, men du kunne ikke blive logget ind automatisk. Fortsæt venligst til [[Special:UserLogin|manuel log ind]].",
        "noname": "Du har ikke angivet et gyldigt brugernavn.",
-       "loginsuccesstitle": "Du er nu logget på",
+       "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]].",
        "nosuchusershort": "Der er ingen bruger ved navn \"$1\". Tjek din stavning.",
        "passwordreset-emaildisabled": "E-mailfunktioner er slået fra på denne wiki.",
        "passwordreset-username": "Brugernavn:",
        "passwordreset-domain": "Domæne:",
-       "passwordreset-capture": "Se den resulterende e-mail?",
-       "passwordreset-capture-help": "Hvis du krydser dette felt af, vil e-mailen (med den midlertidige adgangskode) blive vist til dig i tillæg til at blive sendt til brugeren.",
        "passwordreset-email": "E-mailadresse:",
        "passwordreset-emailtitle": "Kontooplysninger på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "changeemail-password": "Din adgangskode til {{SITENAME}}:",
        "changeemail-submit": "Ændre e-mail",
        "changeemail-throttled": "Du har forsøgt at logge på for mange gange.\nVent venligst $1, før du prøver igen.",
+       "changeemail-nochange": "Angiv venligst en anden ny e-mailadresse.",
        "resettokens": "Nulstil nøgler",
        "resettokens-text": "Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.\n\nDu bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.",
        "resettokens-no-tokens": "Der er ingen nøgler at nulstille.",
        "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:",
-       "subject-preview": "Forhåndsvisning af emnet:",
+       "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.",
        "accmailtext": "En tilfældigt dannet adgangskode for [[User talk:$1|$1]] er sendt til $2. Den kan ændres på siden ''[[Special:ChangePassword|skift adgangskode]]'', når du logger på.",
        "newarticle": "(Ny)",
        "newarticletext": "Du har fulgt en henvisning til en side som endnu ikke findes.\nFor at oprette siden skal du begynde at skrive i boksen nedenfor\n(se [$1 hjælpesiden] for yderligere information).\nHvis du er her ved en fejl, så tryk på din browsers '''tilbage'''-knap.",
-       "anontalkpagetext": "---- ''Dette er en diskussionsside for en anonym bruger, der ikke har oprettet en konto endnu eller ikke bruger den.\nVi er derfor nødt til at bruge den numeriske IP-adresse til at identificere ham eller hende.\nEn IP-adresse kan være delt mellem flere brugere.\nHvis du er en anonym bruger og synes, at du har fået irrelevante kommentarer på sådan en side, så vær venlig at [[Special:CreateAccount|oprette en brugerkonto]] og [[Special:UserLogin|logge på]], så vi undgår fremtidige forvekslinger med andre anonyme brugere.''",
+       "anontalkpagetext": "----\n<em>Dette er en diskussionsside for en anonym bruger, der ikke har oprettet en konto endnu eller ikke bruger den.</em>\nVi er derfor nødt til at bruge den numeriske IP-adresse til at identificere vedkommende.\nEn sådan IP-adresse kan være delt mellem flere brugere.\nHvis du er en anonym bruger og synes, at irrelevante kommentarer er blevet rettet mod dig, så [[Special:CreateAccount|opret en brugerkonto]] eller [[Special:UserLogin|log på]] for at undgå fremtidige forvekslinger med andre anonyme brugere.",
        "noarticletext": "Der er i øjeblikket ikke nogen tekst på denne side.\nDu kan [[Special:Search/{{PAGENAME}}|søge efter sidenavnet]] på andre sider,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søge i relaterede logger]\neller [{{fullurl:{{FULLPAGENAME}}|action=edit}} oprette siden]</span>.",
        "noarticletext-nopermission": "Der er i øjeblikket ikke nogen tekst på denne side.\nDu kan [[Special:Search/{{PAGENAME}}|søge efter sidenavnet]] på andre sider,\neller <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søge i relaterede loglister]</span>,\nmen du har ikke tilladelse til at oprette denne side.",
        "missing-revision": "Revision #$1 af siden med navnet \"{{FULLPAGENAME}}\" eksisterer ikke.\n\nDette skyldes normalt at et forældet historik-link er fulgt til en side der er slettet.\nDetaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].",
        "userpage-userdoesnotexist": "Brugerkontoen \"<nowiki>$1</nowiki>\" findes ikke. Overvej om du ønsker at oprette eller redigere denne side.",
        "userpage-userdoesnotexist-view": "Brugerkontoen \"$1\" er ikke oprettet.",
        "blocked-notice-logextract": "Denne bruger er i øjeblikket blokeret.\nLoggen over den seneste blokering ses nedenfor:",
-       "clearyourcache": "'''Bemærk:''' Efter at have gemt er du måske nødt til at tømme din browsers cache for at kunne se ændringerne.\n* '''Firefox / Safari:''' Hold ''Shift'' nede og klik på ''Reload'', eller tryk enten ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på en Mac).\n* '''Google Chrome:''' Tryk ''Ctrl-Shift-R'' (''⌘-Shift-R'' på en Mac).\n* '''Internet Explorer:''' Hold ''Ctrl'' nede og klik på ''Refresh'' eller tryk på ''Ctrl-F5''.\n* '''Opera:''' Tøm cachen i ''Tools → Preferences''.",
+       "clearyourcache": "<strong>Bemærk:</strong> Efter at have gemt er du måske nødt til at tømme din browsers cache for at kunne se ændringerne.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> nede og klik på <em>Reload</em>, eller tryk enten <em>Ctrl-F5</em> eller <em>Ctrl-R</em> (<em>⌘-R</em> på en Mac).\n* <strong>Google Chrome:</strong> Tryk <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> på en Mac).\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> nede og klik på <em>Refresh</em>, eller tryk på <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>",
        "usercssyoucanpreview": "'''Tip:''' Brug \"{{int:showpreview}}\"-knappen for at teste dit nye CSS inden du gemmer.",
        "userjsyoucanpreview": "'''Tip:''' Brug \"{{int:showpreview}}\"-knappen for at teste dit nye JavaScript inden du gemmer.",
        "usercsspreview": "'''Husk at dette kun er en forhåndsvisning af dit eget css.\n'''Det er ikke gemt endnu!'''",
        "previewnote": "'''Husk at dette er kun en forhåndsvisning.'''\nDine ændringer er endnu ikke blevet gemt!",
        "continue-editing": "Gå til redigeringsfeltet",
        "previewconflict": "Denne forhåndsvisning er resultatet af den redigérbare tekst ovenfor, sådan vil det komme til at se ud hvis du vælger at gemme teksten.",
-       "session_fail_preview": "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.\nPrøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
-       "session_fail_preview_html": "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.'''\n\n''Da ren HTM er aktiveret i denne Wiki, er forhåndsvisningen blændet ud for at forebygge JavaScript-angreb.''\n\n'''Forsøg venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
+       "session_fail_preview": "Beklager! Vi kunne ikke behandle din redigering på grund af et tab af sessionsdata.\n\nDu er måske blevet logget ud. <strong>Kontroller venligst, at du stadig er logget ind, og prøv så igen</strong>.\nHvis det stadig ikke virker, så prøv at [[Special:UserLogout|logge ud]] og logge ind igen. Du kan også kontrollere, at din browser tillader cookies fra dette websted.",
+       "session_fail_preview_html": "Beklager! Vi kunne ikke behandle din redigering på grund af et tab af sessionsdata.\n\n<em>Fordi {{SITENAME}} har rå HTML aktiveret, er forhåndsvisningen skjult som en sikkerhedsforanstaltning mod JavaScript-angreb.</em>\n\n<strong>Hvis dette er et legitimt forsøg på redigere, så prøv venligst igen.</strong>\nHvis det stadig ikke virker, så prøv at [[Special:UserLogout|logge ud]] og logge ind igen. Du kan også kontrollere, at din browser tillader cookies fra dette websted.",
        "token_suffix_mismatch": "'''Din redigering er afvist, da din browser har forvansket tegnsætningen i redigeringskontrolfilen. Afvisningen sker for at forhindre utilsigtede ændringer i artiklen. Denne fejl opstår nogle gange, når du redigerer gennem en fejlprogrammeret webbaseret anonymiseringstjeneste.'''",
        "edit_form_incomplete": "'''Nogle dele af redigeringsformularen nåede ikke serveren; dobbelttjek, at redigeringerne er intakte, og prøv igen.'''",
        "editing": "Redigerer $1",
        "yourdiff": "Forskelle",
        "copyrightwarning": "Bemærk venligst at alle bidrag til {{SITENAME}} er at betragte som udgivne under $2 (se $1 for detaljer).\nHvis du ikke ønsker at din tekst skal udsættes for nådesløse redigeringer og at den kan blive kopieret efter forgodtbefindende, så skal du ikke placere den her.<br />\nDu lover os også, at du selv har forfattet teksten eller har kopieret den fra en public domain-kilde eller en tilsvarende fri kilde.\n'''Læg aldrig materiale her som er beskyttet af andres ophavsret uden deres tilladelse!'''",
        "copyrightwarning2": "Bemærk venligst at alle bidrag til {{SITENAME}} kan bearbejdes, ændres eller slettes af andre brugere.\nLæg ingen tekster ind, hvis du ikke kan acceptere at disse kan ændres.\n\nDu bekræfter hermed også, at du selv har skrevet denne tekst eller kopieret den fra en fri kilde (se $1 for detaljer).\n'''OVERFØR IKKE OPHAVSRETSLIGT BESKYTTET INDHOLD UDEN TILLADELSE!'''",
+       "editpage-cannot-use-custom-model": "Indholdsmodellen for denne side kan ikke ændres.",
        "longpageerror": "'''Fejl: Teksten, som du ville gemme, er {{PLURAL:$1|en kilobyte|$1 kilobytes}} stor, hvilket er mere end det tilladte maksimum på {{PLURAL:$2|en kilobyte|$2 kilobytes}}.'''\nDet er ikke muligt at gemme den.",
-       "readonlywarning": "'''Advarsel: Databasen er låst på grund af vedligeholdelse, så du kan ikke gemme dine ændringer lige nu.'''\nDet kan godt være en god ide at kopiere din tekst til en tekstfil, så du kan gemme den til senere.\n\nAdministratoren som låste databasen, gav denne forklaring: $1",
+       "readonlywarning": "<strong>Advarsel: Databasen er låst på grund af vedligeholdelse, så du kan ikke gemme dine ændringer lige nu.</strong>\nDet kan være en god idé at kopiere din tekst over i en tekstfil og gemme den til senere.\n\nAdministratoren, som låste databasen, gav denne forklaring: $1",
        "protectedpagewarning": "'''ADVARSEL: Denne side er skrivebeskyttet, så kun administratorer kan redigere den.'''<br />\nDen seneste logpost vises nedenfor:",
        "semiprotectedpagewarning": "'''Bemærk: Siden er låst, så kun registrerede brugere kan ændre den.'''\n<br />Den seneste logpost vises nedenfor:",
        "cascadeprotectedwarning": "<strong>Advarsel:</strong> Denne side er blevet beskyttet, så den kun kan ændres af brugere med administratorrettigheder, fordi indholdet er inkluderet i følgende {{PLURAL:$1|side|sider}} med nedarvet sidebeskyttelse:",
        "invalid-content-data": "Ugyldig indholdsdata",
        "content-not-allowed-here": "\"$1\" indhold er ikke tilladt på siden [[$2]]",
        "editwarning-warning": "Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.\nDenne advarsel kan slås fra under \"{{int:prefs-editing}}\" i dine indstillinger.",
+       "editpage-invalidcontentmodel-title": "Indholdsmodellen er ikke understøttet",
        "editpage-notsupportedcontentformat-title": "Indholdsformatet understøttes ikke",
        "editpage-notsupportedcontentformat-text": "Indholdsformatet $1 understøttes ikke af indholdsmodellen $2",
        "content-model-wikitext": "wikitekst",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tomt array",
+       "deprecated-self-close-category": "Sider, der bruger ugyldige, selvlukkende HTML-tags",
        "duplicate-args-category": "Sider der bruger samme argument mere end en gang i en skabelon",
        "duplicate-args-category-desc": "Siden indeholder en skabelon hvor et argument er brugt mere end en gang, som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Advarsel: Der er for mange beregningstunge oversætter-funktionskald på denne side.\n\nDer bør være færre end {{PLURAL:$2|$2 kald}}, lige nu er der {{PLURAL:$1|$1 kald}}.",
        "search-interwiki-caption": "Søsterprojekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mere)",
+       "search-interwiki-more-results": "flere resultater",
        "search-relatedarticle": "Relateret",
        "searchrelated": "relateret",
        "searchall": "alle",
        "saveprefs": "Gem indstillinger",
        "restoreprefs": "Gendan alle standardindstillinger (i alle sektioner)",
        "prefs-editing": "Redigering",
-       "rows": "Rækker",
-       "columns": "Kolonner",
        "searchresultshead": "Søgeresultater",
        "stub-threshold": "Grænse før formatering af stublink ($1):",
        "stub-threshold-disabled": "Deaktiveret",
        "youremail": "Din e-mailadresse:",
        "username": "{{GENDER:$1|Brugernavn}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} af {{PLURAL:$1|gruppen|grupperne}}:",
+       "group-membership-link-with-expiry": "$1 (indtil $2)",
        "prefs-registration": "Registreringstidspunkt:",
        "yourrealname": "Dit rigtige navn:",
        "yourlanguage": "Sprog:",
        "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-lookup-user": "Administrér brugergrupper",
+       "userrights-lookup-user": "Vælg en bruger",
        "userrights-user-editname": "Skriv et brugernavn:",
-       "editusergroup": "Redigér {{GENDER:$1|brugergrupper}}",
+       "editusergroup": "Indlæs brugergrupper",
        "editinguser": "Ændrer brugerrettigheder for {{GENDER:$1|brugeren}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Redigér brugergrupper",
+       "userrights-editusergroup": "Redigér {{GENDER:$1|brugergrupper}}",
        "saveusergroups": "Gem {{GENDER:$1|brugergrupper}}",
        "userrights-groupsmember": "Medlem af:",
        "userrights-groupsmember-auto": "Implicit medlem af:",
        "userrights-reason": "Årsag:",
        "userrights-no-interwiki": "Du har ikke tilladelse til at redigere brugerrettigheder på andre wikier.",
        "userrights-nodatabase": "Databasen $1 eksisterer ikke lokalt.",
-       "userrights-nologin": "Du skal [[Special:UserLogin|logge på]] med en administrativ konto, før du kan ændre brugerrettigheder.",
-       "userrights-notallowed": "Du har ikke tilladelse til at tilføje eller fjerne brugerrettigheder.",
        "userrights-changeable-col": "Redigerbare grupper",
        "userrights-unchangeable-col": "Uredigerbare grupper",
+       "userrights-expiry-current": "Udløber $1",
+       "userrights-expiry-none": "Udløber ikke",
        "userrights-conflict": "Konflikt i ændringer af brugerrettigheder!\nVær venlig at gennemse og bekræft dine ændringer.",
-       "userrights-removed-self": "Du har fjernet dine egne rettigheder. Du har derfor ikke længere adgang til denne side.",
        "group": "Gruppe:",
        "group-user": "Brugere",
        "group-autoconfirmed": "Registrerede brugere",
        "right-createpage": "Oprette andre sider end diskussionssider",
        "right-createtalk": "Oprette diskussionssider",
        "right-createaccount": "Oprette nye brugere",
+       "right-autocreateaccount": "Log automatisk ind med en ekstern brugerkonto",
        "right-minoredit": "Markere redigeringer som mindre",
        "right-move": "Flytte sider",
        "right-move-subpages": "Flytte sider og undersider",
        "right-siteadmin": "Låse og frigive databasen",
        "right-override-export-depth": "Eksportere sider inkl. henviste sider op til en dybde på 5",
        "right-sendemail": "Sende e-mail til andre brugere",
-       "right-passwordreset": "Se e-mails til nulstilling af adgangskoder",
-       "right-managechangetags": "Oprette og slette [[Special:Tags|tags]] fra databasen",
+       "right-managechangetags": "Opret og (de)aktivér [[Special:Tags|tags]]",
        "right-applychangetags": "Tilføje [[Special:Tags|tags]] sammen med ens ændringer",
        "right-changetags": "Tilføje og fjerne vilkårlige [[Special:Tags|tags]] for enkelte versioner og logposter",
+       "right-deletechangetags": "Slet [[Special:Tags|tags]] fra databasen",
+       "grant-generic": "Rettighedspakke \"$1\"",
+       "grant-group-page-interaction": "Interagere med sider",
+       "grant-group-file-interaction": "Interagere med medier",
+       "grant-group-watchlist-interaction": "Interagere med din overvågningsliste",
+       "grant-group-email": "Sende e-mail",
+       "grant-group-high-volume": "Udføre højvolumenaktivitet",
+       "grant-group-customization": "Tilpasning og indstillinger",
+       "grant-group-administration": "Udføre administrative handlinger",
+       "grant-group-private-information": "Tilgå private oplysninger om dig",
+       "grant-group-other": "Diverse aktivitet",
+       "grant-blockusers": "Blokering og ophævelse af blokering af brugere",
+       "grant-createaccount": "Oprette af konti",
+       "grant-createeditmovepage": "Oprette, redigere og flytte sider",
+       "grant-delete": "Slette sider, revisioner og logposter",
+       "grant-editinterface": "Redigere MediaWiki-navnerummet og bruger-CSS/JavaScript",
+       "grant-editmycssjs": "Redigere din bruger-CSS/JavaScript",
+       "grant-editmyoptions": "Redigere dine brugerindstillinger",
+       "grant-editmywatchlist": "Redigere din overvågningsliste",
+       "grant-editpage": "Redigere eksisterende sider",
+       "grant-editprotected": "Redigere beskyttede sider",
+       "grant-highvolume": "Højvolumen-redigering",
+       "grant-oversight": "Skjule brugere og undertrykke revisioner",
+       "grant-patrol": "Patruljere sideændringer",
+       "grant-privateinfo": "Tilgå private oplysninger",
+       "grant-protect": "Beskytte og fjerne beskyttelsen af sider",
+       "grant-rollback": "Tilbagerulle ændringer til sider",
+       "grant-sendemail": "Sende e-mail til andre brugere",
+       "grant-uploadeditmovefile": "Uploade, udskifte og flytte filer",
+       "grant-uploadfile": "Uploade nye filer",
+       "grant-basic": "Grundlæggende rettigheder",
+       "grant-viewdeleted": "Se slettede filer og sider",
+       "grant-viewmywatchlist": "Se din overvågningsliste",
+       "grant-viewrestrictedlogs": "Vise adgangsbeskyttede logposter",
        "newuserlogpage": "Brugeroprettelseslog",
        "newuserlogpagetext": "Dette er en log over de senest oprettede brugere.",
        "rightslog": "Rettighedslog",
        "action-createpage": "oprette denne side",
        "action-createtalk": "oprette denne diskussionsside",
        "action-createaccount": "Oprette denne brugerkonto",
+       "action-autocreateaccount": "automatisk at oprette denne eksterne brugerkonto",
        "action-history": "se historik for denne side",
        "action-minoredit": "markere denne redigering som mindre",
        "action-move": "flytte denne side",
        "action-upload_by_url": "lægge denne fil op fra en URL-adresse",
        "action-writeapi": "bruge skrive-API'et",
        "action-delete": "slette denne side",
-       "action-deleterevision": "slette denne version",
-       "action-deletedhistory": "se denne sides slettede historik",
+       "action-deleterevision": "slette siderevisioner",
+       "action-deletedhistory": "se en sides slettede historik",
        "action-browsearchive": "søge i slettede sider",
-       "action-undelete": "gendanne denne side",
-       "action-suppressrevision": "se og gendanne denne skjulte version",
+       "action-undelete": "gendanne sider",
+       "action-suppressrevision": "se og gendanne skjulte siderevisioner",
        "action-suppressionlog": "se denne private log",
        "action-block": "blokere denne bruger fra at redigere",
        "action-protect": "ændre på beskyttelsen af denne side",
        "action-userrights-interwiki": "ændre brugerrettigheder for brugere på andre wikier",
        "action-siteadmin": "låse eller låse databasen op",
        "action-sendemail": "sende e-mail",
+       "action-editmyoptions": "ændre dine indstillinger",
        "action-editmywatchlist": "rediger din overvågningsliste",
        "action-viewmywatchlist": "se din overvågningsliste",
        "action-viewmyprivateinfo": "se din private information",
        "action-editmyprivateinfo": "rediger dine private oplysninger",
        "action-editcontentmodel": "redigere indholdsmodellen for en side",
-       "action-managechangetags": "oprette og slette tags fra databasen",
+       "action-managechangetags": "oprette og (de)aktivere tags",
        "action-applychangetags": "tilføje tags sammen med dine ændringer",
        "action-changetags": "tilføje og fjerne vilkårlige tags for enkelte versioner og logposter",
+       "action-deletechangetags": "slette tags fra databasen",
+       "action-purge": "rense denne side",
        "nchanges": "$1 {{PLURAL:$1|ændring|ændringer}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|siden sidste besøg}}",
        "enhancedrc-history": "historik",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|listen over nye sider]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Vis",
+       "rcfilters-activefilters": "Aktive filtre",
+       "rcfilters-invalid-filter": "Ugyldigt filter",
+       "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfarne brugere",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
        "rclistfrom": "Vis nye ændringer startende fra den $3 kl. $2",
        "rcshowhideminor": "$1 mindre ændringer",
        "recentchangeslinked-page": "Sidenavn:",
        "recentchangeslinked-to": "Vis ændringer i sider der henviser til den angivne side i stedet",
        "recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] og [[Special:WhatLinksHere/$1|{{PLURAL:$2|én side|$2 sider}}]] tilføjet til kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] tilføjet til kategorien, [[Special:WhatLinksHere/$1|denne side er inkluderet i andre sider]]",
+       "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
        "upload": "Læg en fil op",
        "uploadbtn": "Læg en fil op",
        "reuploaddesc": "Tilbage til formularen til at lægge filer op.",
        "uploaddisabledtext": "Oplægning af filer er deaktiveret.",
        "php-uploaddisabledtext": "Oplægning af filer er forhindret i PHP. Tjek indstillingen for file_uploads.",
        "uploadscripted": "Denne fil indeholder HTML eller script-kode, der i visse tilfælde can fejlfortolkes af en browser.",
-       "uploadscriptednamespace": "Denne SVG-fil indeholder et ulovligt navnerum \"$1\"",
+       "uploadscriptednamespace": "Denne SVG-fil indeholder et ulovligt navnerum \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML i den uploadede fil kunne ikke tolkes.",
        "uploadvirus": "Denne fil indeholder en virus! Virusnavn: $1",
        "uploadjava": "Denne fil er en ZIP-fil, der indeholder en Java .class-fil.\nDet er ikke tilladt at uploade Javafiler, da det kan forårsage, at sikkerhedsrestriktioner bliver sprunget over.",
        "uploadstash-badtoken": "Udførelse af handlingen mislykkedes, måske fordi dine redigerings legitimationsoplysninger udløbet. Prøv igen.",
        "uploadstash-errclear": "Rydning af filerne mislykkedes.",
        "uploadstash-refresh": "Opdatér filoversigten",
+       "uploadstash-thumbnail": "vis miniature",
        "invalid-chunk-offset": "Ugyldig segmentstart",
        "img-auth-accessdenied": "Adgang nægtet",
        "img-auth-nopathinfo": "PATH_INFO mangler.\nDin server er ikke sat op til at give denne information.\nDen bruger måske CGI og understøtter ikke img_auth.\nSe https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "protectedpages-performer": "Beskyttende bruger",
        "protectedpages-params": "Beskyttelsesparametre",
        "protectedpages-reason": "Årsag",
+       "protectedpages-submit": "Vis sider",
        "protectedpages-unknown-timestamp": "Ukendt",
        "protectedpages-unknown-performer": "Ukendt bruger",
        "protectedtitles": "Beskyttede sidenavne",
        "protectedtitles-summary": "Denne side indeholder en liste over titler, der i øjeblikket er beskyttet fra oprettelse. For en liste over eksisterende sider, der er beskyttet, se [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Der er ingen sidetitler der er beskyttet med disse parametre.",
+       "protectedtitles-submit": "Vis sidetitler",
        "listusers": "Brugerliste",
        "listusers-editsonly": "Vis kun brugere med redigeringer",
        "listusers-creationsort": "Sorter efter oprettelsesdato",
        "apisandbox-unfullscreen": "Vis side",
        "apisandbox-submit": "Lav forespørgsel",
        "apisandbox-reset": "Ryd",
+       "apisandbox-retry": "Forsøg igen",
        "apisandbox-examples": "Eksempler",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parameternavn",
        "apisandbox-results": "Resultater",
        "apisandbox-request-url-label": "Forespurgt URL:",
        "apisandbox-request-time": "Forespørgselstid: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-continue": "Fortsæt",
+       "apisandbox-continue-clear": "Ryd",
+       "apisandbox-multivalue-all-namespaces": "$1 (alle navnerum)",
+       "apisandbox-multivalue-all-values": "$1 (alle værdier)",
        "booksources": "Bogkilder",
        "booksources-search-legend": "Søgning efter bøger",
        "booksources-search": "Søg",
        "booksources-text": "Dette er en liste med henvisninger til Internetsider, som sælger nye og brugte bøger. Der kan der også findes yderligere informationer om bøgerne. {{SITENAME}} er ikke forbundet med nogen af dem.",
        "booksources-invalid-isbn": "Det angivne ISBN-nummer ser forkert ud. Tjek med kilden om det er skrevet korrekt.",
+       "magiclink-tracking-rfc": "Sider, der bruger automatiske RFC-henvisninger‎",
+       "magiclink-tracking-pmid": "Sider, der bruger automatiske PMID-henvisninger‎",
+       "magiclink-tracking-isbn": "Sider, der bruger automatiske ISBN-henvisninger",
        "specialloguserlabel": "Udført af:",
        "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:brugernavn for bruger):",
        "log": "Loglister",
        "log-title-wildcard": "Søg i titler som begynder med teksten",
        "showhideselectedlogentries": "Vis/skjul de markerede loghændelser",
        "log-edit-tags": "Rediger tags i valgte logposter",
+       "checkbox-select": "Vælg: $1",
        "checkbox-all": "Alle",
        "checkbox-none": "Ingen",
        "allpages": "Alle sider",
        "enotif_subject_created": "{{SITENAME}} side $1 er blevet oprettet af {{gender:$2|$2}}",
        "enotif_subject_moved": "{{SITENAME}} side $1 er blevet flyttet af {{gender:$2|$2}}",
        "enotif_subject_restored": "{{SITENAME}} side $1 er blevet gendannet af {{gender:$2|$2}}",
-       "enotif_subject_changed": "{{SITENAME}} side $1 er blevet ændret af {{gender:$2|$2}}",
+       "enotif_subject_changed": "{{SITENAME}}-side $1 er blevet ændret af {{gender:$2|$2}}",
        "enotif_body_intro_deleted": "{{SITENAME}}siden $1 er blevet slettet $PAGEEDITDATE af {{gender:$2|$2}}, se $3.",
        "enotif_body_intro_created": "{{SITENAME}} siden $1 er blevet oprettet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
        "enotif_body_intro_moved": "{{SITENAME}} siden $1 er blevet flyttet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle revision.",
        "enotif_body_intro_restored": "{{SITENAME}} siden $1 er blevet gendannet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
-       "enotif_body_intro_changed": "{{SITENAME}} siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
-       "enotif_lastvisited": "Se $1 for alle ændringer siden dit sidste besøg.",
-       "enotif_lastdiff": "Se $1 for at vise denne ændring.",
+       "enotif_body_intro_changed": "{{SITENAME}}-siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
+       "enotif_lastvisited": "Gå til $1 for at se alle ændringer siden dit sidste besøg.",
+       "enotif_lastdiff": "Gå til $1 for at se denne ændring.",
        "enotif_anon_editor": "anonym bruger $1",
-       "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.\n\n         Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvågningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvågningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n$HELPPAGE",
+       "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.\n\n         Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail-meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvågningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvågningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n$HELPPAGE",
        "created": "oprettet",
        "changed": "ændret",
        "deletepage": "Slet side",
        "sessionfailure-title": "Sessionsfejl",
        "sessionfailure": "Der lader til at være et problem med din loginsession; denne handling blev annulleret som en sikkerhedsforanstaltning mod kapring af sessionen. Tryk på \"tilbage\"-knappen og genindlæs den side du kom fra, og prøv dernæst igen.",
        "changecontentmodel-title-label": "Sidetitel",
+       "changecontentmodel-model-label": "Ny indholdsmodel",
        "changecontentmodel-reason-label": "Begrundelse:",
        "protectlogpage": "Skrivebeskyttelseslog",
        "protectlogtext": "Herunder er en liste over ændringer til sidebeskyttelser.\nSe [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sidebeskyttelser, der er i kraft i øjeblikket.",
        "sp-contributions-newbies-title": "Brugerbidrag fra nye konti",
        "sp-contributions-blocklog": "blokeringslog",
        "sp-contributions-suppresslog": "undertrykte brugerbidrag",
-       "sp-contributions-deleted": "slettede brugerbidrag",
+       "sp-contributions-deleted": "slettede {{GENDER:$1|brugerbidrag}}",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "loglister",
        "sp-contributions-talk": "diskussion",
        "sp-contributions-username": "IP-adresse eller brugernavn:",
        "sp-contributions-toponly": "Vis kun redigeringer, der er aktuelle versioner",
        "sp-contributions-newonly": "Vis kun redigeringer, der er sideoprettelser",
+       "sp-contributions-hideminor": "Skjul mindre ændringer",
        "sp-contributions-submit": "Søg",
        "whatlinkshere": "Hvad henviser hertil",
        "whatlinkshere-title": "Sider der linker til \"$1\"",
        "ipb-unblock": "Frigive IP-adresse/bruger",
        "ipb-blocklist": "Vis alle blokeringer som er i kraft",
        "ipb-blocklist-contribs": "Bidrag fra {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 tilbage",
        "unblockip": "Ophæv blokering af bruger",
        "unblockiptext": "Brug formularen herunder for at gendanne skriveadgangen for en tidligere blokeret IP-adresse eller bruger.",
        "ipusubmit": "Ophæv blokeringen",
        "movenotallowedfile": "Du har ikke tilladelse til at flytte filer.",
        "cant-move-user-page": "Du har ikke tilladelse til at flytte brugersider (bortset fra undersider).",
        "cant-move-to-user-page": "Du har ikke tilladelse til at flytte brugersider (bortset fra til brugerundersider).",
+       "namespace-nosubpages": "Navnerummet \"$1\" tillader ikke undersider.",
        "newtitle": "Ny titel:",
        "move-watch": "Overvåg siden",
        "movepagebtn": "Flyt side",
        "thumbnail-temp-create": "Kunne ikke oprette midlertidig miniaturefil",
        "thumbnail-dest-create": "Kunne ikke gemme miniaturebillede til destinationen",
        "thumbnail_invalid_params": "Ugyldige parametre for miniaturebillede",
+       "thumbnail_toobigimagearea": "Fil med mål større end $1",
        "thumbnail_dest_directory": "Kataloget kan ikke oprettes.",
        "thumbnail_image-type": "Billedtypen understøttes ikke",
        "thumbnail_gd-library": "Ufuldstændig konfiguration af GD-biblioteket: funktionen $1 mangler",
        "tooltip-ca-nstab-category": "Se kategorisiden",
        "tooltip-minoredit": "Marker dette som en mindre ændring",
        "tooltip-save": "Gem dine ændringer",
+       "tooltip-publish": "Offentliggør dine ændringer",
        "tooltip-preview": "Forhåndsvis dine ændringer, brug venligst denne funktion inden du gemmer!",
        "tooltip-diff": "Vis hvilke ændringer du har lavet i teksten.",
        "tooltip-compareselectedversions": "Se forskellene imellem de to valgte versioner af denne side.",
        "patrol-log-page": "Kontrollog",
        "patrol-log-header": "Patruljerede versioner.",
        "log-show-hide-patrol": "$1 patruljeringslog",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Marker version $3 af $2 som patruljeret?",
        "deletedrevision": "Slettede gammel version $1",
        "filedeleteerror-short": "Fejl under sletning af fil: $1",
        "filedeleteerror-long": "Der opstod en fejl under sletningen af filen:\n\n$1",
        "exif-compression-6": "JPEG (gammel)",
        "exif-copyrighted-true": "Ophavsretligt beskyttet",
        "exif-copyrighted-false": "Status for ophavsret er ikke angivet",
+       "exif-photometricinterpretation-1": "Sort-hvid (sort er 0)",
        "exif-unknowndate": "Ukendt dato",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Horisontalt spejlet",
        "watchlistedit-raw-done": "Din overvågningsliste blev opdateret.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 side|$1 sider}} er tilføjet:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 side|$1 sider}} er fjernet:",
-       "watchlistedit-clear-title": "Ryddet overvågningsliste",
+       "watchlistedit-clear-title": "Ryd overvågningsliste",
        "watchlistedit-clear-legend": "Ryd overvågningsliste",
        "watchlistedit-clear-explain": "Alle siderne vil blive fjernet fra din overvågningsliste",
        "watchlistedit-clear-titles": "Sider:",
        "watchlisttools-edit": "Rediger overvågningsliste",
        "watchlisttools-raw": "Rediger rå overvågningsliste",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussion]])",
+       "timezone-local": "Lokal",
        "duplicate-defaultsort": "Advarsel: Standardsorteringsnøglen \"$2\" tilsidesætter den tidligere sorteringsnøgle \"$1\".",
        "version": "Information om MediaWiki",
        "version-extensions": "Installerede udvidelser",
        "tags-actions-header": "Handlinger",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nej",
-       "tags-source-extension": "Defineret af en tilføjelse",
+       "tags-source-extension": "Defineret af programmellet",
        "tags-source-none": "Anvendes ikke længere",
        "tags-edit": "redigér",
        "tags-delete": "slet",
        "htmlform-cloner-delete": "Fjern",
        "htmlform-cloner-required": "Der kræves mindst en værdi.",
        "htmlform-date-placeholder": "ÅÅÅÅ-MM-DD",
+       "htmlform-time-placeholder": "TT:MM:SS",
+       "htmlform-datetime-placeholder": "ÅÅÅÅ-MM-DD TT:MM:SS",
+       "htmlform-title-not-exists": "$1 findes ikke.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettede}} omdirigering $3 ved overskrivning",
        "logentry-delete-restore": "$1 {{GENDER:$2|gendannede}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4",
        "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",
        "feedback-bugcheck": "Skønt! Men tjek venligst, at det ikke er en af de [$1 kendte fejl].",
        "feedback-thanks-title": "Tak!",
        "searchsuggest-search": "Søg på {{SITENAME}}",
        "searchsuggest-containing": "indeholder...",
-       "api-error-badaccess-groups": "Du har ikke tilladelse til at overføre filer til denne wiki.",
        "api-error-badtoken": "Intern fejl: ugyldigt mærke.",
-       "api-error-copyuploaddisabled": "At lægge filer op via hjemmesideadresser er slået fra på denne server.",
-       "api-error-duplicate": "Der er allerede {{PLURAL:$1|en anden fil|nogle andre filer}} med samme indhold på webstedet.",
-       "api-error-duplicate-archive": "Der var allerede {{PLURAL:$1|en anden fil|nogle andre filer}} med samme indhold på webstedet, men {{PLURAL:$1|den|de}} blev slettet.",
-       "api-error-empty-file": "Den fil du indsendte var tom.",
        "api-error-emptypage": "Det er ikke tilladt at oprette nye, tomme sider.",
-       "api-error-fetchfileerror": "Intern fejl: noget gik galt under hentningen af filen.",
-       "api-error-fileexists-forbidden": "En fil med navnet \"$1\" findes allerede, og den kan ikke overskrives.",
-       "api-error-fileexists-shared-forbidden": "En fil med navnet \"$1\" eksisterer allerede i det delte filsystem og kan ikke overskrives.",
-       "api-error-file-too-large": "Den fil du indsendte var for stor.",
-       "api-error-filename-tooshort": "Filnavnet er for kort.",
-       "api-error-filetype-banned": "Denne type fil er ikke tilladt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|er ikke en tilladt filtype|er ikke tilladte filtyper}}. Tilladt {{PLURAL:$3|filtype er|filtyper er}} $2.",
-       "api-error-filetype-missing": "Filen mangler en filendelse.",
-       "api-error-hookaborted": "Ændringen, du forsøgte at gøre, blev afbrudt af en udvidelsestilkobling.",
-       "api-error-http": "Intern fejl: Kan ikke forbinde til serveren.",
-       "api-error-illegal-filename": "Filnavnet er ikke tilladt.",
-       "api-error-internal-error": "Intern fejl: noget gik galt med behandlingen af din filoplægning på wikien.",
-       "api-error-invalid-file-key": "Intern fejl: filen blev ikke fundet på den midlertidige lagerplads.",
-       "api-error-missingparam": "Intern fejl: manglende parametre i anmodning.",
-       "api-error-missingresult": "Intern fejl: kunne ikke afgøre om kopieringen lykkedes.",
-       "api-error-mustbeloggedin": "Du skal være logget på for at kunne lægge filer op.",
-       "api-error-mustbeposted": "Intern fejl: anmodningen kræver brug af HTTP POST.",
-       "api-error-noimageinfo": "Oplægningen lykkedes, men serveren gav os ikke nogen oplysninger om filen.",
-       "api-error-nomodule": "Intern fejl: intet modul til oplægning indstillet.",
-       "api-error-ok-but-empty": "Intern fejl: intet svar fra serveren.",
-       "api-error-overwrite": "Det er ikke tilladt at overskrive en eksisterende fil.",
-       "api-error-stashfailed": "Intern fejl: serveren kunne ikke gemme midlertidig fil.",
        "api-error-publishfailed": "Intern fejl: serveren kunne ikke udgive midlertidig fil.",
-       "api-error-timeout": "Serveren svarede ikke tilbage inden for den forventede tid.",
-       "api-error-unclassified": "En ukendt fejl opstod.",
-       "api-error-unknown-code": "Ukendt fejl: \"$1\"",
-       "api-error-unknown-error": "Intern fejl: noget gik galt under forsøget på at lægge din fil op.",
-       "api-error-unknown-warning": "Ukendt advarsel: $1",
+       "api-error-stashfailed": "Intern fejl: serveren kunne ikke gemme midlertidig fil.",
+       "api-error-unknown-warning": "Ukendt advarsel: \"$1\".",
        "api-error-unknownerror": "Ukendt fejl: \"$1\".",
-       "api-error-uploaddisabled": "Oplægning af filer er slået fra på denne wiki.",
-       "api-error-verification-error": "Denne fil kan være beskadiget, eller den har måske en forkert filendelse.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunder}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minutter}}",
        "duration-hours": "$1 {{PLURAL:$1|time|timer}}",
        "expand_templates_generate_xml": "Vis analysetræ som XML",
        "expand_templates_generate_rawhtml": "Vis rå HTML",
        "expand_templates_preview": "Forhåndsvisning",
-       "pagelanguage": "Valg af sidesprog",
+       "pagelanguage": "Ændr sidens sprog",
        "pagelang-name": "Side",
        "pagelang-language": "Sprog",
        "pagelang-use-default": "Brug standardsprog",
        "pagelang-select-lang": "Vælg sprog",
+       "pagelang-reason": "Begrundelse",
        "right-pagelang": "Ændre sidesproget",
        "mediastatistics": "Mediestatistik",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-type",
        "mediastatistics-table-extensions": "Mulige filendelser",
        "mediastatistics-table-count": "Antal filer",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "side eksisterer ikke endnu",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Tilføj en kategori...",
        "randomrootpage": "Tilfældig stamside",
        "log-action-filter-block": "Blokeringstype:",
+       "log-action-filter-delete": "Sletningstype:",
+       "log-action-filter-import": "Importtype:",
        "log-action-filter-move": "Flyttetype:",
        "log-action-filter-patrol": "Patruljeringstype:",
        "log-action-filter-protect": "Beskyttelsestype:",
+       "log-action-filter-all": "Alle",
        "log-action-filter-block-block": "Blokering",
        "log-action-filter-block-reblock": "Ændring af blokering",
+       "log-action-filter-block-unblock": "Ophævelse af blokering",
        "log-action-filter-delete-delete": "Sidesletning",
+       "log-action-filter-delete-delete_redir": "Overskrivning af omdirigering",
        "log-action-filter-delete-restore": "Sidegendannelse",
        "log-action-filter-delete-event": "Logsletning",
        "log-action-filter-delete-revision": "Revisionssletning",
        "log-action-filter-move-move": "Flytning uden overskrivelse af omdirigeringer",
        "log-action-filter-move-move_redir": "Flytning med overskrivelse af omdirigeringer",
+       "log-action-filter-newusers-autocreate": "Automatisk oprettelse",
        "log-action-filter-patrol-patrol": "Manuel patruljering",
        "log-action-filter-patrol-autopatrol": "Automatisk patruljering",
        "log-action-filter-protect-protect": "Beskyttelse",
        "log-action-filter-protect-unprotect": "Fjernede beskyttelse",
        "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
        "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
-       "edit-error-short": "Fejl: $1"
+       "cannotauth-not-allowed-title": "Adgang nægtet",
+       "cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side",
+       "credentialsform-account": "Kontonavn:"
 }
index 26392b5..0b9d677 100644 (file)
        "searcharticle": "Seite",
        "history": "Versionen",
        "history_short": "Versionsgeschichte",
+       "history_small": "Versionsgeschichte",
        "updatedmarker": "Änderung seit deinem letzten Besuch",
        "printableversion": "Druckversion",
        "permalink": "Permanenter Link",
        "views": "Ansichten",
        "toolbox": "Werkzeuge",
        "tool-link-userrights": "{{GENDER:$1|Benutzergruppen}} ändern",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Benutzergruppen}} ansehen",
        "tool-link-emailuser": "E-Mail an {{GENDER:$1|diesen Benutzer|diese Benutzerin}} senden",
        "userpage": "Benutzerseite anzeigen",
        "projectpage": "Projektseite anzeigen",
        "passwordreset-emaildisabled": "Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.",
        "passwordreset-username": "Benutzername:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Die E-Mail-Nachricht ansehen?",
-       "passwordreset-capture-help": "Wenn du dieses Kästchen ankreuzt, wird die E-Mail-Nachricht mit dem temporären Passwort sowohl dir angezeigt als auch dem Benutzer zugesandt.",
        "passwordreset-email": "E-Mail-Adresse:",
        "passwordreset-emailtitle": "Benutzerkontoinformationen auf {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Zurücksetzung deines 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.\nDu solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht länger ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
        "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporäres Passwort: \n$2",
        "passwordreset-emailsentemail": "Falls diese E-Mail-Adresse mit deinem Benutzerkonto verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
        "passwordreset-emailsentusername": "Falls es eine E-Mail-Adresse gibt, die mit diesem Benutzernamen verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
-       "passwordreset-emailsent-capture2": "Die Passwort-Zurücksetzungs-{{PLURAL:$1|E-Mail wurde|E-Mails wurden}} versandt. {{PLURAL:$1|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird hier angezeigt.",
-       "passwordreset-emailerror-capture2": "Das Senden der E-Mail an {{GENDER:$2|den Benutzer|die Benutzerin}} ist fehlgeschlagen: $1 {{PLURAL:$3|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird hier angezeigt.",
        "passwordreset-nocaller": "Es muss ein Rufer angegeben werden",
        "passwordreset-nosuchcaller": "Rufer ist nicht vorhanden: $1",
        "passwordreset-ignored": "Die Passwortzurücksetzung konnte nicht verarbeitet werden. Vielleicht wurde kein Dienstanbieter konfiguriert?",
        "blockedtitle": "Benutzer ist gesperrt",
        "blockedtext": "'''Dein Benutzername oder deine IP-Adresse wurde gesperrt.'''\n\nDie Sperrung wurde vom Administrator $1 durchgeführt.\nAls Grund wurde ''$2'' angegeben.\n\n* Beginn der Sperre: $8\n* Ende der Sperre: $6\n* Sperre betrifft: $7\n\nDu kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\nDu kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.\nDeine aktuelle IP-Adresse ist $3 und die Sperrkennung lautet $5.\nBitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
        "autoblockedtext": "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.\nAls Grund wurde angegeben:\n\n:''$2''\n\n* Beginn der Sperre: $8\n* Ende der Sperre: $6\n* Sperre betrifft: $7\n\nDu kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\n\nDu kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.\n\nDeine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.\nBitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
+       "systemblockedtext": "Dein Benutzername oder deine IP-Adresse wurde von MediaWiki automatisch gesperrt.\nDer angegebene Grund ist:\n\n:<em>$2</em>\n\n* Beginn der Sperre: $8\n* Ablauf der Sperre: $6\n* Sperre betrifft: $7\n\nDeine aktuelle IP-Adresse ist $3.\nBitte gib alle oben stehenden Details in jeder Anfrage an.",
        "blockednoreason": "keine Begründung angegeben",
        "whitelistedittext": "Du musst dich $1, um Seiten bearbeiten zu können.",
        "confirmedittext": "Du musst deine E-Mail-Adresse erst bestätigen, bevor du Bearbeitungen durchführen kannst. Bitte ergänze und bestätige deine E-Mail in den [[Special:Preferences|Einstellungen]].",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
        "contentmodelediterror": "Du kannst diese Version nicht bearbeiten, da das Inhaltsmodell <code>$1</code> vom aktuellen Inhaltsmodell der Seite <code>$2</code> abweicht.",
        "recreate-moveddeleted-warn": "<strong>Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.</strong>\n\nBitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.\nZu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
-       "moveddeleted-notice": "Diese Seite wurde gelöscht. Zur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
-       "moveddeleted-notice-recent": "Leider wurde diese Seite kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information wird das Lösch- und Verschiebungs-Logbuch für die Seite unten angezeigt.",
+       "moveddeleted-notice": "Diese Seite wurde gelöscht.\nZur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
+       "moveddeleted-notice-recent": "Diese Seite wurde kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
        "log-fulllog": "Alle Logbucheinträge ansehen",
        "edit-hook-aborted": "Die Bearbeitung wurde ohne Erklärung durch eine Schnittstelle abgebrochen.",
        "edit-gone-missing": "Die Seite konnte nicht aktualisiert werden.\nSie wurde anscheinend gelöscht.",
        "search-interwiki-caption": "Schwesterprojekte",
        "search-interwiki-default": "Ergebnisse von $1:",
        "search-interwiki-more": "(weitere)",
+       "search-interwiki-more-results": "Weitere Ergebnisse",
        "search-relatedarticle": "Verwandte",
        "searchrelated": "verwandt",
        "searchall": "alle",
        "search-external": "Externe Suche",
        "searchdisabled": "Die {{SITENAME}}-Suche ist deaktiviert. Du kannst unterdessen mit Google suchen. Bitte bedenke, dass der Suchindex von {{SITENAME}} veraltet sein kann.",
        "search-error": "Bei der Suche ist ein Fehler aufgetreten: $1",
+       "search-warning": "Beim Suchen ist eine Warnung aufgetreten: $1",
        "preferences": "Einstellungen",
        "mypreferences": "Einstellungen",
        "prefs-edits": "Anzahl der Bearbeitungen:",
        "saveprefs": "Einstellungen speichern",
        "restoreprefs": "Standardeinstellungen wiederherstellen (in allen Abschnitten)",
        "prefs-editing": "Bearbeiten",
-       "rows": "Zeilen:",
-       "columns": "Spalten:",
        "searchresultshead": "Suche",
        "stub-threshold": "Linkformatierung kleiner Seiten ($1):",
        "stub-threshold-sample-link": "Beispiel",
        "prefs-help-recentchangescount": "Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.",
        "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|kannst du ihn zurücksetzen]].",
        "savedprefs": "Deine Einstellungen wurden gespeichert.",
-       "savedrights": "Die Benutzerrechte von {{GENDER:$1|$1}} wurden gespeichert.",
+       "savedrights": "Die Benutzergruppen von {{GENDER:$1|$1}} wurden gespeichert.",
        "timezonelegend": "Zeitzone:",
        "localtime": "Ortszeit:",
        "timezoneuseserverdefault": "Standardzeit dieses Wikis nutzen ($1)",
        "username": "{{GENDER:$1|Benutzername}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglied}} der {{PLURAL:$1|Benutzergruppe|Benutzergruppen}}:",
        "prefs-memberingroups-type": "$2",
+       "group-membership-link-with-expiry": "$1 (bis $2)",
        "prefs-registration": "Anmeldezeitpunkt:",
        "prefs-registration-date-time": "$2, $3 Uhr",
        "yourrealname": "Bürgerlicher Name:",
        "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-lookup-user": "Gruppenzugehörigkeit verwalten",
+       "userrights-lookup-user": "Einen Benutzer auswählen",
        "userrights-user-editname": "Benutzername:",
-       "editusergroup": "{{GENDER:$1|Benutzergruppen}} verwalten",
+       "editusergroup": "Benutzergruppen laden",
        "editinguser": "Ändere Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Benutzer-Gruppenzugehörigkeit bearbeiten",
+       "viewinguserrights": "Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Gruppenzugehörigkeit {{GENDER:$1|des Benutzers|der Benutzerin}} bearbeiten",
+       "userrights-viewusergroup": "{{GENDER:$1|Benutzergruppen}} ansehen",
        "saveusergroups": "{{GENDER:$1|Gruppenzugehörigkeit}} ändern",
        "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 nichtmarkiertes 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).",
+       "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-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-nologin": "Du musst dich mit einem Administrator-Benutzerkonto [[Special:UserLogin|anmelden]], um Benutzerrechte zu ändern.",
-       "userrights-notallowed": "Du verfügst nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.",
        "userrights-changeable-col": "Gruppenzugehörigkeit, die du ändern kannst",
        "userrights-unchangeable-col": "Gruppenzugehörigkeit, die du nicht ändern kannst",
+       "userrights-expiry-current": "Ablauf: $1",
+       "userrights-expiry-none": "Kein Ablauf",
+       "userrights-expiry": "Ablauf:",
+       "userrights-expiry-existing": "Vorhandener Ablauf: $3, $2",
+       "userrights-expiry-othertime": "Andere Zeit:",
+       "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-conflict": "Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.",
-       "userrights-removed-self": "Du hast deine eigenen Rechte entfernt. Du kannst nicht länger auf diese Seite zugreifen.",
        "group": "Gruppe:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Automatisch bestätigte Benutzer",
        "right-siteadmin": "Datenbank sperren und entsperren",
        "right-override-export-depth": "Exportiere Seiten einschließlich verlinkter Seiten bis zu einer Tiefe von 5",
        "right-sendemail": "E-Mails an andere Benutzer senden",
-       "right-passwordreset": "Passwort eines Benutzers zurücksetzen und die dazu verschickte E-Mail einsehen",
        "right-managechangetags": "[[Special:Tags|Markierungen]] erstellen und (de)aktivieren",
        "right-applychangetags": "[[Special:Tags|Markierungen]] zusammen mit den Änderungen anwenden",
        "right-changetags": "Beliebige [[Special:Tags|Markierungen]] zu einzelnen Versionen und Logbucheinträgen hinzufügen und entfernen",
        "action-writeapi": "die API mit Schreibzugriffen zu verwenden",
        "action-delete": "Seiten zu löschen",
        "action-deleterevision": "Versionen zu löschen",
+       "action-deletelogentry": "Logbucheinträge zu löschen",
        "action-deletedhistory": "die Liste der gelöschten Versionen zu sehen",
+       "action-deletedtext": "gelöschten Versionstext anzusehen",
        "action-browsearchive": "nach gelöschten Seiten zu suchen",
-       "action-undelete": "die Seite wiederherzustellen",
-       "action-suppressrevision": "die versteckte Version einzusehen und wiederherzustellen",
+       "action-undelete": "Seiten wiederherzustellen",
+       "action-suppressrevision": "versteckte Versionen einzusehen und wiederherzustellen",
        "action-suppressionlog": "das private Logbuch einzusehen",
        "action-block": "den Benutzer zu sperren",
        "action-protect": "den Schutzstatus von Seiten zu ändern",
        "action-userrights-interwiki": "die Rechte von Benutzern in anderen Wikis zu ändern",
        "action-siteadmin": "die Datenbank zu sperren oder freizugeben",
        "action-sendemail": "E-Mails zu senden",
+       "action-editmyoptions": "deine Einstellungen zu bearbeiten",
        "action-editmywatchlist": "deine Beobachtungsliste zu bearbeiten",
        "action-viewmywatchlist": "deine Beobachtungsliste anzusehen",
        "action-viewmyprivateinfo": "deine privaten Informationen einzusehen",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Anzeigen",
+       "rcfilters-activefilters": "Aktive Filter",
+       "rcfilters-restore-default-filters": "Standardfilter wiederherstellen",
+       "rcfilters-clear-all-filters": "Alle Filter löschen",
+       "rcfilters-search-placeholder": "Letzte Änderungen filtern (durchsuchen oder beginne mit der Eingabe)",
+       "rcfilters-invalid-filter": "Ungültiger Filter",
+       "rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
+       "rcfilters-filterlist-title": "Filter",
+       "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
+       "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
+       "rcfilters-filterlist-noresults": "Keine Filter gefunden",
+       "rcfilters-filtergroup-registration": "Benutzerregistrierung",
+       "rcfilters-filter-registered-label": "Angemeldet",
+       "rcfilters-filter-registered-description": "Angemeldete Autoren.",
+       "rcfilters-filter-unregistered-label": "Unangemeldet",
+       "rcfilters-filter-unregistered-description": "Autoren, die nicht angemeldet sind.",
+       "rcfilters-filtergroup-authorship": "Bearbeitungs-Autorenschaft",
+       "rcfilters-filter-editsbyself-label": "Deine eigenen Bearbeitungen",
+       "rcfilters-filter-editsbyself-description": "Bearbeitungen von dir.",
+       "rcfilters-filter-editsbyother-label": "Bearbeitungen von anderen",
+       "rcfilters-filter-editsbyother-description": "Bearbeitungen von anderen Benutzern (nicht von dir).",
+       "rcfilters-filtergroup-userExpLevel": "Erfahrungsniveau (nur für angemeldete Benutzer)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Neulinge",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Weniger als 10 Bearbeitungen und eine Aktivität von weniger als 4 Tagen.",
+       "rcfilters-filter-userExpLevel-learner-label": "Anfänger",
+       "rcfilters-filter-userExpLevel-learner-description": "Eine Aktivität von mehreren Tagen und mehr Bearbeitungen als „Neulinge“, aber weniger als „Erfahrene Benutzer“.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfahrene Benutzer",
+       "rcfilters-filter-userExpLevel-experienced-description": "Eine Aktivität von mehr als 30 Tagen und mehr als 500 Bearbeitungen.",
+       "rcfilters-filtergroup-automated": "Automatisierte Beiträge",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Bearbeitungen, die von automatisierten Werkzeugen durchgeführt wurden.",
+       "rcfilters-filter-humans-label": "Mensch (kein Bot)",
+       "rcfilters-filter-humans-description": "Bearbeitungen, die von menschlichen Autoren durchgeführt wurden.",
+       "rcfilters-filtergroup-significance": "Bedeutung",
+       "rcfilters-filter-minor-label": "Kleine Änderungen",
+       "rcfilters-filter-minor-description": "Bearbeitungen, die der Autor als geringfügig markiert hat.",
+       "rcfilters-filter-major-label": "Nicht-kleine Änderungen",
+       "rcfilters-filter-major-description": "Bearbeitungen, die nicht als geringfügig markiert wurden.",
+       "rcfilters-filtergroup-changetype": "Typ der Änderung",
+       "rcfilters-filter-pageedits-label": "Seitenbearbeitungen",
+       "rcfilters-filter-pageedits-description": "Änderungen am Wikiinhalt oder an Diskussionen, Kategoriebeschreibungen …",
+       "rcfilters-filter-newpages-label": "Seitenerstellungen",
+       "rcfilters-filter-newpages-description": "Bearbeitungen, die zu neuen Seiten führen.",
+       "rcfilters-filter-categorization-label": "Kategorieänderungen",
+       "rcfilters-filter-categorization-description": "Einträge von Seiten, die zu Kategorien hinzugefügt oder aus ihnen entfernt wurden.",
+       "rcfilters-filter-logactions-label": "Protokollierte Aktionen",
+       "rcfilters-filter-logactions-description": "Administrative Aktionen, Benutzerkontenerstellungen, Seitenlöschungen, hochgeladene Dateien …",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "rcshowhideminor": "Kleine Änderungen $1",
        "uploaded-setting-handler-svg": "SVG, das das Attribut „handler“ mit Remote/Daten/Skript festlegt, ist gesperrt. <code>$1=\"$2\"</code> in der hochgeladenen SVG-Datei gefunden.",
        "uploaded-remote-url-svg": "SVG, das ein beliebiges Style-Attribut mit einer Remote-URL festlegt, ist gesperrt. <code>$1=\"$2\"</code> in der hochgeladenen SVG-Datei gefunden.",
        "uploaded-image-filter-svg": "Bildfilter mit der URL <code>&lt;$1 $2=\"$3\"&gt;</code> in der hochgeladenen SVG-Datei gefunden.",
-       "uploadscriptednamespace": "Diese SVG-Datei enthält den ungültigen Namensraum „$1“.",
+       "uploadscriptednamespace": "Diese SVG-Datei enthält den ungültigen Namensraum „<nowiki>$1</nowiki>“.",
        "uploadinvalidxml": "Das XML in der hochgeladenen Datei konnte nicht geparst werden.",
        "uploadvirus": "Diese Datei enthält einen Virus! Details: $1",
        "uploadjava": "Dies ist eine ZIP-Datei, die ein CLASS-Datei von Java enthält.\nDas Hochladen von Java-Dateien ist nicht gestattet, da sie die Umgehung von Sicherheitseinschränkungen ermöglichen könnten.",
        "uncategorizedcategories": "Nicht kategorisierte Kategorien",
        "uncategorizedimages": "Nicht kategorisierte Dateien",
        "uncategorizedtemplates": "Nicht kategorisierte Vorlagen",
+       "uncategorized-categories-exceptionlist": " # Enthält eine Liste der Kategorien, die nicht auf Spezial:Nicht_kategorisierte_Kategorien erwähnt werden sollen. Eine pro Zeile. Beginne mit „*“. Zeilen, die mit einem anderen Zeichen beginnen (inklusive Leerzeichen), werden ignoriert. Für Kommentare verwende „#“.",
        "unusedcategories": "Verwaiste Kategorien",
        "unusedimages": "Verwaiste Dateien",
        "wantedcategories": "Gewünschte Kategorien",
        "apisandbox-sending-request": "Sende API-Anfrage …",
        "apisandbox-loading-results": "Rufe API-Ergebnisse ab …",
        "apisandbox-results-error": "Beim Laden der API-Anfragenantwort ist ein Fehler aufgetreten: $1.",
+       "apisandbox-request-selectformat-label": "Anfragedaten anzeigen als:",
+       "apisandbox-request-format-url-label": "URL-Abfrage-Zeichenfolge",
        "apisandbox-request-url-label": "Anforderungs-URL:",
+       "apisandbox-request-json-label": "Anfragen-JSON:",
        "apisandbox-request-time": "Dauer der Anfrage: {{PLURAL:$1|Eine Millisekunde|$1 Millisekunden}}",
        "apisandbox-results-fixtoken": "Token korrigieren und erneut übertragen",
        "apisandbox-results-fixtoken-fail": "Der „$1“-Token konnte nicht abgerufen werden.",
        "apisandbox-continue-clear": "Löschen",
        "apisandbox-continue-help": "Mit „{{int:apisandbox-continue}}“ kann man die letzte Anfrage [https://www.mediawiki.org/wiki/API:Query#Continuing_queries fortfahren]; „{{int:apisandbox-continue-clear}}“ löscht fortsetzungsbezogene Parameter.",
        "apisandbox-param-limit": "Gib <kbd>max</kbd> ein, um das maximale Limit zu verwenden.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Alle Namensräume)",
+       "apisandbox-multivalue-all-values": "$1 (Alle Werte)",
        "booksources": "ISBN-Suche",
        "booksources-search-legend": "Suche nach Bezugsquellen für Bücher",
        "booksources-search": "Suchen",
        "emailccsubject": "Kopie deiner Nachricht an $1: $2",
        "emailsent": "E-Mail verschickt",
        "emailsenttext": "Deine E-Mail wurde verschickt.",
-       "emailuserfooter": "Diese E-Mail wurde von „$1“ an „{{GENDER:$2|$2}}“ durch die Funktion „{{int:emailuser}}“ bei {{SITENAME}} {{GENDER:$1|gesendet}}.",
+       "emailuserfooter": "Diese E-Mail wurde von „$1“ an „{{GENDER:$2|$2}}“ durch die Funktion „{{int:emailuser}}“ bei {{SITENAME}} {{GENDER:$1|gesendet}}. Falls {{GENDER:$2|du}} auf diese E-Mail antwortest, wird sie direkt an {{GENDER:$1|den Originalabsender|die Originalabsenderin}} gesendet. Dabei erfährt {{GENDER:$1|er|sie}} {{GENDER:$2|deine}} E-Mail-Adresse.",
        "usermessage-summary": "Systemnachricht gespeichert.",
        "usermessage-editor": "System-Messenger",
        "usermessage-template": "MediaWiki:Benutzernachricht",
        "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",
-       "rollback-success": "Die Änderungen von $1 wurden rückgängig gemacht und die letzte Version von $2 wurde wiederhergestellt.",
+       "rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.",
        "rollback-success-notify": "Bearbeitungen von $1 rückgängig gemacht;\nzurückgeändert auf die letzte Version von $2. [$3 Änderungen zeigen]",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte gehe zurück zur vorherigen Seite, lade sie erneut und versuche, den Vorgang erneut auszuführen.",
        "changecontentmodel-emptymodels-title": "Keine Inhaltsmodelle verfügbar",
        "changecontentmodel-emptymodels-text": "Der Inhalt auf [[:$1]] kann zu keinem Typ konvertiert werden.",
        "log-name-contentmodel": "Inhaltsmodell-Änderungs-Logbuch",
-       "log-description-contentmodel": "Ereignisse bezüglich den Inhaltsmodellen einer Seite",
+       "log-description-contentmodel": "Diese Seite listet Änderungen an dem Inhaltsmodell von Seiten auf sowie Seiten, die mit einem Inhaltsmodell erstellt wurden, das nicht dem Standard entspricht.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|erstellte}} die Seite $3 mit einem Nicht-Standard-Inhaltsmodell „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|änderte}} das Inhaltsmodell der Seite $3 von „$4“ nach „$5“",
        "logentry-contentmodel-change-revertlink": "zurücksetzen",
        "tooltip-whatlinkshere-invert": "Markiere dieses Kontrollkästchen, um Links von Seiten innerhalb des ausgewählten Namensraums auszublenden.",
        "namespace_association": "Zugehöriger Namensraum",
        "tooltip-namespace_association": "Dieses Auswahlfeld anklicken, um den deiner Auswahl zugehörigen Diskussionsnamensraum, oder im umgekehrten Fall, den zugehörigen Namensraum, mit einzubeziehen",
-       "blanknamespace": "(Seiten)",
+       "blanknamespace": "(Artikel)",
        "contributions": "{{GENDER:$1|Benutzerbeiträge}}",
        "contributions-title": "Benutzerbeiträge von „$1“",
        "mycontris": "Beiträge",
        "proxyblockreason": "Deine IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktiere deinen Internet-Provider oder deine Systemadministratoren und informiere sie über dieses mögliche Sicherheitsproblem.",
        "sorbsreason": "Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet.",
        "sorbs_create_account_reason": "Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet. Das Anlegen neuer Benutzer ist nicht möglich.",
+       "softblockrangesreason": "Anonyme Beiträge von deiner IP-Adresse ($1) sind nicht erlaubt. Bitte melde dich an.",
        "xffblockreason": "Eine IP-Adresse im X-Forwarded-For-Header wurde gesperrt, entweder deine oder die des benutzten Proxyservers. Der ursprüngliche Sperrgrund war: $1",
        "cant-see-hidden-user": "Der Benutzer, den du versuchst zu sperren, wurde bereits gesperrt und verborgen. Da du das „hideuser“-Recht nicht hast, kannst du die Benutzersperre nicht sehen und nicht bearbeiten.",
        "ipbblocked": "Du kannst keine anderen Benutzer sperren oder entsperren, da du selbst gesperrt bist",
        "cant-move-to-user-page": "Du hast nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).",
        "cant-move-category-page": "Du hast keine Berechtigung, um Kategorieseiten zu verschieben.",
        "cant-move-to-category-page": "Du hast keine Berechtigung, um eine Seite zu einer Kategorieseite zu verschieben.",
+       "cant-move-subpages": "Du hast keine Berechtigung, um Unterseiten zu verschieben.",
+       "namespace-nosubpages": "Der Namensraum „$1“ erlaubt keine Unterseiten.",
        "newtitle": "Neuer Titel:",
        "move-watch": "Quell- und Zielseite beobachten",
        "movepagebtn": "Seite verschieben",
        "movepage-page-exists": "Die Seite „$1“ ist bereits vorhanden und kann nicht automatisch überschrieben werden.",
        "movepage-page-moved": "Die Seite „$1“ wurde nach „$2“ verschoben.",
        "movepage-page-unmoved": "Die Seite „$1“ konnte nicht nach „$2“ verschoben werden.",
-       "movepage-max-pages": "Die Maximalanzahl von $1 {{PLURAL:$1|Seite|Seiten}} wurde verschoben, Alle weiteren Seiten können nicht automatisch verschoben werden.",
+       "movepage-max-pages": "Es wurde die Maximalanzahl von {{PLURAL:$1|einer Seite|$1 Seiten}} verschoben. Alle weiteren Seiten können nicht automatisch verschoben werden.",
        "movelogpage": "Verschiebungs-Logbuch",
        "movelogpagetext": "Dies ist eine Liste aller verschobenen Seiten.",
        "movesubpage": "{{PLURAL:$1|Unterseite|Unterseiten}}",
        "pageinfo-length": "Seitenlänge (in Bytes)",
        "pageinfo-article-id": "Seitenkennnummer",
        "pageinfo-language": "Seiteninhaltssprache",
+       "pageinfo-language-change": "ändern",
        "pageinfo-content-model": "Seiteninhaltsmodell",
        "pageinfo-content-model-change": "ändern",
        "pageinfo-robot-policy": "Indizierung durch Suchmaschinen",
        "htmlform-user-not-exists": "<strong>$1</strong> ist nicht vorhanden.",
        "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-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-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",
        "feedback-bugcheck": "Super! Bitte überprüfe noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.",
        "feedback-useragent": "User Agent:",
        "searchsuggest-search": "{{SITENAME}} durchsuchen",
        "searchsuggest-containing": "enthält …",
-       "api-error-autoblocked": "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem gesperrten Benutzer verwendet wurde.",
-       "api-error-badaccess-groups": "Du hast nicht die Berechtigung Dateien in dieses Wiki hochzuladen.",
        "api-error-badtoken": "Interner Fehler: Der Token ist fehlerhaft.",
-       "api-error-blocked": "Du wurdest für das Bearbeiten gesperrt.",
-       "api-error-copyuploaddisabled": "Das Hochladen via URL wurde auf diesem Server deaktiviert.",
-       "api-error-duplicate": "Es gibt im Wiki bereits {{PLURAL:$1|eine andere Datei|mehrere andere Dateien}} gleichen Inhalts.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war bereits eine andere Datei|waren bereits andere Dateien}} gleichen Inhalts vorhanden. Sie {{PLURAL:$1|wurde|wurden}} allerdings gelöscht.",
-       "api-error-empty-file": "Die hochgeladene Datei war leer.",
        "api-error-emptypage": "Es ist nicht erlaubt, neue leere Seiten zu erstellen.",
-       "api-error-fetchfileerror": "Interner Fehler: Beim Abrufen der Datei ist ein Fehler aufgetreten.",
-       "api-error-fileexists-forbidden": "Eine Datei namens „$1“ ist bereits vorhanden und kann nicht überschrieben werden.",
-       "api-error-fileexists-shared-forbidden": "Eine Datei namens „$1“ ist bereits im gemeinsamen Dateirepositorium vorhanden und kann daher nicht überschrieben werden.",
-       "api-error-file-too-large": "Die hochgeladene Datei war zu groß.",
-       "api-error-filename-tooshort": "Der Dateiname ist zu kurz.",
-       "api-error-filetype-banned": "Diese Dateiendung ist gesperrt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ist ein nicht zulässiger Dateityp|sind nicht zulässige Dateitypen}}. {{PLURAL:$3|Ein zulässiger Dateityp ist|Zulässige Dateitypen sind}} $2.",
-       "api-error-filetype-missing": "Die hochzuladende Datei hat keine Dateiendung.",
-       "api-error-hookaborted": "Der Versuch, die Änderung durchzuführen, wurde von einer Parsererweiterung (API) abgebrochen.",
-       "api-error-http": "Interner Fehler: Es konnte keine Verbindung zum Server hergestellt werden.",
-       "api-error-illegal-filename": "Der Dateiname ist nicht erlaubt.",
-       "api-error-internal-error": "Interner Fehler: Ein unbekannter Fehler ist beim Hochladen der Datei ins Wiki aufgetreten.",
-       "api-error-invalid-file-key": "Interner Fehler: Die Datei wurde nicht im temporären Speicher gefunden.",
-       "api-error-missingparam": "Interner Fehler: Der Anfrage fehlen Parameter.",
-       "api-error-missingresult": "Interner Fehler: Es konnte nicht festgestellt werden, ob das Kopieren erfolgreich war.",
-       "api-error-mustbeloggedin": "Um Dateien hochladen zu können, musst du angemeldet sein.",
-       "api-error-mustbeposted": "Es liegt ein Programmfehler vor (es wird die falsche HTTP-Methode verwendet).",
-       "api-error-noimageinfo": "Das Hochladen war erfolgreich, aber der Server kann keine Informationen zur Datei anzeigen.",
-       "api-error-nomodule": "Interner Fehler: Es wurde kein Modul zum Hochladen festgelegt.",
-       "api-error-ok-but-empty": "Interner Fehler: Der Server reagiert nicht.",
-       "api-error-overwrite": "Das Überschreiben einer vorhandenen Datei ist nicht erlaubt.",
-       "api-error-ratelimited": "Du versuchst, mehr Dateien in kurzer Zeit hochzuladen, als dieses Wiki erlaubt.\nBitte versuche es in einigen Minuten erneut.",
-       "api-error-stashfailed": "Interner Fehler: Der Server konnte keine temporäre Datei speichern.",
        "api-error-publishfailed": "Interner Fehler: Der Server konnte die temporäre Datei nicht veröffentlichen.",
-       "api-error-stasherror": "Beim Hochladen der Datei gab es einen Fehler.",
-       "api-error-stashedfilenotfound": "Die vorab gespeicherte Datei wurde beim Versuch, sie vom Speicher hochzuladen, nicht gefunden.",
-       "api-error-stashpathinvalid": "Der Pfad, unter dem die gespeicherte Datei gefunden werden sollte, war ungültig.",
-       "api-error-stashfilestorage": "Beim Speichern der Datei in den Speicher gab es einen Fehler.",
-       "api-error-stashzerolength": "Der Server konnte die Datei nicht speichern, da sie eine Länge von Null hat.",
-       "api-error-stashnotloggedin": "Du musst angemeldet sein, um Dateien in den Hochladespeicher zu speichern.",
-       "api-error-stashwrongowner": "Die Datei, auf die du im Speicher zugreifen möchtest, gehört nicht dir.",
-       "api-error-stashnosuchfilekey": "Der Dateischlüssel, auf den du im Speicher zugreifen möchtest, ist nicht vorhanden.",
-       "api-error-timeout": "Der Server hat nicht innerhalb der erwarteten Zeit reagiert.",
-       "api-error-unclassified": "Ein unbekannter Fehler ist aufgetreten.",
-       "api-error-unknown-code": "Unbekannter Fehler: „$1“",
-       "api-error-unknown-error": "Interner Fehler: Ein unbekannter Fehler ist beim Hochladen der Datei aufgetreten.",
-       "api-error-unknown-warning": "Unbekannte Warnung: $1",
+       "api-error-stashfailed": "Interner Fehler: Der Server konnte keine temporäre Datei speichern.",
+       "api-error-unknown-warning": "Unbekannte Warnung: „$1“.",
        "api-error-unknownerror": "Unbekannter Fehler: „$1“",
-       "api-error-uploaddisabled": "Das Hochladen ist in diesem Wiki deaktiviert.",
-       "api-error-verification-error": "Die hochzuladende Datei ist entweder fehlerhaft oder hat keine Dateinamenserweiterung.",
-       "api-error-was-deleted": "Eine Datei mit diesem Namen wurde kürzlich hochgeladen und anschließend gelöscht.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekunde|Sekunden}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minute|Minuten}}",
        "duration-hours": "$1 {{PLURAL:$1|Stunde|Stunden}}",
        "pagelang-language": "Sprache",
        "pagelang-use-default": "Standardsprache verwenden",
        "pagelang-select-lang": "Sprache auswählen",
+       "pagelang-reason": "Grund",
        "pagelang-submit": "Übermitteln",
+       "pagelang-nonexistent-page": "Die Seite $1 ist nicht vorhanden.",
+       "pagelang-unchanged-language": "Die Seite $1 ist bereits auf die Sprache $2 festgelegt.",
+       "pagelang-unchanged-language-default": "Die Seite $1 ist bereits auf die Standardinhaltssprache des Wikis festgelegt.",
+       "pagelang-db-failed": "Die Datenbank konnte die Seitensprache nicht ändern.",
        "right-pagelang": "Seitensprache ändern",
        "action-pagelang": "die Seitensprache zu ändern",
        "log-name-pagelang": "Sprachenänderungs-Logbuch",
        "mediastatistics-summary": "Statistiken über hochgeladene Dateitypen. Dies beinhaltet nur die aktuellste Version einer Datei. Alte oder gelöschte Dateiversionen sind ausgeschlossen.",
        "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3 %)",
-       "mediastatistics-bytespertype": "Gesamte Dateigröße für diesen Abschnitt: {{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3%).",
+       "mediastatistics-bytespertype": "Gesamte Dateigröße für diesen Abschnitt: {{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3 %).",
        "mediastatistics-allbytes": "Gesamte Dateigröße für alle Dateien: {{PLURAL:$1|Ein Byte|$1 Bytes}} ($2).",
        "mediastatistics-table-mimetype": "MIME-Typ",
        "mediastatistics-table-extensions": "Mögliche Erweiterungen",
        "mw-widgets-dateinput-no-date": "Kein Datum ausgewählt",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Nach Medien suchen",
+       "mw-widgets-mediasearch-noresults": "Keine Ergebnisse gefunden.",
        "mw-widgets-titleinput-description-new-page": "Seite ist noch nicht vorhanden",
        "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 …",
        "sessionmanager-tie": "Mehrere Anfrageauthentifikationstypen konnten nicht kombiniert werden: $1.",
        "sessionprovider-generic": "$1-Sitzungen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebasierten Sitzungen",
        "log-action-filter-contentmodel-change": "Inhaltsmodelländerung",
        "log-action-filter-contentmodel-new": "Erstellung einer Seite mit einem Nicht-Standard-Inhaltsmodell",
        "log-action-filter-delete-delete": "Seitenlöschung",
+       "log-action-filter-delete-delete_redir": "Überschreiben einer Weiterleitung",
        "log-action-filter-delete-restore": "Seitenwiederherstellung",
        "log-action-filter-delete-event": "Logbucheintrag-Löschung",
        "log-action-filter-delete-revision": "Versionslöschung",
        "usercssispublic": "Bitte beachten: CSS-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern eingesehen werden können.",
        "restrictionsfield-badip": "Ungültige IP-Adresse oder ungültiger IP-Adressbereich: $1",
        "restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
-       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Fehler: $1",
-       "edit-error-long": "Fehler:\n\n$1"
+       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
+       "revid": "Version $1",
+       "pageid": "Seitenkennung $1"
 }
index 61b3adc..5ce035d 100644 (file)
                        "Kumkumuk",
                        "Gırd",
                        "Velg",
-                       "1917 Ekim Devrimi"
+                       "1917 Ekim Devrimi",
+                       "Gambollar",
+                       "Dılmıc",
+                       "Archaeodontosaurus"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
-       "tog-hideminor": "Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne",
-       "tog-hidepatrolled": "Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne",
-       "tog-newpageshidepatrolled": "Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne",
+       "tog-hideminor": "Vırnayışanê peyênan ra vırnayışanê werdiyan bınımne",
+       "tog-hidepatrolled": "Vurnayışanê qontrol kerdeyan perra vurnayışê peyêni de bınımne",
+       "tog-newpageshidepatrolled": "Pelanê qontrol kerdeyan lista peranê  neweyan de bınımne",
        "tog-hidecategorization": "Pera kategorizasyoni bınımne",
        "tog-extendwatchlist": "Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê",
        "tog-usenewrc": "Vurnayışê ke pela vurnayışanê peyênan û lista seyrkerdışi derê inan grube ke.",
        "tog-watchrollback": "Pelê ke mı peyser ardi inan lista mına seyrkerdışi ke",
        "tog-minordefault": "Vurnayışanê xo pêrune ''vurnayışo qıckek'' nışan bıde",
        "tog-previewontop": "Verqayti pela nuştışi ser de bımocne",
-       "tog-previewonfirst": "Vurnayışo verên de verqayti tım bımocne",
+       "tog-previewonfirst": "Vurnayışo verên de verqayti tım bımotne",
        "tog-enotifwatchlistpages": "Jû pele ya ki dosyawa ke lista mına seyrkerdışi de vurnae, mı rê e-mail bırışe",
        "tog-enotifusertalkpages": "Pela mına werênayışi ke vurnayê mı rê e-poste bırışe",
        "tog-enotifminoredits": "Pelan de vurnayışanê qıckekan u dosyan de ki mı rê e-mail bırışe",
        "tog-enotifrevealaddr": "Adresa e-posteyê mı posteyê xeberan de bımocne",
-       "tog-shownumberswatching": "Amarê karberanê seyrkerdoğan bımocne",
+       "tog-shownumberswatching": "Amarê karberanê seyr kerdoğan bımotne",
        "tog-oldsig": "İmzaya mewcud:",
        "tog-fancysig": "İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)",
        "tog-uselivepreview": "Verqayto giyane bıgureyne",
        "tog-forceeditsummary": "Mı ke xulasa veng verdaye, hay a mı ser de",
-       "tog-watchlisthideown": "Vurnayışanê mı lista mına seyrkerdışi de bınımne",
-       "tog-watchlisthidebots": "Lista seyrkerdışi ra vurnayışanê boti bınımne",
-       "tog-watchlisthideminor": "Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne",
-       "tog-watchlisthideliu": "Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne",
+       "tog-watchlisthideown": "Vurnayışanê mı lista mına seyr kerdışi de bınımne",
+       "tog-watchlisthidebots": "Lista seyr kerdışi ra vurnayışanê boti bınımne",
+       "tog-watchlisthideminor": "Vurnayışanê qıckekan lista mına seyr kerdışi de bınımne",
+       "tog-watchlisthideliu": "Lista seyr kerdışi ra vurnayışanê karberanê cı kewteyan bınımne",
        "tog-watchlistreloadautomatically": "Filtra vıriyayış dı listey seyri otomatikman anewe kı",
-       "tog-watchlisthideanons": "Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne",
-       "tog-watchlisthidepatrolled": "Lista seyrkerdışi ra vurnayışanê qontrolkerdeyan bınımne",
+       "tog-watchlisthideanons": "Lista seyr kerdışi ra vurnayışanê karberanê anoniman bınımne",
+       "tog-watchlisthidepatrolled": "Lista seyr kerdışi ra vurnayışanê qontrol kerdeyan bınımne",
        "tog-watchlisthidecategorization": "Pera kategorizasyoni bınımne",
        "tog-ccmeonemails": "E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe",
-       "tog-diffonly": "Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê",
-       "tog-showhiddencats": "Kategoriyanê nımneya bıasne",
+       "tog-diffonly": "Zerrekê muhtevay, qıyasê versiyonan de tek ferqan bımocne",
+       "tog-showhiddencats": "Kategoriyanê nımneya bımotné",
        "tog-norollbackdiff": "Peyser ardışi ra dıme ferqi measne",
        "tog-useeditwarning": "Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de",
        "tog-prefershttps": "Ronışten akerden de tım greyo itimadın bıkarne",
        "underline-always": "Tım",
        "underline-never": "Qet",
-       "underline-default": "Cild ya zi cıgeyrayoğo hesebiyaye",
+       "underline-default": "Cild ya zi cı geyrayoğo hesebiyaye",
        "editfont-style": "Cayê vurnayışi de terzê nuştışi:",
-       "editfont-default": "Cıgeyrayoğo hesabiyaye",
-       "editfont-monospace": "Terzê nusteyê sabıtcagırewtoği",
+       "editfont-default": "Browsero standard",
+       "editfont-monospace": "Terzê nusteyê sabıt mesafi",
        "editfont-sansserif": "Fontê Sans-serifi",
        "editfont-serif": "Font (çêşıdê nuştey) Serif",
        "sunday": "Kırê",
@@ -85,7 +88,7 @@
        "tuesday": "Sêşeme",
        "wednesday": "Çarşeme",
        "thursday": "Pancşeme",
-       "friday": "Yene",
+       "friday": "Êne",
        "saturday": "Şeme",
        "sun": "Krê",
        "mon": "Dış",
        "fri": "Yen",
        "sat": "Şem",
        "january": "Çele",
-       "february": "Sıbate",
+       "february": "Sıbat",
        "march": "Adar",
-       "april": "Nisane",
-       "may_long": "Gulane",
+       "april": "Lisan",
+       "may_long": "Gulan",
        "june": "Heziran",
-       "july": "Temuze",
+       "july": "Temuz",
        "august": "Tebaxe",
        "september": "Keşkelun",
        "october": "Tışrino Verên",
        "november": "Tışrino Peyên",
-       "december": "Kanun",
+       "december": "Gağan",
        "january-gen": "Çele",
-       "february-gen": "Sıbate",
+       "february-gen": "Sıbat",
        "march-gen": "Adar",
-       "april-gen": "Nisane",
-       "may-gen": "Gulane",
+       "april-gen": "Lisan",
+       "may-gen": "Gulan",
        "june-gen": "Heziran",
-       "july-gen": "Temuze",
+       "july-gen": "Temuz",
        "august-gen": "Tebaxe",
        "september-gen": "Keşkelun",
        "october-gen": "Tışrino Verên",
        "november-gen": "Tışrino Peyên",
-       "december-gen": "Kanun",
+       "december-gen": "Gağan",
        "jan": "Çel",
        "feb": "Sbt",
        "mar": "Adr",
-       "apr": "Nsn",
+       "apr": "Lsn",
        "may": "Gln",
        "jun": "Hez",
        "jul": "Tmz",
        "sep": "Kşk",
        "oct": "Tşv",
        "nov": "Tşp",
-       "dec": "Kan",
+       "dec": "n",
        "january-date": "$1 Çele",
-       "february-date": "$1 Sıbate",
+       "february-date": "$1 Sıbat",
        "march-date": "$1 Adar",
-       "april-date": "$1 Nisane",
-       "may-date": "$1 Gulane",
+       "april-date": "$1 Lisan",
+       "may-date": "$1 Gulan",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "august-date": "$1 Tebaxe",
        "september-date": "$1 Keşkelun",
        "october-date": "$1 Tışrino Verên",
        "november-date": "$1 Tışrino Peyên",
-       "december-date": "$1 Kanun",
-       "period-am": "AM",
-       "period-pm": "PM",
+       "december-date": "$1 Gağan",
+       "period-am": "VD",
+       "period-pm": "BD",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" derê",
+       "category_header": "Perrê kategoriya \"$1\"'i",
        "subcategories": "Kategoriyê bınêni",
-       "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
-       "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
-       "hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
+       "category-media-header": "Dosye yê ke kategoriya \"$1\" dı",
+       "category-empty": "''Ena kategori dı hewna qet nuştey ya zi medya çıni yê.''",
+       "hidden-categories": "{{PLURAL:$1|Kategoriya nımıte|Kategoriyê nımıtey}}",
        "hidden-category-category": "Kategoriyê nımıtey",
        "category-subcat-count": "{{PLURAL:$2|Na kategoriye de tenya na bınkategoriye esta.|Na kategoriye de, $2 ra pêro piya, {{PLURAL:$1|bınkategoriye esta|$1 bınkategoriy estê}}.}}",
        "category-subcat-count-limited": "Na kategoriye de {{PLURAL:$1|na kategoriya bınêne esta|nê $1 kategoriyê bınêni estê}}.",
-       "category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Ebe $2 ra pêro piya {{PLURAL:$1|ena pele na kategoriye dera|$1 enê peli na kategoriye derê}}.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.",
+       "category-article-count": "{{PLURAL:$2|Na kategori dı teyna ena wesiqe est a.| $2 wesiqe ra {{PLURAL:$1|ena kategori de yê|$1 wesiqey kategori de yê}}.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Pera cêrên|$1 Per cêrêni}} na kategori de yé",
        "category-file-count": "{{PLURAL:$2|Na kategori tenya dosya ya cêri muhtewa kena.|Na kategori de $2 ra pêro piya {{PLURAL:$1|1 dosya est a|$1 dosyey est ê}}.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.",
+       "category-file-count-limited": "{{PLURAL:$1|Dosye|$1 Dosyey}} na kategori de yê.",
        "listingcontinuesabbrev": "dewam...",
-       "index-category": "Pelê endeksıni",
-       "noindex-category": "Bê indeksın perri",
-       "broken-file-category": "Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê",
+       "index-category": "Perrê rêzıni",
+       "noindex-category": "Perrê bêrêzıni",
+       "broken-file-category": "Perri be linkanê dosya çewte",
        "categoryviewer-pagedlinks": "($1) ($2)",
-       "about": "Heqa cı de",
-       "article": "Pela zerreki",
-       "newwindow": "(pençereyê newey de beno a)",
-       "cancel": "Bıtekelne",
+       "about": "Heqa",
+       "article": "Wesiqe",
+       "newwindow": "(Teqaya newi de abena)",
+       "cancel": "Annuler",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
-       "mypage": "Pele",
-       "mytalk": "Mesac",
+       "mypage": "Per",
+       "mytalk": "Werênayış",
        "anontalk": "Werênayış",
        "navigation": "Pusula",
        "and": "&#32;u",
-       "qbfind": "Bıvêne",
+       "qbfind": "Bıvin",
        "qbbrowse": "Çım ra viyarne",
        "qbedit": "Bıvurne",
-       "qbpageoptions": "Ena pele",
-       "qbmyoptions": "Pelê mı",
+       "qbpageoptions": "Na perrer",
+       "qbmyoptions": "Perrê mı",
        "faq": "PVP",
-       "faqpage": "Project: PZP",
+       "faqpage": "Project: PVP",
        "actions": "Hereketi",
-       "namespaces": "Heruna nameyan",
+       "namespaces": "Heruna naman",
        "variants": "Varyanti",
        "navigation-heading": "Menuyê navigasyoni",
        "errorpagetitle": "Xeta",
        "help": "Peşti",
        "search": "Cı geyre",
        "searchbutton": "Cı geyre",
-       "go": "Şo",
+       "go": "Şori",
        "searcharticle": "Şo",
-       "history": "Tarixê pele",
-       "history_short": "Tarix",
-       "updatedmarker": "cıkewtena mına peyêne ra dıme biyo rocane",
-       "printableversion": "Asayışê çapkerdışi",
-       "permalink": "Gıreyo daimi",
-       "print": "Çap ke",
-       "view": "Bıvêne",
-       "view-foreign": "$1 de bıvêne",
+       "history": "Tarixê perrer",
+       "history_short": "Veror",
+       "history_small": "tarix",
+       "updatedmarker": "cı kewtena mına peyêne ra dıme biyo rocane",
+       "printableversion": "Versiyonê çapkerdışi",
+       "permalink": "Gıreyo vınderde",
+       "print": "Bınuşne",
+       "view": "Bıvin",
+       "view-foreign": "$1 de bıvin",
        "edit": "Bıvurne",
        "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraze",
        "create-local": "Şınasnayışê lokali cı ke",
-       "editthispage": "Ena pele bıvurne",
-       "create-this-page": "Na pele bınuse",
-       "delete": "Bestere",
-       "deletethispage": "Ena pele bestere",
+       "editthispage": "Na perrer bıvurne",
+       "create-this-page": "Na perer bıvıraz",
+       "delete": "Bestern",
+       "deletethispage": "Na perrer bestern",
        "undeletethispage": "Na perer mebesterne",
        "undelete_short": "{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere",
-       "viewdeleted_short": "{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne",
-       "protect": "Bışevekne",
+       "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
+       "protect": "Bıstarnê",
        "protect_change": "bıvurne",
-       "protectthispage": "Ena pele bıpawe",
-       "unprotect": "Starkerdışi bıvurne",
-       "unprotectthispage": "Starkerdışe ena peler bıvurne",
-       "newpage": "Pela newiye",
-       "talkpage": "Ena pele sero werêne",
-       "talkpagelinktext": "werênayış",
-       "specialpage": "Pela xısusiye",
+       "protectthispage": "Ena perer bıpawe",
+       "unprotect": "Starnayışi bıvurne",
+       "unprotectthispage": "Starnayışê ena perer bıvurne",
+       "newpage": "Perra newi",
+       "talkpage": "Na per dı vatan kew",
+       "talkpagelinktext": "Mesac",
+       "specialpage": "Perra xısusiye",
        "personaltools": "Hacetê şexsiy",
        "articlepage": "Pera zerreki bıvin",
-       "talk": "Behs",
+       "talk": "Werênayış",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "tool-link-userrights": "Grubanê {{GENDER:$1|karberi}} bıvırnë",
-       "tool-link-emailuser": "E-posta ya në{{GENDER:$1|karberi}}",
-       "userpage": "Pela karberi bıvêne",
-       "projectpage": "Pela proceyi bıvêne",
-       "imagepage": "Pera dosya bıasne",
-       "mediawikipage": "Pera mesaci bıasne",
-       "templatepage": "Pera şabloni bıasne",
+       "tool-link-userrights-readonly": "Grubanê {{GENDER:$1|karberi}} bıvin",
+       "tool-link-emailuser": "E-posta ya në {{GENDER:$1|karberi}}",
+       "userpage": "Perra karberi bıvin",
+       "projectpage": "Perra proji bıvin",
+       "imagepage": "Pera dosye bımotné",
+       "mediawikipage": "Pera mesaji bımotné",
+       "templatepage": "Pera şabloni bımotné",
        "viewhelppage": "Pera peşti bıvin",
-       "categorypage": "Pela kategoriya bıasne",
-       "viewtalkpage": "Werênayışi bıvêne",
-       "otherlanguages": "Zederna zıwani",
+       "categorypage": "Pera kategori bımotné",
+       "viewtalkpage": "Vaten bıvin",
+       "otherlanguages": "Zıwananê binan dı",
        "redirectedfrom": "($1 ra kırışı yê)",
-       "redirectpagesub": "Pela berdışi",
-       "redirectto": "Beno hetê:",
-       "lastmodifiedat": "Per roca $1, sehat $2 de biya anewe.",
+       "redirectpagesub": "Perra kırıştışi",
+       "redirectto": "Kırışêno:",
+       "lastmodifiedat": "Ena perre roca $1 de, saete $2 de arde ro cı.",
        "viewcount": "Ena pele {{PLURAL:$1|rae|$1 rey}} vêniya.",
-       "protectedpage": "Pela pawıtiye",
+       "protectedpage": "Pera pawıyayi",
        "jumpto": "Şo be:",
-       "jumptonavigation": "Pusula",
+       "jumptonavigation": "Navigasyon",
        "jumptosearch": "cı geyre",
        "view-pool-error": "Qaytê qısuri mekerên, serverê ma enıka zêde bar gırewto xo ser.\nHedê xo ra zêde karberi kenê ke seyrê na pele bıkerê.\nŞıma rê zehmet, tenê vınderên, heta ke reyna kenê ke ena pele kewê.\n\n$1",
        "generic-pool-error": "Üzgünüz, şu an sunucular aşırı yüklendi.\nÇok fazla kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya  tekrar erişmeyi denemeden önce biraz bekleyin.",
        "pool-errorunknown": "Xeta nêzanıtiye",
        "pool-servererror": "Amordoğa xızmeti ya istifade nëbena $1",
        "poolcounter-usage-error": "Xırab karyayış:$1",
-       "aboutsite": "Heqa {{SITENAME}} de",
+       "aboutsite": "Heqa {{SITENAME}} dı",
        "aboutpage": "Project:Heqa",
        "copyright": "Zerrekacı $1 bındı not biya.",
        "copyrightpage": "{{ns:project}}:Heqa telifi",
-       "currentevents": "Hediseyê rocaneyi",
-       "currentevents-url": "Project:Hediseyê rocaneyi",
+       "currentevents": "Hediseyê rocaney",
+       "currentevents-url": "Project:Hediseyê rocaney",
        "disclaimers": "Redê mesuliyeti",
-       "disclaimerpage": "Project:Reddê mesuliyetê bıngey",
-       "edithelp": "Peştdariya vurnayışi",
+       "disclaimerpage": "Project:Redê mesulêtê pêro",
+       "edithelp": "Pastiyer vurnayış",
        "helppage-top-gethelp": "Peşti",
-       "mainpage": "Pela Seri",
-       "mainpage-description": "Pela seri",
+       "mainpage": "Perra Seri",
+       "mainpage-description": "Perra seri",
        "policy-url": "Project:Terzê hereketi",
-       "portal": "Portalê cemaeti",
-       "portal-url": "Project:Portalë Å\9fëlıgi",
-       "privacy": "Politikaya nımıteyiye",
+       "portal": "Portalê cemati",
+       "portal-url": "Project:Portalê cemati",
+       "privacy": "Politikay nımıtışi",
        "privacypage": "Project:Xısusiyetê nımıtışi",
        "badaccess": "Xeta mısadey",
        "badaccess-group0": "Heqa şıma çıniya, karo ke şıma waşt, bıkerê.",
        "badaccess-groups": "No fealiyeto ke şıma waşt, tenya karberanê {{PLURAL:$2|grubi|gruban ra yewi}} rê akerdeyo: $1.",
        "versionrequired": "No $1 MediaWiki lazımo",
-       "versionrequiredtext": "Seba gurenayışê na pele versiyonê MediaWiki $1 lazımo. \n[[Special:Version|Versiyonê pele]] bıvêne.",
+       "versionrequiredtext": "Gırweynayışê ena perre rê gani versiyonê $1ê MediaWiki bo. \n[[Special:Version|Versiyonê perre]] bıvêne.",
        "ok": "Temam",
        "pagetitle": "$1 – {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "\"$1\" ra ard",
-       "youhavenewmessages": "To rê $1 esto ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|şıma}} rê $1 esto ($2).",
        "youhavenewmessagesfromusers": "Zey $1 ra {{PLURAL:$3|zewbi karber|$3 karberi}} ($2) esto.",
        "youhavenewmessagesmanyusers": "$1 ra tay karberi ($2) dı estê.",
        "newmessageslinkplural": "{{PLURAL:$1|yew mesaco newe|999=mesacê newey}}",
        "editlink": "bıvurne",
        "viewsourcelink": "çımey bıvêne",
        "editsectionhint": "Leteyo ke bıvuriyo: $1",
-       "toc": "Sernameyê meselan",
-       "showtoc": "bımocne",
+       "toc": "Zerreki",
+       "showtoc": "bımotne",
        "hidetoc": "bınımne",
        "collapsible-collapse": "Teng kı",
        "collapsible-expand": "Hera ke",
        "confirmable-confirm": "{{GENDER:$1|Şıma}} pêbawerê?",
-       "confirmable-yes": "Eya",
+       "confirmable-yes": "E",
        "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvin?",
        "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Pele",
-       "nstab-user": "Pela karberi",
-       "nstab-media": "Pela medya",
-       "nstab-special": "Pela xısusiye",
-       "nstab-project": "Pela proceyi",
+       "nstab-main": "Perre",
+       "nstab-user": "Pera karberi",
+       "nstab-media": "Perra medya",
+       "nstab-special": "Pera hısusi",
+       "nstab-project": "Perra proji",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
        "nstab-template": "Şablon",
-       "nstab-help": "Pela peşti",
-       "nstab-category": "Kategoriye",
-       "mainpage-nstab": "Pera esas",
+       "nstab-help": "Perra pasti",
+       "nstab-category": "Kategori",
+       "mainpage-nstab": "Perra seri",
        "nosuchaction": "Fealiyeto wınasi çıniyo",
        "nosuchactiontext": "URL ra kar qebul nêbı.\nŞıma belka URL şaş nuşt, ya zi gıreyi şaş ra ameyi.\nKeyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.",
-       "nosuchspecialpage": "Pela xasa wınasiye çıniya",
+       "nosuchspecialpage": "Pela hısusiya wınasiyên çıniya.",
        "nospecialpagetext": "<strong>To yew pela xasa nêvêrdiye waşte.</strong>\n\nSeba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Xeta",
        "databaseerror": "Ğetay ardoği",
        "databaseerror-text": "Tabanda malumati de ğırabiya persayışi bi\nNa nusteber  zew ğırabin asınena.",
        "databaseerror-textcl": "Zu ğetaya erdamalumati persayışi ameya meydan.",
-       "databaseerror-query": "Perskerdış:$1",
+       "databaseerror-query": "Pers kerdış:$1",
        "databaseerror-function": "Fonksiyon: $1",
        "databaseerror-error": "Xeta: $1",
        "laggedslavemode": "Diqet: Pel de newe vıraşteyi belka çini .",
        "readonly": "database kılit biyo",
-       "enterlockreason": "Database kılit biyo",
+       "enterlockreason": "Kılit kerdışi rê tarixê abiyayışê kılit ra piya yew sebeb bınusê.",
        "readonlytext": "Qey pawıtış ri yew sebeb vace. Texmini yew tarix vace şıma key pawıtış wedarneni:  $1",
        "missing-article": "Banqa, pela be nameyê \"$1\" $2 ke gani bıbo, nêdiye.\n\nEna belki seba yew vurnayışo kıhan ya zi tarixê gıreyê yew pele esteriya.\n\nEke wına niyo, belki ''software'' de yew xeta esta.\nKerem kerên, naye be nameyê ''URL''yi yew [[Special:ListUsers/sysop|karber]]i ra vacên.",
        "missingarticle-rev": "(rewizyon#: $1)",
        "badtitle": "Sernameyo xırabın",
        "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.",
        "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": "Çemi bıvin",
+       "viewsource": "Çımey bıvêne",
        "viewsource-title": "Cı geyrayışê $1'i bıvin",
        "actionthrottled": "Kerden peysnaya",
        "actionthrottledtext": "Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.\nÇend deqey ra tepeya reyna bıcerrebnên.",
        "viewsourcetext": "To şikinay çımey na pele bıvêne 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 hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.\nVurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.\nSeba çarnayışi, yardımê [https://translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
+       "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",
        "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.",
        "mycustomjsprotected": "Desturê şıma çıniyo ke na pela JavaScripti bıvurnê.",
        "myprivateinfoprotected": "Ğısusi malumatana ğo timar kerdışire icazeta şıma çıniya.",
        "mypreferencesprotected": "Terciha timar kerdışire icazeta şıam çıniya.",
-       "ns-specialprotected": "Pelê xısusiyi nênê vurnayış.",
+       "ns-specialprotected": "Perrê xısusiy nêvırniyenê.",
        "titleprotected": "No sername terefê [[User:$1|$1]] ra, afernayene ra şevekiyayo.\nSebebê xo <em>$2</em> dero.",
-       "filereadonlyerror": "Dosyay vurnayışê \"$1\" nê abê no lakin depoy dosya da \"$2\" mod dê  salt wendi deyo.\n\nXızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: \"$3\".",
+       "filereadonlyerror": "Dosyay vurnayışê \"$1\" nê abêno lakin depoy dosya da \"$2\" mod dê  salt wendi de yo.\n\nXızmetkarê  kılit kerdışi wa bewniro enay wa çım ra ravyarn o: \"$3\".",
        "invalidtitle-knownnamespace": "Canemey \"$2\" u metnê \"$3\" xırabo",
        "invalidtitle-unknownnamespace": "Sernameye nêşınasiya yana amraiya canameyo  $1 u metno \"$2\" xırab",
        "exception-nologin": "Şıma cıkewtış nêvıraşto",
        "virus-badscanner": "Eyaro şaş: no virus-cıgerayox nêzanyeno: ''$1''",
        "virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
        "virus-unknownscanner": "antiviruso ke nêzanyeno:",
-       "logouttext": "'''Şıma hesabra newke vicyay.'''\n\nWexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de hesabe şıma akerde aseno.",
+       "logouttext": "'''Henda şıma hesab ra veciyay.'''\n\nDiqat kerê ke tayê perri şenê hewna zey şıma kewtê ra cı bıasê, heta şıma ver-virê şanekerê (browserê) xo besterê.",
        "cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
-       "welcomeuser": "Ğeyr amey, $1!",
+       "welcomeuser": "Heyr amey, $1!",
        "welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
        "yourname": "Namey karberi:",
        "userlogin-yourname": "Namey karberi",
-       "userlogin-yourname-ph": "Nameyê xoyê karberi cı kewe",
+       "userlogin-yourname-ph": "Namey xoyê karberi cı kewe",
        "createacct-another-username-ph": "Nameyê karberi cı kewe",
        "yourpassword": "Parola",
        "userlogin-yourpassword": "Parola",
-       "userlogin-yourpassword-ph": "Parolaya xo cıkewe",
+       "userlogin-yourpassword-ph": "Parolay xo cı kewe",
        "createacct-yourpassword-ph": "Parola cıkewe",
        "yourpasswordagain": "Parola reyna bınusne:",
        "createacct-yourpasswordagain": "Parola tesdiq ke",
        "usernameinprogress": "Qandê nê karberi hesab vıraştışondewamnkeno.  Tay bıpawê",
        "userexists": "Jewna karber enê nami karneno.\nMara reca xorê jewna name bınusnê.",
        "loginerror": "Xetayê hesab ekerdışi",
-       "createacct-error": "Xetaya vıraştışê hesabi",
+       "createacct-error": "Xetay vıraştışê hesabi",
        "createaccounterror": "Hesab nêvırazyeno: $1",
        "nocookiesnew": "Hesabê karberi vıraziya, labelê şıma nêşay cı kewê.\nSemedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.\nŞıma çerezi qapan kerdi.\nRavêri inan akerê, dıma be name u parola şımawa newiye cı kewê.",
        "nocookieslogin": "Semedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.\nŞıma çerezi qapan kerdi.\nRavêri inan akerê u reyna bıcerrebnê.",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
-       "botpasswords-label-cancel": "Bıtexelne",
+       "botpasswords-label-cancel": "Peyd kı",
        "botpasswords-label-delete": "Bestere",
        "botpasswords-label-resetpassword": "Parola raçarne",
        "botpasswords-label-grants-column": "Dayen",
        "resetpass_forbidden": "parolayi nêvuryayi",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
-       "resetpass-submit-cancel": "Bıtexelne",
+       "resetpass-submit-cancel": "Peyd kı",
        "resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
        "resetpass-recycled": "Parolaya şımaya newiye wa paroloya şımaya verêne ra ferqıne bo.",
        "resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo.  Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
        "resetpass-temp-password": "parolayo muweqet:",
        "resetpass-abort-generic": "Vurnayışê parola terefê yew niçıki ra texeliya.",
        "resetpass-expired": "Dema parolay da şıma qedya ya. Qandê cıkewtışi u patolaya newi vıraz",
-       "resetpass-expired-soft": "Wahdey patolanda şıma qedya yo u vurnayış icab keno. Xorê yu parola weçinê yana bahdo weçinayışi rê butona \"{{int:authprovider-resetpass-skip-label}}\" 'i bıploğnê",
+       "resetpass-expired-soft": "Şifrey şıma nêvêreno u ganê ke reyna bıvıraziyo. Reca ma aya ke şıma xo rê şifreyê do newe weçinê, ya zi şıma \"{{int:authprovider-resetpass-skip-label}}\" bıtıknê ke dıma yew şifreyo newe vırazê.",
        "resetpass-validity-soft": "Parolay şıma ravêrdi niya: $1\n\nXorê yu parola nışan bıkerê  uana bahdo sıfır kerdışi rê grey \"{{int:authprovider-resetpass-skip-label}}\" bıploğnê.",
        "passwordreset": "Parola reset ke",
        "passwordreset-text-one": "Na form de parola reset kerdış temamiye",
        "passwordreset-text-many": "{{PLURAL:$1|Qande parola yana e-posta reset kerdışi cayanra taynın pırkeri.}}",
        "passwordreset-disabled": "Parola reset kerdış ena viki sera qefılneyayo.",
        "passwordreset-emaildisabled": "Na wikid hısusiyeté e-posta dewera vıcyayé",
-       "passwordreset-username": "Nameyê karberi:",
+       "passwordreset-username": "Namey karberi:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "neticey e-postay bıasne yo?",
-       "passwordreset-capture-help": "Şıma na dorek morkerê se, e-posta (idareten eposta ya) şıma rê yana karbera rê rışêno.",
        "passwordreset-email": "Adresa e-postey:",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "bold_tip": "Metno qalın",
        "italic_sample": "Metno çewt",
        "italic_tip": "Metno çewt",
-       "link_sample": "Sernameyê gırey",
-       "link_tip": "Gıreyê miyani",
-       "extlink_sample": "http://www.misal.com sernameyê gırey",
+       "link_sample": "Serekê gıri",
+       "link_tip": "Gırey Żerri",
+       "extlink_sample": "http://www.misal.com sernamey gırey",
        "extlink_tip": "Gırey teberi (xo vira mekerên http:// prefix)",
        "headline_sample": "metnê sernamey",
        "headline_tip": "Sewiya 2ıne sername",
        "image_sample": "Misal resim.jpg",
        "image_tip": "Dosya tewrkerdiye",
        "media_sample": "misal.jpg",
-       "media_tip": "Gıreyê dosya",
+       "media_tip": "Gırey dosye",
        "sig_tip": "İmzay şıma be morê zemani",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
        "subject": "Mewzu:",
-       "minoredit": "No yew vurnayışo werdiyo",
-       "watchthis": "Na pele seyr ke",
-       "savearticle": "Qeyd ke",
-       "savechanges": "Vurnayışan qeyd ke",
+       "minoredit": "No yew vırnayışo werdiyo",
+       "watchthis": "Bewni ena per",
+       "savearticle": "Perre qeyd ke",
+       "savechanges": "Vırnayışan qeyd ke",
        "publishpage": "Perer bıhesırne",
        "publishchanges": "Vurnayışa vıla ke",
        "preview": "Verqayt",
-       "showpreview": "Verqayti bıvêne",
-       "showdiff": "Vurriyayışan bımocne",
+       "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.",
        "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.",
-       "summary-preview": "Verqaytê xulasa:",
+       "summary-preview": "Verasayışê xulasa:",
        "subject-preview": "Verqaytê mewzu:",
-       "previewerrortext": "Verqaytê vurnayış de şıma dı xırabin amê meydan",
+       "previewerrortext": "Verasayışê vırnayışê şıma de yew xeta veciya miyan.",
        "blockedtitle": "Karber blokekerdeo",
        "blockedtext": "<strong>No nameyê karberi ya zi na adresa IP blokekerdeya.</strong>\n\nVıraştoğê blokeyi: $1\nSebebê blokeyi: <em>$2</em>.\n\n* Sıftekerdena blokeyi: $8\n* Qediyayışê blokeyi: $6\n* Blokebiyaye: $7\n\nŞıma şenê  $1 de ya zi  yewna [[{{MediaWiki:Grouppage-sysop}}|administrator]]i de irtıbat kewê ke na mesela sero werênê, cemaet vırazê. \nŞıma nêşenê xısusiyetê \"karberi rê e-posta bırışe\" bıgureynê/bıxebetnê heta ke [[Special:Preferences|Tercihanê hesabi]] de yew e-posteyo ke vêreno, beli bi û şıma gureynayışê cı ra mehrum nêbiyê.\nIP adresa şımaya nıkayêne $3o û numreyê bloki #$5.\nŞıma rê zehmet, eke kewnê ra dıme, teferruatanê corênan not kerên.",
        "autoblockedtext": "IP adresê şıma otomotikmen kerda kılit, çıkı $1 verniya nê hesabi grota.\nSebebê cı zi:\n\n:''$2''\n\n* Dest pê kerdışê verni grotışi: $8\n* Qedyayişê verni grotışi: $6\n* Qayile ke bloqe bıbo: $7\n\nŞıma qayile qey weri kewtışê na mesela,  $1 ya na [[{{MediaWiki:Grouppage-sysop}}|serkaran ra]] yewi ra şenê irtibat kewê.\n\nNot, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nênuşt se şıma nêşenê na xususiyet ra \"karber rê e-posta bırışê\" istifade bıkeri.\n\nIP adresiya şıma yo nıkayên $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corênan xo vira mekerê.",
        "token_suffix_mismatch": "'''Vurnayişê şıma tepeya ameyo çunke qutiyê imla xerıbya.\nVurnayişê şıma qey nêxerepyayişê peli tepeya geyra a.\nEke şıma servisê proksi yo anonim şuxulneni sebebê ey noyo.'''",
        "edit_form_incomplete": "'''Qandê form dê vurnayışa tay wastera ma nêreşti; Vurnayışê ke şıma kerdê nêalızyayê, çım ra ravyarnê u fına bıcerbnê.'''",
        "editing": "$1 vuriyeno",
-       "creating": "$1 vıraziyeno",
+       "creating": "$1 vıraziyeno.",
        "editingsection": "Per da $1 de şımaye kenê ke leti bıvurnê",
        "editingcomment": "$1 vuryeno (qısmo newe)",
        "editconflict": "Têverabiyayışê vurnayışi: $1",
        "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.'''",
-       "editingold": "'''İkaz: Şımayé rewizyon da kehan da perer d vırnayış kené.'''\nVanése qeyd k,lakin rewziyoné veréni dé vınibé.",
+       "editingold": "'''İqaz: Şıma ena perre sera yew çım ra viyarnayışê kıhani vırnenê.'''\nEger şıma ey qeyd kerê, pêro vırnayışê ke çım ra viyarnayış ra heta ewro biy, ê benê vıni.",
        "yourdiff": "pêverronayiş",
-       "copyrightwarning": "'''Recaya iqazi:'''Sita {{SITENAME}} ra iştıraqi pêro umışiya $2 zerredeyo (teferuatan rê $1 bıvênê).\n\nİştıraqê şıma, şıma qayıl niyê ke yewna merdumi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştıraq mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
+       "copyrightwarning": "'''Recay iqazi:'''Sitey {{SITENAME}} ra iştıraki pêro umışiya $2 zerre deyo (teferuatan rê $1 bıvênê).\n\nİştırakê şıma, şıma qayıl niyê ke yewna merdımi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştırakiştıraq = iştırak. mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
        "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
        "editpage-cannot-use-custom-model": "Zerrekê  modelê ena peler şıma nêşenê bıvurnê",
        "longpageerror": "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
        "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke ena perrer de karneyayê:",
        "templatesusedpreview": "{{PLURAL:$1|Sablon|Sabloni}}  ke na verqayt de xebetnayê:",
        "templatesusedsection": "{{PLURAL:$1|Template|Templateyan}}  ke na qısım de xebetniyenê:",
-       "template-protected": "(kılit biyo)",
-       "template-semiprotected": "(nimey ena pele kılit biya)",
+       "template-protected": "(staryaye)",
+       "template-semiprotected": "(nime staryayış)",
        "hiddencategories": "Ena per de {{PLURAL:$1|1 kategoriyo nımıte|$1 kategoriyê nımıtey}} muhtewa benê:",
        "edittools": "<div id=\"specialcharss\" class=\"toccolours specialchars\" style=\"margin-top:.5em; padding: .3em .5em; font-size: 100%; color:#aaa; text-align:left;\" title=\"{{int:bw-edittools-tooltip}}\">\n<p class=\"specialbasic\" id=\"Standard\">\n'''{{int:bw-edittools-lead-in}}''' \n<charinsert>Á á É é Í í Ó ó Ú ú Ý ý</charinsert> –\n<charinsert>À à È è Ì ì Ò ò Ù ù </charinsert> –\n<charinsert> â Ê ê Î î Ô ô Û û </charinsert> –\n<charinsert>Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ</charinsert> –\n<charinsert>Æ æ Ø ø Œ œ ẞ ß </charinsert> –\n<charinsert>Å å Ů ů </charinsert> –\n<charinsert>àã Ẽ ẽ ɛ̃ Ĩ ĩ Ñ ñ Õ õ ɔ̃ Ũ ũ </charinsert> –\n<charinsert>Рð Þ þ </charinsert> –\n<charinsert>Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> –\n<charinsert>Ć ć Ĺ ĺ Ń ń Ŕ ŕ Ś ś Ý ý Ź ź </charinsert> –\n<charinsert>Č č Ď ď Ľ ľ Ň ň Ř ř Š š Ť ť Ž ž </charinsert> –\n<charinsert>Ǎ ǎ Ě ě Ǐ ǐ Ǒ ǒ Ǔ ǔ </charinsert> –\n<charinsert>Ā ā Ē ē Ī ī Ō ō Ū ū </charinsert> –\n<charinsert>ǖ ǘ ǚ ǜ </charinsert> –\n<charinsert>Ĉ ĉ Ĝ ĝ Ĥ ĥ Ĵ ĵ Ŝ ŝ Ŵ ŵ Ŷ ŷ </charinsert> –\n<charinsert>Ă ă Ğ ğ Ŭ ŭ </charinsert> –\n<charinsert>Ċ ċ Ė ė Ġ ġ Għ għ İ ı Ż ż </charinsert> –\n<charinsert>Ą ą Ę ę Į į Ų ų </charinsert> –\n<charinsert>Ő ő Ű ű </charinsert> –\n<charinsert>Đ đ Ħ ħ Ł ł Ŀ ŀ </charinsert> –\n<charinsert>Ɖ ɖ Ɛ ɛ Ƒ ƒ Ɣ ɣ Ŋ ŋ Ɔ ɔ Ʋ ʋ </charinsert> -\n<charinsert>Ə ə </charinsert> –\n<charinsert>– — ’</charinsert> –\n<charinsert>~ | ° ¹ ² ³ ⅛ ¼ ⅓ ⅜ ½ ⅝ ¾ ⅔ ⅞ € $ ¥ £ † × ← → ↔ ↑ ± ≠ © ® ™ ‰ «+» ‹+› „+“ „+” ‚+‘ ¡ ¿ …</charinsert> –\n<charinsert>&amp;nbsp; &nbsp; [[Category:+]] #REDIRECT[[+]] {{msg-mw|+|notext=1}} &#33;!FUZZY!! ~~~~  &lt;nowiki>+</nowiki></charinsert>\n<charinsert>ڈ ڑ ٹ </charinsert>\n<charinsert>ټ څ ځ ډ ړ ږ ښ ڼ ؤ ي ې ۍ ئ </charinsert>\n<charinsert>{{{+}}} {{+}} {{subst:+}} <noinclude>+</noinclude></charinsert>\n<charinsert>&lt;!--&nbsp;+&nbsp;--> &lt;br&nbsp;/></charinsert>\n</p></div>",
        "edittools-upload": "-",
-       "nocreatetext": "{{SITENAME}}, Pelê neweyi vıraştış re destur çino.\nşıma eşkeni tepiya şêri u eke şıma qayd biyaye yê [[Special:UserLogin|şıma eşkeni hesab akeri]], eke niye [[Special:UserLogin|şıma eşkeni qayd bıbiy]].",
+       "nocreatetext": "{{SITENAME}}, Perrê newey vıraştış rê destur çıniyo.\nŞıma şenê tepeya şorê u eke şıma qeydbiyayey [[Special:UserLogin|şıma şenê yew hesab akerê]], eke şıma niyê [[Special:UserLogin|şıma şenê qeyd bıbê]].",
        "nocreate-loggedin": "Desturê şıma çıniyo ke pelanê neweyan vırazê.",
        "sectioneditnotsupported-title": "Destekê vurnayışiê qısımi çıniyo",
        "sectioneditnotsupported-text": "Destekê vurnayışiê qısımi ena pela vurnayışi de çıniyo.",
        "permissionserrors": "İdari xeta",
-       "permissionserrorstext": "Qey {{PLURAL:$1|sebebê|sebebê}} cêrini ra icazeyê şıma çin o:",
+       "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:",
        "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé  esternayışi u wedarnayışi cér dé deya yo.",
        "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
        "edit-gone-missing": "Pel rocanebiyaye niyo.\nHewna kerde aseno.",
        "edit-conflict": "Têverabiyayışê vurnayışi.",
-       "edit-no-change": "Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.",
+       "edit-no-change": "Vırnayışê şıma qebul nêbı, çunke nuşte de yew vırnayış nêvıraziyo.",
        "postedit-confirmation-created": "Pele vıraziye.",
        "postedit-confirmation-restored": "Pele anciya vıraziye.",
-       "postedit-confirmation-saved": "Vurnayışê to qeyd biyo.",
+       "postedit-confirmation-saved": "Vırnayışê to 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",
        "node-count-exceeded-category": "Pela ra hetê kotya amardışê cı ravêrya",
        "node-count-exceeded-category-desc": "Pela azami amora gozgıray ravêr  da.",
        "node-count-exceeded-warning": "Pela amora gozgıra ravêr da",
-       "expansion-depth-exceeded-category": "Pela dı hetê canaya zoriya herayin ravêrya",
+       "expansion-depth-exceeded-category": "Perrê ke xoriyiya herabiyayışi tede ravêrdeya.",
        "expansion-depth-exceeded-warning": "Ravêriya pela xori herayêna",
        "parser-unstrip-loop-warning": "Unstrip lete vineya",
        "parser-unstrip-recursion-limit": "Sinorê limit dê qayış dê ($1) ravêrya",
        "undo-summary": "Vırnayışê $1'i [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]]) peyser gırot",
        "undo-summary-username-hidden": "Rewizyona veri $1'i hewada",
        "cantcreateaccount-text": "Hesabvıraştışê na IP adrese ('''$1''') terefê [[User:$3|$3]] kılit biyo.\n\nSebebo ke terefê $3 ra diyao ''$2''",
-       "viewpagelogs": "Qeydanê na pele bımocne",
-       "nohistory": "Verê vurnayışanê na pele çıniyo.",
+       "viewpagelogs": "Qeydanê na perrer bımotne",
+       "nohistory": "Verorê vurnayışanê na perer çıni yo.",
        "currentrev": "Çımraviyarnayışo rocane",
-       "currentrev-asof": "$1 ra tepya mewcud weziyeta pela",
-       "revisionasof": "Verziyonê roca $1ine",
+       "currentrev-asof": "$1 ra tepeya çım ra viyarnayışê cı'yo peyên",
+       "revisionasof": "Çımraviyarnayışê $1",
        "revision-info": "Vurnayışo ke $1 de terefê {{GENDER:$6|$2}}$7 ra biyo",
        "previousrevision": "← Çımraviyarnayışo kıhanêr",
-       "nextrevision": "Rewizyono newên →",
-       "currentrevisionlink": "Tewr halê rocaniye bımocne",
+       "nextrevision": "Çımraviyarnayışo neweyêr →",
+       "currentrevisionlink": "Tewr halê peyn",
        "cur": "ferq",
        "next": "bahdoyên",
        "last": "peyên",
        "page_first": "verên",
        "page_last": "peyên",
-       "histlegend": "Ferqê weçinayışi: Qutiya versiyonan seba têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne ro ne.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê verziyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vurnayışo werdi yo.",
+       "histlegend": "Ferqê weçinayışi: Qutiya versiyonan qandé  têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne rone.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê versiyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vırnayışo werdiyo.",
        "history-fieldset-title": "Çımberz verori",
        "history-show-deleted": "Tenya esterıtey",
        "histfirst": "Verênêr",
        "histlast": "Peyênêr",
        "historysize": "({{PLURAL:$1|1 bayt|$1 bayti}})",
        "historyempty": "(veng)",
-       "history-feed-title": "Tarixê çımraviyarnayışi",
+       "history-feed-title": "Tarixê çım eştışi",
        "history-feed-description": "Wiki de tarixê çım ra viyarnayışë na perer",
        "history-feed-item-nocomment": "$1 miyanê $2i de",
        "history-feed-empty": "Pela cıgeyrayiye çıniya.\nBeno ke ena esteriya, ya zi namê cı vuriyo.\nSeba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.",
        "rev-deleted-user-contribs": "[nameyê karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]",
        "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": "Çımra viyarnayışê ena pele '''besterêno'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımra viyarnayışi bıvinê], eke wazenê dewam kerê.",
+       "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-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-suppressed-unhide-diff": "Nê Timarkerdışi ra yewi '''çap biyo'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rocaneyê vındertışi] de teferru'ati esti.\nEke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
        "rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
-       "rev-delundel": "bımocne/bınımne",
-       "rev-showdeleted": "bımocne",
+       "rev-delundel": "bımotne/bınımne",
+       "rev-showdeleted": "bımotne",
        "revisiondelete": "Çımraviyarnayışan bestere/peyser biya",
        "revdelete-nooldid-title": "Çımraviyarnayışo waşte nêvêreno",
        "revdelete-nooldid-text": "Şıma vıraştışê nê fonksiyoni rê ya yew çımraviyarnayışo waşte diyar nêkerdo, çımraviyarnayışo diyarkerde çıniyo, ya ki şıma wazenê ke çımraviyarnayışê nıkayêni bınımnê.",
        "suppressionlog": "qeydê pinani kerdışi",
        "suppressionlogtext": "Cêr de, kahyayan ra zerreko nımıte esto,eno listey besterneya u merdumê bloke kerdışiyo. \nListey xırabi u bloki re pelay [[Special:BlockList|IP'yê ke bloke biyê]] bivinê.",
        "mergehistory": "vere cûye pelan bıhewelın",
-       "mergehistory-header": "No pel, reviyonê yew peli eşkeno yewna pelo newe de piyawano.\nno vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.",
-       "mergehistory-box": "revizyonê pelanî yew bike:",
-       "mergehistory-from": "Pela çımey:",
-       "mergehistory-into": "Pela destinasyonî",
+       "mergehistory-header": "Na per, revizyonê ju perer şena juna perer ra pêser kero.  \nNo vurnayişo ke şıma kenê kontrol bıkere ju pera kehen wa nêbo.",
+       "mergehistory-box": "revizyonê peran pêser kerê:",
+       "mergehistory-from": "Pera çımey:",
+       "mergehistory-into": "Pera hedef:",
        "mergehistory-list": "Tarixê vurnayışiyo yewbiyaye",
        "mergehistory-merge": "[[:$1]] qey ney revizyonê cêrini [[:$2]] şıma ekeni piyawani. Benatê wexto muwaqqet de piyayanayişê rezizyonan de tuşa radyo bıxebitne.",
-       "mergehistory-go": "Yew bıyaye vurriyayışa bıasne",
+       "mergehistory-go": "Pêser bıyaye vurriyayışa bımotné",
        "mergehistory-submit": "revizyonî yew bike",
        "mergehistory-empty": "Revizyonî yew nibenê.",
        "mergehistory-done": "$1 ra $3 {{PLURAL:$3|revizyon|revizyoni}} [[:$2]] de {{PLURAL:$3|biyo|biyê}} têmiyan.",
        "mergelog": "Qeydé zew kerdışi",
        "revertmerge": "Abırnê",
        "mergelogpagetext": "Cêr de yew liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.",
-       "history-title": "Tarixê çımraviyarnayışê \"$1\"",
+       "history-title": "Verorê \"$1\"",
        "difference-title": "Pela \"$1\" ferqê çım ra viyarnayışan",
        "difference-title-multipage": "Ferkê pelan dê \"$1\" u \"$2\"",
        "difference-multipage": "(Ferqê pelan)",
        "lineno": "Xeta $1:",
        "compareselectedversions": "Rewizyonanê weçineyan pêver ke",
-       "showhideselectedversions": "Revizyonanê weçinıtan bımocne/bınımne",
-       "editundo": "peyser biya",
+       "showhideselectedversions": "weçinaye revizyona bımotne/bınımne",
+       "editundo": "Peyser bıgêre",
        "diff-empty": "(Babetna niyo)",
        "diff-multi-sameuser": "(Terefê eyni karberi ra {{PLURAL:$1|yew revizyono miyanên nêmocno|$1 revizyonê miyanêni nêmocnê}})",
        "diff-multi-otherusers": "(Terefê {{PLURAL:$2|yew karberi|$2 karberan}} ra {{PLURAL:$1|yew revizyono miyanên nêmocno|$1 revizyonê miyanêni nêmocnê}})",
        "diff-multi-manyusers": "({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)",
        "difference-missing-revision": "Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.\n\nNo normal de werênayış dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
-       "searchresults": "Neticeyê geyrayışi",
+       "searchresults": "Peyniyê cı geyrayışi",
        "searchresults-title": "Qandê \"$1\" neticeyê geyrayışi",
        "titlematches": "Tekê (zewcê) sernameyê pele",
        "textmatches": "Tekê (zewcê) nuştey pele",
        "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": "Herg per sero $1 {{PLURAL:$1|netici|netica}} bıasne",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bıvênên",
+       "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ê.}}",
-       "searchprofile-articles": "Perrê muhteway",
-       "searchprofile-images": "Zafınmedya",
+       "searchprofile-articles": "Perrê zerreki",
+       "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Pêro çi",
        "searchprofile-advanced": "Herayen",
        "searchprofile-articles-tooltip": "$1 de cı geyre",
        "searchprofile-images-tooltip": "Dosya cı geyre",
-       "searchprofile-everything-tooltip": "Tedeesteyan hemine cı geyre (pelanê mınaqeşeyi zi tey)",
-       "searchprofile-advanced-tooltip": "Cayê nameyanê xısusiyan de cı geyre",
+       "searchprofile-everything-tooltip": "Tedeesteyan hemine cı geyre (pelanê werênayışi zi tey)",
+       "searchprofile-advanced-tooltip": "Cayê namanê xısusiyan de cı geyre",
        "search-result-size": "$1 ({{PLURAL:$2|1 çeku|$2 çekuy}})",
        "search-result-category-size": "{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 kategoriyê bini|$2 kategirayanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})",
-       "search-redirect": "($1 ra kırışiyè)",
+       "search-redirect": "($1 ra kırışiyaya)",
        "search-section": "(qısmê $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(zerreyê dosya yewbini gêno)",
        "search-suggest": "To va: $1",
-       "search-rewritten": "Neticey $ ra asenê.  Herunda ney wa neticanë $2'i bıvin",
+       "search-rewritten": "Neticey $1 ra asenê. Herunda ney wa neticanë $2'i bıvin",
        "search-interwiki-caption": "Proceyê bıray",
-       "search-interwiki-default": "$1 ra neticey:",
+       "search-interwiki-default": "$1 ra peyniy:",
        "search-interwiki-more": "(véşi)",
        "search-relatedarticle": "Eleqeyın",
        "searchrelated": "eleqeyın",
        "searchall": "pêro",
        "showingresults": "#<strong>$2</strong> netican ra {{PLURAL:$1|<strong>1</strong> netice cêr dero|<strong>$1</strong> neticey cêr derê}}.",
        "showingresultsinrange": "{{PLURAL:$1|<strong>1</strong> netice|<strong>$1</strong> neticey}} be mabeynê #<strong>$2</strong> ra be #<strong>$3</strong> cêr asenê.",
-       "search-showingresults": "{{PLURAL:$4|Netice <strong>$1</strong> be <strong>$3</strong>|Neticeyi <strong>$1 - $2</strong> be <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>| <strong>$3</strong> netican ra <strong>$1 ra hetana $2</strong> asenê}}",
        "search-nonefound": "Zey perskerdışê şıma peyniye çıniya.",
        "search-nonefound-thiswiki": "Ena sita dı zey waşten da şıma theba nêvineya",
        "powersearch-legend": "Cıgeyrayışo hera",
-       "powersearch-ns": "Cayanê nameyan de cıgeyrayış:",
+       "powersearch-ns": "Cayanê naman de cıgeyrayış:",
        "powersearch-togglelabel": "Kontrol ke:",
        "powersearch-toggleall": "Pêro",
        "powersearch-togglenone": "Çıniyo",
        "datedefault": "Tercih çıniyo",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pelê karberi",
-       "prefs-personal": "Pela karberi",
-       "prefs-rc": "Vurriyayışê peyêni",
-       "prefs-watchlist": "Lista seyrkerdışi",
+       "prefs-personal": "Profilê karberi",
+       "prefs-rc": "Vırnayışê peyêni",
+       "prefs-watchlist": "Lista Teqibi",
        "prefs-editwatchlist": "Lista seyrkerdışi bıvurne",
        "prefs-editwatchlist-label": "Listey serkerdışanê cıkewtışi timar kerê",
-       "prefs-editwatchlist-edit": "Sernamanê listey serkerdışanê xo bıasne u timar kerê",
+       "prefs-editwatchlist-edit": "Listey seyr kerdışê sernameyanê xo bımotné u timar kerê",
        "prefs-editwatchlist-raw": "Lista seyrkerdışia xame bıvurne",
        "prefs-editwatchlist-clear": "Lista serykerdışê xo pak kerê",
        "prefs-watchlist-days": "Rocê ke lista seyrkerdışi de bêrê ramocnaene",
        "prefs-rendering": "Asayış",
        "saveprefs": "Qeyd ke",
        "restoreprefs": "Sazanê hesıbyaya pêron newe ke",
-       "prefs-editing": "Vurnayış",
-       "rows": "Xeti:",
-       "columns": "Estûni:",
+       "prefs-editing": "Vırnayış",
        "searchresultshead": "Cı geyre",
        "stub-threshold": "Qandé Taslağ  formati  sinor:$1",
        "stub-threshold-sample-link": "misal",
        "stub-threshold-disabled": "Astengın",
        "recentchangesdays": "Rocê ke vurnayışanê peyênan de bıasê:",
        "recentchangesdays-max": "Tewr zaf $1 {{PLURAL:$1|roc|roci}}",
-       "recentchangescount": "Amarê vurnayışê ke hesıbyaye deye bımocneyê:",
+       "recentchangescount": "Halê est-amardışi ra mocnayışi rê amarê vırnayışan:",
        "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
        "savedprefs": "Tecihê şıma qeyd biy.",
-       "savedrights": "Qandé {{GENDER:$1|$1}} heqê karberi qeyd  biye.",
+       "savedrights": "{{GENDER:$1|$1}}  gruba karberi qeyd  biya.",
        "timezonelegend": "Warey saete:",
        "localtime": "saeta mehelliye:",
        "timezoneuseserverdefault": "Zey karkerdışê Wiki ($1)",
        "prefs-reset-intro": "ena pele de şıma tercihanê xo şenê bıçarnê be tercihanê keyepelê ke verê coy eyar biy.\nNa game tepeya nêerziyena.",
        "prefs-emailconfirm-label": "Tesdiqiya E-posta:",
        "youremail": "E-Mail (mecbur niyo) *:",
-       "username": "{{GENDER:$1|Nameyê karberi}}:",
+       "username": "{{GENDER:$1|Namey karberi}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Wextê qeydbiyayışi",
        "prefs-help-prefershttps": "Na tercih, fına dekewten dı bena aktiv.",
        "prefswarning-warning": "Şıma tercihanê xo de vurnayışi kerdi ke ney hewna qeyd nêbiyê. \nEke şıma na pele ra bêtıknayışê \"$1\" ra veciyê, tercihê şıma newe nêbenê.",
        "userrights": "İdarey heqanê karberan",
-       "userrights-lookup-user": "Grubanê karberi/karbere idare bıke",
+       "userrights-lookup-user": "Jew karber bıweçin",
        "userrights-user-editname": "Yew nameyê karberi cı kewe:",
-       "editusergroup": "Grupanê {{GENDER:$1|karberi}} bıvurne",
+       "editusergroup": "Grupanê karberi bıvurne",
        "editinguser": "{{GENDER:$1|karber}} [[User:$1|$1]] heqanê $2'i vurne no",
        "userrights-editusergroup": "Grubanê karberi/karbere sero bıgureye (bıxebetiye)",
+       "userrights-viewusergroup": "Grubanê karberi bıvin",
        "saveusergroups": "Grubanê {{GENDER:$1|karberi}} qeyd bıke",
        "userrights-groupsmember": "Ezayê:",
        "userrights-groupsmember-auto": "Ezao daxıl/ezaa daxıle ê:",
        "userrights-reason": "Sebeb:",
        "userrights-no-interwiki": "Heqa şıma çıniya ke heqanê karberanê Wikipediyanê binan sero bıgureyê.",
        "userrights-nodatabase": "Database $1 çıniyo ya zi mehelli niyo.",
-       "userrights-nologin": "Eke şıma wazenê ke heqa karberi/karbere cı dê, şıma gani be [[Special:UserLogin|cikewtiye]] pê yew hesabê idarekeran cı kewê",
-       "userrights-notallowed": "Hesabdê şımadı heqanê xo hewadayış u xorê heq dekerdış çıno.",
        "userrights-changeable-col": "Grubê ke şıma şenê bıvurnê",
        "userrights-unchangeable-col": "Grubê ke şıma nêşenê bıvurnê",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Heqan de karberi de dıbare vıcyayo! Kerem ke vurnayışane xo çımser ra ravyarne  u tesdiq keri.",
-       "userrights-removed-self": "Heqi şıma usula hewadeyay. Qan de coy şıma hendana nişeni ena pela resi.",
        "group": "Grube:",
        "group-user": "Karberi",
        "group-autoconfirmed": "Karberê ke otomatikmen biyê araşt",
        "group-bot": "Roboti",
        "group-sysop": "İdarekari",
        "group-bureaucrat": "Buroqrati",
-       "group-suppress": "Çımpawıtoği",
+       "group-suppress": "Pawıteri",
        "group-all": "(pêro)",
        "group-user-member": "{{GENDER:$1|karber}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Karberê ke otomatikmen biyê araşt}}",
        "grouppage-bureaucrat": "{{ns:project}}:Burokrati",
        "grouppage-suppress": "{{ns:project}}:Teftişkar",
        "right-read": "Pera bıwané",
-       "right-edit": "Pele bıvurne",
-       "right-createpage": "Pele vıraze (pelê ke ê werênayışi niyê)",
+       "right-edit": "Perre bıvırnê",
+       "right-createpage": "Perran vıraze (peprrê ke ê werênayışi niyê)",
        "right-createtalk": "Pela werênayışi vıraze",
        "right-createaccount": "Hesabê karberi vıraze",
        "right-autocreateaccount": "Xarici yew name dê karberi ya ronıştış ake",
        "right-bot": "Zey yew kardê otomotiki kar bıvin",
        "right-nominornewtalk": "Pelanê werênayışan rê vurnayışê qıckeki çıniyê, qutiya mesacanê newiyan bıgurene",
        "right-apihighlimits": "Persanê API de sinoranê berzêran bıgurene",
-       "right-writeapi": "İstıfadey APIyê nuştey",
+       "right-writeapi": "Xebtnayışê API nusnayışi",
        "right-delete": "Pele bestere",
        "right-bigdelete": "Pelanê be tarixanê dergan bestere",
        "right-deletelogentry": "Qeydanê cıkewtışanê xısusiyan bestere û peyser biya",
        "right-editmyuserjs": "JavaScript dosyaya karberinda ğo timar ke",
        "right-viewmywatchlist": "Lista seyr de xo bıvin",
        "right-editmywatchlist": "Listeya temaşiya karberinda ğo timar ke.Not  tay karfinayışi na icazet nédeyo zi pera dekeno de.",
-       "right-viewmyprivateinfo": "Bağse malumatané ğo bıasne (e-posta, nameyo raştay vs.)",
+       "right-viewmyprivateinfo": "Bağse malumatané ğo bımotné (e-posta, nameyo raştay vs.)",
        "right-editmyprivateinfo": "Melumatanê xoyê şexsiyan bıvurne (adresa e-postey, nameyo raştıkên uêb.)",
        "right-editmyoptions": "Tercihanê xo bıvurne",
        "right-rollback": "Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao",
        "right-siteadmin": "Database kilit bike u a bike",
        "right-override-export-depth": "Peleyanê ke tede linkanê 5 ra zafyer estê ay export bike",
        "right-sendemail": "Karberanê binî ra e-mail bişirav",
-       "right-passwordreset": "E-postayanê parola reset kerdışa vineno",
        "right-managechangetags": "[[Special:Tags|Etiketi]] vıraz u aktiv (me)ke",
        "right-applychangetags": "[[Special:Tags|Etiketa]]  vurnayışana piya dezge fi.",
        "grant-group-page-interaction": "Peran na tesiri",
        "grant-editprotected": "Srar bıyaye peran bıvurnê",
        "grant-highvolume": "Vengê berzi dayış",
        "grant-oversight": "Karberan u ploğyayê revizyona bınımn",
-       "grant-patrol": "Perer de vurnayışa çımra ravyarn",
+       "grant-patrol": "{{GENDER:$1|$1i çım ra viyarna ra:$1}}",
        "grant-protect": "Şeveknayış u wedarıtışê şeveknayışê pelan",
        "grant-sendemail": "Karberanê binan rê e-posta bırışê",
        "grant-uploadeditmovefile": "Dosyaya bar ke, bıvurnê  yana berê",
-       "grant-uploadfile": "Dosyaya newi bar ke",
+       "grant-uploadfile": "Dosyanê newan bar kı",
        "grant-basic": "Heqê basiti",
        "grant-viewdeleted": "Besteryaya peran u dosyaya bıasne",
        "grant-viewmywatchlist": "Lista serykerdışê xo bıvêne",
        "rightslog": "Qeydê heqanê karberi",
        "rightslogtext": "Ena listeyê loganê ke heqqa karbaranî mucneno.",
        "action-read": "ena pela wanayış",
-       "action-edit": "ena pela bıvurnê",
+       "action-edit": "ena perre bıvurnê",
        "action-createpage": "na perer bıvıraz",
        "action-createtalk": "pelanê werênayışi bıvıraze",
        "action-createaccount": "hesabê nê karberi bıvıraze",
        "action-upload_by_url": "na dosya yew URL ra bar ke",
        "action-writeapi": "ser nuşte API gure bike",
        "action-delete": "ena pele bestere",
-       "action-deleterevision": "nê çımraviyarnayışi bestere",
-       "action-deletedhistory": "tarixê ena pel ki estereyî biya, ey bivine",
+       "action-deleterevision": "revizyoni besternê",
+       "action-deletelogentry": "roceka dekerdan bestern",
+       "action-deletedhistory": "verora esteriya perrer bıvin",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "ena pele meestere",
-       "action-suppressrevision": "revizyone ki nimnaye biye reyna bivîne u restore bike",
+       "action-undelete": "ena perer mestern",
+       "action-suppressrevision": "revizyonê nımnayi bıvin u timar kı.",
        "action-suppressionlog": "enê qeydê xısusi bıvêne",
        "action-block": "enê karberi vurnayışi ra bıreyne",
        "action-protect": "seviyeyê pawitişî se ena pele bivurne",
        "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne",
        "action-siteadmin": "database kilit bike ya zi a bike",
        "action-sendemail": "e-posta bırşe",
+       "action-editmyoptions": "Tercihanê xo bıvurne",
        "action-editmywatchlist": "Listeyseyran de xo bıvırne",
        "action-viewmywatchlist": "Listeyseyran de xo bıvin",
        "action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
        "nchanges": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ziyaretê peyêni ra nata}}",
        "enhancedrc-history": "tarix",
-       "recentchanges": "Vurriyayışê peyêni",
-       "recentchanges-legend": "Tercihê vurnayışanê peyênan",
-       "recentchanges-summary": "Wiki sero vurriyayışê peyêni asenê.",
+       "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-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
-       "recentchanges-label-newpage": "Enê vurnayışi ra yu pera newi vıraziya ya",
-       "recentchanges-label-minor": "No yew vurnayışo werdiyo",
-       "recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
+       "recentchanges-label-newpage": "Enê vırnayışi yew perra newiye vıraşta.",
+       "recentchanges-label-minor": "No yew vırnayışo werdiyo",
+       "recentchanges-label-bot": "Eno vırnayış terefê yew boti ra vıraziyo",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
-       "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
-       "recentchanges-legend-heading": "<strong>Kıtabekê Vurriyayışê peyêni:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} Şıma şenê ([[Special:NewPages|Listey peranê  newan]] zi bıvinê)",
+       "recentchanges-label-plusminus": "Ebadê perre de bazê bayti de vayey cı",
+       "recentchanges-legend-heading": "<strong>Kıtabekê vırnayışê peyêni:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} Şıma şenê ([[Special:NewPages|Lista peranê  newan]] zi bıvênê)",
        "recentchanges-legend-plusminus": "''(±123)''",
-       "recentchanges-submit": "Bımocne",
+       "recentchanges-submit": "Bımotne",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
-       "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
-       "rcshowhideminor": "Vurriyayışê werdiy $1",
-       "rcshowhideminor-show": "Bımocne",
+       "rclistfrom": "$3 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
+       "rcshowhideminor": "Vırnayışê werdiy $1",
+       "rcshowhideminor-show": "Bımotne",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
-       "rcshowhidebots-show": "Bımocne",
+       "rcshowhidebots-show": "Bımotne",
        "rcshowhidebots-hide": "Bınımne",
-       "rcshowhideliu": "karberê qeydbiyayeyi $1",
-       "rcshowhideliu-show": "Bımocne",
+       "rcshowhideliu": "karberê qeydbiyay $1",
+       "rcshowhideliu-show": "Bımotne",
        "rcshowhideliu-hide": "Bınımne",
-       "rcshowhideanons": "karberê bênameyi $1",
-       "rcshowhideanons-show": "Bımocne",
+       "rcshowhideanons": "$1 karberê bênamey",
+       "rcshowhideanons-show": "Bımotne",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
-       "rcshowhidepatr-show": "Bımocne",
+       "rcshowhidepatr-show": "Bımotne",
        "rcshowhidepatr-hide": "Bınımne",
-       "rcshowhidemine": "vurnayışanê mı $1",
-       "rcshowhidemine-show": "Bımocne",
+       "rcshowhidemine": "vırnayışê mı $1",
+       "rcshowhidemine-show": "Bımotne",
        "rcshowhidemine-hide": "Bınımne",
-       "rcshowhidecategorization": "kategorizasyonê pele $1",
-       "rcshowhidecategorization-show": "Bımocne",
+       "rcshowhidecategorization": "kategorizasyoni $1",
+       "rcshowhidecategorization-show": "Bımotné",
        "rcshowhidecategorization-hide": "Bınımne",
-       "rclinks": "Peyniya $2 rocan de $1 vurriyayışan ra <br />$3 asenê",
+       "rclinks": "Peyni $2 rocan dı $1 vurnayışan ra <br />$3 bımotnı",
        "diff": "ferq",
        "hist": "verên",
        "hide": "Bınımne",
-       "show": "Bımocne",
+       "show": "Bımotne",
        "minoreditletter": "q",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc_categories": "Kategoriyan rêz kı ( \"|“ ya ciya yo):",
        "rc_categories_any": "Weçinayiyan ra her yew",
        "rc-change-size": "$1",
-       "rc-change-size-new": "Vurnayışa dıma $1 {{PLURAL:$1|bayt|bayt}}",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bayt|bayti}} ra dıma vurnayış",
        "newsectionsummary": "/* $1 */ qısımo newe",
        "rc-enhanced-expand": "Detaya bıvin (JavaScript lazımo)",
        "rc-enhanced-hide": "Melumat bınımne",
        "rc-old-title": "\"$1\"i orcinalê cı vıraşt",
-       "recentchangeslinked": "Vurnayışê elaqeyıni",
-       "recentchangeslinked-feed": "Vurnayışê elaqeyıni",
-       "recentchangeslinked-toolbox": "Vurnayışê elaqeyıni",
+       "recentchangeslinked": "Vırnayışê bestiyaey",
+       "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-page": "Nameyê pele:",
-       "recentchangeslinked-to": "Heruna pela ke yena dayene, vurnayışanê pelanê ke daye ra gırêdayiyê inan bımocne",
+       "recentchangeslinked-page": "Namey perrer:",
+       "recentchangeslinked-to": "Heruna perra kı yena dayene, vurnayışanê perranê ke daye ra gırêdayiyê inan bımotne",
        "recentchanges-page-added-to-category": "[[:$1]] kerd kategoriye miyan",
        "recentchanges-page-removed-from-category": "[[:$1]] kategoriye ra vet",
        "autochange-username": "MediaWiki vurnayışo otomatik",
        "largefileserver": "Ena dosya zaf girde ke server kebul nikeno.",
        "emptyfile": "dosya ya ke şıma bar kerda veng asena, nameyê dosyayi şaş nusyaya belka.",
        "windows-nonascii-filename": "Na wiki namen de dosyayan de xısusi karaxtera karkerdışa peşti nêdana.",
-       "fileexists": "Nê nameyi ra yew dosya xora esta. Kerem kerên, <strong>[[:$1]]</strong> qontrol kerê {{GENDER:|şıma}} ke emin niyê naye bıvurnê.   \n[[$1|thumb]]",
+       "fileexists": "Nê namey ra yew dosya xora esta. Kerem kerên, <strong>[[:$1]]</strong> kontrol kerê {{GENDER:|şıma}} ke emin niyê naye bıvurnê.   \n[[$1|thumb]]",
        "filepageexists": "qey na dosya pelê eşkera kerdışi <strong>[[:$1]]</strong> na adresi de ca ra vıraziyayo labele no name de yew dosya nêasena.\nkılmnuşteyê şıma nêasena eke şıma qayili bıvini gani şıma pê dest bıvurni\n[[$1|resimo qıc]]",
        "fileexists-extension": "zey no nameyê dosyayi yewna nameyê dosyayi esta: [[$2|thumb]]\n* dosyaya ke bar biya: <strong>[[:$1]]</strong>\n* dosyaya ke ca ra esta: <strong>[[:$2]]</strong>\nkerem kere yewna name bıvıcinê",
        "fileexists-thumbnail-yes": "na dosya wina asena ke versiyona yew resmê qıc biyayeya ''(thumbnail)''. [[$1|thumb]]\nkerem kerê <strong>[[:$1]]</strong> na dosya konrol bıkerê .",
        "upload-too-many-redirects": "Eno URL de zaf redireksiyonî esto.",
        "upload-http-error": "Yew ğeletê HTTPî biyo: $1",
        "upload-copy-upload-invalid-domain": "Na domain ra kopyayê barkerdışanê nêbenê.",
-       "upload-dialog-title": "Dosya bar ke",
+       "upload-dialog-title": "Dosya bar kı",
        "upload-dialog-button-cancel": "Bıterkın",
        "upload-dialog-button-done": "Temam",
        "upload-dialog-button-save": "Bışevekne",
        "filehist-help": "Seba diyayışê viyarteyê dosya tarixê ke qısımê tarix/zemani derê inan bıtıkne.",
        "filehist-deleteall": "pêro bestere",
        "filehist-deleteone": "bestere",
-       "filehist-revert": "reyna biyere",
+       "filehist-revert": "Peyd bıgi",
        "filehist-current": "nıkayên",
        "filehist-datetime": "Tarix/Zeman",
        "filehist-thumb": "Resmo qıckek",
        "imagelinks": "Gurenayışê dosya",
        "linkstoimage": "Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:",
        "linkstoimage-more": "$1 ra ziyed {{PLURAL:$1|pel|pel}} re gırey dano.\nlisteya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocnena.\n[[Special:WhatLinksHere/$2|pêroyê liste]] mevcud o.",
-       "nolinkstoimage": "Pelanê ser ena dosyayê link biyê çin o.",
+       "nolinkstoimage": "Ena dosya rê gırê dayen ju per çıni ya.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Linkanê zafyerî]] ena pele ra link biyo bivîne.",
        "linkstoimage-redirect": "$1 (Dosya raçarnayış) $2",
        "duplicatesoffile": "a {{PLURAL:$1|dosya|$1 dosya}}, kopyayê na dosyayi ([[Special:FileDuplicateSearch/$2|teferruati]]):",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
        "upload-disallowed-here": "Şıma nêşenê serê na dosya ra bınusên.",
-       "filerevert": "$1 reyna biyere",
+       "filerevert": "$1 Peyd bıgi",
        "filerevert-legend": "Dosya raçarne",
        "filerevert-intro": "Ti ho ena dosyayê '''[[Media:$1|$1]]'''î  [$4 versiyonê $3, $2] rê reyna anî.",
        "filerevert-comment": "Sebeb:",
        "filerevert-defaultcomment": "Versiyonê $2, $1 rê reyna ard ($3)",
-       "filerevert-submit": "Reyna biyere",
+       "filerevert-submit": "Peyd bıgi",
        "filerevert-success": "'''[[Media:$1|$1]]''' peyser çarna ra [versiyonanê $4, $3, $2].",
        "filerevert-badversion": "Vesiyonê lokalê verniyê eno dosya pê ena pulêwext de çin o.",
        "filedelete": "$1 bestere",
        "filedelete-maintenance": "Esterayîş u resterasyonê dosyayî wextê texmirî de nibenê.",
        "filedelete-maintenance-title": "Dosyaya nêbesterneyêna",
        "mimesearch": "MIME bigêre",
-       "mimesearch-summary": "Na pele, dosyayanê MIME goreyê tewran ra parzûn kena. Cıkewtış: tewrê zerreki/tewro bınên ya zi tewrê zerreki/*, nımune: <code>image/jpeg</code>.",
+       "mimesearch-summary": "Na perre, dosyayanê MIME gorey tewran ra parzûn kena. Cıkewtış: tewrê zerreki/tewro bınên ya zi tewrê zerreki/*, nımune: <code>image/jpeg</code>.",
        "mimetype": "Babetê NIME",
-       "download": "Bar ke",
+       "download": "Bıselagnê",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Listeya Hetenayışan",
        "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
        "listduplicatedfiles-entry": "[[$3|{{PLURAL:$2|kapyay|$2 kopyey}}]] dosya da [[:File:$1|$1]]'i est a",
-       "unusedtemplates": "Şablonê ke nêguriyenê",
+       "unusedtemplates": "Şablonê kı nêgurweyênê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
-       "randompage": "Pela raştameyiye",
+       "randompage": "Perra raştameyiye",
        "randompage-nopages": "Na {{PLURAL:$2|heruna namey|heruna nameyan}} de nê peli çıniyê: $1.",
-       "randomincategory": "Ğoseri pera kategoriya",
+       "randomincategory": "Ena kategoriye dı pela raştameye",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
-       "randomincategory-category": "Kategoriye:",
+       "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Kategori ra raştamayi per",
        "randomincategory-submit": "Şo",
        "randomredirect": "Serçarnayışo rastameye",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
-       "statistics-header-pages": "İstatıstıkê perrer",
+       "statistics-header-pages": "İstatistikê perer",
        "statistics-header-edits": "İstatistikê vurnayışan",
        "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Yewbina istatistiki",
-       "statistics-articles": "Meqaley",
-       "statistics-pages": "Peli",
-       "statistics-pages-desc": "Wiki de peley pêro, kategoriy, hetenayışi wesaire...",
-       "statistics-files": "Dosyayê bar biye",
+       "statistics-articles": "Perê zerreki",
+       "statistics-pages": "Peri",
+       "statistics-pages-desc": "Peri heme, kategoriy, şabloni, moduli uçb.",
+       "statistics-files": "Barneyaye dosyey",
        "statistics-edits": "Ronayen da {{SITENAME}} ra newke amora vıryayışan",
        "statistics-edits-average": "Her pele sero nısbi vurnayış",
        "statistics-users": "[[Special:ListUsers|Karber]]ê qeydıni",
        "statistics-users-active": "Karberê aktifi",
        "statistics-users-active-desc": "{{PLURAL:$1|roco peyin de|$1 roco peyin de}} karber ê ke kar kerdê.",
-       "pageswithprop": "Peli be yew xısusiyetê pele",
+       "pageswithprop": "Perrê kı hendê ju perrer rê",
        "pageswithprop-legend": "Peli be yew xısusiyetê pele",
        "pageswithprop-text": "Na per pimanen pera kena liste.",
        "pageswithprop-prop": "Nameyo xısusi:",
        "brokenredirectstext": "Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:",
        "brokenredirects-edit": "bıvurne",
        "brokenredirects-delete": "bestere",
-       "withoutinterwiki": "Pelê ke zıwananê binan rê gıreyê cı çıniyo",
+       "withoutinterwiki": "Perrê ke zıwananê binan rê gıreyê cı çıni yo",
        "withoutinterwiki-summary": "Enê pelî ke versiyonê ziwanî binî ra link nidano.",
        "withoutinterwiki-legend": "Verole",
-       "withoutinterwiki-submit": "Bımocne",
-       "fewestrevisions": "Pelê be senık çımraviyarnayışi",
+       "withoutinterwiki-submit": "Bımotne",
+       "fewestrevisions": "Perrê kı tewr tayn timaryayê",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
        "ncategories": "$1 {{PLURAL:$1|Kategori|Kategoriy}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikiy}}",
        "nimagelinks": "$1 {{PLURAL:$1|pele de|pelan de}} gureyeno",
        "ntransclusions": "$1 {{PLURAL:$1|pele de|pelan de}} gureyeno",
        "specialpage-empty": "Seba na rapore netice çıniyo.",
-       "lonelypages": "Pelê seyi",
+       "lonelypages": "Perrê kı cı rê gre çıni yo",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
        "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
-       "uncategorizedimages": "Dosyeyê ke bêkategoriyê",
+       "uncategorizedimages": "Dosyeyê kategorinêbiyay.",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
-       "unusedcategories": "Kategoriyê ke nêgureniyê",
+       "unusedcategories": "Kategoriyê ke nêguriyay",
        "unusedimages": "Dosyeyê ke nêguriyenê",
        "wantedcategories": "Kategoriyê ke waziyayê",
        "wantedpages": "Pelê ke waziyayê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
-       "wantedfiles": "Dosyeyê cıgeyriyayeyi",
+       "wantedfiles": "Dosyeyê waştey",
        "wantedfiletext-cat": "Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].",
        "wantedfiletext-nocat": "Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "mostinterwikis": "Pelan ke tewr zaf interwiki biyê.",
        "mostrevisions": "Pelan ke tewr zaf revizyonî biyê.",
-       "prefixindex": "Veroleya peley pêro",
+       "prefixindex": "Verbenda pelli heme",
        "prefixindex-namespace": "Peleyê Veroleyıni ($1 cay nami)",
-       "prefixindex-submit": "Bımocne",
+       "prefixindex-submit": "Bımotne",
        "prefixindex-strip": "Listeya réz bıyayışi",
-       "shortpages": "Pelê kılmeki",
-       "longpages": "Pelê dergeki",
-       "deadendpages": "Pelê nêgıredayeyi",
+       "shortpages": "Pelê kılmi",
+       "longpages": "Pelê dergi",
+       "deadendpages": "Perrê kı perranê binan rê grey c çıni yo",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
-       "protectedpages": "Pelê pawıteyi",
+       "protectedpages": "Pellê kı pawıyayeyè",
        "protectedpages-indef": "têna pawıteyê bêmuddeti",
        "protectedpages-summary": "Listeya ena peler newke pawıtiya.Sername de  ena lista rê pawıte vıraştışi rê [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] bıvinê.",
        "protectedpages-cascade": "Kilit biyaye ke teyna cascadiye",
        "protectedpages-unknown-performer": "Karbero nêzanaye",
        "protectedtitles": "Sernameyê pawıteyi",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
-       "protectedtitles-submit": "Sernameyan bımocne",
+       "protectedtitles-submit": "Sereki bımotne",
        "listusers": "Listeyê Karberan",
-       "listusers-editsonly": "Teyna karberan bimucne ke ey nuştê",
+       "listusers-editsonly": "Teyna karberanê vırnayış kerdoğan bımotne",
        "listusers-creationsort": "goreyê wextê vıraştışi rêz ker",
        "listusers-desc": "Kemeyen rézed ratn",
        "usereditcount": "$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}",
        "usercreated": "$2 de $1 {{GENDER:$3|viraziya}}",
-       "newpages": "Pelê newey",
-       "newpages-submit": "Bımocne",
+       "newpages": "Perrê newey",
+       "newpages-submit": "Bımotne",
        "newpages-username": "Nameyê karberi:",
-       "ancientpages": "Pelê kehenêri",
+       "ancientpages": "Tewr pelê kıhani",
        "move": "Bıkırışe",
        "movethispage": "Ena pele bıkırışe",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
        "apihelp-no-such-module": "Modulê \"$1\" çıniyo.",
        "apisandbox": "API qumdor",
        "apisandbox-fullscreen": "Panela hera kerdışi",
-       "apisandbox-unfullscreen": "Pele bımocne",
+       "apisandbox-unfullscreen": "Perrer bımotne",
        "apisandbox-submit": "Bıwazê",
        "apisandbox-reset": "Bestere",
        "apisandbox-retry": "Fına",
        "apisandbox-dynamic-parameters-add-label": "Parametre dek:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nmaey parametrey",
        "apisandbox-submit-invalid-fields-title": "Tay çiy ters şı",
-       "apisandbox-results": "Neticey",
+       "apisandbox-results": "Peyniy",
        "apisandbox-sending-request": "API waştış rışêno...",
        "apisandbox-request-url-label": "URL waştış:",
        "apisandbox-request-time": "Demê waştışi: {{PLURAL:$1|$1 ms}}",
-       "booksources": "Çımeyê kıtaban",
+       "booksources": "Çımey kıtabi",
        "booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Cı geyre",
        "specialloguserlabel": "Kerdoğ:",
        "speciallogtitlelabel": "Meqsed (sername ya zi {{ns:user}}:karberi rê nameyê karberi):",
        "log": "Qeydi",
-       "logeventslist-submit": "Bımocne",
-       "all-logs-page": "Qeydê umumi pêro",
+       "logeventslist-submit": "Bımotne",
+       "all-logs-page": "Heme qeydê pêroyi",
        "alllogstext": "qey {{SITENAME}}i mocnayişê heme rocaneyani.\ntipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyna hessasiyê herfa pil u qıciyi) bıweçine u esayiş qıc kerê.",
        "logempty": "Qeydan dı malumato unasin çıni yo.",
        "log-title-wildcard": "Sernameyê ke be nê nuşteyi ra destkenê pê, cıgeyre",
-       "showhideselectedlogentries": "Qeydê weçinayışê bımocne/bınımne dekerê",
+       "showhideselectedlogentries": "Motnayışê qeydê weçinayışê cı kerdeyan bıvurne",
        "log-edit-tags": "Etiketanê weçinayê qeydan bıvurnê",
        "checkbox-select": "Weçinaye: $1",
        "checkbox-all": "Pêro",
        "checkbox-none": "Temam",
-       "checkbox-invert": "Rageyre",
-       "allpages": "Peli pêro",
+       "checkbox-invert": "Dimlaşt ke (verdindayış)",
+       "allpages": "Pêro peli",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
-       "allpagesfrom": "Pera liste kerdışi bıasne:",
-       "allpagesto": "Pelanê ke be ena herfe qediyenê bımocne:",
-       "allarticles": "Peli pêro",
+       "allpagesfrom": "Herfa kı pa liste bo:",
+       "allpagesto": "Perranê ke ena herfe qediyenê bımotne:",
+       "allarticles": "Peri pêro",
        "allinnamespace": "Peli pênro ( $1 cayênameyî)",
        "allpagessubmit": "Şo",
        "allpagesprefix": "herfê ke şıma tiya de nuşti, pê ney herfan pelê ke destpêkenê liste ker:",
        "cachedspecial-viewing-cached-ts": "Na pela raşt niya, şımayê enewke versiyonê verhafızada na pela vinenê.",
        "cachedspecial-refresh-now": "Peyêni bıvin.",
        "categories": "Kategoriy",
-       "categories-submit": "Bımocne",
+       "categories-submit": "bımotne",
        "categoriespagetext": "{{PLURAL:$1|Kategoriya cêrene|Kategoriyanê cêrênan}} de peli ya zi medya estê.\n[[Special:UnusedCategories|Kategoriyê ke nêxebetiyenê]] tiya de nêmocniyayê.\n[[Special:WantedCategories|Kategoriyanê waşteyeyan]] de zi bıvêne.",
-       "categoriesfrom": "Kategoriyê ke be ninan dest pêkenê, bımocne:",
+       "categoriesfrom": "Kategoriyê ke ney ra sergendênê bımotne:",
        "deletedcontributions": "İştırakê karberi esterdi",
        "deletedcontributions-title": "İştırakê karberi esterdi",
        "sp-deletedcontributions-contribs": "iştiraki",
        "linksearch": "Gıreyê teberi cı geyrê",
        "linksearch-pat": "bıgêr motif:",
-       "linksearch-ns": "Heruna nameyi:",
+       "linksearch-ns": "Heruna namey:",
        "linksearch-ok": "Cı geyre",
        "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: $1 (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
        "linksearch-line": "$1, $2 ra link biya",
        "linksearch-error": "jokeri têna nameyê makina ya serekini de aseni/eseni.",
        "listusersfrom": "karber ê ke pey ıney detpêkeni ramocın:",
-       "listusers-submit": "Bımocne",
+       "listusers-submit": "Bımotne",
        "listusers-noresult": "karber nêdiyayo/a.",
        "listusers-blocked": "(blok biy)",
-       "activeusers": "Listey karberan de aktivan",
-       "activeusers-intro": "Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.",
+       "activeusers": "Lista karberanê aktifan",
+       "activeusers-intro": "Ena yew lista karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepiya iştirak kerdo inan motneno.",
        "activeusers-count": "Peyni  {{PLURAL:$3|roc de|$3 rocan de}} $1  {{PLURAL:$1|hereket kerdo|hereketi kerdê}}",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-noresult": "Karberi nêdiyayê.",
        "usermessage-editor": "Xeberdarê sistemi",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlist": "Listey pawıteyan",
-       "mywatchlist": "Lista mına cıewniyayışi",
+       "mywatchlist": "Lista seyrkerdışi",
        "watchlistfor2": "Qandê $1 ($2)",
        "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "removedwatchtext-short": "Pera $1`i listeya seyran de şıma ra wedari yê",
        "watch": "Seyr ke",
-       "watchthispage": "Na pele seyr ke",
+       "watchthispage": "Bewni ena per",
        "unwatch": "Teqib meke",
        "unwatchthispage": "temaşa kerdışê peli vındarn.",
        "notanarticle": "mebhesê peli niyo",
        "wlnote": "$3 saete $4 ra dıme {{PLURAL:$2|yew saete de|'''$2''' saetan de}} {{PLURAL:$1|vurnayışo peyên|vurnayışê '''$1''' peyêni}} cêrderê.",
        "wlshowlast": "Peyni de  $1 seata u $2 roca  bıasne",
        "watchlist-hide": "Bınımne",
-       "watchlist-submit": "Bımocne",
+       "watchlist-submit": "Bımotne",
        "wlshowtime": "Periyoda zemani asenayışi:",
-       "wlshowhideminor": "vurriyayışê werdiy",
+       "wlshowhideminor": "vırnayışê werdiy",
        "wlshowhidebots": "boti",
        "wlshowhideliu": "karberê qeydıni",
        "wlshowhideanons": "karberê anonimi",
-       "wlshowhidepatr": "vurnayışê pawıteyi",
-       "wlshowhidemine": "vurnayışê mı",
+       "wlshowhidepatr": "Vırnayışê çım ra viyarniyaey",
+       "wlshowhidemine": "vırnayışê mı",
        "wlshowhidecategorization": "kategorizasyonê pele",
        "watchlist-options": "Tercihê liste da seyri",
        "watching": "Seyr ke...",
        "unwatching": "Seyr meke...",
-       "watcherrortext": "Sazanê listeda seyri vurnayış de pox ta \"$1\" xırabey vıcyê .",
+       "watcherrortext": "Key şıma lista seyrkerdışê xo \"$1\" rê vırnaêne, yew xeta veciya.",
        "enotif_reset": "Pela pêro ziyaret kerde deye mor ke",
        "enotif_impersonal_salutation": "{{SITENAME}} karber",
        "enotif_subject_deleted": "{{SITENAME}} de pera $1 {{gender:$2|$2}} esterıt.",
        "delete-confirm": "\"$1\" bestere",
        "delete-legend": "Bestere",
        "historywarning": "'''Teme:''' Pela ke şıma esterenê tede yew viyarte be teqriben $1 {{PLURAL:$1|versiyon esto|versiyoni estê}}:",
-       "historyaction-submit": "Bımocne",
+       "historyaction-submit": "Bımotne",
        "confirmdeletetext": "Tı ho yew pele u tarixê pele wederneno.\nTı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi u tı zani tı ser [[{{MediaWiki:Policy-url}}|poliçe]] kar keno.",
        "actioncomplete": "Kar bi temam",
        "actionfailed": "kar nêbı",
        "delete-warning-toobig": "no pel wayirê tarixê vurnayiş ê derg o, $1 {{PLURAL:$1|revizyonê|revizyonê}} seri de.\nhewn a kerdışê ıney {{SITENAME}} şuxul bıne gırano;\nbı diqqet dewam kerê.",
        "deleteprotected": "Şıma nêşenê ena perer esternê,  çıkı per starya ya.",
        "rollback": "vurnayişan tepiya bıger",
-       "rollbacklink": "peyser biya",
+       "rollbacklink": "ageyrayış",
        "rollbacklinkcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot",
        "rollbackfailed": "Peyserardış nêbi",
        "cantrollback": "karbero peyin têna paşt dayo, no semedi ra vuriyayiş tepiya nêgeriyeni.",
-       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra pelê ıney[[:$1]] de vurnayiş biyo u no vurnayiş tepiya nêgeriyeno;\nyewna ten pel de vurnayiş kerdo u pel tepiya nêgeriyeno.\n\noyo ke vurnayişo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Xulasaya vurnayışi: <em>$1</em>.",
+       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra perrê ıney[[:$1]] de vırnayış biyo u no vırnayiş tepeya nêgêriyeno;\nyewna ten perre de vırnayiş kerdo u perre tepiya nêgeriyeno.\n\noyo ke vırnayışo peyên kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "Xulasay vurnayışi: <em>$1</em> bi",
        "revertpage": "Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.",
        "revertpage-nouser": "No keso ke vuriyayiş kerdo vuriyayişé{{GENDER:$1|[[User:$1|$1]]}} ker o",
        "rollback-success": "vurnayişê no kesi $1 tepiya geriyayo u hetê no\n$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.",
        "sessionfailure-title": "Seans xeripiya",
        "sessionfailure": "cıkewtışê hesabê şıma de yew problem aseno;\nno kar semedê dızdiyê hesabi ibtal biyo.\nkerem kerê \"tepiya\" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.",
+       "changecontentmodel": "Modelê zerrekê pele bıvurne",
        "changecontentmodel-title-label": "Sernameyê pele",
        "changecontentmodel-model-label": "Modelê zerrekiyo newe",
        "changecontentmodel-reason-label": "Sebeb:",
        "protect-legend": "Pawıtışi araşt ke",
        "protectcomment": "Sebeb:",
        "protectexpiry": "Qediyeno:",
-       "protect_expiry_invalid": "Demo qediyayışi raşt niyo.",
+       "protect_expiry_invalid": "Demo peyên raşt niyo.",
        "protect_expiry_old": "Demo qediyayışi tarix dı.",
        "protect-unchain-permissions": "Zobina tercihanê mıhafezekerdışi kilıt meke",
        "protect-text": "Tı eşkeno bıvin u seviyê kılit-kerdışi bıvin '''$1'''.",
        "protect-locked-blocked": "seviyeya qedexe biyayeyan nevuriyeno.\n'''$1''' eyarê peli:",
        "protect-locked-dblock": "semedê kılidê database ya aktifi şıma neeşkeni seviyeya pawıtışi buvurni.\n'''$1''' eyarê no peli:",
        "protect-locked-access": "Karber hesabê şıma nêşeno  staryaye sewiyey ena peler bıvurno.\nHesıbyayê sazê pela da '''$1''' enêyê:",
-       "protect-cascadeon": "Ena pele nıka kılit biya, çıke na pele zerreyê lista {{PLURAL:$1|pela ke bınê şevekiyayışê qedemeyıni dera|pelê ke bınê şevekiyayışê qedemeyıni derê}}.\nTı şenê sewiyaya kılitkerdışi bıvurnê, feqat tı nêşenê şevekiyayışê qedemeyıni bıvurnê.",
+       "protect-cascadeon": "Ena pele nıka kılit biya, çıke na pele zerreyê lista {{PLURAL:$1|pela ke bınê staryayışi qedemeyıni dera|pelê ke bınê şevekiyayışê qedemeyıni derê}}.\nTı şenê sewiya ya kılit kerdışi bıvurnê, feqat tı nêşenê staryayışi qedemeyıni bıvurnê.",
        "protect-default": "Destur bıde karberan pêrune",
        "protect-fallback": "Tenya karberanê be izna \"$1\" rê destur bıde",
        "protect-level-autoconfirmed": "Karberanê neweyan u qeyd-nêbiyaoğan kılit ke",
        "restriction-level-sysop": "tam pawiyayo",
        "restriction-level-autoconfirmed": "nêm pawiyayo",
        "restriction-level-all": "kamci be sewiya",
-       "undelete": "Peranê esteryayan bıasne",
+       "undelete": "Peranê esteryayan bımotné",
        "undeletepage": "bıewn revizyonê peli yê hewn a şiyayeyan u tepiya biyar",
        "undeletepagetitle": "'''pelo [[:$1|$1]] cêrın, wayirê revizyonê hewn a şiyayeyan o'''.",
-       "viewdeletedpage": "Pelanê esteriyayeyan bımocne",
+       "viewdeletedpage": "Perranê esteriyayan bıvin",
        "undeletepagetext": "{{PLURAL:$1|pelo|$1 pelo}} cerın hewn a şiyo labele hema zi arşiv de yo u tepiya geriyeno.\nArşiv daimi pak beno.",
        "undelete-fieldset-title": "revizyonan tepiya bar ker",
        "undeleteextrahelp": "Qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê '''''{{int:undeletebtn}}'''''.. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê '''''{{int:undeletebtn}}'''''..",
-       "undeleterevisions": "$1 {{PLURAL:$1|revizyon|revizyon}} esteriya yë",
+       "undeleterevisions": "$1 {{PLURAL:$1|revizyon|revizyoni}} esteriya yë",
        "undeletehistory": "eke şıma pel tepiya biyari heme revizyonî zi tepiya yeni.\neke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, revizyonê o pelê verıni zerreyê no pel de aseno.",
        "undeleterevdel": "eke pelo serın de netice bıdo ya zi revizyoni qısmen hewn a bıbiy hewn a kerdışi tepiya nêgeriyeno.",
        "undeletehistorynoadmin": "na madde hewn a biya. sebebê hewna kerdışi u teferruatê karber ê ke maddeyi vıraştı cêr de diyayî. revizyonê hewn a biyayeyani têna serkari vineni",
        "undelete-error-long": "hewn a kerdışê na dosyayi wexta tepiya geriyenê xeta vıraziya:\n\n$1",
        "undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
        "undelete-show-file-submit": "Eya",
-       "namespace": "Heruna nameyi:",
+       "namespace": "Namey herun:",
        "invert": "Weçinayışi dimlaşt ke",
        "tooltip-invert": "nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê",
-       "namespace_association": "Heruna nameyanê elaqedaran",
+       "namespace_association": "Heruna namanê elaqedaran",
        "tooltip-namespace_association": "Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê",
-       "blanknamespace": "(Ser)",
-       "contributions": "İştırakê {{GENDER:$1|karber}}i",
-       "contributions-title": "Dekerdenê karber de $1",
+       "blanknamespace": "(Wesiqe)",
+       "contributions": "İştirakê {{GENDER:$1|karber}}i",
+       "contributions-title": "Dekerdenê karberê  $1",
        "mycontris": "İştıraki",
        "anoncontribs": "İştıraki",
        "contribsub2": "Qandê {{GENDER:$3|$1}} ($2)",
        "uctop": "(weziyet)",
        "month": "Aşme:",
        "year": "Serre:",
-       "sp-contributions-newbies": "Tenya iştıraqanê karberanê neweyan bımocne",
+       "sp-contributions-newbies": "Tenya iştırakanê karberanê newan bımotne",
        "sp-contributions-newbies-sub": "Qe hesebê newe",
-       "sp-contributions-newbies-title": "Îştîrakê karberî ser hesabê neweyî",
+       "sp-contributions-newbies-title": "Hesabanê neweyan rê iştırakê karberi",
        "sp-contributions-blocklog": "qeydê kılitkerdışi",
        "sp-contributions-deleted": "iştırakê {{GENDER:$1|karberi}} esterdi",
        "sp-contributions-uploads": "Barkerdışi",
        "sp-contributions-logs": "qeydi",
-       "sp-contributions-talk": "werênayış",
+       "sp-contributions-talk": "vaten",
        "sp-contributions-userrights": "idareyê heqanê karberan",
        "sp-contributions-blocked-notice": "verniyê no/na karber/e geriyayo/a\nqê referansi qeydê vernigrewtışi cêr de eşkera biyo:",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-search": "Dekerdena cı geyrê",
        "sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
-       "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
+       "sp-contributions-toponly": "Tenya tewr çım ra viyarnayışanê peyniyan bımocne",
        "sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
        "sp-contributions-submit": "Cı geyre",
        "whatlinkshere": "Linkê tedeestey",
-       "whatlinkshere-title": "Per da \"$1\" rê perê ke gre danê",
+       "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
-       "linkshere": "Ena peleyan grey biya '''[[:$1]]''':",
+       "linkshere": "Pera <strong>[[:$1]]</strong> rê gıre dayen perri",
        "nolinkshere": "Per da '''[[:$1]]''' rê pera ke gıre dana çıniya.",
-       "nolinkshere-ns": "Ena cayê nameyî de yew pel zi '''[[:$1]]''' rê link nibeno.",
+       "nolinkshere-ns": "Cayo ke namey rê weçinayo de qet perre '''[[:$1]]''' rê link nêbena.",
        "isredirect": "pera hetenayışi",
        "istemplate": "Açarnayene",
-       "isimage": "gıreyê dosya",
+       "isimage": "gırey dosye",
        "whatlinkshere-prev": "{{PLURAL:$1|veror|veror $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|verni|verni $1}}",
        "whatlinkshere-links": "← gırey",
        "whatlinkshere-hideredirs": "Hetenayışê $1",
-       "whatlinkshere-hidetrans": "Açarnayışê $1",
+       "whatlinkshere-hidetrans": "Çarnayışan $1",
        "whatlinkshere-hidelinks": "Gıreyê $1",
-       "whatlinkshere-hideimages": "Gıreyê dosya $1",
+       "whatlinkshere-hideimages": "Gıreyanê dosye $1",
        "whatlinkshere-filters": "Parzûn",
        "whatlinkshere-submit": "Şo",
        "autoblockid": "Otomatik vındarnayış #$1",
        "ipbexpiry": "Qedyayış:",
        "ipbreason": "Sebeb:",
        "ipbreason-dropdown": "*sebebê verni-grewtışi yê pêroyi\n** malumatê şaş têare kerdış\n** Zerreyê pelan vetış\n** keyepelê teberi re gırey eştış\n** pelani re qıseyê tewşan(toşan) eştış\n** Tehditwari hereket/Taciz\n** yew ra ziyed hesaban xırab şuxulnayiş\n** nameyê karberi yo ke meqbul niyo",
-       "ipb-hardblock": "KArberê ke ena IP ra dekewte de wa vurnayış nêkerê",
+       "ipb-hardblock": "Enê adresanê IPy ra karberi vırnayış u cıkwetış ra bloke kerê",
        "ipbcreateaccount": "Hesab viraştişi blok bik",
        "ipbemailban": "Ena karber rê destur medî  ke ay e-mail neşiravî",
        "ipbenableautoblock": "verniyê IPadresa peyin ê no karberi u wexta ke vurnayişi kerd ê IPadresani otomotik bıger.",
        "ipb-blocklist-duration-left": "$1 vet",
        "unblockip": "Hesabê karberî a bike",
        "unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.",
-       "ipusubmit": "Enê kılitkerdışi wedare",
+       "ipusubmit": "Enê kılit kerdışi wedarnê",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "unblocked-range": "Blokey $1'i wederya",
        "unblocked-id": "Blokê $1î wedariyayo",
        "ipblocklist-submit": "Cı geyre",
        "ipblocklist-localblock": "blokê mehelli",
        "ipblocklist-otherblocks": "{{PLURAL:$1|blokê|blokê}} bini",
-       "infiniteblock": "ebedî",
-       "expiringblock": "roca $1i saeta $2i de qediyena",
+       "infiniteblock": "ebedi",
+       "expiringblock": "$1, $2 de qediyeno",
        "anononlyblock": "teyna karbero anonim",
-       "noautoblockblock": "otoblok nihebitîyeno",
-       "createaccountblock": "Hesab viraştîş blok biyo",
-       "emailblock": "e-mail blok biyo",
-       "blocklist-nousertalk": "ti nieşken pele minaqaşe xo bivurne",
-       "ipblocklist-empty": "Lista kılitkerdışi venga.",
+       "noautoblockblock": "otobloke dariya we",
+       "createaccountblock": "Hesab vıraştene men biya",
+       "emailblock": "e-mail men kerd",
+       "blocklist-nousertalk": "Perra xo'ya suhbeti vırnaene nêbena",
+       "ipblocklist-empty": "Listay kılit kerdışi venga.",
        "ipblocklist-no-results": "Adresa IPya waştiye ya zi nameyê karberi kılit nêbiyo.",
        "blocklink": "kılit ke",
-       "unblocklink": "bloki wedare",
-       "change-blocklink": "kılitkerdışi bıvurne",
+       "unblocklink": "blokey wedare",
+       "change-blocklink": "kılit kerdışi bıvurne",
        "contribslink": "iştıraki",
        "emaillink": "e-poste bırışe",
        "autoblocker": "Şıma otomatikmen kılit biy, çıke adresa şımaya ''IP''y terefê \"[[User:$1|$1]]\" gureniyena.\nSebebê kılitbiyayışê $1'i \"$2\"o",
        "movepage-page-unmoved": "pelê $1i nêkırışiyeno sernameyê $2i.",
        "movepage-max-pages": "tewr ziyed $1 {{PLURAL:$1|peli|peli}} kırışiya u hıni ziyedê ıney otomotikmen nêkırışiyeno.",
        "movelogpage": "Qeydê wegrotışi",
-       "movelogpagetext": "nameyê liste ya ke cêr de yo, pelê vuriyayeyani mocneno",
+       "movelogpagetext": "Cêr de listê da kırşiyayışanê perran pêrıne esta.",
        "movesubpage": "{{PLURAL:$1|Subpage|pelê bınıni}}",
        "movesubpagetext": "{{PLURAL:$1|pelê bınıni yê|pelê bınıni yê}} no $1 peli cer de yo.",
        "movenosubpage": "pelê bınıni yê no peli çino.",
        "movereason": "Sebeb:",
-       "revertmove": "peyser biya",
+       "revertmove": "Peyd bıgi",
        "delete_and_move_text": "==gani hewn a bıbıo/bıesteriyo==\n\n\" no [[:$1]]\" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?",
        "delete_and_move_confirm": "Eya, na pele bestere",
        "delete_and_move_reason": "\"[[$1]]\" qande nami re ca akerdışi re besteriyaye",
        "selfmove": "name yo ke şıma wazeni bıbo, ın name û name yo ke ca ra esto eyni yê /zepê yê. vurnayiş mumkin niyo.",
-       "immobile-source-namespace": "\"$1\" pelê cayi de nameyi nêkırışyenî",
+       "immobile-source-namespace": "Heruna namey \"$1\" rê perre nêşena bıkırışiyo",
        "immobile-target-namespace": "peli nêkırışiyeni \"$1\" cayê nameyan",
        "immobile-target-namespace-iw": "xetê benatê wikiyan, hedefê pelkırıştış niyo",
        "immobile-source-page": "nameyê no peli nêvuriyeno",
        "bad-target-model": "Hedefo ke waştiyayo zerreke cı babetna model karneno. Ke nêşeno $1 ra açarno $2.",
        "imagenocrossnamespace": "Dosya, ca yo ke qey nameyê dosyayan nêbıbo nêkırışiyeno",
        "nonfile-cannot-move-to-file": "Ekê dosya niyê, cade namande dosyaya nêahulneyênê",
-       "imagetypemismatch": "tipa dosyaya neweyi re pênêgıneno/nêgıneno pê",
-       "imageinvalidfilename": "nameyê dosyayi ya hedefi meqbul niyo.",
+       "imagetypemismatch": "Tipê dosyey newey rê pê nêgıneno",
+       "imageinvalidfilename": "Namey dosyao ke hedefo nêvêreno.",
        "fix-double-redirects": "rayberdış ê ke sernameyê orjinali re işaret keni rocane bıker.",
        "move-leave-redirect": "pey de yew rayberdış roni",
        "protectedpagemovewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri, loge bivini:",
        "importinterwiki": "Zewbina wiki ra ard",
        "import-interwiki-text": "qey kırıştışê zerreyi yew wiki u pel bıvıcinê.\ntarixê revizyon u nameyê nuştoxi pawyene.\nkarê zerredayişê benateyê wikiyani[[Special:Log/import|zerreyê rocaneyê kırıştî de]] qeyd beno.",
        "import-interwiki-sourcewiki": "Çıme wiki:",
-       "import-interwiki-sourcepage": "Çıme pela:",
+       "import-interwiki-sourcepage": "Perra çımey:",
        "import-interwiki-history": "Qeydanê pele pêrune kopya ke",
        "import-interwiki-templates": "Şablonan pêro zerre ke",
        "import-interwiki-submit": "Zerre ke",
        "importnopages": "Pel çino ke import bike",
        "imported-log-entries": " $1 {{PLURAL:$1|logê dekerdişi|loganê dekerdişan}} ard.",
        "importfailed": "Împort nebiy: <nowiki>$1</nowiki>",
-       "importunknownsource": "Çimeyê tip ê împortî nizanyano",
+       "importunknownsource": "Tipê importê çımeyiyo ke nêşınasiyeno.",
        "importcantopen": "Nieşkenî dosyayê împortî a bike",
        "importbadinterwiki": "Linkê înterwîkîyî nihebitiyeno",
        "importsuccess": "Împort qediya!",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizyon|revizyon}} debya zere",
        "import-logentry-interwiki-detail": "$2 per da $1  ra{{PLURAL:$1|revizyon|revizyon}} debya zere",
        "javascripttest": "Cerebnayışê JavaScripti",
+       "javascripttest-pagetext-unknownaction": "Kerdışo ke nêşınasiyeno \"$1\".",
        "javascripttest-qunit-intro": "Mediawiki.org dı [dokumanê $1] bıvinê.",
        "tooltip-pt-userpage": "Pela {{GENDER:|şımaya karberi}}",
        "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-watchlist": "Lista pelanê ke to gırewtê seyrkerdış",
+       "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "tooltip-pt-logout": "Bıveciye",
        "tooltip-pt-createaccount": "Şıma rê tewsiyey ma xorê jew hesab akerê. Fına zi hesab akerdış mecburi niyo.",
-       "tooltip-ca-talk": "Heqa zerrekê pele de werênayış",
+       "tooltip-ca-talk": "Heqa zerreki vaten",
        "tooltip-ca-edit": "Ena pele bıvurne",
-       "tooltip-ca-addsection": "Zu bınnusteya newi ak",
+       "tooltip-ca-addsection": "Bınleteyo newe akerê",
        "tooltip-ca-viewsource": "Ena pele kılit biya.\nŞıma şenê çımeyê aye bıvênê",
        "tooltip-ca-history": "Versiyonê verênê ena pele",
        "tooltip-ca-protect": "Ena pele bışevekne",
        "tooltip-ca-unprotect": "Starkerdışe ena peler bıvurne",
        "tooltip-ca-delete": "Ena pele bestere",
-       "tooltip-ca-undelete": "peli biyarê halê ver hewnakerdışi",
+       "tooltip-ca-undelete": "Perer fına zey verê esternayışi kerê",
        "tooltip-ca-move": "Ena pele bıkırışe",
        "tooltip-ca-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-ca-unwatch": "Ena pele lista xoya seyrkerdışi ra vece",
        "tooltip-search": "{{SITENAME}} de cı geyre",
        "tooltip-search-go": "Ebe nê namey tami şo yew pela ke esta",
        "tooltip-search-fulltext": "Pelan miyan de nê metıni cı geyre",
-       "tooltip-p-logo": "Pela seri bıvêne",
+       "tooltip-p-logo": "Şo pela seri",
        "tooltip-n-mainpage": "Şo pela seri",
        "tooltip-n-mainpage-description": "Şo pela seri",
-       "tooltip-n-portal": "Heqa proceyi de, kes çı şeno bıkero, çı koti vêniyeno",
+       "tooltip-n-portal": "Heqa procey de, kes çı şeno bıkero, çı kamca vêniyeno",
        "tooltip-n-currentevents": "Vurnayışanê peyênan de melumatê pey bıvêne",
-       "tooltip-n-recentchanges": "Wiki de yew lista vurriyayışanê peyênan",
+       "tooltip-n-recentchanges": "Wiki dı yew lista vurnayışanê peyênan",
        "tooltip-n-randompage": "Pelê da raştameyiye bar ke",
-       "tooltip-n-help": "Cayê peştigırewtışi",
+       "tooltip-n-help": "Caê doskerdışi",
        "tooltip-t-whatlinkshere": "Lista pelanê wikiya pêroina ke tiya gırê bena",
        "tooltip-t-recentchangeslinked": "Vurnayışê peyênê pelanê ke ena pela ra gırê biyê",
        "tooltip-feed-rss": "RSS feed qe ena pele",
        "tooltip-t-contributions": "{{GENDER:$1|Enê karberi}} ra listey iştirakan",
        "tooltip-t-emailuser": "Ena karber ri yew email bırış",
        "tooltip-t-upload": "Dosyeyan bar ke",
-       "tooltip-t-specialpages": "Yew lista pelanê xasanê pêroyinan",
-       "tooltip-t-print": "Hewl versiyona ploğnayışa na perer",
+       "tooltip-t-specialpages": "Listeya peranê hısusiyan hemın",
+       "tooltip-t-print": "Versiyono perre ro ke nuşterniyaye.",
        "tooltip-t-permalink": "Gırêyo daimi be ena versiyonê pele",
        "tooltip-ca-nstab-main": "Pela zerreki bıvêne",
        "tooltip-ca-nstab-user": "Pela karberi bıvêne",
        "tooltip-ca-nstab-media": "Pela medya bıvêne",
        "tooltip-ca-nstab-special": "Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê",
        "tooltip-ca-nstab-project": "Pela proceyi bıvêne",
-       "tooltip-ca-nstab-image": "Pera dosyayer bıvin",
+       "tooltip-ca-nstab-image": "Pela dosya bıvêne",
        "tooltip-ca-nstab-mediawiki": "Mesacê sistemi bımocne",
        "tooltip-ca-nstab-template": "Şabloni bıvêne",
        "tooltip-ca-nstab-help": "Pela peşti bıvêne",
        "tooltip-ca-nstab-category": "Pela kategoriye bıvêne",
-       "tooltip-minoredit": "Nay vırnayışa werdi nışan bıkeré",
+       "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-preview": "VurnayıÅ\9fané Ä\9fo Ã§Ä±mra ravyarné. Verdé qeyd kerdıÅ\9fi eneri bıkarné!",
+       "tooltip-preview": "VurnayıÅ\9fanê xo Ã§Ä±m ra bıviyarnê. QeydkerdıÅ\9f ra ver bıgurê cı!",
        "tooltip-diff": "Metni sero vurnayışan mocneno",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-rollback": "\"Peyser biya\" be yew tık pela iştıraqanê peyênan peyser ano",
        "tooltip-undo": "\"Undo\" ena vurnayışê newi iptal kena u vurnayışê verni a kena.\nTı eşkeno yew sebeb bınus.",
        "tooltip-preferences-save": "Terciha qeyd ke",
-       "tooltip-summary": "Yew xulasaya kilm binuse",
+       "tooltip-summary": "Xulasa kılmek bınuse",
        "interlanguage-link-title": "$1 - $2",
-       "common.css": "/************************************************\n * COMMON CSS\n *\n * Any CSS placed in this page will be used on \n * all skins, please think carefully about if it\n * belongs here (and not in one of the skin CSS\n * pages) before adding it. Thanks.\n ************************************************/\n\n/* <table class=\"highlighthovertable\"> */\ntable.highlighthovertable tr:hover,\ntable.highlighthovertable tr:hover td,\ntable.mw-ext-translate-groupstatistics tr:hover,\ntable.mw-ext-translate-groupstatistics tr:hover td {\n background-color: white;\n}\n\n\n/* Babel wrapper layout. */\n/* XXX: This is either redundant or should be in-core */\n/* @noflip */table.mw-babel-wrapper {\n\twidth:        238px;\n\tfloat:        right;\n\tclear:        right;\n\tmargin:       1em;\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: #99B3FF;\n}\n\n/* Babel box layout. */\n/* @noflip */div.mw-babel-box {\n\tfloat:  left;\n\tclear:  left;\n\tmargin: 1px;\n}\n\ndiv.mw-babel-box table {\n\twidth: 238px;\n}\n\ndiv.mw-babel-box table th {\n\twidth:       238px;\n\twidth:       45px;\n\theight:      45px;\n\tfont-size:   14pt;\n\tfont-family: monospace;\n}\n\ndiv.mw-babel-box table td {\n\tfont-size:   8pt;\n\tpadding:     4pt;\n\tline-height: 1.25em;\n}\n\n/* Babel box colours. */\ndiv.mw-babel-box-0 {\n\tborder: solid #B7B7B7 1px;\n}\n\ndiv.mw-babel-box-1 {\n\tborder: solid #C0C8FF 1px;\n}\n\ndiv.mw-babel-box-2 {\n\tborder: solid #77E0E8 1px;\n}\n\ndiv.mw-babel-box-3 {\n\tborder: solid #99B3FF 1px;\n}\n\ndiv.mw-babel-box-4 {\n\tborder: solid #CCCC00 1px;\n}\n\ndiv.mw-babel-box-5 {\n\tborder: solid #F99C99 1px;\n}\n\ndiv.mw-babel-box-N {\n\tborder: solid #6EF7A7 1px;\n}\n\ndiv.mw-babel-box-0 table th {\n\tbackground-color: #B7B7B7;\n}\n\ndiv.mw-babel-box-1 table th {\n\tbackground-color: #C0C8FF;\n}\n\ndiv.mw-babel-box-2 table th {\n\tbackground-color: #77E0E8;\n}\n\ndiv.mw-babel-box-3 table th {\n\tbackground-color: #99B3FF;\n}\n\ndiv.mw-babel-box-4 table th {\n\tbackground-color: #CCCC00;\n}\n\ndiv.mw-babel-box-5 table th {\n\tbackground-color: #F99C99;\n}\n\ndiv.mw-babel-box-N table th{\n\tbackground-color: #6EF7A7;\n}\n\ndiv.mw-babel-box-0 table {\n\tbackground-color: #E8E8E8;\n}\n\ndiv.mw-babel-box-1 table {\n\tbackground-color: #F0F8FF;\n}\n\ndiv.mw-babel-box-2 table {\n\tbackground-color: #D0F8FF;\n}\n\ndiv.mw-babel-box-3 table {\n\tbackground-color: #E0E8FF;\n}\n\ndiv.mw-babel-box-4 table {\n\tbackground-color: #FFFF99;\n}\n\ndiv.mw-babel-box-5 table {\n\tbackground-color: #F9CBC9;\n}\n\ndiv.mw-babel-box-N table {\n\tbackground-color: #C5FCDC;\n}\n\n.babel-box td.babel-footer {\n\ttext-align: center;\n}\n\n/* Styling for portals. */\ndiv.table {\n    display:        table;\n    vertical-align: top;\n    width:          100%;\n}\n\ndiv.table-row {\n    display:        table-row;\n    vertical-align: top;\n}\n\ndiv.table-cell {\n    display:        table-cell;\n    vertical-align: top;\n}\n\nbody.ns-100 table.mw-babel-wrapper {\n    border:           solid 1px #bbbbbb;\n    background-color: #f0f0f0;\n    margin-left:      1em;\n}\n\n.graytext {\n    color: #aaa;\n}\n\n/* On [[Special:RecentChanges]] and [[Special:Watchlist]] make the new pages symbol bold green and the minor edit symbol gray. */\n.newpage {\n    color:       green;\n    font-weight: bold\n}\n\n.minoredit,\n.minor {\n    color: gray;\n}\n\n/* Monospace diffs, this makes more sense since diffs show what would be seen in the edit box. */\n/* Note: Anno 2012 many browsers don't use monospace in the textarea anymore by default, notably Chrome and Safari don't (unless the user overrides this in the preferences) */\n.diff-context,\n.diff-deletedline,\n.diff-addedline {\n    font-family: monospace, \"Courier New\";\n/* Just guess does the stupid wikidiff2 extensions add extra whitespace around..... */\n    white-space: -moz-pre-wrap;\n    white-space: pre-wrap;\n}\n \n.diffchange {\n    border: 1px dotted rgb( 170, 170, 170 );\n}\n\n/* It is unclear what the following CSS does, please add comments if you can clarify. */\n/* The box which is 400px high and if its content is longer, it gets the scrollbar */\n.scrollme {\n    overflow: scroll;\n    width:    100%;\n    height:   400px;\n}\n\n/* Standard Navigationsleisten, aka box hiding thingy from .de.  Documentation at [[Wikipedia:NavFrame]]. */\ndiv.Boxmerge, div.NavFrame { margin: 0; padding: 4px; border-collapse: collapse;}\ndiv.Boxmerge div.NavFrame { border-style: none; border-style: hidden; }\ndiv.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; }\ndiv.NavFrame div.NavHead { height: 1.6em; position:relative; }\ndiv.NavEnd { margin: 0; padding: 0; line-height: 1px; clear: both; }\na.NavToggle { position: absolute; top: 0; right: 5px; }\n.note-flaggedrevs * a.NavToggle { right: 12px; } /* For [[Template:Flagged Revs]] */\n\n/* Template:Languages */\n.bw-languages {\n    border:          1px solid #aaaaaa;\n    padding:         0.2em;\n    border-collapse: collapse;\n    line-height:     1.2;\n    font-size:       95%;\n    margin:          1px 1px;\n}\n.bw-languages-title {\n    width:        180px;\n    border:       1px solid #aaaaaa;\n    background:   #EEF3E2;\n    padding:      0.5em;\n    font-weight:  bold;\n}\n.bw-languages-links { padding:0.5em; background:#F6F9ED; }\n\n/* Senseless in this project */\n#editpage-copywarn { display: none; }\n\n/* Hide warnings about bad links on MediaWiki:Common.css */\n.page-MediaWiki_Common_css .mw-translate-messagechecks { display: none; }\n\n/*******************\n** Faciliate RTL translation\n*******************/\n/* @noflip */\n#bodyContent .arabic a {\n\tpadding-right:0;\n\tbackground:none;\n}\n\n.vatop tr, tr.vatop, .vatop td, .vatop th {\n vertical-align: top;\n}\n\n.bw-languages {\n direction: ltr;\n}\n\n/* prevent wrapping of lines in LQT TOC if not necessary */\ntable.lqt_toc {\n\twidth: auto;\n}\n\n/* [[m:MediaZilla:35337]] */\n@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/152px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/202px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n\n/* qqq visibility, [[Thread:Support/Suggestion: Add this CSS to MediaWiki:Common.css]] */\n \n.mw-sp-translate-edit-info .mw-content-ltr {\n  background-position:left center;\n  padding-left:45px;\n}\nfieldset.mw-sp-translate-edit-info .mw-centent-rtl {\n  background-position:right center;\n  padding-right:45px;\n}\n\n/* Semantic MediaWiki - make special properties easier to identify */\n\n.smwbuiltin a,\n.smwbuiltin a.new {\n\tcolor: #FF8000;\n}\n\n/* Recentchangestext toggle link */\n.white-link a {\n    color: #fff;\n}",
-       "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
        "anonymous": "{{PLURAL:$1|karberê|karberê}} anonimi yê keyepelê {{SITENAME}}i",
        "siteuser": "karberê {{SITENAME}}i $1",
        "anonuser": "karberê anonim o {{SITENAME}}i $1",
-       "lastmodifiedatby": "Ena per tewr peyên roca $2, $1 de terefê $3 ra vurmaya ya.",
+       "lastmodifiedatby": "Ena per tewr peyên roca $2, $1 de terefê $3 ra vurneya ya.",
        "othercontribs": "xebatê $1 ıney geriyayo diqqeti/geriyayo nezer.",
        "others": "bini",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|karber|karberan}} $1",
        "nocredits": "qey no peli hema/hona yew şınasnameyi mewcud niyo",
        "spamprotectiontitle": "filtreya spami yo pawıtışê verba-vındertışi",
        "spamprotectiontext": "pel o ke şıma waşt qeyd bıkeri hetê filtreya spami ra blok bı. ihtimalo gırdek o teber-gıreyê listeya sabıqayi ra yo.",
-       "spamprotectionmatch": "nuşte yo ke rıcnayoxê spami herikneno: $1",
+       "spamprotectionmatch": "nuşteyo ke rıcnayoxê spami herikneno: $1",
        "spambot_username": "wikimedya spam-pakkerdışi",
        "spam_reverting": "agêriyeno revizyon o ke tawayê $1 ıney piya çiniyo",
        "spam_blanking": "Revizyonê gredê $1 vineyay, wa weng kero",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Bınpelê na pela",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|serçarnayış|serçarnayışi}}; $3 {{PLURAL:$3|nêserçarnayış|nêserçarnayışi}})",
-       "pageinfo-firstuser": "Pela vıraşter",
-       "pageinfo-firsttime": "Demê pela vıraştışi",
+       "pageinfo-firstuser": "Vıraştoğê perrer",
+       "pageinfo-firsttime": "Vıraştena tarixê perrer",
        "pageinfo-lastuser": "Vurnayoğo peyên",
        "pageinfo-lasttime": "Deme u vurnayışo peyên",
        "pageinfo-edits": "Amarina vurnayışan pêro",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra",
-       "pageinfo-toolboxlink": "Melumatê pele",
+       "pageinfo-toolboxlink": "Melumatê perre",
        "pageinfo-redirectsto": "Beno hetê",
        "pageinfo-redirectsto-info": "melumat",
        "pageinfo-contentpage": "Zey jû pela zerreki hesebiyena",
        "pageinfo-protect-cascading": "Sıtarkerdeyi tiya cı ra yenê war",
        "pageinfo-protect-cascading-yes": "Eya",
        "pageinfo-protect-cascading-from": "Sıtarkerdey cı ra yenê war",
-       "pageinfo-category-info": "Şınasiya kategoriye",
+       "pageinfo-category-info": "Melumatê kategori",
        "pageinfo-category-pages": "Amarê pelan",
        "pageinfo-category-subcats": "Amarê bınkategoriyan",
        "pageinfo-category-files": "Amarê dosyeyan",
        "markaspatrolledtext": "Ena pele kontrol biyayi nışan ke",
        "markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
        "markedaspatrolledtext": "Versiyone weçinaye [[:$1]] nişan biyo ke devriye biyo",
-       "rcpatroldisabled": "Dewriyaya vurnayışê peyêni nêxebetiyena",
-       "rcpatroldisabledtext": "Devriyeyê vurnayışê peyêni inke kefilnaye biyo u nihebitiyeno",
+       "rcpatroldisabled": "Dewriyay vırnayışê peyêni nêxebetiyena",
+       "rcpatroldisabledtext": "Dewriya vırnayışanê peyênan nêgırweniyena.",
        "markedaspatrollederror": "Nişan nibeno ke devriye biyo",
        "markedaspatrollederrortext": "Ti gani revizyon işaret bike ke Nişanê devriye biyo",
        "markedaspatrollederror-noautopatrol": "Ti nieşkeno ke vurnayişê xo nişan bike ke devriye biyê.",
        "filedelete-old-unregistered": "Ena dosya revizyoni yê weçinayi \"$1\" database ma de çini yo.",
        "filedelete-current-unregistered": "Ena dosyayê weçinayi \"$1\" database ma de çini yo.",
        "filedelete-archive-read-only": "Ena direktorê arşivi \"$1\" webserver de nieşkeno binusi.",
-       "previousdiff": "← Vurnayışê kıhanyer",
+       "previousdiff": "← Vırnayışê kıhanêr.",
        "nextdiff": "Vurnayışo peyên →",
        "mediawarning": "'''Teme''': Na dosya de belkia kodê xırabıni estê.\nGurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
        "imagemaxsize": "Lımita ebata resimi:<br />''(qande akerdışa perande dosyayan)''",
        "widthheight": "$1 - $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pele|peli}}",
        "file-info": "ebatê dosyayi: $1, MIME tip: $2",
-       "file-info-size": "$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4",
+       "file-info-size": "$1 × $2 pikselan, ebatê dosya: $3, MIME tipê cı: $4",
        "file-info-size-pages": "$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}",
        "file-nohires": "Deha berz agozney cı çıniyo",
        "svg-long-desc": "Dosyay SVG, zek vanê $1 × $2 piksela, ebatê dosya: $3",
        "svg-long-desc-animated": "SVG dosya, nominalin $1 × $2 piksela, ebatê dosya: $3",
        "svg-long-error": "Nêmeqbul dosyaya SVG'i: $1",
        "show-big-image": "Dosyaya oricinale",
-       "show-big-image-preview": "Verqaytê dergiya: $1.",
+       "show-big-image-preview": "Vervênayışê ebatê : $1.",
        "show-big-image-other": "Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "file-info-gif-looped": "viyariye biyo",
        "file-info-png-frames": "$1 {{PLURAL:$1|çerçeve|çerçeveyi}}",
        "file-no-thumb-animation": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de animasyoni miyan dı nêbo.'''",
        "file-no-thumb-animation-gif": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de  GIF imaci de animasyon do nêbo.'''",
-       "newimages": "Galeriya dosyanê neweyan",
+       "newimages": "Galeriya dosyanê newan",
        "imagelisttext": "Cêr de yew listeyê '''$1''' esto {{PLURAL:$1|dosya|dosyayi}} veçiniya $2.",
        "newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
        "newimages-legend": "Avrêc",
        "newimages-hidepatrolled": "Selaganë dewriyeyan bıvinë",
        "noimages": "Çik çini yo.",
        "ilsubmit": "Cı geyre",
-       "bydate": "goreyê zemani",
+       "bydate": "Gorey zemani",
        "sp-newimages-showfrom": "Dosyayanê newiyanê ke be $1, $2 ra dest pêkenê bımocne",
        "video-dims": "$1, $2 × $3",
        "seconds-abbrev": "$1 san",
        "variantname-shi": "shi",
        "metadata": "Melumato serên",
        "metadata-help": "Ena dosya dı zafyer informasyoni esto. Belki ena dosya yew kamareyo dijital ya zi skaner ra vıraziyo.\nEg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.",
-       "metadata-expand": "Detayan bıasne",
+       "metadata-expand": "Detayan bımotné",
        "metadata-collapse": "melumati bınımne",
        "metadata-fields": "Resımê meydanê metadataê ke na pele de benê lista, pela resımmocnaene de ke tabloê metadata gına waro, gureniyenê.\nÊ bini zey sayekerdoğan nımiyenê.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "metadata-langitem": "'''$2:''' $1",
        "exif-primarychromaticities": "Kromaticitiyê eveli",
        "exif-ycbcrcoefficients": "Cayê rengi yê transformasyon metriksê koefişinti",
        "exif-referenceblackwhite": "Çiftyê siya u sipe değerê referansi",
-       "exif-datetime": "Zeman u tarixê vurnayişê dosyayi",
+       "exif-datetime": "Zeman u tarixê vırnayışê dosya",
        "exif-imagedescription": "Serê resimi",
        "exif-make": "Vıraştoğê kamera",
        "exif-model": "Modelê kamera",
-       "exif-software": "Software ke hebitiyeno",
+       "exif-software": "Karenaye nusnerek",
        "exif-artist": "Nuştoğ",
        "exif-copyright": "Wahirê copyrighti",
        "exif-exifversion": "Versiyonê Exif",
        "exif-compressedbitsperpixel": "Modê komprasyonê resimi",
        "exif-pixelxdimension": "Herayeya resimi",
        "exif-pixelydimension": "Berzeya resimi",
-       "exif-usercomment": "Mışewreyê karberi",
+       "exif-usercomment": "Mışewrey karberi",
        "exif-relatedsoundfile": "Derhekê dosya yê vengi",
        "exif-datetimeoriginal": "Demê afernayışê dayeyo sıfteyıni",
-       "exif-datetimedigitized": "Zeman û tarixê dicitalkerdışi",
+       "exif-datetimedigitized": "Dema  dijital kerdışi",
        "exif-subsectime": "ZemanTarix saniyeyibini",
        "exif-subsectimeoriginal": "ZemanTarixOricinal saniyeyibini",
        "exif-subsectimedigitized": "ZemanTarixDicital saniyeyibini",
        "exif-subjectlocation": "cayê kerdoxi",
        "exif-exposureindex": "rêzê (indexê) pozi",
        "exif-sensingmethod": "metodê hiskerdışi",
-       "exif-filesource": "çimeyê dosyayi",
+       "exif-filesource": "Ã\87ımey dosya",
        "exif-scenetype": "tipa sehneyi",
        "exif-customrendered": "karê resmê xususiyi",
        "exif-exposuremode": "poz kerdışi",
        "exif-writer": "Nuştekar",
        "exif-languagecode": "Zıwan",
        "exif-iimversion": "Verqaydê IIM",
-       "exif-iimcategory": "Kategoriye",
+       "exif-iimcategory": "Kategori",
        "exif-iimsupplementalcategory": "Kategoriyê temamkerdışi",
        "exif-datetimeexpires": "No peyra mekarênê",
        "exif-datetimereleased": "Bıroşe",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
        "version-skins": "Bar kerde bejni",
-       "version-specialpages": "Pelê xısusiyi",
+       "version-specialpages": "Perê hısusiy",
        "version-parserhooks": "Çengelê Parserî",
        "version-variables": "Vurnayeyî",
        "version-antispam": "Spam vındarnayış",
        "version-libraries-license": "Lisans",
        "version-libraries-description": "Şınasnayış",
        "version-libraries-authors": "Nuştekari",
-       "redirect": "Serşıkıtena dosya, karberi, pele ya ki revizyonê kamiya dosya",
+       "redirect": "Kırıştena dosya, karberi, perra ya ki revizyonê ID",
        "redirect-summary": "Na pela xase to hetê yew dosya (nameyê dosya dayeyo), yew pele (kamiya revizyoni ya zi pele dayiya) ya zi yew pela karberi (kamiya karberiya reqemkiye dayiya) ser şıknena. Gurenayış: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya zi  [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Şo",
        "redirect-lookup": "Bewni",
        "fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
        "fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
-       "specialpages": "Pelê xısusiyi",
+       "specialpages": "Perrê xısusiy",
        "specialpages-note-top": "Kıtabek",
        "specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "specialpages-group-other": "Pelê xısusiyê bini",
        "specialpages-group-login": "Dekew / hesab vıraz",
-       "specialpages-group-changes": "Vurnayışê peyêni û qeydi",
+       "specialpages-group-changes": "Vırnayışê peyêni u qeydi",
        "specialpages-group-media": "Raporê medya û barkerdışi",
-       "specialpages-group-users": "Karberi û heqi",
+       "specialpages-group-users": "Karberi u heqê inan",
        "specialpages-group-highuse": "Peleyê ke vêşi karênê",
        "specialpages-group-pages": "Listeyê pelan",
        "specialpages-group-pagetools": "Haletê pelan",
        "tags-create-reason": "Sebeb:",
        "tags-create-submit": "Vıraze",
        "tags-edit-reason": "Sebeb:",
-       "comparepages": "Pela miqeyese ke",
+       "comparepages": "Pelan têversanê",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
        "compare-rev1": "Revizyonê 1i",
        "revdelete-summary-hid": "xulasaya vurnayışi nımıtiya",
        "revdelete-uname-hid": "nameyê karberi nımıteyo",
        "revdelete-content-unhid": "zerrek nênımıteyo",
-       "revdelete-summary-unhid": "xulasaya vurnayışi nênımıtiya",
+       "revdelete-summary-unhid": "xulasay vurnayışi musneyêna",
        "revdelete-uname-unhid": "nameyê karberi nênımıteyo",
        "revdelete-restricted": "vergırewtışê ke xızmekaran rê biye",
        "revdelete-unrestricted": "vergırewtışê ke xızmekaran rê dariyê we",
-       "logentry-move-move": "$1 pela $3 {{GENDER:$2|berd}} $4",
-       "logentry-move-move-noredirect": "Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4",
-       "logentry-move-move_redir": "Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4",
+       "logentry-move-move": "{| style=\"border:1px solid skyblue; margin-bottom: 1em\" cellspacing=\"0\" cellpadding=\"2\" width=\"60%\"\n\t\n| style=\"font: 100% verdana; color:black\" align=\"center\" bgcolor=\"greenyellow\" | $1,  pera $3'i {{GENDER:$2|kırışt}} $4\n|}",
+       "logentry-move-move-noredirect": "$1, pera $3'i bêhetenayış {{GENDER:$2|kırışt}} pera $4`i",
+       "logentry-move-move_redir": "Hetenayışi sera karber $1 pera $3'i  {{GENDER:$2|kırışt}} pera $4",
        "logentry-move-move_redir-noredirect": "Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4",
        "logentry-patrol-patrol": "$1 versiyono $4 ke {{GENDER:$2|nişan biyo}} pela $3 ra qontrol kerd",
        "logentry-patrol-patrol-auto": "Çımraviyarnayışê $4 pela $3 ke $1 otomatikman {{GENDER:$2|nişan biyo}} qontrol kerd",
        "revdelete-summary": "kılmvatışê vuriyayişi",
        "feedback-adding": "Pela rê peyxeberdar defêno...",
        "feedback-bugcheck": "Harika! Sadece [xırabina ke $1 ] çınyayışê cı kontrol keno.",
-       "feedback-bugnew": "Mı qontrol ke. Xetaya newi xeber ke",
+       "feedback-bugnew": "Mı kontrol kı. Xetay newi xeber kı.",
        "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
-       "feedback-cancel": "Bıtexelne",
+       "feedback-cancel": "Peyd kı",
        "feedback-close": "Biya star",
-       "feedback-error1": "Xeta: API ra neticey ne vıcyay",
+       "feedback-error1": "Xeta: APIi ra peyniyê nêşınasiyay",
        "feedback-error2": "Xeta: Timar kerdış nebı",
        "feedback-error3": "Xeta: API ra cewab çıno",
        "feedback-message": "Mesac:",
        "feedback-thanks": "Teşekkur kemê! Vatışê şıma pela da \"[$2 $1]\" esta.",
        "searchsuggest-search": "{{SITENAME}} de cı geyre",
        "searchsuggest-containing": "estebiyaye...",
-       "api-error-badaccess-groups": "Ena wiki de dosya barkerdışi rê mısade nêdeyêno.",
-       "api-error-badtoken": "Xetaya zerreki: Antışo xırabın.",
-       "api-error-copyuploaddisabled": "URL barkerdış ena waster dı qefılyayo.",
-       "api-error-duplicate": "Pele de xora be nê zerreki ra {{PLURAL:$1|dosyaya bine esta|dosyeyê bini estê}}.",
-       "api-error-duplicate-archive": "Ena {{PLURAL:$1|vurneyaya zey na dosya|zerrey cı zey dosya}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.",
-       "api-error-empty-file": "Dosyaya ke şıma rışta venga.",
+       "api-error-badtoken": "Xetay zerreki: Antışo xırabın.",
        "api-error-emptypage": "Newi, pelaya veng vıraştışi rê mısade nêdeyêno.",
-       "api-error-fetchfileerror": "Xırabiya zerrek:Dosya grotış dı tay çi raşt nêşı.",
-       "api-error-fileexists-forbidden": "Jû dosya be nê nameyê \"$1\" ra xora esta, u naye sero nêşeno ke bınuşiyo.",
-       "api-error-fileexists-shared-forbidden": "Jû dosya be nameyê \"$1\" ra depoyê doyeyanê barekerdeyan de xora esta, u naye sero nêşeno ke bınuşiyo.",
-       "api-error-file-too-large": "Dosyaye ke şıma rışta zaf gırda.",
-       "api-error-filename-tooshort": "Namayê dosyayi zaf kilm a.",
-       "api-error-filetype-banned": "Tipê ena dosya qedexe biya.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|babetê dosyayo destûrın niyo|babetên dosyeyanê destûrınan niyê}}. {{PLURAL:$3|Babetê dosyayo destûrın|Babetên dosyeyanê destûrınan}}   $2.",
-       "api-error-filetype-missing": "Derganiya dosya kemiya",
-       "api-error-hookaborted": "Vurnayişê tu ke to cerbna pê yew çengal ra terkneya.",
-       "api-error-http": "Xırabiya zerreki:Wasteriya irtabet bırya.",
-       "api-error-illegal-filename": "Ena nameyê dosyayi kebul nibena.",
-       "api-error-internal-error": "Xırabiye zerrek:Na wikide barkerdış de şıma dı çıyê raşt nêşı.",
-       "api-error-invalid-file-key": "Xırabiye zerrek:İdari  depokerdışê dosya nêvineya.",
-       "api-error-missingparam": "Xırabiye zerrek:Parametre waştış dı xırabin",
-       "api-error-missingresult": "Xırabiya zerrek:Kopya kerdışê cı nêbı.",
-       "api-error-mustbeloggedin": "Dosya barkerdışi re cıkewtış icab keno.",
-       "api-error-mustbeposted": "Zırabiya zerrek:HTTP POST waştış icab keno",
-       "api-error-noimageinfo": "Barkerdışê dosya temamya lakin wasterira marê malumat nêdeyayo.",
-       "api-error-nomodule": "Xırabiya zerrek:Sazkerdışê modul dê barkerdışi nêvıraziyayo.",
-       "api-error-ok-but-empty": "Xırabiya zerrek:Wastero cıwan nêdano.",
-       "api-error-overwrite": "Ser yew dosyayê ke hama esta, ser ey qeyd nibena.",
+       "api-error-publishfailed": "Xetay zerrey: Cıgeyrayoği nêşiya dosya rocane akero.",
        "api-error-stashfailed": "Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.",
-       "api-error-publishfailed": "Xetaya zerrey: Cıgeyrayoği nêşiya dosyaya rocaniye akero.",
-       "api-error-stasherror": "Dosya embari rê ke bar biye xeta veciye.",
-       "api-error-timeout": "Cıwab dayışê wasteri peyra mend.",
-       "api-error-unclassified": "Yew xeteyê nizanyeni biya.",
-       "api-error-unknown-code": "$1'dı jew xeta vıciye",
-       "api-error-unknown-error": "Zerre xırabin:Dasoya barkerdış de tay çi raşt nêşı.",
        "api-error-unknown-warning": "İqazo nêzanaye: \"$1\".",
        "api-error-unknownerror": "$1'dı jew xeta vıciye",
-       "api-error-uploaddisabled": "BArkerdış ena wikide qefılneyayo",
-       "api-error-verification-error": "Dosya xırabiya yana derganiya cı xıraba.",
        "duration-seconds": "$1 {{PLURAL:$1|saniya|saniyey}}",
        "duration-minutes": "$1 {{PLURAL:$1|deqa|deqey}}",
        "duration-hours": "($1 {{PLURAL:$1|seate|seati}})",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bayt|bayti}}",
        "limitreport-expansiondepth": "Tewr veşi herayina dergbiyayışi",
        "limitreport-expensivefunctioncount": "Amoriya fonksiyonde vay agozni",
-       "expandtemplates": "Å\9fablonan hêra ker",
+       "expandtemplates": "Å\9eablonan hera kı",
        "expand_templates_intro": "Na pela xususi metın geno u şablonê ke tedeyê reyna reyna hêra keno.\nU hem zi nê fonksiyonan hêra keno\n<nowiki>{{</nowiki>#language:…}}</code>, u zey nê parametreyan\n<nowiki>{{</nowiki>CURRENTDAY}}</code>\nEneri Medya wiki sera xo keno.",
        "expand_templates_title": "Sernameyê weziyeti, misal qandê {{FULLPAGENAME}}.:",
        "expand_templates_input": "sernameyê cıkewtışi:",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
        "mw-widgets-titleinput-description-redirect": "berd be $1",
-       "log-action-filter-newusers": "Babetê hesabvıraştışi:"
+       "randomrootpage": "Pela raştmameya rıçıkıne",
+       "log-action-filter-newusers": "Babetê hesabvıraştışi:",
+       "changecredentials": "Malumatanê karberi bıvurnê",
+       "removecredentials": "Kamiye wedarne",
+       "removecredentials-submit": "Kamiyer wedarne"
 }
index f59d719..00c1e20 100644 (file)
        "passwordreset-emaildisabled": "E-mailowe funkcije su se na toś tom wikiju znjemóžnili.",
        "passwordreset-username": "Wužywarske mě:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "E-mail se woglědaś?",
-       "passwordreset-capture-help": "Jolic nakśickujoš toś ten kašćik, e-mail (z nachylnym gronidłom) buźo se pokazaś a wužywarjeju słaś.",
        "passwordreset-email": "E-mailowa adresa:",
        "passwordreset-emailtitle": "Kontowe drobnostki na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Něchten (nejskerjej ty, z IP-adresu $1) jo anulěrowanje gronidła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} pominał ($4).  {{PLURAL:$3|Slědujuce wužywarske konto jo|Slědujucej wužywarskej konśe stej|Slědujuce wužywarske konta su}} z toś tej e-mailoweju adresu {{PLURAL:$3|zwězane|zwězanej|zwězane}}:\n\n$2\n\n{{PLURAL:$3|Toś to nachylne gronidło spadnjo|Toś tej nachylnej gronidle spadnjotej|Toś te nachylne gronidła spadnu}} za {{PLURAL:$5|jaden źeń|$5 dnja|$5 dny|$5 dnjow}}.\nTy by měł se něnto pśizjawiś a nowe gronidło wustajiś. Jolic něchten drugi jo toś to napšašowanje pósłał, abo jolic sy se zasej na spócetne gronidło spomnjeł a wěcej njocoš jo změniś, móžoš toś to zdźělenje ignorěrowaś a swójo stare gronidło dalej wužywaś.",
        "saveprefs": "Składowaś",
        "restoreprefs": "Wšykne standardne nastajenja wótnowiś (we wšych wótrězkach)",
        "prefs-editing": "Wobźěłaś",
-       "rows": "Rědki:",
-       "columns": "Słupy:",
        "searchresultshead": "Pytaś",
        "stub-threshold": "Formatěrowanje  <a href=\"#\" class=\"stub\">wótkaza na zarodk</a> (w bytach):",
        "stub-threshold-disabled": "Znjemóžnjony",
        "userrights-reason": "Pśicyna:",
        "userrights-no-interwiki": "Njamaš pšawo wužywarske pšawa w drugich wikijach změniś.",
        "userrights-nodatabase": "Datowa banka $1 njeeksistěrujo abo njejo lokalna.",
-       "userrights-nologin": "Musyš se z administratorowym kontom [[Special:UserLogin|pśizjawiś]], aby wužywarske pšawa změnił.",
-       "userrights-notallowed": "Njamaš trěbne pšawa, aby wužywarske pšawa pśipokazało abo zajmjeł.",
        "userrights-changeable-col": "Kupki, kótarež móžoš změniś",
        "userrights-unchangeable-col": "Kupki, kótarež njamóžoš změniś",
        "userrights-conflict": "Konflikt změnow wužywarskich pšawow! Pšosym pśeglědaj a wobkšuś swóje změny.",
-       "userrights-removed-self": "Sy swóje pšawa wuspěšnje wótpórał. Togodla njamaš južo pśistup na toś ten bok měś.",
        "group": "Kupka:",
        "group-user": "wužywarje",
        "group-autoconfirmed": "wobkšuśone wužywarje",
        "right-siteadmin": "Datowu banku zastajiś a zastajenje wótpóraś",
        "right-override-export-depth": "Boki inkluziwnje wótkazanych bokow až do dłyma 5 eksportěrowaś",
        "right-sendemail": "Drugim wužywarjam e-mail pósłaś",
-       "right-passwordreset": "E-maile za slědkstajanje gronidłow se woglědaś",
        "newuserlogpage": "Protokol nowych wužywarjow",
        "newuserlogpagetext": "To jo protokol wó nowych wužywarskich kontow.",
        "rightslog": "Protokol wužywarskich pšawow",
        "uploaddisabledtext": "Nagraśa datajow su znjemóžnjone.",
        "php-uploaddisabledtext": "Nagraśa PHP-datajow su znjemóžnjone. Pšosym pśekontrolěruj nastajenje file_uploads.",
        "uploadscripted": "Toś ta dataja wopśimjejo HTML abo script code, kótaryž móžo wót browsera se zamólnje wuwjasć.",
-       "uploadscriptednamespace": "Toś ta SVG-dataja wopśimujo njedowólony mjenjowy rum '$1'",
+       "uploadscriptednamespace": "Toś ta SVG-dataja wopśimujo njedowólony mjenjowy rum '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML w nagratej dataji njedajo se parsowaś.",
        "uploadvirus": "Toś ta dataja ma wirus! Nadrobnosći: $1",
        "uploadjava": "Toś ta dataja jo ZIP-dataja, kótaraž wopśimujo dataju .class z Javy.\nNagrawanje datajow Javy njejo dowólone, dokulaž mógli wobjeźenje wěstotnych wobgranicowanjow zmóžniś.",
        "feedback-thanks": "Źěkujomy se! Twój komentar jo se k bokoju \"[$2 $1]\" pósłał.",
        "searchsuggest-search": "Pytaś",
        "searchsuggest-containing": "wopśimujo...",
-       "api-error-badaccess-groups": "Njamaš pšawo dataje do toś togo wikija nagraś.",
        "api-error-badtoken": "Nutśikowna zmólka: Wopacny token",
-       "api-error-copyuploaddisabled": "Nagrawanje pśez URL jo na toś tom serwerje znjemóžnjone.",
-       "api-error-duplicate": "{{PLURAL:$1|Jo|Stej|Su|Jo}} južo {{PLURAL:$1|druga dataja|drugej dataji|druge dataje|drugich datajow}} z tym samym wopśimjeśim na sedle",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Jo była druga dataja|Stej byłej drugej dataji|Su byli druge dataje|Jo było drugich datajow}} južo na websedle z tym samym wopśimjeśim, ale {{PLURAL:$1|jo se wulašowała|stej se wulašowałej|su se wulašowali|jo se wulašowało}}.",
-       "api-error-empty-file": "Dataja, kótaruž sy nagrał, jo prozna była.",
        "api-error-emptypage": "Napóranje nowych, proznych bokow njejo dowólone.",
-       "api-error-fetchfileerror": "Nutśikowna zmólka: Pśi wobstarowanju dataje něco njejo se raźiło.",
-       "api-error-fileexists-forbidden": "Dataja z mjenim \"$1\" južo eksistěrujo, a njedajo se pśepisaś.",
-       "api-error-fileexists-shared-forbidden": "Dataja z mjenim \"$1\" južo eksistěrujo w zgromadnem datajowem repozitoriumje a njedajo se pśepisaś.",
-       "api-error-file-too-large": "Dataja, kótaruž sy nagrał, jo pśewjelika była.",
-       "api-error-filename-tooshort": "Datajowe mě jo pśekrotke.",
-       "api-error-filetype-banned": "Toś ten datajowy typ jo zakazany.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|njejo dowólony datajowy typ|njejstej dowólenej datajowej typa|njejsu dowólone datajowe typy|njejsu dowólone datajowe typy}}. {{PLURAL:$3|Dowólony datajowy typ jo|Dowólenej datajowej typa stej|Dowólone datajowe typy su}} $2.",
-       "api-error-filetype-missing": "Dataja njama datajowu kóńcowku.",
-       "api-error-hookaborted": "Změna, kótaruž sy wopytał pśewjasć, jo se pśetergnuła pśez rozšyrjenje.",
-       "api-error-http": "Nutśikowna zmólka: Zwisk ze serwerom njemóžno.",
-       "api-error-illegal-filename": "Datajowe mě njejo dowólone.",
-       "api-error-internal-error": "Nutśikowna zmólka: Pśi pśeźěłowanju twójogo nagraśa na wiki něco njejo se raźiło.",
-       "api-error-invalid-file-key": "Nutśikowna zmólka: Dataja njejo se w temporernem składowaku namakała.",
-       "api-error-missingparam": "Nutśikowna zmólka: Felujuce parametry pśi napšašowanju.",
-       "api-error-missingresult": "Nutśikowna zmólka: Njedajo se zwěsćiś, lěc kopěrowanje jo se raźiło.",
-       "api-error-mustbeloggedin": "Musyš pśizjawjony byś, aby dataje nagrał.",
-       "api-error-mustbeposted": "Nutśikowna zmólka: Napšašowanje pomina se HTTP POST.",
-       "api-error-noimageinfo": "Nagraśe jo se raźiło, ale serwer njejo nam žedne informacije wó dataji dał.",
-       "api-error-nomodule": "Nutśikowna zmólka: Žeden modul nastajony.",
-       "api-error-ok-but-empty": "Nutśikowna zmólka: Žedne wótegrono wót serwera.",
-       "api-error-overwrite": "Pśepisowanje eksistujuceje dataje njejo dowólone.",
-       "api-error-stashfailed": "Nutśikowna zmólka: Serwer njejo mógał temporernu dataju składowaś.",
        "api-error-publishfailed": "Nutśkowna zmólka: Serwer njejo mógł nachylnu dataju wozjawiś.",
-       "api-error-stasherror": "Pśi nagrawanju dataje do chowanki jo zmólka nastała.",
-       "api-error-timeout": "Serwer njejo we wócakanem casu wótgronił.",
-       "api-error-unclassified": "Njeznata zmólka jo nastała.",
-       "api-error-unknown-code": "Njeznata zmólka: \"$1\"",
-       "api-error-unknown-error": "Nutśikowna zmólka: Pśi nagrawanju twójeje dataje něco njejo se raźiło.",
+       "api-error-stashfailed": "Nutśikowna zmólka: Serwer njejo mógał temporernu dataju składowaś.",
        "api-error-unknown-warning": "Njeznate warnowanje: $1",
        "api-error-unknownerror": "Njeznata zmólka: \"$1\".",
-       "api-error-uploaddisabled": "Nagraśa su na toś tom wikiju znjemóžnjone.",
-       "api-error-verification-error": "Toś ta dataja by mógła wobkškóźona byś abo wopacnu kóńcowku měś.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunźe|sekundy|sekundow}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuśe|minuty|minutow}}",
        "duration-hours": "$1 {{PLURAL:$1|góźina|góźinje|góźiny|góźinow}}",
index 2685328..cb1e286 100644 (file)
        "category-file-count-limited": "निम्न {{PLURAL:$1|फाइल|$1 फाइलहरू}} यै श्रेणीमी रया छ ।",
        "listingcontinuesabbrev": "निरन्तरता...",
        "index-category": "क्रमाङ्कित पानाहरू",
-       "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95न à¤¨à¤\97रà¥\80याà¤\95ा à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82",
+       "noindex-category": "à¤\85नà¥\81à¤\95à¥\8dरमित à¤¨à¤\85रियाऽ à¤ªà¤¨à¥\8dनाà¤\85न",
        "broken-file-category": "टुटेको फाइल लिङ्कहरूसितको पाना",
        "about": "बारेमी",
        "article": "सामाग्री पानो",
        "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": "प्रोजेक्ट पानो हेर्न्या",
        "invalidtitle-unknownnamespace": "अपछ्याणो नाउँबार अङ्क $1 रे पाठ \"$2\" भया: अमान्य शीर्षक",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "exception-nologin-text": "येए पन्नालाई चलुनाइ या केयि काम खिलाइ सक्षम हुनाइ लगइन अर:।",
+       "exception-nologin-text-manual": "येइ पन्‍ना या कारवाइ मी पहुँच समर्थता कि न्यूति कृपया $1 अरऽ।",
        "virus-badscanner": "गट्टी मिलजुल: अपछ्याणो भाइरस खोज्ज्या: <em>$1</em>",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "passwordreset": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordreset-username": "प्रयोगकर्ता-नाम:",
        "passwordreset-domain": "डोमेन",
-       "passwordreset-capture": "निस्कने इमेलको नमुना हेर्ने ?",
        "passwordreset-email": "इमेल ठेगाना:",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "accmailtitle": "पासवर्ड पठाइयो",
        "newarticle": "(नयाँ)",
        "newarticletext": "तमले अहिलसम्म नभयाका पानाको लिंङ्क पहिल्यायाका छौ ।\nयो पानो बनौनाखी तल्तिरको कोष्ठमी टाइप गरि । (और जाण्णाखीलेखा [$1 help page] हेर )।\nताखाइ सुधिसार आइपुग्या हौ भण्या, ब्राउजरको  '''back''' बटन थिचिहाल ।",
-       "anontalkpagetext": "----''यो कुरडी पानो अज्ञात प्रयोगकर्ताको हो जनले अहिलसम्म खाता बनायाकै छैन, अथवा जनले यै पानाको उपयोग गर्दैन।\nयस कारण हामीले उनलाई उनरो आइ पी (IP) ठेगानाले चिन्न सकन्छौ। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्तानको साझा हुनसकन्छ ।\nयदि तमी अज्ञात प्रयोगकर्ता हौ र तमलाई अचाहिँदो टिप्पणी भयाको अनुभव गद्दा छौ भण्या भविष्यमी अन्य अज्ञात प्रयोगकर्तासँगको भ्रमबाट बाँच्न कृपया [[Special:CreateAccount|खाता खोल]] अथवा [[Special:UserLogin|प्रवेश गर]] ''",
+       "anontalkpagetext": "<em>यो कुरणीकाआनी पन्ना अज्ञात प्रयोगकर्ता खिलाइ हो जैले अइलसम्म खाता बनायेइको आथिन, अथवा जो यै पन्नाऽ उपयोग अद्दैन।</em>\nतवै हमले उनलाई पछ्याण्णाइ उनरो आइपी (IP) ठेगाना प्रयोग अद्दु पड्ड्या हुन्छ। \nतसो आइपी (IP) ठेगाना भौत प्रयोगकर्तानओ साजो होइसकन्छ।\nयदि तम अज्ञात प्रयोगकर्ता हौ रे तमलाई असजी लाग्द्या टिप्पणी अरीयाऽ अनुभव अरन्छऽ भण्याँ भविष्यमी अन्य अज्ञात प्रयोगकर्ताअनसँङ्ङा भ्रमबठेइ बाँच्चाइ कृपया [[Special:CreateAccount|खाता खोलऽ]] या [[Special:UserLogin|प्रवेश अरऽ]]''",
        "noarticletext": "यै लेखमी अहिल क्यै पन पाठ नाइथी  ।\nतमले और पृष्ठमी\n[[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्या]</span>.",
        "noarticletext-nopermission": "यै लेखमी अहिल केइ पन पाठ नाइथी  ।\nतमले और पानामी\n[[Special:Search/{{PAGENAME}}|यै पानाको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज्न],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्द] सकन्छौ</span>.",
        "userpage-userdoesnotexist": "\"$1\" प्रयोगकर्ता खाता दर्ता अरीया: आथिन।\nयेइ पान्नो बनुन/सम्पादन अद्द चाहन्छ: भण्या विचार अर:।",
        "editingold": "<strong>चेतावनी: तम यै पानाको अति पुरानो अप्रचलित संशोधनलाई सम्पादन गद्द लाग्याछौ ।<strong>\nयदि तमीले यै परिवर्तनलाई सङ्ग्रह गर्यौ भण्या यै पछिका संशोधनहरू नष्ट हुन्याछन् ।",
        "yourdiff": "भिन्नताहरू",
        "copyrightwarning2": "कृपया ध्यान देओ यै {{SITENAME}}मी दियाका योगदानहरूलाई अन्य योगदानकर्ताहरूद्वारा सम्पादन गरिन्याछ, परिवर्तन गरिन्याछ अथवा हटाइन्याछ । यदि तमरो लेखलाई निर्दयता पूर्वक सम्पादन गरेको चाहदैनौ भण्या त्यो यहाँ जनराख।<br />\nयदि तमी किटानसाथ भन्नाछौ कि यो लेख तम आफैले लेख्याको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबठे लियाको हो (विवरणकोलागि हेर $1 ). \n'''कपीराइट भयाको रचना अनुमति बिना  यहाँ जनराख!'''",
-       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95 à¤®à¤°à¥\8dमतà¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dति à¤¬à¤¨à¥\8dद à¤\97रियाà¤\95à¥\8bà¤\9b, à¤¯à¥\88 à¤\95ारण à¤¤à¤®à¥\80 à¤\86फà¥\8dनà¥\8b à¤¸à¤®à¥\8dपादन à¤\85हिलà¥\87 à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97दà¥\8dद à¤¸à¤\95à¥\8dदà¥\8dयाहà¥\8cन à¥¤</strong>\n\nयदि à¤¤à¤®à¥\80 à¤\9aाहनà¥\8dà¤\9bà¥\8c à¤­à¤£à¥\8dया à¤\85हिलà¥\87 à¤¯à¤¹à¤¾à¤\81 à¤­à¤¯à¤¾à¤\95ा à¤ªà¤¾à¤ à¤²à¤¾à¤\88 à¤\95पि à¤\97रि à¤\95तà¥\88 à¤\9fà¥\87à¤\95à¥\8dसà¥\8dà¤\9f à¤«à¤¾à¤\87लमà¥\80 à¤ªà¥\87सà¥\8dà¤\9f à¤\97रिबर à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97दà¥\8dद à¤¸à¤\95à¥\8dदà¥\8dयाहà¥\8c à¥¤\n\nपà¥\8dरवनà¥\8dधà¤\95 à¤\9cनलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\8dयाà¤\95à¥\8b à¤\9b à¤\89नलà¥\87 à¤¯à¤¸à¥\8b à¤µà¤¿à¤µà¤°à¤£ à¤¦à¤¿à¤¯à¤¾à¤\95à¥\8b छ: $1",
+       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¡à¤¾à¤\9fाबà¥\87स à¤®à¤°à¥\8dमत à¤\96िलाà¤\88 à¤¬à¤¨à¥\8dद à¤\85रà¥\80रà¥\88à¤\9b, à¤\87सà¥\88 à¤\95ारण à¤¤à¤®à¥\80 à¤\85à¤\87ल à¤\86फà¥\81ना à¤¸à¤®à¥\8dपादनà¤\85न à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97दà¥\8dद à¤¸à¤\95à¥\8dदà¥\8dयाहà¥\8cन।</strong>\nतम à¤¯à¥\87à¤\87 à¤ªà¤¾à¤  à¤²à¤¾à¤\88 à¤¸à¤¾à¤¦à¤¾à¤ªà¤¾à¤  à¤«à¤¾à¤\87ल à¤®à¥\80 à¤¨à¤\95ल à¤\85रà¥\80बर à¤¸à¤¾à¤¦à¥\8dद à¤°à¥\87 à¤ªà¤\9bा à¤\96िलाà¤\87 à¤¸à¤\9eà¥\8dâ\80\8dà¤\9aय à¤\85रà¥\80बर à¤°à¤¾à¤\96à¥\80 à¤¸à¤\95नà¥\8dà¤\9bऽ।\n\nपà¥\8dरवनà¥\8dधà¤\95 à¤\9cनलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\8dयाà¤\95à¥\8b à¤\9b à¤\89नलà¥\87 à¤\87सà¥\8b à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रण à¤¦à¥\80राà¤\87छ: $1",
        "protectedpagewarning": "<strong>सूचना: यै पानालाई सुरक्षित गरियाको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यैलाई सम्पादन गद्द सक्द्याछन् ।</strong>\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइयाको छ:",
        "templatesused": "यै पानामी राखियाका {{PLURAL:$1|Template|ढाँचाहरू}} :",
        "templatesusedsection": "यै खण्डमी {{PLURAL:$1|ढाँचा प्रयोग गरियाको छ|ढाँचाहरू प्रयोग गरियाका छन्}}",
        "rev-suppressed-text-unhide": "यै पानाको पुनरावलोकन '''दमन''' गरियाको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पानो={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तम अगाडि बढ्ड चाहन्छौ भण्या पनि तमीले  [$1 यि संशोधनहरू हेद्द] पाउन्या हौ ।",
        "rev-delundel": "दधेखाउने/लुकाउन्या",
        "rev-showdeleted": "धेकाउन्या",
-       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\8dया/मà¥\87à¤\9fाà¤\88या à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "revisiondelete": "पà¥\81नरावलà¥\8bà¤\95नà¤\85न à¤®à¥\87à¤\9fà¥\8dयाऽ/मà¥\87à¤\9fà¥\8dयाऽ à¤°à¤¦à¥\8dद à¤\85दà¥\8dदà¥\8dया",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-no-file": "खुलाइएको पाना अस्तित्वमी छैन",
        "revdelete-show-file-submit": "हो",
        "searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्या",
        "search-result-size": "$1 ({{PLURAL:$2|1 आँखर|$2 आँखर}})",
        "search-result-category-size": "{{PLURAL:$1|एक सदस्य|$1 सदस्यहरू}} ({{PLURAL:$2|1 उपश्रेणी|$2  उपश्रेणीहरू}}, {{PLURAL:$3|एउटा फाइल|$3 फाइलहरू}})",
-       "search-redirect": "(जान्या $1)",
+       "search-redirect": "($1 बठेइ पुन:निर्देशित)",
        "search-section": "(खण्ड $1)",
        "search-category": "(श्रेणी $1)",
        "search-file-match": "(भेटिईया फाइल सामाग्री)",
        "saveprefs": "संग्रह",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमी)",
        "prefs-editing": "सम्पादन",
-       "rows": "हरफहरू :",
-       "columns": "स्तम्भहरू :",
        "searchresultshead": "खोज",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
+       "stub-threshold": "ठूटो लिङ्क स्वरूपण ($1) खिलाइ थ्रेसहोल्ड:",
        "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "निष्क्रिय",
        "recentchangesdays": "हालको परिवर्तनमी धेकाउने दिनहरू:",
        "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
        "userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
-       "userrights-lookup-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤®à¥\82ह à¤µà¥\8dयवसà¥\8dथापन à¤\97र",
+       "userrights-lookup-user": "यà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\9bानऽ",
        "userrights-user-editname": "प्रयोगकर्ता नाम दिय:",
-       "editusergroup": "{{GENDER:$1|प्रयोगकर्ता}}समूहहरू सम्पादन",
+       "editusergroup": "प्रयोगकर्ता समूहअन लोड अरऽ",
        "userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादन गर",
        "saveusergroups": "सुरक्षित {{GENDER:$1|प्रयोगकर्ता}} समूहहरू",
        "userrights-groupsmember": "को सदस्य:",
        "userrights-changeable-col": "तमले परिवर्तन गद्द सक्दया समूहअन",
        "userrights-unchangeable-col": "तमीले परिवर्तन गद्द नसक्ने समूहहरू",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमी मतभेद भयो ! कृपया तमरो परिवर्तन पुनरावलोकन तथा पुष्टि गर ।",
-       "userrights-removed-self": "तमले सफलतापूर्वक आफनो अधिकारहरूलाई मेटाया । त्यै कारण तम आब यो पानो हेद्द नाइसक्दा ।",
        "group": "समूह:",
        "group-user": "प्रयोगकर्ताहरू",
        "group-autoconfirmed": "स्वत स्थापित प्रयोगकर्ताहरू",
        "protect-default": "सब्बै प्रयोगकर्तानहरूलाई अनुमति दिन्या",
        "protect-level-autoconfirmed": "नौला तथा दर्ता भयाका प्रयोगकर्तानलाई मात्र अनुमति दिन्या",
        "protect-cascade": "यै पानामी संलग्न सुरक्षित पानाहरू (लामबद्द सुरक्षा)",
-       "protect-expiry-options": "२ à¤\98णà¥\8dà¤\9fाहरà¥\82:2 hours,१ à¤¦à¤¿à¤¨ :1 day,३ à¤¦à¤¿à¤¨à¤¹à¤°à¥\82:3 days,१ à¤¹à¤ªà¥\8dता:1 week,२ à¤¹à¤ªà¥\8dताहरà¥\82:2 weeks,१ à¤®à¤¹à¤¿à¤¨à¤¾:1 month,३ à¤®à¤¹à¤¿à¤¨à¤¾à¤¹à¤°à¥\82:3 months,६ à¤®à¤¹à¤¿à¤¨à¤¾à¤¹à¤°à¥\82:6 months,१ à¤µà¤°à¥\8dष:1 year,à¤\85नà¤\97िनà¥\8dतà¥\80:infinite",
+       "protect-expiry-options": "१ à¤\98णà¥\8dà¤\9fा:1 hour, à¥§ à¤¦à¤¿à¤¨ :1 day, à¥§ à¤¹à¤ªà¥\8dता:1 week, à¥¨ à¤¹à¤ªà¥\8dता:2 weeks, à¥§ à¤®à¥\88ना:1 month, à¥© à¤®à¥\88ना:3 months,६ à¤®à¥\88ना:6 months, à¥§ à¤¸à¤¾à¤²:1 year, à¤\85ननà¥\8dतà¤\95ाल:infinite",
        "restriction-type": "अनुमति:",
        "pagesize": "(अक्षरहरू)",
        "undeletepage": "मेट्याका पानाहरू हेद्या र पूर्वरुपमी फर्काउन्या",
        "logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|खोलियो}}",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
        "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
-       "searchsuggest-search": "खोज:",
-       "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल छ|भयाका  केहि अरु फाइलहरू छन्}} ।",
-       "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल थियो|भयाका केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
+       "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: खोल नामहरूको अगाडी डबल-क्लिक गर जसले तमलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।"
index 40d6931..2f0c263 100644 (file)
@@ -7,7 +7,8 @@
                        "Ushau97",
                        "Zhatre",
                        "לערי ריינהארט",
-                       "Glaisher"
+                       "Glaisher",
+                       "MtDu"
                ]
        },
        "tog-hideminor": "ކުދި އުނި އިތުރުތައް އެންމެފަހުގެ ބަދަލުތަކުގެ ލިސްޓުން ފޮރުއްވަވާ",
        "namespaces": "ނަންސްޕޭސަސް",
        "errorpagetitle": "ކުށް",
        "returnto": "އަނބުރާ $1 އަށް ވަޑައިގަންނަވާ!",
-       "tagline": "ވިކިޕީޑިއާ އިން",
+       "tagline": "ވިކިޕީޑިއާ އިން{{SITENAME}}",
        "help": "އެހީ",
        "search": "ހޯއްދަވާ",
        "searchbutton": "ހޯއްދަވާ",
index 1d12d07..c22982f 100644 (file)
@@ -14,6 +14,7 @@
        "tog-hideminor": "Lōga 'l mudéfichi pió céchi int al j ûltmi mudéfichi.",
        "tog-hidepatrolled": "Lōga 'l mudéfichi verifichêdi int al j ûltmi mudéfichi",
        "tog-newpageshidepatrolled": "Lōga al pàgini verifichêdi da l'elèinch dal pàgini pió nōvi.",
+       "tog-hidecategorization": "Scònd al categoréi dal pàgini",
        "tog-extendwatchlist": "Fà vèder tót' al mudéfichi fât a i tgnû sòt ôc, mìa sōl l'ûltma.",
        "tog-usenewrc": "Unés al mudéfichi per pàgina int al j ûltmi mudéfichi e in quî tgnû sòt' ôc.",
        "tog-numberheadings": "Cûnta automâtica di tétol ed sesiòun.",
@@ -24,6 +25,7 @@
        "tog-watchdefault": "Zûnta al pàgini e i file mudifichê int i tgnû 'd ôc specêl.",
        "tog-watchmoves": "Zûnta al pàgini e i file spustê int i tgnû 'd ôc specêl.",
        "tog-watchdeletion": "Zûnta al pàgini e i file scanşlê int i tgnû 'd ôc specêl.",
+       "tog-watchuploads": "Zûnta i file nōv che câregh a quî che tègn adrē",
        "tog-watchrollback": "Zûta al pàgini in dóv' ó fât al ritōren a la pàgina 'd préma a i tgnû 'd ôc specêl",
        "tog-minordefault": "Sègna ògni mudéfica cme céca (sōl cme pre-stabilî)",
        "tog-previewontop": "Fà vèder còl ch' ò fât sōver la caşèla ed mudéfica e mìa sòta.",
        "passwordreset-emaildisabled": "In cla wiki ché è stê bluchê al funsiòun ed la pôsta eletrônica.",
        "passwordreset-username": "Nòm utèint:",
        "passwordreset-domain": "Proprietê:",
-       "passwordreset-capture": "Vōt vèder còl che dèinter int al mesâg ed pôsta eletrônica?",
-       "passwordreset-capture-help": "S' es sernés cla caşèla ché, l'indirés ed pôsta eletrônica (cun la cêva 'd ingrès pruvişôria), év vîn fâ vèder, d'ed là 'd èser spidî a l'utèint.",
        "passwordreset-email": "Indirés pôsta eletrônica",
        "passwordreset-emailtitle": "Particulêr ed l'utèint só {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quelchidûn (prubabilmèint té, cun l'indirés IP $1) l'à dmandê de spidîregh 'na nōva cêva 'd ingrès per andêr dèinter a {{SITENAME}} ($4). {{PLURAL:$3|L'utèint inscrét| J utèint inscrét}} a sté indirés ed pôsta eletrônica în:\n \n$2 \n\n{{PLURAL:$3|Cla cêva 'd ingrès pruvişôria la scadrà| St' al cêvi 'd ingrès pruvişôri ché scadrân}} dôp {{PLURAL:$5|ûn dé|$5 dé}}. Ét duvrés andêr dèinter e sernîr 'na cêva 'd ingrès nōva adès. \n\nSe t'é mìa stê té a fêr la dmânda, o s' ét t'é ricurdê la cêva 'd ingrès uriginêla e an 't vō mia pió cambiêrla, ét pō scanşlêr cól mesâg ché e cuntinvêr a druvêr la tó cêva 'd ingrès vècia.",
        "saveprefs": "Sêlva",
        "restoreprefs": "Turnêr a mèter al j impustasiòun ed partèinsa (in tót al sesiòun)",
        "prefs-editing": "Caşèla 'd mudéfica",
-       "rows": "Rîghi",
-       "columns": "Clòuni:",
        "searchresultshead": "Sērca",
        "stub-threshold": "Pôrta per i colegamèint a j abòs ($1):",
        "stub-threshold-disabled": "Bluchê",
        "prefswarning-warning": "T'é fât dal mudéfichi al tō preferèinsi ch'în mìa stêdi salvêdi. S'ét vê fōra da cla pàgina ché sèinsa clichêr \"$1\" al preferèinsi a gnîran mìa arnuvêdi.",
        "prefs-tabs-navigation-hint": "Sugerimèint: è pusébil druvêr i tâst frècia a mansèina e a dréta per spustêres tr'al schēdi int l'elèinch dal schēdi.",
        "userrights": "Gestiòun di permès relatîv a j utèint",
-       "userrights-lookup-user": "Gestiòun di gróp utèint",
+       "userrights-lookup-user": "Sernîr 'n utèint",
        "userrights-user-editname": "Mèt dèinter al nòm utèint:",
-       "editusergroup": "Mudéfica i gróp {{GENDER:$1|utèint}}",
+       "editusergroup": "Mudéfica i gróp utèint.",
        "editinguser": "Mudéfica i dirét utèint ed j {{GENDER:$1|utèint}}<strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Mudéfica gróp utèint",
        "saveusergroups": "Sêlva i gróp{{GENDER:$1|utèint}}",
        "userrights-reason": "Mutîv:",
        "userrights-no-interwiki": "An es gh'à mìa i permès necesâri per cambiêr i dirét ed j utèint in sém a êter sît.",
        "userrights-nodatabase": "Al databēş $1 al gh'é mìa o an n' mìa un databêş lochêl.",
-       "userrights-nologin": "Per dêr i dirét a j utèint l'é necesâri [[Special:UserLogin|fêr l'ingrès]] cme aministardōr.",
-       "userrights-notallowed": "An 't gh'ê mìa al permès per zuntêr o tōr via i permès utèint.",
        "userrights-changeable-col": "Gróp ch'es pōlen mudifichêr.",
        "userrights-unchangeable-col": "Gróp ch'an 's pōlen mìa mudifichêr.",
        "userrights-conflict": "Cuntrâst ed mudéfica di dirét utèint! Cuntròla e cunfērma al tó mudéfichi.",
-       "userrights-removed-self": "T'é tôt via i tō dirét. E dòunca, an 't prê pió andêr dèinter a cla pàgina ché.",
        "group": "Gróp:",
        "group-user": "Utèint",
        "group-autoconfirmed": "Utèint cunvalidê da per ló",
        "group-bot": "Bot",
        "group-sysop": "Aministradōr",
        "group-bureaucrat": "Funsionâri",
-       "group-suppress": "Oversight",
+       "group-suppress": "Soppressori",
        "group-all": "(tót)",
        "group-user-member": "{{GENDER:$1|utèint}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utèint convalidê da per ló}}",
        "right-siteadmin": "Blōca e şblōca al databêş",
        "right-override-export-depth": "Pôrta fōra al pàgini cun insèm al pàgini coleghêdi per 'na larghèsa ed 5",
        "right-sendemail": "Spidés pôsta eletrônica a êter utèint",
-       "right-passwordreset": "A vèd i mesâg 'd arnōv ed la cêva 'ed ingrès",
        "right-managechangetags": "Fa e mèt in funsiòun/blôca al j [[Special:Tags|etichèti]]",
        "right-applychangetags": "Tâca dal [[Special:Tags|tichèti]] al tō mudéfichi",
        "right-changetags": "Zûta e tó via [[Special:Tags|tichèti]] precîşi só versiòun ónichi o vōş ed regéster",
        "action-upload_by_url": "carghêr cól file ché da 'n indirés URL",
        "action-writeapi": "drōva al j API in scritûra",
        "action-delete": "scanşlêr cla pàgina ché",
-       "action-deleterevision": "scanşlêr cla versiòun ché",
-       "action-deletedhistory": "guêrda la stòria scanşlêda de sté pàgina",
+       "action-deleterevision": "scanşlêr al versiòun",
+       "action-deletedhistory": "guêrda la stòria scanşlêda ed 'na pàgina",
        "action-browsearchive": "serchêr pàgini scanşlêdi",
-       "action-undelete": "tōr indrê cla pàgina ché",
-       "action-suppressrevision": "turnêr a vèder e mèter al mudéfichi lughêdi",
+       "action-undelete": "tōr indrê pàgini",
+       "action-suppressrevision": "turnêr a vèder e turnêr a mèter al versiòun lughêdi",
        "action-suppressionlog": "guardêr sté regéster privê",
        "action-block": "bluchê sté utèint in scritûra",
        "action-protect": "cambiêr i livē 'd prutesiòun per cla  pàgina ché",
        "uploaddisabledtext": "La cârga di file an n'é mìa atîva.",
        "php-uploaddisabledtext": "La cârga dal file cun PHP l'é bluchêda. Cuntròla che 'l file_uploads al sìa bèin impustê.",
        "uploadscripted": "Cól file ché al gh'à un côdis o di script, che prén èser mìa capî bèin da un navigadōr internèt.",
-       "uploadscriptednamespace": "Cól file SVG ché al gh'à un namespace '$1' mìa permés.",
+       "uploadscriptednamespace": "Cól file SVG ché al gh'à un namespace '<nowiki>$1</nowiki>' mìa permés.",
        "uploadinvalidxml": "Al côdis XML int al file al pōl mìa èser lavurê bèin.",
        "uploadvirus": "Cól fil ché al ghè un 'virus'! Particulêr: $1",
        "uploadjava": "Cól file ché l'é un file ZIP che 'l gh'à dèinter un file .class Java. Carghêr i file Java an n'é mìa permés, perché pōlen schivşêr i lémit ed sicurèsa.",
        "feedback-cancel": "Scanşela",
        "feedback-message": "Mesâg",
        "feedback-subject": "Argomèint:",
-       "searchsuggest-search": "Sèirca"
+       "searchsuggest-search": "Sērca dèinter ed {{SITENAME}}"
 }
index 34ad595..93c33eb 100644 (file)
        "searcharticle": "Μετάβαση",
        "history": "Ιστορικό σελίδας",
        "history_short": "Ιστορικό",
+       "history_small": "ιστορικό",
        "updatedmarker": "ενημερώθηκαν από την τελευταία επίσκεψή μου",
        "printableversion": "Εκτυπώσιμη έκδοση",
        "permalink": "Σταθερός σύνδεσμος",
        "nospecialpagetext": "<strong>Ζητήσατε μια μη έγκυρη ειδική σελίδα.</strong>\n\nΈνας κατάλογος έγκυρων ειδικών σελίδων μπορεί να βρεθεί στη σελίδα [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Σφάλμα",
        "databaseerror": "Σφάλμα στη βάση δεδομένων",
-       "databaseerror-text": "Παρουσιάστηκε ένα σφάλμα ερωτήματος βάσης δεδομένων.\nΑυτό μπορεί να υποδεικνύει ένα σφάλμα στο λογισμικό.",
+       "databaseerror-text": "Παρουσιάστηκε σφάλμα ερωτήματος βάσης δεδομένων.\nΑυτό μπορεί να είναι ένδειξη προγραμματιστικού σφάλματος στο λογισμικό.",
        "databaseerror-textcl": "Παρουσιάστηκε ένα σφάλμα ερωτήματος βάσης δεδομένων.",
        "databaseerror-query": "Ερώτημα: $1",
        "databaseerror-function": "Λειτουργία: $1",
        "createacct-benefit-body2": "{{PLURAL:$1|σελίδα|σελίδες}}",
        "createacct-benefit-body3": "{{PLURAL:$1|πρόσφατος συνεισφέρων|πρόσφατοι συνεισφέροντες}}",
        "badretype": "Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.",
-       "usernameinprogress": "Î\9cία Î´Î·Î¼Î¹Î¿Ï\85Ï\81γία Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d Î³Î¹Î± Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η ÎµÎ¯Î½Î±Î¹ Î®Î´Î· Ï\83ε ÎµÎ¾Î­Î»Î¹Î¾Î·.\nΠαÏ\81ακαλÏ\8e περιμένετε.",
+       "usernameinprogress": "Î\95ίναι Î®Î´Î· Ï\83ε ÎµÎ¾Î­Î»Î¹Î¾Î· Î´Î·Î¼Î¹Î¿Ï\85Ï\81γία Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d Î³Î¹Î± Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η.\nΠαÏ\81ακαλοÏ\8dμε περιμένετε.",
        "userexists": "Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.\nΠαρακαλούμε, διαλέξτε ένα διαφορετικό.",
        "loginerror": "Σφάλμα σύνδεσης",
        "createacct-error": "Σφάλμα δημιουργίας λογαριασμού",
        "nocookiesnew": "Ο λογαριασμός χρήστη έχει δημιουργηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και στη συνέχεια συνδεθείτε χρησιμοποιώντας το νέο όνομα χρήστη σας και τον κωδικό σας.",
        "nocookieslogin": "Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!",
        "nocookiesfornew": "Ο λογαριασμός χρήστη δεν δημιουργήθηκε, καθώς δεν μπορούσε να επιβεβαιώσει την πηγή του. \n Βεβαιωθείτε ότι έχετε ενεργοποιήσει τα cookies, ξαναφορτώστε αυτή τη σελίδα και προσπαθήστε ξανά.",
-       "createacct-loginerror": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î¼Îµ ÎµÏ\80ιÏ\84Ï\85Ï\87ία, Î±Î»Î»Î¬ Î´ÎµÎ½ Î¼Ï\80οÏ\81έÏ\83αÏ\84ε Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î±Ï\85Ï\84Ï\8cμαÏ\84α. Î Î±Ï\81ακαλÏ\8e [[Special:UserLogin|Ï\83Ï\85νδεθείÏ\84ε Ï\87ειÏ\81οκίνηÏ\84α]].",
+       "createacct-loginerror": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î¼Îµ ÎµÏ\80ιÏ\84Ï\85Ï\87ία, Î±Î»Î»Î¬ Î´ÎµÎ½ Î®Ï\84αν Î´Ï\85ναÏ\84Ï\8cν Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î±Ï\85Ï\84Ï\8cμαÏ\84α. Î Î±Ï\81ακαλοÏ\8dμε [[Special:UserLogin|Ï\83Ï\85νδεθείÏ\84ε Î¼Îµ Ï\84ο Ï\87έÏ\81ι]].",
        "noname": "Το όνομα χρήστη που έχετε καθορίσει δεν είναι έγκυρο.",
        "loginsuccesstitle": "Επιτυχής σύνδεση",
        "loginsuccess": "Είστε συνδεδεμένος(-η) στο {{SITENAME}} ως \"$1\".",
        "wrongpasswordempty": "Ο κωδικός πρόσβασης που εισάχθηκε ήταν κενός. Παρακαλούμε προσπαθήστε ξανά.",
        "passwordtooshort": "Οι κωδικοί πρέπει να περιέχουν τουλάχιστον {{PLURAL:$1|1 χαρακτήρα|$1 χαρακτήρες}}.",
        "passwordtoolong": "Οι κωδικοί πρόσβασης δεν μπορούν να υπερβαίνουν {{PLURAL:$1|τον 1 χαρακτήρα|τους $1 χαρακτήρες}}.",
-       "passwordtoopopular": "ΣÏ\85νήθÏ\89Ï\82 ÎµÏ\80ιλέγονÏ\84αι Î¿Î¹ ÎºÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î´ÎµÎ½ Î¼Ï\80οÏ\81οÏ\8dν Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιηθοÏ\8dν. Î Î±Ï\81ακαλÏ\8e ÎµÏ\80ιλέξÏ\84ε Î¼Î¹Î± Ï\80ιο Î¼Î¿Î½Î±Î´Î¹ÎºÏ\8c ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82.",
+       "passwordtoopopular": "Î\9aοινÏ\8cÏ\84Ï\85Ï\80α Ï\83Ï\85νθημαÏ\84ικά Ï\80οÏ\85 Ï\84είνοÏ\85ν Î½Î± ÎµÏ\80ιλέγονÏ\84αι Ï\83Ï\85Ï\87νά Î±Ï\80Ï\8c Ï\84οÏ\85Ï\82 Ï\87Ï\81ήÏ\83Ï\84εÏ\82 Î´ÎµÎ½ Î¼Ï\80οÏ\81οÏ\8dν Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιηθοÏ\8dν. Î Î±Ï\81ακαλοÏ\8dμε ÎµÏ\80ιλέξÏ\84ε ÎºÎ¬Ï\80οιο Ï\80ιο Î¼Î¿Î½Î±Î´Î¹ÎºÏ\8c Ï\83Ï\85νθημαÏ\84ικÏ\8c.",
        "password-name-match": "Ο κωδικός σου θα πρέπει να είναι διαφορετικός από το όνομα χρήστη σου.",
        "password-login-forbidden": "Η χρήση αυτού του ονόματος χρήστη και συνθηματικού έχουν  απαγορευτεί.",
        "mailmypassword": "Επαναφορά κωδικού",
        "accountcreated": "Ο λογαριασμός δημιουργήθηκε",
        "accountcreatedtext": "Ο λογαριασμός χρήστη για τον/την [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|συζήτηση]]) έχει δημιουργηθεί.",
        "createaccount-title": "Δημιουργία λογαριασμού για {{SITENAME}}",
-       "createaccount-text": "Î\9aάÏ\80οιοÏ\82 Î´Î·Î¼Î¹Î¿Ï\8dÏ\81γηÏ\83ε Î­Î½Î±Î½ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Î³Î¹Î± Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η email Ï\83αÏ\82 Ï\83Ï\84ο {{SITENAME}} ($4) Î¼Îµ Ï\84ο Ï\8cνομα \"$2\", Î¼Îµ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 \"$3\". Î\98α Ï\80Ï\81έÏ\80ει Î½Î± Ï\83Ï\85νδεθείÏ\84ε ÎºÎ±Î¹ Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Ï\84Ï\8eÏ\81α.\n\nÎ\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î±Î³Î½Î¿Î®Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î¼Î®Î½Ï\85μα, Î±Î½ Î±Ï\85Ï\84Ï\8cÏ\82 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε ÎµÏ\83Ï\86αλμένα.",
+       "createaccount-text": "Î\9aάÏ\80οιοÏ\82 Î´Î·Î¼Î¹Î¿Ï\8dÏ\81γηÏ\83ε Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Î³Î¹Î± Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Ï\83αÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Ï\83Ï\84ο {{SITENAME}} ($4) Î¼Îµ Ï\8cνομα Â«$2» ÎºÎ±Î¹ Ï\83Ï\85νθημαÏ\84ικÏ\8c Â«$3». Î¤Ï\8eÏ\81α Î¸Î± Ï\80Ï\81έÏ\80ει Î½Î± Ï\83Ï\85νδεθείÏ\84ε ÎºÎ±Î¹ Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84ο Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\83αÏ\82.\n\nÎ\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î±Î³Î½Î¿Î®Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î¼Î®Î½Ï\85μα, Î±Î½ Î±Ï\85Ï\84Ï\8cÏ\82 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î±Ï\80Ï\8c Î»Î¬Î¸Î¿Ï\82.",
        "login-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
        "login-abort-generic": "Η είσοδος σας απέτυχε - Ματαίωση",
        "login-migrated-generic": "Ο λογαριασμός σας έχει μεταναστεύσει, και το όνομα χρήστη σας δεν υπάρχει πλέον σε αυτό το wiki.",
        "resetpass_submit": "Δώστε κωδικό πρόσβασης και συνδεθείτε",
        "changepassword-success": "Ο κωδικός πρόσβασής σας άλλαξε!",
        "changepassword-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
-       "botpasswords": "Î\9aÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î³Î¹Î± Î\9cÏ\80οτ",
-       "botpasswords-summary": "<em>Î\9fι ÎºÏ\89δικοί Ï\84Ï\89ν Î¼Ï\80οÏ\84</em> Î´Î¯Î½Î¿Ï\85ν Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Î¼Î­Ï\83Ï\89 Ï\84οÏ\85 API Ï\87Ï\89Ï\81ίÏ\82 Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιοÏ\8dνÏ\84αι Ï\84α Ï\83Ï\85νθημαÏ\84ικά Ï\84ηÏ\82 ÎºÏ\8dÏ\81ιαÏ\82 Ï\83Ï\8dνδεÏ\83ηÏ\82 Ï\84οÏ\85 Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d. Î¤Î± Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\8cÏ\84αν Î¼Îµ Ï\83Ï\8dνδεÏ\83η Î¼Î­Ï\83Ï\89 ÎºÏ\89δικοÏ\8d Î¼Ï\80οÏ\84 Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ¯Î½Î±Î¹ Ï\80εÏ\81ιοÏ\81ιÏ\83μένα.\n\nÎ\91ν Î´ÎµÎ½ Î¾Î­Ï\81εÏ\84ε Î³Î¹Î±Ï\84ί Î¸Î­Î»ÎµÏ\84ε Î½Î± Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε Î±Ï\85Ï\84Ï\8c, ÎºÎ±Î»Ï\8dÏ\84εÏ\81α Î½Î± Î¼Î·Î½ Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε. Î\9aανένα Î´ÎµÎ½ Î¸Î± Ï\80Ï\81έÏ\80ει Î½Î± Ï\83αÏ\82 Î¶Î·Ï\84ήÏ\83ει Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε Î­Î½Î± Ï\84έÏ\84οιο ÎºÏ\89δικÏ\8c ÎºÎ±Î¹ Î½Î± Ï\84οÏ\85 Ï\84ον γνωστοποιήσετε.",
-       "botpasswords-disabled": "Î\9fι ÎºÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\89ν Ï\81ομÏ\80Ï\8cÏ\84 ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένοι.",
-       "botpasswords-no-central-id": "Î\93ια Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84οÏ\85Ï\82 ÎºÏ\89δικοÏ\8dÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\89ν ρομπότ θα πρέπει να συνδεθείτε με έναν κεντρικό λογαριασμό.",
-       "botpasswords-existing": "Î¥Ï\80άÏ\81Ï\87ονÏ\84εÏ\82 ÎºÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 ρομπότ",
-       "botpasswords-createnew": "Δημιουργία νέου κωδικού πρόσβασης ρομπότ",
-       "botpasswords-editexisting": "Επεξεργασία υπάρχοντος κωδικού πρόσβασης ρομπότ",
-       "botpasswords-label-appid": "Î\9fνομαÏ\83ία ρομπότ:",
+       "botpasswords": "ΣÏ\85νθημαÏ\84ικά Î³Î¹Î± Ï\81ομÏ\80Ï\8cτ",
+       "botpasswords-summary": "<em>Τα Ï\83Ï\85νθημαÏ\84ικά Î³Î¹Î± Ï\81ομÏ\80Ï\8cÏ\84</em> ÎµÏ\80ιÏ\84Ï\81έÏ\80οÏ\85ν Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Î¼Î­Ï\83Ï\89 Ï\84οÏ\85 API Ï\87Ï\89Ï\81ίÏ\82 Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιοÏ\8dνÏ\84αι Ï\84α ÎºÏ\8dÏ\81ια Î´Î¹Î±Ï\80ιÏ\83Ï\84εÏ\85Ï\84ήÏ\81ια Ï\83Ï\8dνδεÏ\83ηÏ\82 Ï\84οÏ\85 Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d. Î¤Î± Î´Î¹Î±Î¸Î­Ï\83ιμα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\8cÏ\84αν ÎµÎ¯Î½Î±Î¹ Ï\83ε Ï\83Ï\8dνδεÏ\83η Î¼Î­Ï\83Ï\89 Ï\83Ï\85νθημαÏ\84ικοÏ\8d Î³Î¹Î± Ï\81ομÏ\80Ï\8cÏ\84 Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ¯Î½Î±Î¹ Ï\80εÏ\81ιοÏ\81ιÏ\83μένα.\n\nÎ\91ν Î´ÎµÎ½ Î¾Î­Ï\81εÏ\84ε Î³Î¹Î±Ï\84ί Î½Î± Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε Î±Ï\85Ï\84Ï\8c, ÎºÎ±Î»Ï\8dÏ\84εÏ\81α Î½Î± Î¼Î·Î½ Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε. Î\9aανείÏ\82 Ï\80οÏ\84έ Î´ÎµÎ½ Ï\80Ï\81έÏ\80ει Î½Î± Ï\83αÏ\82 Î¶Î·Ï\84ήÏ\83ει Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε Î­Î½Î± Ï\84έÏ\84οιο Ï\83Ï\85νθημαÏ\84ικÏ\8c ÎºÎ±Î¹ Î½Î± Ï\84οÏ\85 Ï\84ο γνωστοποιήσετε.",
+       "botpasswords-disabled": "Τα Ï\83Ï\85νθημαÏ\84ικά Ï\84Ï\89ν Ï\81ομÏ\80Ï\8cÏ\84 ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένα.",
+       "botpasswords-no-central-id": "Î\93ια Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\83Ï\85νθημαÏ\84ικά Î³Î¹Î± ρομπότ θα πρέπει να συνδεθείτε με έναν κεντρικό λογαριασμό.",
+       "botpasswords-existing": "Î¥Ï\80άÏ\81Ï\87ονÏ\84α Ï\83Ï\85νθημαÏ\84ικά ρομπότ",
+       "botpasswords-createnew": "Δημιουργία νέου συνθηματικού ρομπότ",
+       "botpasswords-editexisting": "Επεξεργασία υπάρχοντος συνθηματικού ρομπότ",
+       "botpasswords-label-appid": "Î\8cνομα Ï\84οÏ\85 ρομπότ:",
        "botpasswords-label-create": "Δημιουργία",
        "botpasswords-label-update": "Ενημέρωση",
        "botpasswords-label-cancel": "Ακύρωση",
        "botpasswords-label-delete": "Διαγραφή",
-       "botpasswords-label-resetpassword": "Επαναφορά κωδικού",
+       "botpasswords-label-resetpassword": "Επαναφορά του συνθηματικού",
        "botpasswords-label-grants": "Ισχύουσες άδειες:",
        "botpasswords-help-grants": "Κάθε παραχώρηση δίνει πρόσβαση στα ορισμένα δικαιώματα χρήστη που που ήδη έχει ένας λογαριασμός χρήστη. Δείτε τη [[Special:ListGrants|πίνακας παραχωρήσεων]] για περισσότερες πληροφορίες.",
        "botpasswords-label-grants-column": "Χορηγήθηκε",
-       "botpasswords-bad-appid": "Î\97 Î¿Î½Î¿Î¼Î±Ï\83ία Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Â«$1» Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81η.",
+       "botpasswords-bad-appid": "Το Ï\8cνομα Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Â«$1» Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81ο.",
        "botpasswords-insert-failed": "Αποτυχία να προστεθεί το όνομα bot \"$1\". Έχει ήδη προστεθεί;",
-       "botpasswords-update-failed": "Î\91Ï\80οÏ\84Ï\85Ï\87ία ÎµÎ½Î·Î¼Î­Ï\81Ï\89Ï\83ηÏ\82 Ï\84ηÏ\82 Î¿Î½Î¿Î¼Î±Ï\83ίαÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Â«$1». Î\9cήÏ\80Ï\89Ï\82 Î´Î¹Î±Î³Ï\81άÏ\86Ï\84ηκε Î¿ ÎºÏ\89δικÏ\8cÏ\82;",
-       "botpasswords-created-title": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 του ρομπότ δημιουργήθηκε",
-       "botpasswords-created-body": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î³Î¹Î± Ï\84ο Ï\8cνομα Ï\81ομÏ\80Ï\8cÏ\84 \"$1\" Ï\84οÏ\85 Ï\87Ï\81ήÏ\83Ï\84η \"$2\" δημιουργήθηκε.",
-       "botpasswords-updated-title": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 του ρομπότ ενημερώθηκε",
-       "botpasswords-updated-body": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 «$1» του χρήστη «$2» ενημερώθηκε.",
-       "botpasswords-deleted-title": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Î´Î¹Î±Î³Ï\81άÏ\86Ï\84ηκε",
+       "botpasswords-update-failed": "Î\91Ï\80οÏ\84Ï\85Ï\87ία ÎµÎ½Î·Î¼Î­Ï\81Ï\89Ï\83ηÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Î¼Îµ Ï\8cνομα Â«$1». Î\9cήÏ\80Ï\89Ï\82 Î´Î¹Î±Î³Ï\81άÏ\86ηκε;",
+       "botpasswords-created-title": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c του ρομπότ δημιουργήθηκε",
+       "botpasswords-created-body": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c Î³Î¹Î± Ï\84ο Ï\81ομÏ\80Ï\8cÏ\84 Î¼Îµ Ï\8cνομα Â«$1» Ï\84οÏ\85 Ï\87Ï\81ήÏ\83Ï\84η Â«$2» δημιουργήθηκε.",
+       "botpasswords-updated-title": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c του ρομπότ ενημερώθηκε",
+       "botpasswords-updated-body": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c Î³Î¹Î± Ï\84ο Ï\81ομÏ\80Ï\8cÏ\84 Î¼Îµ Ï\8cνομα «$1» του χρήστη «$2» ενημερώθηκε.",
+       "botpasswords-deleted-title": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Î´Î¹Î±Î³Ï\81άÏ\86ηκε",
        "botpasswords-deleted-body": "Ο κωδικός πρόσβασης για το όνομα ρομπότ \"$1\" του χρήστη \"$2\" διαγράφηκε.",
        "botpasswords-newpassword": "Ο νέος κωδικός πρόσβασης για να συνδεθείτε με το <strong>$1</strong> είναι <strong>$2</strong>. <em>Παρακαλούμε σημειώστε το για μελλοντική αναφορά.</em><br />(Για παλιά bot που απαιτούν το όνομα σύνδεσης να είναι το ίδιο με το τελικό όνομα χρήστη, μπορείτε επίσης να χρησιμοποιήσετε το  <strong>$3</strong> ως όνομα χρήστη και <strong>$4</strong> ως κωδικό.)",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider δεν είναι διαθέσιμο.",
+       "botpasswords-no-provider": "Το BotPasswordsSessionProvider δεν είναι διαθέσιμο.",
        "botpasswords-restriction-failed": "Περιορισμοί κωδικών πρόσβασης bot εμποδίζουν τη συγκεκριμένη σύνδεση.",
-       "botpasswords-invalid-name": "Το όνομα χρήστη που ορίζεται δεν περιέχει το διαχωριστικό κωδικό πρόσβασης bot (\"$1\").",
-       "botpasswords-not-exist": "Ο χρήστης \"$1\" δεν έχει κωδικό bot με όνομα \"$2\"",
+       "botpasswords-invalid-name": "Το όνομα χρήστη που ορίζεται δεν περιέχει το διαχωριστικό συνθηματικού ρομπότ («$1»).",
+       "botpasswords-not-exist": "Ο χρήστης «$1» δεν έχει συνθηματικό για ρομπότ με όνομα «$2».",
        "resetpass_forbidden": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν",
        "resetpass_forbidden-reason": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν: $1",
        "resetpass-no-info": "Πρέπει να είστε συνδεδεμένος για να δείτε αυτήν την σελίδα απευθείας",
        "passwordreset-emaildisabled": "Τα χαρακτηριστικά ηλεκτρονικού ταχυδρομείου έχουν απενεργοποιηθεί σ' αυτό το wiki.",
        "passwordreset-username": "Όνομα χρήστη:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Προβολή του μηνύματος ηλεκτρονικού ταχυδρομείου που δημιουργήθηκε;",
-       "passwordreset-capture-help": "Εάν μαρκάρετε αυτό το πλαίσιο, το μήνυμα ηλεκτρονικού ταχυδρομείου (με το προσωρινό κωδικό πρόσβασης) θα εμφανιστεί σε σας καθώς θα αποσταλεί στο χρήστη.",
        "passwordreset-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "passwordreset-emailtitle": "Λεπτομέρειες λογαριασμού για {{SITENAME}}",
        "passwordreset-emailtext-ip": "Κάποιος (πιθανώς εσείς, από την διεύθυνση IP $1) ζήτησε την επαναφορά του κωδικού σας σε {{SITENAME}} ($4).  {{PLURAL:$3|Ο ακόλουθος λογαριασμός|Οι ακόλουθοι λογαριασμοί}} χρήστη συνδέονται με αυτή τη διεύθυνση e-mail:\n\n$2\n\n{{PLURAL:$3|Αυτός ο προσωρινός κωδικός πρόσβασης θα λήξει|Αυτοί οι προσωρινοί κωδικοί πρόσβασης θα λήξουν}} σε {{PLURAL:$5|μία ημέρα|$5 ημέρες}}.\nΘα πρέπει να συνδεθείτε τώρα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αρχικό κωδικό πρόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μπορείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χρησιμοποιείτε τον παλιό σας κωδικό πρόσβασης.",
        "preview": "Προεπισκόπηση",
        "showpreview": "Εμφάνιση προεπισκόπησης",
        "showdiff": "Εμφάνιση αλλαγών",
-       "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που δημιουργείτε είναι κενή.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" και πάλι, η σελίδα θα δημιουργηθεί χωρίς κανένα περιεχόμενο.",
+       "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που πάτε να δημιουργήσετε είναι κενή.\nΕάν ξανακάνετε κλικ στο κουμπί «{{int:savearticle}}» η σελίδα θα δημιουργηθεί χωρίς περιεχόμενο.",
        "anoneditwarning": "<strong>Προειδοποίηση:</strong> Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα είναι ορατή δημόσια αν κάνετε κάποια επεξεργασία. Αν <strong>[$1 συνδεθείτε]</strong> ή <strong>[$2 δημιουργήσετε λογαριασμό]</strong>, οι επεξεργασίες σας θα αποδοθούν στο όνομά χρήστη σας, μαζί με άλλα οφέλη.",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
        "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": "Î\97 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η IP Ï\83αÏ\82 Î­Ï\87ει Ï\85Ï\80οÏ\83Ï\84εί Ï\86Ï\81αγή Î±Ï\85Ï\84Ï\8cμαÏ\84α ÎµÏ\80ειδή Ï\87Ï\81ηÏ\83ιμοÏ\80οιήθηκε Î±Ï\80Ï\8c Î­Î½Î±Î½ Î¬Î»Î»Î¿ Ï\87Ï\81ήÏ\83Ï\84η, Î¿ Î¿Ï\80οίοÏ\82 ÎºÎ±Î¹ Î±Ï\80οκλείÏ\83Ï\84ηκε Î±Ï\80Ï\8c Ï\84ον/Ï\84ην $1.\nÎ\97 Î±Î¹Ï\84ία Ï\80οÏ\85 Î´Ï\8cθηκε ÎµÎ¯Î½Î±Î¹ Î¿ ÎµÎ¾Î®Ï\82:\n\n:''$2''\n\n* Î\88ναÏ\81ξη Ï\86Ï\81αγήÏ\82: $8\n* Î\9bήξη Ï\86Ï\81αγήÏ\82: $6\n* Î\95Ï\80ιδιÏ\89κÏ\8cμενοÏ\82 Î±Ï\80οκλειÏ\83μένοÏ\82: $7\n\nÎ\9cÏ\80οÏ\81είÏ\84ε Î½Î± ÎµÏ\80ικοινÏ\89νήÏ\83εÏ\84ε Î¼Îµ Ï\84ον/Ï\84ην $1 Î® Î¼Îµ Î­Î½Î±Î½ Î±Ï\80Ï\8c Ï\84οÏ\85Ï\82 Î¬Î»Î»Î¿Ï\85Ï\82 [[{{MediaWiki:Grouppage-sysop}}|διαÏ\87ειÏ\81ιÏ\83Ï\84έÏ\82]] Î³Î¹Î± Î½Î± Ï\83Ï\85ζηÏ\84ήÏ\83εÏ\84ε Ï\84η Ï\86Ï\81αγή.\n\nΣημειÏ\8eÏ\83Ï\84ε Ï\8cÏ\84ι Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84ο Ï\87αÏ\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c \"Ï\83Ï\84είλÏ\84ε e-mail Ï\83ε Î±Ï\85Ï\84Ï\8c Ï\84ον Ï\87Ï\81ήÏ\83Ï\84η\" ÎµÎºÏ\84Ï\8cÏ\82 Î±Î½ Î­Ï\87εÏ\84ε Î¼Î¹Î± Î­Î³ÎºÏ\85Ï\81η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 ÎºÎ±Ï\84αÏ\87Ï\89Ï\81ημένη Ï\83Ï\84ιÏ\82 [[Special:Preferences|Ï\80Ï\81οÏ\84ιμήÏ\83ειÏ\82 Ï\87Ï\81ήÏ\83Ï\84η]] Ï\83αÏ\82.\n\nÎ\97 Ï\84Ï\81έÏ\87οÏ\85Ï\83α Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η IP Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ $3, ÎºÎ±Î¹ Î¿ Î±Ï\81ιθμÏ\8cÏ\82 Î±Î½Î±Î³Î½Ï\8eÏ\81ιÏ\83ηÏ\82 Ï\84ηÏ\82 Ï\86Ï\81αγήÏ\82 Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ #$5. Î Î±Ï\81ακαλÏ\8e συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "autoblockedtext": "Î\97 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η IP Ï\83αÏ\82 Î­Ï\87ει Ï\85Ï\80οÏ\83Ï\84εί Ï\86Ï\81αγή Î±Ï\85Ï\84Ï\8cμαÏ\84α ÎµÏ\80ειδή Ï\87Ï\81ηÏ\83ιμοÏ\80οιήθηκε Î±Ï\80Ï\8c Î­Î½Î±Î½ Î¬Î»Î»Î¿ Ï\87Ï\81ήÏ\83Ï\84η, Î¿ Î¿Ï\80οίοÏ\82 ÎºÎ±Î¹ Î±Ï\80οκλείÏ\83Ï\84ηκε Î±Ï\80Ï\8c Ï\84ον/Ï\84ην $1.\nÎ\97 Î±Î¹Ï\84ιολÏ\8cγηÏ\83η Ï\80οÏ\85 Î´Ï\8cθηκε ÎµÎ¯Î½Î±Î¹ Î· ÎµÎ¾Î®Ï\82:\n\n:<em>$2</em>\n\n* Î\88ναÏ\81ξη Ï\86Ï\81αγήÏ\82: $8\n* Î\9bήξη Ï\86Ï\81αγήÏ\82: $6\n* Î\95Ï\80ιδιÏ\89κÏ\8cμενοÏ\82 Î±Ï\80οκλειÏ\83μένοÏ\82: $7\n\nÎ\9cÏ\80οÏ\81είÏ\84ε Î½Î± ÎµÏ\80ικοινÏ\89νήÏ\83εÏ\84ε Î¼Îµ Ï\84ον/Ï\84ην $1 Î® Î¼Îµ ÎºÎ¬Ï\80οιον Î±Ï\80Ï\8c Ï\84οÏ\85Ï\82 Î¬Î»Î»Î¿Ï\85Ï\82 [[{{MediaWiki:Grouppage-sysop}}|διαÏ\87ειÏ\81ιÏ\83Ï\84έÏ\82]] Î³Î¹Î± Î½Î± Ï\83Ï\85ζηÏ\84ήÏ\83εÏ\84ε Ï\84η Ï\86Ï\81αγή.\n\nÎ\9dα Ï\83ημειÏ\89θεί Ï\8cÏ\84ι Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84η Î»ÎµÎ¹Ï\84οÏ\85Ï\81γία Â«Î±Ï\80οÏ\83Ï\84ολή Î¼Î·Î½Ï\8dμαÏ\84οÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Ï\83ε Î±Ï\85Ï\84Ï\8cν Ï\84ον Ï\87Ï\81ήÏ\83Ï\84η» ÎµÎºÏ\84Ï\8cÏ\82 Î±Î½ Î­Ï\87εÏ\84ε Î¼Î¹Î± Î­Î³ÎºÏ\85Ï\81η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 ÎºÎ±Ï\84αÏ\87Ï\89Ï\81ιÏ\83μένη Ï\83Ï\84ιÏ\82 [[Special:Preferences|Ï\80Ï\81οÏ\84ιμήÏ\83ειÏ\82 Ï\87Ï\81ήÏ\83Ï\84η]] Ï\83αÏ\82.\n\nÎ\97 Ï\84Ï\81έÏ\87οÏ\85Ï\83α Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η IP Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ $3 ÎºÎ±Î¹ Ï\84ο Î±Î½Î±Î³Î½Ï\89Ï\81ιÏ\83Ï\84ικÏ\8c Ï\84ηÏ\82 Ï\86Ï\81αγήÏ\82 Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ #$5. Î Î±Ï\81ακαλοÏ\8dμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
        "blockednoreason": "δεν δόθηκε λόγος",
        "whitelistedittext": "Πρέπει να $1 για να επεξεργαστείτε σελίδες.",
-       "confirmedittext": "Πρέπει να επιβεβαιώσετε την διεύθυνση e-mail σας πριν μπορέσετε να επεξεργαστείτε σελίδες. Παρακαλώ θέστε και επικυρώστε την διεύθυνση e-mail σας μέσω των [[Special:Preferences|προτιμήσεων χρήστη]] σας.",
+       "confirmedittext": "Πρέπει να επιβεβαιώσετε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου πριν μπορέσετε να επεξεργαστείτε σελίδες. Παρακαλούμε καθορίστε και επικυρώστε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου μέσω των [[Special:Preferences|προτιμήσεων χρήστη]] σας.",
        "nosuchsectiontitle": "Δεν υπάρχει τέτοιο τμήμα",
        "nosuchsectiontext": "Προσπαθήσατε να επεξεργαστείτε μια ενότητα που δεν υπάρχει. Μπορεί να έχει μετακινηθεί ή διαγραφεί, ενώ βλέπατε τη σελίδα.",
        "loginreqtitle": "Απαιτείται η σύνδεση του χρήστη.",
        "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": "Î\9f Î\9bογαÏ\81ιαÏ\83μÏ\8cÏ\82 Ï\84οÏ\85 Ï\87Ï\81ήÏ\83Ï\84η \"<nowiki>$1</nowiki>\" Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ ÎºÎ±Ï\84αÏ\87Ï\89Ï\81ημένοÏ\82. Î Î±Ï\81ακαλÏ\8e Î´ÎµÎ¯Ï\84ε Î±Î½ Î¸Î± Î¸Î­Î»Î±Ï\84ε Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε/εÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Î±Ï\85Ï\84ή τη σελίδα.",
+       "userpage-userdoesnotexist": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η Â«$1» Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ ÎµÎ³Î³ÎµÎ³Ï\81αμμένοÏ\82. Î Î±Ï\81ακαλοÏ\8dμε ÎµÎ»Î­Î³Î¾Ï\84ε Î±Î½ Î¸Î± Î¸Î­Î»Î±Ï\84ε Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε/εÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Î±Ï\85Ï\84ήν τη σελίδα.",
        "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:''' Εκκαθαρίστε την προσωρινή μνήμη από το μενού ''Εργαλεία → Προτιμήσεις''",
        "previewnote": "'''Να θυμάστε ότι αυτή είναι μόνο μια προεπισκόπηση.'''\nΟι αλλαγές σας δεν έχουν ακόμη αποθηκευτεί!",
        "continue-editing": "Μεταβείτε στην περιοχή επεξεργασίας",
        "previewconflict": "Αυτή η προεπισκόπηση απεικονίζει το κείμενο στην επάνω περιοχή επεξεργασίας κειμένου, όπως θα εμφανιστεί εάν επιλέξετε να το αποθηκεύσετε.",
-       "session_fail_preview": "'''Συγγνώμη! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.\nΠαρακαλώ προσπαθήστε ξανά. Αν δεν δουλεύει ξανά, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε πάλι.'''",
-       "session_fail_preview_html": "'''Λυπούμαστε! Δεν μπορέσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.'''\n\n<em>Επειδή το {{SITENAME}} επιτρέπει την εισαγωγή ακατέργαστου HTML, η προεπισκόπηση είναι κρυμμένη ως προφύλαξη ενάντια σε επιθέσεις με Javascript.</em>\n\n<strong>Αν αυτή είναι μια έγκυρη προσπάθεια επεξεργασίας, παρακαλώ προσπαθήστε ξανά..</strong> Αν και πάλι δε λειτουργεί, δοκιμάστε να [[[[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε πάλι και δείτε αν ο φυλλομετρητής σας επιτρέπει cookies απ'αυτόν τον ιστότοπο.",
-       "token_suffix_mismatch": "'''Η επεξεργασία σας απορρίφθηκε γιατί το πρόγραμμα-πελάτη σας κατακρεούργησε τους χαρακτήρες στίξης στο κουπόνι επεξεργασίας. Η επεξεργασία απορρίφθηκε για να αποφευχθεί η παραφθορά του κειμένου της σελίδας.\nΑυτό μερικές φορές συμβαίνει όταν χρησιμοποιείται ένας ανώνυμος διακομιστής μεσολάβησης διαθέσιμος μέσω του παγκόσμιου ιστού με σφάλματα.'''",
-       "edit_form_incomplete": "'''Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Ελέγξτε ότι οι αλλαγές σας είναι άθικτες και προσπαθήστε ξανά.'''",
+       "session_fail_preview": "Λυπούμαστε! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.\n\nΜπορεί να έχετε αποσυνδεθεί. <strong>Παρακαλούμε επιβεβαιώστε ότι βρίσκεστε ακόμα σε σύνδεση και προσπαθήστε ξανά</strong>.\nΑν εξακολουθεί να μην λειτουργεί, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε ξανά, και βεβαιωθείτε ότι το πρόγραμμα περιήγησής σας επιτρέπει cookies από αυτόν τον ιστότοπο.",
+       "session_fail_preview_html": "Λυπούμαστε! Δεν μπορέσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.\n\n<em>Επειδή το {{SITENAME}} επιτρέπει την εισαγωγή ακατέργαστου HTML, η προεπισκόπηση είναι κρυμμένη ως προφύλαξη ενάντια σε επιθέσεις με Javascript.</em>\n\n<strong>Αν αυτή είναι μια έγκυρη προσπάθεια επεξεργασίας, Παρακαλούμε προσπαθήστε ξανά.</strong>\nΑν και πάλι δεν λειτουργεί, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε ξανά και βεβαιωθείτε ότι το πρόγραμμα περιήγησής σας επιτρέπει cookies από αυτόν τον ιστότοπο.",
+       "token_suffix_mismatch": "<strong>Η επεξεργασία σας απορρίφθηκε γιατί το πρόγραμμα-πελάτης σας κατακρεούργησε τους χαρακτήρες στίξης στο κουπόνι επεξεργασίας.</strong>\nΗ επεξεργασία απορρίφθηκε για να αποφευχθεί η παραφθορά του κειμένου της σελίδας.\nΑυτό μερικές φορές συμβαίνει όταν χρησιμοποιείτε κάποια ελαττωματική ανώνυμη υπηρεσία διαμεσολάβησης μέσω Ιστού.",
+       "edit_form_incomplete": "<strong>Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Διπλο-ελέγξτε ότι οι επεξεργασίες σας είναι άθικτες και προσπαθήστε ξανά.</strong>",
        "editing": "Επεξεργασία $1",
        "creating": "Δημιουργία: $1",
        "editingsection": "Επεξεργασία $1 (ενότητα)",
        "parser-unstrip-loop-warning": "εντοπίστηκε ένας βρόχος unstrip",
        "parser-unstrip-recursion-limit": "Υπέρβαση του ορίου αναδρομής Unstrip ($1)",
        "converter-manual-rule-error": "Εντοπίστηκε σφάλμα σε μη αυτόματο κανόνα μετατροπής γλώσσας",
-       "undo-success": "Η επεξεργασία μπορεί να αναστραφεί. Παρακαλώ ελέγξτε την σύγκριση παρακάτω για να επιβεβαιώσετε ότι αυτό είναι το οποίο θέλετε να κάνετε, και έπειτα αποθηκεύστε τις αλλαγές παρακάτω για να τελειώσετε την αναστροφή της επεξεργασίας.",
+       "undo-success": "Η επεξεργασία μπορεί να αναιρεθεί.\nΠαρακαλούμε ελέγξτε την σύγκριση παρακάτω για να επιβεβαιώσετε ότι είναι αυτό το οποίο θέλετε να κάνετε και έπειτα αποθηκεύστε τις αλλαγές παρακάτω για να ολοκληρώσετε την αναίρεση της επεξεργασίας.",
        "undo-failure": "Η επεξεργασία δεν μπορούσε να αναστραφεί λόγω αντικρουόμενων ενδιάμεσων επεξεργασιών.",
        "undo-norev": "Η ανάκληση αυτής της επεξεργασίας δεν ηταν δυνατό να πραγματοποιηθεί επειδή δεν υπάρχει ή επειδή έχει διαγραφεί.",
        "undo-nochange": "Η επεξεργασία φαίνεται να έχει ήδη αναιρεθεί.",
        "search-interwiki-caption": "Αδελφικά εγχειρήματα",
        "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": "Αριθμός επεξεργασιών:",
-       "prefsnologintext2": "Παρακαλώ συνδεθείτε για να αλλάξετε τις προτιμήσεις σας.",
+       "prefsnologintext2": "Παρακαλούμε συνδεθείτε για να αλλάξετε τις προτιμήσεις σας.",
        "prefs-skin": "Θέμα εμφάνισης",
        "skin-preview": "Προεπισκόπηση",
        "datedefault": "Χωρίς προτίμηση",
        "saveprefs": "Αποθήκευση",
        "restoreprefs": "Επαναφορά όλων των προεπιλεγμένων ρυθμίσεων (σε όλα τα τμήματα)",
        "prefs-editing": "Επεξεργασία",
-       "rows": "Σειρές",
-       "columns": "Στήλες",
        "searchresultshead": "Αποτελέσματα αναζήτησης/Ρυθμίσεις",
        "stub-threshold": "Κατώφλι για μορφοποίηση ως επεκτάσιμου ($1):",
        "stub-threshold-sample-link": "δείγμα",
        "prefs-help-recentchangescount": "Αυτό περιλαμβάνει τις πρόσφατες αλλαγές, τα ιστορικά των σελίδων, και τα αρχεία διαγραφών.",
        "prefs-help-watchlist-token2": "Αυτό είναι το μυστικό κλειδί για την web τροφοδοσία  της λίστας παρακολούθησής σας.\nΌποιος το γνωρίζει θα είναι σε θέση να διαβάσει την λίστα παρακολούθησης σας, οπότε μην τον μοιράζεστε.\n[[Special:ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέρετε]].",
        "savedprefs": "Οι προτιμήσεις σας έχουν αποθηκευτεί.",
-       "savedrights": "Τα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Î±Ï\80Ï\8c {{GENDER:$1|$1}} έχουν αποθηκευτεί.",
+       "savedrights": "Î\9fι Î¿Î¼Î¬Î´ÎµÏ\82 Ï\87Ï\81ηÏ\83Ï\84Ï\8eν {{GENDER:$1|Ï\84οÏ\85 $1|Ï\84ηÏ\82 $1}} έχουν αποθηκευτεί.",
        "timezonelegend": "Ζώνη ώρας:",
        "localtime": "Εμφάνιση τοπικής ώρας:",
        "timezoneuseserverdefault": "Χρήση της προεπιλογής του wiki ($1)",
        "youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "username": "{{GENDER:$1|Όνομα χρήστη}}:",
        "prefs-memberingroups": "{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:",
+       "group-membership-link-with-expiry": "$1 (μέχρι τις $3 στις $4)",
        "prefs-registration": "Χρόνος εγγραφής:",
        "yourrealname": "Πραγματικό όνομα:",
        "yourlanguage": "Γλώσσα:",
        "prefswarning-warning": "Έχετε κάνει αλλαγές στις προτιμήσεις σας που δεν έχουν αποθηκευτεί ακόμα.\nΕάν αφήσετε αυτή τη σελίδα χωρίς να κάνετε κλικ στο \"$1\" οι προτιμήσεις σας δεν θα ενημερωθούν.",
        "prefs-tabs-navigation-hint": "Συμβουλή: Μπορείτε να χρησιμοποιήσετε τα πλήκτρα διευθύνσεων αριστερά και δεξιά για να πλοηγηθείτε μεταξύ των καρτελών στη λίστα καρτελών.",
        "userrights": "Διαχείριση δικαιωμάτων χρηστών",
-       "userrights-lookup-user": "Î\94ιαÏ\87είÏ\81ιÏ\83η Î¿Î¼Î¬Î´Ï\89ν Ï\87Ï\81ηÏ\83Ï\84Ï\8eν",
+       "userrights-lookup-user": "Î\95Ï\80ιλέξÏ\84ε Ï\87Ï\81ήÏ\83Ï\84η",
        "userrights-user-editname": "Δηλώστε όνομα χρήστη:",
-       "editusergroup": "Î\95Ï\80εξεÏ\81γαÏ\83ία {{GENDER:$1|ομάδÏ\89ν}} χρηστών",
+       "editusergroup": "ΦÏ\8cÏ\81Ï\84Ï\89Ï\83η Î¿Î¼Î¬Î´Ï\89ν χρηστών",
        "editinguser": "Αλλαγή δικαιωμάτων χρήστη {{GENDER:$1|του χρήστη|της χρήστριας}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Επεξεργασία ομάδων χρηστών",
        "saveusergroups": "Αποθήκευση {{GENDER:$1|ομάδων}}  χρηστών",
        "userrights-reason": "Αιτία:",
        "userrights-no-interwiki": "Δεν έχετε άδεια να επεξεργαστείτε τα δικαιώματα χρηστών σε άλλα wiki.",
        "userrights-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
-       "userrights-nologin": "Πρέπει να [[Special:UserLogin|συνδεθείτε]] με έναν λογαριασμό διαχειριστή συστήματος ώστε να ορίσετε δικαιώματα χρηστών.",
-       "userrights-notallowed": "Δεν έχετε άδεια να προσθέσετε ή να καταργήσετε δικαιώματα χρήστη.",
        "userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
        "userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
-       "userrights-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλώ επανεξετάστε και επικυρώστε τις αλλαγές σας.",
-       "userrights-removed-self": "Έχετε καταργήσει τα δικά σας δικαιώματα. Ως εκ τούτου, δεν είστε πλέον σε θέση να έχετε πρόσβαση σε αυτή τη σελίδα.",
+       "userrights-expiry-current": "Λήγει στις $2 στις $3",
+       "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-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλούμε επανεξετάστε και επικυρώστε τις αλλαγές σας.",
        "group": "Ομάδα:",
        "group-user": "Χρήστες",
        "group-autoconfirmed": "Αυτοεπιβεβαιωμένοι χρήστες",
        "right-editmyprivateinfo": "Επεξεργαστείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
        "right-editmyoptions": "Επεξεργασία των προτιμήσεών σας",
        "right-rollback": "Γρήγορη αναστροφή των επεξεργασιών του τελευταίου χρήστη που επεξεργάστηκε μια σελίδα",
-       "right-markbotedits": "Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών μποτ",
+       "right-markbotedits": "Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών ρομπότ",
        "right-noratelimit": "Να μην επηρεάζεται από τα όρια ρυθμού",
        "right-import": "Εισαγωγή σελίδων από άλλα wikis",
        "right-importupload": "Εισαγωγή σελίδων με ανέβασμα αρχείου",
        "right-siteadmin": "Κλείδωμα και ξεκλείδωμα της βάσης δεδομένων",
        "right-override-export-depth": "Εξαγωγή σελίδων συμπεριλαμβάνοντας συνδεδεμένες σελίδες έως ένα βάθος 5 επιπέδων",
        "right-sendemail": "Αποστολή ηλεκτρονικού μηνύματος σε άλλους χρήστες",
-       "right-passwordreset": "Εμφάνιση email επαναφοράς κωδικού πρόσβασης",
        "right-managechangetags": "Δημιουργία και (απ)ενεργοποίηση [[Special:Tags|ετικετών]]",
-       "right-applychangetags": "Εφαρμόστε [[Special:Tags|ετικέτες]] μαζί με τις αλλαγές",
+       "right-applychangetags": "Εφαρμογή [[Special:Tags|ετικετών]] παράλληλα με τις όποιες αλλαγές κάνει κάποιος",
        "right-changetags": "Προσθέστε και αφαιρέστε αυθαίρετες [[Special:Tags|ετικέτες]] σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
        "right-deletechangetags": "Διαγραφή [[Special:Tags|ετικετών]] από τη βάση δεδομένων",
        "grant-group-page-interaction": "Αλληλεπίδραση με σελίδες",
        "grant-blockusers": "Φραγή και αναίρεση φραγής χρηστών",
        "grant-createaccount": "Δημιουργία λογαριασμών",
        "grant-createeditmovepage": "Δημιουργία, επεξεργασία και μετακίνηση σελίδων",
-       "grant-delete": "Διαγραφή σελίδων, αναθεωρήσεων, και αρχείων καταγραφής",
-       "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και της CSS/JavaScript χρήστη",
-       "grant-editmycssjs": "Επεξεργαστείτε το δικό σας CSS/JavaScript",
-       "grant-editmyoptions": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\84Ï\89ν Ï\80Ï\81οÏ\84ιμήÏ\83εÏ\8eν χρήστη σας",
+       "grant-delete": "Διαγραφή σελίδων, αναθεωρήσεων και καταχωρίσεων σε αρχεία καταγραφής",
+       "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και των CSS/JavaScript των χρηστών",
+       "grant-editmycssjs": "Επεξεργασία των CSS/JavaScript χρήστη σας",
+       "grant-editmyoptions": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\84Ï\89ν Ï\80Ï\81οÏ\84ιμήÏ\83εÏ\89ν χρήστη σας",
        "grant-editmywatchlist": "Επεξεργασία της λίστας παρακολούθησής σας",
        "grant-editpage": "Επεξεργασία υπαρχουσών σελίδων",
        "grant-editprotected": "Επεξεργασία προστατευμένων σελίδων",
-       "grant-highvolume": "Î¥Ï\88ηλήÏ\82 Î­Î½Ï\84αÏ\83ηÏ\82 ÎµÏ\80εξεÏ\81γαÏ\83ία",
+       "grant-highvolume": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\85Ï\88ηλοÏ\8d Ï\8cγκοÏ\85",
        "grant-oversight": "Απόκρυψη χρηστών και καταστολή αναθεωρήσεων",
        "grant-patrol": "Περιπολία αλλαγών σε σελίδες",
        "grant-privateinfo": "Πρόσβαση σε προσωπικές πληροφορίες",
        "grant-protect": "Προστασία και κατάργηση προστασίας σελίδων",
-       "grant-rollback": "Î\97 Îµπαναφορά αλλαγών σε σελίδες",
+       "grant-rollback": "Î\95παναφορά αλλαγών σε σελίδες",
        "grant-sendemail": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε άλλους χρήστες",
-       "grant-uploadeditmovefile": "Ανέβασμα, αντικατάσταση, και μετακίνηση αρχείων",
+       "grant-uploadeditmovefile": "Ανέβασμα, αντικατάσταση και μετακίνηση αρχείων",
        "grant-uploadfile": "Ανέβασμα νέων αρχείων",
        "grant-basic": "Βασικά δικαιώματα",
-       "grant-viewdeleted": "Î\94είÏ\84ε Ï\84α Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένα Î±Ï\81Ï\87εία ÎºÎ±Î¹ Ï\83ελίδεÏ\82",
+       "grant-viewdeleted": "ΠÏ\81οβολή Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένÏ\89ν Î±Ï\81Ï\87είÏ\89ν ÎºÎ±Î¹ Ï\83ελίδÏ\89ν",
        "grant-viewmywatchlist": "Προβολή της λίστας παρακολούθησής σας",
+       "grant-viewrestrictedlogs": "Προβολή υποκείμενων σε περιορισμούς καταχωρίσεων στα αρχεία καταγραφών",
        "newuserlogpage": "Αρχείο καταγραφών δημιουργίας χρηστών",
        "newuserlogpagetext": "Αυτή είναι μια καταγραφή δημιουργίας χρηστών.",
        "rightslog": "Αρχείο καταγραφών δικαιωμάτων χρηστών",
        "action-upload_by_url": "να επιφορτώσετε αυτό το αρχείο από μια διεύθυνση URL",
        "action-writeapi": "να χρησιμοποιήσετε το API για εγγραφή",
        "action-delete": "να διαγράψετε αυτή τη σελίδα",
-       "action-deleterevision": "να διαγράψετε αυτή την έκδοση",
-       "action-deletedhistory": "να προβάλετε το διαγεγραμμένο ιστορικό αυτής της σελίδας",
+       "action-deleterevision": "διαγράψετε αναθεωρήσεις",
+       "action-deletelogentry": "διαγράψτε καταχωρήσεις καταγραφών",
+       "action-deletedhistory": "προβάλετε διαγεγραμμένο ιστορικό σελίδας",
+       "action-deletedtext": "να προβάλετε κείμενο διαγεγραμμένων αναθεωρήσεων",
        "action-browsearchive": "να αναζητήσετε διαγεγραμμένες σελίδες",
-       "action-undelete": "να Î±ÎºÏ\85Ï\81Ï\8eÏ\83εÏ\84ε Ï\84η Î´Î¹Î±Î³Ï\81αÏ\86ή Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82",
-       "action-suppressrevision": "να ÎµÏ\80ιθεÏ\89Ï\81ήÏ\83εÏ\84ε ÎºÎ±Î¹ Î±Ï\80οκαÏ\84αÏ\83Ï\84ήÏ\83εÏ\84ε Î±Ï\85Ï\84ή Ï\84ην ÎºÏ\81Ï\85μμένη Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηÏ\83η",
+       "action-undelete": "να Î±Î½Î±Î¹Ï\81έÏ\83εÏ\84ε Ï\84η Î´Î¹Î±Î³Ï\81αÏ\86ή Ï\83ελίδÏ\89ν",
+       "action-suppressrevision": "να ÎµÏ\80ιθεÏ\89Ï\81ήÏ\83εÏ\84ε ÎºÎ±Î¹ Î½Î± Î±Ï\80οκαÏ\84αÏ\83Ï\84ήÏ\83εÏ\84ε ÎºÏ\81Ï\85μμένεÏ\82 Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83ειÏ\82",
        "action-suppressionlog": "να δείτε αυτόν τον ιδιωτικό κατάλογο",
        "action-block": "να φράξετε τις επεξεργασίες αυτού του χρήστη",
        "action-protect": "να αλλάξετε τα επίπεδα προστασίας για αυτή τη σελίδα",
        "action-userrights-interwiki": "επεξεργαστείτε τα δικαιώματα χρηστών σε άλλα wiki",
        "action-siteadmin": "να κλειδώσετε ή ξεκλειδώσετε τη βάση δεδομένων",
        "action-sendemail": "αποστείλετε μηνύματα ηλεκτρονικού ταχυδρομείου",
+       "action-editmyoptions": "επεξεργαστείτε τις προτιμήσεις σας",
        "action-editmywatchlist": "επεξεργαστείτε τη λίστα παρακολούθησής σας",
        "action-viewmywatchlist": "προβάλετε τη λίστα παρακολούθησής σας",
        "action-viewmyprivateinfo": "προβάλετε τις προσωπικές σας πληροφορίες",
        "action-editmyprivateinfo": "επεξεργαστείτε τις προσωπικές σας πληροφορίες",
        "action-editcontentmodel": "επεξεργαστείτε το μοντέλο περιεχομένου σελίδας",
        "action-managechangetags": "δημιουργήσετε και διαγράψετε ετικέτες από τη βάση δεδομένων",
-       "action-applychangetags": "εφαρμογή ετικετών μαζί με τις αλλαγές σας",
+       "action-applychangetags": "εφαρμογή ετικετών παράλληλα με τις αλλαγές σας",
        "action-changetags": "πρόσθεση και αφαίρεση αυθαίρετων ετικετών σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
        "action-deletechangetags": "διαγράψετε ετικέτες από τη βάση δεδομένων",
        "action-purge": "εκκαθάριση αυτής της σελίδας",
        "recentchanges-noresult": "Χωρίς αλλαγές κατά τη διάρκεια της συγκεκριμένης χρονικής περιόδου, με αυτά τα κριτήρια.",
        "recentchanges-feed-description": "Παρακολούθηση των πιο πρόσφατων αλλαγών στο wiki σε αυτή τη ροή.",
        "recentchanges-label-newpage": "Αυτή η επεξεργασία δημιούργησε μια νέα σελίδα",
-       "recentchanges-label-minor": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¼Î¹ÎºÏ\81ή Ï\84Ï\81οÏ\80οÏ\80οίηÏ\83η",
+       "recentchanges-label-minor": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¼Î¹ÎºÏ\81οεÏ\80εξεÏ\81γαÏ\83ία",
        "recentchanges-label-bot": "Αυτή η επεξεργασία έγινε από ένα ρομπότ",
        "recentchanges-label-unpatrolled": "Αυτή η επεξεργασία δεν έχει ελεγχθεί ακόμα",
        "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|κατάλογος νέων σελίδων]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Προβολή",
+       "rcfilters-activefilters": "Ενεργά φίλτρα",
+       "rcfilters-restore-default-filters": "Επαναφορά προεπιλεγμένων φίλτρων",
+       "rcfilters-clear-all-filters": "Εκκαθάριση όλων των φίλτρων",
+       "rcfilters-search-placeholder": "Φιλτράρισμα πρόσφατων αλλαγών (περιηγηθείτε ή αρχίστε να πληκτρολογείτε)",
+       "rcfilters-invalid-filter": "Μη έγκυρο φίλτρο",
+       "rcfilters-empty-filter": "Χωρίς ενεργά φίλτρα. Εμφανίζονται όλες οι συνεισφορές.",
+       "rcfilters-filterlist-title": "Φίλτρα",
+       "rcfilters-filterlist-noresults": "Δεν βρέθηκαν φίλτρα",
+       "rcfilters-filtergroup-registration": "Επωνυμία χρηστών",
+       "rcfilters-filter-registered-label": "Εγγεγραμμένοι",
+       "rcfilters-filter-registered-description": "Συνδεδεμένοι συντάκτες.",
+       "rcfilters-filter-unregistered-label": "Μη εγγεγραμμένοι",
+       "rcfilters-filter-unregistered-description": "Συντάκτες που δεν είναι συνδεδεμένοι.",
+       "rcfilters-filtergroup-authorship": "Πατρότητα επεξεργασιών",
+       "rcfilters-filter-editsbyself-label": "Οι δικές σας επεξεργασίες",
+       "rcfilters-filter-editsbyself-description": "Επεξεργασίες από εσάς.",
+       "rcfilters-filter-editsbyother-label": "Επεξεργασίες από άλλους",
+       "rcfilters-filter-editsbyother-description": "Επεξεργασίες που δημιουργήθηκαν από άλλους χρήστες (όχι εσάς).",
+       "rcfilters-filtergroup-userExpLevel": "Επίπεδο εμπειρίας (για εγγεγραμμένους χρήστες μόνο)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Νεοφερμένοι",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Λιγότερες από 10 επεξεργασίες και 4 ημέρες δραστηριότητας.",
+       "rcfilters-filter-userExpLevel-learner-label": "Μαθητευόμενοι",
+       "rcfilters-filter-userExpLevel-learner-description": "Περισσότερες ημέρες δραστηριότητας και επεξεργασίες από τους «νεοφερμένους» αλλά λιγότερες από τους «έμπειρους χρήστες».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Έμπειροι χρήστες",
+       "rcfilters-filter-userExpLevel-experienced-description": "Περισσότερες από 30 ημέρες δραστηριότητας και 500 αλλαγές.",
+       "rcfilters-filtergroup-automated": "Αυτοματοποιημένες συνεισφορές",
+       "rcfilters-filter-bots-label": "Ρομπότ",
+       "rcfilters-filter-bots-description": "Επεξεργασίες που έγιναν από αυτοματοποιημένα εργαλεία.",
+       "rcfilters-filter-humans-label": "Ανθρώπινες (όχι από ρομπότ)",
+       "rcfilters-filter-humans-description": "Επεξεργασίες που έγιναν από ανθρώπους συντάκτες.",
+       "rcfilters-filtergroup-significance": "Σημαντικότητα",
+       "rcfilters-filter-minor-label": "Μικροεπεξεργασίες",
+       "rcfilters-filter-minor-description": "Επεξεργασίες που ο συντάκτης χαρακτήρισε ως μικροεπεξεργασίες.",
+       "rcfilters-filter-major-label": "Μη μικροπεξεργασίες",
+       "rcfilters-filter-major-description": "Επεξεργασίες μη χαρακτηρισμένες ως μικροεπεξεργασίες.",
+       "rcfilters-filtergroup-changetype": "Τύπος αλλαγής",
+       "rcfilters-filter-pageedits-label": "Επεξεργασίες σελίδων",
+       "rcfilters-filter-pageedits-description": "Επεξεργασίες σε περιεχόμενο του wiki, συζητήσεις, περιγραφές κατηγοριών....",
+       "rcfilters-filter-newpages-label": "Δημιουργίες σελίδων",
+       "rcfilters-filter-newpages-description": "Επεξεργασίες που δημιουργούν νέες σελίδες.",
+       "rcfilters-filter-categorization-label": "Αλλαγές κατηγοριών",
+       "rcfilters-filter-categorization-description": "Καταγραφές σελίδων που προστίθενται ή αφαιρούνται από κατηγορίες.",
+       "rcfilters-filter-logactions-label": "Καταγραφόμενες ενέργειες",
+       "rcfilters-filter-logactions-description": "Διαχειριστικές ενέργειες, δημιουργίες λογαριασμών, διαγραφές σελίδων, ανεβάσματα αρχείων....",
        "rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από <strong>$3, $4</strong> (έως <strong>$1</strong> που εμφανίζεται).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
-       "rcshowhideminor": "$1 μικρών τροποποιήσεων",
+       "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "rcshowhideminor-show": "Εμφάνιση",
        "rcshowhideminor-hide": "Απόκρυψη",
        "rcshowhidebots": "$1 ρομπότ",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
        "upload-tryagain": "Υποβολή τροποποιημένης περιγραφής αρχείου",
        "uploadnologin": "Δεν έχετε συνδεθεί!",
-       "uploadnologintext": "Παρακαλώ $1 για να επιφορτώσετε αρχεία.",
+       "uploadnologintext": "Παρακαλούμε $1 για να ανεβάσετε αρχεία.",
        "upload_directory_missing": "Λείπει το αποθηκευτήριο επιφορτώσεων ($1) και δεν μπορεί να δημιουργηθεί από τον webserver.",
        "upload_directory_read_only": "Δεν είναι δυνατή η εγγραφή στον κατάλογο ($1) από τον server.",
        "uploaderror": "Σφάλμα στο ανέβασμα αρχείου",
        "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα, παρακαλούμε ελέγξτε το <strong>[[:$1]]</strong> εάν δεν είστε {{GENDER:|σίγουρος|σίγουρη}} αν θέλετε να το αλλάξετε.\n[[$1|thumb]]",
        "filepageexists": "Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο <strong>[[:$1]]</strong>, αλλά αυτήν τη στιγμή δεν υπάρχει αρχείο με αυτό το όνομα.\nΗ σύνοψη που εισαγάγετε δεν θα εμφανιστεί στη σελίδα περιγραφής.\nΓια να εμφανιστεί η σύνοψή σας εκεί, θα χρειαστεί να την επεξεργαστείτε με το χέρι.\n[[$1|thumb]]",
        "fileexists-extension": "Υπάρχει ένα αρχείο με παρόμοιο όνομα: [[$2|thumb]]\n* Όνομα του προς ανέβασμα αρχείου: <strong>[[:$1]]</strong>\n* Όνομα υπάρχοντος αρχείου: <strong>[[:$2]]</strong>\nΜήπως θα θέλατε να χρησιμοποιήσετε κάποιο όνομα που να ξεχωρίζει περισσότερο;",
-       "fileexists-thumbnail-yes": "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]\nΠαρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
+       "fileexists-thumbnail-yes": "Το αρχείο φαίνεται να είναι μια εικόνα μειωμένου μεγέθους <em>(μικρογραφία)</em>. \n[[$1|thumb]]\nΠαρακαλούμε ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το υπό έλεγχο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να ανεβάσετε κάποια επιπλέον μικρογραφία.",
        "file-thumbnail-no": "Το όνομα αρχείου αρχίζει με <strong>$1</strong>.\nΦαίνεται πως είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''.\nΑν έχετε αυτή την εικόνα σε πλήρη ανάλυση, επιφορτώστε τη, αλλιώς αλλάξτε παρακαλώ το όνομα του αρχείου.",
        "fileexists-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη˙ εάν ακόμη θέλετε να επιφορτώσωτε αυτό το αρχείο παρακαλώ πηγαίνετε πίσω και επιφορτώστε το υπό ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη στο χώρο φύλαξης κοινών αρχείων.\nΕάν θέλετε παρ' όλ' αυτά να επιφορτώσετε το δικό σας αρχείο, παρακαλούμε πηγαίνετε πίσω και χρησιμοποιήστε ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "file-deleted-duplicate": "Αρχείο παρόμοιο με αυτό εδώ ([[:$1]]) έχει προηγουμένως διαγραφεί. Θα πρέπει να ελέγξετε το ιστορικό διαγραφής του πριν να προχωρήσετε στην επαναφόρτωσή του.",
        "file-deleted-duplicate-notitle": "Ένα αρχείο πανομοιότυπο με αυτό έχει προηγουμένως διαγραφεί, και ο τίτλος έχει κατασταλεί.\nΘα πρέπει να ζητήσετε από κάποιον με την δυνατότητα προβολής κατεσταλμένου αρχείου δεδομένων για να εξετάσει την κατάσταση προτού προχωρήσετε σε επαναφόρτωση του.",
        "uploadwarning": "Προειδοποίηση φόρτωσης",
-       "uploadwarning-text": "Παρακαλώ αλλάξτε την περιγραφή του αρχείου παρακάτω και προσπαθήστε ξανά.",
+       "uploadwarning-text": "Παρακαλούμε τροποποιήστε την περιγραφή του αρχείου παρακάτω και προσπαθήστε ξανά.",
        "savefile": "Αποθήκευση αρχείου",
        "uploaddisabled": "Το ανέβασμα αρχείων είναι απενεργοποιημένο.",
        "copyuploaddisabled": "Το ανέβασμα μέσω URL έχει απενεργοποιηθεί.",
        "uploaded-setting-handler-svg": "Κάθε SVG που θέτει το χαρακτηριστικό «χειρισμού» με απομακρυσμένο προορισμό/προορισμό δεδομένων/προορισμό δέσμης ενεργειών είναι αποκλεισμένο. Βρέθηκε <code>$1=\"$2\"</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-remote-url-svg": "Κάθε SVG που θέτει οποιοδήποτε χαρακτηριστικό στυλ με απομακρυσμένη διεύθυνση URL είναι αποκλεισμένο. Βρέθηκε <code>$1=\"$2\"</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-image-filter-svg": "Βρέθηκε φίλτρο εικόνας με διεύθυνση URL: <code>&lt;$1 $2=\"$3\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
-       "uploadscriptednamespace": "Αυτό το αρχείο SVG περιέχει μη αποδεκτό ονοματοχώρο «$1».",
+       "uploadscriptednamespace": "Αυτό το αρχείο SVG περιέχει μη αποδεκτό ονοματοχώρο «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "Δεν ήταν δυνατή η ανάλυση του κώδικα XML στο αρχείο.",
        "uploadvirus": "Το αρχείο περιέχει ιό! Λεπτομέρειες: $1",
        "uploadjava": "Το αρχείο είναι αρχείο ZIP, το οποίο περιέχει ένα αρχείο .class της γλώσσας Java.\nΔεν επιτρέπεται η αποστολή αρχείων Java, επειδή μπορούν να προκαλέσουν παράκαμψη των περιορισμών ασφαλείας του συστήματος.",
        "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-categories": "Κατηγορίες",
        "upload-form-label-infoform-date": "Ημερομηνία",
        "upload-form-label-own-work-message-generic-local": "Επιβεβαιώνω ότι επιφορτώνω  αυτό το αρχείο κατά τους όρους της υπηρεσίας και πολιτικές αδειοδότησης για τον ιστότοπο {{SITENAME}}.",
-       "upload-form-label-not-own-work-message-generic-local": "Î\95άν Î´ÎµÎ½ ÎµÎ¯Ï\83Ï\84ε Ï\83ε Î¸Î­Ï\83η Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84ηÏ\82  {{SITENAME}}, Ï\80αÏ\81ακαλÏ\8e ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î½Î± ÎµÏ\80ιÏ\87ειÏ\81ήÏ\83εÏ\84ε Î¼Î¹Î± Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿Ï\82.",
+       "upload-form-label-not-own-work-message-generic-local": "Î\95άν Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84οÏ\85 {{SITENAME}}, Ï\80αÏ\81ακαλοÏ\8dμε ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε ÎºÎ¬Ï\80οιαν Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿.",
        "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": "Î\95άν Î´ÎµÎ½ ÎµÎ¯Ï\83Ï\84ε Ï\83ε Î¸Î­Ï\83η Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84ηÏ\82 shared repository, Ï\80αÏ\81ακαλÏ\8e ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î½Î± ÎµÏ\80ιÏ\87ειÏ\81ήÏ\83εÏ\84ε Î¼Î¹Î± Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿Ï\82.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Î\95άν Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84οÏ\85 ÎºÎ¿Î¹Î½Î¿Ï\8d Î±Ï\80οθεÏ\84ηÏ\81ίοÏ\85, Ï\80αÏ\81ακαλοÏ\8dμε ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε ÎºÎ¬Ï\80οια Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿.",
        "upload-form-label-not-own-work-local-generic-foreign": "Επίσης, μπορεί να θέλετε να δοκιμάσετε χρησιμοποιώντας το [[Special:Upload|τη σελίδα ανεβάσματος για το {{SITENAME}}]], αν αυτό το αρχείο μπορεί να φορτωθεί κάτω σύμφωνα με τις πολιτικές τους.",
        "backend-fail-stream": "Αδύνατη η μετάδοση του αρχείου $1.",
        "backend-fail-backup": "Αδύνατη η δημιουργία αντίγραφου ασφαλείας του αρχείου $1.",
        "apisandbox-dynamic-parameters-add-label": "Προσθήκη παραμέτρου:",
        "apisandbox-dynamic-parameters-add-placeholder": "Ονομασία παραμέτρου",
        "apisandbox-dynamic-error-exists": "Η παράμετρος με την ονομασία \"$1\" υπάρχει ήδη",
+       "apisandbox-deprecated-parameters": "Παρωχημένες παράμετροι",
        "apisandbox-submit-invalid-fields-title": "Κάποια από τα πεδία δεν είναι έγκυρα",
-       "apisandbox-submit-invalid-fields-message": "Παρακαλώ διορθώστε τα σημειωμένα πεδία και προσπαθήστε ξανά.",
+       "apisandbox-submit-invalid-fields-message": "Παρακαλούμε διορθώστε τα σημειωμένα πεδία και προσπαθήστε ξανά.",
        "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-field": "Η τιμή αυτού του πεδίου δεν είναι έγκυρη.",
+       "apisandbox-continue": "Συνέχεια",
+       "apisandbox-continue-clear": "Διαγραφή",
+       "apisandbox-multivalue-all-namespaces": "$1 (Όλοι οι ονοματοχώροι)",
+       "apisandbox-multivalue-all-values": "$1 (Όλες οι τιμές)",
        "booksources": "Πηγές βιβλίων",
        "booksources-search-legend": "Αναζήτηση για πηγές βιβλίων",
        "booksources-isbn": "ISBN:",
        "listgrouprights-namespaceprotection-header": "Περιορισμοί ονοματοχώρων",
        "listgrouprights-namespaceprotection-namespace": "Ονοματοχώρος",
        "listgrouprights-namespaceprotection-restrictedto": "Δικαίωμα(τα) που επιτρέπει(ουν) σε χρήστη να επεξεργαστεί",
-       "listgrants": "Î\95Ï\80ιÏ\87οÏ\81ηγήÏ\83εις",
-       "listgrants-grant": "Î\95Ï\80ιÏ\87οÏ\81ήγηση",
+       "listgrants": "ΠαÏ\81αÏ\87Ï\8eÏ\81ηÏ\83η Ï\80Ï\81Ï\8cÏ\83βαÏ\83ης",
+       "listgrants-grant": "ΠÏ\81Ï\8cÏ\83βαση",
        "listgrants-rights": "Δικαιώματα",
        "trackingcategories": "Κατηγορίες παρακολούθησης",
        "trackingcategories-summary": "Αυτή η σελίδα εμφανίζει τις κατηγορίες παρακολούθησης το περιεχόμενο των οποίων συμπληρώνεται αυτόματα από το λογισμικό MediaWiki. Τα ονόματά τους μπορεί να αλλαχθούν με την αλλαγή των σχετικών μηνυμάτων συστήματος στον ονοματοχώρο {{ns:8}}.",
        "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|σας}} απαντήσετε σε αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου, το e-mail {{GENDER:$2|σας}}  θα αποσταλεί απευθείας {{GENDER:$1|στον|στην}} αρχικό αποστολέα, αποκαλύπτοντας τη διεύθυνση e-mail για {{GENDER:$2|σας}} σε {{GENDER:$1|αυτόν|αυτήν}}.",
        "usermessage-summary": "Φεύγετε από τις ειδοποιήσεις συστήματος.",
        "usermessage-editor": "Μηνύματα συστήματος",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlist-hide": "Απόκρυψη",
        "watchlist-submit": "Προβολή",
        "wlshowtime": "Περίοδος χρόνου για να εμφανιστεί:",
-       "wlshowhideminor": "μικÏ\81έÏ\82 Ï\84Ï\81οÏ\80οÏ\80οιήÏ\83εις",
+       "wlshowhideminor": "μικÏ\81οεÏ\80εξεÏ\81γαÏ\83ίες",
        "wlshowhidebots": "bots",
        "wlshowhideliu": "εγγεγραμμένοι χρήστες",
        "wlshowhideanons": "ανώνυμοι χρήστες",
        "deleting-backlinks-warning": "<strong>Προσοχή:</strong>  [[Special:WhatLinksHere/{{FULLPAGENAME}}|Άλλες σελίδες]] συνδέουν ή ενσωματώνουν τη σελίδα που πρόκειται να διαγράψετε.",
        "rollback": "Επαναφορά επεξεργασιών",
        "rollbacklink": "αναστροφή",
-       "rollbacklinkcount": "Î\95Ï\80αναÏ\86οÏ\81ά $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}",
-       "rollbacklinkcount-morethan": "εÏ\80αναÏ\86οÏ\81ά περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
+       "rollbacklinkcount": "Î\91ναÏ\83Ï\84Ï\81οÏ\86ή $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}",
+       "rollbacklinkcount-morethan": "αναÏ\83Ï\84Ï\81οÏ\86ή περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
        "rollbackfailed": "Η επαναφορά απέτυχε.",
        "cantrollback": "Δεν είναι δυνατή η αναίρεση αυτής της αλλαγής, πρόκειται για την αρχική ενέργεια δημιουργίας της σελίδας.",
        "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}}]]).",
        "protect-legend": "Επιβεβαίωση κλειδώματος",
        "protectcomment": "Αιτία:",
        "protectexpiry": "Λήξη",
-       "protect_expiry_invalid": "Î\9f Ï\87Ï\81Ï\8cνοÏ\82 Î»Î®Î¾Î·Ï\82 ÎµÎ¯Î½Î±Î¹ Î¬κυρος.",
+       "protect_expiry_invalid": "Î\9f Ï\87Ï\81Ï\8cνοÏ\82 Î»Î®Î¾Î·Ï\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³κυρος.",
        "protect_expiry_old": "Ο χρόνος λήξης αναφέρεται στο παρελθόν.",
        "protect-unchain-permissions": "Ξεκλείδωμα περαιτέρω επιλογών προστασίας",
        "protect-text": "Μπορείτε να δείτε και να αλλάξετε το επίπεδο προστασίας εδώ για τη σελίδα '''$1'''.",
        "nocontribs": "Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.",
        "uctop": "(τρέχουσα)",
        "month": "Από το μήνα (και νωρίτερα):",
-       "year": "Î\91Ï\80Ï\8c Ï\84η Ï\87Ï\81ονιά (και νωρίτερα):",
+       "year": "Î\91Ï\80Ï\8c Ï\84ο Î­Ï\84οÏ\82 (και νωρίτερα):",
        "sp-contributions-newbies": "Εμφάνιση των συνεισφορών των νέων λογαριασμών μόνο",
        "sp-contributions-newbies-sub": "Για νέους λογαριασμούς",
        "sp-contributions-newbies-title": "Συνεισφορές χρηστών για νέους λογαριασμούς",
        "sp-contributions-username": "Διεύθυνση IP ή όνομα χρήστη:",
        "sp-contributions-toponly": "Εμφάνιση μόνο των επεξεργασιών που είναι πρόσφατες αναθεωρήσεις",
        "sp-contributions-newonly": "Εμφάνιση μόνο των επεξεργασιών που είναι δημιουργία σελίδας",
+       "sp-contributions-hideminor": "Απόκρυψη μικροεπεξεργασιών",
        "sp-contributions-submit": "Αναζήτηση",
        "whatlinkshere": "Τι συνδέει εδώ",
        "whatlinkshere-title": "Σελίδες που συνδέουν στη σελίδα «$1»",
        "block-log-flags-angry-autoblock": "ενισχυμένος αυτόματος αποκλεισμός ενεργοποιημένος",
        "block-log-flags-hiddenname": "όνομα χρήστη κρυμμένο",
        "range_block_disabled": "Η δυνατότητα του διαχειριστή να δημιουργεί περιοχές φραγής είναι απενεργοποιημένη.",
-       "ipb_expiry_invalid": "Î\86κυρος χρόνος λήξης",
+       "ipb_expiry_invalid": "Î\9cη Î­Î³κυρος χρόνος λήξης",
        "ipb_expiry_old": "Ο χρόνος λήξης αναφέρεται στο παρελθόν.",
        "ipb_expiry_temp": "Οι κρυμμένες φραγές ονομάτων χρηστών πρέπει να είναι μόνιμες.",
        "ipb_hide_invalid": "Μη εφικτή καταστολή αυτού του λογαριασμού. Μπορεί να έχει περισσότερες από {{PLURAL:$1|μια επεξεργασία|$1 επεξεργασίες}}.",
        "movepagetext": "Χρησιμοποιώντας τη φόρμα που ακολουθεί θα γίνει μετονομασία σελίδας, μεταφέροντας όλο το ιστορικό της στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει σελίδα ανακατεύθυνσης προς τον νέο τίτλο.\nΜπορείτε να ενημερώσετε αυτόματα τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο.\nΑν επιλέξετε να μην ενημερωθούν αυτόματα, μην ξεχάσετε να ελέγξετε για [[Special:DoubleRedirects|διπλές]] ή [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίναι δική σας ευθύνη να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να δείχνουν προς τη σωστή κατεύθυνση.\n\nΛάβετε υπόψιν σας ότι η σελίδα <strong>δεν</strong> θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα υπό το νέο τίτλο, εκτός αν η σελίδα αυτή είναι ανακατεύθυνση και δεν έχει ιστορικό επεξεργασίας.\n\nΑυτό σημαίνει ότι σε περίπτωση λάθους μπορείτε να μετονομάσετε ξανά μια σελίδα δίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n<strong>Σημείωση:</strong>\nΑυτή η αλλαγή μπορεί να αποβεί δραστική και αναπάντεχη όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε βεβαιωθείτε ότι αντιλαμβάνεστε τις επιπτώσεις αυτής της ενέργειας πριν προχωρήσετε.",
        "movepagetext-noredirectfixer": "Χρησιμοποιώντας τη φόρμα που ακολουθεί μπορείτε να μετονομάσετε σελίδες και να μεταφέρετε όλο το ιστορικό τους στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει μια σελίδα ανακατεύθυνσης στο νέο τίτλο.\nΜπορείτε να ενημερώσετε τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο αυτόματα.\nΑν επιλέξετε να μην γίνει, θα πρέπει να ελέγξετε τις  [[Special:DoubleRedirects|διπλές]] και τις [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίστε υπεύθυνος να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να οδηγούν προς τις κατευθύνσεις που πρέπει.\n\nΛάβετε υπόψη σας ότι η σελίδα <strong>δεν</strong>  θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα κάτω από το νέο τίτλο, εκτός αν η σελίδα αυτή είναι κενή ή είναι ανακατεύθυνση χωρίς ιστορικό επεξεργασίας.\nΑυτό σημαίνει ότι, στην περίπτωση που έχετε κάνει λάθος, μπορείτε να μετονομάσετε μια σελίδα ξαναδίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n<strong>Σημείωση:</strong> \nΗ μετονομασία σελίδας είναι μια αιφνίδια και δραστική αλλαγή όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε, πριν το αποφασίσετε, να εξετάσετε προσεκτικά τις πιθανές επιπτώσεις αυτής της ενέργειας.",
        "movepagetalktext": "Αν τσεκάρετε αυτό το κουτί, η σχετιζόμενη σελίδα συζήτησης θα μετακινηθεί αυτόματα στο νέο τίτλο, εκτός αν υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή.\n\nΣε αυτή την περίπτωση, θα πρέπει να μετακινήσετε ή να συγχωνεύσετε τη σελίδα με το χέρι αν είναι επιθυμητό.",
-       "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
+       "moveuserpage-warning": "<strong>Προειδοποίηση:</strong> Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Παρακαλούμε λάβετε υπόψιν σας ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης <em>δεν</em> θα μετονομαστεί.",
        "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πρόκειται να μετακινήσετε μια σελίδα κατηγορίας. Έχετε υπόψη ότι θα μετακινηθεί μόνο η σελίδα και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα μεταφερθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "movenotallowed": "Δεν έχετε άδεια να μετακινείτε σελίδες.",
        "import-nonewrevisions": "Καμία αναθεώρηση δεν εισήχθει (όλες είτε ήταν ήδη παρούσες, ή παραλήφθηκαν λόγω σφαλμάτων).",
        "xml-error-string": "$1 στη γραμμή $2, στήλη $3 (byte $4): $5",
        "import-upload": "Ανέβασμα δεδομένων XML",
-       "import-token-mismatch": "Î\91Ï\80Ï\8eλεια Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν Ï\80εÏ\81ιÏ\8cδοÏ\85 Î»ÎµÎ¹Ï\84οÏ\85Ï\81γίαÏ\82.\n\nÎ\9cÏ\80οÏ\81εί Î½Î± Î­Ï\87οÏ\85ν Î±Ï\80οÏ\83Ï\85νδεθεί. <strong>ΠαÏ\81ακαλοÏ\8dμε Î²ÎµÎ²Î±Î¹Ï\89θείÏ\84ε Ï\8cÏ\84ι ÎµÎ¯Ï\83Ï\84ε Î±ÎºÏ\8cμα Ï\83Ï\85νδεδεμένοι ÎºÎ±Î¹ Ï\80Ï\81οÏ\83Ï\80αθήÏ\83Ï\84ε Î¾Î±Î½Î¬</strong>.\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ ÎµÏ\80αναÏ\83Ï\85νδεθείÏ\84ε, ÎºÎ±Î¹ ÎµÎ»Î­Î³Î¾Ï\84ε Ï\8cÏ\84ι Î¿ browser Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει cookies Î±Ï\80Ï\8c Î±Ï\85Ï\84Ï\8c Ï\84ον Î¹Ï\83Ï\84οÏ\84Ï\8cπο.",
+       "import-token-mismatch": "Î\91Ï\80Ï\8eλεια Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν Ï\80εÏ\81ιÏ\8cδοÏ\85 Î»ÎµÎ¹Ï\84οÏ\85Ï\81γίαÏ\82.\n\nÎ\9cÏ\80οÏ\81εί Î½Î± Î­Ï\87εÏ\84ε Î±Ï\80οÏ\83Ï\85νδεθεί. <strong>ΠαÏ\81ακαλοÏ\8dμε ÎµÏ\80ιβεβαιÏ\8eÏ\83Ï\84ε Ï\8cÏ\84ι Î²Ï\81ίÏ\83κεÏ\83Ï\84ε Î±ÎºÏ\8cμα Ï\83ε Ï\83Ï\8dνδεÏ\83η ÎºÎ±Î¹ Ï\80Ï\81οÏ\83Ï\80αθήÏ\83Ï\84ε Î¾Î±Î½Î¬</strong>.\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î¾Î±Î½Î¬, ÎºÎ±Î¹ Î²ÎµÎ²Î±Î¹Ï\89θείÏ\84ε Ï\8cÏ\84ι Ï\84ο Ï\80Ï\81Ï\8cγÏ\81αμμα Ï\80εÏ\81ιήγηÏ\83ήÏ\82 Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει cookies Î±Ï\80Ï\8c Î±Ï\85Ï\84Ï\8cν Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οπο.",
        "import-invalid-interwiki": "Δεν είναι δυνατή η εισαγωγή από το καθορισμένο wiki.",
        "import-error-edit": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την επεξεργαστείτε.",
        "import-error-create": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την δημιουργήσετε.",
        "pageinfo-toolboxlink": "Πληροφορίες σελίδας",
        "pageinfo-redirectsto": "Ανακατευθύνει σε",
        "pageinfo-redirectsto-info": "πληροφορίες",
-       "pageinfo-contentpage": "Î\9aαÏ\84αμετράται ως σελίδα περιεχομένου",
+       "pageinfo-contentpage": "ΠÏ\81οÏ\83μετράται ως σελίδα περιεχομένου",
        "pageinfo-contentpage-yes": "Ναι",
        "pageinfo-protect-cascading": "Οι προστασίες ξεκινούν τη διαδοχή τους από εδώ",
        "pageinfo-protect-cascading-yes": "Ναι",
        "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",
        "show-big-image-preview-differ": "Το μέγεθος αυτής της $3 προεπισκόπησης αυτού του $2 το αρχείο: $1.",
        "show-big-image-other": "Άλλες {{PLURAL:$2|ανάλυση|αναλύσεις}}: $1.",
        "show-big-image-size": "$1 × $2 εικονοστοιχεία",
-       "file-info-gif-looped": "περιτυλιγμένο",
-       "file-info-gif-frames": "$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}",
-       "file-info-png-looped": "Σε Î¬Ï\80ειÏ\81ο Î²Ï\81Ï\8cγÏ\87ο",
+       "file-info-gif-looped": "κυκλικά επαναλαμβανόμενο",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|καρέ}}",
+       "file-info-png-looped": "κÏ\85κλικά ÎµÏ\80αναλαμβανÏ\8cμενο",
        "file-info-png-repeat": "έπαιξε $1 {{PLURAL:$1|φορά|φορές}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}",
        "file-no-thumb-animation": "'''Σημείωση: λόγω τεχνικών περιορισμών, μικρογραφίες αυτού του τύπου αρχείου δεν θα είναι κινούμενες.'''",
        "exif-licenseurl": "Διεύθυνση URL για πνευματικά δικαιώματα άδειας χρήσης",
        "exif-morepermissionsurl": "Εναλλακτική πληροφορίες άδειας χρήσης",
        "exif-attributionurl": "Όταν επαναχρησιμοποιείτε αυτό το έργο, παρακαλούμε να βάλετε σύνδεσμο προς",
-       "exif-preferredattributionname": "Όταν επαναχρησιμοποιείτε αυτό το έργο, παρακαλώ αναφέρετε την πηγή",
+       "exif-preferredattributionname": "Όταν επαναχρησιμοποιείτε αυτό το έργο, παρακαλούμε να αναφέρετε την πηγή",
        "exif-pngfilecomment": "Σχόλιο αρχείου PNG",
        "exif-disclaimer": "Αποποίηση ευθυνών",
        "exif-contentwarning": "Προειδοποίηση περιεχομένου",
        "scarytranscludefailed-httpstatus": "[Η λήψη προτύπου απέτυχε για  το $1: HTTP  $2]",
        "scarytranscludetoolong": "[Η διεύθυνση URL είναι πολύ μεγάλη.]",
        "deletedwhileediting": "'''Προσοχή''': Αυτή η σελίδα έχει διαγραφεί αφότου ξεκινήσατε την επεξεργασία!",
-       "confirmrecreate": "Ο χρήστης [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία με αιτιολόγηση:\n: <em>$2</em>\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
-       "confirmrecreate-noreason": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία.\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
+       "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_button": "Εντάξει",
-       "confirm-purge-top": "Î\9aαθαÏ\81ιÏ\83μÏ\8cÏ\82 Ï\84ηÏ\82 Î»Î±Î½Î¸Î¬Î½Î¿Ï\85Ï\83αÏ\82 Î¼Î½Î®Î¼Î·Ï\82 Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82.",
-       "confirm-purge-bottom": "Î\97 ÎµÎºÎºÎ±Î¸Î¬Ï\81ιÏ\83η Î¼Î¹Î±Ï\82 Ï\83ελίδαÏ\82 ÎµÎºÎºÎ±Î¸Î±Ï\81ίζει Ï\84ην Î¼Î½Î®Î¼Î· cache ÎºÎ±Î¹ ÎµÎ¾Î±Î½Î±Î³ÎºÎ¬Î¶ÎµÎ¹ Ï\84ην Ï\80λέον Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84η Î­ÎºÎ´Î¿ση να εμφανιστεί.",
+       "confirm-purge-top": "Î\9dα Î±Ï\80αλειÏ\86θεί Î· Ï\80Ï\81οÏ\83Ï\89Ï\81ινή Î¼Î½Î®Î¼Î· Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82;",
+       "confirm-purge-bottom": "Î\9f ÎºÎ±Î¸Î±Ï\81ιÏ\83μÏ\8cÏ\82 Ï\83ελίδαÏ\82 Î±Ï\80αλείÏ\86ει Ï\84ην Ï\80Ï\81οÏ\83Ï\89Ï\81ινή Î¼Î½Î®Î¼Î· ÎºÎ±Î¹ ÎµÎ¾Î±Î½Î±Î³ÎºÎ¬Î¶ÎµÎ¹ Ï\84ην Ï\80λέον Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84η Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηση να εμφανιστεί.",
        "confirm-watch-button": "Εντάξει",
        "confirm-watch-top": "Προσθήκη αυτής της σελίδας στη λίστα παρακολούθησης σας;",
        "confirm-unwatch-button": "Εντάξει",
        "htmlform-cloner-delete": "Αφαίρεση",
        "htmlform-cloner-required": "Απαιτείται τουλάχιστον μία τιμή.",
        "htmlform-date-placeholder": "ΕΕΕΕ-ΜΜ-ΗΗ",
+       "htmlform-time-placeholder": "ΩΩ:ΛΛ:ΔΔ",
+       "htmlform-datetime-placeholder": "ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΛΛ:ΔΔ",
        "htmlform-date-invalid": "Η τιμή που καθορίσατε δεν είναι μια αναγνωρισμένη ημερομηνία. Δοκιμάστε να χρησιμοποιήσετε τη μορφή ΕΕΕΕ-MM-ΗΗ.",
+       "htmlform-time-invalid": "Η τιμή που καθορίσατε δεν είναι κάποια αναγνωρίσιμη ώρα. Δοκιμάστε να χρησιμοποιήσετε τη μορφή ΩΩ:ΛΛ:ΔΔ.",
+       "htmlform-datetime-invalid": "Η τιμή που καθορίσατε δεν είναι κάποια αναγνωρίσιμη ημερομηνία και ώρα. Δοκιμάστε να χρησιμοποιήσετε τη μορφή ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΛΛ:ΔΔ.",
        "htmlform-title-badnamespace": "[[:$1]] δεν είναι στο \"{{ns:$2}}\" ονοματοχώρο.",
        "htmlform-title-not-creatable": "\"$1\" - η  σελίδα τίτλου δεν είναι δυνατόν να δημιουργηθεί",
        "htmlform-title-not-exists": "Το $1 δεν υπάρχει.",
        "htmlform-user-not-exists": "Δεν υπάρχει χρήστης με όνομα <strong>$1</strong>.",
        "htmlform-user-not-valid": "Το <strong>$1</strong> δεν είναι έγκυρο όνομα χρήστη.",
        "logentry-delete-delete": "{{GENDER:$2|Ο|Η}} $1 διέγραψε τη σελίδα $3",
+       "logentry-delete-delete_redir": "{{GENDER:$2|Ο|Η}} $1 διέγραψε την ανακατεύθυνση $3 με αντικατάσταση",
        "logentry-delete-restore": "Ο/Η $1 αποκατέστησε τη σελίδα $3",
        "logentry-delete-event": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|ενός καταγραφόμενου συμβάντος|$5 καταγραφόμενων συμβάντων}} στο $3: $4",
        "logentry-delete-revision": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|μίας αναθεώρησης|$5 αναθεωρήσεων}} στη σελίδα $3: $4",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Αναζήτηση σε {{SITENAME}}",
        "searchsuggest-containing": "περιέχει...",
-       "api-error-badaccess-groups": "Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.",
        "api-error-badtoken": "Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.",
-       "api-error-copyuploaddisabled": "Το ανέβασμα από URL είναι απενεργοποιημένο σε αυτόν το διακομιστή.",
-       "api-error-duplicate": "Υπάρχει το{{PLURAL:$1|είναι ένα άλλο αρχείο|είναι κάποια άλλα αρχεία}} ήδη στο site με το ίδιο περιεχόμενο.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Υπήρχε ήδη άλλο αρχείο|Υπήρχαν ήδη άλλα αρχεία}} στον ιστότοπο με το ίδιο περιεχόμενο, αλλά {{PLURAL:$1|διαγράφηκε|διαγράφηκαν}}.",
-       "api-error-empty-file": "Το αρχείο που υποβάλλατε ήταν κενό.",
        "api-error-emptypage": "Η δημιουργία νέων, κενών σελιδών δεν επιτρέπετε.",
-       "api-error-fetchfileerror": "Εσωτερικό σφάλμα: κάτι πήγε στραβά κατά την ανάκτηση του αρχείου.",
-       "api-error-fileexists-forbidden": "Ένα αρχείο με το όνομα \"$1\" υπάρχει ήδη, και δεν είναι δυνατό να αντικατασταθεί.",
-       "api-error-fileexists-shared-forbidden": "Ένα αρχείο με όνομα \"$1\" υπάρχει ήδη στο χώρο φύλαξης κοινόχρηστων αρχείων και δεν είναι δυνατό να αντικατασταθεί.",
-       "api-error-file-too-large": "Το αρχείο που υποβάλλατε ήταν πολύ μεγάλο.",
-       "api-error-filename-tooshort": "Το όνομα αρχείου είναι πολύ μικρό.",
-       "api-error-filetype-banned": "Αυτός ο τύπος αρχείου έχει απαγορευτεί.",
-       "api-error-filetype-banned-type": "$1 δεν είναι {{PLURAL:$4|επιτρεπόμενος τύπος αρχείου|επιτρεπόμενοι τύποι αρχείων}}.  {{PLURAL:$3|Επιτρεπόμενος τύπος αρχείων|Επιτρεπόμενοι τύποι αρχείων}} είναι το $2.",
-       "api-error-filetype-missing": "Το αρχείο δεν έχει επέκταση.",
-       "api-error-hookaborted": "Η τροποποίηση που επιχειρήσατε να κάνετε ματαιώθηκε από ένα άγκιστρο της επέκτασης.",
-       "api-error-http": "Εσωτερικό σφάλμα: δεν είναι δυνατή η σύνδεση με το διακομιστή.",
-       "api-error-illegal-filename": "Αυτό το όνομα αρχείου δεν επιτρέπεται.",
-       "api-error-internal-error": "Εσωτερικό σφάλμα: κάτι πήγε στραβά με την επεξεργασία της επιφόρτωσής σας στο wiki.",
-       "api-error-invalid-file-key": "Εσωτερικό σφάλμα: το αρχείο δεν βρέθηκε στην προσωρινή αποθήκευση.",
-       "api-error-missingparam": "Εσωτερικό σφάλμα: λείπουν παράμετροι από το αίτημα.",
-       "api-error-missingresult": "Εσωτερικό σφάλμα: δεν ήταν δυνατό να προσδιοριστεί εάν η αντίγραφή ολοκληρώθηκε με επιτυχία.",
-       "api-error-mustbeloggedin": "Θα πρέπει να συνδεθείτε για να φορτώσετε τα αρχεία.",
-       "api-error-mustbeposted": "Εσωτερικό σφάλμα: το αίτημα απαιτεί HTTP POST.",
-       "api-error-noimageinfo": "Η αποστολή πέτυχε, αλλά ο διακομιστής δεν μας παρείχε πληροφορίες σχετικά με το αρχείο.",
-       "api-error-nomodule": "Εσωτερικό σφάλμα: δεν υπάρχει σετ επιφόρτωσης.",
-       "api-error-ok-but-empty": "Εσωτερικό σφάλμα: δεν υπάρχει απάντηση από το διακομιστή.",
-       "api-error-overwrite": "Αντικατάσταση ενός υπάρχοντος αρχείου δεν επιτρέπεται.",
-       "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-publishfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
-       "api-error-stasherror": "Παρουσιάστηκε ένα σφάλμα κατά το ανέβασμα του αρχείου στην κρύπτη.",
-       "api-error-stashedfilenotfound": "Το κρυμμένο αρχείο δεν βρέθηκε κατά την προσπάθεια να το ανεβάσετε από αποθετήριό του.",
-       "api-error-stashpathinvalid": "Η διαδρομή, στην οποία το κρυμμένο αρχείο θα έπρεπε να έχει βρεθεί δεν ήταν έγκυρη.",
-       "api-error-stashfilestorage": "Παρουσιάστηκε ένα σφάλμα κατά την αποθήκευση του αρχείου στην κρύπτη.",
-       "api-error-stashzerolength": "Ο διακομιστής δεν θα μπορούσε να κρύψει το αρχείο, επειδή είχε μηδενικό μήκος.",
-       "api-error-stashnotloggedin": "Θα πρέπει να συνδεθείτε για να αποθηκεύσετε τα αρχεία στο αποθετήριο φόρτωσης.",
-       "api-error-stashnosuchfilekey": "Το κλειδί αρχείου στο οποίο προσπαθούσατε να αποκτήσετε πρόσβαση στο αποθετήριο δεν υπάρχει.",
-       "api-error-timeout": "Ο διακομιστής δεν αποκρίθηκε εντός του αναμενόμενου χρόνου.",
-       "api-error-unclassified": "Προέκυψε ένα άγνωστο σφάλμα.",
-       "api-error-unknown-code": "Άγνωστο σφάλμα: \"$1\"",
-       "api-error-unknown-error": "Εσωτερικό σφάλμα: κάτι πήγε στραβά, όταν προσπαθείσατε να φορτώσετε το αρχείο σας.",
+       "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-unknown-warning": "Άγνωστη προειδοποίηση: «$1».",
        "api-error-unknownerror": "Άγνωστο σφάλμα: «$1».",
-       "api-error-uploaddisabled": "Το ανέβασμα αρχείων είναι απενεργοποιημένο σε αυτό το wiki.",
-       "api-error-verification-error": "Αυτό το αρχείο μπορεί να είναι κατεστραμμένο, ή να έχει λανθασμένη επέκταση.",
        "duration-seconds": "$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}}",
        "duration-minutes": "$1 {{PLURAL:$1|λεπτό|λεπτά}}",
        "duration-hours": "$1 {{PLURAL:$1|ώρα|ώρες}}",
        "limitreport-templateargumentsize-value": "$1 από $2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Μεγαλύτερο βάθος ανάπτυξης",
        "limitreport-expensivefunctioncount": "Πλήθος ακριβών συναρτήσεων συντακτικού αναλυτή",
-       "expandtemplates": "Î\95Ï\80έκÏ\84εινε Ï\84α Ï\80Ï\81Ï\8cÏ\84Ï\85Ï\80α",
+       "expandtemplates": "Î\95Ï\80έκÏ\84αÏ\83η Ï\80Ï\81οÏ\84Ï\8dÏ\80Ï\89ν",
        "expand_templates_intro": "Αυτή η ειδική σελίδα παίρνει κείμενο και αναπτύσσει όλα τα πρότυπα σε αυτό αναδρομικά. \nΕπίσης αναπτύσσει συναρτήσεις συντακτικού αναλυτή όπως η\n<nowiki>{{</nowiki>#language:…}}, και μεταβλητές όπως η\n<nowiki>{{</nowiki>CURRENTDAY}}.\nΟυσιαστικά επεκτείνει οτιδήποτε βρίσκεται σε διπλές αγκύλες.",
        "expand_templates_title": "Τίτλων συμφραζόμενων, για την {{FULLPAGENAME}} κ.τ.λ.:",
        "expand_templates_input": "Κείμενο εισόδου:",
        "expand_templates_generate_xml": "Εμφάνιση δέντρου συντακτικής ανάλυσης XML",
        "expand_templates_generate_rawhtml": "Εμφάνιση ανεπεξέργαστης HTML",
        "expand_templates_preview": "Προεπισκόπηση",
-       "expand_templates_preview_fail_html": "<em>Î\95Ï\80ειδή Ï\84ο {{SITENAME}} Î­Ï\87ει ÎµÎ½ÎµÏ\81γοÏ\80οιημένη Î±ÎºÎ±Ï\84έÏ\81γαÏ\83Ï\84η HTML ÎºÎ±Î¹ Ï\85Ï\80ήÏ\81ξε Î¼Î¹Î± Î±Ï\80Ï\8eλεια Ï\84ηÏ\82 Ï\83Ï\85νÏ\8cδοÏ\85 Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν, Î· Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83η ÎµÎ¯Î½Î±Î¹ ÎºÏ\81Ï\85μμένη Ï\89Ï\82 Î­Î½Î± Ï\80Ï\81οληÏ\80Ï\84ικÏ\8c Î¼Î­Ï\84Ï\81ο ÎºÎ±Ï\84ά ÎµÏ\80ιθέÏ\83εÏ\89ν JavaScript.</em>\n\n<strong>Î\91ν Î±Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î´Î¹ÎºÎ±Î¹Î¿Î»Î¿Î³Î·Î¼Î­Î½Î· Ï\80Ï\81οÏ\83Ï\80άθεια Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83ηÏ\82, Ï\80αÏ\81ακαλοÏ\8dμε Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î¾Î±Î½Î¬.</strong>\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ Î½Î± Ï\83Ï\85νδεθείÏ\84ε Ï\80άλι, ÎºÎ±Î¸Ï\8eÏ\82 ÎºÎ±Î¹ Î½Î± ÎµÎ»Î­Î³Î¾ÎµÏ\84ε Ï\80Ï\89Ï\82 Î¿ Ï\86Ï\85λλομεÏ\84Ï\81ηÏ\84ήÏ\82 Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει Ï\84ην Ï\87Ï\81ήÏ\83η cookies Î±Ï\80Ï\8c Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οÏ\80ο Î±Ï\85Ï\84Ï\8c.",
+       "expand_templates_preview_fail_html": "<em>Î\95Ï\80ειδή Ï\84ο {{SITENAME}} ÎµÏ\80ιÏ\84Ï\81έÏ\80ει Ï\84ην ÎµÎ¹Ï\83αγÏ\89γή Î±ÎºÎ±Ï\84έÏ\81γαÏ\83Ï\84οÏ\85 HTML ÎºÎ±Î¹ Ï\85Ï\80ήÏ\81ξε Î¼Î¹Î± Î±Ï\80Ï\8eλεια Ï\84Ï\89ν Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν Ï\83Ï\85νÏ\8cδοÏ\85, Î· Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83η ÎµÎ¯Î½Î±Î¹ ÎºÏ\81Ï\85μμένη Ï\89Ï\82 Î­Î½Î± Ï\80Ï\81οληÏ\80Ï\84ικÏ\8c Î¼Î­Ï\84Ï\81ο ÎºÎ±Ï\84ά ÎµÏ\80ιθέÏ\83εÏ\89ν JavaScript.</em>\n\n<strong>Î\91ν Î±Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¸ÎµÎ¼Î¹Ï\84ή Ï\80Ï\81οÏ\83Ï\80άθεια Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83ηÏ\82, Ï\80αÏ\81ακαλοÏ\8dμε Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î¾Î±Î½Î¬.</strong>\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î¾Î±Î½Î¬ ÎºÎ±Î¹ Î²ÎµÎ²Î±Î¹Ï\89θείÏ\84ε Ï\8cÏ\84ι Ï\84ο Ï\80Ï\81Ï\8cγÏ\81αμμα Ï\80εÏ\81ιήγηÏ\83ήÏ\82 Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει cookies Î±Ï\80Ï\8c Î±Ï\85Ï\84Ï\8cν Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οÏ\80ο.",
        "expand_templates_preview_fail_html_anon": "<em>Επειδή το {{SITENAME}} έχει ενεργοποιημένη raw HTML και δεν είστε συνδεδεμένοι, η προεπισκόπηση είναι κρυμμένη ως ένα προληπτικό μέτρο ενάντια σε επιθέσεις JavaScript.</em>\n\n<strong>Αν αυτό είναι δικαιολογημένη απόπειρα προεπισκόπησης, παρακαλούμε να [[Special:UserLogin|συνδεθείτε]] και δοκιμάστε πάλι.</strong>",
        "pagelanguage": "Αλλαγή γλώσσας σελίδας",
        "pagelang-name": "Σελίδα",
        "pagelang-language": "Γλώσσα",
        "pagelang-use-default": "Χρήση προεπιλεγμένης γλώσσας",
        "pagelang-select-lang": "Επιλογή γλώσσας",
+       "pagelang-reason": "Αιτιολογία",
        "pagelang-submit": "Υποβολή",
+       "pagelang-nonexistent-page": "Η σελίδα $1 δεν υπάρχει.",
+       "pagelang-unchanged-language": "Η σελίδα $1 έχει ήδη οριστεί σε γλώσσα $2.",
+       "pagelang-unchanged-language-default": "Η σελίδα $1 έχει ήδη οριστεί στην προεπιλεγμένη γλώσσα περιεχομένου του wiki.",
+       "pagelang-db-failed": "Η βάση δεδομένων απέτυχε να αλλάξει τη γλώσσα σελίδας.",
        "right-pagelang": "Αλλαγή γλώσσας σελίδας",
        "action-pagelang": "αλλαγή της γλώσσας σελίδας",
        "log-name-pagelang": "Αρχείο καταγραφών αλλαγών γλώσσας",
        "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": "Προσθήκη περισσότερων...",
        "sessionprovider-generic": "$1 συνεδρίες",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "συνεδρίες με βάση τα cookies",
        "sessionprovider-nocookies": "Τα Cookies μπορούν να απενεργοποιηθούν. Βεβαιωθείτε ότι έχετε ενεργοποιημένα τα cookies και ξεκινήστε πάλι.",
        "randomrootpage": "Τυχαία κύρια σελίδα",
        "log-action-filter-block": "Τύπος φραγής:",
+       "log-action-filter-delete": "Τύπος διαγραφής:",
+       "log-action-filter-import": "Τύπος εισαγωγής:",
+       "log-action-filter-move": "Τύπος μετακίνησης:",
+       "log-action-filter-newusers": "Τύπος δημιουργίας λογαριασμού:",
+       "log-action-filter-protect": "Τύπος προστασίας:",
        "log-action-filter-rights": "Πληκτρολογήστε για αλλαγή δικαιωμάτων:",
+       "log-action-filter-upload": "Τύπος ανεβάσματος:",
        "log-action-filter-all": "Όλα",
        "log-action-filter-block-block": "Φραγή",
        "log-action-filter-block-reblock": "Τροποποίηση φραγής",
        "log-action-filter-block-unblock": "Άρση φραγής",
+       "log-action-filter-contentmodel-change": "Αλλαγή του μοντέλου περιεχομένου",
+       "log-action-filter-contentmodel-new": "Δημιουργία σελίδας με μη προεπιλεγμένο μοντέλο περιεχομένου",
+       "log-action-filter-delete-delete": "Διαγραφή σελίδας",
+       "log-action-filter-import-upload": "Εισαγωγή μέσω ανεβάσματος XML",
+       "log-action-filter-managetags-create": "Δημιουργία ετικέτας",
+       "log-action-filter-managetags-delete": "Διαγραφή ετικέττας",
        "log-action-filter-protect-protect": "Προστασία",
        "log-action-filter-protect-modify": "Τροποποίηση προστασίας",
        "log-action-filter-protect-unprotect": "Άρση προστασίας",
index 1a206aa..8957b4c 100644 (file)
                        "Reedy",
                        "Shirayuki",
                        "The Evil IP address",
-                       "Vogone"
+                       "Vogone",
+                       "Alluk.",
+                       "Andibing",
+                       "Aursani",
+                       "Caliburn",
+                       "Chase me ladies, I'm the Cavalry",
+                       "Codynguyen1116",
+                       "Don Alessandro",
+                       "Ed g2s",
+                       "EpochFail",
+                       "Esketti",
+                       "Issyl0",
+                       "Lemondoge",
+                       "Paladox",
+                       "SamanthaNguyen",
+                       "Usandaru555",
+                       "Aefgh39622",
+                       "Anomie"
                ]
        },
+       "tog-underline": "Link underlining:",
+       "tog-hideminor": "Hide minor edits from recent changes",
+       "tog-hidepatrolled": "Hide patrolled edits from recent changes",
+       "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
+       "tog-hidecategorization": "Hide categorisation of pages",
+       "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
+       "tog-usenewrc": "Group changes by page in recent changes and watchlist",
+       "tog-numberheadings": "Auto-number headings",
+       "tog-showtoolbar": "Show edit toolbar",
+       "tog-editondblclick": "Edit pages on double click",
+       "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
        "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
        "tog-watchdefault": "Add pages and files I edit to my watchlist",
        "tog-watchmoves": "Add pages and files I move to my watchlist",
        "tog-watchdeletion": "Add pages and files I delete to my watchlist",
+       "tog-watchuploads": "Add new files I upload to my watchlist",
+       "tog-watchrollback": "Add pages where I have performed a rollback to my watchlist",
+       "tog-minordefault": "Mark all edits minor by default",
+       "tog-previewontop": "Show preview before edit box",
+       "tog-previewonfirst": "Show preview on first edit",
+       "tog-enotifwatchlistpages": "Email me when a page or a file on my watchlist has changed",
+       "tog-enotifusertalkpages": "Email me when my user talk page has changed",
+       "tog-enotifminoredits": "Email me also for minor edits of pages and files",
+       "tog-enotifrevealaddr": "Reveal my email address in notification emails",
+       "tog-shownumberswatching": "Show the number of watching users",
+       "tog-oldsig": "Your existing signature:",
+       "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
+       "tog-uselivepreview": "Use live preview",
+       "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
+       "tog-watchlisthideown": "Hide my edits from the watchlist",
+       "tog-watchlisthidebots": "Hide bot edits from the watchlist",
+       "tog-watchlisthideminor": "Hide minor edits from the watchlist",
+       "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
+       "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
+       "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
+       "tog-ccmeonemails": "Send me copies of emails I send to other users",
+       "tog-diffonly": "Do not show page content below diffs",
+       "tog-showhiddencats": "Show hidden categories",
+       "tog-norollbackdiff": "Don't show diff after performing a rollback",
+       "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
+       "tog-prefershttps": "Always use a secure connection while logged in",
+       "underline-always": "Always",
+       "underline-never": "Never",
+       "underline-default": "Skin or browser default",
+       "editfont-style": "Edit area font style:",
+       "editfont-default": "Browser default",
+       "editfont-monospace": "Monospaced font",
+       "editfont-sansserif": "Sans-serif font",
+       "editfont-serif": "Serif font",
+       "sunday": "Sunday",
+       "monday": "Monday",
+       "tuesday": "Tuesday",
+       "wednesday": "Wednesday",
+       "thursday": "Thursday",
+       "friday": "Friday",
+       "saturday": "Saturday",
+       "sun": "Sun",
+       "mon": "Mon",
+       "tue": "Tue",
+       "wed": "Wed",
+       "thu": "Thu",
+       "fri": "Fri",
+       "sat": "Sat",
+       "january": "January",
+       "february": "February",
+       "march": "March",
+       "april": "April",
+       "may_long": "May",
+       "june": "June",
+       "july": "July",
+       "august": "August",
+       "september": "September",
+       "october": "October",
+       "november": "November",
+       "december": "December",
+       "january-gen": "January",
+       "february-gen": "February",
+       "march-gen": "March",
+       "april-gen": "April",
+       "may-gen": "May",
+       "june-gen": "June",
+       "july-gen": "July",
+       "august-gen": "August",
+       "september-gen": "September",
+       "october-gen": "October",
+       "november-gen": "November",
+       "december-gen": "December",
+       "jan": "Jan",
+       "feb": "Feb",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "May",
+       "jun": "Jun",
+       "jul": "Jul",
+       "aug": "Aug",
+       "sep": "Sep",
+       "oct": "Oct",
+       "nov": "Nov",
+       "dec": "Dec",
+       "january-date": "January $1",
+       "february-date": "February $1",
+       "march-date": "March $1",
+       "april-date": "April $1",
+       "may-date": "May $1",
+       "june-date": "June $1",
+       "july-date": "July $1",
+       "august-date": "August $1",
+       "september-date": "September $1",
+       "october-date": "October $1",
+       "november-date": "November $1",
+       "december-date": "December $1",
+       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
        "category_header": "Pages in category ‘$1’",
+       "subcategories": "Subcategories",
        "category-media-header": "Media in category ‘$1’",
+       "category-empty": "<em>This category currently contains no pages or media.</em>",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
+       "hidden-category-category": "Hidden categories",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+       "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
+       "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
+       "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
+       "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
+       "listingcontinuesabbrev": "cont.",
+       "index-category": "Indexed pages",
+       "noindex-category": "Noindexed pages",
+       "broken-file-category": "Pages with broken file links",
+       "about": "About",
+       "article": "Content page",
+       "newwindow": "(opens in new window)",
+       "cancel": "Cancel",
+       "moredotdotdot": "More...",
+       "morenotlisted": "This list may be complete.",
+       "mypage": "Page",
+       "mytalk": "Talk",
+       "anontalk": "Talk",
+       "navigation": "Navigation",
+       "and": "&#32;and",
+       "qbfind": "Find",
+       "qbbrowse": "Browse",
+       "qbedit": "Edit",
+       "qbpageoptions": "This page",
+       "qbmyoptions": "My pages",
+       "faq": "FAQ",
+       "faqpage": "Project:FAQ",
+       "actions": "Actions",
+       "namespaces": "Namespaces",
+       "variants": "Variants",
+       "navigation-heading": "Navigation menu",
+       "errorpagetitle": "Error",
+       "returnto": "Return to $1.",
+       "tagline": "From {{SITENAME}}",
+       "help": "Help",
+       "search": "Search",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
+       "searchbutton": "Search",
+       "go": "Go",
+       "searcharticle": "Go",
+       "history": "Page history",
+       "history_short": "History",
+       "updatedmarker": "updated since my last visit",
+       "printableversion": "Printable version",
+       "permalink": "Permanent link",
+       "print": "Print",
+       "view": "View",
+       "view-foreign": "View on $1",
+       "edit": "Edit",
+       "edit-local": "Edit local description",
+       "create": "Create",
+       "create-local": "Add local description",
+       "editthispage": "Edit this page",
+       "create-this-page": "Create this page",
+       "delete": "Delete",
+       "deletethispage": "Delete this page",
+       "undeletethispage": "Undelete this page",
+       "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "protect": "Protect",
+       "protect_change": "change",
+       "protectthispage": "Protect this page",
+       "unprotect": "Change protection",
+       "unprotectthispage": "Change protection of this page",
+       "newpage": "New page",
+       "talkpage": "Discuss this page",
+       "talkpagelinktext": "Talk",
+       "specialpage": "Special page",
+       "personaltools": "Personal tools",
+       "articlepage": "View content page",
+       "talk": "Discussion",
+       "views": "Views",
+       "toolbox": "Tools",
+       "userpage": "View user page",
+       "projectpage": "View project page",
+       "imagepage": "View file page",
+       "mediawikipage": "View message page",
+       "templatepage": "View template page",
+       "viewhelppage": "View help page",
+       "categorypage": "View category page",
+       "viewtalkpage": "View discussion",
+       "otherlanguages": "In other languages",
+       "redirectedfrom": "(Redirected from $1)",
+       "redirectpagesub": "Redirect page",
+       "redirectto": "Redirect to:",
+       "lastmodifiedat": "This page was last modified on $1, at $2.",
+       "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
+       "protectedpage": "Protected page",
+       "jumpto": "Jump to:",
+       "jumptonavigation": "navigation",
+       "jumptosearch": "search",
+       "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
+       "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
+       "pool-timeout": "Timeout waiting for the lock",
+       "pool-queuefull": "Pool queue is full",
+       "pool-errorunknown": "Unknown error",
+       "pool-servererror": "The pool counter service is not available ($1).",
+       "poolcounter-usage-error": "Usage error: $1",
+       "aboutsite": "About {{SITENAME}}",
+       "aboutpage": "Project:About",
+       "copyright": "Content is available under $1 unless otherwise noted.",
+       "copyrightpage": "{{ns:project}}:Copyrights",
+       "currentevents": "Current events",
+       "currentevents-url": "Project:Current events",
+       "disclaimers": "Disclaimers",
+       "disclaimerpage": "Project:General disclaimer",
+       "edithelp": "Editing help",
+       "helppage-top-gethelp": "Help",
+       "mainpage": "Main Page",
+       "mainpage-description": "Main page",
+       "policy-url": "Project:Policy",
+       "portal": "Community portal",
+       "portal-url": "Project:Community portal",
+       "privacy": "Privacy policy",
+       "privacypage": "Project:Privacy policy",
+       "badaccess": "Permission error",
+       "badaccess-group0": "You are not allowed to execute the action you have requested.",
+       "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
+       "versionrequired": "Version $1 of MediaWiki required",
+       "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
+       "ok": "OK",
        "retrievedfrom": "Retrieved from ‘$1’",
+       "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
+       "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
+       "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
+       "youhavenewmessagesmulti": "You have new messages on $1",
+       "editsection": "edit",
+       "editold": "edit",
+       "viewsourceold": "view source",
+       "editlink": "edit",
+       "viewsourcelink": "view source",
+       "editsectionhint": "Edit section: $1",
+       "toc": "Contents",
+       "showtoc": "show",
+       "hidetoc": "hide",
+       "collapsible-collapse": "Collapse",
+       "collapsible-expand": "Expand",
+       "confirmable-confirm": "Are {{GENDER:$1|you}} sure?",
+       "confirmable-yes": "Yes",
+       "confirmable-no": "No",
+       "thisisdeleted": "View or restore $1?",
+       "viewdeleted": "View $1?",
+       "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "feedlinks": "Feed:",
+       "feed-invalid": "Invalid subscription feed type.",
+       "feed-unavailable": "Syndication feeds are not available",
+       "site-rss-feed": "$1 RSS feed",
+       "site-atom-feed": "$1 Atom feed",
        "page-rss-feed": "‘$1’ RSS feed",
        "page-atom-feed": "‘$1’ Atom feed",
+       "red-link-title": "$1 (page does not exist)",
+       "sort-descending": "Sort descending",
+       "sort-ascending": "Sort ascending",
+       "nstab-main": "Page",
+       "nstab-user": "User page",
+       "nstab-media": "Media page",
+       "nstab-special": "Special page",
+       "nstab-project": "Project page",
+       "nstab-image": "File",
+       "nstab-mediawiki": "Message",
+       "nstab-template": "Template",
+       "nstab-help": "Help page",
+       "nstab-category": "Category",
+       "mainpage-nstab": "Main page",
+       "nosuchaction": "No such action",
+       "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
+       "nosuchspecialpage": "No such special page",
+       "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Error",
        "missing-article": "The database did not find the text of a page that it should have found, named ‘$1’ $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
        "filecopyerror": "Could not copy file ‘$1’ to ‘$2’.",
        "filerenameerror": "Could not rename file ‘$1’ to ‘$2.’",
        "cannotdelete": "The page or file ‘$1’ could not be deleted.\nIt may have already been deleted by someone else.",
        "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
        "editinginterface": "'''Warning:''' You are editing a page which is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-       "cascadeprotected": "This page has been protected from editing, because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the ‘cascading’ option turned on:\n$2",
+       "cascadeprotected": "This page has been protected from editing because it is transcluded in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
+       "pt-login": "Log in",
+       "pt-createaccount": "Create account",
+       "botpasswords-no-central-id": "To use bot passwords, you must be logged in to a centralised account.",
+       "savearticle": "Save page",
+       "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "loginreqlink": "log in",
+       "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
+       "template-protected": "(protected)",
+       "revisionasof": "Revision as of $1",
+       "previousrevision": "← Older revision",
+       "cur": "cur",
+       "lineno": "Line $1:",
+       "editundo": "undo",
+       "searchresults": "Search results",
+       "searchresults-title": "Search results for \"$1\"",
+       "prevn": "previous {{PLURAL:$1|$1}}",
+       "nextn": "next {{PLURAL:$1|$1}}",
+       "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
+       "searchprofile-articles": "Content pages",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Everything",
+       "searchprofile-advanced": "Advanced",
+       "searchprofile-articles-tooltip": "Search in $1",
+       "searchprofile-images-tooltip": "Search for files",
+       "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
+       "searchprofile-advanced-tooltip": "Search in custom namespaces",
+       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
        "prefs-i18n": "Internationalisation",
+       "right-writeapi": "Use of the write API",
+       "grant-group-customization": "Customisation and preferences",
+       "newuserlogpage": "User creation log",
+       "recentchanges": "Recent changes",
+       "recentchanges-legend": "Recent changes options",
+       "recentchanges-label-newpage": "This edit created a new page",
+       "recentchanges-label-minor": "This is a minor edit",
+       "recentchanges-label-bot": "This edit was performed by a bot",
+       "rclistfrom": "Show new changes starting from $2, $3",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhideliu": "$1 registered users",
+       "rclinks": "Show last $1 changes in last $2 days<br />$3",
+       "diff": "diff",
+       "hist": "hist",
+       "minoreditletter": "m",
+       "newpageletter": "N",
+       "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
+       "recentchangeslinked-toolbox": "Related changes",
+       "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
+       "upload": "Upload file",
        "license": "Licencing:",
        "license-header": "Licencing",
        "licenses-edit": "Edit licence options",
+       "file-anchor-link": "File",
+       "filehist": "File history",
+       "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
+       "filehist-current": "current",
+       "filehist-datetime": "Date/Time",
+       "filehist-thumb": "Thumbnail",
+       "filehist-thumbtext": "Thumbnail for version as of $1",
+       "filehist-user": "User",
+       "filehist-dimensions": "Dimensions",
+       "filehist-comment": "Comment",
+       "imagelinks": "File usage",
+       "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
+       "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
+       "randompage": "Random page",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "uncategorizedpages": "Uncategorised pages",
        "uncategorizedcategories": "Uncategorised categories",
        "uncategorizedimages": "Uncategorised files",
        "uncategorizedtemplates": "Uncategorised templates",
+       "newpages": "New pages",
+       "allpagessubmit": "Go",
+       "listgrants-summary": "The following is a list of grants with their associated access to user rights. Users can authorise applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
+       "wlshowhidecategorization": "page categorisation",
+       "rollbacklink": "rollback",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been cancelled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
-       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalised).",
-       "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
-       "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-       "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-       "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
+       "protect_expiry_invalid": "Expiry time is invalid.",
+       "protect_expiry_old": "Expiry time is in the past.",
+       "protect-existing-expiry": "Existing expiry time: $3, $2",
+       "protect-existing-expiry-infinity": "Existing expiry time: infinite",
+       "namespace": "Namespace:",
+       "invert": "Invert selection",
+       "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
+       "namespace_association": "Associated namespace",
+       "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
+       "blanknamespace": "(Main)",
+       "whatlinkshere": "What links here",
+       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalised).\nYou can block IP address ranges using the [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; the largest allowed range is /$1 for IPv4 and /$2 for IPv6.",
        "ipbexpiry": "Expiry:",
        "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behaviour/harassment\n** Abusing multiple accounts\n** Unacceptable username",
+       "blocklink": "block",
+       "contribslink": "contribs",
+       "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
+       "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
        "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organisation and inform them of this serious security problem.",
-       "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorised into the new one.",
+       "databaselocked": "The database is already locked.",
+       "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorized into the new one.",
        "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [https://translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
        "allmessages-filter": "Filter by customisation state:",
+       "thumbnail-more": "Enlarge",
        "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialised. The revision was reported to use content model $3 serialised as $4.",
+       "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
+       "tooltip-pt-createaccount": "You are encouraged to create an account and log in; however, it is not mandatory",
+       "tooltip-ca-talk": "Discussion about the content page",
+       "tooltip-ca-edit": "Edit this page",
+       "tooltip-ca-addsection": "Start a new section",
+       "tooltip-ca-history": "Past revisions of this page",
+       "tooltip-ca-watch": "Add this page to your watchlist",
+       "tooltip-search": "Search {{SITENAME}}",
+       "tooltip-search-go": "Go to a page with this exact name if it exists",
+       "tooltip-search-fulltext": "Search pages for this text",
+       "tooltip-p-logo": "Visit the main page",
+       "tooltip-n-mainpage": "Visit the main page",
+       "tooltip-n-mainpage-description": "Visit the main page",
+       "tooltip-n-portal": "About the project, what you can do, and where to find things",
+       "tooltip-n-currentevents": "Find background information on current events",
+       "tooltip-n-recentchanges": "A list of recent changes in the wiki",
+       "tooltip-n-randompage": "Load a random page",
+       "tooltip-n-help": "The place to find out",
+       "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
+       "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
+       "tooltip-feed-atom": "Atom feed for this page",
+       "tooltip-t-upload": "Upload files",
+       "tooltip-t-specialpages": "A list of all special pages",
+       "tooltip-t-print": "Printable version of this page",
+       "tooltip-t-permalink": "Permanent link to this revision of the page",
+       "tooltip-ca-nstab-main": "View the content page",
+       "tooltip-ca-nstab-special": "This is a special page, and it cannot be edited",
+       "tooltip-ca-nstab-image": "View the file page",
+       "tooltip-ca-nstab-category": "View the category page",
+       "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
+       "pageinfo-toolboxlink": "Page information",
+       "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
+       "show-big-image": "Original file",
+       "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "metadata": "Metadata",
        "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitise it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
+       "metadata-fields": "Image metadata fields listed in this message will be included on the image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-ycbcrcoefficients": "Colour space transformation matrix coefficients",
        "exif-colorspace": "Colour space",
        "exif-datetimedigitized": "Date and time of digitising",
        "exif-gpsdestdistance-k": "Kilometres",
        "exif-ycbcrpositioning-1": "Centred",
        "exif-iimcategory-lab": "Labour",
+       "namespacesall": "all",
        "confirmemail_invalidated": "Email address confirmation cancelled",
        "version-license": "MediaWiki Licence",
        "version-ext-license": "Licence",
        "version-license-not-found": "No detailed licence information was found for this extension.",
        "version-credits-summary": "We would like to recognise the following persons for their contribution to [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.\n\nMediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public Licence for more details.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public Licence] along with this programme; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
-       "feedback-error1": "Error: Unrecognised result from API",
+       "specialpages": "Special pages",
+       "tag-filter": "[[Special:Tags|Tag]] filter:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
        "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
-       "protect_expiry_invalid": "Expiry time is invalid.",
-       "protect_expiry_old": "Expiry time is in the past.",
-       "protect-existing-expiry": "Existing expiry time: $3, $2",
-       "protect-existing-expiry-infinity": "Existing expiry time: infinite",
-       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->"
+       "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
+       "feedback-error1": "Error: Unrecognised result from API",
+       "searchsuggest-search": "Search {{SITENAME}}"
 }
index 28ccbf3..abee4a9 100644 (file)
        "searcharticle": "Go",
        "history": "Page history",
        "history_short": "History",
+       "history_small": "history",
        "updatedmarker": "updated since my last visit",
        "printableversion": "Printable version",
        "permalink": "Permanent link",
        "views": "Views",
        "toolbox": "Tools",
        "tool-link-userrights": "Change {{GENDER:$1|user}} groups",
+       "tool-link-userrights-readonly": "View {{GENDER:$1|user}} groups",
        "tool-link-emailuser": "Email this {{GENDER:$1|user}}",
        "userpage": "View user page",
        "projectpage": "View project page",
        "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
        "passwordreset-username": "Username:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "View the resulting email?",
-       "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
        "passwordreset-email": "Email address:",
        "passwordreset-emailtitle": "Account details on {{SITENAME}}",
        "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2",
        "passwordreset-emailsentemail": "If this email address is associated with your account, then a password reset email will be sent.",
        "passwordreset-emailsentusername": "If there is an email address associated with this username, then a password reset email will be sent.",
-       "passwordreset-emailsent-capture2": "The password reset {{PLURAL:$1|email has|emails have}} been sent. The {{PLURAL:$1|username and password|list of usernames and passwords}} is shown here.",
-       "passwordreset-emailerror-capture2": "Emailing the {{GENDER:$2|user}} failed: $1 The {{PLURAL:$3|username and password|list of usernames and passwords}} is shown here.",
        "passwordreset-nocaller": "A caller must be provided",
        "passwordreset-nosuchcaller": "Caller does not exist: $1",
        "passwordreset-ignored": "The password reset was not handled. Maybe no provider was configured?",
        "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.",
        "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.",
-       "summary-preview": "Summary preview:",
-       "subject-preview": "Subject preview:",
+       "summary-preview": "Preview of edit summary:",
+       "subject-preview": "Preview of subject:",
        "previewerrortext": "An error occurred while attempting to preview your changes.",
        "blockedtitle": "User is blocked",
        "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
        "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "systemblockedtext": "Your username or IP address has been automatically blocked by MediaWiki.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYour current IP address is $3.\nPlease include all above details in any queries you make.",
        "blockednoreason": "no reason given",
        "whitelistedittext": "Please $1 to edit pages.",
        "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
        "search-interwiki-default": "Results from $1:",
        "search-interwiki-custom": "",
        "search-interwiki-more": "(more)",
+       "search-interwiki-more-results": "more results",
        "search-relatedarticle": "Related",
        "searchrelated": "related",
        "searchall": "all",
        "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
        "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
        "search-error": "An error has occurred while searching: $1",
+       "search-warning": "A warning has occured while searching: $1",
        "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})",
        "preferences": "Preferences",
        "preferences-summary": "",
        "saveprefs": "Save",
        "restoreprefs": "Restore all default settings (in all sections)",
        "prefs-editing": "Editing",
-       "rows": "Rows:",
-       "columns": "Columns:",
        "searchresultshead": "Search",
        "stub-threshold": "Threshold for stub link formatting ($1):",
        "stub-threshold-sample-link": "sample",
        "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
        "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
        "savedprefs": "Your preferences have been saved.",
-       "savedrights": "The user rights of {{GENDER:$1|$1}} have been saved.",
+       "savedrights": "The user groups of {{GENDER:$1|$1}} have been saved.",
        "timezonelegend": "Time zone:",
        "localtime": "Local time:",
        "timezoneuseserverdefault": "Use wiki default ($1)",
        "username": "{{GENDER:$1|Username}}:",
        "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (until $2)",
        "prefs-registration": "Registration time:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Real name:",
        "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-summary": "",
-       "userrights-lookup-user": "Manage user groups",
+       "userrights-lookup-user": "Select a user",
        "userrights-user-editname": "Enter a username:",
-       "editusergroup": "Edit {{GENDER:$1|user}} groups",
+       "editusergroup": "Load user groups",
        "editinguser": "Changing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Edit user groups",
+       "viewinguserrights": "Viewing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Edit {{GENDER:$1|user}} groups",
+       "userrights-viewusergroup": "View {{GENDER:$1|user}} groups",
        "saveusergroups": "Save {{GENDER:$1|user}} groups",
        "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.",
+       "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-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-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
-       "userrights-notallowed": "You do not have permission to add or remove user rights.",
        "userrights-changeable-col": "Groups you can change",
        "userrights-unchangeable-col": "Groups you cannot change",
        "userrights-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
+       "userrights-expiry-current": "Expires $1",
+       "userrights-expiry-none": "Does not expire",
+       "userrights-expiry": "Expires:",
+       "userrights-expiry-existing": "Existing expiration time: $3, $2",
+       "userrights-expiry-othertime": "Other time:",
+       "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-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
-       "userrights-removed-self": "You removed your own rights. As such, you are no longer able to access this page.",
        "group": "Group:",
        "group-user": "Users",
        "group-autoconfirmed": "Autoconfirmed users",
        "right-siteadmin": "Lock and unlock the database",
        "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
        "right-sendemail": "Send email to other users",
-       "right-passwordreset": "View password reset emails",
        "right-managechangetags": "Create and (de)activate [[Special:Tags|tags]]",
        "right-applychangetags": "Apply [[Special:Tags|tags]] along with one's changes",
        "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "action-upload_by_url": "upload this file from a URL",
        "action-writeapi": "use the write API",
        "action-delete": "delete this page",
-       "action-deleterevision": "delete this revision",
-       "action-deletedhistory": "view this page's deleted history",
+       "action-deleterevision": "delete revisions",
+       "action-deletelogentry": "delete log entries",
+       "action-deletedhistory": "view a page's deleted history",
+       "action-deletedtext": "view deleted revision text",
        "action-browsearchive": "search deleted pages",
-       "action-undelete": "undelete this page",
-       "action-suppressrevision": "review and restore this hidden revision",
+       "action-undelete": "undelete pages",
+       "action-suppressrevision": "review and restore hidden revisions",
        "action-suppressionlog": "view this private log",
        "action-block": "block this user from editing",
        "action-protect": "change protection levels for this page",
        "action-userrights-interwiki": "edit user rights of users on other wikis",
        "action-siteadmin": "lock or unlock the database",
        "action-sendemail": "send emails",
+       "action-editmyoptions": "edit your preferences",
        "action-editmywatchlist": "edit your watchlist",
        "action-viewmywatchlist": "view your watchlist",
        "action-viewmyprivateinfo": "view your private information",
        "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Show",
+       "rcfilters-activefilters": "Active filters",
+       "rcfilters-restore-default-filters": "Restore default filters",
+       "rcfilters-clear-all-filters": "Clear all filters",
+       "rcfilters-search-placeholder": "Filter recent changes (browse or start typing)",
+       "rcfilters-invalid-filter": "Invalid filter",
+       "rcfilters-empty-filter": "No active filters. All contributions are shown.",
+       "rcfilters-filterlist-title": "Filters",
+       "rcfilters-highlightbutton-title": "Highlight results",
+       "rcfilters-highlightmenu-title": "Select a color",
+       "rcfilters-filterlist-noresults": "No filters found",
+       "rcfilters-filtergroup-registration": "User registration",
+       "rcfilters-filter-registered-label": "Registered",
+       "rcfilters-filter-registered-description": "Logged-in editors.",
+       "rcfilters-filter-unregistered-label": "Unregistered",
+       "rcfilters-filter-unregistered-description": " Editors who aren’t logged in.",
+       "rcfilters-filtergroup-authorship": "Edit authorship",
+       "rcfilters-filter-editsbyself-label": "Your own edits",
+       "rcfilters-filter-editsbyself-description": "Edits by you.",
+       "rcfilters-filter-editsbyother-label": "Edits by others",
+       "rcfilters-filter-editsbyother-description": "Edits created by other users (not you).",
+       "rcfilters-filtergroup-userExpLevel": "Experience level (for registered users only)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Newcomers",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Fewer than 10 edits and 4 days of activity.",
+       "rcfilters-filter-userExpLevel-learner-label": "Learners",
+       "rcfilters-filter-userExpLevel-learner-description": "More days of activity and edits than \"Newcomers\" but fewer than \"Experienced users\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Experienced users",
+       "rcfilters-filter-userExpLevel-experienced-description": "More than 30 days of activity and 500 edits.",
+       "rcfilters-filtergroup-automated": "Automated contributions",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Edits made by automated tools.",
+       "rcfilters-filter-humans-label": "Human (not bot)",
+       "rcfilters-filter-humans-description": "Edits made by human editors.",
+       "rcfilters-filtergroup-significance": "Significance",
+       "rcfilters-filter-minor-label": "Minor edits",
+       "rcfilters-filter-minor-description": "Edits the author labeled as minor.",
+       "rcfilters-filter-major-label": "Non-minor edits",
+       "rcfilters-filter-major-description": "Edits not labeled as minor.",
+       "rcfilters-filtergroup-changetype": "Type of change",
+       "rcfilters-filter-pageedits-label": "Page edits",
+       "rcfilters-filter-pageedits-description": "Edits to wiki content, discussions, category descriptions....",
+       "rcfilters-filter-newpages-label": "Page creations",
+       "rcfilters-filter-newpages-description": "Edits that make new pages.",
+       "rcfilters-filter-categorization-label": "Category changes",
+       "rcfilters-filter-categorization-description": "Records of pages being added or removed from categories.",
+       "rcfilters-filter-logactions-label": "Logged actions",
+       "rcfilters-filter-logactions-description": "Administrative actions, account creations, page deletions, uploads....",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
        "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
-       "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".",
+       "uploadscriptednamespace": "This SVG file contains an illegal namespace \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
        "uploadvirus": "The file contains a virus!\nDetails: $1",
        "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
        "uncategorizedimages-summary": "",
        "uncategorizedtemplates": "Uncategorized templates",
        "uncategorizedtemplates-summary": "",
+       "uncategorized-categories-exceptionlist": " # Contains a list of categories, which shouldn't be mentioned on Special:UncategorizedCategories. One per line, starting with \"*\". Lines starting with another character (including whitespaces) are ignored. Use \"#\" for comments.",
        "unusedcategories": "Unused categories",
        "unusedcategories-summary": "",
        "unusedimages": "Unused files",
        "apisandbox-sending-request": "Sending API request...",
        "apisandbox-loading-results": "Receiving API results...",
        "apisandbox-results-error": "An error occurred while loading the API query response: $1.",
+       "apisandbox-request-selectformat-label": "Show request data as:",
+       "apisandbox-request-format-url-label": "URL query string",
        "apisandbox-request-url-label": "Request URL:",
+       "apisandbox-request-format-json-label": "JSON",
+       "apisandbox-request-json-label": "Request JSON:",
        "apisandbox-request-time": "Request time: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Correct token and resubmit",
        "apisandbox-results-fixtoken-fail": "Failed to fetch \"$1\" token.",
        "apisandbox-continue-clear": "Clear",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} will [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] the last request; {{int:apisandbox-continue-clear}} will clear continuation-related parameters.",
        "apisandbox-param-limit": "Enter <kbd>max</kbd> to use the maximum limit.",
+       "apisandbox-multivalue-all-namespaces": "$1 (All namespaces)",
+       "apisandbox-multivalue-all-values": "$1 (All values)",
        "booksources": "Book sources",
        "booksources-summary": "",
        "booksources-search-legend": "Search for book sources",
        "listgrants-summary": "The following is a list of grants with their associated access to user rights. Users can authorize applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
        "listgrants-grant": "Grant",
        "listgrants-rights": "Rights",
+       "listgrants-grant-display": "$1 <code>($2)</code>",
        "trackingcategories": "Tracking categories",
        "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
        "trackingcategories-msg": "Tracking category",
        "emailccsubject": "Copy of your message to $1: $2",
        "emailsent": "Email sent",
        "emailsenttext": "Your email message has been sent.",
-       "emailuserfooter": "This email was {{GENDER:$1|sent}} by $1 to {{GENDER:$2|$2}} by the \"{{int:emailuser}}\" function at {{SITENAME}}.",
+       "emailuserfooter": "This email was {{GENDER:$1|sent}} by $1 to {{GENDER:$2|$2}} by the \"{{int:emailuser}}\" function at {{SITENAME}}. If {{GENDER:$2|you}} reply to this email, {{GENDER:$2|your}} email will be sent directly to the {{GENDER:$1|original sender}}, revealing {{GENDER:$2|your}} email address to {{GENDER:$1|them}}.",
        "usermessage-summary": "Leaving system message.",
        "usermessage-editor": "System messenger",
        "usermessage-template": "MediaWiki:UserMessage",
        "editcomment": "The edit summary was: <em>$1</em>.",
        "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
        "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
+       "rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Reverted edits by $1;\nchanged back to last revision by $2. [$3 Show changes]",
        "sessionfailure-title": "Session failure",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
        "changecontentmodel-emptymodels-title": "No content models available",
        "changecontentmodel-emptymodels-text": "The content on [[:$1]] cannot be converted to any type.",
        "log-name-contentmodel": "Content model change log",
-       "log-description-contentmodel": "Events related to the content models of a page",
+       "log-description-contentmodel": "This page lists changes to the content model of pages, and pages that were created with a content model other than the default.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|created}} the page $3 using a non-default content model \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|changed}} the content model of the page $3 from \"$4\" to \"$5\"",
        "logentry-contentmodel-change-revertlink": "revert",
        "sorbs": "DNSBL",
        "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
        "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
+       "softblockrangesreason": "Anonymous contributions are not allowed from your IP address ($1). Please log in.",
        "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
        "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
        "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
        "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
        "cant-move-category-page": "You do not have permission to move category pages.",
        "cant-move-to-category-page": "You do not have permission to move a page to a category page.",
+       "cant-move-subpages": "You do not have permission to move subpages.",
+       "namespace-nosubpages": "Namespace \"$1\" does not allow subpages.",
        "newtitle": "New title:",
        "move-watch": "Watch source page and target page",
        "movepagebtn": "Move page",
        "pageinfo-length": "Page length (in bytes)",
        "pageinfo-article-id": "Page ID",
        "pageinfo-language": "Page content language",
+       "pageinfo-language-change": "change",
        "pageinfo-content-model": "Page content model",
        "pageinfo-content-model-change": "change",
        "pageinfo-robot-policy": "Indexing by robots",
        "htmlform-user-not-valid": "<strong>$1</strong> isn't a valid username.",
        "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-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",
        "newuserlog-autocreate-entry": "Account created automatically",
        "rightslogentry": "changed group membership for $1 from $2 to $3",
        "rightslogentry-autopromote": "was automatically promoted from $2 to $3",
+       "rightslogentry-temporary-group": "$1 (temporary, until $2)",
        "feedback-adding": "Adding feedback to page...",
        "feedback-back": "Back",
        "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Search {{SITENAME}}",
        "searchsuggest-containing": "containing...",
-       "api-error-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
-       "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
        "api-error-badtoken": "Internal error: Bad token.",
-       "api-error-blocked": "You have been blocked from editing.",
-       "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
-       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
-       "api-error-duplicate-archive": "There {{PLURAL:$1|was another file|were some other files}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-       "api-error-empty-file": "The file you submitted was empty.",
        "api-error-emptypage": "Creating new, empty pages is not allowed.",
-       "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
-       "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
-       "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
-       "api-error-file-too-large": "The file you submitted was too large.",
-       "api-error-filename-tooshort": "The filename is too short.",
-       "api-error-filetype-banned": "This type of file is banned.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
-       "api-error-filetype-missing": "The filename is missing an extension.",
-       "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
-       "api-error-http": "Internal error: Unable to connect to server.",
-       "api-error-illegal-filename": "The filename is not allowed.",
-       "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
-       "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
-       "api-error-missingparam": "Internal error: Missing parameters on request.",
-       "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
-       "api-error-mustbeloggedin": "You must be logged in to upload files.",
-       "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
-       "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
-       "api-error-nomodule": "Internal error: No upload module set.",
-       "api-error-ok-but-empty": "Internal error: No response from server.",
-       "api-error-overwrite": "Overwriting an existing file is not allowed.",
-       "api-error-ratelimited": "You're trying to upload more files in a short space of time than this wiki allows.\nPlease try again in a few minutes.",
-       "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
        "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
-       "api-error-stasherror": "There was an error while uploading the file to stash.",
-       "api-error-stashedfilenotfound": "The stashed file was not found when attempting to upload it from the stash.",
-       "api-error-stashpathinvalid": "The path at which the stashed file should have been found was invalid.",
-       "api-error-stashfilestorage": "There was an error while storing the file in the stash.",
-       "api-error-stashzerolength": "The server could not stash the file, because it had zero length.",
-       "api-error-stashnotloggedin": "You must be logged in to save files in the upload stash.",
-       "api-error-stashwrongowner": "The file you were attempting to access in the stash does not belong to you.",
-       "api-error-stashnosuchfilekey": "The file key you were attempting to access in the stash does not exist.",
-       "api-error-timeout": "The server did not respond within the expected time.",
-       "api-error-unclassified": "An unknown error occurred.",
-       "api-error-unknown-code": "Unknown error: \"$1\".",
-       "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
+       "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
        "api-error-unknown-warning": "Unknown warning: \"$1\".",
        "api-error-unknownerror": "Unknown error: \"$1\".",
-       "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
-       "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
-       "api-error-was-deleted": "A file of this name has been previously uploaded and subsequently deleted.",
        "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
        "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
        "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
        "pagelang-language": "Language",
        "pagelang-use-default": "Use default language",
        "pagelang-select-lang": "Select language",
+       "pagelang-reason": "Reason",
        "pagelang-submit": "Submit",
+       "pagelang-nonexistent-page": "The page $1 does not exist.",
+       "pagelang-unchanged-language": "The page $1 is already set to language $2.",
+       "pagelang-unchanged-language-default": "The page $1 is already set to the wiki's default content language.",
+       "pagelang-db-failed": "The database failed to change the page language.",
        "right-pagelang": "Change page language",
        "action-pagelang": "change the page language",
        "log-name-pagelang": "Language change log",
        "mw-widgets-dateinput-no-date": "No date selected",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Search for media",
+       "mw-widgets-mediasearch-noresults": "No results found.",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Add a category...",
+       "mw-widgets-usersmultiselect-placeholder": "Add more...",
        "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
        "sessionprovider-nocookies": "Cookies may be disabled. Ensure you have cookies enabled and start again.",
        "randomrootpage": "Random root page",
        "log-action-filter-block": "Type of block:",
-       "log-action-filter-contentmodel": "Type of contentmodel modification:",
+       "log-action-filter-contentmodel": "Type of content model change:",
        "log-action-filter-delete": "Type of deletion:",
        "log-action-filter-import": "Type of import:",
        "log-action-filter-managetags": "Type of tag management action:",
        "log-action-filter-block-block": "Block",
        "log-action-filter-block-reblock": "Block modification",
        "log-action-filter-block-unblock": "Unblock",
-       "log-action-filter-contentmodel-change": "Change of Contentmodel",
-       "log-action-filter-contentmodel-new": "Creation of page with non-standard Contentmodel",
+       "log-action-filter-contentmodel-change": "Change of content model",
+       "log-action-filter-contentmodel-new": "Creation of page with non-default content model",
        "log-action-filter-delete-delete": "Page deletion",
+       "log-action-filter-delete-delete_redir": "Redirect overwrite",
        "log-action-filter-delete-restore": "Page undeletion",
        "log-action-filter-delete-event": "Log deletion",
        "log-action-filter-delete-revision": "Revision deletion",
        "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
        "restrictionsfield-badip": "Invalid IP address or range: $1",
        "restrictionsfield-label": "Allowed IP ranges:",
-       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errors:\n\n$1"
+       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revision $1",
+       "pageid": "page ID $1"
 }
index 31f0641..d5c5258 100644 (file)
@@ -49,7 +49,9 @@
                        "Psychoslave",
                        "Orikrin1998",
                        "Gamliel Fishkin",
-                       "Kastanoto"
+                       "Kastanoto",
+                       "Rafaneta",
+                       "NMaia"
                ]
        },
        "tog-underline": "Substrekado de ligiloj:",
        "searcharticle": "Ek",
        "history": "Historio de paĝo",
        "history_short": "Historio",
+       "history_small": "historio",
        "updatedmarker": "ĝisdatigita de post mia lasta vizito",
        "printableversion": "Presebla versio",
        "permalink": "Konstanta ligilo",
        "views": "Vidoj",
        "toolbox": "Iloj",
        "tool-link-userrights": "Ŝanĝi grupojn de ĉi tiu {{GENDER:$1|uzanto}}",
+       "tool-link-userrights-readonly": "Vidi grupojn de {{GENDER:$1|uzanto}}",
        "tool-link-emailuser": "Sendi retpoŝton al ĉi tiu {{GENDER:$1|uzanto}}",
        "userpage": "Vidi uzantopaĝon",
        "projectpage": "Rigardi projektopaĝon",
        "botpasswords-label-delete": "Forigi",
        "botpasswords-label-resetpassword": "Rekomencigi la pasvorton",
        "botpasswords-label-grants": "Uzeblaj permesdonoj:",
-       "botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permesdonoj]] por pli da informo.",
+       "botpasswords-help-grants": "Rajtigiloj permesas aliron al rajtoj jam provizita al via uzantkonto. Ebligi rajtigilojn ĉi tie ne provizas aliron al ajnaj rajtoj ke via uzantkonto ne alie havus. Vidu la [[Special:ListGrants|tablo de rajtigiloj]] por pli da informo.",
        "botpasswords-label-grants-column": "Permeso donita",
        "botpasswords-bad-appid": "La robota nomo \"$1\" estas malvalida.",
        "botpasswords-insert-failed": "Aldono de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi jam estis aldonita?",
        "passwordreset-emaildisabled": "Retpoŝtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.",
        "passwordreset-username": "Uzantnomo:",
        "passwordreset-domain": "Domajno:",
-       "passwordreset-capture": "Vidi la rezultan retpoŝton?",
-       "passwordreset-capture-help": "Se vi markis ĉi tiun skatoleton, la retpoŝto (kun provizora pasvorto) estos montrita al vi kaj estos sendita al la uzanto.",
        "passwordreset-email": "Retpoŝtadreso:",
        "passwordreset-emailtitle": "Kontaj detaloj en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iu (verŝajne vi, de IP-adreso $1) petis restarigon de via pasvorto por {{SITENAME}} ($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi ensalutu kaj elektu novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas\nŝanĝi ĝin, vi povas ignori ĉi tiun mesaĝon kaj plu uzi vian \nmalnovan pasvorton.",
        "passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
        "passwordreset-emailsentemail": "Se tiu ĉu retpoŝta adreso estas kunligita kun via konto, tiam al ĉi tiu adreso estos sendita retpoŝto por renovigi pasvorton.",
        "passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asociita kun tiu uzantnomo, tiam ni sendos retpoŝtan mesaĝon pri reagordado de la pasvorto.",
-       "passwordreset-emailsent-capture2": "La {{PLURAL:$1|retpoŝto|retpoŝtoj}} por pasvorta restarigo estis {{PLURAL:$1|sendita|senditaj}}. La {{PLURAL:$1|salutnomo kaj pasvorto|listo de salutnomoj kaj pasvortoj}} estas montrita ĉi tie.",
-       "passwordreset-emailerror-capture2": "Retpoŝtado al la {{GENDER:$2|uzanto}} malsukcesis: $1 La {{PLURAL:$3|uzantonomo kaj pasvorto|listo de uzantonomoj kaj pasvortoj}} estas montrita ĉi tie.",
        "passwordreset-nocaller": "Vokanto devas esti provizita",
        "passwordreset-nosuchcaller": "Vokanto ne ekzistas: $1",
        "passwordreset-ignored": "La pasvorta reensignado ne estis pritraktita. Eble neniu provizanto estis formita?",
        "blockedtitle": "La uzanto estas forbarita.",
        "blockedtext": "'''Via konto aŭ IP-adreso estis forbarita'''\n\nLa forbaro estis farita de $1.\nLa skribita kialo estas ''$2''.\n\n* Komenco de forbaro: $8\n* Findato de forbarado: $6\n* Intencita forbarito: $7\n\nVi rajtas kontakti $1 aŭ alian [[{{MediaWiki:Grouppage-sysop}}|administranton]] por pridiskuti la forbaradon.\nVi ne povas uzi la 'retpoŝtan' funkcion, escepte se vi indikis validan retpoŝtan adreson en viaj [[Special:Preferences|kontaj agordoj]] kaj vi ne estas blokita uzi ĝin.\nVia IP-adreso estas $3 kaj la ID de la forbarado estas $5.\nBonvolu mencii jenajn indikojn en viaj ĉi-temaj kontaktoj.",
        "autoblockedtext": "Via IP-adreso estas aŭtomate forbarita, ĉar uzis ĝin alia uzanto, kiun baris $1.\nLa donita kialo estas:\n\n:''$2''\n\n*Komenco de forbaro: $8\n*Limdato de la blokado: $6\n*Intencis forbari uzanton: $7\n\nVi povas kontakti $1 aŭ iun ajn el la aliaj [[{{MediaWiki:Grouppage-sysop}}|administrantojn]] por diskuti la blokon.\n\nNotu, ke vi ne povas uzi la servon \"Retpoŝtu ĉi tiu uzanton\" krom se vi havas validan retpoŝt-adreson registritan en viaj [[Special:Preferences|preferojn]], kaj vi estas ne blokita kontraŭ ĝia uzado.\n\nVia nuna IP-adreso estas $3, kaj la forbaro-identigo estas $5.\nBonvolu inkluzivi tiujn detalojn en iuj ajn demandoj kiun vi farus.",
+       "systemblockedtext": "Via salutnomo aŭ IPa adreso estis aŭtomate forbarita de MediaWiki.\nLa kialo donita estas:\n\n:<em>$2</em>\n\n* Komenco de forbaro: $8\n* Eksvalidiĝo de forbaro: $6\n* Intenca forbarulo: $7\n\nVia nuna IPa adreso estas $3.\nBonvolu inkluzivi ĉiuj supraj detaloj en ajnaj demandoj vi faras.",
        "blockednoreason": "neniu kialo estis donita",
        "whitelistedittext": "Vi devas $1 por redakti paĝojn.",
        "confirmedittext": "Vi devas konfirmi vian retpoŝtan adreson antaŭ ol redakti paĝojn. Bonvolu agordi kaj validigi vian retadreson per viaj [[Special:Preferences|preferoj]].",
        "search-external": "Ekstera serĉo",
        "searchdisabled": "<p>Oni provizore malŝaltis serĉadon per la plenteksta\nindekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aŭ per <i>jahu!</i>:</p>",
        "search-error": "Okazis eraro dum serĉado: $1",
+       "search-warning": "Okazis eraron dum serĉado: $1",
        "preferences": "Preferoj",
        "mypreferences": "Preferoj",
        "prefs-edits": "Nombro de redaktoj:",
        "saveprefs": "Konservi preferojn",
        "restoreprefs": "Restarigi ĉiujn defaŭltajn preferojn",
        "prefs-editing": "Redaktado",
-       "rows": "Linioj:",
-       "columns": "Kolumnoj:",
        "searchresultshead": "Serĉi",
        "stub-threshold": "Ligilformatigo de ĝermoj ($1):",
        "stub-threshold-sample-link": "specimeno",
        "prefs-help-recentchangescount": "Ĉi tiu inkluzivas lastajn ŝanĝojn, paĝajn historiojn, kaj protokolojn.",
        "prefs-help-watchlist-token2": "Tio estas la sekreta ŝlosilo al la retfluo de via atentaro.\nĈiu, kiu konas ĝin, povas legi vian atentaron. Do, ne kunhavigu ĝin.\nSe vi devas, [[Special:ResetTokens|vi povas rekomencigi ĝin]].",
        "savedprefs": "Viaj preferoj estas konservitaj.",
-       "savedrights": "La uzanto-rajtoj de {{GENDER:$1|$1}} estis konservitaj.",
+       "savedrights": "La uzanto-grupoj de {{GENDER:$1|$1}} estis konservitaj.",
        "timezonelegend": "Horzono:",
        "localtime": "Loka tempo:",
        "timezoneuseserverdefault": "Uzi defaŭlton de servilo ($1)",
        "prefswarning-warning": "Vi faris ŝanĝojn al viaj agordoj, kiuj ankoraŭ ne estas konservitaj.\nSe vi foriros de tiu ĉi paĝo sen klaki al \"$1\", viaj agordoj ne estos ĝisdatigitaj.",
        "prefs-tabs-navigation-hint": "Konsileto: Vi povas uzi la maldekstran kaj dekstran sagajn klavojn por navigi inter la langetoj en la langeta listo.",
        "userrights": "Prizorgi rajtojn de uzantoj",
-       "userrights-lookup-user": "Administri grupojn de uzantoj",
+       "userrights-lookup-user": "Elekti uzanton",
        "userrights-user-editname": "Entajpu salutnomon:",
-       "editusergroup": "Redakti grupojn de {{GENDER:$1|uzanto}}",
+       "editusergroup": "Ŝargi uzantgrupojn",
        "editinguser": "Ŝanĝado de uzantorajtoj de la {{GENDER:$1|uzanto}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Vidi uzantorajtojn de {{GENDER:$1|uzanto}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Redakti grupojn de uzantoj",
+       "userrights-viewusergroup": "Vidi grupojn de uzantoj",
        "saveusergroups": "Konservi grupojn de {{GENDER:$1|uzantoj}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Implica membro de:",
        "userrights-reason": "Kialo:",
        "userrights-no-interwiki": "Vi ne rajtas redakti uzanto-rajtojn en aliaj vikioj.",
        "userrights-nodatabase": "Datumbazo $1 ne ekzistas aŭ ne estas loka.",
-       "userrights-nologin": "Vi devas [[Special:UserLogin|ensaluti]] per administranto-konto por doni uzanto-rajtojn.",
-       "userrights-notallowed": "Via konto ne rajtas doni aŭ forigi uzanto-rajtojn.",
        "userrights-changeable-col": "Grupoj kiujn vi povas ŝanĝi",
        "userrights-unchangeable-col": "Grupoj kiujn vi ne povas ŝanĝi",
        "userrights-conflict": "Konflikto ĉe la ŝanĝo de uzantorajtoj! Bonvolu kontroli kaj konfirmi viajn ŝanĝojn.",
-       "userrights-removed-self": "Vi nuligis viajn proprajn rajtojn, do vi ne plu rajtas aliri ĉi tiun paĝon.",
        "group": "Grupo:",
        "group-user": "Uzantoj",
        "group-autoconfirmed": "Aŭtomate konfirmitaj uzantoj",
        "right-userrights": "Redakti ĉiujn uzanto-rajtojn",
        "right-userrights-interwiki": "Redakti la rajtojn de uzantoj en aliaj vikioj",
        "right-siteadmin": "Ŝlosi kaj malŝlosi la datumbazon",
-       "right-override-export-depth": "Eksporti paĝojn inkluzivante ligitajn paĝojn ĝis profundeco de 5",
+       "right-override-export-depth": "Elporti paĝojn inkluzivante ligitajn paĝojn ĝis profundeco de 5",
        "right-sendemail": "Sendi retpoŝton al aliaj uzantoj",
-       "right-passwordreset": "Vidi retpoŝtojn de pasvorta restarado.",
        "right-managechangetags": "Kreado kaj (mal)aktivgo de [[Special:Tags|etikedoj]]",
        "right-applychangetags": "Aldoni [[Special:Tags|etikedojn]] al propraj ŝanĝoj",
        "right-changetags": "Aldoni kaj forigi arbitrajn [[Special:Tags|etikedojn]] ĉe unuopaj revizioj kaj protokoleroj",
        "action-writeapi": "uzi la skriban API-on",
        "action-delete": "forigi ĉi tiun paĝon",
        "action-deleterevision": "forigi ĉi tiun version",
-       "action-deletedhistory": "vidi la forigitan historion de ĉi tiu paĝo",
+       "action-deletelogentry": "forigi protokolerojn",
+       "action-deletedhistory": "vidi historion de forigitaj versiojn de la paĝo",
+       "action-deletedtext": "vidi tekston el forigita versio",
        "action-browsearchive": "traserĉi forigitajn paĝojn",
-       "action-undelete": "malforigi ĉi tiun paĝon",
-       "action-suppressrevision": "kontroli kaj restarigi ĉi tiun kaŝitan version",
+       "action-undelete": "malforigi paĝojn",
+       "action-suppressrevision": "kontroli kaj restarigi kaŝitajn versiojn",
        "action-suppressionlog": "vidi ĉi tiun privantan protokolon",
        "action-block": "forari ĉi tiun uzanton de redaktado",
        "action-protect": "ŝanĝi la protektan nivelon por ĉi tiu paĝo",
        "action-userrights-interwiki": "redakti la rajtojn de uzantoj en aliaj vikioj",
        "action-siteadmin": "ŝlosi aŭ malŝlosi la datumbazon",
        "action-sendemail": "sendi retpoŝtojn",
+       "action-editmyoptions": "redakti viajn preferojn",
        "action-editmywatchlist": "modifi vian atento-liston",
        "action-viewmywatchlist": "vidi vian atento-liston",
        "action-viewmyprivateinfo": "vidi viajn privatajn informojn",
        "recentchanges-label-newpage": "Ĉi tiu redakto kreis novan paĝon",
        "recentchanges-label-minor": "Ĉi tiu estas eta redakto",
        "recentchanges-label-bot": "Ĉi tiu redakto estis farita per roboto.",
-       "recentchanges-label-unpatrolled": "Ĉi tiu redakto ne jam estis patrolata.",
+       "recentchanges-label-unpatrolled": "Ĉi tiu redakto ankoraŭ ne estis patrolita.",
        "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bitokoj",
        "recentchanges-legend-heading": "<strong>Klarigo:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
        "recentchanges-submit": "Montri",
+       "rcfilters-activefilters": "Aktivaj filtriloj",
+       "rcfilters-restore-default-filters": "Restarigi defaŭltajn filtrilojn",
+       "rcfilters-clear-all-filters": "Nuligi ĉiujn filtrilojn",
+       "rcfilters-search-placeholder": "Filtri lastajn ŝanĝojn (vi povas elekti aŭ ekskribi)",
+       "rcfilters-invalid-filter": "Nevalida filtrilo",
+       "rcfilters-empty-filter": "Ekzistas neniuj aktivaj filtriloj. Ĉiuj kontribuaĵoj estas montritaj.",
+       "rcfilters-filterlist-title": "Filtriloj",
+       "rcfilters-filterlist-noresults": "Neniuj filtriloj troviĝis",
+       "rcfilters-filtergroup-registration": "Registrado de uzanto",
+       "rcfilters-filter-registered-label": "Registrita",
+       "rcfilters-filter-registered-description": "Ensalutitaj redaktantoj.",
+       "rcfilters-filter-unregistered-label": "Neregistrita",
+       "rcfilters-filter-unregistered-description": "Redaktantoj kiuj ne estas ensalutita.",
+       "rcfilters-filtergroup-authorship": "Redakta aŭtoreco",
+       "rcfilters-filter-editsbyself-label": "Viaj redaktoj",
+       "rcfilters-filter-editsbyself-description": "Viaj redaktoj.",
+       "rcfilters-filter-editsbyother-label": "Redaktoj de aliuloj",
+       "rcfilters-filter-editsbyother-description": "Redaktoj kreitaj far aliaj uzantoj (krom vi).",
+       "rcfilters-filtergroup-userExpLevel": "Spertonivelo (nur por registritaj uzantoj)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novuloj",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Malpli ol 10 redaktoj kaj 4 tagoj de aktiveco.",
+       "rcfilters-filter-userExpLevel-learner-label": "Lernantoj",
+       "rcfilters-filter-userExpLevel-learner-description": "Pliaj tagoj da aktiveco kaj redaktoj ol \"Novuloj\" sed malpli ol \"Spertaj uzantoj\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Spertaj uzantoj",
+       "rcfilters-filter-userExpLevel-experienced-description": "Pli ol 30 tagoj da aktiveco kaj 500 redaktoj.",
+       "rcfilters-filtergroup-automated": "Aŭtomatigitaj kontribuoj",
+       "rcfilters-filter-bots-label": "Roboto",
+       "rcfilters-filter-bots-description": "Redaktoj farita de aŭtomatigitaj iloj.",
+       "rcfilters-filter-humans-label": "Homa (ne robota)",
+       "rcfilters-filter-humans-description": "Redaktoj farita de homaj redaktantoj.",
+       "rcfilters-filtergroup-significance": "Signifo",
+       "rcfilters-filter-minor-label": "Etaj redaktoj",
+       "rcfilters-filter-minor-description": "Redaktoj kiujn la aŭtoro markis kiel \"redakteto\".",
+       "rcfilters-filter-major-label": "Redaktoj kiujn la aŭtoro ne markis kiel \"redakteto\".",
+       "rcfilters-filter-major-description": "Redaktoj kiujn la aŭtoro ne markis kiel \"redakteto\".",
+       "rcfilters-filtergroup-changetype": "Tipo de ŝanĝo",
+       "rcfilters-filter-pageedits-label": "Redaktoj de paĝoj",
+       "rcfilters-filter-pageedits-description": "Redaktoj al vikia enhavo, diskutoj, kategoriaj priskriboj...",
+       "rcfilters-filter-newpages-label": "Kreaĵoj de paĝo",
+       "rcfilters-filter-newpages-description": "Redaktoj kiuj faras novajn paĝojn.",
+       "rcfilters-filter-categorization-label": "Ŝanĝoj de kategorioj",
+       "rcfilters-filter-categorization-description": "Registroj de paĝoj aldonitaj aŭ forigitaj de kategorioj",
+       "rcfilters-filter-logactions-label": "Registritaj agoj",
+       "rcfilters-filter-logactions-description": "Administraciaj agoj, kontaj kreoj, paĝaj forigoj, alŝutoj....",
        "rcnotefrom": "Malsupre estas la {{PLURAL:$5|ŝanĝo|ŝanĝoj}} ekde <strong>$3, $4</strong> (montrante ĝis <strong>$1</strong>).",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 etajn redaktojn",
        "uploaded-setting-handler-svg": "SVGa dosiero kiu ensignas la traktilan atributon (''<span lang=\"en\">handler</span>'') kun fora/datena/skripta estas blokita. Trovis <code>$1=\"$2\"</code> en la alsûtita SVGa dosiero.",
        "uploaded-remote-url-svg": "SVG-a dosiero kiu asignas ajnan stilan atributon kun fora URL estas blokita. Ni trovis <code>$1=\"$2\"</code> en la alsûtita SVG-a dosiero.",
        "uploaded-image-filter-svg": "Trovis bildan filtrilon kun URL:  <code>&lt;$1 $2=\"$3\"&gt;</code> en la alŝutita SVGa dosiero.",
-       "uploadscriptednamespace": "Ĉi tiu SVG-dosiero enhavas nevalidan nomspacon \"$1\"",
+       "uploadscriptednamespace": "Ĉi tiu SVG-dosiero enhavas nevalidan nomspacon \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Ne eblas interpreti la XML-sintakson en la alŝutita dosiero",
        "uploadvirus": "Viruso troviĝas en la dosiero! Detaloj: $1",
        "uploadjava": "La dosiero estas ZIP-dosiero kiu enhavas .class-dosieron de Java.\nAlŝutante Java-dosieron estas malpermesita, ĉar ili povas kaŭzi sekureco-limigojn esti preterpasitaj.",
        "uncategorizedcategories": "Neenkategoriitaj kategorioj",
        "uncategorizedimages": "Neenkategoriigitaj dosieroj",
        "uncategorizedtemplates": "Neenkategoriigitaj ŝablonoj",
+       "uncategorized-categories-exceptionlist": "# Enhavas liston de kategorioj, kiuj ne devus esti menciitaj en Specialaĵo:UncategorizedCategories. Unu po linio, komencante per \"*\". Linioj komencantaj kun alia karaktero (inkluzivante blankspaco) estas ignorata. Uzu \"#\" por rimarkoj.",
        "unusedcategories": "Neuzitaj kategorioj",
        "unusedimages": "Neuzataj bildoj",
        "wantedcategories": "Dezirataj kategorioj",
        "apisandbox-continue": "Daŭrigi",
        "apisandbox-continue-clear": "Vakigi",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries daŭrigos] la lastan peton; {{int:apisandbox-continue-clear}} forviŝos parametrojn rilatajn al daŭrigo.",
+       "apisandbox-param-limit": "Enigi <kbd>max</kbd> por uzi la maksimuman limon.",
+       "apisandbox-multivalue-all-namespaces": "$1 (ĉiuj nomspacoj)",
+       "apisandbox-multivalue-all-values": "$1 (ĉiuj valoroj)",
        "booksources": "Librofontoj",
        "booksources-search-legend": "Serĉi librofontojn",
        "booksources-search": "Serĉi",
        "booksources-text": "Jen ligilaro al aliaj TTT-ejoj, kiuj vendas librojn,\nkaj/aŭ informumos pri la libro ligita.\nLa {{SITENAME}} ne estas komerce ligita al tiuj vendejoj, kaj la listo ne estu\nkomprenata kiel rekomendo aŭ reklamo.",
        "booksources-invalid-isbn": "La donata ISBN verŝajne estas nevalida; kontrolu pri erara kopiado el la originala fonto.",
+       "magiclink-tracking-rfc": "Paĝoj kiuj uzas [https://en.wikipedia.org/wiki/Help:Magic_links#RFC magiajn ligilojn] por [https://eo.wikipedia.org/wiki/Request_for_Comments peto pri komentoj]",
+       "magiclink-tracking-rfc-desc": "Ĉi tiu paĝo uzas magiajn ligilojn por [https://eo.wikipedia.org/wiki/Request_for_Comments peto pri komentoj]. Vidi [https://www.mediawiki.org/wiki/special:MyLanguage/Helpo:Magiaj_ligoj mediawiki.org] pri kiel migri.",
+       "magiclink-tracking-pmid": "Paĝoj kiuj uzas magiajn ligilojn por PubMed",
+       "magiclink-tracking-pmid-desc": "Ĉi tiu paĝo uzas PubMed-aj magiaj ligoj. Vidi [https://www.mediawiki.org/wiki/special:MyLanguage/Helpo:Magiaj_ligoj mediawiki.org] pri kiel migri.",
+       "magiclink-tracking-isbn": "Paĝoj kiuj uzas ISBNajn magiajn ligilojn",
+       "magiclink-tracking-isbn-desc": "Ĉi tiu paĝo uzas ISBNajn magiajn ligilojn. Vidi [https://www.mediawiki.org/wiki/special:MyLanguage/Helpo:Magiaj_ligoj mediawiki.org] pri kiel migri.",
        "specialloguserlabel": "Faranto:",
        "speciallogtitlelabel": "Celo (titolo aŭ  {{ns:user}}:salutnomo por uzanto):",
        "log": "Protokoloj",
        "activeusers-count": "$1 {{PLURAL:$1|ago|agoj}} dum la {{PLURAL:$3|lasta tago|lastaj $3 tagoj}}",
        "activeusers-from": "Montri uzantojn ekde:",
        "activeusers-groups": "Montri uzantojn apartenantajn al grupoj:",
+       "activeusers-excludegroups": "Ekskludi la uzantojn, kiuj grupanas:",
        "activeusers-noresult": "Neniuj uzantoj trovitaj.",
        "activeusers-submit": "Montri la agemajn uzantojn",
        "listgrouprights": "Gruprajtoj de uzantoj",
        "emailccsubject": "Kopio de via mesaĝo al $1: $2",
        "emailsent": "Retmesaĝo sendita",
        "emailsenttext": "Via retmesaĝo estas sendita.",
-       "emailuserfooter": "Ĉi tiu retpoŝtmesaĝo estis {{GENDER:$1|sendita}} de $1 al {{GENDER:$2|$2}} per la funkcio \"{{int:emailuser}}\" ĉe {{SITENAME}}.",
+       "emailuserfooter": "Ĉi tiu retpoŝtmesaĝo estis {{GENDER:$1|sendita}} de $1 al {{GENDER:$2|$2}} per la funkcio \"{{int:emailuser}}\" ĉe {{SITENAME}}. Se {{GENDER:$2|vi}} respondas al ĉi tiu retpoŝto,  {{GENDER:$2|via}} retpoŝto estos sendita rekte al la {{{{GENDER:$1|}}|originala sendinto}}, rivelanta {{GENDER:$2|via}} retpoŝta adreso al {{GENDER:$1|ili}}.",
        "usermessage-summary": "Lasanta sisteman mesaĝon.",
        "usermessage-editor": "Mesaĝanto de sistemo",
        "watchlist": "Mia atentaro",
        "changecontentmodel-emptymodels-title": "Neniu disponebla enhavomodelo",
        "changecontentmodel-emptymodels-text": "La enhavo en [[:$1]] ne transtipeblas al iu ajn tipo.",
        "log-name-contentmodel": "Ŝanĝprotokolo de enhavomodelo",
-       "log-description-contentmodel": "Eventoj rilataj kun la enhavomodeloj de paĝo",
+       "log-description-contentmodel": "Ĉi tiu paĝo montras ŝanĝojn de la enhavomodelo de paĝoj, kaj paĝojn kreitajn kun enhavomodelo aparta de la norma.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|kreis}} la paĝo $3 per uzado de ne-defaŭlta enhavomodelo \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ŝanĝis}} la enhavomodelon de la paĝo $3 el \"$4\" al \"$5\"",
        "logentry-contentmodel-change-revertlink": "restarigi",
        "modifiedarticleprotection": "ŝanĝis nivelon de protekto por \"[[$1]]\"",
        "unprotectedarticle": "forigis protektadon de \"[[$1]]\"",
        "movedarticleprotection": "movis protektadajn preferojn de \"[[$2]]\" al \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protektis}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Ŝanĝis protektan nivelon}} por \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Forigis protekton}} por \"[[$1]]\"",
        "protect-title": "Protektante \"$1\"",
        "protect-title-notallowed": "Vidi protektadan nivelon de \"$1\"",
        "prot_1movedto2": "[[$1]] movita al [[$2]]",
        "whatlinkshere-hideredirs": "$1 alidirektilojn",
        "whatlinkshere-hidetrans": "$1 inkludojn",
        "whatlinkshere-hidelinks": "$1 ligilojn",
-       "whatlinkshere-hideimages": "$1 dosieraj ligoj",
+       "whatlinkshere-hideimages": "$1 dosier{{PLURAL:$1|a ligilo|aj ligiloj}}",
        "whatlinkshere-filters": "Filtriloj",
        "whatlinkshere-submit": "Ek",
        "autoblockid": "Aŭtomata forbaro #$1",
        "proxyblockreason": "Via IP-adreso estis forbarita ĉar ĝi estas malferma prokurilo. Bonvolu kontakti vian provizanto de retservo aŭ komputika helpisto kaj informu ilin de ĉi serioza problemo pri sekureco.",
        "sorbsreason": "Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}.",
        "sorbs_create_account_reason": "Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}. Vi ne rajtas krei konton.",
+       "softblockrangesreason": "Anonimaj kontribuoj ne estas permesataj de via IP-adreso ($1). Bonvolu ensaluti.",
        "xffblockreason": "La IP-adreso en la kapo de X-Forwarded-For, ĉu via aŭ de la prokurilo kiun vi uzas, estis forbarita. La origina forbarokialo estis: $1",
        "cant-see-hidden-user": "La uzanto kiun vi provas forbari jam estis forbarita kaj kaŝita. Kiel vi ne havas la rajton kaŝi uzanton, vi ne povas vidi aŭ redakti la forbaron de la uzanto.",
        "ipbblocked": "Vi ne povas forbari aŭ malforbari aliajn uzantojn, ĉar vi mem estas forbarita",
        "cant-move-to-user-page": "Vi ne rajtas movi paĝon al uzantopaĝo (krom al uzantosubpaĝo).",
        "cant-move-category-page": "Vi ne rajtas movi kategoriajn paĝojn.",
        "cant-move-to-category-page": "Vi ne rajtas movi paĝon al kategoria paĝo.",
+       "cant-move-subpages": "Vi ne rajtas movi subpaĝojn.",
+       "namespace-nosubpages": "Nomspaco \"$1\" ne permesas subpaĝojn.",
        "newtitle": "Nova titolo:",
        "move-watch": "Atenti ĉi tiun paĝon",
        "movepagebtn": "Alinomi paĝon",
        "semiprotectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel ĝi estas nur movebla de registritaj uzantoj.\nJen la lasta protokolero por via referenco:",
        "move-over-sharedrepo": "[[:$1]] ekzistas en komuna dosierujo. Movado de dosiero al ĉi tiu titolo anstataŭigos la komunan dosieron.",
        "file-exists-sharedrepo": "La elektita dosiernomo jam estas uzita en komun dosierujo.\nBonvolu elekti alian nomon.",
-       "export": "Eksporti paĝojn",
-       "exporttext": "Vi povas eksporti la tekston kaj la redaktohistorion de aparta paĝo aŭ de paĝaro kolektita en ia XML.\nĈi tio povas esti importita en alian programon funkciantan per MediaWiki-softvaro per la [[Special:Import|import-paĝo]].\n\nPor eksporti paĝojn, enigu la titolojn en la jena tekst-skatolo, po unu por linio, kaj elektu ĉu vi volas kaj la nunan version kaj ĉiujn antaŭajn versiojn, kun la paĝaj historiaj linioj, aŭ la nunan version kun la informo pri la lasta redakto.\n\nEn la lasta okazo, vi ankaŭ povas uzi ligilon, ekz-e [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la paĝo \"[[{{MediaWiki:Mainpage}}]]\".",
-       "exportall": "Eksporti ĉiujn paĝojn",
+       "export": "Elporti paĝojn",
+       "exporttext": "Vi povas elporti la tekston kaj la redaktohistorion de aparta paĝo aŭ de paĝaro kolektita en ia XML.\nĈi tio povas esti enportita en alian programon funkciantan per MediaWiki per la [[Special:Import|enportpaĝo]].\n\nPor elporti paĝojn, enigu la titolojn en la jena tekst-skatolo, po unu por linio, kaj elektu ĉu vi volas kaj la nunan version kaj ĉiujn antaŭajn versiojn, kun la paĝaj historiaj linioj, aŭ la nunan version kun la informo pri la lasta redakto.\n\nEn la lasta okazo, vi ankaŭ povas uzi ligilon, ekz-e [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la paĝo \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Elporti ĉiujn paĝojn",
        "exportcuronly": "Entenas nur la aktualan version, ne la malnovajn.",
-       "exportnohistory": "----\n'''Notu:''' Eksportado de la plena historio de paĝoj per ĉi paĝo estis malebligita pro funkciigaj kialoj.",
+       "exportnohistory": "----\n'''Notu:''' Elportado de la plena historio de paĝoj per ĉi paĝo estis malebligita pro funkciigaj kialoj.",
        "exportlistauthors": "Inkluzivi plenan liston de kontribuantoj por ĉiu paĝo.",
        "export-submit": "Elporti",
        "export-addcattext": "Aldoni paĝojn el kategorio:",
        "thumbnail_gd-library": "Nekompleta GD-biblioteka konfiguro: mankas funkcio $1",
        "thumbnail_image-missing": "Dosiero verŝajne estas foriga: $1",
        "thumbnail_image-failure-limit": "Lastatempe estis tro multaj malsukcesaj provoj ($1 aŭ pli) por bildigi tiun ĉi miniaturon. Bonvolu reprovi poste.",
-       "import": "Importi paĝojn",
+       "import": "Enporti paĝojn",
        "importinterwiki": "Transvikia importo",
        "import-interwiki-text": "Elektu vikion kaj paĝan titolon por importi.\nDatoj de versioj kaj nomoj de redaktantoj estos konservitaj.\nĈiuj transvikaj importoj estas raportitaj ĉe la [[Special:Log/import|loglibro de importoj]].",
        "import-interwiki-sourcewiki": "Fonta vikio:",
        "import-mapping-subpage": "Importi kiel subpaĝojn de la jena paĝo:",
        "import-upload-filename": "Dosiernomo:",
        "import-comment": "Komento:",
-       "importtext": "Bonvolu eksporti la dosieron el la fonta vikio per la [[Special:Export|eksportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin tien ĉi.",
+       "importtext": "Bonvolu elporti la dosieron el la fonta vikio per la [[Special:Export|eksportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin ĉi tien.",
        "importstart": "Importante paĝojn...",
        "import-revision-count": "$1 {{PLURAL:$1|versio|versioj}}",
        "importnopages": "Neniu paĝo por importi.",
        "pageinfo-length": "Paĝgrandeco (en bajtoj)",
        "pageinfo-article-id": "Paĝa identigo",
        "pageinfo-language": "Lingvo de paĝa enhavo",
+       "pageinfo-language-change": "ŝanĝi",
        "pageinfo-content-model": "Modelo de paĝoenhavo",
        "pageinfo-content-model-change": "ŝanĝi",
        "pageinfo-robot-policy": "Indeksado per robotoj",
        "patrol-log-header": "Jen protokolo de patrolitaj versioj.",
        "log-show-hide-patrol": "$1 protokolo pri patrolado",
        "log-show-hide-tag": "$1 etikedan protokolon",
+       "confirm-markpatrolled-button": "Ek!",
+       "confirm-markpatrolled-top": "Marki version $3 el $2 kiel patrolita?",
        "deletedrevision": "Forigita malnova versio $1",
        "filedeleteerror-short": "Eraro dum forigo de dosiero: $1",
        "filedeleteerror-long": "Eraroj renkontritaj kiam forigante la dosieron:\n\n$1",
        "tags-deactivate": "malaktivigi",
        "tags-hitcount": "$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}",
        "tags-manage-no-permission": "Vi ne havas la rajton prilabori markilojn.",
-       "tags-manage-blocked": "Vi ne povas administri ŝanĝajn etikedojn dum blokita.",
+       "tags-manage-blocked": "Vi ne povas administri etikedojn de ŝanĝo dum {{GENDER:$1|vi}} estas forbaritaj.",
        "tags-create-heading": "Krei novan markilon",
        "tags-create-explanation": "Nove kreitaj etikedoj estos defaŭlte disponeblaj por uzado de uzantoj kaj robotoj.",
        "tags-create-tag-name": "Nomo de etikedo:",
        "tags-deactivate-not-allowed": "Ne eblas malaktivigi la etikedon \"$1\".",
        "tags-deactivate-submit": "Malaktivigi",
        "tags-apply-no-permission": "Vi ne havas permeson por aldoni ŝanĝo-etikedojn al viaj ŝanĝoj.",
-       "tags-apply-blocked": "Vi ne povas apliki etikedojn de ŝanĝo kune kun viaj ŝanĝoj dum blokita.",
+       "tags-apply-blocked": "Vi ne povas apliki etikedojn de ŝanĝo kune kun viaj ŝanĝoj dum {{GENDER:$1|vi}} estas forbarita.",
        "tags-apply-not-allowed-one": "La etikedon \"$1\" ne eblas aldoni permane.",
        "tags-apply-not-allowed-multi": "Ne estas permesite permane aldoni {{PLURAL:$2|jenan etikedon|jenajn etikedojn}}: $1",
        "tags-update-no-permission": "Vi ne havas permeson por aldoni aŭ forigi ŝanĝo-etikedojn de unuopaj revizioj aŭ protokoleroj.",
-       "tags-update-blocked": "Vi ne povas aldoni aŭ forigi etikedojn de ŝanĝo dum blokita.",
+       "tags-update-blocked": "Vi ne povas aldoni aŭ forigi etikedojn de ŝanĝo dum {{GENDER:$1|vi}} estas forbarita.",
        "tags-update-add-not-allowed-one": "Ne estas permesite permane aldoni la etikedon \"$1\".",
        "tags-update-add-not-allowed-multi": "Ne estas permesite permane aldoni {{PLURAL:$2|jenan etikedon|jenajn etikedojn}}: $1",
        "tags-update-remove-not-allowed-one": "Ne estas permesite permane forigi la etikedon \"$1\".",
        "htmlform-user-not-exists": "<strong>$1</strong> ne ekzistas.",
        "htmlform-user-not-valid": "<strong>$1</strong> ne estas valida salutnomo.",
        "logentry-delete-delete": "$1 forigis paĝon $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|forigis}} alidirektitan $3 per anstataŭigado",
        "logentry-delete-restore": "$1 restarigis paĝon $3",
        "logentry-delete-event": "$1 ŝanĝis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ŝanĝis}} videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paĝo $3: $4",
        "feedback-useragent": "Klienta aplikaĵo:",
        "searchsuggest-search": "Serĉi tra {{SITENAME}}",
        "searchsuggest-containing": "enhavas...",
-       "api-error-autoblocked": "Via IPa adreso estis blokita aŭtomate, ĉar ĝi estis uzita far forbara uzanto.",
-       "api-error-badaccess-groups": "Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.",
        "api-error-badtoken": "Interna eraro: fuŝaĵo.",
-       "api-error-blocked": "Vi estis blokita pri redakto.",
-       "api-error-copyuploaddisabled": "Alŝuto per URL-adreso estas malebligata en tiu ĉi servilo.",
-       "api-error-duplicate": "Jam estas {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} en la retejo kun la sama enhavo.",
-       "api-error-duplicate-archive": "Jam estis {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} de sama enhavo en la retejo, sed {{PLURAL:$1|ĝi estis forigita|ili estis forigitaj}}.",
-       "api-error-empty-file": "La dosiero kiun vi sendis estis malplena.",
        "api-error-emptypage": "Kreo de novaj malplenaj paĝoj ne estas permesita.",
-       "api-error-fetchfileerror": "Interna eraro: io misfunkciis dum la dosiera prenado.",
-       "api-error-fileexists-forbidden": "Dosiero nomata \"$1\" jam existas kaj ne estas surskribebla.",
-       "api-error-fileexists-shared-forbidden": "Dosiero nomata \"$1\" jam existas en la kunhavata dosier-datumbazo kaj ne estas surskribebla.",
-       "api-error-file-too-large": "La dosiero kiun vi alŝutis estis tro granda.",
-       "api-error-filename-tooshort": "La dosiernomo estas tro mallonga.",
-       "api-error-filetype-banned": "Ĉi tiu tipo de dosiero estas malpermesita.",
-       "api-error-filetype-banned-type": "$1 ne estas {{PLURAL:$4|permesita dosiero-tipo|permesitaj dosiero-tipoj}}. {{PLURAL:$3|Permesita dosiero-tipo|Permesitaj dosiero-tipoj}} estas $2.",
-       "api-error-filetype-missing": "Mankas sufikso de la dosiero.",
-       "api-error-hookaborted": "La ŝanĝo kiun vi provis fari estis haltigita de etendaĵa hoko.",
-       "api-error-http": "Interna eraro: ne eblas konektiĝi al la servilo.",
-       "api-error-illegal-filename": "La dosiernomo ne estas permesata.",
-       "api-error-internal-error": "Interna eraro: io misokazis en la prilaboro de via alŝuto en la vikio.",
-       "api-error-invalid-file-key": "Interna eraro: la dosiero ne troveblis en la dumtempa stokejo.",
-       "api-error-missingparam": "Interna eraro: mankantaj parametroj en la alŝutopeto.",
-       "api-error-missingresult": "Interna eraro: ne eblis eltrovi ĉu la kopiado sukcesis.",
-       "api-error-mustbeloggedin": "Vi devas esti ensalutinta por rajti alŝuti dosierojn.",
-       "api-error-mustbeposted": "Interna eraro: la peto necesigas alŝuton en formato HTTP.",
-       "api-error-noimageinfo": "La alŝuto sukcesis, sed la servilo ne donis ajnan informon pri la dosiero.",
-       "api-error-nomodule": "Interna eraro: ne troveblas alŝuta helpilaro.",
-       "api-error-ok-but-empty": "Interna eraro: nenia respondo de la servilo.",
-       "api-error-overwrite": "Anstataŭigo de ekzistanta dosiero ne permesatas.",
-       "api-error-ratelimited": "Vi provas alŝuti pli da dosieroj dum mallonga periodo ol ĉi tiu vikio permesas.\nBonvolu provi denove en kelkaj minutoj.",
-       "api-error-stashfailed": "Interna eraro: la servilo malsukcesis stoki provizoran dosieron.",
        "api-error-publishfailed": "Interna eraro: Servilo malsukcesis eldoni provizoran dosieron.",
-       "api-error-stasherror": "Eraro okazis dum alŝutado de la dosiero al dosierujo.",
-       "api-error-stashedfilenotfound": "Dum provo alŝuti dosieron de rezervujo ne estis la dosiero trovita.",
-       "api-error-stashpathinvalid": "La vojo en rezervujo, kie devus esti la dosiero trovita, estas malvalida.",
-       "api-error-stashfilestorage": "Okazis eraro dum konservado de dosiero al rezervujo.",
-       "api-error-stashzerolength": "La servilo ne povis konservi dosieron en rezervujon, ĉar ĝi havis nulan longecon.",
-       "api-error-stashnotloggedin": "Vi devas esti ensalutinta por konservi dosieron en alŝutan rezervujon.",
-       "api-error-stashwrongowner": "La rezervuja dosiero, kiun vi provis aliri, ne apartenas al vi.",
-       "api-error-stashnosuchfilekey": "La dosiera ŝlosilo, kiun vi provis aliri en rezervujo, ne ekzistas.",
-       "api-error-timeout": "La servilo ne respondis ene de la antaŭvidita tempo.",
-       "api-error-unclassified": "Okazis nekonata eraro",
-       "api-error-unknown-code": "Nekonata eraro: \"$1\"",
-       "api-error-unknown-error": "Interna eraro: io misokazis en la alŝuto de via dosiero.",
-       "api-error-unknown-warning": "Nekonata averto: $1",
+       "api-error-stashfailed": "Interna eraro: la servilo malsukcesis stoki provizoran dosieron.",
+       "api-error-unknown-warning": "Nekonata averto: \"$1\".",
        "api-error-unknownerror": "Nekonata eraro: \"$1\"",
-       "api-error-uploaddisabled": "Alŝutato estas malebligata en tiu ĉi vikio.",
-       "api-error-verification-error": "Tiu ĉi dosiero eble estas difektita, aŭ havas la malĝustan dosieran finaĵon.",
-       "api-error-was-deleted": "Dosiero kun ĉi tiu nomo estis antaŭe alŝutita kaj sekvente forigita.",
        "duration-seconds": "$1 {{PLURAL:$1|sekundo|sekundoj}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutoj}}",
        "duration-hours": "$1 {{PLURAL:$1|horo|horoj}}",
        "pagelang-language": "Lingvo",
        "pagelang-use-default": "Uzi defaŭltan lingvon",
        "pagelang-select-lang": "Elekti la lingvon",
+       "pagelang-reason": "Kialo",
        "pagelang-submit": "Ek!",
+       "pagelang-nonexistent-page": "La paĝo $1 ne ekzistas.",
+       "pagelang-unchanged-language": "La paĝo $1 jam estas agordita al la lingvo $2.",
+       "pagelang-unchanged-language-default": "La paĝo $1 jam estas agordita al la norma enhav-lingvo de la vikio.",
+       "pagelang-db-failed": "La datumbazo ne povis ŝanĝi la lingvon de la paĝo.",
        "right-pagelang": "Ŝanĝi paĝan lingvon",
        "action-pagelang": "ŝanĝi la lingvon de la paĝo",
        "log-name-pagelang": "Protokolo pri lingvajn ŝanĝojn",
        "headline-anchor-title": "Ligilo al tiu ĉi sekcio",
        "special-characters-group-latin": "Latina",
        "special-characters-group-latinextended": "Latina etendita",
-       "special-characters-group-ipa": "IPA",
+       "special-characters-group-ipa": "IFA",
        "special-characters-group-symbols": "Simboloj",
        "special-characters-group-greek": "Greka",
        "special-characters-group-greekextended": "Greka etendita",
        "mw-widgets-dateinput-no-date": "Neniu dato elektita",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Serĉi aŭdvidaĵojn",
+       "mw-widgets-mediasearch-noresults": "Neniuj rezultoj trovitaj",
        "mw-widgets-titleinput-description-new-page": "paĝo ankoraŭ ne ekzistas",
        "mw-widgets-titleinput-description-redirect": "alidirekti al $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Aldoni kategorion",
        "sessionmanager-tie": "Kombini diversajn tipojn de ensaluta peto ne estas permisita: $1.",
        "sessionprovider-generic": "$1 seancoj",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "kuketaj seancoj",
        "log-action-filter-block-block": "Forbari",
        "log-action-filter-block-reblock": "Forbari ŝanĝon",
        "log-action-filter-block-unblock": "Malforbari",
-       "log-action-filter-contentmodel-change": "Ŝanĝo de enhavomodelon",
+       "log-action-filter-contentmodel-change": "Ŝanĝo de enhavomodelo",
        "log-action-filter-contentmodel-new": "Kreo de paĝo kun ne-norma enhavomodelo",
        "log-action-filter-delete-delete": "Forviŝigado de paĝo",
+       "log-action-filter-delete-delete_redir": "Alidirekta anstataŭigo",
        "log-action-filter-delete-restore": "Malforviŝigado de paĝo",
        "log-action-filter-delete-event": "Forviŝigado de protokolo",
        "log-action-filter-delete-revision": "Forviŝigado de rivizio",
        "authmanager-authn-autocreate-failed": "Aŭtokreo de loka konto malsukcesis: $1",
        "authmanager-change-not-supported": "La provizitaj legitimaĵoj ne povas esti ŝanĝita, kiel nenio uzus ilin.",
        "authmanager-create-disabled": "kreado de kontoj estas malebligita",
-       "authmanager-create-from-login": "Por krei vian konton, bonvolu plenigi la kampojn sube.",
+       "authmanager-create-from-login": "Por krei vian konton, bonvolu plenigi la kampojn.",
        "authmanager-create-not-in-progress": "Konta kreo ne estas progresanta aŭ seanca dateno estis perdita. Bonvolu pravi denove ekde la komenco.",
        "authmanager-create-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta kreo.",
        "authmanager-link-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta ligado.",
        "usercssispublic": "Bonvolu noti: subpaĝoj en CSS ne enhavu konfidenciajn datumojn ĉar ili estas videblaj por aliaj uzantoj.",
        "restrictionsfield-badip": "Malvalida IP-adreso de la intervalo: $1",
        "restrictionsfield-label": "Permesita IP-intervalo:",
-       "restrictionsfield-help": "Unu IP-adreso aŭ CIDR-intervalo per linio. Por permesigi ĉion, uzu<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Eraro: $1",
-       "edit-error-long": "Eraroj\n\n$1"
+       "restrictionsfield-help": "Unu IP-adreso aŭ CIDR-intervalo per linio. Por permesigi ĉion, uzu:<pre>0.0.0.0/0</code>\n<code>::/0</pre>",
+       "revid": "revizio $1",
+       "pageid": "Identigilo de paĝo $1"
 }
index 7aa39da..7f32ddd 100644 (file)
                        "Irus",
                        "Sophivorus",
                        "Pompilos",
-                       "Igv"
+                       "Igv",
+                       "Juanpabl"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "category-file-count-limited": "{{PLURAL:$1|El siguiente archivo pertenece|Los siguientes $1 archivos pertenecen}} a esta categoría.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Páginas indizadas",
-       "noindex-category": "Páginas no indexadas",
+       "noindex-category": "Páginas no indizadas",
        "broken-file-category": "Páginas con enlaces rotos a archivos",
        "about": "Acerca de",
        "article": "Página de contenido",
        "qbfind": "Buscar",
        "qbbrowse": "Navegar",
        "qbedit": "Editar",
-       "qbpageoptions": "Opciones de página",
+       "qbpageoptions": "Esta página",
        "qbmyoptions": "Mis páginas",
        "faq": "Preguntas frecuentes",
        "faqpage": "Project:Preguntas frecuentes",
        "searcharticle": "Ir",
        "history": "Historial",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "actualizado desde mi última visita",
        "printableversion": "Versión para imprimir",
        "permalink": "Enlace permanente",
        "views": "Vistas",
        "toolbox": "Herramientas",
        "tool-link-userrights": "Modificar grupos {{GENDER:$1|del usuario|de la usuaria}}",
+       "tool-link-userrights-readonly": "Ver los grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "tool-link-emailuser": "Enviar un correo a {{GENDER:$1|este usuario|esta usuaria}}",
        "userpage": "Ver página de usuario",
        "projectpage": "Ver página del proyecto",
        "editsection": "editar",
        "editold": "editar",
        "viewsourceold": "ver código",
-       "editlink": "modificar",
+       "editlink": "editar",
        "viewsourcelink": "ver código",
        "editsectionhint": "Editar sección: $1",
        "toc": "Contenido",
        "filerenameerror": "No se ha podido renombrar el archivo «$1» a «$2».",
        "filedeleteerror": "No se ha podido borrar el archivo «$1».",
        "directorycreateerror": "No se ha podido crear el directorio «$1».",
-       "directoryreadonlyerror": "La carpeta «$1» es de solo lectura.",
-       "directorynotreadableerror": "La carpeta «$1» no tiene permisos de lectura.",
+       "directoryreadonlyerror": "El directorio «$1» es de solo lectura.",
+       "directorynotreadableerror": "El directorio «$1» no tiene permisos de lectura.",
        "filenotfound": "No se ha encontrado el archivo «$1».",
        "unexpected": "Valor inesperado: «$1»=«$2».",
        "formerror": "Error: no se ha podido enviar el formulario.",
        "emailnotauthenticated": "Aún no has confirmado tu dirección de correo electrónico.\nHasta que lo hagas, las siguientes funciones no estarán disponibles.",
        "noemailprefs": "Especifica una dirección electrónica para habilitar estas características.",
        "emailconfirmlink": "Confirmar dirección de correo electrónico",
-       "invalidemailaddress": "La dirección electrónica no puede ser aceptada, pues parece que tiene un formato no válido.\nPor favor, escribe una dirección en el formato adecuado o deja el campo en blanco.",
+       "invalidemailaddress": "No se puede aceptar la dirección de correo electrónico, pues parece que tiene un formato no válido.\nPor favor, escribe una dirección bien formada o deja el campo en blanco.",
        "cannotchangeemail": "En este wiki no se pueden cambiar las direcciones de correo electrónico de las cuentas de usuario.",
        "emaildisabled": "Este sitio no puede enviar correos electrónicos.",
        "accountcreated": "Se ha creado la cuenta",
        "botpasswords-label-delete": "Borrar",
        "botpasswords-label-resetpassword": "Restablecer la contraseña",
        "botpasswords-label-grants": "Permisos aplicables:",
-       "botpasswords-help-grants": "Cada concesión le da acceso a los permisos listados que el usuario ya posea. Véase la [[Special:ListGrants|lista de concesiones]] para más información.",
+       "botpasswords-help-grants": "Cada concesión le da acceso a los permisos listados que el usuario ya posea. Habilitar una concesión aquí no proporciona acceso a ningún permiso que tu cuenta de usuario no tendría de otra manera. Véase la [[Special:ListGrants|lista de concesiones]] para más información.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "El nombre del bot \"$1\" no es válido.",
        "botpasswords-insert-failed": "No se pudo agregar el nombre del bot \"$1\". ¿Ya ha sido añadido?",
        "resetpass-validity-soft": "Tu contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o haz clic en \"{{int:authprovider-resetpass-skip-label}}\" para cambiarla más tarde.",
        "passwordreset": "Restablecer contraseña",
        "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
-       "passwordreset-text-many": "{{PLURAL:$1|Elige una de las opciones para recibir una contraseña temporal por correo electrónico.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para recibir una contraseña temporal por correo electrónico.}}",
        "passwordreset-disabled": "Se ha desactivado el restablecimiento de contraseñas en este wiki.",
        "passwordreset-emaildisabled": "Se han desactivado las funciones de correo electrónico en este wiki.",
        "passwordreset-username": "Nombre de usuario:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "¿Ver el mensaje resultante?",
-       "passwordreset-capture-help": "Si marcas esta casilla, se te mostrará el correo electrónico (con la contraseña temporal) además de enviarse al usuario.",
        "passwordreset-email": "Dirección de correo electrónico:",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: \n$1\n\nContraseña temporal: \n$2",
        "passwordreset-emailsentemail": "Si esta dirección de correo electrónico está asociada a tu cuenta, entonces se enviará un correo electrónico para restablecer la contraseña.",
        "passwordreset-emailsentusername": "Si existe una dirección de correo electrónico asociada a este nombre de usuario, entonces se enviará un correo para restablecer la contraseña.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Se ha enviado el mensaje de restablecimiento de contraseña|Se han enviado los mensajes de restablecimiento de contraseña}}. {{PLURAL:$1|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra aquí.",
-       "passwordreset-emailerror-capture2": "No fue posible mandar un correo electrónico {{GENDER:$2|al usuario|a la usuaria}}: $1 {{PLURAL:$3|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra aquí.",
        "passwordreset-nocaller": "Debe de proporcionarse un interlocutor",
        "passwordreset-nosuchcaller": "La persona que llama no existe: $1",
        "passwordreset-ignored": "No se logró el reestablecimiento de la contraseña. ¿Tal vez no se configuró un proveedor?",
        "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.",
        "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.",
-       "summary-preview": "Previsualización del resumen:",
+       "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.",
        "blockedtitle": "El usuario está bloqueado",
        "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo lo hizo $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+       "systemblockedtext": "Tu nombre de usuario o dirección IP ha sido bloqueado automáticamente por el software MediaWiki.\nLa razón dada es:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad de bloqueo: $6\n* Destinatario del bloqueo: $7\n\nTu dirección IP actual es $3.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "blockednoreason": "no se ha especificado el motivo",
        "whitelistedittext": "Tienes que $1 para editar páginas.",
        "confirmedittext": "Debes confirmar tu dirección de correo electrónico antes de poder editar páginas. Por favor, configura y confirma tu dirección de correo a través de tus [[Special:Preferences|preferencias de usuario]].",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
        "deprecated-self-close-category": "Páginas que utilizan etiquetas HTML autocerradas no válidas",
-       "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML de autocierre inválidas, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamiento de estas cambiará pronto para ser coherente con la especificación de HTML5, por lo que su utilización en el wikitexto está en desuso.",
+       "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML de autocierre no válidas, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamiento de estas cambiará pronto para ser consistente con la especificación de HTML5, por lo que su utilización en el wikitexto está obsoleta.",
        "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] llama a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "search-interwiki-caption": "Proyectos hermanos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(más)",
+       "search-interwiki-more-results": "más resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionado",
        "searchall": "todos",
        "search-external": "Búsqueda externa",
        "searchdisabled": "Las búsquedas en {{SITENAME}} están desactivadas.\nMientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.",
        "search-error": "Ha ocurrido un error al buscar: $1",
+       "search-warning": "Se ha producido un aviso al hacer la búsqueda: $1",
        "preferences": "Preferencias",
        "mypreferences": "Preferencias",
        "prefs-edits": "Cantidad de ediciones:",
        "saveprefs": "Guardar",
        "restoreprefs": "Restaurar la configuración predeterminada (en todas las secciones)",
        "prefs-editing": "Edición",
-       "rows": "Filas:",
-       "columns": "Columnas:",
        "searchresultshead": "Búsquedas",
        "stub-threshold": "Límite para enlazar con el estilo de esbozo ($1):",
        "stub-threshold-sample-link": "muestra",
        "prefs-help-recentchangescount": "Esto incluye cambios recientes, historiales de páginas y registros.",
        "prefs-help-watchlist-token2": "Esta es la clave secreta del canal de suscripción de tu lista de seguimiento.\nCualquier persona que la conozca podría leer tu lista, así que no la compartas.\n[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].",
        "savedprefs": "Se han guardado tus preferencias.",
-       "savedrights": "Se han guardado los permisos de {{GENDER:$1|$1}}.",
+       "savedrights": "Se han guardado los grupos de {{GENDER:$1|usuario|usuaria}} de $1.",
        "timezonelegend": "Huso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar la hora del servidor ($1)",
        "youremail": "Correo electrónico:",
        "username": "{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Miembro}} {{PLURAL:$1|del grupo|de los grupos}}:",
+       "group-membership-link-with-expiry": "$1 (hasta $2)",
        "prefs-registration": "Fecha y hora de registro:",
        "yourrealname": "Nombre real:",
        "yourlanguage": "Idioma:",
        "prefswarning-warning": "Has hecho cambios en tus preferencias que todavía no se han guardado. Si sales de esta página sin pulsar en «$1» no se actualizarán las preferencias.",
        "prefs-tabs-navigation-hint": "Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.",
        "userrights": "Gestión de permisos de usuario",
-       "userrights-lookup-user": "Configurar grupos de usuarios",
+       "userrights-lookup-user": "Selecciona una cuenta de usuario",
        "userrights-user-editname": "Escribe un nombre de usuario:",
-       "editusergroup": "Modificar grupos {{GENDER:$1|del usuario|de la usuaria}}",
+       "editusergroup": "Cargar grupos de usuarios",
        "editinguser": "Cambio de los permisos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar grupos {{GENDER:$1|del usuario| de la usuaria}}",
+       "viewinguserrights": "Visualización de los derechos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Modificar grupos {{GENDER:$1|del usuario|de la usuaria}}",
+       "userrights-viewusergroup": "Ver grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
-       "userrights-groups-help": "Puedes modificar los grupos a los que pertenece {{GENDER:$1|este usuario|esta usuaria}}:\n* Un recuadro marcado significa que {{GENDER:$1|el usuario|la usuaria}} está en ese grupo.\n* Un recuadro no marcado significa que {{GENDER:$1|el usuario|la usuaria}} no está en ese grupo.\n* Un * indica que no podrás eliminar el grupo una vez que lo agregues, o viceversa.",
+       "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-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-nologin": "Debes [[Special:UserLogin|iniciar sesión]] con una cuenta de administrador para poder editar los grupos de los usuarios.",
-       "userrights-notallowed": "No tienes permiso para añadir o quitar permisos de usuario.",
        "userrights-changeable-col": "Grupos que puedes cambiar",
        "userrights-unchangeable-col": "Grupos que no puedes cambiar",
+       "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-conflict": "¡Conflicto de cambio de los permisos de usuario! Por favor, revisa y confirma tus cambios.",
-       "userrights-removed-self": "Has eliminado tus propios permisos. Por tanto, ya no podrás volver a acceder a esta página.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Autoconfirmados",
        "right-upload": "Subir archivos",
        "right-reupload": "Subir una nueva versión de un archivo existente",
        "right-reupload-own": "Subir una nueva versión de un archivo creado por uno mismo",
-       "right-reupload-shared": "Sobreescribir localmente archivos del repositorio multimedia",
+       "right-reupload-shared": "Sobrescribir localmente archivos presentes en el repositorio multimedia compartido",
        "right-upload_by_url": "Subir un archivo a traves de un URL",
        "right-purge": "Purgar la caché en el servidor sin tener que dar confirmación",
        "right-autoconfirmed": "No resultar afectado por los límites de frecuencia de edición para las IP",
        "right-bot": "Ser tratado como un programa automático",
        "right-nominornewtalk": "No accionar el aviso de mensajes nuevos al realizar ediciones menores en páginas de discusión",
-       "right-apihighlimits": "Tener límites más altos para las peticiones a través de la API",
+       "right-apihighlimits": "Usar límites más altos en peticiones a través de la API",
        "right-writeapi": "Hacer uso de la API de escritura",
        "right-delete": "Borrar páginas",
        "right-bigdelete": "Borrar páginas con historiales grandes",
        "right-editusercssjs": "Editar las páginas de CSS y JavaScript de otros usuarios",
        "right-editusercss": "Editar las páginas de CSS de otros usuarios",
        "right-edituserjs": "Editar las páginas de JavaScript de otros usuarios",
-       "right-editmyusercss": "Editar tus páginas de CSS",
+       "right-editmyusercss": "Editar tus archivos CSS",
        "right-editmyuserjs": "Editar tus archivos JavaScript",
        "right-viewmywatchlist": "Ver tu lista de seguimiento",
        "right-editmywatchlist": "Editar tu lista de seguimiento. Algunas acciones seguirán agregando páginas aun sin este permiso.",
        "right-siteadmin": "Bloquear y desbloquear la base de datos",
        "right-override-export-depth": "Exportar páginas, incluyendo aquellas enlazadas hasta una profundidad de 5",
        "right-sendemail": "Enviar correo electrónico a otros usuarios",
-       "right-passwordreset": "Ver los mensajes de restablecimiento de contraseña",
        "right-managechangetags": "Crear y (des)activar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] junto con los cambios propios",
        "right-changetags": "Agregar y quitar [[Special:Tags|etiquetas]] arbitrarias a revisiones individuales y entradas del registro",
-       "right-deletechangetags": "Eliminar [[Special:Tags|tags]] de la base de datos",
+       "right-deletechangetags": "Eliminar [[Special:Tags|etiquetas]] de la base de datos",
        "grant-generic": "Paquete de permisos \"$1\"",
        "grant-group-page-interaction": "Interactuar con páginas",
        "grant-group-file-interaction": "Interactuar con multimedia",
        "action-upload_by_url": "subir este archivo desde una URL",
        "action-writeapi": "utilizar la API de escritura",
        "action-delete": "borrar esta página",
-       "action-deleterevision": "borrar esta revisión",
-       "action-deletedhistory": "ver el historial borrado de esta página",
+       "action-deleterevision": "eliminar revisiones",
+       "action-deletelogentry": "borrar entradas del registro",
+       "action-deletedhistory": "ver el historial de ediciones borradas de una página",
+       "action-deletedtext": "ver texto de revisión borrada",
        "action-browsearchive": "buscar páginas borradas",
-       "action-undelete": "recuperar esta página",
-       "action-suppressrevision": "revisar y restaurar esta revisión oculta",
+       "action-undelete": "restaurar páginas",
+       "action-suppressrevision": "revisar y restaurar revisiones ocultas",
        "action-suppressionlog": "ver este registro privado",
        "action-block": "bloquear a este usuario para que no edite",
        "action-protect": "cambiar los niveles de protección para esta página",
        "action-userrights-interwiki": "modificar los permisos de los usuarios en otros wikis",
        "action-siteadmin": "bloquear o desbloquear la base de datos",
        "action-sendemail": "enviar correos electrónicos",
+       "action-editmyoptions": "editar tus preferencias",
        "action-editmywatchlist": "editar tu lista de seguimiento",
        "action-viewmywatchlist": "ver tu lista de seguimiento",
        "action-viewmyprivateinfo": "ver tu información privada",
        "recentchanges-legend-heading": "<strong>Leyenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "recentchanges-submit": "Mostrar",
+       "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-restore-default-filters": "Restaurar filtros predeterminados",
+       "rcfilters-clear-all-filters": "Borrar todos los filtros",
+       "rcfilters-search-placeholder": "Filtrar cambios recientes (navega o empieza a escribir)",
+       "rcfilters-invalid-filter": "Filtro no válido",
+       "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "No se encontraron filtros",
+       "rcfilters-filtergroup-registration": "Registro de usuario",
+       "rcfilters-filter-registered-label": "Registrados",
+       "rcfilters-filter-registered-description": "Editores conectados.",
+       "rcfilters-filter-unregistered-label": "No registrados",
+       "rcfilters-filter-unregistered-description": "Editores no conectados.",
+       "rcfilters-filtergroup-authorship": "Editar autoría",
+       "rcfilters-filter-editsbyself-label": "Tus propias ediciones",
+       "rcfilters-filter-editsbyself-description": "Ediciones tuyas",
+       "rcfilters-filter-editsbyother-label": "Ediciones de otros",
+       "rcfilters-filter-editsbyother-description": "Ediciones creadas por otros usuarios (no por ti).",
+       "rcfilters-filtergroup-userExpLevel": "Nivel de experiencia (solo para usuarios registrados)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Recién llegados",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 ediciones y 4 días de actividad.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendices",
+       "rcfilters-filter-userExpLevel-learner-description": "Más días de actividad y ediciones que los «recién llegados», pero menos que los «usuarios experimentados».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuarios experimentados",
+       "rcfilters-filter-userExpLevel-experienced-description": "Más de 30 días de actividad y 500 ediciones.",
+       "rcfilters-filtergroup-automated": "Contribuciones automatizadas",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Ediciones realizadas por herramientas automatizadas.",
+       "rcfilters-filter-humans-label": "Ser humano (no bot)",
+       "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.",
+       "rcfilters-filtergroup-significance": "Significación",
+       "rcfilters-filter-minor-label": "Ediciones menores",
+       "rcfilters-filter-minor-description": "Ediciones etiquetadas por el autor como menores.",
+       "rcfilters-filter-major-label": "Ediciones no menores",
+       "rcfilters-filter-major-description": "Ediciones no etiquetadas como menores.",
+       "rcfilters-filtergroup-changetype": "Tipo de cambio",
+       "rcfilters-filter-pageedits-label": "Ediciones de páginas",
+       "rcfilters-filter-pageedits-description": "Modificaciones del contenido wiki, discusiones, descripción de categorías...",
+       "rcfilters-filter-newpages-label": "Creaciones de páginas",
+       "rcfilters-filter-newpages-description": "Ediciones en las que se crean páginas nuevas.",
+       "rcfilters-filter-categorization-label": "Cambios de categorías",
+       "rcfilters-filter-categorization-description": "Registros de páginas añadidas o borradas de categorías.",
+       "rcfilters-filter-logactions-label": "Acciones registradas",
+       "rcfilters-filter-logactions-description": "Acciones administrativas, creación de cuentas, borrados de páginas, subidas de archivos...",
        "rcnotefrom": "Debajo aparece{{PLURAL:$5| el cambio|n los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
        "rclistfrom": "Mostrar cambios nuevos desde las $2 del $3",
        "rcshowhideminor": "$1 ediciones menores",
        "uploaded-setting-handler-svg": "Están bloqueados los archivos SVG que configuran el atributo \"handler\" con remote/data/script. Se encontró <code>$1=\"$2\"</code> en el archivo SVG cargado.",
        "uploaded-remote-url-svg": "Se bloquean los SVG que contienen URL de estilo externas. El archivo SVG cargado contiene <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "Se encontró un filtro de imagen con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> en el archivo SVG cargado.",
-       "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombres no permitido: \"$1\".",
+       "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombres no permitido: «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "No se pudo analizar el XML del archivo cargado.",
        "uploadvirus": "¡El archivo contiene un virus!\nDetalles: $1",
        "uploadjava": "El archivo es un ZIP que contiene un archivo .class de Java.\nNo se permite subir archivos Java, porque pueden causar que se puedan saltar restricciones de seguridad.",
        "uploadstash-errclear": "Falló el borrado de los archivos.",
        "uploadstash-refresh": "Actualizar la lista de archivos",
        "uploadstash-thumbnail": "ver miniatura",
+       "uploadstash-exception": "No se pudo almacenar la carga en el área provisional ($1): «$2».",
        "invalid-chunk-offset": "Desplazamiento inválido del fragmento",
        "img-auth-accessdenied": "Acceso denegado",
        "img-auth-nopathinfo": "Falta PATH_INFO.\nEl servidor no está configurado para proporcionar esta información.\nEs posible que esté basado en CGI y que no sea compatible con img_auth.\nConsulte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "filedelete-intro-old": "Estás borrando la versión de <strong>[[Media:$1|$1]]</strong> del [$4 $2 a las $3].",
        "filedelete-comment": "Motivo:",
        "filedelete-submit": "Eliminar",
-       "filedelete-success": "<strong>$1</strong> ha sido borrado.",
-       "filedelete-success-old": "La versión de <strong>[[Media:$1|$1]]</strong> del $2 a las $3 ha sido borrada.",
+       "filedelete-success": "<strong>$1</strong> se ha borrado.",
+       "filedelete-success-old": "La versión de <strong>[[Media:$1|$1]]</strong> del $2 a las $3 se ha borrado.",
        "filedelete-nofile": "<strong>$1</strong> no existe.",
        "filedelete-nofile-old": "No existe una versión guardada de <strong>$1</strong> con los atributos especificados.",
        "filedelete-otherreason": "Otra razón:",
        "statistics-users-active-desc": "Usuarios que han ejecutado una acción en {{PLURAL:$1|el último día|los últimos $1 días}}",
        "pageswithprop": "Páginas con una propiedad de página",
        "pageswithprop-legend": "Páginas con una propiedad de página",
-       "pageswithprop-text": "Esta página muestra las páginas que usan la propiedad de una página en particular",
+       "pageswithprop-text": "Esta página muestra las páginas que usan una determinada propiedad de página.",
        "pageswithprop-prop": "Nombre de la propiedad:",
        "pageswithprop-submit": "Ir",
        "pageswithprop-prophidden-long": "hay un largo valor en la propiedad texto oculta ($1)",
        "uncategorizedcategories": "Categorías sin categorizar",
        "uncategorizedimages": "Archivos sin categorizar",
        "uncategorizedtemplates": "Plantillas sin categorizar",
+       "uncategorized-categories-exceptionlist": "# Contiene una lista de categorías que no deberían figurar en Special:UncategorizedCategories. Una categoría por línea, empezando por «*». Las líneas que empiecen por otro carácter (espacios en blanco incluidos) se ignorarán. Usa «#» para añadir comentarios.",
        "unusedcategories": "Categorías sin uso",
        "unusedimages": "Archivos sin uso",
        "wantedcategories": "Categorías requeridas",
        "apisandbox-sending-request": "Enviando pedido a la API...",
        "apisandbox-loading-results": "Recibiendo resultados de la API...",
        "apisandbox-results-error": "Ocurrió un error durante la carga de la respuesta a la consulta API: $1",
+       "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-time": "Tiempo de solicitud: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrige el token y vuelve a enviar",
        "apisandbox-alert-field": "El valor de este campo no es válido.",
        "apisandbox-continue": "Continuar",
        "apisandbox-continue-clear": "Vaciar",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] la última petición; {{int:apisandbox-continue-clear}} borrará los parámetros relativos a la continuación.",
        "apisandbox-param-limit": "Escribe <kbd>max</kbd> para usar el límite máximo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Todos los espacios de nombres)",
+       "apisandbox-multivalue-all-values": "$1 (Todos los valores)",
        "booksources": "Fuentes de libros",
        "booksources-search-legend": "Buscar fuentes de libros",
        "booksources-search": "Buscar",
        "allpagesbadtitle": "El título dado era inválido o tenía un prefijo de enlace inter-idioma o inter-wiki. Puede contener uno o más caracteres que no se pueden usar en títulos.",
        "allpages-bad-ns": "{{SITENAME}} no tiene un espacio de nombres llamado «$1».",
        "allpages-hide-redirects": "Ocultar redirecciones",
-       "cachedspecial-viewing-cached-ttl": "Usted está viendo una versión en caché de esta página, que puede tener hasta  $1 días de antigüedad.",
+       "cachedspecial-viewing-cached-ttl": "Estás viendo una versión de esta página que está almacenada en caché y que puede tener hasta $1 de antigüedad.",
        "cachedspecial-viewing-cached-ts": "Está viendo una versión en caché de esta página, que puede no estar completamente actualizada.",
-       "cachedspecial-refresh-now": "Ver lo más reciente.",
+       "cachedspecial-refresh-now": "Ver la más reciente.",
        "categories": "Categorías",
        "categories-submit": "Mostrar",
-       "categoriespagetext": "Las siguientes {{PLURAL:$1|categoría contiene|categorías contienen}} páginas o medios.\nNo se muestran aquí las [[Special:UnusedCategories|categorías sin uso]].\nVéase también las [[Special:WantedCategories|categorías requeridas]].",
+       "categoriespagetext": "Las siguientes {{PLURAL:$1|categoría contiene|categorías contienen}} páginas o medios.\nNo se muestran aquí las [[Special:UnusedCategories|categorías sin uso]].\nVéanse también las [[Special:WantedCategories|categorías requeridas]].",
        "categoriesfrom": "Mostrar categorías que empiecen por:",
        "deletedcontributions": "Contribuciones borradas de usuario",
        "deletedcontributions-title": "Contribuciones borradas de usuario",
        "activeusers-count": "$1 {{PLURAL:$1|acción|acciones}} en {{PLURAL:$3|el último día|los últimos $3 días}}",
        "activeusers-from": "Mostrar los usuarios que empiezan por:",
        "activeusers-groups": "Mostrar los usuarios que pertenecen a los grupos:",
+       "activeusers-excludegroups": "Excluir a los usuarios que pertenezcan a los grupos:",
        "activeusers-noresult": "No se encontraron usuarios.",
        "activeusers-submit": "Mostrar usuarios activos",
        "listgrouprights": "Permisos de los grupos de usuarios",
        "emailccsubject": "Copia de tu mensaje a $1: $2",
        "emailsent": "Correo electrónico enviado",
        "emailsenttext": "Se ha enviado tu mensaje de correo electrónico.",
-       "emailuserfooter": "Este correo electrónico fue {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través de la función «{{int:emailuser}}» en {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico fue {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través de la función «{{int:emailuser}}» en {{SITENAME}}. Si {{GENDER:$2|respondes}}, tu correo electrónico se enviará directamente {{GENDER:$1|al emisor|a la emisora}} original, y {{GENDER:$1|le}} revelará {{GENDER:$2|tu}} dirección de correo electrónico.",
        "usermessage-summary": "Dejando un mensaje de sistema.",
        "usermessage-editor": "Mensajero del sistema",
        "watchlist": "Lista de seguimiento",
        "historywarning": "<strong>Atención:</strong> la página que estás a punto de borrar tiene un historial con $1 {{PLURAL:$1|revisión|revisiones}}:",
        "historyaction-submit": "Mostrar",
        "confirmdeletetext": "Estás a punto de borrar una página, así como todo su historial.\nConfirma que realmente quieres hacer esto, que entiendes las consecuencias y que lo estás haciendo de acuerdo con [[{{MediaWiki:Policy-url}}|las políticas]].",
-       "actioncomplete": "Acción completada",
-       "actionfailed": "Falló la acción",
+       "actioncomplete": "Se ha realizado la acción",
+       "actionfailed": "Ha fallado la acción",
        "deletedtext": "«$1» ha sido borrado.\nVéase $2 para un registro de los borrados recientes.",
        "dellogpage": "Registro de borrados",
        "dellogpagetext": "A continuación se muestra una lista de los borrados más recientes.",
        "changecontentmodel-emptymodels-title": "No hay modelos de contenido disponibles",
        "changecontentmodel-emptymodels-text": "El contenido de [[:$1]] no se puede convertir a ningún tipo.",
        "log-name-contentmodel": "Registro de cambios del modelo de contenido",
-       "log-description-contentmodel": "Eventos relacionados con los modelos de contenido de una página",
+       "log-description-contentmodel": "Esta página muestra cambios en el modelo de contenido de las páginas, así como las páginas creadas con un modelo de contenido distinto del estándar.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la página $3 usando un modelo de contenido no predeterminado \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}} el modelo de contenido de la página $3 de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "revertir",
        "unblock": "Desbloquear usuario",
        "blockip": "Bloquear {{GENDER:$1|al usuario|a la usuaria}}",
        "blockip-legend": "Bloquear usuario",
-       "blockiptext": "Usa el siguiente formulario para bloquear el acceso de escritura desde una dirección IP específica o nombre de usuario.\nEsto debería hacerse sólo para prevenir vandalismos, y de acuerdo a las [[{{MediaWiki:Policy-url}}|políticas]].\nExplica la razón específica del bloqueo (por ejemplo, citando las páginas en particular que han sido objeto de vandalismo).\nPuedes bloquear intervalos IP con la sintaxis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; el intervalo más grande permitido es /$1 para IPv4 y /$2 para IPv6.",
+       "blockiptext": "Utiliza el siguiente formulario para bloquear el acceso de escritura a un determinado usuario o dirección IP.\nEsto debería hacerse solo para prevenir vandalismo y de acuerdo a las [[{{MediaWiki:Policy-url}}|políticas]].\nExplica la razón específica del bloqueo (por ejemplo, citando las páginas en particular que han sido objeto de vandalismo).\nPuedes bloquear intervalos IP con la sintaxis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; el intervalo más grande permitido es /$1 para IPv4 y /$2 para IPv6.",
        "ipaddressorusername": "Dirección IP o nombre de usuario:",
        "ipbexpiry": "Caducidad:",
        "ipbreason": "Motivo:",
        "proxyblockreason": "Tu dirección IP ha sido bloqueada porque es un proxy abierto.\nContacta con tu proveedor de servicios de Internet o con tu servicio de asistencia técnica e infórmales de este grave problema de seguridad.",
        "sorbsreason": "Su dirección IP está listada como proxy abierto en DNSBL.",
        "sorbs_create_account_reason": "Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta",
+       "softblockrangesreason": "Las contribuciones anónimas desde tu dirección IP ($1) no están permitidas. Por favor, inicia sesión.",
        "xffblockreason": "Una dirección IP presente en la cabecera X-Forwarded-For, tuya o del servidor proxy que estás usando, ha sido bloqueada. El motivo original del bloqueo fue: $1",
        "cant-see-hidden-user": "El usuario que estas intentando bloquear ya ha sido bloqueado y ocultado.\nDado que no tienes permisos suficientes no puedes ver ni editar el bloqueo de este usuario.",
        "ipbblocked": "No puedes bloquear o desbloquear a otros usuarios porque estás bloqueado",
        "cant-move-to-user-page": "No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).",
        "cant-move-category-page": "No tienes permiso para trasladar páginas de categoría.",
        "cant-move-to-category-page": "No tienes permiso para trasladar una página a una página de categoría.",
+       "cant-move-subpages": "No tienes permiso para trasladar subpáginas.",
+       "namespace-nosubpages": "El espacio de nombres «$1» no permite subpáginas.",
        "newtitle": "Título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Renombrar página",
        "tooltip-minoredit": "Marcar este cambio como menor",
        "tooltip-save": "Guardar los cambios",
        "tooltip-publish": "Publicar tus cambios",
-       "tooltip-preview": "Previsualiza tus cambios. ¡Hazlo antes de grabar!",
+       "tooltip-preview": "Previsualiza tus cambios. Hazlo antes de guardarlos.",
        "tooltip-diff": "Mostrar los cambios que has hecho en el texto.",
        "tooltip-compareselectedversions": "Ver las diferencias entre las dos versiones seleccionadas de esta página.",
        "tooltip-watch": "Añadir esta página a tu lista de seguimiento",
        "pageinfo-length": "Longitud de la página (en bytes)",
        "pageinfo-article-id": "Identificador de la página",
        "pageinfo-language": "Idioma de la página",
+       "pageinfo-language-change": "cambiar",
        "pageinfo-content-model": "Modelo de contenido de la página",
        "pageinfo-content-model-change": "cambiar",
        "pageinfo-robot-policy": "Indización por robots",
        "pageinfo-redirects-name": "Número de redirecciones a esta página",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Subpáginas de esta página",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirección|redirecciones}}; $3 {{PLURAL:$3|no-redirección|no-redirecciones}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirección|redirecciones}}; $3 {{PLURAL:$3|no redirección|no redirecciones}})",
        "pageinfo-firstuser": "Creador de la página",
        "pageinfo-firsttime": "Fecha de creación de la página",
        "pageinfo-lastuser": "Último editor",
        "log-show-hide-patrol": "$1 registro de verificación",
        "log-show-hide-tag": "$1 registro de etiquetas",
        "confirm-markpatrolled-button": "Aceptar",
-       "confirm-markpatrolled-top": "marcar la revisión $3 de $2 como revisada?",
+       "confirm-markpatrolled-top": "¿Marcar la revisión $3 de $2 como verificada?",
        "deletedrevision": "Borrada revisión antigua $1",
        "filedeleteerror-short": "Error al borrar el archivo: $1",
        "filedeleteerror-long": "Se han producido errores mientras se borraba el archivo:\n\n$1",
        "newimages-showbots": "Mostrar cargas de bots",
        "newimages-hidepatrolled": "Ocultar las subidas verificadas",
        "noimages": "No hay nada que ver.",
+       "gallery-slideshow-toggle": "Alternar las miniaturas",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "sp-newimages-showfrom": "Mostrar archivos nuevos empezando desde $2, $1",
        "exif-compression-6": "JPEG (antiguo)",
        "exif-copyrighted-true": "Con derechos de autor",
        "exif-copyrighted-false": "No se ha definido el estado del copyright",
+       "exif-photometricinterpretation-0": "Blanco y negro (blanco es 0)",
        "exif-photometricinterpretation-1": "Blanco y negro (el negro es 0)",
        "exif-photometricinterpretation-4": "Máscara de transparencia",
        "exif-photometricinterpretation-5": "Separados (Probablemente CMYK)",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 página ha sido borrada|$1 páginas han sido borradas}} de tu lista de seguimiento:",
        "watchlistedit-raw-title": "Editar lista de seguimiento en crudo",
        "watchlistedit-raw-legend": "Editar tu lista de seguimiento en modo texto",
-       "watchlistedit-raw-explain": "A continuación se listan las páginas en tu lista de seguimiento. Esta lista puede editarse añadiendo o eliminando líneas de la lista;\nun título por línea.\nCuando acabes, pulsa «{{int:Watchlistedit-raw-submit}}».\nTambién puedes [[Special:EditWatchlist|usar el editor estándar]].",
+       "watchlistedit-raw-explain": "A continuación se muestran los títulos de las páginas en tu lista de seguimiento. Puedes editar la lista añadiendo o eliminando títulos de la lista (un título por línea).\nCuando acabes, pulsa «{{int:Watchlistedit-raw-submit}}».\nTambién puedes [[Special:EditWatchlist|usar el editor estándar]].",
        "watchlistedit-raw-titles": "Páginas:",
        "watchlistedit-raw-submit": "Actualizar lista de seguimiento",
        "watchlistedit-raw-done": "Tu lista de seguimiento se ha actualizado.",
        "version-libraries-license": "Licencia",
        "version-libraries-description": "Descripción",
        "version-libraries-authors": "Autores",
-       "redirect": "Redirigir por archivo, o identificador de usuario, página, revisión o registro",
+       "redirect": "Redirigir por archivo o por identificador de usuario, página, revisión o registro.",
        "redirect-summary": "Esta página especial redirige a un archivo (dado un nombre), a una página (dado un identificador de revisión o de página), a una página de usuario (dado un identificador numérico de usuario) o a una entrada del registro (dado un identificador de registro). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Ir",
        "redirect-lookup": "Buscar:",
        "redirect-value": "Valor:",
-       "redirect-user": "Id. del usuario",
+       "redirect-user": "Identificador del usuario",
        "redirect-page": "Identificador de la página",
        "redirect-revision": "Revisión de página",
-       "redirect-file": "Nombre de archivo",
+       "redirect-file": "Nombre del archivo",
        "redirect-logid": "Identificador de registro",
        "redirect-not-exists": "No se encontró el valor",
        "fileduplicatesearch": "Búsqueda de archivos duplicados",
        "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|cambio|cambios}}",
        "tags-manage-no-permission": "No tienes permiso para gestionar las etiquetas de cambios.",
-       "tags-manage-blocked": "No puedes dirigir etiquetas de cambio mientras {{GÉNERO:$1|tú}} estás bloqueado.",
+       "tags-manage-blocked": "No puedes gestionar etiquetas de cambio mientras estés {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-create-heading": "Crear una etiqueta",
        "tags-create-explanation": "De manera predeterminada, las etiquetas nuevas estarán disponibles para su uso por usuarios y bots.",
        "tags-create-tag-name": "Nombre de la etiqueta:",
        "tags-deactivate-not-allowed": "No es posible desactivar la etiqueta «$1».",
        "tags-deactivate-submit": "Desactivar",
        "tags-apply-no-permission": "No tienes permiso para aplicar etiquetas de cambios, junto con tus cambios.",
-       "tags-apply-blocked": "No puedes pedir cambio de etiquetas con tus cambios mientras estés {{GENDER:$1|bloqueado|bloqueada}}.",
+       "tags-apply-blocked": "No puedes aplicar etiquetas de cambio junto a tus cambios mientras estés {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-apply-not-allowed-one": "No se permite aplicar manualmente la etiqueta «$1».",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta no se puede|Las siguientes etiquetas no se pueden}} aplicar manualmente: $1",
        "tags-update-no-permission": "No tienes permiso para agregar o quitar etiquetas de cambio de las revisiones individuales o las entradas del registro.",
        "htmlform-user-not-exists": "<strong>$1</strong> no existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|borró}} la redirección $3 con un traslado",
        "logentry-delete-restore": "$1 restauró la página «$3»",
        "logentry-delete-event": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4",
        "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)",
        "feedback-adding": "Añadiendo comentarios a la página...",
        "feedback-back": "Volver",
        "feedback-bugcheck": "¡Perfecto! Únicamente comprueba que no sea un [$1 fallo conocido].",
        "feedback-useragent": "Agente de usuario:",
        "searchsuggest-search": "Buscar en {{SITENAME}}",
        "searchsuggest-containing": "que contiene...",
-       "api-error-autoblocked": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por un usuario bloqueado.",
-       "api-error-badaccess-groups": "No puedes cargar archivos en este wiki.",
        "api-error-badtoken": "Error interno: Símbolo incorrecto.",
-       "api-error-blocked": "Has sido bloqueado de editar.",
-       "api-error-copyuploaddisabled": "La subida por URL está desactivada en este servidor.",
-       "api-error-duplicate": "Ya {{PLURAL:$1|existe otro archivo|existen otros archivos}} en el sitio con el mismo contenido.",
-       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existía otro archivo|existían otros archivos}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue eliminado|fueron eliminados}}.",
-       "api-error-empty-file": "El archivo que enviaste estaba vacío.",
        "api-error-emptypage": "No se pueden crear páginas nuevas que estén vacías.",
-       "api-error-fetchfileerror": "Error interno: Algo salió mal mientras se obtenía el archivo.",
-       "api-error-fileexists-forbidden": "Ya existe el archivo \"$1\" y no se puede sobreescribir.",
-       "api-error-fileexists-shared-forbidden": "Ya existe \"$1\" en el repositorio de archivos compartidos y no se puede sobreescribir.",
-       "api-error-file-too-large": "El archivo que enviaste era demasiado grande.",
-       "api-error-filename-tooshort": "El nombre de archivo es demasiado corto.",
-       "api-error-filetype-banned": "Este tipo de archivo está prohibido.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|no es un tipo de archivo permitido|no son tipos de archivos permitidos}}. {{PLURAL:$3|El tipo de archivo permitido es|Los tipos de archivos permitidos son}} $2.",
-       "api-error-filetype-missing": "El archivo no tiene extensión de archivo.",
-       "api-error-hookaborted": "La modificación que intentaste hacer fue cancelada por una extensión.",
-       "api-error-http": "Error interno: No se puede conectar al servidor.",
-       "api-error-illegal-filename": "El nombre de archivo no está permitido.",
-       "api-error-internal-error": "Error interno: Algo salió mal al procesar tu subida en el wiki.",
-       "api-error-invalid-file-key": "Error interno: No se encontró el archivo en el almacenamiento temporal.",
-       "api-error-missingparam": "Error interno: Faltan parámetros en la solicitud.",
-       "api-error-missingresult": "Error interno: No se pudo determinar si la copia tuvo éxito.",
-       "api-error-mustbeloggedin": "Debes iniciar sesión para subir archivos.",
-       "api-error-mustbeposted": "Error interno: La solicitud requiere HTTP POST.",
-       "api-error-noimageinfo": "La carga se realizó correctamente, pero el servidor no nos dio ninguna información sobre el archivo.",
-       "api-error-nomodule": "Error interno: No hay un módulo de carga configurado.",
-       "api-error-ok-but-empty": "Error interno: No hay respuesta del servidor.",
-       "api-error-overwrite": "No se permite sobrescribir un archivo existente.",
-       "api-error-ratelimited": "Estás tratando de subir, en un corto periodo de tiempo, más archivos de los que este wiki permite.\nPor favor, inténtalo de nuevo dentro de algunos minutos.",
-       "api-error-stashfailed": "Error interno: El servidor no pudo almacenar el archivo temporal.",
        "api-error-publishfailed": "Error interno: el servidor no pudo publicar el archivo temporal.",
-       "api-error-stasherror": "Ha ocurrido un error al subir el archivo al depósito.",
-       "api-error-stashedfilenotfound": "No se encontró el archivo del espacio temporal al intentar cargarlo.",
-       "api-error-stashpathinvalid": "La ruta donde debería encontrarse el archivo del espacio temporal no es válida.",
-       "api-error-stashfilestorage": "Ocurrió un error al almacenar el archivo en el espacio temporal.",
-       "api-error-stashzerolength": "El servidor no pudo almacenar el archivo en el espacio temporal porque este no contiene datos.",
-       "api-error-stashnotloggedin": "Debes acceder para guardar archivos en el espacio temporal de carga.",
-       "api-error-stashwrongowner": "El archivo del espacio temporal al que quieres acceder no te pertenece.",
-       "api-error-stashnosuchfilekey": "La clave de archivo del espacio temporal al que quieres acceder no existe.",
-       "api-error-timeout": "El servidor no respondió en el plazo previsto.",
-       "api-error-unclassified": "Ocurrió un error desconocido.",
-       "api-error-unknown-code": "Error desconocido: «$1»",
-       "api-error-unknown-error": "Error interno: Algo salió mal al intentar cargar el archivo.",
-       "api-error-unknown-warning": "Advertencia desconocida: $1",
+       "api-error-stashfailed": "Error interno: El servidor no pudo almacenar el archivo temporal.",
+       "api-error-unknown-warning": "Advertencia desconocida: «$1».",
        "api-error-unknownerror": "Error desconocido: «$1».",
-       "api-error-uploaddisabled": "Las subidas están desactivadas en este wiki.",
-       "api-error-verification-error": "Este archivo puede estar dañado, o tiene una extensión incorrecta.",
-       "api-error-was-deleted": "Un archivo de este nombre se ha subido previamente y eliminado posteriormente.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Utilizar el idioma predeterminado",
        "pagelang-select-lang": "Seleccionar idioma",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Enviar",
+       "pagelang-nonexistent-page": "La página $1 no existe.",
+       "pagelang-unchanged-language": "La página $1 ya está configurada en $2.",
+       "pagelang-unchanged-language-default": "La página $1 ya está configurada en el idioma predeterminado del wiki.",
+       "pagelang-db-failed": "La base de datos no ha podido cambiar el idioma de la página.",
        "right-pagelang": "Cambiar el idioma de la página",
        "action-pagelang": "cambiar el idioma de la página",
        "log-name-pagelang": "Registro de cambios de idiomas",
        "default-skin-not-found-no-skins": "¡Vaya! La apariencia predeterminada de tu wiki, definida en <code>$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nNo tienes apariencias instaladas.\n\n; Si has instalado o actualizado MediaWiki recientemente:\n: Probablemente has instalado desde git, o directamente desde el código fuente usando algún otro método. Esto puede ocurrir en este caso. A partir de MediaWiki 1.24 ya no se incluye ninguna apariencia en el repositorio principal. Trata de instalar algunas apariencias desde el [https://www.mediawiki.org/wiki/Category:All_skins directorio de apariencias de mediawiki.org], ya sea:\n:* Descargando el [https://www.mediawiki.org/wiki/Download instalador tarball], que viene con varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Descargando tarballs individuales de cada apariencia de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usando Git para descargar apariencias].\n: Hacer esto no debería interferir con tu repositorio de MediaWiki si eres un desarrollador de MediaWiki. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para información sobre cómo habilitar las apariencias y seleccionar la predeterminada.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activada)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>desactivada</strong>)",
-       "mediastatistics": "Estadísticas de multimedia",
-       "mediastatistics-summary": "Estadísticas sobre los tipos de archivos cargados. Sólo se incluyen las versiones más recientes. Los archivos antiguos o eliminados están excluidos.",
+       "mediastatistics": "Estadísticas multimedia",
+       "mediastatistics-summary": "Estadísticas sobre los tipos de archivos cargados. Solo se tiene en cuenta la versión más reciente de cada archivo. Los archivos antiguos o eliminados están excluidos.",
        "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 ''byte''|$1 ''bytes''}} ($2; $3 %)",
        "mediastatistics-bytespertype": "Tamaño de archivo total para esta sección: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
        "mw-widgets-dateinput-no-date": "Ninguna fecha seleccionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Buscar multimedia",
+       "mw-widgets-mediasearch-noresults": "No se han encontrado resultados.",
        "mw-widgets-titleinput-description-new-page": "la página aún no existe",
        "mw-widgets-titleinput-description-redirect": "redirigir a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Agregar una categoría...",
+       "mw-widgets-usersmultiselect-placeholder": "Agregar más...",
        "sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basadas en cookies",
        "sessionprovider-nocookies": "Puede que las cookies estén desactivadas. Actívalas y comienza de nuevo.",
        "randomrootpage": "Página raíz aleatoria",
        "log-action-filter-block": "Tipo de bloqueo:",
-       "log-action-filter-contentmodel": "Tipo de contentmodel modificación:",
+       "log-action-filter-contentmodel": "Tipo de modificación del modelo de contenido:",
        "log-action-filter-delete": "Tipo de eliminación:",
        "log-action-filter-import": "Tipo de importación:",
        "log-action-filter-managetags": "Tipo de administración de la etiqueta de acción:",
        "log-action-filter-block-reblock": "Modificación de bloqueo",
        "log-action-filter-block-unblock": "Desbloquear",
        "log-action-filter-contentmodel-change": "Cambio de modelo de contenido",
-       "log-action-filter-contentmodel-new": "Creación de página con modelo de contenidos no estándar",
+       "log-action-filter-contentmodel-new": "Creación de página con modelo de contenido no estándar",
        "log-action-filter-delete-delete": "Eliminación de páginas",
+       "log-action-filter-delete-delete_redir": "Sobrescritura de la redirección",
        "log-action-filter-delete-restore": "Restauración de páginas",
        "log-action-filter-delete-event": "Eliminación de registros",
        "log-action-filter-delete-revision": "Eliminación de revisión",
        "usercssispublic": "Recuerda: las subpáginas CSS no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
        "restrictionsfield-badip": "Dirección o intervalo IP no válidos: $1",
        "restrictionsfield-label": "Intervalos de IP permitidos:",
-       "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activar todo, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errores:\n\n$1"
+       "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revisión $1",
+       "pageid": "ID de página $1"
 }
index 3fbe842..eb89f59 100644 (file)
        "tagline": "Allikas: {{SITENAME}}",
        "help": "Juhend",
        "search": "Otsing",
+       "search-ignored-headings": " #<!-- Jäta see rida muutmata kujule. --> <pre>\n# Pealkirjad, mida otsingus eiratakse.\n# Muudatused jõustuvad kohe, kui vastava pealkirjaga lehekülg on indekseeritud.\n# Saad teha tühimuudatuse, selleks et sundida lehekülg uuesti indekseerimisele.\n# Süntaks on järgmine:\n#   * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar.\n#   * Iga rida, mis ei ole tühi, on eiratava pealkirja täpne tõstutundlik kuju.\nViited\nVälislingid\nVaata ka\n #</pre> <!-- Jäta see rida muutmata kujule. -->",
        "searchbutton": "Otsi",
        "go": "Mine",
        "searcharticle": "Mine",
        "history": "Ajalugu",
        "history_short": "Ajalugu",
+       "history_small": "ajalugu",
        "updatedmarker": "uuendatud pärast viimast külastust",
        "printableversion": "Prinditav versioon",
        "permalink": "Püsilink",
        "views": "vaatamisi",
        "toolbox": "Tööriistad",
        "tool-link-userrights": "Muuda {{GENDER:$1|kasutajarühmi}}",
+       "tool-link-userrights-readonly": "Vaata {{GENDER:$1|kasutajarühmi}}",
        "tool-link-emailuser": "Saada {{GENDER:$1|kasutajale}} e-kiri",
        "userpage": "Vaata kasutajalehekülge",
        "projectpage": "Vaata projektilehekülge",
        "mainpage-nstab": "Esileht",
        "nosuchaction": "Sellist toimingut pole.",
        "nosuchactiontext": "Viki ei tunne internetiaadressile vastavat tegevust.\nVõimalik, et sa sisestasid aadressi valesti või kasutasid vigast linki.\nSamuti ei ole välistatud, et tarkvaras, mida {{SITENAME}} kasutatab, on viga.",
-       "nosuchspecialpage": "Sellist erilehekülge pole.",
+       "nosuchspecialpage": "Sellist erilehekülge pole",
        "nospecialpagetext": "<strong>Viki ei tunne erilehekülge, mille poole pöördusid.</strong>\n\nKäibel olevad erileheküljed on loetletud leheküljel [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Viga",
        "databaseerror": "Andmebaasi viga",
        "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.",
+       "cannotlogoutnow-title": "Praegu ei saa välja logida",
+       "cannotlogoutnow-text": "Väljalogimine pole võimalik, kui kasutad $1.",
        "welcomeuser": "Tere tulemast, $1!",
        "welcomecreation-msg": "Sinu konto on loodud.\nÄra unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].",
        "yourname": "Kasutajanimi:",
        "createacct-yourpasswordagain-ph": "Sisesta uuesti parool",
        "userlogin-remembermypassword": "Jää sisseloginuks",
        "userlogin-signwithsecure": "Kasuta turvalist ühendust",
+       "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.",
+       "cannotcreateaccount-title": "Ei saa kontosid luua",
+       "cannotcreateaccount-text": "Kontode käsitsi loomine pole selles vikis lubatud.",
        "yourdomainname": "Sinu domeen:",
        "password-change-forbidden": "Selles vikis ei saa paroole muuta.",
        "externaldberror": "Esines autentimistõrge või sul pole õigust konto andmeid muuta.",
        "createacct-email-ph": "Sisesta e-posti aadress",
        "createacct-another-email-ph": "Sisesta e-posti aadress",
        "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",
        "createacct-submit": "Loo konto",
        "createacct-another-submit": "Loo konto",
+       "createacct-continue-submit": "Jätka konto loomist",
+       "createacct-another-continue-submit": "Jätka konto loomist",
        "createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
        "createacct-benefit-body1": "{{PLURAL:$1|muudatus|muudatust}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lehekülg|lehekülge}}",
        "nocookiesnew": "Kasutajakonto loodi, aga sa ei ole sisse logitud, sest {{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja logi siis oma vastse kasutajanime ning parooliga sisse.",
        "nocookieslogin": "{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.",
        "nocookiesfornew": "Kasutajakonto jäi loomata, kuna me ei saanud selle allikat kindlaks teha.\nVeendu, et sul on küpsised lubatud, taaslaadi see lehekülg ja proovi uuesti.",
+       "createacct-loginerror": "Konto on edukalt loodud, aga automaatselt ei õnnestunud sisse logida. Et jätkata, [[Special:UserLogin|logi palun sisse käsitsi]].",
        "noname": "Sa ei sisestanud kasutajanime lubataval kujul.",
        "loginsuccesstitle": "Sisse logitud",
        "loginsuccess": "Oled sisse loginud. Sinu kasutajanimi on \"$1\".",
        "createacct-another-realname-tip": "Tegelik nimi on valikuline.\nKui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamiseks.",
        "pt-login": "Logi sisse",
        "pt-login-button": "Logi sisse",
+       "pt-login-continue-button": "Jätka sisselogimist",
        "pt-createaccount": "Loo konto",
        "pt-userlogout": "Logi välja",
        "php-mail-error-unknown": "Tundmatu tõrge PHP funktsioonis mail().",
        "botpasswords-label-appid": "Roboti nimi:",
        "botpasswords-label-create": "Loo",
        "resetpass_forbidden": "Paroole ei saa muuta",
+       "resetpass_forbidden-reason": "Paroole ei saa muuta: $1",
        "resetpass-no-info": "Pead olema sisselogitud, et sellele lehele pääseda.",
        "resetpass-submit-loggedin": "Muuda parool",
        "resetpass-submit-cancel": "Loobu",
        "passwordreset-emaildisabled": "E-posti funktsioonid on selles vikis keelatud.",
        "passwordreset-username": "Kasutajanimi:",
        "passwordreset-domain": "Domeen:",
-       "passwordreset-capture": "Näita lähetatavat e-kirja?",
-       "passwordreset-capture-help": "Kui valid selle märkeruudu, näidatakse sulle ajutist parooli sisaldavat e-kirja, mis ühtlasi kasutajale saadetakse.",
        "passwordreset-email": "E-posti aadress:",
        "passwordreset-emailtitle": "{{GRAMMAR:genitive|{{SITENAME}}}} konto andmed",
-       "passwordreset-emailtext-ip": "Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
+       "passwordreset-emailtext-ip": "Keegi IP-aadressilt $1, arvatavasti sina ise, palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailtext-user": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailelement": "Kasutajanimi: \n$1\n\nAjutine parool: \n$2",
        "passwordreset-emailsentemail": "Kui oled sidunud konto selle e-posti aadressiga, siis saadetakse sulle parooli lähtestamise e-kiri.",
        "passwordreset-emailsentusername": "Parooli lähtestamise e-kiri saadetakse, kui olemas on kontoga seotud e-posti aadress.",
+       "passwordreset-ignored": "Parooli lähtestamine jäi rahuldamata. Võimalik, et ühtegi pakkujat polnud häälestatud.",
+       "passwordreset-invalidemail": "Vigane e-posti aadress",
+       "passwordreset-nodata": "Ära toomata jäid nii kasutajanimi kui ka e-posti aadress",
        "changeemail": "E-posti aadressi muutmine või eemaldamine",
        "changeemail-header": "Täida see vorm, et muuta oma e-posti aadress. Kui soovid, et konto poleks enam seotud ühegi e-posti aadressiga, siis jäta vormi esitamisel e-posti aadressi väli tühjaks.",
        "changeemail-no-info": "Otselingi kaudu sellele lehele jõudmiseks pead olema sisse loginud.",
        "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.",
        "summary-preview": "Resümee eelvaade:",
-       "subject-preview": "Alaosa pealkirja eelvaade:",
+       "subject-preview": "Resümee eelvaade:",
        "previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
        "blockedtitle": "Kasutaja on blokeeritud",
        "blockedtext": "'''Sinu kasutajanimi või IP-aadress on blokeeritud.'''\n\nBlokeeris $1.\nTema põhjendus on järgmine: ''$2''.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi.\n\nSinu praegune IP-aadress on $3 ning blokeeringu number on #$5. Lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:''$2''\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa teisele kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi ega ole selle kasutamisest blokeeritud.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
+       "systemblockedtext": "MediaWiki tarkvara on sinu kasutajanime või IP-aadressi automaatselt blokeerinud.\nToodud on järgmine põhjus:\n\n:<em>$2</em>\n\n* Blokeerimisaeg: $8\n* Blokeeringu aegumistähtaeg: $6\n* Sooviti blokeerida: $7\n\nSinu praegune IP-aadress on $3.\nLisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "blockednoreason": "põhjendust ei ole kirja pandud",
        "whitelistedittext": "Lehekülgede toimetamiseks pead $1.",
        "confirmedittext": "Lehekülgi ei saa toimetada enne e-posti aadressi kinnitamist.\nPalun määra ja kinnita e-posti aadress [[Special:Preferences|eelistuste leheküljel]].",
        "invalid-content-data": "Vigased sisuandmed",
        "content-not-allowed-here": "Lehekülg [[$2]] ei tohi sisaldada $1i.",
        "editwarning-warning": "Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.\nKui oled sisse loginud, saad selle hoiatuse eelistuste alaosas \"{{int:prefs-editing}}\" keelata.",
+       "editpage-invalidcontentmodel-title": "Toetamata sisumudel",
+       "editpage-invalidcontentmodel-text": "Sisumudelit \"$1\" ei toetata.",
        "editpage-notsupportedcontentformat-title": "Sisuvormingu tugi puudub",
        "editpage-notsupportedcontentformat-text": "Sisumudelil $2 puudub sisuvormingu $1 tugi.",
        "content-model-wikitext": "vikitekst",
        "content-json-empty-object": "Tühi objekt",
        "content-json-empty-array": "Tühi massiiv",
        "deprecated-self-close-category": "Vigaste endassesuletud HTML-siltidega leheküljed",
+       "deprecated-self-close-category-desc": "Leheküljel on endassesuletud HTML-silte nagu <code>&lt;b/></code> või <code>&lt;span/></code>. Nende kuvamisviis viiakse peagi vastavusse HTML5 spetsifikatsiooniga. Seetõttu selliseid silte vikitekstis enam kasutama ei peaks.",
        "duplicate-args-warning": "<strong>Hoiatus:</strong> [[:$1]] kutsub malli [[:$2]] nii, et parameetrile \"$3\" vastab rohkem kui üks väärtus. Väärtustest kasutatakse ainult viimast.",
        "duplicate-args-category": "Leheküljed, kus mallikutses on topeltargument",
        "duplicate-args-category-desc": "Lehekülg sisaldab mallikutseid, kus mõnd argumenti on kasutatud mitu korda, näiteks <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> või <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "mergehistory-empty": "Ühtegi redaktsiooni ei saa liita.",
        "mergehistory-done": "Lehekülje $1 {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
        "mergehistory-fail": "Muudatuste ajaloo liitmine ebaõnnestus. Palun kontrolli lehekülje ja aja parameetreid.",
+       "mergehistory-fail-bad-timestamp": "Ajatempel on vigane.",
+       "mergehistory-fail-invalid-source": "Alliklehekülg on vigane.",
+       "mergehistory-fail-invalid-dest": "Sihtlehekülg on vigane.",
+       "mergehistory-fail-no-change": "Ajalugude liitmisel ei liidetud ühtegi redaktsiooni. Palun kontrolli lehekülgede ja aja parameetrid veelkord üle.",
+       "mergehistory-fail-permission": "Ajalugude liitmiseks vajalikud õigused puuduvad.",
+       "mergehistory-fail-self-merge": "Allik- ja sihtlehekülg on üks ja sama lehekülg.",
+       "mergehistory-fail-timestamps-overlap": "Alliklehekülje redaktsioonid kattuvad ajaliselt sihtlehekülje redaktsioonidega või on neist uuemad.",
        "mergehistory-fail-toobig": "Ajalugusid ei õnnestu liita, sest teisaldada tuleks rohkem kui {{PLURAL:$1|üks redaktsioon|$1 redaktsiooni}}, mis on piirmäär.",
        "mergehistory-no-source": "Alliklehekülge $1 pole olemas.",
        "mergehistory-no-destination": "Sihtlehekülge $1 pole olemas.",
        "search-interwiki-caption": "Sõsarprojektid",
        "search-interwiki-default": "Tulemused asukohast $1:",
        "search-interwiki-more": "(veel)",
+       "search-interwiki-more-results": "veel tulemusi",
        "search-relatedarticle": "Seotud",
        "searchrelated": "seotud",
        "searchall": "kõik",
        "search-external": "Välisotsing",
        "searchdisabled": "Otsimine on preagu keelatud.\nVahepeal saad otsimiseks Google'it kasutada.\nPane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
        "search-error": "Otsimise ajal ilmnes tõrge: $1",
+       "search-warning": "Otsimisel esines hoiatus: $1",
        "preferences": "Eelistused",
        "mypreferences": "Eelistused",
        "prefs-edits": "Redigeerimiste arv:",
        "prefs-watchlist-token": "Jälgimisloendi luba:",
        "prefs-misc": "Muu",
        "prefs-resetpass": "Muuda parool",
-       "prefs-changeemail": "Muuda e-posti aadressi või eemalda see",
+       "prefs-changeemail": "muuda e-posti aadressi või eemalda see",
        "prefs-setemail": "Määra e-posti aadress",
        "prefs-email": "E-posti sätted",
        "prefs-rendering": "Ilme",
        "saveprefs": "Salvesta eelistused",
        "restoreprefs": "Taasta kõik vaike-eelistused (kõigil kaartidel)",
        "prefs-editing": "Toimetamine",
-       "rows": "Ridu:",
-       "columns": "Veerge:",
        "searchresultshead": "Otsingutulemite sätted",
        "stub-threshold": "Nupukese suurus lingivormistusel ($1):",
        "stub-threshold-sample-link": "näide",
        "prefs-help-recentchangescount": "See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.",
        "prefs-help-watchlist-token2": "See on sinu jälgimisloendi veebivoo salavõti.\nIgaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.\n[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].",
        "savedprefs": "Sinu eelistused on salvestatud.",
-       "savedrights": "Kasutaja $1 õigused on salvestatud.",
+       "savedrights": "Kasutaja $1 rühmad on salvestatud.",
        "timezonelegend": "Ajavöönd:",
        "localtime": "Kohalik aeg:",
        "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)",
        "prefs-namespaces": "Nimeruumid",
        "default": "vaikeväärtus",
        "prefs-files": "Failid",
-       "prefs-custom-css": "Kohandatud CSS",
-       "prefs-custom-js": "Kohandatud JavaScript",
+       "prefs-custom-css": "kohandatud CSS",
+       "prefs-custom-js": "kohandatud JavaScript",
        "prefs-common-css-js": "Kõigi kujunduste ühine CSS/JavaScript:",
        "prefs-reset-intro": "Sellel leheküljel saad oma eelistused lähtestada võrgukoha vaike-eelistusteks.\nToimingut ei saa hiljem tühistada.",
        "prefs-emailconfirm-label": "E-posti kinnitus:",
        "youremail": "E-posti aadress:",
        "username": "{{GENDER:$1|Kasutajanimi}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Järgmise rühma|Järgmiste rühmade}} {{GENDER:$2|liige}}:",
+       "group-membership-link-with-expiry": "$1 (tähtaeg $2)",
        "prefs-registration": "Registreerumise aeg:",
        "yourrealname": "Tegelik nimi:",
        "yourlanguage": "Keel:",
        "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-lookup-user": "Kasutajarühma muutmine",
+       "userrights-lookup-user": "Kasutaja valimine",
        "userrights-user-editname": "Sisesta kasutajanimi:",
-       "editusergroup": "Muuda {{GENDER:$1|kasutajarühmi}}",
+       "editusergroup": "Laadi kasutajarühmad",
        "editinguser": "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
-       "userrights-editusergroup": "Kasutajarühmade muutmine",
+       "viewinguserrights": "{{GENDER:$1|Kasutaja}} <strong>[[User:$1|$1]]</strong> $2 õiguste vaatamine",
+       "userrights-editusergroup": "{{GENDER:$1|Kasutajarühmade}} muutmine",
+       "userrights-viewusergroup": "{{GENDER:$1|Kasutajarühmade}} vaatamine",
        "saveusergroups": "Salvesta {{GENDER:$1|kasutajarühmad}}",
        "userrights-groupsmember": "Kuulub rühmadesse:",
        "userrights-groupsmember-auto": "Kuulub vaikimisi rühmadesse:",
-       "userrights-groups-help": "Sa võid muuta selle kasutaja kuuluvust eri kasutajarühmadesse.\n* Märgitud kast tähendab, et kasutaja kuulub sellesse rühma.\n* Märkimata kast tähendab, et kasutaja ei kuulu sellesse rühma.\n* Aga * kasutajarühma juures tähistab õigust, mida sa peale lisamist enam eemaldada ei saa, või siis ka vastupidi.",
+       "userrights-groups-help": "Võid muuta selle kasutaja kuuluvust eri kasutajarühmadesse.\n* Märgitud ruut tähendab, et kasutaja kuulub sellesse rühma.\n* Märkimata ruut tähendab, et kasutaja ei kuulu sellesse rühma.\n* Märk * tähistab kasutajarühma, mida sa ei saa pärast lisamist eemaldada, või vastupidi.\n* Märk # tähistab kasutajarühma, millesse kuulumise aegumistähtaega saad ainult edasi lükata, sa ei saa tähtaega varasemale ajale tuua.",
        "userrights-reason": "Põhjus:",
        "userrights-no-interwiki": "Sul ei ole luba muuta kasutajaõigusi teistes vikides.",
        "userrights-nodatabase": "Andmebaasi $1 ei ole olemas või pole see kohalik.",
-       "userrights-nologin": "Et kasutajaõigusi jagada, pead administraatori kontoga [[Special:UserLogin|sisse logima]].",
-       "userrights-notallowed": "Sul pole õigust kasutajaõigusi lisada ega eemaldada.",
        "userrights-changeable-col": "Rühmad, mida sa saad muuta",
        "userrights-unchangeable-col": "Rühmad, mida sa ei saa muuta",
+       "userrights-expiry-current": "Aegumistähtaeg $1",
+       "userrights-expiry-none": "Ei aegu",
+       "userrights-expiry": "Aegumistähtaeg:",
+       "userrights-expiry-existing": "Kehtiv aegumistähtaeg: $2, kell $3",
+       "userrights-expiry-othertime": "Muu tähtaeg:",
+       "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-conflict": "Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.",
-       "userrights-removed-self": "Võtsid endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.",
        "group": "Rühm:",
        "group-user": "Kasutajad",
        "group-autoconfirmed": "Automaatselt kinnitatud kasutajad",
        "right-reupload-shared": "Asendada kohalikus vikis jagatud failivaramu faile",
        "right-upload_by_url": "Faile internetiaadressilt üles laadida",
        "right-purge": "Tühjendada lehekülje vahemälu kinnituseta",
-       "right-autoconfirmed": "Hoiduda IP-põhistest piirangumääradest",
+       "right-autoconfirmed": "Hoiduda IP-aadressi põhistest piirangumääradest",
        "right-bot": "Olla koheldud kui automaadistatud toimimisviis",
        "right-nominornewtalk": "Teha arutelulehekülgedel pisimuudatusi, ilma et lehekülg märgitaks uuena",
        "right-apihighlimits": "Kasutada API-päringutes kõrgemaid limiite",
        "right-siteadmin": "Panna lukku ja lukust lahti teha andmebaasi",
        "right-override-export-depth": "Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni",
        "right-sendemail": "Saata teistele kasutajatele e-kirju",
-       "right-passwordreset": "Vaadata parooli lähtestamise e-kirju",
        "right-managechangetags": "Koostada ja (in)aktiveerida [[Special:Tags|märgiseid]]",
        "right-applychangetags": "Rakendada [[Special:Tags|märgiseid]] enda muudatuste suhtes",
        "right-changetags": "Lisada ja eemaldada käsitsi rakendatavaid [[Special:Tags|märgiseid]] üksikute redaktsioonide ja logisissekannete juures",
        "right-deletechangetags": "Kustutada andmebaasist [[Special:Tags|märgiseid]]",
+       "grant-generic": "Volituse \"$1\" õiguste komplekt",
        "grant-group-page-interaction": "Interaktsioon lehekülgedega",
        "grant-group-file-interaction": "Interaktsioon meediafailidega",
        "grant-group-watchlist-interaction": "Interaktsioon sinu jälgimisloendiga",
        "grant-group-high-volume": "Suuremahuline tegevus",
        "grant-group-customization": "Kohandamine ja eelistused",
        "grant-group-administration": "Administraatori toimingud",
+       "grant-group-private-information": "Juurdepääs enda eraandmetele",
        "grant-group-other": "Mitmesugused toimingud",
        "grant-blockusers": "Kasutajate blokeerimine ja blokeeringute eemaldamine",
        "grant-createaccount": "Kontode loomine",
        "grant-editpage": "Olemasolevate lehekülgede redigeerimine",
        "grant-editprotected": "Kaitstud lehekülgede redigeerimine",
        "grant-highvolume": "Suuremahuline redigeerimine",
+       "grant-oversight": "Kasutajate peitmine ja redaktsioonide varjamine",
        "grant-patrol": "Lehekülgede muudatuste kontroll",
+       "grant-privateinfo": "Juurdepääs erateabele",
        "grant-protect": "Lehekülgede kaitsmine ja kaitse eemaldamine",
        "grant-rollback": "Lehekülgede muudatuste tühistamine",
        "grant-sendemail": "Kasutajatele e-kirjade saatmine",
        "grant-basic": "Põhiõigused",
        "grant-viewdeleted": "Kustutatud failide ja lehekülgede vaatamine",
        "grant-viewmywatchlist": "Oma jälgimisloendi vaatamine",
+       "grant-viewrestrictedlogs": "Pääsupiiranguga andmete vaatamine",
        "newuserlogpage": "Konto loomise logi",
        "newuserlogpagetext": "Siin on logitud kasutajate registreerimine.",
        "rightslog": "Kasutajaõiguste logi",
        "action-upload_by_url": "seda faili internetiaadressilt üles laadida",
        "action-writeapi": "kirjutamise rakendusliidest kasutada",
        "action-delete": "seda lehekülge kustutada",
-       "action-deleterevision": "seda redaktsiooni kustutada",
-       "action-deletedhistory": "selle lehekülje kustutatud ajalugu vaadata",
+       "action-deleterevision": "redaktsioone kustutada",
+       "action-deletelogentry": "logisissekandeid kustutada",
+       "action-deletedhistory": "vaadata lehekülje kustutatud ajalugu",
+       "action-deletedtext": "vaadata kustutatud redaktsioonide teksti",
        "action-browsearchive": "kustutatud lehekülgi otsida",
        "action-undelete": "lehekülgi taastada",
-       "action-suppressrevision": "seda peidetud redaktsiooni vaadata ega taastada",
+       "action-suppressrevision": "peidetud redaktsioone vaadata ega taastada",
        "action-suppressionlog": "seda eralogi vaadata",
        "action-block": "selle kasutaja redigeerimisõigust blokeerida",
        "action-protect": "selle lehekülje kaitsetasemeid muuta",
        "action-userrights-interwiki": "teiste vikide kasutajate õigusi muuta",
        "action-siteadmin": "andmebaasi lukustada või avada",
        "action-sendemail": "e-kirju saata",
+       "action-editmyoptions": "muuta oma eelistusi",
        "action-editmywatchlist": "oma jälgimisloendit redigeerida",
        "action-viewmywatchlist": "oma jälgimisloendit vaadata",
        "action-viewmyprivateinfo": "oma eraandmeid vaadata",
        "action-managechangetags": "märgiseid koostada ega (in)aktiveerida",
        "action-applychangetags": "rakendada märgiseid oma muudatuste suhtes",
        "action-changetags": "käsitsi rakendatavaid märgiseid üksikute redaktsioonide ega logisissekannete juures lisada ega eemaldada",
+       "action-deletechangetags": "märgiseid andmebaasist kustutada",
        "nchanges": "$1 {{PLURAL:$1|muudatus|muudatust}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimase vaatamise järel}}",
        "enhancedrc-history": "ajalugu",
        "file-thumbnail-no": "Failinimi algab eesliitega <strong>$1</strong>.\nSee paistab vähendatud suurusega pilt (''pisipilt'') olevat.\nKui sul on ka selle pildi täislahutusega versioon, laadi palun hoopis see üles, vastasel korral muuda palun faili nime.",
        "fileexists-forbidden": "Sellise nimega fail on juba olemas, seda ei saa üle kirjutada.\nPalun pöörduge tagasi ja laadige fail üles mõne teise nime all. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Samanimeline fail on juba olemas jagatud meediavaramus.\nKui soovid siiski oma faili üles laadida, siis palun mine tagasi ja kasuta teist failinime.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Üleslaaditav fail on faili <strong>[[:$1]]</strong> praeguse versiooni üksühene duplikaat.",
+       "fileexists-duplicate-version": "Üleslaaditav fail on faili <strong>[[:$1]]</strong> {{PLURAL:$2|vanema versiooni|vanemate versioonide}} üksühene duplikaat.",
        "file-exists-duplicate": "See fail on {{PLURAL:$1|järgmise faili|järgmiste failide}} duplikaat:",
        "file-deleted-duplicate": "Selle failiga ([[:$1]]) identne fail on hiljuti kustutatud.\nVaata selle faili kustutamise ajalugu enne jätkamist.",
        "file-deleted-duplicate-notitle": "Selle failiga identne fail on varem kustutatud ja pealkiri on varjatud.\nEnne kui jätkad uuesti üleslaadimisega, peaksid paluma olukorda hinnata kellelgi, kes saab vaadata varjatud andmeid.",
        "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.",
+       "uploaded-href-attribute-svg": "SVG-failis on lubatud href-atribuudiga viidata ainult sihtkohta skeemiga http:// või https://. Leiti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Üleslaaditud SVG-failist leiti href, mis viitab ebaturvalistele andmetele: URI sihtkoht <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "Üleslaaditud SVG-failist leiti silt \"animate\", mis võib href-i muuta, kasutades from-atribuuti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-event-handler-svg": "Sündmuse halduse atribuutide seadmine on keelatud, üleslaaditud SVG-failist leiti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-handler-svg": "SVG-failid, mis seavad atribuudile \"handler\" kaug-, andme- või skriptisihtkoha, on keelatud. Üleslaaditud SVG-failist leiti <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG-fail, mis kasutab mistahes laadiatribuudi seadmiseks kaug-URL-i, on keelatud. Üleslaaditud SVG-failist leiti <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "Üleslaaditud SVG-failist leiti URL-iga pildifilter: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "See SVG-fail sisaldab keelatud nimeruumi \"$1\".",
+       "uploadscriptednamespace": "See SVG-fail sisaldab keelatud nimeruumi \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Üleslaaditud failis sisalduvat XMLi ei õnnestunud liigendada.",
        "uploadvirus": "Fail sisaldab viirust! Täpsemalt: $1",
        "uploadjava": "See fail on ZIP-fail, milles on Java .class-fail.\nJava failide üleslaadimine on keelatud, kuna nende kaudu võidaks turvapiiranguist mööda minna.",
        "upload-too-many-redirects": "URL sisaldas liiga palju ümbersuunamisi",
        "upload-http-error": "HTTP-viga: $1",
        "upload-copy-upload-invalid-domain": "Sellest domeenist pole kopeerimise teel üleslaadimine võimalik.",
+       "upload-foreign-cant-upload": "Selles vikis pole häälestatud failide üleslaadimine päritud välisesse failihoidlasse.",
+       "upload-foreign-cant-load-config": "Ei õnnestunud laadida häälestust, mis puudutab failide üleslaadimist välisesse failihoidlasse.",
+       "upload-dialog-disabled": "Selle dialoogi kasutamine üleslaadimiseks on siin vikis keelatud.",
        "upload-dialog-title": "Faili üleslaadimine",
        "upload-dialog-button-cancel": "Loobu",
+       "upload-dialog-button-back": "Tagasi",
        "upload-dialog-button-done": "Valmis",
        "upload-dialog-button-save": "Salvesta",
        "upload-dialog-button-upload": "Laadi üles",
        "upload-form-label-infoform-title": "Üksikasjad",
        "upload-form-label-infoform-name": "Pealkiri",
+       "upload-form-label-infoform-name-tooltip": "Ainukordne ja kirjeldav pealkiri, millest saab failinimi. Võid kasutada lihtteksti ja tühikuid. Ära lisa nimele faililaiendit.",
        "upload-form-label-infoform-description": "Kirjeldus",
+       "upload-form-label-infoform-description-tooltip": "Anna teose kohta lühidalt edasi kõik märkimisväärne.\nFoto juures maini, mida on kujutatud, mis sündmuse või kohaga on tegu.",
        "upload-form-label-usage-title": "Kasutus",
        "upload-form-label-usage-filename": "Failinimi",
-       "upload-form-label-own-work": "See on minu enda töö",
+       "upload-form-label-own-work": "See on minu enda looming.",
        "upload-form-label-infoform-categories": "Kategooriad",
        "upload-form-label-infoform-date": "Kuupäev",
        "upload-form-label-own-work-message-generic-local": "Kinnitan, et seda faili üles laadides järgin saidi {{SITENAME}} kasutustingimusi ja litsentsipõhimõtteid.",
        "zip-wrong-format": "Valitud fail ei ole ZIP-fail.",
        "zip-bad": "See ZIP-fail on kas rikutud või muul põhjusel loetamatu.\nSelle turvalisust ei saa kontrollida.",
        "zip-unsupported": "See ZIP-fail kasutab ZIP-funktsioone, mida MediaWiki ei toeta.\nSelle turvalisust ei saa kontrollida.",
-       "uploadstash": "Üleslaaditud failide algne hoidla",
+       "uploadstash": "Üleslaadimise peithoidla",
        "uploadstash-summary": "See lehekülg pakub juurdepääsu failidele, mis on üles laaditud (või mida parasjagu üles laaditakse), kuid mis pole veel vikis avaldatud. Need failid on nähtavad üksnes kasutajale, kes need üles laadis.",
-       "uploadstash-clear": "Kustuta failid algsest hoidlast",
-       "uploadstash-nofiles": "Sul pole algses hoidlas faile.",
+       "uploadstash-clear": "Eemalda peitfailid",
+       "uploadstash-nofiles": "Sul pole peitfaile.",
        "uploadstash-badtoken": "Toiming ebaõnnestus, võib-olla redigeerimismandaadi aegumise tõttu. Palun proovi uuesti.",
-       "uploadstash-errclear": "Failide kustutamine ebaõnnestus.",
+       "uploadstash-errclear": "Failide eemaldamine ebaõnnestus.",
        "uploadstash-refresh": "Värskenda faililoendit",
+       "uploadstash-thumbnail": "vaata pisipilti",
+       "uploadstash-exception": "Üleslaaditavat faili ei õnnestunud peithoidlas talletada ($1): \"$2\".",
        "invalid-chunk-offset": "Tüki vigane nihe",
        "img-auth-accessdenied": "Juurdepääs keelatud",
        "img-auth-nopathinfo": "PATH_INFO puudub.\nSinu server pole seadistatud seda teavet edastama.\nSee võib olla CGI-põhine ja ei toeta img_auth-i.\nVaata lehekülge https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "filerevert-submit": "Taasta",
        "filerevert-success": "Faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2 kasutusel olnud versioon] on taastatud.",
        "filerevert-badversion": "Ette antud ajatempliga kohalik versioon sellest failist puudub.",
+       "filerevert-identical": "Praegune versioon on valitud versiooniga juba identne.",
        "filedelete": "Kustuta $1",
        "filedelete-legend": "Faili kustutamine",
        "filedelete-intro": "Oled kustutamas faili '''[[Media:$1|$1]]''' ja kogu selle ajalugu.",
        "uncategorizedcategories": "Kategoriseerimata kategooriad",
        "uncategorizedimages": "Kategoriseerimata failid",
        "uncategorizedtemplates": "Kategoriseerimata mallid",
+       "uncategorized-categories-exceptionlist": " # Loetelu kategooriatest, mis ei peaks kajastuma leheküljel \"Eri:Kategoriseerimata kategooriad\". Üks kategooria rea kohta, rea alguses \"*\". Muu märgiga (sh tühemik) algavaid ridu eiratakse. Komentaari jaoks kasuta märki \"#\".",
        "unusedcategories": "Kasutamata kategooriad",
        "unusedimages": "Kasutamata failid",
        "wantedcategories": "Kõige oodatumad kategooriad",
        "allpagesbadtitle": "Lehekülje pealkiri oli vigane või sisaldas teise viki või keele eesliidet.\nSee võib sisaldada üht või enamat märki, mida ei saa pealkirjades kasutada.",
        "allpages-bad-ns": "{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimeruumi \"$1\".",
        "allpages-hide-redirects": "Peida ümbersuunamised",
-       "cachedspecial-viewing-cached-ttl": "Vaata vahemälus olevat lehekülje versiooni, mis võib olla kuni $1 vana.",
+       "cachedspecial-viewing-cached-ttl": "Sa vaatad lehekülje vahemälus olevat versiooni, mis võib olla kuni $1 vana.",
        "cachedspecial-viewing-cached-ts": "Vaatad vahemälus olevat lehekülje versiooni, mis ei pruugi olla täiesti ajakohane.",
        "cachedspecial-refresh-now": "Vaata uusimat versiooni.",
        "categories": "Kategooriad",
        "activeusers-intro": "See on loetelu kasutajatest, kes on viimase $1 {{PLURAL:$1|päev|päeva}} jooksul midagi teinud.",
        "activeusers-count": "$1 {{PLURAL:$1|toiming|toimingut}} viimase {{PLURAL:$3|päeva|$3 päeva}} jooksul",
        "activeusers-from": "Näita kasutajaid alates:",
+       "activeusers-groups": "Kuva kasutajad, kes kuuluvad järgmistesse rühmadesse:",
+       "activeusers-excludegroups": "Ära kuva kasutajaid, kes kuuluvad järgmistesse rühmadesse:",
        "activeusers-noresult": "Kasutajaid ei leidunud.",
        "activeusers-submit": "Kuva aktiivsed kasutajad",
        "listgrouprights": "Kasutajarühma õigused",
        "trackingcategories-name": "Sõnumi nimi",
        "trackingcategories-desc": "Kategooriasse arvamise kriteeriumid",
        "restricted-displaytitle-ignored": "Eiratava kuvapealkirjaga leheküljed",
+       "restricted-displaytitle-ignored-desc": "Leheküljel on <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, mida eiratakse, sest see ei vasta lehekülje tegelikule pealkirjale.",
        "noindex-category-desc": "Robotid ei indekseeri lehekülge, sest sellel on võlusõna <code><nowiki>__NOINDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud.",
        "index-category-desc": "Leheküljel on <code><nowiki>__INDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud ning seetõttu indekseerivad robotid lehekülge seal, kus nad muidu seda ei teeks.",
        "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.",
        "emailccsubject": "Koopia sinu sõnumist kasutajale $1: $2",
        "emailsent": "E-kiri saadetud",
        "emailsenttext": "Sinu teade on e-kirjaga saadetud.",
-       "emailuserfooter": "Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu \"{{int:emailuser}}\" abil.",
+       "emailuserfooter": "Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu \"{{int:emailuser}}\" abil. Kui vastad sellele e-kirjale, saadetakse sinu e-kiri otse algse kirja saatjale, mistõttu saab ta teada sinu e-posti aadressi.",
        "usermessage-summary": "Jätan süsteemiteate.",
        "usermessage-editor": "Süsteemiteadete edastaja",
        "watchlist": "Jälgimisloend",
        "mywatchlist": "Jälgimisloend",
-       "watchlistfor2": "Kasutaja $1 $2 jaoks",
+       "watchlistfor2": "Kasutaja $1 $2 jälgimisloend",
        "nowatchlist": "Sinu jälgimisloend on tühi.",
        "watchlistanontext": "Palun logi sisse, et oma jälgimisloendit näha või muuta.",
        "watchnologin": "Ei ole sisse logitud",
        "addwatch": "Lisa jälgimisloendisse",
        "addedwatchtext": "\"[[:$1]]\" ja selle arutelulehekülg on lisatud sinu [[Special:Watchlist|jälgimisloendisse]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" ja sellega seotud lehekülg on lisatud sinu [[Special:Watchlist|jälgimisloendisse]].",
        "addedwatchtext-short": "Lehekülg \"$1\" on lisatud sinu jälgimisloendisse.",
        "removewatch": "Eemalda jälgimisloendist",
        "removedwatchtext": "\"[[:$1]]\" ja selle arutelulehekülg on [[Special:Watchlist|jälgimisloendist]] eemaldatud.",
+       "removedwatchtext-talk": "\"[[:$1]]\" ja sellega seotud lehekülg on sinu [[Special:Watchlist|jälgimisloendist]] eemaldatud.",
        "removedwatchtext-short": "Lehekülg \"$1\" on eemaldatud sinu jälgimisloendist.",
        "watch": "Jälgi",
        "watchthispage": "Jälgi seda lehekülge",
        "rollbacklinkcount": "tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}",
        "rollbacklinkcount-morethan": "tühista üle {{PLURAL:$1|ühe muudatuse|10 muudatuse}}",
        "rollbackfailed": "Muudatuste tühistamine ebaõnnestus",
+       "rollback-missingparam": "Päringus puuduvad nõutavad parameetrid.",
+       "rollback-missingrevision": "Redaktsiooni andmeid ei õnnestu laadida.",
        "cantrollback": "Ei saa muudatusi eemaldada, sest viimane kaastööline on artikli ainus autor.",
        "alreadyrolled": "Muudatust, mille tegi lehele [[:$1]] kasutaja [[User:$2|$2]] ([[User talk:$2|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), ei saa tühistada, sest keegi teine on seda lehte vahepeal muutnud.\n\nLehte muutis viimasena [[User:$3|$3]] ([[User talk:$3|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "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-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.",
        "changecontentmodel": "Lehekülje sisumudeli muutmine",
        "changecontentmodel-success-text": "Lehekülje [[:$1]] sisumudel on muudetud.",
        "changecontentmodel-cannot-convert": "Lehekülje [[:$1]] sisumudelit ei saa teisendada tüübiks $2.",
        "changecontentmodel-nodirectediting": "Sisumudel $1 ei võimalda otseredigeerimist.",
+       "changecontentmodel-emptymodels-title": "Sisumudeleid pole saadaval",
+       "changecontentmodel-emptymodels-text": "Lehekülje [[:$1]] sisu ei saa teisendada ühtegi tüüpi mudelisse.",
        "log-name-contentmodel": "Sisumudeli muutmislogi",
-       "log-description-contentmodel": "Lehekülje sisumudelite muutmisega seotud sündmused",
+       "log-description-contentmodel": "Siin on loetletud lehekülgede sisumudelite muudatused ning leheküljed, mis loodi vaikeväärtusest erineva sisumudeliga.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|lõi}} lehekülje $3 vaikeväärtusest erineva sisumudeliga \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" sisumudeli: \"$4\" → \"$5\"",
        "logentry-contentmodel-change-revertlink": "võta tagasi",
        "logentry-contentmodel-change-revert": "tagasi võetud",
        "modifiedarticleprotection": "muutis lehekülje \"[[$1]]\" kaitsemäära",
        "unprotectedarticle": "eemaldas lehekülje \"[[$1]]\" kaitse",
        "movedarticleprotection": "teisaldas kaitsesätted leheküljelt \"[[$2]]\" leheküljele \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Kaitsti}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Muudeti}} lehekülje \"[[$1]]\" kaitsetase",
+       "unprotectedarticle-comment": "{{GENDER:$2|Eemaldati}} lehekülje \"[[$1]]\" kaitse",
        "protect-title": "Lehekülje \"$1\" kaitsemäära muutmine",
        "protect-title-notallowed": "Lehekülje \"$1\" kaitsemäära vaatamine",
        "prot_1movedto2": "Lehekülg \"[[$1]]\" teisaldatud pealkirja \"[[$2]]\" alla",
        "protect-norestrictiontypes-title": "Kaitstamatu lehekülg",
        "protect-legend": "Kaitse kinnitamine",
        "protectcomment": "Põhjus:",
-       "protectexpiry": "Aegub:",
+       "protectexpiry": "Aegumistähtaeg:",
        "protect_expiry_invalid": "Sobimatu aegumise tähtaeg.",
        "protect_expiry_old": "Aegumise tähtaeg on minevikus.",
        "protect-unchain-permissions": "Ava edasised kaitsmissuvandid",
        "protect-cantedit": "Sa ei saa lehekülje kaitsetaset muuta, sest sul puudub lehekülje redigeerimise õigus.",
        "protect-othertime": "Muu aeg:",
        "protect-othertime-op": "muu aeg",
-       "protect-existing-expiry": "Kehtiv aegumisaeg: $2 kell $3",
-       "protect-existing-expiry-infinity": "Kehtiv aegumisaeg: igavene",
+       "protect-existing-expiry": "Kehtiv aegumistähtaeg: $2, kell $3",
+       "protect-existing-expiry-infinity": "Kehtiv aegumistähtaeg: tähtajatu",
        "protect-otherreason": "Muu või täiendav põhjus:",
        "protect-otherreason-op": "Muu põhjus",
        "protect-dropdown": "*Tavalised kaitsmise põhjused\n** Liigne vandalism\n** Liigne rämpspostitamine\n** Redigeerimissõja pidamine\n** Suure liiklusega lehekülg",
        "protect-edit-reasonlist": "Muudatuste eest kaitsmise põhjused",
-       "protect-expiry-options": "1 tund:1 hour,1 päev:1 day,1 nädal:1 week,2 nädalat: 2 weeks,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year,igavene:infinite",
+       "protect-expiry-options": "1 tund:1 hour,1 päev:1 day,1 nädal:1 week,2 nädalat: 2 weeks,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year,tähtajatu:infinite",
        "restriction-type": "Lubatud:",
        "restriction-level": "Kaitsmise tase:",
        "minimum-size": "Min suurus",
        "contributions-title": "Kasutaja $1 kaastöö",
        "mycontris": "Kaastöö",
        "anoncontribs": "Kaastöö",
-       "contribsub2": "Kasutaja {{GENDER:$3|$1}} ($2) jaoks",
+       "contribsub2": "Kasutaja {{GENDER:$3|$1}} ($2) kaastöö",
        "contributions-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
        "nocontribs": "Antud kriteeriumitele vastavaid muudatusi ei leitud.",
        "uctop": "(praegune)",
        "blockip-legend": "Kasutaja blokeerimine",
        "blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.\nIP-aadresside vahemikke saad blokeerida [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-süntaksi abil; suurim lubatud vahemik on IPv4 jaoks /$1 ja IPv6 jaoks /$2.",
        "ipaddressorusername": "IP-aadress või kasutajanimi:",
-       "ipbexpiry": "Kehtivus:",
+       "ipbexpiry": "Aegumistähtaeg:",
        "ipbreason": "Põhjus:",
        "ipbreason-dropdown": "*Tavalised blokeerimise põhjused\n** Valeandmete lisamine\n** Lehekülgedelt sisu kustutamine\n** Välislinkide rämpspostitus\n** Sodimine\n** Hirmutav käitumine/ahistamine\n** Mitme konto väärkasutus\n** Lubamatu kasutajanimi",
        "ipb-hardblock": "Keela sellelt IP-aadressilt sisseloginud kasutajatel redigeerida",
        "ipblocklist-submit": "Otsi",
        "ipblocklist-localblock": "Kohalik blokeering",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Muu blokeering|Muud blokeeringud}}",
-       "infiniteblock": "igavene",
+       "infiniteblock": "tähtajatu",
        "expiringblock": "aegumistähtaeg $1, $2",
        "anononlyblock": "ainult nimetuna",
        "noautoblockblock": "IP-aadressi ei blokita automaatselt",
        "proxyblockreason": "Sinu IP-aadress on blokeeritud, sest see on avatud proksi. Palun võta ühendust oma internetiteenuse pakkujaga või tehnilise toega ja teata neile sellest probleemist.",
        "sorbsreason": "Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.",
        "sorbs_create_account_reason": "Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.\nSa ei saa kasutajakontot luua.",
+       "softblockrangesreason": "Sinu IP-aadressilt ($1) pole anonüümne kaastöö lubatud. Palun logi sisse.",
        "xffblockreason": "X-Forwarded-Fori päises esinev IP-aadress, mis kuulub kas sulle või proksiserverile, mida kasutad, on blokeeritud. Blokeerimise algne põhjus oli: $1",
        "cant-see-hidden-user": "Kasutaja, keda blokeerida üritad, on juba blokeeritud ning peidetud. Kuna sul pole õigust blokeerida kasutajanimesid, peites need avalikkuse eest, ei saa sa selle kasutaja blokeeringut vaadata ega muuta.",
        "ipbblocked": "Sa ei saa teisi blokeerida ega nende blokeeringuid eemaldada, sest oled ise blokeeritud.",
        "lockdbsuccesstext": "Andmebaas on nüüd lukustatud.<br />\nKui sinu hooldustöö on läbi, ära unusta [[Special:UnlockDB|kirjutuspääsu taastada]]!",
        "unlockdbsuccesstext": "Andmebaasi kirjutuspääs on taastatud.",
        "lockfilenotwritable": "Andmebaasi lukufail ei ole kirjutatav.\nAndmebaasi lukustamiseks ja avamiseks peavad veebiserveril olema sellele kirjutusõigused.",
+       "databaselocked": "Andmebaas on juba lukustatud.",
        "databasenotlocked": "Andmebaas ei ole lukustatud.",
        "lockedbyandtime": "(lukustas $1; $2, kell $3)",
        "move-page": "Lehekülje \"$1\" teisaldamine",
        "move-page-legend": "Lehekülje teisaldamine",
        "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Märkus:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
-       "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Note:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
+       "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Hoiatus!</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetalktext": "Kui märgid selle ruudu, teisaldatakse arutelulehekülg automaatselt uue pealkirja alla. Seda välja arvatud juhul, kui uue pealkirja all on juba arutelulehekülg, mis pole tühi.\n\nSel juhul saad lehekülje soovi korral käsitsi teisaldada või liita.",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
        "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "cant-move-to-user-page": "Sul ei ole õigust teisaldada lehekülge kasutajaleheks (ei käi kasutaja alamlehe kohta).",
        "cant-move-category-page": "Sul pole õigust kategoorialehekülgi teisaldada.",
        "cant-move-to-category-page": "Sul pole õigust teisaldada lehekülge kategoorialeheküljele.",
+       "cant-move-subpages": "Sul pole lubatud alamlehekülgi teisaldada.",
+       "namespace-nosubpages": "Nimeruumis \"$1\" pole alamleheküljed lubatud.",
        "newtitle": "Uus pealkiri:",
        "move-watch": "Jälgi lähte- ja sihtlehekülge",
        "movepagebtn": "Teisalda lehekülg",
        "movelogpagetext": "See logi sisaldab infot lehekülgede teisaldamistest.",
        "movesubpage": "{{PLURAL:$1|Alamlehekülg|Alamleheküljed}}",
        "movesubpagetext": "Selle lehekülje $1 {{PLURAL:$1|alamlehekülg|alamlehekülge}} on kuvatud allpool.",
+       "movesubpagetalktext": "Seonduval aruteluleheküljel on $1 allnäidatud {{PLURAL:$1|alamlehekülg|alamlehekülge}}.",
        "movenosubpage": "Sellel leheküljel pole alamlehekülgi.",
        "movereason": "Põhjus:",
        "revertmove": "taasta",
        "export-download": "Salvesta failina",
        "export-templates": "Kaasa mallid",
        "export-pagelinks": "Kaasan viidatud lehed kuni tasemeni",
+       "export-manual": "Käsitsi lisatud leheküljed:",
        "allmessages": "Kõik süsteemi sõnumid",
        "allmessagesname": "Nimi",
        "allmessagesdefault": "Vaiketekst",
        "pageinfo-length": "Lehekülje pikkus (baitides)",
        "pageinfo-article-id": "Lehekülje identifikaator",
        "pageinfo-language": "Lehekülje sisu keel",
+       "pageinfo-language-change": "muuda",
        "pageinfo-content-model": "Lehekülje sisumudel",
        "pageinfo-content-model-change": "muuda",
        "pageinfo-robot-policy": "Robotindekseering",
        "log-show-hide-patrol": "$1 kontrollimislogi",
        "log-show-hide-tag": "$1 märgiste logi",
        "confirm-markpatrolled-button": "Sobib",
+       "confirm-markpatrolled-top": "Kas märgid lehekülje $2 redaktsiooni $3 kontrollituks?",
        "deletedrevision": "Kustutatud vanem versioon $1",
        "filedeleteerror-short": "Tõrge faili kustutamisel: $1",
        "filedeleteerror-long": "Faili kustutamisel esines tõrkeid:\n\n$1",
        "newimages-legend": "Filter",
        "newimages-label": "Failinimi (või selle osa):",
        "newimages-showbots": "Näita robotite üles laaditud faile",
+       "newimages-hidepatrolled": "Peida kontrollitud failid",
        "noimages": "Uusi pilte ei ole.",
+       "gallery-slideshow-toggle": "Lülita pisipildid ümber",
        "ilsubmit": "Otsi",
        "bydate": "kuupäeva järgi",
        "sp-newimages-showfrom": "Näita uusi faile alates kuupäevast $2, kell $1",
        "exif-photometricinterpretation-0": "Mustvalge (valge on 0)",
        "exif-photometricinterpretation-1": "Mustvalge (must on 0)",
        "exif-photometricinterpretation-3": "Palett",
+       "exif-photometricinterpretation-4": "Läbipaistvusmask",
        "exif-photometricinterpretation-5": "Eraldatud (arvatavasti CMYK)",
        "exif-photometricinterpretation-9": "CIE L*a*b* (ICC kodeering)",
        "exif-photometricinterpretation-10": "CIE L*a*b* (ITU kodeering)",
        "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",
+       "notificationemail_subject_changed": "{{GRAMMAR:inessive|{{SITENAME}}}} registreeritud e-posti aadress on muudetud",
+       "notificationemail_subject_removed": "{{GRAMMAR:inessive|{{SITENAME}}}} registreeritud e-posti aadress on eemaldatud",
+       "notificationemail_body_changed": "Keegi IP-aadressilt $1, arvatavasti sina ise,\nmuutis {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks \"$3\".\n\nKui see ei olnud sina, siis võta viivitamata ühendust saidi administraatoriga.",
+       "notificationemail_body_removed": "Keegi IP-aadressilt $1, arvatavasti sina ise,\neemaldas {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressi.\n\nKui see ei olnud sina, siis võta viivitamata ühendust saidi administraatoriga.",
        "scarytranscludedisabled": "[Vikidevaheline mallina kasutamine on keelatud]",
        "scarytranscludefailed": "[Malli $1 hankimine ebaõnnestus]",
        "scarytranscludefailed-httpstatus": "[Malli $1 hankimine ebaõnnestus: HTTP $2]",
        "confirm-unwatch-button": "Sobib",
        "confirm-unwatch-top": "Kas eemaldad selle lehekülje oma jälgimisloendist?",
        "confirm-rollback-button": "Sobib",
+       "confirm-rollback-top": "Kas tühistad sellel leheküljel tehtud muudatused?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← eelmine lehekülg",
        "imgmultipagenext": "järgmine lehekülg →",
        "watchlistedit-clear-done": "Sinu jälgimisloend on tühjendatud.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Üks pealkiri|$1 pealkirja}} eemaldati:",
        "watchlistedit-too-many": "Pealkirju on siin kuvamiseks liiga palju.",
-       "watchlisttools-clear": "Tühjenda jälgimisloend",
-       "watchlisttools-view": "Näita vastavaid muudatusi",
-       "watchlisttools-edit": "Vaata ja redigeeri jälgimisloendit",
-       "watchlisttools-raw": "Muuda lähteteksti",
+       "watchlisttools-clear": "tühjenda jälgimisloend",
+       "watchlisttools-view": "näita vastavaid muudatusi",
+       "watchlisttools-edit": "vaata ja redigeeri jälgimisloendit",
+       "watchlisttools-raw": "redigeeri jälgimisloendi toorandmeid",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|arutelu]])",
+       "timezone-local": "Kohalik",
        "duplicate-defaultsort": "'''Hoiatus:''' Järjestamisvõti \"$2\" tühistab eespool oleva järjestamisvõtme \"$1\".",
        "duplicate-displaytitle": "<strong>Hoiatus:</strong> Kuvatava pealkirjaga \"$2\" kirjutatakse üle varasem kuvatav pealkiri \"$1\".",
+       "restricted-displaytitle": "<strong>Hoiatus:</strong> Kuvapealkirja \"$1\" eirati, sest see ei vasta lehekülje tegelikule pealkirjale.",
        "invalid-indicator-name": "<strong>Tõrge:</strong> Lehekülje olekunäidu juures ei tohi atribuudi <code>name</code> väärtus puududa.",
        "version": "Versioon",
        "version-extensions": "Paigaldatud lisad",
        "redirect-page": "Lehekülje identifikaator",
        "redirect-revision": "Lehekülje redaktsioon",
        "redirect-file": "Failinimi",
+       "redirect-logid": "Logi identifikaator",
        "redirect-not-exists": "Väärtust ei leitud",
        "fileduplicatesearch": "Faili duplikaatide otsimine",
        "fileduplicatesearch-summary": "Otsi duplikaatfaile nende räsiväärtuse järgi.",
        "tags-deactivate": "keela",
        "tags-hitcount": "$1 {{PLURAL:$1|muudatus|muudatust}}",
        "tags-manage-no-permission": "Sul pole õigust muudatusmärgiseid hallata.",
-       "tags-manage-blocked": "Muudatusmärgiseid ei saa hallata, kui oled blokeeritud.",
+       "tags-manage-blocked": "Muudatusmärgiseid ei saa hallata, kui {{GENDER:$1|oled}} blokeeritud.",
        "tags-create-heading": "Uue märgise koostamine",
        "tags-create-explanation": "Vaikimisi on vastkoostatud märgised kasutajate ja robotite jaoks kasutatavad.",
        "tags-create-tag-name": "Märgise nimi:",
        "tags-delete-not-found": "Märgist \"$1\" pole.",
        "tags-delete-too-many-uses": "Märgist \"$1\" on rakendatud rohkem kui {{PLURAL:$2|ühe|$2}} redaktsiooni juures, mistõttu ei saa seda kustutada.",
        "tags-delete-warnings-after-delete": "Märgis \"$1\" on kustutatud, kuid väljastati {{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
+       "tags-delete-no-permission": "Sul pole lubatud muudatusmärgiseid kustutada.",
        "tags-activate-title": "Märgise lubamine",
        "tags-activate-question": "Siinkohal lubad märgise \"$1\".",
        "tags-activate-reason": "Põhjus:",
        "tags-deactivate-not-allowed": "Märgist \"$1\" pole võimalik keelata.",
        "tags-deactivate-submit": "Keela",
        "tags-apply-no-permission": "Sul pole lubatud rakendada muudatusmärgiseid enda muudatuste suhtes.",
-       "tags-apply-blocked": "Muudatusmärgiseid ei saa enda muudatustele rakendada, kui oled blokeeritud.",
+       "tags-apply-blocked": "Muudatusmärgiseid ei saa enda muudatustele rakendada, kui {{GENDER:$1|oled}} blokeeritud.",
        "tags-apply-not-allowed-one": "Märgist \"$1\" pole lubatud käsitsi rakendada.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Järgmist märgist|Järgmiseid märgiseid}} pole lubatud käsitsi rakendada: $1",
        "tags-update-no-permission": "Sul pole lubatud üksikute redaktsioonide ega logisissekannete juures muudatusmärgiseid lisada ega eemaldada.",
-       "tags-update-blocked": "Muudatusmärgiseid ei saa lisada ega eemaldada, kui oled blokeeritud.",
+       "tags-update-blocked": "Muudatusmärgiseid ei saa lisada ega eemaldada, kui {{GENDER:$1|oled}} blokeeritud.",
        "tags-update-add-not-allowed-one": "Märgist \"$1\" pole lubatud käsitsi lisada.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Järgmist märgist|Järgmiseid märgiseid}} pole lubatud käsitsi lisada: $1",
        "tags-update-remove-not-allowed-one": "Märgist \"$1\" pole lubatud eemaldada.",
        "htmlform-cloner-create": "Lisa veel",
        "htmlform-cloner-delete": "Eemalda",
        "htmlform-cloner-required": "Vähemalt üks väärtus on nõutav.",
+       "htmlform-date-placeholder": "AAAA-KK-PP",
+       "htmlform-time-placeholder": "TT:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-KK-PP TT:MM:SS",
        "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-exists": "Kasutajat <strong>$1</strong> 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-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",
        "feedback-useragent": "Kasutajaagent:",
        "searchsuggest-search": "Otsi {{GRAMMAR:elative|{{SITENAME}}}}",
        "searchsuggest-containing": "sisalduv...",
-       "api-error-badaccess-groups": "Sul pole selles vikis üleslaadimisõigust.",
        "api-error-badtoken": "Sisemine tõrge: Sobimatu nimi.",
-       "api-error-copyuploaddisabled": "URLi kaudu üleslaadimine on selles serveris keelatud.",
-       "api-error-duplicate": "Siin on {{PLURAL:$1|teine samasisuline fail|mõned teised samasisulised failid}} juba olemas.",
-       "api-error-duplicate-archive": "Siin {{PLURAL:$1|on teine samasisuline fail|olid mõned teised samasisulised failid}} juba olemas, aga {{PLURAL:$1|see|need}} kustutati.",
-       "api-error-empty-file": "Üleslaaditav fail on tühi.",
        "api-error-emptypage": "Uute tühjade lehekülgede loomine pole lubatud.",
-       "api-error-fetchfileerror": "Sisemine tõrge: Midagi läks faili kättesaamisel valesti.",
-       "api-error-fileexists-forbidden": "Fail nimega \"$1\" on juba olemas ja seda ei saa üle kirjutada.",
-       "api-error-fileexists-shared-forbidden": "Fail nimega \"$1\" on jagatud failivaramus juba olemas ja seda ei saa üle kirjutada.",
-       "api-error-file-too-large": "Üleslaaditav fail on liiga suur.",
-       "api-error-filename-tooshort": "Failinimi on liiga lühike.",
-       "api-error-filetype-banned": "Antud failitüüp on keelatud.",
-       "api-error-filetype-banned-type": "$1 pole lubatud {{PLURAL:$4|failitüüp|failitüübid}}.  Lubatud {{PLURAL:$3|failitüüp|failitüübid}} on  $2.",
-       "api-error-filetype-missing": "Failinime tagant puudub laiend.",
-       "api-error-hookaborted": "Tarkvaralisa katkestas muudatuse tegemise.",
-       "api-error-http": "Sisetõrge: Serveriga pole võimalik ühendust luua.",
-       "api-error-illegal-filename": "Failinimi pole lubatud.",
-       "api-error-internal-error": "Sisetõrge: Sinu faili vikisse üleslaadimise juures läks midagi valesti.",
-       "api-error-invalid-file-key": "Sisetõrge: Faili ei leitud ajutisest mälust.",
-       "api-error-missingparam": "Sisetõrge: Päringust puudub mõni parameeter.",
-       "api-error-missingresult": "Sisetõrge: Ei õnnestu kindlaks teha, kas kopeerimine õnnestus.",
-       "api-error-mustbeloggedin": "Failide üleslaadimiseks pead sisse logima.",
-       "api-error-mustbeposted": "Sisetõrge: Päring tuleb sooritada, kasutades HTTP POST-meetodit.",
-       "api-error-noimageinfo": "Üleslaadimine õnnestus, aga server ei andnud faili kohta mingit teavet.",
-       "api-error-nomodule": "Sisetõrge: Üleslaadimismoodul on määramata.",
-       "api-error-ok-but-empty": "Sisetõrge: Server ei vasta.",
-       "api-error-overwrite": "Olemasolevate failide ülekirjutamine pole lubatud.",
-       "api-error-stashfailed": "Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.",
        "api-error-publishfailed": "Sisetõrge: Serveril ebaõnnestus ajutise faili avaldamine.",
-       "api-error-stasherror": "Selle faili hoidlasse üleslaadimisel ilmnes tõrge.",
-       "api-error-stashedfilenotfound": "Algses hoidlas talletatud faili ei leitud, kui seda sealt üles püüti laadida.",
-       "api-error-stashpathinvalid": "Failitee, kus algse hoidla fail pidanuks leiduma, oli vigane.",
-       "api-error-stashfilestorage": "Faili algsesse hoidlasse talletamisel esines tõrge.",
-       "api-error-stashzerolength": "Server ei saanud faili algses hoidlas talletada, sest fail on tühi.",
-       "api-error-stashnotloggedin": "Pead olema sisse logitud, et salvestada faile üleslaadimise algsesse hoidlasse.",
-       "api-error-stashwrongowner": "Fail, mille juurde algses hoidlas üritasid pääseda, ei kuulu sulle.",
-       "api-error-stashnosuchfilekey": "Failivõtit, mille juurde algses hoidlas üritasid pääseda, pole olemas.",
-       "api-error-timeout": "Server ei vastanud oodatud aja sees.",
-       "api-error-unclassified": "Ilmnes teadmata tõrge.",
-       "api-error-unknown-code": "Teadmata tõrge: \"$1\"",
-       "api-error-unknown-error": "Sisetõrge: Sellal kui sinu faili üritati üles laadida, läks midagi valesti.",
+       "api-error-stashfailed": "Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.",
        "api-error-unknown-warning": "Teadmata hoiatus: $1",
        "api-error-unknownerror": "Tundmatu tõrge: \"$1\".",
-       "api-error-uploaddisabled": "Üleslaadimine on selles vikis keelatud.",
-       "api-error-verification-error": "See fail võib olla rikutud või vale laiendiga.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekundit}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minutit}}",
        "duration-hours": "$1 {{PLURAL:$1|tund|tundi}}",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
+       "mw-widgets-categoryselector-add-category-placeholder": "Lisa kategooria...",
+       "sessionprovider-generic": "klassi $1 seansse",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "küpsisepõhiseid seansse",
        "randomrootpage": "Juhuslik juurlehekülg",
        "log-action-filter-block": "Blokeeringu tüüp:",
+       "log-action-filter-contentmodel": "Sisumudeli muudatuse tüüp:",
+       "log-action-filter-delete": "Kustutamise tüüp:",
+       "log-action-filter-import": "Impordi tüüp:",
+       "log-action-filter-managetags": "Märgiste haldamistegevuse tüüp:",
+       "log-action-filter-move": "Teisaldamise tüüp:",
+       "log-action-filter-newusers": "Konto loomise tüüp:",
+       "log-action-filter-patrol": "Kontrolli tüüp:",
+       "log-action-filter-protect": "Kaitsmise tüüp:",
+       "log-action-filter-rights": "Õiguste muudatuse tüüp:",
+       "log-action-filter-suppress": "Varjamise tüüp:",
+       "log-action-filter-upload": "Üleslaadimise tüüp:",
        "log-action-filter-all": "Kõik",
        "log-action-filter-block-block": "Blokeerimine",
        "log-action-filter-block-reblock": "Blokeeringu muutmine",
        "log-action-filter-block-unblock": "Blokeeringu tühistamine",
+       "log-action-filter-contentmodel-change": "Sisumudeli muudatus",
+       "log-action-filter-contentmodel-new": "Vaikeväärtusest erineva sisumudeliga lehekülje loomine",
+       "log-action-filter-delete-delete": "Lehekülje kustutamine",
+       "log-action-filter-delete-delete_redir": "Ümbersuunamise ülekirjutamine",
+       "log-action-filter-delete-restore": "Lehekülje taastamine",
+       "log-action-filter-delete-event": "Logi kustutamine",
+       "log-action-filter-delete-revision": "Redaktsiooni kustutamine",
+       "log-action-filter-import-interwiki": "Vikidevaheline import",
+       "log-action-filter-import-upload": "XML-faili üleslaadimisega import",
+       "log-action-filter-managetags-create": "Märgise koostamine",
+       "log-action-filter-managetags-delete": "Märgise kustutamine",
+       "log-action-filter-managetags-activate": "Märgise lubamine",
+       "log-action-filter-managetags-deactivate": "Märgise keelamine",
+       "log-action-filter-move-move": "Teisaldamine ümbersuunamise ülekirjutamiseta",
+       "log-action-filter-move-move_redir": "Teisaldamine ümbersuunamise ülekirjutamisega",
+       "log-action-filter-newusers-create": "Loonud anonüümne kasutaja",
+       "log-action-filter-newusers-create2": "Loonud registreeritud kasutaja",
+       "log-action-filter-newusers-autocreate": "Loodud automaatselt",
+       "log-action-filter-newusers-byemail": "Loodud e-kirjatsi saadetud parooliga",
+       "log-action-filter-patrol-patrol": "Kontrollitud käsitsi",
+       "log-action-filter-patrol-autopatrol": "Kontrollitud automaatselt",
+       "log-action-filter-protect-protect": "Kaitsmine",
+       "log-action-filter-protect-modify": "Kaitse muutmine",
+       "log-action-filter-protect-unprotect": "Kaitse eemaldamine",
+       "log-action-filter-protect-move_prot": "Kaitse teisaldamine",
+       "log-action-filter-rights-rights": "Muudetud käsitsi",
+       "log-action-filter-rights-autopromote": "Muudetud automaatselt",
+       "log-action-filter-suppress-event": "Logi varjamine",
+       "log-action-filter-suppress-revision": "Redaktsiooni varjamine",
+       "log-action-filter-suppress-delete": "Lehekülje varjamine",
+       "log-action-filter-suppress-block": "Kasutaja varjamine blokeerimise teel",
+       "log-action-filter-suppress-reblock": "Kasutaja varjamine taasblokeerimise teel",
+       "log-action-filter-upload-upload": "Uus üleslaadimine",
+       "log-action-filter-upload-overwrite": "Uuesti üleslaadimine",
        "authmanager-provider-password": "Paroolipõhine autentimine",
        "authmanager-provider-password-domain": "Parooli- ja domeenipõhine autentimine",
        "authmanager-provider-temporarypassword": "Ajutine parool",
        "userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad.",
        "restrictionsfield-badip": "Vigane IP-aadress või -aadressivahemik: $1",
        "restrictionsfield-label": "Lubatud IP-aadressivahemikud:",
-       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta süntaksit <br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Tõrge: $1",
-       "edit-error-long": "Tõrked:\n\n$1"
+       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta järgmist süntaksit:<pre>0.0.0.0/0\n::/0</pre>"
 }
index 187d68c..f9eb200 100644 (file)
@@ -26,7 +26,8 @@
                        "Xð",
                        "Asierog",
                        "Matma Rex",
-                       "Gorkaazk"
+                       "Gorkaazk",
+                       "Vriullop"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
@@ -46,7 +47,7 @@
        "tog-watchdeletion": "Ezabatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
        "tog-watchuploads": "Gehitu igotzen ditudan fitxategiak nire jarraipen zerrendara",
        "tog-watchrollback": "Nire jarraipen zerrendan rollbacka egin dudan orrialdeak erakutsi",
-       "tog-minordefault": "Lehenetsi bezala aldaketa txiki bezala markatu guztiak",
+       "tog-minordefault": "Aukera lehenetsitzat, markatu aldaketa guztiak txikitzat",
        "tog-previewontop": "Aurrebista aldaketa koadroaren aurretik erakutsi",
        "tog-previewonfirst": "Lehen aldaketan aurrebista erakutsi",
        "tog-enotifwatchlistpages": "Bidal iezadazue e-posta bat, jarraitzen ari naizen orrialde edo fitxategi bat aldatzen denean",
        "subcategories": "Azpikategoriak",
        "category-media-header": "Media \"$1\" kategorian",
        "category-empty": "''Kategoria honek ez dauka artikulurik uneotan.''",
-       "hidden-categories": "{{PLURAL:$1|Izkutuko kategoria|Izkutuko kategoriak}}",
+       "hidden-categories": "{{PLURAL:$1|Ezkutuko kategoria|Ezkutuko kategoriak}}",
        "hidden-category-category": "Kategoria ezkutuak",
        "category-subcat-count": "{{PLURAL:$2|Kategoria honek beste honako azpikategoria baino ez du.|Kategoria honek honako {{PLURAL:$1|azpikategoria du|$1 azpikategoriak ditu}}, guztira dauden $2tik.}}",
        "category-subcat-count-limited": "Kategoria honek {{PLURAL:$1|azpikategoria hau du|$1 azpikategoria hauek ditu}}.",
        "searcharticle": "Joan",
        "history": "Orriaren historia",
        "history_short": "Historia",
+       "history_small": "historia",
        "updatedmarker": "nire azkeneko bisitaz geroztik eguneratuta",
        "printableversion": "Inprimatzeko bertsioa",
        "permalink": "Lotura finkoa",
        "views": "Ikustaldiak",
        "toolbox": "Tresnak",
        "tool-link-userrights": "Erabiltzaile {{GENDER:$1|taldea}} aldatu",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Erabiltzailearen}} taldeak  ikusi",
        "tool-link-emailuser": "{{GENDER:$1|Erabiltzale}} honi e-posta bidali",
        "userpage": "Lankide orrialdea ikusi",
        "projectpage": "Proiektuaren orrialdea ikusi",
        "virus-scanfailed": "eskaneatze txarra ($1 kodea)",
        "virus-unknownscanner": "antibirus ezezaguna:",
        "logouttext": "'''Saioa itxi egin duzu.'''\n\nJakin ezazu hainbat orrialdetan ager daitekela oraindik saioa ez duzula itxi, zure nabigatzailearen katxea garbitzen ez duzun arte.",
+       "cannotlogoutnow-title": "Ezin da saioa itxi orain",
+       "cannotlogoutnow-text": "Saioa ezin da itxi $1 erabiltzean.",
        "welcomeuser": "Ongi etorri, $1!",
        "welcomecreation-msg": "Zure kontua sortua izan da.\nEz ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.",
        "yourname": "Erabiltzaile izena",
        "createacct-yourpasswordagain-ph": "Sartu pasahitza berriro ere",
        "userlogin-remembermypassword": "Manten nazazu barruan",
        "userlogin-signwithsecure": "Erabili konexio ziurra",
+       "cannotlogin-title": "Ezin da saioa hasi",
+       "cannotlogin-text": "Saioa hastea ez da posible izan.",
+       "cannotloginnow-title": "Ezin da saioa hasi orain",
+       "cannotloginnow-text": "Saioa ezin da hasi $1 erabiltzean.",
+       "cannotcreateaccount-title": "Kontuak ezin dira sortu",
        "yourdomainname": "Zure domeinua",
        "password-change-forbidden": "Ezin duzu pasahitzarik aldatu wiki honetan.",
        "externaldberror": "Kanpoko datu-base autentifikazio errorea gertatu da edo ez duzu zure kanpo kontua eguneratzeko baimenik.",
-       "login": "Saioa hasi",
-       "nav-login-createaccount": "Saioa hasi / kontua sortu",
+       "login": "Hasi saioa",
+       "login-security": "Zure nortasuna egiaztatu",
+       "nav-login-createaccount": "Hasi saioa / sortu kontua",
        "userlogin": "Saioa hasi / kontua sortu",
        "userloginnocreate": "Hasi saioa",
        "logout": "Saioa itxi",
        "nologinlink": "Kontua sortu",
        "createaccount": "Kontua sortu",
        "gotaccount": "Baduzu erabiltzaile kontua? '''$1'''.",
-       "gotaccountlink": "Saioa hasi",
+       "gotaccountlink": "Hasi saioa",
        "userlogin-resetlink": "Saioa hasteko datuak ahaztu dituzu?",
        "userlogin-resetpassword-link": "Zure pasahitza ahaztu duzu?",
        "userlogin-helplink2": "Saioa hasteko laguntza",
        "passwordreset-emaildisabled": "E-posta aukerak ez daude eskuragarri wiki honetan.",
        "passwordreset-username": "Lankide izena:",
        "passwordreset-domain": "Domeinua:",
-       "passwordreset-capture": "Bidaliko den e-posta ikusi nahi?",
-       "passwordreset-capture-help": "Kutxa hau hautatzen baduzu behin-behineko pasahitza duen e-posta erakutsiko zatzaizu, eta erabiltzaileari bidaliko zaio.",
        "passwordreset-email": "E-mail helbidea:",
        "passwordreset-emailtitle": "{{SITENAME}}-rako kontuaren xehetasunak",
        "passwordreset-emailelement": "Erabiltzaile izena: \n$1\n\nBehin-behineko pasahitza: \n$2",
        "saveprefs": "Gorde",
        "restoreprefs": "Konfigurazio lehenetsi guztiak berrezarri (sekzio guztietan)",
        "prefs-editing": "Aldatzen",
-       "rows": "Lerroak:",
-       "columns": "Zutabeak:",
        "searchresultshead": "Bilaketa",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> formaturako atalasea ($1):",
        "stub-threshold-sample-link": "adibidea",
        "prefs-help-recentchangescount": "Honek azken aldaketak, orrialdeen historiak eta logak barne-biltzen ditu.",
        "prefs-help-watchlist-token2": "Hau da zure jarraipen zerrendako web jarioaren giltza sekretua.\nEzagutzen duen orok zure jarraipen zerrenda irakurtzeko aukera izango du, ez partekatu.\n[[Special:ResetTokens|Klik egin hemen berrezarri behar baduzu]]",
        "savedprefs": "Zure hobespenak gorde egin dira.",
-       "savedrights": "{{GENDER:$1|$1}} erabiltzailearen eskubideak gorde dira.",
+       "savedrights": "{{GENDER:$1|$1}} erabiltzailearen taldeak gorde dira.",
        "timezonelegend": "Ordu-eremua:",
        "localtime": "Ordu lokala:",
        "timezoneuseserverdefault": "Erabili lehenetsitako wikia ($1)",
        "prefs-help-prefershttps": "Hobespen hauek eragina izango dute sartzen zaren hurrengoan.",
        "prefs-tabs-navigation-hint": "Gomendioa: Fitxen zerrendan nabigatzeko ezker eta eskuin geziak erabil ditzakezu.",
        "userrights": "Erabiltzaile baimenen kudeaketa",
-       "userrights-lookup-user": "Erabiltzaile taldeak kudeatu",
+       "userrights-lookup-user": "Erabiltzailea aukeratu",
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
-       "editusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak editatu",
-       "editinguser": "'''[[User:$1|$1]]''' $2 lankidearen erabiltzaile-eskubideak aldatzen",
-       "userrights-editusergroup": "Erabiltzaile taldeak editatu",
+       "editusergroup": "Erabiltzaile taldeak kargatu",
+       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|lankidearen}} erabiltzaile-eskubideak aldatzen",
+       "userrights-editusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak editatu",
        "saveusergroups": "Erabiltzaile {{GENDER:$1|taldeak}} gorde",
        "userrights-groupsmember": "Ondorengo talde honetako kide da:",
        "userrights-groupsmember-auto": "Honen kide inplizitua:",
-       "userrights-groups-help": "Lankide hau zein taldetakoa den alda dezakezu:\n* Laukia hautatuta baldin badago, esan nahi du lankidea talde horretakoa dela.\n* Laukia hautatu gabe baldin badago, esan nahi du lankidea talde horretakoa ez dela.\n* Izartxoak (*) erakusten du ezin duzula talde horretatik kendu, taldera gehitu eta gero; edo alderantziz, ezin duzula talde horretara gehitu, taldetik kendu eta gero.",
+       "userrights-groups-help": "Lankide hau zein taldetakoa den alda dezakezu:\n* Laukia hautatuta baldin badago, esan nahi du lankidea talde horretakoa dela.\n* Laukia hautatu gabe baldin badago, esan nahi du lankidea talde horretakoa ez dela.\n* Izartxoak (*) erakusten du ezin duzula talde horretatik kendu, taldera gehitu eta gero; edo alderantziz, ezin duzula talde horretara gehitu, taldetik kendu eta gero.\n* Traolak (#) erakusten du taldearen iraungipen data luzatu egin dezakezula soilik; ez ordea aurreratu.",
        "userrights-reason": "Arrazoia:",
        "userrights-no-interwiki": "Ez duzu beste wikietan erabiltzaile eskumenak aldatzeko baimenik.",
        "userrights-nodatabase": "$1 datubasea ez da existitzen edo ez dago lokalki.",
-       "userrights-nologin": "Administratzaile kontu batekin [[Special:UserLogin|hasi behar duzu saioa]] erabiltzaile eskubideak esleitzeko.",
-       "userrights-notallowed": "Zure kontuak ez du baimenik erabiltzaile eskumenak aldatzeko.",
        "userrights-changeable-col": "Alda ditzakezun taldeak",
        "userrights-unchangeable-col": "Aldatu ezin ditzakezun taldeak",
        "userrights-conflict": "Gatazka gertatu da erabiltzaile eskubideak aldatzean. Mesedez, berrikusi eta baieztatu zure aldaketak.",
-       "userrights-removed-self": "Zure eskumenak kendu dituzu. Beraz jada ezin duzu orrialde hau gehiago ikusi.",
        "group": "Taldea:",
        "group-user": "Erabiltzaileak",
        "group-autoconfirmed": "Lankide autokonfirmatuak",
        "right-siteadmin": "Blokeatu eta desblokeatu datu basea blokeatu",
        "right-override-export-depth": "5eko sakonerararteko loturiko orrialdeak barne esportatu",
        "right-sendemail": "Beste erabiltzaileei e-posta bidali",
-       "right-passwordreset": "Ikusi pasahitza berrezartze e-postak",
        "grant-group-email": "E-posta bidali",
        "grant-createaccount": "Kontuak sortu",
        "grant-editmycssjs": "Zure CSS/JavaScript aldatu",
        "action-upload_by_url": "URL helbide batetik fitxategi hau igo",
        "action-writeapi": "idazteko APIa erabili",
        "action-delete": "orrialde hau ezabatu",
-       "action-deleterevision": "berrikuspen hau ezabatu",
-       "action-deletedhistory": "ikusi orri honen historia ezabatua",
+       "action-deleterevision": "berrikuspenak ezabatu",
+       "action-deletedhistory": "ikusi orri baten historia ezabatua",
        "action-browsearchive": "ezabatutako orrialdeak bilatu",
-       "action-undelete": "ezabatutako orrialde hau bergaitu",
-       "action-suppressrevision": "izkutuko berrikuspen hau berrikusi eta gaitu",
+       "action-undelete": "Orrialdeak birgaitu",
+       "action-suppressrevision": "Ezkutuko berrikuspenak berrikusi eta birgaitu",
        "action-suppressionlog": "log pribatu hau ikusi",
        "action-block": "lankide honi aldaketak egitea ekidin",
        "action-protect": "orrialde honetako babes mailak aldatu",
        "recentchanges-legend-heading": "<strong>Azalpenak:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "recentchanges-submit": "Erakutsi",
-       "rcnotefrom": "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
+       "rcfilters-filterlist-title": "Iragazkiak",
+       "rcfilters-filtergroup-authorship": "Edizioaren egiletza",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-minor-label": "Aldaketa txikiak",
+       "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",
        "rcshowhideminor-show": "Erakutsi",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametroaren izena",
        "apisandbox-dynamic-error-exists": "$1 parametro izena dagoeneko existitzen da",
        "apisandbox-results": "Emaitzak",
+       "apisandbox-continue": "Jarraitu",
+       "apisandbox-continue-clear": "Garbitu",
        "booksources": "Iturri liburuak",
        "booksources-search-legend": "Liburuen bilaketa",
        "booksources-search": "Bilatu",
        "emailccsubject": "Zure mezuaren kopia $1(r)i: $2",
        "emailsent": "Mezua bidali egin da",
        "emailsenttext": "Zure e-posta mezua bidali egin da.",
-       "emailuserfooter": "E-posta hau $1(e)k {{GENDER:$1|bidali}} dio {{GENDER:$2|$2}}(r)i {{SITENAME}}ko \"{{int:emailuser}}\" funtzioa erabiliz.",
+       "emailuserfooter": "E-posta hau $1(e)k {{GENDER:$1|bidali}} dio {{GENDER:$2|$2}}(r)i {{SITENAME}}ko \"{{int:emailuser}}\" funtzioa erabiliz. Email honi erantzuten {{GENDER:$2|badiozu}}, zure emaila zuzenean jatorrizko {{GENDER:$1|igorleari}} bidaliko zaio eta {{GENDER:$1|harentzat}} {{GENDER:$2|zure}} email helbidea ikusgai geratuko da.",
        "usermessage-summary": "Sistema mezua uzten.",
        "usermessage-editor": "Sistemako mezularia",
        "watchlist": "Jarraipen zerrenda",
        "addedwatchtext": "\"[[:$1]]\" eta haren eztabaida orria zure [[Special:Watchlist|jarraipen zerrendara]] erantsi da. \n\nOrri honetan aurrerantzean egindako aldaketak zerrenda horretan agertuko dira.",
        "addedwatchtext-short": "$1 orria zure jarraipen zerrendara gehitu da.",
        "removewatch": "Kendu zure jarraipen zerrendatik",
-       "removedwatchtext": "\"[[:$1]]\" orrialdea zure [[Special:Watchlist|jarraipen zerrendatik]] kendu da.",
+       "removedwatchtext": "\"[[:$1]]\" eta haren eztabaida orrialdea zure [[Special:Watchlist|jarraipen zerrendatik]] kendu da.",
        "removedwatchtext-short": "$1 orria zure jarraipen zerrendatik ezabatu da.",
        "watch": "Jarraitu",
        "watchthispage": "Orrialde hau jarraitu",
        "enotif_body_intro_deleted": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|ezabatu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3.",
        "enotif_body_intro_created": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|sortu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
        "enotif_body_intro_moved": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|mugitu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
-       "enotif_body_intro_restored": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|berrezarri}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
+       "enotif_body_intro_restored": "{{SITENAME}} guneko «$1» orria {{GENDER:$2|lehengoratu}} du $2 administratzaileak $PAGEEDITDATE datan. Oraingo bertsioa ikusteko, zoaz helbide honetara: $3.",
        "enotif_body_intro_changed": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|aldatu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
        "enotif_lastvisited": "Ikus «$1» zure azken bisitaz geroztik izandako aldaketa guztiak ikusteko.",
        "enotif_lastdiff": "Jo $1(e)ra aldaketa hau ikusteko.",
        "sp-contributions-newbies-title": "Lankideen ekarpenak lankide berrietn",
        "sp-contributions-blocklog": "Blokeaketa erregistroa",
        "sp-contributions-suppresslog": "{{GENDER:$1|(r)en}} lankide-ekarpen ezabatuak",
-       "sp-contributions-deleted": "lankide-ekarpen ezabatuak",
+       "sp-contributions-deleted": "{{GENDER:$1|lankide}}-ekarpen ezabatuak",
        "sp-contributions-uploads": "igoerak",
        "sp-contributions-logs": "erregistroak",
        "sp-contributions-talk": "eztabaida",
        "previousdiff": "← Aldaketa zaharragoa",
        "nextdiff": "Aldaketa berriagoa →",
        "mediawarning": "'''Oharra''': Fitxategi honek kode mingarria izan lezake.\nZure sisteman exekutatzea arriskutsua izan liteke.",
-       "imagemaxsize": "Irudiaren tamainaren muga:<br />''(fitxategi deskribapen-orrietarako)''",
+       "imagemaxsize": "Irudiaren tamainaren muga:<br />''(fitxategia deskribatzen duten orrietarako)''",
        "thumbsize": "Irudi txikiaren tamaina:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|orri|orri}}",
        "file-info": "fitxategiaren tamaina: $1, MIME mota: $2",
        "confirm-unwatch-button": "Ados",
        "confirm-unwatch-top": "Orrialde hau zure jarraipen-zerrendatik kendu?",
        "confirm-rollback-button": "Ados",
+       "word-separator": "&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "&larr; aurreko orrialdea",
        "imgmultipagenext": "hurrengo orrialdea &rarr;",
        "specialpages-note": "* Orri berezi arruntak.\n* <strong class=\"mw-specialpagerestricted\">Mugatutako orri bereziak.</strong>",
        "specialpages-group-maintenance": "Mantentze-oharrak",
        "specialpages-group-other": "Beste orri berezi batzuk",
-       "specialpages-group-login": "Saioa hasi / kontua sortu",
+       "specialpages-group-login": "Hasi saioa / sortu kontua",
        "specialpages-group-changes": "Aldaketa berriak eta erregistroak",
        "specialpages-group-media": "Artxiboen orriak",
        "specialpages-group-users": "Erabiltzaileak eta eskumenak",
        "htmlform-user-not-exists": "<strong>$1</strong> ez da existitzen.",
        "htmlform-user-not-valid": "<strong>$1</strong> erabiltzaile izena ezin da erabili.",
        "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du",
-       "logentry-delete-restore": "$1(e)k $3 orrialdea {{GENDER:$2|berrezarri}} du",
+       "logentry-delete-restore": "$1 administratzaileak «$3» orria {{GENDER:$2|lehengoratu}} du",
        "logentry-delete-event": "$1 wikilariak ikusgaitasuna {{{{GENDER:$2|}}|aldatu}} {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4",
        "logentry-delete-revision": "$1 erabiltzaileak {{PLURAL:$5|berrikuste baten|$5 berrikusteren}} ikusgaitasuna aldatu du «$3» orrian: $4",
        "logentry-suppress-delete": "$1 erabiltzaileak $3 orrialdea {{GENDER:$2|ezabatu}} du",
        "logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
        "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua 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}}",
        "log-name-tag": "Etiketen erregistroa",
        "rightsnone": "(bat ere ez)",
        "feedback-subject": "Gaia:",
        "feedback-submit": "Bidali",
        "feedback-thanks-title": "Eskerrik asko!",
-       "searchsuggest-search": "Bilatu",
+       "searchsuggest-search": "{{SITENAME}} wikian bilatu",
        "searchsuggest-containing": "edukian...",
-       "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "api-error-badtoken": "Barne akatsa: token okerra.",
-       "api-error-empty-file": "Bidali duzun fitxategia hutsik dago.",
        "api-error-emptypage": "Berria sortzerako garaian orrialde hutsak ezin dira erabili.",
-       "api-error-fetchfileerror": "Barne akatsa: zerbait gaizki joan da fitxategia eskuratzerakoan.",
-       "api-error-file-too-large": "Bidali duzun fitxategia handiegia zen.",
-       "api-error-filename-tooshort": "Fitxategiaren izena laburregia da.",
-       "api-error-filetype-banned": "Mota horretako fitxategiak debekatuta daude.",
-       "api-error-filetype-missing": "Fitxategiak ez zuen luzapenik.",
-       "api-error-http": "Barne-errorea: Ezin da zerbitzariarekin konektatu.",
-       "api-error-illegal-filename": "Fitxategiaren izena ez da onartzen.",
-       "api-error-internal-error": "Barne-errorea: Zerbaitek huts egin du zuk wikira igotakoa prozesatzean.",
-       "api-error-invalid-file-key": "Barne-errorea: Ez da fitxategia aurkitu aldi baterako biltegian.",
-       "api-error-missingparam": "Barne-errorea: Parametroak falta dira eskaeran.",
-       "api-error-missingresult": "Barne-errorea: Ezin da zehaztu kopia ondo burutu den ala ez.",
-       "api-error-mustbeloggedin": "Fitxategiak igotzeko izena emanda eduki behar duzu.",
-       "api-error-mustbeposted": "Barne arazoa: HTTP POST beharrezkoa da.",
-       "api-error-noimageinfo": "Igoera ondo egin da, baina zerbitzariak ez digu informaziorik eman zerbitzariaren inguruan.",
-       "api-error-nomodule": "Barne arazoa: igoera modulurik ez dago.",
-       "api-error-ok-but-empty": "Barne arazoa: zerbitzariaren erantzunik ez.",
-       "api-error-overwrite": "Existitzen den fitxategi bat gain-idaztea ez da posible.",
-       "api-error-stashfailed": "Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde",
        "api-error-publishfailed": "Barne-errorea: Zerbitzariak ezin izan du aldi baterako fitxategia gorde.",
-       "api-error-timeout": "Zerbitzariak ez du erantzun espero zitekeen denboran.",
-       "api-error-unclassified": "Ezezaguna den errorea gertatu da.",
-       "api-error-unknown-code": "Akats ezezaguna: \"$1\".",
-       "api-error-unknown-error": "Barne arazoa: fitxategia igotzen saiatzerakoan zerbait gaizki egon da.",
+       "api-error-stashfailed": "Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde",
        "api-error-unknown-warning": "Ohartarazpen ezezaguna: \"$1\".",
        "api-error-unknownerror": "Akats ezezaguna: \"$1\".",
-       "api-error-uploaddisabled": "Wiki honetan ezin dira igoerak egin.",
-       "api-error-verification-error": "Fitxategia ustela izan daiteke, edo fitxategi luzapen ez egokia du.",
        "duration-seconds": "{{PLURAL:$1|Segundu $1|$1 segundu}}",
        "duration-minutes": "{{PLURAL:$1|Minutu $1|$1 minutu}}",
        "duration-hours": "{{PLURAL:$1|Ordu $1|$1 ordu}}",
index 486fc28..1953747 100644 (file)
        "moredotdotdot": "Mas...",
        "morenotlisted": "Esta lista nu está completa",
        "mypage": "Páhina",
-       "mytalk": "La mi caraba",
+       "mytalk": "Caraba",
        "anontalk": "La mi caraba",
        "navigation": "Güiquipeandu",
        "and": "&#32;i",
        "virus-scanfailed": "marru al escrucal virus (cóigu $1)",
        "virus-unknownscanner": "Antivirus andarriu:",
        "logouttext": "'''Cuenta afechá corretamenti.'''<br />\nPueis acontinal gastandu {{SITENAME}} de holma anónima, u <span class='plainlinks'>[$1 entral ena tu cuenta]</span> con el mesmu ussuáriu, u con otru.\nDati cuenta que hata que nu esborris el caché del tu escrucaol pué paecel que la tu cuenta acontina abierta n'angunas páginas.",
-       "yourname": "Nombri d'usuáriu:",
+       "yourname": "Nombri dusuáriu:",
        "yourpassword": "Consínia:",
        "yourpasswordagain": "Escrebi e nuevu la consínia:",
        "yourdomainname": "El tu domiñu:",
        "usercssyoucanpreview": "'''Consehu:''' Gasta el botón 'Previsoreal' pa prebal el tu nuevu CSS enantis d´emburacal.",
        "userjsyoucanpreview": "'''Consehu:''' Gasta el botón 'Previsoreal' pa prebal el tu nuevu JS enantis d´emburacal.",
        "usercsspreview": "'''Alcuerdati que solu estás previsoreandu el tu CSS d'usuáriu.'''\n'''Entovia nu está emburacau!'''",
-       "userjspreview": "'''Recuerda que solu estás prebandu/previsoreandu el tu JavaScript d´usuáriu, entovia nu está emburacau!'''",
+       "userjspreview": "<strong>Recuerda que solu estás prebandu/previsoreandu el tu JavaScript d’usuáriu.\nEntovia nu está emburacau!</strong>",
        "userinvalidcssjstitle": "'''Avisu:''' Nu desisti el skin \"$1\". Alcuerdati que las páhinas presonalizás .css i .js tienin el su entítulu en menúsculas, p.s. {{ns:user}}:Foo/vector.css en lugal de {{ns:user}}:Foo/Vector.css.",
        "updated": "(Atualizau)",
        "note": "'''Nota:'''",
        "template-protected": "(protehiu)",
        "template-semiprotected": "(abati-protehiu)",
        "hiddencategories": "Esta páhina preteneci a {{PLURAL:$1|1 categoria açonchá|$1 categorias açonchás}}:",
-       "edittools": "<!-- Esti testu apaicirá embahu los hormulárius d´eición i empuntu. -->",
+       "edittools": "<!-- Esti testu apaicirá embahu los hormulárius deición i empuntu. -->",
        "nocreatetext": "Nu se premiti crial páhinas nuevas a usuárius anónimus.\nPueis gorvel i eital anguna páhina ya desistenti, u [[Special:UserLogin|rustrilti]].",
        "nocreate-loggedin": "Nu tiés premissu pa crial nuevas páginas.",
        "permissionserrors": "Marrus colos premisus",
        "edit-conflict": "Marru d'eición.",
        "edit-no-change": "La eición nu á siu emburacá, ebiu a que nu s'á hechu dengún chambu nel testu.",
        "edit-already-exists": "Marru al crial la nueva página.\nYa dessisti.",
-       "undo-success": "Se puei eshazel la eición. Enantis d´eshazel la eición, compreba la siguienti comparáncia pa verifical que realmenti es lo que quieis hazel, i altonci, emburaqui los chambus pa, d´esta horma, eshazel la eición.",
+       "undo-success": "Se puei eshazel la eición. Enantis d’eshazel la eición, compreba la siguienti comparáncia pa verifical que realmenti es lo que quieis hazel, i altonci, emburaqui los chambus pa, d’esta horma, eshazel la eición.",
        "undo-failure": "Nu es posibri eshazel la eición ebiu a que otru usuáriu á realizau una eición entelmeya.",
        "undo-norev": "La eición nu pué sel eshecha ebiu a que nu dessisti, u hue esborrá",
        "undo-summary": "Eshazel revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]])",
        "cantcreateaccount-text": "La criación de cuentas pol parti e la IP ('''$1''') á siu pará pol el usuáriu [[User:$3|$3]].\n\nLa razón dá pol $3 es ''$2''",
        "viewpagelogs": "Vel los rustrihus d’esta páhina",
-       "nohistory": "Nu ai dengún estorial d´eicionis pa esta páhina.",
+       "nohistory": "Nu ai dengún estorial deicionis pa esta páhina.",
        "currentrev": "Revisión atual",
        "currentrev-asof": "Úrtima revisión: $1",
        "revisionasof": "Revisión de $1",
        "history-feed-item-nocomment": "$1 en $2",
        "history-feed-empty": "Esa páhina nu desisti.\nEs posibri qu’aiga siu esborrá e la güiqui, u que s’aiga chambau el su nombri.\nPreba [[Special:Search|landeandu]] entri las nuevas páhinas de la güiqui.",
        "rev-deleted-comment": "(comentáriu esborrau)",
-       "rev-deleted-user": "(nombri d´usuáriu esborrau)",
+       "rev-deleted-user": "(nombri dusuáriu esborrau)",
        "rev-deleted-event": "(entrá esborrá)",
        "rev-deleted-text-permission": "La revisión desta página á siu '''esborrá'''.\nEs possibri que aiga detallis nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rustriju d'esborrau].",
        "rev-deleted-text-view": "Esta revisión de la páhina á siu '''esborrá'''.\nCumu alministraol pueis echali una guipaina;\npuei bel detallis nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rustriju d'esborrau].",
        "search-external": "Landeu estelnu",
        "searchdisabled": "Los landeus en {{SITENAME}} están temporalmenti desativaus. Mentris tantu, pueis landeal meyanti landerus esternus, inque ten en cuenta que los sus éndicis concernientis a {{SITENAME}} puein nu estal atualizaus.",
        "preferences": "Preferéncias",
-       "mypreferences": "Las mis preferéncias",
+       "mypreferences": "Preferéncias",
        "prefs-edits": "Númiru d'eicionis:",
        "prefs-skin": "Aparéncia",
        "skin-preview": "Previsoreal",
        "prefs-resetpass": "Escambial consínia",
        "saveprefs": "Emburacal",
        "prefs-editing": "Eitandu",
-       "rows": "Filas:",
-       "columns": "Colunas:",
        "searchresultshead": "Landeal",
        "stub-threshold": "Arrayu superiol pa consieral cumu <a href=\"#\" class=\"stub\">atihu a prencipiu</a> (bytes):",
        "recentchangesdays": "Númeru e dias a muestral en \"úrtimus chambus\":",
        "prefs-custom-css": "CSS pressonalizau",
        "prefs-custom-js": "JS pressonalizau",
        "youremail": "Email:",
-       "username": "{{GENDER:$1|Nombri d'usuáriu|Nombri d'usuária}}:",
+       "username": "{{GENDER:$1|Nombri d’usuáriu|Nombri d’usuária}}:",
        "prefs-memberingroups": "Miembru de {{PLURAL:$1|grupu|groupus}}:",
        "yourrealname": "Nombri verdaeru:",
        "yourlanguage": "Palra:",
        "prefs-help-email-required": "Es mestel la direción email.",
        "userrights": "Alministral premisus d'usuárius",
        "userrights-lookup-user": "Alministral grupus d'usuárius",
-       "userrights-user-editname": "Escrebi un nombri d´usuáriu:",
+       "userrights-user-editname": "Escrebi un nombri dusuáriu:",
        "editusergroup": "Eital grupus d'usuárius",
        "editinguser": "Chambandu los derechus del usuáriu '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "userrights-editusergroup": "Eital grupus d'usuárius",
        "userrights-reason": "Razón:",
        "userrights-no-interwiki": "Nu tienis premisu pa eital los derechus los usuárius en otras güiquis.",
        "userrights-nodatabase": "La basi e datus $1 nu desisti, u nu es local.",
-       "userrights-nologin": "Ebis [[Special:UserLogin|rustrilti]] con una cuenta d'alministraol pa puel asinal derechus a los usuárius.",
-       "userrights-notallowed": "Nu tienis los permisus nesezárius p'asinal derechus a los usuárius.",
        "userrights-changeable-col": "Grupus que pueis chambal",
        "userrights-unchangeable-col": "Grupus que nu pueis chambal",
        "group": "Grupu:",
        "uploadnologin": "Nu estás rustriu",
        "uploadnologintext": "Ebis estal [[Special:UserLogin|rustriu]]\npa empuntal archivus.",
        "upload_directory_read_only": "Nu puei escrebilsi nel diretoriu d'empuntu ($1) el sirviol.",
-       "uploaderror": "Marru d´empuntu",
+       "uploaderror": "Marru dempuntu",
        "uploadtext": "Gasta el hormuláriu d'embahu pa empuntal archivus, pa vel u landeal imahin ya empuntás vaiti pala [[Special:FileList|lista d'archivus empuntaus]]. Tantu los archivus empuntaus cumu los esborraus se rustrin nel [[Special:Log/upload|rustrihu d'empuntu]].\n\nP'añiil la imahin nuna páhina, gasta el atihu el hormuláriu\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki>''' u\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' p'atihal diretamenti al archivu.",
        "upload-permitted": "Crasis d'archivus premitias: $1.",
        "upload-preferred": "Crasis d'archivus preferias: $1.",
        "filesource": "Coigu huenti:",
        "ignorewarning": "Inoral el avisihu i emburacal el achivu",
        "ignorewarnings": "Inoral tolos avisihus",
-       "minlength1": "Los nombris d´archivus ebin tenel al menus una letra.",
+       "minlength1": "Los nombris darchivus ebin tenel al menus una letra.",
        "illegalfilename": "El nombri \"$1\" tiini carateris que nu están premitius enus entítulus de páhinas. Pol favol, ponli otru nombri al archivu i preba a empuntalu e nuevu.",
-       "badfilename": "S´á chambau el nombri el archivu a \"$1\".",
+       "badfilename": "S’á chambau el nombri el archivu a «$1».",
        "filetype-badmime": "Nu está premitiu empuntal los archivus MIME type \"$1\".",
        "filetype-unwanted-type": "'''\".$1\"''' es una crassi d'archivu nu deseá. {{PLURAL:$3|La crassi d'archivu preferia es|Las crassis d'archivus preferias son}} $2.",
        "filetype-banned-type": "'''\".$1\"''' nu es una crassi d'archivu premitia.\n{{PLURAL:$3|La crassi d'archivu premitia es|Las crassis d'archivus premitias son}} $2.",
        "fileexists-forbidden": "Ya dessisti un archivu con esti nombri, i nu es possibri sobriescribilu.\nSi entovia quieris empuntal el archivu, pol favol, güervi atrás i empuntalu con otru nombri. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ya dessisti un archivu con esti nombri nel repossitóriu d'archivus compartius;\nSi acontinas queriendu empuntal el archivu, vai alatrás i escambia el nombri el archivu.\n [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Esti archivu es un dupricau {{PLURAL:$1|el siguienti archivu|los siguientis archivus}}:",
-       "uploadwarning": "Avisu d´empuntu",
+       "uploadwarning": "Avisu dempuntu",
        "savefile": "Emburacal archivu",
        "uploaddisabled": "Empuntus desativaus",
        "uploaddisabledtext": "El empuntu d'archivus está desativau.",
        "listfiles-summary": "Esta páhina especial muestra tolos archivus empuntaus.\nPol defetu los úrtimus archivus empuntaus se muestran ena parti arta la lista.\nPursa nel entítulu la coluna pa chambal el ordin.",
        "listfiles_search_for": "Landeal pol nombri la imahin:",
        "imgfile": "archivu",
-       "listfiles": "Lista d´archivus",
+       "listfiles": "Lista darchivus",
        "listfiles_date": "Fecha",
        "listfiles_name": "Nombri",
        "listfiles_user": "Usuáriu",
        "nolinkstoimage": "Nu ai denguna páhina qu’atihi a esti archivu.",
        "morelinkstoimage": "Guipal [[Special:WhatLinksHere/$1|mas atijus]] a esti archivu.",
        "sharedupload": "Esti archivu procei de $1 i puei gastalsi dendi otrus proyeutus.",
-       "uploadnewversion-linktext": "Empuntal una nueva velsión d´esti archivu",
+       "uploadnewversion-linktext": "Empuntal una nueva velsión desti archivu",
        "shared-repo-from": "dendi $1",
        "shared-repo": "un repossitóriu compartiu",
        "filerevert": "Revertil $1",
        "filedelete-intro-old": "Estás esborrandu la velsón de '''[[Media:$1|$1]]''' del [$4 $3 a las $2].",
        "filedelete-comment": "Razón:",
        "filedelete-submit": "Esborral",
-       "filedelete-success": "S´á esborrau '''$1'''.",
+       "filedelete-success": "S’á esborrau <strong>$1</strong>.",
        "filedelete-success-old": "Á siu esborrá la velsión de '''[[Media:$1|$1]]''' del $2 a las $3.</span>",
        "filedelete-nofile": "'''$1''' nu dessisti.",
        "filedelete-nofile-old": "Nu desisti una velsión archivá e '''$1''' con esas caraterísticas.",
        "statistics": "Estaísticas",
        "statistics-header-pages": "Estaísticas de la página",
        "statistics-header-edits": "Estaísticas d'eición",
-       "statistics-header-users": "Estaísticas d´usuáriu",
+       "statistics-header-users": "Estaísticas dusuáriu",
        "statistics-pages": "Páginas",
        "statistics-pages-desc": "Tolas páginas nel wiki, encruyendu carabas, redirecionis...",
        "statistics-files": "Archivus empuntaus",
        "listusers": "Lista d´usuárius",
        "usercreated": "Criá el $1 a las $2",
        "newpages": "Nuevas páhinas",
-       "newpages-username": "Nombri d´usuáriu:",
+       "newpages-username": "Nombri dusuáriu:",
        "ancientpages": "Páhinas mas antiguas",
        "move": "Movel",
        "movethispage": "Movel esta páhina",
        "linksearch-ok": "Landeal",
        "listusersfrom": "Muestral usuárius qu'esmiencin pol:",
        "listusers-submit": "Muestral",
-       "listusers-noresult": "Nu s´alcuentró dengún usuáriu.",
+       "listusers-noresult": "Nu salcuentró dengún usuáriu.",
        "listgrouprights": "Derechus del grupu d'usuárius",
        "listgrouprights-group": "Grupu",
        "listgrouprights-rights": "Derechus",
        "emailsent": "E-mail enviau",
        "emailsenttext": "Se á enviau el tu mensahi pol e-mail.",
        "watchlist": "La mi lista e seguimientu",
-       "mywatchlist": "La mi lista e seguimientu",
+       "mywatchlist": "Lista e seguimientu",
        "nowatchlist": "La tu lista e seguimientu está vacia.",
        "watchlistanontext": "Pa vel u eital las entrás ena tu lista e seguimientu es mestel $1.",
        "watchnologin": "Nu estás rustriu",
        "deletedtext": "S'á esborrau \"$1\" corretamenti.\nConsurta $2 pa vel los úrtimus esborraus.",
        "dellogpage": "Rustrihu d'esborrau",
        "dellogpagetext": "Embahu se muestra una lista colos úrtimus esborraus.",
-       "deletionlog": "rustrihu d´esborrau",
+       "deletionlog": "rustrihu desborrau",
        "reverted": "Revertiu a la úrtima revisión",
        "deletecomment": "Razón:",
        "deleteotherreason": "Otras razonis:",
        "rollback": "Revertil eicionis",
        "rollbacklink": "revertil",
        "rollbackfailed": "Marru revirtiendu",
-       "cantrollback": "Nu se puei eshazel la eición; el úrtimu colabutaol es el únicu autol d´esta páhina.",
+       "cantrollback": "Nu se puei eshazel la eición; el úrtimu colabutaol es el únicu autol desta páhina.",
        "alreadyrolled": "Nu es posibri revertil la úrtima eición de [[:$1]], hecha pol [[User:$2|$2]] ([[User talk:$2|Caraba]]); alguien ya á eitau u revertiu la páhina.\n\nLa úrtima eición á siu hecha pol [[User:$3|$3]] ([[User talk:$3|Caraba]]).",
        "editcomment": "La síntesis la eición hue: <em>$1</em>.",
        "revertpage": "Án siu revertias las eicionis de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]]); chambau a la úrtima velsión de [[User:$1|$1]]",
        "undeletedfiles": "{{PLURAL:$1|1 archivu|$1 archivus}} restauraus",
        "cannotundelete": "Marru arrecuperandu; es posibri qu´alguien ya aiga arrecuperau la páhina.",
        "undeletedpage": "'''S'á restaurau $1'''\n\nConsurta el [[Special:Log/delete|rustrihu d'esborrau]] pa visoreal los úrtimus esborraus i arrecuperacionis.",
-       "undelete-header": "Vaiti pal [[Special:Log/delete|rustrihu d´esborrau]] pa vel las úrtimas páhinas esborrás.",
+       "undelete-header": "Vaiti pal [[Special:Log/delete|rustrihu desborrau]] pa vel las úrtimas páhinas esborrás.",
        "undelete-search-box": "Landeal páhinas esborrás",
        "undelete-search-prefix": "Muestral páhinas qu´esmiencin pol:",
        "undelete-search-submit": "Landeal",
        "blanknamespace": "(Prencipal)",
        "contributions": "Endirguis {{GENDER:$1|el usuáriu|la usuária}}",
        "contributions-title": "Contribucionis del usuáriu a $1",
-       "mycontris": "Los mis endirguis",
+       "mycontris": "Endirguis",
        "contribsub2": "Pa $1 ($2)",
        "nocontribs": "Nu s'alcuentrun chambus con esus criterius.",
        "uctop": "(úrtimu chambu)",
        "sp-contributions-logs": "rustrijus",
        "sp-contributions-talk": "Caraba",
        "sp-contributions-search": "Landeal pol endirguis",
-       "sp-contributions-username": "IP u nombri d´usuáriu:",
+       "sp-contributions-username": "IP u nombri dusuáriu:",
        "sp-contributions-submit": "Landeal",
        "whatlinkshere": "Lo que atija aquina",
        "whatlinkshere-title": "Páhinas que atihan a $1",
        "blockip": "Atarugal usuáriu",
        "blockip-legend": "Atarugal usuáriu",
        "blockiptext": "Gasta el hormuláriu d'embahu p'atarugal el acesu duna IP u dun usuáriu.\nEstu solu ebi hazelsi pa evital el vandalismu, i dalcuerdu cola [[{{MediaWiki:Policy-url}}|póliça]].\nEscrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan siu vandalizás pol esti usuáriu).",
-       "ipaddressorusername": "IP u nombri d´usuáriu:",
+       "ipaddressorusername": "IP u nombri dusuáriu:",
        "ipbexpiry": "Acabiha:",
        "ipbreason": "Razón:",
-       "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d´otras páhinas...\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d´usuárius enacetabris",
+       "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d’otras páhinas\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d’usuárius enacetabris",
        "ipbcreateaccount": "Atarugal el criaeru e cuentas",
        "ipbemailban": "Atarugal al usuáriu envial emails",
        "ipbenableautoblock": "Atarugal autumáticamenti la direción IP gastá pol esti usuáriu, i cualisquiel IP posteriol endi la cual trati d'eital",
        "blockipsuccesstext": "La direción IP [[Special:Contributions/$1|$1]] á siu atarugá.\n<br />Consurta la [[Special:BlockList|lista d'IP atarugás]] pa visoreal los tarugus.",
        "ipb-edit-dropdown": "Eital las razonis el tarugu",
        "ipb-unblock-addr": "Desatarugal $1",
-       "ipb-unblock": "Desatarugal un nombri d´usuáriu u direción IP",
+       "ipb-unblock": "Desatarugal un nombri dusuáriu u direción IP",
        "ipb-blocklist": "Vel tarugus desistentis",
        "ipb-blocklist-contribs": "Contribucionis de $1",
        "unblockip": "Desatarugal usuáriu",
        "unblockiptext": "Gasta el hormulariu d'embahu pa restablecel el acesu d'escritura a una direción IP u a un nombri d'usuáriu previamenti atarugau.",
        "ipusubmit": "Esborral esti tarugu",
        "unblocked": "El usuáriu [[User:$1|$1]] á siu desatarugau",
-       "unblocked-id": "S´á esborrau el tarugu $1",
+       "unblocked-id": "Sá esborrau el tarugu $1",
        "ipblocklist": "Lista de IP i nombris d'usuárius atarugaus",
        "ipblocklist-legend": "Landeal a un usuáriu atarugau",
        "ipblocklist-submit": "Landeal",
        "createaccountblock": "criaeru e páhinas atarugau",
        "emailblock": "email atarugau",
        "ipblocklist-empty": "La lista e tarugus está vacia.",
-       "ipblocklist-no-results": "Esta direción IP/nombri d´usuáriu nu está atarugau.",
+       "ipblocklist-no-results": "Esta direción IP/nombri dusuáriu nu está atarugau.",
        "blocklink": "atarugal",
        "unblocklink": "desatarugal",
        "change-blocklink": "chambal tarugu",
        "locknoconfirm": "Nu as confirmau lo que te petaria hazel.",
        "lockdbsuccesssub": "Tarugu la basi e datus ativu",
        "unlockdbsuccesssub": "Esborrau el tarugu la basi e datus",
-       "lockdbsuccesstext": "La basi e datus á siu atarugá.\n<br />Alcuerdati d´[[Special:UnlockDB|esborral el tarugu]] cuandu aigas acabihau.",
+       "lockdbsuccesstext": "La basi e datus á siu atarugá.<br />\nAlcuerdati d’[[Special:UnlockDB|esborral el tarugu]] cuandu aigas acabihau.",
        "unlockdbsuccesstext": "S'á desatarugau la basi e datus.",
        "lockfilenotwritable": "El tarugu la basi e datus nu se puei sobriescribil. P'atarugual u desatarugal la basi e datus, esta ebi puel sel escrita pol sirviol web.",
        "databasenotlocked": "La basi e datus nu está atarugá.",
        "importnopages": "Nu ai páhinas pa emporteal.",
        "importfailed": "Marru al emporteal: $1",
        "importcantopen": "Nu se puei abril el archivu emporteau",
-       "importbadinterwiki": "Marru nel atihu d´EntelGüiqui",
+       "importbadinterwiki": "Marru nel atihu dEntelGüiqui",
        "importsuccess": "Archivu emporteau!",
        "importnofile": "Dengún archivu emporteau hue empuntau.",
        "import-parse-failure": "Marru nel análisis d'emporteación XML",
        "tooltip-pt-login": "Te recomendamus que te rustris, inque nu es mestel.",
        "tooltip-pt-logout": "Salil",
        "tooltip-ca-talk": "Caraba al tentu el artículu",
-       "tooltip-ca-edit": "Pueis eital esta página.\nPol favol, gasta el botón \"previsoreal\" enantis d'emburacal.",
+       "tooltip-ca-edit": "Eital esta páhina",
        "tooltip-ca-addsection": "Prencipial una nueva seción",
        "tooltip-ca-viewsource": "Esta páhina está protehia (nu pueis hazel chambus).",
        "tooltip-ca-history": "Velsionis anterioris d'esta página.",
        "file-nohires": "Nu disponibri a mayol resolución.",
        "svg-long-desc": "archivu SVG, $1 × $2 pixelis, grandol: $3",
        "show-big-image": "Resolución máisima",
-       "newimages": "Correol d´archivus nuevus",
+       "newimages": "Correol darchivus nuevus",
        "imagelisttext": "Embahu ai una lista con '''$1''' {{PLURAL:$1|archivu|archivus}} ordenaus $2.",
        "newimages-legend": "Filtru",
        "newimages-label": "Nombri el archivu (u parti):",
        "table_pager_last": "Úrtima páhina",
        "table_pager_limit": "Muestral $1 artículus pol páhina",
        "table_pager_limit_submit": "Dil",
-       "table_pager_empty": "Nu s´alcuentrun resurtaus",
+       "table_pager_empty": "Nu salcuentrun resurtaus",
        "autosumm-blank": "Esborrau el continiu la página",
        "autosumm-replace": "Páhina escambiá pol '$1'",
        "autoredircomment": "Rederihiendu a [[$1]]",
        "watchlistedit-raw-explain": "Se muestran embahu los entítulus de la tu lista e seguimientu, que puein sel eitaus\n\tañiendulus i esborrándulus de la lista; un entítulu pol línia. Cuandu acabihis, pursa sobri \"Atualizal lista e seguimientu\".\n\tTamién pueis [[Special:EditWatchlist|gastal el eitol estándal]].",
        "watchlistedit-raw-titles": "Entítulus:",
        "watchlistedit-raw-submit": "Atualizal la lista e seguimientu",
-       "watchlistedit-raw-done": "La tu lista e seguimientu s´acabiha d´atualizal!",
+       "watchlistedit-raw-done": "La tu lista e seguimientu s’acabiha d’atualizal.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 entítulu hue añiiu|$1 entítulus huerun añiius}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 entítulu hue esborrau|$1 entítulus huerun esborraus}}:",
        "watchlisttools-view": "Vel chambus emportantis",
index 4bffbc9..dcc7244 100644 (file)
                        "Matma Rex",
                        "4nn1l2",
                        "Namo",
-                       "Alifakoor"
+                       "Alifakoor",
+                       "Dejavu"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
-       "tog-hideminor": "نهفتن تغییرات جزئی از فهرست تغییرات اخیر",
-       "tog-hidepatrolled": "Ù\86Ù\87Ù\81تÙ\86 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú¯Ø´Øªâ\80\8cØ®Ù\88ردÙ\87 Ø§Ø² Ù\81Ù\87رست ØªØºÛ\8cÛ\8cرات Ø§Ø®Û\8cر",
-       "tog-newpageshidepatrolled": "نهفتن صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه",
+       "tog-hideminor": "تغییرات جزئی از فهرست تغییرات اخیر پنهان شود",
+       "tog-hidepatrolled": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú¯Ø´Øªâ\80\8cØ®Ù\88ردÙ\87 Ø§Ø² Ù\81Ù\87رست ØªØºÛ\8cÛ\8cرات Ø§Ø®Û\8cر Ù¾Ù\86Ù\87اÙ\86 Ø´Ù\88د",
+       "tog-newpageshidepatrolled": "صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شود",
        "tog-hidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط جدیدترین‌ها",
-       "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحه‌ در تغییرات اخیر و فهرست پیگیری‌ها",
+       "tog-usenewrc": "در تغییرات اخیر و فهرست پیگیری‌ها تغییرات بر پایهٔ صفحه‌ گروه‌بندی شود",
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
-       "tog-showtoolbar": "Ù\86Ù\85اÛ\8cØ´ Ù\86Ù\88ار Ø§Ø¨Ø²Ø§Ø± Ù\88Û\8cراÛ\8cØ´",
+       "tog-showtoolbar": "Ù\86Ù\88ار Ø§Ø¨Ø²Ø§Ø± Ù\88Û\8cراÛ\8cØ´ Ù\86Ù\85اÛ\8cØ´ Ø¯Ø§Ø¯Ù\87 Ø´Ù\88د",
        "tog-editondblclick": "ویرایش صفحات با دو کلیک",
        "tog-editsectiononrightclick": "فعال کردن ویرایش بخش‌ها با کلیک راست روی عنوان بخش‌ها",
-       "tog-watchcreations": "اÙ\81زÙ\88دÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Û\8câ\80\8cسازÙ\85 Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û\8c Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
-       "tog-watchdefault": "اÙ\81زÙ\88دÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\88Û\8cراÛ\8cØ´ Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
-       "tog-watchmoves": "اÙ\81زÙ\88دÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Ù\86تÙ\82Ù\84 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
-       "tog-watchdeletion": "اÙ\81زÙ\88دÙ\86 ØµÙ\81حات Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø­Ø°Ù\81 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
-       "tog-watchuploads": "افزودن پرونده‌های جدید به فهرست پیگیری من",
+       "tog-watchcreations": "صÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Û\8câ\80\8cسازÙ\85 Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û\8c Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
+       "tog-watchdefault": "صÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\88Û\8cراÛ\8cØ´ Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
+       "tog-watchmoves": "صÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Ù\86تÙ\82Ù\84 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
+       "tog-watchdeletion": "صÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø­Ø°Ù\81 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
+       "tog-watchuploads": "پرونده‌های جدیدی که بارگذاری می‌کنم به فهرست پیگیری من افزوده شود",
        "tog-watchrollback": "افزودن صفحاتی که واگردانی می‌کنم به فهرست پیگیری‌های من",
-       "tog-minordefault": "علامت زدن همهٔ ویرایش‌ها به عنوان «جزئی» به طور پیش‌فرض",
-       "tog-previewontop": "Ù\86Ù\85اÛ\8cØ´ Ø¯Ø§Ø¯Ù\86 Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ø¨Ø§Ù\84اÛ\8c Ø¬Ø¹Ø¨Ù\87Ù\94 Ù\88Û\8cراÛ\8cØ´",
-       "tog-previewonfirst": "Ù\86Ù\85اÛ\8cØ´ Ø¯Ø§Ø¯Ù\86 Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\87Ù\86گاÙ\85 Ø§Ù\88Ù\84Û\8cÙ\86 Ù\88Û\8cراÛ\8cØ´",
+       "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت زده شود",
+       "tog-previewontop": "Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ø¨Ø§Ù\84اÛ\8c Ø¬Ø¹Ø¨Ù\87Ù\94 Ù\88Û\8cراÛ\8cØ´ Ù\86Ù\85اÛ\8cØ´ Ø¯Ø§Ø¯Ù\87 Ø´Ù\88د",
+       "tog-previewonfirst": "Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\87Ù\86گاÙ\85 Ø§Ù\88Ù\84Û\8cÙ\86 Ù\88Û\8cراÛ\8cØ´ Ù\86Ù\85اÛ\8cØ´ Ø¯Ø§Ø¯Ù\87 Ø´Ù\88د",
        "tog-enotifwatchlistpages": "اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من ایمیلی فرستاده شود",
        "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من ایمیلی فرستاده شود",
        "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیلی فرستاده شود",
        "tog-enotifrevealaddr": "نشانی پست الکترونیکی من در ایمیل‌های اطلاع‌رسانی هویدا گردد",
        "tog-shownumberswatching": "نمایشِ شمار کاربران پی‌گیری کننده",
-       "tog-oldsig": "امضای کنونی:",
+       "tog-oldsig": "امضای کنونی شما:",
        "tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
-       "tog-uselivepreview": "استÙ\81ادÙ\87 Ø§Ø² Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ø²Ù\86دÙ\87",
+       "tog-uselivepreview": "از Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ø²Ù\86دÙ\87 Ø§Ø³ØªÙ\81ادÙ\87 Ø´Ù\88د",
        "tog-forceeditsummary": "هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود",
-       "tog-watchlisthideown": "Ù\86Ù\87Ù\81تÙ\86 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø®Ù\88دÙ\85 Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا",
-       "tog-watchlisthidebots": "Ù\86Ù\87Ù\81تÙ\86 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø±Ø¨Ø§Øªâ\80\8cÙ\87ا Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا",
-       "tog-watchlisthideminor": "Ù\86Ù\87Ù\81تÙ\86 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø¬Ø²Ø¦Û\8c Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا",
-       "tog-watchlisthideliu": "Ù\86Ù\87Ù\81تÙ\86 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86 Ù\88ارد Ø´Ø¯Ù\87 Ø¨Ù\87 Ø³Ø§Ù\85اÙ\86Ù\87 Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا",
-       "tog-watchlistreloadautomatically": "زمانی که یک پالایه تغییر کرد فهرست پیگیری به صورت خودکار به روز می‌شود (نیازمند جاوا اسکریپت)",
-       "tog-watchlisthideanons": "Ù\86Ù\87Ù\81تÙ\86 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86 Ù\86اشÙ\86اس Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا",
-       "tog-watchlisthidepatrolled": "Ù\86Ù\87Ù\81تÙ\86 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú¯Ø´Øªâ\80\8cØ®Ù\88ردÙ\87 Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا",
+       "tog-watchlisthideown": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø®Ù\88دÙ\85 Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا Ù¾Ù\86Ù\87اÙ\86 Ø´Ù\88د",
+       "tog-watchlisthidebots": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø±Ø¨Ø§Øªâ\80\8cÙ\87ا Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا Ù¾Ù\86Ù\87اÙ\86 Ø´Ù\88د",
+       "tog-watchlisthideminor": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø¬Ø²Ø¦Û\8c Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا Ù¾Ù\86Ù\87اÙ\86 Ø´Ù\88د",
+       "tog-watchlisthideliu": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86 Ù\88ارد Ø´Ø¯Ù\87 Ø¨Ù\87 Ø³Ø§Ù\85اÙ\86Ù\87 Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا Ù¾Ù\86Ù\87اÙ\86 Ø´Ù\88د",
+       "tog-watchlistreloadautomatically": "زمانی که یک پالایه تغییر کرد فهرست پیگیری به صورت خودکار به روز شود (نیازمند جاوااسکریپت)",
+       "tog-watchlisthideanons": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86 Ù\86اشÙ\86اس Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا Ù¾Ù\86Ù\87اÙ\86 Ø´Ù\88د",
+       "tog-watchlisthidepatrolled": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ú¯Ø´Øªâ\80\8cØ®Ù\88ردÙ\87 Ø¯Ø± Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا Ù¾Ù\86Ù\87اÙ\86 Ø´Ù\88د",
        "tog-watchlisthidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "tog-ccmeonemails": "رونوشتی از ایمیلی که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود",
        "tog-diffonly": "محتوای صفحه، زیر تفاوت نمایش داده نشود",
-       "tog-showhiddencats": "نمایش رده‌های پنهان",
+       "tog-showhiddencats": "رده‌های پنهان نمایش داده شود",
        "tog-norollbackdiff": "بعد از واگردانی، تفاوت نشان داده نشود",
        "tog-useeditwarning": "زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود",
        "tog-prefershttps": "هنگامی که به سامانه وارد شده‌ام، همواره از اتصال امن استفاده شود",
        "newwindow": "(در پنجرهٔ تازه باز می‌شود)",
        "cancel": "لغو",
        "moredotdotdot": "بیشتر...",
-       "morenotlisted": "این فهرست کامل نیست.",
+       "morenotlisted": "این فهرست ممکن است کامل نباشد.",
        "mypage": "صفحه",
        "mytalk": "بحث",
        "anontalk": "بحث",
        "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": "نمایش صفحهٔ پروژه",
        "nstab-special": "صفحهٔ ویژه",
        "nstab-project": "صفحهٔ پروژه",
        "nstab-image": "پرونده",
-       "nstab-mediawiki": "پیام",
+       "nstab-mediawiki": "Ù¾Û\8cغاÙ\85",
        "nstab-template": "الگو",
        "nstab-help": "صفحهٔ راهنما",
        "nstab-category": "رده",
        "createacct-yourpasswordagain-ph": "گذرواژه را وارد کنید برای بار دوم",
        "userlogin-remembermypassword": "من را واردشده نگه‌دار",
        "userlogin-signwithsecure": "از ورود امن استفاده کنید",
+       "cannotlogin-title": "ناتوان از ورود به سامانه",
+       "cannotlogin-text": "ورود به سامانه ممکن نیست.",
        "cannotloginnow-title": "الان امکان وررود به سامانه نیست",
        "cannotloginnow-text": "در زمان استفاده از $1 امکان ورود به سامانه وجود ندارد.",
+       "cannotcreateaccount-title": "ناتوان از ایجاد حساب",
+       "cannotcreateaccount-text": "در این ویکی ایجاد مستقیم حساب فعال نشده‌است.",
        "yourdomainname": "دامنهٔ شما:",
        "password-change-forbidden": "شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.",
        "externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
        "eauthentsent": "یک ایمیل تأیید برای آدرس ایمیل به نشانی مورد نظر ارسال شد.\nقبل از اینکه ایمیل دیگری قابل ارسال به این آدرس باشد، باید دستورهایی که در آن ایمیل آمده است را جهت تأیید این مساله که این آدرس متعلق به شماست، اجرا کنید.",
        "throttled-mailpassword": "یک ایمیل بازنشانی گذرواژه در $1 {{PLURAL:$1|ساعت|ساعت}} گذشته فرستاده شده است.\nبرای جلوگیری از سوءاستفاده، هر $1 {{PLURAL:$1|ساعت|ساعت}} تنها یک ایمیل بازنشانی گذرواژه فرستاده می‌شود.",
        "mailerror": "خطا در ارسال ایمیل: $1",
-       "acct_creation_throttle_hit": "بازدیدکنندگان این ویکی که از نشانی آی‌پی شما استفاده می‌کنند در روز گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساخته‌اند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.\nبه همین خاطر، بازدیدکنندگانی که از این نشانی آی‌پی استفاده می‌کنند نمی‌توانند در حال حاضر حساب جدیدی بسازند.",
+       "acct_creation_throttle_hit": "بازدیدکنندگان این ویکی که از نشانی آی‌پی شما استفاده می‌کنند در $2 گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساخته‌اند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.\nبه همین خاطر، بازدیدکنندگانی که از این نشانی آی‌پی استفاده می‌کنند نمی‌توانند در حال حاضر حساب جدیدی بسازند.",
        "emailauthenticated": "نشانی ایمیل شما در $2 ساعت $3 تأیید شده است.",
        "emailnotauthenticated": "آدرس ایمیل شما هنوز تأیید نشده است.\nبرای هیچ‌یک از ویژگی‌های زیر، ایمیل ارسال نخواهد شد.",
        "noemailprefs": "برای راه‌اندازی این قابلیت‌ها یک آدرس ایمیل در ترجیحات خود مشخص کنید.",
        "botpasswords-label-delete": "حذف",
        "botpasswords-label-resetpassword": "بازگردانی گذرواژه",
        "botpasswords-label-grants": "اعطاهای اجرا شدنی:",
-       "botpasswords-help-grants": "Ù\87ر Ø§Ø¬Ø§Ø²Ù\87 Ø¨Ù\87 Ø­Ù\82Ù\88Ù\82 Ú©Ø§Ø±Ø¨Ø±Û\8c Ú©Ù\87 Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c Ø¯Ø§Ø±د. [[Special:ListGrants|table of grants]] را برای اطلاعات بیشتر مشاهده کنید.",
+       "botpasswords-help-grants": "Ù\87ر Ø§Ø¬Ø§Ø²Ù\87 Ø¨Ù\87 Ø±Ø¨Ø§Øª Ø§Ø¬Ø§Ø²Ù\87 Ø¯Ø³ØªØ±Ø³Û\8c Ø¨Ù\87 Ø§Ø®ØªÛ\8cاراتÛ\8c Ø±Ø§ Ú©Ù\87 Ø­Ø³Ø§Ø¨ Ø´Ù\85ا Ø¯Ø§Ø±Ø¯ Ù\85Û\8câ\80\8cدÙ\87د. Ù\81عاÙ\84 Ú©Ø±Ø¯Ù\86 Û\8cÚ© Ø§Ø¬Ø§Ø²Ù\87 Ø¯Ø± Ø§Û\8cÙ\86جا Ù\87Û\8cÚ\86 Ø¯Ø³ØªØ±Ø³Û\8c Ø¬Ø¯Û\8cدÛ\8c Ú©Ù\87 Ø­Ø³Ø§Ø¨ Ø´Ù\85ا Ù\87Ù\85Û\8cÙ\86Ú© Ø¯Ø§Ø±Ø§ Ù\86Û\8cست Ø±Ø§ Ø¨Ù\87 Ø¢Ù\86 Ù\86Ù\85Û\8câ\80\8cبخشد. [[Special:ListGrants|table of grants]] را برای اطلاعات بیشتر مشاهده کنید.",
        "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>$2</strong> گذرواژهٔ جدید برای ورود با <strong>$1</strong> است. <em>لطفاً این را برای ارجاع در آینده ذخیره کنید.</em>",
+       "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\").",
        "passwordreset-emaildisabled": "قابلیت‌های ایمیل در این ویکی غیرفعال شده‌اند.",
        "passwordreset-username": "نام کاربری:",
        "passwordreset-domain": "دامنه:",
-       "passwordreset-capture": "ایمیل نهایی نشان داده شود؟",
-       "passwordreset-capture-help": "اگر این گزینه را علامت بزنید، ایمیل (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.",
        "passwordreset-email": "نشانی ایمیل:",
        "passwordreset-emailtitle": "جزئیات حساب در {{SITENAME}}",
        "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را داده است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
        "passwordreset-emailsentemail": "اگر نشانی پست الکترونیکی که وارد کردید برای حساب کاربریتان ثبت شده باشد، یک نامهٔ بازنشانی گذرواژه به آن فرستاده می‌شود.",
        "passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|نامهٔ|نامهٔ}} بازنشانی گذرواژه ارسال شد. در زير $1 نام کاربری و گذرواژه در حال نمایش است.",
-       "passwordreset-emailerror-capture2": "ارسال ناموفق نامه به $2: $1\nدر زير $3 نام کاربری و گذرواژه در حال نمایش است",
        "passwordreset-nocaller": "فراخواننده می‌بايست مشخص شده باشد",
        "passwordreset-nosuchcaller": "اين فراخواننده وجود ندارد:$1",
        "passwordreset-ignored": "به بازنشانی گذرواژه پرداخته نشد. آیا ممکن است که هيچ مهياکننده‌ای برای این کار تنظيم نشده باشد؟",
        "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": "ویکی‌متن",
        "searchprofile-advanced-tooltip": "جستجو در فضاهای نام دلخواه",
        "search-result-size": "$1 ({{PLURAL:$2|یک واژه|$2 واژه}})",
        "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک زیررده|$2 زیررده}}، {{PLURAL:$3|یک پرونده|$3 پرونده}})",
-       "search-redirect": "(تغییرمسیر $1)",
+       "search-redirect": "(تغییرمسیر از $1)",
        "search-section": "(بخش $1)",
        "search-category": "(رده  $1)",
        "search-file-match": "(تشابه محتوی پرونده)",
        "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توجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.",
        "search-error": "خطایی هنگام جست‌وجو رخ داده است: $1",
+       "search-warning": "هشداری هنگام جست‌وجو رخ داده است: $1",
        "preferences": "ترجیحات",
        "mypreferences": "ترجیحات",
        "prefs-edits": "تعداد ویرایش‌ها:",
        "prefs-rc": "تغییرات اخیر",
        "prefs-watchlist": "فهرست پی‌گیری‌ها",
        "prefs-editwatchlist": "ویرایش فهرست پی‌گیری‌ها",
-       "prefs-editwatchlist-label": "Ù\88Û\8cراÛ\8cØ´ Ù\87Ù\85Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8cتاÙ\86:",
+       "prefs-editwatchlist-label": "ویرایش فهرست پیگیری‌هایتان:",
        "prefs-editwatchlist-edit": "دیدن و حذف عنوان‌ها از فهرست پیگیری‌هایتان",
        "prefs-editwatchlist-raw": "ویرایش فهرست خام پیگیری‌ها",
        "prefs-editwatchlist-clear": "پاک کردن فهرست پیگیری‌هایتان",
        "saveprefs": "ذخیره",
        "restoreprefs": "برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)",
        "prefs-editing": "ویرایش",
-       "rows": "تعداد سطرها:",
-       "columns": "تعداد ستون‌ها:",
        "searchresultshead": "جستجو",
        "stub-threshold": "آستانهٔ ویرایش پیوندهای ناقص ($1):",
        "stub-threshold-sample-link": "نمونه",
        "prefs-help-recentchangescount": "این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.",
        "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.\nهرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].",
        "savedprefs": "ترجیحات شما ذخیره شد.",
-       "savedrights": "دسترسی کاربری {{GENDER:$1|$1}} ذخیره شده‌است.",
+       "savedrights": "گروه‌های کاربری {{GENDER:$1|$1}} ذخیره شده‌است.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "زمان محلی:",
        "timezoneuseserverdefault": "استفاده از پیش‌فرض ویکی ($1)",
        "timezoneregion-europe": "اروپا",
        "timezoneregion-indian": "اقیانوس هند",
        "timezoneregion-pacific": "اقیانوس آرام",
-       "allowemail": "اÙ\85کاÙ\86 Ø¯Ø±Û\8cاÙ\81ت Ø§Û\8cÙ\85Û\8cÙ\84 Ø§Ø² Ø¯Û\8cگر Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86",
+       "allowemail": "درÛ\8cاÙ\81ت Ø§Û\8cÙ\85Û\8cÙ\84 Ø§Ø² Ø¯Û\8cگر Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86 Ù\85Ù\85Ú©Ù\86 Ø¨Ø§Ø´Ø¯",
        "prefs-searchoptions": "جستجو",
        "prefs-namespaces": "فضاهای نام",
        "default": "پیش‌فرض",
        "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
        "userrights": "مدیریت اختیارات کاربر",
-       "userrights-lookup-user": "مدیریت گروه‌های کاربری",
+       "userrights-lookup-user": "انتخاب یک کاربر",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
-       "editusergroup": "ویرایش گروه‌های {{GENDER:$1|کاربری}}",
+       "editusergroup": "بارگیری گروه‌های کاربر",
        "editinguser": "تغییر اختیارات کاربری کاربر {{GENDER:$1|کاربر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "ویرایش گروه‌های کاربری",
        "saveusergroups": "ثبت گروه‌های {{GENDER:$1|کاربری}}",
        "userrights-reason": "دلیل:",
        "userrights-no-interwiki": "شما اجازهٔ تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.",
        "userrights-nodatabase": "پایگاه دادهٔ $1 وجود ندارد یا محلی نیست.",
-       "userrights-nologin": "شما باید با یک حساب کاربری مدیر [[Special:UserLogin|به سامانه وارد شوید]] تا بتوانید اختیارات کاربران را تعیین کنید.",
-       "userrights-notallowed": "شما مجوز برای افزودن یا حذف حقوق کاربر را ندارید.",
        "userrights-changeable-col": "گروه‌هایی که می‌توانید تغییر دهید",
        "userrights-unchangeable-col": "گروه‌هایی که نمی‌توانید تغییر دهید",
+       "userrights-expiry-current": "منقضی$1",
+       "userrights-expiry-none": "دایمی است",
+       "userrights-expiry": "زمان سرآمدن:",
+       "userrights-expiry-existing": "زمان انقضای موجود: $2، $3",
+       "userrights-expiry-othertime": "زمانی دیگر:",
        "userrights-conflict": "تعارض دسترسی‌های کاربری! لطفاً بررسی کنید و تغییرات را تأیید کنید.",
-       "userrights-removed-self": "شما دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صفحه دسترسی ندارید.",
        "group": "گروه:",
        "group-user": "کاربران",
        "group-autoconfirmed": "کاربران تأییدشدهٔ خودکار",
        "right-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "right-override-export-depth": "برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵",
        "right-sendemail": "ارسال ایمیل به دیگر کاربران",
-       "right-passwordreset": "مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه",
        "right-managechangetags": "ایجاد و غیرفعال کردن [[Special:Tags|برچسب‌ها]]",
        "right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
        "right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
        "grant-basic": "دسترسی‌های اولیه",
        "grant-viewdeleted": "مشاهدهٔ پرونده و صفحات حذف شده",
        "grant-viewmywatchlist": "مشاهدۀ فهرست پیگیری‌هایتان",
+       "grant-viewrestrictedlogs": "دیدن سیاه‌های محدود شده",
        "newuserlogpage": "سیاههٔ ایجاد کاربر",
        "newuserlogpagetext": "این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.",
        "rightslog": "سیاههٔ اختیارات کاربر",
        "file-thumbnail-no": "نام پرونده با <strong>$1</strong> آغاز می‌شود.\nبه نظر می‌رسد که این پرونده، یک تصویر ''بندانگشتی'' ''(thumbnail)'' از تصویر بزرگتر اصلی باشد.\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": "آنچه بارگذاری شده دقیقاً نسخه‌ای تکراری از {{PLURAL:$2|یک نسخهٔ قدیمی|نسخه‌های قدیمی}} <strong>[[:$1]]</strong> است.",
        "file-exists-duplicate": "به نظر می‌رسد این پرونده نسخه‌ای تکراری از {{PLURAL:$1|پروندهٔ|پرونده‌های}} زیر باشد:",
        "file-deleted-duplicate": "یک پرونده نظیر این پرونده ([[:$1]]) قبلاً حذف شده‌است.\nشما باید تاریخچهٔ حذف آن پرونده را قبل از بارگذاری مجدد آن ببینید.",
        "file-deleted-duplicate-notitle": "یک پرونده یکسان بااین پرونده قبلاً حذف شده است و عنوان متوقف شده‌است.\nشما باید از کسی که دسترسی مشاهدهٔ پرونده متوقف شده را دارد، درخواست کنید تا شرایط را قبل از بارگذاری مجدد بررسی کند.",
        "uploaded-setting-handler-svg": "پرونده SVG تنظیم شده با مشخصهٔ \"handler\"  با remote/data/script بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-remote-url-svg": "پرونده SVG تنظیم شده با remote URL بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-image-filter-svg": "پالایه پرونده در نشانی:<code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده SVG بارگذاری‌شده یافت شد.",
-       "uploadscriptednamespace": "اÛ\8cÙ\86 Ù¾Ù\88Ø´Ù\87 Ø§Ø³â\80\8cÙ\88Û\8câ\80\8cجÛ\8c Ø´Ø§Ù\85Ù\84 Ù\81ضاÛ\8c Ù\86اÙ\85 ØºÛ\8cرÙ\82اÙ\86Ù\88Ù\86Û\8c '$1' است",
+       "uploadscriptednamespace": "اÛ\8cÙ\86 Ù¾Ù\88Ø´Ù\87 Ø§Ø³â\80\8cÙ\88Û\8câ\80\8cجÛ\8c Ø­Ø§Ù\88Û\8c Ù\86اÙ\85 ØºÛ\8cرÙ\82اÙ\86Ù\88Ù\86Û\8c '<nowiki>$1</nowiki>' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "این پرونده ویروس دارد!\nجزئیات : $1",
        "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
        "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": "بارگذاری",
        "filerevert-submit": "برو",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> به [$4 نسخهٔ مورخ $2 ساعت $3] واگردانده شد.",
        "filerevert-badversion": "نسخهٔ قدیمی‌تری از این پرونده وجود نداشت.",
+       "filerevert-identical": "نسخهٔ فعلی پرونده با نسخه‌ای که انتخاب کردید یکسان است.",
        "filedelete": "حذف $1",
        "filedelete-legend": "حذف پرونده",
        "filedelete-intro": "شما در حال حذف کردن پروندهٔ '''[[Media:$1|$1]]''' به همراه تمام تاریخچه‌اش هستید.",
        "apisandbox-results-fixtoken-fail": "خطا در دریافت توکن \"$1\"",
        "apisandbox-alert-page": "بخش‌ها در این صفحه معتبر نیستند.",
        "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 (تمام مقادیر)",
        "booksources": "منابع کتاب",
        "booksources-search-legend": "جستجوی منابع کتاب",
        "booksources-isbn": "شابک:",
        "booksources-search": "جستجو",
        "booksources-text": "در زیر فهرستی از پیوندها به وبگاه‌های دیگر آمده‌است که کتاب‌های نو و دست دوم می‌فروشند، و همچنین ممکن است اطلاعات بیشتری راجع به کتاب مورد نظر شما داشته باشند:",
        "booksources-invalid-isbn": "شابک داده شده مجاز به نظر نمی‌رسد؛ از جهت اشکالات هنگام کپی کردن از منبع اصلی بررسی کنید.",
+       "magiclink-tracking-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": "هدف (عنوان یا {{ns:user}}:نام کاربر برای کاربر):",
        "log": "سیاهه‌ها",
        "activeusers-intro": "در زیر فهرستی از کاربرانی را می‌بینید که در $1 {{PLURAL:$1|روز|روز}} گذشته فعالیتی داشته‌اند.",
        "activeusers-count": "$1 {{PLURAL:$1|فعالیت|فعالیت}} در {{PLURAL:$3|روز|$3 روز}} اخیر",
        "activeusers-from": "نمایش کاربران با آغاز از:",
+       "activeusers-groups": "نمایش کاربران متعلق به گروه:",
+       "activeusers-excludegroups": "در نظر نگرفتن کاربران متعلق به گروه:",
        "activeusers-noresult": "کاربری پیدا نشد.",
        "activeusers-submit": "نمایش کاربران فعال",
        "listgrouprights": "اختیارات گروه‌های کاربری",
        "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
        "delete-confirm": "حذف «$1»",
        "delete-legend": "حذف",
-       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک‌کردن آن هستید دارای یک تاریخچه همراه $1 {{PLURAL:$1|بازبینی|بازبینی}} است:",
+       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک کردن آن هستید دارای یک تاریخچه همراه با $1 {{PLURAL:$1|بازبینی|بازبینی}} است:",
        "historyaction-submit": "نمایش",
        "confirmdeletetext": "شما در حال حذف کردن یک صفحه یا تصویر از پایگاه داده‌ها همراه با تمام تاریخچهٔ آن هستید.\nلطفاً این عمل را تأیید کنید و اطمینان حاصل کنید که عواقب این کار را می‌دانید و این عمل را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
        "actioncomplete": "عمل انجام شد",
        "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]] منتقل شد",
        "restriction-level-all": "هر سطحی",
        "undelete": "احیای صفحهٔ حذف‌شده",
        "undeletepage": "نمایش و احیای صفحه‌های حذف‌شده",
-       "undeletepagetitle": "'''آن چه در ادامه می‌آید شامل نسخه‌های حذف شدهٔ [[:$1|$1]] است'''.",
+       "undeletepagetitle": "<strong>آنچه در ادامه می‌آید شامل نسخه‌های حذف شدهٔ [[:$1|$1]] است</strong>.",
        "viewdeletedpage": "نمایش صفحه‌های حذف‌شده",
        "undeletepagetext": "{{PLURAL:$1|صفحهٔ زیر حدف شده|صفحه‌های زیر حذف شده‌اند}} ولی هنوز در بایگانی {{PLURAL:$1|هست|هستند}} و {{PLURAL:$1|می‌تواند احیا شود|می‌توانند احیا شوند}}.\nاین بایگانی ممکن است هر چند وقت تمیز شود.",
        "undelete-fieldset-title": "احیای نسخه‌ها",
        "movelogpagetext": "در زیر فهرستی از انتقال صفحات آمده‌است.",
        "movesubpage": "{{PLURAL:$1|زیرصفحه|زیرصفحه‌ها}}",
        "movesubpagetext": "این صفحه $1 زیرصفحه دارد که در زیر نمایش {{PLURAL:$1|یافته‌است|یافته‌اند}}.",
+       "movesubpagetalktext": "صفحهٔ بحث مربوط دارای $1 زیرصفحه است که در زیر نمایش {{PLURAL:$1|یافته‌است|یافته‌اند}}.",
        "movenosubpage": "این صفحه هیچ زیرصفحه‌ای ندارد.",
        "movereason": "دلیل:",
        "revertmove": "واگردانی",
        "importlogpagetext": "درون‌ریزی صفحات به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} واردشده از $2",
-       "javascripttest": "آزمایش جاوا اسکریپت",
+       "javascripttest": "آزمایش جاوااسکریپت",
        "javascripttest-pagetext-unknownaction": "تابع ناشناختهٔ \"$1\".",
        "javascripttest-qunit-intro": "[$1 مستندات آزمایش] را در mediawiki.org ببینید.",
        "tooltip-pt-userpage": "صفحهٔ {{GENDER:|کاربری شما}}",
        "pageinfo-article-id": "شناسهٔ صفحه",
        "pageinfo-language": "زبان محتوای صفحه",
        "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": "تأیید",
+       "confirm-markpatrolled-top": "نسخهٔ $3 از $2 علامت گشت بخورد؟",
        "deletedrevision": "$1 نسخهٔ حذف شدهٔ قدیمی",
        "filedeleteerror-short": "خطا در حذف پرونده: $1",
        "filedeleteerror-long": "در زمان حذف پرونده خطا رخ داد:\n\n$1",
        "newimages-showbots": "نمایش بارگذاری‌ها توسط ربات‌ها",
        "newimages-hidepatrolled": "مخفی کردن بارگذاری گشت‌زن‌ها",
        "noimages": "چیزی برای دیدن نیست.",
+       "gallery-slideshow-toggle": "فعال یا غیرفعال کردن تصاویر بندانگشتی",
        "ilsubmit": "جستجو",
        "bydate": "از روی تاریخ",
        "sp-newimages-showfrom": "نشان‌دادن تصویرهای جدید از $2، $1 به بعد",
        "tag-filter": "پالایش [[Special:Tags|برچسب‌ها]]:",
        "tag-filter-submit": "پالایه",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|برچسب|برچسب‌ها}}]]: $2)",
+       "tag-mw-contentmodelchange": "تغییر مدل محتوا",
+       "tag-mw-contentmodelchange-description": "ویرایش‌هایی که [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel مدل محتوای صفحه را تغییر می‌دهند]",
        "tags-title": "برچسب‌ها",
        "tags-intro": "این صفحه فهرستی‌است از برچسب‌هایی که نرم‌افزار با آن‌ها ویرایش‌ها را علامت‌گذری می‌کند، به همراه معانی آن‌ها.",
        "tags-tag": "نام برچسب",
        "tags-actions-header": "فعالیت‌ها",
        "tags-active-yes": "بله",
        "tags-active-no": "خیر",
-       "tags-source-extension": "تعرÛ\8cÙ\81â\80\8cشدÙ\87 Ø¨Ø± Ù¾Ø§Û\8cÙ\87 Ø§Ù\81زÙ\88Ù\86Ù\87",
+       "tags-source-extension": "تعرÛ\8cÙ\81â\80\8cشدÙ\87 ØªÙ\88سط Ù\86رÙ\85â\80\8cاÙ\81زار",
        "tags-source-manual": "اعمال شده به صورت دستی توسط ربات‌ها یا کاربرها",
        "tags-source-none": "دیگر استفاده نمی‌شود",
        "tags-edit": "ویرایش",
        "tags-delete": "حذف",
        "tags-activate": "فعال‌سازی",
-       "tags-deactivate": "غیرفعال کردن/إکار کةتن",
+       "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-cloner-create": "افزودن بیشتر",
        "htmlform-cloner-delete": "حذف",
        "htmlform-cloner-required": "حداقل یک مقدار مورد نیاز است.",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "مقداری وارد کردید یک تاریخ معتبر نیست. لطفاً از قالب سال چهاررقمی، ماه دورقمی و روز دورقمی به شکل YYYY-MM-DD استفاده کنید.",
+       "htmlform-time-invalid": "مقداری وارد کردید یک زمان معتبر نیست. لطفاً از قالب ساعت دورقمی، دقیقه دورقمی و ثانیه دورقمی به شکل HH:MM:SS استفاده کنید.",
+       "htmlform-datetime-invalid": "مقداری وارد کردید یک تاریخ و ساعت معتبر نیست. لطفاً از قالب سال چهاررقمی، ماه دورقمی و روز دورقمی، ساعت دورقمی، دقیقه دورقمی و ثانیه دورقمی به شکل YYYY-MM-DD HH:MM:SS استفاده کنید.",
+       "htmlform-date-toolow": "مقداری که مشخص کردید پیش از زودترین تاریخ مجاز $1 است.",
+       "htmlform-date-toohigh": "مقداری که مشخص کردید پس از دیرترین تاریخ مجاز $1 است.",
+       "htmlform-time-toolow": "مقداری که مشخص کردید پیش از زودترین ساعت مجاز $1 است.",
+       "htmlform-time-toohigh": "مقداری که مشخص کردید پس از دیرترین ساعت مجاز $1 است.",
+       "htmlform-datetime-toolow": "مقداری که مشخص کردید پیش از زودترین تاریخ و ساعت مجاز $1 است.",
+       "htmlform-datetime-toohigh": "مقداری که مشخص کردید پس از دیرترین تاریخ و ساعت مجاز $1 است.",
        "htmlform-title-badnamespace": "[[:$1]] در فضای نام \"{{ns:$2}}\"  موجود نیست.",
        "htmlform-title-not-creatable": "\"$1\" عنوان قابل ایجاد نیست",
        "htmlform-title-not-exists": "$1 وجود ندارد.",
        "htmlform-user-not-exists": "<strong>$1</strong> وجود ندارد.",
        "htmlform-user-not-valid": "حساب کاربری <strong>$1</strong> معتبر نیست.",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
+       "logentry-delete-delete_redir": "$1 تغییرمسیر $3 را با رونویسی {{GENDER:$2|حذف کرد}}",
        "logentry-delete-restore": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}}",
        "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 {{GENDER:$2|تغییر داد}}: $4",
        "logentry-delete-revision": "$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صفحه $3 را {{GENDER:$2|تغییر داد}}: $4",
        "revdelete-restricted": "مدیران را محدود کرد",
        "revdelete-unrestricted": "محدودیت مدیران را لغو کرد",
        "logentry-block-block": "$1 {{GENDER:$4|$3}} را تا $5 {{GENDER:$2|بست}} $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|بازکرد}} {{GENDER:$4|$3}}",
+       "logentry-block-unblock": "$1 {{GENDER:$4|$3}} را {{GENDER:$2|بازکرد}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن {{GENDER:$4|$3}} را به پایان قطع دسترسی $5 $6 تغییر داد.",
        "logentry-suppress-block": "$1 {{GENDER:$2|بسته شد}} {{GENDER:$4|$3}} با پایان قطع دسترسی در زمان $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن برای  {{GENDER:$4|$3}} به پایان قطع دسترسی  $5 $6 تغییر یافت",
        "feedback-thanks": "سپاس! بازخورد شما در صفحهٔ «[$1 $2]» ثبت شد.",
        "feedback-thanks-title": "با تشکر!",
        "feedback-useragent": "رابط کاربر:",
-       "searchsuggest-search": "جستجو",
+       "searchsuggest-search": "جستجو در {{SITENAME}}",
        "searchsuggest-containing": "صفحه‌های دربردارنده...",
-       "api-error-autoblocked": "نشانی آی‌پی شما به صورت خودکار بسته شده‌است، چون توسط یک کاربر بسته‌شده استفاده می‌شد.",
-       "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
-       "api-error-blocked": "شما از ویرایش بسته شده‌اید.",
-       "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
-       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
-       "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
        "api-error-emptypage": "ایجاد صفحه‌های خالی مجاز نیست.",
-       "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
-       "api-error-fileexists-forbidden": "یک پرونده با نام \"$1\" موجود است و امکان بازنویسی نیست.",
-       "api-error-fileexists-shared-forbidden": "یک پرونده با نام \"$1\" در انبار اشتراک پرونده موجود است و امکان بازنویسی نیست.",
-       "api-error-file-too-large": "پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.",
-       "api-error-filename-tooshort": "نام پرونده بیش از اندازه کوتاه است.",
-       "api-error-filetype-banned": "این نوع پرونده ممنوع است.",
-       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.",
-       "api-error-filetype-missing": "پرونده فرمت ندارد.",
-       "api-error-hookaborted": "اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.",
-       "api-error-http": "خطای داخلی: قادر به اتصال به سرور نیست.",
-       "api-error-illegal-filename": "نام پرونده مجاز نیست.",
-       "api-error-internal-error": "خطای داخلی: با پردازش بارگذاری شما در ویکی، یک چیز اشتباه پیش رفت.",
-       "api-error-invalid-file-key": "خطای داخلی: پرونده در حافظهٔ موقت موجود نیست.",
-       "api-error-missingparam": "خطای داخلی: پارامترهای ناموجود در درخواست.",
-       "api-error-missingresult": "خطای داخلی: نمی‌توان فهمید کپی‌برداری موفق بوده‌است یا نه.",
-       "api-error-mustbeloggedin": "برای بارگذاری پرونده‌ها شما باید به سامانه وارد شوید.",
-       "api-error-mustbeposted": "خطای داخلی: درخواست باید از روش POST HTTP ارسال گردد.",
-       "api-error-noimageinfo": "بارگذاری موفق بود، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده به ما نداد.",
-       "api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
-       "api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
-       "api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
-       "api-error-ratelimited": "شما سعی داريد، در بازه زمانی کوتاهی، بيشتر از تعدادی که اين ويکی اجازه داده‌است پرونده بارگذاری کنيد.\nلطفاً چند دقيقه بعد مجدداً تلاش نماييد.",
-       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
-       "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
-       "api-error-stashedfilenotfound": "زمانی که تلاش برای بارگذاری فایل استش بود، فایل استش یافت نشد.",
-       "api-error-stashpathinvalid": "مسیری که فایل استش در آن باید یافت می‌شد اشتباه است.",
-       "api-error-stashfilestorage": "برای ذخیرهٔ فایل استش خطایی رخ داده است.",
-       "api-error-stashzerolength": "سرور نمی‌تواند فایل استش را ذخیره کند چون حجم آن صفر است.",
-       "api-error-stashnotloggedin": "برای ذخیرهٔ فایل‌ها در بارگذاری استش باید وارد سامانه شده‌باشید.",
-       "api-error-stashwrongowner": "فایلی که در استش قصد داشتید به آن دسترسی داشته‌باشید متعلق به شما نیست.",
-       "api-error-stashnosuchfilekey": "کلیدی که در فایل استش می خواستید به آن دسترسی داشته‌باشید، وجود ندارد.",
-       "api-error-timeout": "کارساز در زمان انتظار هیچ پاسخی نداد.",
-       "api-error-unclassified": "یک خطای ناشناخته رخ داد.",
-       "api-error-unknown-code": "خطای ناشناخته: \" $1 \"",
-       "api-error-unknown-error": "خطای داخلی: در زمانی که شما در حال تلاش برای بارگذاری پروندهٔ‌تان بودید، یک چیز اشتباه پیش رفت.",
+       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-unknown-warning": "اخطار ناشناخته: $1",
        "api-error-unknownerror": "خطای ناشناخته: «$1».",
-       "api-error-uploaddisabled": "بارگذاری در این ویکی غیرفعال است.",
-       "api-error-verification-error": "ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.",
-       "api-error-was-deleted": "پرونده‌ای با همين نام قبلاً بارگذاری و متعاقباً حذف شده است.",
        "duration-seconds": "$1 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "duration-hours": "$1 ساعت",
        "expand_templates_generate_xml": "نمایش درخت تجزیهٔ XML",
        "expand_templates_generate_rawhtml": "نمایش اچ‌تی‌ام‌ال خام",
        "expand_templates_preview": "پیش‌نمایش",
-       "expand_templates_preview_fail_html": "<em>زÛ\8cرا {{SITENAME}} ØªØ§ Ø¨Ù\87 HTML Ø®Ø§Ù\85 Ù\81عاÙ\84 Ù\88 Û\8cÚ© Ø¯Ø³Øª Ø±Ù\81تÙ\86 Ø§Ø·Ù\84اعات Ù\86شست Ù\88جÙ\88د Ø¯Ø§Ø±Ø¯Ø\8c Ù¾Û\8cØ´ Ù\86Ù\85اÛ\8cØ´ Ø¨Ù\87 Ø¹Ù\86Ù\88اÙ\86 Û\8cÚ© Ø§Ù\82داÙ\85 Ø§Ø­ØªÛ\8cاطÛ\8c Ø¯Ø± Ø¨Ø±Ø§Ø¨Ø± Ø­Ù\85Ù\84ات Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت Ù¾Ù\86Ù\87اÙ\86 Ø§Ø³Øª.</em>\n\n<strong>اگر Ø§Û\8cÙ\86 ØªÙ\84اش Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\85شرÙ\88ع Ø§Ø³ØªØ\8c Ù\84Ø·Ù\81ا Ø¯Ù\88بارÙ\87 Ø³Ø¹Û\8c Ú©Ù\86Û\8cد. Ø§Ú¯Ø± Ù\87Ù\86Ù\88ز Ú©Ø§Ø± Ù\86Ù\85Û\8c Ú©Ù\86د، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
-       "expand_templates_preview_fail_html_anon": "<em>زÛ\8cرا {{SITENAME}} ØªØ§ Ø¨Ù\87 HTML Ø®Ø§Ù\85 Ù\81عاÙ\84 Ù\88 Û\8cÚ© Ø¯Ø³Øª Ø±Ù\81تÙ\86 Ø§Ø·Ù\84اعات Ù\86شست Ù\88جÙ\88د Ø¯Ø§Ø±Ø¯Ø\8c Ù¾Û\8cØ´ Ù\86Ù\85اÛ\8cØ´ Ø¨Ù\87 Ø¹Ù\86Ù\88اÙ\86 Û\8cÚ© Ø§Ù\82داÙ\85 Ø§Ø­ØªÛ\8cاطÛ\8c Ø¯Ø± Ø¨Ø±Ø§Ø¨Ø± Ø­Ù\85Ù\84ات Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت Ù¾Ù\86Ù\87اÙ\86 Ø§Ø³Øª.</em>\n\n<strong>اگر Ø§Û\8cÙ\86 ØªÙ\84اش Ù¾Û\8cØ´Ù\86Ù\85اÛ\8cØ´ Ù\85شرÙ\88ع Ø§Ø³ØªØ\8c Ù\84Ø·Ù\81ا Ø¯Ù\88بارÙ\87 Ø³Ø¹Û\8c Ú©Ù\86Û\8cد. Ø§Ú¯Ø± Ù\87Ù\86Ù\88ز Ú©Ø§Ø± Ù\86Ù\85Û\8c Ú©Ù\86دØ\8c Ø³Ø¹Û\8c Ú©Ù\86Û\8cد [[Special:UserLogout|خرÙ\88ج Ø§Ø² Ø³Û\8cستÙ\85]] Ø±Ø§ Ú©Ù\84Û\8cÚ© Ù\86Ù\85Ù\88دÙ\87 Ù\88 Ø¯Ù\88بارÙ\87 Ù\88ارد Ø´Ù\88Û\8cد.",
+       "expand_templates_preview_fail_html": "<em>بÙ\87 Ø¯Ù\84Û\8cÙ\84 Ø§Û\8cÙ\86 Ú©Ù\87 Ø¯Ø± {{SITENAME}} Ø§Ú\86â\80\8cتÛ\8câ\80\8cاÙ\85â\80\8cاÙ\84 Ø®Ø§Ù\85 Ù\81عاÙ\84 Ø§Ø³Øª Ù\88 Ø§Ø·Ù\84اعات Ù\86شست Ú©Ø§Ø±Ø¨Ø±Û\8c Ø§Ø² Ø¯Ø³Øª Ø±Ù\81تØ\8c Ù¾Û\8cØ´ Ù\86Ù\85اÛ\8cØ´ Ø¨Ù\87 Ø¹Ù\86Ù\88اÙ\86 Û\8cÚ© Ø§Ù\82داÙ\85 Ø§Ø­ØªÛ\8cاطÛ\8c Ø¯Ø± Ø¨Ø±Ø§Ø¨Ø± Ø­Ù\85Ù\84ات Ø¬Ø§Ù\88ااسکرÛ\8cپت Ù¾Ù\86Ù\87اÙ\86 Ø§Ø³Øª.</em>\n\n<strong>اگر Ø§Û\8cÙ\86 ØªÙ\84اش Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\85شرÙ\88ع Ø§Ø³ØªØ\8c Ù\84Ø·Ù\81اÙ\8b Ø¯Ù\88بارÙ\87 Ø³Ø¹Û\8c Ú©Ù\86Û\8cد.</strong>\nاگر Ù\87Ù\86Ù\88ز Ú©Ø§Ø± Ù\86کرد، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
+       "expand_templates_preview_fail_html_anon": "<em>بÙ\87 Ø¯Ù\84Û\8cÙ\84 Ø§Û\8cÙ\86 Ú©Ù\87 Ø¯Ø± {{SITENAME}} Ø§Ú\86â\80\8cتÛ\8câ\80\8cاÙ\85â\80\8cاÙ\84 Ø®Ø§Ù\85 Ù\81عاÙ\84 Ø§Ø³Øª Ù\88 Ø§Ø·Ù\84اعات Ù\86شست Ú©Ø§Ø±Ø¨Ø±Û\8c Ø§Ø² Ø¯Ø³Øª Ø±Ù\81تØ\8c Ù¾Û\8cØ´ Ù\86Ù\85اÛ\8cØ´ Ø¨Ù\87 Ø¹Ù\86Ù\88اÙ\86 Û\8cÚ© Ø§Ù\82داÙ\85 Ø§Ø­ØªÛ\8cاطÛ\8c Ø¯Ø± Ø¨Ø±Ø§Ø¨Ø± Ø­Ù\85Ù\84ات Ø¬Ø§Ù\88ااسکرÛ\8cپت Ù¾Ù\86Ù\87اÙ\86 Ø§Ø³Øª.</em>\n\n<strong>اگر Ø§Û\8cÙ\86 ØªÙ\84اش Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\85شرÙ\88ع Ø§Ø³ØªØ\8c Ù\84Ø·Ù\81ا [[Special:UserLogin|بÙ\87 Ø³Ø§Ù\85اÙ\86Ù\87 Ù\88ارد Ø´Ù\88Û\8cد]] Ù\88 Ø¯Ù\88بارÙ\87 ØªÙ\84اش Ú©Ù\86Û\8cد.</strong>",
        "expand_templates_input_missing": "شما نیازمندید که حداقل متن‌هایی را برای وارد کردن تهیه کنید.",
        "pagelanguage": "تغییر زبان صفحه",
        "pagelang-name": "صفحه",
        "special-characters-title-emdash": "خط فاسله کشیده",
        "special-characters-title-minus": "علامت منفی",
        "mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
+       "mw-widgets-mediasearch-input-placeholder": "جستجو برای رسانه‌ها",
+       "mw-widgets-mediasearch-noresults": "هیچ نتیجه‌ای پیدا نشد.",
        "mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
        "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "در حال افزودن رده ...",
        "sessionmanager-tie": "نمی‌توان چندین نوع درخواست هویت‌سنجی را ترکیب کرد: $1.",
        "sessionprovider-generic": "$1 فصل",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "فصل‌های کوکی‌محور",
        "log-action-filter-block-block": "بستن",
        "log-action-filter-block-reblock": "تصحیح بلاک",
        "log-action-filter-block-unblock": "باز شدن",
-       "log-action-filter-contentmodel-change": "تغÛ\8cÛ\8cر Ù\86Ù\88ع محتوا",
+       "log-action-filter-contentmodel-change": "تغÛ\8cÛ\8cر Ù\85دÙ\84 محتوا",
        "log-action-filter-contentmodel-new": "ایجاد صفحه با contentmodel غیر استاندارد",
        "log-action-filter-delete-delete": "حذف صفحه",
+       "log-action-filter-delete-delete_redir": "رونویسی تغییرمسیر",
        "log-action-filter-delete-restore": "احیای صفحه",
        "log-action-filter-delete-event": "حذف سیاهه",
        "log-action-filter-delete-revision": "حذف ویرایش",
        "unlinkaccounts-success": "پیوند کاربری بدون پیوند شد.",
        "authenticationdatachange-ignored": "به تغيير اطلاعات احراز هويت پرداخته نشد. آیا ممکن است که هيچ مهيا کننده‌ای برای اين کار تنظيم نشده باشد؟",
        "userjsispublic": "لطفاً توجه کنید: زیرصفحه‌های جاوااسکریپت نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند.",
-       "usercssispublic": "لطفاً توجه کنید: زیرصفحه‌های سی‌اس‌اس نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند."
+       "usercssispublic": "لطفاً توجه کنید: زیرصفحه‌های سی‌اس‌اس نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند.",
+       "restrictionsfield-badip": "نشانی یا بازهٔ آی‌پی نامعتبر: $1",
+       "restrictionsfield-label": "بازه‌های آی‌پی مجاز:",
+       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 1a19f65..1e72167 100644 (file)
        "searcharticle": "Siirry",
        "history": "Sivun historia",
        "history_short": "Historia",
+       "history_small": "historia",
        "updatedmarker": "päivitetty viimeisimmän käyntisi jälkeen",
        "printableversion": "Tulostettava versio",
        "permalink": "Ikilinkki",
        "views": "Näkymät",
        "toolbox": "Työkalut",
        "tool-link-userrights": "Muokkaa {{GENDER:$1|käyttäjän}} ryhmiä",
+       "tool-link-userrights-readonly": "Katso {{GENDER:$1|käyttäjän}} ryhmiä",
        "tool-link-emailuser": "Lähetä sähköpostia tälle {{GENDER:$1|käyttäjälle}}",
        "userpage": "Näytä käyttäjäsivu",
        "projectpage": "Näytä projektisivu",
        "passwordreset-emaildisabled": "Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.",
        "passwordreset-username": "Käyttäjätunnus:",
        "passwordreset-domain": "Verkkotunnus:",
-       "passwordreset-capture": "Näytä lähetettävä sähköpostiviesti?",
-       "passwordreset-capture-help": "Jos valitset tämän, sähköposti (tilapäisellä salasanalla) näytetään sinulle sekä lähetetään käyttäjälle.",
        "passwordreset-email": "Sähköpostiosoite:",
        "passwordreset-emailtitle": "Tunnuksen tiedot {{GRAMMAR:inessive|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi salasanasi\nvaihtamista sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}}\nyhdistettynä tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nKirjaudu sisään nyt ja valitse uusi salasana heti. Jos joku toinen teki tämän pyynnön \ntai jos muistitkin vanhan salasanasi etkä halua enää muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanasi käyttämistä.",
        "passwordreset-emailelement": "Käyttäjätunnus: \n$1\n\nVäliaikainen salasana: \n$2",
        "passwordreset-emailsentemail": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
        "passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
-       "passwordreset-emailsent-capture2": "Salasananpalautus{{PLURAL:$1|sähköposti|sähköpostit}} on lähetetty. {{PLURAL:$1|Käyttäjä ja salasana|Luettelo käyttäjistä ja salasanoista}} näytetään alapuolella.",
-       "passwordreset-emailerror-capture2": "Sähköpostin lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1 {{PLURAL:$3|Käyttäjänimi ja salasana|Luettelo käyttäjänimistä ja salasanoista}} näytetään alla.",
        "passwordreset-ignored": "Salasanan palauttamista ei käsitelty. Ehkä tarjoajaa ei ollut määritetty?",
        "passwordreset-invalidemail": "Virheellinen sähköpostiosoite",
        "passwordreset-nodata": "Käyttäjätunnusta ja salasanaa ei annettu",
        "blockedtitle": "Käyttäjä on estetty",
        "blockedtext": "'''Käyttäjätunnuksesi tai IP-osoitteesi on estetty.'''\n\nEston on asettanut $1.\nSyy: '''$2'''\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n\nVoit keskustella ylläpitäjän $1 tai toisen [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjän]] kanssa estosta.\nHuomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassa olevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]] tai jos esto on asetettu koskemaan myös sähköpostin lähettämistä.\nIP-osoitteesi on $3 ja estotunnus on #$5.\nLiitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "autoblockedtext": "IP-osoitteesi on estetty automaattisesti, koska sitä on käyttänyt toinen käyttäjä, jonka on estänyt ylläpitäjä $1.\nEston syy on:\n\n:''$2''\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n\nVoit keskustella ylläpitäjän $1 tai toisen [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjän]] kanssa estosta.\n\nHuomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassa olevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]] tai jos esto on asetettu koskemaan myös sähköpostin lähettämistä.\n\nIP-osoitteesi on $3 ja estotunnus on #$5.\nLiitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
+       "systemblockedtext": "Käyttäjätunnuksesi tai IP-osoitteesi on automaattisesti estetty MediaWikin toimesta.\nAnnettu syy on:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nTämänhetkinen IP-osoitteesi on $3.\nOle hyvä ja liitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "blockednoreason": "(syytä ei annettu)",
        "whitelistedittext": "Sinun täytyy $1, jotta voisit muokata sivuja.",
        "confirmedittext": "Et voi muokata sivuja, ennen kuin olet varmentanut sähköpostiosoitteesi. Voit tehdä varmennuksen [[Special:Preferences|asetussivulla]].",
        "search-file-match": "(vastaa tiedoston sisältöä)",
        "search-suggest": "Tarkoititko: $1",
        "search-rewritten": "Näytetään tulokset haulla $1. Haluatko hakea haulla $2?",
-       "search-interwiki-caption": "Sisarprojektit",
+       "search-interwiki-caption": "Sisarhankkeet",
        "search-interwiki-default": "Tulokset osoitteesta $1:",
        "search-interwiki-more": "(lisää)",
+       "search-interwiki-more-results": "lisää tuloksia",
        "search-relatedarticle": "Hae samankaltaisia sivuja",
        "searchrelated": "samankaltainen",
        "searchall": "kaikki",
        "saveprefs": "Tallenna asetukset",
        "restoreprefs": "Palauta kaikki oletusasetuksiin (kaikissa osioissa)",
        "prefs-editing": "Muokkaus",
-       "rows": "Rivejä",
-       "columns": "Sarakkeita",
        "searchresultshead": "Haku",
        "stub-threshold": "Tynkälinkkien muotoilun kynnysarvo ($1):",
        "stub-threshold-sample-link": "näyte",
        "prefs-help-recentchangescount": "Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.",
        "prefs-help-watchlist-token2": "Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.\nKuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.\n[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].",
        "savedprefs": "Asetuksesi on tallennettu.",
-       "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttöoikeudet on tallennettu.",
+       "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttäjäryhmät on tallennettu.",
        "timezonelegend": "Aikavyöhyke",
        "localtime": "Paikallinen aika",
        "timezoneuseserverdefault": "Käytä oletusta ($1)",
        "youremail": "Sähköpostiosoite",
        "username": "{{GENDER:$1|Käyttäjätunnus}}",
        "prefs-memberingroups": "{{GENDER:$2|Jäsenenä}} {{PLURAL:$1|ryhmässä|ryhmissä}}",
+       "group-membership-link-with-expiry": "$1 ($2 asti)",
        "prefs-registration": "Rekisteröintiaika",
        "yourrealname": "Oikea nimi",
        "yourlanguage": "Käyttöliittymän kieli",
        "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-lookup-user": "Hallinnoi käyttäjän ryhmiä",
+       "userrights-lookup-user": "Valitse käyttäjä",
        "userrights-user-editname": "Käyttäjätunnus:",
-       "editusergroup": "Muokkaa {{GENDER:$1|käyttäjän}} ryhmiä",
+       "editusergroup": "Lataa käyttäjäryhmät",
        "editinguser": "Muutetaan {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 oikeuksia",
-       "userrights-editusergroup": "Muuta käyttäjän ryhmiä",
+       "viewinguserrights": "Näytetään {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 käyttäjäryhmät",
+       "userrights-editusergroup": "Muuta {{GENDER:$1|käyttäjän}} ryhmiä",
+       "userrights-viewusergroup": "Tarkastele {{GENDER:$1|käyttäjän}} ryhmiä",
        "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 käyttäjää tästä ryhmästä, kun olet hänet siihen lisännyt tai päinvastoin",
+       "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-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-nologin": "Sinun täytyy [[Special:UserLogin|kirjautua sisään]] ylläpitäjän tunnuksella, jotta voisit muuttaa käyttöoikeuksia.",
-       "userrights-notallowed": "Sinulla ei ole oikeutta lisätä tai poistaa käyttäjien oikeuksia.",
        "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": "Vanhentuu:",
+       "userrights-expiry-existing": "Nykyinen vanhentumisaika: $3, $2",
+       "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.",
-       "userrights-removed-self": "Poistit omat oikeutesi. Tämän vuoksi sinulla ei enää ole oikeutta päästä tälle sivulle.",
        "group": "Ryhmä",
        "group-user": "käyttäjät",
        "group-autoconfirmed": "automaattisesti hyväksytyt käyttäjät",
        "right-siteadmin": "Lukita tietokanta",
        "right-override-export-depth": "Viedä sivuja sisältäen viitatut sivut viiden syvyydellä",
        "right-sendemail": "Lähettää sähköpostia muille käyttäjille",
-       "right-passwordreset": "Tarkastella salasanan alustusviestejä",
        "right-managechangetags": "Luoda ja ottaa käyttöön [[Special:Tags|merkkauksia]]",
        "right-applychangetags": "Asettaa [[Special:Tags|merkkauksia]] omien muutosten yhteyteen",
        "right-changetags": "Lisätä ja poistaa satunnaisia [[Special:Tags|merkkauksia]] yksittäisissä sivuversioissa tai lokimerkinnöissä",
        "action-upload_by_url": "tallentaa tätä tiedostoa URL-osoitteesta",
        "action-writeapi": "käyttää kirjoitus-APIa",
        "action-delete": "poistaa tätä sivua",
-       "action-deleterevision": "poistaa tätä versiota",
-       "action-deletedhistory": "tarkastella tämän sivun poistettua historiaa",
+       "action-deleterevision": "poistaa versioita",
+       "action-deletelogentry": "poistaa lokimerkintöjä",
+       "action-deletedhistory": "tarkastella sivun poistettua historiaa",
+       "action-deletedtext": "tarkastella poistetun version tekstiä",
        "action-browsearchive": "etsiä poistettuja sivuja",
-       "action-undelete": "palauttaa tätä poistettua sivua",
-       "action-suppressrevision": "tarkastella ja palauttaa tätä piilotettua versiota",
+       "action-undelete": "palauttaa poistettuja sivuja",
+       "action-suppressrevision": "tarkastella ja palauttaa piilotettuja versioita",
        "action-suppressionlog": "tarkastella tätä yksityislokia",
        "action-block": "estää tätä käyttäjää muokkaamasta",
        "action-protect": "muuttaa tämän sivun suojaustasoa",
        "action-userrights-interwiki": "muokata muiden wikien käyttäjien käyttöoikeuksia",
        "action-siteadmin": "lukita tai avata tietokantaa",
        "action-sendemail": "lähettää sähköpostia",
+       "action-editmyoptions": "muokata omia asetuksiasi",
        "action-editmywatchlist": "muokata omaa tarkkailulistaasi",
        "action-viewmywatchlist": "tarkastella tarkkailulistaasi",
        "action-viewmyprivateinfo": "katsoa omia yksityisiä tietojasi",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (katso myös [[Special:NewPages|lista uusista sivuista]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Näytä",
+       "rcfilters-activefilters": "Aktiiviset suodattimet",
+       "rcfilters-clear-all-filters": "Tyhjennä kaikki suodattimet",
+       "rcfilters-search-placeholder": "Suodattimen viimeaikaiset muutokset (selaa tai aloita kirjoittaa)",
+       "rcfilters-invalid-filter": "Suodatin on epäkelpo",
+       "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.",
+       "rcfilters-filterlist-title": "Suodattimet",
+       "rcfilters-filterlist-noresults": "Ei löytynyt suodattimia",
+       "rcfilters-filter-registered-label": "Rekisteröitynyt",
+       "rcfilters-filter-registered-description": "Kirjautuneet muokkaukset.",
+       "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-filtergroup-automated": "Automatisoidut muutokset",
+       "rcfilters-filter-bots-label": "Botti",
+       "rcfilters-filter-bots-description": "Muokkaukset jotka tehty automaattisilla työkaluilla.",
+       "rcfilters-filter-humans-label": "Ihminen (ei botti)",
+       "rcfilters-filtergroup-significance": "Merkitys",
+       "rcfilters-filter-minor-label": "Pienet muutokset",
+       "rcfilters-filter-major-label": "Ei-pienet muutokset",
+       "rcfilters-filter-major-description": "Muokkauksia ei ole merkitty kuin pieniksi.",
+       "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-categorization-label": "Luokkamuutokset",
+       "rcfilters-filter-logactions-label": "Kirjatut toimet",
        "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
-       "rclistfrom": "Näytä uudet muutokset $3 $2 alkaen",
+       "rclistfrom": "Näytä uudet muutokset $3 kello $2 alkaen",
        "rcshowhideminor": "$1 pienet muutokset",
        "rcshowhideminor-show": "Näytä",
        "rcshowhideminor-hide": "Piilota",
        "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
-       "uploadscriptednamespace": "Tämä SVG-tiedosto sisältää nimiavaruuden ”$1”, joka ei ole sallittu.",
+       "uploadscriptednamespace": "Tämä SVG-tiedosto sisältää nimiavaruuden ”<nowiki>$1</nowiki>”, joka ei ole sallittu.",
        "uploadinvalidxml": "Ladatun tiedoston XML-koodia ei voitu jäsentää kunnolla.",
        "uploadvirus": "Tiedosto sisältää viruksen. Tarkemmat tiedot: $1",
        "uploadjava": "Tämä tiedosto on ZIP-tiedosto, joka sisältää Java .class-tiedoston.\nJava-tiedostojen tallentaminen ei ole sallittua, sillä ne saattavat aiheuttaa tietoturvariskejä.",
        "apisandbox-alert-field": "Tässä kentässä oleva arvo ei ole kelvollinen.",
        "apisandbox-continue": "Jatka",
        "apisandbox-continue-clear": "Tyhjennä",
+       "apisandbox-param-limit": "Kirjoita <kbd>max</kbd> käyttääksesi ylärajaa.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Kaikki nimiavaruudet)",
+       "apisandbox-multivalue-all-values": "$1 (Kaikki arvot)",
        "booksources": "Kirjalähteet",
        "booksources-search-legend": "Etsi kirjalähteitä",
        "booksources-isbn": "ISBN",
        "booksources-search": "Hae",
        "booksources-text": "Alla linkkejä ulkopuolisiin sivustoihin, joilla myydään uusia ja käytettyjä kirjoja. Sivuilla voi myös olla lisätietoa kirjoista.",
        "booksources-invalid-isbn": "Annettu ISBN-numero ei ole kelvollinen. Tarkista alkuperäisestä lähteestä kirjoitusvirheiden varalta.",
+       "magiclink-tracking-rfc": "Sivut, jotka käyttävät RFC-taikalinkkejä",
+       "magiclink-tracking-pmid": "Sivut, jotka käyttävät PMID-taikalinkkejä",
+       "magiclink-tracking-isbn": "Sivut, jotka käyttävät ISBN-taikalinkkejä",
        "specialloguserlabel": "Suorittaja:",
        "speciallogtitlelabel": "Kohde (sivu tai {{ns:user}}:käyttäjänimi):",
        "log": "Lokit",
        "activeusers-count": "$1 {{PLURAL:$1|toiminto|toimintoa}} viimeisen {{PLURAL:$3|päivän|$3 päivän}} aikana",
        "activeusers-from": "Näytä käyttäjät alkaen kohdasta:",
        "activeusers-groups": "Näytä käyttäjät, jotka kuuluvat ryhmiin:",
+       "activeusers-excludegroups": "Älä näytä käyttäjiä, jotka kuuluvat seuraaviin ryhmiin:",
        "activeusers-noresult": "Käyttäjiä ei löytynyt.",
        "activeusers-submit": "Hae aktiiviset käyttäjät",
        "listgrouprights": "Käyttäjäryhmien oikeudet",
        "emailccsubject": "Kopio lähettämästäsi viestistä osoitteeseen $1: $2",
        "emailsent": "Sähköposti lähetetty",
        "emailsenttext": "Sähköpostiviestisi on lähetetty.",
-       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
+       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}. Sähköpostisi lähetetään suoraan {{GENDER:$1|alkuperäiselle lähettäjälle}}, paljastaen {{GENDER:$2|sinun}} sähköpostiosoitteesi {{GENDER:$1|hänelle}}.",
        "usermessage-summary": "Jätetään järjestelmäviesti.",
        "usermessage-editor": "Järjestelmäviestittäjä",
        "watchlist": "Tarkkailulista",
        "addwatch": "Lisää tarkkailulistalle",
        "addedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
        "addedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
-       "addedwatchtext-short": "Sivu ”$1” on lisätty tarkkailulistallesi.",
+       "addedwatchtext-short": "Sivu \"$1\" on lisätty tarkkailulistallesi.",
        "removewatch": "Poista tarkkailulistalta",
        "removedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
        "removedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
        "changecontentmodel-legend": "Muuta sisältömallia",
        "changecontentmodel-title-label": "Sivun otsikko",
        "changecontentmodel-model-label": "Uusi sisältömalli",
-       "changecontentmodel-reason-label": "Syy:",
+       "changecontentmodel-reason-label": "Syy",
        "changecontentmodel-submit": "Tee muutos",
        "changecontentmodel-success-title": "Sisältömallia on muutettu",
        "changecontentmodel-success-text": "Sisältötyyppiä kohteessa [[:$1]] on muutettu.",
        "undeletehistorynoadmin": "Tämä sivu on poistettu. \nSyy sivun poistamiseen näkyy alla olevassa yhteenvedossa, jossa on myös tiedot, ketkä olivat muokanneet tätä sivua ennen poistamista. \nNäiden poistettujen versioiden varsinainen tekstisisältö on vain ylläpitäjien luettavissa.",
        "undelete-revision": "Poistettu versio sivusta $1 (aikaleima $4 kello $5). Version tekijä: $3.",
        "undeleterevision-missing": "Virheellinen tai puuttuva versio. \nSinulla on kenties käytössä väärä linkki, tai sitten versio on saatettu palauttaa takaisin tai poistaa arkistosta.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Yhtä versiota|$1 versiota}} ei voitu palauttaa, koska {{PLURAL:$1|sen|niiden}} <code>rev_id</code> oli jo käytössä.",
        "undelete-nodiff": "Aikaisempaa versiota ei löytynyt.",
        "undeletebtn": "Palauta",
        "undeletelink": "näytä tai palauta",
        "cant-move-to-user-page": "Sinulla ei ole oikeutta siirtää sivua käyttäjäsivuksi (paitsi käyttäjän alasivuksi).",
        "cant-move-category-page": "Sinulla ei ole oikeutta siirtää luokkien sivuja.",
        "cant-move-to-category-page": "Sinulla ei ole oikeutta siirtää sivua luokkasivuksi.",
+       "cant-move-subpages": "Sivulla ei ole oikeutta siirtää alasivuja.",
+       "namespace-nosubpages": "Nimiavaruus \"$1\" ei hyväksy alasivuja.",
        "newtitle": "Uusi nimi sivulle:",
        "move-watch": "Tarkkaile tätä sivua",
        "movepagebtn": "Siirrä sivu",
        "pageinfo-length": "Sivun pituus (tavuina)",
        "pageinfo-article-id": "Sivun tunnistenumero",
        "pageinfo-language": "Sivun sisällön kieli",
+       "pageinfo-language-change": "vaihda",
        "pageinfo-content-model": "Sivun sisältömalli",
        "pageinfo-content-model-change": "muuta",
        "pageinfo-robot-policy": "Hakukonemerkinnät",
        "tags-deactivate": "ota pois käytöstä",
        "tags-hitcount": "$1 {{PLURAL:$1|muutos|muutosta}}",
        "tags-manage-no-permission": "Sinulla ei ole oikeutta käsitellä merkkauksia.",
-       "tags-manage-blocked": "Et voi hallita muokkausmerkkauksia kun olet estettynä.",
+       "tags-manage-blocked": "Et voi hallita muokkausmerkkauksia, kun {{GENDER:$1|olet}} estettynä.",
        "tags-create-heading": "Luo uusi merkkaus",
        "tags-create-explanation": "Oletuksena on, että uutena luodut merkkaukset tulevat käyttäjien ja bottien käyttöön.",
        "tags-create-tag-name": "Merkkauksen nimi:",
        "tags-deactivate-not-allowed": "Ei ole mahdollista poistaa käytöstä merkkausta \"$1\".",
        "tags-deactivate-submit": "Poista käytöstä",
        "tags-apply-no-permission": "Sinulla ei ole oikeutta käyttää merkkauksia muutostesi yhteydessä.",
-       "tags-apply-blocked": "Et voi asettaa merkkauksia muutostesi yhteyteen kun olet estettynä.",
+       "tags-apply-blocked": "Et voi asettaa merkkauksia muutostesi yhteyteen, kun {{GENDER:$1|olet}} estettynä.",
        "tags-apply-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
        "tags-apply-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
        "tags-update-no-permission": "Sinulla ei ole oikeutta lisätä tai poistaa merkkauksia yksittäisissä sivuversioissa tai lokimerkinnöissä.",
-       "tags-update-blocked": "Et voi lisätä tai poistaa merkkauksia kun olet estettynä.",
+       "tags-update-blocked": "Et voi lisätä tai poistaa merkkauksia, kun {{GENDER:$1|olet}} estettynä.",
        "tags-update-add-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
        "tags-update-add-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
        "tags-update-remove-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua poistaa.",
        "htmlform-user-not-exists": "Käyttäjää <strong>$1</strong> ei ole olemassa.",
        "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-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-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)",
        "feedback-adding": "Lisätään palautetta sivulle...",
        "feedback-back": "Takaisin",
        "feedback-bugcheck": "Hyvä! Varmista vielä, että ohjelmointivirhettä ei löydy [$1 tunnettujen virheiden luettelosta].",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Hae {{GRAMMAR:elative|{{SITENAME}}}}",
        "searchsuggest-containing": "sisältää...",
-       "api-error-autoblocked": "Sinun IP-osoitteesi on estetty automaattisesti, koska sitä on käyttänyt estetty käyttäjätunnus.",
-       "api-error-badaccess-groups": "Sinulla ei ole oikeutta tallentaa tiedostoja tähän wikiin.",
        "api-error-badtoken": "Sisäinen virhe: virheellinen tarkistussumma.",
-       "api-error-blocked": "Sinut on estetty muokkaamasta.",
-       "api-error-copyuploaddisabled": "Tallentaminen URL-osoitteesta ei ole käytössä.",
-       "api-error-duplicate": "Samansisältöisiä tiedostoja löytyi {{PLURAL:$1|yksi kappale|useampia kappaleita}}.",
-       "api-error-duplicate-archive": "Sivustolla oli aiemmin {{PLURAL:$1|toinen samansisältöinen tiedosto|toisia samansisältöisiä tiedostoja}}, mutta {{PLURAL:$1|se|ne}} poistettiin.",
-       "api-error-empty-file": "Määrittämäsi tiedosto on tyhjä.",
        "api-error-emptypage": "Ei ole sallittua luoda uutta, tyhjää sivua.",
-       "api-error-fetchfileerror": "Sisäinen virhe: Jotakin meni pieleen kun tiedostoa haettiin.",
-       "api-error-fileexists-forbidden": "Tiedosto nimellä \"$1\" on jo olemassa eikä sitä voi korvata.",
-       "api-error-fileexists-shared-forbidden": "Tiedosto nimeltä \"$1\" on jo olemassa yhteisessä tietovarastossa eikä sitä voi korvata.",
-       "api-error-file-too-large": "Määrittämäsi tiedosto on liian iso.",
-       "api-error-filename-tooshort": "Tiedoston nimi on liian lyhyt.",
-       "api-error-filetype-banned": "Tämän tyyppisten tiedostojen tallentaminen on kielletty.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ei ole sallittu tiedostomuoto|eivät ole sallittuja tiedostomuotoja}}. {{PLURAL:$3|Sallittu tiedostomuoto on|Sallittuja tiedostomuotoja ovat}} $2.",
-       "api-error-filetype-missing": "Tiedostolta puuttuu tiedostopääte.",
-       "api-error-hookaborted": "Laajennuskoodi esti yrittämäsi muutoksen.",
-       "api-error-http": "Sisäinen virhe: palvelimeen ei saatu yhteyttä.",
-       "api-error-illegal-filename": "Tiedoston nimi ei kelpaa.",
-       "api-error-internal-error": "Sisäinen virhe: jotain meni vikaan tallennuksesi käsittelyssä.",
-       "api-error-invalid-file-key": "Sisäinen virhe: tiedostoa ei löytynyt välikaisvarastosta.",
-       "api-error-missingparam": "Sisäinen virhe: pyynnöstä puutuu parametreja.",
-       "api-error-missingresult": "Sisäinen virhe: ei voitu varmistaa, että tallennus onnistui.",
-       "api-error-mustbeloggedin": "Sinun pitää olla kirjautunut sisään, jotta voisit tallentaa tiedostoja.",
-       "api-error-mustbeposted": "Sisäinen virhe: HTTP POST-pyyntö edellytetty.",
-       "api-error-noimageinfo": "Tallennus onnistui, mutta palvelin ei antanut meille tietoja tiedostosta.",
-       "api-error-nomodule": "Sisäinen virhe: tallennusmoduulia ei ole asetettu.",
-       "api-error-ok-but-empty": "Sisäinen virhe: palvelimelta ei saatu vastausta.",
-       "api-error-overwrite": "Olemassa olevan tiedoston korvaaminen toisella ei ole sallittua.",
-       "api-error-ratelimited": "Yrität tallentaa lyhyessä ajassa enemmän tiedostoja kuin tämä wiki sallii.\nYritä uudelleen muutaman minuutin kuluttua.",
-       "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
        "api-error-publishfailed": "Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.",
-       "api-error-stasherror": "Tiedostoa ladattaessa tapahtui virhe.",
-       "api-error-stashedfilenotfound": "Tallennettavaa tiedostoa ei löytynyt säilöstä.",
-       "api-error-stashpathinvalid": "Hakupolku, jossa säilötyn tiedoston olisi pitänyt olla, oli virheellinen.",
-       "api-error-stashfilestorage": "Tiedoston tallentaminen säilöön epäonnistui.",
-       "api-error-stashzerolength": "Palvelin ei voinut säilöä tiedostoa, koska sen pituus oli nolla.",
-       "api-error-stashnotloggedin": "Sinun täytyy kirjautua sisään, jotta voit tallentaa tiedostoja lataussäilöön.",
-       "api-error-stashwrongowner": "Tiedosto, jota yritit käyttää säilössä, ei ole sinun omasi.",
-       "api-error-stashnosuchfilekey": "Tiedoston avainta, jota yritit käyttää säilössä, ei ole olemassa.",
-       "api-error-timeout": "Palvelin ei vastannut odotetun ajan kuluessa.",
-       "api-error-unclassified": "Tapahtui tuntematon virhe.",
-       "api-error-unknown-code": "Tuntematon virhe: $1.",
-       "api-error-unknown-error": "Sisäinen virhe: Jotain meni vikaan kun tiedostoasi yritettiin tallentaa.",
-       "api-error-unknown-warning": "Tuntematon varoitus: $1.",
+       "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
+       "api-error-unknown-warning": "Tuntematon varoitus: \"$1\".",
        "api-error-unknownerror": "Tuntematon virhe: $1.",
-       "api-error-uploaddisabled": "Tiedostojen tallentaminen ei ole käytössä.",
-       "api-error-verification-error": "Tiedosto voi olla vioittunut, tai sillä saattaa olla väärä tiedostopääte.",
-       "api-error-was-deleted": "Tämänniminen tiedosto on aikaisemmin tallennettu ja sittemmin poistettu.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunti|sekuntia}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuutti|minuuttia}}",
        "duration-hours": "$1 {{PLURAL:$1|tunti|tuntia}}",
        "pagelang-language": "Kieli",
        "pagelang-use-default": "Käytä oletuskieltä",
        "pagelang-select-lang": "Valitse kieli",
+       "pagelang-reason": "Syy",
        "pagelang-submit": "Lähetä",
+       "pagelang-nonexistent-page": "Sivua $1 ei ole olemassa.",
+       "pagelang-unchanged-language": "Sivu $1 on jo asetettu kielelle $2.",
+       "pagelang-db-failed": "Tietokanta epäonnistui vaihtamaan sivun kielen.",
        "right-pagelang": "Vaihtaa sivun kieli",
        "action-pagelang": "muuttaa sivun kieliasetuksia",
        "log-name-pagelang": "Kielenvaihtoloki",
        "mw-widgets-dateinput-no-date": "Ei ole valittu mitään päivää",
        "mw-widgets-dateinput-placeholder-day": "VVVV-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "VVVV-KK",
+       "mw-widgets-mediasearch-input-placeholder": "Etsi mediaa",
+       "mw-widgets-mediasearch-noresults": "Tuloksia ei löytynyt.",
        "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
        "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Lisää luokka...",
+       "mw-widgets-usersmultiselect-placeholder": "Lisää enemmän...",
        "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ä",
        "log-action-filter-block-reblock": "Estoasetusten muuttaminen",
        "log-action-filter-block-unblock": "Eston poistaminen",
        "log-action-filter-contentmodel-change": "Sisältömallin muuttaminen",
-       "log-action-filter-contentmodel-new": "Luotu sivu, jossa on poikkeava Sisältömalli",
+       "log-action-filter-contentmodel-new": "Luotu sivu, jossa on poikkeava sisältömalli",
        "log-action-filter-delete-delete": "Sivun poistaminen",
+       "log-action-filter-delete-delete_redir": "Ohjauksen päällekirjoitus",
        "log-action-filter-delete-restore": "Sivun palauttaminen",
        "log-action-filter-delete-event": "Lokimerkinnän poistaminen",
        "log-action-filter-delete-revision": "Version piilottaminen",
        "unlinkaccounts": "Poista tunnusten linkityksiä",
        "unlinkaccounts-success": "Tunnuksen linkitys poistettiin.",
        "authenticationdatachange-ignored": "Varmennustietojen muutosta ei käsitelty. Ehkä palveluntarjoajaa ei määritelty?",
+       "userjsispublic": "Huomio: JavaScript-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
+       "usercssispublic": "Huomio: CSS-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
        "restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1",
        "restrictionsfield-label": "Sallitut IP-alueet:",
-       "edit-error-short": "$1",
-       "edit-error-long": "Virheet:\n\n$1"
+       "revid": "versio $1",
+       "pageid": "sivun tunnistenumero $1"
 }
index 19113d8..eaef8b2 100644 (file)
@@ -12,7 +12,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Irus"
+                       "Irus",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Undirstrika leinki:",
        "passwordreset-emaildisabled": "Teldupost funksjónir eru óvirknar á hesi wiki.",
        "passwordreset-username": "Brúkaranavn:",
        "passwordreset-domain": "Umdømi (domain):",
-       "passwordreset-capture": "Sí tann endaliga t-postin?",
-       "passwordreset-capture-help": "Um tú setir kross við henda teigin, so verður t-posturin (við fyribils loyniorðinum) vístur fyri tær og verður harumframt sendur til brúkaran.",
        "passwordreset-email": "T-post adressur:",
        "passwordreset-emailtitle": "konto upplýsingar á {{SITENAME}}",
        "passwordreset-emailtext-ip": "Onkur (óiva tú, frá IP adressu $1) hevur biðið um nullstillan av tínum loyniorði til {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}\nsettar í samband við hesa t-post adressu:\n\n$2\n\n{{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.\nTú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.",
        "userinvalidcssjstitle": "'''Ávaring:''' Tað er onki skinn \"$1\".\nTilevnaðar .css og .js síður brúka heiti sum byrja við lítlum bókstavi, t.d.  {{ns:user}}:Foo/vector.css í mun til {{ns:user}}:Foo/Vector.css.",
        "updated": "(Dagført)",
        "note": "'''Viðmerking:'''",
-       "previewnote": "'''Minst til at hetta bara er ein forskoðan.'''\nTínar broytingar eru ikki goymdar enn!",
+       "previewnote": "<strong>Minst til at hetta bara er ein forskoðan.</strong>\nTínar broytingar eru ikki goymdar enn!",
        "continue-editing": "Far til økið har ið tú kanst gera rættingar",
        "previewconflict": "Henda forskoðanin vísir tekstin í erva soleiðis sum hann sær út, um tú velur at goyma.",
        "session_fail_preview": "'''Orsakað! Vit kundu ikki fullføra tínar broytingar, tí tínar sessións dáta eru horvin.'''\nVinarliga royn aftur.\nUm tað enn ikki virkar, royn so [[Special:UserLogout|rita út]] og rita so inn aftur.",
        "userrights-reason": "Orsøk:",
        "userrights-no-interwiki": "Tú hevur ikki loyvi til at rætta brúkara rættindi á øðrum wikium.",
        "userrights-nodatabase": "Dátugrunnurin $1 er ikki til ella er hann ikki lokalur.",
-       "userrights-nologin": "Tú mást [[Special:UserLogin|rita inn]] sum administrator fyri at kunna áseta brúkararættindi.",
-       "userrights-notallowed": "Tú hevur ikki loyvi til at geva ella taka burtur brúkara rættindi.",
        "userrights-changeable-col": "Bólkar sum tú kanst broyta",
        "userrights-unchangeable-col": "Bólkar, ið tú ikki kanst broyta",
        "userrights-conflict": "Ósamsvar viðvíkjandi broytingum í brúkararættindum! Vinarliga endurskoða og vátta tínar broytingar.",
-       "userrights-removed-self": "Tað eydnaðist tær at taka burtur tíni egnu rættindi. Tí kanst tú ikki longur fáa atgongd til hesa síðuna.",
        "group": "Bólkur:",
        "group-user": "Brúkarar",
        "group-autoconfirmed": "Sjálvvirkandi váttaðir brúkarar",
        "right-siteadmin": "Stong og læs upp dátugrunnin",
        "right-override-export-depth": "Útflyt síður, eisini slóðaðar síður upp til eina dýpd á 5",
        "right-sendemail": "Send t-post til aðrir brúkarar",
-       "right-passwordreset": "Sí teldupostar til nullstilling av loyniorði",
        "newuserlogpage": "Brúkara logg",
        "newuserlogpagetext": "Hetta er ein listi yvir seinast stovnaðu brúkarar.",
        "rightslog": "Rættindaloggur",
index ac1136b..bf31175 100644 (file)
                        "Dcausse",
                        "Lucas",
                        "Mabroukb",
-                       "Pymouss"
+                       "Pymouss",
+                       "Derugon",
+                       "Benoit Rochon",
+                       "Fitoschido",
+                       "Archaeodontosaurus"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "index-category": "Pages indexées",
        "noindex-category": "Pages non indexées",
        "broken-file-category": "Pages avec des liens de fichiers brisés",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "À propos",
        "article": "Page de contenu",
        "newwindow": "(ouvre dans une nouvelle fenêtre)",
        "searcharticle": "Lire",
        "history": "Historique de la page",
        "history_short": "Historique",
+       "history_small": "historique",
        "updatedmarker": "modifié depuis ma dernière visite",
        "printableversion": "Version imprimable",
        "permalink": "Adresse permanente",
        "views": "Affichages",
        "toolbox": "Outils",
        "tool-link-userrights": "Modifier les groupes de {{GENDER:$1|l’utilisateur|l’utilisatrice}}",
+       "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",
        "projectpage": "Voir la page du projet",
        "versionrequiredtext": "La version $1 de MediaWiki est nécessaire pour utiliser cette page.\nConsultez [[Special:Version|la page des versions]].",
        "ok": "Valider",
        "pagetitle": "$1 — {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Récupérée de « $1 »",
        "youhavenewmessages": "{{PLURAL:$3|Vous avez}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Vous avez}} $1 {{PLURAL:$3|d'un autre utilisateur|de $3 autres utilisateurs}} ($2).",
        "site-atom-feed": "Flux Atom de $1",
        "page-rss-feed": "Flux RSS de « $1 »",
        "page-atom-feed": "Flux Atom de « $1 »",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (page inexistante)",
        "sort-descending": "Tri décroissant",
        "sort-ascending": "Tri croissant",
        "nstab-main": "Page",
-       "nstab-user": "Page utilisateur",
+       "nstab-user": "Page {{GENDER:{{ROOTPAGENAME}}|utilisateur|utilisatrice}}",
        "nstab-media": "Média",
        "nstab-special": "Page spéciale",
        "nstab-project": "À propos",
        "nocookiesnew": "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} utilise des témoins (''cookies'') pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
        "nocookieslogin": "{{SITENAME}} utilise des témoins (''cookies'') pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter.",
        "nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les témoins (''cookies''), rechargez la page et essayez à nouveau.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement. Veuillez vous [[Special:UserLogin|connecter manuellement]].",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
        "passwordreset-emaildisabled": "Les fonctionnalités de courriel ont été désactivées sur ce wiki.",
        "passwordreset-username": "Nom d'utilisateur :",
        "passwordreset-domain": "Domaine :",
-       "passwordreset-capture": "Voir le courriel résultant ?",
-       "passwordreset-capture-help": "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu’il sera envoyé à l’utilisateur.",
        "passwordreset-email": "Adresse de courriel :",
        "passwordreset-emailtitle": "Détails du compte sur {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé une réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. \nVous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou si vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailelement": "Nom d’utilisateur : \n$1\n\nMot de passe temporaire : \n$2",
        "passwordreset-emailsentemail": "Si cette adresse de courriel est associée à votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsentusername": "S’il y a une adresse de courriel associée à ce nom d’utilisateur, alors un courriel de réinitialisation de mot de passe sera envoyé.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ici.",
-       "passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ici.",
        "passwordreset-nocaller": "Un appelant doit être fourni",
        "passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
        "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être qu’aucun fournisseur n’a été configuré ?",
        "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.",
        "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é :",
+       "summary-preview": "Aperçu du résumé de modification :",
        "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "blockedtitle": "L’utilisateur est bloqué.",
-       "blockedtext": "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : ''$2''.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
+       "blockedtext": "<strong>Votre compte utilisateur ou votre adresse IP a été bloqué.</strong>\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n:<em>$2:</em>\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité n’a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
+       "systemblockedtext": "Votre nom d'utilisateur ou votre adresse IP ont été bloqués par MediaWiki.\nLa raison donnée est la suivante:\n\n:<em>$2</em>\n\n* Le début du blocage: $8\n* Expiration d'un délai de blocage: $6\n* Elément concerné: $7\n\nVotre adresse IP actuelle est de $3.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous faites.",
        "blockednoreason": "aucune raison donnée",
        "whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
        "confirmedittext": "Vous devez confirmer votre adresse de courriel avant de modifier les pages.\nVeuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].",
        "content-model-text": "texte brut",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "Objet vide",
        "content-json-empty-array": "Tableau vide",
        "deprecated-self-close-category": "Pages utilisant des balises HTML auto-fermantes non valides",
        "last": "diff",
        "page_first": "première",
        "page_last": "dernière",
-       "histlegend": "Diff de sélection : cochez les boîtes 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 précédente version, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
+       "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",
        "histfirst": "les plus anciennes",
        "search-interwiki-caption": "Projets frères",
        "search-interwiki-default": "Résultats de $1 :",
        "search-interwiki-more": "(plus)",
+       "search-interwiki-more-results": "résultats supplémentaires",
        "search-relatedarticle": "Reliés",
        "searchrelated": "reliés",
        "searchall": "tout",
-       "showingresults": "Affichage de <b>$1</b> résultat{{PLURAL:$1||s}} à partir du n°<b>$2</b>.",
+       "showingresults": "Affichage de <strong>$1</strong> résultat{{PLURAL:$1||s}} à partir du n°<strong>$2</strong>.",
        "showingresultsinrange": "Afficher ci-dessous jusqu’à {{PLURAL:$1|<strong>1</strong> résultat|<strong>$1</strong> résultats}} dans la série #<strong>$2</strong> à #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Résultat <strong>$1</strong> parmi <strong>$3</strong>|Résultats <strong>$1 à $2</strong> parmi <strong>$3</strong>}}",
        "search-nonefound": "Il n'y a aucun résultat correspondant à la requête.",
        "search-external": "Recherche externe",
        "searchdisabled": "La recherche sur {{SITENAME}} est désactivée. En attendant la réactivation, vous pouvez effectuer une recherche via Google. Attention, leur indexation du contenu de {{SITENAME}} peut ne pas être à jour.",
        "search-error": "Une erreur s'est produite en recherchant : $1",
+       "search-warning": "Un avertissement a été signalé lors de la recherche : $1",
        "preferences": "Préférences",
        "mypreferences": "Préférences",
        "prefs-edits": "Nombre de modifications :",
        "saveprefs": "Enregistrer les préférences",
        "restoreprefs": "Restaurer tous les paramètres par défaut (dans toutes les sections)",
        "prefs-editing": "Modification",
-       "rows": "Rangées :",
-       "columns": "Colonnes :",
        "searchresultshead": "Filtrer avec cette valeur",
        "stub-threshold": "Seuil pour le formatage des liens d’ébauche ($1) :",
        "stub-threshold-sample-link": "exemple",
        "youremail": "Courriel :",
        "username": "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|du groupe|des groupes}} :",
+       "group-membership-link-with-expiry": "$1 (jusqu'à $2)",
        "prefs-registration": "Date d'inscription :",
        "yourrealname": "Nom réel :",
        "yourlanguage": "Langue :",
        "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-lookup-user": "Gestion des groupes d'utilisateurs",
+       "userrights-lookup-user": "Sélectionner un utilisateur",
        "userrights-user-editname": "Entrez un nom d'utilisateur :",
-       "editusergroup": "Modification des groupes d’{{GENDER:$1|utilisateurs}}",
+       "editusergroup": "Charger des groupes d’utilisateurs",
        "editinguser": "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modifier les groupes de l'utilisateur",
+       "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-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicite de :",
-       "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.",
+       "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-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-nologin": "Vous devez vous [[Special:UserLogin|connecter]] avec un compte d'administrateur pour modifier les droits utilisateur.",
-       "userrights-notallowed": "Vous n’avez pas la permission d’ajouter ou de supprimer des droits utilisateur.",
        "userrights-changeable-col": "Les groupes que vous pouvez modifier",
        "userrights-unchangeable-col": "Les groupes que vous ne pouvez pas modifier",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Expire le $1",
+       "userrights-expiry-none": "N'expire pas",
+       "userrights-expiry": "Date d’expiration :",
+       "userrights-expiry-existing": "Date d'expiration existante : $2 à $3",
+       "userrights-expiry-othertime": "Autre temps :",
+       "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-conflict": "Conflit de modification des droits utilisateur ! Veuillez relire et confirmer vos modifications.",
-       "userrights-removed-self": "Vous avez supprimé vos propres droits. Par conséquent, vous ne pouvez plus accéder à cette page.",
        "group": "Groupe :",
        "group-user": "Utilisateurs",
        "group-autoconfirmed": "Utilisateurs autoconfirmés",
        "right-move-rootuserpages": "Renommer la page principale d'un utilisateur",
        "right-move-categorypages": "Renommer des pages de catégorie",
        "right-movefile": "Renommer des fichiers",
-       "right-suppressredirect": "Ne pas créer de redirection depuis le titre d'origine en renommant les pages",
+       "right-suppressredirect": "Ne pas créer de redirection depuis le titre dorigine en renommant les pages",
        "right-upload": "Importer des fichiers",
        "right-reupload": "Écraser un fichier existant",
        "right-reupload-own": "Écraser un fichier que l'on a soi-même importé",
        "right-siteadmin": "Verrouiller ou déverrouiller la base de données",
        "right-override-export-depth": "Exporter les pages en incluant les pages liées jusqu'à une profondeur de 5 niveaux",
        "right-sendemail": "Envoyer un courriel aux autres utilisateurs",
-       "right-passwordreset": "Voir les courriels de réinitialisation des mots de passe",
        "right-managechangetags": "Créer et (dés)activer des [[Special:Tags|balises]]",
        "right-applychangetags": "Appliquer [[Special:Tags|les balises]] avec ses propres modifications",
        "right-changetags": "Ajouter et supprimer de façon arbitraire [[Special:Tags|des balises]] sur des révisions individuelles et des entrées de journal",
        "action-upload_by_url": "importer ce fichier à partir d'une adresse URL",
        "action-writeapi": "utiliser l‘API d'écriture",
        "action-delete": "supprimer cette page",
-       "action-deleterevision": "supprimer cette version",
-       "action-deletedhistory": "voir l’historique supprimé de cette page",
+       "action-deleterevision": "supprimer les révisions",
+       "action-deletelogentry": "supprimer les entrées de la trace",
+       "action-deletedhistory": "voir l’historique supprimé d’une page",
+       "action-deletedtext": "Afficher le texte de la révision supprimée",
        "action-browsearchive": "rechercher des pages supprimées",
-       "action-undelete": "restaurer cette page",
-       "action-suppressrevision": "visionner et rétablir cette version supprimée",
+       "action-undelete": "restaurer des pages",
+       "action-suppressrevision": "visionner et rétablir des révisions supprimées",
        "action-suppressionlog": "voir ce journal privé",
        "action-block": "bloquer en écriture cet utilisateur",
        "action-protect": "modifier les niveaux de protection pour cette page",
        "action-userrights-interwiki": "modifier les droits des utilisateurs sur d'autres wikis",
        "action-siteadmin": "verrouiller ou déverrouiller la base de données",
        "action-sendemail": "envoyer des courriels",
+       "action-editmyoptions": "modifier vos préférences",
        "action-editmywatchlist": "modifier votre liste de suivi",
        "action-viewmywatchlist": "afficher votre liste de suivi",
        "action-viewmyprivateinfo": "voir vos informations personnelles",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Lister",
+       "rcfilters-activefilters": "Filtres actifs",
+       "rcfilters-restore-default-filters": "Rétablir les filtres par défaut",
+       "rcfilters-clear-all-filters": "Effacer tous les filtres",
+       "rcfilters-search-placeholder": "Modifications récentes de filtres (naviguer ou commencer à saisir)",
+       "rcfilters-invalid-filter": "Filtre non valide",
+       "rcfilters-empty-filter": "Aucun filtre actif. Toutes les contributions sont affichées.",
+       "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-noresults": "Aucun filtre trouvé",
+       "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
+       "rcfilters-filter-registered-label": "Enregistré",
+       "rcfilters-filter-registered-description": "Éditeurs connectés.",
+       "rcfilters-filter-unregistered-label": "Désinscrit",
+       "rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
+       "rcfilters-filtergroup-authorship": "Modifier la paternité",
+       "rcfilters-filter-editsbyself-label": "Vos propres modifications",
+       "rcfilters-filter-editsbyself-description": "Vos modifications.",
+       "rcfilters-filter-editsbyother-label": "Modifications par d’autres.",
+       "rcfilters-filter-editsbyother-description": "Modifications créées par d’autres utilisateurs (pas vous).",
+       "rcfilters-filtergroup-userExpLevel": "Niveau d’expérience (uniquement pour les utilisateurs enregistrés)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nouveaux arrivants",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Moins de 10 modifications et 4 jours d’activité.",
+       "rcfilters-filter-userExpLevel-learner-label": "Apprentis",
+       "rcfilters-filter-userExpLevel-learner-description": "Davantage de jours d’activité et de modifications que les « Nouveaux arrivants » mais moins que les « Utilisateurs expérimentés ».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Utilisateurs expérimentés",
+       "rcfilters-filter-userExpLevel-experienced-description": "Plus de 30 jours d’activité et 500 modifications",
+       "rcfilters-filtergroup-automated": "Contributions automatisées",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Modifications faites par des outils automatisés.",
+       "rcfilters-filter-humans-label": "Humain (non robot)",
+       "rcfilters-filter-humans-description": "Modifications faites par des éditeurs humains.",
+       "rcfilters-filtergroup-significance": "Signification",
+       "rcfilters-filter-minor-label": "Modifications mineures",
+       "rcfilters-filter-minor-description": "Modifications que l’auteur a marquées comme mineures.",
+       "rcfilters-filter-major-label": "Modifications non mineures",
+       "rcfilters-filter-major-description": "Modifications non marquées comme mineures.",
+       "rcfilters-filtergroup-changetype": "Type de modification",
+       "rcfilters-filter-pageedits-label": "Modifications de page",
+       "rcfilters-filter-pageedits-description": "Modifications du contenu du wiki, des discussions, des descriptions des catégories…",
+       "rcfilters-filter-newpages-label": "Créations de page",
+       "rcfilters-filter-newpages-description": "Modifications créant de nouvelles pages.",
+       "rcfilters-filter-categorization-label": "Modifications de catégorie",
+       "rcfilters-filter-categorization-description": "Enregistrements de pages ajoutées ou supprimées des catégories.",
+       "rcfilters-filter-logactions-label": "Actions tracées",
+       "rcfilters-filter-logactions-description": "Actions d’administration, créations de compte, suppression de pages, téléchargements…",
        "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 utilisateur{{PLURAL:$1||s}} en train de suivre]",
        "rc_categories": "Limiter aux catégories (séparées par « | ») :",
        "rc_categories_any": "Une des sélectionnées",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après changement",
        "newsectionsummary": "/* $1 */ nouvelle section",
        "rc-enhanced-expand": "Voir les détails",
        "upload_directory_read_only": "Le serveur web n’a pas accès en écriture au répertoire d’import de fichier ($1).",
        "uploaderror": "Erreur lors de l’import",
        "upload-recreate-warning": "<strong>Attention : Un fichier portant ce nom a été supprimé ou déplacé.</strong>\n\nLe journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
-       "uploadtext": "Utilisez ce formulaire pour importer des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L’import est aussi enregistré dans le [[Special:Log/upload|journal d’import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien de la forme :\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code>''' pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code>''' pour lier directement vers le fichier sans l’afficher.",
+       "uploadtext": "Utilisez ce formulaire pour téléverser des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des fichiers téléversés]]. Les envois multiples sont également tracés dans le [[Special:Log/upload|journal des téléversements]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien ayant l'un des formats suivants :\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code></strong>, pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code></strong> pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code></strong> pour relier directement le fichier sans l’afficher.",
        "upload-permitted": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|autorisé|autorisés}} : $1.",
        "upload-preferred": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|préféré|préférés}} : $1.",
        "upload-prohibited": "‎{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|interdit|interdits}} : $1.",
        "emptyfile": "Le fichier que vous voulez importer semble vide.\nCeci peut être dû à une erreur dans le nom du fichier.\nVeuillez vérifier que vous désirez vraiment importer ce fichier.",
        "windows-nonascii-filename": "Ce wiki ne prend pas en charge les noms de fichiers avec des caractères spéciaux.",
        "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le remplacer.\n[[$1|thumb]]",
-       "filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n'existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n'apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page. \n[[$1|thumb]]",
+       "filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n’existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n’apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page.\n[[$1|thumb]]",
        "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nPeut-être voulez-vous utiliser un nom plus explicite ?",
        "fileexists-thumbnail-yes": "Le fichier semble être une image en taille réduite <em>(vignette)</em>. \n[[$1|thumb]]\nVeuillez vérifier le fichier <strong>[[:$1]]</strong>.\nSi le fichier vérifié est la même image avec la taille initiale, il n'y a pas besoin d'importer une version réduite.",
        "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.",
        "uploaded-setting-event-handler-svg": "Positionner les attributs du gestionnaire d’événements n'est pas possbile, <code>&lt;$1 $2=\"$3\"&gt;</code> trouvé dans le fichier SVG téléchargé.",
        "uploaded-setting-href-svg": "L’utilisation de la balise « set » pour ajouter un attribut « href » à l’élément parent est interdite.",
        "uploaded-wrong-setting-svg": "L’utilisation de la balise « set » pour ajouter une cible distante/données/script à un attribut quelconque est interdite. <code>&lt;set to=\"$1\"&gt;</code> a été trouvé dans le fichier SVG téléchargé.",
-       "uploaded-setting-handler-svg": "Les SVG qui positionnent l’attribut « handler » avec distant/données/script sont interdits. <code>$1=\"$2\"</code> a été trouvé dans le fichier SVG téléchargé.",
+       "uploaded-setting-handler-svg": "Les SVG qui positionnent l’attribut « handler » avec distant/données/script sont bloqués. <code>$1=\"$2\"</code> a été trouvé dans le fichier SVG téléchargé.",
        "uploaded-remote-url-svg": "Les SVG qui positionnent un attribut de style avec une URL distante sont bloqués. <code>$1=\"$2\"</code> trouvé dans le fichier SVG téléchargé.",
        "uploaded-image-filter-svg": "Filtre d’image avec URL trouvé : <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléchargé.",
-       "uploadscriptednamespace": "Ce fichier SVG contient un espace de noms '$1' non autorisé.",
+       "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é.",
        "uncategorizedcategories": "Catégories sans catégories",
        "uncategorizedimages": "Fichiers sans catégorie",
        "uncategorizedtemplates": "Modèles sans catégorie",
+       "uncategorized-categories-exceptionlist": "# Contient une liste de catégories, qui ne devraient pas être mentionnées sur Spécial:UncategorizedCategories. Une par ligne, en commençant par \"*\". Les lignes qui commencent avec un autre caractère (y compris les espaces) sont ignorées. Utilisez \"#\" pour les commentaires.",
        "unusedcategories": "Catégories inutilisées",
        "unusedimages": "Fichiers orphelins",
        "wantedcategories": "Catégories les plus demandées",
        "wantedpages": "Pages les plus demandées",
-       "wantedpages-summary": "Liste des pages inexistantes ayant le plus de lien vers elles, en excluant les pages n’ayant que des redirections pointant vers elles. Pour avoir une liste des pages inexistantes qui ont des redirections pointant vers elles, voyez [[{{#special:BrokenRedirects}}|la liste des redirections cassées]].",
+       "wantedpages-summary": "Liste des pages inexistantes ayant le plus de liens vers elles, en excluant les pages n’ayant que des redirections pointant vers elles. Pour avoir une liste des pages inexistantes qui ont des redirections pointant vers elles, voyez [[{{#special:BrokenRedirects}}|la liste des redirections cassées]].",
        "wantedpages-badtitle": "Titre invalide dans les résultats : $1",
        "wantedfiles": "Fichiers les plus demandés",
        "wantedfiletext-cat": "Les fichiers suivants sont utilisés, mais n'existent pas localement. Les fichiers qui se trouvent sur un dépôt externe peuvent être listés ici, bien qu'ils soient, de fait, déjà disponibles. Tous ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriées dans [[:$1]].",
        "apisandbox-sending-request": "Envoi de la requête à l'API...",
        "apisandbox-loading-results": "Réception des résultats de l'API...",
        "apisandbox-results-error": "Une erreur s'est produite lors du chargement de la réponse à la requête de l'API: $1.",
+       "apisandbox-request-selectformat-label": "Afficher les données de la requête comme :",
+       "apisandbox-request-format-url-label": "Chaîne de requête de l’URL",
        "apisandbox-request-url-label": "Requête URL :",
+       "apisandbox-request-json-label": "Demander du JSON :",
        "apisandbox-request-time": "Durée de la demande: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrigez le jeton et renvoyez",
        "apisandbox-results-fixtoken-fail": "Impossible de récupérer le jeton \"$1\"",
        "apisandbox-continue-clear": "Effacer",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuera] la dernière requête ; {{int:apisandbox-continue-clear}} effacera les paramètres relatifs à la continuation.",
        "apisandbox-param-limit": "Saisir <kbd>max</kbd> pour utiliser la limite maximale.",
+       "apisandbox-multivalue-all-namespaces": "$1 (tous les espaces de noms)",
+       "apisandbox-multivalue-all-values": "$1 (Toutes les valeurs)",
        "booksources": "Ouvrages de référence",
        "booksources-search-legend": "Rechercher parmi des ouvrages de référence",
        "booksources-isbn": "ISBN :",
        "linksearch-error": "Les caractères jokers ne peuvent être utilisés qu'au début du nom de domaine de l'hôte.",
        "listusersfrom": "Afficher les utilisateurs à partir de :",
        "listusers-submit": "Lister",
-       "listusers-noresult": "Aucun utilisateur trouvé. Vérifiez aussi les variantes de casse.",
+       "listusers-noresult": "Aucun utilisateur trouvé.",
        "listusers-blocked": "(bloqué{{GENDER:$1||e}})",
        "activeusers": "Liste des utilisateurs actifs",
        "activeusers-intro": "Ceci est une liste des utilisateurs qui ont exercé une quelconque activité au cours {{PLURAL:$1|de la dernière journée|des $1 derniers jours}}.",
        "activeusers-count": "$1 {{PLURAL:$1|action|actions}} lors {{PLURAL:$3|du dernier jour|des $3 derniers jours}}",
        "activeusers-from": "Afficher les utilisateurs depuis :",
        "activeusers-groups": "Afficher les utilisateurs appartenant aux groupes :",
+       "activeusers-excludegroups": "Exclure les utilisateurs appartenant aux groupes :",
        "activeusers-noresult": "Aucun utilisateur trouvé.",
        "activeusers-submit": "Afficher les utilisateurs actifs",
        "listgrouprights": "Droits des groupes d'utilisateurs",
        "emailccsubject": "Copie de votre message à $1 : $2",
        "emailsent": "Courriel envoyé",
        "emailsenttext": "Votre message a été envoyé par courriel.",
-       "emailuserfooter": "Ce courriel a été {{GENDER:$1|envoyé}} par « $1 » à « {{GENDER:$2|$2}} » par la fonction « {{int:emailuser}} » de {{SITENAME}}.",
+       "emailuserfooter": "Ce courriel a été {{GENDER:$1|envoyé}} par « $1 » à « {{GENDER:$2|$2}} » par la fonction « {{int:emailuser}} » de {{SITENAME}}. Si {{GENDER:$2|vous}} répondez à ce courriel, {{GENDER:$2|votre}} courriel sera envoyé directement à l’{{GENDER:$1|émetteur initial}}, en {{GENDER:$1|lui}} mentionnant {{GENDER:$2|votre}} adresse courriel .",
        "usermessage-summary": "Laisser un message système.",
        "usermessage-editor": "Messager du système",
        "watchlist": "Liste de suivi",
        "deletereason-dropdown": "* Motifs de suppression les plus courants\n** Pourriel\n** Vandalisme\n** Violation des droits d’auteur\n** Demande de l’auteur\n** Redirection cassée",
        "delete-edit-reasonlist": "Modifier les motifs de suppression de page",
        "delete-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa suppression de telles pages a été restreinte pour prévenir des perturbations accidentelles de {{SITENAME}}.",
-       "delete-warning-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;\nveuiller ne procéder qu'avec prudence.",
+       "delete-warning-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;\nveuillez procéder avec prudence.",
        "deleteprotected": "Vous ne pouvez pas supprimer cette page car elle a été protégée.",
        "deleting-backlinks-warning": "<strong>Attention :</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’autres pages]] ont un lien vers ou incorporent la page que vous allez supprimer.",
        "rollback": "Révoquer les modifications",
        "editcomment": "Le résumé de la modification était : <em>$1</em>.",
        "revertpage": "Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]",
        "revertpage-nouser": "Révocation des modifications par un utilisateur masqué à la dernière version par {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Révocation des modifications effectuées par $1 ;\nrétablissement de la dernière version par $2.",
+       "rollback-success": "Révocation des modifications effectuées par {{GENDER:$3|$1}} ;\nrétablissement de la dernière version par {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 Voir les changements]",
        "sessionfailure-title": "Erreur de session",
        "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
        "changecontentmodel-emptymodels-title": "Aucun modèle de contenu disponible",
        "changecontentmodel-emptymodels-text": "Le contenu sur [[:$1]] ne peut être converti en aucun type.",
        "log-name-contentmodel": "Journal de modification de modèle de contenu",
-       "log-description-contentmodel": "Événements relatifs aux modèles de contenu d’une page",
+       "log-description-contentmodel": "Cette page montre des modifications dans le modèle de contenu des pages, ainsi que les pages créées avec un modèle de contenu différent du contenu par défaut.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|a créé}} la page $3 en utilisant un modèle de contenu « $5 » autre que celui par défaut",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|a modifié}} le modèle de contenu de la page $3 de « $4 » en « $5 »",
        "logentry-contentmodel-change-revertlink": "rétablir",
        "tooltip-invert": "Cochez cette case pour cacher les modifications des pages dans l'espace de noms sélectionné (et l'espace de noms associé si coché)",
        "tooltip-whatlinkshere-invert": "Cochez cette case pour cacher les liens des pages dans l'espace de nom sélectionné.",
        "namespace_association": "Espace de noms associé",
-       "tooltip-namespace_association": "Cochez cette case pour inclure également l'espace de noms de discussion associé à l'espace de noms sélectionné",
+       "tooltip-namespace_association": "Cochez cette case pour inclure également l'espace de noms de discussion ou du sujet, associé à l'espace de noms sélectionné",
        "blanknamespace": "(Principal)",
        "contributions": "Contributions de l’{{GENDER:$1|utilisateur|utilisatrice}}",
        "contributions-title": "Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1",
        "ipb-confirm": "Confirmer le blocage",
        "badipaddress": "Adresse IP incorrecte",
        "blockipsuccesssub": "Blocage réussi",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e}}.<br />\nConsultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e}}.<br />\nConsultez la [[Special:BlockList|liste des blocages]] pour voir les utilisateurs bloqués.",
        "ipb-blockingself": "Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e}} de vouloir faire cela ?",
        "ipb-confirmhideuser": "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprimera le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr{{GENDER:||e}} de vouloir le faire ?",
        "ipb-confirmaction": "Si vous êtes sûr{{GENDER:||e}} de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
        "proxyblockreason": "Votre adresse IP a été bloquée car il s'agit d'un mandataire ouvert.\nVeuillez contacter votre fournisseur d'accès Internet ou votre support technique et l'informer de ce sérieux problème de sécurité.",
        "sorbsreason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.",
        "sorbs_create_account_reason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.\nVous ne pouvez pas créer un compte.",
+       "softblockrangesreason": "Les contributions anonymes ne sont pas autorisées à partir de votre adresse IP ($1). Veuillez vous connecter.",
        "xffblockreason": "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
        "cant-see-hidden-user": "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. \nN’ayant pas le droit de masquer des utilisateurs, vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
        "ipbblocked": "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué{{GENDER:||e}}.",
        "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (mais vous pouvez le faire vers une sous-page utilisateur).",
        "cant-move-category-page": "Vous n'avez pas la permission de renommer les pages de catégorie.",
        "cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
+       "cant-move-subpages": "Vous n’avez pas le droit de renommer des sous-pages.",
+       "namespace-nosubpages": "L’espace de noms « $1 » n’autorise pas les sous-pages.",
        "newtitle": "Nouveau titre :",
        "move-watch": "Suivre les pages originale et nouvelle",
        "movepagebtn": "Renommer la page",
        "pagemovedsub": "Renommage réussi",
        "movepage-moved": "<strong>« $1 » a été renommée en « $2 »</strong>",
-       "movepage-moved-redirect": "Une redirection depuis l'ancien nom a été créée.",
-       "movepage-moved-noredirect": "La création d'une redirection depuis l'ancien nom a été annulée.",
+       "movepage-moved-redirect": "Une redirection depuis lancien nom a été créée.",
+       "movepage-moved-noredirect": "La création d’une redirection depuis l’ancien nom a été annulée.",
        "articleexists": "Il existe déjà une page portant ce titre, ou le titre que vous avez choisi n'est pas correct.\nVeuillez en choisir un autre.",
        "cantmove-titleprotected": "Vous ne pouvez pas déplacer une page vers cet emplacement car la création de page avec ce nouveau titre a été protégée.",
        "movetalk": "Renommer aussi la page de discussion associée",
        "exporttext": "Vous pouvez exporter en XML le texte et l’historique d’une page ou d’un ensemble de pages.\nLe résultat peut alors être importé dans un autre wiki utilisant le logiciel MediaWiki via la [[Special:Import|page d’importation]].\n\nPour exporter des pages, entrez leurs titres dans la boîte de texte ci-dessous, à raison d’un titre par ligne. Sélectionnez si vous désirez la version actuelle avec toutes les anciennes versions, avec les lignes de l’historique de la page, ou simplement la page actuelle avec des informations sur la dernière modification.\n\nDans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pour la page [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Exporter toutes les pages",
        "exportcuronly": "Exporter uniquement la version courante, sans l’historique complet",
-       "exportnohistory": "----\n'''Note :''' l’exportation de l’historique complet des pages à l’aide de ce formulaire a été désactivée pour des raisons de performance.",
+       "exportnohistory": "----\n<strong>Note :</strong> l’exportation de l’historique complet des pages à l’aide de ce formulaire a été désactivée pour des raisons de performance.",
        "exportlistauthors": "Inclure une liste complète des contributeurs pour chaque page",
        "export-submit": "Exporter",
        "export-addcattext": "Ajouter les pages de la catégorie :",
        "javascripttest": "Test de JavaScript",
        "javascripttest-pagetext-unknownaction": "Action « $1 » inconnue.",
        "javascripttest-qunit-intro": "Voir [$1 la documentation de test] sur mediawiki.org.",
-       "tooltip-pt-userpage": "{{GENDER:|Votre}} page utilisateur",
+       "tooltip-pt-userpage": "Votre page {{GENDER:|utilisateur|utilisatrice}}",
        "tooltip-pt-anonuserpage": "La page utilisateur avec l'adresse IP de laquelle vous contribuez",
        "tooltip-pt-mytalk": "{{GENDER:|Votre}} page de discussion",
        "tooltip-pt-anontalk": "La page de discussion pour les contributions depuis cette adresse IP",
        "pageinfo-length": "Taille de la page (en octets)",
        "pageinfo-article-id": "Numéro de la page",
        "pageinfo-language": "Langue du contenu de la page",
+       "pageinfo-language-change": "modifier",
        "pageinfo-content-model": "Modèle de contenu de la page",
        "pageinfo-content-model-change": "modifier",
        "pageinfo-robot-policy": "Indexation par robots",
        "exif-copyrighted-false": "État des droits d’auteur non défini",
        "exif-photometricinterpretation-1": "Noir et blanc (0 pour le noir)",
        "exif-photometricinterpretation-4": "Masque de transparence",
+       "exif-photometricinterpretation-32803": "Matrice de Filtre de Couleur",
        "exif-unknowndate": "Date inconnue",
        "exif-orientation-1": "Normale",
        "exif-orientation-2": "Inversée horizontalement",
        "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-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",
        "revdelete-uname-unhid": "nom d'utilisateur affiché",
        "revdelete-restricted": "restrictions appliquées aux administrateurs",
        "revdelete-unrestricted": "restrictions retirées pour les administrateurs",
-       "logentry-block-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} avec la durée $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|a débloqué}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} $5 $6",
+       "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-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",
        "feedback-bugcheck": "Formidable ! Vérifiez simplement que ce n'est pas un des [$1 bogues déjà connus].",
        "feedback-external-bug-report-button": "Signaler un bogue technique",
        "feedback-dialog-title": "Soumettre un commentaire",
        "feedback-dialog-intro": "Vous pouvez utiliser le simple formulaire ci-dessous pour faire parvenir vos commentaires. Votre commentaire sera ajouté à la page « $1 », ainsi que votre nom d’utilisateur.",
-       "feedback-error1": "Erreur : Résultat de l'IPA non reconnu",
+       "feedback-error1": "Erreur : résultat de l'API non reconnu",
        "feedback-error2": "Erreur : la modification a échoué",
        "feedback-error3": "Erreur : aucune réponse de l'API",
        "feedback-error4": "Erreur : Impossible de publier sous le titre d’avis donné",
        "feedback-useragent": "Agent utilisateur :",
        "searchsuggest-search": "Rechercher sur {{SITENAME}}",
        "searchsuggest-containing": "contenant...",
-       "api-error-autoblocked": "Votre adresse IP a été bloquée automatiquement, parce qu’elle a été utilisée par un utilisateur bloqué.",
-       "api-error-badaccess-groups": "Vous n'êtes pas autorisé à verser des fichiers sur ce wiki.",
        "api-error-badtoken": "Erreur interne : mauvais « jeton ».",
-       "api-error-blocked": "Vous avez été bloqué en édition.",
-       "api-error-copyuploaddisabled": "Les versements via URL sont désactivés sur ce serveur.",
-       "api-error-duplicate": "Il y a déjà {{PLURAL:$1|un autre fichier présent|d'autres fichiers présents}} sur le site avec le même contenu.",
-       "api-error-duplicate-archive": "Il y avait déjà {{PLURAL:$1|un autre fichier présent|d'autres fichiers présents}} sur le site avec le même contenu, mais {{PLURAL:$1|il a été supprimé|ils ont été supprimés}}.",
-       "api-error-empty-file": "Le fichier que vous avez soumis était vide.",
        "api-error-emptypage": "Création de pages vide n'est pas autorisée.",
-       "api-error-fetchfileerror": "Erreur interne : Quelque chose s'est mal passé lors de la récupération du fichier.",
-       "api-error-fileexists-forbidden": "Un fichier nommé \"$1\" existe déjà, et ne peut pas être écrasé.",
-       "api-error-fileexists-shared-forbidden": "Un fichier nommé \"$1\" existe déjà dans le répertoire des fichiers partagés, et ne peut pas être écrasé.",
-       "api-error-file-too-large": "Le fichier que vous avez soumis était trop grand.",
-       "api-error-filename-tooshort": "Le nom du fichier est trop court.",
-       "api-error-filetype-banned": "Ce type de fichier est interdit.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|n'est pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. {{PLURAL:$3|Le type de fichier autorisé est |Les types de fichiers autorisés sont}} $2.",
-       "api-error-filetype-missing": "L'extension du fichier est manquante.",
-       "api-error-hookaborted": "La modification que vous avez essayé de faire a été annulée par une extension.",
-       "api-error-http": "Erreur interne : ne peut se connecter au serveur.",
-       "api-error-illegal-filename": "Le nom du fichier n'est pas autorisé.",
-       "api-error-internal-error": "Erreur interne : quelque chose s'est mal passé lors du traitement de votre import sur le wiki.",
-       "api-error-invalid-file-key": "Erreur interne : fichier non trouvé dans l'espace de stockage temporaire.",
-       "api-error-missingparam": "Erreur interne : Il manque des paramètres dans la requête.",
-       "api-error-missingresult": "Erreur interne : Nous n'avons pas pu déterminer si la copie avait réussi.",
-       "api-error-mustbeloggedin": "Vous devez être connecté pour télécharger des fichiers.",
-       "api-error-mustbeposted": "Erreur interne : cette requête nécessite la méthode HTTP POST.",
-       "api-error-noimageinfo": "Le téléversement a réussi, mais le serveur n'a pas donné d'informations sur le fichier.",
-       "api-error-nomodule": "Erreur interne : aucun module de versement défini.",
-       "api-error-ok-but-empty": "Erreur interne : Le serveur n'a pas répondu.",
-       "api-error-overwrite": "Écraser un fichier existant n'est pas autorisé.",
-       "api-error-ratelimited": "Vous essayez de téléverser plus de fichiers dans un court espace de temps que ce que ce wiki peut accepter.\nVeuillez réessayer dans quelques minutes.",
-       "api-error-stashfailed": "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
        "api-error-publishfailed": "Erreur interne : Le serveur n'a pas pu publier le fichier temporaire.",
-       "api-error-stasherror": "Une erreur s'est produite lors du téléchargement du fichier pour le dissimuler.",
-       "api-error-stashedfilenotfound": "Le fichier caché n’a pas été trouvé lors de la tentative pour le télécharger depuis sa cachette.",
-       "api-error-stashpathinvalid": "Le chemin où aurait dû se trouver le fichier caché n’est pas valide.",
-       "api-error-stashfilestorage": "Une erreur s’est produite en stockant le fichier dans la cachette.",
-       "api-error-stashzerolength": "Le serveur n’a pas pu cacher le fichier, car il a une taille de zéro.",
-       "api-error-stashnotloggedin": "Vous devez être connecté pour enregistrer des fichiers dans la cachette de téléchargement.",
-       "api-error-stashwrongowner": "Le fichier auquel vous essayez d’accéder dans la cachette ne vous appartient pas.",
-       "api-error-stashnosuchfilekey": "La clé du fichier auquel vous essayez d’accéder dans la cachette n’existe pas.",
-       "api-error-timeout": "Le serveur n'a pas répondu dans le délai imparti.",
-       "api-error-unclassified": "Une erreur inconnue s'est produite",
-       "api-error-unknown-code": "Erreur inconnue : « $1 »",
-       "api-error-unknown-error": "Erreur interne : quelque chose s'est mal passé lors du téléversement de votre fichier.",
-       "api-error-unknown-warning": "Avertissement inconnu : « $1 ».",
+       "api-error-stashfailed": "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
+       "api-error-unknown-warning": "Avertissement inconnu : « $1 ».",
        "api-error-unknownerror": "Erreur inconnue : « $1 ».",
-       "api-error-uploaddisabled": "Le téléversement est désactivé sur ce wiki.",
-       "api-error-verification-error": "Ce fichier est peut-être corrompu, ou son extension est incorrecte.",
-       "api-error-was-deleted": "Un fichier portant ce nom a déjà été importé puis supprimé.",
        "duration-seconds": "$1 seconde{{PLURAL:$1||s}}",
        "duration-minutes": "$1 minute{{PLURAL:$1||s}}",
        "duration-hours": "$1 heure{{PLURAL:$1||s}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|octet|octets}}",
        "limitreport-templateargumentsize": "Taille de l’argument du modèle",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|octet|octets}}",
-       "limitreport-expansiondepth": "Plus grande profondeur d’expansion",
+       "limitreport-expansiondepth": "Profondeur d’expansion maximale",
        "limitreport-expensivefunctioncount": "Nombre de fonctions d’analyse coûteuses",
        "expandtemplates": "Expansion des modèles",
-       "expand_templates_intro": "Cette page spéciale accepte un texte wiki source et permet de réaliser récursivement l’expansion des modèles qu’il contient.\nElle réalise aussi l’expansion des fonctions du parseur 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 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_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",
        "expand_templates_generate_rawhtml": "Afficher le HTML brut",
        "expand_templates_preview": "Aperçu du rendu",
        "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a l’HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et de vous reconnecter, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
-       "expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a HTML brut activé et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
+       "expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a activé le HTML brut et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
        "expand_templates_input_missing": "Vous devez fournir au moins un texte d’entrée.",
        "pagelanguage": "Modifier la langue de la page",
        "pagelang-name": "Page",
        "pagelang-language": "Langue",
        "pagelang-use-default": "Utiliser la langue par défaut",
        "pagelang-select-lang": "Sélectionner la langue",
+       "pagelang-reason": "Motif",
        "pagelang-submit": "Envoyer",
+       "pagelang-nonexistent-page": "La page $1 n’existe pas.",
+       "pagelang-unchanged-language": "La page $1 est déjà positionnée sur la langue $2.",
+       "pagelang-unchanged-language-default": "La page $1 est déjà positionnée dans la langue par défaut du contenu du wiki.",
+       "pagelang-db-failed": "La base de données n’a pas réussi à modifier la langue de la page.",
        "right-pagelang": "Changer la langue de la page",
        "action-pagelang": "changer la langue de la page",
        "log-name-pagelang": "Tracer les changements de langue",
        "mw-widgets-dateinput-no-date": "Aucune date sélectionnée",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Rechercher des médias",
+       "mw-widgets-mediasearch-noresults": "Aucun résultat trouvé.",
        "mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
        "mw-widgets-titleinput-description-redirect": "redirection vers $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Ajouter une catégorie...",
+       "mw-widgets-usersmultiselect-placeholder": "Ajouter plus ...",
        "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'')",
        "sessionprovider-nocookies": "Il est possible que les témoins (''cookies'') soient désactivés. Assurez-vous que vous avez activé les témoins et recommencez.",
        "randomrootpage": "Page racine aléatoire",
        "log-action-filter-block": "Type de blocage :",
-       "log-action-filter-contentmodel": "Type de modification de modèle de contenu :",
+       "log-action-filter-contentmodel": "Type de modification du modèle de contenu :",
        "log-action-filter-delete": "Type de suppression :",
        "log-action-filter-import": "Type d’import :",
        "log-action-filter-managetags": "Type d’action de gestion des étiquettes :",
        "log-action-filter-block-reblock": "Modification de blocage",
        "log-action-filter-block-unblock": "Débloquer",
        "log-action-filter-contentmodel-change": "Changement de modèle de contenu",
-       "log-action-filter-contentmodel-new": "Création de page avec un modèle de contenu non-standard",
+       "log-action-filter-contentmodel-new": "Création de page avec un modèle de contenu différent du contenu par défaut",
        "log-action-filter-delete-delete": "Suppression de pages",
+       "log-action-filter-delete-delete_redir": "Rediriger la réécriture",
        "log-action-filter-delete-restore": "Restauration de page",
        "log-action-filter-delete-event": "Suppression du journal",
        "log-action-filter-delete-revision": "Suppression de révison",
        "usercssispublic": "Veuillez noter: les sous-pages CSS ne doivent pas contenir de données confidentielles parce qu'elles sont visibles des autres utilisateurs.",
        "restrictionsfield-badip": "Adresse IP ou plage non valide : $1",
        "restrictionsfield-label": "Plages IP autorisées :",
-       "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Erreur : $1",
-       "edit-error-long": "Erreurs :\n\n$1"
+       "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "version $1",
+       "pageid": "ID de page $1"
 }
index 006492e..23b5493 100644 (file)
        "passwordreset-emaildisabled": "Les fonccionalitâts de mèssageria èlèctronica sont étâyes dèsactivâyes sur cél vouiqui.",
        "passwordreset-username": "Nom d’utilisator :",
        "passwordreset-domain": "Domêno :",
-       "passwordreset-capture": "Vos voléd vêre lo mèssâjo rèsultent ?",
-       "passwordreset-capture-help": "Se vos pouentâd cela câsa, lo mèssâjo (avouéc lo contresegno temporèro) vos serat montrâ quand serat mandâ a l’utilisator.",
        "passwordreset-email": "Adrèce èlèctronica :",
        "passwordreset-emailtitle": "Dètalys du comptio dessus {{SITENAME}}",
        "passwordreset-emailtext-ip": "Yon (de sûr vos, avouéc l’adrèce IP $1) at demandâ na remês’a zérô de voutron\ncontresegno por {{SITENAME}} ($4). {{PLURAL:$3|Ceti comptio utilisator est associyê|Cetos comptios utilisators sont associyês}}\na cel’adrèce èlèctronica :\n\n$2\n\n{{PLURAL:$3|Cél contresegno temporèro èxpirerat|Celos contresegnos temporèros èxpireront}} dens {{PLURAL:$5|un jorn|$5 jorns}}.\nOra vos vos dête branchiér et pués chouèsir un contresegno novél. Se cela demanda vint pas de vos\nou ben se vos vos éte rapelâ de voutron contresegno originâl et que vos en voléd pas més changiér,\nvos pouede ignorar cél mèssâjo et continuar a empleyér voutron viely contresegno.",
        "saveprefs": "Encartar",
        "restoreprefs": "Rètablir tota la configuracion per dèfôt (dedens totes les sèccions)",
        "prefs-editing": "Changement",
-       "rows": "Renches :",
-       "columns": "Colones :",
        "searchresultshead": "Rechèrche",
        "stub-threshold": "Lendâr por lo formatâjo des lims de vers los començons ($1) :",
        "stub-threshold-sample-link": "ègzemplo",
        "userrights-reason": "Rêson :",
        "userrights-no-interwiki": "Vos éd pas la pèrmission de changiér de drêts d’utilisator sur d’ôtros vouiquis.",
        "userrights-nodatabase": "La bâsa de balyês « $1 » ègziste pas ou ben est pas locâla.",
-       "userrights-nologin": "Vos vos dête [[Special:UserLogin|branchiér]] avouéc un comptio d’administrator por balyér de drêts d’utilisator.",
-       "userrights-notallowed": "Vos éd pas la pèrmission de balyér enlevar de drêts d’utilisator.",
        "userrights-changeable-col": "Les tropes que vos pouede changiér",
        "userrights-unchangeable-col": "Les tropes que vos pouede pas changiér",
        "userrights-conflict": "Disputa de changement de drêts d’utilisator ! Se vos plét, controlâd et pués confirmâd voutros changements.",
-       "userrights-removed-self": "Vos éd enlevâ los voutros drêts. Cen fât que vos pouede pas més arrevar a cela pâge.",
        "group": "Tropa :",
        "group-user": "Utilisators",
        "group-autoconfirmed": "Utilisators ôtoconfirmâs",
        "right-siteadmin": "Cotar et dècotar la bâsa de balyês",
        "right-override-export-depth": "Èxportar les pâges avouéc les pâges liyêes tant qu’a na provondior de 5 nivéls",
        "right-sendemail": "Mandar un mèssâjo ux ôtros utilisators",
-       "right-passwordreset": "Vêre los mèssâjos de remês’a zérô des contresegnos",
        "right-managechangetags": "Fâre et suprimar de [[Special:Tags|balises]] de la bâsa de balyês",
        "right-applychangetags": "Aplicar les [[Special:Tags|balises]] avouéc los sins changements",
        "right-changetags": "Apondre et enlevar de façon arbitrèra de [[Special:Tags|balises]] sur des vèrsions endividuèles et des entrês de jornâl",
        "uploaded-setting-handler-svg": "Los SVG que dèfenéssont l’atribut « handler » avouéc distant / balyês / scripte sont dèfendus. <code>$1=\"$2\"</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
        "uploaded-remote-url-svg": "Los SVG que dèfenéssont un atribut de stilo quint que seye avouéc un’URL distanta sont dèfendus. <code>$1=\"$2\"</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
        "uploaded-image-filter-svg": "Un filtro d’émâge avouéc URL est étâ trovâ : <code>&lt;$1 $2=\"$3\"&gt;</code> dedens lo fichiér SVG tèlèchargiê.",
-       "uploadscriptednamespace": "Cél fichiér SVG contint un èspâço de noms « $1 » pas ôtorisâ.",
+       "uploadscriptednamespace": "Cél fichiér SVG contint un èspâço de noms « <nowiki>$1</nowiki> » pas ôtorisâ.",
        "uploadinvalidxml": "Lo XML dedens lo fichiér tèlèchargiê at pas possu étre analisâ.",
        "uploadvirus": "Cél fichiér contint un virus !\nDètalys : $1",
        "uploadjava": "O est un fichiér ZIP que contint un fichiér Java « .class ».\nLo tèlèchargement de fichiérs Java est pas ôtorisâ, pôvont èvitar de rèstriccions de sècuritât.",
        "feedback-subject": "Sujèt :",
        "feedback-submit": "Sometre",
        "feedback-thanks": "Grant-marci ! Voutron avis at étâ postâ sur la pâge « [$2 $1] ».",
-       "searchsuggest-search": "Rechèrchiér",
+       "searchsuggest-search": "Rechèrchiér dessus {{SITENAME}}",
        "searchsuggest-containing": "que contint...",
-       "api-error-badaccess-groups": "Vos éte pas ôtorisâ a tèlèchargiér des fichiérs sur ceti vouiqui.",
        "api-error-badtoken": "Èrror de dedens : crouyo « jeton ».",
-       "api-error-copyuploaddisabled": "Los tèlèchargements per URL sont dèsactivâs sur cél sèrvor.",
-       "api-error-duplicate": "Y at {{PLURAL:$1|un ôtro fichiér|d’ôtros fichiérs}} ja sur lo seto avouéc lo mémo contegnu.",
-       "api-error-duplicate-archive": "Y avéve {{PLURAL:$1|un ôtro fichiér|d’ôtros fichiérs}} ja sur lo seto avouéc lo mémo contegnu, mas {{PLURAL:$1|il at étâ suprimâ|ils ont étâ suprimâs}}.",
-       "api-error-empty-file": "Lo fichiér que vos éd somês ére vouedo.",
        "api-error-emptypage": "La crèacion de pâges novèles vouedes est pas ôtorisâ.",
-       "api-error-fetchfileerror": "Èrror de dedens : quârque-ren s’est mâl passâ pendent la rècupèracion du fichiér.",
-       "api-error-file-too-large": "Lo fichiér que vos éd somês ére trop grant.",
-       "api-error-filename-tooshort": "Lo nom du fichiér est trop côrt.",
-       "api-error-filetype-banned": "Cél tipo de fichiér est dèfendu.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|est pas un tipo de fichiér ôtorisâ|sont pas des tipos de fichiérs ôtorisâs}}. {{PLURAL:$3|Lo tipo de fichiér ôtorisâ est|Los tipos de fichiérs ôtorisâs sont}} $2.",
-       "api-error-filetype-missing": "L’èxtension du fichiér est manquenta.",
-       "api-error-hookaborted": "Lo changement que vos éd tâchiê de fâre est étâ anulâ per n’èxtension.",
-       "api-error-http": "Èrror de dedens : sè pôt pas branchiér u sèrvor.",
-       "api-error-illegal-filename": "Lo nom du fichiér est pas ôtorisâ.",
-       "api-error-internal-error": "Èrror de dedens : quârque-ren s’est mâl passâ pendent lo trètament de voutron tèlèchargement sur lo vouiqui.",
-       "api-error-invalid-file-key": "Èrror de dedens : gins de fichiér trovâ dens lo stocâjo temporèro.",
-       "api-error-missingparam": "Èrror de dedens : manque des paramètres dens la requéta.",
-       "api-error-missingresult": "Èrror de dedens : nos ens pas possu dètèrmenar se la copia avéve reussia.",
-       "api-error-mustbeloggedin": "Vos dête étre branchiê por tèlèchargiér des fichiérs.",
-       "api-error-mustbeposted": "Èrror de dedens : la requéta at fôta d’HTTP POST.",
-       "api-error-noimageinfo": "Lo tèlèchargement at reussi, mas lo sèrvor at pas balyê d’enformacions sur lo fichiér.",
-       "api-error-nomodule": "Èrror de dedens : gins de modulo de tèlèchargement dèfeni.",
-       "api-error-ok-but-empty": "Èrror de dedens : lo sèrvor at pas rèpondu.",
-       "api-error-overwrite": "Ècllafar un fichiér ègzistent est pas ôtorisâ.",
        "api-error-stashfailed": "Èrror de dedens : lo sèrvor at pas possu encartar lo fichiér temporèro.",
-       "api-error-timeout": "Lo sèrvor at pas rèpondu dens lo dèlê atendu.",
-       "api-error-unclassified": "Una èrror encognua est arrevâ",
-       "api-error-unknown-code": "Èrror encognua : « $1 ».",
-       "api-error-unknown-error": "Èrror de dedens : quârque-ren s’est mâl passâ pendent lo tèlèchargement de voutron fichiér.",
        "api-error-unknown-warning": "Avèrtissement encognu : $1",
        "api-error-unknownerror": "Èrror encognua : « $1 ».",
-       "api-error-uploaddisabled": "Lo tèlèchargement est dèsactivâ sur ceti vouiqui.",
-       "api-error-verification-error": "Cél fichiér pôt étre corrompu, ou ben son èxtension est fôssa.",
        "duration-seconds": "$1 second{{PLURAL:$1|a|es}}",
        "duration-minutes": "$1 menut{{PLURAL:$1|a|es}}",
        "duration-hours": "$1 hor{{PLURAL:$1|a|es}}",
index a9446ce..a022551 100644 (file)
        "passwordreset-emaildisabled": "E-mail as üüb detheer Wiki ufknipset wurden.",
        "passwordreset-username": "Brükernööm:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Wel dü det e-mail nooracht uunluke?",
-       "passwordreset-capture-help": "Wan dü detheer kasche uunkrüsagst, woort det e-mail nooracht mä det nei paaswurd uunwiset an tu di brüker schüürd.",
        "passwordreset-email": "E-mail adres:",
        "passwordreset-emailtitle": "Brükerkonto aw {{SITENAME}}",
        "passwordreset-emailtext-ip": "Hoker mä det IP-Adres $1, woorskiinelk dü salew, wul hal brükerinformatsjuunen för {{SITENAME}} tusjüürd fu ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-adres ferbünjen:\n\n$2\n\n{{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. \nDü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää an dü din ual paaswurd käänst, do säärst dü niks widjer onernem. Melde di ianfach widjerhen mä din ual paaswurd uun.",
        "newarticle": "(Nei)",
        "newarticletext": "Dü beest en ferwisang tu en sidj fulagt, diar't noch ei jaft.\nAm det sidj iinturachten, skriiw dan tekst uun det fial för't bewerkin iin.\nÜüb det [$1 halepsidj] fanjst dü halep.\nWan dü ütj fersen heer beest, trak ianfach üüb di <strong>turag</strong>-knoop faan dan browser.",
        "anontalkpagetext": "----''Üüb detheer sidj könst dü en ünbekäänden brüker en nooracht du. Det lääpt auer sin IP adres. IP adresen kön faan flook brükern brükt wurd. Wan dü mä detheer nooracht niks began könst, do as det ferlicht för hoker ööders mend weesen. Dü säärst niks widjer onernem. Wan dü en aanj [[Special:CreateAccount|brükerkonto iinrachst]] of di [[Special:UserLogin|uunmeldest]], komt sowat ei weder föör.",
-       "noarticletext": "Üüb detdiar sidj stäänt noch niks.\nDü könst didiar tiitel üüb ööder sidjen [[Special:Search/{{PAGENAME}}|schük]],\n<span class=\"plainlinks\">uun [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logbuken schük] of detdiar sidj [{{fullurl:{{FULLPAGENAME}}|action=edit}} bewerke]</span>.",
+       "noarticletext": "Üüb detdiar sidj stäänt noch niks.\nDü könst didiar tiitel üüb ööder sidjen [[Special:Search/{{PAGENAME}}|schük]],\n<span class=\"plainlinks\">uun [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logbuken schük] of detdiar sidj [{{fullurl:{{FULLPAGENAME}}|action=edit}} maage]</span>.",
        "noarticletext-nopermission": "Üüb detdiar sidj stäänt noch niks, oober dü mutst diar uk niks iinskriiw.\nDü könst diar üüb ööder sidjen efter [[Special:Search/{{PAGENAME}}|schük]] of a <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAME}}}} logbuken uunluke].</span>",
        "missing-revision": "Det werjuun #$1 faan det sidj \"{{FULLPAGENAME}}\" jaft at ei.\n\nDet komt diar miast faan, dat en ual ferwisang stregen wurden as.\nDü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
        "userpage-userdoesnotexist": "Det brükerkonto ''$1'' as ei diar.\nWel dü detdiar sidj würelk maage/bewerke?",
        "saveprefs": "Iinstelangen seekre",
        "restoreprefs": "Normool iinstelangen weder haale (uun arke kirew)",
        "prefs-editing": "Bewerke",
-       "rows": "Räen:",
-       "columns": "Spleder:",
        "searchresultshead": "Schük",
        "stub-threshold": "Formatiarang faan links <a href=\"#\" class=\"stub\">för letj sidjen</a> (uun Byte):",
        "stub-threshold-disabled": "Ufsteld",
        "userrights-reason": "Grünj:",
        "userrights-no-interwiki": "Dü heest ei det rocht, am brükerrochten uun ööder wikis tu feranrin.",
        "userrights-nodatabase": "Det dootenbeenk $1 jaft at ei, tumanst ei lokaal.",
-       "userrights-nologin": "Dü mutst di mä en administraator-brükerkonto [[Special:UserLogin|uunmelde]], wan dü brükerrochten feranre wel.",
-       "userrights-notallowed": "Dü heest ei det rocht, am brükerrochten tu feranrin.",
        "userrights-changeable-col": "Lasmootskapen, diar dü feranre könst",
        "userrights-unchangeable-col": "Lasmootskapen, diar dü ei feranre könst",
        "userrights-conflict": "Konflikt bi't feranrin faan brükerrochten! Du din feranrangen noch ans iin.",
-       "userrights-removed-self": "Dü heest din aanj brükerrochtem stregen. Dü könst nü ei muar üüb det sidj tugrip.",
        "group": "Skööl:",
        "group-user": "Brükern",
        "group-autoconfirmed": "Registriaret brükern",
        "right-siteadmin": "Dootenbeenk spere an eebenmaage",
        "right-override-export-depth": "Sidjen an onersidjen bit tu en jipde faan 5 eksportiare",
        "right-sendemail": "E-mails tu ööder brükern schüür",
-       "right-passwordreset": "Paaswurd faan en brüker turagsaat an det e-mail diartu uunluke",
        "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an uun't dootenbeenk strik",
        "right-applychangetags": "[[Special:Tags|Markiarangen]] tuup mä ööder feranrangen brük",
        "right-changetags": "Feranre [[Special:Tags|markiarangen]] faan enkelt werjuunen of logbukiindracher",
        "uploaded-script-svg": "Skriptelement „$1“ uun det huuchschüürd SVG-datei fünjen.",
        "uploaded-hostile-svg": "Ünseeker CSS uun't style-element faan det huuchschüürd SVG-datei fünjen.",
        "uploaded-event-handler-on-svg": "Event-handler atributen <code>$1=\"$2\"</code> san uun SVG-datein ei tuläät.",
-       "uploadscriptednamespace": "Detdiar SVG-datei wiset üüb en ferkiarden nöömrüm \"$1\".",
+       "uploadscriptednamespace": "Detdiar SVG-datei wiset üüb en ferkiarden nöömrüm \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Det XML uun det huuchschüürd datei küd ei ''parset'' wurd.",
        "uploadvirus": "Uun detdiar datei as en wiirus! Details: $1",
        "uploadjava": "Detdiar as en ZIP-datei mä en CLASS-datei faan Java.\nJava-datein kön ei tuläät wurd, auer jo det seekerhaid uun fraag stel küd.",
        "javascripttest": "JavaScript-test",
        "javascripttest-pagetext-unknownaction": "Ünbekäänd aktjuun „$1“.",
        "javascripttest-qunit-intro": "Luke efter bi [$1 test dokumentatjuun] üüb mediawiki.org",
-       "tooltip-pt-userpage": "Din brükersidj",
+       "tooltip-pt-userpage": "{{GENDER:|Din}} brükersidj",
        "tooltip-pt-anonuserpage": "Brükersidj faan det IP-adres, faan huar ütj dü werkest",
-       "tooltip-pt-mytalk": "Din diskuschuunssidj",
+       "tooltip-pt-mytalk": "{{GENDER:|Din}} diskuschuunsidj",
        "tooltip-pt-anontalk": "Diskuschuun auer feranrangen faan detdiar IP-adres",
-       "tooltip-pt-preferences": "Min iinstelangen",
+       "tooltip-pt-preferences": "{{GENDER:|Din}} iinstelangen",
        "tooltip-pt-watchlist": "Sidjen, diar dü uun't uug behual wel",
-       "tooltip-pt-mycontris": "List mä aanj bidracher",
+       "tooltip-pt-mycontris": "List mä {{GENDER:|aanj}} bidracher",
        "tooltip-pt-login": "Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.",
        "tooltip-pt-logout": "Ufmelde",
        "tooltip-pt-createaccount": "Wees so gud an racht en brükerkonto iin an melde di uun. Dü säärst det oober ei.",
        "tooltip-t-recentchangeslinked": "Leetst feranrangen faan sidjen, huar faan heer üüb ferwiset woort",
        "tooltip-feed-rss": "RSS-feed för detdiar sidj",
        "tooltip-feed-atom": "Atom-feed för detdiar sidj",
-       "tooltip-t-contributions": "List mä bidracher faan didiar brüker uunluke",
+       "tooltip-t-contributions": "List mä bidracher faan {{GENDER:$1|didiar brüker|detdiar brüker}} uunluke",
        "tooltip-t-emailuser": "En e-mail tu didiar brüker schüür",
        "tooltip-t-info": "Muar auer detdiar sidj",
        "tooltip-t-upload": "Datein huuchschüür",
        "feedback-thanks": "Föl soonk. Dan komentaar as üüb det sidj „[$2 $1]“ skrewen wurden.",
        "feedback-thanks-title": "Föl soonk!",
        "feedback-useragent": "Brüker-agent:",
-       "searchsuggest-search": "Schük",
+       "searchsuggest-search": "Schük uun {{SITENAME}}",
        "searchsuggest-containing": "diar banen as ...",
-       "api-error-badaccess-groups": "Dü mutst nian datein tu detdiar Wiki huuchschüür.",
        "api-error-badtoken": "Intern feeler: Token as ferkiard.",
-       "api-error-copyuploaddisabled": "Det huuchschüüren auer URL as üüb didiar server ei aktiif.",
-       "api-error-duplicate": "Uun det Wiki {{PLURAL:$1|as al en ööder datei|san al muar datein}} mä detsalew banen.",
-       "api-error-duplicate-archive": "Diar wiar al {{PLURAL:$1|ööder datei|ööder datein}} mä detsalew banen. {{PLURAL:$1|Hat as |Jo san}} oober stregen wurden.",
-       "api-error-empty-file": "Det datei, wat dü huuchschüürd heest, as leesag.",
        "api-error-emptypage": "Dü mutst nian leesag sidjen nei iinstel.",
-       "api-error-fetchfileerror": "Intern feeler: Bi't ufrepen faan det datei as wat skiaf gingen.",
-       "api-error-fileexists-forbidden": "En datei mä di nööm „$1“ as al diar. Hat koon ei auerskrewen wurd.",
-       "api-error-fileexists-shared-forbidden": "En date mä di nööm „$1“ as al uun't gemiansoom archiif an koon ei auerskrewen wurd.",
-       "api-error-file-too-large": "Det datei, wat dü huuchschüürd heest, as tu grat.",
-       "api-error-filename-tooshort": "Di dateinööm as tu kurt.",
-       "api-error-filetype-banned": "Son slach faan datei as ei tuläät.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|as nään tuläät slach faan datein|san nian tuläät slacher faan datein}}.\n{{PLURAL:$3|En tuläät slach as|Tuläät slacher san}} $2.",
-       "api-error-filetype-missing": "Det datei, wat dü huuchschüür wel, hää nian dateiaanj.",
-       "api-error-hookaborted": "Det feranrang, wat dü maage wulst, as faan en ütjwidjet software-funktjuun ufbreegen wurden.",
-       "api-error-http": "Intern feeler: Ferbinjang tu a server as skiaf gingen.",
-       "api-error-illegal-filename": "Didiar dateinööm as ei tuläät.",
-       "api-error-internal-error": "Intern feeler: diar as wat skiaf gingen bi't huuchschüüren faan det datei tu det Wiki.",
-       "api-error-invalid-file-key": "Intern feeler: Det datei as uun det tidjwiis archiif ei fünjen wurden.",
-       "api-error-missingparam": "Intern feeler: Det uunfraag as ei hial uunkimen.",
-       "api-error-missingresult": "Intern feeler: Küd ei luke, of det kopiarin loket hää.",
-       "api-error-mustbeloggedin": "Dü skel di uunmelde, am datein huuchtuschüüren.",
-       "api-error-mustbeposted": "Intern feeler: Ferkiard HTTP-muude.",
-       "api-error-noimageinfo": "Det huuchschüüren hää loket, oober di server hää nian datei-dooten.",
-       "api-error-nomodule": "Intern feeler: Diar as nian modul tu huuchschüüren fäästlaanj wurden.",
-       "api-error-ok-but-empty": "Intern feeler: Di server sait niks.",
-       "api-error-overwrite": "Dü könst nian datei auerskriiw, wat al diar as.",
-       "api-error-stashfailed": "Intern feeler: Di server küd nian tidjwiis datei seekre.",
        "api-error-publishfailed": "Intern feeler: Di server küd det tidjwiis datei ei widjer schüür.",
-       "api-error-stasherror": "Bi't huuchschüüren faan detdiar datei as wat skiaf gingen.",
-       "api-error-stashedfilenotfound": "Det datei, wat al ans seekert wurden as, küd bi't huuchloosin ei fünjen wurd.",
-       "api-error-stashpathinvalid": "Det steed, huar det seekert datei fünjen wurd skul, jaft at ei.",
-       "api-error-stashfilestorage": "Bi't seekrin faan detdiar datei uun a spiiker as wat skiaf gingen.",
-       "api-error-stashzerolength": "Di server küd det datei ei seekre, auer hat man bluas nul bytes grat as.",
-       "api-error-stashnotloggedin": "Dü skel uunmeldet wees, wan dü datein uun a spiiker seekre wel.",
-       "api-error-stashwrongowner": "Det datei, huar dü uun a spiiker üüb tugrip wulst, hiart di ei.",
-       "api-error-stashnosuchfilekey": "Di datei-kai, huar dü uun a spiiker üüb tugrip wulst, as ei diar.",
-       "api-error-timeout": "Di server hää ei rochttidjag swaaret (time-out).",
-       "api-error-unclassified": "Diar as irgentwat skiaf gingen.",
-       "api-error-unknown-code": "Ünbekäänd feeler: „$1“",
-       "api-error-unknown-error": "Intern feeler: Bi't huuchschüüren faan det datei as wat skiaf gingen.",
+       "api-error-stashfailed": "Intern feeler: Di server küd nian tidjwiis datei seekre.",
        "api-error-unknown-warning": "Ünbekäänd wäärnang: $1",
        "api-error-unknownerror": "Ünbekäänd feeler: „$1“",
-       "api-error-uploaddisabled": "Uun detdiar Wiki könst dü niks huuchschüür.",
-       "api-error-verification-error": "Det datei, wat dü huuchschüür wel, as uunstaken of hää en ferkiard dateiaanj.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minüüt|minüüten}}",
        "duration-hours": "$1 {{PLURAL:$1|stünj|stünjen}}",
index 93fb479..5bd8f3b 100644 (file)
@@ -17,6 +17,7 @@
        "tog-hideminor": "Falaich mùthaidhean beaga ann an liosta nam mùthaidhean ùra",
        "tog-hidepatrolled": "Falaich mùthaidhean fo fhreiceadan ann an liosta nam mùthaidhean ùra",
        "tog-newpageshidepatrolled": "Falaich duilleagan fo fhreiceadan ann an liosta nan duilleagan ùra",
+       "tog-hidecategorization": "Falaich roinnean nan duilleagan",
        "tog-extendwatchlist": "Leudaich an clàr-faire gus an seall e gach mùthadh 's chan ann an fheadhainn as ùire a-mhàin",
        "tog-usenewrc": "Buidhnich na h-atharraichean a-rèir duilleige sna mùthaidhean ùra agus air a' chlàr-fhaire",
        "tog-numberheadings": "Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin",
@@ -27,6 +28,7 @@
        "tog-watchdefault": "Cuir duilleagan a dheasaicheas mi air a' chlàr-fhaire agam",
        "tog-watchmoves": "Cuir duilleagan a ghluaiseas mi air a' chlàr-fhaire agam",
        "tog-watchdeletion": "Cuir duilleagan a sguabas mi às air a' chlàr-fhaire agam",
+       "tog-watchuploads": "Cuir faidhlichean ùra ris a luchdaicheas mi suas dhan liosta-fhaire agam",
        "tog-watchrollback": "Cuir duilleagan air an do rinn mi roladh air ais air a' chlàr-fhaire agam",
        "tog-minordefault": "Comharraich gach mùthadh mar mhùthadh beag a ghnàth",
        "tog-previewontop": "Nochd an ro-shealladh os cionn a' bhogsa deasachaidh",
@@ -36,7 +38,7 @@
        "tog-enotifminoredits": "Cuir post-dealain thugam nuair a nithear mùthadh beag air duilleagan cuideachd",
        "tog-enotifrevealaddr": "Nochd an seòladh puist-d agam ann am brathan-naidheachd puist-d",
        "tog-shownumberswatching": "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
-       "tog-oldsig": "An t-earr-sgrìobhadh làithreach:",
+       "tog-oldsig": "An t-earr-sgrìobhadh làithreach agad:",
        "tog-fancysig": "Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)",
        "tog-uselivepreview": "Cleachd an ro-shealladh beò",
        "tog-forceeditsummary": "Cuir ceist nuair a dh'fhàgas mi gearr-chunntas an deasachaidh bàn",
        "tog-watchlisthidebots": "Falaich mùthaidhean nam bot air mo chlàr-faire",
        "tog-watchlisthideminor": "Falaich mùthaidhean beaga air mo chlàr-faire",
        "tog-watchlisthideliu": "Falaich mùthaidhean le cleachdaichean a tha air logadh a-steach air mo chlàr-faire",
+       "tog-watchlistreloadautomatically": "Ath-luchdaich an liosta-fhaire gu fèin-obrachail uair sam bith a thèid criathrag atharrachadh (feum air JavaScript)",
        "tog-watchlisthideanons": "Falaich mùthaidhean le cleachdaichean gun ainm air mo chlàr-faire",
        "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air a' chlàr-fhaire agam",
+       "tog-watchlisthidecategorization": "Falaich roinnean nan duilleagan",
        "tog-ccmeonemails": "Cuir lethbhric de phuist-dhealain a chuireas mi do chleachdaichean eile thugam",
        "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaran",
        "tog-showhiddencats": "Seall na roinnean-seòrsa falaichte",
        "category-file-count-limited": "Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
        "listingcontinuesabbrev": "(an corr)",
        "index-category": "Duilleagan air a' chlàr-innse",
-       "noindex-category": "Duilleagan nach eil air a' chlàr-innse",
+       "noindex-category": "Duilleagan nach deach inneacsadh",
        "broken-file-category": "Duilleagan sa bheil ceanglaichean faidhle a tha briste",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Mu",
        "newwindow": "(a' fosgladh ann an uinneag ùr)",
        "cancel": "Sguir dheth",
        "moredotdotdot": "Barrachd...",
-       "morenotlisted": "Chan eil an liosta seo iomlan.",
+       "morenotlisted": "Dh’fhaoidte nach eil an liosta seo iomlan.",
        "mypage": "Duilleag",
        "mytalk": "Deasbaireachd",
        "anontalk": "Deasbaireachd",
        "tagline": "O {{SITENAME}}",
        "help": "Cobhair",
        "search": "Lorg",
+       "search-ignored-headings": " #<!-- fàg an loidhne seo dìreach mar a tha e --> <pre>\n# Ceann-sgrìobhaidhean nach doir lorg for dhaibh.\n# Bidh buaidh aig na h-atharraichean seo cho luath ’s a thèid an ceann-sgrìobhadh inneacsadh.\n# ’S urrainn dhut ath-inneacsadh a sparradh air an t-siostam le bhith a’ sàbhalachadh deasachadh neoinitheach.\n# Seo an co-chàradh:\n#   * Tha rud sam bith eadar caractar “#” agus deireadh loidhne ’na bheachd.\n#   * Ma tha loidhne sam bith ann nach eil bàn, sin an tiotal a thèid a leigeil seachad.\nIomraidhean\nCeanglaichean ris an taobh a-muigh\nFaic na leanas cuideachd\n #</pre> <!-- fàg an loidhne seo dìreach mar a tha e -->",
        "searchbutton": "Lorg",
        "go": "Siuthad",
        "searcharticle": "Siuthad",
        "history": "Eachdraidh na duilleige",
        "history_short": "Eachdraidh",
+       "history_small": "eachdraidh",
        "updatedmarker": "air ùrachadh on turas mu dheireadh a thadhail mi air",
        "printableversion": "Tionndadh a ghabhas a chlò-bhualadh",
        "permalink": "Ceangal buan",
        "talk": "Deasbaireachd",
        "views": "Tadhalan",
        "toolbox": "Innealan",
+       "tool-link-userrights": "Atharraich buidhnean nan {{GENDER:$1|cleachdaichean}}",
+       "tool-link-userrights-readonly": "Seall buidhnean nan {{GENDER:$1|cleachdaichean}}",
+       "tool-link-emailuser": "Cuir post gun {{GENDER:$1|chleachdaiche}} seo",
        "userpage": "Seall duilleag a' chleachdaiche",
        "projectpage": "Seall duilleag a' phròiseict",
        "imagepage": "Seall duilleag an fhaidhle",
        "eauthentsent": "Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.\nMus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an stiùireadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.",
        "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde.",
        "mailerror": "Mearachd a' cur post: $1",
-       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad anns na $2 seo chaidh agus sin an àireamh as motha a tha ceadaichte.\nChan urrainn do dh’aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin aig an àm seo.",
        "emailauthenticated": "Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.",
        "emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na feartan a leanas.",
        "noemailprefs": "Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.",
        "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicidh seo.",
        "passwordreset-username": "Ainm-cleachdaiche:",
        "passwordreset-domain": "Àrainn-lìn:",
-       "passwordreset-capture": "A bheil thu airson coimhead air a' phost-d?",
-       "passwordreset-capture-help": "Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.",
        "passwordreset-email": "Seòladh puist-d:",
        "passwordreset-emailtitle": "Dàta a' chunntais air {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut logadh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
        "minoredit": "Seo mùthadh beag",
        "watchthis": "Cum sùil air an duilleag seo",
        "savearticle": "Sàbhail an duilleag",
+       "savechanges": "Sàbhail na dh’atharraich thu",
        "publishpage": "Foillsich an duilleag",
        "publishchanges": "Foillsich na mùthaidhean",
        "preview": "Ro-shealladh",
        "searchprofile-advanced-tooltip": "Lorg am broinn ainm-spàsan gnàthaichte",
        "search-result-size": "$1 ({{PLURAL:$2|$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
        "search-result-category-size": "{{PLURAL:$1|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|$2 fho-roinn-seòrsa|$2 fho-roinn-seòrsa|$2 fo-roinnean-seòrsa|$2 fo-roinn-seòrsa}}, {{PLURAL:$3|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
-       "search-redirect": "(ag ath-sheòladh $1)",
+       "search-redirect": "(ag ath-sheòladh $1)",
        "search-section": "(earrann $1)",
        "search-category": "(roinn-seòrsa $1)",
        "search-file-match": "(a' freagairt ri susbaint an fhaidhle)",
        "saveprefs": "Sàbhail",
        "restoreprefs": "Aisig na roghainnean bunaiteach uile (anns gach earrann)",
        "prefs-editing": "Deasachadh",
-       "rows": "Sreathan",
-       "columns": "Colbhan",
        "searchresultshead": "Lorg",
        "stub-threshold": "An stairsneach airson fòrmatadh cheanglaichean nam bun ($1):",
        "stub-threshold-disabled": "À comas",
        "prefswarning-warning": "Rinn thu atharrachadh air na roghainnean agad nach deach a shàbhaladh fhathast.\nCha tèid na roghainnean agad ùrachadh ma dh'fhàgas tu an duilleag seo gun bhriogadh air \"$1\".",
        "prefs-tabs-navigation-hint": "Gliocas: 'S urrainn dhut na h-iuchraichean saighde chlì 's dheas a chleachdadh gus leum a ghearradh o thaba gu taba air liosta nan taba.",
        "userrights": "Stiùireadh ceadan a' chleachdaiche",
-       "userrights-lookup-user": "Stiùirich na buidhnean chleachdaichean",
+       "userrights-lookup-user": "Tagh cleachdaiche",
        "userrights-user-editname": "Cuir a-steach ainm-cleachdaiche:",
-       "editusergroup": "Deasaich na buidhnean {{GENDER:$1|chleachdaichean}}",
+       "editusergroup": "Luchdaich buidhnean nan cleachdaichean",
        "editinguser": "Ag atharrachadh ceadan a’ {{GENDER:$1|chleachdaiche}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Deasaich na buidhnean chleachdaichean",
+       "userrights-editusergroup": "Deasaich buidhnean {{GENDER:$1|a’ chleachdaiche}}",
        "saveusergroups": "Sàbhail na buidhnean {{GENDER:$1|chleachdaichean}}",
        "userrights-groupsmember": "Ball de:",
        "userrights-groupsmember-auto": "Ball fèin-obrachail de:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "'S urrainn dhut na buidhnean sa bheil an cleachdaiche seo 'na bhall atharrachadh:\n* Is ciall dha chromag sa bhogsa gu bheil an cleachdaiche seo 'na bhall sa buidheann.\n* Is ciall dha bhogsa gun chromag ris nach eil an cleachdaiche seo 'na bhall sa buidheann.\n* Innsidh * dhut nach urrainn dhut am buidheann a thoirt air falbh nuair a bhios tu air a chur ris no an caochladh.",
+       "userrights-groups-help": "’S urrainn dhut na buidhnean sa bheil an cleachdaiche seo ’na b(h)all atharrachadh:\n* Is ciall do chromag sa bhogsa gu bheil an cleachdaiche seo ’na bhall sa buidheann.\n* Is ciall do bhogsa gun chromag nach eil an cleachdaiche seo ’na bhall sa buidheann.\n* Innsidh * dhut nach urrainn dhut am buidheann a thoirt air falbh nuair a bhios tu air a chur ris no a chaochladh.\n* Innsidh # dhut nach urrainn dhut latha nas tràithe a thaghadh air am falbh an ùine air a’ bhuidheann seo, dìreach latha nas anmoiche.",
        "userrights-reason": "Adhbhar:",
        "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicidhean eile.",
        "userrights-nodatabase": "Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.",
-       "userrights-nologin": "Feumaidh tu [[Special:UserLogin|logadh a-steach]] le cunntas rianaire ach an toir thu ceadan nam ball seachad.",
-       "userrights-notallowed": "Chan eil cead agad gus ceadan nam ball a chur ris no a thoirt air falbh.",
        "userrights-changeable-col": "Buidhnean as urrainn dhut atharrachadh",
        "userrights-unchangeable-col": "Buidhnean nach urrainn dhut atharrachadh",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Tha còmhstri le atharraichean air ceadan nam ball! Thoir sùil air a-rithist 's dearbhaich na h-atharraichean agad.",
-       "userrights-removed-self": "Tha thu air na ceadan agad fhèin a thoirt air falbh. Mar sin, chan eil cead agad tuilleadh gus an duilleag seo inntrigeadh.",
        "group": "Buidheann:",
        "group-user": "Cleachdaichean",
        "group-autoconfirmed": "Cleachdaichean fèin-dearbhte",
        "right-siteadmin": "Cead gus an stòr-dàta a glasadh 's a' ghlas a thoirt fo bharr",
        "right-override-export-depth": "Cead gus duilleagan às-phortadh, a' gabhail a-seach duilleagan ceangailte suas ri doimhneachd de 5",
        "right-sendemail": "Cead gus puist-d a chur gu cleachdaichean eile",
-       "right-passwordreset": "Cead gus puist-d ath-shuidheachadh nam facal-faire a shealltainn",
        "right-managechangetags": "Cruthaich is gnìomhaich no neo-ghnìomhaich [[Special:Tags|tagaichean]]",
        "newuserlogpage": "Loga cruthachadh nan cleachdaichean",
        "newuserlogpagetext": "Seo loga nan cleachdaichean a chaidh a chruthachadh.",
        "rightslogtext": "Seo loga nan atharraichean air ceadan nan cleachdaichean.",
        "action-read": "leugh an duilleag seo",
        "action-edit": "deasaich an duilleag seo",
-       "action-createpage": "cruthaich duilleagan",
-       "action-createtalk": "cruthaich duilleagan deasbaireachd",
+       "action-createpage": "an duilleag seo a chruthachadh",
+       "action-createtalk": "an duilleag deasbaireachd seo a chruthachadh",
        "action-createaccount": "cruthaich an cunntas cleachdaiche seo",
        "action-history": "seall eachdraidh na duilleige seo",
        "action-minoredit": "cuir comharra nach e ach deasachadh beag a th' ann",
        "action-upload_by_url": "luchdaich suas am faidhle seo o URL",
        "action-writeapi": "cleachd API sgrìobhaidh",
        "action-delete": "sguab às an duilleag seo",
-       "action-deleterevision": "sguab às am mùthadh seo",
-       "action-deletedhistory": "seall eachdraidh an sguabaidh às aig an duilleag seo",
+       "action-deleterevision": "mùthaidhean a sguabadh às",
+       "action-deletedhistory": "eachdraidh de dhuilleag a chaidh a sguabadh às fhaicinn",
        "action-browsearchive": "lorg sna duilleagan air an sguabadh às",
-       "action-undelete": "neo-dhèan sguabadh às na duilleige seo",
-       "action-suppressrevision": "thoir sùil air a' mhùthadh fhalaichte seo 's aisig e",
+       "action-undelete": "sguabadh às de dhuilleagan a neo-dhèanamh",
+       "action-suppressrevision": "sùil a thoirt air mùthaidhean falaichte ’s an aiseag",
        "action-suppressionlog": "seall an loga prìobhaideach seo",
        "action-block": "bac an cleachdaiche seo o dheasachadh",
        "action-protect": "atharraich leibheil dìon na duilleige seo",
        "uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas.",
        "php-uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas ann am PHP.\nThoir sùil air an roghainn file_uploads.",
        "uploadscripted": "Tha còd HTML no sgriobt san fhaidhle seo a b' urrainn do bhrabhsair-lìn a ruith le mearachd.",
-       "uploadscriptednamespace": "Tha ainm-spàs \"$1\" mì-dhligheach san fhaidhle SVG seo.",
+       "uploadscriptednamespace": "Tha ainm-spàs \"<nowiki>$1</nowiki>\" mì-dhligheach san fhaidhle SVG seo.",
        "uploadinvalidxml": "Cha b' urrainn dhuinn an XML san fhaidhle air a luchdadh suas a pharsadh.",
        "uploadvirus": "Tha bhìoras san fhaidhle!\nFiosrachadh: $1",
        "uploadjava": "Tha am faidhle seo 'na fhaidhle ZIP sa bheil faidhle .class Java.\nChan fhaod thu faidhlichean Java a luchdadh suas on a b' urrainn dhaibh cuingeachaidhean na tèarainteachd a leigeil seachad.",
        "emailccsubject": "Lethbhreac dhen teachdaireachd agad gu $1: $2",
        "emailsent": "Post-d air a chur",
        "emailsenttext": "Chaidh an teachdaireachd puist-d agad a chur.",
-       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"{{int:emailuser}}\" air {{SITENAME}}.",
+       "emailuserfooter": "Chaidh am post-d seo a {{GENDER:$1|chuir}} gu {{GENDER:$2|$2}} le $1 leis a’ ghleus “{{int:emailuser}}” aig {{SITENAME}}. Ma fhreagras {{GENDER:$2|tu}} am post-d seo, thèid am post-d{{GENDER:$2|agad}} a chur gun {{GENDER:$1|neach a chuir e an toiseach}} agus leigidg seo an seòladh puist-d {{GENDER:$2|agad}} {{GENDER:$1|riutha}}.",
        "usermessage-summary": "A' fàgail teachdaireachd an t-siostaim.",
        "usermessage-editor": "Teachdaire an t-siostaim",
        "usermessage-template": "MediaWiki:UserMessage",
        "modifiedarticleprotection": "a dh'atharraich an ìre dìon de \"[[$1]]\"",
        "unprotectedarticle": "a neo-dhìon \"[[$1]]\"",
        "movedarticleprotection": "chaidh roghainn an dìona a ghluasad o \"[[$2]]\" gu \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "Dh’atharraich {{GENDER:$2|ìre an dìon}} aig “[[$1]]”",
        "protect-title": "Atharraich an dìon airson \"$1\"",
        "protect-title-notallowed": "Seall an dìon airson \"$1\"",
        "prot_1movedto2": "chaidh [[$1]] a ghluasad gu [[$2]]",
        "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": "Cha deach leinn an sguabadh às a neo-dhèanamh:\n$1",
+       "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.",
        "undelete-search-title": "Lorg sna duilleagan air an sguabadh às",
        "sp-contributions-newbies-sub": "Airson cunntasan ùra",
        "sp-contributions-newbies-title": "Obair le cunntasan ùra",
        "sp-contributions-blocklog": "an loga bacaidh",
-       "sp-contributions-suppresslog": "obair a chaidh a mhùchadh",
-       "sp-contributions-deleted": "obair air a sguabadh às",
+       "sp-contributions-suppresslog": "obair {{GENDER:$1|a’ chleachdaiche}} a chaidh a mhùchadh",
+       "sp-contributions-deleted": "obair {{GENDER:$1|a’ chleachdaiche}} a chaidh a sguabadh às",
        "sp-contributions-uploads": "a' luchdadh suas",
        "sp-contributions-logs": "logaichean",
        "sp-contributions-talk": "deasbaireachd",
        "feedback-subject": "Cuspair:",
        "feedback-submit": "Cuir a-null",
        "feedback-thanks": "Mòran taing! Chaidh do bheachd a phostadh air an duilleag \"[$2 $1]\".",
-       "searchsuggest-search": "Lorg",
+       "feedback-thanks-title": "Ceud taing!",
+       "searchsuggest-search": "Lorg air {{SITENAME}}",
        "searchsuggest-containing": "anns a bheil...",
-       "api-error-badaccess-groups": "Chan eil cead agad gus faidhlichean a luchdadh suas dhan uicidh seo.",
        "api-error-badtoken": "Mearachd taobh a-staigh: Droch thòcan.",
-       "api-error-copyuploaddisabled": "Tha luchdadh suas le URL à comas air an fhrithealaiche seo.",
-       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint.",
-       "api-error-duplicate-archive": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint ach chaidh {{PLURAL:$1|a sguabadh|an sguabadh}} às.",
-       "api-error-empty-file": "Tha am faidhle a chuir thu a-null falamh.",
        "api-error-emptypage": "Chan fhaodar duilleagan falamh ùra a chruthachadh.",
-       "api-error-fetchfileerror": "Mearachd taobh a-staigh: Chaidh rudeigin cearr le faighinn an fhaidhle.",
-       "api-error-fileexists-forbidden": "Tha faidhle air a bheil \"$1\" ann mar-thà 's cha ghabh sgrìobhadh thairis air.",
-       "api-error-fileexists-shared-forbidden": "Tha faidhle air a bheil \"$1\" san ionad-tasgaich cho-roinnte mar-thà 's cha ghabh sgrìobhadh thairis air.",
-       "api-error-file-too-large": "Tha am faidhle a chuir thu a-null ro mhòr.",
-       "api-error-filename-tooshort": "Tha ainm an fhaidhle ro ghoirid.",
-       "api-error-filetype-banned": "Tha an seòrsa faidhle seo toirmisgte.",
-       "api-error-filetype-banned-type": "Chan eil $1 {{PLURAL:$4|'na seòrsa faidhle|'nan seòrsaichean faidhle}} ceadaichte. Is $2 {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} ceadaichte.",
-       "api-error-filetype-missing": "Tha leudachan a dhìth air an fhaidhle.",
-       "api-error-hookaborted": "Chaidh sgur dhen atharrachadh a dh'fheuch thu ri dèanamh le leudachan.",
-       "api-error-http": "Mearachd taobh a-staigh: Cha b' urrainn dhuinn ceangal ris an fhrithealaiche.",
-       "api-error-illegal-filename": "Chan eil ainm an fhaidhle ceadaichte.",
-       "api-error-internal-error": "Mearachd tabh a-staigh: chaidh rudeigin cearr rè an luchdaidh suas agad dhan uicidh.",
-       "api-error-invalid-file-key": "Mearachd taobh a-staigh: Cha deach am faidhle a lorg san stòras shealach.",
-       "api-error-missingparam": "Mearachd taobh a-staigh: Tha paramadair a dhìth air an iarrtas.",
-       "api-error-missingresult": "Mearachd taobh a-staigh: Cha d' fhuair sinn a-mach co-dhiù an do shoirbhich leis an lethbhreac gus nach do shoirbhich.",
-       "api-error-mustbeloggedin": "Feumaidh tu logadh a-steach mus luchdaich thu suas faidhle.",
-       "api-error-mustbeposted": "Mearachd taobh a-staigh: Tha an t-iarrtas ag iarraidh HTTP POST.",
-       "api-error-noimageinfo": "Shoirbhich leis an luchdadh suas, ach cha dug am frithealaiche fiosrachadh sam bith dhuinn mun fhaidhle.",
-       "api-error-nomodule": "Mearachd taobh a-staigh: cha deach mòideal luchdaidh suas a shuidheachadh.",
-       "api-error-ok-but-empty": "Mearachd taobh a-staigh: Cha d' fhuair sinn freagairt on fhrithealaiche.",
-       "api-error-overwrite": "Chan fhaodar sgrìobhadh thairis air faidhle a tha ann mar-thà.",
-       "api-error-stashfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach a stòradh.",
        "api-error-publishfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach fhoillseachadh.",
-       "api-error-stasherror": "Thachair mearachd le luchdadh suas an fhaidhle dhan tasgadan.",
-       "api-error-timeout": "Cha d' fhuair sinn freagairt on fhrithealaiche ri àm.",
-       "api-error-unclassified": "Thachair mearachd neo-aithnichte.",
-       "api-error-unknown-code": "Mearachd neo-aithnichte: \"$1\".",
-       "api-error-unknown-error": "Mearachd tabh a-staigh: Chaidh rudeigin cearr rè luchdadh suas an fhaidhle agad.",
-       "api-error-unknown-warning": "Rabhadh neo-aithnichte: \"$1\".",
+       "api-error-stashfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach a stòradh.",
+       "api-error-unknown-warning": "Rabhadh neo-aithnichte: “$1”.",
        "api-error-unknownerror": "Mearachd neo-aithnichte: \"$1\".",
-       "api-error-uploaddisabled": "Tha luchdadh suas à comas air an uicidh seo.",
-       "api-error-verification-error": "Dh'fhaoidte gu bheil am faidhle seo coirbte no gu bheil an leudachan cearr air.",
        "duration-seconds": "$1 {{PLURAL:$1|diog|dhiog|diogan|diog}}",
        "duration-minutes": "$1 {{PLURAL:$1|mhionaid|mhionaid|mionaidean|mionaid}}",
        "duration-hours": "$1 {{PLURAL:$1|uair|uair|uairean|uair}}",
index 58ea420..cd7d2cc 100644 (file)
@@ -23,7 +23,8 @@
                        "Macofe",
                        "Banjo",
                        "Josep Maria Roca Peña",
-                       "Luan"
+                       "Luan",
+                       "Hamilton Abreu"
                ]
        },
        "tog-underline": "Subliñar as ligazóns:",
        "searcharticle": "Artigo",
        "history": "Historial da páxina",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "actualizado desde a miña última visita",
        "printableversion": "Versión para imprimir",
        "permalink": "Ligazón permanente",
        "views": "Vistas",
        "toolbox": "Ferramentas",
        "tool-link-userrights": "Modificar os grupos {{GENDER:$1|do usuario|da usuaria}}",
+       "tool-link-userrights-readonly": "Ver os {{GENDER:$1|grupos de usuario}}",
        "tool-link-emailuser": "Enviar un correo electrónico {{GENDER:$1|ao usuario|á usuaria}}",
        "userpage": "Ver a páxina {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}",
        "projectpage": "Ver a páxina do proxecto",
        "passwordreset-emaildisabled": "As funcións do correo electrónico están desactivadas neste wiki.",
        "passwordreset-username": "Nome de usuario:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Quere ollar o correo electrónico?",
-       "passwordreset-capture-help": "Se marca esta caixa, poderá ver o correo electrónico (co contrasinal temporal) que se envía ao usuario.",
        "passwordreset-email": "Enderezo de correo electrónico:",
        "passwordreset-emailtitle": "Detalles da conta de {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguén (probablemente vostede, desde o enderezo IP $1) solicitou o restablecemento do seu\ncontrasinal de {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailelement": "Nome de usuario: \n$1\n\nContrasinal temporal: \n$2",
        "passwordreset-emailsentemail": "Se este enderezo de correo electrónico está asociado á súa conta, entón enviarase un correo electrónico para o restablecemento do seu contrasinal.",
        "passwordreset-emailsentusername": "Se hai un enderezo de correo electrónico asociado a este nome de usuario, entón enviarase un correo electrónico para o restablecemento do contrasinal.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Enviouse o correo electrónico co restablecemento do contrasinal. O nome de usuario e o contrasinal móstranse aquí.|Enviáronse os correos electrónicos cos restablecementos dos contrasinais. A lista de nomes de usuario e contrasinais móstrase aquí.}}",
-       "passwordreset-emailerror-capture2": "O envío do correo {{GENDER:$2|ao usuario|á usuaria}} fallou: $1 {{PLURAL:$3|O nome de usuario e o contrasinal móstranse aquí.|A lista de nomes de usuario e contrasinais móstrase aquí.}}",
        "passwordreset-nocaller": "Cómpre proporcionar un chamador",
        "passwordreset-nosuchcaller": "O chamador non existe: $1",
        "passwordreset-ignored": "Non se puido completar o restablecemento do contrasinal. Quizais non configurou o provedor?",
        "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.",
        "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.",
-       "summary-preview": "Vista previa do resumo:",
+       "summary-preview": "Vista previa do resumo de edición:",
        "subject-preview": "Vista previa do asunto:",
        "previewerrortext": "Produciuse un erro ao intentar previsualizar os cambios.",
        "blockedtitle": "O usuario está bloqueado",
        "blockedtext": "<strong>Bloqueouse o seu nome de usuario ou enderezo IP.</strong>\n\n$1 estableceu o bloqueo.\nO motivo que achegou foi <em>$2</em>.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o identificador do bloqueo é #$5.\nPor favor, inclúa todos estes datos nas consultas que faga.",
        "autoblockedtext": "O seu enderezo IP foi bloqueado automaticamente porque foi empregado por outro usuario que foi bloqueado por $1.\nA razón que deu foi a seguinte:\n\n:''$2''\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\n\nTeña en conta que non pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.\n\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
+       "systemblockedtext": "O seu nome de usuario ou enderezo IP foi bloqueado automaticamente polo sistema MediaWiki.\nO motivo do bloqueo é:\n\n:<em>$2</em>\n\n* Comezo do bloqueo: $8\n* Expiración do bloqueo: $6\n* Destinatario do bloqueo: $7\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos estes detalles en calquera consulta que realice.",
        "blockednoreason": "non se deu ningunha razón",
        "whitelistedittext": "Debe $1 para poder editar páxinas.",
        "confirmedittext": "Debe confirmar o correo electrónico antes de comezar a editar. Por favor, configure e dea validez ao correo mediante as súas [[Special:Preferences|preferencias de usuario]].",
        "revertmerge": "Desfacer a fusión",
        "mergelogpagetext": "A continuación hai unha lista coas fusións máis recentes do historial dunha páxina co doutra.",
        "history-title": "Historial de revisións de \"$1\"",
-       "difference-title": "Diferenzas entre revisións de \"$1\"",
+       "difference-title": "Diferenzas entre revisións de «$1»",
        "difference-title-multipage": "Diferenzas entre as páxinas \"$1\" e \"$2\"",
        "difference-multipage": "(Diferenzas entre páxinas)",
        "lineno": "Liña $1:",
        "search-interwiki-caption": "Proxectos irmáns",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(máis)",
+       "search-interwiki-more-results": "máis resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionado",
        "searchall": "todo",
        "search-external": "Procura externa",
        "searchdisabled": "As procuras en {{SITENAME}} están deshabilitadas por cuestións de rendemento.\nMentres tanto pode procurar usando o Google.\nNote que os seus índices do contido de {{SITENAME}} poden estar desactualizados.",
        "search-error": "Produciuse un erro durante a procura: $1",
+       "search-warning": "Houbo un aviso ó facer a buscaː $1",
        "preferences": "Preferencias",
        "mypreferences": "Preferencias",
        "prefs-edits": "Número de edicións:",
        "saveprefs": "Gardar",
        "restoreprefs": "Restaurar todas as preferencias por defecto (en todas as seccións)",
        "prefs-editing": "Edición",
-       "rows": "Filas:",
-       "columns": "Columnas:",
        "searchresultshead": "Procurar",
        "stub-threshold": "Límite superior de tamaño para o formato das ligazóns cara a bosquexos ($1):",
        "stub-threshold-sample-link": "exemplo",
        "prefs-help-recentchangescount": "Isto inclúe os cambios recentes, os historiais e mais os rexistros.",
        "prefs-help-watchlist-token2": "Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.\nCalquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.\n[[Special:ResetTokens|Prema aquí se necesita restablecela]].",
        "savedprefs": "Gardáronse as súas preferencias.",
-       "savedrights": "Gardáronse os dereitos de {{GENDER:$1|usuario|usuaria}} de $1.",
+       "savedrights": "Gardáronse os grupos de {{GENDER:$1|usuario|usuaria}} de $1.",
        "timezonelegend": "Fuso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar a hora do servidor por defecto ($1)",
        "youremail": "Correo electrónico:",
        "username": "Nome de {{GENDER:$1|usuario|usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
+       "group-membership-link-with-expiry": "$1 (ata $2)",
        "prefs-registration": "Data e hora de rexistro:",
        "yourrealname": "Nome real:",
        "yourlanguage": "Lingua:",
        "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-lookup-user": "Administrar os grupos do usuario",
+       "userrights-lookup-user": "Seleccionar un usuario",
        "userrights-user-editname": "Escriba un nome de usuario:",
-       "editusergroup": "Editar os grupos {{GENDER:$1|do usuario|da usuaria}}",
+       "editusergroup": "Cargar os grupos de usuario",
        "editinguser": "Mudando os dereitos {{GENDER:$1|do usuario|da usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar os grupos do usuario",
+       "viewinguserrights": "Consultando os dereitos {{GENDER:$1|de usuario|de usuaria}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Editar os grupos {{GENDER:$1|do usuario|da usuaria}}",
+       "userrights-viewusergroup": "Consultar os grupos {{GENDER:$1|do usuario|da usuaria}}",
        "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.",
+       "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-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-nologin": "Debe [[Special:UserLogin|acceder ao sistema]] cunta conta de administrador para asignar dereitos de usuario.",
-       "userrights-notallowed": "Non dispón dos permisos necesarios para asignar ou retirar dereitos de usuario.",
        "userrights-changeable-col": "Os grupos que pode cambiar",
        "userrights-unchangeable-col": "Os grupos que non pode cambiar",
+       "userrights-expiry-current": "Caduca o $1",
+       "userrights-expiry-none": "Non caduca",
+       "userrights-expiry": "Caduca:",
+       "userrights-expiry-existing": "Período de caducidade actual: $2 ás $3",
+       "userrights-expiry-othertime": "Outro tempoː",
+       "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-conflict": "Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.",
-       "userrights-removed-self": "Retirou os seus propios dereitos. Polo tanto, xa non ten acceso a esta páxina.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Usuarios autoconfirmados",
        "right-siteadmin": "Pechar e abrir a base de datos",
        "right-override-export-depth": "Exportar páxinas incluíndo as páxinas ligadas ata unha profundidade de 5",
        "right-sendemail": "Enviar correos electrónicos a outros usuarios",
-       "right-passwordreset": "Ver os correos electrónicos de restablecemento de contrasinais",
        "right-managechangetags": "Crear e (des)activar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] xunto coas modificacións propias",
        "right-changetags": "Engadir e quitar [[Special:Tags|etiquetas]] arbitrarias a revisións individuais e entradas do rexistro",
        "action-upload_by_url": "cargar este ficheiro desde un enderezo URL",
        "action-writeapi": "usar a escritura API",
        "action-delete": "borrar esta páxina",
-       "action-deleterevision": "borrar esta revisión",
-       "action-deletedhistory": "ver o historial borrado desta páxina",
+       "action-deleterevision": "borrar revisións",
+       "action-deletelogentry": "borrar entradas do rexistro",
+       "action-deletedhistory": "ver o historial borrado dunha páxina",
+       "action-deletedtext": "ver o texto dunha revisión borrada",
        "action-browsearchive": "procurar páxinas borradas",
-       "action-undelete": "restaurar esta páxina",
-       "action-suppressrevision": "revisar e restaurar esta revisión agochada",
+       "action-undelete": "restaurar páxinas",
+       "action-suppressrevision": "revisar e restaurar revisións agochadas",
        "action-suppressionlog": "ver este rexistro privado",
        "action-block": "bloquear o usuario fronte á edición",
        "action-protect": "cambiar o nivel de protección desta páxina",
        "action-userrights-interwiki": "editar os permisos de usuario dos usuarios doutros wikis",
        "action-siteadmin": "bloquear ou desbloquear a base de datos",
        "action-sendemail": "enviar correos electrónicos",
+       "action-editmyoptions": "Editar as súas preferencias",
        "action-editmywatchlist": "editar a súa lista de vixilancia",
        "action-viewmywatchlist": "ver a súa lista de vixilancia",
        "action-viewmyprivateinfo": "ver a súa información privada",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostrar",
+       "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-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-noresults": "Non se atoparon filtros",
+       "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-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-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-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-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-newpages-label": "Creacións de páxinas",
+       "rcfilters-filter-newpages-description": "Edicións que crean páxinas novas.",
+       "rcfilters-filter-categorization-label": "Cambios de categoría",
+       "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....",
        "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "rcshowhideminor": "$1 as edicións pequenas",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] eliminada da categoría [[Special:WhatLinksHere/$1||esta páxina está incluída noutras páxinas]]",
        "autochange-username": "Cambio automático de MediaWiki",
        "upload": "Subir un ficheiro",
-       "uploadbtn": "Subir o ficheiro",
+       "uploadbtn": "Subir un ficheiro",
        "reuploaddesc": "Cancelar a subida e volver ao formulario de subidas",
        "upload-tryagain": "Enviar a descrición do ficheiro modificada",
        "uploadnologin": "Non accedeu ao sistema",
        "uploaded-setting-handler-svg": "Non están permitidos os ficheiros SVG que fixen o atributo \"handler\" cun obxectivo remoto/datos/secuencia de comandos. Atopouse <code>$1=\"$2\"</code> no ficheiro SVG subido.",
        "uploaded-remote-url-svg": "Non están permitidos os ficheiros SVG que fixen calquera atributo de estilo con enderezos URL remotos. Atopouse <code>$1=\"$2\"</code> no ficheiro SVG subido.",
        "uploaded-image-filter-svg": "Atopouse un filtro de imaxe con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG subido.",
-       "uploadscriptednamespace": "Este ficheiro SVG contén o espazo de nomes non permitido \"$1\"",
+       "uploadscriptednamespace": "Este ficheiro SVG contén o espazo de nomes non permitido \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Non se puido analizar o XML do ficheiro cargado.",
        "uploadvirus": "O ficheiro contén un virus!\nDetalles: $1",
        "uploadjava": "O ficheiro é un ZIP que contén un ficheiro .class de Java.\nNon están permitidas as cargas de ficheiros Java, dado que poden causar restricións de seguridade.",
        "uncategorizedcategories": "Categorías sen categorías",
        "uncategorizedimages": "Ficheiros sen categorías",
        "uncategorizedtemplates": "Modelos sen categorías",
+       "uncategorized-categories-exceptionlist": "# Contén unha lista de categorías que non van aparecer en Especial:UncategorizedCategories. Unha por liña, comezando con \"*\". As liñas que comecen con outro carácter (incluíndo espazos en branco) ignóranse. Use \"#\" para  engadir comentarios.",
        "unusedcategories": "Categorías sen uso",
        "unusedimages": "Imaxes sen uso",
        "wantedcategories": "Categorías requiridas",
        "apisandbox-sending-request": "Enviando a petición á API...",
        "apisandbox-loading-results": "Recibindo os resultados da API...",
        "apisandbox-results-error": "Produciuse un erro mentres se cargaba a resposta da petición á API: $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-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-results-fixtoken-fail": "Erro ao recuperar o identificador \"$1\".",
        "apisandbox-continue-clear": "Limpar",
        "apisandbox-continue-help": "\"{{int:apisandbox-continue}}\" [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] a última petición; \"{{int:apisandbox-continue-clear}}\" limpará os parámetros relativos á continuación.",
        "apisandbox-param-limit": "Indicar <kbd>max</kbd> para usar o límite máximo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tódolos espazos de nomes)",
+       "apisandbox-multivalue-all-values": "$1 (Tódolos valores)",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Procurar fontes bibliográficas",
        "booksources-search": "Procurar",
        "activeusers-count": "$1 {{PLURAL:$1|acción|accións}} {{PLURAL:$3|no último día|nos últimos $3 días}}",
        "activeusers-from": "Mostrar os usuarios que comecen por:",
        "activeusers-groups": "Mostrar os usuarios que pertencen aos grupos:",
+       "activeusers-excludegroups": "Excluír ós usuarios que pertenzan ós grupos:",
        "activeusers-noresult": "Non se atopou ningún usuario.",
        "activeusers-submit": "Mostrar os usuarios activos",
        "listgrouprights": "Dereitos dun usuario segundo o seu grupo",
        "emailccsubject": "Copia da súa mensaxe para $1: $2",
        "emailsent": "Mensaxe enviada",
        "emailsenttext": "A súa mensaxe de correo electrónico foi enviada.",
-       "emailuserfooter": "$1 {{GENDER:$1|enviou}} este correo electrónico a {{GENDER:$2|$2}} mediante a función \"{{int:emailuser}}\" de {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico foi {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través da función «{{int:emailuser}}» en {{SITENAME}}. Se {{GENDER:$2|responde}}, o seu correo electrónico enviarase directamente {{GENDER:$1|ó emisor|á emisora}} orixinal, e así {{GENDER:$1|coñecerá}} {{GENDER:$2|o seu}} enderezo de correo electrónico.",
        "usermessage-summary": "Mensaxe deixada polo sistema.",
        "usermessage-editor": "Editor das mensaxes do sistema",
        "watchlist": "Lista de vixilancia",
        "wlshowhideanons": "usuarios anónimos",
        "wlshowhidepatr": "edicións vixiadas",
        "wlshowhidemine": "as miñas edicións",
-       "wlshowhidecategorization": "categorización da páxina",
+       "wlshowhidecategorization": "categorización de páxinas",
        "watchlist-options": "Opcións de vixilancia",
        "watching": "Vixiando...",
        "unwatching": "Deixando de vixiar...",
        "changecontentmodel-emptymodels-title": "Non hai modelos de contido dispoñibles",
        "changecontentmodel-emptymodels-text": "O contido de \"[[:$1]]\" non se pode converter a ningún tipo.",
        "log-name-contentmodel": "Rexistro de cambios no modelo de contido",
-       "log-description-contentmodel": "Eventos relacinados cos modelos de contido dunha páxina",
+       "log-description-contentmodel": "Esta páxina mostra cambios no modelo de contido das páxinas, así como as páxinas creadas cun modelo de contido distinto do estándar.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creou}} a páxina \"$3\" usando o modelo de contido non predeterminado \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiou}} o modelo de contido da páxina \"$3\" de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "proxyblockreason": "O seu enderezo IP foi bloqueado porque é un proxy aberto.\nPor favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.",
        "sorbsreason": "O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.",
        "sorbs_create_account_reason": "O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.\nPolo tanto, non pode crear unha conta",
+       "softblockrangesreason": "As contribucións anónimas non están permitidas dende o seu enderezo IP ($1). Por favor, inicie sesión.",
        "xffblockreason": "Un enderezo IP presente na cabeceira X-Forwarded-For, ou ben seu ou ben dun servidor proxy que está utilizando, foi bloqueado. O motivo do bloqueo orixinal é: $1",
        "cant-see-hidden-user": "O usuario que intenta bloquear xa foi bloqueado e agochado. Dado que non ten o dereito necesario para agochar usuarios, non pode ver ou editar o bloqueo do usuario.",
        "ipbblocked": "Non pode bloquear ou desbloquear outros usuarios porque vostede está bloqueado",
        "cant-move-to-user-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de usuario (agás a unha subpáxina).",
        "cant-move-category-page": "Non ten os permisos necesarios para mover páxinas de categoría.",
        "cant-move-to-category-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de categoría.",
+       "cant-move-subpages": "Non ten os permisos necesarios para mover subpáxinas.",
+       "namespace-nosubpages": "O espazo de nomes \"$1\" non deixa subpáxinas.",
        "newtitle": "Novo título:",
        "move-watch": "Vixiar esta páxina",
        "movepagebtn": "Mover a páxina",
        "pageinfo-length": "Lonxitude da páxina (en bytes)",
        "pageinfo-article-id": "ID da páxina",
        "pageinfo-language": "Lingua do contido da páxina",
+       "pageinfo-language-change": "cambiar",
        "pageinfo-content-model": "Modelo do contido da páxina",
        "pageinfo-content-model-change": "cambiar",
        "pageinfo-robot-policy": "Indexación por robots",
        "htmlform-user-not-exists": "\"<strong>$1</strong>\" non existe.",
        "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-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-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",
        "feedback-bugcheck": "Perfecto! Comprobe que aínda non está entre os [$1 erros coñecidos].",
        "feedback-useragent": "Axente de usuario:",
        "searchsuggest-search": "Procurar en {{SITENAME}}",
        "searchsuggest-containing": "que conteña...",
-       "api-error-autoblocked": "A súa dirección IP foi bloqueada automaticamente porque foi usada por un usuario bloqueado.",
-       "api-error-badaccess-groups": "Non ten os permisos necesarios para cargar ficheiros neste wiki.",
        "api-error-badtoken": "Erro interno: Pase incorrecto.",
-       "api-error-blocked": "Foi bloqueado fronte á edición.",
-       "api-error-copyuploaddisabled": "As cargas mediante URL están desactivadas neste servidor.",
-       "api-error-duplicate": "Xa hai {{PLURAL:$1|outro ficheiro| outros ficheiros}} no wiki co mesmo contido.",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|outro ficheiro|outros ficheiros}} no sitio co mesmo contido, pero {{PLURAL:$1|foi borrado|foron borrados}}.",
-       "api-error-empty-file": "O ficheiro que enviou estaba baleiro.",
        "api-error-emptypage": "Non está permitida a creación de páxinas novas que estean baleiras.",
-       "api-error-fetchfileerror": "Erro interno: Houbo un problema ao buscar o ficheiro.",
-       "api-error-fileexists-forbidden": "Xa existe un ficheiro co nome \"$1\". Non se pode sobrescribir.",
-       "api-error-fileexists-shared-forbidden": "Xa existe un ficheiro co nome \"$1\" no repositorio de ficheiros compartidos. Non se pode sobrescribir.",
-       "api-error-file-too-large": "O ficheiro que enviou era grande de máis.",
-       "api-error-filename-tooshort": "O nome do ficheiro é curto de máis.",
-       "api-error-filetype-banned": "Este tipo de ficheiro está prohibido.",
-       "api-error-filetype-banned-type": "$1 non {{PLURAL:$4|é un tipo de ficheiro permitido|son tipos de ficheiro permitidos}}. {{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos son}} $2.",
-       "api-error-filetype-missing": "Fáltalle a extensión ao ficheiro.",
-       "api-error-hookaborted": "O asociador da extensión cancelou a modificación que intentou realizar.",
-       "api-error-http": "Erro interno: Non se puido conectar co servidor.",
-       "api-error-illegal-filename": "O nome do ficheiro non está permitido.",
-       "api-error-internal-error": "Erro interno: Houbo un problema ao procesar a súa carga no wiki.",
-       "api-error-invalid-file-key": "Erro interno: Non se atopou o ficheiro no depósito temporal.",
-       "api-error-missingparam": "Erro interno: Faltan parámetros na solicitude.",
-       "api-error-missingresult": "Erro interno: Non se puido determinar se a copia saíu ben.",
-       "api-error-mustbeloggedin": "Debe acceder ao sistema para cargar ficheiros.",
-       "api-error-mustbeposted": "Erro interno: A solicitude necesita HTTP POST.",
-       "api-error-noimageinfo": "A carga realizouse correctamente, pero o servidor non deu ningunha información sobre o ficheiro.",
-       "api-error-nomodule": "Erro interno: Non hai ningún módulo de cargas.",
-       "api-error-ok-but-empty": "Erro interno: Non hai resposta do servidor.",
-       "api-error-overwrite": "Non está permitido sobrescribir un ficheiro existente.",
-       "api-error-ratelimited": "Está intentando subir máis ficheiros nun pequeno espazo de tempo do que permite este wiki.\nPor favor, inténteo de novo nuns minutos.",
-       "api-error-stashfailed": "Erro interno: O servidor non puido almacenar o ficheiro temporal.",
        "api-error-publishfailed": "Erro interno: O servidor non puido publicar o ficheiro temporal.",
-       "api-error-stasherror": "Houbo un erro ao subir o ficheiro ao depósito.",
-       "api-error-stashedfilenotfound": "O ficheiro apartado non se atopou ao intentar envialo.",
-       "api-error-stashpathinvalid": "A ruta na que se apartara o ficheiro non era correcta.",
-       "api-error-stashfilestorage": "Produciuse un erro ao apartar o ficheiro.",
-       "api-error-stashzerolength": "O servidor non puido apartar o ficheiro porque o ficheiro está baleiro.",
-       "api-error-stashnotloggedin": "Debe identificarse para gardar ficheiros no apartado de envío.",
-       "api-error-stashwrongowner": "O ficheiro apartado ao que intentaba acceder non lle pertence a vostede.",
-       "api-error-stashnosuchfilekey": "A clave de ficheiro apartado á que intentaba acceder non existe.",
-       "api-error-timeout": "O servidor non respondeu no tempo esperado.",
-       "api-error-unclassified": "Houbo un erro descoñecido.",
-       "api-error-unknown-code": "Erro descoñecido: \"$1\"",
-       "api-error-unknown-error": "Erro interno: Houbo un problema ao intentar cargar o ficheiro.",
-       "api-error-unknown-warning": "Advertencia descoñecida: $1",
+       "api-error-stashfailed": "Erro interno: O servidor non puido almacenar o ficheiro temporal.",
+       "api-error-unknown-warning": "Advertencia descoñecida: \"$1\".",
        "api-error-unknownerror": "Erro descoñecido: \"$1\".",
-       "api-error-uploaddisabled": "As cargas están desactivadas neste wiki.",
-       "api-error-verification-error": "Este ficheiro podería estar corrupto ou ter unha extensión incorrecta.",
-       "api-error-was-deleted": "Un ficheiro con este mesmo nome xa foi cargado con anterioridade e posteriormente eliminado.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Lingua",
        "pagelang-use-default": "Utilizar a lingua por defecto",
        "pagelang-select-lang": "Seleccionar a lingua",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Enviar",
+       "pagelang-nonexistent-page": "A páxina $1 non existe.",
+       "pagelang-unchanged-language": "A páxina $1 xa foi definida coa lingua $2.",
+       "pagelang-unchanged-language-default": "A páxina $1 xa está configurada na lingua de contido por defecto do wiki.",
+       "pagelang-db-failed": "A base de datos fallou ó tentar mudar a lingua da páxina.",
        "right-pagelang": "Cambiar a lingua da páxina",
        "action-pagelang": "cambiar a lingua da páxina",
        "log-name-pagelang": "Rexistro de cambios de linguas",
        "mw-widgets-dateinput-no-date": "Non se seleccionou ningunha data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Procurar ficheiros multimedia",
+       "mw-widgets-mediasearch-noresults": "Non se atopou ningún resultado.",
        "mw-widgets-titleinput-description-new-page": "a páxina aínda non existe",
        "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...",
        "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",
        "log-action-filter-block-reblock": "Modificación de bloqueo",
        "log-action-filter-block-unblock": "Desbloquear",
        "log-action-filter-contentmodel-change": "Cambio de modelo de contido",
-       "log-action-filter-contentmodel-new": "Creación de páxins cun modelo de contido non estándar",
+       "log-action-filter-contentmodel-new": "Creación de páxina cun modelo de contido diferente do contido por defecto",
        "log-action-filter-delete-delete": "Borrado de páxinas",
+       "log-action-filter-delete-delete_redir": "Sobreescritura de redirección",
        "log-action-filter-delete-restore": "Restauración de páxinas",
        "log-action-filter-delete-event": "Borrado de rexistros",
        "log-action-filter-delete-revision": "Borrado de revisión",
        "usercssispublic": "Lembre: As subpáxinas CSS non deberían conter datos confidenciais porque outros usuarios poden velos.",
        "restrictionsfield-badip": "Enderezo IP ou rango de IP non válido: $1",
        "restrictionsfield-label": "Rangos de IP permitidos:",
-       "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utilice<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Erro: $1",
-       "edit-error-long": "Erros:\n\n$1"
+       "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"
 }
index 4e4e804..46af76a 100644 (file)
@@ -82,6 +82,7 @@
        "dec": "دسامبر",
        "pagecategories": "{{PLURAL:$1|جرگه|جرگهٰ‌ن}}",
        "category_header": "\"$1\" جرگه مئنˇ ولگؤن",
+       "subcategories": "جيررچؤن",
        "category-media-header": "\"$1\" جرگه مئنˇ رسانهٰ‌ن",
        "hidden-categories": "{{PLURAL:$1|جخۊته جرگه|جخۊته جرگهٰ‌ن}}",
        "category-subcat-count": "{{PLURAL:$2|اي جرگه ميئن خالي اي جيرجرگه دره.|{{PLURAL:$1|اي جيرجرگه|اي $1 جيرجرگه}} اي جرگه ميئن {{PLURAL:$1|دره|درن}}؛ اي جرگه سرجمع $2ته جيرجرگه دأنه.}}",
@@ -89,6 +90,7 @@
        "category-article-count-limited": "جيرˇ{{PLURAL:$1|ولگ|$1 ولگ}} هي جرگه مئن دره.",
        "category-file-count": "{{PLURAL:$2|اي جرگه مئن خالي اي فاىل دره.|{{PLURAL:$1|اي فاىل|اي $1ته فاىل}} اي جرگه مئن {{PLURAL:$1|دره|درن}}؛ اي جرگه مئن در کؤل $2ته فاىل دره.}}",
        "listingcontinuesabbrev": "(ايدامه)",
+       "newwindow": "(تازه پنجره ميئن بازأبۊنه)",
        "cancel": "لغو",
        "moredotdotdot": "ویشتر...",
        "mypage": "ولگ",
        "printableversion": "وؤته چاپ گۊدن",
        "permalink": "داىمي خال",
        "view": "دئن",
+       "view-foreign": "دئن $1ˇ ميئن",
        "edit": "دچينواچين",
        "editthispage": "اي ولگه دچينواچين بکۊن",
        "create-this-page": "اي ولگه چاکۊن",
        "categorypage": "جرگه ولگه دئن",
        "otherlanguages": "باخي زوانؤنˇ جي",
        "redirectedfrom": "(مسير عوضاؤدن $1 أجي)",
+       "lastmodifiedat": "اي ولگ آخري گرش $1ˇ ميئن ساعت $2 دچينواچين بۊبؤ.",
        "protectedpage": "بپأسه ولگ",
        "jumpto": "بوؤز:",
        "jumptonavigation": "گردسن",
        "jumptosearch": "وامج",
        "view-pool-error": "سرورؤنˇ سر پۊر بار هننأ. پۊر پۊرˇ کارگيرؤن حقسأى کأدرن که اي ولگه فأندرن. \nلؤطف بۊکۊنين ىيسکالى صبر بدأرين.\n\n$1",
-       "aboutsite": "راجه به {{SITENAME}}",
+       "aboutsite": "راجع به {{SITENAME}}",
        "aboutpage": "Project:راجه به",
        "copyrightpage": "{{ns:project}}:چاکۊدنحق",
        "currentevents": "هسأىي تفاقؤن",
        "resetpass-submit-cancel": "لغو",
        "passwordreset": "هندئه رمز چاگۊدن",
        "passwordreset-username": "کارگيري نؤم:",
-       "passwordreset-capture-help": "أگه اي گۊزينه' تيک بزنين، ايمىل (که اينˇ مئن مؤوقتي رمز دره) شيمئبه نۊشؤن بدأ بنه ؤ کارگيرئبه ني اۊسئه بنه.",
        "passwordreset-emailelement": "کارگيري نؤم: \n$1\n\nمؤوقتي رمز: \n$2",
        "bold_sample": "پۊررنگˇ وؤت",
        "bold_tip": "پۊررنگˇ وؤت",
        "extlink_sample": "http://www.example.com خالˇ تيتر",
        "extlink_tip": "بيريني خال (http://‎ پيشونده ىادانکۊنين)",
        "headline_sample": "تيترˇ وؤت",
+       "headline_tip": "سطحˇ ۲ˇ تيتر",
+       "nowiki_sample": "قالب-بندي نۊبؤ وؤت ائره واردأبي",
        "image_tip": "وؤتˇ مئنˇ تصوير",
        "media_tip": "فاىلˇ خال",
+       "sig_tip": "شيمي ايمضا ؤ زمتˇ برچسب",
        "hr_tip": "اؤفؤقي خط (اۊن أجي کم کارأگيرين)",
        "summary": "فيچالسه:",
        "minoredit": "اي نيميزگره دچينواچينه",
        "editingsection": "دچيواچينˇ مئن $1 (وابين)",
        "templatesused": "اي ولگˇ مينˇ {{PLURAL:$1|قالب|قالبؤن}}",
        "template-protected": "(بپأسه)",
+       "template-semiprotected": "(نيمه بپأسه)",
        "hiddencategories": "اي ولگ {{PLURAL:$1|ىکته جخۊته جرگه|$1 جخۊته جرگه}} مئن دره:",
        "currentrev-asof": "هسأىي نۊسخه تا $1",
        "revisionasof": "نۊسخه $1",
        "prevn": "داميشکˇ {{PLURAL:$1|$1}}",
        "nextn": "بعدي {{PLURAL:$1|$1}}",
        "shown-title": "$1هر ىکته ولگˇ مئن {{PLURAL:$1|نتيجه'|نتيجه'ن}} نۊشؤن بدي.",
+       "viewprevnext": "نۊشؤن دأن ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "دله ولگؤن",
        "searchprofile-images": "چنرسانه",
        "searchprofile-everything": "همه چي",
        "searchprofile-everything-tooltip": "تمؤمˇ دله' وامتن (حتی گبˇ ولگؤنه)",
        "searchprofile-advanced-tooltip": "دؤجئه نؤمفضا'نˇ مئن وامتن",
        "search-result-size": "$1 ({{PLURAL:$2|ىک کلمه|$2 کلمه'ن}})",
+       "search-redirect": "(مسير عوضاؤدن $1ˇ جي)",
+       "search-section": "($1ˇ وابين)",
        "search-category": "($1 جرگه)",
        "search-suggest": "شيمي منظۊر بۊ: $1",
        "searchall": "همه",
+       "search-nonefound": "نتيجه-اي ياته نۊبؤ.",
        "mypreferences": "ترجيحات",
        "skin-preview": "پيشادئن",
        "prefs-user-pages": "کارگيري ولگؤن",
        "enhancedrc-history": "تاريخ",
        "recentchanges": "آخري تغىيرؤن",
        "recentchanges-legend": "آخري تغىيرؤنˇ تنظيمات",
+       "recentchanges-summary": "ويکي آخري تغييرؤنه اي ولگˇ ميئن پى بگيرين.",
        "recentchanges-label-newpage": "اي دچينواچين ىکته تازه ولگ چاگۊده",
        "recentchanges-label-minor": "اي نيميزگره دچينواچينه",
        "recentchanges-label-bot": "اي دچينواچينه ىکته رۊبات بؤده",
+       "recentchanges-label-unpatrolled": "اي دچينواچين هلئه گشتزني نۊبؤ",
+       "recentchanges-label-plusminus": "ولگˇ حجم اي مقدار بايتˇ واويراز تغيير بؤده",
+       "recentchanges-legend-heading": "<strong>اختصارؤن:</strong>",
+       "rclistfrom": "تازه تغييرؤنˇ نۊشؤن دأنˇ سرأگيري $3 $2ˇ جي",
+       "rcshowhideminor": "$1 نيميزگره دچينواچينؤن",
        "rcshowhideminor-show": "نۊشؤن دأن",
        "rcshowhideminor-hide": "دۊخۊسان",
        "rcshowhidebots": "$1 رۊباتؤن",
        "newpageletter": "نؤ",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کارگير}} پىگير]",
-       "rc-change-size-new": "$1 {{PLURAL:$1|باÙ\89ت}} ØªØºÙ\89يرˇ پسي",
+       "rc-change-size-new": "$1 {{PLURAL:$1|باÙ\89ت}} ØªØºÙ\8aيرˇ پسي",
        "recentchangeslinked": "مۊرتبطˇ تغىيرؤن",
        "recentchangeslinked-toolbox": "مۊرتبطˇ تغىيرؤن",
        "recentchangeslinked-summary": "اي جير، ىکته ليسته تينين بىنين آخري تغييرؤن أجي اۊ ولگؤنˇ مئن کي اي ولگˇ جي خال ببؤن (ىا جرگهٔ مؤردˇ نظرˇ جي). اۊ ولگؤني که [[Special:Watchlist|شيمئه پىگيري ليست]]۱ميئن دبۊن پۊررنگ نۊشؤن بدأبۊنن.",
        "namespace_association": "مؤرتبطˇ نؤمفضا",
        "tooltip-namespace_association": "ائره' تيک بزنين تا گبˇ نؤمفضا ىا مؤرتبط مؤضۊع ىا دؤجين بۊبؤ نؤمفضا ني شامل بۊبۊن.",
        "blanknamespace": "گت",
+       "contributions": "{{GENDER:$1|کارگير}}ˇ مۊشارکتؤن",
        "month": "اي ماه مئن (ؤ دأميشک):",
        "year": "اي سالˇ مئن (ؤ دأميشک):",
        "sp-contributions-talk": "گب",
        "blocklist-by": "دبۊدگر کيا",
        "blocklist-nousertalk": "مننه خۊ گبˇ ولگه دچينواچين بکۊنه",
        "blocklink": "دبۊستن",
-       "contribslink": "Ù\89اوري‌ئن",
+       "contribslink": "Ù\8aاوري‌ئن",
        "block-log-flags-nousertalk": "مننه خۊ گبˇ ولگه دچينواچين بکۊنه",
        "block-log-flags-hiddenname": "دۊخۊسانئه کارگيري نؤم",
        "movecategorypage-warning": "<strong>اخظار:</strong> شمه جرگه ولگه جابجا کأدرين. شيمه حواس بمؤنه کي فقط ولگ جابجا بنه ؤ ولگؤن قديمي جرگه مئن مؤنن ؤ تازه جرگه مئن <em>نشنن</em>.",
        "tooltip-pt-login": "بئتره ديرين بشين؛ بسچی گه ايجباری نیه.",
        "tooltip-pt-logout": "بيرين شؤن",
        "tooltip-pt-createaccount": "بئتره کارگیري حساب چاکۊنين ؤ ديرين بشين؛ بسچي که حساب چاؤدن ايجباری نیه.",
-       "tooltip-ca-talk": "گب راجه به ولگˇ مؤحتوا",
+       "tooltip-ca-talk": "گب راجع به ولگˇ مؤحتوا",
        "tooltip-ca-edit": "اي ولگه دچينواچين بۊکۊنين",
        "tooltip-ca-addsection": "ىکته تازه وابين چاکۊن",
+       "tooltip-ca-viewsource": "اي ولگ بپاسأکه.\nتؤنين اينˇ سربسه بينين",
        "tooltip-ca-history": "اي ولگˇ قديمي نۊسخه'ن",
        "tooltip-ca-protect": "أ ولگه بپا",
        "tooltip-ca-move": "اي ولگه جابجا گۊدن",
        "tooltip-n-randompage": "ىکته کترئي ولگه أردن",
        "tooltip-n-help": "فأمسن ؤ آؤجا هأىتنˇ جيگه",
        "tooltip-t-whatlinkshere": "ىکته ليست همته ولگؤنˇ جي کي ائره خال ببؤن",
+       "tooltip-t-recentchangeslinked": "ولگؤنˇ آخري تغييرؤني گه اي ولگ اۊشؤنˇ أمرأ خال دأنه.",
        "tooltip-feed-atom": "أتۊمˇ خبرنامه اي ولگˇ شي",
+       "tooltip-t-contributions": "{{GENDER:$1|اي کارگير}}ˇ مۊشارکتؤنˇ ليست",
        "tooltip-t-upload": "فاىلؤنه جؤراکشئن",
        "tooltip-t-specialpages": "ىکته ليست، همه ته خاصˇ ولگؤن جي",
        "tooltip-t-print": "اي ولگˇ چاپي وؤت",
+       "tooltip-t-permalink": "پايدارˇ خال اي ولگˇ نۊسخهٰ جي",
        "tooltip-ca-nstab-main": "مۊحتوياتˇ ولگه دئن",
        "tooltip-ca-nstab-user": "کارگيرˇ ولگه دئن",
        "tooltip-ca-nstab-special": "اي ىکته خاصˇ ولگه ؤ نشأنه دچينواچين گۊدن.",
        "tooltip-ca-nstab-category": "جرگه ولگه دئن",
        "tooltip-save": "شيمه تغىيرؤنه ذخيره بکۊنين",
        "tooltip-preview": "شيمئه تغىيرؤنˇ پيشادئن. هلئه ثبت نۊده، اي کيليده کاراگيرين.",
+       "tooltip-diff": "تغييرؤني گه شۊمۊ وؤتˇ ميئن بدأينˇ نۊشؤن دأن",
        "tooltip-rollback": "\"پساوگردان\" اي ولگˇ آخري دچينواچينگرˇ دچينواچينؤنه ىکته تنگۊلى أجي خؤنثا کؤنه.",
+       "tooltip-summary": "فيچالسه وارد بکۊنين",
        "pageinfo-header-restrictions": "ولگه پأسن",
        "pageinfo-hidden-categories": "جخۊته {{PLURAL:$1| جرگه|جرگه}} ( $1 )",
        "pageinfo-toolboxlink": "ولگˇ اطلاعات",
        "pageinfo-category-info": "جرگه اطلاعات",
        "file-info-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل، فاىلˇ واويراز: $3، نوع MIME فاىل: $4",
        "show-big-image": "أصلˇ فاىل",
+       "show-big-image-preview": "اي پيشأدئنˇ واويراز: $1.",
        "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پيکسل",
        "metadata": "گتˇ دىتا",
        "metadata-fields": "اي پىغؤمˇ مئنˇ نۊشؤن بدأ تاتاىي گتˇ دىتا'ن، وختي کي تاتاىي گتˇ دىتا'نˇ جدول جمأبؤبي، هندئه نۊشؤن بدأ بنه. باخيˇ مؤردؤن خالي اۊ زمت نۊشؤن بدأ بنه کي اۊ جدول وابۊبۊن.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "سۊ",
        "exif-model": "دۊربينˇ مؤدل",
        "exif-software": "کارىته-بۊبؤ نرمبزار",
        "exif-colorspace": "رنگي فضا",
        "specialpages-group-login": "ديرين/ثبتˇ نؤم",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|تگ|تگؤن}}]]: $2)",
        "logentry-newusers-create": "کارگيري حساب $1 {{GENDER:$2|چاگۊده-بۊبؤ}}",
-       "searchsuggest-search": "وامج",
+       "searchsuggest-search": "{{SITENAME}} مئن وامج",
        "expand_templates_preview": "پيشادئن",
        "default-skin-not-found": "اؤخ! پيشفرضˇ قالبي که شيمه ويکي ئبه <code dir=\"ltr\"<$wgDefaultSkin</code> مئن تعريف ببؤ به عنوانˇ <code>$1</code>، دسفرس نيه.\n\nبه نظر می‌آید نصب شما شامل پوسته‌های زیر می‌شود. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند {{PLURAL:$4|پوسته|پوسته}} از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins استفاده از گیت برای دریافت پوسته‌ها].\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <code>LocalSettings.php</code> بچسبانید تا {{PLURAL:$5|همه|همه}} پوسته‌های نصب‌شده را فعال کنید:\n\n<pre dir=\"ltr\">$3</pre>\n\n; اگر اخیراً <code>LocalSettings.php</code> را تغییر دادید:\n: نام پوسته‌ها را برای غلط املایی دوباره بررسی کنید."
 }
index a3d9b83..9283234 100644 (file)
@@ -17,7 +17,7 @@
        "tog-previewonfirst": "Poileach bodolacher zolok dakhoi",
        "tog-enotifwatchlistpages": "Mhojea sadurvollerintlem pan vo fail bodol'li zalear mhaka email dhadd",
        "tog-shownumberswatching": "Nodor dovorpi vangdianche sonkhya dakhoi",
-       "tog-oldsig": "Sodheachi soy:",
+       "tog-oldsig": "Tujea sod'dheachi soy:",
        "tog-uselivepreview": "Boroitastana zolok dahkoi",
        "tog-watchlisthideown": "Sadurvollerint mhojeo bodlopam lipoi",
        "tog-watchlisthidebots": "Sadurvollerint robotani kel'lim bodlopam lipoi",
        "editfont-default": "Browsera pormonnem",
        "sunday": "Aitar",
        "monday": "Somar",
-       "tuesday": "Munglar",
-       "wednesday": "Budhwar",
-       "thursday": "Birestar",
+       "tuesday": "Mongllar",
+       "wednesday": "Budvar",
+       "thursday": "Brestar",
        "friday": "Sukrar",
-       "saturday": "Sonvar",
+       "saturday": "Son'var",
        "sun": "Ait",
        "mon": "Som",
-       "tue": "Mung",
-       "wed": "Budh",
-       "thu": "Bres",
-       "fri": "Sukr",
+       "tue": "Mon",
+       "wed": "Bud",
+       "thu": "Bre",
+       "fri": "Suk",
        "sat": "Son",
        "january": "Janer",
        "february": "Febrer",
        "newwindow": "(novea zonelant uktem zata)",
        "cancel": "Rod'd kor",
        "moredotdotdot": "Anik...",
-       "morenotlisted": "Hi suchi purn na",
+       "morenotlisted": "Hi suchi purn nasonk xekta.",
        "mypage": "Pan",
        "mytalk": "Bhasabhas",
        "navigation": "Dixa-niontronn",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Email potto:",
        "passwordreset-emailelement": "Vapurpeachem nanv: \n$1\n\nTatpurtem gupitutor: \n$2",
-       "passwordreset-emailsentemail": "Gupitutor portun tharaipacho email dhadla.",
+       "passwordreset-emailsentemail": "Ho email pot'to tujea kontak zodlelem asa zalear, gupitutor portun tharaipacho email dhadlelem zatelem.",
        "changeemail": "Email potto bodol vo kad",
        "changeemail-oldemail": "Sodhyacho email potto:",
        "changeemail-newemail": "Novo email potto:",
        "minoredit": "Hem ek dhaktem bodol",
        "watchthis": "Hea panar nodor dovor",
        "savearticle": "Pan samball",
+       "savechanges": "Bodlopam samball",
        "preview": "Zholok",
        "showpreview": "Zholok dakhoi",
        "showdiff": "Bodolpam dakhoi",
        "searchprofile-advanced-tooltip": "Khaxel'lea nanvthollanni sod",
        "search-result-size": "$1 {{PLURAL:$2|1 utor|$2 utram}}",
        "search-result-category-size": "{{PLURAL:$1|1 vangddi|$1 vangddi}} ({{PLURAL:$2|1 upvorg|$2 upvorg}}, {{PLURAL:$3|1 fichier|$3 fichieri}})",
-       "search-redirect": "(punornirdexon $1)",
+       "search-redirect": "($1 savn punornirdexit)",
        "search-section": "(vibhag $1)",
        "search-suggest": "Tu mhonnunk sodi: $1 ?",
        "search-rewritten": "$1 hachim porinamam dakhoilean. Hea vantteache $2 ak sod.",
        "recentchanges-label-plusminus": "Hea panacho akar itlea baitani bodol'lo",
        "recentchanges-legend-heading": "<strong>Kunji:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|nove pananchi suchi]]-ui polloi)",
-       "rcnotefrom": "Sokoil <strong>$3, $4<strong> savnsavn {{PLURAL:$5|zalelem bodlop dilam|zalelim bodolpam dileant}} (<strong>$1<strong> meren {{PLURAL:$5|dakhoilam|dakhoileant}}).",
+       "rcnotefrom": "Sokoil <strong>$3, $4<strong> savn {{PLURAL:$5|zalelem bodlop dilam|zalelim bodolpam dileant}} (<strong>$1<strong> meren {{PLURAL:$5|dakhoilam|dakhoileant}}).",
        "rclistfrom": "$3 $2 savn suru zatelim novim bodolpam dakhoi",
        "rcshowhideminor": "$1 dhaktteo bodlopam",
        "rcshowhideminor-show": "Dakhoi",
        "uploadlogpage": "Uploadachem sotr",
        "filedesc": "Sar",
        "fileuploadsummary": "Aapros",
+       "large-file": "Faylachem akar $1 akin odik naslear borem; hi fayl $2 -anchi asa.",
        "watchthisupload": "Hea faylar dixtt dovor",
        "license": "Porvangi",
        "license-header": "Porvangi",
        "whatlinkshere-hideredirs": "$1 punornirdexonam",
        "whatlinkshere-hidetrans": "$1 durasth-somaveso",
        "whatlinkshere-hidelinks": "$1 zoddnio",
-       "whatlinkshere-hideimages": "Failinchim zoddpam $1",
+       "whatlinkshere-hideimages": "$1 faylinchim zoddni",
        "whatlinkshere-filters": "Challnio",
        "ipboptions": "2 voram:2 hours,1 dis:1 day,3 dis:3 days,1 satollo:1 week,2 satolle:2 weeks,1 mhoino:1 month,3 mhoine:3 months,6 mhoine:6 months,1 voros:1 year,sasnnank:infinite",
        "ipblocklist": "Addhailele vaporpi",
        "logentry-move-move": "$1-an $3 panak $4 {{GENDER:$2|haloilea}}",
        "logentry-newusers-create": "Vapurpeacho kont $1 {{GENDER:$2|rochlam}}",
        "logentry-upload-upload": "$1-an $3 {{GENDER:$2|upload kela}}",
-       "searchsuggest-search": "Sod",
+       "searchsuggest-search": "{{SITENAME}} sod",
        "special-characters-group-latin": "Romi",
        "special-characters-group-latinextended": "Romi (anink-ui)",
        "special-characters-group-ipa": "IPA",
index 1006cc8..7983c95 100644 (file)
        "nov": "Nop",
        "dec": "Des",
        "january-date": "$1 Yanuari",
-       "february-date": "$1 Peburuari",
+       "february-date": "$1 Pebruari",
        "march-date": "$1 Maret",
        "april-date": "$1 April",
        "may-date": "$1 Mei",
-       "june-date": "$1 Yuni",
-       "july-date": "$1 Yuli",
+       "june-date": "$1 Juni",
+       "july-date": "$1 Juli",
        "august-date": "$1 Agustus",
        "september-date": "$1 September",
        "october-date": "$1 Oktober",
        "searcharticle": "Ntali",
        "history": "Riwayati lo halaman",
        "history_short": "Riwayati",
+       "history_small": "riwayati",
        "updatedmarker": "iluba to'u nila'o'u pulitiyo",
        "printableversion": "Persi cetak",
        "permalink": "Wumbuta kakali",
        "edit-local": "Ubawa deskripsi lokal",
        "create": "Mohutu",
        "create-local": "Duhengi deskripsi lokal",
-       "editthispage": "Ubawa halaamani boti",
-       "create-this-page": "Pohutuwa halaamani boti",
+       "editthispage": "Boli'a halaman botiye",
+       "create-this-page": "Pohutuwa halamani botiye",
        "delete": "Luluta",
-       "deletethispage": "Luluta halaamani boti",
+       "deletethispage": "Luluta halaman botiye",
        "undeletethispage": "Bataliya moluluto",
        "undelete_short": "Batali moluluto {{PLURAL:$1|tuwawu uba|$1 ubawa}}",
        "viewdeleted_short": "Bilohi {{PLURAL:$1|tuwawu yiluluto uba|$1 yiluluto ubawa}}",
        "protect": "Dahawa",
-       "protect_change": "gantiyi",
+       "protect_change": "boli'a",
        "protectthispage": "Dahawa halaman boti",
        "unprotect": "dudaha ubaalo",
        "unprotectthispage": "ubawa dudaha halaman botiye",
        "talk": "Biisalawa",
        "views": "Bibilohu",
        "toolbox": "Pilaakasi",
+       "tool-link-userrights": "Boli'a lembo'a {{GENDER:$1|pengguna}}",
+       "tool-link-userrights-readonly": "Bilohi lembo'a {{GENDER:$1|pengguna}}",
+       "tool-link-emailuser": "Lawola email ode {{GENDER:$1|user}}",
        "userpage": "Bilohi halaman pengguna",
        "projectpage": "Bilohi halaman proyek",
        "imagepage": "Bilohi halaman berkas",
        "disclaimers": "Momaahu",
        "disclaimerpage": "Project:Momaahu umum",
        "edithelp": "Wubodu momoli'o",
-       "helppage-top-gethelp": "Tuulungi",
+       "helppage-top-gethelp": "Wubodu",
        "mainpage": "Halaman Bungaliyo",
        "mainpage-description": "Halaman bungaliyo",
        "policy-url": "Project:Kebijakan",
        "toc": "Tuwango",
        "showtoc": "popobilehe",
        "hidetoc": "wanto'a",
-       "collapsible-collapse": "Lolohubu",
-       "collapsible-expand": "Duhengi",
+       "collapsible-collapse": "Wanto'a",
+       "collapsible-expand": "Bu'ade",
        "confirmable-confirm": "Delo {{GENDER:$1|yi'o}} yakini?",
        "confirmable-yes": "Jo",
        "confirmable-no": "De'e",
        "databaseerror-query": "Kueri $1",
        "databaseerror-function": "Huna: $1",
        "databaseerror-error": "Lotaalawa: $1",
+       "transaction-duration-limit-exceeded": "Untuk mencegah penundaan replikasi yang tinggi, pengiriman ini dibatalkan karena durasi tulis ($1) melebihi batas $2 {{PLURAL:$2|detik|detik}}.\nJika Anda ingin mengganti banyak butir sekaligus, cobalah melakukan dalam operasi yang lebih kecil.",
        "laggedslavemode": "<strong>Warning:</strong> Halaman kira ja o tuwanga lo'ubawa bohu",
        "readonly": "Basis data unti-unti",
        "enterlockreason": "Masowa alasani longunti wawu omoluwa u'unti hu'oolo",
        "protectedpagetext": "Halaman botiye ma iluntiya alihu diya'a ta momoli'o meyalo huhutu uweewo.",
        "viewsourcetext": "Yi'o mowali momilohu wawu mohemi monto bungoliyo lo halaman botiye.",
        "viewyourtext": "Yi'o mowali momilohu wawu mohemi bungo monto  <strong>biloli'umu</strong> to halaman botiye.",
+       "protectedinterface": "Halaman ini memuat teks antarmuka untuk perangkat lunak pada wiki ini, dan dilindungi terhadap penyalahgunaan. Untuk menambah atau mengubah terjemahan pada semua wiki, harap gunakan [https://translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
        "namespaceprotected": "Yi'o ja o haku momoli'a halaman botiye to <strong>$1</strong> huwali tanggulo.",
        "mycustomcssprotected": "Yi'o ja o iijini monguba halaman CSS boti.",
        "mycustomjsprotected": "Yi'o ja o iijini monguba halaman JavaScript boti.",
        "logentry-move-move": "$1 {{GENDER:$2|moheyi}} halaman $3 ode $4",
        "logentry-newusers-create": "Ta ohu'uwo akun $1 {{GENDER:$2|mohutu}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|mengunggah}} $3",
-       "searchsuggest-search": "Lolohe"
+       "searchsuggest-search": "Lolohe {{SITENAME}}"
 }
index 4a3207f..edb1b85 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Sälber gändereti Syte un Dateie automatisch beobachte",
        "tog-watchmoves": "Sälber verschobeni Sytene un Dateie automatisch beobachte",
        "tog-watchdeletion": "Sälber gleschti Sytene un Dateie automatisch beobachte",
+       "tog-watchuploads": "Die Dateie, wonni uffelad, automatisch uff myni Beobachtigslischt druff due",
        "tog-watchrollback": "Syte, wun i zruckgsetzt haa, automatisch beobachte",
        "tog-minordefault": "Alli dyni Änderigen als «chlyni Änderige» markiere",
        "tog-previewontop": "Vorschou oberhalb vom Editierfänschter aazeige",
@@ -63,7 +64,7 @@
        "tog-ccmeonemails": "Schick mr Kopie vo de E-Mails, won i andere schick.",
        "tog-diffonly": "Numme Versionsunterschiid aazeige, ohni d Syte",
        "tog-showhiddencats": "Zeig di versteckte Kategorie",
-       "tog-norollbackdiff": "Unterschid noch em Zrucksetze unterdrucke",
+       "tog-norollbackdiff": "Unterschid noch em Zrucksetze nit aazeige",
        "tog-useeditwarning": "Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin",
        "tog-prefershttps": "Wänn aagmäldet, alliwyl e sicheri Verbindig bruuche",
        "underline-always": "immer",
        "october-date": "$1. Oktober",
        "november-date": "$1. Novämber",
        "december-date": "$1. Dezämber",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategorie}}",
        "category_header": "Artikel in de Kategori \"$1\"",
        "subcategories": "Unterkategorie",
        "newwindow": "(imene nöie Fänschter)",
        "cancel": "Abbräche",
        "moredotdotdot": "Meh …",
-       "morenotlisted": "Die Lischt isch nit vollständig.",
+       "morenotlisted": "Die Lischt isch vilycht nit vollständig.",
        "mypage": "Syte",
        "mytalk": "Diskussionsyte",
        "anontalk": "Diskussionssyste vo sellere IP",
        "talk": "Diskussion",
        "views": "Wievylmol agluegt",
        "toolbox": "Wärchzyyg",
+       "tool-link-userrights": "{{GENDER:$1|Benutzergruppe}} ändere",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Benutzergruppe}} aaluege",
+       "tool-link-emailuser": "E-Mail an {{GENDER:$1|dää Benutzer|die Benutzeri}} schicke",
        "userpage": "Benutzersyte",
        "projectpage": "Projektsyte azeige",
        "imagepage": "Dateisyte",
        "virus-scanfailed": "Scan het nid funktioniert (code $1)",
        "virus-unknownscanner": "Virescanner, wu nid bekannt isch:",
        "logouttext": "'''Du bisch jetz abgmäldet.'''\n\nObacht: s cha syy, ass bstimmti Syte eso aazeigt wäre, wie wänn Du allno aagmäldet wärsch, bis Du dr Zwischespycher vu Dyym Browser glescht hesch.",
+       "cannotlogoutnow-title": "Abmälde goot grad nit",
+       "cannotlogoutnow-text": "Abmälde goot nit, derwyylscht du $1 bruuchsch",
        "welcomeuser": "Willchuu, $1!",
        "welcomecreation-msg": "Dyy Benutzerkonto isch aagleit wore.\nVergiss nit, Dyni [[Special:Preferences|{{SITENAME}}-Yystellige]] z ändere.",
        "yourname": "Dyy Benutzername",
        "createacct-yourpasswordagain-ph": "Gib s Passwort nomol yy",
        "userlogin-remembermypassword": "Aagmäldet blyybe",
        "userlogin-signwithsecure": "Sicheri Verbindig bruuche",
+       "cannotlogin-title": "Aamälde goot nit",
+       "cannotlogin-text": "Aamälde goot nit",
+       "cannotloginnow-title": "Aamälde goot grad nit",
+       "cannotloginnow-text": "Aamälde goot nit, derwyylscht du $1 bruuchsch",
+       "cannotcreateaccount-title": "Benutzerkonto cha nid aagleit wäre.",
        "yourdomainname": "Dyyni Domäne",
        "password-change-forbidden": "Du chasch uf däm Wiki kei Passwerter ändere.",
        "externaldberror": "Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.",
        "login": "Aamälde",
+       "login-security": "Due dyni Identität verifiziere",
        "nav-login-createaccount": "Aamälde / Konto aalege",
        "userlogin": "Aamälde/Konto aalege",
        "userloginnocreate": "Aamälde",
        "resetpass_submit": "Passwort ibermittle un aamälde",
        "changepassword-success": "Dyy Passwort isch erfolgryych gänderet wore.",
        "changepassword-throttled": "Du hesch z vilmol versuecht Di aazmälde. Bitte wart $1, voreb Du s non emol versuechsch.",
+       "botpasswords-label-appid": "Name vum Bot:",
+       "botpasswords-label-create": "Aalege",
+       "botpasswords-label-update": "Aktualisiere",
+       "botpasswords-label-cancel": "Abbräche",
+       "botpasswords-label-delete": "Lösche",
+       "botpasswords-label-resetpassword": "Passwort zruggsetze",
        "resetpass_forbidden": "S Passwort cha nid gänderet wäre.",
        "resetpass-no-info": "Du muesch Di aamälde zum uf die Syte diräkt zuegryfe z chenne.",
        "resetpass-submit-loggedin": "Passwort ändere",
        "passwordreset-emaildisabled": "D E-Mail-Funktione sin uf däm Wiki deaktiviert wore.",
        "passwordreset-username": "Benutzername:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Die E-Mail aaluege?",
-       "passwordreset-capture-help": "Wänn du des Chäschtli aachrüüzesch, no wird die E-Mail (mit em temporäre Passwort) dir aazeigt, un au em Benutzer zuegschiggt.",
        "passwordreset-email": "E-Mail-Adräss:",
        "passwordreset-emailtitle": "Benutzerkontoinformationen uf {{SITENAME}}",
        "passwordreset-emailtext-ip": "Eber mit dr IP-Adresse $1, wahrschyns Du sälber, het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
        "searchprofile-advanced-tooltip": "Suech in wytere Namensryym",
        "search-result-size": "$1 ({{PLURAL:$2|1 Wort|$2 Werter}})",
        "search-result-category-size": "{{PLURAL:$1|1 Kategorii|$1 Kategorie}} ({{PLURAL:$2|1 Unterkategorii|$2 Unterkategorie}}, {{PLURAL:$3|1 Datei|$3 Dateie}})",
-       "search-redirect": "(Wyterleitig $1)",
+       "search-redirect": "(Wyterleitig vo $1)",
        "search-section": "(Abschnitt $1)",
        "search-category": "(Kategorie $1)",
        "search-file-match": "(Resultat us em Inhalt vo Dateie)",
        "saveprefs": "Änderige spychere",
        "restoreprefs": "Alli Standardyystellige widerhärstelle (in allne Abschnitt)",
        "prefs-editing": "Tekscht-Ygab",
-       "rows": "Zylene",
-       "columns": "Spaltene",
        "searchresultshead": "Suech-Ergäbnis",
        "stub-threshold": "Spezielli Darstellig ($1) für Links uf chlyni Syte bis zu’re bestimmte Gröössi (i Bytes):",
        "stub-threshold-sample-link": "Byspil",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du hesch nit d Berächtigung, Benutzerrächt in andere Wiki z ändere.",
        "userrights-nodatabase": "D Datebank $1 git s nit oder si isch nit lokal.",
-       "userrights-nologin": "Du muesch Di mit eme Ammanne-Benutzerkonto [[Special:UserLogin|aamälde]], zum Benutzerrächt z ändere.",
-       "userrights-notallowed": "Du hesch nit d Berächtigung zum Benutzerrächt vergee oder ewägnee.",
        "userrights-changeable-col": "Gruppezuegherigkeit, wu Du chasch ändere",
        "userrights-unchangeable-col": "Gruppezuegherigkeit, wu Du nit chasch ändere",
        "userrights-conflict": "Di veränderete Rächt göh nid uuf! Bitte lueg d Änderige düren u tue se nomal spychere.",
-       "userrights-removed-self": "Du hesch dir di eigete Rächt erfolgrych furtgnoh. Drum hesch kei Zuegriff meh uf die Syte.",
        "group": "Grupp:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Bstetigti Benutzer",
        "right-siteadmin": "Datebank sperre un entsperre",
        "right-override-export-depth": "Exportier Syte mitsamt dr vergleichte Syte bis zuen ere Tiefi vu 5",
        "right-sendemail": "E-Mail an anderi Benutzer schicke",
-       "right-passwordreset": "Passwort vun eme Benutzer zruggsetze",
        "right-managechangetags": "[[Special:Tags|Markierigen]] ir Datebank schaffen oder lösche",
        "right-applychangetags": "Zäme mit den eigeten Änderige [[Special:Tags|Markierigen]] abringe",
        "right-changetags": "Beliebigi [[Special:Tags|Markierige]] by einzelne Versionen oder Logbuechyträg derzuetue oder lösche",
        "uploaded-setting-handler-svg": "Ir ufegladnigen SVG-Datei het’s es «handler»-Attribut mit Externem/Date/Script: <code>$1=\"$2\"</code>. Das isch nid erloubt.",
        "uploaded-remote-url-svg": "Ir ufegladnigen SVG-Datei het’s es Style-Attribut mit emnen externen URL: <code>$1=\"$2\"</code>. Das isch nid erloubt.",
        "uploaded-image-filter-svg": "Ir ufegladnigen SVG-Datei het’s e Bildfilter mit emnen URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "I deren SVG-Datei het’s der illegal Namensruum «$1».",
+       "uploadscriptednamespace": "I deren SVG-Datei het’s der illegal Namensruum «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "S XML in dr uffegladene Datei het nit chenne parst wäre.",
        "uploadvirus": "In däre Datei het s e Virus! Detail: $1",
        "uploadjava": "Des isch e ZIP-Datei, wu s e CLASS-Datei vu Java din het.\nS Uffelade vu Java-Dateien isch nit gstattet, wel si s Umgoh vu Sicherheitsyyschränkige chennte megli mache.",
        "feedback-thanks": "Dankschen. Dyy Ruckmäldig isch uf dr Syte „[$2 $1]“ gspycheret wore.",
        "feedback-thanks-title": "Merci!",
        "feedback-useragent": "User Agent:",
-       "searchsuggest-search": "Suechi",
+       "searchsuggest-search": "{{SITENAME}} dursueche",
        "searchsuggest-containing": "din het s …",
-       "api-error-badaccess-groups": "Du derfsch keini Dateie in des Wiki uffelade.",
        "api-error-badtoken": "Intärne Fähler: Dr Token isch fählerhaft.",
-       "api-error-copyuploaddisabled": "S Uffelade iber e URL isch uf däm Server deaktiviert.",
-       "api-error-duplicate": "S git im Wiki scho {{PLURAL:$1|ei anderi Datei|anderi Dateie}} mit em glyche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|isch scho e andri Datei|sin scho anderi Dateie}} mit em glyche Inhalt vorhande gsi. {{PLURAL:$1|Si isch|Si sin}} allerdings glöscht worde.",
-       "api-error-empty-file": "D Datei, wu Du uffeglade hesch, isch läär.",
        "api-error-emptypage": "S isch nit erlaubt, neji lääri Syte aazlege.",
-       "api-error-fetchfileerror": "Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.",
-       "api-error-fileexists-forbidden": "S git scho ne Datei mit Name „$1“, si cha nit iberschryybe wäre.",
-       "api-error-fileexists-shared-forbidden": "S git scho ne Datei mit Name „$1“ im gmeinsame Dateirepositorium, si cha wäge däm nit iberschrybe wäre.",
-       "api-error-file-too-large": "D Datei, wu Du ibertrait hesch, isch z groß.",
-       "api-error-filename-tooshort": "Dr Dateiname isch z churz.",
-       "api-error-filetype-banned": "Dää Dateityp isch gsperrt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|isch e Dateiformat, wu nit erlaubt isch|sin Dateitype, wu nit erlaubt sin}}. Erlaubt {{PLURAL:$3|isch s Dateiformat|sin d Dateiformat}} $2.",
-       "api-error-filetype-missing": "D Datei het kei Dateinameerwyterig.",
-       "api-error-hookaborted": "D Änderig, wu Du versuecht hesch, isch wäg eme Erwyterigs-Hooks abbroche wore.",
-       "api-error-http": "Intärne Fähler: S het kei Verbindig zum Server chenne härgstellt wäre.",
-       "api-error-illegal-filename": "Dr Dateiname isch nit erlaubt.",
-       "api-error-internal-error": "Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei ins Wiki.",
-       "api-error-invalid-file-key": "Intärne Fähler: D Datei isch nit im temporäre Spycher gfunde wore.",
-       "api-error-missingparam": "Intärne Fähler: Zue dr Aafrog fähle Parameter.",
-       "api-error-missingresult": "Intärne Fähler: S het nit chenne feschtgstellt wäre, eb s Kopiere erfolgryych gsi isch.",
-       "api-error-mustbeloggedin": "Zum Dateie uffelade muesch aagmäldet syy.",
-       "api-error-mustbeposted": "S git e Programmierfähler (s wird di falsch HTTP-Method brucht).",
-       "api-error-noimageinfo": "S Uffelade isch erfolgryych gsi, aber de Server het kei Informatione über d Datei zur Verfiegig gstellt.",
-       "api-error-nomodule": "Intärne Fähler: S isch kei Modul zum Uffelade feschtgleit wore.",
-       "api-error-ok-but-empty": "Intärne Fähler: Dr Server reagiert nit.",
-       "api-error-overwrite": "S Iberschryybe vun ere Datei, wu s scho git, isch nit erlaubt.",
-       "api-error-stashfailed": "Intärne Fähler: Dr Server het kei temporäri Datei chenne spychere.",
        "api-error-publishfailed": "Interne Fähler: Der Server het di temporäri Datei nid chönne veröffentleche.",
-       "api-error-stasherror": "Bim Ufelade vor Datei het’s e Fähler ’gä.",
-       "api-error-stashedfilenotfound": "Di gspychereti Datei het sech nümm la finde bim Versuech, se vom Spycher ufezlade.",
-       "api-error-stashpathinvalid": "Der Pfad isch ungültig, wo di gspychereti Datei hätt sölle sy.",
-       "api-error-stashfilestorage": "Bim Spychere vor Datei het’s e Fähler ’gä.",
-       "api-error-stashzerolength": "Der Server het d Datei nid chönne spychere, wil si e Lengi vo Null het.",
-       "api-error-stashnotloggedin": "Du muesch di ylogge, für Dateie zum Ufelade chönne z spychere.",
-       "api-error-stashwrongowner": "D Datei ghört nid dir, wo du probiert hesch im Spycher druf zuezgryffe.",
-       "api-error-stashnosuchfilekey": "Der Dateischlüssel git’s nid, wo du probiert hesch im Spycher druf zuezgryffe.",
-       "api-error-timeout": "Dr Server het kei antwort gee in dr erwartete Zyt.",
-       "api-error-unclassified": "S het e nit bekannte Fähler gee.",
-       "api-error-unknown-code": "Nit bekannte Fähler: „$1“",
-       "api-error-unknown-error": "Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei.",
+       "api-error-stashfailed": "Intärne Fähler: Dr Server het kei temporäri Datei chenne spychere.",
        "api-error-unknown-warning": "Unbekannti Warnig: $1",
        "api-error-unknownerror": "Nit bekannte Fähler: „$1“",
-       "api-error-uploaddisabled": "S Uffelade isch in däm Wiki deaktiviert.",
-       "api-error-verification-error": "Die Datei isch entwäder fählerhaft oder si het di falsch Dateinameerwyterig.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekund|Sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minut|Minute}}",
        "duration-hours": "$1 {{PLURAL:$1|Stund|Stunde}}",
index 458d0e5..30e2574 100644 (file)
@@ -29,7 +29,8 @@
                        "Nisargjhaveri",
                        "Matma Rex",
                        "Bhatakati aatma",
-                       "YmKavishwar"
+                       "YmKavishwar",
+                       "Kevin Kovadia"
                ]
        },
        "tog-underline": "કડીઓની નીચે લીટી (અંડરલાઇન):",
        "passwordreset-emaildisabled": "આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.",
        "passwordreset-username": "સભ્ય નામ:",
        "passwordreset-domain": "ડોમેઈન:",
-       "passwordreset-capture": "પરિણામી ઈમેલ જોવો છે?",
-       "passwordreset-capture-help": "જો તમે આ ઓપ્શન સિલેક્ટ કરશો, તો તમને અને યુઝર ને ઈ મેલ (કામચલાઉ પાસવર્ડ સાથે) દેખાડવામાં આવશે.",
        "passwordreset-email": "ઇમેલ સરનામું:",
        "passwordreset-emailtitle": "{{SITENAME}} પર ખાતાની માહિતી",
        "passwordreset-emailtext-ip": "કોઈકે (કદાચ તમોએ , $1 IP એડ્રેસ થી) તમારી વેબસાઈટ {{SITENAME}}  ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે.\n.\n.\n\n$2\n\n{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસો}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો.",
        "userrights-reason": "કારણ:",
        "userrights-no-interwiki": "અન્ય વિકિ પર અન્ય સભ્યો ના અધિકારો માં પરિવર્તન કરવાની તમને પરવાનગી નથી",
        "userrights-nodatabase": "માહિતીસંચ $1 અસ્તિત્વમાં નથી કે તે સ્થાનીય નથી.",
-       "userrights-nologin": "સભ્યના અધિકારો આપવા તમે પ્રબંધક તરીકે પ્રવેશ  [[Special:UserLogin|log in]] કરેલ હોવો જરૂરી છે.",
-       "userrights-notallowed": "તમને વપરાશકર્તા અધિકારો ઉમેરવા કે દૂર કરવાની પરવાનગી નથી.",
        "userrights-changeable-col": "તમે બદલી શકો તેવા જૂથ",
        "userrights-unchangeable-col": "તમે બદલી ન શકો તેવા જૂથ",
        "group": "સમુહ",
        "right-siteadmin": "માહિતી સંચયને ઉઘાડો અને વાસો.",
        "right-override-export-depth": "૫ સ્તર સુધી જોડાયેલ પાના સહીત પાના નિકાસ કરો",
        "right-sendemail": " અન્ય સભ્યોને ઈ-મેલ મોકલો",
-       "right-passwordreset": "પાસવર્ડ રીસેટ ઇ-મેઇલ્સ જુઓ",
        "newuserlogpage": "નવા બનેલા સભ્યોનો લૉગ",
        "newuserlogpagetext": "આ સભ્યોની રચનાનો લોગ છે.",
        "rightslog": "સભ્ય હક્ક માહિતિ પત્રક",
        "action-upload_by_url": "URL પરથી આ ફાઇલ ચઢાવો",
        "action-writeapi": "લેખન API વાપરો",
        "action-delete": "આ પાનું હટાવો",
-       "action-deleterevision": "આ પુનરાવર્તનારદ્દ કરો",
-       "action-deletedhistory": "àª\86 àªªàª¾àª¨àª¾àª¨àª¾ àª°àª¦à«\8dદà«\80àª\95રણનà«\8b àª\87તિહાસ બતાવો",
+       "action-deleterevision": "આ પુનરાવર્તન ને કાઢી નાખો",
+       "action-deletedhistory": "àª\86 àªªàª¾àª¨àª¾àª¨àª¾ àª°àª¦à«\8dદà«\80àª\95રણનà«\80 àªªà«\82રà«\8dવ-વિàª\97ત બતાવો",
        "action-browsearchive": "હટાવેલા પાનાં શોધો",
-       "action-undelete": "àª\86 àªªàª¾àª¨à«\81àª\82 àª«àª°à«\80 àªªà«\81નરà«\8dàª\9cà«\80વà«\80ત àª\95રà«\8b",
-       "action-suppressrevision": "સમà«\80àª\95à«\8dષા àª\95રà«\80 àª\86 àª\97à«\81પà«\8dત àªªà«\81નરાવરà«\8dતન પુન:સ્થાપિત કરો",
+       "action-undelete": "ડિલà«\80àª\9f àª¥àª¯àª¾ àªµàª\97રના àªªàª¾àª¨àª¾àª\82àª\93",
+       "action-suppressrevision": "સમà«\80àª\95à«\8dષા àª\95રà«\8b àª\85નà«\87 àª\97à«\81પà«\8dત àªªà«\81નરાવરà«\8dતનà«\8b àª¨à«\87 પુન:સ્થાપિત કરો",
        "action-suppressionlog": "આ અંગત યાદી જુઓ",
        "action-block": "આ સભ્ય દ્વારા થનાર ફેરફાર પ્રતિબંધીત કરો",
        "action-protect": "આ પાનાંનું પ્રતિબંધ સ્તર બદલો",
index 028f7b9..5f09555 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": "צפייה בדף המיזם",
        "passwordreset-emaildisabled": "שירותי הדוא\"ל בוטלו באתר ויקי זה.",
        "passwordreset-username": "שם משתמש:",
        "passwordreset-domain": "תחום:",
-       "passwordreset-capture": "לצפות בדוא\"ל הנשלח?",
-       "passwordreset-capture-help": "אם תסמנו תיבה זו, הדואר האלקטרוני (יחד עם הסיסמה הזמנית) יוצג לכם במקביל לשליחתו למשתמש.",
        "passwordreset-email": "כתובת דוא\"ל:",
        "passwordreset-emailtitle": "פרטי חשבון ב{{grammar:תחילית|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש איפוס של\nהסיסמה שלכם ב{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}}\nלכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
        "passwordreset-emailelement": "שם משתמש:\n$1\n\nסיסמה זמנית:\n$2",
        "passwordreset-emailsentemail": "אם כתובת הדואר האלקטרוני הזאת משויכת לחשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
        "passwordreset-emailsentusername": "אם יש כתובת דואר אלקטרוני שמשויכת לשם המשתמש הזה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|דוא\"ל איפוס הסיסמה נשלח|הודעות דוא\"ל של איפוס הסיסמה נשלחו}}. {{PLURAL:$1|שם המשתמשים והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} כאן.",
-       "passwordreset-emailerror-capture2": "לא ניתן היה לשלוח דוא\"ל ל{{GENDER:$2|משתמש|משתמשת}}: $1 {{PLURAL:$3|שם המשתמש והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} כאן.",
        "passwordreset-nocaller": "לא סופק הקורא הנדרש",
        "passwordreset-nosuchcaller": "הקורא אינו קיים: $1",
        "passwordreset-ignored": "איפוס הסיסמה לא בוצע. ייתכן שלא הוגדר ספק.",
        "selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום להפניה להיווצר בכל זאת.",
        "missingcommenttext": "יש להקליד את ההודעה למטה.",
        "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא.",
-       "summary-preview": "תצ×\95×\92×\94 ×\9eק×\93×\99×\9e×\94 ×©×\9c ×\94תקצ×\99ר:",
+       "summary-preview": "תצ×\95×\92×\94 ×\9eק×\93×\99×\9e×\94 ×©×\9c ×ª×§×¦×\99ר ×\94ער×\99×\9b×\94:",
        "subject-preview": "תצוגה מקדימה של הנושא:",
        "previewerrortext": "אירעה שגיאה בעת הניסיון להציג תצוגה מקדימה של השינויים שלך.",
        "blockedtitle": "המשתמש חסום",
-       "blockedtext": "'''שם המשתמש או כתובת ה־IP שלכם נחסמו.'''\n\nהחסימה בוצעה על ידי $1. הסיבה שניתנה לכך היא '''$2'''.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון על החסימה.\nאינכם יכולים להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינתם כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
-       "autoblockedtext": "כתובת ה־IP שלכם נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nבאפשרותכם להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\", אלא אם לא ציינתם כתובת דוא\"ל תקינה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\n\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
+       "blockedtext": "<strong>שם המשתמש או כתובת ה־IP שלך נחסמו.</strong>\n\nהחסימה בוצעה על ידי $1.\nהסיבה שניתנה לכך היא <em>$2</em>.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותך ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\nאין באפשרותך להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינת כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלך]] או אם נחסמת משליחת דוא\"ל.\nכתובת ה־IP הנוכחית שלך היא $3, ומספר החסימה שלך הוא #$5.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
+       "autoblockedtext": "כתובת ה־IP שלך נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותך ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nאין באפשרותך להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינת כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלך]] או אם נחסמת משליחת דוא\"ל.\n\nכתובת ה־IP הנוכחית שלך היא $3, ומספר החסימה שלך הוא #$5.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
+       "systemblockedtext": "שם המשתמש או כתובת ה־IP שלך נחסמו באופן אוטומטי על־ידי תוכנת מדיה־ויקי.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nכתובת ה־IP הנוכחית שלך היא $3.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
        "blockednoreason": "לא ניתנה סיבה",
        "whitelistedittext": "נדרשת $1 כדי לערוך דפים.",
        "confirmedittext": "עליכם לאמת את כתובת הדוא\"ל שלכם לפני שתוכלו לערוך דפים. אנא הגדירו ואמתו את כתובת הדוא\"ל שלכם באמצעות [[Special:Preferences|העדפות המשתמש]] שלכם.",
        "search-interwiki-caption": "מיזמי אחות",
        "search-interwiki-default": "תוצאות מתוך $1:",
        "search-interwiki-more": "(עוד)",
+       "search-interwiki-more-results": "תוצאות נוספות",
        "search-relatedarticle": "קשור",
        "searchrelated": "קשור",
        "searchall": "הכול",
        "search-external": "חיפוש חיצוני",
        "searchdisabled": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}} אינו מופעל כעת.\nבינתיים אפשר לחפש באמצעות גוגל.\nשימו לב שייתכן שהמידע של {{SITENAME}} שם אינו מעודכן.",
        "search-error": "אירעה שגיאה במהלך החיפוש: $1",
+       "search-warning": "אירעה אזהרה במהלך החיפוש: $1",
        "preferences": "העדפות",
        "mypreferences": "העדפות",
        "prefs-edits": "מספר העריכות:",
        "saveprefs": "שמירה",
        "restoreprefs": "שחזור הגדרות ברירת המחדל (בכל הלשוניות)",
        "prefs-editing": "עריכה",
-       "rows": "שורות:",
-       "columns": "עמודות:",
        "searchresultshead": "חיפוש",
        "stub-threshold": "סף לעיצוב קישורים כקצרמרים ($1):",
        "stub-threshold-sample-link": "דוגמה",
        "prefs-help-recentchangescount": "ההעדפה הזאת כוללת את דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
        "prefs-help-watchlist-token2": "זהו המפתח הסודי להזנה של רשימת המעקב שלך.\nכל מי שיודע אותו יכול לקרוא את רשימת המעקב שלך, לכן אין לשתף אותו.\nבמקרה הצורך, אפשר [[Special:ResetTokens|לאפס את האסימון]].",
        "savedprefs": "ההעדפות שלך נשמרו.",
-       "savedrights": "×\94×\94רש×\90×\95ת ×©×\9c {{GENDER:$1|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} \"$1\" נשמרו.",
+       "savedrights": "ק×\91×\95צ×\95ת {{GENDER:$1|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} ×©×\9c \"$1\" נשמרו.",
        "timezonelegend": "אזור זמן:",
        "localtime": "שעה מקומית:",
        "timezoneuseserverdefault": "ברירת המחדל של האתר ($1)",
        "youremail": "דואר אלקטרוני:",
        "username": "שם {{GENDER:$1|המשתמש|המשתמשת}}:",
        "prefs-memberingroups": "{{GENDER:$2|חבר|חברה}} {{PLURAL:$1|בקבוצה|בקבוצות}}:",
+       "group-membership-link-with-expiry": "$1 (עד $2)",
        "prefs-registration": "זמן ההרשמה:",
        "yourrealname": "שם אמיתי:",
        "yourlanguage": "שפת הממשק:",
        "prefswarning-warning": "ביצעת שינויים בהעדפות שלך, והם עדיין לא נשמרו.\nעזיבת דף זה ללא לחיצה על \"$1\" תגרום לכך שההעדפות שלך לא יעודכנו.",
        "prefs-tabs-navigation-hint": "טיפ: ניתן להשתמש במקשי החצים הימני והשמאלי כדי לנווט בין הלשוניות ברשימת הלשוניות.",
        "userrights": "ניהול הרשאות משתמש",
-       "userrights-lookup-user": "× ×\99×\94×\95×\9c ×§×\91×\95צ×\95ת משתמש",
+       "userrights-lookup-user": "×\91×\97×\99רת משתמש",
        "userrights-user-editname": "שם משתמש:",
-       "editusergroup": "ער×\99×\9bת ×\94ק×\91×\95צ×\95ת ×©×\9c ×\94{{GENDER:$1|×\9eשת×\9eש}}",
+       "editusergroup": "×\98×¢×\99נת ×§×\91×\95צ×\95ת ×\94×\9eשת×\9eש",
        "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": "{{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|אותו|אותה}} אליה, או להפך.",
+       "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-nologin": "עליכם [[Special:UserLogin|להיכנס לחשבון]] עם הרשאות מתאימות כדי לשנות הרשאות של משתמשים.",
-       "userrights-notallowed": "אין לך הרשאה להוסיף או להסיר הרשאות של משתמשים.",
        "userrights-changeable-col": "{{PLURAL:$1|קבוצה|קבוצות}} שבאפשרותך לשנות",
        "userrights-unchangeable-col": "{{PLURAL:$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": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.",
-       "userrights-removed-self": "הסרת את הרשאות המשתמש של עצמך. לכן אין לך כעת אפשרות לגשת לדף זה.",
        "group": "קבוצה:",
        "group-user": "משתמשים",
        "group-autoconfirmed": "משתמשים ותיקים",
        "right-siteadmin": "נעילה וביטול נעילה של בסיס הנתונים",
        "right-override-export-depth": "ייצוא דפים כולל הדפים המקושרים (עד עומק של 5 דפים)",
        "right-sendemail": "שליחת דואר אלקטרוני למשתמשים אחרים",
-       "right-passwordreset": "צפייה בדואר אלקטרוני של איפוס סיסמה",
        "right-managechangetags": "יצירה, הפעלה וביטול של [[Special:Tags|תגיות]]",
        "right-applychangetags": "החלת [[Special:Tags|תגיות]] יחד עם שינויים",
        "right-changetags": "הוספה והסרה של [[Special:Tags|תגיות]] לגרסאות ולרשומות יומן",
        "action-upload_by_url": "להעלות קובץ זה מכתובת URL",
        "action-writeapi": "להשתמש ב־API לשינוי דפים",
        "action-delete": "למחוק דף זה",
-       "action-deleterevision": "למחוק גרסה זו",
-       "action-deletedhistory": "לצפות בהיסטוריה המחוקה של דפים",
+       "action-deleterevision": "למחוק גרסאות",
+       "action-deletelogentry": "למחוק פריטי יומן",
+       "action-deletedhistory": "לצפות בהיסטוריה מחוקה של דף",
+       "action-deletedtext": "לצפות בטקסט של גרסה מחוקה",
        "action-browsearchive": "לחפש דפים מחוקים",
-       "action-undelete": "×\9cש×\97×\96ר ×\93×£ ×\96×\94",
-       "action-suppressrevision": "×\9c×\91×\93×\95ק ×\95×\9cש×\97×\96ר ×\92רס×\94 ×\9e×\95סתרת ×\96×\95",
+       "action-undelete": "×\9cש×\97×\96ר ×\93פ×\99×\9d",
+       "action-suppressrevision": "×\9cסק×\95ר ×\95×\9cש×\97×\96ר ×\92רס×\90×\95ת ×\9e×\95סתר×\95ת",
        "action-suppressionlog": "לצפות ביומן הפרטי הזה",
        "action-block": "לחסום משתמשים מעריכה",
        "action-protect": "לשנות את רמת ההגנה של דף זה",
        "action-userrights-interwiki": "לשנות הרשאות של משתמשים באתרי ויקי אחרים",
        "action-siteadmin": "לנעול או לבטל את הנעילה של בסיס הנתונים",
        "action-sendemail": "לשלוח דואר אלקטרוני למשתמשים",
+       "action-editmyoptions": "לערוך את ההעדפות {{GENDER:|שלך|שלך|שלכם}}",
        "action-editmywatchlist": "לערוך את רשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
        "action-viewmywatchlist": "לצפות ברשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
        "action-viewmyprivateinfo": "לצפות במידע הפרטי {{GENDER:|שלך|שלך|שלכם}}",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ({{GENDER:|ראה|ראי|ראו}} גם את [[Special:NewPages|רשימת הדפים החדשים]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "הצגה",
+       "rcfilters-activefilters": "מסננים פעילים",
+       "rcfilters-restore-default-filters": "שחזור למסנני ברירת המחדל",
+       "rcfilters-clear-all-filters": "מחיקת כל המסננים",
+       "rcfilters-search-placeholder": "סינון שינויים אחרונים (עיינו או התחילו להקליד)",
+       "rcfilters-invalid-filter": "מסנן בלתי־תקין",
+       "rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
+       "rcfilters-filterlist-title": "מסננים",
+       "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
+       "rcfilters-filtergroup-registration": "רישום העורכים",
+       "rcfilters-filter-registered-label": "רשומים",
+       "rcfilters-filter-registered-description": "עורכים שנכנסו לחשבון.",
+       "rcfilters-filter-unregistered-label": "לא רשומים",
+       "rcfilters-filter-unregistered-description": "עורכים שלא נכנסו לחשבון.",
+       "rcfilters-filtergroup-authorship": "מבצעי העריכה",
+       "rcfilters-filter-editsbyself-label": "עריכות שלך",
+       "rcfilters-filter-editsbyself-description": "עריכות שביצעת בעצמך.",
+       "rcfilters-filter-editsbyother-label": "עריכות של אחרים",
+       "rcfilters-filter-editsbyother-description": "עריכות שבוצעו על־ידי משתמשים אחרים (מלבדך).",
+       "rcfilters-filtergroup-userExpLevel": "הניסיון והוותק (למשתמשים רשומים בלבד)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "חדשים",
+       "rcfilters-filter-userExpLevel-newcomer-description": "פחות מ־10 עריכות ומ־4 ימים של פעילות.",
+       "rcfilters-filter-userExpLevel-learner-label": "לומדים",
+       "rcfilters-filter-userExpLevel-learner-description": "יותר ימי פעילות ועריכות מ\"חדשים\", אבל פחות מ\"משתמשים מנוסים\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "משתמשים מנוסים",
+       "rcfilters-filter-userExpLevel-experienced-description": "יותר מ־30 ימים של פעילות ו־500 עריכות.",
+       "rcfilters-filtergroup-automated": "תרומות אוטומטיות",
+       "rcfilters-filter-bots-label": "בוטים",
+       "rcfilters-filter-bots-description": "עריכות שבוצעו על־ידי כלים אוטומטיים.",
+       "rcfilters-filter-humans-label": "בני אדם (לא בוטים)",
+       "rcfilters-filter-humans-description": "עריכות שבוצעו על־ידי עורכים אנושיים.",
+       "rcfilters-filtergroup-significance": "חשיבות",
+       "rcfilters-filter-minor-label": "עריכות משניות",
+       "rcfilters-filter-minor-description": "עריכות שהוגדרו על־ידי העורכים כמשניות.",
+       "rcfilters-filter-major-label": "עריכות שאינן משניות",
+       "rcfilters-filter-major-description": "עריכות שלא הוגדרו כמשניות.",
+       "rcfilters-filtergroup-changetype": "סוג השינויים",
+       "rcfilters-filter-pageedits-label": "עריכות דפים",
+       "rcfilters-filter-pageedits-description": "עריכות של תוכן ויקי, של דיונים, של תיאורי קטגוריות...",
+       "rcfilters-filter-newpages-label": "יצירות דפים",
+       "rcfilters-filter-newpages-description": "עריכות שיוצרות דפים חדשים.",
+       "rcfilters-filter-categorization-label": "שינויים בקטגוריות",
+       "rcfilters-filter-categorization-description": "רישומים על דפים שנוספו לקטגוריות או הוסרו מהן.",
+       "rcfilters-filter-logactions-label": "פעולות יומן",
+       "rcfilters-filter-logactions-description": "פעולות מנהליות, יצירת חשבונות, מחיקת דפים, העלאות...",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} מאז <strong>$3, $4</strong> (מוצגים עד <strong>$1</strong>).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "rcshowhideminor": "$1 עריכות משניות",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|משתמש אחד עוקב|$1 משתמשים עוקבים}} אחרי הדף]",
        "rc_categories": "הגבלה לקטגוריות (מופרדות בתו \"|\"):",
        "rc_categories_any": "כל אחת מהנבחרות",
-       "rc-change-size-new": "{{PLURAL:$1|×\91×\99ת ×\90×\97×\93|$1 ×\91תים}} לאחר השינוי",
+       "rc-change-size-new": "{{PLURAL:$1|×\91×\99×\99×\98 ×\90×\97×\93|$1 ×\91×\99×\99×\98ים}} לאחר השינוי",
        "newsectionsummary": "/* $1 */ פסקה חדשה",
        "rc-enhanced-expand": "הצגת הפרטים",
        "rc-enhanced-hide": "הסתרת הפרטים",
        "uploaded-setting-handler-svg": "SVG שמגדיר את המאפיין \"handler\" עם remote/data/script חסום. נמצא <code dir=\"ltr\">$1=\"$2\"</code> בקובץ ה־SVG שהועלה.",
        "uploaded-remote-url-svg": "SVG שמגדיר כל מאפיין style עם URL מרוחק חסום. נמצא <code dir=\"ltr\">$1=\"$2\"</code> בקובץ ה־SVG שהועלה.",
        "uploaded-image-filter-svg": "נמצא מסנן תמונה עם URL‏: <code dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> בקובץ ה־SVG שהועלה.",
-       "uploadscriptednamespace": "קובץ ה‏‏֫־SVG הזה כולל מרחב שם בלתי חוקי: '$1'",
+       "uploadscriptednamespace": "קובץ ה‏‏֫־SVG הזה כולל מרחב שם בלתי חוקי \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "לא ניתן לפרש את ה־XML בקובץ שהועלה.",
        "uploadvirus": "הקובץ מכיל וירוס!\nפרטים:\n<div dir=\"ltr\">$1</div>",
        "uploadjava": "קובץ זה הוא קובץ ZIP שמכיל קובץ &lrm;.class של Java.\nהעלאת קובצי Java אסורה, כיוון שהם יכולים לגרום לעקיפת מגבלות האבטחה.",
        "uncategorizedcategories": "קטגוריות חסרות קטגוריה",
        "uncategorizedimages": "קבצים חסרי קטגוריה",
        "uncategorizedtemplates": "תבניות חסרות קטגוריה",
+       "uncategorized-categories-exceptionlist": " # מכיל רשימה של קטגוריות שאינן אמורות להופיע בדףSpecial:UncategorizedCategories. יש לכתוב קטגוריה אחת בכל שורה, ולהתחיל כל שורה בתו \"*\". התוכנה תתעלם משורות המתחילות בתווים אחרים (לרבות רווחים). התו \"#\" משמש להערות.",
        "unusedcategories": "קטגוריות שאינן בשימוש",
        "unusedimages": "קבצים שאינם בשימוש",
        "wantedcategories": "קטגוריות מבוקשות",
        "apisandbox-sending-request": "בקשת ה־API בשליחה...",
        "apisandbox-loading-results": "תוצאות ה־API בתהליך קבלה...",
        "apisandbox-results-error": "אירעה שגיאה בעת טעינת תשובת ה־API לבקשה: $1.",
+       "apisandbox-request-selectformat-label": "הצגת המידע שבבקשה כ:",
+       "apisandbox-request-format-url-label": "מחרוזת השאילתה (query string) של כתובת ה־URL",
        "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-continue-clear": "ניקוי",
        "apisandbox-continue-help": "\"{{int:apisandbox-continue}}\" [https://www.mediawiki.org/wiki/API:Query#Continuing_queries ימשיך] את הבקשה האחרונה; \"{{int:apisandbox-continue-clear}}\" ינקה את הפרמטרים הקשורים להמשך.",
        "apisandbox-param-limit": "יש לכתוב <kbd>max</kbd> כדי להשתמש בערך המרבי האפשרי.",
+       "apisandbox-multivalue-all-namespaces": "$1 (כל מרחבי השם)",
+       "apisandbox-multivalue-all-values": "$1 (כל הערכים)",
        "booksources": "משאבי ספרות חיצוניים",
        "booksources-search-legend": "חיפוש משאבי ספרות חיצוניים",
        "booksources-isbn": "מסת\"ב (ISBN):",
        "activeusers-count": "{{PLURAL:$1|פעולה אחת|$1 פעולות}} ב{{PLURAL:$3|יום האחרון|יומיים האחרונים|־$3 הימים האחרונים}}",
        "activeusers-from": "הצגת משתמשים החל מ:",
        "activeusers-groups": "הצגת משתמשים השייכים לקבוצות:",
+       "activeusers-excludegroups": "הסתרת משתמשים השייכים לקבוצות:",
        "activeusers-noresult": "לא נמצאו משתמשים.",
        "activeusers-submit": "הצגת משתמשים פעילים",
        "listgrouprights": "רשימת הרשאות לקבוצה",
        "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:$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": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "שוחזר מעריכות של $1 לעריכה האחרונה של $2",
+       "rollback-success": "שוחזר מעריכות של $1 לעריכה האחרונה של $2.",
        "rollback-success-notify": "שוחזר מעריכות של $1 לעריכה האחרונה של $2. [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
        "sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לחזור לדף הקודם, לטעון אותו מחדש ולנסות שוב.",
        "changecontentmodel-emptymodels-title": "לא קיים מודל תוכן מתאים",
        "changecontentmodel-emptymodels-text": "לא ניתן להמיר את התוכן של [[:$1]] לאף סוג.",
        "log-name-contentmodel": "יומן שינויי מודל תוכן",
-       "log-description-contentmodel": "×\90×\99ר×\95×¢×\99×\9d ×©×§×©×\95ר×\99×\9d ×\9c×\9e×\95×\93×\9c ×ª×\95×\9b×\9f ×©×\9c ×\93פ×\99×\9d",
+       "log-description-contentmodel": "×\91×\93×£ ×\96×\94 ×\9e×\95פ×\99×¢×\99×\9d ×©×\99× ×\95×\99×\99×\9d ×\91×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f ×©×\9c ×\93פ×\99×\9d, ×\95×\9b×\9f ×\93פ×\99×\9d ×©× ×\95צר×\95 ×¢×\9d ×\9e×\95×\93×\9c ×ª×\95×\9b×\9f ×©×\95× ×\94 ×\9e×\91ר×\99רת ×\94×\9e×\97×\93×\9c.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|יצר|יצרה}} את הדף $3 תוך שימוש במודל התוכן \"$5\" השונה ממודל ברירת המחדל",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|שינה|שינתה}} את מודל התוכן של הדף $3 מ\"$4\" ל\"$5\"",
        "logentry-contentmodel-change-revertlink": "שחזור",
        "proxyblockreason": "כתובת ה־IP שלכם נחסמה משום שהיא כתובת של שרת פרוקסי פתוח.\nאנא צרו קשר עם ספק האינטרנט שלכם או עם התמיכה הטכנית של הארגון שלכם והודיעו להם על בעיית האבטחה החמורה הזאת.",
        "sorbsreason": "כתובת ה־IP שלך רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר {{SITENAME}} משתמש בו.",
        "sorbs_create_account_reason": "כתובת ה־IP שלך רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר {{SITENAME}} משתמש בו.\nאין באפשרותך ליצור חשבון.",
+       "softblockrangesreason": "תרומות אנונימיות אינן מותרות מכתובת ה־IP שלך ($1). נא להיכנס לחשבון.",
        "xffblockreason": "כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1",
        "cant-see-hidden-user": "המשתמש שאתם מנסים לחסום כבר נחסם והוסתר.\nכיוון שאין לכם הרשאה להסתרת משתמשים, אין באפשרותכם לצפות בחסימת המשתמש או לערוך אותה.",
        "ipbblocked": "אינכם יכולים לחסום או לשחרר את חסימתם של משתמשים אחרים, כיוון שאתם עצמכם חסומים.",
        "cant-move-to-user-page": "אין לך הרשאה להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
        "cant-move-category-page": "אין לך הרשאה להעביר דפי קטגוריה.",
        "cant-move-to-category-page": "אין לך הרשאה להעביר דף לדף קטגוריה.",
+       "cant-move-subpages": "אין לך הרשאה להעביר דפי משנה.",
+       "namespace-nosubpages": "מרחב השם \"$1\" לא יכול להכיל דפי משנה.",
        "newtitle": "השם החדש:",
        "move-watch": "מעקב אחרי דף המקור ואחרי דף היעד",
        "movepagebtn": "העברת הדף",
        "pageinfo-length": "אורך הדף (בבייטים)",
        "pageinfo-article-id": "מזהה הדף",
        "pageinfo-language": "שפת התוכן של הדף",
+       "pageinfo-language-change": "שינוי",
        "pageinfo-content-model": "מודל התוכן של הדף",
        "pageinfo-content-model-change": "שינוי",
        "pageinfo-robot-policy": "איסוף על־ידי רובוטים של מנועי חיפוש",
        "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
        "log-show-hide-tag": "$1 יומן תגיות",
        "confirm-markpatrolled-button": "אישור",
-       "confirm-markpatrolled-top": "×\9cס×\9e×\9f ×\90ת ×\92רס×\94 $3 ×©×\9c $2 כבדוקה?",
+       "confirm-markpatrolled-top": "×\9cס×\9e×\9f ×\90ת ×\92רס×\94 $3 ×\91×\93×£ $2 כבדוקה?",
        "deletedrevision": "מחיקת גרסה ישנה ($1)",
        "filedeleteerror-short": "שגיאה במחיקת הקובץ: $1",
        "filedeleteerror-long": "שגיאות שאירעו בעת מחיקת הקובץ:\n\n$1",
        "htmlform-user-not-exists": "<strong>$1</strong> אינו קיים.",
        "htmlform-user-not-valid": "<strong>$1</strong> אינו שם משתמש תקין.",
        "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|מחק|מחקה}} את ההפניה $3 באמצעות דריסה",
        "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
        "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 בלי להשאיר הפניה",
        "logentry-move-move_redir": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 תוך דריסת הפניה",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 תוך דריסת הפניה ובלי להשאיר הפניה",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|ס×\99×\9e×\9f|ס×\99×\9e× ×\94}} ×\90ת ×\94×\92רס×\94 $4 ×\91×\93×£ $3 ×\9b×\91×\93×\95ק×\94",
-       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|ס×\99×\9e×\9f|ס×\99×\9e× ×\94}} ×\90×\95×\98×\95×\9e×\98×\99ת ×\90ת ×\94×\92רס×\94 $4 ×\91×\93×£ $3 ×\9b×\91×\93×\95ק×\94",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|סימן|סימנה}} את גרסה $4 בדף $3 כבדוקה",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|סימן|סימנה}} אוטומטית את גרסה $4 בדף $3 כבדוקה",
        "logentry-newusers-newusers": "חשבון המשתמש $1 {{GENDER:$2|נוצר}}",
        "logentry-newusers-create": "חשבון המשתמש $1 {{GENDER:$2|נוצר}}",
        "logentry-newusers-create2": "חשבון המשתמש $3 נוצר על־ידי $1",
        "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-useragent": "User agent:",
        "searchsuggest-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
        "searchsuggest-containing": "כולל...",
-       "api-error-autoblocked": "כתובת ה־IP שלך נחסמה אוטומטית, כי היא הייתה בשימוש על־ידי משתמש חסום.",
-       "api-error-badaccess-groups": "אינך מורשה להעלות קבצים לאתר הוויקי הזה.",
        "api-error-badtoken": "שגיאה פנימית: אסימון שבור.",
-       "api-error-blocked": "נחסמת מעריכה.",
-       "api-error-copyuploaddisabled": "העלאה לפי כתובת כובתה בשרת זה.",
-       "api-error-duplicate": "כבר יש באתר הזה {{PLURAL:$1|קובץ אחר|קבצים אחרים}} עם אותו תוכן.",
-       "api-error-duplicate-archive": "כבר {{PLURAL:$1|היה|היו}} באתר הזה {{PLURAL:$1|קובץ|קבצים}} עם אותו תוכן, אבל {{PLURAL:$1|הוא נמחק|הם נמחקו}}.",
-       "api-error-empty-file": "הקובץ ששלחת היה ריק.",
        "api-error-emptypage": "יצירת דפים חדשים ריקים אינה אפשרית.",
-       "api-error-fetchfileerror": "שגיאה פנימית: משהו השתבש בזמן אחזור הקובץ.",
-       "api-error-fileexists-forbidden": "קובץ בשם \"$1\" כבר קיים ואי־אפשר לדרוס אותו.",
-       "api-error-fileexists-shared-forbidden": "קובץ בשם \"$1\" כבר קיים במאגר הקבצים המשותף ואי־אפשר לדרוס אותו.",
-       "api-error-file-too-large": "הקובץ ששלחת היה גדול מדי.",
-       "api-error-filename-tooshort": "שם הקובץ קצר מדי.",
-       "api-error-filetype-banned": "סוג קובץ זה חסום.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|הוא סוג קובץ אסור להעלאה|הם סוגי קבצים אסורים להעלאה}}. {{PLURAL:$3|סוג הקובץ המותר הוא|סוגי הקבצים המותרים הם}} $2.",
-       "api-error-filetype-missing": "חסרה סיומת לשם הקובץ.",
-       "api-error-hookaborted": "השינוי שניסית לעשות נחסם על־ידי הרחבה.",
-       "api-error-http": "שגיאה פנימית: לא ניתן להתחבר לשרת.",
-       "api-error-illegal-filename": "שם הקובץ הזה אינו מורשה.",
-       "api-error-internal-error": "שגיאה פנימית: משהו השתבש בעת עיבוד ההעלאה שלך באתר הוויקי.",
-       "api-error-invalid-file-key": "שגיאה פנימית: הקובץ לא נמצא במאגר הזמני.",
-       "api-error-missingparam": "שגיאה פנימית: פרמטרים חסרים בבקשה שנשלחה.",
-       "api-error-missingresult": "שגיאה פנימית: לא ניתן לקבוע אם ההעתקה הצליחה.",
-       "api-error-mustbeloggedin": "יש להיכנס לחשבון כדי להעלות קבצים.",
-       "api-error-mustbeposted": "שגיאה פנימית: הבקשה דורשת שימוש בשיטת POST של HTTP.",
-       "api-error-noimageinfo": "ההעלאה הושלמה בהצלחה, אבל השרת לא נתן לנו שום מידע על הקובץ.",
-       "api-error-nomodule": "שגיאה פנימית: מודול ההעלאה אינו מוגדר.",
-       "api-error-ok-but-empty": "שגיאה פנימית: אין תשובה מהשרת.",
-       "api-error-overwrite": "לא מותרת החלפת קובץ קיים.",
-       "api-error-ratelimited": "ניסית להעלות בזמן קצר יותר קבצים מהכמות המירבית המותרת באתר הוויקי הזה.\nנא לנסות שוב בעוד מספר דקות.",
-       "api-error-stashfailed": "שגיאה פנימית: השרת נכשל באחסון הקובץ הזמני.",
        "api-error-publishfailed": "שגיאה פנימית: השרת נכשל בפרסום הקובץ הזמני.",
-       "api-error-stasherror": "הייתה שגיאה בהעלאת הקובץ לסליק.",
-       "api-error-stashedfilenotfound": "הקובץ המוסלק לא נמצא בעת הניסיון להעלות אותו מהסליק.",
-       "api-error-stashpathinvalid": "הנתיב שבו הקובץ שבמאגר אמור היה להימצא היה בלתי תקין.",
-       "api-error-stashfilestorage": "הייתה שגיאה בעת אחסון הקובץ בסליק.",
-       "api-error-stashzerolength": "השרת לא יכול היה לאחסן במאגר את הקובץ, כי אורכו היה אפס.",
-       "api-error-stashnotloggedin": "נדרשת כניסה לחשבון כדי לשמור קבצים בסליק ההעלאות.",
-       "api-error-stashwrongowner": "הקובץ שניסית לגשת אליו במאגר אינו שייך לך.",
-       "api-error-stashnosuchfilekey": "מפתח הקובץ שניסית לגשת אליו בסליק אינו קיים.",
-       "api-error-timeout": "השרת לא השיב בזמן המצופה.",
-       "api-error-unclassified": "אירעה שגיאה בלתי ידועה.",
-       "api-error-unknown-code": "שגיאה בלתי ידועה: \"$1\".",
-       "api-error-unknown-error": "שגיאה פנימית: משהו השתבש בעת ניסיון להעלות את הקובץ שלך.",
-       "api-error-unknown-warning": "אזהרה בלתי ידועה: \"$1\".",
+       "api-error-stashfailed": "שגיאה פנימית: השרת נכשל באחסון הקובץ הזמני.",
+       "api-error-unknown-warning": "אזהרה בלתי־ידועה: \"$1\".",
        "api-error-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
-       "api-error-uploaddisabled": "ההעלאה מבוטלת באתר הוויקי הזה.",
-       "api-error-verification-error": "קובץ זה עשוי להיות פגום או בעל סיומת שגויה.",
-       "api-error-was-deleted": "קובץ בשם הזה הועלה מוקדם יותר ונמחק לאחר מכן.",
        "duration-seconds": "{{PLURAL:$1|שנייה|$1 שניות}}",
        "duration-minutes": "{{PLURAL:$1|דקה|$1 דקות}}",
        "duration-hours": "{{PLURAL:$1|שעה|שעתיים|$1 שעות}}",
        "pagelang-language": "שפה",
        "pagelang-use-default": "להשתמש בשפה הרגילה",
        "pagelang-select-lang": "בחירת שפה",
+       "pagelang-reason": "סיבה",
        "pagelang-submit": "שליחה",
+       "pagelang-nonexistent-page": "הדף $1 אינו קיים.",
+       "pagelang-unchanged-language": "הדף $1 כבר מוגדר לשפה $2.",
+       "pagelang-unchanged-language-default": "הדף $1 כבר מוגדר לשפת התוכן ההתחלתית של אתר הוויקי.",
+       "pagelang-db-failed": "בסיס הנתונים לא הצליח לשנות את שפת הדף.",
        "right-pagelang": "שינוי שפות של דפים",
        "action-pagelang": "לשנות את שפת הדף",
        "log-name-pagelang": "יומן שינוי שפה",
        "special-characters-title-emdash": "קו מפריד ארוך",
        "special-characters-title-minus": "מינוס",
        "mw-widgets-dateinput-no-date": "לא נבחר תאריך",
+       "mw-widgets-mediasearch-input-placeholder": "חיפוש מדיה",
+       "mw-widgets-mediasearch-noresults": "לא נמצאו תוצאות.",
        "mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
        "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
+       "mw-widgets-categoryselector-add-category-placeholder": "הוספת קטגוריה...",
+       "mw-widgets-usersmultiselect-placeholder": "הוספת עוד...",
        "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": "מחיקות של גרסאות",
        "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>",
-       "edit-error-short": "שגיאה: $1",
-       "edit-error-long": "שגיאות:\n\n$1"
+       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "גרסה $1",
+       "pageid": "מזהה דף $1"
 }
index 80bc57b..16a02f8 100644 (file)
                        "Upendradutt93",
                        "Nemo bis",
                        "Wassan.anmol",
-                       "Ziyaurr"
+                       "Ziyaurr",
+                       "NehalDaveND",
+                       "Susant purohit",
+                       "Jayprakash12345"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "tog-enotifminoredits": "छोटे परिवर्तनों के लिए भी मुझे ईमेल भेजें",
        "tog-enotifrevealaddr": "अधिसूचना ईमेल में मेरा ईमेल पता दर्शायें",
        "tog-shownumberswatching": "ध्यान रखने वाले सदस्यों की संख्या दिखायें",
-       "tog-oldsig": "वर्तमान हस्ताक्षर:",
+       "tog-oldsig": "à¤\86पà¤\95ा à¤µà¤°à¥\8dतमान à¤¹à¤¸à¥\8dताà¤\95à¥\8dषर:",
        "tog-fancysig": "हस्ताक्षर का विकिपाठ के समान मानें (बिना स्वचालित कड़ी के)",
        "tog-uselivepreview": "सजीवन झलक का उपयोग करें",
        "tog-forceeditsummary": "यदि सम्पादन सारांश ना दिया गया हो तो मुझे सूचित करें",
        "fri": "शुक्र",
        "sat": "शनि",
        "january": "जनवरी",
-       "february": "फरवरी",
+       "february": "फ़रवरà¥\80",
        "march": "मार्च",
        "april": "अप्रैल",
        "may_long": "मई",
        "november": "नवम्बर",
        "december": "दिसम्बर",
        "january-gen": "जनवरी",
-       "february-gen": "फरवरी",
+       "february-gen": "फ़रवरà¥\80",
        "march-gen": "मार्च",
        "april-gen": "अप्रैल",
        "may-gen": "मई",
        "nov": "नव॰",
        "dec": "दिस॰",
        "january-date": "$1 जनवरी",
-       "february-date": "$1 फरवरी",
+       "february-date": "$1 à¤«à¤¼à¤°à¤µà¤°à¥\80",
        "march-date": "$1 मार्च",
        "april-date": "$1 अप्रैल",
        "may-date": "$1 मई",
        "newwindow": "(नई विंडो में खुलता है)",
        "cancel": "रद्द करें",
        "moredotdotdot": "और...",
-       "morenotlisted": "यह सूची पूर्ण नहीं है।",
+       "morenotlisted": "शायद à¤¯à¥\87 सूची पूर्ण नहीं है।",
        "mypage": "पृष्ठ",
        "mytalk": "वार्ता",
        "anontalk": "वार्ता",
        "qbedit": "सम्पादन",
        "qbpageoptions": "यह पृष्ठ",
        "qbmyoptions": "मेरे पृष्ठ",
-       "faq": "à¤\85à¤\95à¥\8dसर पूछे जाने वाले प्रश्न",
-       "faqpage": "Project:à¤\85à¤\95à¥\8dसर पूछे जाने वाले सवाल",
+       "faq": "बहà¥\81धा पूछे जाने वाले प्रश्न",
+       "faqpage": "Project:बहà¥\81धा पूछे जाने वाले सवाल",
        "actions": "क्रियाएँ",
        "namespaces": "नामस्थान",
        "variants": "संस्करण",
        "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": "फ़ाइल पृष्ठ देखें",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "\"$1\" से लिया गया",
-       "youhavenewmessages": "आपके लिए $1 हैं। ($2)",
-       "youhavenewmessagesfromusers": "आपके लिये {{PLURAL:$3|एक अन्य सदस्य|$3 अन्य सदस्यों}} के $1 हैं। ($2)",
+       "youhavenewmessages": "{{PLURAL:$3|आपके लिए}} $1 हैं। ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|आपके लिये}} {{PLURAL:$3|एक अन्य सदस्य|$3 अन्य सदस्यों}} के $1 हैं। ($2)",
        "youhavenewmessagesmanyusers": "आपके लिये $1 हैं। ($2)",
        "newmessageslinkplural": "{{PLURAL:$1|एक नया सन्देश|999=नये सन्देश}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|पिछला|999=पिछले}} बदलाव",
        "viewsourcetext": "आप इस पृष्ठ का स्रोत देख सकते हैं और उसकी नकल उतार सकते हैं:",
        "viewyourtext": "आप इस पृष्ठ में ''अपने सम्पादन'' का स्रोत देख सकते हैं और उसकी नकल उतार सकते हैं:",
        "protectedinterface": "यह पृष्ठ इस विकी के सॉफ़्टवेयर का इंटरफ़ेस पाठ देता है, और इसे गलत प्रयोग से बचाने के लिये सुरक्षित कर दिया गया है।\nसभी विकियों के लिए अनुवाद जोड़ने या बदलने के लिए कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [https://translatewiki.net/ translatewiki.net] का प्रयोग करें।",
-       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\95 à¤\90सà¥\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤² à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82 à¤\9cà¥\8b à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95ा à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤  à¤ªà¥\8dरदान à¤\95रता à¤¹à¥\88।\nà¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤²à¤¨à¥\87 à¤¸à¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\8b à¤ªà¥\8dरदरà¥\8dशित à¤\87à¤\82à¤\9fरफ़à¥\87स à¤\95à¥\80 à¤¶à¤\95à¥\8dलà¥\8bसà¥\82रत में बदलाव आएगा।",
+       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\95 à¤\90सà¥\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤² à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82 à¤\9cà¥\8b à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95ा à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤  à¤ªà¥\8dरदान à¤\95रता à¤¹à¥\88।\nà¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤²à¤¨à¥\87 à¤¸à¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\8b à¤ªà¥\8dरदरà¥\8dशित à¤\87à¤\82à¤\9fरफ़à¥\87स à¤\95à¥\80 à¤¸à¥\8dवरà¥\82प में बदलाव आएगा।",
        "translateinterface": "सभी विकियों के लिए अनुवाद जोड़ने या बदलने के लिए मीडियाविकि क्षेत्रीयकरण परियोजना [https://translatewiki.net/ translatewiki.net] का प्रयोग करें।",
        "cascadeprotected": "यह पृष्ठ सुरक्षित हैं, क्योंकि यह निम्नलिखित {{PLURAL:$1|पृष्ठ|पृष्ठों}} की सुरक्षा-सीढ़ी में समाविष्ट है:\n$2",
        "namespaceprotected": "आपको '''$1''' नामस्थान में समाविष्ट पृष्ठों को बदलने की अनुमति नहीं है।",
        "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": "या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।",
        "noemail": "\"$1\" सदस्य के लिये कोई भी ई-मेल पता दर्ज नहीं किया गया है।",
        "noemailcreate": "आपको वैध ई-मेल पता देने होगा।",
        "passwordsent": "\"$1\" के ई-मेल पते पर एक नया कूटशब्द भेज दिया गया है।\nई-मेल पाने बाद कृपया दुबारा लॉग इन करें।",
-       "blocked-mailpassword": "à¤\86पà¤\95à¥\87 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¥\87 à¤\95à¥\8b à¤¸à¤®à¥\8dपादन à¤\95रनà¥\87 à¤¸à¥\87 à¤\85वरà¥\81दà¥\8dध à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\94र à¤\97लत à¤\87सà¥\8dतà¥\87माल à¤°à¥\8bà¤\95नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¥\81नà¤\83 à¤ªà¥\8dरापà¥\8dति à¤\95à¥\80 à¤¸à¥\81विधा à¤\87स à¤\86à¤\87॰पà¥\80 पर बंद कर दी गई है।",
+       "blocked-mailpassword": "à¤\86पà¤\95à¥\87 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¥\87 à¤\95à¥\8b à¤¸à¤®à¥\8dपादन à¤\95रनà¥\87 à¤¸à¥\87 à¤\85वरà¥\81दà¥\8dध à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\94र à¤\97लत à¤\87सà¥\8dतà¥\87माल à¤°à¥\8bà¤\95नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¥\81नà¤\83 à¤ªà¥\8dरापà¥\8dति à¤\95à¥\80 à¤¸à¥\81विधा à¤\87स à¤\86à¤\88॰ à¤ªà¥\80॰ पर बंद कर दी गई है।",
        "eauthentsent": "दर्ज किये हुए ई-मेल पते पर एक सत्यापन ई-मेल भेजा दिया गया है।\nआपको उस ई-मेल में दिये हुए निर्देशों के अनुसार ई-मेल पते का सत्यापन करना होगा, उसके पश्चात ही यहाँ से कोई दूसरा ई-मेल भेजा जाएगा।",
        "throttled-mailpassword": "पिछले {{PLURAL:$1|एक घंटे|$1 घंटों}} के दरमियान एक कूटशब्द स्मरण-पत्र भेजा जा चुका है।\nदुरुपयोग से बचाव के लिए हर {{PLURAL:$1|एक घंटे|$1 घंटों}} में एक कूटशब्द स्मरण-पत्र ही भेजा जाता है।",
        "mailerror": "ई-मेल भेजने में त्रुटि: $1",
        "passwordreset-emaildisabled": "इस विकि पर ई-मेल सुविधा अक्षम कर दी गयी है।",
        "passwordreset-username": "सदस्यनाम:",
        "passwordreset-domain": "डोमेन:",
-       "passwordreset-capture": "परिणामस्वरूप बना ई-मेल देखें?",
-       "passwordreset-capture-help": "अगर आप इस चेकबॉक्स को टिक करते हैं तो ई-मेल (अस्थायी कूटशब्द के साथ) आप को दिखया जाएगा और सदस्य को भेजा भी जयेगा।",
        "passwordreset-email": "ई-मेल पता:",
        "passwordreset-emailtitle": "{{SITENAME}} पर खाते का विवरण",
        "passwordreset-emailtext-ip": "किसी ने (शायद आपने ही, $1 आइ॰पी पते से) {{SITENAME}} ($4) पर अपने {{PLURAL:$3|कूटशब्द|कूटशब्दों}} को रीसेट करने का अनुरोध किया है। इस ई-मेल पते से निम्न {{PLURAL:$3|खाता जुड़ा है|खाते जुड़े हैं}}:\n\n$2\n\n{{PLURAL:$3|यह|ये}} अस्थायी कूटशब्द {{PLURAL:$5|एक दिन|$5 दिनों}} के बाद काम नहीं करेंगे। आपको लॉग इन करके एक नया कूटशब्द अभी चुन लेना चाहिए। यदि यह अनुरोध किसी और ने किया है, या फिर आपको अपना मूल कूटशब्द याद आ गया है, और आप {{PLURAL:$3|अपना|अपने}} कूटशब्द नहीं बदलना चाहते, आप इस संदेश को अनदेखा कर के अपने पुराने कूटशब्द का प्रयोग जारी रख सकते हैं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "यदि आपका यह ईमेल आपके खाते के साथ जोड़ा गया है तो पासवर्ड बदलने का ईमेल इसमें भेज दिया गया है।",
        "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|सदस्य}} को ईमेल भेजना विफल : $1 {{PLURAL:$3|सदस्य नाम और पासवर्ड|सदस्य नाम और पासवर्ड की सूची}} नीचे दिया गया है।",
+       "passwordreset-nocaller": "कॉलर प्रदान किया जाना चाहिए",
+       "passwordreset-nosuchcaller": "कॉलर मौजूद नहीं है: $1",
+       "passwordreset-ignored": "पासवर्ड रीसेट नहीं संभाला गया। हो सकता है कि कोई प्रदाता कॉन्फ़िगर नही किया गया हो?",
        "passwordreset-invalidemail": "अवैध ईमेल पता",
+       "passwordreset-nodata": "न तो यूजर नाम और न ही ईमेल पता आपूर्ति की गई",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "changeemail-header": "अपना ईमेल पता परिवर्तन हेतु इसे पूरा करें। यदि आप अपना वर्तमान ईमेल पता हटाना चाहते हैं, तो इसे खाली छोड़ दें और इसे भेजें।",
        "changeemail-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "blockedtitle": "सदस्य अवरुद्ध है",
        "blockedtext": "'''आपका सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिया गया हैं ।'''\n\nअवरोध $1 द्वारा किया गया था।\nअवरोध का कारण है ''$2''\n\n* अवरोध का आरंभ: $8\n* अवरोध की समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइस अवरोध के बारे में चर्चा करने के लिए आप $1 या किसी अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकते हैं।\nअगर आपने [[Special:Preferences|अपनी वरीयताओं]] में वैध ई-मेल पता प्रविष्ट किया है तो ही आप 'इस प्रयोक्ता को ई-मेल भेजें' वाली सुविधा का इस्तेमाल कर सकते हैं और आपको इसका इस्तेमाल करने से नहीं रोका गया है।\nआपका मौजूदा आइ॰पी पता $3 है और अवरोध क्रमांक #$5 है।\nअपने किसी भी प्रश्न में कृपया यह सभी जानकारी भी शामिल करें।",
        "autoblockedtext": "एक और सदस्य आपके ही आइ॰पी का प्रयोग कर रहे थे और उन्हें $1 द्वारा अवरोधित कर दिया गया था। फलस्वरूप आपका आइ॰पी पता भी स्वचालित रूप से अवरोधित हो गया है।\nअवरोध करने का कारण है:\n\n:''$2''\n\n* अवरोध प्रारंभ: $8\n* अवरोध समाप्ति: $6\n* अवरोधित सदस्य: $7\n\nअवरोध की चर्चा करने के लिए आप $1 या किसी अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबंधक]] से संपर्क कर सकते हैं।\n\nकृपया ध्यान दें कि यदि आपक \"इस सदस्य को ई-मेल भेजें\" वाली सुविधा का प्रयोग करना चाहते हैं तो आपकी [[Special:Preferences|वरीयताओं]] में वैध ई-मेल पता होना चाहिए और इसका प्रयोग आपके लिए अवरोधित नहीं होना चाहिए।\n\nआपका मौजूदा आइ॰पी पता $3 है और अवरोध क्रमांक #$5 है।\nअपने किसी भी प्रश्न में कृपया यह सभी जानकारी भी शामिल करें।",
+       "systemblockedtext": "आपका यूज़र नेम या आईपी का पता स्वचालित रूप से MediaWiki द्वारा अवरुद्ध कर दिया गया है।\nकारण दिया है:\n:<em>$2</em>\n\n* ब्लॉक का प्रारंभ: $8\n* ब्लॉक की समय सीमा समाप्त: $6\n* इरादा : $7\n\nआपका वर्तमान आईपी पता $3 है।\nआप किसी भी प्रश्न में सभी जानकारी भी शामिल करें।",
        "blockednoreason": "कोई कारण नहीं दिया है",
        "whitelistedittext": "पृष्ठ संपादित करने के लिये आपको $1 करना होगा।",
        "confirmedittext": "संपादन करने से पहले अपना ई-मेल पता प्रमाणित करना आवश्यक है।\nकृपया अपनी [[Special:Preferences|सदस्य वरीयताओं]] में जाकर अपना ई-मेल पता दें और उसे प्रमाणित करें।",
        "invalid-content-data": "अवैध डाटा सामग्री",
        "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": "$1 सामग्री स्वरूप $2 सामग्री मॉडल द्वारा समर्थित नहीं है।",
        "content-model-wikitext": "विकिपाठ्य",
        "content-model-json": "जेसन",
        "content-json-empty-object": "रिक्त ऑब्जेक्ट",
        "content-json-empty-array": "रिक्त ऐरे",
+       "deprecated-self-close-category": "अवैध एचटीएमएल टैग का उपयोग कर रहे पृष्ठ",
        "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>.",
        "nextn-title": "{{PLURAL:$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]]\" नाम का पृष्ठ बनाएँ!</strong>{{PLURAL:$2|0=|आपकी खोज से मिला पृष्ठ भी देखें।|खोज परिणाम भी देखें।}}",
        "searchprofile-articles": "सामग्री पृष्ठ",
        "searchprofile-images": "मल्टीमीडिया",
        "search-interwiki-caption": "अन्य प्रकल्प",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(और)",
+       "search-interwiki-more-results": "अधिक परिणाम",
        "search-relatedarticle": "सम्बंधित",
        "searchrelated": "सम्बंधित",
        "searchall": "सभी",
        "search-external": "बाहरी खोज",
        "searchdisabled": "{{SITENAME}} पर खोज अक्षम है।\nआप गूगल से खोज कर सकते हैं।\nध्यान रखें कि उनकी {{SITENAME}} सामग्री की सूची पुरानी हो सकती है।",
        "search-error": "खोजते समय निम्न त्रुटि उत्पन्न हुई है: $1",
+       "search-warning": "खोजते समय निम्न त्रुटि उत्पन्न हुई है: $1",
        "preferences": "मेरी वरीयताएँ",
        "mypreferences": "पसंद",
        "prefs-edits": "संपादन संख्या:",
        "prefs-changeemail": "ई-मेल पता परिवर्तित करें",
        "prefs-setemail": "ई-मेल पता सेट करें",
        "prefs-email": "ई-मेल वरीयताएँ",
-       "prefs-rendering": "शà¤\95à¥\8dलà¥\8bसà¥\82रत",
+       "prefs-rendering": "सà¥\8dवरà¥\82प",
        "saveprefs": "संजोएँ",
        "restoreprefs": "वापिस मूल जमावों पर आ जाएँ (सभी भागों में)",
        "prefs-editing": "संपादन",
-       "rows": "कतारें:",
-       "columns": "कॉलम:",
        "searchresultshead": "खोज",
        "stub-threshold": "आधार कड़ी हेतु प्रारूपण ($1):",
        "stub-threshold-sample-link": "उदाहरण",
        "youremail": "आपका ई-मेल पता:",
        "username": "{{GENDER:$1|सदस्यनाम}}:",
        "prefs-memberingroups": "निम्नलिखित {{PLURAL:$1|समूह|समूहों}} के {{GENDER:$2|सदस्य}}:",
+       "group-membership-link-with-expiry": "$1 ($2 तक)",
        "prefs-registration": "पंजीकरण समय:",
        "yourrealname": "वास्तविक नाम:",
        "yourlanguage": "भाषा:",
        "prefswarning-warning": "आपने अपनी वरीयताओं में एैसे परिवर्तन किए हैं जिन्हे अभी तक संचित नहीं किया गया है। अगर अाप \"$1\" पर बिना क्लिक किये इस पृष्ठ को छोड़ देते हैं तो अापकी वरीयताओं का अद्यतन नहीं किया जाएगा।",
        "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स के बीच आवागमन करने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग कर सकते हैं।",
        "userrights": "सदस्य अधिकार व्यवस्थापन",
-       "userrights-lookup-user": "सदसà¥\8dय à¤¸à¤®à¥\82हà¥\8bà¤\82 à¤\95ा à¤µà¥\8dयवसà¥\8dथापन à¤\95रें",
+       "userrights-lookup-user": "सदसà¥\8dय à¤\9aà¥\81नें",
        "userrights-user-editname": "सदस्यनाम दें:",
        "editusergroup": "{{GENDER:$1|सदस्य}} समूहों का संपादन करें",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 के अधिकार बदलें\n{{GENDER:$1|सदस्य}} के सदस्य अधिकार बदले जा रहे हैं <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्य समूहों का संपादन करें",
+       "userrights-viewusergroup": "सदस्य समूह देखें",
        "saveusergroups": "{{GENDER:$1|सदस्य}} समूह सहेजें",
        "userrights-groupsmember": "निम्न {{PLURAL:$1|समूह|समूहों}} का सदस्य:",
        "userrights-groupsmember-auto": "निम्न {{PLURAL:$1|समूह|समूहों}} का अंतर्निहित सदस्य:",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "आपको अन्य विकियों पर सदस्य अधिकार बदलने की अनुमति नहीं हैं।",
        "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नहीं है या फिर स्थानीय नहीं है।",
-       "userrights-nologin": "सदस्य अधिकार बदलने के लिये प्रबंधक खाते से [[Special:UserLogin|लॉग इन]] किया हुआ होना आवश्यक है।",
-       "userrights-notallowed": "आपके पास सदस्य अधिकार जोड़ने या हटाने की अनुमति नहीं है।",
        "userrights-changeable-col": "समूह जिन्हें आप बदल सकते हैं",
        "userrights-unchangeable-col": "समूह जिन्हें आप नहीं बदल सकते हैं",
+       "userrights-expiry-current": "समाप्ती $1",
+       "userrights-expiry-none": "समाप्त नहीं होता",
+       "userrights-expiry": "समाप्ति:",
+       "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-conflict": "सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।",
-       "userrights-removed-self": "आपने सफलतापूर्वक अपने अधिकार हटा दिए हैं। अतः आप अब यह पृष्ठ नहीं देख सकते हैं।",
        "group": "समूह:",
        "group-user": "सदस्य",
        "group-autoconfirmed": "स्वतः स्थापित सदस्य",
        "right-siteadmin": "डाटाबेस को ताला लगायें या खोलें",
        "right-override-export-depth": "पृष्ठ निर्यात करें, पाँच स्तर की गहराई तक जुड़े हुए पृष्ठों समेत",
        "right-sendemail": "अन्य सदस्यों को ई-मेल भेजें",
-       "right-passwordreset": "कूटशब्द रीसेट ई-मेल देखें",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "right-applychangetags": "प्रयोग में लाइये [[Special:Tags|tags]] किसी के बदलाव के साथ।",
        "right-changetags": "जमा करो और हटाओ स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
+       "right-deletechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] हटाएँ",
        "grant-generic": "\"$1\" अधिकार संग्रह",
        "grant-group-page-interaction": "पृष्ठों से जुड़ें",
        "grant-group-file-interaction": "मीडिया से जुड़ें",
        "grant-group-high-volume": "उच्च कार्य गतिविधि करें",
        "grant-group-customization": "पसंद और तय",
        "grant-group-administration": "प्रबंधकीय कार्य करें",
+       "grant-group-private-information": "अपने बारे में निजी जानकारी देखें",
        "grant-group-other": "अन्य गतिविधि",
        "grant-blockusers": "प्रतिबंधित और अप्रतिबंधित करना",
        "grant-createaccount": "खाता बनाएँ",
        "grant-highvolume": "अत्यधिक तेजी से सम्पादन",
        "grant-oversight": "सदस्य को छुपाना और अवतरण हटाना",
        "grant-patrol": "पृष्ठों को जांचा हुआ चिन्हित करना",
+       "grant-privateinfo": "निजी जानकारी देखें",
        "grant-protect": "पृष्ठों को सुरक्षित व असुरक्षित करना",
        "grant-rollback": "पृष्ठ से सम्पादन वापस लेना",
        "grant-sendemail": "अन्य सदस्यों को ई-मेल भेजें",
        "grant-basic": "सामान्य अधिकार",
        "grant-viewdeleted": "हटाये गए फ़ाइल व पृष्ठ देखें",
        "grant-viewmywatchlist": "अपनी ध्यानसूची देखें",
+       "grant-viewrestrictedlogs": "प्रतिबंधित प्रविष्टि लॉग देखें",
        "newuserlogpage": "सदस्य खाता निर्माण लॉग",
        "newuserlogpagetext": "यह सदस्य खातों के निर्माण का लॉग है।",
        "rightslog": "सदस्य अधिकार लॉग",
        "rightslogtext": "यह सदस्य अधिकारों में हुए बदलावों की सूची है।",
        "action-read": "इस पृष्ठ को पढ़ने",
        "action-edit": "इस पृष्ठ को सम्पादित करने",
-       "action-createpage": "पà¥\83षà¥\8dठ à¤¬à¤¨à¤¾à¤¨à¥\87",
-       "action-createtalk": "वारà¥\8dता à¤ªà¥\83षà¥\8dठ à¤¬à¤¨à¤¾à¤¨à¥\87",
+       "action-createpage": "à¤\87स à¤ªà¤¨à¥\8dनà¥\87 à¤\95à¥\8b à¤¬à¤¨à¤¾à¤¯à¥\87à¤\82",
+       "action-createtalk": "à¤\87स à¤µà¤¾à¤°à¥\8dता à¤ªà¤¨à¥\8dनà¥\87 à¤\95à¥\8b à¤¬à¤¨à¤¾à¤¯à¥\87à¤\82",
        "action-createaccount": "यह सदस्य खाता खोलने",
        "action-autocreateaccount": "स्वतः ही बाहरी सदस्य खाता बनायें",
        "action-history": "इस पृष्ठ का इतिहास देखने",
        "action-writeapi": "लेखन ए॰पी॰आई का प्रयोग करने",
        "action-delete": "इस पृष्ठ को हटाने",
        "action-deleterevision": "इस अवतरण को हटाने",
+       "action-deletelogentry": "लॉग प्रविष्टियाँ को हटाए",
        "action-deletedhistory": "इस पृष्ठ के मिटे इतिहास को देखने",
        "action-browsearchive": "हटाएँ गए पृष्ठों में खोजने",
        "action-undelete": "इस पृष्ठ को पुनर्स्थापित करने",
        "action-userrights-interwiki": "अन्य विकियों पर सदस्य अधिकार बदलने",
        "action-siteadmin": "डाटाबेस को ताला लगाने या खोलने",
        "action-sendemail": "ई-मेल भेजने",
+       "action-editmyoptions": "अपनी पसंद संपादित करें",
        "action-editmywatchlist": "ध्यानसूची सम्पादित करने",
        "action-viewmywatchlist": "अपनी ध्यानसूची देखें",
        "action-viewmyprivateinfo": "अपनी व्यक्तिगत जानकारी देखने",
        "action-editmyprivateinfo": "अपनी व्यक्तिगत जानकारी बदलने",
        "action-editcontentmodel": "एक पेज की सामग्री मॉडल को संपादित।",
-       "action-managechangetags": "डà¥\87à¤\9fाबà¥\87स à¤¸à¥\87 à¤\9aिपà¥\8dपि à¤¬à¤¨à¤¾à¤¯à¥\87à¤\82 à¤\94र à¤¹à¤\9fायà¥\87à¤\82",
+       "action-managechangetags": "चिप्पि बनायें और हटायें",
        "action-applychangetags": "अपमे बदलाव के साथ टैग जोड़ें।",
        "action-changetags": "जमा करें और हटाएँ स्वतंत्र टैग व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
+       "action-deletechangetags": "डेटाबेस से चिप्पि हटा दें",
+       "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-activefilters": "सक्रिय फिल्टर",
+       "rcfilters-restore-default-filters": "मूलभूत फिल्टर पुनर्स्थापित करे",
+       "rcfilters-clear-all-filters": "सभी फिल्टर हटाएँ",
+       "rcfilters-search-placeholder": "हाल में हुए बदलाव फ़िल्टर (ब्राउज़ या टाइप करना आरंभ करें)",
+       "rcfilters-invalid-filter": "अमान्य फ़िल्टर",
+       "rcfilters-empty-filter": "कोई सक्रिय फिल्टर नहीं। सभी योगदान दिखाए गए है।",
+       "rcfilters-filterlist-title": "फिल्टर",
+       "rcfilters-filterlist-noresults": "कोई फिल्टर नहीं पाया",
+       "rcfilters-filtergroup-registration": "उपयोगकर्ता पंजीकरण",
+       "rcfilters-filter-registered-label": "पंजीकृत:",
+       "rcfilters-filter-registered-description": "लॉग-इन संपादक।",
+       "rcfilters-filter-unregistered-label": "अपंजीकृत",
+       "rcfilters-filter-unregistered-description": "संपादक जो लॉग इन नहीं हैं।",
+       "rcfilters-filter-editsbyself-label": "आपके अपने संपादन",
+       "rcfilters-filter-editsbyself-description": "आपके द्वारा संपादित",
+       "rcfilters-filter-editsbyother-label": "दूसरों के द्वारा संपादित",
+       "rcfilters-filter-bots-label": "बॉट",
+       "rcfilters-filter-humans-label": "मानव (बॉट नहीं)",
+       "rcfilters-filter-humans-description": "मानव संपादक द्वारा किए गए संपादन।",
+       "rcfilters-filtergroup-significance": "महत्व",
+       "rcfilters-filter-minor-label": "छोटा संपादन",
+       "rcfilters-filter-major-label": "गैर-मामूली संपादन",
+       "rcfilters-filtergroup-changetype": "बदलाव के प्रकार:",
+       "rcfilters-filter-pageedits-label": "पृष्ठ संपादन",
+       "rcfilters-filter-newpages-label": "पृष्ठ कृतियों",
+       "rcfilters-filter-newpages-description": "संपादन जिससे नया पृष्ट बना",
+       "rcfilters-filter-categorization-label": "श्रेणी परिवर्तन",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "rcshowhideminor": "छोटे बदलाव $1",
        "uploaded-setting-handler-svg": "एसवीजी जो \"handler\" जोड़ता है, अवरोधित है। उससे मिला <code>$1=\"$2\"</code> है।",
        "uploaded-remote-url-svg": "एसवीजी जो रिमोट पते द्वारा शैली तय करता है, अवरोधित है। उससे <code>$1=\"$2\"</code> मिला है।",
        "uploaded-image-filter-svg": "पते के साथ छवि छन्नी मिला: <code>&lt;$1 $2=\"$3\"&gt;</code> एसवीजी फ़ाइल में।",
-       "uploadscriptednamespace": "इस एस॰वी॰जी फ़ाइल में अमान्य नामस्थान \"$1\" है।",
+       "uploadscriptednamespace": "इस एस॰वी॰जी फ़ाइल में अमान्य नामस्थान \"<nowiki>$1</nowiki>\" है।",
        "uploadinvalidxml": "अपलोड की गई फ़ाइल में स्थित XML पार्स नहीं की जा सकी।",
        "uploadvirus": "इस फ़ाइल में व्हाईरस हैं! अधिक जानकारी: $1",
        "uploadjava": "यह फ़ाइल एक ज़िप फ़ाइल है जिसमें एक जावा .class फ़ाइल है।\nजावा फ़ाइलों को अपलोड करना वर्जित है, क्योंकि इनके कारण सुरक्षा बाधाएँ पार की जा सकती हैं।",
        "upload-foreign-cant-upload": "यह विकि अन्य फ़ाइल संग्रह में अपलोड हेतु तय नहीं किया गया है।",
        "upload-dialog-title": "फ़ाइल डालें",
        "upload-dialog-button-cancel": "रद्द करें",
+       "upload-dialog-button-back": "पीछे",
        "upload-dialog-button-done": "पूर्ण हुआ",
        "upload-dialog-button-save": "सहेजें",
        "upload-dialog-button-upload": "डालें",
        "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": "आइ॰एस॰बी॰एन:",
        "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} वापिस लें",
        "rollbacklinkcount-morethan": "$1 से अधिक {{PLURAL:$1|सम्पादन}} वापिस लें",
        "rollbackfailed": "वापिस लेना असफल रहा",
+       "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>।",
        "sp-contributions-username": "आईपी पता या सदस्यनाम:",
        "sp-contributions-toponly": "केवल उन सम्पादनों को दिखाएँ जो नवीनतम संशोधन हैं",
        "sp-contributions-newonly": "केवल वे सम्पादन दिखाएँ जिनसे पृष्ठ निर्मित हुए हों",
+       "sp-contributions-hideminor": "छोटे सम्पादन छुपाएँ",
        "sp-contributions-submit": "खोजें",
        "whatlinkshere": "यहाँ के हवाले कहाँ कहाँ हैं",
        "whatlinkshere-title": "$1 से जुड़े हुए पृष्ठ",
        "cant-move-to-user-page": "आपको किसी पन्नो को सदस्य पृष्ठ पर ले जाने की अनुमति नहीं है (सिवाय सदस्य उप पृष्ठ के)",
        "cant-move-category-page": "आपको श्रेणी प्रष्ठों को स्थानांतरित करने की अनुमति नहीं है।",
        "cant-move-to-category-page": "आपको किसी पृष्ठ को श्रेणी पृष्ठ पर स्थानांतरित करने की अनुमति नहीं है।",
+       "namespace-nosubpages": "\"$1\" नामस्थान उपपृष्ठ की अनुमति नहीं देता है।",
        "newtitle": "नया शीर्षक:",
        "move-watch": "ध्यान रखें",
        "movepagebtn": "नाम बदलें",
        "pageinfo-length": "पृष्ठ आकार (बाइट्स में)",
        "pageinfo-article-id": "पृष्ठ आइ॰डी",
        "pageinfo-language": "पृष्ठ सामग्री भाषा",
+       "pageinfo-language-change": "परिवर्तन",
        "pageinfo-content-model": "पृष्ठ सामग्री का नमूना",
+       "pageinfo-content-model-change": "बदलें",
        "pageinfo-robot-policy": "सर्च इंजन बॉट द्वारा अनुक्रमण",
        "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": "ठीक है",
+       "confirm-markpatrolled-top": "$2 के $3 संशोधन को परीक्षित चिन्ह्नत करे?",
        "deletedrevision": "पुराना अवतरण $1 हटा दिया",
        "filedeleteerror-short": "फ़ाईल हटानेमें समस्या: $1",
        "filedeleteerror-long": "फ़ाईल हटानेमें आईं समस्यायें:\n\n$1",
        "tag-filter": "[[Special:Tags|चिप्पी]] छननी:",
        "tag-filter-submit": "छननी",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)",
+       "tag-mw-contentmodelchange": "सामग्री मॉडल परिवर्तन",
        "tags-title": "चिप्पियाँ",
        "tags-intro": "यह पृष्ठ अर्थ सहित वह चिप्पियाँ दर्शाता है जिनका कोई तंत्रांश किसी संपादन पर निशान लगाने के लिए इस्तेमाल कर सकता है।",
        "tags-tag": "चिप्पी का नाम",
        "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 नहीं बना है।",
        "feedback-thanks": "धन्यवाद! आपकी प्रतिक्रिया पृष्ठ में नियुक्त किया गया है \"[ $2  $1 ]\"।",
        "feedback-thanks-title": "धन्यवाद!",
        "feedback-useragent": "सदस्य कर्ता:",
-       "searchsuggest-search": "खोज",
+       "searchsuggest-search": "खोजें {{SITENAME}}",
        "searchsuggest-containing": "...से युक्त",
-       "api-error-autoblocked": "आपका आईपी पता अपने आप अवरोधित हो गया, क्योंकि यह किसी अवरोधित सदस्य द्वारा उपयोग किया गया था।",
-       "api-error-badaccess-groups": "आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.",
        "api-error-badtoken": "आंतरिक त्रुटि: बुरी टोकन।",
-       "api-error-blocked": "आपको सम्पादन से अवरोधित किया गया है।",
-       "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
-       "api-error-duplicate": "वहाँ {{PLURAL:$1| अन्य फ़ाइल | रहे हैं कुछ अन्य फ़ाइलों}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
-       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था कुछ अन्य फ़ाइल |were कुछ अन्य फ़ाइलें}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
-       "api-error-empty-file": "प्रस्तुत फ़ाइल खाली था।",
        "api-error-emptypage": "नए खाली पृष्ठ बनाने की अनुमति नहीं है।",
-       "api-error-fetchfileerror": "आंतरिक त्रुटि: जब फ़ाइल लाया जा रहा तो कुछ गलत हो गया था।",
-       "api-error-fileexists-forbidden": "\"$1\" नाम की फ़ाइल पहले से मौजूद है और अधिलेखित नहीं की जा सकती।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" नाम की फ़ाइल पहले से साझे फ़ाइल भण्डार में मौजूद है, और अधिलेखित नहीं की जा सकती।",
-       "api-error-file-too-large": "प्रस्तुत फ़ाइल बहुत बड़ी थी।",
-       "api-error-filename-tooshort": "फ़ाइल का नाम बहुत छोटा है।",
-       "api-error-filetype-banned": "इस प्रकार की फ़ाइल पर प्रतिबंध लगा दिया है।",
-       "api-error-filetype-banned-type": "$1 फ़ाइल {{PLURAL:$4|प्रकार|प्रकारों}} की अनुमति नहीं है। फ़ाइल प्रकार {{PLURAL:$3|जिसकी|जिनकी}} अनुमति है: $2।",
-       "api-error-filetype-missing": "फाईल की एक्सटेंशन लापता है.",
-       "api-error-hookaborted": "आपके द्वारा प्रयासरत संशोधन विस्तार हूक द्वारा निरस्त किया गया।",
-       "api-error-http": "आंतरिक त्रुटि: सर्वर से कनेक्ट करने में असमर्थ।",
-       "api-error-illegal-filename": "फ़ाइल नाम की अनुमति नहीं है।",
-       "api-error-internal-error": "आंतरिक त्रुटि: विकि पर अपने अपलोड प्रसंस्करण के साथ कुछ गलत हो गया था.",
-       "api-error-invalid-file-key": "आंतरिक त्रुटि: फ़ाइल अस्थायी भंडारण में नहीं पाया गया.",
-       "api-error-missingparam": "आंतरिक त्रुटि: अनुरोध पर  पैरामीटर लापता",
-       "api-error-missingresult": "आन्तरिक त्रुटि: यह प्रतिलिपि सफल निर्धारित नहीं हो सकी",
-       "api-error-mustbeloggedin": "आप फ़ाइलों को अपलोड करने के लिये आपको लॉग इन होना चाहिए.",
-       "api-error-mustbeposted": "आंतरिक त्रुटि: HTTP POST अनुरोध की आवश्यकता है.",
-       "api-error-noimageinfo": "अपलोड सफल, लेकिन सर्वर ने फ़ाइल के बारे में हमें कोई जानकारी नहीं दी.",
-       "api-error-nomodule": "आंतरिक त्रुटि: कोई अपलोड मॉड्यूल सेट नहीं",
-       "api-error-ok-but-empty": "आंतरिक त्रुटि: सर्वर से कोई जवाब नहीं.",
-       "api-error-overwrite": "मौजूदा फ़ाइल को अधिलेखित करने की अनुमति नहीं है",
-       "api-error-stashfailed": "आंतरिक त्रुटि: सर्वर अस्थाई फ़ाइल को संग्रहीत करने में विफल।",
        "api-error-publishfailed": "आंतरिक त्रुटि: सर्वर अस्थाई फ़ाइल को प्रकासन करने में विफल।",
-       "api-error-stasherror": "फ़ाइल को स्टैश पर अपलोड करने के दौरान एक त्रुटि देखी गई है।",
-       "api-error-stashedfilenotfound": "स्टैश में डाली गई फ़ाइल वहाँ से अपलोड करने के प्रयास के दौरान नहीं मिली।",
-       "api-error-stashpathinvalid": "वह स्थान जहाँ स्टैश वाली फ़ाइल मिलना चाहिए था अवैध है।",
-       "api-error-stashfilestorage": "फ़ाइल को स्टैश में अपलोड करने के दौरान एक त्रुटि देखी गई है।",
-       "api-error-stashzerolength": "सरवर उस फ़ाइल को स्टैश नहीं कर सका, क्योंकि उसकी लम्बाई शून्य है।",
-       "api-error-stashnotloggedin": "आपको लॉग्ड इन होना चाहिए ताकि फ़ाइल को अपलोड स्टैश में सुरक्षित किया जा सके।",
-       "api-error-stashwrongowner": "स्टैश की जिस फ़ाइल तक आप पहुँचना चाहते हैं वह आपसे सम्बंधित नहीं है।",
-       "api-error-stashnosuchfilekey": "फ़ाइल की चाबी जिसे आप स्टैश में प्रयोग में लाने का प्रयास कर रहे थे, मौजूद नहीं है।",
-       "api-error-timeout": "सर्वर ने अपेक्षित समय के भीतर जवाब नहीं दिया",
-       "api-error-unclassified": "एक अज्ञात त्रुटि उत्पन्न हुई",
-       "api-error-unknown-code": "अज्ञात त्रुटि: \" $1 \"",
-       "api-error-unknown-error": "आंतरिक त्रुटि: आपकी फ़ाइल अपलोड करने का प्रयास करते समय कुछ गलत हो गया था।",
+       "api-error-stashfailed": "आंतरिक त्रुटि: सर्वर अस्थाई फ़ाइल को संग्रहीत करने में विफल।",
        "api-error-unknown-warning": "अज्ञात चेतावनी: $1",
        "api-error-unknownerror": "अज्ञात त्रुटि: \" $1 \"",
-       "api-error-uploaddisabled": "इस विकि पर अपलोड अक्षम है.",
-       "api-error-verification-error": "यह फ़ाइल दूषित हो सकती है, या गलत एक्सटेंशन है।",
-       "api-error-was-deleted": "इस नाम का फ़ाइल पहले अपलोड हुआ था और हट भी गया था।",
        "duration-seconds": "$1 {{PLURAL:$1|सॅकेंड}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनट}}",
        "duration-hours": "$1 {{PLURAL:$1|घंटा|घंटे}}",
        "special-characters-title-minus": "ऋण चिह्न",
        "mw-widgets-dateinput-no-date": "कुछ चयनित नहीं",
        "mw-widgets-dateinput-placeholder-day": "DD-MM-YYYY",
+       "mw-widgets-mediasearch-noresults": "कोई परिणाम नहीं मिला",
        "mw-widgets-titleinput-description-new-page": "पृष्ठ अभी मौजूद नहीं है",
        "mw-widgets-titleinput-description-redirect": "$1 को अनुप्रेषित",
+       "mw-widgets-categoryselector-add-category-placeholder": "श्रेणी जोड़ें...",
        "sessionmanager-tie": "एक साथ कई अनुरोध को नहीं मिला सकता: $1",
        "sessionprovider-generic": "$1 सत्र",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "कुकी-आधारित सत्र",
        "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-newusers-create": "अज्ञात सदस्य द्वारा निर्मित",
        "log-action-filter-newusers-create2": "पंजीकृत सदस्य द्वारा निर्मित",
        "log-action-filter-newusers-autocreate": "स्वतः निर्मित",
        "log-action-filter-newusers-byemail": "पासवर्ड ईमेल द्वारा भेजा गया के साथ निर्मित",
-       "log-action-filter-patrol-patrol": "à¤\85पनà¥\87 à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषण",
+       "log-action-filter-patrol-patrol": "सदसà¥\8dय à¤¦à¥\8dवारा à¤ªà¤°à¥\80à¤\95à¥\8dषित",
        "log-action-filter-patrol-autopatrol": "स्वतः पुनरीक्षण",
        "log-action-filter-protect-protect": "सुरक्षा",
        "log-action-filter-protect-modify": "सुरक्षा परिवर्तन",
        "authprovider-confirmlink-success-line": "$1 : सफलतापूर्वक जुड़ा।",
        "authprovider-confirmlink-failed": "खाता जोड़ने का काम पूरी तरह से नहीं हो पाया : $1",
        "authprovider-resetpass-skip-label": "छोड़ें",
+       "authprovider-resetpass-skip-help": "पासवर्ड को रीसेट करना छोड़ें।",
        "authform-newtoken": "टोकन लापता है $1",
        "authform-notoken": "टोकन लापता है",
        "authform-wrongtoken": "गलत टोकन",
        "linkaccounts-success-text": "खाता जुड़ गया।",
        "linkaccounts-submit": "खाता जोड़ें",
        "unlinkaccounts": "खाता अलग करें",
-       "unlinkaccounts-success": "खाता अलग हो गया।"
+       "unlinkaccounts-success": "खाता अलग हो गया।",
+       "restrictionsfield-badip": "अमान्य आईपी पते या सीमा: $1",
+       "restrictionsfield-label": "अनुमत आईपी सीमा:",
+       "revid": "अवतरण $1",
+       "pageid": "पेज आईडी"
 }
index f694e21..12ea679 100644 (file)
@@ -16,7 +16,8 @@
                        "Macofe",
                        "Matma Rex",
                        "V6rg",
-                       "C.R."
+                       "C.R.",
+                       "Smcnarayan"
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
@@ -34,6 +35,7 @@
        "tog-watchdefault": "Ham se badla gais panna aur file ke hamaar dhyaan suchi me jorro",
        "tog-watchmoves": "Uu panna aur file jiske naam ham badla hai ke hamaar dhyaan suchi me jorro",
        "tog-watchdeletion": "Uu panna, aur file jiske ham mitaya hai ke hamaar dhyaan suchi me jorro",
+       "tog-watchuploads": "Nawaa upload karaa gais file ke hamaar dhyaan suchi me jorro",
        "tog-watchrollback": "Uu panna ke jorro jisme ham aapan watchlist me rollback karaa hae",
        "tog-minordefault": "Mamuli badlao ke apne se nishaan lagao",
        "tog-previewontop": "Badlao waala dabba se pahile ek jhalak dekhao",
        "october-date": "October $1",
        "november-date": "November $1",
        "december-date": "December $1",
+       "period-am": "sabere",
+       "period-pm": "sanjhaa",
        "pagecategories": "{{PLURAL:$1|Vibhag|Vibhag}}",
        "category_header": "\"$1\" vibhag ke panna",
        "subcategories": "Vibhag ke bhitar vibhag",
        "tagline": "{{SITENAME}} se",
        "help": "Madat karo",
        "search": "Khojo",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Heading, jispe dhyaan nai dewaa jaai.\n# Isme badlao uu time hoi jaise panna ke heading ke index karaa jaai ki.\n# Aap null edit kar ke panna ke reindexing ke force kare saktaa hai.\n# Iske syntax aise hai:\n#   * Sab chij \"#\" character se lae ke line ke ant talak, comment hai.\n#   * Sab non-blank line is the exact title to ignore, case and everything.\nReferences\nBahaari jorr\nAur dekho\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "Khojo",
        "go": "Jao",
        "searcharticle": "Jaao",
        "history": "Panna ke itihaas",
        "history_short": "Itihaas",
+       "history_small": "itihaas",
        "updatedmarker": "hamaar pahile waala visit ke baad badla gais hai",
        "printableversion": "Chhape ke khaatir",
        "permalink": "Pakka jorr",
        "talk": "Salah",
        "views": "Bichar",
        "toolbox": "Aujaar ke dabba",
+       "tool-link-userrights": "Badlo {{GENDER:$1|sadasya}} groups",
+       "tool-link-userrights-readonly": "Dekho {{GENDER:$1|sadasya}} groups",
+       "tool-link-emailuser": "Email karo ii {{GENDER:$1|sadasya}}",
        "userpage": "Sadasya ke panna dekho",
        "projectpage": "Project waala panna dekho",
        "imagepage": "File panna ke dekho",
        "protectedinterface": "Ii panna, ii wiki ke khatir, software ke interface text dewe hai, aur iske barbaadi se roke ke khatir band kar dewa gais hai.\nSab wiki me anuwaad ke jorre nai to badle ke khatir, meharbaani kar ke [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project ke kaam me laao.",
        "editinginterface": "'''Chetawani:''' Aap ek panna ke badaltaa hai jon ki software ke interface text dewe hae.\nIi panna me badlao ke asar duusra sadasya ke interface pe bhi hoi.",
        "translateinterface": "Sab wiki me translate kare ke khatir [https://translatewiki.net/translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
-       "cascadeprotected": "Ii panna ke badlao se bachawa gais hai, kaheki iske {{PLURAL:$1|panna, jon ki|panna, jon ki}} surakchhit hae \"cascading\" option turned on ke saathe me rakkhaa gais hai:\n$2",
+       "cascadeprotected": "Ii panna ke badlao se bachawa gais hai, kaheki iske {{PLURAL:$1|panna, jon ki}} surakchhit hae \"cascading\" option turned on ke saathe me rakkhaa gais hai:\n$2",
        "namespaceprotected": "Aap ke paas '''$1''' namespace me panna ke badle ke adhikar nai hai.",
        "customcssprotected": "Aap ke ii CSS panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.",
        "customjsprotected": "Aap ke ii JavaScript panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.",
        "virus-scanfailed": "scan fail hoe gais (code $1)",
        "virus-unknownscanner": "jaana waala antivirus nai hai:",
        "logouttext": "'''Aap abhi logged out hai.'''\n\nYaad rakhna ki kuch panna wahi rakam se dekhai jaise ki aap log in bhaya hai, jab talak ki browser ke cache safaa nai hoe jaae.",
+       "cannotlogoutnow-title": "Abhi log out nai kare saktaa hai",
+       "cannotlogoutnow-text": "$1 ke kaam me laae ke time, loggong out nai hoe sake hai",
        "welcomeuser": "Swagat, $1!",
        "welcomecreation-msg": "Aap ke account banae dewa gais hai.\nAapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.",
        "yourname": "Username:",
        "createacct-yourpasswordagain-ph": "Hame lagged in rahan do",
        "userlogin-remembermypassword": "Secure connection ke kaam me lao",
        "userlogin-signwithsecure": "Secure connection ke kaam me lao",
+       "cannotlogin-title": "Log in nai kare saktaa hai",
+       "cannotlogin-text": "Logging in possible nai hai",
+       "cannotloginnow-title": "Abhi log in nai kare saktaa hai",
+       "cannotloginnow-text": "$1 ke kaam me laae ke time logging in possible nai hai.",
+       "cannotcreateaccount-title": "Account nai banae saktaa hai",
+       "cannotcreateaccount-text": "Ii wiki me direct account creation enabled nai hai.",
        "yourdomainname": "Aap ke domain:",
        "password-change-forbidden": "Aap ii wiki me password nai badle saktaa hae.",
        "externaldberror": "Koi bahaari database authentication error hai, nai to aap ke bahaari account badle ke adhikar nai hai.",
        "login": "Log in karo",
+       "login-security": "Aapan account ke verify karo",
        "nav-login-createaccount": "Log in karo/ nawaa account banao",
        "userlogin": "Log in karo/ nawaa account banao",
        "userloginnocreate": "Log in karo",
        "userlogin-resetpassword-link": "Aapan password ke bhool gayaa?",
        "userlogin-helplink2": "Log in kare ke khatir madat.",
        "userlogin-loggedin": "Aap {{GENDER:$1|$1}} ke naam ke niche login bhayaa hae.\nNiche ke form ke kaam me laae ke duusra naam ke niche login ho.",
+       "userlogin-reauth": "Aap ke fir se log in kare ke parri, ii verify kare ke khaatir, ki aap {{GENDER:$1|$1}} hai.",
        "userlogin-createanother": "Duusra account banao",
        "createacct-emailrequired": "Email address",
        "createacct-emailoptional": "Email address (jaruri nai hae)",
        "createacct-email-ph": "Aapan mail address ke likho",
        "createacct-another-email-ph": "Email address ke likho",
        "createaccountmail": "Ek temporary password ke kaam me laao aur iske batawa gais Email pe bhej do",
+       "createaccountmail-help": "Binaa password ke jaane iske duusra jan ke khaatir account banae me use karaa jaae sake hai.",
        "createacct-realname": "Aslii naam (jaruri nai hae)",
        "createaccountreason": "Kaaran:",
        "createacct-reason": "Kaaran",
        "createacct-reason-ph": "Aap ke ii account ke banae ke kaaran",
+       "createacct-reason-help": "Ii sandes ke account creation log me dekhaawa jaae hai",
        "createacct-submit": "Aapan account banao",
        "createacct-another-submit": "Account banao",
+       "createacct-continue-submit": "Account banaate raho",
+       "createacct-another-continue-submit": "Account banaate raho",
        "createacct-benefit-heading": "Aap ke rakam log {{SITENAME}} ke banain hae.",
        "createacct-benefit-body1": "{{PLURAL:$1|badlao}}",
        "createacct-benefit-body2": "{{PLURAL:$1|panna}}",
        "nocookiesnew": "Aap ke account banae dewa gais hae lekin aap logged in nai hae.\n{{SITENAME}} me sadasya ke login khatir cookies hae.\nAap cookies ke rok diya hae.\nCookies ke enable kar ke, aapan nawaa username aur password se login karo.",
        "nocookieslogin": "{{SITENAME}} me sadasya ke login khatir cookies hae.\nAap cookies ke disabled karaa hae.\nCookies ke enable kar ke fir se kosis karo.",
        "nocookiesfornew": "Sadasya ke account ke nai banawa gais hae, kaahe ki source ke confirm nai karaa jaae sakis hae.\nCookies ke enable kar ke, ii panna ke fir se load karo aur fir se kosis karo.",
+       "createacct-loginerror": "Ii account ke banae dewa gais hai, lekin aap ke automatically login nai karaa jaae sakis hai. Meharbaani kar ke  [[Special:UserLogin|manual login]] me jaao.",
        "noname": "Aap achchha user name ke nai specify karaa hai.",
        "loginsuccesstitle": "Login safal bhais",
        "loginsuccess": "'''Aap \"$1\" ke naam pe {{SITENAME}} me logged in hai.'''",
        "eauthentsent": "Ek confirmation e-mail aap ke dewa gae e-mail address pe bhej dewa gais hai. Aur mail ii account pe bheje se pahile e-mail me likha instructions ke follow karo, ii confirm kare ke khatir ki account aap ke hai.",
        "throttled-mailpassword": "Ek password reset Email ke pahile bheja gais hae, pichhle  {{PLURAL:$1|ghanta|$1 ghanta}} me bhej me.\nAbuse ke roke ke khatir, khali ek password reminer har {{PLURAL:$1|ghanta|$1 ghanta}} me bheja jaai.",
        "mailerror": "Mail bheje me galti hoe gais hai: $1",
-       "acct_creation_throttle_hit": "Ii wiki me visitors log aap ke IP address ke use kar ke {{PLURAL:$1|1 account|$1 accounts}}, pichhle kuch din me, banae liin hai, jis se jaada ii time nai banawa jaae sake hai.\nIi kaaran se visitors log jon ki ii IP address use kare hai, ke aur account banae ke ijajat nai hai.",
+       "acct_creation_throttle_hit": "Ii wiki me visitors log aap ke IP address ke use kar ke {{PLURAL:$1|1 account|$1 accounts}}, pichhle $2 din me, banae liin hai, jis se jaada ii time nai banawa jaae sake hai.\nIi kaaran se visitors log jon ki ii IP address use kare hai, ke aur account banae ke ijajat nai hai.",
        "emailauthenticated": "Aap ke e-mail address ke $2 ke roj aur $3 baje confirm karaa gais rahaa.",
        "emailnotauthenticated": "Aap ke e-mail address ke abi tak authenticate nai karaagais hai.\nIi sab feature khatir koi e-mail nai bheja jaai.",
        "noemailprefs": "Ii sab feature ke kaam kare khatir e-mail specify karo.",
        "createacct-another-realname-tip": "Aslii naam ke jaruri nai hae.\nAgar aap iske diya hae tab iske aapke kaam ke attribute kare ke khatir kaam me lawa jaai.",
        "pt-login": "Log in karo",
        "pt-login-button": "Log in karo",
+       "pt-login-continue-button": "Login karte raho",
        "pt-createaccount": "Nawaa account banao",
        "pt-userlogout": "Log out ho",
        "php-mail-error-unknown": "PHP ke mail() function me koi anjaan kharaabi hae",
        "newpassword": "Nawaa password:",
        "retypenew": "Password fir se type karo:",
        "resetpass_submit": "Password ke set kar ke login karo",
-       "changepassword-success": "Aap ke password ke safalta se badal dewa gais hai!",
+       "changepassword-success": "Aap ke password ke badal dewa gais hai!",
        "changepassword-throttled": "Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hae.\n$1 talak wait kar ke fir se try karo.",
+       "botpasswords": "Bot passwords",
+       "botpasswords-summary": "<em>Bot passwords</em> sadasya ke account ke access API se dewe hai, bina account ke main login credentials ke use kare. Bot password se login kare se bahut restricted rights mile hai. \n\nAgar aap ii nai janta hai ki kaahe aap ii chij kaahe kartaa hai, tab aap ke saait ii chij nai kare ke chaahi. Koi jane ke ii nai maange ke chaahi ki aap aapan bot credentials ke generate kar ke uske de.",
+       "botpasswords-disabled": "Bot passwords ke disable kar dewa gais hai.",
+       "botpasswords-no-central-id": "Bot password use kare ke khaatir, aap ke ek centralized account me logged in hoe ke chaahi.",
+       "botpasswords-existing": "Abhi ke bot passwords",
+       "botpasswords-createnew": "Nawaa bot password banao",
+       "botpasswords-editexisting": "Ek bot password ke badlo",
+       "botpasswords-label-appid": "Bot ke naam:",
+       "botpasswords-label-create": "Banao",
+       "botpasswords-label-update": "Update karo",
+       "botpasswords-label-cancel": "Cancel karo",
+       "botpasswords-label-delete": "Mitao",
+       "botpasswords-label-resetpassword": "Password ke badlo",
+       "botpasswords-label-grants": "Applicable grants:",
+       "botpasswords-help-grants": "Agar aap ke lage abhi koi rights hai, tab grants aap ke iske access de hai.\nHian pe grant ke enable kare se aap ke uu right nai mile hai jon ki aap ke waise nai milat rahaa.\nAur jaaan kari ke khatir [[Special:ListGrants|table of grants]] ke dekho.",
+       "botpasswords-label-grants-column": "Ijaajat hai",
+       "botpasswords-bad-appid": "Bot ke naam \"$1\" valid nai hai",
+       "botpasswords-insert-failed": "Bot ke naam \"$1\"nai jorre sakaa. Ka iske pahile jorraa gais rahaa?",
+       "botpasswords-update-failed": "Bot ke naam \"$1\" nai badle sakaa. Ka iske pahile mitaawa gais rahaa?",
+       "botpasswords-created-title": "Bot password ke banae dewa gais hai",
+       "botpasswords-created-body": "User \"$2\" ke khaatir, bot jiske naam \"$1\" hai, ke password ke mitaae dewa gais hai.",
+       "botpasswords-updated-title": "Bot password ke mitae dewa gais hai",
+       "botpasswords-updated-body": "User \"$2\" ke khaatir, jiske bot naam \"$1\" hai, ke password ke badal dewa gais hai.",
+       "botpasswords-deleted-title": "Bot ke password ke mitae dewa gais hai",
+       "botpasswords-deleted-body": "User \"$2\" ke khaatir, bot jiske naam \"$1\" hai, ke password ke mitaae dewa gais hai.",
+       "botpasswords-newpassword": "Log in kare ke khatir nawaa password <strong>$1</strong> <strong>$2</strong> hai. <em>Iske aage kaam me laae ke khaatir likh lo.</em> <br> (For old bots which require the login name to be the same as the eventual username, you can also use <strong>$3</strong> as username and <strong>$4</strong> as password.)",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider abhi available nai hai.",
+       "botpasswords-restriction-failed": "Bot password restrictions ii login ke roke hai.",
+       "botpasswords-invalid-name": "Jon username ke dewa gais hai, me bot password separator (\"$1\") nai hai.",
+       "botpasswords-not-exist": "Sadasya \"$1\" ke lage bot password \"$2\" nai hai.",
        "resetpass_forbidden": "Password nai badlaa jaae sake hai",
+       "resetpass_forbidden-reason": "Password nai badlaa jaae sake hai: $1",
        "resetpass-no-info": "Ii panna ke sidha access kare ke khatir aap ke logged in rahe ke parri.",
        "resetpass-submit-loggedin": "Password ke badlo",
        "resetpass-submit-cancel": "Nai karo",
-       "resetpass-wrong-oldpass": "Temporary nai to abhi ke password valid nai hai.\nSait aap password ke safalta se badal sia hoga nai to nawaa temporary password ke maang karaa hoga.",
+       "resetpass-wrong-oldpass": "Temporary, nai to abhi ke password, valid nai hai.\nSait aap password ke badal dia hoga, nai to, nawaa temporary password ke maang karaa hoga.",
        "resetpass-recycled": "Meharbaani kar ke aap aapan password ke badal ke duusra password banao.",
        "resetpass-temp-emailed": "Aap ke temporary code, jiske emai karaa gais rahaa, se login bhayaa hae.\nLogin khatam kare ke khatir aap ke nawaa password banae ke chaahi.",
        "resetpass-temp-password": "Kachcha password:",
        "passwordreset-emaildisabled": "Ii wiki me email ke band kar dewa gais hae.",
        "passwordreset-username": "Sadasya ke naam:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Banawa gais e-mail ke dekho",
-       "passwordreset-capture-help": "Agar aap ii box ke tick karaa, tab e-mail (aur uske saathe temporary password)  ke aap ke ii rakam se dekhawa jaai jaise ki iske sadasya ke lage bhej dewa gais hae.",
        "passwordreset-email": "E-mail ke address",
        "passwordreset-emailtitle": "{{SITENAME}} me account ke jaankari",
        "passwordreset-emailtext-ip": "Koi (hoe sake aap, IP address $1 se) {{SITENAME}} ($4) pe aap ke account ke baare me jaankari maanga hae. Niche likha gias sadasya ii e-mail se associated hae.  {{PLURAL:$3|account hae|accounts hae}}\n\n$2\n\n{{PLURAL:$3|Ii temporary password|Ii sab temporary passwords}}  {{PLURAL:$5|ek din|$5 din}} me khalaas hoi.\nAap ke chaahi ki aap login kar ke ek nawaa password banao.  Agar aur koi ii request karis hae, nai to agae aap aapan purana paasword ke yaad kar liya hae, tab ii sandes ke baare me bhuul jaao aur purana password use karte raho.",
        "passwordreset-emailelement": "Sadasya ke naam: \n$1\n\nKuchh din ke khatir password: \n$2",
        "passwordreset-emailsentemail": "Agar ii email aap ke account se associated hai tab ek password reset email ke bheja jaai.",
        "passwordreset-emailsentusername": "Agar ii email aap ke username se associated hai tab ek password reset email ke bheja jaai.",
+       "passwordreset-nocaller": "A caller must be provided",
+       "passwordreset-nosuchcaller": "Caller exist nai hoe hai: $1",
+       "passwordreset-ignored": "Password reset ke hadle nai karaa gais hai. Saait koi provider ke nai configure karaa gais hoi?",
+       "passwordreset-invalidemail": "Email address invalid hai",
+       "passwordreset-nodata": "Na username, na email address ke dewa gais rahaa",
        "changeemail": "E-mail address ke badlo, nai to, hatao",
        "changeemail-header": "Aapan email ke badle ke khatir ii form ke bharo. Agar aap koi email ke aapan account se nai associate kare mangtaa hai tab form ke submit kare ke time email address ke blank chhorr do.",
        "changeemail-no-info": "Ii panna ke sidha dekhe ke khaatir, aap ke login kare ke parri.",
        "minoredit": "Ii chhota badlao hai",
        "watchthis": "Ii panna pe dhyaan rakkho",
        "savearticle": "Panna ke bachao",
+       "savechanges": "Badlao ke bachao",
+       "publishpage": "Panna ke publish karo",
+       "publishchanges": "Badlao ke publish karo",
        "preview": "Jhalak dekhao",
        "showpreview": "Preview dekhao",
        "showdiff": "Badlao dekhao",
        "blockedtitle": "Sadasya ke rok dewa gais hai",
        "blockedtext": "'''Aapke user name nai to IP address ke rok dewa gae hai.'''\n\nRoke waala hai $1.\nIske kaaran hai ''$2''.\n\n* Roke ke suruu: $8\n* Roke kab khatam hoi: $6\n* Kiske rokaa jae hai: $7\n\nAap $1 ke mile saktaa hai nai to duusra [[{{MediaWiki:Grouppage-sysop}}|administrator]] se rukawat ke baare me baat karo.\nAap ii sadasya ke 'email this user' feature ke kaam me lae ke baat nai kare saktaa hai jab tak ki ek kanuni email address aapke [[Special:Preferences|account preferences]] me nai hai aur aap ke iske kaam me laae ke roka nai gae hai.\nAap ke abhi ke IP address $3 hai, aur roka gae ID hai #$5.\nMeharbani kar ke chahe ek nai to duno ke aapan sawaal me rakho.",
        "autoblockedtext": "Aap ke IP address ke apne se rok dewa gais hai kahe ki koi duusra sadasya iske kaam me kawat rahaa, jiske $1 rokis hai.\n\nIske khatir kaaran hai:\n:''$2''\n\n* Roke ke suruu: $8\n* Roke kab khatam hoi: $6\n*Roke waala: $7\n\nAap $1 ke mile saktaa hai nai to duusra [[{{MediaWiki:Grouppage-sysop}}|administrator]] se rukawat ke baare me baat karo.\n\nAap ii sadasya ke 'email this user' feature ke kaam me lae ke baat nai kare saktaa hai jab tak ki ek kanuni email address aapke [[Special:Preferences|account preferences]] me nai hai aur aap ke iske kaam me laae ke roka nai gae hai.\n\nAap ke abhi ke IP address $3 hai, aur roka gae ID hai #$5.\nMeharbani kar ke chahe ek nai to duno ke aapan sawaal me rakho.",
+       "systemblockedtext": "Aaap ke username nai to IP address ke Mediawiki automatically block kar diis hai.\n\nDewa gais kaaran hai :\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYour current IP address is $3.\nPlease include all above details in any queries you make.",
        "blockednoreason": "koi kaaran nai dewa gais hai",
        "whitelistedittext": "Aap ke panna badle khatir $1 kare ke parri.",
        "confirmedittext": "Panna ke badle se pahile aap ke aapan e-mail ke confirm kare ke parri.\nMeharbani kar ke aap aapan e-mail ke aapan [[Special:Preferences|user preferences]] se validate karna.",
        "accmailtext": "Ek randomly banawal password ke [[User talk:$1|$1]] ke khatir $2 ke lage bhaja gais hai.\nIi nawa account ke password ke ''[[Special:ChangePassword|change password]]''  panna pe badla jaae sake hai jab aap login karta hai.",
        "newarticle": "(Nawaa)",
        "newarticletext": "Aap ek panna ke jorr ke follow kara hae jon ki abhi nai hae.\nIi panna banae khatir, niche box me type karo (see the [$1 help page] for more info).\nAgar jo aap hian par galti se aae hai tab aapan browser ke '''back''' button pe click karo.",
-       "anontalkpagetext": "----''Ii salah kare waala panna uu anonymous sadasya ke baare me jon abhi account nai banais hai, nai to account ke kaam me nai lawe hai.\nIi kaaran se ham log ke IP address kaam me lae ke ii sadasya ke jaana jae hai.\n\nIi rakam ke IP address ke dher sadasya kaam me lae sake hai.\nAgar aap ek anonymous user hai aur ii sochta hai ki bekar baat aap ke baare me karaa gais hai, tab\n[[Special:CreateAccount|create an account]] or [[Special:UserLogin|log in]] aage ke garrbarri roke khatir aur duusra anonymous users se mistake nai kare ke khatir .''",
+       "anontalkpagetext": "----\n<em>Ii salah kare waala panna uu anonymous sadasya ke baare me jon abhi account nai banais hai, nai to, account ke kaam me nai lawe hai.</em>\nIi kaaran se ham log ke IP address ke kaam me lae ke ii sadasya ke jaana jae hai.\n\nIi rakam ke IP address ke dher sadasya kaam me lae sake hai.\nAgar aap ek anonymous user hai aur ii sochta hai ki bekaar baat aap ke baare me karaa gais hai, tab\n[[Special:CreateAccount|create an account]] nai to [[Special:UserLogin|log in]] aage ke garrbarri roke khatir aur duusra anonymous users se mistake nai kare ke khatir .''",
        "noarticletext": "Abhi ii panna me kuchh likhaa nai hai.\nAap saktaa hai [[Special:Search/{{PAGENAME}}|ii panna ke title khoje]] duusra panna me,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nnai to [{{fullurl:{{FULLPAGENAME}}|action=edit}} ii panna ke badlo]</span>.",
        "noarticletext-nopermission": "Abhi ii panna me koi chij likha nai hae.\nAap sakta hae [[Special:Search/{{PAGENAME}}|ii panna ke title ke khoje]] duusra panna me,\nnai to <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, lekin aap ke ii panna ke banae ke ijaaja tnai hae.",
        "missing-revision": "Panna \"{{FULLPAGENAME}}\" me #$1 badlao nai hae.\nIske kaaran ii hoe sake hae ki ek mitawa gais panna se link karaa jaawe hae.\nIske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] me paawa jaae sake hae.",
        "userpage-userdoesnotexist": "User account \"<nowiki>$1</nowiki>\" abi registered nai hai.\nCheck karo ki Ii panna ke aap banae/badle mangta hai.",
        "userpage-userdoesnotexist-view": "User account \"$1\" abhi register nai karaa gais hae",
        "blocked-notice-logextract": "Ii sadasya ke abhi rok dewa gais hae.\nSab se nawaa block log entry, aap ke reference ke khatir,  niche dewa gais hae:",
-       "clearyourcache": "'''Note:''' - Save kare ke baad, aap ke sait browser ke cache ke bypass kare ke parri badlao ke dekhe khatir.\n* '''Firefox / Safari:''' me ''Shift'' ke dabae ke ''Reload,'' pe click karo, nai to chaahe ''Ctrl-F5'' nai to ''Ctrl-R'' (''⌘-R''  Mac pe)\n* '''Google Chrome:''' me ''Ctrl-Shift-R'' dabao (''⌘-Shift-R'' Mac pe)\n*  '''Internet Explorer:''' me ''Ctrl'' dabae ke  ''Refresh'' pe click karo, nai to  ''Ctrl-F5'' dabao",
+       "clearyourcache": "<strong>Note:</strong> - Save kare ke baad, aap ke sait browser ke cache ke bypass kare ke parri badlao ke dekhe khatir.\n* <strong>Firefox / Safari:</strong> me <em>Shift</em> ke dabae ke <em>Reload</em/>, pe click karo, nai to chaahe <em>Ctrl-F5</em> nai to <em>Ctrl-R</em> (<em>⌘-R</em>  Mac pe)\n* <strong>Google Chrome:</strong> me <em>Ctrl-Shift-R</em> dabao (<em>⌘-Shift-R</em> Mac pe)\n*  <strong>Internet Explorer:</strong> me <em>Ctrl</em> dabae ke  <em>Refresh</em> pe click karo, nai to  <em>Ctrl-F5</em> dabao\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Salah:''' Bachae se pahile \"{{int:showpreview}}\"  button ke kaam me laae ke aapan nawaa CSS ke test karo.",
        "userjsyoucanpreview": "'''Salah:''' Bachae se pahile  \"{{int:showpreview}}\"  button ke kaam me laae ke aapan nawaa JavaScript ke test karo.",
        "usercsspreview": "'''Yaad rakhna ki aap khali aapan CSS ke jhalak dekhta hai.\nIske abhi save nai karaa gais hai!'''",
        "previewnote": "'''Ii khaali ek jhalak dekhae hai'''\nTumar badlao abhi bachawa nai gais hai!",
        "continue-editing": "Badle waala jagha jaao",
        "previewconflict": "Ii preview uu text dekhae hai jon ki uppar ke text editing area me dekhai agar aap iske save karaa.",
-       "session_fail_preview": "''' Maaf karna! Ham log aap ke badlao ke process nai kare paya hai due to a loss of session data.\nFir se kosis karna.\nAgar ii fir bhi nai chale tab kosis karna [[Special:UserLogout|logging out]]aur fir logging back in.'''",
-       "session_fail_preview_html": "'''Maaf karna! Ham log aap ke badlao ke process ke process nai kare sakaa kahe ki session data abhi nai dekhae hai.'''\n\n''Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai, preview ke lukae dewa gais hai as a precaution against JavaScript attacks.''\n\n'''Agar ii kanuni badlao hai, tab fir se kosis karna.\nAgar ii fir bhi kaam nai kare, tab [[Special:UserLogout|logging out]] aur logging back in ke kosis karna.'''",
+       "session_fail_preview": "''' Maaf karna! Ham log aap ke badlao ke process nai kare paaya hai due to a loss of session data.\nSaait app ke logout kar dewa gais hai. <strong> Meharbaani kar ii verify karo ki aap logged in hai aur fir se kosis karo.</strong>\nAgar ii fir bhi nai chale tab kosis karna [[Special:UserLogout|logging out]] aur fir logging back in, aur ii check karo ki browser me cookies enabled hai.",
+       "session_fail_preview_html": "Maaf karna! Ham log aap ke badlao ke process nai kare sakaa kahe ki session data abhi nai dekhae hai.\n\n<em>Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai, preview ke lukae dewa gais hai as a precaution against JavaScript attacks.</em>\n\n<strong>Agar ii kanuni badlao hai, tab fir se kosis karna.</strong>\nAgar ii fir bhi kaam nai kare, tab [[Special:UserLogout|logging out]] aur logging back in ke kosis karna, aur ii check karna ki ii site ke khaatir cookies enabled hai.",
        "token_suffix_mismatch": "''' Aap ke badlao ke reject kar dewa gais hai kahe ki aap ke client punctuation charcters ke token edit me mangle kar diis hai.\nIi badlao ke reject kar dewa gais hai to prevent corruption of the page text.\nIi kabhi kabhi hoe hai jab aap ek buggy web-based anonymous proxy service ke use karta hai.'''",
        "edit_form_incomplete": "Edit form ke kuchh hissa server ke lage nai pahunche paais hae; fir se check karo ki aap ke badlao form me hae, aur fir se form ke bhejo.",
        "editing": "$1 badlawa jae hai",
        "readonlywarning": "<strong>Chetauni: Database ke maintenance khatir band kar dewa gais hai, tab abhi aap aapan badlao ke save nai kare paega.</strong>\nAap saait aapan badlao ke ek text file me cut-n-paste kar ke baad me use kare khatir save kar le sakta hai.\nAdministrator jon ki iske lock karis hai ii kaaran diis hai: $1",
        "protectedpagewarning": "'''CHETAUNI: Ii panna ke band kar dewa gais hai jisse ke khaali uu sadasya jiske sysop adhikaar hai iske badle sake hai.'''\nNiche sab se nawaa suchi aap ke dekhe ke khatir dewa gais hae:",
        "semiprotectedpagewarning": "'''Suchna:''' Ii panna ke band kar dewa gais hai jisse ki khali registered sadasya iske badle sake hai.\nNiche sab se nawaa suchi ke aap ke dekhe ke khatir dewa gais hae:",
-       "cascadeprotectedwarning": "<strong>Chetawani:</strong> Ii panna ke band kar dewa gais jiske kaaran khali uu sadasya jiske lage sysop privileges hai iske badle sake hai, kahe ki iske niche likha gais cascade-protected {{PLURAL:$1|panna|panna}} me rakkha gais hai:",
+       "cascadeprotectedwarning": "<strong>Chetawani:</strong> Ii panna ke band kar dewa gais jiske kaaran khaali uu sadasya jiske lage sysop privileges hai iske badle sake hai, kahe ki iske niche likha gais cascade-protected {{PLURAL:$1|panna}} me rakkha gais hai:",
        "titleprotectedwarning": "'''CHETAUNI: Ii panna ke band dewa gais hai jisse ki [[Special:ListGroupRights|specific rights]] ke jarie iske badla jaae sake hai.'''\nAap ke jaankari ke khatir sab se nawaa suchi niche dewa gais hae:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} ke ii panna me kaam me lawa gais hae:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} ii jhalak me kaam me lawa gais hae:",
        "contentmodelediterror": "Aap iske badle nai saktaa hae kaaheki iske content model <code>$1</code> hae, aur ii  abhi ke content model <code>$2</code> ke rakam nai hae.",
        "recreate-moveddeleted-warn": "'''Chetawani: Jon panna ke pahile hatae dewa gais rahaa ke aap fir se banata hai.'''\n\nAap socho ki ii panna ke sampadan aap ke karte rahe ke chaahi ki nai.\nAap ke aaram khatir hatae waala suchi hian pe dewa jaawe hai:",
        "moveddeleted-notice": "Ii panna ke mitae dewa gais hai.\nIi panna ke mitae waala aur hatae waala log aap ke dekhe khatir niche dewa gais hai.",
+       "moveddeleted-notice-recent": "Maaf karna, ii panna ke abhi haali mitae dewa gais rahaa ( pichhle 24 ghantaa me).\nMitae aur hatae ke log panna ke niche, aap ke reference ke khaatir, dewea gais hai.",
        "log-fulllog": "Puura log dekho",
        "edit-hook-aborted": "Badalo ke hook rok diis hai.\nIi koi kaaran nai diis hai.",
        "edit-gone-missing": "Panna ke badle nai sakaa.\nJanae hai ki iske koi mitae dii hai.",
        "invalid-content-data": "Panna me likha gais chij right nai hae",
        "content-not-allowed-here": "Panna [[$2]] me \"$1\" likhe ke ijaajat nai hae",
        "editwarning-warning": "Ii panna ke chhore se jetna changes aap  karaa hae nai save hoi.\nAgar aap logged in hae, tab aap ii chetauni ke \"{{int:prefs-editing}}\"  vibhag me disable kare saktaa hae.",
+       "editpage-invalidcontentmodel-title": "Content model not supported",
+       "editpage-invalidcontentmodel-text": "Content model \"$1\" ke support nai karaa jaawe hai.",
        "editpage-notsupportedcontentformat-title": "Content ke format ke support nai karaa jaawe hae.",
        "editpage-notsupportedcontentformat-text": "Content format $1 ke content model $2 nai support kare hae.",
        "content-model-wikitext": "wikitext",
        "content-model-css": "CSS",
        "content-json-empty-object": "Khaali object",
        "content-json-empty-array": "Khaali array",
+       "deprecated-self-close-category": "Panna, jon ki invalid self-closed HTML tags, ke use kare hai",
+       "deprecated-self-close-category-desc": "Panna me, invalid self-closed HTML tags hai, jaise ki <code>&lt;b/></code> nai to <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
+       "duplicate-args-warning": "<strong>Chetauni:</strong> [[:$1]] is calling [[:$2]] with more than one value for the \"$3\" parameter. Only the last value provided will be used.",
        "duplicate-args-category": "Panna jiske tamplate call me duplicate argument hae",
        "duplicate-args-category-desc": "Panna me template calls hae jisme duplicate arguments hae, jaise ki <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Chetauni''': Ii panna me bahut jaada expensive parser function calls hai.\n\nIske $2 {{PLURAL:$2|call|calls}} se kamti hoe ke chaahi, {{PLURAL:$1|abhi hai $1 call|abhi hai $1 calls}}.",
        "history-feed-description": "Ii panaa ke wiki me badlao ke itihaas",
        "history-feed-item-nocomment": "$1 pe $2",
        "history-feed-empty": "Aap jon panna mangta hai uu abhi tak banaa nai hai.\nSaait iske wiki me se mitae dewa gae hoi, nai to iske naam badal dewa gae hoi.\nTry karo [[Special:Search|wiki me khije ke]] aur nawaa panna ke.",
+       "history-edit-tags": "Edit tags of selected revisions",
        "rev-deleted-comment": "(badlao ke summary ke hatae dewa gais hae)",
        "rev-deleted-user": "(username ke hatae dewa gais hai)",
        "rev-deleted-event": "(log action ke hatae dewa gais hai)",
        "rev-showdeleted": "dekhao",
        "revisiondelete": "Badlao ke mitao/nai mitao",
        "revdelete-nooldid-title": "Target revision jon ki valid nai hai",
-       "revdelete-nooldid-text": "Aap chaahe target revision(s) ke specify nai karaa hai, ii function ke perform kare ke khatir, specified revision haiye nai, nai to aap abhi ke badlao ke lukae ke kosis karta hai.",
+       "revdelete-nooldid-text": "Aap chaahe target revision ke specify nai karaa hai, ii function ke perform kare ke khatir, specified revision haiye nai, nai to aap abhi ke badlao ke lukae ke kosis karta hai.",
        "revdelete-no-file": "Chuna gais file abhi nai banawa gais hai.",
        "revdelete-show-file-confirm": "Ka aap sure hai ki aap file ke mitawa gais revision ke dekhe mangtaa hai \"<nowiki>$1</nowiki>\" $2 se $3 talak?",
        "revdelete-show-file-submit": "Haan",
        "mergehistory-go": "Jorre jaae sake badlao ke dekhao",
        "mergehistory-submit": "Badlao ke jorro",
        "mergehistory-empty": "Koi badlao ke jorraa nai jaae sake hai.",
-       "mergehistory-done": "$1ke $3 {{PLURAL:$3|badlao|badlao}} ke safalta se [[:$2]] me jorr dewa gais hai.",
+       "mergehistory-done": "$1 ke $3 {{PLURAL:$3|badlao}} ke safalta se [[:$2]] me jorr dewaa gais hai.",
        "mergehistory-fail": "Itihaas ke nai jorre paaya hae, meharbaani kar ke panna aur time parameters ke check karo.",
+       "mergehistory-fail-bad-timestamp": "Timestamp valid nai hai.",
+       "mergehistory-fail-invalid-source": "Source panna valid nai hai.",
+       "mergehistory-fail-invalid-dest": "Destination panna valid nai hai.",
+       "mergehistory-fail-no-change": "Itihaas ke merge kare ke time, koi badlao waala panna ke merge nai karaa gais hai. Meharbaani kar ke recheck the page and time parameters.",
+       "mergehistory-fail-permission": "Itihaas ke merge kare ke khaatir sufficient permission nai hai.",
+       "mergehistory-fail-self-merge": "Suruu aur khatam kare waala panna ekke hai.",
+       "mergehistory-fail-timestamps-overlap": "Source revisions overlap or come after destination revisions.",
        "mergehistory-fail-toobig": "History merge nai hoe sake, kaaheki limit of $1 {{PLURAL:$1|revision|revisions}} se jaada move hoe jaai.",
        "mergehistory-no-source": "Source panna $1 nai hai.",
        "mergehistory-no-destination": "Destination panna $1 nai hai.",
        "searchprofile-advanced-tooltip": "Custom namespaces me khojo",
        "search-result-size": "$1 ({{PLURAL:$2|1 sabd|$2 sabd}})",
        "search-result-category-size": " {{PLURAL:$1|1 sadasya|$1 sadasya}} ({{PLURAL:$2|1 chhota vibhag|$2 chhota vibhag}}, {{PLURAL:$3|1 file|$3 files}})",
-       "search-redirect": "(redirect $1)",
+       "search-redirect": "($1 se redirect karo)",
        "search-section": "(section $1)",
        "search-category": "(category $1)",
        "search-file-match": "(file content ke match kare hae)",
        "search-external": "Bahaari khoj",
        "searchdisabled": "{{SITENAME}} me abhi khoje ke anumati nai hai.\nAap tab tak Google se khoje sakta hai.\nYaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.",
        "search-error": "Khoje ke tim ek error hoe gais hae:$1",
+       "search-warning": "A warning has occured while searching: $1",
        "preferences": "Pasand",
        "mypreferences": "Pasand",
        "prefs-edits": "Badlao ke number:",
        "saveprefs": "Save karo",
        "restoreprefs": "Sab default settings ke pahile jaise karo (sab vibhag me)",
        "prefs-editing": "Badaltaa hai",
-       "rows": "Taytay:",
-       "columns": "Column:",
        "searchresultshead": "Khojo",
        "stub-threshold": "Threshold stub link formatting ke khatir ($1):",
        "stub-threshold-sample-link": "namuna",
        "prefs-help-recentchangescount": "Isme hai haali ke badlao, panna ke itihaas aur loga.",
        "prefs-help-watchlist-token2": "Aap ke dhyan suchi ke web feed ke ii secret key hae.\nAur koi agar iske bare me jaane hae aap ke dhyan suchi ke parrhae sake hae, tab iske aur ki ke nai dena.\n[[Special:ResetTokens|Agar aap iske reset kare mangtaa hae tab hian pe click karo]].",
        "savedprefs": "Aap ke pasand ke save kar lewa gais hai.",
-       "savedrights": "{{GENDER:$1|$1}} ke user rights ke bachae lewa gais hai.",
+       "savedrights": "{{GENDER:$1|$1}} ke user group ke bachae lewa gais hai.",
        "timezonelegend": "Time ke zone:",
        "localtime": "Sthaniye samay:",
        "timezoneuseserverdefault": "Wiki default ke kaam me laao ($1)",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Sadasya ke naam}}:",
        "prefs-memberingroups": "{{PLURAL:$1|group|groups}} ke {{GENDER:$2|Member}}:",
+       "group-membership-link-with-expiry": "$1 (until $2)",
        "prefs-registration": "Registration kare ke time:",
        "yourrealname": "Asli naam:",
        "yourlanguage": "Bhasa:",
        "prefswarning-warning": "Aap aapan preferences ke badla hae, jiske abhi talak save nai karaa gae hae.\nAgar aap ii panna ke bina \"$1\" me click kare chhorra, tab aap ke preferences save nai hoi.",
        "prefs-tabs-navigation-hint": "Tip: Aap left aur right arrow key use kar ke tab list me navigate kare saktaa hae.",
        "userrights": "Sadasya ke adhikaar ke chalao",
-       "userrights-lookup-user": "Sadasya ke group ke manage karo",
+       "userrights-lookup-user": "Ek sadasya ke chuno",
        "userrights-user-editname": "Ek Username ke enter karo:",
-       "editusergroup": "User groups ke badlo",
+       "editusergroup": "User groups ke load karo",
        "editinguser": "{{GENDER:$1|Sadasya}} <strong>[[User:$1|$1]]</strong>  ke adhikaar ke badlaa jaawe hae $2",
+       "viewinguserrights": "{{GENDER:$1|Sadasya}} <strong>[[User:$1|$1]]</strong>  ke adhikaar ke dekhaa jaawe hae $2",
        "userrights-editusergroup": "User groupske badlo",
-       "saveusergroups": "User groups ke save karo",
+       "userrights-viewusergroup": "User groups ke dekho",
+       "saveusergroups": "User groups, {{GENDER:$1|user}}, ke save karo",
        "userrights-groupsmember": "Iske member hai:",
        "userrights-groupsmember-auto": "Hian ke bhi member hae:",
        "userrights-groups-help": "Aap jon group me ii sadasya hai ke badle sakta hai:\n* Ek checked box ke matlab hai ki sadasya ii group me hai.\n* Ek unchecked box ke matlab hai ki sadasya ii group me nai hai.\n* Ek * ke matlab hai ki aap group ke jorre ke baad hatae nai sakta hai, nai to hatae ke baad jorre nai sakta hai.",
        "userrights-reason": "Kaaran:",
        "userrights-no-interwiki": "Aap ke duusra wiki me user rights ke badle ke adhikaar nai hai.",
        "userrights-nodatabase": "Database $1 abhi hai nai, nai to local nai hai.",
-       "userrights-nologin": "Sadasya ke user rights de ke khatir, ap ke chaahi ki aap [[Special:UserLogin|log in]] karo ek administrator ke account se.",
-       "userrights-notallowed": "Aap ke lage user rights de aur hatae ke adhikar nai hae.",
        "userrights-changeable-col": "Groups jiske aap badle sakta hai",
        "userrights-unchangeable-col": "Groups jiske aap badle nai sakta hai",
+       "userrights-expiry-current": "$1 khalaas hoe hai",
+       "userrights-expiry-none": "Khalaas nai hoe hai",
+       "userrights-expiry": "Khalas hoe hai:",
+       "userrights-expiry-existing": "Abhi ke khatam hoe waala time: $3, $2",
+       "userrights-expiry-othertime": "Duusra time:",
+       "userrights-expiry-options": "1 din:1 day,1 haptaa:1 week,1 mahina:1 month,3 mahina:3 months,6 mahina:6 months,1 saal:1 year",
+       "userrights-invalid-expiry": "Group ke expiry time \"$1\" invalid hai.",
+       "userrights-expiry-in-past": "Group ke expiry time \"$1\" biit gais hai.",
        "userrights-conflict": "User right me conflict hae! Meharbaani kar ke aapan badlao ke fir se review aur confirm karo.",
-       "userrights-removed-self": "App appan ijaajat ke hatae dia hae. Iske natija ii hoi ki app ii panna ke ab nai access kare sakegaa",
        "group": "Jhund:",
        "group-user": "Sadasya",
        "group-autoconfirmed": "Autoconfirmed sadasya",
        "right-createpage": "Panna banao (jon ki salah kare waala panna nai hai)",
        "right-createtalk": "Salah kare waala panna banao",
        "right-createaccount": "Nawaa sadasya ke account banao",
+       "right-autocreateaccount": "Ek bahaari account se automatically login ho",
        "right-minoredit": "Badlao ke chhota mark karo",
        "right-move": "Panna ke naam badlo",
        "right-move-subpages": "Panna aur uske subpanna ke naam badlo",
        "right-siteadmin": "Database ke band karo aur kholo",
        "right-override-export-depth": "Panna aur jurra panna, 5 ke gahirrai talak, ke export karo",
        "right-sendemail": "Duusra sadasya ke lage e-mail bhejo",
-       "right-passwordreset": "Password ke badle waala e-mail ke dekho",
-       "right-managechangetags": "Database se banao aur mitao [[Special:Tags|tags]]",
+       "right-managechangetags": "Database ke banao aur mitao [[Special:Tags|tags]]",
+       "right-applychangetags": "Aapan badlao ke saathe [[Special:Tags|tags]]  ke apply karo",
+       "right-changetags": "Individual entries aur log entries se arbitrary [[Special:Tags|tags]] ke jorro, nai to, hatao",
+       "right-deletechangetags": "Database se  [[Special:Tags|tags]] ke mitao",
+       "grant-generic": "\"$1\" rights bundle",
+       "grant-group-page-interaction": "Panna se interact karo",
+       "grant-group-file-interaction": "Media se interact karo",
+       "grant-group-watchlist-interaction": "Aapan watchlist se interact karo",
+       "grant-group-email": "Email bhejo",
+       "grant-group-high-volume": "Perform high volume activity",
+       "grant-group-customization": "Customization and preferences",
+       "grant-group-administration": "Perform administrative actions",
+       "grant-group-private-information": "Aaapan baare me private data ke access karo",
+       "grant-group-other": "Miscellaneous activity",
+       "grant-blockusers": "Sadasya ke block aur unblock karo",
+       "grant-createaccount": "Account banao",
+       "grant-createeditmovepage": "Panna ke banao, badlo aur hatao",
+       "grant-delete": "Pages, revisions, aur log entries ke mitao",
+       "grant-editinterface": "MediaWiki namespace aur user CSS/JavaScript ke badlo",
+       "grant-editmycssjs": "EAapan user CSS/JavaScript ke badlo",
+       "grant-editmyoptions": "Aapan user preferences ke badlo",
+       "grant-editmywatchlist": "Aapan dhyan suchi ke badlo",
+       "grant-editpage": "Abhi ke panna ke badlo",
+       "grant-editprotected": "Bachaawa gais panna ke badlo",
+       "grant-highvolume": "High-volume editing",
+       "grant-oversight": "Sadasya ke lukao aur revisions ke suppress karo",
+       "grant-patrol": "Panna me badlao pe pahraa do",
+       "grant-privateinfo": "Gupt jaankari ke access karo",
+       "grant-protect": "Panna ke protect aur unprotect karo",
+       "grant-rollback": "Rollback changes to pages",
+       "grant-sendemail": "Duusra sadasya ke lage e-mail bhejo",
+       "grant-uploadeditmovefile": "Upload, replace, and move files",
+       "grant-uploadfile": "Nawaa file ke upload karo",
+       "grant-basic": "Basic adhikaar",
+       "grant-viewdeleted": "Delete karaa gais file aur panna ke dekho",
+       "grant-viewmywatchlist": "Aapan dhyan suchi ke dekho",
+       "grant-viewrestrictedlogs": "Restricted log entries ke dekho",
        "newuserlogpage": "Sadasya ke banae waala log",
        "newuserlogpagetext": "Ii sadasya ke banae waala log hai.",
        "rightslog": "Sadasya adhikar suchi",
        "rightslogtext": "Ii sadasya ke adhikar ke badlao ke suchi hai.",
        "action-read": "ii panna ke parrho",
        "action-edit": "ii panna ke badlo",
-       "action-createpage": "panna banao",
-       "action-createtalk": "salah waala panna banao",
+       "action-createpage": "Ii panna ke banao",
+       "action-createtalk": "Ii salah waala panna banao",
        "action-createaccount": "ii user account ke banao",
+       "action-autocreateaccount": "Ek bahaari user account ke automatically banao",
        "action-history": "ii panna ke itihass ke dekho",
        "action-minoredit": "ii badlao ke chhota mark karo",
        "action-move": "ii panna ke naam badlo",
        "action-upload_by_url": "ek URL address se ii file ke upload karo",
        "action-writeapi": "Likhe waala API ke use karo",
        "action-delete": "ii panna ke mitao",
-       "action-deleterevision": "ii badlao ke mitao",
-       "action-deletedhistory": "i panna ke mitawa waala itihaas dekho",
+       "action-deleterevision": "Badlao ke mitao",
+       "action-deletelogentry": "Log entries ke mitao",
+       "action-deletedhistory": "ek panna ke mitawa waala itihaas dekho",
+       "action-deletedtext": "Mitaawa gais revision list ke dekho",
        "action-browsearchive": "mitawa gais panna ke khojo",
-       "action-undelete": "ii panna ke fir se pahile jaise karo do",
-       "action-suppressrevision": "ii lukawa gais badlao ke fir se dekh ke pahile jaise karo",
+       "action-undelete": "Panna ke fir se pahile jaise karo do",
+       "action-suppressrevision": "Lukawa gais badlao ke fir se dekh ke pahile jaise karo",
        "action-suppressionlog": "ii private log ke dekho",
        "action-block": "ii sadasya ke panna badle se roko",
        "action-protect": "ii panna ke protection levels ke badlo",
        "action-userrights-interwiki": "duusra wiki ke sadasya ke adhikar ke badlo",
        "action-siteadmin": "database ke band karo nai to kholo",
        "action-sendemail": "E-mail bhejo",
+       "action-editmyoptions": "Aapan preferences ke badlo",
        "action-editmywatchlist": "Aapan dhyan suchi ke badlo",
        "action-viewmywatchlist": "Aapan dhyan suchi ke dekho",
        "action-viewmyprivateinfo": "Aapan private jaankari ke dekho",
        "action-editmyprivateinfo": "Aapan private jaankari ke badlo",
        "action-editcontentmodel": "ek panna ke content model ke badlo",
        "action-managechangetags": "database se tags ke banao aur mitao",
+       "action-applychangetags": "Aapan badlao ke saathe tags ke apply karo",
+       "action-changetags": "Individual revisions aur log entries se arbitary tages jorro aur hatao",
+       "action-deletechangetags": "Database se tags ke mitao",
+       "action-purge": "Ii panna ke purge karo",
        "nchanges": "$1 {{PLURAL:$1|badlao|badlao}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|last time dekhe ke baad}}",
        "enhancedrc-history": "itihaas",
        "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (aur dekho [[Special:NewPages|nawaa panna ke suchi]])",
        "recentchanges-submit": "Dekhao",
+       "rcfilters-activefilters": "Active filters",
+       "rcfilters-restore-default-filters": "Restore default filters",
+       "rcfilters-clear-all-filters": "Sab filter ke clear karo",
+       "rcfilters-search-placeholder": "Filter recent changes (browse or start typing)",
+       "rcfilters-invalid-filter": "Invalid filter",
+       "rcfilters-empty-filter": "No active filters. All contributions are shown.",
+       "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-noresults": "Koi filter nai milaa",
+       "rcfilters-filtergroup-registration": "User registration",
+       "rcfilters-filter-registered-label": "Register kar dewa gais:",
+       "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": "Aapan badlao",
+       "rcfilters-filter-editsbyself-description": "Aap ke karaa gais badlao.",
+       "rcfilters-filter-editsbyother-label": "Duusra jan ke karaa gais badlao",
+       "rcfilters-filter-editsbyother-description": "Badlao jiske duusraa jan karin hai (aap nai)",
+       "rcfilters-filtergroup-userExpLevel": "User experience level (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-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": "Edit, jiske human editors karin hai.",
+       "rcfilters-filtergroup-significance": "Significance",
+       "rcfilters-filter-minor-label": "Chhotaa badlao",
+       "rcfilters-filter-minor-description": "Edits the author labeled as minor.",
+       "rcfilters-filter-major-label": "Non-minor edits",
+       "rcfilters-filter-major-description": "Edits not labeled as minor.",
+       "rcfilters-filtergroup-changetype": "Type of change",
+       "rcfilters-filter-pageedits-label": "Panna ke badlao",
+       "rcfilters-filter-pageedits-description": "Edits to wiki content, discussions, category descriptions....",
+       "rcfilters-filter-newpages-label": "Page creations",
+       "rcfilters-filter-newpages-description": "Edits that make new pages.",
+       "rcfilters-filter-categorization-label": "Category changes",
+       "rcfilters-filter-categorization-description": "Records of pages being added or removed from categories.",
+       "rcfilters-filter-logactions-label": "Logged actions",
+       "rcfilters-filter-logactions-description": "Administrative actions, account creations, page deletions, uploads....",
        "rcnotefrom": "Niche {{PLURAL:$5|badlao hae|badlao hae}} <strong>$3, $4</strong> (<strong>$1</strong> talak dekhawa gais) talak.",
        "rclistfrom": "$3 $2 se suruu kar ke nawaa badlao dekhao",
        "rcshowhideminor": "$1 chhota badlao",
        "rcshowhidemine": "$1 hamaar sampadan",
        "rcshowhidemine-show": "Dekhao",
        "rcshowhidemine-hide": "Lukao",
+       "rcshowhidecategorization": "$1 page categorization",
        "rcshowhidecategorization-show": "Dekhao",
+       "rcshowhidecategorization-hide": "Lukao",
        "rclinks": "Pichhla $1 badlao pichle $2 din me dekhao <br />$3",
        "diff": "farka",
        "hist": "itihaas",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|user|users}} ke dekhta hae]",
-       "rc_categories": "Categories me limit (\"|\" se separate  karo)",
-       "rc_categories_any": "Koi bhi",
+       "rc_categories": "Categories me limit (\"|\" se separate karo)",
+       "rc_categories_any": "Chuna gais me se koi",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} badlao ke baad",
        "newsectionsummary": "/* $1 */ nawaa vibhag",
        "rc-enhanced-expand": "Details dekhao",
        "recentchangeslinked-summary": "Ii panna pahile waala badlao jon panna hian pe jurra hae ke suchi de hae (nai to vises vibhag ke sadasya).\nPanna jon [[Special:Watchlist|aap ke dhyan suchi]] me hae  '''mota''' kara gais hae.",
        "recentchangeslinked-page": "Panna ke naam:",
        "recentchangeslinked-to": "Badalo jon ki given panna se linked hai ke dekhao",
+       "recentchanges-page-added-to-category": "[[:$1]] added to category",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] added to category, [[Special:WhatLinksHere/$1|this page is included within other pages]]",
+       "recentchanges-page-removed-from-category": "[[:$1]] removed from category",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] removed from category, [[Special:WhatLinksHere/$1|this page is included within other pages]]",
+       "autochange-username": "MediaWiki automatic change",
        "upload": "File ke upload karo",
        "uploadbtn": "File upload karo",
        "reuploaddesc": "Upload ke cancel kar ke upload form pe lauto",
        "file-thumbnail-no": "File ke naam <strong>$1</strong> se suruu hoe hai.\nIi janawe hai ki ii chhota size ke chapa hai ''(thumbnail)''.\nAgar jo aap ke lage ii chapa full resolution me hai tab uske upload karna, nai to file ke naam badlo.",
        "fileexists-forbidden": "Ii naam ke file abhi hai, aur iske badlawa nai jaae sake hai.\nAgar jo aap fir bhi aapan file ke upload kare mangta hai, tab pichhe jaae ke nawaa naam use karo. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ii naam ke file abhi shared file repository me hai.\nAgar jo aap fir bhi aapan file upload kare manta hai tab pichhe jaae ke nawaa naam use karo. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Upload karaa gais chij <strong>[[:$1]]</strong> abhi ke version ke ekdam jaise hai.",
+       "fileexists-duplicate-version": "Upload karaa gais chij {{PLURAL:$2|an older version|older versions}} of <strong>[[:$1]]</strong> ke ekdam rakam hai.",
        "file-exists-duplicate": "Ii file following file ke duplicate hai {{PLURAL:$1|file|files}}:",
        "file-deleted-duplicate": "Yahii rakam ke ek aur file ([[:$1]]) ke pahile delete karaa gais hai. Aap ke file ke deletion history ke check kare ke chaahi, upload kare se pahile.",
        "file-deleted-duplicate-notitle": "Ii rakam ke ek file ke pahile delete karaa gais rahaa, aur iske title ke suppress karaa gais hae. Aap ke aisan koi jan, jiske lake suppressed data dekhe ke adhikar har, se situation ke review karae ke baad file ke upload kare ke chaahi.",
        "uploaddisabledtext": "File uploads ke disable kar dewa gais hai.",
        "php-uploaddisabledtext": "File uploads ke PHP me disable kar dewa gais hai. Meharbani kar ke file_uploads setting ke check karo.",
        "uploadscripted": "Ii file me HTML nai to script code hai jiske web browser erroneously interpret kare sake hai.",
-       "uploadscriptednamespace": "Ii SVG file me illegal namespace \"$1\" hae.",
+       "upload-scripted-pi-callback": "File jisme XML-stylesheet processing instruction hai ke upload nai karaa jaae sake hai.",
+       "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
+       "uploaded-hostile-svg": "Found unsafe CSS in the style element of uploaded SVG file.",
+       "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
+       "uploaded-href-attribute-svg": "href attributes in SVG files are only allowed to link to http:// or https:// targets, found <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Found href to unsafe data: URI target <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-animate-svg": "Found \"animate\" tag that might be changing href, using the \"from\" attribute <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-setting-event-handler-svg": "Setting event-handler attributes is blocked, found <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-setting-href-svg": "Using the \"set\" tag to add \"href\" attribute to parent element is blocked.",
+       "uploaded-wrong-setting-svg": "Using the \"set\" tag to add a remote/data/script target to any attribute is blocked. Found <code>&lt;set to=\"$1\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
+       "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
+       "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "uploadscriptednamespace": "Ii SVG file me illegal namespace \"<nowiki>$1</nowiki>\" hae.",
        "uploadinvalidxml": "Upload karaa gais file ke XML ke parse nai karaa jaae sake hae.",
        "uploadvirus": "Ii file me virus hai! Details: $1",
        "uploadjava": "Ii file ek ZIP file hae jisme Java .class ke file hae.\nJava ke uplaod kare ke anumati nai hae, kaaheki isse kuchh security restrictions ke bypass karaa jaae sake hae.",
        "upload-options": "Upload kare ke version",
        "watchthisupload": "Ii panna pe dhyan rakhho",
        "filewasdeleted": "Ii naam ke file ke pahile upload kar ke baad me delete karaa gais hai.\nAap ke chaahi ki aap $1 check kar lo fir se upload kare se pahile.",
+       "filename-thumb-name": "Ii dekhe me thumbnail title ke rakam lage hai. Meharbaani kar ke yahii wiki me fir se thumbnail nai upload karo. Nai to, meharbaani kar ke fix the filename so it is more meaningful, and does not have the thumbnail prefix.",
        "filename-bad-prefix": "Jon file aap upload kartaa hai uske naam '''\"$1\"''' se suruu hoe hai, jon ki non-descriptive naam hai jiske jaada kar ke digital camera automatically assign kare hai.\nMeharbaani kar ke aur jaada descriptive filename chose karo.",
        "upload-proto-error": "Protocol right nai hai",
        "upload-proto-error-text": "Duur ke upload maange hai URLs jon ki suruu hoe hai <code>http://</code> nai to <code>ftp://</code>.",
        "upload-too-many-redirects": "Ii URL me bahut jaada redirects hae.",
        "upload-http-error": "Ek HTTP galti hoe gais hae: $1",
        "upload-copy-upload-invalid-domain": "Ii domain se copy upload nai karaa jaae sake hae.",
+       "upload-foreign-cant-upload": "This wiki is not configured to upload files to the requested foreign file repository.",
+       "upload-foreign-cant-load-config": "Failed to load the configuration for file uploads to the foreign file repository.",
+       "upload-dialog-disabled": "File uploads using this dialog are disabled on this wiki.",
+       "upload-dialog-title": "File ke upload karo",
+       "upload-dialog-button-cancel": "Cancel karo",
+       "upload-dialog-button-back": "Piichhe",
+       "upload-dialog-button-done": "Kar dewa gais hae",
+       "upload-dialog-button-save": "Bachao",
+       "upload-dialog-button-upload": "Upload karo",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Naam",
+       "upload-form-label-infoform-name-tooltip": "File ke khaatir ek unique descriptive title, which will serve as a filename. You may use plain language with spaces. Do not include the file extension.",
+       "upload-form-label-infoform-description": "Baare me",
+       "upload-form-label-infoform-description-tooltip": "Briefly, kaam ke baare mesab chij describe karo.\nFor a photo, mention the main things that are depicted, the occasion, or the place.",
+       "upload-form-label-usage-title": "Usage",
+       "upload-form-label-usage-filename": "File ke naam",
+       "upload-form-label-own-work": "Ii hamaar kaam hai",
+       "upload-form-label-infoform-categories": "Vibhag",
+       "upload-form-label-infoform-date": "Taarik",
+       "upload-form-label-own-work-message-generic-local": "I confirm that I am uploading this file following the terms of service and licensing policies on {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "{{SITENAME}} ke policy ke niche, agar aap file nai upload kare saktaa hai, tab please close this dialog and try another method.",
+       "upload-form-label-not-own-work-local-generic-local": "You may also want to try [[Special:Upload|the default upload page]].",
+       "upload-form-label-own-work-message-generic-foreign": "I understand that I am uploading this file to a shared repository. I confirm that I am doing so following the terms of service and licensing policies there.",
+       "upload-form-label-not-own-work-message-generic-foreign": "If you are not able to upload this file under the policies of the shared repository, please close this dialog and try another method.",
+       "upload-form-label-not-own-work-local-generic-foreign": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if this file can be uploaded there under their policies.",
        "backend-fail-stream": "File $1 ke stream nai kare sakaa hae.",
        "backend-fail-backup": "File $1 ke backuo nai kare sakaa hae.",
        "backend-fail-notexists": "Ii file $1 nai hae.",
        "backend-fail-read": "File $1 ke nai parrhe sakaa hae.",
        "backend-fail-create": "File $1 pe nai likha jaae sake hae.",
        "backend-fail-maxsize": "File $1 ke nai likhe sakaa hae kaahe ki ii {{PLURAL:$2|ek byte|$2 byte}} se barraa hae.",
-       "backend-fail-readonly": "Storage backend \"$1\" abhi khaali read-only hae. Iske kaaran hae: \"$2\"",
+       "backend-fail-readonly": "Storage backend \"$1\" abhi khaali read-only hai. Iske kaaran hai: <em>$2</em>",
        "backend-fail-synced": "File \"$1\" internal storage backends me ek inconsistent state me hae",
        "backend-fail-connect": "Storage backend \"$1\" se connect nai kare sakaa hae.",
        "backend-fail-internal": "Storage backend \"$1\" me ek unknown error hoe gais hae.",
        "uploadstash-badtoken": "Aap uu chij nai kare saktaa hae, saait ii kaaran se ki aap ke ijaajat khalaas hoe gais hae. Fir se kosis karo.",
        "uploadstash-errclear": "File ke hatawa nai jaae sakaa hae.",
        "uploadstash-refresh": "File ke suchi ke fir se dekhao",
+       "uploadstash-thumbnail": "thumbnail ke dekho",
+       "uploadstash-exception": "Could not store upload in the stash ($1): \"$2\".",
        "invalid-chunk-offset": "Kharaab chunk offset",
        "img-auth-accessdenied": "ijajat nai hae",
        "img-auth-nopathinfo": "Aap ke server ke ii jankari de khatir set up nai karaa gais hae\nSaait ii CGI-based hoi aur img_auth ke nai support karat hoi.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization ke dekho.",
        "listfiles-delete": "mitao",
        "listfiles-summary": "Ii khaas panna sab uploaded file ke dekhae hai.",
        "listfiles_search_for": "Media ke naam khojo:",
+       "listfiles-userdoesnotexist": "Sadasya ke account \"$1\" registered nai hai.",
        "imgfile": "file",
        "listfiles": "Chapa ke suchi",
        "listfiles_thumb": "Chhota chapa",
        "filerevert-legend": "File ke pahile jaise karo",
        "filerevert-intro": "Aap '''[[Media:$1|$1]]''' ke [$4 version as of $3, $2] jaise kartaa hai.",
        "filerevert-comment": "Kaaran:",
-       "filerevert-defaultcomment": "Version as of $2, $1 pe revert kar dewa gais hai",
+       "filerevert-defaultcomment": "Version as of $2, $1 ($3) pe revert kar dewa gais hai",
        "filerevert-submit": "Pahile jaise karo",
        "filerevert-success": "'''[[Media:$1|$1]]''' ke [$4 version as of $3, $2] pe revert kar dewa gais hai.",
        "filerevert-badversion": "Dewa gais timestamp ke pahile ke ii file ke koi version nai hai.",
+       "filerevert-identical": "Abhi ke file ke version, chuna gais file ke ekdam rakam hai",
        "filedelete": "$1 ke mitao",
        "filedelete-legend": "File ke mitao",
        "filedelete-intro": "Aap file '''[[Media:$1|$1]]''' ke delete kare waala hai iske itihaas ke saathe.",
        "randomincategory-nopages": "[[:Category:$1|$1]] category me koi panna nai hae.",
        "randomincategory-category": "Vibhag:",
        "randomincategory-legend": "Category me random panna",
+       "randomincategory-submit": "Jaao",
        "randomredirect": "Koi bhi jagha redirect karo",
        "randomredirect-nopages": "Namespace \"$1\" me koi redirects nai hai.",
        "statistics": "Aankrra",
        "uncategorizedcategories": "Uncategorized vibhag",
        "uncategorizedimages": "Bina vibhag me kara gais file",
        "uncategorizedtemplates": "Bina categorise karaa gais template",
+       "uncategorized-categories-exceptionlist": " # Contains a list of catgeories, which shouldn't be mentioned on Special:UncategorizedCategories. One per line, starting with \"*\". Lines starting with another character (including whitespaces) are ignored. Use \"#\" for comments.",
        "unusedcategories": "Bina use bhae category",
        "unusedimages": "Bina use bhae files",
        "wantedcategories": "Maange waala vibhag",
        "wantedpages": "Jaruri panna",
-       "wantedpages-summary": "List of non-existing pages with the most links to them, excluding pages which only have redirects linking to them. For a list of non-existent pages that have redirects linking to them, see [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "List of non-existing pages with the most links to them, excluding pages which only have redirects linking to them. For a list of non-existent pages that have redirects linking to them, see [[{{#special:BrokenRedirects}}|the list of broken redirects]].",
        "wantedpages-badtitle": "Result set me kharaa title hai: $1",
        "wantedfiles": "Maange waala files",
        "wantedfiletext-cat": "Niche likha gais file ke kaam me lawa gais hae lekin ii Wikipedia me nai hae. Ii Wikipedia me file rahe par bhi foreign repositories ke file ke list karaa jaae sake hae. Aisan koi galat positives ke <del>mitae dewa jaai</del>. Aur, uu panna jon ki non-existent files ke embed kare hae ke [[:$1]] me list karaa gais hae.",
        "mostrevisions": "Sab se jaada badlao waala panna",
        "prefixindex": "Sab panna jisme prefix index hai",
        "prefixindex-namespace": "Sab panna jisme prefix ($1 namespace)hae",
+       "prefixindex-submit": "Dekhao",
        "prefixindex-strip": "List me se prefix ke strip karo",
        "shortpages": "Chhota panna",
        "longpages": "Lamba panna",
        "protectedpages-performer": "Sadasya ke bachawa jaae hae",
        "protectedpages-params": "Protection parameters",
        "protectedpages-reason": "Kaaran",
+       "protectedpages-submit": "Panna ke dekhao",
        "protectedpages-unknown-timestamp": "Nai maluum",
        "protectedpages-unknown-performer": "Unknown sadasya",
        "protectedtitles": "Bachawa gais titles",
        "protectedtitles-summary": "Ii panna uu title ke list kare hae jon ki creation se protected hae. Protected panna ke suchi dekhe ke khatir \n[[{{#special:ProtectedPages}}|{{int:protectedpages}}]] ke dekho.",
        "protectedtitlesempty": "Ii parameters se koi bhi title ke nai bacawa gais hai.",
+       "protectedtitles-submit": "Title ke dekhao",
        "listusers": "Sadasya ke suchi",
        "listusers-editsonly": "Khaali uu sadasya ke dekhao jon ki koi badlao karis hai",
        "listusers-creationsort": "Banawa gais tarik se sort karo",
        "usereditcount": "$1 {{PLURAL:$1|badlao|badlao}}",
        "usercreated": "{{GENDER:$3|Banawa gais hae}}  $1 pe $2 me",
        "newpages": "Nawaa panna",
+       "newpages-submit": "Dekhao",
        "newpages-username": "Username:",
        "ancientpages": "Sab se purana panna",
        "move": "Naam badlo",
        "nopagetext": "Target panna jiske aap specify karaa hai exist nai hoe hai.",
        "pager-newer-n": "{{PLURAL:$1|nawaa 1|nawaa $1}}",
        "pager-older-n": "{{PLURAL:$1|purana 1|purana $1}}",
-       "suppress": "Oversight",
+       "suppress": "Suppress karo",
        "querypage-disabled": "Ii khaas panna ke performance kaaran se disable kar drwa gais hae.",
        "apihelp": "API madat",
        "apihelp-no-such-module": "Module \"$1\" ke paawa nai gais hae.",
+       "apisandbox": "API sandbox",
+       "apisandbox-jsonly": "JavaScript is required to use the API sandbox.",
+       "apisandbox-api-disabled": "Ii site pe API disabled hai.",
+       "apisandbox-intro": "Use this page to experiment with the <strong>MediaWiki web service API</strong>.\nRefer to [[mw:API:Main page|the API documentation]] for further details of API usage. Example: [https://www.mediawiki.org/wiki/API#A_simple_example get the content of a Main Page]. Select an action to see more examples.\n\nNote that, although this is a sandbox, actions you carry out on this page may modify the wiki.",
+       "apisandbox-fullscreen": "Panel ke expand karo",
+       "apisandbox-fullscreen-tooltip": "Sandbox panel ke barraa kar ke browser window ke size karo.",
+       "apisandbox-unfullscreen": "Panna ke dekhao",
+       "apisandbox-unfullscreen-tooltip": "Sandbox panel ke chhotaa karo, so MediaWiki navigation links are available.",
+       "apisandbox-submit": "Request karo",
+       "apisandbox-reset": "Clear karo",
+       "apisandbox-retry": "Fir se try karo",
+       "apisandbox-loading": "Loading information for API module \"$1\"...",
+       "apisandbox-load-error": "An error occurred while loading information for API module \"$1\": $2",
+       "apisandbox-no-parameters": "Ii API module me koi parameter nai hai.",
+       "apisandbox-helpurls": "Madat ke link",
+       "apisandbox-examples": "Examples",
+       "apisandbox-dynamic-parameters": "Aur parameters",
+       "apisandbox-dynamic-parameters-add-label": "Parameter jorro:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parameter ke naam",
+       "apisandbox-dynamic-error-exists": "Parameter, jiske naam \"$1\" hai, abhi hai.",
+       "apisandbox-deprecated-parameters": "Deprecated parameters",
+       "apisandbox-fetch-token": "Auto-fill the token",
+       "apisandbox-submit-invalid-fields-title": "Kuchh field valid nai hai",
+       "apisandbox-submit-invalid-fields-message": "Marked field ke correct kar ke fir se try karo.",
+       "apisandbox-results": "Results",
+       "apisandbox-sending-request": "Sending API request...",
+       "apisandbox-loading-results": "Receiving API results...",
+       "apisandbox-results-error": "An error occurred while loading the API query response: $1.",
+       "apisandbox-request-selectformat-label": "Show request data as:",
+       "apisandbox-request-format-url-label": "URL query string",
+       "apisandbox-request-url-label": "Request ke URL:",
+       "apisandbox-request-json-label": "Request JSON:",
+       "apisandbox-request-time": "Request time: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Token ke sudhaar ke resubmit karo",
+       "apisandbox-results-fixtoken-fail": "Failed to fetch \"$1\" token.",
+       "apisandbox-alert-page": "Ii panna ke fields valid nai hai.",
+       "apisandbox-alert-field": "Ii field ke value, valid nai hai.",
+       "apisandbox-continue": "Continue",
+       "apisandbox-continue-clear": "Clear karo",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} will [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] the last request; {{int:apisandbox-continue-clear}} will clear continuation-related parameters.",
+       "apisandbox-param-limit": "Enter <kbd>max</kbd> to use the maximum limit.",
+       "apisandbox-multivalue-all-namespaces": "$1 (All namespaces)",
+       "apisandbox-multivalue-all-values": "$1 (All values)",
        "booksources": "Pustak sources",
        "booksources-search-legend": "Book sources ke khojo",
        "booksources-search": "Khojo",
        "booksources-text": "Niche ke suchi me uu websites ke jorr hai jon ki nawaa aur use karaa gais book ke beche hai aur jon book ke aap khojtaa hai uske baare aur jaankari de sake hai:",
        "booksources-invalid-isbn": "Dewa gais ISBN thiik nai hai; iske purana jagha se copy kare ke time ke error ke check karo.",
+       "magiclink-tracking-rfc": "Pages using RFC magic links",
+       "magiclink-tracking-rfc-desc": "This page uses RFC magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
+       "magiclink-tracking-pmid": "Jon panna PMID magic links ke use kare hai",
+       "magiclink-tracking-pmid-desc": "Ii panna PMID magic links ke kaam me laae hai. Dekho [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ki kaise migrate karaa jaawe hai.",
+       "magiclink-tracking-isbn": "Panna, jon ki RFC magic links ke kaam me laae hai",
+       "magiclink-tracking-isbn-desc": "Ii panna ISBN magic links ke kaam me laawe hai. Dekho [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ke on how to migrate.",
        "specialloguserlabel": "Sadasya:",
-       "speciallogtitlelabel": "Padwi:",
+       "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Suchi",
+       "logeventslist-submit": "Dekhao",
        "all-logs-page": "Sab janta waala suchi",
        "alllogstext": "{{SITENAME}} ke sab log ke ek saathe dekhawa jjawe hae.\nYou can narrow down the view by selecting a log type, the user name (case-sensitive), or the affected page (also case-sensitive).\nKetna chij dekhae hae ke aap kamti kare saktaa hae sadasya ke naam (case-sensitive), nai the affected panna (ii bhi case-sensitive) ke log type ke select kare se.",
        "logempty": "Log me koi matching item nai hai.",
        "log-title-wildcard": "Ii text se suruu hoe waala titles ke khojo",
        "showhideselectedlogentries": "Dekhao/lukao chuna gais log entries",
+       "log-edit-tags": "Edit tags of selected log entries",
+       "checkbox-select": "Select: $1",
+       "checkbox-all": "Sab",
+       "checkbox-none": "Koi bhi nai",
+       "checkbox-invert": "Ultaa karo",
        "allpages": "Sab panna",
        "nextpage": "Aglaa panna ($1)",
        "prevpage": "Pichhla panna ($1)",
        "cachedspecial-viewing-cached-ts": "Aap ii panna ke ek cached version ke dekhtaa hae, jon ki saait puura aslii nai hae.",
        "cachedspecial-refresh-now": "Sab se nawaa ke dekho.",
        "categories": "Vibhag",
+       "categories-submit": "Dekhao",
        "categoriespagetext": "Niche ke {{PLURAL:$1|vibhag me|vibhag me}}  panna aur media hae.\n[[Special:UnusedCategories|Unused categories]] hian nai dekhawa jaawe hae.\n[[Special:WantedCategories|wanted categories]] ke bhi dekho.",
        "categoriesfrom": "Vibhag jon ki hian pe suruu hoe hai, ke dekhao:",
        "deletedcontributions": "Sadasya ke yogdaan ke mitae dia hai",
        "activeusers-intro": "Ii suchi uu sadasya ke hae jon ki pahile {{PLURAL:$1|din|din}} me kuchh karin hae.",
        "activeusers-count": "$1 haali ke {{PLURAL:$1|badlao}} pichhle {{PLURAL:$3|din}} me",
        "activeusers-from": "Sadasya jon ki hian se suruu hoe hai ke dekhao:",
+       "activeusers-groups": "Display users belonging to groups:",
+       "activeusers-excludegroups": "Exclude users belonging to groups:",
        "activeusers-noresult": "koi sadasya ke pawa nai gais hai.",
+       "activeusers-submit": "Active sadasya ke dekhao",
        "listgrouprights": "Sadasya  ke group adhikar",
        "listgrouprights-summary": "Niche likha hai ek suchi hai groups ke jon ki ii wiki me defined hai, aapan  associated access rights ke saathe\n[[{{MediaWiki:Listgrouprights-helppage}}|additional information]] individual rights ke baare me sait hoi.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dewa gais adhikar</span>\n* <span class=\"listgrouprights-revoked\">Hatawa gais adhikar</span>",
        "listgrouprights-namespaceprotection-header": "Namespace restrictions",
        "listgrouprights-namespaceprotection-namespace": "Namespace:",
        "listgrouprights-namespaceprotection-restrictedto": "Adhikar jon ki sadasya ke badlao kare de hae.",
+       "listgrants": "Grants",
+       "listgrants-summary": "Niche suchi hai of grants with their associated access to user rights. Users can authorize applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
+       "listgrants-grant": "Grant",
+       "listgrants-rights": "Adhikaar",
        "trackingcategories": "Vibhag ke track karaa jaawe hae",
        "trackingcategories-summary": "Ii panna me tracking vibhag ke suchi hae, jiske MediaWiki software automatically populate kare hae. Iske naam can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
        "trackingcategories-msg": "Tracking category",
        "trackingcategories-name": "Sandes ke naam",
        "trackingcategories-desc": "Category inclusion ke criteria",
+       "restricted-displaytitle-ignored": "Pages with ignored display titles",
+       "restricted-displaytitle-ignored-desc": "The page has an ignored <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> because it is not equivalent to the page's actual title.",
        "noindex-category-desc": "Ii panna ke robots nai index karis hae kaheki ispe magic word <code><nowiki>__NOINDEX__</nowiki></code> hae aur ii uu namespace me hae jisme uu flag allowed nai hae.",
        "index-category-desc": "Ii panna me  <code><nowiki>__INDEX__</nowiki></code> hae(aur ii uu namespace me hae jahaan pe flag allowed haeand), tab iske robots se index karaa gais hae where it normally wouldn't be.",
        "post-expand-template-inclusion-category-desc": "Ii panna ke size <code>$wgMaxArticleSize</code> se barraa hae after expanding all the templates, so some templates were not expanded.",
        "emailccsubject": "Aapke $1 ke khatir khabar ke copy: $2",
        "emailsent": "E-mail ke bhej dewa gais hai",
        "emailsenttext": "Aap ke e-mail sandes ke bhej dewa gais hai.",
-       "emailuserfooter": "Ii e-mail ke $1, $2 ke lage \"E-mail user\" function ke {{SITENAME}}se kaam me laae ke bhejis hai.",
+       "emailuserfooter": "Ii e-mail ke {{GENDER:$1|sent}}, {{GENDER:$2|$2}} ke lage \"{{int:emailuser}}\"  function ke {{SITENAME}} se kaam me laae ke bhejis hai. {{GENDER:$2|Your}} email will be sent directly to the {{GENDER:$1|original sender}}, revealing {{GENDER:$2|your}} email address to {{GENDER:$1|them}}.",
        "usermessage-summary": "System sandesh likha jaae hae.",
        "usermessage-editor": "System ke sandes de waala",
        "watchlist": "Dhyan suchi",
        "watchlistanontext": "Aapan dhyan suchi me ke dekhe nai to badle ke khatir meharbani kar ke log in karo.",
        "watchnologin": "Logged in nai hai",
        "addwatch": "Dhyan suchi me jorro",
-       "addedwatchtext": "Panna \"[[:$1]]\" ke aap ke [[Special:Watchlist|watchlist]] me jorr dewa gais hae.\nIi panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.",
+       "addedwatchtext": "\"[[:$1]]\" aur iske discussion panna ke aap ke   [[Special:Watchlist|watchlist]] me jorr diyaa gais hai.",
+       "addedwatchtext-talk": "\"[[:$1]]\" aur iske associated panna ke aap ke  [[Special:Watchlist|watchlist]] me jorr dewa gais hai.",
        "addedwatchtext-short": "Panna \"$1\" ke aap ke watchlist me jorraa gais hae.",
        "removewatch": "Dhyan suchi me se hatao",
-       "removedwatchtext": "Panna \"[[:$1]]\" ke aap ke [[Special:Watchlist|aap ke dhyan suchi]] se hatae dewa gais hai.",
+       "removedwatchtext": "\"[[:$1]]\" aur iske discussion panna ke aaap ke [[Special:Watchlist|watchlist]] se hatae dewa gais hai.",
+       "removedwatchtext-talk": "\"[[:$1]]\" aur iske discussion panna ke aap ke   [[Special:Watchlist|watchlist]] se hatae dewa gais hai.",
        "removedwatchtext-short": "Panna \"$1\" ke aap ke watchlist me se hataawa gais hae.",
        "watch": "Dekho",
        "watchthispage": "Ii panna par dhyan rakho",
        "wlheader-showupdated": "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
        "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile <strong>$1</strong> badlao hai}} pichhle {{PLURAL:$2|ghanta|<strong>$2</strong> ghanta}} me as of $3, $4.",
        "wlshowlast": "Pichhla $1 ghanta $2 din  ke dekhao",
+       "watchlist-hide": "Lukao",
+       "watchlist-submit": "Dekhao",
+       "wlshowtime": "Kon samay ke display karaa jaae:",
+       "wlshowhideminor": "chhotaa badlao",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "registered sadasya",
+       "wlshowhideanons": "binaa naam ke sadasya",
+       "wlshowhidepatr": "jon badlao pe pahraa dewaa jaae hai",
+       "wlshowhidemine": "hamaar badlao",
+       "wlshowhidecategorization": "panna categorization",
        "watchlist-options": "Dhyan suchi ke options",
        "watching": "Dekhtaa...",
        "unwatching": "Nai dekhtaa...",
        "deletepage": "Pana ke delete karo",
        "confirm": "Confirm karo",
        "excontent": "content rahaa: '$1'",
-       "excontentauthor": "content rahaa: '$1' (aur khaali ek contributor rahaa '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "content rahaa: \"$1\", aur khaali ek contributor rahaa \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "blanking se pahile content rahaa: '$1'",
        "delete-confirm": "\"$1\" ke mitao",
        "delete-legend": "Mitao",
        "historywarning": "<strong>Sawadhan</strong>: Jon panna ke aap mitae waala hai ke itihaas hai $1 {{PLURAL:$1|badlao|badlao}} ke saathe:",
+       "historyaction-submit": "Dekhao",
        "confirmdeletetext": "Aap ek panna ke uske itihaas ke saathe delete kare waala hai.\nMeharbani kar ke iske confirm karo, ki aap iske consequences ke samajhta hai, aur aap iske [[{{MediaWiki:Policy-url}}|the policy]] ke policy ke niche delete karta hai.",
        "actioncomplete": "Action puura hoe gais hai",
        "actionfailed": "Action fail hoe gais",
        "delete-toobig": "Ii panna ke barraa balao ke itihass hai, $1 se jaada {{PLURAL:$1|revision|revisions}}.\nAisan panna ke mitae pe rok lagawa gais hai so that accidental disruption of {{SITENAME}} ke roka jaae sake hai.",
        "delete-warning-toobig": "Ii panna ke lambaa badlao ke itihaas hai, $1 {{PLURAL:$1|revision|revisions}} se jaada.\nIske mitae se {{SITENAME}} me database operations me baadha parri;\nsawadhani se aage barrho.",
        "deleteprotected": "Aap ii panna ke mitae nai saktaa hae kaaheki iske protect karaa gais hae.",
-       "deleting-backlinks-warning": "'''Chetauni:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Duusra panna]] uu panna se link, nai to transclude kare hae jiske aap delete kare waala hae.",
+       "deleting-backlinks-warning": "<string>Chetauni:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Duusra panna]] uu panna se link, nai to transclude kare hai jiske aap delete kare waala hae.",
        "rollback": "Pahile jaise kare waala badlao",
        "rollbacklink": "pahile jaise karo",
        "rollbacklinkcount": "$1 {{PLURAL:$1|edit|edits}} ke rollback karo",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|edit|edits}} se jaada badlao ke rollback karo",
        "rollbackfailed": "Pahile jaise kare ke kosis safal nai bhais",
+       "rollback-missingparam": "Maange par, required parameters nai hai.",
+       "rollback-missingrevision": "Badalo ke data ke nai load kare sakaa hai.",
        "cantrollback": "Badlao ke pahile jaise nai kare sakta hai;\nisse pahile waala sadasya ii panna ke khaali yogdaan de waala hai.",
        "alreadyrolled": "[[:$1]] by [[User:$2|$2]] ke pahile jaise nai kare sakta hai. ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\naur koi ii panna ke badal nai to pahile jaise kar diis hai.\n\nIi panna ke pichla badla [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) se rahaa",
        "editcomment": "Badlao ke summary rahaa: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ke badlao ke [[User:$1|$1]] ke aakhri badlao ke jaise kar dewa gais hai.",
        "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadal ke $2 ke aakhri version kar dewa gais hai.",
+       "rollback-success-notify": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadlao ke $2 ke aakhri version kar dewa gais hai.[$3 Show changes]",
        "sessionfailure-title": "Session fail hoe gais hae",
        "sessionfailure": "Aap ke login session me kuch karrbarr hai.\niske cancel kar dewa gais hai jisse ki koi iisession ke hijack nai kar.\nMeharbani kar ke  \"back\" ke press kar ke jon pana se aap aae rahaa ke fir se load karo, tab fir kosis karo.",
+       "changecontentmodel": "Panna ke content model ke badlo",
+       "changecontentmodel-legend": "Content model ke badlo",
+       "changecontentmodel-title-label": "Panna ke title",
+       "changecontentmodel-model-label": "Nawaa content model",
+       "changecontentmodel-reason-label": "Kaaran:",
+       "changecontentmodel-submit": "Badlo",
+       "changecontentmodel-success-title": "Content model ke badal dewaa gais hai",
+       "changecontentmodel-success-text": "The content type of [[:$1]] ke badlaa gais hai.",
+       "changecontentmodel-cannot-convert": "The content on [[:$1]] ke $2 ke rakam nai convert karaa jaae sake hai.",
+       "changecontentmodel-nodirectediting": "The $1 content model, direct editing ke nai support kare hai",
+       "changecontentmodel-emptymodels-title": "Koi content model nai hai",
+       "changecontentmodel-emptymodels-text": "The content on [[:$1]] ke koi bhi type me nai badlaa jaae sake hai.",
+       "log-name-contentmodel": "Content model ke change log",
+       "log-description-contentmodel": "Ii panna lists changes to the content model of pages, and pages that were created with a content model other than the default.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|created}} the page $3 using a non-default content model \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|changed}} the content model of the page $3 from \"$4\" to \"$5\"",
+       "logentry-contentmodel-change-revertlink": "pahile jaise karo",
+       "logentry-contentmodel-change-revert": "pahile jaise karo",
        "protectlogpage": "Surakchha suchi",
        "protectlogtext": "Panna surakchha ke suchi niche dewa gais hae.\nAbhi ke laabu panna surakchha ke dekho [[Special:ProtectedPages|protected pages list]] me",
        "protectedarticle": "bachawal \"[[$1]]\"",
        "modifiedarticleprotection": "[[$1]]\" ke protection level ke badal dia hai",
        "unprotectedarticle": "surakchha suchi \"[[$1]]\" me se hatawa gais",
        "movedarticleprotection": "protection settings ke \"[[$2]]\" se \"[[$1]]\" kae dia hai",
+       "protectedarticle-comment": "{{GENDER:$2|Protected}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Changed protection level}} for \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removed protection}} from \"[[$1]]\"",
        "protect-title": "\"$1\" ke protection level ke badlo",
        "protect-title-notallowed": "\"$1\" ke protection level ke dekho",
        "prot_1movedto2": "[[$1]] ke naam badal ke [[$2]] kar dewa gae hai",
        "undeletepagetext": "Niche dekhawa gais {{PLURAL:$1|panna ke mitae dewa gais hai lekin|$1 panna ke mitae dewa gais hai lekin}} abhi archive me hai aur iske pahile jaise karaa jaawe sake hai.\nArchive ke time time se safaa karaa jaawe hai.",
        "undelete-fieldset-title": "Badlao ke pahile jaise karo",
        "undeleteextrahelp": "Panna ke itihaas ke pahile jaise kare ke khatir sab checkboxes me kuch nai karna aur ''''{{int:undeletebtn}}''''' ke click karo.\nChuna gais panna ke pahile jaise kare ke khatir, uu box ke check karo jon badlao ke aap pahile jaise kare mangta hai aur ''''{{int:undeletebtn}}''''' ke click karo.\n'''''Reset''''' click kare se comment field aur sab checkboxes clear hoe jaai.",
-       "undeleterevisions": "$1 {{PLURAL:$1|badlao|badlao}} ke archive kar dewa gais hai",
+       "undeleterevisions": "$1 {{PLURAL:$1|badlao}} ke mitae dewa gais hai",
        "undeletehistory": "Agar aap panna ke pahile jaise karaa tab sab badlao itihass me restore hoe jaai.\nAgar koi wahii naam ke nawaa panna mitae ke baad banaa hoi tab restore karaa gais badlao pahile ke itihass me dekhai.",
        "undeleterevdel": "Pahile jaise nai kare sakega agar isse uppar waala panna nai to file revision bhi delete hoe jaai.\nAisan time pe, aap ke chaahi ki aap sab se nawaa deleted revision ke uncheck nai to unhide karo.",
        "undeletehistorynoadmin": "Ii panna ke mitae dewa gais hai.\nMitae ke kaaran niche ke summary me dewa gais hai, aur iske saathe uu sadasya ke baare me bhi jaankari hai jon ki ii panna ke badle rahin.\nIi mitawa gais badlao ke baare me puura jankari khaali administrators ke mile sake hai.",
        "undelete-revision": "$1 ke badlao ke (as of $4, at $5) by $3 mitae dewa gais hai:",
        "undeleterevision-missing": "Badlao kharaab nai to pawa nai jaawe sake hai.\nSait aap ke kharaab link hoi, nai to badlao ke sait pahile jaise kar dewa gais hoi, nai to archive se mitae dewa gais hoi.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|One revision|$1 revisions}} could not be restored, because {{PLURAL:$1|its|their}} <code>rev_id</code> was already in use.",
        "undelete-nodiff": "Koi pahile ke badlao ke nai pawa gais hai.",
        "undeletebtn": "Pahile jaise kar do",
        "undeletelink": "dekho/pahile jaise karo",
        "undeletedrevisions": "{{PLURAL:$1|1 badlao|$1 badlao}} ke pahile jaise kar dewa gais hai",
        "undeletedrevisions-files": "{{PLURAL:$1|1 badlao|$1 badlao}} aur {{PLURAL:$2|1 file|$2 files}} ke pahile jaise kar dewa gais hai",
        "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} ke pahile jaise kar dewa gais hai",
-       "cannotundelete": "Undelete failed:\n$1",
+       "cannotundelete": "Kuchh, nai to sab undelete fail hoe gais hai:\n$1",
        "undeletedpage": "'''$1 ke pahile jaise kar dewa gais hai'''\n\nNawaa mitawa gais aur badlao ke ulta karaa gais panna ke dekhe ke khatir [[Special:Log/delete|deletion log]] ke dekho.",
        "undelete-header": "Nawaa mitawa gais panna ke dekhe ke khatir [[Special:Log/delete|the deletion log]] ke dekho.",
        "undelete-search-title": "Mitawa gais panna ke khojo",
        "contributions": "{{GENDER:$1|Sadasya}} ke yogdaan",
        "contributions-title": "$1 ke yogdaan",
        "mycontris": "Yogdaan",
+       "anoncontribs": "Yogdaan",
        "contribsub2": "{{GENDER:$3|$1}} ($2) ke khatir",
        "contributions-userdoesnotexist": "User account \"$1\" register nai karaa gais hae",
        "nocontribs": "Ii critera ke rakam ke koi badlao nai pawa gais hai.",
        "sp-contributions-newbies-sub": "Nawaa account khatir",
        "sp-contributions-newbies-title": "Nawaa account ke sadasya ke yogdaan",
        "sp-contributions-blocklog": "Suchi roko",
-       "sp-contributions-suppresslog": "Sadasya ke yogdaan jiske suppress karaa gais hae",
-       "sp-contributions-deleted": "Mitawa gais adasya ke yogdaan",
+       "sp-contributions-suppresslog": "{{GENDER:$1|sadasya}}  ke yogdaan jiske suppress karaa gais hae",
+       "sp-contributions-deleted": "Mitawa gais {{GENDER:$1|sadasya}} ke yogdaan",
        "sp-contributions-uploads": "upload karaa gais file",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "baat",
        "sp-contributions-username": "IP Address nai to username:",
        "sp-contributions-toponly": "Khaali sab se nawaa badlao ke dekhao",
        "sp-contributions-newonly": "Khaali uu badlao ke dekhao jon ke panna banae waala hae",
+       "sp-contributions-hideminor": "Chhotaa badlao ke lukao",
        "sp-contributions-submit": "Khojo",
        "whatlinkshere": "Hian konchij jurre hae",
        "whatlinkshere-title": "Panna jon ki $1 se jurre hai",
        "whatlinkshere-prev": "{{PLURAL:$1|pahile waala|pahile waala $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|aage waala|aage waala $1}}",
        "whatlinkshere-links": "← jorr",
-       "whatlinkshere-hideredirs": "$1 redirects",
-       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hideredirs": "$1 redirect",
+       "whatlinkshere-hidetrans": "$1 transclusion",
        "whatlinkshere-hidelinks": "$1 jorr",
        "whatlinkshere-hideimages": "$1 file ke jorr",
        "whatlinkshere-filters": "Filters",
+       "whatlinkshere-submit": "Jaao",
        "autoblockid": "#$1 ke apne se block karo",
        "block": "Sadasya ke roko",
        "unblock": "Sadasya ke rukawat k khalaas karo",
        "blockip": "{{GENDER:$1|sadasya}} ke roko",
        "blockip-legend": "Sadasya ke roko",
-       "blockiptext": "Niche ke form ke use kar ke koi khaas IP address nai to username ke write access ke roko.\nIske khaali vandalism ke roke ke khatir use kare ke chaahi [[{{MediaWiki:Policy-url}}|policy]] ke niche.\nNiche ek khaas kaaran likho (jaise ki, citing particular pages that were vandalized).",
+       "blockiptext": "Niche ke form ke use kar ke koi khaas IP address nai to username ke write access ke roko.\nIske khaali vandalism ke roke ke khatir kaam me laae ke chaahi [[{{MediaWiki:Policy-url}}|policy]] ke niche.\nFill in a specific reason below (for example, citing particular pages that were vandalized).\nYou can block IP address ranges using the [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; the largest allowed range is /$1 for IPv4 and /$2 for IPv6.",
        "ipaddressorusername": "IP Address nai to username:",
        "ipbexpiry": "Expiry:",
        "ipbreason": "Kaaran:",
        "ipb-unblock": "Ek username nai to IP address ke rukawat ke khalaas karo",
        "ipb-blocklist": "Abhi ke rukawat ke dekho",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} ke yogdaan",
+       "ipb-blocklist-duration-left": "$1 left",
        "unblockip": "Sadasya ke rukawat ke khalaas karo",
        "unblockiptext": "Niche ke form ke use kar ke pahile roka gais IP address nai to username ke likhe ke adhikar do.",
        "ipusubmit": "Ii rukawat ke hatao",
        "block-log-flags-hiddenname": "username ke lukae dewa gais hai",
        "range_block_disabled": "Administrator ke adhikar, jisse range block banawa jaawat rahaa, ke rok dewa gais hai.",
        "ipb_expiry_invalid": "Khalaas hoe waala time galat hai.",
+       "ipb_expiry_old": "Khalas hoe waala time past me hai.",
        "ipb_expiry_temp": "Lukawa gais username ke rukawat ke permanent hoe ke chaahi.",
        "ipb_hide_invalid": "Ii account ke dabae nai sakaa hai; saait {{PLURAL:$1|one edit|$1 edits}} se jaada badlao hae.",
        "ipb_already_blocked": "\"$1\" ke pahile rok dewa gais hai",
        "proxyblockreason": "Aap ke IP address ke block kar dewa gais hai kahe ki ii ek open proxy hai.\nMeharbaani kar ke aap aapan Internet service provider, nai to tech support, ke contact kar ke ii serious security problem ke baare me batao.",
        "sorbsreason": "DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.",
        "sorbs_create_account_reason": "DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.\nAap ke ek account banae ke ijajat nai hai",
+       "softblockrangesreason": "Anonymous contributions are not allowed from your IP address ($1). Please log in karo.",
        "xffblockreason": "Ek IP address jon ki X-Forwarded-For header me hae, chaahe aap ke nai to jon proxy server ke aap use kartaa hae ke, ke block kar dewa gais hae. Suruu waala block kare ke kaaran rahaa:$1",
        "cant-see-hidden-user": "Jon sadasya ke aap roke mangtaa hae ke pahile rok ke lukae dewa gais hae.\nJab ki aap ke lage hideuser adhikaar nai hae, tab aap ii sadasya ke rukawat ke nai dekhe aur badle saktaa hae.",
        "ipbblocked": "Aap duusra sadasya ke roke nai to kohle nai sakta hae, kaahe ki aap ke bhi rokaa gais hae",
        "lockdbsuccesstext": "Database ke band kar dewa gais hai.<br />\nYaad kar ke [[Special:UnlockDB|lock ke hatae dena]] maintenance khalaas kare ke baad.",
        "unlockdbsuccesstext": "Database ke khol dewa gais hai.",
        "lockfilenotwritable": "Database lock file me likha nai jaawe sake hai.\nDatabase ke khole nai to band kare ke khatir, iske web server se likhe ke laayek hoe ke chaahi",
+       "databaselocked": "Database already band hai.",
        "databasenotlocked": "Database band nai hai.",
        "lockedbyandtime": "(se {{GENDER:$1|$1}} pe $2 hian $3)",
        "move-page": "$1 ke naam badlo",
        "move-page-legend": "Panna ke naam badlo",
-       "movepagetext": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nAap uu redirect, jon ki pahile waala title pe jawe hai, ke update kare sakta hai.\nAgar aap ii nai kare mangta hai, tab [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karna.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n'''CHETAWANI'''\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
-       "movepagetext-noredirectfixer": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nIi jaruri hae ki aap  [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karo.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n'''CHETAWANI'''\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
-       "movepagetalktext": "Saathe ke talk panna ke automatically move kar dewa jai ii panna ke saathe '''agar jo:'''\n* khali nahi talk page nawaa naam ke already hai, yah\n* Aap nivhe waala box ke uncheck karo\nIi prastithi me, aap ke manually move yah merge kare ke parri.",
+       "movepagetext": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nAap uu redirect, jon ki pahile waala title pe jawe hai, ke update kare sakta hai.\nAgar aap ii nai kare mangta hai, tab [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karna.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move <strong>nai</strong> hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n<strong>CHETAWANI</strong>\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
+       "movepagetext-noredirectfixer": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nIi jaruri hae ki aap  [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karo.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move <strong>nai</strong> hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n<strong>CHETAWANI</strong>\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
+       "movepagetalktext": "Agar aap box ke tick karaa tab, saathe ke talk panna ke automatically move kar dewa jai ii panna ke saathe '''agar jo:'''\n* khali nahi talk page nawaa naam ke already hai, yah\nIi prastithi me, aap ke manually move yah merge kare ke parri.",
        "moveuserpage-warning": " '''Chetauni:'''  Aap ek sadasya ke panna ke naam badle waala hae. Ii yaad rakhna ki khaali panna ke naam badla jaai, sadasya ke naam ''nai'' badlaa jaai.",
        "movecategorypage-warning": "<strong>Chetauni:</strong> Aap ek category panna ke hatae waala hae. Khaali ii panna ke hataawa jaai aur purana category ke aur panna ke nawaa category me <em>nai</em>  recategorize karaa jaai.",
        "movenologintext": "Panna ke naam badle ke khatir aap ke ek registered sadasya rahe ke parri aur  [[Special:UserLogin|logged in]].",
        "cant-move-to-user-page": "Aap ke koi panna ke hatae ke sadasya ke panna pe kare ke ijajat nai hai (sadasya ke subpage ke chhorr ke).",
        "cant-move-category-page": "Aap ke panna ke category panna ke hatae ke ijajat nai hai.",
        "cant-move-to-category-page": "Aap ke panna ke category panna me hatae ke ijajat nai hai.",
-       "newtitle": "Nawaa title pe:",
+       "cant-move-subpages": "Aap ke subpages ke naam badle ke ijajat nai hai.",
+       "namespace-nosubpages": "Namespace \"$1\" subpages ke nai allow kare hai.",
+       "newtitle": "Nawaa title:",
        "move-watch": "Ii panna pe dhyan rakho",
        "movepagebtn": "Panna ke naam badlo",
        "pagemovedsub": "Panna ke naam badle me safalta",
        "movelogpagetext": "Niche sab panna, jiske naam badla gais hai, ke suchi hai.",
        "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
        "movesubpagetext": "Ii panna me $1 {{PLURAL:$1|subpage|subpages}} hai jiske niche dekhawa gais hai.",
+       "movesubpagetalktext": "Corresponding baat waala panna $1 {{PLURAL:$1|subpage|subpages}} ke niche dekhawa gais hai.",
        "movenosubpage": "Ii panna me koi subpages nai hai.",
        "movereason": "Kaaran:",
        "revertmove": "purana copy pe lae jao",
-       "delete_and_move_text": "== Mitae ke jaruri hai ==\nDestination panna \"[[:$1]]\" abhi hai.\nKa aap mangta hai ki iske mitae dewa jaae, jisse ki ii naam se duusra paana ke save karaa jaae sake?",
+       "delete_and_move_text": "Destination panna \"[[:$1]]\" abhi hai.\nKa aap mangta hai ki iske mitae dewa jaae, jisse ki ii naam se duusra paana ke save karaa jaae sake?",
        "delete_and_move_confirm": "Haan, panna ke mitao",
        "delete_and_move_reason": "\"[[$1]]\" se move kare ke khatir isk mitaya",
        "selfmove": "Source aur destination title ke naam ekke hai;\npanna ke wahi ke uppar nai save karaa jaae sake hai.",
        "move-leave-redirect": "Ek redirect ke pichhe chhorro",
        "protectedpagemovewarning": "Chetauni: Ii panna ke band kar dewa gais hai jisse ki khaali administrator logan iske naam badle sake hai.\nAap ke jaankari ke khatir sab se nawaa suchi niche dewa gais hae:",
        "semiprotectedpagemovewarning": "Dhyan me rakhna: Ii panna ke band kar dewa gais hai jisse ki khaali registered sadasya iske naam badle sake hai.\nAap ke jaankari ke khatir sab se nawaa suchi ke niche dewa gais hae:",
-       "move-over-sharedrepo": "==File hae==\n[[:$1]] shared repository me hae. Ek file ke naam badal ke ii naam kare se shared file mit jaai.",
+       "move-over-sharedrepo": "[[:$1]] shared repository me hae. Ek file ke naam badal ke ii naam kare se shared file mit jaai.",
        "file-exists-sharedrepo": "Jon file ke naam ke chuna gais hae, pahile se shared repository me hae.\nMeharbani kar ke duusra naam do.",
        "export": "Panna niryat karo",
        "exporttext": "Aap ek khaas panna, nai to dher panna jon ki XML me bandha hai, ke text aur balao ke itihass ke export kare saktaa hai.\nIske duusra wiki me MediaWiki [[Special:Import|import panna]] se import karaa jaawe sake hai.\n\nPanna ke export kare ke khatir titles ke niche ke text box me likho, ek line pe ek title, aur ii select karo ki aap abhi ke version ke saathe purana version mangtaa hai, panna ke itihaas ke saathe, nai to abhi ke version jisme last badlao ke jankari hai.\n\nDuusra case me aap ek link ke bhi use kare saktaa hai, jaise ki [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] panna ke khatir \"[[{{MediaWiki:Mainpage}}]]\".",
        "export-download": "Save as file",
        "export-templates": "Templates ke include karo",
        "export-pagelinks": "Include linked pages to a depth of:",
+       "export-manual": "Panna ke manually jorro",
        "allmessages": "System sandesh",
        "allmessagesname": "Naam",
        "allmessagesdefault": "Default text",
        "import-interwiki-history": "Ii panna ke sab badlao ke itihaas ke copy karo",
        "import-interwiki-templates": "Sab template ke include karo",
        "import-interwiki-submit": "Import karo",
+       "import-mapping-default": "Default locations pe import karo",
+       "import-mapping-namespace": "Name space pe import karo:",
+       "import-mapping-subpage": "Import as subpages of the following page:",
        "import-upload-filename": "File ke naam:",
        "import-comment": "Aapan bichar do:",
        "importtext": "Meharbani kar ke file ke [[Special:Export|export utility]] use kar ke source wiki me se export karo.\nAapan computer me save kar ke  hian pe upload karo.",
        "import-nonewrevisions": "Koi badalo ke import nai karaa gais hae (sab ke chaahe pahile import karaa gais rahaa, nai to error ke kaaran skip karaa gais rahaa).",
        "xml-error-string": "$1 line $2 me, col $3 (byte $4): $5",
        "import-upload": "XML data ke upload karo",
-       "import-token-mismatch": "Loss of session data.\nMeharbani kar ke, fir se kosis karo.",
+       "import-token-mismatch": "Loss of session data.\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "import-invalid-interwiki": "Naam dewa gais wiki se import nai kare saktaa hai.",
        "import-error-edit": "Panna \"$1\" ke import nai kara gais kaahe ki aap ke badle ke adhikar nai hae.",
        "import-error-create": "Panna \"$1\" ke import nai kara gais kaahe ki aap ke panna banae ke adhikar nai hae.",
        "javascripttest": "JavaScript ke testing",
        "javascripttest-pagetext-unknownaction": "Unknown action \"$1\".",
        "javascripttest-qunit-intro": "mediawiki.org me [$1 testing documentation] ke dekho.",
-       "tooltip-pt-userpage": "Aap ke sadasya panna",
+       "tooltip-pt-userpage": "{{GENDER:|Aap ke user}} panna",
        "tooltip-pt-anonuserpage": "IP jisme se aap edit karta hai ke sadasya panna",
-       "tooltip-pt-mytalk": "Aap ke baat waala panna",
+       "tooltip-pt-mytalk": "{{GENDER:|Aap ke}} baat waala panna",
        "tooltip-pt-anontalk": "Ii IP address se badlao pe salah",
-       "tooltip-pt-preferences": "Hamaar pasand",
+       "tooltip-pt-preferences": "{{GENDER:|Aap ke}} pasand",
        "tooltip-pt-watchlist": "Panna ke suchi jispe aap dhyan rakhaa hae",
-       "tooltip-pt-mycontris": "Aap ke yogdaan ke suchi",
+       "tooltip-pt-mycontris": "{{GENDER:|Aap ke}} yogdaan ke suchi",
+       "tooltip-pt-anoncontribs": "Ii IP address se badlao karaa gais chij ke suchi",
        "tooltip-pt-login": "Aap log in kartaa tab achchha rahataa; lekin jaruri nai hae.",
        "tooltip-pt-logout": "Log out",
        "tooltip-pt-createaccount": "Aap ke ek account banae ke log in kare ke encourage karaa jaae hae; lekin iske jaruri nai hae",
        "tooltip-ca-talk": "Content waala panna ke baare me salah",
-       "tooltip-ca-edit": "Aap ii panna ke badle sakta hai. Meherbaani kar ke bachae se pahile preview button ke kaam me laana.",
+       "tooltip-ca-edit": "Ii panna ke badlo",
        "tooltip-ca-addsection": "Nawaa section suruu karo",
        "tooltip-ca-viewsource": "Ii panna surakchhit hai. Aap iske sooti dekhe sakta hai.",
        "tooltip-ca-history": "Ii panna ke pahile ke badlao",
        "tooltip-t-recentchangeslinked": "Panna jon ki ii panna se jurra hai ke nawaa badlao",
        "tooltip-feed-rss": "Ii panna ke khatir RSS feed",
        "tooltip-feed-atom": "Ii panna ke khatir atom feed",
-       "tooltip-t-contributions": "Ii sadasya ke yogdaan ke suchi dekho",
-       "tooltip-t-emailuser": "Ii user ke lage ek mail bhejo",
+       "tooltip-t-contributions": "Yogdaan ke suchi dekho {{GENDER:$1|ii sadasya se}}",
+       "tooltip-t-emailuser": "Email bhejo {{GENDER:$1|ii sadasya}} ke lage",
        "tooltip-t-info": "Ii panna ke bare me aur jankari",
        "tooltip-t-upload": "File upload karo",
        "tooltip-t-specialpages": "Sab khaas panna ke suchi",
        "tooltip-ca-nstab-category": "Vibhag panna ke dekho",
        "tooltip-minoredit": "Ii badlao ke chhota badlao ke chihna lagao",
        "tooltip-save": "Aapan badlao ke bachao",
+       "tooltip-publish": "Aapan panna ke publish karo",
        "tooltip-preview": "Badlao ke preview karo, bachae se pahile!",
        "tooltip-diff": "Dekhao ki aap kon chij badlaa hae",
        "tooltip-compareselectedversions": "Ii panna ke dui chuna gais version ke antar dekho.",
        "lastmodifiedatby": "Ii panna ke aakhri dafe $3 badlis rahaa $2, $1.",
        "othercontribs": "Ii $1 ke kaam pe based hae.",
        "others": "duusra jane",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|sadasya|sadasya}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|sadasya}} $1",
        "anonusers": "{{SITENAME}} benaam {{PLURAL:$2|sadasya|sadasya}} $1",
        "creditspage": "Panna ke credit",
        "nocredits": "Ii panna ke khatir koi credit ke baare me jaankari nai hai.",
        "spam_reverting": "Pahile waala badalo, jisme $1 se link nai hai, pe karaa jaawe hai",
        "spam_blanking": "Sab badlao jisme $1 se jorr hai, ke mitawa jaawe hai",
        "spam_deleting": "Sab badlao jisme $1 se jorr hai, ke mitawa jaawe hai",
-       "simpleantispam-label": "Anti-spam check.\nIske fill <strong>NAI</strong> karo!",
+       "simpleantispam-label": "Anti-spam check.\nIske fill <strong>nai</strong> karo!",
        "pageinfo-title": "\"$1\" ke khatir jaankari",
        "pageinfo-not-current": "Maaf karna, lekin purana badlao ke baare me ii jaankari nai de saktaa hae.",
        "pageinfo-header-basic": "Basic jaankari",
        "pageinfo-length": "Panna ke lambai (bytes me)",
        "pageinfo-article-id": "Panna ke ID",
        "pageinfo-language": "Panna ke bhasa",
+       "pageinfo-language-change": "badlo",
        "pageinfo-content-model": "Page content model",
+       "pageinfo-content-model-change": "badlo",
        "pageinfo-robot-policy": "Robots se indexing",
        "pageinfo-robot-index": "Ijajat hae",
        "pageinfo-robot-noindex": "Ijajat nai hae",
        "pageinfo-watchers": "Ketnaa jane panna ke dekhe hae",
+       "pageinfo-visiting-watchers": "Etna page wathchers recent edits ke visit karin hai",
        "pageinfo-few-watchers": "$1 {{PLURAL:$1|watcher|watchers}} se kamtii log hae",
+       "pageinfo-few-visiting-watchers": "There may or may not be a watching user visiting recent edits",
        "pageinfo-redirects-name": "Ii panna me etna redirect hae",
        "pageinfo-subpages-name": "Ii panna ke subpage",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
        "pageinfo-protect-cascading-yes": "Haan",
        "pageinfo-protect-cascading-from": "Protections isse cascade hoe hae",
        "pageinfo-category-info": "Category ke bare me jaankari",
+       "pageinfo-category-total": "Sadasya ke total",
        "pageinfo-category-pages": "Ketnaa panna hae",
        "pageinfo-category-subcats": "Etnaa subcategories hae",
        "pageinfo-category-files": "Etnaa file hae",
+       "pageinfo-user-id": "Sadasya ke ID",
        "markaspatrolleddiff": "Mark karo ke pahraa dewa jaawe hai",
        "markaspatrolledtext": "Mark karo ki panna pe pahraa dewa jaawe hai",
+       "markaspatrolledtext-file": "Mark this file version as patrolled",
        "markedaspatrolled": "Mark karo ke pahraa dewa jaawe hai",
        "markedaspatrolledtext": "Pasand karaa gais [[:$1]]  ke badlao pe pahraa dewa jaawe hai",
        "rcpatroldisabled": "Nawaa badlao pe pahraa de ke ijajat nai hai",
        "patrol-log-page": "Pahraa de waala suchi",
        "patrol-log-header": "Ii pahraa dewa gais badlao ke suchi hai.",
        "log-show-hide-patrol": "$1 pahraa de waala suchi",
+       "log-show-hide-tag": "$1 tag log",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Mark karo ki ii revision $3 of $2 patrolled hai?",
        "deletedrevision": "Purana badlao ke mitae dia hai $1",
        "filedeleteerror-short": "File ke mitae me galti hoe gais: $1",
        "filedeleteerror-long": "File ke mitae ke time garrbarr hoe gais:\n\n$1",
        "svg-long-error": "SCG file valid nai hae: $1",
        "show-big-image": "Original file",
        "show-big-image-preview": "Ii preview ke size: $1",
+       "show-big-image-preview-differ": "Size of this $3 preview of this $2 file: $1.",
        "show-big-image-other": "Duusra {{PLURAL:$2|resolution|resolutions}}: $1",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "Ghuum ghumae ke wahii jagha pe aawe hae",
        "newimages-legend": "Chaalo",
        "newimages-label": "Filename (nai to iske ek hissa):",
        "newimages-showbots": "Bots se upload dekhawa jaae hae",
+       "newimages-hidepatrolled": "Patrolled uploads ke lukao",
        "noimages": "Koi chij dekhe ke nai hai.",
+       "gallery-slideshow-toggle": "Toggle thumbnails",
        "ilsubmit": "Khojo",
        "bydate": "tarik se",
        "sp-newimages-showfrom": " $2, $1 se suruu kar ke nawaa file ke dekhao",
        "exif-compression-4": "CCITT Group 4 fax ke encoding",
        "exif-copyrighted-true": "Copyright karaa gais hae",
        "exif-copyrighted-false": "Copyright status ke nai set karaa gais hae",
+       "exif-photometricinterpretation-1": "Kariyaa aur ujjar (Kariyaa 0 hai)",
        "exif-unknowndate": "Taarik nai maalum",
        "exif-orientation-1": "Saamaan",
        "exif-orientation-2": "Baraabar ultawa gais hae",
        "confirmemail_body_set": "Koi, hoe sake aap IP address $1 se, ek account \"$2\" with this email address on {{SITENAME}} ke set karis hae.\n\nIi confirm kare ke khatir ki asliyat me ii acount aap ke hae, {{SITENAME}} me email features ke activate karo, aur aapan browser me ii link ke kholo:\n\n$3\n\nAgar aapa ii account ke nai register karaa hae, ii link ke follow karo aur email address confirmation ke cancel karo:\n\n$5\n\nIi confirmation code $4 ke expire hoi.",
        "confirmemail_invalidated": "Email address confirmation ke cancel kae dewa gais hae",
        "invalidateemail": "Email confirmation ke cancel karo",
+       "notificationemail_subject_changed": "{{SITENAME}} ke registered email address ke badal dewa gais hai",
+       "notificationemail_subject_removed": "{{SITENAME}} ke registered email address ke hatae dewa gais hai",
+       "notificationemail_body_changed": "Koi jan, hoe sake aap, IP address $1 se,\nemail address ke badlis hai account \"$2\" to \"$3\" {{SITENAME}} pe.\n\nAgar ii aap nai hai to ek site administrator ke contact karo",
+       "notificationemail_body_removed": "Koi jan, hoe sake aap, IP address $1 se,\nemail address ke hate diis hai, account \"$2\" {{SITENAME}} pe.\n\nAgar ii aap nai hai to ek site administrator ke contact karo",
        "scarytranscludedisabled": "[Interwiki transcluding ke disable kar dewa gais hae]",
        "scarytranscludefailed": "[Template fetch $1 ke khatir fail hoe gais hae]",
        "scarytranscludefailed-httpstatus": "[$1: HTTP $2 ke khatir template fetch fail hoe gais hae]",
        "scarytranscludetoolong": "[URL bahut lambaa hae]",
        "deletedwhileediting": "'''Chetauni:''' Aap ke editing suruu kare ke baad ii panna ke delete kar dewa gais hae!",
-       "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) mitae dewa gais ii pannaa aap ke badlao suruu kare ke baad, ii kaaran se: ''$2''\nMeharbaani kar ke confirm karo ki aap ii panna ke fir banae mangtaa hae.",
-       "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) mitae dewa gais ii pannaa aap ke badlao suruu kare ke baad.\nMeharbaani kar ke confirm karo ki aap ii panna ke fir banae mangtaa hae.",
+       "confirmrecreate": "Sadasya [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|mitais}} ii panna after you started editing with reason:\n: <em>$2</em>\nMeharbaani kar ke ii confirm karo ki aap asliyat me ii panna ke fir se banae mangtaa hai.",
+       "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]){{GENDER:$1|deleted}} this page after you started editing. Please confirm that you really want to recreate this page.",
        "recreate": "Fir se banao",
        "confirm_purge_button": "Thik hae",
        "confirm-purge-top": "Ii panna ke cache ke mitao",
        "confirm-watch-top": "Ii panna ke aap ke dhyan suchi me jorro?",
        "confirm-unwatch-button": "Thiik hae",
        "confirm-unwatch-top": "Ii panna ke aap ke dhyan suchi se hatao?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Ii panna ke badlao ke pahile jaise karo?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pahile waala panna",
        "imgmultipagenext": "aage waala panna →",
        "watchlistedit-raw-done": "Aap ke watchlist ke update kar dewa gais hae.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
-       "watchlistedit-clear-title": "Watchlist ke clear karaa gais hae",
+       "watchlistedit-clear-title": "Watchlist ke clear karo",
        "watchlistedit-clear-legend": "Watchlist ke clear karo",
        "watchlistedit-clear-explain": "Aap ke watchlist me se sab title ke hatae dewa jaai",
        "watchlistedit-clear-titles": "Titles:",
        "watchlisttools-edit": "Dhyan suchi ke dekho aur badlo",
        "watchlisttools-raw": "Dhyan suchi ke apne sampadan karo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "timezone-local": "Local",
        "duplicate-defaultsort": "'''Chetauni:''' Default sort key \"$2\" pahile ke default sort key \"$1\" ke override kare hae.",
        "duplicate-displaytitle": "<strong>Chetauni:</strong> Display title \"$2\" pahile ke display title \"$1\" ke override kare hae.",
+       "restricted-displaytitle": "<strong>Chetauni:</strong> Display title \"$1\" was ignored since it is not equivalent to the page's actual title.",
        "invalid-indicator-name": "<strong>Error:</strong> Panna status indicators' <code>naam</code> attribute khaali nai rahe sake hae.",
        "version": "Badlao",
        "version-extensions": "Installed extensions",
        "version-libraries": "Installed libraries",
        "version-libraries-library": "Library",
        "version-libraries-version": "Version",
+       "version-libraries-license": "License",
+       "version-libraries-description": "Baare me",
+       "version-libraries-authors": "Likhe waale",
        "redirect": "File, sadasya, panna, nai to, revision ID se redirect",
        "redirect-summary": "Ii khaas panna ek file (given the filename), panna (given a revision ID or page ID), nai to, sadasya ke panna (given a numeric user ID) pe redirect hoe hae.  Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Jaao",
        "redirect-page": "Sadasya ke ID",
        "redirect-revision": "Panna ke revision",
        "redirect-file": "Filename",
+       "redirect-logid": "Log ID",
        "redirect-not-exists": "Value ke nai paawa gais hae",
        "fileduplicatesearch": "Duplicate files ke khojo",
        "fileduplicatesearch-summary": "Duplicate files based on hash values ke khojo.",
        "tag-filter": "[[Special:Tags|Tag]] filter karo:",
        "tag-filter-submit": "Filter",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tag-mw-contentmodelchange": "Content model ke badlao",
+       "tag-mw-contentmodelchange-description": "Badlao, jon ki [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel change the content model] of a page",
        "tags-title": "Tags",
        "tags-intro": "Ii panna uu tag ke list kare hae jiske software edit with, aur their meaning se mark kare hae.",
        "tags-tag": "Tag ke naam",
        "tags-actions-header": "Actions",
        "tags-active-yes": "Haan",
        "tags-active-no": "Nai",
-       "tags-source-extension": "Ek extension se define hoe hae",
+       "tags-source-extension": "Software define karis hai",
        "tags-source-manual": "Sadasya aur bot se manually apply karaa jaawe hae",
        "tags-source-none": "Ab iske kaam me nai lawa jaae hae",
        "tags-edit": "badlo",
        "tags-deactivate": "deactivate karo",
        "tags-hitcount": "$1 {{PLURAL:$1|badlao|badlao}}",
        "tags-manage-no-permission": "Aap ke change tags ke manage kare ke ijaajat nai hae.",
+       "tags-manage-blocked": "Aap tags ke nai badle saktaa hai, jab {{GENDER:$1|aap}} blocked hai.",
        "tags-create-heading": "Ek nawaa tag ke banao",
        "tags-create-explanation": "Default se, jon nawaa tag banawa gais hae ke sadasya aur bots ke kaam me laae khatir dewa jaai.",
        "tags-create-tag-name": "Tag ke naam:",
        "tags-delete-title": "Tag ke delete karo",
        "tags-delete-explanation-initial": "Aap tag \"$1\" ke database se mitae waala hae.",
        "tags-delete-explanation-in-use": "Iske {{PLURAL:$2|$2 revision or log entry|all $2 revisions and/or log entries}} se hatae dewa jaai jahaan pe it is currently applied.",
+       "tags-delete-explanation-warning": "Ii action <strong>irreversible</strong> hai aur <strong>cannot be undone</strong>, not even by database administrators. Be certain this is the tag you mean to delete.",
+       "tags-delete-explanation-active": "<strong>Ii tag \"$1\" abhi bhi active hai, and will continue to be applied in the future.</strong> To stop this from happening, go to the place(s) where the tag is set to be applied, and disable it there.",
        "tags-delete-reason": "Kaaran:",
+       "tags-delete-submit": "Irreversibly delete this tag",
+       "tags-delete-not-allowed": "Tags jiske ek an extension  se define karaa gais hai, ke nai mataawa jaae sake hai unless the extension specifically allows it.",
+       "tags-delete-not-found": "Tag \"$1\" nai hai.",
+       "tags-delete-too-many-uses": "Tag \"$1\" ke $2 {{PLURAL:$2|revision|revisions}} time se jaada apply karaa gais hai, jiske matalab hai is iske mitaawa nai jaae sake hai.",
+       "tags-delete-warnings-after-delete": "Tag \"$1\" ke mitae dewa gais rahaa, but the following {{PLURAL:$2|warning was|warnings were}} encountered:",
+       "tags-delete-no-permission": "Aap ke change tags ke mitae ke ijaajat nai hae.",
+       "tags-activate-title": "Tag ke activate karo",
+       "tags-activate-question": "Aap tag \"$1\" ke activate kare waala hai.",
+       "tags-activate-reason": "Kaaran:",
+       "tags-activate-not-allowed": "Tag \"$1\" ke nai activate karaa jaae sake hai.",
+       "tags-activate-not-found": "Tag \"$1\" nai hai.",
+       "tags-activate-submit": "Activate karo",
+       "tags-deactivate-title": "Tag ke Deactivate karo",
+       "tags-deactivate-question": "Aap tag \"$1\" ke deactivate kare waala hai.",
+       "tags-deactivate-reason": "Kaaran:",
+       "tags-deactivate-not-allowed": "Tag \"$1\" ke deactivate nai karaa jaae sake hai.",
+       "tags-deactivate-submit": "Deactivate karo",
+       "tags-apply-no-permission": "Aap ke lage, aapan badlao ke saathe, tag ke badle ke ijaajat nai hai.",
+       "tags-apply-blocked": "Aap ke lage, aapan badlao ke saathe, tag ke badle ke ijaajat nai hai jab ke {{GENDER:$1|aap}} blocked hai.",
+       "tags-apply-not-allowed-one": "Tag \"$1\" ke manually apply kare ke ijaajat nai hai.",
+       "tags-apply-not-allowed-multi": "Niche ke {{PLURAL:$2|tag}} ke manually apply nai karaa jaae sake hai: $1",
+       "tags-update-no-permission": "Aap ke lage individual revisions nai to log entries pe tags ke jorre aur hatae ke adhikaar nai hai.",
+       "tags-update-blocked": "Aap tags ke nai hatae saktaa hai, jab {{GENDER:$1|aap}} blocked hai.",
+       "tags-update-add-not-allowed-one": "Tag \"$1\" ke manually jorre ke ijaajat nai hai.",
+       "tags-update-add-not-allowed-multi": "Niche ke {{PLURAL:$2|tag}} ke manually jorra nai jaae sake hai: $1",
+       "tags-update-remove-not-allowed-one": "Tag \"$1\" ke hatae ke adhikaae nai hai.",
+       "tags-update-remove-not-allowed-multi": "Niche ke {{PLURAL:$2|tag}} ke manually hataawa nai jaae sake hai: $1",
+       "tags-edit-title": "Tags ke badlo",
+       "tags-edit-manage-link": "Tags ke manage karo",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Chunaa gais badlao}} [[:$2]] ke:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Chuna gais log event}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|Ii badlao|sab $1 badlao}} se tag ke jorro , nai to hatao",
+       "tags-edit-logentry-legend": "{{PLURAL:$1|Ii log entry se|sab $1 log entry}} se tag ke jorro, nai to hatao",
+       "tags-edit-existing-tags": "Abhi ke tag:",
+       "tags-edit-existing-tags-none": "<em>Kuchh bhi nai</em>",
+       "tags-edit-new-tags": "Nawaa tag:",
+       "tags-edit-add": "Ii tag ke jorro:",
+       "tags-edit-remove": "Ii tag ke hatao:",
+       "tags-edit-remove-all-tags": "(sab tag ke hatao)",
+       "tags-edit-chosen-placeholder": "Kuchh tag ke select karo",
+       "tags-edit-chosen-no-results": "Uu match se koi tag nai milaa",
+       "tags-edit-reason": "Kaaran:",
+       "tags-edit-revision-submit": "{{PLURAL:$1|Ii badlao|$1 badlao}} pe changes ke apply karo",
+       "tags-edit-logentry-submit": "{{PLURAL:$1|Ii log entry|$1 log entry}} pe changes ke apply karo",
+       "tags-edit-success": "Badlao ke apply kar dewa gais hai.",
+       "tags-edit-failure": "Balao ke nai apply karaa jaae sakaa gais hai:\n$1",
+       "tags-edit-nooldid-title": "Target revision jon ki valid nai hai",
+       "tags-edit-nooldid-text": "Aap saait koi target revision ke nai specify karaa hai, jispe ii function perfom karaa jaae sake hai, nai to specified revision does not exist.",
+       "tags-edit-none-selected": "Meharbaani kar ke ek tag ke chuno jiske jorra, nai to, hataawa jaae sake hai.",
        "comparepages": "Panna ke biich me antar dekho",
        "compare-page1": "Panna 1",
        "compare-page2": "Panna 2",
        "htmlform-cloner-create": "Aur add karo",
        "htmlform-cloner-delete": "Remove karo",
        "htmlform-cloner-required": "Kamti se kamti ek value ke jaruri hae",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "Jon value ke aap specify karaa hai, ke date nai maana jaawe hai. Format YYYY-MM-DD ke use kare ke kosis karo.",
+       "htmlform-time-invalid": "Jon value ke aap specify karaa hai, ke time nai maana jaawe hai. Format HH:MM:SS ke use kar ke format kare ke kosis karo.",
+       "htmlform-datetime-invalid": "Jon value ke aap specify karaa hai, ke date nai maana jaawe hai. Format YYYY-MM-DD HH-MM-SS ke use kar ke format kare ke kosis karo.",
+       "htmlform-date-toolow": "Jon value ke aap specify karaa hai, sab se puraana allowed date $1 se pahile hai:",
+       "htmlform-date-toohigh": "Jon value ke aap specify karaa hai, sab se nawaa allowed date ke baad hai:$1",
+       "htmlform-time-toolow": "Jon value ke aap specify karaa hai, sab se puraana allowed time $1 se pahile hai",
+       "htmlform-time-toohigh": "Jon value ke aap specify karaa hai, sab se nawaa allowed time $1 ke baad hai.",
+       "htmlform-datetime-toolow": "Jon value ke aap specify karaa hai, sab se puraana allowed date $1 se pahile hai.",
+       "htmlform-datetime-toohigh": "Jon value ke aap specify karaa hai, sab se nawaa allowed date $1 ke baad hai.",
+       "htmlform-title-badnamespace": "[[:$1]] is not in the \"{{ns:$2}}\" namespace.",
+       "htmlform-title-not-creatable": "\"$1\" is not a creatable page title",
+       "htmlform-title-not-exists": "$1 nai hae",
+       "htmlform-user-not-exists": "<strong>$1</strong> nai hai.",
+       "htmlform-user-not-valid": "<strong>$1</strong> valid username nai hai.",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} panna $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting",
        "logentry-delete-restore": "$1 {{GENDER:$2|restored}} panna $3",
        "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} panna $3: $4 pe",
        "revdelete-uname-unhid": "username ke lukawa gais hae",
        "revdelete-restricted": "sysops pe llabu restrictions",
        "revdelete-unrestricted": "sysops se hatawa gae rukawat",
+       "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|unblocked}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|imported}} $3 by file upload",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|imported}} $3 by file upload ($4 {{PLURAL:$4|revision|revisions}})",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|imported}} $3 from another wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|imported}} $3 from $5 ($4 {{PLURAL:$4|revision|revisions}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|merged}} $3 into $4 (revisions up to $5)",
        "logentry-move-move": "$1 {{GENDER:$2|moved}} panna $3 se $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} panna $3 se $4 without leaving a redirect",
        "logentry-newusers-create2": "Sadasya $3 ke account  {{GENDER:$2|created}} ke $1 banais hae.",
        "logentry-newusers-byemail": "Sadasya $3 ke account {{GENDER:$2|created}} ke $1 banais hae  aur password ke email se bheja gais hae",
        "logentry-newusers-autocreate": "Sadasya $1 ke account {{GENDER:$2|created}} ke automatically banawa gais hae",
-       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group ke membership $3 ke khatir $4 se lai ke $5 talak",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|moved}} protection settings from $4 to $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|removed}} protection from $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protected}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|changed}} protection level for $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|changed}} protection level for $3 $4 [cascading]",
+       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for {{GENDER:$6|$3}} from $4 to $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group ke membership $3 ke khatir",
        "logentry-rights-autopromote": "$1 ke apne se $4 se $5 {{GENDER:$2|promoted karaa gais hae}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|upload karaa gais hae}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|uploaded}} a new version of $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|upload karaa gais hae}} $3",
+       "log-name-managetags": "Tag management log",
+       "log-description-managetags": "Ii panna me [[Special:Tags|tags]] ke suchi hai.\nThe log contains only actions carried out manually by an administrator; tags may be created or deleted by the wiki software without an entry being recorded in this log.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|created}} the tag \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|deleted}} the tag \"$4\" (removed from $5 {{PLURAL:$5|revision or log entry|revisions and/or log entries}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|activated}} the tag \"$4\" for use by users and bots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deactivated}} the tag \"$4\" for use by users and bots",
+       "log-name-tag": "Tag log",
+       "log-description-tag": "Ii panna sadasya ke dekhae hai jab uu [[Special:Tags|tags]] ke jorre, nai to, hatae hai, individual revision, nai to, log entries se. The log does not list tagging actions when they occur as part of an edit, deletion, or similar action.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to revision $4 of page $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to log entry $5 of page $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from revision $4 of page $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from log entry $5 of page $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|updated}} tags on revision $4 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|updated}} tags on log entry $5 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)",
        "rightsnone": "(koi nai hai)",
        "revdelete-summary": "summary ke badlo",
+       "rightslogentry-temporary-group": "$1 (temporary, until $2)",
        "feedback-adding": "Panna me subject jorra jaawe hae...",
+       "feedback-back": "Piichhe",
        "feedback-bugcheck": "Julum! Khaali ii check karna ki ii ek pahile se jaana waala bugs me se nai hae [$1 known bugs].",
        "feedback-bugnew": "Ham karaa hae. Nawaa bug ke report karo",
        "feedback-bugornote": "Agar aap ek technical problem ke detail me describe kare mangtaa hae tab meharbaani kar ke [$1 report a bug].\n\nNai to, aap niche ke sahaj form ke kaam me laae saktaa hae. Aap ke comment ke, aap ke naam ke saathe, panna \"[$3 $2]\" me jorra jaai.",
        "feedback-cancel": "Cancel karo",
        "feedback-close": "Kar dewa gais hae",
+       "feedback-external-bug-report-button": "Ek technical task ke file karo",
+       "feedback-dialog-title": "Feedback ke submit karo",
+       "feedback-dialog-intro": "App niche ke easy form ke kaam me laae ke aapan feedback bheje saktaa hai. App ke comment ke panna \"$1\" me, aap ke username ke saathe jorra jaai.",
        "feedback-error1": "Error: Unrecognized result from API",
        "feedback-error2": "Error: Edit fail hoi gais hae",
        "feedback-error3": "Error: API se koi response nai mila",
+       "feedback-error4": "Error: Dewa gais feedback title ke post nai kare sakaa",
        "feedback-message": "Sandes:",
        "feedback-subject": "Subject:",
        "feedback-submit": "Submit karo",
+       "feedback-terms": "Ham samajhtaa hai ki hamaar user agent jaankaari me hamaar exact browser aur operating system version ke jaankaari rahii aur iske hamaar feedback ke saathe publically share karaa jaai.",
+       "feedback-termsofuse": "Ham Terms of Use ke niche feedback provide karegaa.",
        "feedback-thanks": "Dhanyabaad! Aap ke feedback ke panna \"[$2 $1]\" me post karaa gais hae.",
-       "searchsuggest-search": "Khojo",
+       "feedback-thanks-title": "Dhanbaad!",
+       "feedback-useragent": "User agent:",
+       "searchsuggest-search": "{{SITENAME}} me khojo",
        "searchsuggest-containing": "isme hae.....",
-       "api-error-badaccess-groups": "Aap ke ii wiki me file upload kare ke ijajat nai hae.",
        "api-error-badtoken": "Internal error: Bad token.",
-       "api-error-copyuploaddisabled": "Uploading by URL ke ii server me disable kar dewa gais hae.",
-       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
-       "api-error-duplicate-archive": "There {{PLURAL:$1|was another file|were some other files}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-       "api-error-empty-file": "Jon file ke aap submit karaa rahaa, khaali hae.",
        "api-error-emptypage": "Nawaa, khaali panna ke banae ke ijajat nai hae.",
-       "api-error-fetchfileerror": "Internal error: File khoje ke time kuch wrong hoe gais hae.",
-       "api-error-fileexists-forbidden": "Ek file, jiske naam \"$1\" hae abhi hae, aur iske overwrite nai karaa jaae sake hae.",
-       "api-error-fileexists-shared-forbidden": "Ek file, jiske naam \"$1\" hae abhi hae aur file repository me shared hae, aur iske overwrite nai karaa jaae sake hae.",
-       "api-error-file-too-large": "Jon file ke aap submit karaa hae bahut barraa hae.",
-       "api-error-filename-tooshort": "Filename bahut chhota hae.",
-       "api-error-filetype-banned": "Ii rakam ke file banned hae."
+       "api-error-publishfailed": "Internal error: Server temporary file ke publish nai kare sakis hai.",
+       "api-error-stashfailed": "Internal error: Server temporary file ke store nai kare sakis hai.",
+       "api-error-unknown-warning": "Unknown warning: \"$1\".",
+       "api-error-unknownerror": "Unknown error: \"$1\".",
+       "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
+       "duration-hours": "$1 {{PLURAL:$1|ghantaa}}",
+       "duration-days": "$1 {{PLURAL:$1|din}}",
+       "duration-weeks": "$1 {{PLURAL:$1|haptaa}}",
+       "duration-years": "$1 {{PLURAL:$1|saal}}",
+       "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
+       "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
+       "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
+       "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
+       "limitreport-title": "Parser profiling data:",
+       "limitreport-cputime": "CPU time usage",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-walltime": "Real time usage",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-ppvisitednodes": "Preprocessor visited node count",
+       "limitreport-ppgeneratednodes": "Preprocessor generated node count",
+       "limitreport-postexpandincludesize": "Post-expand include size",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-templateargumentsize": "Template argument size",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-expansiondepth": "Highest expansion depth",
+       "limitreport-expensivefunctioncount": "Expensive parser function count",
+       "expandtemplates": "Expand templates",
+       "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
+       "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
+       "expand_templates_input": "Input text:",
+       "expand_templates_output": "Natiija",
+       "expand_templates_xml_output": "XML output",
+       "expand_templates_html_output": "Raw HTML output",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Comment ke hatao",
+       "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
+       "expand_templates_generate_xml": "Show XML parse tree",
+       "expand_templates_generate_rawhtml": "raw HTML ke dekhao",
+       "expand_templates_preview": "Jhalak dekhao",
+       "expand_templates_preview_fail_html": "<em>Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai, preview ke lukae dewa gais hai as a precaution against JavaScript attacks.</em>\n<strong>Agar ii kanuni badlao hai, tab fir se kosis karna.</strong>\nAgar ii fir bhi kaam nai kare, tab [[Special:UserLogout|logging out]] aur logging back in ke kosis karna, aur ii check karna ki ii site ke khaatir cookies enabled hai.",
+       "expand_templates_preview_fail_html_anon": "<em>Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai aur aap logged in nai hai, tab preview ke lukae dewa gais hai as a precaution against JavaScript attacks.</em>\n<strong>Agar ii kanuni badlao hai, tab [[Special:UserLogin|log in]] karna aur fir se kosis karna </strong>",
+       "expand_templates_input_missing": "Aap ke kuchh input text de ke parri.",
+       "pagelanguage": "Panna ke bhasa badlo",
+       "pagelang-name": "Panna",
+       "pagelang-language": "Bhasa",
+       "pagelang-use-default": "Default bhasa ke use karo",
+       "pagelang-select-lang": "Bhasa ke chuno",
+       "pagelang-reason": "Kaaran",
+       "pagelang-submit": "Submit karo",
+       "pagelang-nonexistent-page": "Panna $1 nai hai.",
+       "pagelang-unchanged-language": "Panna $1 is already set to language $2.",
+       "pagelang-unchanged-language-default": "The panna $1 is already set to the wiki's default content language.",
+       "pagelang-db-failed": "Database panna ke bhasa ke nai badle sakis.",
+       "right-pagelang": "Panna ke bhasa badlo",
+       "action-pagelang": "panna ke bhasa badlo",
+       "log-name-pagelang": "Bhasa badlao ke log",
+       "log-description-pagelang": "Ii panna ke bhasa me badlao ke log hai.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} the language of $3 from $4 to $5",
+       "default-skin-not-found": "Whoops! aap ke wiki ke khaatir default skin, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, available nai hai.\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
+       "default-skin-not-found-no-skins": "Whoops! Aap ke wiki ke default skin, defined in <code>$wgDefaultSkin</code> as <code>$1</code>, available nai hai.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>disabled</strong>)",
+       "mediastatistics": "Media statistics",
+       "mediastatistics-summary": "Uploaded file types ke statistics. This only includes the most recent version of a file. Old or deleted versions of files are excluded.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)$3$3$3",
+       "mediastatistics-bytespertype": "Total file size for this section: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Total file size for all files: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
+       "mediastatistics-table-mimetype": "MIME ke rakam:",
+       "mediastatistics-table-extensions": "Possible extensions",
+       "mediastatistics-table-count": "Etnaa file hai",
+       "mediastatistics-table-totalbytes": "Combined size",
+       "mediastatistics-header-unknown": "Nai maluum",
+       "mediastatistics-header-bitmap": "Bitmap images",
+       "mediastatistics-header-drawing": "Drawings (vector images)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videos",
+       "mediastatistics-header-multimedia": "Rich media",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Textual",
+       "mediastatistics-header-executable": "Executables",
+       "mediastatistics-header-archive": "Compressed formats",
+       "mediastatistics-header-total": "Sab file",
+       "json-warn-trailing-comma": "$1 trailing {{PLURAL:$1|comma was|commas were}} removed from JSON",
+       "json-error-unknown": "JSON me kuchh garrbarr hai. Error: $1",
+       "json-error-depth": "Maximum stack depth ke exceed kar dewa gais hai.",
+       "json-error-state-mismatch": "Invalid, nai to, malformed JSON",
+       "json-error-ctrl-char": "Control character error, possibly incorrectly encoded",
+       "json-error-syntax": "Syntax me galti",
+       "json-error-utf8": "Malformed UTF-8 characters, possibly incorrectly encoded",
+       "json-error-recursion": "One or more recursive references in the value to be encoded",
+       "json-error-inf-or-nan": "One or more NAN or INF values in the value to be encoded",
+       "json-error-unsupported-type": "A value of a type that cannot be encoded was given",
+       "headline-anchor-title": "Ii section pe link karo",
+       "special-characters-group-latin": "Latin",
+       "special-characters-group-latinextended": "Latin extended",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Symbols",
+       "special-characters-group-greek": "Greek",
+       "special-characters-group-greekextended": "Greek extended",
+       "special-characters-group-cyrillic": "Cyrillic",
+       "special-characters-group-arabic": "Arabic",
+       "special-characters-group-arabicextended": "Arabic extended",
+       "special-characters-group-persian": "Persian",
+       "special-characters-group-hebrew": "Hebrew",
+       "special-characters-group-bangla": "Bangla",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en dash",
+       "special-characters-title-emdash": "em dash",
+       "special-characters-title-minus": "minus sign",
+       "mw-widgets-dateinput-no-date": "Koi date ke select nai karaa gais hai",
+       "mw-widgets-mediasearch-input-placeholder": "Media ke khojo",
+       "mw-widgets-mediasearch-noresults": "Koi result nai milaa.",
+       "mw-widgets-titleinput-description-new-page": "ii panna abhi nai hai",
+       "mw-widgets-titleinput-description-redirect": "$1 pe redirect karo",
+       "mw-widgets-categoryselector-add-category-placeholder": "Category me jorro...",
+       "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
+       "sessionprovider-generic": "$1 sessions",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
+       "sessionprovider-nocookies": "Cookies disabled hoi. Ensure you have cookies enabled and start again.",
+       "randomrootpage": "Random root page",
+       "log-action-filter-block": "Type of block:",
+       "log-action-filter-contentmodel": "Type of content model change:",
+       "log-action-filter-delete": "Type of deletion:",
+       "log-action-filter-import": "Type of import:",
+       "log-action-filter-managetags": "Type of tag management action:",
+       "log-action-filter-move": "Type of move:",
+       "log-action-filter-newusers": "Type of account creation:",
+       "log-action-filter-patrol": "Type of patrol:",
+       "log-action-filter-protect": "Type of protection:",
+       "log-action-filter-rights": "Type of right change:",
+       "log-action-filter-suppress": "Type of suppression:",
+       "log-action-filter-upload": "Type of upload:",
+       "log-action-filter-all": "Sab",
+       "log-action-filter-block-block": "Block",
+       "log-action-filter-block-reblock": "Block modification",
+       "log-action-filter-block-unblock": "Unblock",
+       "log-action-filter-contentmodel-change": "Content model ke badlao",
+       "log-action-filter-contentmodel-new": "Creation of page with non-default content model",
+       "log-action-filter-delete-delete": "Page deletion",
+       "log-action-filter-delete-delete_redir": "Redirect overwrite",
+       "log-action-filter-delete-restore": "Page undeletion",
+       "log-action-filter-delete-event": "Log deletion",
+       "log-action-filter-delete-revision": "Revision deletion",
+       "log-action-filter-import-interwiki": "Transwiki import",
+       "log-action-filter-import-upload": "Import by XML upload",
+       "log-action-filter-managetags-create": "Tag creation",
+       "log-action-filter-managetags-delete": "Tag deletion",
+       "log-action-filter-managetags-activate": "Tag activation",
+       "log-action-filter-managetags-deactivate": "Tag deactivation",
+       "log-action-filter-move-move": "Move without overwriting of redirects",
+       "log-action-filter-move-move_redir": "Move with overwriting of redirects",
+       "log-action-filter-newusers-create": "Creation by anonymous user",
+       "log-action-filter-newusers-create2": "Registered user banais hai",
+       "log-action-filter-newusers-autocreate": "Automatically banaawa gais hai",
+       "log-action-filter-newusers-byemail": "I banaawa gais hai with password sent by e-mail",
+       "log-action-filter-patrol-patrol": "Manual patrol",
+       "log-action-filter-patrol-autopatrol": "Automatic patrol",
+       "log-action-filter-protect-protect": "Protection",
+       "log-action-filter-protect-modify": "Protection modification",
+       "log-action-filter-protect-unprotect": "Unprotection",
+       "log-action-filter-protect-move_prot": "Moved protection",
+       "log-action-filter-rights-rights": "Manual change",
+       "log-action-filter-rights-autopromote": "Automatic change",
+       "log-action-filter-suppress-event": "Log suppression",
+       "log-action-filter-suppress-revision": "Revision suppression",
+       "log-action-filter-suppress-delete": "Page suppression",
+       "log-action-filter-suppress-block": "User suppression by block",
+       "log-action-filter-suppress-reblock": "User suppression by reblock",
+       "log-action-filter-upload-upload": "Nawaa upload",
+       "log-action-filter-upload-overwrite": "Reupload",
+       "authmanager-authn-not-in-progress": "Authentication progress me nai hai, nai to, session data has been lost. Please start again from the beginning.",
+       "authmanager-authn-no-primary": "Supplied credentials ke authenticate nai kare sakaa hai.",
+       "authmanager-authn-no-local-user": "Supply karaa gais credentials are not associated with any user on this wiki.",
+       "authmanager-authn-no-local-user-link": "Supply karaa gais credentials are valid but are not associated with any user on this wiki. Login in a different way, or create a new user, and you will have an option to link your previous credentials to that account.",
+       "authmanager-authn-autocreate-failed": "Auto-creation of a local account failed: $1",
+       "authmanager-change-not-supported": "Supply karaa gais credentials cannot be changed, as nothing would use them.",
+       "authmanager-create-disabled": "Nawaa account banae ke disable kar dewa gais hai.",
+       "authmanager-create-from-login": "Account banae ke khaatir, fields ke fill karo.",
+       "authmanager-create-not-in-progress": "Account creation progress me nai hai, nai to, session data has been lost. Please start again from the beginning.",
+       "authmanager-create-no-primary": "Supplied credentials ke account banae me nai kaam me laae sakaa.",
+       "authmanager-link-no-primary": "Supplied credentials ke account linking me nai kaam me laae sakaa.",
+       "authmanager-link-not-in-progress": "Account linking progress me nai hai, nai to, session data has been lost. Meharbaani kar ke suruu se suruu karo.",
+       "authmanager-authplugin-setpass-failed-title": "Pasword ke nai badle sakaa",
+       "authmanager-authplugin-setpass-failed-message": "The authentication plugin denied the password change.",
+       "authmanager-authplugin-create-fail": "The authentication plugin denied the account creation.",
+       "authmanager-authplugin-setpass-denied": "The authentication plugin does not allow changing passwords.",
+       "authmanager-authplugin-setpass-bad-domain": "Domain invalid hai.",
+       "authmanager-autocreate-noperm": "Automatic account creation, allowed nai hai.",
+       "authmanager-autocreate-exception": "Automatic account creation ke temporarily disable kar dewa gais hai, due to prior errors.",
+       "authmanager-userdoesnotexist": "User account \"$1\" abhi registered nai hai",
+       "authmanager-userlogin-remembermypassword-help": "Whether the password should be remembered for longer than the length of the session.",
+       "authmanager-username-help": "Authentication ke khaatir username.",
+       "authmanager-password-help": "Authentication ke khaatir password.",
+       "authmanager-domain-help": "External authentication ke khaatoir domain.",
+       "authmanager-retype-help": "Confirm kare ke khaatir paasword fir se likho.",
+       "authmanager-email-label": "Email",
+       "authmanager-email-help": "Email address",
+       "authmanager-realname-label": "Asli naam",
+       "authmanager-realname-help": "Sadasya ke aslii naam",
+       "authmanager-provider-password": "Password-based authentication",
+       "authmanager-provider-password-domain": "Password- and domain-based authentication",
+       "authmanager-provider-temporarypassword": "Kachchaa password",
+       "authprovider-confirmlink-message": "Abhi haali ke login attempts ke dekh ke, the following accounts can be linked to your wiki account. Linking them enables logging in via those accounts. Please select which ones should be linked.",
+       "authprovider-confirmlink-request-label": "Accounts, jiske link kare ke chaahi",
+       "authprovider-confirmlink-success-line": "$1: Linked successfully.",
+       "authprovider-confirmlink-failed": "Account linking nai hoe paais: $1",
+       "authprovider-confirmlink-ok-help": "Continue after displaying linking failure messages.",
+       "authprovider-resetpass-skip-label": "Skip karo",
+       "authprovider-resetpass-skip-help": "Resetting the password ke skip karo.",
+       "authform-nosession-login": "Authentication successful rahaa, but your browser cannot \"remember\" being logged in.\n\n$1",
+       "authform-nosession-signup": "Account ke banae dewaa gais, but your browser cannot \"remember\" being logged in.\n\n$1",
+       "authform-newtoken": "Missing token. $1",
+       "authform-notoken": "Missing token",
+       "authform-wrongtoken": "Wrong token",
+       "specialpage-securitylevel-not-allowed-title": "Not allowed",
+       "specialpage-securitylevel-not-allowed": "Maaf karna, app ke ii panna me aae ke ijaajat nai hai, because your identity could not be verified.",
+       "authpage-cannot-login": "Login ke suruu nai kare sakaa.",
+       "authpage-cannot-login-continue": "Unable to continue login. Your session most likely timed out.",
+       "authpage-cannot-create": "Account creation ke start nai kare sakaa.",
+       "authpage-cannot-create-continue": "Account creation ke continue nai kare saktaa. Your session most likely timed out.",
+       "authpage-cannot-link": "Account linking ke suruu nai kare sakaa.",
+       "authpage-cannot-link-continue": "Account linking ke continue nai kare saktaa. Your session most likely timed out.",
+       "cannotauth-not-allowed-title": "Ijaajat nai hai",
+       "cannotauth-not-allowed": "Aap ke ii panna ke kaam me laae ke adhikaar nai hai.",
+       "changecredentials": "Credentials ke badlo",
+       "changecredentials-submit": "Credentials ke badlo",
+       "changecredentials-invalidsubpage": "$1 is not a valid credential type.",
+       "changecredentials-success": "App ke credentials ke badal dewa gais hai.",
+       "removecredentials": "Credentials ke hatao",
+       "removecredentials-submit": "Credentials ke hatao",
+       "removecredentials-invalidsubpage": "$1 valid credential type nai hai.",
+       "removecredentials-success": "App ke credentials ke hatae dewa gais hai.",
+       "credentialsform-provider": "Credentials type:",
+       "credentialsform-account": "Account naam:",
+       "cannotlink-no-provider-title": "Koi linkable accounts nai hai",
+       "cannotlink-no-provider": "Koi linkable accounts nai hai",
+       "linkaccounts": "Accounts ke link karo",
+       "linkaccounts-success-text": "Account ke link kar dewa gais hai.",
+       "linkaccounts-submit": "Accounts ke link karo",
+       "unlinkaccounts": "Accounts ke unlink karo",
+       "unlinkaccounts-success": "Account ke unlink kar dewa gais hai.",
+       "authenticationdatachange-ignored": "Authentication data change ke handle nai karaa gais hai. Maybe no provider was configured?",
+       "userjsispublic": "Note karnaa: JavaScript subpages should not contain confidential data as they are viewable by other users.",
+       "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
+       "restrictionsfield-badip": "IP ke range me galti hai: $1",
+       "restrictionsfield-label": "Allowed IP ranges:",
+       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "badlao $1",
+       "pageid": "panna ID $1"
 }
index 0e26e58..b85bc40 100644 (file)
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije|Kategorija}}",
-       "category_header": "Članci u kategoriji \"$1\"",
+       "category_header": "Stranice u kategoriji \"$1\"",
        "subcategories": "Potkategorije",
        "category-media-header": "Mediji u kategoriji \"$1\":",
        "category-empty": "''U ovoj kategoriji trenutačno nema članaka ni medija.''",
        "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "Ova kategorija sadrži $2 {{PLURAL:$2|podkategoriju|podkategorije|podkategorija}}, ovaj popis prikazuje $1.",
        "category-subcat-count-limited": "Ova kategorija ima {{PLURAL:$1|podkategoriju|$1 podkategorije|$1 podkategorija}}.",
-       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži $2 članak.|{{PLURAL:$1|Prikazano je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od njih $2 ukupno.}}",
+       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži jednu stranicu.|{{PLURAL:$1|Prikazana je $1 stranica|Prikazane su $1 stranice|Prikazano je $1 stranica}} od njih $2 ukupno.}}",
        "category-article-count-limited": "{{PLURAL:$1|stranica je|$1 stranice su|$1 stranica je}} u ovoj kategoriji.",
        "category-file-count": "Ova kategorija sadrži $2 {{PLURAL:$2|datoteku|datoteke|datoteka}}. {{PLURAL:$1|Slijedi $1 datoteka|Slijede $1 datoteke|Slijedi $1 datoteka}}.",
        "category-file-count-limited": "{{PLURAL:$1|datoteka je|$1 datoteke su|$1 datoteka su}} u ovoj kategoriji.",
        "searcharticle": "Kreni",
        "history": "Stare izmjene",
        "history_short": "Stare izmjene",
+       "history_small": "stare izmjene",
        "updatedmarker": "obnovljeno od posljednjeg posjeta",
        "printableversion": "Inačica za ispis",
        "permalink": "Trajna poveznica",
        "views": "Pogledi",
        "toolbox": "Pomagala",
        "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikove|suradničine}} grupe",
+       "tool-link-userrights-readonly": "Vidi {{GENDER:$1|suradnikovu|suradničinu|suradničku}} pripadnost skupinama",
        "tool-link-emailuser": "Pošalji e-poštu {{GENDER:$1|suradniku|suradnici}}",
        "userpage": "Vidi suradnikovu stranicu",
        "projectpage": "Vidi stranicu o projektu",
        "redirectedfrom": "(Preusmjereno s $1)",
        "redirectpagesub": "Preusmjeravanje",
        "redirectto": "Preusmjerava na:",
-       "lastmodifiedat": "Ova stranica posljednji put je izmjenjena $1 u $2.",
+       "lastmodifiedat": "Ova stranica posljednji je put izmijenjena $1 u $2.",
        "viewcount": "Ova stranica je pogledana {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Skoči na:",
        "portal-url": "Project:Portal zajednice",
        "privacy": "Zaštita privatnosti",
        "privacypage": "Project:Zaštita privatnosti",
-       "badaccess": "Pogreška u ovlaštenjima",
+       "badaccess": "Pogrješka u ovlastima",
        "badaccess-group0": "Nije Vam dopušteno izvršiti ovaj zahvat.",
        "badaccess-groups": "Ovaj zahvat mogu izvršiti samo suradnici iz {{PLURAL:$2|skupine|jedne od skupina}}: $1.",
        "versionrequired": "Potrebna inačica $1 MediaWikija",
        "virus-scanfailed": "skeniranje neuspješno (kod $1)",
        "virus-unknownscanner": "nepoznati antivirus:",
        "logouttext": "'''Odjavili ste se.'''\n\nNeke se stranice mogu prikazivati kao da ste još uvijek prijavljeni, sve dok ne očistite međuspremnik svog preglednika.",
-       "cannotlogoutnow-title": "Odjava trenutno nije moguća.",
+       "cannotlogoutnow-title": "Odjava trenutno nije moguća",
        "cannotlogoutnow-text": "Odjava nije moguća tijekom uporabe $1.",
        "welcomeuser": "Dobrodošli, $1!",
        "welcomecreation-msg": "Vaš je suradnički račun otvoren.\nNe zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].",
        "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.",
+       "userlogin-reauth": "Morate se ponovno prijaviti da biste potvrdili da ste Vi {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Stvori još jedan račun",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte",
        "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, molimo Vas otvorite e-poruku i slijedite u njemu sadržana uputstva kako biste potvrdili da je adresa e-pošte zaista Vaša.",
        "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu zaporke, u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu zaporke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "mailerror": "Pogrješka pri slanju e-pošte: $1",
-       "acct_creation_throttle_hit": "Posjetitelji ovog wikija koji rabe Vašu IP adresu napravili su {{PLURAL:$1|1 račun|$1 računa}} u posljednjem danu, što je najveći dopušteni broj u tom vremenskom razdoblju.\nZbog toga posjetitelji s ove IP adrese trenutačno ne mogu otvoriti nove suradničke račune.",
+       "acct_creation_throttle_hit": "Posjetitelji ovog wikija koji rabe Vašu IP adresu napravili su {{PLURAL:$1|1 račun|$1 računa}} u posljednjih $2, što je najveći dopušteni broj u tom vremenskom razdoblju.\nZbog toga posjetitelji s ove IP adrese trenutačno ne mogu otvoriti nove suradničke račune.",
        "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
        "emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNe možemo poslati e-poruku ni u jednoj od sljedećih naredbi.",
        "noemailprefs": "Nije navedena adresa elektroničke pošte, stoga sljedeće naredbe ne će raditi.",
        "createacct-another-realname-tip": "Pravo ime nije obvezno. \nAko ga navedete, bit će korišteno za pripisivanje Vaših doprinosa.",
        "pt-login": "Prijavi se",
        "pt-login-button": "Prijavi se",
+       "pt-login-continue-button": "Nastavi prijavu",
        "pt-createaccount": "Otvori novi suradnički račun",
        "pt-userlogout": "Odjavi se",
        "php-mail-error-unknown": "Nepoznata pogrješka u funkciji PHP-poruke()",
        "botpasswords-bad-appid": "Ime bota \"$1\" nije valjano.",
        "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",
        "resetpass_forbidden": "Zaporka ne može biti promijenjena",
        "resetpass-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "resetpass-submit-loggedin": "Promijeni zaporku",
        "passwordreset-emaildisabled": "Funkcija e-pošte je onemogućena na ovom wikiju.",
        "passwordreset-username": "Suradničko ime:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Pogledati krajnju poruku?",
-       "passwordreset-capture-help": "Ako označite ovu kućicu, e-poruka s privremenom lozinkom će biti prikazana i poslana korisniku.",
        "passwordreset-email": "E-mail adresa:",
        "passwordreset-emailtitle": "Pojedinosti o računu na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani 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-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-invalidemail": "Nevaljala adresa e-pošte",
        "changeemail": "Promijeni ili izbriši e-mail adresu",
        "changeemail-header": "Promijeni adresu e-pošte računa",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutačna adresa e-pošte:",
        "changeemail-newemail": "Nova adresa e-pošte:",
+       "changeemail-newemail-help": "Ako želite izbrisati adresu Vaše e-pošte, ostavite ovo polje praznim. U tom slučaju, nećete biti u mogućnosti ponovno postaviti zaboravljenu zaporku i nećete moći primati e-poštu s ovog wikija.",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Zaporka za projekt {{SITENAME}}:",
-       "changeemail-submit": "Promijeni E-mail",
+       "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.",
        "bold_sample": "Podebljani tekst",
        "bold_tip": "Podebljani tekst",
        "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.",
        "missingcommenttext": "Molim unesite sažetak.",
        "missingcommentheader": "'''Podsjetnik:''' Niste napisali sažetak ovog komentara. Ako ponovno kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
-       "summary-preview": "Pregled sažetka:",
-       "subject-preview": "Pregled predmeta:",
+       "summary-preview": "Pregled polja Sažetak:",
+       "subject-preview": "Pregled teme:",
        "blockedtitle": "Suradnik je blokiran",
        "blockedtext": "'''Vaše suradničko ime ili IP adresa je blokirana'''\n\nBlokirao Vas je $1.\nRazlog blokiranja je sljedeći: ''$2''.\n\n* Početak blokade: $8\n* Istek blokade: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete koristiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
        "autoblockedtext": "Vaša IP adresa automatski je blokirana zbog toga što ju je koristio drugi suradnik, kojeg je blokirao $1.\nRazlog blokiranja je sljedeći:\n\n:''$2''\n\n* Početak blokade: $8\n* Blokada istječe: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete rabiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
        "template-protected": "(zaštićen)",
        "template-semiprotected": "(djelomično zaštićen)",
        "hiddencategories": "Ova stranica je član {{PLURAL:$1|1 skrivene kategorije|$1 skrivene kategorije|$1 skrivenih kategorija}}:",
+       "edittools": "<!-- Ovaj će tekst biti prikazan ispod obrasca za uređivanje i postavljanje. -->",
        "nocreatetext": "Na ovom je projektu ograničeno otvaranje novih stranica.\nMožete se vratiti i uređivati već postojeće stranice ili se [[Special:UserLogin|prijaviti ili otvoriti suradnički račun]].",
        "nocreate-loggedin": "Nemate ovlasti za stvaranje novih stranica.",
        "sectioneditnotsupported-title": "Uređivanje odjeljka nije podržano",
        "sectioneditnotsupported-text": "Uređivanje odjeljka nije podržano na ovoj stranici",
-       "permissionserrors": "Pogreška u pravima",
+       "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}}:",
        "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:",
        "history-feed-description": "Povijest promjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u (test) $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nStranica je vjerojatno prethodno izbrisana s wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti]] važnije nove stranice na wikiju.",
+       "history-edit-tags": "Uredi oznake označenih izmjena",
        "rev-deleted-comment": "(komentar uklonjen)",
        "rev-deleted-user": "(suradničko ime uklonjeno)",
        "rev-deleted-event": "(zapis uklonjen)",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Jeste li sigurni da želite pregledati izbrisanu inačicu datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
-       "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene}} stranice [[:$2]]:",
-       "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice}} datoteke [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene|Označenih izmjena}} stranice [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice|Označenih inačica}} datoteke [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:",
        "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti javno vidljivi.",
        "revdelete-text-file": "Izbrisane inačice datoteke će i dalje biti vidljive u povijesti datoteke, ali neki dijelovi sadržaja neće biti javno vidljivi.",
        "revdelete-unsuppress": "Ukloni ograničenja na vraćenim izmjenama",
        "revdelete-log": "Razlog:",
        "revdelete-submit": "Primijeni na {{PLURAL:$1|odabranu inačicu|odabrane inačice}}",
-       "revdelete-success": "'''Vidljivost izmjene uspješno ažurirana.'''",
+       "revdelete-success": "Vidljivost izmjene ažurirana.",
        "revdelete-failure": "'''Vidljivost inačice nije mogla biti ažurirana:'''\n$1",
-       "logdelete-success": "'''Vidljivost uređivanja uspješno postavljena.'''",
+       "logdelete-success": "Vidljivost uređivanja postavljena.",
        "logdelete-failure": "'''Vidljivost evidencije ne može biti postavljena:'''\n$1",
        "revdel-restore": "promijeni dostupnost",
        "pagehist": "stare izmjene",
        "searchprofile-advanced-tooltip": "Traži u zadanom imenskom prostoru",
        "search-result-size": "$1 ({{PLURAL:$2|1 riječ|$2 riječi}})",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
-       "search-redirect": "(preusmjeravanje $1)",
+       "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(odlomak $1)",
        "search-category": "(kategorija $1)",
        "search-suggest": "Mislili ste: $1",
        "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
        "search-interwiki-caption": "Sestrinski projekti",
-       "search-interwiki-default": "$1 rezultati:",
+       "search-interwiki-default": "Rezultati s projekta $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
        "searchrelated": "povezano",
        "prefs-labs": "Labs mogućnosti",
        "prefs-user-pages": "Suradničke stranice",
        "prefs-personal": "Podaci o suradniku",
-       "prefs-rc": "Nedavne promjene i kratki članci",
+       "prefs-rc": "Nedavne promjene",
        "prefs-watchlist": "Praćene stranice",
        "prefs-editwatchlist": "Uredi popis praćenja",
        "prefs-editwatchlist-label": "Uredi stavke na popisu praćenja:",
        "prefs-watchlist-edits-max": "Maksimalni broj: 1000",
        "prefs-watchlist-token": "Token popisa praćenja:",
        "prefs-misc": "Razno",
-       "prefs-resetpass": "Promijeni zaporku",
-       "prefs-changeemail": "promijeni adresu e-pošte",
+       "prefs-resetpass": "promijeni zaporku",
+       "prefs-changeemail": "promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "Mogućnosti e-maila",
        "prefs-rendering": "Izgled",
        "saveprefs": "Spremi",
        "restoreprefs": "Vrati sve postavke na prvotno zadane",
-       "prefs-editing": "Širina okvira za uređivanje",
-       "rows": "Redova",
-       "columns": "Stupaca",
+       "prefs-editing": "Uređivanje",
        "searchresultshead": "Prikaz rezultata pretrage",
        "stub-threshold": "Prag za formatiranje poveznice na mrve ($1):",
        "stub-threshold-disabled": "Onemogućeno",
        "prefs-help-signature": "Komentari na stranicama za razgovor trebali bi biti potpisani s \"<nowiki>~~~~</nowiki>\" što će biti pretvoreno u Vaš potpis i datum.",
        "badsig": "Kôd Vašeg potpisa nije valjan; provjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predugačak.\nNe smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
-       "yourgender": "Spol:",
-       "gender-unknown": "Neodređeni",
-       "gender-male": "Muški",
-       "gender-female": "Ženski",
+       "yourgender": "Na koji način želite da Vam se ostali suradnici obraćaju?",
+       "gender-unknown": "Kad Vas se spominje, programska će oprema pokušati upotrijebiti srednji rod kad god je to moguće.",
+       "gender-male": "Uređivač sam wikistranica.",
+       "gender-female": "Uređivačica sam wikistranica.",
        "prefs-help-gender": "Mogućnost softvera da ispravno oslovljava razlikujući spol. Ovaj će podatak biti javan.",
        "email": "Adresa elektroničke pošte *",
        "prefs-help-realname": "Pravo ime nije obvezno. Ako ga navedete, može biti rabljeno za pripisivanje Vaših doprinosa.",
        "prefs-advancedrendering": "Napredne mogućnosti",
        "prefs-advancedsearchoptions": "Napredne mogućnosti",
        "prefs-advancedwatchlist": "Napredne mogućnosti",
-       "prefs-displayrc": "Prikaži opcije",
+       "prefs-displayrc": "Mogućnosti prikaza",
        "prefs-displaywatchlist": "Mogućnosti prikaza",
        "prefs-diffs": "Razlike između inačica uređivanja",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod sljedeće prijave.",
        "prefswarning-warning": "Napravili ste promjene u Vašim postavkama koje još nisu snimljene.\nAko napustite ovu stranicu bez pritiska na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: možete rabiti tipke sa strjelicama lijevo i desno za prebacivanje između kartica na popisu kartica.",
        "userrights": "Upravljanje suradničkim pravima",
-       "userrights-lookup-user": "Upravljaj suradničkim skupinama",
+       "userrights-lookup-user": "Izaberi suradnika",
        "userrights-user-editname": "Unesite suradničko ime:",
-       "editusergroup": "Uredi suradničke skupine",
-       "editinguser": "Promjena suradničkih prava za suradnika '''[[User:$1|$1]]''' $2",
-       "userrights-editusergroup": "Uredi suradničke skupine",
-       "saveusergroups": "Snimi suradničke skupine",
+       "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-viewusergroup": "Vidi {{GENDER:$1|suradničke}} skupine",
+       "saveusergroups": "Spremi {{GENDER:$1|suradničke}} grupe",
        "userrights-groupsmember": "Član:",
        "userrights-groupsmember-auto": "Uključeni član:",
-       "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* označena kućica pokazuje skupinu kojoj suradnik pripada;\n* neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.",
+       "userrights-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-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-nologin": "Morate se [[Special:UserLogin|prijaviti]] s administratorskim računom da bi mogli dodijeliti suradnička prava.",
-       "userrights-notallowed": "Vaš trenutačni suradnički račun nema ovlasti mijenjanja suradničkih prava.",
        "userrights-changeable-col": "Skupine koje možete promijeniti",
        "userrights-unchangeable-col": "Skupine koje ne možete promijeniti",
+       "userrights-expiry-none": "Neograničeno trajanje statusa",
        "userrights-conflict": "Sukob promjene suradničkih prava! Molimo provjerite i potvrdite svoje promjene.",
-       "userrights-removed-self": "Uspješno ste uklonili svoja vlastita prava. Kao takvi, više niste u mogućnosti pristupiti ovoj stranici.",
        "group": "Skupina:",
        "group-user": "Suradnici",
-       "group-autoconfirmed": "automatski potvrđeni suradnici",
+       "group-autoconfirmed": "Automatski potvrđeni suradnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
        "right-ipblock-exempt": "Iznimka od blokiranja IP adresa, auto-bloka i blokiranja opsega",
        "right-unblockself": "Odblokirati se",
        "right-protect": "Mijenjanje razina zaštićivanja i uređivanje zaštićenih stranica",
-       "right-editprotected": "Uređivanje zaštićenih stranica (bez prenosive zaštite)",
-       "right-editsemiprotected": "Uređivanje zaštićenih stranica kao \"{{int: zaštititi-nivo-autoconfirmed}}\"",
+       "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-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-import": "Uvoženje stranica s drugih wikija",
        "right-importupload": "Uvoženje stranica kao datoteke",
        "right-patrol": "Označavanje izmjena pregledanim",
-       "right-autopatrol": "Izmjene su automatski označene kao pregledane",
+       "right-autopatrol": "Izmjene su automatski označene kao ophođene",
        "right-patrolmarks": "Vidljive oznake pregledavanja u nedavnim promjenama",
        "right-unwatchedpages": "Vidljiv popis nepraćenih stranica",
        "right-mergehistory": "Spajanje povijesti stranica",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvezi stranice uključujući i povezane stranice do dubine od 5",
        "right-sendemail": "Slanje e-pošte drugim suradnicima",
-       "right-passwordreset": "Vidi poruku e-pošte o ponovnom postavljanju lozinke",
        "grant-group-email": "Pošalji e-mail",
        "grant-blockusers": "Blokiraj i odblokiraj korisnike",
        "grant-createaccount": "Otvori račune",
        "rightslogtext": "Ovo je evidencija promjena suradničkih prava.",
        "action-read": "čitanje ove stranice",
        "action-edit": "uređivanje ove stranice",
-       "action-createpage": "stvaranje stranica",
-       "action-createtalk": "stvaranje stranica za razgovor",
+       "action-createpage": "započni ovu stranicu",
+       "action-createtalk": "započni stranicu za razgovor",
        "action-createaccount": "stvaranje ovog suradničkog računa",
        "action-history": "Vidi povijest uređivanja ove stranice",
        "action-minoredit": "označavanje ove izmjene kao manju",
        "action-upload_by_url": "postavljanje ove datoteke preko URL adrese",
        "action-writeapi": "za korištenje pisanja API",
        "action-delete": "brisanje ove stranice",
-       "action-deleterevision": "brisanje ove izmjene",
+       "action-deleterevision": "brisanje izmjena",
        "action-deletedhistory": "gledanje obrisane povijesti ove stranice",
        "action-browsearchive": "pretraživanje izbrisanih stranica",
-       "action-undelete": "vraćanje ove stranice",
-       "action-suppressrevision": "pregledavanje i vraćanje ove sakrivene izmjene",
+       "action-undelete": "vraćanje stranica",
+       "action-suppressrevision": "pregledavanje i vraćanje sakrivenih izmjena",
        "action-suppressionlog": "gledanje ove privatne evidencije",
        "action-block": "blokiranje ovog suradnika",
        "action-protect": "promjenu stupnja zaštite ove stranice",
        "action-import": "uvoženje ove stranice s drugog wikija",
        "action-importupload": "uvoženje ove stranice postavljanjem datoteke",
        "action-patrol": "označavanje tuđih izmjena pregledanim",
-       "action-autopatrol": "automatsko označavanje pregledanim za svoje izmjene",
+       "action-autopatrol": "automatsko označavanje vlastitih izmjena ophođenim",
        "action-unwatchedpages": "gledanje popisa stranica koje nisu praćene",
        "action-mergehistory": "spajanje povijesti ove stranice",
        "action-userrights": "uređivanje svih suradničkih prava",
        "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "Nova stranica",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Prikaži",
        "rcnotefrom": "Slijede promjene od <b>$2</b> (prikazano ih je do <b>$1</b>).",
        "rclistfrom": "Prikaži nove promjene počevši od $3 $2",
        "uploadnewversion-linktext": "Postavi novu inačicu datoteke",
        "shared-repo-from": "s projekta $1",
        "shared-repo": "zajednički poslužitelj",
+       "shared-repo-name-wikimediacommons": "Zajednički poslužitelj",
        "upload-disallowed-here": "Ne možete prepisati ovu datoteku.",
        "filerevert": "Ukloni ← $1",
        "filerevert-legend": "Vrati datoteku",
        "statistics-users": "Prijavljeni [[Special:ListUsers|suradnici]]",
        "statistics-users-active": "Aktivni suradnici",
        "statistics-users-active-desc": "Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}",
-       "pageswithprop": "Stranice sa osobinom stranice",
-       "pageswithprop-legend": "Stranice sa osobinom stranice",
+       "pageswithprop": "Stranice s određenim osobinama",
+       "pageswithprop-legend": "Stranice s određenim osobinama",
+       "pageswithprop-text": "Ovo je popis stranica koje koriste određene osobine stranica.",
        "pageswithprop-prop": "Ime osobine:",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmjeravanja",
        "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije|kategorija}}",
        "ninterwikis": "$1 međuwiki {{PLURAL:$1|poveznica|poveznice|poveznica}}",
        "nlinks": "$1 {{PLURAL:$1|poveznica|poveznice|poveznica}}",
-       "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nmembers": "$1 {{PLURAL:$1|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|inačica|inačice|inačica}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|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",
+       "protectedpages-summary": "Ova posebna stranica automatski je popis trenutačno zaštićenih stranica. Za popis naslova koji su zaštićeni za stvaranje vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosiva zaštita",
+       "protectedpages-noredirect": "Skrij preusmjeravanja",
        "protectedpagesempty": "Nema zaštićenih stranica koje ispunjavaju uvjete koje ste postavili.",
        "protectedpages-page": "Stranica",
        "protectedpages-expiry": "Istječe",
        "booksources-search": "Traži",
        "booksources-text": "Ovdje je popis vanjskih poveznica na internetskim stranicama koje prodaju nove i rabljene knjige, ali mogu sadržavati i ostale podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Čini se da dani ISBN nije valjan; provjerite greške kopirajući iz izvornika.",
+       "magiclink-tracking-rfc": "Stranice s čarobnim RFC poveznicama",
+       "magiclink-tracking-rfc-desc": "Ova stranica rabi čarobne RFC poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-pmid": "Stranice s čarobnim PMID poveznicama",
+       "magiclink-tracking-pmid-desc": "Ova stranica rabi čarobne PMID poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "magiclink-tracking-isbn": "Stranice s čarobnim ISBN poveznicama",
        "magiclink-tracking-isbn-desc": "Ova stranica rabi čarobne ISBN poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Suradnik:",
        "listusersfrom": "Prikaži suradnike počevši od:",
        "listusers-submit": "Prikaži",
        "listusers-noresult": "Nema takvih suradnika.",
-       "listusers-blocked": "(blokiran)",
+       "listusers-blocked": "({{GENDER:$1|blokirani|blokirana}})",
        "activeusers": "Popis aktivnih suradnika",
        "activeusers-intro": "Ovo je popis suradnika koji su napravili neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.",
        "activeusers-count": "{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "activeusers-from": "Prikaži suradnike počevši od:",
+       "activeusers-groups": "Prikaži suradnike koji pripadaju suradničkim skupinama:",
+       "activeusers-excludegroups": "Isključi iz prikaza suradnike koji pripadaju ovim suradničkim skupinama:",
        "activeusers-noresult": "Niti jedan suradnik nije nađen.",
        "activeusers-submit": "Prikaz aktivnih suradnika",
        "listgrouprights": "Prava suradničkih skupina",
        "listgrants-summary": "Slijedi popis dozvola s pridruženim pristupom suradničkim pravima. Suradnici mogu omogućiti aplikacijama uporabu svojih računa, ali s ograničenim ovlastima na temelju dozvola koje je suradnik dodijelio aplikaciji. Aplikacija koja djeluje u ime suradnika međutim ne može rabiti prava koje suradnik nema.\nMoguće su [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o pojedinim pravima.",
        "listgrants-grant": "Dozvola",
        "listgrants-rights": "Prava",
+       "trackingcategories": "Kategorije za praćenje",
+       "trackingcategories-msg": "Praćene kategorije",
+       "trackingcategories-name": "Naziv poruke",
+       "trackingcategories-desc": "Kriteriji za uključenje u kategoriju",
+       "restricted-displaytitle-ignored": "Stranice sa zanemarenim naslovima za prikaz",
+       "restricted-displaytitle-ignored-desc": "Na stranici je zanemaren <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> jer ne odgovara trenutačnom naslovu stranice.",
        "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija onemogućena",
        "mailnologin": "Nema adrese pošiljatelja",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]\nda bi mogli slati poštu drugim suradnicima.",
        "emailuser": "Pošalji mu e-poruku",
        "emailccsubject": "Kopija Vaše poruke suradniku $1: $2",
        "emailsent": "E-mail poslan",
        "emailsenttext": "Vaša poruka je poslana.",
-       "emailuserfooter": "Ovu je e-poruku {{GENDER:$1|poslao suradnik|poslala suradnica}} $1 {{GENDER:$2|suradniku $2|suradnici $2}} uporabom mogućnosti \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
+       "emailuserfooter": "Ovu je e-poruku {{GENDER:$1|poslao suradnik|poslala suradnica}} $1 {{GENDER:$2|suradniku $2|suradnici $2}} uporabom mogućnosti \"{{int:emailuser}}\" s projekta {{SITENAME}}. Ukoliko {{GENDER:$2|odgovorite}} na tu e-poruku, {{GENDER:$2|Vaša}} će poruka biti izravno poslana {{GENDER:$1|izvornom pošiljatelju}}, otkrivajući pritom {{GENDER:$2|Vašu}} adresu e-pošte {{GENDER:$1|pošiljatelju|pošiljateljici}}.",
        "usermessage-summary": "Ostavljanje poruke sustava.",
        "usermessage-editor": "Uređivač sistemskih poruka",
        "watchlist": "Popis praćenja",
        "watchlistanontext": "Molimo Vas prijavite se kako biste mogli vidjeti ili uređivati Vaš popis praćenih stranica.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj u popis praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodana na Vaš [[Special:Watchlist|popis praćenja]].\nPromjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popisu praćenja.",
+       "addedwatchtext": "Stranica »[[:$1]]« dodana je na Vaš [[Special:Watchlist|popis praćenja]]; ujedno i njoj pripadajuća razgovorna stranica.",
+       "addedwatchtext-talk": "Stranica »[[:$1]]« i njoj pripadajuća razgovorna stranica dodane su na Vaš [[Special:Watchlist|popis praćenih stranica]].",
        "addedwatchtext-short": "Stranica \"$1\" dodana je Vašem popisu praćenja.",
        "removewatch": "Ukloni s popisa praćenja",
-       "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena s [[Special:Watchlist|Vašeg popisa praćenja]].",
+       "removedwatchtext": "Stranica »[[:$1]]« i pripadajuća razgovorna stranica uklonjene su s Vašega [[Special:Watchlist|popisa praćenih stranica]].",
+       "removedwatchtext-talk": "Stranica »[[:$1]]« i njoj pripadajuća razgovorna stranica uklonjene su s Vašega [[Special:Watchlist|popis praćenih stranica]].",
        "removedwatchtext-short": "Stranica \"$1\" uklonjena je s Vašeg popisa praćenja.",
        "watch": "Prati",
        "watchthispage": "Prati ovu stranicu",
        "deletepage": "Izbriši stranicu",
        "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1' (a jedini urednik '$2')",
+       "excontentauthor": "sadržaj je bio: »$1«; {{GENDER:$2|jedini pridonositelj bio je|jedina pridonositeljica bila je}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Obriši \"$1\"",
        "delete-legend": "Izbriši",
        "rollback-success": "uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1\nvraćeno na posljednju inačicu {{GENDER:$2|suradnika|suradnice}} $2.",
        "sessionfailure-title": "Prekid sesije",
        "sessionfailure": "Uočili smo problem s Vašom prijavom. Zadnja naredba nije izvršena kako bi se izbjegla zloupotreba. Molimo Vas da se u pregledniku vratite natrag na prethodnu stranicu, ponovno je učitate i zatim pokušate opet.",
-       "changecontentmodel": "Promijeni model sadržaja stranice",
+       "changecontentmodel": "Promjena modela sadržaja stranice",
        "changecontentmodel-legend": "Promijeni model sadržaja",
        "changecontentmodel-title-label": "Naziv stranice",
        "changecontentmodel-model-label": "Novi model sadržaja",
        "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-submit": "Promijeni",
        "changecontentmodel-success-title": "Sadržaj modela je promijenjen",
+       "log-name-contentmodel": "Evidencija promjena modela sadržaja",
        "protectlogpage": "Evidencija zaštićivanja",
        "protectlogtext": "Ispod je evidencija zaštićivanja i uklanjanja zaštite pojedinih stranica.\nPogledajte [[Special:ProtectedPages|zaštićene stranice]] za popis trenutačno zaštićenih stranica.",
        "protectedarticle": "članak \"[[$1]]\" je zaštićen",
        "modifiedarticleprotection": "promijenjen stupanj zaštite za \"[[$1]]\"",
        "unprotectedarticle": "uklonjena zaštita članka \"[[$1]]\"",
        "movedarticleprotection": "premještene postavke zaštite s \"[[$2]]\" na \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|$2 je zaštitio|$2 je zaštitila}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|$2 je promijenio nivo zaštite|$2 je promijenila nivo zaštite}} za \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|$2 je uklonio zaštitu|$2 je uklonila zaštitu}} za \"[[$1]]\"",
        "protect-title": "Zaštićujem \"$1\"",
        "protect-title-notallowed": "Vidi stupanj zaštite stranice \"$1\"",
        "prot_1movedto2": "$1 premješteno na $2",
        "restriction-edit": "Uređivanje",
        "restriction-move": "Premještanje",
        "restriction-create": "Stvori",
-       "restriction-upload": "Postavi",
+       "restriction-upload": "Postavljanje",
        "restriction-level-sysop": "samo administratori",
        "restriction-level-autoconfirmed": "samo prijavljeni suradnici",
        "restriction-level-all": "sve razine",
        "export-download": "Ponudi opciju snimanja u datoteku",
        "export-templates": "Uključi predloške",
        "export-pagelinks": "Uključi povezane stranice do dubine od:",
+       "export-manual": "Ručno dodaj stranice u polje:",
        "allmessages": "Sve poruke sustava",
        "allmessagesname": "Ime",
        "allmessagesdefault": "Prvotni tekst",
        "tooltip-pt-userpage": "Moja suradnička stranica",
        "tooltip-pt-anonuserpage": "Suradnička stranica za IP adresu pod kojom uređujete",
        "tooltip-pt-mytalk": "Vaša stranica za razgovor",
-       "tooltip-pt-anontalk": "Razgovor o suradnicima s ove IP adrese",
+       "tooltip-pt-anontalk": "Razgovor o uređivanjima s ove IP adrese",
        "tooltip-pt-preferences": "Vaše postavke",
        "tooltip-pt-watchlist": "Popis stranica koje pratite.",
        "tooltip-pt-mycontris": "Popis Vaših doprinosa",
+       "tooltip-pt-anoncontribs": "Popis uređivanja učinjenih s ove IP adrese",
        "tooltip-pt-login": "Predlažemo Vam da se prijavite, međutim nije obvezno.",
        "tooltip-pt-logout": "Odjavi se",
        "tooltip-pt-createaccount": "Predlažemo Vam mogućnost stvaranja računa i prijave, iako to nije nužno.",
-       "tooltip-ca-talk": "Razgovor o stranici",
+       "tooltip-ca-talk": "Razgovorna stranica",
        "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Dodaj novi odlomak",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena. Možete pogledati izvorni kod.",
        "tooltip-ca-move": "Premjesti ovu stranicu",
        "tooltip-ca-watch": "Dodaj ovu stranicu na svoj popis praćenja",
        "tooltip-ca-unwatch": "Ukloni ovu stranicu s popisa praćenja",
-       "tooltip-search": "Pretraži {{SITENAME}}",
+       "tooltip-search": "Pretraži projekt {{SITENAME}}",
        "tooltip-search-go": "Idi na stranicu s ovim imenom ako ona postoji",
        "tooltip-search-fulltext": "Traži ovaj tekst na svim stranicama",
        "tooltip-p-logo": "Posjeti glavnu stranicu",
        "tooltip-watchlistedit-normal-submit": "Ukloni naslove",
        "tooltip-watchlistedit-raw-submit": "Osvježi popis praćenja",
        "tooltip-recreate": "Vrati stranicu unatoč tome što je obrisana",
-       "tooltip-upload": "Pokreni snimanje (''upload'')",
+       "tooltip-upload": "Pokreni postavljanje datoteke (''upload'')",
        "tooltip-rollback": "\"Ukloni\" uklanja uređivanja posljednjeg suradnika na ovoj stranici.",
        "tooltip-undo": "\"Ukloni ovu izmjenu\" uklanja ovu izmjenu i otvara okvir za uređivanje. Omogućava unošenje razloga u sažetak.",
        "tooltip-preferences-save": "Spremi postavke",
        "spamprotectionmatch": "Naš filtar spama reagirao je na sljedeći tekst: $1",
        "spambot_username": "MediaWiki zaštita od spama",
        "spam_reverting": "Vraćam na posljednju inačicu koja ne sadrži poveznice na $1",
-       "spam_blanking": "Sve inačice sadrže poveznice na $1, brišem cjelokupni sadržaj",
+       "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-subpages-value": "Ukupno $1 ($2 {{PLURAL:$2|preusmjeravanje|preusmjeravanja}}; $3 {{PLURAL:$3|obična podstranica|obične podstranice|običnih podstranica}})",
        "pageinfo-firstuser": "Suradnik koji je stvorio stranicu",
        "pageinfo-firsttime": "Datum stvaranja stranice",
-       "pageinfo-lastuser": "Posljednji urednik stranice",
+       "pageinfo-lastuser": "Posljednji uređivač stranice",
        "pageinfo-lasttime": "Datum posljednjeg uređivanja",
        "pageinfo-edits": "Ukupan broj uređivanja",
        "pageinfo-authors": "Broj različitih autora",
        "markaspatrolledtext-file": "Označi ovu inačicu datoteke kao pregledanu",
        "markedaspatrolled": "Pregledano",
        "markedaspatrolledtext": "Odabrana promjena [[:$1]] označena je pregledanom.",
-       "rcpatroldisabled": "Nadzor nedavnih promjena isključen",
-       "rcpatroldisabledtext": "Naredba \"Nadziri nedavne promjene\" trenutačno je isključena.",
+       "rcpatroldisabled": "Ophodnja nedavnih promjena isključena",
+       "rcpatroldisabledtext": "Naredba \"Ophodnja nedavnih promjena\" trenutačno je isključena.",
        "markedaspatrollederror": "Ne mogu označiti za pregledano",
        "markedaspatrollederrortext": "Morate odabrati inačicu koju treba označiti za pregledanu.",
        "markedaspatrollederror-noautopatrol": "Ne možete vlastite promjene označiti patroliranima.",
        "markedaspatrollednotify": "Uređivanje stranice $1 označeno je pregledanim.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
-       "patrol-log-page": "Evidencija pregledavanja promjena",
+       "patrol-log-page": "Evidencija ophodnji i samoophodnji",
        "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
-       "log-show-hide-patrol": "$1 evidenciju patroliranja",
+       "log-show-hide-patrol": "$1 evidenciju ophodnji",
+       "log-show-hide-tag": "$1 evidenciju oznaka",
        "confirm-markpatrolled-button": "U redu",
        "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 pregledanom?",
        "deletedrevision": "izbrisana stara inačica $1",
        "autoredircomment": "preusmjeravanje na [[$1]]",
        "autosumm-new": "nova stranica: $1",
        "autosumm-newblank": "stvorena prazna stranica",
+       "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "lag-warn-normal": "Moguće je da izmjene nastale posljednjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.",
        "lag-warn-high": "Zbog kašnjenja baze podataka, moguće je da promjene napravljene u posljednjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.",
        "watchlistedit-normal-title": "Uredi popis praćenja",
        "tag-filter": "Filtar [[Special:Tags|oznaka]]:",
        "tag-filter-submit": "Filtar",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)",
+       "tag-mw-contentmodelchange": "promjena modela sadržaja",
+       "tag-mw-contentmodelchange-description": "Uređivanja koja [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenjanju model sadržaja] stranice",
        "tags-title": "Oznake",
-       "tags-intro": "Ova je stranica popis oznaka s kojima softver može označiti promjenu te njihovo značenje.",
+       "tags-intro": "Ova stranica sadržava popis oznaka s kojima programska oprema može označivati promjene te njihova značenja.",
        "tags-tag": "Naziv oznake",
        "tags-display-header": "Izgled na popisima izmjena",
        "tags-description-header": "Puni opis značenja",
        "tags-active-header": "Aktivno?",
        "tags-hitcount-header": "Označene izmjene",
        "tags-actions-header": "Radnje",
-       "tags-active-yes": "Da",
-       "tags-active-no": "Ne",
+       "tags-active-yes": "da",
+       "tags-active-no": "ne",
        "tags-source-extension": "Definirano proširenjem",
        "tags-source-none": "Nije više u uporabi",
        "tags-edit": "uredi",
        "tags-delete": "izbriši",
        "tags-activate": "pokreni",
        "tags-deactivate": "isključi",
-       "tags-hitcount": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "tags-manage-no-permission": "Nemate pravo upravljati promjenama oznaka.",
        "tags-create-heading": "Stvori novu oznaku",
        "tags-create-tag-name": "Naziv oznake:",
        "tags-deactivate-submit": "Isključi",
        "tags-edit-title": "Uredi oznake",
        "tags-edit-manage-link": "Upravljaj oznakama",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Označena izmjena|Označene izmjene|Označenih izmjena}} stranice [[:$2]]:",
        "tags-edit-existing-tags": "Postojeće oznake:",
        "tags-edit-existing-tags-none": "\"Nema\"",
        "tags-edit-new-tags": "Nove oznake:",
        "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 {{GENDER:$2|obrisao|obrisala}} preusmjeravanje $3 prepisivanjem",
        "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-upload-upload": "$1 је {{GENDER:$2|postavio|postavila}} $3",
        "logentry-upload-overwrite": "$1 је {{GENDER:$2|postavio|postavila}} novu inačicu $3",
        "logentry-upload-revert": "$1 је {{GENDER:$2|postavio|postavila}} $3",
+       "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-termsofuse": "Slažem se da povratne informacije objavljujem u skladu s Uvjetima uporabe.",
        "feedback-thanks": "Hvala! Vaš odgovor je snimljen na stranicu \"[$2 $1]\".",
        "feedback-thanks-title": "Hvala!",
-       "searchsuggest-search": "Traži",
+       "searchsuggest-search": "Pretraži projekt {{SITENAME}}",
        "searchsuggest-containing": "sadrži....",
-       "api-error-badaccess-groups": "Nemate ovlasti za postavljanje datoteka na ovu wiki.",
        "api-error-badtoken": "Interna pogrješka: Token nije ispravan.",
-       "api-error-copyuploaddisabled": "Postavljanje datoteka putem URL-a nije omogućeno na ovom projektu.",
-       "api-error-duplicate": "{{PLURAL:$1|Postoji druga datoteka|Postoje $1 druge datoteke|Postoji $1 drugih datoteka}} istog sadržaja.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke|Postojalo je nekih drugih datoteka}} na projektu s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Datoteka koju ste poslali je prazna.",
        "api-error-emptypage": "Stvaranje praznih novih stranica nije dopušteno.",
-       "api-error-fetchfileerror": "Interna pogrješka: Pojavio se neki problem pri dobivanju podataka o datoteci.",
-       "api-error-fileexists-forbidden": "Datoteka s imenom \"$1\" već postoji i ne može biti prepisana.",
-       "api-error-fileexists-shared-forbidden": "Datoteka s imenom \"$1\" već postoji u zajedničkom spremištu i ne može biti prepisana.",
-       "api-error-file-too-large": "Datoteka koju ste poslali bila je prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nije dopušteni tip datoteke|su nedopušteni tipovi datoteke|su nedopušteni tipovi datoteka}}. Dopušteni {{PLURAL:$3|tip datoteke je|tipovi datoteke su|tipovi datoteka su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmjena koji ste pokušali načiniti je otkazana preko \"kuke\" proširenja mediawiki softvera.",
-       "api-error-http": "Interna pogrješka: Ne može se povezati na poslužitelj.",
-       "api-error-illegal-filename": "Ime datoteke nije dopušteno.",
-       "api-error-internal-error": "Interna pogrješka: Pojavio se neki problem s obradom postavljanja datoteke na wiki.",
-       "api-error-invalid-file-key": "Poslužitelj nije mogao naći tu datoteku u vašim postavljenim datotekama.",
-       "api-error-missingparam": "Interna pogrješka: Nedostaju parametri HTTP(S) zahtjeva.",
-       "api-error-missingresult": "Interna pogrješka: Nismo mogli utvrditi je li kopiranje uspjelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da bi mogli postavljati datoteke.",
-       "api-error-mustbeposted": "Postoji pogreška u ovom softveru; ne rabi ispravnu HTTP metodu.",
-       "api-error-noimageinfo": "Postavljanje je uspjelo, ali poslužitelj nije vratio nikakvu informaciju o datoteci.",
-       "api-error-nomodule": "Interna pogrješka: nije postavljen modul za postavljanje.",
-       "api-error-ok-but-empty": "Interna pogrješka: nema odgovora od poslužitelja.",
-       "api-error-overwrite": "Postavljanje preko postojeće datoteke nije dopušteno.",
-       "api-error-stashfailed": "Interna pogrješka: Poslužitelj nije uspio spremiti privremenu datoteku.",
        "api-error-publishfailed": "Interna pogrješka: poslužitelj nije uspio objaviti privremenu datoteku.",
-       "api-error-timeout": "Poslužitelj nije odgovorio unutar očekivanog vrjemena.",
-       "api-error-unclassified": "Dogodila se nepoznata pogrješka.",
-       "api-error-unknown-code": "Nepoznata pogrješka: \"$1\"",
-       "api-error-unknown-error": "Interna pogrješka: dogodila se pogrješka pri pokušaju postavljanja vaše datoteke.",
+       "api-error-stashfailed": "Interna pogrješka: Poslužitelj nije uspio spremiti privremenu datoteku.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata pogrješka: \"$1\"",
-       "api-error-uploaddisabled": "Postavljanje datoteka je onemogućeno na ovom wikiprojektu.",
-       "api-error-verification-error": "Ova datoteka je možda oštećena ili ima pogrešan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minute|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
        "right-pagelang": "Promijeni jezik stranice",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Slijede statistike postavljenih datoteka koje pokazuju zadnju inačicu datoteke. Starije ili izbrisane inačice nisu prikazane.",
+       "mediastatistics-bytespertype": "Ukupna veličina datoteka za ovaj odlomak: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ukupna veličina svih datoteka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2).",
        "mediastatistics-header-drawing": "Crteži (vektorske slike)",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Videozapisi",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "simboli",
        "special-characters-group-greek": "grčki",
+       "special-characters-group-greekextended": "grčki (prošireno)",
        "special-characters-group-cyrillic": "ćirilica",
        "special-characters-group-arabic": "arapski",
+       "special-characters-group-arabicextended": "arapski (prošireno)",
        "special-characters-group-persian": "perzijski",
        "special-characters-group-hebrew": "hebrejski",
-       "special-characters-group-bangla": "Bangla znakovi",
+       "special-characters-group-bangla": "bengalski",
+       "special-characters-group-tamil": "tamilski",
        "special-characters-group-telugu": "telugu",
-       "special-characters-group-sinhala": "Sinhaleški znakovi",
-       "special-characters-group-gujarati": "Gudžaratski znakovi",
-       "special-characters-group-thai": "Tajlandski (tajski) znakovi",
-       "special-characters-group-lao": "laoski znakovi",
+       "special-characters-group-sinhala": "sinhaleški",
+       "special-characters-group-gujarati": "gudžaratski",
+       "special-characters-group-devanagari": "devanagari",
+       "special-characters-group-thai": "tajlandski (tajski)",
+       "special-characters-group-lao": "laoski",
        "special-characters-group-khmer": "kmerski",
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjeravanje na $1",
+       "randomrootpage": "Slučajna korijenska stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
        "log-action-filter-delete": "Vrsta brisanja:",
        "log-action-filter-import": "Vrsta uvoza:",
        "log-action-filter-rights-autopromote": "automatska promjena",
        "log-action-filter-upload-upload": "novo postavljanje",
        "log-action-filter-upload-overwrite": "ponovno postavljanje",
+       "authmanager-authn-autocreate-failed": "Automatsko stvaranje lokalnoga računa nije uspjelo: $1",
+       "authmanager-autocreate-noperm": "Automatsko stvaranje računa nije dopušteno.",
+       "authmanager-provider-password": "Autorizacija zaporkom",
+       "authmanager-provider-temporarypassword": "Privremena zaporka",
        "changecredentials": "Promjena vjerodajnica",
-       "removecredentials": "Uklanjanje vjerodajnica"
+       "changecredentials-submit": "Promijeni vjerodajnice",
+       "removecredentials": "Uklanjanje vjerodajnica",
+       "removecredentials-submit": "Ukloni vjerodajnice",
+       "credentialsform-provider": "Vrsta vjerodajnica:",
+       "credentialsform-account": "Suradnički račun:"
 }
index 6bc52f5..85192b1 100644 (file)
        "passwordreset-emaildisabled": "Die E-Mail-Funktione worre uff dem Wiki deaktiviert.",
        "passwordreset-username": "Benutzernoome:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Die E-Mail-Nachricht oonsiehn?",
-       "passwordreset-capture-help": "Wenn du das Kästche oonkreizt, weard die E-Mail-Nachricht mit dem temporäre Passwort sowohl dir oongezeicht als ooch dem Benutzer zugesandt.",
        "passwordreset-email": "E-Mail-Adress",
        "passwordreset-emailtitle": "Benutzerkontoinformatione uff {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adress $1, wahrscheinlich du sellebst, hot en Zurücksetzung von dein Passworts bei {{SITENAME}} oongefordert ($4). {{PLURAL:$3|Das follichend Benutzerkonto ist|Die follichende Benutzerkonte sind}}\nmit der E-Mail-Adress verknüpft:\n\n$2\n\n{{PLURAL:$3|Das temporär Passwort looft|Die temporäre Passwörter loofe}} innerhalb von {{PLURAL:$5|em Tooch|$5 Tooche}} ab.\nDu sollst dich oonmelde und en neies Passwort vergewe. Falls jemand annres die Oonfroch getätigt hot orrer du dich wieder an dein ursprüngliches Passwort erinnre kannst und das netmeh\nännre möchst, kannst du die Nachricht ignoriere und weiterhin dein altes\nPasswort benutze.",
        "saveprefs": "Instellunge speichre",
        "restoreprefs": "Alle Standardinstellunge wiederhearstelle (in alle Abschnitte)",
        "prefs-editing": "Beoorbeite",
-       "rows": "Zeile:",
-       "columns": "Spalte:",
        "searchresultshead": "Such",
        "stub-threshold": "Linkformatierung <a href=\"#\" class=\"stub\">klen Seite</a> (in Bytes):",
        "stub-threshold-disabled": "Deaktiviert",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du host net die nötiche Berechtichung, um Benutzerrechte in annre Wikis ännre  könne.",
        "userrights-nodatabase": "Die Datebank $1 ist net voarhand orrer net lokal.",
-       "userrights-nologin": "Du musst dich mit en Administratoar-Benutzerkonto [[Special:UserLogin|oonmeld]], um Benutzerrechte ännre.",
-       "userrights-notallowed": "Du verfüchst net üwer die erforderliche Berechtichunge, um Benutzerrechte vergebe orrer entziehe könne.",
        "userrights-changeable-col": "Gruppezugehörigkeit, die du ännre kannst",
        "userrights-unchangeable-col": "Gruppezugehörigkeit, die du net ännre kannst",
        "userrights-conflict": "Benutzerrechteännerungskonflikt! Bittschön üwerprüf und bestätich deine Ännrunge.",
-       "userrights-removed-self": "Du host dein eichne Rechte erfollichreich entfernt. Du kannst net länger uff die Seit zugreife.",
        "group": "Grupp:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Automatisch bestätichte Benutzer",
        "right-siteadmin": "Datebank sperre und entsperre",
        "right-override-export-depth": "Exportier Seite einschliesslich verlinkter Seite bis zu en Tief von 5",
        "right-sendemail": "E-Mails an annre Benutzer sende",
-       "right-passwordreset": "Passwort von en Benutzer zurücksetze und die dazu verschickte E-Mail einsiehn",
        "newuserlogpage": "Neioonmeldungs-Logbuch",
        "newuserlogpagetext": "Dies ist en Logbuch von der nei erstellte Benutzerkonte.",
        "rightslog": "Rechte-Logbuch",
        "uploaddisabledtext": "Das Hochloode von Dateie ist deaktiviert.",
        "php-uploaddisabledtext": "Das Hochloode von Dateie woard in PHP deaktiviert.\nBittschön üwerprüf die <code>file_uploads</code>-Einstellung.",
        "uploadscripted": "Die Datei enthält HTML- orrer Scriptcode, wo irrtümlich von enem Webbrowser ausgeführt werre könnt.",
-       "uploadscriptednamespace": "Die SVG-Datei enthält den ungültiche Noomeraum „$1“.",
+       "uploadscriptednamespace": "Die SVG-Datei enthält den ungültiche Noomeraum „<nowiki>$1</nowiki>“.",
        "uploadinvalidxml": "Das XML in der hochgeladne Datei konnt net geparst werre.",
        "uploadvirus": "Die Datei enthält en Virus! Details: $1",
        "uploadjava": "Dies ist ein ZIP-Datei, wo en CLASS-Datei von Java enthält.\nDas Hochloode von Java-Dateie ist net gestattet, weil sie die Umgehung von Sicherheitseinschränkunge ermöchliche könnte.",
        "feedback-thanks": "Dankschön. Dein Rückmeldung woard uff der Seit \"[$2 $1]\" gespeichert.",
        "searchsuggest-search": "Such",
        "searchsuggest-containing": "wo enthält …",
-       "api-error-badaccess-groups": "Du host net die Berechtichung Dateie in des Wiki hochzuloode.",
        "api-error-badtoken": "Interner Fehler: Der Token ist fehlerhaft.",
-       "api-error-copyuploaddisabled": "Das Hochloode doorrich URL woard uff dem Server deaktiviert.",
-       "api-error-duplicate": "Do gebts im Wiki schon {{PLURAL:$1|en anner Datei|mehrre andere Dateie}} mit dem gleiche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war schon annre Datei|woore schon annre Dateie}} mit dem gleiche Inhalt voarhand. {{PLURAL:$1|Sie woard|Sie woorre}} awer abgewischt.",
-       "api-error-empty-file": "Die hochgeloodne Datei woor leer.",
        "api-error-emptypage": "Es ist net erlaubt, neie leere Seite erstelle.",
-       "api-error-fetchfileerror": "Interner Fehler: Bei dem Datei abrufe ist en Fehler uffgetret.",
-       "api-error-fileexists-forbidden": "En Datei mit dem Noome \"$1\" ist schon voarhand und kann net üwerschrieb sin.",
-       "api-error-fileexists-shared-forbidden": "En Datei mit dem noomen \"$1\" ist schon im gemeinsam  Dateirepositorium voarhand und kann doher net üwerschrieb sin.",
-       "api-error-file-too-large": "Die hochgeloodne Datei woor zu gross.",
-       "api-error-filename-tooshort": "Der Dateinoome ist zu koorz.",
-       "api-error-filetype-banned": "Die Dateiendung ist gesperrt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ist en net zulässicher Dateityp|sind net zulässiche Dateitype}}. {{PLURAL:$3|En zulässicher Dateityp ist|Zulässiche Dateitype sind}} $2.",
-       "api-error-filetype-missing": "Die hochzuladende Datei hat keine Dateiendung.",
-       "api-error-hookaborted": "Der Versuch, die Ännrung doorrichzuführe, woard von en Parsererweitrung (API) abgebroch.",
-       "api-error-http": "Interner Fehler: Es konnt keh Verbinnung zum Server heargestellt sin.",
-       "api-error-illegal-filename": "Der Dateinoome ist net zulässich.",
-       "api-error-internal-error": "Interner Fehler: En unbekannter Fehler ist beim Hochloode von der Datei ins Wiki uffgetret.",
-       "api-error-invalid-file-key": "Interner Fehler: Die Datei woard net im temporäre Speicher gefunn.",
-       "api-error-missingparam": "Interner Fehler: Der Oonfroch fehle ehre Parameter.",
-       "api-error-missingresult": "Interner Fehler: Es konnt net festgestellt sin, ob das Kopiere erfollichreich woor.",
-       "api-error-mustbeloggedin": "Um Dateie hochloode könne, musst du oongemeldt sin.",
-       "api-error-mustbeposted": "Interner Fehler: Do gebts en Programmfehler, weil die falsche HTTP-Methode weard verwendt (HTTP POST ist nötich).",
-       "api-error-noimageinfo": "Das Hochloode woor erfollichreich, awer der Server kann ken Informatione zur Datei oonzeiche.",
-       "api-error-nomodule": "Interner Fehler: Es woarde ken Modul zum Hochloode festgeleht.",
-       "api-error-ok-but-empty": "Interner Fehler: Der Server reagiert net.",
-       "api-error-overwrite": "Das Üwerschreibe von en voarhand Datei ist net erlaubt.",
-       "api-error-stashfailed": "Interner Fehler: Der Server konnt keh temporär Datei speichre.",
        "api-error-publishfailed": "Interner Fehler: Der Server konnt die temporär Datei net veröffentliche.",
-       "api-error-stasherror": "Beim Hochloode von der Datei hot es en Fehler geb.",
-       "api-error-timeout": "Der Server hot net innerhalb von der erwoortete Zeit reagiert.",
-       "api-error-unclassified": "En unbekannter Fehler ist uffgetret.",
-       "api-error-unknown-code": "Unbekannter Fehler: \"$1\"",
-       "api-error-unknown-error": "Interner Fehler: En unbekannter Fehler ist beim Hochloode von der Datei uffgetret.",
+       "api-error-stashfailed": "Interner Fehler: Der Server konnt keh temporär Datei speichre.",
        "api-error-unknown-warning": "Unbekannte Woornung: $1",
        "api-error-unknownerror": "Unbekannter Fehler: \"$1\"",
-       "api-error-uploaddisabled": "Das Hochloode ist in diesem Wiki deaktiviert.",
-       "api-error-verification-error": "Die hochzuloodend Datei ist entweder fehlerhaft orrer hot keh Dateinoomeerweitrung.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekund|Sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minut|Minute}}",
        "duration-hours": "$1 {{PLURAL:$1|Stund|Stunne}}",
index 558b166..9012602 100644 (file)
        "passwordreset-emaildisabled": "E-mejlowe funkcije su so na tutym wikiju znjemóžnili.",
        "passwordreset-username": "Wužiwarske mjeno:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "E-mejlku sej wobhladać?",
-       "passwordreset-capture-help": "Jeli nakřižuješ tutón kašćik, budźe so e-mejlka z nachwilnym hesło pokazować a tež wužiwarjej pósłać.",
        "passwordreset-email": "E-mejlowa adresa:",
        "passwordreset-emailtitle": "Kontowe podrobnosće na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Něchtó (najskerje ty, z IP-adresu $1) je anulowanje 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ć.",
        "saveprefs": "Składować",
        "restoreprefs": "Wšě standardne nastajenja wobnowić (w druhich wotrězkach)",
        "prefs-editing": "Wobdźěłowanje",
-       "rows": "Rjadki:",
-       "columns": "Stołpiki:",
        "searchresultshead": "Pytać",
        "stub-threshold": "Wotkazowe formatowanje małych stronow ($1):",
        "stub-threshold-disabled": "Znjemóžnjeny",
        "userrights-reason": "Přičina:",
        "userrights-no-interwiki": "Nimaš prawo wužiwarske prawa w druhich wikijach změnić.",
        "userrights-nodatabase": "Datowa banka $1 njeeksistuje abo lokalna njeje.",
-       "userrights-nologin": "Dyrbiš so z admininstratorowym kontom [[Special:UserLogin|přizjewić]], zo by wužiwarske prawa změnił.",
-       "userrights-notallowed": "Nimaš trěbne prawa, zo by wužiwarske prawa přidźěliło abo zebrało.",
        "userrights-changeable-col": "Skupiny, kotrež móžeš změnić",
        "userrights-unchangeable-col": "Skupiny, kotrež njemóžeš změnić",
        "userrights-conflict": "Konflikt změnow wužiwarskich prawow! Prošu přepruwuj a wobkruć swoje změny.",
-       "userrights-removed-self": "Sy swoje prawa wotstronił. Tohodla nimaš hižo přistup na tutu stronu měć.",
        "group": "Skupina:",
        "group-user": "wužiwarjo",
        "group-autoconfirmed": "Awtomatisce potwjerdźeni wužiwarjo",
        "right-siteadmin": "Datowu banku zawrěć abo wotewrić",
        "right-override-export-depth": "Strony inkluziwnje wotkazanych stronow hač do hłubokosće 5 eksportować",
        "right-sendemail": "Druhim wužiwarjam e-mejl pósłać",
-       "right-passwordreset": "E-mejlki za wróćostajenje hesłow sej wobhladać",
        "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ć",
        "newuserlogpage": "Protokol nowych wužiwarjow",
        "uploaddisabledtext": "Nahraće datajow je znjemóžnjene.",
        "php-uploaddisabledtext": "Nahraća PHP-datajow su znjemóžnjene. Prošu skontroluj nastajenje file_uploads.",
        "uploadscripted": "Dataja wobsahuje HTML- abo skriptowy kod, kotryž móhł so mylnje přez wobhladowak wuwjesć.",
-       "uploadscriptednamespace": "Tuta SVG-dataja wobsahuje njedowoleny mjenowy rum '$1'",
+       "uploadscriptednamespace": "Tuta SVG-dataja wobsahuje njedowoleny mjenowy rum '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML w nahratej dataji njeda so parsować.",
        "uploadvirus": "Dataja wirus wobsahuje! Podrobnosće: $1",
        "uploadjava": "Tuta dataja je ZIP-dataja, kotraž .class-dataju z Javy wobsahuje.\nNahraće datajow Javy njeje dowolene, dokelž móhli wobeńdźenje wěstotnych wobmjezowanjow zmóžnić.",
        "badipaddress": "Njepłaćiwa IP-adresa",
        "blockipsuccesssub": "Zablokowanje wuspěšne",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bu {{GENDER:$1|zablokowany|zablokowana}}.<br />\nHlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.",
-       "ipb-blockingself": "Chceš samoho blokować! Chceš to woprawdźe činić?",
+       "ipb-blockingself": "Chceš runje sebi sam blokować! Chceš to woprawdźe činić?",
        "ipb-confirmhideuser": "Chceš runje wužiwarja z nastajenjom \"wužiwarja schować\" blokować. To k tomu dowjedźe, zo mjeno wužiwarja so we wšch lisćinach a protokolowych zapiskach potłóči. Chceš to woprawdźe činić?",
        "ipb-confirmaction": "Jeli sy sej wěsty, zo chceš to woprawdźe činić, přepruwuj prošu deleka polo \"{{int:ipb-confirm}}\".",
        "ipb-edit-dropdown": "přičiny zablokowanjow wobdźěłać",
        "feedback-useragent": "Identifikator wobhladowaka:",
        "searchsuggest-search": "Pytać",
        "searchsuggest-containing": "wobsahuje...",
-       "api-error-badaccess-groups": "Nimaš prawo dataje do tutoho wikija nahrać.",
        "api-error-badtoken": "Nutřkowny zmylk: Wopačny token.",
-       "api-error-copyuploaddisabled": "Nahrawanje přez URL je na tutym serwerje znjemóžnjene.",
-       "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su}} hižo {{PLURAL:$1|druha dataja|druhej dataji|druhe dataje}} ze samsnym wobsahom na sydle.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Bě druha dataja|Běštej druhej dataji|Běchu druhe dataje|Bě druhich datajow}} hižo na websydle ze samsnym wobsahom, ale {{PLURAL:$1|je so zhašała|stej so zhašałoj|su so zhašeli|je so zhašało}}.",
-       "api-error-empty-file": "Dataja, kotruž sy nahrał, je prózdna.",
        "api-error-emptypage": "Wutworjenje nowych, prózdnych stronow njeje dowolene.",
-       "api-error-fetchfileerror": "Nutřkowny zmylk: při wobstarowanju dataje je so něšto nimokuliło.",
-       "api-error-fileexists-forbidden": "Dataja z mjenom \"$1\" hižo eksistuje, a njeda so přepisać.",
-       "api-error-fileexists-shared-forbidden": "Dataja z mjenom \"$1\" hižo eksistuje w zhromadnym datajowym repozitoriju a njeda so přepisać.",
-       "api-error-file-too-large": "Dataja, kotruž sy nahrał, bě přewulka.",
-       "api-error-filename-tooshort": "Datajowe mjeno překrótko",
-       "api-error-filetype-banned": "Tutón datajowy typ je zawrjeny.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|dowoleny datajowy typ njeje|dowolenej datajowej typaj njejstej|dowolene datajowe typy njejsu|dowolene datajowe typy njejsu}}. {{PLURAL:$3|Dowoleny datajowy typ je|Dowolenej datajowej typaj stej|Dowolene datajowe typy su|Dowolene datajowe typy su}} $2.",
-       "api-error-filetype-missing": "Dataja nima datajowu kóncowku.",
-       "api-error-hookaborted": "Změna, kotruž pospytowaše přewjesć, bu přez rozšěrjensku hoku přetorhnjena.",
-       "api-error-http": "Nutřkowny zmylk: Zwisk ze serwerom njemóžno.",
-       "api-error-illegal-filename": "Datajowe mjeno njedowolene.",
-       "api-error-internal-error": "Nutřkowny zmylk: Při předźěłowanju twojeho nahraća na wiki je so něšto nimokuliło.",
-       "api-error-invalid-file-key": "Nutřkowny zmylk: dataja njeje so w nachwilnym składowaku namakała.",
-       "api-error-missingparam": "Nutřkowny zmylk: falowace parametry při naprašowanju.",
-       "api-error-missingresult": "Nutřkowny zmylk: njeda so zwěsćić, hač kopěrowanje je so poradźiło.",
-       "api-error-mustbeloggedin": "Dyrbiš přizjewjeny być, zo by dataje nahrał.",
-       "api-error-mustbeposted": "Nutřkowny zmylk: Naprašowanje wužaduje sej HTTP POST.",
-       "api-error-noimageinfo": "Nahraće je so poradźiło, ale serwer njeje nam žane informacije wo dataji dał.",
-       "api-error-nomodule": "Nutřkowny zmylk: Žadyn modul nastajeny.",
-       "api-error-ok-but-empty": "Nutřkowny zmylk: žana wotmołwa wot serwera.",
-       "api-error-overwrite": "Přepisowanje eksistowaceje dataje njeje dowolene.",
-       "api-error-stashfailed": "Nutřkowny zmylk: Serwer njemóžeše nachwilnu dataju składować.",
        "api-error-publishfailed": "Nutřkowny zmylk: Serwer njemóžeše nachwilnu dataju wozjewić.",
-       "api-error-stasherror": "Při nahrawanju dataje do chowanki je zmylk wusutpił.",
-       "api-error-timeout": "Serwer njeje znutřka wočakowaneho časa wotmołwił.",
-       "api-error-unclassified": "Njeznaty zmylk je wustupił.",
-       "api-error-unknown-code": "Njeznaty zmylk: \"$1\"",
-       "api-error-unknown-error": "Nutřkowny zmylk: Při nahrawanju twojeje dataje je so něšto nimokuliło.",
+       "api-error-stashfailed": "Nutřkowny zmylk: Serwer njemóžeše nachwilnu dataju składować.",
        "api-error-unknown-warning": "Njeznate warnowanje: $1",
        "api-error-unknownerror": "Njeznaty zmylk: \"$1\".",
-       "api-error-uploaddisabled": "Nahraća su na tutym wikiju znjemóžnjene.",
-       "api-error-verification-error": "Tuta dataja móhła wobkškodźena być abo wopačny sufiks měć.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundźe|sekundy|sekundow}}",
        "duration-minutes": "$1 {{PLURAL:$1|mjeńšina|mjeńšinje|mjeńšiny|mjeńšin}}",
        "duration-hours": "$1 {{PLURAL:$1|hodźina|hodźinje|hodźiny|hodźin}}",
index ce3aaba..2586a71 100644 (file)
@@ -44,7 +44,8 @@
                        "JulesWinnfield-hu",
                        "Bencoke",
                        "Máté",
-                       "Wolf Rex"
+                       "Wolf Rex",
+                       "BanKris"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
@@ -70,7 +71,7 @@
        "tog-enotifwatchlistpages": "Kapjak értesítést e-mailben, ha egy általam figyelt lap vagy fájl megváltozik",
        "tog-enotifusertalkpages": "Kapjak értesítést e-mailben, ha megváltozik a vitalapom",
        "tog-enotifminoredits": "Kapjak értesítést e-mailben a lapok és fájlok apró változtatásairól",
-       "tog-enotifrevealaddr": "Jelenjen meg az e-mail címem a figyelmeztető e-mailekben",
+       "tog-enotifrevealaddr": "Jelenjen meg az e-mail-címem az értesítő e-mailekben",
        "tog-shownumberswatching": "A lapot figyelő szerkesztők számának megjelenítése",
        "tog-oldsig": "A jelenlegi aláírásod:",
        "tog-fancysig": "Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)",
        "searcharticle": "Menj",
        "history": "Laptörténet",
        "history_short": "Laptörténet",
+       "history_small": "laptörténet",
        "updatedmarker": "az utolsó látogatásom óta frissítették",
        "printableversion": "Nyomtatható változat",
        "permalink": "Hivatkozás erre a változatra",
        "views": "Nézetek",
        "toolbox": "Eszközök",
        "tool-link-userrights": "{{GENDER:$1|Felhasználócsoportok}} módosítása",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Felhasználói}} csoportok megtekintése",
        "tool-link-emailuser": "E-mail küldése ennek a {{GENDER:$1|felhasználónak}}",
        "userpage": "Felhasználó lapjának megtekintése",
        "projectpage": "Projektlap megtekintése",
        "passwordreset-emaildisabled": "Az e-mail funkció le van tiltva ezen a wikin.",
        "passwordreset-username": "Felhasználónév:",
        "passwordreset-domain": "Tartomány:",
-       "passwordreset-capture": "Meg szeretnéd nézni az elkészült üzenetet?",
-       "passwordreset-capture-help": "Ha kipipálod a dobozt, elmegy az üzenet a felhasználónak és megjelenik számodra (az ideiglenes jelszóval együtt).",
        "passwordreset-email": "E-mail cím:",
        "passwordreset-emailtitle": "A(z) {{SITENAME}}-fiók adatai",
        "passwordreset-emailtext-ip": "Valaki (vélhetően Te, a $1 IP-címről) a jelszavad visszaállítását kérte a {{SITENAME}} ($4) oldalon felvett {{PLURAL:$3|fiókban|fiókokban}}. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:\n\n$2\n\n{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.",
        "passwordreset-emailelement": "Felhasználónév: \n$1\n\nIdeiglenes jelszó: \n$2",
        "passwordreset-emailsentemail": "Ha ez az e-mail-cím van a fiókodhoz társítva, egy jelszó-visszaállító e-mailt küldünk.",
        "passwordreset-emailsentusername": "Ha ehhez a felhasználónévhez tartozik e-mail cím, akkor egy jelszó-visszaállító levelet küld a rendszer.",
-       "passwordreset-emailsent-capture2": "A jelszóvisszaállító {{PLURAL:$1|e-mailt|e-maileket}} elküldtük. A {{PLURAL:$1|felhasználónév és a jelszó|felhasználónevek és jelszavak listája}} itt látható.",
-       "passwordreset-emailerror-capture2": "Az e-mail-küldés {{GENDER:$2|sikertelen}}: $1. A {{PLURAL:$3|felhasználónév és a jelszó|felhasználónevek és jelszavak listája}} itt látható.",
        "passwordreset-nocaller": "A hívó megadása kötelező",
        "passwordreset-nosuchcaller": "A hívó nem létezik: $1",
        "passwordreset-ignored": "A jelszó-visszaállítás nem lett kezelve. Talán nincs konfigurálva szolgáltató?",
        "subject-preview": "Tárgy előnézete:",
        "previewerrortext": "Hiba történt a változások előnézete megjelenítése során.",
        "blockedtitle": "A szerkesztő blokkolva van",
-       "blockedtext": "'''A szerkesztőnevedet vagy az IP-címedet blokkoltuk.'''\n\nA blokkolást $1 végezte el.\nAz általa felhozott indok: ''$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.\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.\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.",
+       "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.",
+       "systemblockedtext": "A felhasználónevedet vagy IP-címedet automatikusan blokkolta a MediaWiki.\nA blokkolás indoka:\n\n:<em>$2</em>\n\n* A blokk kezdete: $8\n* A blokk lejárata: $6\n* Blokkolt szerkesztő: $7\n\nA jelenlegi IP-címed: $3.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.",
        "blockednoreason": "nem adott meg okot",
        "whitelistedittext": "Lapok szerkesztéséhez $1.",
        "confirmedittext": "Lapok szerkesztése előtt meg kell erősítened az e-mail címedet. Kérjük, hogy a [[Special:Preferences|szerkesztői beállításaidban]] add meg, majd erősítsd meg az e-mail címedet.",
        "saveprefs": "Mentés",
        "restoreprefs": "A beállítások alaphelyzetbe állítása minden szakaszban",
        "prefs-editing": "Szerkesztés",
-       "rows": "Sor",
-       "columns": "Oszlop",
        "searchresultshead": "Keresés",
        "stub-threshold": "A hivatkozások csonkként történő formázásának határa ($1):",
        "stub-threshold-sample-link": "minta",
        "prefs-help-recentchangescount": "Ez vonatkozik a friss változtatásokra, laptörténetekre és naplókra is.",
        "prefs-help-watchlist-token2": "Ez a titkos kulcs a figyelőlistádhoz.\nAki ismeri, meg tudja nézni, milyen lapokat figyelsz, úgyhogy ne oszdd meg másokkal.\n[[Special:ResetTokens|Kattints ide, ha meg akarod változtatni]].",
        "savedprefs": "Az új beállításaid érvénybe léptek.",
-       "savedrights": "$1 felhasználói jogai el lettek mentve.",
+       "savedrights": "{{GENDER:$1|$1}} felhasználói csoportjai el lettek mentve.",
        "timezonelegend": "Időzóna:",
        "localtime": "Helyi idő:",
        "timezoneuseserverdefault": "Az alapértelmezett beállítás használata ($1)",
        "youremail": "Az e-mail címed:",
        "username": "{{GENDER:$1|Szerkesztőnév}}:",
        "prefs-memberingroups": "{{GENDER:$2|{{PLURAL:$1|Csoporttagság|Csoporttagságok}}}}:",
+       "group-membership-link-with-expiry": "$1 (a következő időpontig: $2)",
        "prefs-registration": "Regisztráció ideje:",
        "yourrealname": "Valódi neved:",
        "yourlanguage": "A felület nyelve:",
        "prefswarning-warning": "A beállításaidban tett módosítások nincsenek elmentve. Ha a $1 megnyomása nélkül hagyod el az oldalt, a beállításaid nem módosulnak.",
        "prefs-tabs-navigation-hint": "Tipp: a jobbra-balra nyilakkal navigálhatsz a fülek között.",
        "userrights": "Szerkesztői jogok beállítása",
-       "userrights-lookup-user": "Szerkesztőcsoportok beállítása",
+       "userrights-lookup-user": "Válasszon ki egy felhasználót",
        "userrights-user-editname": "Add meg a szerkesztő nevét:",
-       "editusergroup": "{{GENDER:$1|Szerkesztőcsoportok}} módosítása",
+       "editusergroup": "Szerkesztőcsoportok betöltése",
        "editinguser": "<strong>[[User:$1|$1]]</strong> felhasználó jogainak megváltoztatása $2",
+       "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",
        "saveusergroups": "{{GENDER:$1|Szerkesztőcsoportok}} mentése",
        "userrights-groupsmember": "Csoporttag:",
        "userrights-groupsmember-auto": "Alapértelmezetten tagja:",
        "userrights-reason": "Ok:",
        "userrights-no-interwiki": "Nincs jogod a szerkesztők jogainak módosításához más wikiken.",
        "userrights-nodatabase": "$1 adatbázis nem létezik vagy nem helyi.",
-       "userrights-nologin": "[[Special:UserLogin|Be kell jelentkezned]] egy adminisztrátori fiókkal, hogy szerkesztői jogokat adhass.",
-       "userrights-notallowed": "Nincs jogosultságod jogosultságok adására vagy elvételére.",
        "userrights-changeable-col": "Megváltoztatható csoportok",
        "userrights-unchangeable-col": "Nem megváltoztatható csoportok",
+       "userrights-expiry-current": "Lejár ekkor: $1",
+       "userrights-expiry-none": "Nem jár le",
+       "userrights-expiry": "Lejárat:",
+       "userrights-expiry-existing": "Jelenleg érvényben lévő lejárati idő: $2, $3",
+       "userrights-expiry-othertime": "Más idő:",
+       "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-conflict": "Felhasználói jogok ütközése! Kérlek, végezd el újra a változtatásokat.",
-       "userrights-removed-self": "Eltávolítottad a saját jogosultságaidat, így már nem tudod elérni ezt az oldalt.",
        "group": "Csoport:",
        "group-user": "szerkesztők",
        "group-autoconfirmed": "automatikusan megerősített szerkesztők",
        "right-siteadmin": "adatbázis lezárása, felnyitása",
        "right-override-export-depth": "Lapok exportálása a hivatkozott lapokkal együtt, legfeljebb 5-ös mélységig",
        "right-sendemail": "e-mail küldése más felhasználóknak",
-       "right-passwordreset": "Jelszó visszaállítási emailek megtekintése",
        "right-managechangetags": "[[Special:Tags|címkék]] létrehozása és (de)aktiválása",
        "right-applychangetags": "[[Special:Tags|címkék]] alkalmazása saját változatokra",
        "right-changetags": "egyedi lapváltozatokon és naplóbejegyzéseken tetszőleges [[Special:Tags|címkék]] hozzáadása és törlése",
        "grant-basic": "alapvető jogosultságok",
        "grant-viewdeleted": "törölt fájlok és lapok megtekintése",
        "grant-viewmywatchlist": "figyelőlista megtekintése",
+       "grant-viewrestrictedlogs": "korlátozott naplóbejegyzések megtekintése",
        "newuserlogpage": "Új szerkesztők naplója",
        "newuserlogpagetext": "Ez a napló az újonnan regisztrált szerkesztők listáját tartalmazza.",
        "rightslog": "Szerkesztői jogosultságok naplója",
        "action-upload_by_url": "fájl feltöltése URL-címről",
        "action-writeapi": "író API használata",
        "action-delete": "lap törlése",
-       "action-deleterevision": "változat törlése",
+       "action-deleterevision": "változatok törlése",
+       "action-deletelogentry": "naplóbejegyzések törlése",
        "action-deletedhistory": "lap törölt laptörténetének megtekintése",
+       "action-deletedtext": "törölt lapváltozat szövegének megtekintése",
        "action-browsearchive": "keresés a törölt lapok között",
-       "action-undelete": "lap helyreállítása",
-       "action-suppressrevision": "rejtett változat megtekintése és helyreállítása",
+       "action-undelete": "lapok helyreállítása",
+       "action-suppressrevision": "rejtett változatok megtekintése és helyreállítása",
        "action-suppressionlog": "privát napló megtekintése",
        "action-block": "szerkesztő blokkolása",
        "action-protect": "lap védelmi szintjének megváltoztatása",
        "action-userrights-interwiki": "más wikik szerkesztői jogainak módosítása",
        "action-siteadmin": "adatbázis lezárása vagy felnyitása",
        "action-sendemail": "e-mailek küldése",
+       "action-editmyoptions": "saját beállításaid szerkesztése",
        "action-editmywatchlist": "saját figyelőlista szerkesztése",
        "action-viewmywatchlist": "saját figyelőlista megtekintése",
        "action-viewmyprivateinfo": "személyes adatok megtekintése",
        "recentchanges-legend-heading": "<strong>Jelmagyarázat:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
        "recentchanges-submit": "Megjelenítés",
+       "rcfilters-activefilters": "Aktív szűrők",
+       "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-noresults": "Nem található szűrő",
+       "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-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-filter-minor-label": "Apró szerkesztések",
+       "rcfilters-filter-minor-description": "Szerző által aprónak jelölt szerkesztések",
+       "rcfilters-filter-major-label": "Nem apró szerkesztések",
+       "rcfilters-filter-major-description": "Nem aprónak jelölt szerkesztések.",
+       "rcfilters-filtergroup-changetype": "Változtatás típusa",
+       "rcfilters-filter-pageedits-label": "Lapszerkesztések",
+       "rcfilters-filter-newpages-label": "Laplétrehozások",
+       "rcfilters-filter-newpages-description": "Új oldalt létrehozó szerkesztések.",
+       "rcfilters-filter-categorization-label": "Kategóriaváltoztatások",
+       "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…",
        "rcnotefrom": "Alább a <strong>$3 $4</strong> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
        "rclistfrom": "$3, $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "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>.",
-       "uploadscriptednamespace": "Ez az SVG fájl érvénytelen névteret (\"$1\") tartalmaz.",
+       "uploadscriptednamespace": "Ez az SVG fájl érvénytelen névteret (\"<nowiki>$1</nowiki>\") tartalmaz.",
        "uploadinvalidxml": "A feltöltött XML fájlt nem lehet feldolgozni.",
        "uploadvirus": "Ez a fájl vírust tartalmaz! A részletek: $1",
        "uploadjava": "A fájl egy ZIP-fájl, ami egy Java .class fájlt tartalmaz.\nJava fájlok feltöltése nem engedélyezett, mert segítségükkel kijátszhatóak a biztonsági korlátozások.",
        "uncategorizedcategories": "Kategorizálatlan kategóriák",
        "uncategorizedimages": "Kategorizálatlan fájlok",
        "uncategorizedtemplates": "Kategorizálatlan sablonok",
+       "uncategorized-categories-exceptionlist": "# Lista azokról a kategóriákról, amiknek nem szabad szerepelniük a Special:UncategorizedCategories oldalon. Soronként egy, „*” jellel kezdve. Más karakterrel (akár szóközzel) kezdődő sorok nem számítanak. Használd a „#” karaktert megjegyzésekhez.",
        "unusedcategories": "Nem használt kategóriák",
        "unusedimages": "Nem használt fájlok",
        "wantedcategories": "Keresett kategóriák",
        "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-url-label": "Kérő URL:",
+       "apisandbox-request-json-label": "JSON kérése:",
        "apisandbox-request-time": "Kérés hossza: $1 ms",
        "apisandbox-results-fixtoken": "Token javítása és újrapróbálkozás",
        "apisandbox-results-fixtoken-fail": "A(z) „$1” token lekérése sikertelen.",
        "apisandbox-continue": "Folytatás",
        "apisandbox-continue-clear": "Törlés",
        "apisandbox-continue-help": "A {{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries folytatja] az utolsó kérést; a {{int:apisandbox-continue-clear}} törli a folytatáshoz kapcsolódó paramétereket.",
+       "apisandbox-param-limit": "Használj <kbd>max</kbd>-ot a maximális értékhez.",
+       "apisandbox-multivalue-all-namespaces": "$1 (minden névtér)",
+       "apisandbox-multivalue-all-values": "$1 (minden érték)",
        "booksources": "Könyvforrások",
        "booksources-search-legend": "Könyvforrások keresése",
        "booksources-search": "Keresés",
        "activeusers-intro": "Ez a lap azon felhasználók listáját tartalmazza, akik végeztek valamilyen tevékenységet az elmúlt {{PLURAL:$1|egy|$1}} napban.",
        "activeusers-count": "$1 művelet az elmúlt $3 napban",
        "activeusers-from": "Szerkesztők listázása a következő névtől kezdve:",
+       "activeusers-groups": "A következő csoportokba tartozó felhasználók megjelenítése:",
+       "activeusers-excludegroups": "A következő csoportokba tartozó felhasználók kizárása:",
        "activeusers-noresult": "Nem található ilyen szerkesztő.",
        "activeusers-submit": "Aktív szerkesztők megjelenítése",
        "listgrouprights": "Szerkesztői csoportok jogai",
        "emailccsubject": "$1 szerkesztőnek küldött $2 tárgyú üzenet másolata",
        "emailsent": "E-mail elküldve",
        "emailsenttext": "E-mail üzenetedet elküldtük.",
-       "emailuserfooter": "Ezt az e-mailt $1 küldte $2 számára, az „{{int:emailuser}}” funkció használatával a(z) {{SITENAME}} wikin.",
+       "emailuserfooter": "Ezt az e-mailt $1 küldte $2 számára, az „{{int:emailuser}}” funkció használatával a(z) {{SITENAME}} wikin. Ha válaszolsz erre az üzenetre, az a választ közvetlenül az eredeti feladónak küldöd, felfedve az e-mail-címedet neki.",
        "usermessage-summary": "Rendszerüzenet megadása.",
        "usermessage-editor": "Rendszerüzenetek",
        "watchlist": "Figyelőlistám",
        "changecontentmodel-emptymodels-title": "Nincs elérhető tartalommodell",
        "changecontentmodel-emptymodels-text": "A(z) [[:$1]] lapon lévő tartalom nem alakítható át semmilyen típusúvá.",
        "log-name-contentmodel": "Tartalommodell-változások naplója",
-       "log-description-contentmodel": "Egy lap tartalommodelljéhez kapcsolódó események",
+       "log-description-contentmodel": "Ez a napló lapok tartalommodelljének változását és az alapértelmezettől eltérő tartalommodellel létrehozott lapokat listázza.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|létrehozta}} a(z) $3 lapot nem alapértelmezett „$5” tartalommodellel.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|megváltoztatta}} a(z) $3 lap tartalommodeljét erről: „$4” erre: „$5”",
        "logentry-contentmodel-change-revertlink": "visszaállítás",
        "modifiedarticleprotection": "megváltoztatta a(z) „[[$1]]” lap védelmi szintjét",
        "unprotectedarticle": "eltávolította a védelmet a(z) „[[$1]]” lapról",
        "movedarticleprotection": "áthelyezte „[[$2]]” védelmi beállításait „[[$1]]” cím alá",
+       "protectedarticle-comment": "„[[$1]]” {{GENDER:$2|levédve}}",
+       "modifiedarticleprotection-comment": "„[[$1]]” védelmi szintje {{GENDER:$2|módosítva}}",
+       "unprotectedarticle-comment": "„[[$1]]” lapvédelme {{GENDER:$2|feloldva}}",
        "protect-title": "„$1” levédése",
        "protect-title-notallowed": "„$1” védelmi szintjének megtekintése",
        "prot_1movedto2": "[[$1]] lapot átneveztem [[$2]] névre",
        "proxyblockreason": "Az IP-címeden ''nyílt proxy'' üzemel. Amennyiben nem használsz proxyt, vedd fel a kapcsolatot egy informatikussal vagy az internetszolgáltatóddal ezen súlyos biztonsági probléma ügyében.",
        "sorbsreason": "Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán.",
        "sorbs_create_account_reason": "Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán. Nem hozhatsz létre fiókot.",
+       "softblockrangesreason": "Az anonim szerkesztések nem engedélyezettek az IP-címedről ($1). Jelentkezz be a szerkesztéshez.",
        "xffblockreason": "Az X-Forwarded-For fejlécben lévő IP-cím, akár a tied, akár a használt proxy szerveré, blokkolva van. Az eredeti blokkolási ok: $1",
        "cant-see-hidden-user": "A felhasználó, akit blokkolni próbáltál már blokkolva és rejtve van. Mivel nincs felhasználó elrejtése jogosultságod, nem láthatod és nem szerkesztheted a felhasználó blokkját.",
        "ipbblocked": "Nem blokkolhatsz és nem oldhatod fel más felhasználók blokkjait, mert te magad is blokkolva vagy",
        "cant-move-to-user-page": "Nincs jogosultságod átnevezni egy lapot szerkesztői lapnak (kivéve annak allapjának).",
        "cant-move-category-page": "Nincs jogosultságod kategórialapok átnevezéséhez.",
        "cant-move-to-category-page": "Nincs jogosultságod átnevezni egy lapot kategórialapnak.",
+       "cant-move-subpages": "Nincs jogosultságod az allapok átnevezéséhez.",
+       "namespace-nosubpages": "A(z) „$1” névtérben nem használhatóak allapok.",
        "newtitle": "Az új cím:",
        "move-watch": "Figyeld a lapot",
        "movepagebtn": "Lap átnevezése",
        "pageinfo-length": "Lap hossza (bájtokban)",
        "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-change": "módosítás",
        "pageinfo-robot-policy": "Indexelés robottal",
        "patrol-log-header": "Ez az ellenőrzött változatok naplója.",
        "log-show-hide-patrol": "járőrnapló $1",
        "log-show-hide-tag": "címkenapló $1",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Ellenőrzöttnek jelölöd a(z) $2 lap $3 változatát?",
        "deletedrevision": "Régebbi változat törölve: $1",
        "filedeleteerror-short": "Hiba a fájl törlésekor: $1",
        "filedeleteerror-long": "Hibák merültek föl a következő fájl törlésekor:\n\n$1",
        "tags-deactivate": "deaktiválás",
        "tags-hitcount": "{{PLURAL:$1|Egy|$1}} változtatás",
        "tags-manage-no-permission": "Nincs engedélyed a változtatások címkéinek kezeléséhez.",
-       "tags-manage-blocked": "Nem tudja kezelni a változás kategóriát, amíg blokkolt.",
+       "tags-manage-blocked": "Nem kezelheted a módosításcímkéket, amíg blokkolva {{GENDER:$1|vagy}}.",
        "tags-create-heading": "Új címke létrehozása",
        "tags-create-explanation": "Alapértelmezés szerint az újonnan létrehozott címkék felhasználók és botok által manuálisan hozzáadhatók lesznek.",
        "tags-create-tag-name": "Címke neve:",
        "tags-deactivate-not-allowed": "Nem lehetséges a(z) „$1” címkét deaktiválni.",
        "tags-deactivate-submit": "Deaktiválás",
        "tags-apply-no-permission": "Nincs jogosultságod a szerkesztéseidet címkékkel ellátni.",
-       "tags-apply-blocked": "Nem módosíthatsz címkéket, amíg blokkolva vagy.",
+       "tags-apply-blocked": "Nem használhatsz módosításcímkéket a szerkesztéseidhez, amíg blokkolva {{GENDER:$1|vagy}}.",
        "tags-apply-not-allowed-one": "A(z) „$1” címke nem alkalmazható manuálisan.",
        "tags-apply-not-allowed-multi": "A következő {{PLURAL:$2|címke|címkék}} nem alkalmazhatók manuálisan: $1",
        "tags-update-no-permission": "Nincs jogosultságod egyedi változatok és naplóbejegyzések címkézésére és címkék eltávolítására.",
-       "tags-update-blocked": "Nem adhatsz hozzá vagy távolíthatsz el címkéket, amíg blokkolva vagy.",
+       "tags-update-blocked": "Nem adhatsz hozzá vagy távolíthatsz el címkéket, amíg blokkolva {{GENDER:$1|vagy}}.",
        "tags-update-add-not-allowed-one": "A(z) „$1” címke nem adható hozzá manuálisan.",
        "tags-update-add-not-allowed-multi": "A következő {{PLURAL:$2|címke|címkék}} nem adhatók hozzá manuálisan: $1",
        "tags-update-remove-not-allowed-one": "A  „$1” címkét nem lehet törölni.",
        "htmlform-user-not-exists": "<strong>$1</strong> nem létezik.",
        "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-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-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-bugcheck": "Nagyszerű! Ellenőrizd, hogy ez nem egy [$1 ismert hiba].",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Keresés a wikin",
        "searchsuggest-containing": "tartalmazza…",
-       "api-error-autoblocked": "Az IP-címed automatikusan blokkolva lett, mert korábban egy blokkolt szerkesztő használta.",
-       "api-error-badaccess-groups": "Nincs jogod fájlokat feltölteni erre a wikire.",
        "api-error-badtoken": "Belső hiba: hibás token.",
-       "api-error-blocked": "Letiltották a szerkesztési jogosultságodat.",
-       "api-error-copyuploaddisabled": "Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.",
-       "api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} másik fájl az oldalon ugyanilyen tartalommal.",
-       "api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más {{PLURAL:$1|fájl|fájlok}} is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
-       "api-error-empty-file": "Az általad elküldött fájl üres volt.",
        "api-error-emptypage": "Új, üres lap létrehozása nem engedélyezett.",
-       "api-error-fetchfileerror": "Belső hiba: valami baj történt a fájl beolvasása közben.",
-       "api-error-fileexists-forbidden": "Már létezik „$1” nevű fájl, és nem lehet felülírni.",
-       "api-error-fileexists-shared-forbidden": "Már létezik „$1” nevű fájl a megosztott fájlok között, és nem lehet felülírni.",
-       "api-error-file-too-large": "Az általad elküldött fájl túl nagy.",
-       "api-error-filename-tooshort": "A fájlnév túl rövid.",
-       "api-error-filetype-banned": "Tiltott fájltípus.",
-       "api-error-filetype-banned-type": "!A következő {{PLURAL:$4|fájltípus nem engedélyezett|fájltípusok nem engedélyezettek}}: $1. Engedélyezett {{PLURAL:$3|típus|típusok}}: $2.",
-       "api-error-filetype-missing": "Hiányzik a fájl kiterjesztése.",
-       "api-error-hookaborted": "Az általad kezdeményezett módosítást nem lehet végrehajtani. (Egy bővítmény megakadályozta.)",
-       "api-error-http": "Belső hiba: nem sikerült kapcsolódni a kiszolgálóhoz.",
-       "api-error-illegal-filename": "Nem megengedett fájlnév.",
-       "api-error-internal-error": "Belső hiba: valami baj történt a feltöltésed feldolgozása közben.",
-       "api-error-invalid-file-key": "Belső hiba: a fájl nem található az ideiglenes tárhelyen.",
-       "api-error-missingparam": "Belső hiba: paraméterek hiányoznak a kérésből.",
-       "api-error-missingresult": "Belső hiba: nem sikerült megállapítani, hogy a másolás sikeres volt-e.",
-       "api-error-mustbeloggedin": "Be kell jelentkezned fájlok feltöltéséhez.",
-       "api-error-mustbeposted": "Belső hiba: a kérésnek HTTP POST-nak kell lennie.",
-       "api-error-noimageinfo": "A feltöltés sikerült, de a szerver nem szolgáltatott semmilyen információt a fájlról.",
-       "api-error-nomodule": "Belső hiba: nincs feltöltőmodul beállítva.",
-       "api-error-ok-but-empty": "Belső hiba: nem érkezett válasz a kiszolgálótól.",
-       "api-error-overwrite": "Létező fájlok felülírására nem engedélyezett.",
-       "api-error-ratelimited": "A megengedettnél több fájlt próbálsz feltölteni rövid időn belül.\nPróbálkozz újra néhány perc múlva.",
-       "api-error-stashfailed": "Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.",
        "api-error-publishfailed": "Belső hiba: a kiszolgálónak nem sikerült közzétennie az ideiglenes fájlt.",
-       "api-error-stasherror": "Hiba történt a fájl feltöltése közben.",
-       "api-error-stashedfilenotfound": "Az félretett fájl nem található a feltöltés során.",
-       "api-error-stashpathinvalid": "Az félretett fájlhoz tartozó útvonal érvénytelen.",
-       "api-error-stashfilestorage": "Hiba történt a tartalék helyre történő mentés során.",
-       "api-error-stashzerolength": "A szerver nem tudta tartalékba tenni a fájlt, mert nulla a mérete.",
-       "api-error-stashnotloggedin": "Be kell jelentkezned a fájl feltöltéséhez.",
-       "api-error-stashwrongowner": "A elérni kívánt tartalék fájl nem a tied.",
-       "api-error-stashnosuchfilekey": "Az elérni kívánt tartalék fájl kulcs nem létezik.",
-       "api-error-timeout": "A kiszolgáló nem adott választ a várt időn belül.",
-       "api-error-unclassified": "Ismeretlen hiba történt",
-       "api-error-unknown-code": "Ismeretlen hiba: „$1”",
-       "api-error-unknown-error": "Belső hiba: valami baj történt a fájl feltöltése közben.",
-       "api-error-unknown-warning": "Ismeretlen figyelmeztetés: $1",
+       "api-error-stashfailed": "Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.",
+       "api-error-unknown-warning": "Ismeretlen figyelmeztetés: „$1”.",
        "api-error-unknownerror": "Ismeretlen hiba: „$1”.",
-       "api-error-uploaddisabled": "A feltöltés le van tiltva ezen a wikin.",
-       "api-error-verification-error": "A fájl feltehetőleg sérült, vagy hibás a kiterjesztése.",
-       "api-error-was-deleted": "Ilyen nevű fájlt már töltöttek fel, majd törölték.",
        "duration-seconds": "{{PLURAL:$1|másodperc|másodperc}}",
        "duration-minutes": "$1 {{PLURAL:$1|perc|perc}}",
        "duration-hours": "{{PLURAL:$1|egy|$1}} óra",
        "pagelang-language": "Nyelv",
        "pagelang-use-default": "Alapértelmezett nyelv használata",
        "pagelang-select-lang": "Nyelv kiválasztása",
+       "pagelang-reason": "Indoklás",
        "pagelang-submit": "Küldés",
+       "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.",
        "right-pagelang": "oldal nyelvének megváltoztatása",
        "action-pagelang": "oldal nyelvének módosítása",
        "log-name-pagelang": "Nyelvváltoztatások naplója",
        "mw-widgets-dateinput-no-date": "Nincs kiválasztott dátum",
        "mw-widgets-dateinput-placeholder-day": "ÉÉÉÉ-HH-NN",
        "mw-widgets-dateinput-placeholder-month": "ÉÉÉÉ-HH",
+       "mw-widgets-mediasearch-input-placeholder": "Média keresése",
+       "mw-widgets-mediasearch-noresults": "Nincs találat.",
        "mw-widgets-titleinput-description-new-page": "a lap még nem létezik",
        "mw-widgets-titleinput-description-redirect": "átirányítás ide: $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Kategória hozzáadása…",
        "sessionmanager-tie": "Nem kombinálható többféle hitelesítési típus: $1.",
        "sessionprovider-generic": "$1-munkamenetek",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sütialapú munkamenetek",
        "log-action-filter-contentmodel-change": "Tartalommodell módosítása",
        "log-action-filter-contentmodel-new": "Lap létrehozása nem alapértelmezett tartalommodellel",
        "log-action-filter-delete-delete": "Laptörlés",
+       "log-action-filter-delete-delete_redir": "Átirányítás felülírása",
        "log-action-filter-delete-restore": "Visszaállítás",
        "log-action-filter-delete-event": "Naplótörlés",
        "log-action-filter-delete-revision": "Lapváltozat-törlés",
        "usercssispublic": "Figyelem: CSS-allapokon ne tárolj bizalmas adatokat, mivel minden felhasználó számára láthatóak.",
        "restrictionsfield-badip": "Érvénytelen IP-cím vagy -tartomány: $1",
        "restrictionsfield-label": "Engedélyezett IP-tartományok:",
-       "restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Hiba: $1",
-       "edit-error-long": "Hibák:\n\n$1"
+       "restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
+       "revid": "$1 változat",
+       "pageid": "$1 lapazonosító"
 }
index 6a11148..e5cbf84 100644 (file)
        "cannotdelete": "Չհաջողվեց ջնջել «$1» էջը կամ ֆայլը։\nՀավանաբար այն արդեն ջնջվել է մեկ այլ մասնակցի կողմից։",
        "cannotdelete-title": "Հնարավոր չէ ջնջել $1 էջը",
        "delete-hook-aborted": "Խմբագրել չեղյալ է.\nԼրացուցիչ պարզաբանումներ չի դրվել.",
-       "no-null-revision": "Չի հաջողվել ստեղծել նոր զրոյական правку համար էջը \"$1\"",
+       "no-null-revision": "Չի հաջողվել ստեղծել նոր զրոյական խմբագրում էջի համար \"$1\"",
        "badtitle": "Անընդունելի անվանում",
        "badtitletext": "Հարցված էջի անվանումը անընդունելի է, դատարկ է կամ սխալ միջ-լեզվական կամ ինտերվիքի անվանում է։ Հնարավոր է, որ այն պարունակում է անթույլատրելի սիմվոլներ։",
        "title-invalid-empty": "Էջի հայցվող վերնագիրը դատարկ է կամ պարունակում է միայն անվանատարածքի անունը։",
        "defaultmessagetext": "Լռելյան տեքստը",
        "editwarning-warning": "Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։\nԵթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «{{int:prefs-editing}}» բաժնում։",
        "content-model-wikitext": "վիքիտեքստ",
+       "content-model-text": "պարզ տեքստ",
        "content-model-javascript": "ՋավաՍկրիպտ",
        "content-model-css": "ՍիԷսԷս",
+       "content-json-empty-object": "Դատարկ օբյեկտ",
        "duplicate-args-category": "Կաղապարներում կրկնվող արգումենտներով էջեր",
        "undo-success": "Խմբագրումը կարող է հետ շրջվել։ Ստուգեք տարբերակների համեմատությունը ստորև, որպեսզի համոզվեք, որ դա է ձեզ հետաքրքրող փոփոխությունը և մատնահարեք «Հիշել էջը»՝ գործողությունն ավարտելու համար։",
        "undo-failure": "Խմբագրումը չի կարող հետ շրջվել միջանկյալ խմբագրումների ընդհարման պատճառով։",
        "saveprefs": "Հիշել",
        "restoreprefs": "Զրոյացնել, բերելով իլռելայն նախընտրանքներին (բոլոր բաժիններում)",
        "prefs-editing": "Խմբագրում",
-       "rows": "Տողեր`",
-       "columns": "Սյունակներ",
        "searchresultshead": "Որոնում",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Պատառ հոդվածների հղումների</a> ձևավորման որոշման սահմանը.",
        "stub-threshold-sample-link": "օրինակ",
        "prefs-timeoffset": "Ժամային տարբերություն",
        "prefs-advancedediting": "Ընդլայնված ընրանքներ",
        "prefs-editor": "Խմբագիր",
+       "prefs-preview": "Նախադիտել",
        "prefs-advancedrc": "Ընդլայնված ընրանքներ",
        "prefs-advancedrendering": "Ընդլայնված ընրանքներ",
        "prefs-advancedsearchoptions": "Ընդլայնված ընրանքներ",
        "right-writeapi": "API գրի օգտագործումը",
        "right-delete": "Էջերի ջնջում",
        "right-rollback": "Արագ հետ գլորել տվյալ էջը վերջին անգամ խմբագրած մասնակցի խմբագրումները",
+       "grant-group-email": "Ուղարկել էլ. նամակ",
        "grant-createaccount": "Ստեղծել հաշիվներ",
        "grant-createeditmovepage": "Ստեղծել․ խմբագրել և տեղափոխել էջեր",
+       "grant-basic": "Հիմնական իրավունքներ",
        "newuserlogpage": "Մասնակիցների գրանցման տեղեկամատյան",
        "newuserlogpagetext": "Սա նոր մասնակիցների գրանցման տեղեկամատյանն է.",
        "rightslog": "Մասնակցի իրավունքների տեղեկամատյան",
        "recentchanges-legend-heading": "<strong>Լեգենդ՝</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "recentchanges-submit": "Ցույց տալ",
+       "rcfilters-filterlist-title": "Զտիչներ",
+       "rcfilters-filter-editsbyself-label": "Ձեր խմբագրումներ",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "pageinfo-length": "Ծավալ (բայթերով)",
        "pageinfo-article-id": "Էջի N",
        "pageinfo-language": "Բովանդակության լեզու",
+       "pageinfo-language-change": "փոխել",
        "pageinfo-robot-policy": "Կարգավիճակը որոնողական համակարգերում",
        "pageinfo-robot-index": "ինդեքսավորվող",
        "pageinfo-robot-noindex": "ինդեքսավորվող չէ",
        "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|քննարկում]]) մասնակիցը ջնջել է այս էջը ձեր խմաբգրումը սկսելուց հետո՝ հետևյալ պատճառով.\n: ''$2''\nԽնդրում ենք հաստատել, որ դուք իսկապես ուզում եք վերստեղծել այս էջը։",
        "recreate": "Վերստեղծել",
        "unit-pixel": " փիքսել",
-       "confirm_purge_button": "ԼԱՎ",
+       "confirm_purge_button": "Լավ",
        "confirm-purge-top": "Մաքրե՞լ այս էջի քեշը։",
-       "confirm-watch-button": "ԼԱՎ",
+       "confirm-watch-button": "Լավ",
        "confirm-watch-top": "Ավելացնե՞լ ձեր հսկացանկին",
-       "confirm-unwatch-button": "ԼԱՎ",
+       "confirm-unwatch-button": "Լավ",
        "confirm-unwatch-top": "Հեռացնե՞լ Ձեր հսկացանկից։",
        "imgmultipageprev": "← նախորդ էջ",
        "imgmultipagenext": "հաջորդ էջ →",
        "watchlisttools-raw": "Խմբագրել հում հսկացանկը",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|քննարկում]])",
        "version": "ՄեդիաՎիքի տարբերակը",
-       "version-ext-license": "Ô¼Õ«Ö\81Õ¥Õ¶Õ¦Õ«Õ¡",
+       "version-ext-license": "Ô±Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Õ«Ö\80",
        "version-ext-colheader-name": "Ընդլայնում",
        "version-ext-colheader-version": "Տարբերակ",
-       "version-ext-colheader-license": "Ô¼Õ«Ö\81Õ¥Õ¶Õ¦Õ«Õ¡",
-       "version-license-title": "Ô¼Õ«Ö\81Õ¥Õ¶Õ¦Õ«Õ¡ $1-ի համար",
+       "version-ext-colheader-license": "Ô±Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Õ«Ö\80",
+       "version-license-title": "Ô±Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Õ«Ö\80 $1-ի համար",
        "version-poweredby-credits": "Այս վիքին աշխատում է '''[https://www.mediawiki.org/ MediaWiki]'''֊ով, copyright © 2001-$1 $2։",
        "fileduplicatesearch": "Փնտրել կրկնօրինակ պատկերներ",
        "fileduplicatesearch-summary": "Փնտրել կրկնօրինակ պատկերներ՝ հեշ արժեքների հիման վրա",
        "duration-centuries": "$1 {{PLURAL:$1|դար}}",
        "duration-millennia": "$1 {{PLURAL:$1|հազարամյակ}}",
        "expandtemplates": "Կաղապարների ընդարձակում",
+       "pagelang-nonexistent-page": "$1 էջը գոյություն չունի",
        "special-characters-group-latin": "Լատիներեն",
        "special-characters-group-latinextended": "Լատիներեն ընդլայնված",
        "special-characters-group-ipa": "IPA",
        "special-characters-title-endash": "ո գծիկ (en dash)",
        "special-characters-title-emdash": "ա գծիկ (em dash)",
        "special-characters-title-minus": "հանածի նշան",
+       "mw-widgets-mediasearch-noresults": "Ոչինչ չի գտնվել",
        "authmanager-create-from-login": "Հաշիվ ստեղծելու համար, խնդրում ենք լրացնել ստորև դաշտերը"
 }
index c8826a6..f8dfc24 100644 (file)
@@ -15,7 +15,8 @@
                        "Carlosedepaula",
                        "Macofe",
                        "Karmwiki",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Rafaneta"
                ]
        },
        "tog-underline": "Sublinear ligamines:",
        "searcharticle": "Va",
        "history": "Historia del pagina",
        "history_short": "Historia",
+       "history_small": "historia",
        "updatedmarker": "actualisate post mi ultime visita",
        "printableversion": "Version pro imprimer",
        "permalink": "Ligamine permanente",
        "views": "Representationes",
        "toolbox": "Instrumentos",
        "tool-link-userrights": "Modificar le gruppos del {{GENDER:$1|usator|usatrice}}",
+       "tool-link-userrights-readonly": "Vider gruppos de {{GENDER:$1|usator}}",
        "tool-link-emailuser": "Inviar e-mail a iste {{GENDER:$1|usator|usatrice}}",
        "userpage": "Vider pagina del usator",
        "projectpage": "Vider pagina de projecto",
        "passwordreset-emaildisabled": "Le functionalitate de e-mail ha essite disactivate in iste wiki.",
        "passwordreset-username": "Nomine de usator:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Vider le e-mail resultante?",
-       "passwordreset-capture-help": "Si tu marca iste quadrato, le e-mail (con le contrasigno temporari) non solmente essera inviate al usator, ma anque monstrate a te.",
        "passwordreset-email": "Adresse de e-mail:",
        "passwordreset-emailtitle": "Detalios del conto in {{SITENAME}}",
        "passwordreset-emailtext-ip": "Un persona (probabilemente tu, ab le adresse IP $1) requestava le reinitialisation de tu\ncontrasigno de {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es\nassociate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.",
        "passwordreset-emailelement": "Nomine de usator: \n$1\n\nContrasigno temporari: \n$2",
        "passwordreset-emailsentemail": "Si iste adresse es associate a tu conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.",
        "passwordreset-emailsentusername": "Si il ha un adresse de e-mail associate a iste conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.",
-       "passwordreset-emailsent-capture2": "Le {{PLURAL:$1|message|messages}} de e-mail pro reinitialisation de contrasigno ha essite inviate. Le {{PLURAL:$1|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} es monstrate hic.",
-       "passwordreset-emailerror-capture2": "Le invio de e-mail al {{GENDER:$2|usator}} ha fallite: $1 Le {{PLURAL:$3|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} es monstrate hic.",
        "passwordreset-nocaller": "Un appellator debe esser fornite",
        "passwordreset-nosuchcaller": "Appellator non existe: $1",
        "passwordreset-ignored": "Le reinitialisation del contrasigno non ha essite realisate. Es possibile que nulle fornitor ha essite configurate?",
        "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.",
        "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.",
-       "summary-preview": "Previsualisation del summario:",
+       "summary-preview": "Previsualisation del summario de modification:",
        "subject-preview": "Previsualisation del subjecto:",
        "previewerrortext": "Un error ha occurrite durante le tentativa de previsualisar le cambiamentos.",
        "blockedtitle": "Le usator es blocate",
        "blockedtext": "'''Tu nomine de usator o adresse IP ha essite blocate.'''\n\nLe blocada esseva facite per $1.\nLe motivo presentate es ''$2''.\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Le blocato intendite: $7\n\nTu pote contactar $1 o un altere [[{{MediaWiki:Grouppage-sysop}}|administrator]] pro discuter le blocada.\nTu non pote usar le function 'inviar e-mail a iste usator' salvo que un adresse de e-mail valide es specificate in le\n[[Special:Preferences|preferentias de tu conto]] e que tu non ha essite blocate de usar lo.\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "autoblockedtext": "Tu adresse de IP ha essite automaticamente blocate proque un altere usator lo usava qui esseva blocate per $1.\nLe motivo presentate es:\n\n:''$2''\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu pote contactar $1 o un del altere [[{{MediaWiki:Grouppage-sysop}}|administratores]] pro discuter le blocada.\n\nNota que tu non pote utilisar le function \"inviar e-mail a iste usator\" salvo que tu ha registrate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]] e que tu non ha essite blocate de usar lo.\n\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
+       "systemblockedtext": "Tu nomine de usator o adresse IP ha essite blocate automaticamente per MediaWiki.\nLe motivo presentate es:\n\n:<em>$2</em>\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu adresse IP actual es $3.\nPer favor, include tote le detalios enumerate hic supra in omne questiones que tu pone.",
        "blockednoreason": "nulle motivo specificate",
        "whitelistedittext": "Tu debe $1 pro poter modificar paginas.",
        "confirmedittext": "Tu debe confirmar tu adresse de e-mail pro poter modificar paginas.\nPer favor entra e valida tu adresse de e-mail per medio de tu [[Special:Preferences|preferentias de usator]].",
        "search-interwiki-caption": "Projectos fratres",
        "search-interwiki-default": "Resultatos de $1:",
        "search-interwiki-more": "(plus)",
+       "search-interwiki-more-results": "plus resultatos",
        "search-relatedarticle": "Connexe",
        "searchrelated": "connexe",
        "searchall": "totes",
        "search-external": "Recerca externe",
        "searchdisabled": "Le recerca in {{SITENAME}} es disactivate.\nTu pote cercar via Google in le interim.\nNota que lor indices del contento de {{SITENAME}} pote esser obsolete.",
        "search-error": "Un error ha occurrite durante le recerca: $1",
+       "search-warning": "Un aviso se ha producite durante le recerca: $1",
        "preferences": "Preferentias",
        "mypreferences": "Preferentias",
        "prefs-edits": "Numero de modificationes:",
        "saveprefs": "Confirmar",
        "restoreprefs": "Restaurar tote le preselectiones (in tote le sectiones)",
        "prefs-editing": "Modification",
-       "rows": "Lineas:",
-       "columns": "Columnas:",
        "searchresultshead": "Recerca",
        "stub-threshold": "Limite pro formatar ligamines a peciettas ($1):",
        "stub-threshold-sample-link": "exemplo",
        "prefs-help-recentchangescount": "Isto include modificationes recente, historias de paginas, e registros.",
        "prefs-help-watchlist-token2": "Isto es le clave secrete pro le syndication web de tu observatorio.\nOmne persona qui lo cognosce pote leger tu observatorio, dunque, non divide lo.\n[[Special:ResetTokens|Clicca hic pro reinitialisar lo]].",
        "savedprefs": "Tu preferentias ha essite confirmate.",
-       "savedrights": "Le derectos de usator de {{GENDER:$1|$1}} ha essite salveguardate.",
+       "savedrights": "Le gruppos de usator de {{GENDER:$1|$1}} ha essite salveguardate.",
        "timezonelegend": "Fuso horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar le valor predefinite del wiki ($1)",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nomine de usator}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} de {{PLURAL:$1|gruppo|gruppos}}:",
+       "group-membership-link-with-expiry": "$1 (usque a $2)",
        "prefs-registration": "Data de registration:",
        "yourrealname": "Nomine real:",
        "yourlanguage": "Lingua:",
        "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-lookup-user": "Gerer gruppos de usatores",
+       "userrights-lookup-user": "Selige un usator",
        "userrights-user-editname": "Entra un nomine de usator:",
-       "editusergroup": "Modificar gruppos de {{GENDER:$1|usator}}",
+       "editusergroup": "Cargar gruppos de usator",
        "editinguser": "Cambia le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar gruppos de usatores",
+       "viewinguserrights": "Ecce le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Modificar le gruppos del {{GENDER:$1|usator}}",
+       "userrights-viewusergroup": "Vider le gruppos del {{GENDER:$1|user}}",
        "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 del quales iste usator es membro:\n* Un quadrato marcate significa que le usator es membro del gruppo in question.\n* Un non marcate significa que ille non es membro de illo.\n* Un * indica que tu non potera eliminar le gruppo quando tu lo ha addite, o vice versa.",
+       "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-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-nologin": "Tu debe [[Special:UserLogin|aperir un session]] con un conto de administrator pro poter assignar derectos de usator.",
-       "userrights-notallowed": "Tu non ha le permission de adder o remover derectos de usator.",
        "userrights-changeable-col": "Gruppos que tu pote modificar",
        "userrights-unchangeable-col": "Gruppos que tu non pote modificar",
+       "userrights-expiry-current": "Expiration: $1",
+       "userrights-expiry-none": "Non expira",
+       "userrights-expiry": "Expiration:",
+       "userrights-expiry-existing": "Expiration existente: le $2 a $3",
+       "userrights-expiry-othertime": "Altere hora:",
+       "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-conflict": "Conflicto inter cambiamentos de derectos de usator! Per favor revide e confirma tu cambiamentos.",
-       "userrights-removed-self": "Tu ha removite tu proprie derectos. In consequentia, tu non plus pote acceder a iste pagina.",
        "group": "Gruppo:",
        "group-user": "Usatores",
        "group-autoconfirmed": "Usatores autoconfirmate",
        "right-siteadmin": "Blocar e disblocar le base de datos",
        "right-override-export-depth": "Exportar paginas includente paginas ligate usque a un profunditate de 5",
        "right-sendemail": "Inviar e-mail a altere usatores",
-       "right-passwordreset": "Vider le e-mails pro reinitialisar le contrasigno",
        "right-managechangetags": "Crear e (de)activar [[Special:Tags|etiquettas]]",
        "right-applychangetags": "Applicar [[Special:Tags|etiquettas]] al proprie modificationes",
        "right-changetags": "Adder e remover qualcunque [[Special:Tags|etiquettas]] sur individual versiones e entratas de registro",
        "action-upload_by_url": "incargar iste file ab un adresse URL",
        "action-writeapi": "usar le API pro modificar le wiki",
        "action-delete": "deler iste pagina",
-       "action-deleterevision": "deler iste version",
-       "action-deletedhistory": "vider le historia delite de iste pagina",
+       "action-deleterevision": "deler versiones",
+       "action-deletelogentry": "deler entratas de registro",
+       "action-deletedhistory": "vider le historia delite de un pagina",
+       "action-deletedtext": "vider le texto de un version delite",
        "action-browsearchive": "cercar in paginas delite",
-       "action-undelete": "restaurar iste pagina",
-       "action-suppressrevision": "revider e restaurar iste version celate",
+       "action-undelete": "restaurar paginas",
+       "action-suppressrevision": "revider e restaurar versiones celate",
        "action-suppressionlog": "vider iste registro private",
        "action-block": "blocar iste usator de facer modificationes",
        "action-protect": "cambiar le nivellos de protection pro iste pagina",
        "action-userrights-interwiki": "modificar le derectos de usatores in altere wikis",
        "action-siteadmin": "blocar e disblocar le base de datos",
        "action-sendemail": "inviar e-mail",
+       "action-editmyoptions": "modificar tu preferentias",
        "action-editmywatchlist": "modificar le proprie observatorio",
        "action-viewmywatchlist": "vider le proprie observatorio",
        "action-viewmyprivateinfo": "vider le proprie information private",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam le [[Special:NewPages|lista de nove paginas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Monstrar",
+       "rcfilters-activefilters": "Filtros active",
+       "rcfilters-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-noresults": "Nulle filtro trovate",
+       "rcfilters-filtergroup-registration": "Registration del usator",
+       "rcfilters-filter-registered-label": "Registrate",
+       "rcfilters-filter-registered-description": "Redactores que ha aperite session.",
+       "rcfilters-filter-unregistered-label": "Non registrate",
+       "rcfilters-filter-unregistered-description": "Redactores que non ha aperite session.",
+       "rcfilters-filtergroup-authorship": "Autor del modificationes",
+       "rcfilters-filter-editsbyself-label": "Tu proprie modificationes",
+       "rcfilters-filter-editsbyself-description": "Modificationes per te.",
+       "rcfilters-filter-editsbyother-label": "Modificationes per alteres",
+       "rcfilters-filter-editsbyother-description": "Modificationes create per altere usatores (non te).",
+       "rcfilters-filtergroup-userExpLevel": "Nivello de experientia (solmente pro usatores registrate)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novicios",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Minus de 10 modificationes e 4 dies de activitate.",
+       "rcfilters-filter-userExpLevel-learner-label": "Apprentisses",
+       "rcfilters-filter-userExpLevel-learner-description": "Plus dies de activitate e modificationes que \"Novicios\" ma minus que \"Usatores con experientia\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usatores con experientia",
+       "rcfilters-filter-userExpLevel-experienced-description": "Plus de 30 dies de activitate e 500 modificationes.",
+       "rcfilters-filtergroup-automated": "Contributiones automatisate",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Modificationes facite per instrumentos automatisate.",
+       "rcfilters-filter-humans-label": "Persona (non robot)",
+       "rcfilters-filter-humans-description": "Modificationes facite per esseres human.",
+       "rcfilters-filtergroup-significance": "Importantia",
+       "rcfilters-filter-minor-label": "Modificationes minor",
+       "rcfilters-filter-minor-description": "Modificationes que le autor ha marcate como minor.",
+       "rcfilters-filter-major-label": "Modificationes non minor",
+       "rcfilters-filter-major-description": "Modificationes non marcate como minor.",
+       "rcfilters-filtergroup-changetype": "Typo de cambiamento",
+       "rcfilters-filter-pageedits-label": "Modificationes de paginas",
+       "rcfilters-filter-pageedits-description": "Modificationes de contento wiki, discussiones, descriptiones de categorias…",
+       "rcfilters-filter-newpages-label": "Creationes de paginas",
+       "rcfilters-filter-newpages-description": "Modificationes que face nove paginas.",
+       "rcfilters-filter-categorization-label": "Cambios de categoria",
+       "rcfilters-filter-categorization-description": "Registros del addition o remotion de paginas a/de categorias.",
+       "rcfilters-filter-logactions-label": "Actiones traciate",
+       "rcfilters-filter-logactions-description": "Actiones administrative, creation de contos, deletion de paginas, incargamentos…",
        "rcnotefrom": "Ecce le {{PLURAL:$5|modification|modificationes}} a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas monstrate).",
        "rclistfrom": "Monstrar nove modificationes a partir del $3 a $2",
        "rcshowhideminor": "$1 modificationes minor",
        "uploaded-setting-handler-svg": "Le SVG que fixa le attributo \"handler\" con un objectivo remote, de datos o de script es blocate, ma le codice <code>$1=\"$2\"</code> se trova in le file SVG incargate.",
        "uploaded-remote-url-svg": "Le SVG que contine un URL remote in un attributo de stilo es blocate, ma le codice <code>$1=\"$2\"</code> se trova in le file SVG incargate.",
        "uploaded-image-filter-svg": "Se trova un filtro de imagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in le file SVG incargate.",
-       "uploadscriptednamespace": "Iste file SVG contine un spatio de nomines invalide: \"$1\"",
+       "uploadscriptednamespace": "Iste file SVG contine un spatio de nomines invalide: \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Le codice XML in le file incargate non pote esser interpretate.",
        "uploadvirus": "Le file contine un virus! Detalios: $1",
        "uploadjava": "Iste file es un archivo ZIP que contine un file .class de Java.\nNon es permittite incargar files Java, proque istes pote contornar le restrictiones de securitate.",
        "uncategorizedcategories": "Categorias sin categoria",
        "uncategorizedimages": "Files non categorisate",
        "uncategorizedtemplates": "Patronos sin categoria",
+       "uncategorized-categories-exceptionlist": " # Contine un lista de categorias que non debe esser mentionate sur Special:UncategorizedCategories. Un per linea, comenciante con \"*\". Lineas que comencia con un altere character (incluse spatios) es ignorate. Usa \"#\" for commentos.",
        "unusedcategories": "Categorias non usate",
        "unusedimages": "Imagines non usate",
        "wantedcategories": "Categorias plus demandate",
        "apisandbox-sending-request": "Invia requesta API...",
        "apisandbox-loading-results": "Recipe resultatos API...",
        "apisandbox-results-error": "Un error ha occurrite durante le cargamento del responsa al consulta API: $1.",
+       "apisandbox-request-selectformat-label": "Monstrar datos del requesta como:",
+       "apisandbox-request-format-url-label": "Catena de requesta del URL",
        "apisandbox-request-url-label": "URL de requesta:",
+       "apisandbox-request-json-label": "JSON del requesta:",
        "apisandbox-request-time": "Duration del requesta: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrige le indicio e reinvia",
        "apisandbox-results-fixtoken-fail": "Impossibile recuperar indicio \"$1\".",
        "apisandbox-continue-clear": "Rader",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuara] le ultime requesta; {{int:apisandbox-continue-clear}} radera le parametros relative al continuation.",
        "apisandbox-param-limit": "Scribe <kbd>max</kbd> pro usar le limite maxime.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tote le spatios de nomines)",
+       "apisandbox-multivalue-all-values": "$1 (Tote le valores)",
        "booksources": "Fontes de libros",
        "booksources-search-legend": "Cercar fontes de libros",
        "booksources-search": "Cercar",
        "activeusers-count": "$1 {{PLURAL:$1|action|actiones}} in le ultime {{PLURAL:$3|die|$3 dies}}",
        "activeusers-from": "Presentar usatores a partir de:",
        "activeusers-groups": "Monstrar usatores pertinente a gruppos:",
+       "activeusers-excludegroups": "Excluder usatores pertinente a gruppos:",
        "activeusers-noresult": "Nulle usator trovate.",
        "activeusers-submit": "Monstrar usatores active",
        "listgrouprights": "Derectos del gruppos de usatores",
        "emailccsubject": "Copia de tu message a $1: $2",
        "emailsent": "E-mail inviate",
        "emailsenttext": "Tu message de e-mail ha essite inviate.",
-       "emailuserfooter": "Iste e-mail ha essite {{GENDER:$1|inviate}} per $1 a {{GENDER:$2|$2}} con le function \"{{int:emailuser}}\" in {{SITENAME}}.",
+       "emailuserfooter": "Iste e-mail ha essite {{GENDER:$1|inviate}} per $1 a {{GENDER:$2|$2}} con le function \"{{int:emailuser}}\" in {{SITENAME}}.\nSi {{GENDER:$2|tu}} responde a iste message, {{GENDER:$2|tu}} responsa essera inviate directemente al {{GENDER:$1|expeditor|expeditrice}} original, revelante {{GENDER:$2|tu}} adresse de e-mail a {{GENDER:$1|ille|illa}}.",
        "usermessage-summary": "Lassante un message de systema.",
        "usermessage-editor": "Messagero del systema",
        "watchlist": "Observatorio",
        "changecontentmodel-emptymodels-title": "Nulle modello de contento disponibile",
        "changecontentmodel-emptymodels-text": "Le contento in [[:$1]] non pote esser convertite in alcun typo.",
        "log-name-contentmodel": "Registro de cambiamentos de modello de contento",
-       "log-description-contentmodel": "Eventos relative al modellos de contento de un pagina",
+       "log-description-contentmodel": "Iste pagina monstra cambiamentos in le modello de contento de paginas, e paginas que ha essite create con un modello de contento altere que le predefinite.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creava}} le pagina $3 con le modello de contento non predefinite \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiava}} le modello de contento del pagina $3 de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "proxyblockreason": "Tu adresse IP ha essite blocate proque illo es un proxy aperte.\nPer favor contacta tu providitor de servicio internet o supporto technic e informa les de iste problema grave de securitate.",
        "sorbsreason": "Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.",
        "sorbs_create_account_reason": "Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.\nTu non pote crear un conto",
+       "softblockrangesreason": "Contributiones anonime non son permittite de vostre adresse de IP ($1). Si il vos place, identifica vos.",
        "xffblockreason": "Un adresse IP presente in le capite X-Forwarded-For, o le tue o illo de un servitor proxy que tu usa, ha essite blocate. Le motivo original pro le blocada es: $1",
        "cant-see-hidden-user": "Le usator que tu tenta blocar ha ja essite blocate e celate. Post que tu non ha le derecto hideuser, tu non pote vider o modificar le blocada del usator.",
        "ipbblocked": "Tu non pote blocar o disblocar altere usatores, proque tu mesme es blocate",
        "cant-move-to-user-page": "Tu non ha le permission de renominar un pagina verso un pagina de usator (excepte un subpagina de usator).",
        "cant-move-category-page": "Tu non ha le permission de renominar paginas de categoria.",
        "cant-move-to-category-page": "Tu non ha le permission de renominar un pagina in un pagina de categoria.",
+       "cant-move-subpages": "Tu non ha le permission de renominar subpaginas.",
+       "namespace-nosubpages": "Le spatio de nomines \"$1\" non permitte subpaginas.",
        "newtitle": "Nove titulo:",
        "move-watch": "Observar le paginas de origine e de destination",
        "movepagebtn": "Renominar pagina",
        "pageinfo-length": "Dimension del pagina (in bytes)",
        "pageinfo-article-id": "ID del pagina",
        "pageinfo-language": "Lingua del contento del pagina",
+       "pageinfo-language-change": "cambiar",
        "pageinfo-content-model": "Modello de contento de pagina",
        "pageinfo-content-model-change": "cambiar",
        "pageinfo-robot-policy": "Indexation per robots",
        "tags-deactivate": "disactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|modification|modificationes}}",
        "tags-manage-no-permission": "Tu non ha le permission de gerer le etiquettas de modification.",
-       "tags-manage-blocked": "Tu non pote gerer etiquettas de cambiamento durante que tu es blocate.",
+       "tags-manage-blocked": "Tu non pote gerer etiquettas de cambiamento durante que {{GENDER:$1|tu}} es blocate.",
        "tags-create-heading": "Crear un nove etiquetta",
        "tags-create-explanation": "Per configuration predefinite, le etiquettas novemente create essera disponibile pro le uso per usatores e robots.",
        "tags-create-tag-name": "Nomine del etiquetta:",
        "tags-deactivate-not-allowed": "Non es possibile disactivar le etiquetta \"$1\".",
        "tags-deactivate-submit": "Disactivar",
        "tags-apply-no-permission": "Tu non ha le permission de adjunger etiquettas de cambiamento a tu cambiamentos.",
-       "tags-apply-blocked": "Tu non pote applicar etiquettas de cambiamento con tu cambiamentos durante que tu es blocate.",
+       "tags-apply-blocked": "Tu non pote applicar etiquettas de cambiamento con tu cambiamentos durante que {{GENDER:$1|tu}} es blocate.",
        "tags-apply-not-allowed-one": "Non es permittite applicar le etiquetta \"$1\" manualmente.",
        "tags-apply-not-allowed-multi": "Le sequente {{PLURAL:$2|etiquetta|etiquettas}} non es autorisate a esser manualmente applicate: $1",
        "tags-update-no-permission": "Tu non ha le permission de adder o remover etiquettas de cambiamento sur individual versiones o entratas de registro.",
-       "tags-update-blocked": "Tu non pote adder o remover etiquettas de cambiamento durante que tu es blocate.",
+       "tags-update-blocked": "Tu non pote adder o remover etiquettas de cambiamento durante que {{GENDER:$1|tu}} es blocate.",
        "tags-update-add-not-allowed-one": "Non es permittite adjunger le etiquetta \"$1\" manualmente.",
        "tags-update-add-not-allowed-multi": "Le sequente {{PLURAL:$2|etiquetta|etiquettas}} non es autorisate a esser manualmente adjungite: $1",
        "tags-update-remove-not-allowed-one": "Non es permittite remover le etiquetta \"$1\".",
        "htmlform-user-not-exists": "<strong>$1</strong> non existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> non es un nomine de usator valide.",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleva}} le pagina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleva}} le redirection $3 superscribente lo",
        "logentry-delete-restore": "$1 {{GENDER:$2|restaurava}} le pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4",
        "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",
        "feedback-bugcheck": "Bon! Ma per favor verifica que iste falta non es [$1 jam cognoscite].",
        "feedback-useragent": "Agente usator:",
        "searchsuggest-search": "Cercar in {{SITENAME}}",
        "searchsuggest-containing": "continente...",
-       "api-error-autoblocked": "Tu adresse IP ha essite blocate automaticamente, perque illo ha essite usate per un usator blocate.",
-       "api-error-badaccess-groups": "Tu non ha le permission de incargar files in iste wiki.",
        "api-error-badtoken": "Error interne: indicio invalide.",
-       "api-error-blocked": "Le modification ha essite blocate pro te.",
-       "api-error-copyuploaddisabled": "Le incargamentos per URL es disactivate in iste servitor.",
-       "api-error-duplicate": "Existe jam {{PLURAL:$1|un altere file|altere files}} in le wiki con le mesme contento.",
-       "api-error-duplicate-archive": "Il habeva jam {{PLURAL:$1|un altere file|altere files}} in le sito con le mesme contento, ma {{PLURAL:$1|illo|illos}} ha essite delite.",
-       "api-error-empty-file": "Le file que tu submitteva es vacue.",
        "api-error-emptypage": "Le creation de nove paginas vacue non es permittite.",
-       "api-error-fetchfileerror": "Error interne: qualcosa errava durante le obtention del file.",
-       "api-error-fileexists-forbidden": "Un file con le nomine \"$1\" jam existe, e non pote esser superscribite.",
-       "api-error-fileexists-shared-forbidden": "Un file con le nomine \"$1\" jam existe in le repositorio commun de files, e non pote esser superscribite.",
-       "api-error-file-too-large": "Le file que tu submitteva es troppo grande.",
-       "api-error-filename-tooshort": "Le nomine del file es troppo curte.",
-       "api-error-filetype-banned": "Iste typo de file es prohibite.",
-       "api-error-filetype-banned-type": "$1 non es {{PLURAL:$4|un typo|typos}} de file permittite. Le {{PLURAL:$3|typo|typos}} de file permittite es $2.",
-       "api-error-filetype-missing": "Le nomine del file non ha un extension.",
-       "api-error-hookaborted": "Le modification que tu ha tentate facer ha essite abortate per un extension.",
-       "api-error-http": "Error interne: impossibile connecter al servitor.",
-       "api-error-illegal-filename": "Iste nomine de file non es permittite.",
-       "api-error-internal-error": "Error interne: qualcosa errava durante le processamento de tu file incargate in le wiki.",
-       "api-error-invalid-file-key": "Error interne: file non trovate in le spatio de immagazinage temporari.",
-       "api-error-missingparam": "Error interne: certe parametros mancava al requesta.",
-       "api-error-missingresult": "Error interne: non poteva determinar si le copia succedeva.",
-       "api-error-mustbeloggedin": "Es necessari aperir session pro incargar files.",
-       "api-error-mustbeposted": "Error interne: le requesta require HTTP POST.",
-       "api-error-noimageinfo": "Le incargamento succedeva, ma le servitor non forniva alcun information super le file.",
-       "api-error-nomodule": "Error interne: nulle modulo de incargamento definite.",
-       "api-error-ok-but-empty": "Error interne: nulle responsa del servitor.",
-       "api-error-overwrite": "Superscriber un file existente non es permittite.",
-       "api-error-ratelimited": "Tu tenta incargar plus files in curte tempore que iste wiki permitte.\nPer favor, reproba in alcun minutas.",
-       "api-error-stashfailed": "Error interne: le servitor non poteva immagazinar le file temporari.",
        "api-error-publishfailed": "Error interne: le servitor non poteva publicar le file temporari.",
-       "api-error-stasherror": "Un error ha occurrite durante le incargamento del file in \"stash\".",
-       "api-error-stashedfilenotfound": "Le file in reserva non ha essite trovate durante le tentativa de incargar lo ab le reserva.",
-       "api-error-stashpathinvalid": "Le cammino ubi le file in reserva deberea haber essite trovate non es valide.",
-       "api-error-stashfilestorage": "Un error ha occurrite durante le immagazinage del file in reserva.",
-       "api-error-stashzerolength": "Le servitor non ha potite mitter le file in reserva perque illo ha un longitude de zero.",
-       "api-error-stashnotloggedin": "Tu debe aperir session pro poter salveguardar files in le reserva de incargamento.",
-       "api-error-stashwrongowner": "Le file al qual tu tentava acceder in le reserva non pertine a te.",
-       "api-error-stashnosuchfilekey": "Le clave de file al qual tu tentava acceder in le reserva non existe.",
-       "api-error-timeout": "Le servitor non ha respondite intra le tempore expectate.",
-       "api-error-unclassified": "Un error incognite ha occurrite.",
-       "api-error-unknown-code": "Error incognite: \"$1\"",
-       "api-error-unknown-error": "Error interne: qualcosa errava durante le tentativa de incargar le file.",
-       "api-error-unknown-warning": "Advertimento incognite: $1",
+       "api-error-stashfailed": "Error interne: le servitor non poteva immagazinar le file temporari.",
+       "api-error-unknown-warning": "Advertimento incognite: \"$1\".",
        "api-error-unknownerror": "Error incognite: \"$1\".",
-       "api-error-uploaddisabled": "Le incargamento es disactivate in iste wiki.",
-       "api-error-verification-error": "Le file pote esser corrumpite o su nomine pote haber un extension errate.",
-       "api-error-was-deleted": "Un file con iste nomine ha jam essite incargate e postea delite.",
        "duration-seconds": "$1 {{PLURAL:$1|secunda|secundas}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minutas}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Lingua",
        "pagelang-use-default": "Usar lingua predefinite",
        "pagelang-select-lang": "Selige lingua",
+       "pagelang-reason": "Ration",
        "pagelang-submit": "Submitter",
+       "pagelang-nonexistent-page": "Le pagina $1 non existe.",
+       "pagelang-unchanged-language": "Le pagina $1 es jam fixate sur le lingua $2.",
+       "pagelang-unchanged-language-default": "Le pagina $1 es jam fixate sur le lingua predefinite de contento del wiki.",
+       "pagelang-db-failed": "Le base de datos non ha potite cambiar le lingua del pagina.",
        "right-pagelang": "Cambiar lingua del pagina",
        "action-pagelang": "cambiar le lingua del pagina",
        "log-name-pagelang": "Registro de cambios de lingua",
        "mw-widgets-dateinput-no-date": "Nulle data seligite",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Cercar multimedia",
+       "mw-widgets-mediasearch-noresults": "Nulle resultato trovate.",
        "mw-widgets-titleinput-description-new-page": "pagina non existe ancora",
        "mw-widgets-titleinput-description-redirect": "redirection a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Adder un categoria…",
+       "mw-widgets-usersmultiselect-placeholder": "Adder plus...",
        "sessionmanager-tie": "Impossibile combinar plure typos de authentication de requesta: $1.",
        "sessionprovider-generic": "sessiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessiones basate sur cookies",
        "sessionprovider-nocookies": "Le cookies pote esser disactivate. Assecura te de haber activate le cookies e recomencia.",
        "randomrootpage": "Pagina radice aleatori",
        "log-action-filter-block": "Typo de blocada:",
-       "log-action-filter-contentmodel": "Typo de modification de modello de contento:",
+       "log-action-filter-contentmodel": "Typo de cambiamento del modello de contento:",
        "log-action-filter-delete": "Typo de deletion:",
        "log-action-filter-import": "Typo de importation:",
        "log-action-filter-managetags": "Typo de action de gestion de etiquettas:",
        "log-action-filter-block-block": "Blocar",
        "log-action-filter-block-reblock": "Modification de blocada",
        "log-action-filter-block-unblock": "Disblocar",
-       "log-action-filter-contentmodel-change": "Cambio de modello de contento",
-       "log-action-filter-contentmodel-new": "Creation de pagina con modello de contento non standard",
+       "log-action-filter-contentmodel-change": "Cambiamento de modello de contento",
+       "log-action-filter-contentmodel-new": "Creation de pagina con un modello de contento non predefinite",
        "log-action-filter-delete-delete": "Deletion de pagina",
+       "log-action-filter-delete-delete_redir": "Superscriptura de redirection",
        "log-action-filter-delete-restore": "Restauration de pagina",
        "log-action-filter-delete-event": "Deletion de registro",
        "log-action-filter-delete-revision": "Deletion de version",
        "usercssispublic": "Nota ben: Subpaginas CSS non debe continer datos confidential perque altere usatores pote vider los.",
        "restrictionsfield-badip": "Adresse o intervallo IP non valide: $1",
        "restrictionsfield-label": "Intervallos IP permittite:",
-       "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errores:\n\n$1"
+       "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "version $1",
+       "pageid": "ID de pagina $1"
 }
index 9f4b69c..412a133 100644 (file)
@@ -50,7 +50,8 @@
                        "Beeyan",
                        "Bonaditya",
                        "Irus",
-                       "Presidenvolksraad"
+                       "Presidenvolksraad",
+                       "Hidayatsrf"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "tagline": "Dari {{SITENAME}}",
        "help": "Bantuan",
        "search": "Pencarian",
+       "search-ignored-headings": "# <pre>\n# Judul yang akan diabaikan oleh pencarian.\n# Suntingan ini akan diterapkan setelah halaman dengan judul ini diindeks.\n# Anda bisa memaksakan pengindeksan kembali halaman ini dengan melakukan suntingan kosong (''null edit'')\n# Sintaksisnya adalah seperti berikut:\n#   * Semuanya dari karakter \"#\" ke akhir baris adalah sebuah komentar.\n#   * Setiap baris tak-kosong adalah judul tepat yang akan diabaikan.\nReferensi\nPranala luar\nLihat pula\n #</pre>",
        "searchbutton": "Cari",
        "go": "Tuju ke",
        "searcharticle": "Lanjut",
        "history": "Riwayat halaman",
        "history_short": "Versi terdahulu",
+       "history_small": "riwayat",
        "updatedmarker": "diubah sejak kunjungan terakhir saya",
        "printableversion": "Versi cetak",
        "permalink": "Pranala permanen",
        "views": "Tampilan",
        "toolbox": "Perkakas",
        "tool-link-userrights": "Simpan kelompok {{GENDER:$1|pengguna}}",
+       "tool-link-userrights-readonly": "Lihat kelompok {{GENDER:$1|pengguna}}",
        "tool-link-emailuser": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "userpage": "Lihat halaman pengguna",
        "projectpage": "Lihat halaman proyek",
        "eauthentsent": "Sebuah surel untuk konfirmasi telah dikirim ke alamat surel. Sebelum surel lainnya dikirim ke akun tersebut, Anda harus mengikuti instruksi di dalam surel tersebut, untuk melakukan konfirmasi bahwa alamat tersebut adalah benar kepunyaan Anda.",
        "throttled-mailpassword": "Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|$1 jam}} terakhir.\nUntuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|$1 jam}}.",
        "mailerror": "Kesalahan dalam mengirimkan surel: $1",
-       "acct_creation_throttle_hit": "Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diizinkan.\nKarenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.",
+       "acct_creation_throttle_hit": "Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam $2 terakhir, hingga jumlah maksimum yang diizinkan.\nKarenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.",
        "emailauthenticated": "Alamat surel Anda telah dikonfirmasi pada $3, $2.",
        "emailnotauthenticated": "Alamat surel Anda belum dikonfirmasi.\nSebelum dikonfirmasi Anda tidak akan menerima surel dari fitur berikut.",
        "noemailprefs": "Anda harus memasukkan alamat surel di preferensi Anda untuk dapat menggunakan fitur-fitur ini.",
        "botpasswords-label-delete": "Hapus",
        "botpasswords-label-resetpassword": "Setel ulang kata sandi",
        "botpasswords-label-grants": "Akses yang dapat diberikan:",
-       "botpasswords-help-grants": "Tiap izin memberikan akses ke hak-hak pengguna yang telah dimiliki suatu akun pengguna. Lihat [[Special:ListGrants|tabel izin]] untuk informasi lebih lanjut.",
+       "botpasswords-help-grants": "Izin ke akses tertentu telah dimiliki oleh akun pengguna Anda. Mengaktifkan sebuah hak di sini tidak memberikan akses ke akses lain yang tidak dimiliki oleh akun pengguna Anda. Lihat [[Special:ListGrants|daftar hak akses]] untuk informasi selengkapnya.",
        "botpasswords-label-grants-column": "Izin diberikan",
        "botpasswords-bad-appid": "Nama bot \"$1\" tidak valid.",
        "botpasswords-insert-failed": "Gagal menambah nama bot \"$1\". Apakah sudah ditambahkan sebelum ini?",
        "botpasswords-updated-body": "Kata sandi bot \"$1\" dari pengguna \"$2\" berhasil diperbarui.",
        "botpasswords-deleted-title": "Kata sandi bot dihapus",
        "botpasswords-deleted-body": "Kata sandi bot \"$1\" dari pengguna \"$2\" telah dihapus.",
-       "botpasswords-newpassword": "Kata sandi baru untuk masuk log dengan '''$1''' adalah '''$2'''. ''Mohon simpan untuk referensi di kemudian hari.''",
+       "botpasswords-newpassword": "Kata sandi baru untuk masuk log dengan <strong>$1</strong> adalah <strong>$2</strong>. <em>Catatlah kata sandi ini untuk referensi ke depan.</em> <br> (Untuk bot lama yang memerlukan nama masuk log yang sama dengan nama pengguna, dapat menggunakan <strong>$3</strong> sebagai nama pengguna dan <strong>$4</strong> sebagai kata sandi.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider tidak tersedia.",
        "botpasswords-restriction-failed": "Batasan kata sandi menghalangi masuk log ini.",
        "botpasswords-invalid-name": "Nama pengguna yang diberikan tidak mengandung pemisah kata sandi bot (\"$1\").",
        "passwordreset-emaildisabled": "Fitur surel telah dinonaktifkan pada wiki ini.",
        "passwordreset-username": "Nama pengguna:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Lihat surel yang dihasilkan?",
-       "passwordreset-capture-help": "Jika Anda mencentang kotak ini, surel (dengan kata sandi sementara) akan ditampilkan ke Anda dan juga dikirim ke pengguna.",
        "passwordreset-email": "Alamat surel:",
        "passwordreset-emailtitle": "Detail akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat\ndetail akun untuk {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} berikut\nterkait dengan alamat surel ini:\n\n$2\n\n{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.\nAnda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat\npermintaan ini atau jika Anda ingat sandi asli dan tidak lagi\ningin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.",
        "passwordreset-emailelement": "Nama pengguna: \n$1\n\nSandi sementara: \n$2",
        "passwordreset-emailsentemail": "Jika alamat surel ini berkaitan dengan akun Anda, maka surel untuk menyetel ulang kata sandi akan dikirim.",
        "passwordreset-emailsentusername": "Jika ada alamat surel yang berkaitan dengan nama pengguna ini, maka surel untuk menyetel ulang kata sandi akan dikirim.",
-       "passwordreset-emailsent-capture2": "Pemulihan kata sandi {{PLURAL:$1|surel|surel}} telah dikirim. {{PLURAL:$1|Nama pengguna dan kata sandi|Daftar nama pengguna dan kata sandi}} ditampilkan di bawah.",
-       "passwordreset-emailerror-capture2": "Pengiriman surel kepada {{GENDER:$2|pengguna}} gagal: $1 {{PLURAL:$3|Nama pengguna dan kata sandi|Daftar nama pengguna dan kata sandi}} ditampilkan di bawah.",
        "passwordreset-nocaller": "Pemanggil harus diberikan",
        "passwordreset-nosuchcaller": "Pemanggil tidak ada: $1",
        "passwordreset-ignored": "Pemulihan kata sandi tidak tertangani. Mungkin penyedia tidak diatur?",
        "blockedtitle": "Pengguna diblokir",
        "blockedtext": "'''Nama pengguna atau alamat IP Anda telah diblokir.'''\n\nBlokir dilakukan oleh $1.\nAlasan yang diberikan adalah ''$2''.\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur 'Kirim surel ke pengguna ini' kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda adalah $3, dan ID pemblokiran adalah $5.\nTolong sertakan salah satu atau kedua informasi ini pada setiap pertanyaan yang Anda buat.",
        "autoblockedtext": "Alamat IP Anda telah terblokir secara otomatis karena digunakan oleh pengguna lain, yang diblokir oleh $1. Pemblokiran dilakukan atas alasan:\n\n:''$2''\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur \"kirim surel ke pengguna ini\" kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] Anda dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda saat ini adalah $3, dan ID pemblokiran adalah #$5.\nTolong sertakan informasi-informasi ini dalam setiap pertanyaan Anda.",
+       "systemblockedtext": "Nama pengguna atau alamat IP Anda telah diblokir secara otomatis oleh MediaWiki.\nAlasan yang diberikan adalah:\n\n:<em>$2</em>\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAlamat IP Anda saat ini adalah $3\nMohon sertakan semua perincian di atas dalam setiap pertanyaan yang Anda ajukan.",
        "blockednoreason": "tidak ada alasan yang diberikan",
        "whitelistedittext": "Anda harus $1 untuk dapat menyunting halaman.",
        "confirmedittext": "Anda harus mengkonfirmasikan dulu alamat surel Anda sebelum menyunting halaman.\nHarap masukkan dan validasikan alamat surel Anda melalui [[Special:Preferences|halaman preferensi pengguna]] Anda.",
        "invalid-content-data": "Data konten tidak sah",
        "content-not-allowed-here": "Konten \"$1\" tidak diizinkan di halaman [[$2]]",
        "editwarning-warning": "Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.\nJika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat bagian \"Penyuntingan\" pada halaman preferensi Anda.",
+       "editpage-invalidcontentmodel-title": "Model konten tidak didukung",
+       "editpage-invalidcontentmodel-text": "Model konten \"$1\" tidak didukung.",
        "editpage-notsupportedcontentformat-title": "Format konten tidak didukung",
        "editpage-notsupportedcontentformat-text": "Format konten $1 tidak didukung oleh model konten $2.",
        "content-model-wikitext": "teks wiki",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objek kosong",
        "content-json-empty-array": "Larik kosong",
+       "deprecated-self-close-category": "Halaman yang menggunakan tag HTML tertutup-sendiri tidak sah",
+       "deprecated-self-close-category-desc": "Halaman ini mengandung tag HTML tertutup-sendiri yang tidak sah, seperti <code>&lt;b/></code> atau <code>&lt;span/></code>.  Perilaku tag seperti ini akan segera berubah agar konsisten dengan spesifikasi HTML5, jadi penggunaannya dalam teks wiki tidak lagi disarankan.",
        "duplicate-args-warning": "<strong>Peringatan:</strong> [[:$1]] memanggil [[:$2]] dengan nilai lebih dari satu untuk parameter \"$3\". Hanya nilai terakhir yang tersedia yang akan digunakan.",
        "duplicate-args-category": "Halaman dengan argumen ganda di pemanggilan templat",
        "duplicate-args-category-desc": "Halaman ini berisi pemanggilan templat yang menggunakan argumen ganda, seperti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "search-external": "Pencarian eksternal",
        "searchdisabled": "Pencarian {{SITENAME}} sementara dimatikan.\nAnda dapat mencari melalui Google untuk sementara waktu.\nPerlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.",
        "search-error": "Kesalahan terjadi saat mencari: $1",
+       "search-warning": "Peringatan terjadi ketika mencari: $1",
        "preferences": "Preferensi",
        "mypreferences": "Preferensi",
        "prefs-edits": "Jumlah suntingan:",
        "saveprefs": "Simpan",
        "restoreprefs": "Kembalikan semua setelan bawaan",
        "prefs-editing": "Penyuntingan",
-       "rows": "Baris:",
-       "columns": "Kolom:",
        "searchresultshead": "Cari",
        "stub-threshold": "Ambang batas untuk format pranala rintisan ($1):",
        "stub-threshold-sample-link": "contoh",
        "prefs-help-recentchangescount": "Opsi ini berlaku untuk perubahan terbaru, versi terdahulu halaman, dan log.",
        "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke umpan web dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan. Jika diperlukan\n[[Special:ResetTokens|Anda dapat mengatur ulang kunci tersebut]].",
        "savedprefs": "Preferensi Anda telah disimpan",
-       "savedrights": "Hak pengguna {{GENDER:$1|$1}} telah disimpan.",
+       "savedrights": "Kelompok hak pengguna {{GENDER:$1|$1}} telah disimpan.",
        "timezonelegend": "Zona waktu:",
        "localtime": "Waktu setempat:",
        "timezoneuseserverdefault": "Gunakan bawaan wiki ($1)",
        "username": "{{GENDER:$1|Nama pengguna}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|kelompok|kelompok}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (sampai $2)",
        "prefs-registration": "Waktu pendaftaran:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Nama asli:",
        "prefswarning-warning": "Perubahan preferensi anda belum tersimpan. Apabila anda meninggalkan halaman ini tanpa men-klik \"$1\" preferensi anda tidak akan diperbarui.",
        "prefs-tabs-navigation-hint": "Tip: Anda dapat menggunakan tombol panah kiri dan kanan untuk bernavigasi antartab di dalam daftar tab.",
        "userrights": "Manajemen hak pengguna",
-       "userrights-lookup-user": "Mengatur kelompok pengguna",
+       "userrights-lookup-user": "Pilih seorang pengguna",
        "userrights-user-editname": "Masukkan nama pengguna:",
-       "editusergroup": "Sunting kelompok {{GENDER:$1|pengguna}}",
+       "editusergroup": "Muat kelompok pengguna",
        "editinguser": "Mengubah hak pengguna untuk {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Melihat hak pengguna dari {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Sunting kelompok pengguna",
+       "userrights-viewusergroup": "Lihat kelompok pengguna",
        "saveusergroups": "Simpan kelompok {{GENDER:$1|pengguna}}",
        "userrights-groupsmember": "Anggota dari:",
        "userrights-groupsmember-auto": "Anggota implisit dari:",
        "userrights-reason": "Alasan:",
        "userrights-no-interwiki": "Anda tidak memiliki hak untuk mengubah hak pengguna di wiki yang lain.",
        "userrights-nodatabase": "Basis data $1 tidak ada atau bukan lokal.",
-       "userrights-nologin": "Anda harus [[Special:UserLogin|masuk log]] dengan menggunakan akun pengurus untuk dapat mengubah hak pengguna.",
-       "userrights-notallowed": "AkunAnda tidak berhak untuk menambahkan atau membuang hak pengguna.",
        "userrights-changeable-col": "Kelompok yang dapat Anda ubah",
        "userrights-unchangeable-col": "Kelompok yang tidak dapat Anda ubah",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-othertime": "Waktu lain:",
        "userrights-conflict": "Konflik perubahan hak pengguna! Silakan tinjau ulang dan konfirmasi perubahan Anda.",
-       "userrights-removed-self": "Anda telah mencabut hak-hak Anda sendiri. Anda tidak bisa lagi mengakses halaman ini.",
        "group": "Kelompok:",
        "group-user": "Pengguna",
        "group-autoconfirmed": "Pengguna terkonfirmasi otomatis",
        "right-siteadmin": "Mengunci dan membuka kunci basis data",
        "right-override-export-depth": "Ekspor halaman termasuk halaman-halaman terkait hingga kedalaman 5",
        "right-sendemail": "Mengirim surel ke pengguna lain",
-       "right-passwordreset": "Lihat surel pengaturulangan kata sandi",
        "right-managechangetags": "Buat dan matikan [[Special:Tags|tag]]",
        "right-applychangetags": "Terapkan [[Special:Tags|tags]] bersamaan dengan perubahan pengguna",
        "right-changetags": "Tambah dan hapus [[Special:Tags|tag]] arbitrari pada revisi masing-masing dan entri log",
        "grant-group-high-volume": "Melakukan aktivitas yang amat banyak",
        "grant-group-customization": "Kustomisasi dan preferensi",
        "grant-group-administration": "Melakukan tindakan administratif",
+       "grant-group-private-information": "Akses data pribadi tentang Anda",
        "grant-group-other": "Aktivitas lain-lain",
        "grant-blockusers": "Blokir dan buka pemblokiran pengguna",
        "grant-createaccount": "Buat akun",
        "grant-highvolume": "Penyuntingan dengan volume tinggi",
        "grant-oversight": "Sembunyikan pengguna dan revisinya",
        "grant-patrol": "Tandai halaman terpatroli",
+       "grant-privateinfo": "Akses informasi pribadi",
        "grant-protect": "Melindungi dan membuka perlindungan halaman",
        "grant-rollback": "Membalikkan perubahan pada halaman",
        "grant-sendemail": "Mengirim surel kepada pengguna lain",
        "grant-basic": "Akses dasar",
        "grant-viewdeleted": "Melihat halaman dan berkas yang dihapus",
        "grant-viewmywatchlist": "Lihat daftar pantauan Anda",
+       "grant-viewrestrictedlogs": "Lihat entri log terbatas",
        "newuserlogpage": "Log pengguna baru",
        "newuserlogpagetext": "Di bawah ini adalah log pendaftaran pengguna baru",
        "rightslog": "Log perubahan hak akses",
        "action-upload_by_url": "memuatkan berkas ini dari sebuah alamat URL",
        "action-writeapi": "menggunakan API penulisan",
        "action-delete": "menghapus halaman ini",
-       "action-deleterevision": "menghapus revisi ini",
-       "action-deletedhistory": "melihat versi terdahulu halaman yang telah dihapus ini",
+       "action-deleterevision": "menghapus revisi",
+       "action-deletelogentry": "hapus entri log",
+       "action-deletedhistory": "melihat versi terdahulu halaman yang telah dihapus",
+       "action-deletedtext": "lihat teks revisi yang dihapus",
        "action-browsearchive": "mencari halaman-halaman yang telah dihapus",
-       "action-undelete": "membatalkan penghapusan halaman ini",
-       "action-suppressrevision": "meninjau dan mengembalikan revisi yang disembunyikan ini",
+       "action-undelete": "batalkan penghapusan halaman",
+       "action-suppressrevision": "tinjau dan kembalikan revisi yang disembunyikan",
        "action-suppressionlog": "melihat log privat ini",
        "action-block": "Blokir pengguna ini dari penyuntingan",
        "action-protect": "mengganti tingkat pelindungan halaman ini",
        "action-userrights-interwiki": "menyunting hak akses dari pengguna di wiki lain",
        "action-siteadmin": "mengunci atau membuka kunci basis data",
        "action-sendemail": "kirim surel",
+       "action-editmyoptions": "sunting preferensi Anda",
        "action-editmywatchlist": "sunting daftar pantauan Anda",
        "action-viewmywatchlist": "lihat daftar pantau Anda",
        "action-viewmyprivateinfo": "lihat informasi pribadi Anda",
        "action-applychangetags": "terapkan tag bersamaan dengan perubahan Anda",
        "action-changetags": "menambah dan menghapus tag semaunya pada revisi individu dan entri log",
        "action-deletechangetags": "hapus tag dari basis data",
+       "action-purge": "hapus singgahan halaman ini",
        "nchanges": "$1 {{PLURAL:$1|perubahan|perubahan}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sejak kunjungan terakhir}}",
        "enhancedrc-history": "riwayat",
        "recentchanges-legend-heading": "<strong>Keterangan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat pula [[Special:NewPages|daftar halaman baru]])",
        "recentchanges-submit": "Tampilkan",
+       "rcfilters-activefilters": "Filter aktif",
+       "rcfilters-filter-registered-label": "Terdaftar",
+       "rcfilters-filter-unregistered-label": "Tidak terdaftar",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Pendatang baru",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-minor-label": "Suntingan kecil",
+       "rcfilters-filter-categorization-label": "Perubahan kategori",
        "rcnotefrom": "Di bawah ini adalah {{PLURAL:$5|perubahan}} sejak <strong>$3, $4</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
        "rclistfrom": "Perlihatkan perubahan terbaru sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "file-thumbnail-no": "Nama berkas dimulai dengan <strong>$1</strong>.\nTampaknya berkas ini merupakan gambar dengan ukuran diperkecil ''(miniatur)''.\nJika Anda memiliki versi resolusi penuh dari gambar ini, harap muatkan berkas tersebut. Jika tidak, harap ubah nama berkas ini.",
        "fileexists-forbidden": "Suatu berkas dengan nama ini telah ada dan tak dapat ditimpa.\nJika Anda masih ingin memuat berkas Anda, silakan kembali dan gunakan nama baru. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ditemukan berkas lain dengan nama yang sama di repositori bersama.\nJika Anda tetap ingin memuatkan berkas Anda, harap kembali dan gunakan nama lain. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Unggahan ini adalah salinan persis versi saat ini dari <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Unggahan ini adalah salinan persis {{PLURAL:$2|versi terdahulu version|beberapa versi terdahulu}} dari <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Berkas ini berduplikasi dengan {{PLURAL:$1|berkas|berkas-berkas}} berikut:",
        "file-deleted-duplicate": "Sebuah berkas yang identik dengan berkas ini ([[:$1]]) sudah pernah dihapuskan sebelumnya. Anda harus memeriksa sejarah penghapusan berkas tersebut sebelum melanjutkan memuat ulang berkas ini.",
        "file-deleted-duplicate-notitle": "Sebuah berkas yang identik dengan berkas ini sebelumnya telah dihapus, dan judul yang digunakan telah ditahan.\nAnda harus meminta bantuan seseorang dengan kemampuan untuk melihat data berkas yang ditahan untuk meninjau situasi sebelum anda mengunggah kembali.",
        "uploaded-setting-event-handler-svg": "Penyetelan atribut event-handler diblokir, menemukan <code>&lt;$1 $2=\"$3\"&gt;</code> dalam berkas SVG yang diunggah.",
        "uploaded-setting-href-svg": "Menggunakan tag \"set\" untuk menambahkan atribut \"href\" ke elemen utama diblokir.",
        "uploaded-remote-url-svg": "SVG yang mengatur setiap atribut style dengan URL luar diblokir. $1=\"$2\" ditemui di dalam berkas SVG yang diunggah.",
-       "uploadscriptednamespace": "Berkas SVG ini memuat ruang nama ilegal \"$1\"",
+       "uploadscriptednamespace": "Berkas SVG ini memuat ruang nama ilegal \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML dalam berkas yang diunggah tidak bisa diuraikan.",
        "uploadvirus": "Berkas tersebut mengandung virus! Rincian: $1",
        "uploadjava": "Berkas ini adalah berkas ZIP yang mengnadung berkas .class Java.\nPenggunggahan berkas Java tidak diperbolehkan karena dapat menyebabkan pengabaian batasan keamanan.",
        "emailccsubject": "Salinan pesan Anda untuk $1: $2",
        "emailsent": "Surel terkirim",
        "emailsenttext": "Surel Anda telah dikirimkan.",
-       "emailuserfooter": "Email ini dikirimkan oleh $1 ke $2 dengan fungsi \"{{int:emailuser}}\" di {{SITENAME}}.",
+       "emailuserfooter": "Surel ini telah {{GENDER:$1|dikirim}} oleh $1 kepada {{GENDER:$2|$2}} dengan fungsi \"{{int:emailuser}}\" pada {{SITENAME}}. Surel {{GENDER:$2|Anda}} akan dikirim langsung kepada {{GENDER:$1|pengirim asal}}, dengan menampilkan alamat surel {{GENDER:$2|Anda}} kepada {{GENDER:$1|mereka}}.",
        "usermessage-summary": "Tinggalkan pesan sistem.",
        "usermessage-editor": "Penyampai pesan sistem",
        "usermessage-template": "MediaWiki:UserMessage",
        "modifiedarticleprotection": "mengubah tingkat pelindungan \"[[$1]]\"",
        "unprotectedarticle": "menghilangkan perlindungan dari \"[[$1]]\"",
        "movedarticleprotection": "memindahkan pengaturan proteksi dari \"[[$2]]\" ke \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Melindungi}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Mengubah tingkat perlindungan}} untuk \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Menghapus perlindungan}} dari \"[[$1]]\"",
        "protect-title": "Melindungi \"$1\"",
        "protect-title-notallowed": "Lihat tingkat perlindungan dari \"$1\"",
        "prot_1movedto2": "[[$1]] dipindahkan ke [[$2]]",
        "undeletehistorynoadmin": "Halaman ini telah dihapus.\nAlasan penghapusan diberikan pada ringkasan di bawah ini, berikut rincian pengguna yang telah melakukan penyuntingan pada halaman ini sebelum dihapus. Isi terakhir dari revisi yang telah dihapus ini hanya tersedia untuk pengurus.",
        "undelete-revision": "Revisi yang telah dihapus dari $1 (pada $5, $4) oleh $3:",
        "undeleterevision-missing": "Revisi salah atau tak ditemukan. Anda mungkin mengikuti pranala yang salah, atau revisi tersebut telah dipulihkan atau dibuang dari arsip.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Sebuah revisi|$1 revisi}} tidak dapat dipulihkan, karena <code>rev_id</code> {{PLURAL:$1|mereka|mereka}} sedang digunakan.",
        "undelete-nodiff": "Tidak ada revisi yang lebih lama.",
        "undeletebtn": "Kembalikan",
        "undeletelink": "lihat/kembalikan",
        "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": "Pembatalan penghapusan gagal:\n$1",
+       "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.",
        "undelete-search-title": "Cari halaman yang dihapus",
        "sp-contributions-newbies-sub": "Untuk pengguna baru",
        "sp-contributions-newbies-title": "Kontribusi pengguna baru",
        "sp-contributions-blocklog": "log pemblokiran",
-       "sp-contributions-suppresslog": "kontribusi pengguna yang disembunyikan",
-       "sp-contributions-deleted": "kontribusi pengguna yang dihapus",
+       "sp-contributions-suppresslog": "kontribusi {{GENDER:$1|pengguna}} yang disembunyikan",
+       "sp-contributions-deleted": "kontribusi {{GENDER:$1|pengguna}} yang dihapus",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "bicara",
        "sp-contributions-username": "Alamat IP atau nama pengguna:",
        "sp-contributions-toponly": "Tampilkan hanya revisi teratas",
        "sp-contributions-newonly": "Hanya tampilkan suntingan yang berupa pembuatan halaman",
+       "sp-contributions-hideminor": "Sembunyikan suntingan kecil",
        "sp-contributions-submit": "Cari",
        "whatlinkshere": "Pranala balik",
        "whatlinkshere-title": "Halaman yang memiliki pranala ke \"$1\"",
        "movelogpagetext": "Di bawah ini adalah log pemindahan halaman.",
        "movesubpage": "{{PLURAL:$1|Subhalaman|Subhalaman}}",
        "movesubpagetext": "Halaman ini memiliki $1 {{PLURAL:$1|subhalaman|subhalaman}} seperti ditampilkan berikut.",
+       "movesubpagetalktext": "Halaman pembicaraan terkait mempunyai $1 {{PLURAL:$1|subhalaman|subhalaman}} yang tampil di bawah ini.",
        "movenosubpage": "Halaman ini tak memiliki subhalaman.",
        "movereason": "Alasan:",
        "revertmove": "batalkan",
        "pageinfo-length": "Panjang halaman (dalam bita)",
        "pageinfo-article-id": "ID Halaman",
        "pageinfo-language": "Bahasa isi halaman",
+       "pageinfo-language-change": "ubah",
        "pageinfo-content-model": "Model isi halaman",
+       "pageinfo-content-model-change": "ubah",
        "pageinfo-robot-policy": "Pengindeksan oleh robot",
        "pageinfo-robot-index": "Diperbolehkan",
        "pageinfo-robot-noindex": "Tidak diperbolehkan",
        "pageinfo-category-pages": "Jumlah halaman",
        "pageinfo-category-subcats": "Jumlah subkategori",
        "pageinfo-category-files": "Jumlah berkas",
+       "pageinfo-user-id": "ID pengguna",
        "markaspatrolleddiff": "Tandai telah dipatroli",
        "markaspatrolledtext": "Tandai halaman ini telah dipatroli",
        "markaspatrolledtext-file": "Tandai versi berkas sebagai terpatroli",
        "patrol-log-header": "Ini adalah log revisi terpatroli.",
        "log-show-hide-patrol": "$1 log patroli",
        "log-show-hide-tag": "log tag $1",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Tandai revisi $3 dari $2 sebagai terperiksa?",
        "deletedrevision": "Revisi lama yang dihapus $1",
        "filedeleteerror-short": "Kesalahan waktu menghapus berkas: $1",
        "filedeleteerror-long": "Terjadi kesalahan sewaktu menghapus berkas:\n\n$1",
        "tags-actions-header": "Tindakan",
        "tags-active-yes": "Ya",
        "tags-active-no": "Tidak",
-       "tags-source-extension": "Ditetapkan oleh suatu ekstensi",
+       "tags-source-extension": "Ditetapkan oleh perangkat lunak",
        "tags-source-manual": "Digunakan secara manual oleh pengguna dan bot",
        "tags-source-none": "Tidak digunakan lagi",
        "tags-edit": "sunting",
        "tags-deactivate": "nonaktifkan",
        "tags-hitcount": "$1 {{PLURAL:$1|perubahan}}",
        "tags-manage-no-permission": "Anda tak memiliki hak akses untuk mengatur perubahan tag.",
-       "tags-manage-blocked": "Anda tidak dapat mengganti tag ketika sedang diblokir.",
+       "tags-manage-blocked": "Anda tidak dapat mengatur perubahan tag ketika {{GENDER:$1|Anda}} diblokir.",
        "tags-create-heading": "Buat sebuah tag baru",
        "tags-create-explanation": "Secara baku, tag yang baru dibuat akan tersedia untuk digunakan oleh pengguna dan bot.",
        "tags-create-tag-name": "Nama tag:",
        "tags-create-warnings-below": "Apakah Anda ingin melanjutkan pembuatan tanda ini?",
        "tags-delete-title": "Hapus tag",
        "tags-delete-explanation-initial": "Anda akan menghapus tag \"$1\" dari basisdata.",
+       "tags-delete-explanation-warning": "Tindakan ini <strong>tidak bisa dikembalikan</strong> dan <strong>tidak bisa dibatalkan</strong> oleh siapa pun termasuk pengurus basis data. Pastikan sebaik-baiknya bahwa inilah tag yang ingin Anda hapus.",
        "tags-delete-reason": "Alasan:",
+       "tags-delete-submit": "Hapus tag ini juga",
+       "tags-delete-not-allowed": "Tag yang diberikan oleh ekstensi tidak dapat dihapus kecuali ekstensi tersebut mengizinkan.",
+       "tags-delete-not-found": "Tag \"$1\" tidak ada.",
+       "tags-delete-too-many-uses": "Tag \"$1\" diterapkan ke $2 atau lebih {{PLURAL:$2|revisi|revisi}} yang artinya tag tersebut tidak dapat dihapus.",
+       "tags-delete-warnings-after-delete": "Tag \"$1\" dihapus, namun {{PLURAL:$2|peringatan|peringatan}} berikut menemukan:",
+       "tags-delete-no-permission": "Anda tak memiliki hak akses untuk menghapus perubahan tag.",
+       "tags-activate-title": "Aktifkan tag",
+       "tags-activate-question": "Anda akan mengaktifkan tag \"$1\".",
        "tags-activate-reason": "Alasan:",
+       "tags-activate-not-allowed": "Tag \"$1\" tidak mungkin dapat diaktifkan.",
+       "tags-activate-not-found": "Tag \"$1\" tidak ada.",
        "tags-activate-submit": "Aktifkan",
+       "tags-deactivate-title": "Nonaktifkan tag",
+       "tags-deactivate-question": "Anda akan menonaktifkan tag \"$1\".",
        "tags-deactivate-reason": "Alasan:",
+       "tags-deactivate-not-allowed": "Tag \"$1\" tidak mungkin dapat dinonaktifkan.",
        "tags-deactivate-submit": "Matikan",
-       "tags-apply-blocked": "Anda tidak dapat menerapkan perubahan tag dan perubahan lainnya ketika sedang diblokir.",
-       "tags-update-blocked": "Anda tidak dapat menambah atau menghapus tag ketika sedang diblokir.",
+       "tags-apply-no-permission": "Anda tidak memiliki izin untuk menerapkan perubahan tag bersama-sama dengan perubahan Anda.",
+       "tags-apply-blocked": "Anda tidak dapat menerapkan perubahan tag dengan perubahan Anda ketika {{GENDER:$1|Anda}} sedang diblokir.",
+       "tags-apply-not-allowed-one": "Tag \"$1\" tidak diizinkan untuk diterapkan secara manual.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Tag|Tag}} berikut tidak diizinkan untuk diterapkan secara manual: $1",
+       "tags-update-no-permission": "Anda tidak memiliki izin untuk menambah atau menghapus perubahan tag dari revisi atau entri log individu.",
+       "tags-update-blocked": "Anda tidak dapat menambahkan atau menghapus perubahan tag ketika {{GENDER:$1|Anda}} sedang diblokir.",
+       "tags-edit-title": "Sunting tag",
+       "tags-edit-manage-link": "Kelola tag",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Log peristiwa terpilih|Log peristiwa terpilih}}:",
+       "tags-edit-revision-legend": "Tambah atau hapus tag dari {{PLURAL:$1|revisi ini|semua revisi $1}}",
+       "tags-edit-logentry-legend": "Tambah atau hapus tag dari {{PLURAL:$1|entri log ini|semua entri log $1}}",
        "tags-edit-existing-tags": "Tag yang ada:",
        "tags-edit-existing-tags-none": "<em>Tidak ada</em>",
        "tags-edit-new-tags": "Tag baru:",
        "htmlform-cloner-create": "Tambahkan lebih banyak",
        "htmlform-cloner-delete": "Hapus",
        "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
+       "htmlform-date-placeholder": "TTTT-BB-HH",
+       "htmlform-time-placeholder": "JJ:MM:DD",
+       "htmlform-datetime-placeholder": "TTTT-BB-HH JJ:MM:DD",
+       "htmlform-date-invalid": "Nilai yang diberikan tidak dikenali sebagai tanggal. Coba lagi menggunakan format TTTT-BB-HH.",
+       "htmlform-datetime-invalid": "Nilai yang Anda masukkan tidak dikenali sebagai tanggal dan waktu. Coba gunakan format YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-toolow": "Nilai yang Anda masukkan adalah sebelum tanggal paling dini yang dibolehkan $1",
+       "htmlform-date-toohigh": "Nilai yang Anda masukkan adalah setelah tanggal paling akhir  yang dibolehkan $1",
+       "htmlform-time-toolow": "Nilai yang Anda tentukan adalah sebelum waktu paling dini yang dibolehkan $1",
+       "htmlform-time-toohigh": "Nilai yang Anda tentukan adalah setelah waktu paling baru yang dibolehkan $1",
        "htmlform-title-badnamespace": "[[:$1]] tidak berada dalam ruang nama \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" bukan merupakan judul halaman yang dapat dibuat",
        "htmlform-title-not-exists": "$1 tidak ada.",
        "htmlform-user-not-exists": "<strong>$1</strong> tidak ada.",
        "htmlform-user-not-valid": "<strong>$1</strong> bukan merupakan nama pengguna sah.",
        "logentry-delete-delete": "$1 {{GENDER:$2|menghapus}} halaman $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|menghapus}} pengalihan $3 dengan penimpaan",
        "logentry-delete-restore": "$1 {{GENDER:$2|mengembalikan}} halaman $3",
        "logentry-delete-event": "$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 log peristiwa}} di $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5  revisi}} di halaman $3: $4",
        "feedback-thanks": "Terima kasih! Umpan balik Anda telah dikirimkan ke halaman \"[$2 $1]\".",
        "feedback-thanks-title": "Terima kasih!",
        "feedback-useragent": "Agen pengguna:",
-       "searchsuggest-search": "Cari",
+       "searchsuggest-search": "Cari {{SITENAME}}",
        "searchsuggest-containing": "berisi...",
-       "api-error-autoblocked": "Alamat IP Anda telah diblokir secara otomatis, karena sebelumnya digunakan oleh pengguna yang diblokir.",
-       "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
-       "api-error-blocked": "Anda telah diblokir dari penyuntingan.",
-       "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
-       "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain|berkas lain}} dengan isi yang sama di situs ini.",
-       "api-error-duplicate-archive": "Ada {{PLURAL:$1|berkas lain|berkas lain}} di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
-       "api-error-empty-file": "Berkas yang Anda kirim kosong.",
        "api-error-emptypage": "Pembuatan halaman baru yang kosong tidak diizinkan.",
-       "api-error-fetchfileerror": "Kesalahan internal: terjadi kesalahan saat memperoleh berkas ini.",
-       "api-error-fileexists-forbidden": "Berkas dengan nama \"$1\" sudah ada dan tidak bisa ditimpa.",
-       "api-error-fileexists-shared-forbidden": "Berkas dengan nama \"$1\" sudah ada di penyimpanan file berbagi dan tidak bisa ditimpa.",
-       "api-error-file-too-large": "Berkas yang Anda kirim terlalu besar.",
-       "api-error-filename-tooshort": "Nama berkas terlalu pendek.",
-       "api-error-filetype-banned": "Jenis berkas ini dilarang.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|bukan ekstensi berkas yang diizinkan|bukan ekstensi berkas yang diizinkan}}. {{PLURAL:$3|Jenis berkas yang diizinkan adalah|Jenis berkas yang diizinkan adalah}} $2.",
-       "api-error-filetype-missing": "Berkas tidak memiliki ekstensi.",
-       "api-error-hookaborted": "Modifikasi yang Anda coba lakukan dibatalkan oleh suatu kaitan ekstensi.",
-       "api-error-http": "Kesalahan internal: tidak dapat menghubungkan ke peladen.",
-       "api-error-illegal-filename": "Nama berkas tidak diperbolehkan.",
-       "api-error-internal-error": "Kesalahan internal: terjadi masalah saat memproses unggahan Anda ke wiki ini.",
-       "api-error-invalid-file-key": "Kesalahan internal: berkas tidak ditemukan di penyimpanan sementara.",
-       "api-error-missingparam": "Kesalahan internal: parameter permintaan hilang.",
-       "api-error-missingresult": "Kesalahan internal: tidak dapat menentukan apakah penyalinan berhasil.",
-       "api-error-mustbeloggedin": "Anda harus masuk log untuk mengunggah berkas.",
-       "api-error-mustbeposted": "Ada bug dalam perangkat lunak ini; tidak menggunakan metode HTTP yang tepat.",
-       "api-error-noimageinfo": "Pengunggahan berhasil, tetapi peladen tidak memberikan informasi apa pun tentang berkas.",
-       "api-error-nomodule": "Kesalahan internal: tidak ada modul unggahan yang ditetapkan.",
-       "api-error-ok-but-empty": "Kesalahan internal: tidak ada tanggapan dari peladen.",
-       "api-error-overwrite": "Tidak diizinkan untuk menimpa berkas yang sudah ada.",
-       "api-error-ratelimited": "Anda mencoba untuk mengunggah berkas dalam jeda waktu yang lebih singkat yang diperbolehkan oleh wiki ini. Silakan ulangi kembali dalam beberapa menit.",
-       "api-error-stashfailed": "Kesalahan internal: server gagal menyimpan berkas sementara.",
        "api-error-publishfailed": "Kesalahan internal: server gagal menyimpan berkas sementara.",
-       "api-error-stasherror": "Terjadi kesalahan saat mengunggah berkas ke penyimpanan.",
-       "api-error-stashedfilenotfound": "Berkas yang disimpan tidak ditemukan ketika mencoba untuk mengunggahnya dari penyimpanan.",
-       "api-error-stashpathinvalid": "Lokasi tempat berkas disimpan yang seharusnya ditemukan tidak sah.",
-       "api-error-stashfilestorage": "Terjadi galat ketika menyimpan berkas ke dalam penyimpanan.",
-       "api-error-stashzerolength": "Peladen tidak dapat menyimpan berkas ini, karena ukuran berkas itu adalah nihil.",
-       "api-error-stashnotloggedin": "Anda harus masuk log untuk menyimpan berkas ke dalam penyimpanan unggahan.",
-       "api-error-stashwrongowner": "Berkas yang Anda coba untuk akses dalam penyimpanan itu bukan milik Anda.",
-       "api-error-stashnosuchfilekey": "Berkas yang Anda coba akses dalam penyimpanan itu tidak ada.",
-       "api-error-timeout": "Peladen tidak merespons dalam waktu yang diharapkan.",
-       "api-error-unclassified": "Terjadi galat yang tidak diketahui",
-       "api-error-unknown-code": "Kesalahan tidak dikenal: \"$1\"",
-       "api-error-unknown-error": "Kesalahan internal: terjadi kesalahan saat mencoba mengunggah berkas Anda.",
+       "api-error-stashfailed": "Kesalahan internal: server gagal menyimpan berkas sementara.",
        "api-error-unknown-warning": "Peringatan tidak dikenal: $1",
        "api-error-unknownerror": "Kesalahan tidak dikenal: \"$1\"",
-       "api-error-uploaddisabled": "Pengunggahan dinonaktifkan di wiki ini.",
-       "api-error-verification-error": "Berkas ini mungkin rusak atau memiliki ekstensi yang salah.",
-       "api-error-was-deleted": "Sebuah berkas dengan nama ini sudah diunggah sebelumnya lalu dihapus.",
        "duration-seconds": "$1 {{PLURAL:$1|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam}}",
        "mw-widgets-dateinput-no-date": "Tanggal tidak ada yang terpilih",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-HH",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "mw-widgets-mediasearch-input-placeholder": "Cari media",
+       "mw-widgets-mediasearch-noresults": "Tidak ada hasil ditemukan.",
        "mw-widgets-titleinput-description-new-page": "halaman belum ada",
        "mw-widgets-titleinput-description-redirect": "mengalihkan ke $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Tambah sebuah kategori...",
        "sessionmanager-tie": "Tidak dapat menggabungkan banyak jenis otentikasi permintaan: $1.",
        "sessionprovider-generic": "sesi $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesi berdasarkan kuki",
        "log-action-filter-newusers": "Jenis pembuatan akun:",
        "log-action-filter-patrol": "Jenis patroli:",
        "log-action-filter-protect": "Jenis perlindungan:",
-       "log-action-filter-rights": "Jenis penggantian hak",
-       "log-action-filter-suppress": "Jenis penyembunyian",
+       "log-action-filter-rights": "Jenis penggantian hak akses:",
+       "log-action-filter-suppress": "Jenis penyembunyian:",
        "log-action-filter-upload": "Jenis pengunggahan:",
        "log-action-filter-all": "Semua",
        "log-action-filter-block-block": "Blokir",
        "log-action-filter-contentmodel-change": "Ubah Modelkonten",
        "log-action-filter-contentmodel-new": "Pembuatan halaman dengan Modelkonten yang tak baku",
        "log-action-filter-delete-delete": "Penghapusan halaman",
+       "log-action-filter-delete-delete_redir": "Mengalihkan pengalihan",
        "log-action-filter-delete-restore": "Pembatalan penghapusan halaman",
        "log-action-filter-delete-event": "Log penghapusan",
        "log-action-filter-delete-revision": "Penghapusan revisi",
        "authmanager-authn-autocreate-failed": "Pembuatan otomatis dari akun lokal gagal: $1",
        "authmanager-change-not-supported": "Kredensial yang diberikan tidak dapat diganti, karena tidak ada yang akan menggunakannya.",
        "authmanager-create-disabled": "Pembuatan akun dimatikan.",
-       "authmanager-create-from-login": "Untuk membuat akun Anda, silakan isi kolom di bawah.",
+       "authmanager-create-from-login": "Untuk membuat akun, silakan isi kolom di bawah.",
        "authmanager-create-not-in-progress": "Pembuatan akun tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
        "authmanager-create-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk pembuatan akun.",
        "authmanager-link-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk menautkan akun.",
        "linkaccounts-success-text": "Akun telah ditautkan.",
        "linkaccounts-submit": "Tautkan akun",
        "unlinkaccounts": "Lepastautkan akun",
-       "unlinkaccounts-success": "Akun berikut telah dilepastautkan."
+       "unlinkaccounts-success": "Akun berikut telah dilepastautkan.",
+       "userjsispublic": "Harap perhatikan: subhalaman Javascript sebaiknya tidak mengandung data rahasia, karena dapat dilihat oleh pengguna lain.",
+       "usercssispublic": "Harap perhatikan: subhalaman CSS sebaiknya tidak mengandung data rahasia karena dapat dilihat oleh pengguna lain.",
+       "restrictionsfield-badip": "Alamat IP atau rentang IP tidak sah: $1",
+       "restrictionsfield-label": "Rentang IP yang diizinkan:",
+       "restrictionsfield-help": "Satu alamat IP atau rentang CIDR per baris. Untuk mengaktifkan semuanya, gunakan <br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "revisi $1",
+       "pageid": "ID halaman $1"
 }
index 62abac0..476af2b 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Srdjan m",
-                       "Macofe"
+                       "Macofe",
+                       "Stavanger7"
                ]
        },
        "tog-underline": "Ultracatenun:",
        "tog-hideminor": "Ocultar redactiones minori in nov changes",
        "tog-hidepatrolled": "Ocultar redactiones vigilat in nov changes",
        "tog-newpageshidepatrolled": "Ocultar págines vigilat de liste de nov págines",
+       "tog-hidecategorization": "Ocultar li categorisation de págines",
        "tog-extendwatchlist": "Expander li liste de vigilantie a omni changes, ne solmen li max nov",
        "tog-usenewrc": "Ordinar changes in «Recent changes» e li liste de vigila secun págines",
        "tog-numberheadings": "Auto-numerar rublicas",
@@ -40,7 +42,7 @@
        "tog-shownumberswatching": "Monstrar li númere de usatores vigilant",
        "tog-oldsig": "Existent subscrition:",
        "tog-fancysig": "Tractar signature quam textu wiki (sin un catenun auto-crate)",
-       "tog-uselivepreview": "Strax monstrar prevision (experimental)",
+       "tog-uselivepreview": "Strax monstrar prevision",
        "tog-forceeditsummary": "Suggester me quande intrar un redaction che summarium in blanc",
        "tog-watchlisthideown": "Ocultar mi redactiones del liste de págines vigilat",
        "tog-watchlisthidebots": "Ocultar redactiones de machine del liste de págines vigilat",
        "morenotlisted": "Ti liste ne es complet.",
        "mypage": "Págine",
        "mytalk": "Conversation",
-       "anontalk": "Discussion por ti ci IP",
+       "anontalk": "Discussion",
        "navigation": "Navigation",
        "and": "&#32;e",
        "qbfind": "Constatar",
        "searcharticle": "Ear",
        "history": "Historie",
        "history_short": "Historie de versiones",
+       "history_small": "diarium",
        "updatedmarker": "modernisat desde mi ultim visitation",
        "printableversion": "Version a printar",
        "permalink": "Permanent referentie",
        "print": "Printar",
        "view": "Leer",
+       "view-foreign": "Vider sur $1",
        "edit": "Redacter",
        "create": "Crear",
        "editthispage": "Redacter",
        "otherlanguages": "Altri lingues",
        "redirectedfrom": "(Redirectet de $1)",
        "redirectpagesub": "Págine de redirecterion",
+       "redirectto": "Redirection a:",
        "lastmodifiedat": "Ti-ci págine esset redactet in ultim li $1, clocca $2.",
        "viewcount": "Ti págine ha esset accesset {{PLURAL:$1|un vez|$1 vezes}}.",
        "protectedpage": "Un protectet págine",
        "disclaimers": "Advertimentes",
        "disclaimerpage": "Project:Advertimentes",
        "edithelp": "Redactori auxilie",
+       "helppage-top-gethelp": "Auxilie",
        "mainpage": "Principal págine",
        "mainpage-description": "Principal págine",
        "policy-url": "Project:Regulariumes",
        "hidetoc": "ocultar",
        "collapsible-collapse": "Celar",
        "collapsible-expand": "Monstrar",
+       "confirmable-yes": "Yes",
+       "confirmable-no": "No",
        "thisisdeleted": "Vider o restaurar $1?",
        "viewdeleted": "Vider $1?",
        "restorelink": "{{PLURAL:$1|un deleet version|$1 deleet versiones}}",
        "error": "Erra",
        "databaseerror": "Erra del data-base",
        "databaseerror-text": "Un erra in li questionada del database ha evenit. To posse indicar un erra in li software.",
+       "databaseerror-function": "Function: $1",
+       "databaseerror-error": "Errore: $1",
        "missing-article": "Li textu de «$1» $2 ne ha esset trovat in li data-base.\n\nIt es possibil, que ti págine ha esset deleet o movet.\n\n\nSi to ne es just, tu ha forsan trovat un erra in li programma.\nPles raporta it a un [[Special:ListUsers/sysop|administrator]], notante li URL.",
        "missingarticle-rev": "(revision#: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "internalerror": "Errore intern",
+       "internalerror_info": "Errore intern: $1",
        "unexpected": "Valor ínexpectat: \"$1\"=\"$2\".",
        "badtitle": "Titul mal",
        "badtitletext": "Li titul de págine solicitat esset ínvalid, vacui, o íncorectmen ligat inter-lingue o un titul inter-wiki.\nIt posse contene un o plu carácteres quel ne posse esser usat in titules.",
        "viewsource": "Vider fonte",
-       "viewsourcetext": "Vu posse vider e copiar li contenete de ti págine:",
+       "viewsource-title": "Vider li fonte de «$1»",
+       "viewsourcetext": "Vu posse vider e copiar li contenete de ti págine.",
+       "ns-specialprotected": "Li special págines on ne posse redacter.",
        "titleprotected": "Ti titul ha esset gardat de creation per [[User:$1|$1]]. \nLi motive dat es <em>$2</em>.",
        "virus-badscanner": "Configuration maliciosi: virus desconosset examinat: ''$1''",
        "virus-scanfailed": "scandesion fallit (code $1)",
        "virus-unknownscanner": "antivírus desconosset:",
        "logouttext": "'''Tu ha terminat tui session.'''\n\nNota, que alcun págines posse continualmen esser monstrat quasi tu vell ancor esser inregistrat, til que tu vacua li cache de tui navigator.",
+       "welcomeuser": "Benevenit, $1!",
        "yourname": "Nómine de usator:",
+       "userlogin-yourname": "Nómine de usator",
+       "userlogin-yourname-ph": "Vor nómine de usator",
+       "createacct-another-username-ph": "Nómine del usator",
        "yourpassword": "Parol-clave:",
        "yourpasswordagain": "Parol-clave denov:",
+       "userlogin-signwithsecure": "Usar un secur conexion",
        "yourdomainname": "Tui dominia:",
        "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}}",
+       "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributores}}",
        "badretype": "Li passa-paroles queles vu tippat ne es identic.",
        "userexists": "Nómine de usator ja in usu.\nPleser opta por un nómine diferent.",
        "loginerror": "Erra in initiation del session",
        "nocookieslogin": "{{SITENAME}} utilisa cookies por far intrar usatores. Vu nu ne permisse cookies. Ples permisser les e provar denov.",
-       "loginsuccesstitle": "Apertion de session successosi",
+       "loginsuccesstitle": "Session es apertet",
        "loginsuccess": "Vu ha apertet vor session in {{SITENAME}} quam \"$1\".",
+       "nosuchuser": "Li usator con nómine «$1» ne existe.\nLi nómines de usator distinte minuscules e majuscules.\nControla li ortografia o [[Special:CreateAccount|crea un nov conto]].",
+       "login-userblocked": "Li usator es blocat. Es impossibil aperter un session.",
        "wrongpassword": "Parol-clave íncorect inscrit.\nPleser prova denov.",
        "wrongpasswordempty": "Parol-clave inscrit esset nud.\nPleser prova denov.",
        "mailmypassword": "Re-initialisar li passaparol",
        "throttled-mailpassword": "Un parol-clave amemora ha ja esset inviat, intra li ultim {{PLURAL:$1|hor|$1 hores}}.\nPor preventer misusa, solmen un parol-clave amemora va esser inviat per {{PLURAL:$1|hor|$1 hores}}.",
        "acct_creation_throttle_hit": "Vu ja ha creat $1 contos. Vu ne posse crear pli mult quam to.",
+       "createaccount-title": "Creation de conto por {{SITENAME}}",
        "loginlanguagelabel": "Lingue: $1",
        "suspicious-userlogout": "Tui petition por surtir esset desaprobat pro que probabilmen esset inviat per un navigator ruptet o servitor de autorisation che caching.",
+       "pt-login-button": "Aperter session",
+       "pt-createaccount": "Crear un conto",
        "changepassword": "Modificar passa-parol",
        "oldpassword": "Anteyan passa-parol:",
        "newpassword": "Nov passa-parol:",
        "retypenew": "Confirmar nov passa-parol",
-       "passwordreset-username": "Vor nómine usatori",
+       "botpasswords-label-create": "Crear",
+       "botpasswords-label-update": "Actualisar",
+       "botpasswords-label-cancel": "Anullar",
+       "botpasswords-label-delete": "Deleter",
+       "resetpass-submit-cancel": "Anullar",
+       "passwordreset-username": "Nómine de usator:",
+       "changeemail-none": "(null)",
+       "resettokens-token-label": "$1 (valor actual: $2)",
        "bold_sample": "Nigri textu",
        "bold_tip": "Nigri textu",
        "italic_sample": "Cursiv textu",
        "sig_tip": "Tui subscrit con hor e date",
        "hr_tip": "Horizontal linea (ples usar sin excess)",
        "summary": "Resummation:",
-       "subject": "Tema/Division:",
+       "subject": "Tema:",
        "minoredit": "To es un bagatellic change",
        "watchthis": "Vigilar ti págine",
        "savearticle": "Conservar págine",
        "showpreview": "Monstrar prevision",
        "showdiff": "Monstrar changes",
        "anoneditwarning": "'''Advertiment:''' Vu ne esser registrat.\nTui adresse de IP va esser registrat in historico de redactiones de ti págine.",
+       "missingcommenttext": "Ples intrar un comenta in infra.",
        "summary-preview": "Prevision de summarium:",
        "subject-preview": "Prevision de Tema/Division:",
        "whitelistedittext": "Vu have que $1 por redacter págines.",
        "loginreqtitle": "Apertion de session obligatori",
+       "loginreqlink": "aperter session",
        "accmailtitle": "Li passa-parol es inviat.",
        "accmailtext": "Li passa-parol por '$1' ha esset inviat a $2.",
        "newarticle": "(Nov)",
        "userjspreview": "'''Memora que vu es solmen provant/monstrant tui JavaScript de usator.'''\n'''It ne ha esset conservat ancor!'''",
        "userinvalidcssjstitle": "'''Advertiment:''' Ne vi pelle \"$1\".\nMemora que hábitu .css e págines .js usa un titul plu bass, e.g. {{ns:user}}:Foo/vector.css quam oposit por {{ns:user}}:Foo/Vector.css.",
        "updated": "(Modernisat)",
+       "note": "<strong>Note:</strong>",
        "previewnote": "'''Memora se que ti es solmen un prevision.'''\nTui changes ancor ne ha esset conservat!",
        "token_suffix_mismatch": "'''Tui redaction ha esset rejectet pro que tui software de navigation multilat li carácteres de punctuation in li simbol de redaction.'''\nLi redaction ha esset rejectet por impedir corruption del textu de págine.\nTi quelcvez ocurre quande vu es usant un service de autorisation anonim mal executet in Internet.",
        "editing": "Redactent $1",
+       "creating": "Creation de «$1»",
        "editingsection": "Redactent $1 (division)",
        "editingcomment": "Redactent $1 (nov division)",
+       "editconflict": "Conflicte de redaction: $1",
        "yourtext": "Tui textu",
        "storedversion": "Version acumulat",
        "yourdiff": "Diferenties",
        "permissionserrorstext-withaction": "Vu ne have permission por $2, por li sequent {{PLURAL:$1|motive|motives}}:",
        "recreate-moveddeleted-warn": "'''Advertiment: Vu es recreant un págine que esset anteriorimen deletet.'''\n\nVu deve considerar ca it es convenent por continuar redactant ti págine.\nLi deletion e diarium de movement por li págine es sub li condition ci por convenience:",
        "moveddeleted-notice": "Ti págine ha esset deletet.\nLi deletion e diarium de movement por li págine es sub li condition in infra por referentie.",
+       "postedit-confirmation-created": "Li págine ha esset creat.",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Vacui objecte",
        "post-expand-template-inclusion-warning": "'''Advertiment:''' Li grandore del includet shablones es tro grand. Alcun shablones ne posse esser includet.",
        "post-expand-template-inclusion-category": "Págines, in queles li maximal grandore del includet shablones es excedet",
        "post-expand-template-argument-warning": "'''Advertiment:''' Ti págine contene in un minim argumente de avise quel ha un anc mensura de expansion grand.\nTis argumentes have esset omisset.",
        "currentrev": "Ultim revision",
        "currentrev-asof": "Actual version de $2, clocca $3",
        "revisionasof": "Revision de $1",
-       "revision-info": "Revision de $1 e il ha fabricat de $2",
+       "revision-info": "Revision de $1, fat de $2:$7",
        "previousrevision": "← Anteyan version",
        "nextrevision": "Revision sequent →",
        "currentrevisionlink": "Ultim revision",
        "histlegend": "Diferenties de selection: marca li buxes de radio de li revisiones por comparar e batte \"intrar\" o li buton in li funde.<br />\nLegende: '''({{int:cur}})''' = diferenties che ultim revision, '''({{int:last}})''' = diferenties que antecede li revision, '''{{int:minoreditletter}}''' = redaction minori.",
        "history-fieldset-title": "Historie de navigation",
        "history-show-deleted": "Deletet solmen",
-       "histfirst": "max veľi",
+       "histfirst": "max antiqui",
        "histlast": "max nov",
        "history-feed-item-nocomment": "$1 in $2",
        "rev-delundel": "monstrar/ocultar",
+       "rev-showdeleted": "monstrar",
+       "revdelete-show-file-submit": "Yes",
        "revdel-restore": "changer visibilitá",
+       "revdelete-offender": "Autor del version:",
        "suppressionlog": "Diarium de supression",
-       "suppressionlogtext": "Infra es un liste de deletiones e bloces involuent contenete ocultant de administratores. \nVider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e bannimentes operational currentmen.",
+       "suppressionlogtext": "Infra es un liste de deletiones e blocs involuent contenete ocultat fro administratores. \nVider li [[Special:BlockList|liste de bloc de IP]] por li liste de blocs e bannimentes operational currentmen.",
+       "mergehistory-go": "Monstrar li coalescibil redactiones",
+       "mergehistory-submit": "Coalescer li redactiones",
+       "mergehistory-done": "$3 {{PLURAL:$3|revision|revisiones}} de $1 ha esset coalescet in [[:$2]].",
+       "mergehistory-reason": "Motive:",
        "revertmerge": "Desfar fusion",
        "history-title": "Historic del revision de \"$1\"",
+       "difference-title": "Differentie inter li versiones de «$1»",
        "lineno": "Linea $1:",
        "compareselectedversions": "Comparar revisiones selectet",
        "editundo": "anullar",
+       "diff-empty": "(Null differentie)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Un intermediari version|$1 intermediari versiones}} del sam usator non es monstrat)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Un intermediari version|$1 intermediari versiones}} de {{PLURAL:$2|un altri usator|$2 usatores}} non es monstrat)",
        "searchresults": "Serch-resultates",
        "searchresults-title": "Serch-resultates por «$1»",
        "titlematches": "Resultates in li titules de págines",
        "search-result-category-size": "{{PLURAL:$1|1 membre|$1 membres}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
        "search-redirect": "(redirection de «$1»)",
        "search-section": "(section $1)",
+       "search-category": "(categorie $1)",
        "search-suggest": "Esque tu ha intentet: «$1»?",
+       "search-interwiki-more": "(plu)",
        "searchrelated": "relatet",
        "searchall": "omni",
+       "search-showingresults": "{{PLURAL:$4|Resultate <strong>$1</strong> de <strong>$3</strong>|Resultates <strong>$1 – $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Tu sercha ne ha trovat un resultate.",
        "preferences": "Preferenties",
        "mypreferences": "Preferenties",
+       "prefs-skin": "Tema visual",
        "skin-preview": "Prevision",
+       "prefs-watchlist": "Vigilat págines",
+       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|die|dies}}",
        "saveprefs": "Conservar",
        "searchresultshead": "Serchar",
        "stub-threshold": "Catenunes por págines de contenete va aparir <a href=''#'' class=''stub''>de ti forme</a> si ili have minu de (bytes):",
        "timezonelegend": "Zone de témpor:",
+       "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar wiki de contumacie ($1)",
        "timezoneuseoffset": "Altri (specificar compensation)",
+       "servertime": "Hora del servitor:",
        "timezoneregion-africa": "Africa",
        "timezoneregion-america": "America",
        "timezoneregion-antarctica": "Antarctica",
+       "timezoneregion-arctic": "Arctica",
        "timezoneregion-asia": "Asia",
        "timezoneregion-atlantic": "Ocean Atlantic",
        "timezoneregion-australia": "Australia",
        "timezoneregion-pacific": "Ocean Pacific",
        "youremail": "Adresa e-pošte:",
        "username": "Nómine de usator:",
+       "group-membership-link-with-expiry": "$1 (til $2)",
        "yourrealname": "Nómine real:",
        "yourlanguage": "Lingue:",
        "yourvariant": "Variante:",
        "yournick": "Nov signature:",
        "yourgender": "Génere:",
+       "gender-male": "Il redacte págines de wiki",
+       "gender-female": "Ella redacte págines de wiki",
        "prefs-help-email": "Adresse de e-mail es optional, ma es necessitá por recomensar parol-clave, deve vu obliviar tui parol-clave.",
        "prefs-help-email-others": "Vu posse anc optar por permisser altri contacter vu per e-mail complet che un catenun in tui págine de usator o págine de discussion.\nTui adresse de e-mail ne es revelat quande altri usatores contacter vu.",
+       "prefs-i18n": "Internationalisation",
+       "prefs-signature": "Signature",
+       "prefs-dateformat": "Formato del date",
+       "prefs-editor": "Redactor",
        "userrights": "Gerement de jures de usator",
        "userrights-lookup-user": "Gerer gruppes de usator",
        "userrights-user-editname": "Intrar un nómine de usator:",
        "userrights-reason": "Motive:",
        "userrights-no-interwiki": "Vu ne have permission por redacter jures de usator in altri wikis.",
        "userrights-nodatabase": "Funde de data $1 ne existe o ne es local.",
-       "userrights-nologin": "Vu deve [[Special:UserLogin|registrar]] che un conto de administrator por atribuer jures de usator.",
-       "userrights-notallowed": "Tui conto ne have permission por atribuer jures de usator.",
        "userrights-changeable-col": "Gruppes que vu posse changear",
        "userrights-unchangeable-col": "Gruppes que vu ne posse changear",
+       "userrights-expiry-options": "1 die:1 day,1 semane:1 week,1 mensu:1 month,3 mensus:3 months,6 mensus:6 months,1 annu:1 year",
+       "group": "Gruppe:",
        "group-user": "Usatores",
        "group-sysop": "Administratores",
-       "group-user-member": "Usator",
+       "group-bureaucrat": "Burocrates",
+       "group-all": "(omni)",
+       "group-user-member": "{{GENDER:$1|usator}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|administrator}}",
+       "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
+       "group-suppress-member": "{{GENDER:$1|supressor}}",
        "grouppage-user": "{{ns:project}}:Usatores",
        "grouppage-sysop": "{{ns:project}}:Administratores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócrates",
        "grouppage-suppress": "{{ns:project}}:Vigilatores",
+       "right-writeapi": "Usage del API de scrition",
+       "grant-basic": "Basic jures",
        "newuserlogpage": "Diarium de creation de usator",
        "rightslog": "Diarium de jures de usator",
        "action-edit": "redacter ti págine",
        "nchanges": "$1 {{PLURAL:$1|change|changes}}",
+       "enhancedrc-history": "diarium",
        "recentchanges": "Nov changes",
        "recentchanges-legend": "Optiones de nov changes",
        "recentchanges-summary": "Seque sur ti-ci págine li ultim modificationes al wiki.",
        "recentchanges-label-minor": "Ti es un redaction minori",
        "recentchanges-label-bot": "Ti redaction esset efectuat per un machine",
        "recentchanges-label-unpatrolled": "Ti redaction ne have ancor esset protectet",
-       "rcnotefrom": "In infra es li changes desde '''$2''' (ad-supra por '''$1''' monstrat).",
+       "recentchanges-legend-heading": "<strong>Legende:</strong>",
+       "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filtergroup-registration": "Registration de usatores",
+       "rcfilters-filter-registered-label": "Registrat",
+       "rcnotefrom": "In infra es li {{PLURAL:$5|modification|modificationes}} desde <strong>$4 $3</strong> (til <strong>$1</strong> es monstrat).",
        "rclistfrom": "Monstrar li nov modificationes desde $3 $2",
        "rcshowhideminor": "$1 redactiones minori",
+       "rcshowhideminor-show": "Monstrar",
        "rcshowhidebots": "$1 machines",
+       "rcshowhidebots-hide": "Ocultar",
        "rcshowhideliu": "$1 usatores registrat",
+       "rcshowhideliu-hide": "Ocultar",
        "rcshowhideanons": "$1 usatores anonim",
+       "rcshowhideanons-show": "Monstrar",
        "rcshowhidepatr": "$1 redactiones vigilat",
+       "rcshowhidepatr-hide": "Ocultar",
        "rcshowhidemine": "$1 mi redactiones",
+       "rcshowhidemine-show": "Monstrar",
        "rclinks": "Monstrar li $1 ultim modificationes fat durante li $2 ultim dies<br />$3.",
        "diff": "dif",
        "hist": "hist",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "newsectionsummary": "/* $1 */ nov section",
        "rc-enhanced-expand": "Monstrar detaľes (per JavaScript)",
        "rc-enhanced-hide": "Ocultar detallies",
        "recentchangeslinked": "Changes referet",
        "upload": "Cargar file",
        "uploadbtn": "Cargar file",
        "uploadnologin": "Vu ne ha intrat",
-       "uploadnologintext": "Vu deve esser [[Special:UserLogin|registrat]] por cargar files.",
+       "uploadnologintext": "Ples $1 por cargar files.",
        "uploaderror": "Errore de cargament",
        "uploadtext": "Usa li forme infra por cargar files.\nPor vider o serchar files cargat anteriorimen ear por li [[Special:FileList|liste de files cargat]], (re)cargamentes es anc registrat in li [[Special:Log/upload|diarium de cargament]], deletiones in li [[Special:Log/delete|diarium de deletion]].\n\nPor includer un file in un págine, usa un catenun in un de sequent formes:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' por usar li version complet de li file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' por usar un rendition larg de 200 pixel in un buxe in li márgine levul che 'alt text' quam descrition\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' por ligar inmediatmen por li file sin monstrar li file",
        "upload-permitted": "Tipes de file permisset: $1.",
        "upload-prohibited": "Tipes de file prohibit: $1.",
        "uploadlogpage": "Diarium de cargament",
        "uploadlogpagetext": "Infra es un liste de cargamentes de file max recent.\nVider li [[Special:NewFiles|galerie de nov files]] por posser vider it.",
+       "filename": "File-nómine",
        "filedesc": "Descrition",
+       "filesource": "Orígine:",
        "verification-error": "Ti file ne passat per li verification de file.",
        "unknown-error": "Un errore desconosset ocurret.",
        "tmp-create-error": "Ne posset crear file temporari.",
        "upload-misc-error": "Errore desconosset de cargament",
        "upload-misc-error-text": "Un errore desconosset ocurret durante li cargament.\nPleser verificar que li URL es valid e accessibil e prova denov.\nSi li problema persister, parla che un [[Special:ListUsers/sysop|administrator]].",
        "upload-http-error": "Un errore HTTP ocurret: $1",
+       "upload-dialog-title": "Cargar un file",
+       "upload-dialog-button-cancel": "Anullar",
+       "upload-form-label-infoform-name": "Nómine",
+       "upload-form-label-infoform-date": "Date",
+       "http-invalid-url": "Ínvalid URL: $1",
        "upload-curl-error6": "Ne esset possibil ear in li URL",
        "upload-curl-error6-text": "Li URL preferet ne esset visitat.\nPleser vide denov que li URL es corect e si li loc es disponibil.",
        "upload-curl-error28": "For de témpor por cargament de files",
        "suppress": "Perspective comun",
        "booksources": "Librari fontes",
        "booksources-search-legend": "Serchar por fontes de libre",
+       "booksources-search": "Serchar",
        "specialloguserlabel": "Executor:",
        "speciallogtitlelabel": "Cible (titul o usator):",
        "log": "Diariumes",
        "wlheader-showupdated": "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
        "wlnote": "Infra {{PLURAL:$1|es li ultim change|es li ultim '''$1''' changes}} in li ultim {{PLURAL:$2|hor|'''$2''' hores}}.",
        "wlshowlast": "Monstra ultim $1 hores $2 dies",
+       "wlshowhidecategorization": "categorisation de págines",
        "watchlist-options": "Optiones de liste de págines vigilat",
        "watching": "Vigilant...",
        "unwatching": "Desvigilant...",
        "deleteotherreason": "Altri motive:",
        "deletereasonotherlist": "Altri motive",
        "rollbacklink": "desfar",
+       "rollbacklinkcount": "revocar $1 {{PLURAL:$1|redaction|redactiones}}",
        "protectlogpage": "Diarium de protection",
        "protectedarticle": "gardat \"[[$1]]\"",
        "prot_1movedto2": "[[$1]] hat movet por [[$2]]",
        "contributions": "Contributiones de {{GENDER:$1|usator|usatoressa}}",
        "contributions-title": "Contributiones de usator por $1",
        "mycontris": "Contributiones",
+       "anoncontribs": "Contributiones",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
        "uctop": "(actual)",
        "month": "De mensu (e anterioris):",
        "tooltip-ca-nstab-main": "Vider li articul",
        "tooltip-ca-nstab-user": "Vider li págine de usator",
        "tooltip-ca-nstab-media": "Vider li págine de media",
-       "tooltip-ca-nstab-special": "Ti es un págine special, vu ne posse redacter it",
+       "tooltip-ca-nstab-special": "To es un págine special, on ne posse redacter it",
        "tooltip-ca-nstab-project": "Vider li págine de projecte",
        "tooltip-ca-nstab-image": "Vider li págine de figura",
        "tooltip-ca-nstab-mediawiki": "Vider li missage de sistema",
        "tooltip-undo": "«Desfar» reverte solmen ti-ci redaction e monstra li resultate in prevision, porque tu posse indicar un rason in li linea de resumé.",
        "tooltip-preferences-save": "Conservar preferenties",
        "tooltip-summary": "Ples intrar un curt resummation.",
+       "simpleantispam-label": "Control anti-spam.\n<strong>Ne</strong> plena to ci!",
+       "pageinfo-toolboxlink": "Information pri li págine",
        "previousdiff": "← Redaction anteriori",
        "nextdiff": "Proxim redaction →",
        "thumbsize": "Mesura de miniatura:",
        "file-nohires": "Nequant resolution max alt disponibil.",
        "svg-long-desc": "(file SVG, nominalmen $1 × $2 pixeles, mesura de file: $3)",
        "show-big-image": "Original file",
+       "show-big-image-preview": "Dimension de ci prevision: $1.",
+       "show-big-image-other": "Altri {{PLURAL:$2|resolution|resolutiones}}: $1.",
        "newimages": "Galerie de nov images",
        "ilsubmit": "Serchar",
        "video-dims": "$1, $2×$3",
        "metadata": "Metadata",
        "metadata-help": "Ti file contene information additional, probabilmen adjuntet de li cámera digitale o scandetor usat por crear o digitalizar it. Si li file ha esset redactet de tui statu original, alcun detallies posse ne reflecter completmen li file redactet.",
        "metadata-fields": "Campes metadata de figura listat in ti missage va esser includet in págine de figura monstra quande li tabelle metadata es crulat.\nAltri va esser ocultat per contumacie.\n* fabrication\n* modelle\n* origine de figura\n* témpor de exposition\n* númere\n* percentages de velocitá\n* longore focal\n* artist\n* jure editorial\n* descrition de figura\n* latitúdine\n* longitúdine\n* altitudine",
+       "exif-orientation": "Orientation",
+       "exif-xresolution": "Resolution horizontal",
+       "exif-yresolution": "Resolution vertical",
+       "exif-datetime": "Date e hora de modification del file",
+       "exif-make": "Fabricante del cámera",
+       "exif-model": "Modelle del cámera",
+       "exif-exifversion": "Version de Exif",
+       "exif-colorspace": "Spacie del colores",
+       "exif-iimcategory": "Categorie",
+       "exif-orientation-1": "Normal",
        "namespacesall": "omni",
        "monthsall": "omni",
        "imgmultigo": "Ear!",
        "table_pager_limit_label": "Detallies por págine",
        "table_pager_limit_submit": "Ear",
        "table_pager_empty": "Nequant resultates",
+       "autosumm-new": "Creat págine contenente «$1»",
        "watchlistedit-normal-title": "Redacter liste de págines vigilat",
        "watchlistedit-normal-legend": "Remove titules del liste de págines vigilat",
        "watchlistedit-normal-explain": "Titules in tui liste de págines vigilat es monstrat infra.\nPor remover un titul, controla li buxe proxim por it, e clacca \"{{int:Watchlistedit-normal-submit}}\".\nVu posse anc [[Special:EditWatchlist/raw|redacter li liste vulnerosi]].",
        "version-hook-name": "Nómine de croc",
        "version-hook-subscribedby": "Subscrit per",
        "version-version": "($1)",
-       "version-license": "Licentie",
+       "version-license": "Licentie MediaWiki",
        "version-software": "Software installat",
        "version-software-product": "Producte",
        "version-software-version": "Version",
        "specialpages-group-highuse": "Págines de alt usu",
        "specialpages-group-pages": "Listes de págines",
        "specialpages-group-pagetools": "Utensiles de págine",
-       "specialpages-group-wiki": "Data wiki e utensiles",
+       "specialpages-group-wiki": "Data e utensiles",
        "specialpages-group-redirects": "Redirectionant págines special",
        "specialpages-group-spam": "Utensiles de spam",
        "external_image_whitelist": "#Abandonar ti linea exactmen quam it es<pre>\n#Colocar fragmentes de expression regulari (precismen li parte que ea inter li //) in infra\n#Tis va esser egalat che li URLes de figuras extern (hotlinked)\n#Tis que egala va esser monstrat quam figuras, altrimen solmen un catenun por li figura va esser monstrat\n#Lineas comensant che # es tractat quam comentaries\n#Ti es casu-ínsensitiv\n\n#Colocar omni fragmentes regulari súper ti linea. Abandonar ti linea exactmen quam it es</pre>",
        "tags-hitcount-header": "Changes nómiat",
        "tags-edit": "redacter",
        "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
-       "rightsnone": "(null)"
+       "logentry-delete-delete": "$1 ha removet li págine $3",
+       "logentry-move-move": "$1 ha movet li págine $3 a $4",
+       "logentry-newusers-create": "Conto de usator $1 ha esset creat",
+       "logentry-upload-upload": "$1 ha {{GENDER:$2|cargat}} $3",
+       "rightsnone": "(null)",
+       "searchsuggest-search": "Serchar {{SITENAME}}"
 }
index 904956e..e8f90af 100644 (file)
        "passwordreset-emaildisabled": "Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.",
        "passwordreset-username": "Nagan ti agar-aramat:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Kitaen ti nagbanagan nga esurat?",
-       "passwordreset-capture-help": "No markaam daytoy a kahon, ti esurat (nga adda ti temporario a kontrasenias) ket maipakitanto kenka ken maipatulodto iti agar-aramat.",
        "passwordreset-email": "Esurat a pagtaengan:",
        "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-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.",
-       "passwordreset-emailsent-capture2": "Naipatulodan {{PLURAL:$1|ti esurat|dagiti esurat}} ti panangisaad manen ti kontrasenias. Ti {{PLURAL:$1|nagan ti agar-aramat ken kontrasenias|listaan dagiti nagan ti agar-aramat ken dagiti kontrasenias}} ket naipakita dita baba.",
-       "passwordreset-emailerror-capture2": "Napaay ti panangitulod ti usurat iti {{GENDER:$2|agar-aramat}}: $1 Ti {{PLURAL:$3|nagan ti agar-aramat ken kontrasenias|listaan dagiti agar-aramat ken dagiti kontrasenias}} ket naipakita dita baba.",
        "passwordreset-nocaller": "Nasken a maited ti maysa nga agtawtawag",
        "passwordreset-nosuchcaller": "Awan ti agtawtawag: $1",
        "passwordreset-ignored": "Saan a natengngel ti panangisaad manen ti kontrasenias. Mabalin a saan a nakompigura ti mangited?",
        "saveprefs": "Idulin",
        "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a seksion)",
        "prefs-editing": "Ur-urnosen",
-       "rows": "Ar-aray:",
-       "columns": "Dagiti batong:",
        "searchresultshead": "Biruken",
        "stub-threshold": "Pagpatinggaan para iti panagpormat iti silpo ti pungol ($1):",
        "stub-threshold-sample-link": "wadan",
        "userrights-reason": "Rason:",
        "userrights-no-interwiki": "Awan ti pammalubosmo nga agurnos ti karbengan ti agar-aramat kadagiti sabali a wiki.",
        "userrights-nodatabase": "Awan ti database a $1 wenno saan a lokal.",
-       "userrights-nologin": "Masapul a [[Special:UserLogin|sumrekka]] nga addaan iti pakabilangan ti administrador tapno makaited kadagiti karbengan ti agar-aramat.",
-       "userrights-notallowed": "Awan ti pammalubos nga agnayon wenno agikkat kadagiti karbengan ti agar-aramat.",
        "userrights-changeable-col": "Dagiti grupo a mabalinmo a baliwan",
        "userrights-unchangeable-col": "Dagiti grupo a dimo mabalin a baliwan",
        "userrights-conflict": "Suppiat dagiti panagbaliw kadagiti karbengan ti agar-aramat! Pangngaasi nga irepasom ken pasingkedam dagiti sinuksukatam.",
-       "userrights-removed-self": "Inikkatmo kadagiti bukodmo a karbengan. Iti kastoyen, saankan a mabalin a mangserrek iti daytoy a panid.",
        "group": "Grupo:",
        "group-user": "Dagiti agar-aramat",
        "group-autoconfirmed": "Dagiti automatiko a napasingkedan nga agar-aramat",
        "right-siteadmin": "Mangikandado ken manglukat iti database",
        "right-override-export-depth": "Agipan kadagiti panid a mairaman dagiti naisilpo a panid agingana iti kauneg ti 5",
        "right-sendemail": "Agipatulod iti esurat kadagiti sabali nga agar-aramat",
-       "right-passwordreset": "Agkita kadagiti esurat ti panangisaad manen ti kontrasenias",
        "right-managechangetags": "Agpartuat ken (de)aktibuen [[Special:Tags|etiketa]]",
        "right-applychangetags": "Ipakat dagiti [[Special:Tags|etiketa]] a mairaman dagiti nabaliwan",
        "right-changetags": "Agnayon ken agikkat kadagiti arbitario nga [[Special:Tags|etiketa]] kadagiti agmaymaysa a rebision ken dagiti naikabkabil iti listaan",
        "uploaded-setting-handler-svg": "Naserraan ti SVG a nangisaad ti gupit ti \"handler\" nga addaan iti remote/data/script. Nabirukan ti <code>$1=\"$2\"</code> iti naikarga a papeles ti SVG.",
        "uploaded-remote-url-svg": "Naserraan ti SVG a nangisaad ti gupit iti ania man nga estilo nga addaan iti remote nga URL. Nabirukan ti <code>$1=\"$2\"</code> iti naikarga a papeles ti SVG.",
        "uploaded-image-filter-svg": "Nakabiruk ti sagat ti ladawan nga addaan iti URL: <code>&lt;$1 $2=\"$3\"&gt;</code> iti naikarga a papeles ti SVG.",
-       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon iti maysa a saan a mabalin a nagan ti espasio ti \"$1\".",
+       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon iti maysa a saan a mabalin a nagan ti espasio ti \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Ti XML iti naikarga a papeles ket saan a maiwaswas.",
        "uploadvirus": "Ti papeles ket aglaon ti birus! \nDagiti salaysay: $1",
        "uploadjava": "Daytoy a papeles ket papeles ti ZIP nga aglaon ti Java .a klase ti papeles.\nTi panangikarga ti papales ti Java ket saan a maipalubos gapu ta makapataudda a manglabas kadagiti panangigawid ti seguridad.",
        "feedback-useragent": "Ahente ti agar-aramat:",
        "searchsuggest-search": "Biruken",
        "searchsuggest-containing": "naglaon ti...",
-       "api-error-autoblocked": "Automatiko a naserraan ti IP nga adresmo, gapu ta inusar babaen ti naseraan nga agar-aramat.",
-       "api-error-badaccess-groups": "Saanka mapalubosan nga agikarga kadagiti papeles iti daytoy a wiki.",
        "api-error-badtoken": "Akin-uneg a biddut: Dakes a tandaan.",
-       "api-error-blocked": "Naserraankan manipud iti panagurnos.",
-       "api-error-copyuploaddisabled": "Ti panagikarga babaen ti URL ket nabaldado iti daytoy server.",
-       "api-error-duplicate": "Adda {{PLURAL:$1|sabali a papeles|dagiti sabali a papeles}} nga addan iti daytoy a sitio nga agraman iti agpada a linaon.",
-       "api-error-duplicate-archive": "Adda {{PLURAL:$1|idi sabali a papeles|dagidi sabali a papeles}} nga addaan ditoy a sitio nga agpada ti linaonda, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.",
-       "api-error-empty-file": "Ti papeles nga intedmo ket awan linaon.",
        "api-error-emptypage": "Agparprtuat ti baro, dagiti awan ti linaon a panid ket saan a maipalubos.",
-       "api-error-fetchfileerror": "Akin-uneg a biddut: Addaan ti dakes a napasamak bayat nga agal-ala ti papeles.",
-       "api-error-fileexists-forbidden": "Ti papeles nga agnagan ti \"$1\" ket addan, ken saan a mabalin a masuratan manen.",
-       "api-error-fileexists-shared-forbidden": "Ti papeles nga agnagan ti \"$1\" ket adda idiay pagbibingayan a repositorio ti papeles, ken saan a mabalin a masuratan manen.",
-       "api-error-file-too-large": "Ti papeles nga intedmo ket dakkel unay.",
-       "api-error-filename-tooshort": "Ti nagan daytoy a papeles ket bassit unay.",
-       "api-error-filetype-banned": "Ti kita daytoy a papeles ket maiparit.",
-       "api-error-filetype-banned-type": "Ti $1 {{PLURAL:$4|ket saan a mapalubosan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}. Ti mapalubosan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.",
-       "api-error-filetype-missing": "Ti papeles ket awan ti maysa a pagpaatiddog.",
-       "api-error-hookaborted": "Ti panagbabaro a pinadasmo ket pinasardeng babaen ti maysa a pagpaatiddog.",
-       "api-error-http": "Akin-uneg a biddut: Saan a makaikabit iti server.",
-       "api-error-illegal-filename": "Ti nagan daytoy a papeles ket saan a maipalubos.",
-       "api-error-internal-error": "Akin-uneg a biddut: Addaan ti dakes a napasamak iti panagproseso ti inkargam iti daytoy a wiki.",
-       "api-error-invalid-file-key": "Akin-uneg a biddut: Saan a nabirukan ti papeles idiay temporario a nagidulinan.",
-       "api-error-missingparam": "Akin-uneg a biddut: Awan dagiti parametro iti kiddaw.",
-       "api-error-missingresult": "Akin-uneg a biddut: Saan a naikeddeng no ti kopia ket nagballigi.",
-       "api-error-mustbeloggedin": "Masapul a nakastrekka tapno makaikarga kadagiti papeles.",
-       "api-error-mustbeposted": "Akin-uneg a biddut: Ti kiddaw ket masapul ti HTTP POST.",
-       "api-error-noimageinfo": "Balligi ti panagikarga, ngem ti server ket saan a nagited kadakami ti aniaman a pakaammo a maipanggep iti daytoy a papeles.",
-       "api-error-nomodule": "Akin-uneg a biddut: Awan ti naisad a modulo ti panagikarga.",
-       "api-error-ok-but-empty": "Akin-uneg a biddut: Awan ti sungbat manipud iti server.",
-       "api-error-overwrite": "Saan a maipalubos a suratan manen iti papeles nga addan.",
-       "api-error-stashfailed": "Akin-uneg a biddut: Napaay ti server nga agidulin ti temporario a papeles.",
        "api-error-publishfailed": "Akin-uneg a biddut: Napaay ti server nga agipablaak ti temporario a papeles.",
-       "api-error-stasherror": "Adda maysa a biddut bayat nga agikarkarga ti papeles iti stash.",
-       "api-error-timeout": "Saan a simmungbat ti server iti nanamnama nga oras.",
-       "api-error-unclassified": "Adda rimsua a di ammo a biddut.",
-       "api-error-unknown-code": "Di ammo a biddut: \"$1\".",
-       "api-error-unknown-error": "Akin-uneg a biddut: Addaan ti dakes a napasamak bayat idi nagipadaska nga agikarga iti papelesmo.",
+       "api-error-stashfailed": "Akin-uneg a biddut: Napaay ti server nga agidulin ti temporario a papeles.",
        "api-error-unknown-warning": "Di ammo a ballaag: \"$1\".",
        "api-error-unknownerror": "Di ammo a biddut: \"$1\".",
-       "api-error-uploaddisabled": "Nabaldado ti panagikarga iti daytoy a wiki.",
-       "api-error-verification-error": "Mabalin a dakes daytoy a papeles, wenno addaan iti madi a pagpaatiddog.",
        "duration-seconds": "$1 a {{PLURAL:$1|segundo|segsegundo}}",
        "duration-minutes": "$1 a {{PLURAL:$1|minuto|minminuto}}",
        "duration-hours": "$1 nga {{PLURAL:$1|oras|or-oras}}",
index 4184353..6990ca0 100644 (file)
        "searchprofile-advanced-tooltip": "Iочуязаяь цIерий аренашка лаха",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
        "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
-       "search-redirect": "(дIа-Ñ\81ахьожадар $1 тIара)",
+       "search-redirect": "(дIа-Ñ\85Ñ\8cахьожадар $1 тIара)",
        "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "search-interwiki-caption": "Гаргара проекташ",
        "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
        "rightsnone": "(яц)",
        "revdelete-summary": "хувцамий сурт оттадар",
-       "searchsuggest-search": "Ð\9bаÑ\85аÑ\80",
+       "searchsuggest-search": "Ð¥Ñ\8cалаÑ\85а {{grammar:prepositional|{{SITENAME}}}} Ñ\87Ñ\83",
        "expand_templates_preview": "Хьалххе бIаргтохар",
        "pagelang-name": "ОагIув",
        "special-characters-group-latin": "Латиной",
index 41aa59c..1814b46 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Robin van der Vliet"
+                       "Robin van der Vliet",
+                       "Algentem",
+                       "Joao Xavier"
                ]
        },
        "tog-underline": "Sub-strekizez ligili:",
        "tog-hideminor": "Celez mikra redaktaji de recenta chanji",
        "tog-hidepatrolled": "Celez patroliita redakti en recenta chanji",
        "tog-newpageshidepatrolled": "Celez patroliita pagini en la listo di nova pagino",
+       "tog-hidecategorization": "Celar kategorizeso di la pagini",
        "tog-extendwatchlist": "Expansez surveyo-listo por montrar omna chanji, vice nur la maxim recenta",
-       "tog-usenewrc": "Usez augmentita Recenta chanji (JavaScript bezonesas)",
+       "tog-usenewrc": "Chanji al grupo po pagino en recenta chanji e \"watchlist\"",
        "tog-numberheadings": "Autonumerez tituli",
        "tog-showtoolbar": "Montrez redaktilo (JavaScript bezonesas)",
        "tog-editondblclick": "Redaktez pagini kande on klikus dufoye (JavaScript bezonesas)",
-       "tog-editsectiononrightclick": "Kapabligez redakto di secioni kande on dextra-klikus tituli di secioni (JavaScript bezonesas)",
-       "tog-watchcreations": "Adjuntez pagini kreota da me ad mea surveyaji",
-       "tog-watchdefault": "Adjuntez pagini redaktota da me ad mea surveyaji",
-       "tog-watchmoves": "Adjuntez pagini movota da me ad mea surveyaji",
-       "tog-watchdeletion": "Adjuntez pagini efacota da me ad mea surveyaji",
+       "tog-editsectiononrightclick": "Kapabligez redakto di secioni per dextre-klikar tituli di secioni",
+       "tog-watchcreations": "Adjuntez la pagini qui me kreos a mea surveyaji",
+       "tog-watchdefault": "Adjuntez pagini qui me redaktos a mea surveyaji",
+       "tog-watchmoves": "Adjuntez pagini qui me movos a mea surveyaji",
+       "tog-watchdeletion": "Adjuntez pagini qui me efacos a mea surveyaji",
+       "tog-watchuploads": "Adjuntez nov arkivi qui me sendos a mea surveyaji",
+       "tog-watchrollback": "Adjuntez pagini ube me desfacos editadi a mea surveyaji",
        "tog-minordefault": "Markizez kustume omna redaktajo kom mikra",
        "tog-previewontop": "Montrez prevido avan la redakto-buxo",
        "tog-previewonfirst": "Montrez prevido pos la unesma redakto",
-       "tog-enotifwatchlistpages": "Sendez e-posto a me kande pagino quan me surveyas chanjesas",
+       "tog-enotifwatchlistpages": "Sendez e-posto a me kande pagino quan me surveyas chanjesos",
        "tog-enotifusertalkpages": "Sendez e-posto a me kande mea diskuto-pagino chanjesas",
        "tog-enotifminoredits": "Sendez e-posto a me mem por mikra chanji",
        "tog-enotifrevealaddr": "Montrez mea e-posto adreso en notifiko e-posti",
        "tog-shownumberswatching": "Montrez nombro di surveyanta uzanti",
+       "tog-oldsig": "Vua existanta signaturo:",
        "tog-fancysig": "Traktez signaturo kom wikikodo (sen automata ligilo)",
+       "tog-uselivepreview": "Uzes quika previdado",
        "tog-forceeditsummary": "Notifikez me kande skribanta vakua redakto-rezumo",
        "tog-watchlisthideown": "Celez mea redaktaji de la surveyaji",
        "tog-watchlisthidebots": "Celez redaktaji da roboti de la surveyaji",
        "tog-watchlisthideminor": "Celez mikra redaktaji de la surveyaji",
+       "tog-watchlisthideliu": "Celar l'editadi dal uzanti enrejistrita qui esas en la listo",
+       "tog-watchlistreloadautomatically": "Rimontrez automatale la listo, kande filtrilo modifikesos (bezonas JavaScript)",
+       "tog-watchlisthideanons": "Celar de la listo l'editadi facita da anonima redakteri",
        "tog-watchlisthidepatrolled": "Celez patroliita chanji en la surveyo-listo",
+       "tog-watchlisthidecategorization": "Celar la kategorizeso di pagini",
        "tog-ccmeonemails": "Sendez a me exemplero di e-posti quin me sendos ad altra uzanti",
        "tog-diffonly": "Ne montrez pagino kontenajo sub diferi",
        "tog-showhiddencats": "Montrar celita kategorii",
        "tog-norollbackdiff": "Omisar difero-komparo pos retrorulo",
+       "tog-useeditwarning": "Avertez se me probos klozar ula pagino sen sparar mea modifiki ed edituri",
+       "tog-prefershttps": "Sempre uzar sekura konekto kande facar log in",
        "underline-always": "Sempre",
        "underline-never": "Nulatempe",
+       "underline-default": "Pre-ajustaji pri sub-strekizar ligili",
+       "editfont-style": "Stilo di fonto uzata por editar la texto:",
+       "editfont-default": "Preajustaji di navigilo",
+       "editfont-monospace": "Tipo por redaktar kun singla spaco",
+       "editfont-sansserif": "tipo Sans-serif",
+       "editfont-serif": "tipo di fonto Serif",
        "sunday": "sundio",
        "monday": "lundio",
        "tuesday": "mardio",
        "oct": "okt",
        "nov": "nov",
        "dec": "dec",
+       "january-date": "$1ma di januaro",
+       "february-date": "$1ma di februaro",
+       "march-date": "$1ma di marto",
+       "april-date": "$1ma di aprilo",
+       "may-date": "$1ma di mayo",
+       "june-date": "$1ma di junio",
+       "july-date": "$1ma di julio",
+       "august-date": "$1ma di agosto",
+       "september-date": "$1ma di septembro",
+       "october-date": "$1ma di oktobro",
+       "november-date": "$1ma di novembro",
+       "december-date": "$1ma di decembro",
+       "period-am": "matine",
+       "period-pm": "posdimezo",
        "pagecategories": "{{PLURAL:$1|Kategorio|Kategorii}}",
        "category_header": "Artikli en kategorio \"$1\"",
        "subcategories": "Subkategorii",
        "category-file-count": "{{PLURAL:$2|Ica kategorio havas nur la sequanta arkivo.|La sequanta {{PLURAL:$1|arkivo|$1 arkivi}} es en ica kategorio, ek $2.}}",
        "category-file-count-limited": "La sequanta {{PLURAL:$1|arkivo|$1 arkivi}} es en la aktuala kategorio.",
        "listingcontinuesabbrev": "seq.",
+       "index-category": "indexigata pagini",
+       "noindex-category": "pagini sen indexi",
+       "broken-file-category": "Pagini kun ligili a neexistanta pagini",
        "about": "Pri",
        "article": "artiklo",
        "newwindow": "(aparos en nova panelo)",
        "cancel": "Anular",
-       "moredotdotdot": "Plus...",
+       "moredotdotdot": "Plusa...",
+       "morenotlisted": "Ca listo povas esar nekompleta.",
        "mypage": "Mea pagino",
        "mytalk": "Diskuti",
        "anontalk": "Diskuto relatant ad ica IP",
        "navigation": "Navigado",
        "and": "&#32;ed",
        "qbfind": "Trovez",
+       "qbbrowse": "Montrez listo",
        "qbedit": "Redaktar",
        "qbpageoptions": "Ica pagino",
        "qbmyoptions": "Mea pagini",
+       "faq": "Maxim komuna questioni",
+       "faqpage": "Project:FAQ - maxim komuna questioni",
        "actions": "Agi",
        "namespaces": "Nomari",
        "variants": "Varianti",
+       "navigation-heading": "Selektar dum la navigado",
        "errorpagetitle": "Eroro",
        "returnto": "Retrovenar a $1.",
        "tagline": "De {{SITENAME}}",
        "help": "Helpo",
        "search": "Sercho",
+       "search-ignored-headings": " #<!-- mantenez ica lineo sen modifiki --> <pre>\n# Tituli qui ignoresos per la sistemo di serchado.\n# Modifiki en ca parto efikeskos balde pos la titulo di la pagino adicionesos a l'indexo.\n# Tu povas acelerar la riindexigo di la pagino facante nihila editado.\n# La sintaxo esas quale infre:\n#   * Omna texti qui finas kun la signo \"#\" fine de la lineo, esas komentaro.\n#   * Omna lineo ne blanka - to esas: skriptata -, esas l'exakta titulo por ignorar la diferi inter mayuskula e minuskula literi, ed altra.\nReferi\nExtera ligili\nVidez anke\n #</pre> <!-- mantenez ica lineo sen modifiki -->",
        "searchbutton": "Serchez",
        "go": "Irar",
        "searcharticle": "Irez",
        "history": "Paginala historio",
        "history_short": "Versionaro",
+       "history_small": "historio",
        "updatedmarker": "aktualigita pos mea lasta vizito",
        "printableversion": "Imprimebla versiono",
        "permalink": "Permananta ligilo",
        "print": "Imprimar",
+       "view": "Videz",
+       "view-foreign": "Videz en $1",
        "edit": "Redaktar",
+       "edit-local": "Facar deskriptado lokale",
        "create": "Krear",
+       "create-local": "Inkluzar lokala deskriptado",
        "editthispage": "Redaktar ca pagino",
        "create-this-page": "Kreez ca pagino",
        "delete": "Efacar",
        "deletethispage": "Efacar ica pagino",
+       "undeletethispage": "Desfacar l'efaco di ca pagino",
        "undelete_short": "Restaurar {{PLURAL:$1|1 redakto|$1 redakti}}",
+       "viewdeleted_short": "Vidar {{PLURAL:$1|1 redakto efacita|$1 redakti efacita}}",
        "protect": "Protektar",
        "protect_change": "chanjar",
        "protectthispage": "Protektar ica pagino",
        "talk": "Diskuto",
        "views": "Apari",
        "toolbox": "Utensili",
-       "userpage": "Vidar uzanto-pagino",
+       "tool-link-userrights": "Chanjar la grupi di {{GENDER:$1|uzero}}",
+       "tool-link-userrights-readonly": "Vidar grupi {{GENDER:$1|user}}",
+       "tool-link-emailuser": "Sendar e-posto a {{GENDER:$1|}}",
+       "userpage": "Vidar uzeropagino",
        "projectpage": "Vidar projeto-pagino",
        "imagepage": "Vidar arkivo-pagino",
        "mediawikipage": "Vidar mesajo-pagino",
        "otherlanguages": "En altra lingui",
        "redirectedfrom": "(Ridirektita de $1)",
        "redirectpagesub": "Ridirektanta pagino",
+       "redirectto": "Ridirektar a:",
        "lastmodifiedat": "Ica pagino modifikesis ye $2, $1.",
        "viewcount": "Ica pagino acesesis {{PLURAL:$1|1 foyo|$1 foyi}}.",
        "protectedpage": "Protektita pagino",
        "jumpto": "Irez ad:",
        "jumptonavigation": "pilotado",
        "jumptosearch": "serchez",
+       "view-pool-error": "Pardonez, la sistemo esas okupata nun.\nMulta uzanti deziras vidar ca pagino.\nVoluntez vartar kelka instanti ante itere probar vidar ol.\n\n$1",
+       "generic-pool-error": "Pardonez, la servo-komputeri esas okupata nun.\nMulta uzanti probas vidar ta pagino.\nVoluntez vartar kelka instanti ante itere probar vidar ol.",
+       "pool-timeout": "Limito di tempo vartante la klozado",
+       "pool-queuefull": "La serio di taski esas plena",
+       "pool-errorunknown": "nekonocata eroro",
+       "pool-servererror": "La sistemo qua kontrolas l'aceso a $1 ne esas disponebla",
+       "poolcounter-usage-error": "Eroro di uzado:$1",
        "aboutsite": "Pri {{SITENAME}}",
        "aboutpage": "Project:Pri {{SITENAME}}",
-       "copyright": "La kontenajo esas disponebla sub $1.",
+       "copyright": "La kontenajo esas disponebla sub $1, ecepte kande kontree mencionata.",
        "copyrightpage": "{{ns:project}}:Autor-yuri",
        "currentevents": "Aktualaji",
        "currentevents-url": "Project:Aktualaji",
        "disclaimers": "Legala averto",
        "disclaimerpage": "Project:Generala des-agnosko",
        "edithelp": "Helpo pri redaktado",
-       "mainpage": "Frontispico",
-       "mainpage-description": "Frontispico",
+       "helppage-top-gethelp": "Helpo",
+       "mainpage": "Chefpagino",
+       "mainpage-description": "Chefpagino",
        "policy-url": "Project:Sistemo di agado",
        "portal": "Komuneso-portalo",
        "portal-url": "Project:Komuneso-portalo",
        "ok": "O.K.",
        "retrievedfrom": "Obtenita de \"$1\"",
        "youhavenewmessages": "Vu havas $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Vu havas}} $1 dal {{PLURAL:$3|altra uzero|$3 uzeri}} ($2).",
+       "youhavenewmessagesmanyusers": "Tu havas $1 da multa uzanti ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1| nova mesajo|999= nova mesaji}}",
+       "newmessagesdifflinkplural": "Lasta {{PLURAL:$1|chanjo|chanji}}",
        "youhavenewmessagesmulti": "Vu havas nova mesaji ye $1",
        "editsection": "redaktar",
        "editold": "redaktar",
        "toc": "Indexo",
        "showtoc": "montrar",
        "hidetoc": "celar",
+       "collapsible-collapse": "Celar la listo",
+       "collapsible-expand": "Montrar la listo",
+       "confirmable-confirm": "Ka vu {{GENDER:$1|vi}} fakte deziras facar to?",
+       "confirmable-yes": "Yes",
+       "confirmable-no": "No",
        "thisisdeleted": "Ka vidar o restaurar $1?",
        "viewdeleted": "Vidar $1?",
        "restorelink": "{{PLURAL:$1|1 redakto efacita|$1 redakti efacita}}",
+       "feedlinks": "Fonto RSS:",
+       "feed-invalid": "Tipo di fonto RSS nevalida",
+       "feed-unavailable": "Abonata publikaji ne esas disponebla",
        "site-rss-feed": "$1 RSS Provizajo",
        "site-atom-feed": "$1 Atom Provizajo",
        "page-rss-feed": "\"$1\" RSS Provizajo",
        "page-atom-feed": "\"$1\" Atom Provizajo",
        "red-link-title": "$1 (pagino ne existas)",
+       "sort-descending": "En ordino dekreskanta",
+       "sort-ascending": "En ordino kreskanta",
        "nstab-main": "Pagino",
-       "nstab-user": "Uzanto-pagino",
+       "nstab-user": "Uzeropagino",
+       "nstab-media": "Media pagino",
        "nstab-special": "Specala pagino",
        "nstab-project": "Projeto pagino",
        "nstab-image": "Failo",
        "nstab-template": "Shablono",
        "nstab-help": "Helpo",
        "nstab-category": "Kategorio",
+       "mainpage-nstab": "Chefpagino",
        "nosuchaction": "Ne esas tala ago",
+       "nosuchactiontext": "L'agado determinata en la URL esas nevalida.\nPosible vu skribis la URL nekorekte, o sequis nevalida ligilo.\nTo anke povas indikar \"bug\" en la programo por *komputero uzata per {{SITENAME}}.",
        "nosuchspecialpage": "Ne existas tala specala pagino",
        "nospecialpagetext": "<strong>Vu demandis specala pagino qua ne existas.</strong>\n\nOn povas trovar listo di valida specala pagini en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Eroro",
        "databaseerror": "Datumarala eroro",
+       "databaseerror-text": "Eventis eroro en datum-bazal demando.\nTo indikus eror en la programaro.",
+       "databaseerror-textcl": "Eventis eroro en datumbazal demando.",
+       "databaseerror-query": "Demando:$1",
+       "databaseerror-function": "Funciono: $1",
+       "databaseerror-error": "Eroro:$1",
+       "laggedslavemode": "<strong>Averto:</strong> La pagino povas ne kontenar la maxim recenta modifiki.",
        "readonly": "Datumaro esas blokusita",
        "enterlockreason": "Explikez la motivo por la blokuso, inkluzante\nevaluo pri kande eventos la desblokuso",
+       "readonlytext": "La datumaro nuntempe esas klozata por nova modifiki, probable pro facesar manteni rutinala. Pos la manteni, ol retrovenos a la normala stando.\n\nL'administranto di la sistemo qua klozis la datumaro explikis to: $1",
        "missingarticle-rev": "(versiono#: $1)",
        "missingarticle-diff": "(Difero: $1, $2)",
        "internalerror": "Interna eroro",
        "internalerror_info": "Interna eroro: $1",
+       "internalerror-fatal-exception": "Ne-reparebla ecepto \"$1\"",
        "filecopyerror": "Ne povis kopiar l'arkivo \"$1\" a \"$2\".",
        "filerenameerror": "Ne povas rinomizar l'arkivo \"$1\" ad \"$2\".",
        "filedeleteerror": "Onu ne povis efacar l'arkivo \"$1\".",
+       "directorycreateerror": "Ne sucesis krear dosieruyo \"$1\".",
+       "directoryreadonlyerror": "Dosieruyo \"$1\" esas nur-lektebla.",
+       "directorynotreadableerror": "Dosieruyo \"$1\" esas ne-lektebla.",
        "filenotfound": "Onu ne povas trovar la arkivo \"$1\".",
        "unexpected": "Nevartita valoro: \"$1\"=\"$2\".",
        "formerror": "Eroro: Onu ne povis sendar la kontenajo di la formularo",
        "badarticleerror": "Ica ago ne povas facesar en ca pagino.",
        "cannotdelete": "Ne es posibla efacar la pagino od arkivo \"$1\".\nForsan, ulu ja efacis ol.",
+       "cannotdelete-title": "Ne povas efacar pagino \"$1\"",
+       "no-null-revision": "Ne povis krear nova nula-revizo por pagino \"$1\"",
        "badtitle": "Nekorekta titulo",
        "badtitletext": "La solicitita pagino esas nevalida, vakua od esas\nnekorekta interlinguale od interwikale ligilo.",
+       "title-invalid-empty": "La demandita pagino-titulo es vakua o kontenas nur la nome di \"namespace\".",
+       "title-invalid-utf8": "La demandita pagino-titulo kontenas ne-valida sequo UTF-8.",
+       "title-invalid-interwiki": "La demandita pagino-titulo kontenas inter-wiki-ala ligilo, olqua ne povas uzesar en tituli.",
+       "title-invalid-talk-namespace": "La demandita pagino-titulo referas a diskuto-pagino, qua ne existas.",
+       "title-invalid-characters": "La demandita pagino-titulo kontenas ne-valida literi: \"$1\".",
        "perfcached": "La sequanta datumi esas kashizita* e li povus ne aktualigesar nuntempe. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "viewsource": "Vidar font-kodo",
-       "protectedpagetext": "Ica pagino esis protektita por preventar redaktar.",
-       "viewsourcetext": "Vu povas vidar ed kopiar la fonto-kodexo di ta pagino:",
+       "actionthrottled": "Agado limitizita",
+       "protectedpagetext": "Ta pagino protektesis por preventar redaktadi od altra agi.",
+       "viewsourcetext": "Vu povas vidar ed kopiar la fonto-kodexo di ta pagino.",
+       "viewyourtext": "Vu darfas vidar e kopiar la fonto di <strong>vua redakti</strong> ad ita pagino.",
+       "protectedinterface": "Ita pagino provizas 'interface' texto por la programaro en ita wiki, ed esas protektita por preventar mis-uzo.\nPor introduktar o chanjar tradukaji di la wiki-i, voluntez vizitar [https://translatewiki.net/ translatewiki.net], la projeto qua provizas tradukaji a MediaWiki.",
+       "editinginterface": "<strong>Averto:</strong> Vu redaktas pagino qua uzesas por provizar 'interface' texto di la programaro.\nChanji a ta pagino chanjos la aspekto di pagini por altra uzeri di ta wiki.",
+       "translateinterface": "Por introduktar o chanjar tradukaji en omna wiki-i, voluntez uzar [https://translatewiki.net/ translatewiki.net], la komuna projeto MediaWiki.",
+       "namespaceprotected": "Vu ne es permisita redaktar pagini en la nomaro <strong>$1</strong>.",
+       "customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
+       "customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
+       "mycustomcssprotected": "Vu ne es permisita redaktar ita CSS pagino.",
+       "mycustomjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino.",
+       "myprivateinfoprotected": "Vu ne es permisita redaktar vua privata informajo.",
+       "mypreferencesprotected": "Vu ne es permisita redaktar vua preferaji.",
        "ns-specialprotected": "On ne povas redaktar speciala pagini.",
-       "logouttext": "'''Vu nun esas nun ek {{SITENAME}}.'''\n\nVu povas durar uzante {{SITENAME}} anonimale, o vu povas <span class='plainlinks'>[$1 enirar itere]</span> kom la sama o diferenta uzanto.\nAtencez ke kelka pagini posible duras montresar semblante ke vu ne ekirus, til vu vakuigas la tempala-magazino di vua navigilo.",
+       "titleprotected": "Ita titulo es protektita de kreado da [[User:$1|$1]].\nLa motivo es <em>$2</em>.",
+       "filereadonlyerror": "La dosiero \"$1\" ne es modifikebla nam la depozeyo di dosieri \"$2\" esas nur lektebla.\n\nLa sistem-administrero qua klozis ol ofris ita klarigo: \"$3\".",
+       "invalidtitle-knownnamespace": "Ne-valida titulo kun nomaro \"$2\" e texto \"$3\"",
+       "exception-nologin": "Vu ne eniris",
+       "exception-nologin-text": "Voluntez enirar konto por acesar la pagino od ago.",
+       "exception-nologin-text-manual": "Voluntez $1 por acesar ta pagino od ago.",
+       "virus-badscanner": "Mala selektajo: Nekonocata skanilo di virusi: <em>$1</em>",
+       "virus-scanfailed": "skano ne sucesis (kodexo $1)",
+       "virus-unknownscanner": "antiviruso nekonocata:",
+       "logouttext": "<strong>Vu ekirabas.</strong>\n\nAtencez ke kelka pagini posible duras montresar quaze vu ne ekiris, til ke vu vakuigos la tempala-magazino di la navigilo.",
+       "cannotlogoutnow-title": "Ne povas ekirar nun",
+       "cannotlogoutnow-text": "Ekirar ne esas posibla kande vu uzas $1.",
+       "welcomeuser": "Esez bonvenanta, $1!",
+       "welcomecreation-msg": "Vua konto kreesis.\n\nVu povas modifikar vua [[Special:Preferences|preferaji en la {{SITENAME}}]] se vu deziras.",
        "yourname": "Vua uzantonomo:",
+       "userlogin-yourname": "Uzantonomo",
+       "userlogin-yourname-ph": "Enirez vua uzantonomo",
+       "createacct-another-username-ph": "Enirez la uzantonomo",
        "yourpassword": "Pasovorto:",
+       "userlogin-yourpassword": "pasovorto",
+       "userlogin-yourpassword-ph": "Enirez vua pasovorto",
+       "createacct-yourpassword-ph": "Enirez pasovorto",
        "yourpasswordagain": "Riskribez la pasovorto:",
+       "createacct-yourpasswordagain": "Konfirmez la pasovorto",
+       "createacct-yourpasswordagain-ph": "Enirez itere la pasovorto",
+       "userlogin-remembermypassword": "Mantenez me konektata",
+       "userlogin-signwithsecure": "Usez sekura konekto",
+       "cannotlogin-title": "Ne povis enirar",
+       "cannotlogin-text": "Ne esas posibla konektar a la sistemo",
+       "cannotloginnow-title": "Ne povas enirar nun",
+       "cannotloginnow-text": "Enirar ne esas posibla kande vu usas $1",
+       "cannotcreateaccount-title": "Ne povas krear la konti",
+       "cannotcreateaccount-text": "Krear uzerokonto ne posibligas en ita wiki.",
        "yourdomainname": "Vua domano:",
+       "password-change-forbidden": "Vu ne darfas chanjar pasovorti en ita wiki.",
        "login": "Enirar",
-       "nav-login-createaccount": "Enirar",
+       "login-security": "Kontrolez vua identeso.",
+       "nav-login-createaccount": "Enirar / Krear konto",
        "userlogin": "Enirar / krear konto",
        "userloginnocreate": "Enirar",
        "logout": "Ekirar",
        "userlogout": "Ekirar",
        "notloggedin": "Sesiono ne esas iniciata",
+       "userlogin-noaccount": "Ka vu ne havas konto?",
+       "userlogin-joinproject": "Enirez la {{SITENAME}}",
        "nologin": "Ka vu ne havas konto? $1.",
        "nologinlink": "Kreez konto",
        "createaccount": "Krear nova konto",
        "gotaccount": "Ka vu ja havas konto? '''$1'''.",
        "gotaccountlink": "Enirar",
-       "createaccountmail": "per e-posto",
+       "userlogin-resetlink": "Ka tu obliviis la detalii pri tua konekto?",
+       "userlogin-resetpassword-link": "Ka tu obliviis tua pasovorto?",
+       "userlogin-helplink2": "Helpo pri quale enirar",
+       "userlogin-loggedin": "Tu ja eniris, kun la nomo {{GENDER:$1|$1}}\n\nUsez la formulario infre por enirar quale altra uzero.",
+       "userlogin-reauth": "Vu mustas ri-enirar por kontrolar ke vu esas {{GENDER:$1|$1}}.",
+       "userlogin-createanother": "Kreez plusa konto.",
+       "createacct-emailrequired": "E-postal adreso",
+       "createacct-emailoptional": "E-postal adreso (ne-obligita)",
+       "createacct-email-ph": "Prizentez vua e-postal adreso",
+       "createacct-another-email-ph": "Prizentez vua e-postal adreso",
+       "createaccountmail": "Uzez provizora pasovorto, ed ad adresizez ol a la korespondanta e-posto",
+       "createacct-realname": "Vera nomo (fakultativa)",
        "createaccountreason": "Motivo:",
+       "createacct-reason": "Motivo",
+       "createacct-reason-ph": "Pro quo tu kreas nova konto",
+       "createacct-submit": "Kreez konto",
+       "createacct-another-submit": "Krear konto",
+       "createacct-continue-submit": "Durez krear konto",
+       "createacct-another-continue-submit": "Durez krear konto",
+       "createacct-benefit-heading": "{{SITENAME}} facesas da homi simile a vu.",
+       "createacct-benefit-body1": "{{PLURAL:$1|redakto|redakti}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|pagino|pagini}}",
+       "createacct-benefit-body3": "recenta {{PLURAL:$1|kontributero|kontributeri}}",
        "badretype": "La pasovorti vu donis ne esas sama.",
-       "userexists": "La uzantonomo, quan vu skribis, ja selektesis antee.\nVoluntez, elektez ula diferanta uzantonomo.",
+       "usernameinprogress": "Kontokreado por ita uzero duras. Voluntez vartar.",
+       "userexists": "La uzeronomo ja selektesis antee.\nVoluntez elektar diferanta uzeronomo.",
        "loginerror": "Eroro enirante",
+       "createacct-error": "Eroro pri kontokreado",
+       "createaccounterror": "Ne povis krear konto: $1",
+       "nocookiesnew": "L'uzero-konto esis kreita, ma vu ne esas eniranta.\n{{SITENAME}} uzas ''bisquiti'' por eniras uzeri.\n''Bisquiti'' esas desacendita.\nVoluntez acendar li, lore enirez per vua nova uzero e pasovorto.",
        "nocookieslogin": "{{SITENAME}} uzas ''cookies'' por la registrago dil uzanti. Vu havas la ''cookies'' desaktivigita. Voluntez aktivigar oli e probez altrafoye.",
+       "nocookiesfornew": "La uzerokonto ne kreesis, nam ni ne povis konfirmar lua fonto.\nEsez certa ke navigilo aceptas 'cookies', ri-apertez ita pagino, e riprobez.",
+       "createacct-loginerror": "Konto kreesis sucesoze ma vu ne eniris la reto. Voluntez vizitar [[Special:UserLogin|manual login]].",
        "noname": "Vu ne donis valida uzantonomo.",
-       "loginsuccesstitle": "Eniro sucesoza",
+       "loginsuccesstitle": "Eniris sucesoze",
        "loginsuccess": "'''Vu eniris a {{SITENAME}} kom \"$1\".'''",
-       "nosuchuser": "Ne existas uzanto \"$1\".\nUzanto-nomi esas mayu/minuskulo-distingenda.\nKontrolez vua espelado, o [[Special:CreateAccount|krear nova konto]].",
-       "nosuchusershort": "Esas nula uzanto \"$1\".\nKontrolez la espelado.",
+       "nosuchuser": "Ne existas uzero \"$1\".\nUzeronomi esas mayu/minuskulo-distingenda.\nKontrolez la espelado, o [[Special:CreateAccount|krear nova konto]].",
+       "nosuchusershort": "Esas nula uzero \"$1\".\nKontrolez la espelado.",
        "nouserspecified": "Vu mustas specigar uzantonomo.",
+       "login-userblocked": "Ta uzero es interdiktita. Enirado ne permisesas.",
        "wrongpassword": "La skribita pasovorto esis nekorekta. Voluntez probar itere.",
        "wrongpasswordempty": "Vu ne skribis pasovorto. Probez nove.",
        "passwordtooshort": "Pasovorti mustas kontenar adminime {{PLURAL:$1|1 signo|$1 signi}}.",
+       "passwordtoolong": "Pasovorti ne mustas esar plu longa kam {{PLURAL:$1|1 litero|$1 literi}}.",
+       "passwordtoopopular": "Voluntez selektar plu unika pasovorto.",
+       "password-name-match": "Pasovorto mustas diferar de vua uzeronomo.",
+       "password-login-forbidden": "La uzo di ita uzeronomo e pasovorto es interdiktita.",
        "mailmypassword": "Sendez nova pasovorto per e-posto",
        "passwordremindertitle": "Nova provizora pasovorto por {{SITENAME}}",
-       "noemail": "Ne esas e-adreso konservita por la uzanto \"$1\".",
+       "noemail": "Ne esas e-adreso konservita por la uzero \"$1\".",
+       "noemailcreate": "Tu mustas informar valida e-posto",
        "passwordsent": "Nova pasovorto sendesis a la e-adreso registragita por \"$1\".\nVoluntez enirar altrafoye pos recevar ol.",
+       "blocked-mailpassword": "Vua adreso di IP blokuzesis por redaktado. Por preventar misuzo, ne permisesas rekuperar pasovorti de ca adreso di IP.",
+       "eauthentsent": "E-posto por konfirmar l'informi sendesis a la e-posto indikita da vu.\nAnte ke altra e-posto sendesos a vua konto, vu mustos sequar l'instrukti mencionata en la e-posto, por konfirmar ke la konto fakte esas vua.",
+       "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
        "mailerror": "Eroro sendante posto: $1",
        "acct_creation_throttle_hit": "Vizitanti ad ica wiki uzante vua IP adreso kreis {{PLURAL:$1|1 konto|$1 konti}} ye la antea dio (24 hori), qua esas la maximo permisata. Konseque, vizitanti uzante ca IP adreso ne pluse povas krear konti prezente.",
-       "emailauthenticated": "Vua e-postala adreso autentikigesis ye $2, ye $3.",
+       "emailauthenticated": "Vua e-postal adreso autentikigesis ye $2, ye $3.",
+       "emailnotauthenticated": "Vua e-postal adreso ne ja autentikigesas.\nNula mesaji sendesos por irga di la sequanta funcioni.",
+       "noemailprefs": "Prizentez e-postal adreso en vua preferaji por disponar ita funcioni.",
        "emailconfirmlink": "Konfirmez vua adreso di e-posto",
+       "cannotchangeemail": "E-posto-adreso dil konto ne povas chanjesar ye ta wikio.",
+       "emaildisabled": "Ita ret-sito ne povas sendar e-mesaji.",
        "accountcreated": "Konto kreesis",
-       "accountcreatedtext": "La uzantokonto por $1 kreatesis.",
+       "accountcreatedtext": "La uzerokonto por [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskuto]]) kreesis.",
        "createaccount-title": "Kreo di konto en {{SITENAME}}",
+       "createaccount-text": "Ulu kreis konto por vua e-posto adreso ye {{SITENAME}} ($4) nomita \"$2\", kun pasovorto \"$3\".\nVu devas enirar la konto e chanjar vua pasovorto nun.\n\nVu darfas ignorar ita mesajo, se ita konto kreesis en eroro.",
+       "login-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.",
+       "login-abort-generic": "Vua eniro-probo faliis - Cesigita",
+       "login-migrated-generic": "Vua konto esas migrata, e vua uzeronomo ne plus existas che ita wikio.",
        "loginlanguagelabel": "Linguo: $1",
+       "pt-login": "Enirar",
+       "pt-login-button": "Enirar",
+       "pt-login-continue-button": "Durez enirar",
+       "pt-createaccount": "Krear konto",
+       "pt-userlogout": "Ekirar",
+       "php-mail-error-unknown": "Nekonocata eroro en la funciono mail() de PHP",
+       "user-mail-no-addy": "Probis sendar e-posto sen e-post-adreso.",
+       "user-mail-no-body": "Probis sendar e-posto kun vakua o tre kurta mesajo.",
        "changepassword": "Chanjar pasovorto",
+       "resetpass_announce": "Por kompletigar l'enirado, vu mustas krear nova pasvorto.",
        "resetpass_header": "Chanjar pasovorto di konto",
        "oldpassword": "Anciena pasovorto:",
        "newpassword": "Nova pasovorto:",
        "retypenew": "Riskribez la nova pasovorto:",
        "resetpass_submit": "Establisez pasovoro ed enirez",
-       "changepassword-success": "Vua chanjo di pasovorto sucesis! Nun, vu eniras...",
+       "changepassword-success": "Vua chanjo di pasovorto sucesis!",
+       "changepassword-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.",
+       "botpasswords": "Robotala pasovorti",
+       "botpasswords-label-create": "Krear",
+       "botpasswords-label-update": "Aktualigar",
+       "botpasswords-label-cancel": "Anular",
+       "botpasswords-label-delete": "Efacar",
+       "botpasswords-label-resetpassword": "Sendez nova pasovorto per e-posto",
+       "botpasswords-label-grants": "Uzebla grantaji:",
        "resetpass-submit-loggedin": "Chanjar pasovorto",
+       "resetpass-submit-cancel": "Anular",
+       "resetpass-wrong-oldpass": "Nevalida provizora od aktuala pasovorto.\nForsan vu ja chanjis vua pasovorto o demandis nova provizora pasovorto.",
+       "resetpass-recycled": "Voluntez chanjar vua pasovorto ad ulo diferanta de vua aktuala pasovorto.",
+       "resetpass-temp-emailed": "Vu eniris uzante provizora pasovorto.\nPor parkompletigar enirado, vu mustas krear nova pasovorto hike:",
        "resetpass-temp-password": "Provizora pasovorto:",
+       "passwordreset": "Sendez nova pasovorto per e-posto",
        "passwordreset-username": "Uzantonomo:",
-       "changeemail": "Chanjar e-adreso*",
+       "passwordreset-invalidemail": "Ne-valida e-posto-adreso",
+       "passwordreset-nodata": "Nek uzeronomo nek e-posto-adreso esis provizita",
+       "changeemail": "Chanjar od efacar e-postal adreso",
+       "changeemail-header": "Plenigez ita formulario por chanjar vua e-posto-adreso. Se vu volas forigar irga e-posto-adreso de vua konto, lasez la nova e-posto-adreso vakua en la formulario.",
+       "changeemail-no-info": "Vu mustas enirar la konto por acesar ita pagino direte.",
+       "changeemail-oldemail": "Aktuala e-posto-adreso:",
+       "changeemail-newemail": "Nova e-posto-adreso:",
+       "changeemail-none": "(nula)",
+       "changeemail-password": "Vua {{SITENAME}} pasovorto:",
+       "changeemail-submit": "Chanjar e-posto-adreso",
+       "changeemail-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.",
+       "changeemail-nochange": "Voluntez skribar diferanta nova e-posto-adreso.",
+       "resettokens": "Rinovigar klefi",
+       "resettokens-no-tokens": "Esas nula klefi rinovigebla.",
+       "resettokens-tokens": "Klefi:",
+       "resettokens-token-label": "$1 (nuna valoro: $2)",
+       "resettokens-done": "Klefi rinovigita.",
+       "resettokens-resetbutton": "Rinovigar selektita klefi",
        "bold_sample": "Dika literi",
        "bold_tip": "Dika literi",
        "italic_sample": "Kursiva literi",
        "sig_tip": "Vua signaturo kun 'timestamp'",
        "hr_tip": "Horizontala lineo (ne trouzez ol)",
        "summary": "Rezumo:",
-       "subject": "Temo / Titulo:",
+       "subject": "Temo:",
        "minoredit": "Ico esas mikra redaktajo",
        "watchthis": "Surveyar ica pagino",
        "savearticle": "Registragar pagino",
+       "savechanges": "Konservez la chanji",
        "publishpage": "Publikigar pagino",
        "publishchanges": "Publikigar chanji",
        "preview": "Previdar",
        "showpreview": "Previdar",
        "showdiff": "Montrez chanji",
-       "anoneditwarning": "'''Averto:''' Vu ne eniris.\nVua IP-adreso registragesos en la versionaro di ca pagino.",
+       "blankarticle": "<strong>Averto:</strong> La pagino vu kreas es vakua.\nSe vu ri-selektos \"{{int:savearticle}}\", la pagino kreesos sen irga kontenajo.",
+       "anoneditwarning": "<strong>Averto:</strong> Vu ne eniris.\nVua IP-adreso esos videbla publike se vu redaktos. Se vu <strong>[$1 enirus]</strong> od <strong>[$2 kreus konto]</strong>, vua redakti atribuesos a vua uzeronomo, kune kun altra bonaji.",
+       "anonpreviewwarning": "<em>Vu ne eniris. Konservar chanji registragos vua IP-adreso en la redakto-historio di ta pagino.</em>",
        "missingcommenttext": "Voluntez, skribez komento sube.",
        "summary-preview": "Prevido di la rezumo:",
-       "blockedtitle": "La uzanto esas blokusita",
+       "blockedtitle": "La uzero esas blokusita",
        "blockednoreason": "nula motivo donesis",
        "whitelistedittext": "Vu mustas $1 por redaktar pagini.",
        "nosuchsectiontitle": "On ne povis trovar la seciono",
        "accmailtext": "Hazarde genitita pasovorto por [[User talk:$1|$1]] sendesis ad $2.\n\nLa pasovorto por ica nova konto povas chanjesar che la ''[[Special:ChangePassword|chanjar pasovorto]]'' pagino pos on eniras.",
        "newarticle": "(nova)",
        "newarticletext": "Vu sequis ligilo a pagino qua ne existas ankore.\nPor krear ica pagino, voluntez startar skribar en la infra buxo.\n(regardez la [$1 helpo] por plusa informo).\nSe vu esas hike erore, kliktez sur la butono por retrovenar en vua navigilo.",
-       "noarticletext": "Prezente, ne esas texto en ica pagino.\nVu povas [[Special:Search/{{PAGENAME}}|serchar ica titulo]] en altra pagini,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchar en la relata registri],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktar ica pagino]</span>.",
-       "userpage-userdoesnotexist": "Uzanto-nomo \"<nowiki>$1</nowiki>\" no registragesis.\nVoluntez konfirmez se vu volas krear/redaktar ica pagino.",
-       "userpage-userdoesnotexist-view": "Uzanto-nomo \"$1\" no registragesis.",
+       "noarticletext": "Til nun ne existas texto en ica pagino.\nVu povas [[Specala:Search/{{PAGENAME}}|serchar ica titulo]] en altra pagini,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchar en la relata registri],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktar ica pagino]</span>.",
+       "userpage-userdoesnotexist": "Uzeronomo \"$1\" no registragesis.\nVoluntez konfirmez se vu volas krear/redaktar ica pagino.",
+       "userpage-userdoesnotexist-view": "Uzeronomo \"$1\" no registragesis.",
        "clearyourcache": "'''Atencez: Pos registragar, vu probable mustas renovigar la tempala-magazino di vua navigilo por vidar la chanji.'''\n'''Mozilla / Firefox / Safari:''' tenez ''Shift'' kliktante ''Reload'', o presez sive  ''Ctrl-F5'' sive ''Ctrl-R'' (''Command-R'' ye Mac);\n'''Konqueror''': kliktez ''Reload'' o presez ''F5'';\n'''Opera:''' vakuigez la tempala-magazino en ''Tools → Preferences'';\n'''Internet Explorer:''' tenez ''Ctrl'' kliktante ''Refresh,'' o presez ''Ctrl-F5''.",
-       "usercsspreview": "'''Memorez ke vu nur previdas vua uzanto-CSS.'''\n'''Ol ne registragesis ankore!'''",
-       "userjspreview": "'''Memorez ke vu nur previdas vua javascript di uzanto. Ol ne registragesis ankore!'''",
+       "usercsspreview": "'''Memorez ke vu nur previdas vua uzero-CSS.'''\n'''Ol ne registragesis ankore!'''",
+       "userjspreview": "'''Memorez ke vu nur previdas vua JavaScript di uzero. Ol ne registragesis ankore!'''",
        "updated": "(Aktualigita)",
        "note": "'''Noto:'''",
        "previewnote": "'''Atencez ke ico esas nur prevido ed ol ne registragesis ankore!'''",
        "editingold": "'''EGARDEZ: Vu redaktas anciena versiono di ca pagino.\nSe vu gardus ol, la chanji facita pos ita revizo perdesos.'''",
        "yourdiff": "Diferi",
        "copyrightwarning": "Voluntez memorar ke omna kontributi a {{SITENAME}} esas sub la $2 (Videz $1 por detali).\nSe vu ne deziras ke altri modifikez vua artikli od oli distributesez libere, lore voluntez ne skribar oli hike.<br />\nPublikigante vua skribajo hike, vu asertas ke olu skribesis da vu ipsa o kopiesis de libera fonto.\n'''NE SENDEZ ARTIKLI KUN ''COPYRIGHT'' SEN PERMISO!'''",
-       "protectedpagewarning": "'''AVERTO: Ica pagino esas blokusita, do nur ''sysop''-i povas redaktar olu.'''",
+       "protectedpagewarning": "<strong>Averto: Ica pagino esas protektita por ke nur uzeri kun administero-yuri povas redaktar ol.</strong>\nLa maxim recenta en-registrago provizesas:",
        "templatesused": "{{PLURAL:$1|Shablono|Shabloni}} uzata en ica pagino:",
        "templatesusedpreview": "{{PLURAL:$1|Shablono|Shabloni}} uzata en ica prevido:",
        "templatesusedsection": "{{PLURAL:$1|Shablono|Shabloni}} uzata en ica seciono:",
        "permissionserrorstext-withaction": "Vu ne darfas $2, pro la {{PLURAL:$1|kauzo|kauzi}} sequanta:",
        "moveddeleted-notice": "Ca pagino efacesabas.\nLa efaco-registraro e movo-registraro dil pagino provizesar sequante por refero.",
        "edit-conflict": "Konflikto di editi.",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "vakua objekto",
+       "content-json-empty-array": "vakua tabelo",
+       "deprecated-self-close-category": "Pages using invalid self-closed HTML tags",
        "viewpagelogs": "Videz registrari por ca pagino",
        "nohistory": "Ne esas redakto-historio por ica pagino.",
        "currentrev": "Aktuala versiono",
        "histlast": "Maxim nova",
        "historysize": "({{PLURAL:$1|1 bicoko|$1 bicoki}})",
        "historyempty": "(vakua)",
+       "history-feed-title": "Historio di redakti",
+       "history-feed-description": "Historio di redakti por ta pagino en la wikio",
        "history-feed-item-nocomment": "$1 ye $2",
-       "rev-deleted-comment": "(komento forigita)",
+       "rev-deleted-comment": "(rezumo di redakti forigesis)",
        "rev-deleted-user": "(uzantonomo forigita)",
+       "rev-deleted-event": "(detali dil registro forigesis)",
        "rev-delundel": "montrar/celar",
        "rev-showdeleted": "montrar",
        "revdelete-show-file-submit": "Yes",
        "revdelete-hide-image": "Celar kontenajo dil arkivo",
-       "revdelete-hide-comment": "Celar komento pri redakto",
-       "revdelete-hide-user": "Celar uzantonomo od IP di redaktanto",
-       "revdelete-radio-set": "Yes",
-       "revdelete-radio-unset": "No",
+       "revdelete-hide-comment": "Rezumo di redakto",
+       "revdelete-hide-user": "uzeronomo di redaktanto/IP-adreso",
+       "revdelete-radio-set": "Celita",
+       "revdelete-radio-unset": "Videbla",
        "revdelete-log": "Motivo:",
        "revdel-restore": "chanjar videbleso",
        "pagehist": "Pagino-versionaro",
        "revdelete-reasonotherlist": "Altra motivo",
        "mergehistory-reason": "Motivo:",
        "revertmerge": "Desmixar",
-       "history-title": "Versionaro di \"$1\"",
+       "history-title": "Version-historio di \"$1\"",
+       "difference-title": "Diferi inter la revizi di $1",
        "lineno": "Lineo $1:",
        "compareselectedversions": "Komparar selektita versioni",
        "editundo": "des-facez",
+       "diff-multi-sameuser": "(ne montresas {{PLURAL:$1|1 meza revizo|$1 meza revizi}} facita da la sama uzero)",
        "searchresults": "Rezultaji dil sercho",
        "searchresults-title": "Sercho-rezultaji por \"$1\"",
        "titlematches": "Koincidi de titulo di artiklo",
        "searchprofile-articles-tooltip": "Serchez en $1",
        "searchprofile-images-tooltip": "Serchez arkivi",
        "search-result-size": "$1 ({{PLURAL:$2|1 vorto|$2 vorti}})",
-       "search-redirect": "(ridirektilo $1)",
+       "search-redirect": "(Ridirektita de $1)",
        "search-section": "(seciono $1)",
        "search-suggest": "Ka vu volis dicar: $1",
        "search-interwiki-caption": "Altra projekti",
-       "search-interwiki-default": "Rezultaji di $1:",
+       "search-interwiki-default": "Rezultaji de $1:",
        "search-interwiki-more": "(plusa)",
        "searchall": "omna",
        "showingresults": "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.",
+       "search-nonefound": "Nula rezulto trovesis por lua serchado.",
        "powersearch-legend": "Avancita sercho",
        "powersearch-ns": "Serchez en nomari:",
        "powersearch-toggleall": "Omna",
        "preferences": "Preferaji",
        "mypreferences": "Preferaji",
        "prefs-edits": "Nombro di redaktaji:",
+       "prefsnologintext2": "Voluntez enirar por chanjar vua ajusti.",
        "prefs-skin": "Pelo",
        "skin-preview": "Pre-videz",
        "datedefault": "Sen prefero",
        "prefs-rc": "Recenta chanji",
        "prefs-watchlist": "Surveyo-listo",
        "prefs-watchlist-days": "Dii montrata en surveyaji:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "Maxime $1 {{PLURAL:$1|dio|dii}}",
        "prefs-watchlist-edits-max": "Maxima nombro: 1000",
        "prefs-misc": "Mixaji",
        "prefs-resetpass": "Chanjar pasovorto",
        "prefs-rendering": "Aspekto",
        "saveprefs": "Registragar",
        "prefs-editing": "Grandeso dil areo por texto",
-       "rows": "Linei:",
-       "columns": "Kolumni:",
        "searchresultshead": "Preferaji di la rezultaji dil sercho",
        "recentchangesdays": "Dii montrota en la recenta chanji:",
        "recentchangesdays-max": "Maximo $1 {{PLURAL:$1|dio|dii}}",
        "prefs-namespaces": "Nomari",
        "prefs-files": "Arkivi",
        "youremail": "Vua e-adreso:",
-       "username": "Uzantonomo:",
-       "prefs-memberingroups": "Membro di la {{PLURAL:$1|grupo|grupi}}:",
+       "username": "{{GENDER:$1|Uzeronomo}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membro}} di {{PLURAL:$1|grupo|grupi}}:",
        "yourrealname": "Reala nomo:",
        "yourlanguage": "Linguo:",
        "yournick": "Signaturo:",
        "badsiglength": "Vua signaturo es tro longa.\nOl mustas ne havar plu kam $1 {{PLURAL:$1|litero|literi}}.",
-       "yourgender": "Genro:",
-       "gender-unknown": "Nespecigita",
-       "gender-male": "Maskula",
-       "gender-female": "Femina",
+       "yourgender": "Quale vu preferas esar priskribata?",
+       "gender-unknown": "Lor mencionar vu, la programaro uzos sexuo-neutrala vorti tam ofte kam posibla",
+       "gender-male": "Ilu redaktas wikiopagini",
+       "gender-female": "Elu redaktas wikiopagini",
        "email": "Elek-posto",
        "prefs-help-email-required": "E-postala adreso es bezonata.",
        "prefs-info": "Bazala informeso",
        "prefs-signature": "Signaturo",
+       "prefs-editor": "Redaktilo",
+       "prefs-preview": "Previdar",
        "prefs-diffs": "Diferi",
        "userrights-user-editname": "Skribez uzantonomo:",
        "userrights-groupsmember": "Membro di:",
        "group-sysop": "Administranti",
        "group-bureaucrat": "Burokrati",
        "group-all": "(omna)",
-       "group-user-member": "Uzanto",
-       "group-bot-member": "Roboto",
-       "group-sysop-member": "Administranto",
-       "group-bureaucrat-member": "Burokrato",
+       "group-user-member": "{{GENDER:$1|uzero}}",
+       "group-bot-member": "{{GENDER:$1|roboto}}",
+       "group-sysop-member": "{{GENDER:$1|administrero}}",
+       "group-bureaucrat-member": "{{GENDER:$1|burokrato}}",
        "grouppage-user": "{{ns:project}}:Uzanti",
        "grouppage-bot": "{{ns:project}}:Roboti",
        "grouppage-sysop": "{{ns:project}}:Administranti",
        "right-upload": "Adkargar arkivi",
        "right-delete": "Efacar pagini",
        "right-browsearchive": "Serchar pagini efacita",
-       "right-rollback": "Rapide retrorular la redakti da la lasta uzanto qua redaktis specigita pagino",
-       "newuserlogpage": "Uzanto-kreo-registro",
-       "rightslog": "Uzanto-yuri-registraro",
+       "right-rollback": "Rapide retrorular la redakti da la lasta uzero qua redaktis specigita pagino",
+       "newuserlogpage": "Uzero-kreo-registro",
+       "rightslog": "Uzero-yuri-registraro",
        "action-read": "lektar ca pagino",
        "action-edit": "redaktar ca pagino",
-       "action-createpage": "krear pagini",
+       "action-createpage": "kreez ita pagino",
        "action-move": "movar ca pagino",
        "action-movefile": "movar ca arkivo",
        "action-upload": "adkargar ca arkivo",
        "action-browsearchive": "serchar pagini efacita",
        "nchanges": "$1 {{PLURAL:$1|chanjo|chanji}}",
+       "enhancedrc-history": "Versionaro",
        "recentchanges": "Recenta chanji",
        "recentchanges-legend": "Recenta chanji preferaji",
        "recentchanges-summary": "Regardez la maxim recenta chanji en Wiki per ica pagino.",
        "recentchanges-label-newpage": "Ca redaktajo kreis nova pagino",
        "recentchanges-label-minor": "Ica es mikra redaktajo",
        "recentchanges-label-bot": "Ta chanjo facita da bot",
+       "recentchanges-label-unpatrolled": "Ica modifiko ne patroliesas ankore.",
+       "recentchanges-label-plusminus": "La pagino modifikesis segun ica quanto di *bicoki",
        "recentchanges-legend-newpage": "$1 - nova pagino",
+       "rcfilters-filter-userExpLevel-experienced-description": "Plu kam 30 dii di agemeso e 500 redakti.",
        "rcnotefrom": "Infre esas la lasta chanji depos '''$2''' (montrita til '''$1''').",
        "rclistfrom": "Montrar nova chanji startante de $3 $2",
        "rcshowhideminor": "$1 mikra redakti",
+       "rcshowhideminor-show": "Montrar",
+       "rcshowhideminor-hide": "Celar",
        "rcshowhidebots": "$1 roboti",
-       "rcshowhideliu": "$1 enirinta uzanti",
+       "rcshowhidebots-show": "Montrar",
+       "rcshowhidebots-hide": "Celar",
+       "rcshowhideliu": "$1 enrejistrita uzeri",
+       "rcshowhideliu-hide": "Celar",
        "rcshowhideanons": "$1 anonima uzanti",
+       "rcshowhideanons-show": "Montrar",
+       "rcshowhideanons-hide": "Celar",
        "rcshowhidemine": "$1 mea redakti",
+       "rcshowhidemine-show": "Montrar",
+       "rcshowhidemine-hide": "Celar",
        "rclinks": "Montrar la lasta $1 chanji dum la lasta $2 dii<br />$3",
        "diff": "dif",
        "hist": "vers",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "r",
-       "rc_categories_any": "Ula",
+       "rc_categories_any": "Irga selektita",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bicoko|bicoki}} pos la modifiki",
        "newsectionsummary": "/* $1 */ nova seciono",
-       "rc-enhanced-expand": "Montrar detali (JavaScript bezonesas)",
+       "rc-enhanced-expand": "Montrez detali",
        "rc-enhanced-hide": "Celar detali",
        "recentchangeslinked": "Relatanta chanji",
        "recentchangeslinked-feed": "Relatanta chanji",
        "uploadbtn": "Adkargar arkivo",
        "reuploaddesc": "Retrovenar al adkargo-formularo.",
        "uploadnologin": "Vu ne eniris",
-       "uploadnologintext": "Vu mustas [[Special:UserLogin|enirir]] por adkargar arkivi.",
+       "uploadnologintext": "Voluntez $1 por adkargar arkivi.",
        "uploaderror": "Eroro dum adkargo",
        "uploadlogpage": "Adkargo-registraro",
        "uploadlogpagetext": "Infre esas listo di la plu recenta adkargaji.\nVidez rezumo plu vidala en la [[Special:NewFiles|galerio di nova arkivi]].",
        "filesource": "Fonto:",
        "ignorewarning": "Ignorar la averto e gardar la arkivo irgakaze.",
        "badfilename": "La imajo-nomo chanjesis a \"$1\".",
-       "fileexists": "Arkivo kun ica nomo ja existas.\nVolutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.\n[[$1|thumb]]",
+       "fileexists": "Arkivo kun ta nomo ja existas.\nVolutez kontrolar <strong>[[:$1]]</strong> se {{GENDER:|vu}} ne esas certa pri chanjar olu.\n[[$1|thumb]]",
        "uploadwarning": "Averto pri la adkargo di arkivo",
        "savefile": "Registragar arkivo",
        "uploaddisabled": "Pardonez, la adkargo esas desaktiva.",
        "listfiles": "Listo di imaji",
        "listfiles_date": "Dato",
        "listfiles_name": "Nomo",
-       "listfiles_user": "Uzanto",
+       "listfiles_user": "Uzero",
        "listfiles_count": "Versioni",
        "file-anchor-link": "Failo",
        "filehist": "Historio dil arkivo",
        "filehist-datetime": "Dato/Horo",
        "filehist-thumb": "Imajeto",
        "filehist-thumbtext": "Imajeto di versiono ye $1",
-       "filehist-user": "Uzanto",
+       "filehist-user": "Uzero",
        "filehist-dimensions": "Dimensioni",
        "filehist-filesize": "Grandeso dil arkivo",
        "filehist-comment": "Komento",
        "linkstoimage": "La {{PLURAL:$1|pagino|$1 pagini}} infre ligas a ca arkivo:",
        "nolinkstoimage": "Nula pagino ligas a ca pagino.",
        "sharedupload": "Ca arkivo esas de $1 e posible esas uzata da altra projekti.",
+       "sharedupload-desc-here": "Ca arkivo jacas en $1, e povas uzesar en altra projeti.\nLa deskriptado en lua [$2 pagino di deskriptado] montresas infre.",
        "uploadnewversion-linktext": "Adkargez nova versiono dil arkivo",
        "shared-repo-from": "ek $1",
+       "upload-disallowed-here": "Vu ne povas modifikar ica arkivo.",
        "filerevert-comment": "Motivo:",
        "filedelete": "Efacar $1",
        "filedelete-legend": "Efacar arkivo",
        "randompage": "Hazarda pagino",
        "randomredirect": "Hazarda ridirektilo",
        "statistics": "Statistiko",
-       "statistics-header-users": "Statistiki di uzanto",
+       "statistics-header-users": "Statistiki di uzero",
        "statistics-header-hooks": "Altra statistiki",
        "statistics-pages": "Pagini",
        "doubleredirects": "Duopla ridirektili",
        "deadendpages": "Pagini sen ekiraji",
        "protectedpages": "Protektita pagini",
        "protectedtitles": "Protektita tituli",
-       "listusers": "Uzanto-listo",
+       "listusers": "Uzerolisto",
        "usereditcount": "$1 {{PLURAL:$1|redakto|redakti}}",
        "usercreated": "{{GENDER:$3|Kreita}} ye $1 $2",
        "newpages": "Nova pagini",
        "ancientpages": "Maxim anciena artikli",
        "move": "Movar",
        "movethispage": "Rinomizar ica pagino",
-       "unusedimagestext": "Voluntez egardez ke altra ret-situi povus ligar a arkivo per direta URL, e do ol povus esar enlistizita hike malgre olu havas aktiva uzo.",
+       "unusedimagestext": "La sequanta arkivi existas ma ne enterigita en irga pagino.\nVoluntez remarkar ke altra ret-siti povus ligar ad arkivo per direta URL, e do ol povus esar listizita hike malgre ke on aktive uzas lo.",
        "notargettitle": "Ne esas vakua pagino",
        "notargettext": "Vu ne definis en qua pagino agar ica funciono.",
        "pager-newer-n": "{{PLURAL:$1|plu nova 1|plu nova $1}}",
        "pager-older-n": "{{PLURAL:$1|plu anciena 1|plu anciena $1}}",
+       "apihelp-no-such-module": "Modulo « $1 » ne esis trovita.",
+       "apisandbox-loading": "Charjas informo pri modulo « $1 » di API...",
        "booksources": "Fonti di libri",
        "booksources-search-legend": "Serchez librala fonti",
-       "specialloguserlabel": "Uzanto:",
-       "speciallogtitlelabel": "Titulo:",
+       "booksources-search": "Serchar",
+       "specialloguserlabel": "Agero:",
+       "speciallogtitlelabel": "Skopo (titulo od {{ns:user}}:uzernomo por uzero):",
        "log": "Registrari",
        "all-logs-page": "Omna publika registrari",
        "allpages": "Omna pagini",
        "allpagessubmit": "Irez",
        "allpages-bad-ns": "{{SITENAME}} ne havas nomaro \"$1\".",
        "categories": "Kategorii",
-       "deletedcontributions": "Efacita uzanto-kontributadi",
-       "deletedcontributions-title": "Efacita uzanto-kontributadi",
-       "linksearch": "Extera ligili",
+       "deletedcontributions": "Efacita uzero-kontributadi",
+       "deletedcontributions-title": "Efacita uzero-kontributadi",
+       "linksearch": "Sercho di extera ligili",
        "linksearch-ns": "Nomaro:",
        "linksearch-ok": "Serchez",
        "listusers-submit": "Montrez",
-       "activeusers-noresult": "Nula uzanto trovesis.",
+       "activeusers-noresult": "Nula uzero trovesis.",
        "listgrouprights-group": "Grupo",
        "listgrouprights-members": "(listo di membri)",
        "mailnologin": "Ne sendar adreso",
        "mailnologintext": "Vu mustas [[Special:UserLogin|enirir]] e havar valida e-adreso en vua [[Special:Preferences|preferaji]] por sendar e-posto ad altra uzanti.",
-       "emailuser": "Sendar e-posto a ca uzanto",
-       "defemailsubject": "E-posto di {{SITENAME}}",
+       "emailuser": "Sendar e-posto a ca uzero",
+       "defemailsubject": "{{SITENAME}} e-mesaji de uzero \"$1\"",
        "noemailtitle": "Ne esas e-adreso",
        "emailfrom": "De:",
        "emailto": "Ad:",
        "mywatchlist": "Surveyaji",
        "nowatchlist": "Vu ne havas objekti en vua listo di surveyaji.",
        "watchnologin": "Vu ne startis sesiono",
-       "addedwatchtext": "La pagino \"<nowiki>$1</nowiki>\" atachesis a vua [[Special:Watchlist|listo de surveyaji]]. Futura chanji di ica pagino ed olua relatanta debato-pagini montresos ibe, ed la pagino aparos per '''dika literi''' en la [[Special:RecentChanges|listo de recenta chanji]] por faciligar sua trovebleso.\n\n<p> Se vu volas efacar la pagino de vua listo de surveyaji pose, presez \"Ne plus surveyar\" en la selektaro.",
-       "removedwatchtext": "La pagino \"[[:$1]]\" forigesis de [[Special:Watchlist|vua surveyado]].",
+       "addedwatchtext": "\"[[:$1]]\" atachesis a vua [[Special:Watchlist|listo di surveyaji]].",
+       "removedwatchtext": "\"[[:$1]]\" ed relatanta diskutado forigesis de [[Special:Watchlist|vua surveyado]].",
        "watch": "Surveyar",
        "watchthispage": "Surveyar ica pagino",
        "unwatch": "Ne plus surveyar",
        "unwatchthispage": "Ne plus surveyar",
        "notanarticle": "Ne esas artiklo",
-       "wlnote": "Infre esas la lasta {{PLURAL:$1|chanjo|'''$1''' chanji}} dum la lasta {{PLURAL:$2|horo|'''$2''' hori}}.",
-       "wlshowlast": "Montrar la lasta $1 hori $2 dii",
+       "wlnote": "Yen la maxim recenta {{PLURAL:$1|chanjo|<strong>$1</strong> chanji}} dum la lasta {{PLURAL:$2|horo|<strong>$2</strong> hori}}, desde $3,$4.",
+       "wlshowlast": "Montrez la lasta $1 hori $2 dii",
        "watchlist-options": "Surveryo-listo selekti",
        "watching": "Surveyanta…",
        "unwatching": "Cesanta surveyar…",
-       "enotif_impersonal_salutation": "Uzanto di {{SITENAME}}",
-       "enotif_anon_editor": "anonima uzanto $1",
+       "enotif_impersonal_salutation": "Uzero di {{SITENAME}}",
+       "enotif_anon_editor": "anonima uzero $1",
        "deletepage": "Efacar pagino",
        "confirm": "Konfirmar",
        "excontent": "La kontenajo esis: '$1'",
        "exbeforeblank": "La kontenajo ante efaco esis: '$1'",
        "delete-confirm": "Efacar \"$1\"",
        "delete-legend": "Efacar",
-       "historywarning": "Egardez: La pagino, quan vu efaceskas, havas versionaro:",
+       "historywarning": "<strong>Averto:</strong> La pagino quan vu efaceskas havas historio kun $1 {{PLURAL:$1|revizo|revizi}}:",
        "actioncomplete": "Ago kompletigita",
        "deletedtext": "\"$1\" efacesis.\nVidez $2 por obtenar registro di recenta efaci.",
        "dellogpage": "Efaco-registraro",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Altra/suplementala motivo:",
        "deletereasonotherlist": "Altra motivo",
-       "deletereason-dropdown": "*Ordinara motivi por efaco\n** Demandita da autoro\n** Kopiyuro Violaco\n** Korupto",
+       "deletereason-dropdown": "*Ordinara motivi por efacado\n** \"Spam\" nedezirata mesaji\n** Vandalismo\n** Kopiyuro Violaco\n** Demandita da autoro\n** Nefuncionanta ligilo",
        "rollback": "Retrorulez redakti",
        "rollbacklink": "retrorulez",
+       "rollbacklinkcount": "nuligar $1 {{PLURAL:$1|modifiko|modifiki}}",
        "rollbackfailed": "Retrorular ne sucesis",
        "cantrollback": "Ne esas posibla retrorular. La lasta kontributanto esas la nura autoro di ica pagino.",
        "alreadyrolled": "Vu ne povas retrorular la lasta chanjo di [[:$1]] da [[User:$2|$2]] ([[User talk:$2|Diskutez]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nulu pluse ja redaktis o retrorulis ica pagino.\n\nLa lasta chanjo a la pagino esis da [[User:$3|$3]] ([[User talk:$3|Diskutez]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "rollback-success": "Desfacis redakti da $1;\nrestauris ad lasta versiono da $2.",
        "protectlogpage": "Protekto-registraro",
        "protectedarticle": "protektita \"[[$1]]\"",
-       "unprotectedarticle": "desprotektita [[$1]]",
+       "unprotectedarticle": "desprotektita de \"[[$1]]\"",
        "protect-title": "Protektante \"$1\"",
        "prot_1movedto2": "[[$1]] movita a [[$2]]",
        "protect-legend": "Konfirmar protekto",
        "protect_expiry_invalid": "Expirotempo es ne-valida.",
        "protect_expiry_old": "Expirotempo es in pasinta.",
        "protect-default": "Permisar omna uzanti",
-       "protect-fallback": "Bezonar permiso \"$1\"",
-       "protect-level-sysop": "Nur administranti",
+       "protect-fallback": "Permisez nur uzeri kun permiso \"$1\"",
+       "protect-level-sysop": "Permisez nur administreri",
        "protect-summary-cascade": "kaskade",
        "protect-expiring": "expiras ye $1 (UTC)",
        "protect-expiry-indefinite": "nefinita",
        "undelete": "Vidar efacita pagini",
        "undeletepage": "Vidar e restaurar efacita pagini",
        "undeletepagetext": "La sequanta {{PLURAL:$1|pagino|pagini}} efacesis ma {{PLURAL:$1|ol|li}} ankore esas en la arkivo ed esas restaurebla. La arkivo povas netigesar periodale.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revizo|revizi}} konservita",
+       "undeleterevisions": "$1 {{PLURAL:$1|revizo|revizi}} efacita",
        "undeletebtn": "Restaurar",
        "undeletelink": "vidar/restaurar",
        "undeleteviewlink": "videz",
-       "undeletecomment": "Komento:",
+       "undeletecomment": "Motivo:",
        "undelete-search-box": "Serchez efacita pagini",
        "undelete-search-submit": "Serchar",
        "undelete-show-file-submit": "Yes",
        "namespace": "Nomaro:",
        "invert": "Inversigar selektajo",
        "blanknamespace": "(Chefa)",
-       "contributions": "Kontributadi dil {{GENDER:$1|uzanto}}",
-       "contributions-title": "Uzanto-kontributadi di $1",
+       "contributions": "Kontributadi dil {{GENDER:$1|uzero}}",
+       "contributions-title": "Uzero-kontributadi di $1",
        "mycontris": "Kontributadi",
+       "anoncontribs": "Kontributadi",
        "contribsub2": "Pro $1 ($2)",
        "nocontribs": "Ne trovesis chanji qui fitez ita kriterii.",
        "uctop": "(aktuala)",
        "sp-contributions-newbies": "Montrez nur kontributadi di nova konti",
        "sp-contributions-newbies-sub": "Di nova konti",
        "sp-contributions-blocklog": "blokusar-registraro",
-       "sp-contributions-deleted": "efacita uzanto-kontributadi",
+       "sp-contributions-deleted": "efacita {{GENDER:$1|uzero}}-kontributadi",
        "sp-contributions-logs": "registrari",
        "sp-contributions-talk": "diskutez",
        "sp-contributions-search": "Serchar kontributadi",
        "whatlinkshere-hideimages": "$1 ligili di arkivi",
        "whatlinkshere-filters": "Filtrili",
        "blockip": "Blokusado di IP-adresi",
-       "blockip-legend": "Blokusar uzanto",
+       "blockip-legend": "Blokusar uzero",
        "ipaddressorusername": "IP-adreso od uzantonomo:",
        "ipbexpiry": "Expiro:",
        "ipbreason": "Motivo:",
-       "ipbreason-dropdown": "*Ordinara motivi por blokuso\n** Insertar nevera informi\n** Efacar kontenajo de pagini\n** Insertadar ligili ad extera reti\n** Insertar radoto aden pagini\n** Timidiganta ago\n** Trouzar multa konti\n** Neaceptebla uzanto-nomo",
+       "ipbreason-dropdown": "*Ordinara motivi por blokuso\n** Insertar nevera informi\n** Efacar kontenajo de pagini\n** Insertadar ligili ad extera reti\n** Insertar radoto aden pagini\n** Timidiganta ago\n** Trouzar multa konti\n** Neaceptebla uzeronomo",
        "ipbcreateaccount": "Preventez kreo di konti",
-       "ipbsubmit": "Blokusar ica uzanto",
+       "ipbsubmit": "Blokusar ica uzero",
        "ipbother": "Altra tempo:",
        "ipboptions": "2 horo:2 hours,1 dio:1 day,3 dii:3 days,1 semano:1 week,2 semani:2 weeks,1 monato:1 month,3 monati:3 months,6 monati:6 months,1 yaro:1 year,infinita:infinite",
        "badipaddress": "IP-adreso ne esas valida",
        "blockipsuccesssub": "Blokusado sucesis",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] blokusesis.<br />\nVidez [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.",
        "ipb-edit-dropdown": "Redaktar blokuso-motivi",
-       "unblockip": "Desblokusar uzanto",
+       "unblockip": "Desblokusar uzero",
        "unblockiptext": "Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.",
        "ipusubmit": "Desblokusar",
        "ipblocklist": "Blokusita uzanti",
        "move-page": "Movar $1",
        "move-page-legend": "Rinomizar pagino",
        "movepagetext": "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.\nLa antea titulo konvertesos a ridirektilo a la nova titulo.\nLa ligili a la antea titulo dil pagino ne chanjesos.\nVoluntez certigar ke ne esas [[Special:DoubleRedirects|duopla]] o [[Special:BrokenRedirects|ruptota ridirektili]].\nVu responsas ke la ligili duros direktante a la pagino korespondanta.\n\nMemorez ke la pagino '''ne''' rinomizesos se ja existus pagino kun la nova titulo, eceptuante ke la pagino esas vakua o ridirektilo sen versionaro.\nIco signifikas ke vu povos rinomizar pagino a olua originala titulo se eroras skribante la nova titulo, ma ne povos riskribar existanta pagino.\n\n'''EGARDEZ!'''\nIca povas esar drastika chanjo e ne-esperinda por populara pagino;\nvoluntez certigar ke vu komprenas la konsequi qui eventos ante durar adavane.",
-       "movenologintext": "Vu mustas esar registragita uzanto ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
-       "newtitle": "A nova titulo:",
+       "movenologintext": "Vu mustas esar registragita uzero ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
+       "newtitle": "Nova titulo:",
        "move-watch": "Surveyar ca pagino",
        "movepagebtn": "Movar pagino",
        "pagemovedsub": "Rinomizita sucese",
        "thumbnail_error": "Ne sucesas krear imajeto: $1",
        "import": "Importacar pagini",
        "import-comment": "Komento:",
-       "importtext": "Voluntez exportacar l' arkivo de la fonto-wiki uzante la utensilo \"Special:Export\", registragar ol a vua disko ed adkargar ol hike.",
+       "importtext": "Voluntez exportacar l' arkivo de la fonto-wikio per [[Special:Export|exportacilo]]. Registragar ol a vua komputero ed adkargar ol hike.",
        "importfailed": "La importaco faliis: $1",
        "importsuccess": "Importaco sucesoza!",
-       "tooltip-pt-userpage": "Vua uzanto-pagino",
-       "tooltip-pt-mytalk": "Vua diskuto-pagino",
-       "tooltip-pt-preferences": "Mea preferaji",
+       "tooltip-pt-userpage": "{{GENDER:|Vua uzero}} pagino",
+       "tooltip-pt-mytalk": "{{GENDER:|Vua}} diskuto-pagino",
+       "tooltip-pt-preferences": "{{GENDER:|Vua}} preferaji",
        "tooltip-pt-watchlist": "Listo di pagini quin vu kontrolas",
-       "tooltip-pt-mycontris": "Listo di vua kontributaji",
+       "tooltip-pt-mycontris": "Listo di {{GENDER:|vua}} kontributaji",
        "tooltip-pt-login": "Vu darfas enirar uzante vua pas-vorto, ma lo ne esas preskriptata.",
        "tooltip-pt-logout": "Ekirar",
+       "tooltip-pt-createaccount": "Vu stimulesas a krear konto e facar \"log in\". Tamen, to ne esas obliganta",
        "tooltip-ca-talk": "Diskuto pri la pagino di kontenajo",
-       "tooltip-ca-edit": "Vu darfas chanjar ta pagino. Voluntez pre-vidar chanji ante registragar oli.",
+       "tooltip-ca-edit": "Redaktar ita pagino",
        "tooltip-ca-addsection": "Komencar nova seciono",
        "tooltip-ca-viewsource": "Ca pagino esas protektita. Vu povas vidar olua fonto-kodo",
        "tooltip-ca-history": "Pasinta versioni di ca pagino",
        "tooltip-search": "Serchez en {{SITENAME}}",
        "tooltip-search-go": "Irez a pagino havanta ta exakta nomo, se existus",
        "tooltip-search-fulltext": "Serchez ca texto en la pagini",
-       "tooltip-p-logo": "Frontispico",
-       "tooltip-n-mainpage": "Vizitez la Frontispico",
-       "tooltip-n-mainpage-description": "Vizitez la frontispico",
+       "tooltip-p-logo": "Chefpagino",
+       "tooltip-n-mainpage": "Vizitez la Chefpagino",
+       "tooltip-n-mainpage-description": "Vizitez la chefpagino",
        "tooltip-n-portal": "Pri la projeto, quon vu facus, ube trovus utilaji",
        "tooltip-n-currentevents": "Trovez informeco pri aktuala eventi",
        "tooltip-n-recentchanges": "Listo di recenta chanji en la wiki.",
        "tooltip-t-recentchangeslinked": "Recenta chanji di pagini ligita de ca pagino",
        "tooltip-feed-rss": "RSS provizero por ica pagino",
        "tooltip-feed-atom": "Atom provizero por ica pagino",
-       "tooltip-t-contributions": "Videz kontributaji di ta uzanto",
-       "tooltip-t-emailuser": "Sendez mesajo al uzanto",
+       "tooltip-t-contributions": "Videz kontributaji di {{GENDER:$1|ta uzanto}}",
+       "tooltip-t-emailuser": "Sendez mesajo al {{GENDER:$1|uzanto}}",
+       "tooltip-t-info": "Plua informo pri ca pagino",
        "tooltip-t-upload": "Adkargez arkivi",
        "tooltip-t-specialpages": "Montrez listo di omna specala pagini",
        "tooltip-t-print": "Imprimebla versiono di ca pagino",
        "tooltip-t-permalink": "Permananta ligilo vers ita versiono di ta pagino",
        "tooltip-ca-nstab-main": "Vidar la kontenajo di ca pagino",
-       "tooltip-ca-nstab-user": "Videz la pagino dil uzanto",
-       "tooltip-ca-nstab-special": "Ito esas specala pagino, vu ne povas redaktar la pagino ipsa",
+       "tooltip-ca-nstab-user": "Vidar la pagino dil uzero",
+       "tooltip-ca-nstab-special": "Ito esas specala pagino, ed es ne-redaktebla",
        "tooltip-ca-nstab-project": "Vidar la projekto-pagino",
        "tooltip-ca-nstab-image": "Videz la pagino dil arkivo",
        "tooltip-ca-nstab-template": "Vidar la shablono",
        "tooltip-rollback": "\"Retrorular\" desfacas omna chanji ad ca pagino da la lasta kontributanto per un kliko",
        "tooltip-undo": "\"Desfacez\" nuligas ca versiono e apertas la redakto-pagino en prevido-modo.\nVu darfos adjuntar kauso en la rezumo.",
        "tooltip-summary": "Skribez kurta rezumo",
-       "anonymous": "Anonima {{PLURAL:$1|uzanto|uzanti}} di {{SITENAME}}",
-       "siteuser": "Uzanto che {{SITENAME}} $1",
+       "anonymous": "Anonima {{PLURAL:$1|uzero|uzeri}} di {{SITENAME}}",
+       "siteuser": "Uzero che {{SITENAME}} $1",
        "lastmodifiedatby": "Ica pagino modifikesis ye $2, $1 da $3.",
        "othercontribs": "Bazizita en la laboro da $1.",
        "others": "altra",
-       "siteusers": "{{PLURAL:$2|Uzanto|Uzanti}} che {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|uzero}}|uzeri}} $1 di {{SITENAME}}",
        "spamprotectiontitle": "Filtrilo kontre spamo",
+       "simpleantispam-label": "Surveyo kontre \"spam\".\n<strong>NE SKRIBEZ</strong> hike!",
        "pageinfo-toolboxlink": "Informo di ca pagino",
        "previousdiff": "← Plu anciena versiono",
        "nextdiff": "Plu recenta versiono →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pagino|pagini}}",
        "file-nohires": "Ne existas grandeso plu granda.",
-       "show-big-image": "Grandeso kompleta",
+       "svg-long-desc": "arkivo SVG, nominale $1 x $2 \"pixels\", kun $3",
+       "show-big-image": "Arkivo originala",
+       "show-big-image-size": "$1 x $2 pixels",
        "newimages": "Galerio di nova arkivi",
        "imagelisttext": "Infre esas listo di '''$1''' {{PLURAL:$1|arkivo|arkivi}} rangizita $2.",
        "newimages-legend": "Filtrilo",
        "ilsubmit": "Serchar",
        "bydate": "per dato",
        "metadata": "Metadonaji",
+       "metadata-help": "Ca arkivo kontenas plusa informo, probable furnisita per la kamero elektronikala o per la \"scanner\" uzata por krear o kopiar l'imajo.\nSe l'arkivo modifikesos de lua originala stando, kelka detali povos ne reprezentar exakte l'arkivo modifikata.",
+       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Larjeso",
        "exif-imagelength": "Alteso",
+       "exif-orientation": "Orientizo",
+       "exif-xresolution": "Horizontala distingivo",
+       "exif-yresolution": "Vertikala distingivo",
+       "exif-datetime": "Dio e horo di la modifiko dil arkivo",
+       "exif-make": "Fabrikanto di la fotografilo",
+       "exif-model": "Fotografilo uzita",
+       "exif-software": "*Komputeroprogramo uzata",
        "exif-artist": "Autoro",
+       "exif-exifversion": "versiono Exif",
+       "exif-datetimeoriginal": "Dio e horo di produktado di la datumaro",
+       "exif-datetimedigitized": "Dio e horo di la kopio kun \"scanner\"",
        "exif-exposuretime-format": "$1 sek ($2)",
        "exif-gpslatitude": "Latitudo",
        "exif-gpslongitude": "Longitudo",
        "watchlisttools-view": "Vidar relatanta chanji",
        "watchlisttools-edit": "Vidar e redaktar surveyo-listo",
        "watchlisttools-raw": "Redaktar texto di surveyo-listo",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskuto]])",
        "version": "Versiono",
        "version-specialpages": "Specala pagini",
        "version-other": "Altra",
        "version-version": "($1)",
-       "version-license": "Licenco",
+       "version-license": "MediaWiki Licenco",
        "version-software-product": "Produkturo",
        "version-software-version": "Versiono",
        "fileduplicatesearch-submit": "Serchar",
        "specialpages-group-redirects": "Specala pagini di ridirektili",
        "blankpage": "Pagino sen-skribura",
        "tag-filter-submit": "Filtrez",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikedo|Etikedi}}]]: $2)",
        "tags-edit": "redaktar",
        "tags-hitcount": "$1 {{PLURAL:$1|chanjo|chanji}}",
        "htmlform-reset": "Desfacar chanji",
        "htmlform-selectorother-other": "Altra",
+       "htmlform-cloner-create": "Adjuntar plue",
+       "logentry-move-move": "$1 {{GENDER:$2|movis}} la pagino $3 a $4",
+       "logentry-newusers-create": "La konto dil uzero $1 kreesis.",
+       "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
        "rightsnone": "(nula)",
        "revdelete-summary": "redakto-rezumo",
-       "searchsuggest-search": "Serchez",
+       "searchsuggest-search": "Serchez en {{SITENAME}}",
        "searchsuggest-containing": "quan kontenas...",
        "expand_templates_output": "Rezulto",
        "expand_templates_ok": "O.K.",
        "special-characters-group-greek": "Grekiana",
        "special-characters-group-cyrillic": "Kirila",
        "special-characters-group-arabic": "Arabiana",
-       "special-characters-group-persian": "Persiana"
+       "special-characters-group-persian": "Persiana",
+       "sessionprovider-nocookies": "''Bisquiti'' forsan esas desacendita. Certigez ke vu acendar ''bisquiti'' e riprobez."
 }
index a6344cc..fcec7be 100644 (file)
        "searcharticle": "Áfram",
        "history": "Breytingaskrá",
        "history_short": "Breytingaskrá",
+       "history_small": "skrá",
        "updatedmarker": "uppfært frá síðustu heimsókn minni",
        "printableversion": "Prentvæn útgáfa",
        "permalink": "Varanlegur tengill",
        "talk": "Spjall",
        "views": "Sýn",
        "toolbox": "Verkfæri",
+       "tool-link-userrights": "Breyta {{GENDER:$1|notanda}} hópum",
+       "tool-link-userrights-readonly": "Skoða {{GENDER:$1|notanda}} hópa",
+       "tool-link-emailuser": "Senda þessum {{GENDER:$1|notanda}} tölvupóst",
        "userpage": "Skoða notandasíðu",
        "projectpage": "Skoða verkefnissíðu",
        "imagepage": "Skoða skráarsíðu",
        "passwordreset-emaildisabled": "Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.",
        "passwordreset-username": "Notandanafn:",
        "passwordreset-domain": "Lén:",
-       "passwordreset-capture": "Sjá áminninguna sem var send í tölvupósti?",
-       "passwordreset-capture-help": "Ef þú hakar við þennan reit verður tölvupósturinn (með bráðabirgðalykilorðinu) sýndur þér og einnig sendur notandanum.",
        "passwordreset-email": "Netfang:",
        "passwordreset-emailtitle": "Notendaupplýsingar á {{SITENAME}}",
        "passwordreset-emailtext-ip": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um \nendursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notenda er}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt, og vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
        "saveprefs": "Vista",
        "restoreprefs": "Endurstilla allar sjálfgefnar stillingar (í öllum hlutum)",
        "prefs-editing": "Breytingarflipinn",
-       "rows": "Raðir",
-       "columns": "Dálkar",
        "searchresultshead": "Leit",
        "stub-threshold": "Þröskuldur fyrir stílsnið stubbatengla ($1):",
        "stub-threshold-sample-link": "dæmi",
        "recentchangescount": "Fjöldi síðna:",
        "prefs-help-recentchangescount": "Taldar eru með nýlegar breytingar, breytingaskrár og aðgerðaskrár.",
        "savedprefs": "Kjörstillingarnar þínar hafa verið vistaðar.",
-       "savedrights": "Notandaréttindi {{GENDER:$1|$1}} hafa verið vistuð.",
+       "savedrights": "Notanda hópur {{GENDER:$1|$1}} hefur verið vistaður.",
        "timezonelegend": "Tímabelti:",
        "localtime": "Staðartími:",
        "timezoneuseserverdefault": "Nota sjálfgefið tímabelti ($1)",
        "prefs-help-prefershttps": "Þessi stilling tekur gildi í næsta skiptið sem þú skráir þig inn.",
        "prefswarning-warning": "Þú hefur gert breytingar á kjörstillingum þínum sem ekki er búið að vista.\nEf þú ferð af þessari síðu án þess að smella á \"$1\" verða kjörstillingar þínar ekki uppfærðar.",
        "userrights": "Breyta notandaréttindum",
-       "userrights-lookup-user": "Yfirlit notandahópa",
+       "userrights-lookup-user": "Velja notanda",
        "userrights-user-editname": "Skráðu notandanafn:",
-       "editusergroup": "Breyta {{GENDER:$1|notanda}} hópum",
+       "editusergroup": "Hlaða inn notanda hópum",
        "editinguser": "Breyti réttindum {{GENDER:$1|notandans}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Breyta notandahópum",
        "saveusergroups": "Vista {{GENDER:$1|notanda}} hópa",
        "userrights-reason": "Ástæða:",
        "userrights-no-interwiki": "Þú hefur ekki leyfi til að breyta notandaréttindum á öðrum wiki-síðum.",
        "userrights-nodatabase": "Gagnagrunnurinn $1 er ekki til eða ekki staðbundinn.",
-       "userrights-nologin": "Þú verður að [[Special:UserLogin|innskrá]] þig á möppudýraaðgang til að geta útdeilt notandaréttindum.",
-       "userrights-notallowed": "Þú hefur ekki réttindi til að útdeila eða draga til baka notandaréttindi.",
        "userrights-changeable-col": "Hópar sem þú getur breytt",
        "userrights-unchangeable-col": "Hópar sem þú getur ekki breytt",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Árekstur í að breyta notandaréttindum! Skoðaðu þetta aftur og staðfestu breytingar þínar.",
-       "userrights-removed-self": "Þér hefur tekist að fjarlægja þín eigin réttindi. Vegna þess mátt þú ekki lengur skoða þessa síðu.",
        "group": "Hópur:",
        "group-user": "Notendur",
        "group-autoconfirmed": "Sjálfvirkt staðfestir notendur",
        "right-siteadmin": "Læsa og aflæsa gagnagrunninum",
        "right-override-export-depth": "Flytja út síður með greinum þar sem allt að 5 greinar tengja þær saman.",
        "right-sendemail": "Senda tölvupóst til annara notenda",
-       "right-passwordreset": "Skoða tölvupósta um endurstillingu lykilorðs",
        "right-managechangetags": "Búa til og (af)virkja [[Special:Tags|merki]] úr gagnagrunni",
        "right-applychangetags": "Virkja [[Special:Tags|merki]] ásamt öðrum breytingum",
        "grant-group-email": "Senda tölvupóst",
        "action-upload_by_url": "hlaða inn þessari skrá af vefslóð",
        "action-writeapi": "Nota API skrifun",
        "action-delete": "eyða þessari síðu",
-       "action-deleterevision": "eyða þessari breytingu",
-       "action-deletedhistory": "skoða breytingaskrá þessarar síðu",
+       "action-deleterevision": "eyða breytingar",
+       "action-deletedhistory": "skoða breytingaskrá síðu",
        "action-browsearchive": "leita í eyddum síðum",
-       "action-undelete": "endurvekja þessa síðu",
-       "action-suppressrevision": "Skoða og endurvekja þessa falda breytingu",
+       "action-undelete": "endurvekja síður",
+       "action-suppressrevision": "Skoða og endurvekja faldar breytingar",
        "action-suppressionlog": "skoða þessa einka-aðgerðaskrá",
        "action-block": "Banna notandanum að gera breytingar",
        "action-protect": "breyta verndunarstigum fyrir þessa síðu",
        "uploaddisabledtext": "Lokað er fyrir að hlaða inn skrám.",
        "php-uploaddisabledtext": "Innhleðsla skráa er óvirk í PHP.\nAthugaðu file_uploads stillinguna.",
        "uploadscripted": "Þetta skjal inniheldur (X)HTML eða forskriftu sem gæti valdið villum í vöfrum.",
-       "uploadscriptednamespace": "Þessi SVG-skrá inniheldur ógilt nafnrými \"$1\".",
+       "uploadscriptednamespace": "Þessi SVG-skrá inniheldur ógilt nafnrými \"<nowiki>$1</nowiki>\".",
        "uploadvirus": "Skráin inniheldur veiru! Nánari upplýsingar: $1",
        "uploadjava": "Þessi skrá er ZIP skrá sem inniheldur Java .class skráasnið.\nInnhleðsla Java skráa er óheimil, því þær geta farið framhjá öryggiskröfum.",
        "upload-source": "Upprunaleg skrá",
        "emailccsubject": "Afrit af skilaboðinu þínu til $1: $2",
        "emailsent": "Sending tókst",
        "emailsenttext": "Skilaboðin þín hafa verið send.",
-       "emailuserfooter": "Þessi tölvupóstur var {{GENDER:$1|sendur}} af $1 til {{GENDER:$2|$2}} með möguleikanum \"{{int:emailuser}}\" á {{SITENAME}}.",
+       "emailuserfooter": "Þessi tölvupóstur var {{GENDER:$1|sendur}} af $1 til {{GENDER:$2|$2}} með möguleikanum \"{{int:emailuser}}\" á {{SITENAME}}. Netfangið {{GENDER:$2|þitt}} verður sent {{GENDER:$1|upphaflega sendandanum}}, sem uppljóstrar netfangi {{GENDER:$2|þínu}} til hans.",
        "usermessage-summary": "Skil eftir kerfismeldingu.",
        "usermessage-editor": "Skilaboðakerfi",
        "watchlist": "Vaktlistinn",
        "fileduplicatesearch-noresults": "Mistókst að finna skrána \"$1\"",
        "specialpages": "Kerfissíður",
        "specialpages-note-top": "Fyrirsögn",
-       "specialpages-note": "* Venjulegar kerfisíður.\n* <span class=\"mw-specialpagerestricted\">Kerfisíður með takmörkuðum aðgangi.</span>",
+       "specialpages-note": "* Venjulegar kerfissíður.\n* <span class=\"mw-specialpagerestricted\">Kerfissíður með takmörkuðum aðgangi.</span>",
        "specialpages-group-maintenance": "Viðhaldsskýrslur",
        "specialpages-group-other": "Aðrar kerfissíður",
        "specialpages-group-login": "Innskrá / Búa til aðgang",
        "specialpages-group-pages": "Listar yfir síður",
        "specialpages-group-pagetools": "Síðuverkfæri",
        "specialpages-group-wiki": "Gögn og tól",
-       "specialpages-group-redirects": "Tilvísaðar kerfisíður",
+       "specialpages-group-redirects": "Tilvísaðar kerfissíður",
        "specialpages-group-spam": "Amasendingasíur",
        "specialpages-group-developer": "Forritaratól",
        "blankpage": "Tóm síða",
        "tags-deactivate": "gera óvirkt",
        "tags-hitcount": "$1 {{PLURAL:$1|breyting|breytingar}}",
        "tags-manage-no-permission": "Þú hefur ekki leyfi til að stjórna breytingamerkjum.",
-       "tags-manage-blocked": "Þú hefur ekki leyfi til að breyta merkjum á meðan þú ert bannaður.",
+       "tags-manage-blocked": "Þú hefur ekki leyfi til að breyta merkjum á meðan {{GENDER:$1|þú}} ert bannaður.",
        "tags-create-heading": "Búa til nýtt merki",
        "tags-create-explanation": "Sjálfgefið eru ný merki tiltæk notendum og vélmennum.",
        "tags-create-tag-name": "Heiti merkis",
        "feedback-useragent": "Aðgangsforrit:",
        "searchsuggest-search": "Leita á {{SITENAME}}",
        "searchsuggest-containing": "sem innihalda ...",
-       "api-error-badaccess-groups": "Þú hefur ekki leyfi til að hlaða inn skrám.",
        "api-error-badtoken": "Innri villa: Skemmdur tóki.",
-       "api-error-copyuploaddisabled": "Ekki er hægt að hlaða inn með vefslóð á þessum vefþjóni.",
-       "api-error-duplicate": "Það {{PLURAL:$1|er önnur skrá|eru aðrar skrár}} þegar til á vefsvæðinu sem hafa sama innihald.",
-       "api-error-duplicate-archive": "Það {{PLURAL:$1|var önnur skrá|voru aðrar skrár}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.",
-       "api-error-empty-file": "Skráin sem þú valdir er tóm.",
        "api-error-emptypage": "Stofnun nýrra, tómra síðna er óheimil.",
-       "api-error-fetchfileerror": "Innri villa: Mistókst að sækja skrána.",
-       "api-error-fileexists-forbidden": "Skrá með nafninu \"$1\" er þegar til og ekki er hægt að yfirskrifa hana.",
-       "api-error-fileexists-shared-forbidden": "Skrá með nafninu \"$1\" er þegar til á miðlæga gagnaþjóninum og ekki er hægt að yfirskrifa hana.",
-       "api-error-file-too-large": "Skráin sem þú valdir er of stór.",
-       "api-error-filename-tooshort": "Skráarheitið er of stutt",
-       "api-error-filetype-banned": "Þessi gerð skráar er bönnuð.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|er óleyfileg skráargerð|eru óleyfilegar skráargerðir}}. {{PLURAL:$3|Leyfð skráargerð er|Leyfðar skráargerðir eru}} $2.",
-       "api-error-filetype-missing": "Skráin hefur enga skráarendingu.",
-       "api-error-hookaborted": "Hætt var við breytinguna sem þú reyndir að gera með viðbót.",
-       "api-error-http": "Innri villa: Get ekki tengst vefþjón.",
-       "api-error-illegal-filename": "Þetta skráarheiti er ekki leyft.",
-       "api-error-internal-error": "Innri villa: Mistókst að vinna úr innsendingunni þinni.",
-       "api-error-invalid-file-key": "Innri villa: Skrá fannst ekki í bráðabirgðageymslu.",
-       "api-error-missingparam": "Innri villa: Breytur vantar í beiðni.",
-       "api-error-missingresult": "Innri villa: Gat ekki ákvarðað hvort tókst að afrita.",
-       "api-error-mustbeloggedin": "Þú verður að vera skráður inn til að hlaða inn skrám.",
-       "api-error-mustbeposted": "Innri villa: Beiðnin þarfnast HTTP POST.",
-       "api-error-noimageinfo": "Innsending skrárinnar tókst, en vefþjónninn gaf okkur engar upplýsingar um skrána.",
-       "api-error-nomodule": "Innri villa: Engin innsendingareining valin.",
-       "api-error-ok-but-empty": "Innri villa: ekkert svar frá vefþjón.",
-       "api-error-overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
-       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt bráðabirgðaskrá.",
        "api-error-publishfailed": "Innri villa: Vefþjónninn gat ekki gefið út bráðabirgðaskrá.",
-       "api-error-timeout": "Vefþjónninn svaraði ekki á tilætluðum tíma.",
-       "api-error-unclassified": "Óþekkt villa kom upp.",
-       "api-error-unknown-code": "Óþekkt villa: \"$1\"",
-       "api-error-unknown-error": "Innri villa: Eitthvað fór úrskeiðis þegar að skráinni þinni var hlaðið inn.",
+       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt bráðabirgðaskrá.",
        "api-error-unknown-warning": "Óþekkt viðvörun: $1",
        "api-error-unknownerror": "Óþekkt villa: \"$1\".",
-       "api-error-uploaddisabled": "Ekki er leyft að hlaða inn á þessum wiki.",
-       "api-error-verification-error": "Þessi skrá gæti verið skemmd, eða með vitlausa skráarendingu.",
        "duration-seconds": "$1 {{PLURAL:$1|sekúnda|sekúndur}}",
        "duration-minutes": "$1 {{PLURAL:$1|mínúta|mínútur}}",
        "duration-hours": "$1 {{PLURAL:$1|klukkustund|klukkustundir}}",
index f183d6e..c35f02b 100644 (file)
                        "Anto",
                        "Saracrovetto",
                        "Tosky",
-                       "Selven"
+                       "Selven",
+                       "Margherita.mignanelli"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "searcharticle": "Vai",
        "history": "Versioni precedenti",
        "history_short": "Cronologia",
+       "history_small": "cronologia",
        "updatedmarker": "modificata dalla mia ultima visita",
        "printableversion": "Versione stampabile",
        "permalink": "Link permanente",
        "views": "Visite",
        "toolbox": "Strumenti",
        "tool-link-userrights": "Modifica gruppi {{GENDER:$1|utente}}",
+       "tool-link-userrights-readonly": "Visualizza gruppi {{GENDER:$1|utente}}",
        "tool-link-emailuser": "Invia una email a questo {{GENDER:$1|utente}}",
        "userpage": "Visualizza la pagina utente",
        "projectpage": "Visualizza la pagina di servizio",
        "policy-url": "Project:Policy",
        "portal": "Portale comunità",
        "portal-url": "Project:Portale comunità",
-       "privacy": "Informazioni sulla privacy",
+       "privacy": "Informativa sulla privacy",
        "privacypage": "Project:Informazioni sulla privacy",
        "badaccess": "Permessi non sufficienti",
        "badaccess-group0": "Non si dispone dei permessi necessari per eseguire l'azione richiesta.",
        "passwordreset-emaildisabled": "Le funzionalità di posta elettronica sono state disabilitate su questa wiki.",
        "passwordreset-username": "Nome utente:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Visualizzare il contenuto del messaggio e-mail?",
-       "passwordreset-capture-help": "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
        "passwordreset-email": "Indirizzo email:",
        "passwordreset-emailtitle": "Dettagli dell'utente su {{SITENAME}}",
        "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare ad utilizzare la tua vecchia password.",
        "passwordreset-emailelement": "Nome utente: \n$1\n\nPassword temporanea: \n$2",
        "passwordreset-emailsentemail": "Se questo indirizzo di posta elettronica è associato con la tua utenza, allora verrà inviata una email per reimpostare la password.",
        "passwordreset-emailsentusername": "Se c'è un indirizzo di posta elettronica associato con questo nome utente, allora verrà inviata una email per reimpostare la password.",
-       "passwordreset-emailsent-capture2": "L'email di reimpostazione della password {{PLURAL:$1|è stata inviata|sono state inviate}}. {{PLURAL:$1|Il nome|L'elenco di nomi}} utente e password è mostrato qui.",
-       "passwordreset-emailerror-capture2": "Invio di email {{GENDER:$2|all'utente}} non riuscito: $1. {{PLURAL:$3|Il nome|L'elenco di nomi}} utente e password è mostrato qui.",
        "passwordreset-nocaller": "Un chiamante deve essere fornito",
        "passwordreset-nosuchcaller": "Chiamante non esiste: $1",
        "passwordreset-ignored": "La reimpostazione della password non è stata gestita. Forse nessun provider è configurato?",
        "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.",
        "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.",
-       "summary-preview": "Anteprima dell'oggetto:",
-       "subject-preview": "Anteprima oggetto:",
+       "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.",
        "blockedtitle": "Utente bloccato.",
        "blockedtext": "'''Il tuo nome utente o indirizzo IP è stato bloccato.'''\n\nIl blocco è stato imposto da $1. La motivazione del blocco è la seguente: ''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nSe lo si desidera, è possibile contattare $1 o un altro [[{{MediaWiki:Grouppage-sysop}}|amministratore]] per discutere del blocco.\n\nSi noti che la funzione 'Scrivi all'utente' non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]] o se l'utilizzo di tale funzione è stato bloccato.\n\nL'indirizzo IP attuale è $3, il numero ID del blocco è #$5.\nSi prega di specificare tutti i dettagli precedenti in qualsiasi richiesta di chiarimenti.",
        "autoblockedtext": "Questo indirizzo IP è stato bloccato automaticamente perché condiviso con un altro utente, a sua volta bloccato da $1.\nLa motivazione del blocco è la seguente:\n\n:''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nÈ possibile contattare $1 o un altro [[{{MediaWiki:Grouppage-sysop}}|amministratore]] per richiedere eventuali chiarimenti circa il blocco.\n\nSi noti che la funzione 'Scrivi all'utente' non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]] e, comunque, se nell'applicare il blocco, tale funzione è stata disabilitata (per la durata del blocco).\n\nL'indirizzo IP attuale è $3, il numero ID del blocco è #$5\nSi prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
+       "systemblockedtext": "Il tuo nome utente o l'indirizzo IP è stato bloccato automaticamente da MediaWiki.\nLa motivazione del blocco è la seguente:\n\n:''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nL'indirizzo IP attuale è $3.\nSi prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
        "blockednoreason": "nessuna motivazione indicata",
        "whitelistedittext": "Per modificare le pagine è necessario $1.",
        "confirmedittext": "Per essere abilitati alla modifica delle pagine è necessario confermare il proprio indirizzo e-mail. Per impostare e confermare l'indirizzo servirsi delle [[Special:Preferences|preferenze]].",
        "post-expand-template-inclusion-warning": "<strong>Attenzione:</strong> la dimensione dei template inclusi è troppo grande.\nAlcuni template non verranno inclusi.",
        "post-expand-template-inclusion-category": "Pagine per le quali la dimensione dei template inclusi supera il limite consentito",
        "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 argomenti mancanti",
+       "post-expand-template-argument-category": "Pagine contenenti template con parametri omessi",
        "parser-template-loop-warning": "Rilevato loop del template: [[$1]]",
        "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)",
        "search-interwiki-caption": "Progetti fratelli",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
+       "search-interwiki-more-results": "altri risultati",
        "search-relatedarticle": "Risultati correlati",
        "searchrelated": "correlati",
        "searchall": "tutti",
        "search-external": "Ricerca esterna",
        "searchdisabled": "La ricerca interna di {{SITENAME}} non è attiva; nel frattempo si può provare ad usare un motore di ricerca esterno come Google. (Si noti però che i contenuti di {{SITENAME}} presenti in tali motori potrebbero non essere aggiornati.)",
        "search-error": "Si è verificato un errore durante la ricerca: $1",
+       "search-warning": "Si è verificato un avviso durante la ricerca: $1",
        "preferences": "Preferenze",
        "mypreferences": "preferenze",
        "prefs-edits": "Modifiche effettuate:",
        "saveprefs": "Salva",
        "restoreprefs": "Ripristina le impostazioni predefinite (in tutte le sezioni)",
        "prefs-editing": "Casella di modifica",
-       "rows": "Righe:",
-       "columns": "Colonne:",
        "searchresultshead": "Ricerca",
        "stub-threshold": "Soglia per i collegamenti agli abbozzi ($1):",
        "stub-threshold-sample-link": "esempio",
        "prefs-help-recentchangescount": "Comprende ultime modifiche, cronologie e registri.",
        "prefs-help-watchlist-token2": "Questa è la chiave segreta per il feed web dei tuoi osservati speciali.\nChiunque la conosce sarà in grado di leggere i tuoi osservati speciali, per cui non condividerla. [[Special:ResetTokens|Clicca qui se hai bisogno di reimpostarla]].",
        "savedprefs": "Le preferenze sono state salvate.",
-       "savedrights": "I diritti utente di {{GENDER:$1|$1}} sono stati salvati.",
+       "savedrights": "I gruppi utente di {{GENDER:$1|$1}} sono stati salvati.",
        "timezonelegend": "Fuso orario:",
        "localtime": "Ora locale:",
        "timezoneuseserverdefault": "Usa ora predefinita del wiki ($1)",
        "youremail": "Indirizzo email:",
        "username": "{{GENDER:$1|Nome utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|del gruppo|dei gruppi}}:",
+       "group-membership-link-with-expiry": "$1 (fino a $2)",
        "prefs-registration": "Data di registrazione:",
        "yourrealname": "Nome vero:",
        "yourlanguage": "Lingua dell'interfaccia:",
        "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-lookup-user": "Gestione dei gruppi utente",
+       "userrights-lookup-user": "Seleziona un utente",
        "userrights-user-editname": "Inserire il nome utente:",
-       "editusergroup": "Modifica gruppi {{GENDER:$1|utente}}",
+       "editusergroup": "Modifica gruppi utente",
        "editinguser": "Modifica in corso dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modifica gruppi utente",
+       "viewinguserrights": "Visualizzazione dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Modifica gruppi {{GENDER:$1|utente}}",
+       "userrights-viewusergroup": "Visualizza gruppi {{GENDER:$1|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).",
+       "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-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-nologin": "Per assegnare diritti agli utenti è necessario [[Special:UserLogin|effettuare l'accesso]] come amministratore.",
-       "userrights-notallowed": "Non disponi dell'autorizzazione per aggiungere o rimuovere i permessi utente.",
        "userrights-changeable-col": "Gruppi modificabili",
        "userrights-unchangeable-col": "Gruppi non modificabili",
+       "userrights-expiry-current": "Scade il $1",
+       "userrights-expiry-none": "Non ha scadenza",
+       "userrights-expiry": "Scadenza:",
+       "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-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
-       "userrights-removed-self": "Hai rimosso i tuoi diritti. E quindi, non sarai più in grado di accedere a questa pagina.",
        "group": "Gruppo:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti autoconvalidati",
        "right-siteadmin": "Blocca e sblocca il database",
        "right-override-export-depth": "Esporta le pagine includendo le pagine collegate fino ad una profondità di 5",
        "right-sendemail": "Invia email ad altri utenti",
-       "right-passwordreset": "Vede i messaggi di reimpostazione della password",
        "right-managechangetags": "Crea e attiva/disattiva le [[Special:Tags|etichette]]",
        "right-applychangetags": "Applica delle [[Special:Tags|etichette]] alle proprie modifiche",
        "right-changetags": "Aggiunge e rimuove specifiche [[Special:Tags|etichette]] su singole versioni o voci di registro",
        "action-upload_by_url": "caricare questo file da un indirizzo URL",
        "action-writeapi": "usare le API in scrittura",
        "action-delete": "cancellare questa pagina",
-       "action-deleterevision": "cancellare questa versione",
-       "action-deletedhistory": "visualizzare la cronologia cancellata di questa pagina",
+       "action-deleterevision": "cancellare versioni",
+       "action-deletelogentry": "cancellare le voci di registro",
+       "action-deletedhistory": "visualizzare la cronologia cancellata di una pagina",
+       "action-deletedtext": "visualizzare il testo delle versioni cancellate",
        "action-browsearchive": "cercare pagine cancellate",
-       "action-undelete": "recuperare questa pagina",
-       "action-suppressrevision": "rivedere e ripristinare le modifiche nascoste",
+       "action-undelete": "recuperare pagine",
+       "action-suppressrevision": "rivedere e ripristinare le versioni nascoste",
        "action-suppressionlog": "vedere questo registro privato",
        "action-block": "bloccare questo utente in scrittura",
        "action-protect": "modificare i livelli di protezione per questa pagina",
        "action-userrights": "modificare tutti i diritti degli utenti",
        "action-userrights-interwiki": "modificare i diritti degli utenti su altre wiki",
        "action-siteadmin": "bloccare e sbloccare il database",
-       "action-sendemail": "inviare e-mail",
+       "action-sendemail": "inviare email",
+       "action-editmyoptions": "modificare le proprie preferenze",
        "action-editmywatchlist": "modificare i propri osservati speciali",
        "action-viewmywatchlist": "vedere i propri osservati speciali",
        "action-viewmyprivateinfo": "vedere i propri dati personali",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi le [[Special:NewPages|nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostra",
+       "rcfilters-activefilters": "Filtri attivi",
+       "rcfilters-restore-default-filters": "Ripristina i filtri predefiniti",
+       "rcfilters-clear-all-filters": "Pulisci tutti i filtri",
+       "rcfilters-search-placeholder": "Filtra le ultime modifiche (naviga o inizia a digitare)",
+       "rcfilters-invalid-filter": "Filtro non valido",
+       "rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-noresults": "Nessun filtro trovato",
+       "rcfilters-filtergroup-registration": "Registrazione utente",
+       "rcfilters-filter-registered-label": "Registrato",
+       "rcfilters-filtergroup-authorship": "Modifica paternità",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filtergroup-significance": "Significato",
+       "rcfilters-filter-minor-label": "Modifiche minori",
+       "rcfilters-filter-major-label": "Modifiche non minori",
+       "rcfilters-filtergroup-changetype": "Tipo di modifica",
+       "rcfilters-filter-pageedits-label": "Modifiche alle pagine",
+       "rcfilters-filter-newpages-label": "Creazioni pagine",
+       "rcfilters-filter-logactions-description": "Azioni amministrative, creazione utenze, cancellazioni pagine, caricamenti....",
        "rcnotefrom": "Di seguito {{PLURAL:$5|è elencata la modifica apportata|sono elencate le modifiche apportate}} a partire da <strong>$3, $4</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfrom": "Mostra le modifiche apportate a partire da $3 $2",
        "rcshowhideminor": "$1 le modifiche minori",
        "uploaded-setting-handler-svg": "SVG che imposta l'attributo \"handler\" con remote/data/script è bloccato. Trovato <code>$1=\"$2\"</code> nel file SVG caricato.",
        "uploaded-remote-url-svg": "SVG che imposta qualsiasi attributo di stile con URL remoti è bloccato. Trovato <code>$1=\"$2\"</code> nel file SVG caricato.",
        "uploaded-image-filter-svg": "Trovato filtro immagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel file in formato SVG caricato.",
-       "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
+       "uploadscriptednamespace": "Questo file SVG contiene un namespace '<nowiki>$1</nowiki>' non consentito",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "uploadvirus": "Questo file contiene un virus! Dettagli: $1",
        "uploadjava": "Questo file è un file ZIP che contiene un file .class Java.\nCaricare i file Java non è consentito, perché possono causare l'aggiramento delle restrizioni di sicurezza.",
        "apisandbox-sending-request": "Invio richiesta di API...",
        "apisandbox-loading-results": "Ricezione dei risultati di API in corso...",
        "apisandbox-results-error": "Si è verificato un errore durante il caricamento della risposta all'interrogazione API: $1",
+       "apisandbox-request-selectformat-label": "Mostra i dati richiesti come:",
        "apisandbox-request-url-label": "URL di richiesta:",
        "apisandbox-request-time": "Tempo richiesto: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Correggi token e reinvia",
        "apisandbox-continue": "Continua",
        "apisandbox-continue-clear": "Pulisci",
        "apisandbox-param-limit": "Inserisci <kbd>max</kbd> per utilizzare il limite massimo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tutti i namespace)",
+       "apisandbox-multivalue-all-values": "$1 (Tutti i valori)",
        "booksources": "Fonti librarie",
        "booksources-search-legend": "Ricerca di fonti librarie",
        "booksources-isbn": "Codice ISBN:",
        "activeusers-count": "$1 {{PLURAL:$1|azione|azioni}} {{PLURAL:$3|nell'ultimo giorno|negli ultimi $3 giorni}}",
        "activeusers-from": "Mostra gli utenti a partire da:",
        "activeusers-groups": "Visualizza gli utenti appartenenti ai gruppi:",
+       "activeusers-excludegroups": "Escludi gli utenti appartenenti ai gruppi:",
        "activeusers-noresult": "Nessun utente risponde ai criteri impostati.",
        "activeusers-submit": "Mostra utenti attivi",
        "listgrouprights": "Diritti del gruppo utente",
        "emailccsubject": "Copia del messaggio inviato a $1: $2",
        "emailsent": "Messaggio inviato",
        "emailsenttext": "Il messaggio e-mail è stato inviato.",
-       "emailuserfooter": "Questa email è stata {{GENDER:$1|inviata}} da $1 a {{GENDER:$2|$2}} attraverso la funzione \"{{int:emailuser}}\" su {{SITENAME}}.",
+       "emailuserfooter": "Questa email è stata inviata da $1 a $2 attraverso la funzione \"{{int:emailuser}}\" su {{SITENAME}}. Se {{GENDER:$2|risponderai}}, la tua email di risposta sarà inviata direttamente {{GENDER:$1|al|alla}} mittente originale, rivelando{{GENDER:$1|gli|le}} il {{GENDER:$2|tuo}} indirizzo di posta elettronica.",
        "usermessage-summary": "Messaggio di sistema",
        "usermessage-editor": "Messaggero di sistema",
        "usermessage-template": "MediaWiki:MessaggioUtente",
        "changecontentmodel-emptymodels-title": "Nessun modello di contenuto disponibile",
        "changecontentmodel-emptymodels-text": "Il contenuto di [[:$1]] non può essere convertito in alcun tipo.",
        "log-name-contentmodel": "Modifiche del modello contenuti",
-       "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
+       "log-description-contentmodel": "Questa pagina elenca le modifiche al modello di contenuto delle pagine, e le pagine che sono state create con un modello di contenuto diverso da quello predefinito.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|ha creato}} la pagina $3 utilizzando un modello di contenuto non predefinito \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha modificato}} il modello di contenuto della pagina $3 da \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "ripristina",
        "cant-move-to-user-page": "Non si dispone dei permessi necessari per spostare la pagina su una pagina utente (escluse le sottopagine utente).",
        "cant-move-category-page": "Non si dispone dei permessi necessari per spostare categorie.",
        "cant-move-to-category-page": "Non si dispone dei permessi necessari per spostare la pagina su una categoria.",
+       "cant-move-subpages": "Non si dispone dei permessi necessari per spostare le sottopagine.",
+       "namespace-nosubpages": "Il namespace \"$1\" non consente sottopagine.",
        "newtitle": "Nuovo titolo:",
        "move-watch": "Aggiungi la pagina agli osservati speciali",
        "movepagebtn": "Sposta la pagina",
        "pageinfo-length": "Lunghezza della pagina (in byte)",
        "pageinfo-article-id": "ID della pagina",
        "pageinfo-language": "Lingua del contenuto della pagina",
+       "pageinfo-language-change": "cambia",
        "pageinfo-content-model": "Modello del contenuto della pagina",
        "pageinfo-content-model-change": "cambia",
        "pageinfo-robot-policy": "Indicizzazione per i robot",
        "tags-deactivate": "disattiva",
        "tags-hitcount": "$1 {{PLURAL:$1|modifica|modifiche}}",
        "tags-manage-no-permission": "Non si dispone dei permessi necessari per gestire le etichette di modifica.",
-       "tags-manage-blocked": "Non puoi gestire le etichette alle modifiche mentre {{GENDER:$1|sei}} bloccato.",
+       "tags-manage-blocked": "Non puoi gestire le etichette alle modifiche mentre sei {{GENDER:$1|bloccato|bloccata}}.",
        "tags-create-heading": "Crea un nuovo tag",
        "tags-create-explanation": "Per impostazione predefinita, i tag appena creati saranno disponibili per l'utilizzo di utenti e bot.",
        "tags-create-tag-name": "Nome del tag:",
        "tags-deactivate-not-allowed": "Non è possibile disattivare il tag \"$1\".",
        "tags-deactivate-submit": "Disattiva",
        "tags-apply-no-permission": "Non disponi dell'autorizzazione per applicare la modifica di tag insieme con le tue modifiche.",
-       "tags-apply-blocked": "Non puoi applicare le etichette alle modifiche mentre {{GENDER:$1|sei}} bloccato.",
+       "tags-apply-blocked": "Non puoi applicare le etichette alle modifiche mentre sei {{GENDER:$1|bloccato|bloccata}}.",
        "tags-apply-not-allowed-one": "L'etichetta \"$1\" non può essere applicata manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La seguente etichetta non può essere applicata|Le seguenti etichette non possono essere applicate}}  manualmente: $1",
        "tags-update-no-permission": "Non si dispone dei permessi necessari per aggiungere o rimuovere le etichette di modifica dalle singole versioni o voci di registro.",
-       "tags-update-blocked": "Non puoi aggiungere o rimuovere le etichette alle modifiche mentre {{GENDER:$1|sei}} bloccato.",
+       "tags-update-blocked": "Non puoi aggiungere o rimuovere le etichette alle modifiche mentre sei {{GENDER:$1|bloccato|bloccata}}.",
        "tags-update-add-not-allowed-one": "Il tag \"$1\" non può essere aggiunto manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Il seguente tag non può essere aggiunto|I seguenti tag non possono essere aggiunti}} manualmente: $1",
        "tags-update-remove-not-allowed-one": "Il tag \"$1\" non può essere rimosso.",
        "feedback-useragent": "Agente utente:",
        "searchsuggest-search": "Cerca all'interno di {{SITENAME}}",
        "searchsuggest-containing": "contenente...",
-       "api-error-autoblocked": "Il tuo indirizzo IP è stato bloccato automaticamente, perché è stato utilizzato da un utente bloccato.",
-       "api-error-badaccess-groups": "Non sei autorizzato a caricare documenti su questa wiki.",
        "api-error-badtoken": "Errore interno: token errato.",
-       "api-error-blocked": "Sei stato bloccato, non puoi fare modifiche.",
-       "api-error-copyuploaddisabled": "Il caricamento tramite URL è disabilitato su questo server.",
-       "api-error-duplicate": "Sul sito {{PLURAL:$1|c'è già un altro documento|ci sono già altri documenti}} con lo stesso contenuto.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|C'era un altro file|C'erano altri file}} già nel sito con lo stesso contenuto, ma {{PLURAL:$1|è stato cancellato|sono stati cancellati}}.",
-       "api-error-empty-file": "Il file selezionato era vuoto.",
        "api-error-emptypage": "La creazione di nuove pagine vuote non è consentita.",
-       "api-error-fetchfileerror": "Errore interno: si è verificato un problema durante il recupero del file.",
-       "api-error-fileexists-forbidden": "Un file di nome \"$1\" già esiste e non può essere sovrascritto.",
-       "api-error-fileexists-shared-forbidden": "Un file di nome \"$1\" già esiste nel repository condiviso e non può essere sovrascritto.",
-       "api-error-file-too-large": "Il file selezionato era troppo grande.",
-       "api-error-filename-tooshort": "Il nome del file è troppo breve.",
-       "api-error-filetype-banned": "Questo tipo di file non è accettato.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|non è un tipo di file consentito|non sono tipi di file consentiti}}. {{PLURAL:$3|Il tipo di file consentito è|I tipi di file consentiti sono}} $2.",
-       "api-error-filetype-missing": "Al file manca l'estensione.",
-       "api-error-hookaborted": "La modifica hai tentato di fare è stata interrotta da un passaggio dell'estensione.",
-       "api-error-http": "Errore interno: impossibile connettersi al server.",
-       "api-error-illegal-filename": "Il nome del file non è ammesso.",
-       "api-error-internal-error": "Errore interno: qualcosa è andato storto con l'elaborazione del tuo caricamento sulla wiki.",
-       "api-error-invalid-file-key": "Errore interno: file non presente nella cartella dei file temporanei.",
-       "api-error-missingparam": "Errore interno: parametri della richiesta mancanti.",
-       "api-error-missingresult": "Errore interno: impossibile determinare se la copia è riuscita.",
-       "api-error-mustbeloggedin": "Devi aver effettuato l'accesso per caricare i file.",
-       "api-error-mustbeposted": "Errore interno: la richiesta richiede HTTP POST.",
-       "api-error-noimageinfo": "Il caricamento è riuscito, ma il server non ci ha dato alcuna informazione sul file.",
-       "api-error-nomodule": "Errore interno: non è stato impostato il modulo di caricamento.",
-       "api-error-ok-but-empty": "Errore interno: nessuna risposta dal server.",
-       "api-error-overwrite": "Sovrascrivere un file esistente non è consentito.",
-       "api-error-ratelimited": "Stai cercando di caricare più file in meno tempo di quanto questo wiki permette.\nRiprova tra pochi minuti.",
-       "api-error-stashfailed": "Errore interno: il server non è riuscito a memorizzare il documento temporaneo.",
        "api-error-publishfailed": "Errore interno: il server non è riuscito a pubblicare il documento temporaneo.",
-       "api-error-stasherror": "Si è verificato un errore durante il caricamento del file in stash.",
-       "api-error-stashedfilenotfound": "Il file in stash non è stato trovato durante il tentativo di caricamento dallo stash.",
-       "api-error-stashpathinvalid": "Il percorso in cui il file in stash dovrebbe trovarsi non è valido.",
-       "api-error-stashfilestorage": "Si è verificato un errore durante la memorizzazione del file in stash.",
-       "api-error-stashzerolength": "Il server non può inserire il file in stash, poiché ha lunghezza zero.",
-       "api-error-stashnotloggedin": "Devi aver effettuato l'accesso per poter salvare il file nel caricamento in stash.",
-       "api-error-stashwrongowner": "Il file a cui stai tentando di accedere nello stash non appartiene a te.",
-       "api-error-stashnosuchfilekey": "La chiave del file a cui stai tentando di accedere nello stash non esiste.",
-       "api-error-timeout": "Il server non ha risposto entro il tempo previsto.",
-       "api-error-unclassified": "Si è verificato un errore sconosciuto.",
-       "api-error-unknown-code": "Errore sconosciuto: \"$1\"",
-       "api-error-unknown-error": "Errore interno: qualcosa è andato storto provando a caricare il file.",
-       "api-error-unknown-warning": "Avviso sconosciuto: $1",
+       "api-error-stashfailed": "Errore interno: il server non è riuscito a memorizzare il documento temporaneo.",
+       "api-error-unknown-warning": "Avvertimento sconosciuto: \"$1\".",
        "api-error-unknownerror": "Errore sconosciuto: \"$1\".",
-       "api-error-uploaddisabled": "Il caricamento è disabilitato su questa wiki.",
-       "api-error-verification-error": "Questo file potrebbe essere danneggiato, o avere l'estensione sbagliata.",
-       "api-error-was-deleted": "Un file con lo stesso nome è stato precedentemente caricato e successivamente eliminato.",
        "duration-seconds": "$1 {{PLURAL:$1|secondo|secondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
        "pagelang-language": "Lingua",
        "pagelang-use-default": "Utilizza la lingua predefinita",
        "pagelang-select-lang": "Seleziona lingua",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Invia",
+       "pagelang-nonexistent-page": "La pagina $1 non esiste.",
        "right-pagelang": "Modifica la lingua della pagina",
        "action-pagelang": "modificare la lingua della pagina",
        "log-name-pagelang": "Modifiche lingua",
        "mw-widgets-dateinput-no-date": "Nessuna data selezionata",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Ricerca file multimediali",
+       "mw-widgets-mediasearch-noresults": "Nessun risultato trovato.",
        "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...",
        "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-block-reblock": "Modifica blocco",
        "log-action-filter-block-unblock": "Sblocco",
        "log-action-filter-contentmodel-change": "Modifica del modello di contenuto",
-       "log-action-filter-contentmodel-new": "Creazione di pagina con modello di contenuto non standard",
+       "log-action-filter-contentmodel-new": "Creazione di pagina con modello di contenuto non predefinito",
        "log-action-filter-delete-delete": "Cancellazione pagina",
        "log-action-filter-delete-restore": "Ripristino pagina",
        "log-action-filter-delete-event": "Cancellazione registro",
        "usercssispublic": "Ricorda: le sottopagine CSS non devono contenere dati riservati poichè sono visualizzabili da altri utenti.",
        "restrictionsfield-badip": "Indirizzo IP o intervallo non valido: $1",
        "restrictionsfield-label": "Intervalli IP consentiti:",
-       "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Errore: $1",
-       "edit-error-long": "Errori:\n\n$1"
+       "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "versione $1",
+       "pageid": "ID della pagina $1"
 }
index ed36dc5..2c4c3ba 100644 (file)
                        "Matma Rex",
                        "組曲師",
                        "Foresttttttt",
-                       "ネイ"
+                       "ネイ",
+                       "Mirinano",
+                       "Suchichi02",
+                       "にょきにょき",
+                       "おはぐろ蜻蛉",
+                       "Aefgh39622"
                ]
        },
        "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": "プロジェクトのページを表示",
        "throttled-mailpassword": "パスワード再設定メールを過去 {{PLURAL:$1|$1 時間}}に送信済みです。\n悪用防止のため、パスワードの再設定は {{PLURAL:$1|$1 時間}}に 1 回のみです。",
        "mailerror": "メールを送信する際にエラーが発生しました: $1",
        "acct_creation_throttle_hit": "あなたと同じ IP アドレスでこのウィキに訪れた人が、直近 $2 で {{PLURAL:$1|$1 個のアカウント}}を作成しており、この期間で作成が許可されている最大数です。\nそのため、現在この IP アドレスからこれ以上のアカウントを作成できません。",
-       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
+       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
        "emailnotauthenticated": "メールアドレスが確認されていません。\n確認されるまで、以下のいかなる機能でもメールは送信されません。",
        "noemailprefs": "これらの機能を有効にするには、個人設定でメールアドレスを登録してください。",
        "emailconfirmlink": "あなたのメールアドレスを確認",
        "passwordreset-emaildisabled": "メール機能は、このウィキでは無効化されています。",
        "passwordreset-username": "利用者名:",
        "passwordreset-domain": "ドメイン:",
-       "passwordreset-capture": "お送りするメールの内容を表示しますか?",
-       "passwordreset-capture-help": "このボックスにチェックを入れると、利用者に送信されるメールの内容 (仮パスワードを含む) をあなたも閲覧できます。",
        "passwordreset-email": "メールアドレス:",
        "passwordreset-emailtitle": "{{SITENAME}}上のアカウントの詳細",
        "passwordreset-emailtext-ip": "誰か (おそらくあなた、IP アドレス $1) が {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は {{PLURAL:$5|$5 日|$5 日間}}で有効期限が切れます。\nあなたはすぐにログインして新しいパスワードを設定する必要があります。\nこれが他の誰かによる申請である場合、あるいはあなたが自分の元のパスワードを\n覚えていてそれを変更したくない場合には、このメッセージを無視して以前のパスワードを\n使用し続けることができます。",
        "passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2",
        "passwordreset-emailsentemail": "このメールアドレスがあなたのアカウントに関連付けられている場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
-       "passwordreset-emailsent-capture2": "パスワードリセットの{{PLURAL:$1|メール}}が送信されました。{{PLURAL:$1|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|利用者}}へのメール送信に失敗しました: $1{{PLURAL:$3|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
        "passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
        "passwordreset-invalidemail": "無効なメールアドレスです",
+       "passwordreset-nodata": "利用者名もメールアドレスも入力されていません",
        "changeemail": "メールアドレスの変更または除去",
        "changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "contentmodelediterror": "コンテンツモデルが <code>$1</code> であるため、この版を編集することができません。ページの現在のコンテンツモデルは <code>$2</code> です。",
        "recreate-moveddeleted-warn": "<strong>警告: 以前削除されたページを再作成しようとしています。</strong>\n\nこのページの編集を続行するのが適切かどうかご確認ください。\n参考までに、このページの削除と移動の記録を以下に示します:",
        "moveddeleted-notice": "このページは削除されています。\n参考のため、このページの削除と移動の記録を以下に表示します。",
-       "moveddeleted-notice-recent": "ごめんなさい、このページは最近に削除されました (過去24時間以内)。このページについての削除と移動の記録が、参考のため、以下にて提供されています。",
+       "moveddeleted-notice-recent": "申し訳ありません。このページは最近(24時間以内)に削除されました。参考のため、このページの削除と移動の記録を以下に表示します。",
        "log-fulllog": "完全な記録を閲覧",
        "edit-hook-aborted": "フックによって編集が破棄されました。\n理由は不明です。",
        "edit-gone-missing": "ページを更新できませんでした。\n既に削除されているようです。",
        "invalid-content-data": "本文データが無効です",
        "content-not-allowed-here": "ページ [[$2]] では、「$1」コンテンツは許可されていません",
        "editwarning-warning": "このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。\nログインしている場合、個人設定の「{{int:prefs-editing}}」タブでこの警告を表示しないようにすることができます。",
+       "editpage-invalidcontentmodel-title": "対応していないコンテンツ形式",
        "editpage-notsupportedcontentformat-title": "対応していないコンテンツ形式",
        "editpage-notsupportedcontentformat-text": "コンテンツ モデル $2 は、コンテンツ形式 $1 に対応していません。",
        "content-model-wikitext": "ウィキテキスト",
        "saveprefs": "保存",
        "restoreprefs": "すべて初期設定に戻す (すべての節について)",
        "prefs-editing": "編集",
-       "rows": "行数:",
-       "columns": "列数:",
        "searchresultshead": "検索",
        "stub-threshold": "スタブリンク形式 ($1)として表示する閾値 :",
        "stub-threshold-sample-link": "サンプル",
        "prefs-help-recentchangescount": "この設定は最近の更新、ページの履歴、および記録に適用されます。",
        "prefs-help-watchlist-token2": "これはあなたのウォッチリスト フィードの秘密のコードです。\nこのトークンを知っている人は誰でもあなたのウォッチリストを読めてしまうため、他の人に教えないでください。\n[[Special:ResetTokens|トークンを再設定する必要がある場合はここをクリックしてください]]。",
        "savedprefs": "個人設定を保存しました。",
-       "savedrights": "{{GENDER:$1|$1}}の利用者権限が保存されました。",
+       "savedrights": "{{GENDER:$1|$1}}の利用者グループが保存されました。",
        "timezonelegend": "タイムゾーン:",
        "localtime": "地域の時刻:",
        "timezoneuseserverdefault": "ウィキの既定を使用 ($1)",
        "prefswarning-warning": "個人設定にまだ保存されていない変更があります。\n「$1」をクリックせずに離れた場合、個人設定は更新されません。",
        "prefs-tabs-navigation-hint": "ヒント: ← キーと → キーで、タブ一覧内のタブ間を移動できます。",
        "userrights": "利用者権限を管理",
-       "userrights-lookup-user": "å\88©ç\94¨è\80\85ã\82°ã\83«ã\83¼ã\83\97ã\82\92管ç\90\86",
+       "userrights-lookup-user": "å\88©ç\94¨è\80\85ã\82\92é\81¸æ\8a\9e",
        "userrights-user-editname": "利用者名を入力:",
-       "editusergroup": "{{GENDER:$1|利用者}}グループを編集",
+       "editusergroup": "利用者グループの表示",
        "editinguser": "利用者<strong> [[User:$1|$1]]</strong> $2 の権限を変更",
+       "viewinguserrights": "{{GENDER:$1|利用者}} <strong>[[User:$1|$1]]</strong> $2 の利用者権限",
        "userrights-editusergroup": "利用者グループを編集",
+       "userrights-viewusergroup": "利用者グループ",
        "saveusergroups": "{{GENDER:$1|利用者}}グループを保存",
        "userrights-groupsmember": "所属グループ:",
        "userrights-groupsmember-auto": "自動的に付与される権限:",
        "userrights-reason": "理由:",
        "userrights-no-interwiki": "他ウィキ上における利用者権限の編集権限は、ありません。",
        "userrights-nodatabase": "データベース$1は存在しないか、ローカル上にありません。",
-       "userrights-nologin": "利用者権限を付与するには、管理者アカウントで[[Special:UserLogin|ログイン]]する必要があります。",
-       "userrights-notallowed": "あなたには利用者権限を追加/除去する権限がありません。",
        "userrights-changeable-col": "変更できるグループ",
        "userrights-unchangeable-col": "変更できないグループ",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "期限 $1",
+       "userrights-expiry-none": "有効期限切れではありません",
+       "userrights-expiry": "有効期限:",
+       "userrights-expiry-othertime": "その他の期間:",
        "userrights-conflict": "利用者権限の変更が競合しています! 変更内容を確認してください。",
-       "userrights-removed-self": "あなた自身の権限を除去しました。そのため、このページにはもうアクセスできません。",
        "group": "グループ:",
        "group-user": "登録利用者",
        "group-autoconfirmed": "自動承認された利用者",
        "right-reupload-own": "自身がアップロードした既存のファイルに上書き",
        "right-reupload-shared": "共有メディアリポジトリ上のファイルにローカルで上書き",
        "right-upload_by_url": "URL からファイルをアップロード",
-       "right-purge": "確認なしでサイトキャッシュを破棄",
+       "right-purge": "確認なしでサイト上のページ・キャッシュを破棄",
        "right-autoconfirmed": "IPベースの速度制限を受けない",
        "right-bot": "自動処理と認識させる",
        "right-nominornewtalk": "議論ページの細部の編集をした際に、新着メッセージとして通知しない",
        "right-siteadmin": "データベースをロックおよびロック解除",
        "right-override-export-depth": "リンク先ページを5階層まで含めて書き出す",
        "right-sendemail": "他の利用者にメールを送信",
-       "right-passwordreset": "パスワード再設定メールを閲覧",
        "right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
        "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
        "action-upload_by_url": "URL からのこのファイルのアップロード",
        "action-writeapi": "書き込みAPIの使用",
        "action-delete": "このページの削除",
-       "action-deleterevision": "この版の削除",
-       "action-deletedhistory": "このページの削除履歴の閲覧",
+       "action-deleterevision": "版の削除",
+       "action-deletelogentry": "記録項目の削除",
+       "action-deletedhistory": "ページの削除履歴の閲覧",
        "action-browsearchive": "削除されたページの検索",
-       "action-undelete": "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¾©å\85\83",
+       "action-undelete": "ページの復元",
        "action-suppressrevision": "隠された版の確認と復元",
        "action-suppressionlog": "非公開記録の閲覧",
        "action-block": "この利用者の編集ブロック",
        "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-clear-all-filters": "すべてのフィルターをクリア",
+       "rcfilters-invalid-filter": "無効なフィルター",
+       "rcfilters-filterlist-title": "フィルター",
+       "rcfilters-filterlist-noresults": "フィルターが見つかりませんでした",
+       "rcfilters-filtergroup-registration": "利用者登録",
+       "rcfilters-filter-registered-label": "登録済み",
+       "rcfilters-filter-registered-description": "ログイン済みの編集者。",
+       "rcfilters-filter-unregistered-label": "未登録",
+       "rcfilters-filter-bots-label": "ボット",
+       "rcfilters-filter-humans-label": "人間(ボットではない)",
        "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "rcshowhideminor": "細部の編集を$1",
        "fileuploadsummary": "概要:",
        "filereuploadsummary": "ファイルの変更:",
        "filestatus": "著作権情報:",
-       "filesource": "出典:",
+       "filesource": "情報源:",
        "ignorewarning": "警告を無視してファイルを保存",
        "ignorewarnings": "警告を無視",
        "minlength1": "ファイル名には少なくとも1文字必要です。",
        "uploaded-setting-handler-svg": "リモート/データ/スクリプトの「handler」属性を設定するSVGがブロックされています。アップロードされたSVGファイルに <code>$1=\"$2\"</code> が見つかりました。",
        "uploaded-remote-url-svg": "リモート URL の任意のスタイルを設定するSVGがブロックされています。アップロードされたSVGファイルに <code>$1=\"$2\"</code> が見つかりました。",
        "uploaded-image-filter-svg": "URL に画像フィルターが見つかりました: アップロードされたSVGファイルの <code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「$1」を含んでいます。",
+       "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「<nowiki>$1</nowiki>」を含んでいます。",
        "uploadinvalidxml": "アップロードされたファイルに含まれる XML が構文解析できませんでした。",
        "uploadvirus": "このファイルはウイルスを含んでいます!\n詳細: $1",
        "uploadjava": "このファイルは、Javaの.classファイルを含むZIPファイルです。\nセキュリティ上の制限を回避されるおそれがあるため、Javaファイルのアップロードは許可されていません。",
        "emailccsubject": "$1 に送信したメールの控え: $2",
        "emailsent": "メールを送信しました",
        "emailsenttext": "メールを送信しました。",
-       "emailuserfooter": "このメールは$1から{{GENDER:$2|$2}}へ、{{SITENAME}}の「{{int:emailuser}}」機能で{{GENDER:$1|送信}}されました。",
+       "emailuserfooter": "このメールは$1から{{GENDER:$2|$2}}へ、{{SITENAME}}の「{{int:emailuser}}」機能で{{GENDER:$1|送信}}されました。返信する場合は、{{GENDER:$2|あなた}}からのメールは{{GENDER:$1|もとの送信者}}に直接送信され、{{GENDER:$2|あなたの}}メールアドレスは{{GENDER:$2|返信先}}に開示されます。",
        "usermessage-summary": "システムメッセージを残す。",
        "usermessage-editor": "システムメッセンジャー",
        "watchlist": "ウォッチリスト",
        "modifiedarticleprotection": "「[[$1]]」の保護レベルを変更しました",
        "unprotectedarticle": "「[[$1]]」の保護を解除しました",
        "movedarticleprotection": "が保護の設定を「[[$2]]」から「[[$1]]」へ移動しました",
+       "protectedarticle-comment": "「[[$1]]」を{{GENDER:$2|保護しました}}",
+       "modifiedarticleprotection-comment": "「[[$1]]」の{{GENDER:$2|保護レベルを変更しました}}",
+       "unprotectedarticle-comment": "「[[$1]]」の{{GENDER:$2|保護を解除しました}}",
        "protect-title": "「$1」の保護レベルを変更",
        "protect-title-notallowed": "「$1」の保護レベルを表示",
        "prot_1movedto2": "[[$1]] を [[$2]] へ移動しました",
        "protect-cascadeon": "このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}からトランスクルードのため読み込まれているので、保護されています。\nこのページの保護レベルの変更は、カスケード保護には影響しません。",
        "protect-default": "すべての利用者に許可",
        "protect-fallback": "「$1」権限を持つ利用者のみに許可",
-       "protect-level-autoconfirmed": "自動承認された利用者のみ許可",
-       "protect-level-sysop": "管理者のみ許可",
+       "protect-level-autoconfirmed": "自動承認された利用者のみ許可",
+       "protect-level-sysop": "管理者のみ許可",
        "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "カスケード",
        "protect-expiring": "$1(UTC)で自動的に解除",
        "pageinfo-length": "ページの長さ (バイト単位)",
        "pageinfo-article-id": "ページ ID",
        "pageinfo-language": "ページ本文の言語",
+       "pageinfo-language-change": "変更",
        "pageinfo-content-model": "ページのコンテンツ モデル",
        "pageinfo-content-model-change": "設定変更",
        "pageinfo-robot-policy": "ロボットによるインデックス作成",
        "patrol-log-header": "以下は巡回された版の記録です。",
        "log-show-hide-patrol": "巡回記録を$1",
        "log-show-hide-tag": "タグ記録を$1",
+       "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "ページ$2の$3の版を巡回済みにマークしますか?",
        "deletedrevision": "古い版 $1 を削除しました",
        "filedeleteerror-short": "ファイルの削除エラー: $1",
        "unit-pixel": "ピクセル",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "このページのキャッシュを破棄しますか?",
-       "confirm-purge-bottom": "ã\83\9aã\83¼ã\82¸ã\82\92ã\83\91ã\83¼ã\82¸ã\81\99ã\82\8bã\81¨ã\80\81ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\8cç ´æ£\84ã\81\95ã\82\8cã\80\81å¼·å\88¶ç\9a\84ã\81«æ\9c\80æ\96°ç\89\88ã\81\8c表示ã\81\95ã\82\8cます。",
+       "confirm-purge-bottom": "ã\83\9aã\83¼ã\82¸ã\81®ã\83\91ã\83¼ã\82¸ã\81«ã\82\88ã\82\8aã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92ç ´æ£\84ã\81\97ã\80\81å¼·å\88¶ç\9a\84ã\81«æ\9c\80æ\96°ç\89\88ã\82\92表示ã\81\97ます。",
        "confirm-watch-button": "OK",
        "confirm-watch-top": "このページをウォッチリストに追加しますか?",
        "confirm-unwatch-button": "OK",
        "htmlform-user-not-exists": "<strong>$1</strong>は存在しません。",
        "htmlform-user-not-valid": "<strong>$1</strong>は有効な利用者名ではありません。",
        "logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
+       "logentry-delete-delete_redir": "$1 がリダイレクト「$3」を上書きにより{{GENDER:$2|削除しました}}",
        "logentry-delete-restore": "$1 がページ「$3」を{{GENDER:$2|復元しました}}",
        "logentry-delete-event": "$1 が $3 の{{PLURAL:$5|記録項目|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
        "logentry-delete-revision": "$1 がページ「$3」の{{PLURAL:$5|版|$5件の版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
        "feedback-useragent": "ユーザーエージェント:",
        "searchsuggest-search": "{{SITENAME}}内を検索",
        "searchsuggest-containing": "この語句を全文検索",
-       "api-error-autoblocked": "あなたの IP アドレスは、過去にブロックされた利用者によって使用されていたため、自動的にブロックされました。",
-       "api-error-badaccess-groups": "このウィキへのファイルのアップロードが許可されていません。",
        "api-error-badtoken": "内部エラー: トークンが正しくありません。",
-       "api-error-blocked": "あなたは編集ブロックされています。",
-       "api-error-copyuploaddisabled": "URLによるアップロードはこのサーバーでは無効になっています。",
-       "api-error-duplicate": "当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|他のファイルが|他のファイルがいくつか}}存在しています。",
-       "api-error-duplicate-archive": "サイト上に同じ内容の{{PLURAL:$1|別のファイルが|他のファイルがいくつか}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。",
-       "api-error-empty-file": "送信されたファイルは空でした。",
        "api-error-emptypage": "内容がないページの新規作成は許可されていません。",
-       "api-error-fetchfileerror": "内部エラー: ファイルを取得する際に問題が発生しました。",
-       "api-error-fileexists-forbidden": "「$1」という名前のファイルは存在しており、上書きはできません。",
-       "api-error-fileexists-shared-forbidden": "「$1」という名前のファイルは共有ファイルリポジトリに存在しており、上書きはできません。",
-       "api-error-file-too-large": "送信されたファイルは大きすぎます。",
-       "api-error-filename-tooshort": "ファイル名が短すぎます。",
-       "api-error-filetype-banned": "この形式のファイルは禁止されています。",
-       "api-error-filetype-banned-type": "$1{{PLURAL:$4|は許可されていないファイル形式です}}。許可されている{{PLURAL:$3|ファイル形式}}は$2です。",
-       "api-error-filetype-missing": "ファイルに拡張子がありません。",
-       "api-error-hookaborted": "拡張機能のフックによって、修正が中断されました。",
-       "api-error-http": "内部エラー: サーバーに接続できませんでした。",
-       "api-error-illegal-filename": "ファイル名が許可されていません。",
-       "api-error-internal-error": "内部エラー: ウィキ上でアップロードを処理する際に問題が発生しました。",
-       "api-error-invalid-file-key": "内部エラー: 一時格納場所にファイルが見つかりませんでした。",
-       "api-error-missingparam": "内部エラー: リクエストのパラメーターが足りません。",
-       "api-error-missingresult": "内部エラー: 複製に成功したかどうか判断できませんでした。",
-       "api-error-mustbeloggedin": "ファイルをアップロードするにはログインする必要があります。",
-       "api-error-mustbeposted": "内部エラー: リクエストは HTTP の POST メソッドである必要があります。",
-       "api-error-noimageinfo": "アップロードには成功しましたが、サーバーはファイルに関する情報を返しませんでした。",
-       "api-error-nomodule": "内部エラー: アップロードを処理するモジュールが設定されていません。",
-       "api-error-ok-but-empty": "内部エラー: サーバーからの応答がありません。",
-       "api-error-overwrite": "既存のファイルへの上書きは許可されていません。",
-       "api-error-ratelimited": "あなたは短時間の間に、このウィキで許容されている数より多くのファイルをアップロードしようとしています。\n数分後にもう一度お試しください。",
-       "api-error-stashfailed": "内部エラー: サーバーは一時ファイルを格納できませんでした。",
        "api-error-publishfailed": "内部エラー: サーバーは一時ファイルを発行できませんでした。",
-       "api-error-stasherror": "ファイルを未公開アップロードする際にエラーが発生しました。",
-       "api-error-stashedfilenotfound": "未公開場所からアップロードしようとしましたが、隠しファイルが見つかりませんでした。",
-       "api-error-stashpathinvalid": "隠しファイルのパスが無効です。",
-       "api-error-stashfilestorage": "未公開ファイルを格納する際にエラーが発生しました。",
-       "api-error-stashzerolength": "長さが0であるため、サーバーはファイルを隠しておくことができませんでした。",
-       "api-error-stashnotloggedin": "未公開ファイルを保存するにはログインが必要です。",
-       "api-error-stashwrongowner": "未公開場所にアクセスしようとしていたファイルは、あなたに属していません。",
-       "api-error-stashnosuchfilekey": "未公開場所にアクセスしようとしていたファイルのキーが存在しません。",
-       "api-error-timeout": "サーバーが決められた時間内に応答しませんでした。",
-       "api-error-unclassified": "不明なエラーが発生しました。",
-       "api-error-unknown-code": "不明なエラー:「$1」",
-       "api-error-unknown-error": "内部エラー: ファイルをアップロードする際に問題が発生しました。",
+       "api-error-stashfailed": "内部エラー: サーバーは一時ファイルを格納できませんでした。",
        "api-error-unknown-warning": "不明な警告:「$1」",
        "api-error-unknownerror": "不明なエラー:「$1」",
-       "api-error-uploaddisabled": "このウィキではアップロードは無効になっています。",
-       "api-error-verification-error": "このファイルは壊れているか、間違った拡張子になっています。",
-       "api-error-was-deleted": "この名前のファイルは、以前にアップロードされており、その後削除されています。",
        "duration-seconds": "$1 {{PLURAL:$1|秒}}",
        "duration-minutes": "$1 {{PLURAL:$1|分}}",
        "duration-hours": "$1 {{PLURAL:$1|時間}}",
        "special-characters-title-emdash": "em ダッシュ",
        "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": "カテゴリを追加...",
        "sessionmanager-tie": "複数の要求の認証方法を組み合わせることはできません: $1。",
        "sessionprovider-generic": "$1 セッション",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "クッキーベースのセッション",
        "log-action-filter-newusers": "アカウント作成の種類:",
        "log-action-filter-patrol": "巡回の種類:",
        "log-action-filter-protect": "保護の種類:",
+       "log-action-filter-rights": "権限変更の種類:",
        "log-action-filter-suppress": "秘匿の種類:",
        "log-action-filter-upload": "アップロードの種類",
        "log-action-filter-all": "すべて",
        "authmanager-create-not-in-progress": "アカウントの作成が行われていない、またはセッションデータが失われました。最初からやり直してください。",
        "authmanager-create-no-primary": "指定された証明情報は、アカウントの作成に使用できませんでした。",
        "authmanager-link-no-primary": "指定された証明情報は、アカウントの関連付けに使用できませんでした。",
-       "authmanager-link-not-in-progress": "アカウントの関連付けが行われていない、またはセッションデータが失われました。最初からやり直してください。",
+       "authmanager-link-not-in-progress": "アカウントの関連付けが処理されていないか、セッションデータが失われています。最初からやり直してください。",
        "authmanager-authplugin-setpass-failed-title": "パスワードの変更に失敗しました",
        "authmanager-authplugin-setpass-failed-message": "パスワードの変更は、認証プラグインによって拒否されました。",
        "authmanager-authplugin-create-fail": "アカウントの作成は、認証プラグインによって拒否されました。",
        "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>",
-       "edit-error-short": "エラー: $1",
-       "edit-error-long": "エラー:\n\n\n\n$1"
+       "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合は<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 4474661..89c777e 100644 (file)
@@ -44,7 +44,7 @@
        "tog-enotifminoredits": "Uga kirimi aku layangtronik yèn ana besutan cilik ing kaca lan barkas",
        "tog-enotifrevealaddr": "Singkab alamat layangtronikku ing layang pawarta",
        "tog-shownumberswatching": "Tuduhaké cacah wong sing ngawasi",
-       "tog-oldsig": "Tandha tangan sing ana:",
+       "tog-oldsig": "Tandha tangan panjenengan sing ana:",
        "tog-fancysig": "Anggep tandha tangan minangka tulisan wiki (tanpa pranala otomatis)",
        "tog-uselivepreview": "Nganggo pratuduh langsung",
        "tog-forceeditsummary": "Élingna aku menawa kothak ringkesan suntingan isih kosong",
@@ -61,7 +61,7 @@
        "tog-showhiddencats": "Tuduhaké kategori sing didhelikaké",
        "tog-norollbackdiff": "Aja tuduhaké prabédan sawisé mbalèkaké.",
        "tog-useeditwarning": "Élingaké kula yèn kula ninggalaké suntingan sing durung kasimpen",
-       "tog-prefershttps": "Tansah nganggo sambungan aman nalika mlebu",
+       "tog-prefershttps": "Tansah anggoa sambungan sing aman nalika mlebu log",
        "underline-always": "Tansah",
        "underline-never": "Ora tau",
        "underline-default": "Baku kulit utawa pangluron",
        "talk": "Parembugan",
        "views": "Praèn",
        "toolbox": "Piranti",
+       "tool-link-userrights": "Owahi golongan {{GENDER:$1|panganggo}}",
+       "tool-link-userrights-readonly": "Deleng golongan {{GENDER:$1|panganggo}}",
+       "tool-link-emailuser": "Kirimi {{GENDER:$1|panganggo}} iki layang-é",
        "userpage": "Deleng kaca panganggo",
        "projectpage": "Deleng kaca proyèk",
        "imagepage": "Deleng kaca barkas",
        "pool-queuefull": "Kempalan antrian kebak",
        "pool-errorunknown": "Kalepata ingkang mboten dipun mangertosi",
        "poolcounter-usage-error": "Cacad panganggo: $1",
-       "aboutsite": "Bab {{SITENAME}}",
-       "aboutpage": "Project:Bab",
+       "aboutsite": "Ngenani {{SITENAME}}",
+       "aboutpage": "Project:Ngenani",
        "copyright": "Kabèh isi kasedyakaké miturut $1.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Kadadian saiki",
        "portal": "Gapura paguyuban",
        "portal-url": "Project:Garupa paguyuban",
        "privacy": "Niti priangga",
-       "privacypage": "Project:Niti pripasi",
+       "privacypage": "Project:Niti priangga",
        "badaccess": "Aksès ora olèh",
        "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan sing panjenengan gayuh.",
        "badaccess-groups": "Pratingkah panjenengan diwatesi tumrap panganggo ing {{PLURAL:$2|klompoké|klompoké}}: $1.",
        "protectedinterface": "Kaca iki isiné tèks antarmuka sing dienggo software lan wis dikunci kanggo menghindari kasalahan.",
        "editinginterface": "'''Pènget:''' Panjenengan nyunting kaca sing dianggo nyedyakaké tèks antarmuka kanggo piranti alus.\nPangowahan kaca iki bakal awèh pangaruh marang tampilan antarmuka panganggo kanggoné panganggo liya.\nKanggo terjemahan, mangga nganggo [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyèk lokalisasi MediaWiki.",
        "translateinterface": "Saperlu nambah utawa ngowah pertalan tumrap kabèh wiki, mangga anggoa [https://translatewiki.net/ translatewiki.net] minangka proyèk panglokaling MediaWiki.",
-       "cascadeprotected": "Kaca iki wis direksa saka panyuntingan amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} ngisor iki sing wis direksa mawa opsi \"runtun\" diaktifaké:\n$2",
+       "cascadeprotected": "Kaca iki wis direksa saka besutan amarga katransklusi ing {{PLURAL:$1|kaca, sing|kaca-kaca, sing}} kareksa mawa pilihan \"runut\" murub:\n$2",
        "namespaceprotected": "Panjenengan ora kagungan idin kanggo nyunting kaca ing bilik nama '''$1'''.",
        "customcssprotected": "Sampéyan ora dililakaké nyunting kaca CSS iki amarga kaisi pangaturan pribadi saka panganggo liya.",
        "customjsprotected": "Sampéyan ora dililakaké nyunting kaca JavaScript iki amarga kaisi pangaturan pribadi saka panganggo liya.",
        "createacct-yourpasswordagain-ph": "Lebokaké manèh tembung wadiné",
        "userlogin-remembermypassword": "Gawé amrih aku panggah kalebu",
        "userlogin-signwithsecure": "Nganggo koneksi aman",
+       "cannotlogin-title": "Ora bisa mlebu log",
+       "cannotlogin-text": "Mokal mlebu log.",
        "cannotloginnow-title": "Ora bisa mlebu saiki",
        "cannotloginnow-text": "Mlebu ora mungkin menawa nganggo $1.",
+       "cannotcreateaccount-title": "Ora bisa gawé akun",
+       "cannotcreateaccount-text": "Gawé akun langsung ora bisa ing wiki iki.",
        "yourdomainname": "Dhomain panjenengan",
        "password-change-forbidden": "Sampéyan ora bisa ngganti tembung sandhi nèng wiki iki.",
        "externaldberror": "Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.",
        "login": "Mlebu",
+       "login-security": "Vèrifikasi idhèntitas panjenengan",
        "nav-login-createaccount": "Log mlebu / nggawé rékening (akun)",
        "userlogin": "Mlebu log / gawé rékening (akun)",
        "userloginnocreate": "Mlebu",
        "passwordremindertext": "Ana wong (mbokmanawa panjenengan dhéwé, saka alamat IP $1) nyuwun supaya dikirimi tembung sandhi anyar kanggo {{SITENAME}} ($4). Tembung sandi sawetara kanggo panganggo \"$2\" wis digawé lan saiki \"$3\". Yèn panjenengan pancèn nggayuh iki, mangga énggal mlebu log lan ngganti tembung sandi saiki.\nTembung sandi sawetara mau bakal kadaluwarsa ing {{PLURAL:$5|sadina|$5 dina}}.\nYèn wong liya sing nglakoni panyuwunan iki, utawa panjenengan éling tembung sandi panjenengan, lan ora kepéngin ngowahi, panjenengan ora usah nggubris pesen iki lan bisa tetep nganggo tembung sandi lawas.",
        "noemail": "Ora ana alamat layang e-mail sing kacathet kanggo panganggo \"$1\".",
        "noemailcreate": "Panjenengan kudu maringi alamat e-mail sing absah",
-       "passwordsent": "Tembung sandhi anyar wis dikirim menyang alamat layang e-mail panjenengan sing wis didaftar kanggo \"$1\". Mangga mlebu log manèh sawisé nampa e-mail iku.",
+       "passwordsent": "Tembung sandi anyar wis dikirim menyang alamat layang èlèktronik tumrap \"$1\". \nMangga mlebu log manèh sawisé panjenengan nampa iku.",
        "blocked-mailpassword": "Alamat IP panjenengan diblokir saka panyuntingan, mulané panjenengan ora olèh nganggo fungsi pèngetan tembung sandhi kanggo ''mencegah penyalahgunaan''.",
        "eauthentsent": "Sawijining layang élèktronik (e-mail) kanggo ndhedhes (konfirmasi) wis dikirim menyang alamat layang élèktronik sampeyan. \n\nSadhurunge layang élèktronik liyane dikirim menyang akun kuwi, sampeyan kudu melu parentah ing layang kuwi, kanggo mastikne yen alamat layang kuwi bener-bener dhuweke sampeyan.",
        "throttled-mailpassword": "Layang kanggo mbalèkaké tembung sandhi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung sandhi sing bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
        "createacct-another-realname-tip": "Jeneng asli ora kudu dilebokake.\n\nYen sampeyan milih nglebokake jeneng asli, jeneng kuwi bakal dinggo ngwenehi atribusi kanggo karya-karyane.",
-       "pt-login": "Mlebu",
+       "pt-login": "Mlebu log",
        "pt-login-button": "Mlebu",
        "pt-login-continue-button": "Banjuraké mlebu",
        "pt-createaccount": "Gawé akun",
        "passwordreset-emaildisabled": "Fitur layang elektronik wis dipateni ing wiki iki.",
        "passwordreset-username": "Jeneng panganggo:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Delok layang èlèktronik sing diasilaké?",
-       "passwordreset-capture-help": "Yèn Sampéyan nyentang kothak iki, layang èlèktronik (mawa tembung sandhi sawetara) bakal ditampilaké nèng Sampéyan lan uga dikirim nèng panganggo.",
        "passwordreset-email": "Alamat layang èlèktronik:",
        "passwordreset-emailtitle": "Rincian akun nèng {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ana uwong (mbok menawa Sampéyan, mawa angka IP $1) njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:\n\n$2\n\n{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\nSampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.",
        "media_tip": "Pranala barkas",
        "sig_tip": "Tandha tangan sampéyan mawa tandha wayah",
        "hr_tip": "Garis horisontal",
-       "summary": "Tingkesan:",
+       "summary": "Ringkesan:",
        "subject": "Jejer:",
        "minoredit": "Iki besutan cilik",
        "watchthis": "Awasi kaca iki",
        "preview": "Pratuduh",
        "showpreview": "Deleng pratuduh",
        "showdiff": "Tuduhaké owahan",
-       "anoneditwarning": "<strong>Penget:</strong> Panjenengan boten mlebet log. Alamat IP Panjenengan badhe katingal dening publik manawi Panjenengan ngayahi ewah-ewahan. Manawi Panjenengan  <strong>[$1 mlebet log]</strong> utawai <strong>[$2 damel akun]</strong>, suntingan Panjenengan badhe kaatribusekaken dhumateng  nama pangangge Panjenengan, lan rupi-rupi  kauntungan sanesipun.",
-       "anonpreviewwarning": "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
+       "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é.",
        "missingcommenttext": "Mangga isi tanggapan ing ngisor iki.",
        "loginreqtitle": "Kudu mlebu",
        "loginreqlink": "mlebu",
        "loginreqpagetext": "Panjenengan kudu $1 kanggo bisa mirsani kaca liyané.",
-       "accmailtitle": "Tembung wadi wis kinirim",
-       "accmailtext": "Sawijining tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi kanggo panganggo anyar iki isa diganti ing kaca ''[[Special:ChangePassword|ganti tembung sandi]]'' sawisé mlebu log.",
+       "accmailtitle": "Tembung sandi wis kinirim",
+       "accmailtext": "Tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi iki bisa diganti ing kaca <em>[[Special:ChangePassword|salin tembung sandi]]</em> sawisé mlebu log.",
        "newarticle": "(Anyar)",
        "newarticletext": "Katonané panjenengan ngetutaké pranala artikel sing durung ana.\nManawa kersa manulis artikel iki, manggaa. (Mangga mirsani [$1 Pitulung] kanggo informasi sabanjuré).\nYèn ora sengaja tekan kéné, bisa ngeklik pencètan '''back''' waé ing panjlajah wèb panjenengan.",
        "anontalkpagetext": "---- ''Iki yaiku kaca dhiskusi sawijining panganggo anonim sing durung kagungan akun utawa ora nganggo akuné, dadi kita keeksa kudu nganggo alamat IP-né kanggo nepangi. Alamat IP kaya mengkéné iki bisa dienggo déning panganggo sing séjé-séjé. Yèn panjenengan pancèn panganggo anonim lan olèh komentar-komentar miring, mangga [[Special:CreateAccount|nggawé akun]] utawa [[Special:UserLogin|log mlebu]] supaya ora rancu karo panganggo anonim liyané ing mangsa ngarep.''",
        "previewnote": "<strong>Élinga yèn iki mung pratuduh.</strong>\nOwahanmu durung kasimpen!",
        "continue-editing": "Menyang pambesutan",
        "previewconflict": "Pratilik iki nuduhaké tèks ing bagian dhuwur kothak suntingan tèks kayadéné bakal katon yèn panjenengan bakal simpen.",
-       "session_fail_preview": "'''Nuwun sèwu, suntingan panjenengan ora bisa diolah amarga dhata sèsi kabusak.\nCoba kirim dhata manèh. Yèn tetep ora bisa, coba log metua lan mlebu log manèh.''''''Amerga wiki iki marengaké panggunan kodhe HTML mentah, mula pratilik didhelikaké minangka pancegahan marang serangan JavaScript.'''\n'''Menawa iki sawijining usaha panyuntingan sing sah, mangga dicoba manèh.\nYèn isih tetep ora kasil, cobanen metu log lan mlebu manèh.'''",
+       "session_fail_preview": "Ngapunten! Kita ora bisa mrosès besutan panjenengan amarga ilangé sèsi data.\n\nPanjenengan bokmanawa wis metu log. <strong>Mangga vèrifikasi manawa panjenengan isih mlebu log lan jajala manèh</strong>.\nManawa isih durung kena, jajala [[Special:UserLogout|metu log]] lan mlebu log manèh, banjur priksaa apa browser panjenengan ngidinaké kuki saka situs iki.",
        "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amerga data sési ilang.'''\n\n''Amerga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki sawijining upaya suntingan sing absah, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
        "token_suffix_mismatch": "'''Suntingan panjenengan ditulak amerga aplikasi klièn panjenengan ngowahi karakter tandha wewacan ing suntingan. Suntingan iku ditulak kanggo untuk menggak kaluputan ing tèks artikel. Prekara iki kadhangkala dumadi yèn panjenengan ngangem dines layanan proxy anonim adhedhasar situs wèb sing duwé masalah.'''",
        "edit_form_incomplete": "'''Sebagéyan pormulir suntingan ora tekan nèng sasana; cèk pindho yèn suntingan Sampéyan isih wutuh lan jajal manèh.'''",
        "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}}\".",
-       "yourtext": "Tulisan sampéyan",
+       "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.'''",
        "editingold": "'''PÈNGET:''' Panjenengan nyunting revisi lawas sawijining kaca. Yèn versi iki panjenengan simpen, mengko pangowahan-pangowahan sing wis digawé wiwit revisi iki bakal ilang.",
        "readonlywarning": "'''PÈNGET: Basis data lagi dikunci amerga ana pangopènan, dadi saiki panjenengan ora bisa nyimpen kasil panyuntingan panjenengan. Panjenengan mbokmenawa prelu mindhahaké kasil panyuntingan panjenengan iki menyang panggonan liya kanggo disimpen bésuk.'''\n\nPangurus sing ngunci basis data mènèhi katrangan kaya mengkéné: $1",
        "protectedpagewarning": "'''PÈNGET:  Kaca iki wis dikunci dadi namung panganggo sing nduwé hak aksès pangurus baé sing bisa nyunting.'''\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
        "semiprotectedpagewarning": "'''Cathetan:''' Kaca iki lagi pinuju direksa, dadi namung panganggo kadaftar sing bisa nyunting.\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
-       "cascadeprotectedwarning": "'''PÈNGET:''' Kaca iki wis dikunci dadi namung panganggo mawa hak aksès pangurus waé sing bisa nyunting, amerga kalebu {{PLURAL:$1|kaca|kaca-kaca}} ing ngisor iki sing wis direksa mawa opsi 'pangreksan runtun' diaktifaké:",
+       "cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé sing bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} sing kareksa runut ngisor iki:",
        "titleprotectedwarning": "'''Pènget: Kaca iki wis dikunci saéngga perlu [[Special:ListGroupRights|hak mligi]] kanggo gawéné.'''\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
        "templatesused": "{{PLURAL:$1|Cithakan|Cithakan}} sing dienggo ing kaca iki:",
        "templatesusedpreview": "{{PLURAL:$1|Cithakan|Cithakan-cithakan}} sing dienggo ing pratilik iki:",
        "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis dibusak.",
        "edit-conflict": "Cengkah besutan",
        "edit-no-change": "Suntingan panjenengan dilirwakaké amerga panjenengan ora nglakoni pangowahan apa-apa ing tèks.",
+       "postedit-confirmation-created": "Kaca wis kagawé.",
        "postedit-confirmation-saved": "Besutan sampeyan wis kasimpen.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "showhideselectedversions": "Tampilaké/dhelikaké révisi kapilih",
        "editundo": "wurung",
        "diff-empty": "(Ora ana bedane)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Saowahan madya|$1 owahan madya}} déning panganggo sing padha ora dituduhaké)",
+       "diff-multi-sameuser": "({{PLURAL:$1|$1 owahan antara}} déning panganggo sing padha ora katuduhaké)",
        "diff-multi-manyusers": "({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning luwih saka $2 {{PLURAL:$2|panganggo|panganggo}} ora dituduhaké)",
        "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasiling golèk",
        "searchprofile-advanced-tooltip": "Golèk ing jagat aran tinamtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
-       "search-redirect": "(pangalihan $1)",
+       "search-redirect": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocog karo isi barkas)",
        "saveprefs": "Simpen",
        "restoreprefs": "Balèkna kabèh setèlan baku",
        "prefs-editing": "Pambesut",
-       "rows": "Larikan:",
-       "columns": "Kolom:",
        "searchresultshead": "Panggolèkan",
        "stub-threshold": "Ambang wates kanggo format <a href=\"#\" class=\"stub\">pranala rintisan</a>:",
        "stub-threshold-sample-link": "pralampita",
        "prefs-help-signature": "Tanggapan ing kaca parembugan kudu ditandhatangani mawa \"<nowiki>~~~~</nowiki>\", sing bakal salin dadi tandha tangan lan cap wektumu.",
        "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 sampéyan?",
+       "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",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Panjenengan ora ana hak kanggo ngowahi hak panganggo ing wiki liyané.",
        "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
-       "userrights-nologin": "Panjenengan kudu [[Special:UserLogin|mlebu log]] mawa nganggo akun utawa rékening pangurus supaya bisa ngowahi hak panganggo.",
-       "userrights-notallowed": "Sampéyan ora nduwé idin kanggo nambah utawa nyuda hak-hak panganggo.",
        "userrights-changeable-col": "Grup sing bisa panjenengan owahi",
        "userrights-unchangeable-col": "Grup sing ora bisa diowahi panjenengan",
        "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi Pangowahan sampeyan.",
-       "userrights-removed-self": "Sampeyan wis berhasil ngilangake hak-hak sampeyan. Nuli, sampeyan ora isa ngakses kaca niki malih.",
        "group": "Golongan:",
        "group-user": "Para panganggo",
        "group-autoconfirmed": "Panganggo sing otomatis didhedhes (dikonfirmasi)",
        "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",
-       "right-passwordreset": "Delok layang èlèktronik panyetèlulangan tembung sandhi",
        "grant-group-email": "Kirim layang élèktronik",
        "grant-createaccount": "Gawé akun",
        "grant-createeditmovepage": "Gawé, besut, lan lih kaca",
        "grant-editinterface": "Besut jagad aran MediaWiki lan CSS/JavaScript panganggo",
        "grant-editmycssjs": "Besut CSS/JavaScript panganggomu",
        "grant-editmyoptions": "Besut préferènsi panganggomu",
-       "newuserlogpage": "Log naraguna anyar",
+       "newuserlogpage": "Log panganggo anyar",
        "newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
        "rightslog": "Log hak panganggo",
        "rightslogtext": "Ing ngisor iki kapacak log pangowahan marang hak-hak panganggo.",
        "action-createpage": "gawé kaca iki",
        "action-createtalk": "gawé kaca parembugan iki",
        "action-createaccount": "gawé akun panganggo iki",
-       "action-minoredit": "tandhani iki minangka besutan cilik",
+       "action-minoredit": "tandhani besutan iki yèn besutan cilik",
        "action-move": "alih kaca iki",
        "action-move-subpages": "mindahaké kaca iki, lan kabèh anak-kacané",
        "action-move-rootuserpages": "ngalih kaca panganggo oyod",
        "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan nèng sawijining saca",
        "action-import": "impor kaca iki saka wiki liya",
        "action-importupload": "impor kaca iki saka pamunggahan berkas",
-       "action-patrol": "nandhani suntingan panganggo liya minangka wis kapriksa",
-       "action-autopatrol": "nandhani suntingan panjenengan dhéwé minangka wis kapriksa",
-       "action-unwatchedpages": "pirsani dhaftar kaca-kaca sing ora kaawasi",
+       "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
+       "action-autopatrol": "nandhani besutan panjenengan dhéwé yèn wis kapriksa",
+       "action-unwatchedpages": "deleng pratélan kaca sing ingawasan",
        "action-mergehistory": "nggabungaké sajarah kaca iki",
        "action-userrights": "ngowahi kabèh hak panganggo",
        "action-userrights-interwiki": "ngowahi hak aksès saka panganggo ing wiki liya",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]",
        "rc_categories": "Watesana nganti kategori (dipisah karo \"|\")",
        "rc_categories_any": "Apa waé",
-       "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sabubaré diowah",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sawisé diowah",
        "newsectionsummary": "/* $1 */ pérangan anyar",
        "rc-enhanced-expand": "Tuduhaké princèn",
        "rc-enhanced-hide": "Dhelikaké princèn",
        "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",
-       "filedesc": "Tingkesan",
+       "filedesc": "Ringkesan",
        "fileuploadsummary": "Ringkesan:",
        "filereuploadsummary": "Owah-owahan berkas:",
        "filestatus": "Status hak cipta",
        "minlength1": "Jeneng berkas paling ora minimal kudu awujud saaksara.",
        "illegalfilename": "Jeneng berkas \"$1\" ngandhut aksara sing ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng berkas iku lan cobanen  diunggahaké manèh.",
        "filename-toolong": "Jeneng berkas ora olèh luwih dawa saka 240 bita.",
-       "badfilename": "Berkas wis diowahi dados \"$1\".",
+       "badfilename": "Jeneng barkas wis diowah dadi \"$1\".",
        "filetype-mime-mismatch": "Èkstènsi berkas \".$1\" ora cocok karo jinis MIME sing kadètèk saka berkas ($2).",
        "filetype-badmime": "Berkas mawa tipe MIME \"$1\" ora pareng diunggahaké.",
        "filetype-bad-ie-mime": "Ora bisa ngunggahaké berkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", sing ora diidinaké lan minangka tipe berkas sing nduwèni potènsi mbebayani.",
        "listfiles_thumb": "Gambar mini",
        "listfiles_date": "Tanggal",
        "listfiles_name": "Jeneng",
-       "listfiles_user": "Naraguna",
+       "listfiles_user": "Panganggo",
        "listfiles_size": "Ukuran (bita)",
        "listfiles_description": "Dèskripsi",
        "listfiles_count": "Vèrsi",
        "filehist-thumb": "Gambar cilik",
        "filehist-thumbtext": "Gambar cilik kanggo owahan $1",
        "filehist-nothumb": "Ora ana miniatur",
-       "filehist-user": "Naraguna",
+       "filehist-user": "Panganggo",
        "filehist-dimensions": "Alang ujur",
        "filehist-filesize": "Gedhené berkas",
        "filehist-comment": "Tanggapan",
        "unusedtemplates": "Cithakan sing ora dienggo",
        "unusedtemplatestext": "Kaca iki ngamot kabèh kaca ing bilik jeneng {{ns:template}} sing ora dianggo ing kaca ngendi waé.\nPriksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.",
        "unusedtemplateswlh": "pranala liya-liyané",
-       "randompage": "Waton kaca",
+       "randompage": "Sembarang kaca",
        "randompage-nopages": "Ora ana kaca ing {{PLURAL:$2||}}bilik jeneng iki:$1.",
        "randomincategory": "Sembarang kaca ing kategori",
        "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
        "linksearch-error": "''Wildcards'' namung bisa dienggo ing bagéyan awal saka jeneng host.",
        "listusersfrom": "Tuduhna panganggo sing diawali karo:",
        "listusers-submit": "Tuduhna",
-       "listusers-noresult": "Naraguna ora ana.",
+       "listusers-noresult": "Panganggo ora ana.",
        "listusers-blocked": "(diblokir)",
        "activeusers": "Dhaptar panganggo aktif",
        "activeusers-intro": "Iki daptar panganggo sing katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
        "activeusers-count": "$1 {{PLURAL:$1|suntingan|suntingan}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "activeusers-from": "Tampilna panganggo wiwit saka:",
-       "activeusers-noresult": "Naraguna ora ana.",
+       "activeusers-noresult": "Panganggo ora ana.",
        "listgrouprights": "Hak-hak grup panganggo",
        "listgrouprights-summary": "Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak sing diidinaké</span>\n* <span class=\"listgrouprights-revoked\">Hak sing dijabel</span>",
        "confirmdeletetext": "Panjenengan bakal mbusak kaca utawa berkas iki minangka permanèn karo kabèh sajarahé saka basis data. Pastèkna dhisik menawa panjenengan pancèn nggayuh iki, ngerti kabèh akibat lan konsekwènsiné, lan apa sing bakal panjenengan tumindak iku cocog karo [[{{MediaWiki:Policy-url}}|kawicaksanan {{SITENAME}}]].",
        "actioncomplete": "Kasil diayahi",
        "actionfailed": "Tindakan gagal",
-       "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka rekamaning busak-busakan pungkasan.",
+       "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka cathetan ngenani sing pungkasan kabusak.",
        "dellogpage": "Log busak",
        "dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca sing anyar dhéwé.",
        "deletionlog": "log busak",
        "deletereasonotherlist": "Alesan liya",
        "deletereason-dropdown": "*Alesan pambusakan\n** Spam\n** Vandalisme\n** Nglanggar hak cipta\n** Disuwun sing nulis\n** Pangalihan rusak",
        "delete-edit-reasonlist": "Besut jalaraning pambusak",
-       "delete-toobig": "Kaca iki ndarbèni sajarah panyuntingan sing dawa, yaiku ngluwihi $1 {{PLURAL:$1|revision|révisi}}.\nPambusakan kaca sing kaya mangkono mau wis ora diparengaké kanggo menggak anané karusakan ing {{SITENAME}}.",
+       "delete-toobig": "Kaca iki darbé sujarah besutan sing dawa, punjul $1 {{PLURAL:$1|owahan}}.\nPambusak tumrap kaca sing kaya mangkono wis ora diidinaké nedya njagani murih ora ana karusakan ing {{SITENAME}}.",
        "delete-warning-toobig": "Kaca iki duwé sajarah panyuntingan sing dawa, luwih saka $1 {{PLURAL:$1|révisi|révisi}}.\nMbusak kaca iki bisa ngrusak operasi basis data ing {{SITENAME}};\nkudu ngati-ati.",
        "deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
        "rollback": "Pulihaké besutan",
        "protect-legend": "Konfirmasi pangreksan",
        "protectcomment": "Alesan:",
        "protectexpiry": "Kadaluwarsa:",
-       "protect_expiry_invalid": "Wektu kadaluwarsa ora sah.",
+       "protect_expiry_invalid": "Wektu kadaluwarsa ora sah.",
        "protect_expiry_old": "Wektu kadaluwarsané kuwi ana ing jaman biyèn.",
        "protect-unchain-permissions": "Urubaké pilihan panjagan sabanjuré",
        "protect-text": "Ing kéné, sampéyan bisa ndeleng lan ngganti tataran kareksan tumrap kaca <strong>$1</strong>.",
        "protect-existing-expiry": "Wektu kadaluwarsa saiki: $3, $2",
        "protect-otherreason": "Alesan liya/tambahan:",
        "protect-otherreason-op": "Alesan liya",
-       "protect-dropdown": "*Alesan umum pangreksan\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang suntingan\n** Kaca kerep disunting",
+       "protect-dropdown": "*Alesan umum pangreksa\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang besutan ora prodhuktif\n** Kaca sing dhuwur trafiké",
        "protect-edit-reasonlist": "Mbesut jalaraning pangreksa",
        "protect-expiry-options": "1 jam:1 hour,1 dina:1 day,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "restriction-type": "Pangreksan:",
        "whatlinkshere-prev": "{{PLURAL:$1|sadurungé|$1 sadurungé}}",
        "whatlinkshere-next": "{{PLURAL:$1|sabanjuré|$1 sabanjuré}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "$1 lih-lihan",
+       "whatlinkshere-hideredirs": "$1 alihan",
        "whatlinkshere-hidetrans": "$1 transklusi",
-       "whatlinkshere-hidelinks": "pranala-pranala $1",
+       "whatlinkshere-hidelinks": "$1 pranala",
        "whatlinkshere-hideimages": "$1 pranala berkas",
        "whatlinkshere-filters": "Panyaringan",
        "autoblockid": "Blokir otomatis #$1",
        "ipaddressorusername": "Alamat IP utawa jeneng panganggo",
        "ipbexpiry": "Kadaluwarsa",
        "ipbreason": "Alesan:",
-       "ipbreason-dropdown": "*Alesan umum mblokir panganggo\n** Mènèhi informasi palsu\n** Ngilangi isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak intimidasi/nglècèhaké\n** Nyalahgunakaké sawetara akun utawa rékening\n** Jeneng panganggo ora layak",
+       "ipbreason-dropdown": "*Alesan umum mblokir\n** Mènèhi informasi palsu\n** Mbusak isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak nglècèhaké\n** Ngujar-ujari sawenèh akun\n** Jeneng panganggo ora patut",
        "ipb-hardblock": "Alangi panganggo sing wis mlebu log nyunting saka alamat IP iki",
        "ipbcreateaccount": "Penggak nggawé akun utawa rékening",
        "ipbemailban": "Penggak panganggo ngirim layang e-mail",
        "badipaddress": "Alamat IP klèntu",
        "blockipsuccesssub": "Pemblokiran suksès",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDelok [[Special:BlockList|daptar blokir]] kanggo ninjo blokiran.",
-       "ipb-blockingself": "Sampéyan arep mblokir Sampéyan dhéwé! Sampéyan yakin arep nglakoni kuwi?",
+       "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni kuwi?",
        "ipb-confirmhideuser": "Sampéyan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh daptar lan èntri log. Sampéyan yakin arep nglakoni kuwi?",
        "ipb-edit-dropdown": "Besut jalaraning pamalang",
        "ipb-unblock-addr": "Ilangna blokir $1",
        "movepagetext": "Formulir ing ngisor iki bakal ngowahi jeneng sawijining kaca, mindhah kabèh sajarahé menyang kaca sing anyar. Irah-irahan utawa judhul sing lawas bakal dadi kaca pangalihan menyang irah-irahan sing anyar. Pranala menyang kaca sing lawas ora bakal diowahi; dadi pastèkna dhisik mriksa pangalihan [[Special:DoubleRedirects|dobel]] utawa [[Special:BrokenRedirects|pangalihan sing rusak]] sawisé pamindhahan. Panjenengan sing tanggung jawab mastèkaké menawa kabèh pranala-pranala tetep nyambung ing kaca panujon kaya samesthiné.\n\nGatèkna yèn kaca iki '''ora''' bakal dipindhah yèn wis ana kaca liyané sing nganggo irah-irahan sing anyar, kejaba kaca iku kosong utawa ora nduwé sajarah panyuntingan. Dadi tegesé panjenengan bisa ngowahi jeneng kaca iku manèh kaya sedyakala menawa panjenengan luput, lan panjenengan ora bisa nimpani kaca sing wis ana.\n\n'''PÈNGET!'''\nPerkara iki bisa ngakibataké owah-owahan sing drastis lan ora kaduga kanggo kaca-kaca sing populèr;\npastekaké dhisik panjenengan ngerti konsekwènsi saka panggayuh panjenengan sadurungé dibanjuraké.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
        "movepagetalktext": "Menawa sampéyan nyénthang kothak iki, kaca parembugan sing magepokan bakal otomatis dilih nyang sesirah anyar, kajaba kaca parembugané sing dituju wis ana isiné.\n\nYèn mangkéné, sampéyan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
-       "moveuserpage-warning": "'''Pèngetan:''' Sampéyan arep mindhahaké kaca panganggo. Mangga cathet yèn namung kaca sing bakal dipindhahaké lan panganggo '''ora''' bakal diganti jenengé.",
+       "moveuserpage-warning": "<strong>Pènget:</strong> Panjenengan iki arep ngalih kaca panganggo. Mangga èlingana yèn mung kacané waé sing bakal dilih, déné panganggoné <em>ora</em> bakal ganti jeneng.",
        "movenologintext": "Panjenengan kudu dadi panganggo sing wis ndaftar lan wis [[Special:UserLogin|mlebu log]] kanggo mindhah kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "movenotallowedfile": "Panjenengan ora duwé hak kanggo mindhahaké berkas.",
        "movepagebtn": "Ngalih kaca",
        "pagemovedsub": "Kasil dilih",
        "movepage-moved": "<strong>\"$1\" wis dilih nyang \"$2\"</strong>",
-       "movepage-moved-redirect": "Kaca pengalihan wis kacipta.",
+       "movepage-moved-redirect": "Kaca alihan wis kagawé.",
        "movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
-       "articleexists": "Satunggalipun kaca kanthi asma punika sampun wonten, utawi asma ingkang panjenengan pendhet mboten leres. Sumangga nyobi asma sanèsipun.",
+       "articleexists": "Kaca mawa jeneng mangkono wis ana utawa jeneng sing kokpilih ora valid.\nMangga pilih jeneng liya.",
        "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amerga irah-irahan tujuan lagi direksa; ora olèh digawé",
        "movetalk": "Lih kaca parembugan sing magepokan",
        "move-subpages": "Lih anak kaca (tekan $1)",
        "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": "Rerembuganing kaca isi",
+       "tooltip-ca-talk": "Pirembug 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-t-emailuser": "Kirimna e-mail menyang panganggo iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
-       "tooltip-t-print": "Cara cithakan kaca iki",
+       "tooltip-t-print": "Vèrsi cithak kaca iki",
        "tooltip-t-permalink": "Pranala permanèn saka owahan iki",
        "tooltip-ca-nstab-main": "Deleng kaca isi",
        "tooltip-ca-nstab-user": "Deleng kaca panganggo",
        "tooltip-rollback": "Balèkaké besutan-besutan kaca iki déning sing pungkasan nyumbang sarana saklikan.",
        "tooltip-undo": "\"Wurung\" mbalèkaké besutan iki lan mbukak blangko besutan sarana modhe pratuduh. Alesan kena diwuwuhaké ing babagan ringkesan.",
        "tooltip-preferences-save": "Simpen préperensi",
-       "tooltip-summary": "Isi tingkesan cendhak",
+       "tooltip-summary": "Isènana ringkesan cekak",
        "anonymous": "{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.",
        "siteuser": "Panganggo {{SITENAME}} $1",
        "anonuser": "Panganggo anonim {{SITENAME}} $1",
        "logentry-newusers-create2": "Akun panganggo $3 {{GENDER:$2|digawé}} déning $1",
        "logentry-newusers-byemail": "Akun panganggo $3 {{GENDER:$2|digawé}} déning $1 lan tembung sandhine dikirim lewat layang elektronik",
        "logentry-newusers-autocreate": "Akun $1 {{GENDER:$2|digawé}} otomatis",
-       "logentry-protect-unprotect": "$1 {{GENDER:$2|ngilangi}} rereksan saka $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|njabud}} payomané $3",
        "logentry-rights-rights": "$1 {{GENDER:$2|ngganti}} golongané {{GENDER:$6|$3}} saka $4 dadi $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ngganti}} golongané $3",
        "logentry-rights-autopromote": "$1 otomatis {{GENDER:$2|dipromosikne}} saka $4 nèng $5",
        "feedback-subject": "Jejer:",
        "feedback-submit": "Kirim",
        "feedback-thanks": "Nuwun! Lebon saran Sampéyan wis dipasang nèng kacané \"[$2 $1]\".",
-       "searchsuggest-search": "Golèk",
+       "searchsuggest-search": "Golèk {{SITENAME}}",
        "searchsuggest-containing": "ngemu...",
-       "api-error-badaccess-groups": "Sampéyan ora dililakaké ngunggah berkas nèng wiki iki.",
        "api-error-badtoken": "Kasalahan njero: Token èlèk.",
-       "api-error-copyuploaddisabled": "Ngunggah saka URL dipatèni nèng sasana iki.",
-       "api-error-duplicate": "Wis ana {{PLURAL:$1|barkas liya|barkas-barkas liya}} mawa isi sing padha sajeroning sana jaringan iki.",
-       "api-error-duplicate-archive": "Ana {{PLURAL:$1|berkas liya|pirang-pirang berkas liya}} sing wis ana nèng situsé saha isiné padha, nanging {{PLURAL:$1|kuwi|kuwi kabèh}} wis dibusak.",
-       "api-error-empty-file": "Berkas sing Sampéyan kirim kosong.",
        "api-error-emptypage": "Nggawé kaca kosong anyar ora dilikaké.",
-       "api-error-fetchfileerror": "Kasalahan njero: Ana sing salah nalika ngètukaké berkas iki.",
-       "api-error-fileexists-forbidden": "Berkas mawa jeneng \"$1\" wis ana, lan ora bisa diganti.",
-       "api-error-fileexists-shared-forbidden": "Berkas mawa jeneng \"$1\" wis ana nèng gudhang berkas bebarengan, lan ora bisa diganti.",
-       "api-error-file-too-large": "Berkas sing Sampéyan kirim kagedhèn.",
-       "api-error-filename-tooshort": "Jeneng berkas kacendhèken.",
-       "api-error-filetype-banned": "Jinis berkas iki dilarang.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|dudu jinis berkas sing dililakaké|dudu jinis berkas sing dililakaké}}. {{PLURAL:$3|Jinis berkas|Jinis berkas}} sing dililakaké $2.",
-       "api-error-filetype-missing": "Jeneng berkas ora nduwèni èkstènsi.",
-       "api-error-hookaborted": "Pangowahan sing Sampéyan coba dibatalaké déning èkstènsi.",
-       "api-error-http": "Kasalahan njero: Ora bisa ngubungi sasana.",
-       "api-error-illegal-filename": "Jeneng berkas ora dililakaké.",
-       "api-error-internal-error": "Kasalahan njero: Ana sing salah saka pamrosèsan unggahan Sampéyan nèng wiki.",
-       "api-error-invalid-file-key": "Kasalahan njero: Berkas ora ditemokaké nèng panyimpenan sawetara.",
-       "api-error-missingparam": "Kasalahan njero: Paramètèr panjalukan ilang.",
-       "api-error-missingresult": "Kasalahan njero: Ora bisa mesthèkaké yèn nyaliné suksès.",
-       "api-error-mustbeloggedin": "Sampéyan kudu mlebu log kanggo ngunggah berkas.",
-       "api-error-mustbeposted": "Kasalahan njero: Panjalukan mbutuhaké HTTP POST.",
-       "api-error-noimageinfo": "Ngunggah suksès. nanging sasana ora ngawèhi awak dhéwé katrangan bab berkas kuwi.",
-       "api-error-nomodule": "Kasalahan njero: Ora ana modul ngunggah sing dipatrapaké.",
-       "api-error-ok-but-empty": "Kasalahan njero: Ora ana tanggepan saka sasana.",
-       "api-error-overwrite": "Nibani berkas sing wis ana ora dililakaké.",
-       "api-error-stashfailed": "Kasalahan njero: Sasana gagal nyèlèhaké berkas sawetara.",
        "api-error-publishfailed": "Kasalahan njero: Sasana gagal nyèlèhaké berkas sawetara.",
-       "api-error-stasherror": "Ana kasalahan wektu ngunggah berkas.",
-       "api-error-timeout": "Sasana ora nanggepi nèng wektu sing karepaké.",
-       "api-error-unclassified": "Ana masalah sing ora dingertèni.",
-       "api-error-unknown-code": "Kasalahan ora dingertèni: \"$1\".",
-       "api-error-unknown-error": "Kasalahan njero: Ana sing salah nalika njajal ngunggah berkas Sampéyan.",
+       "api-error-stashfailed": "Kasalahan njero: Sasana gagal nyèlèhaké berkas sawetara.",
        "api-error-unknown-warning": "Pèngetan ora dingertèni: \"$1\".",
        "api-error-unknownerror": "Kasalahan ora dingertèni: \"$1\".",
-       "api-error-uploaddisabled": "Piranti ngunggah dipatèni nèng wiki iki.",
-       "api-error-verification-error": "Berkas iki mungkin rusak, utawa nduwéni èkstènsi salah.",
        "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
index a2fd8c9..f61112d 100644 (file)
        "passwordreset-emaildisabled": "ამ ვიკიში ელ.ფოსტის ფუნქციები გამორთულია.",
        "passwordreset-username": "მომხმარებლის სახელი:",
        "passwordreset-domain": "დომენი:",
-       "passwordreset-capture": "გამოსული ელ-ფოსტის ხილვა?",
-       "passwordreset-capture-help": "თუ მონიშნავთ ამ უჯრას, მაშინ თქვენ შეგეძლებათ მომხმარებლისათვის გაგზავნილი ელ.ფოსტის ნახვა (დროებითი პაროლით).",
        "passwordreset-email": "ელ. ფოსტის მისამართი:",
        "passwordreset-emailtitle": "ანგარიშის მონაცემები {{SITENAME}}-თვის",
        "passwordreset-emailtext-ip": "ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "passwordreset-emailelement": "მომხმარებლის სახელი: \n$1\n\nდროებითი პაროლი: \n$2",
        "passwordreset-emailsentemail": "თუ ეს მეილი თქვენს ანგარიშთანაა დაკავშირებული, გაიგზავნება პაროლის თავიდან დასაყენებელი ელექტრონული ფოსტა.",
        "passwordreset-emailsentusername": "თუ არსებობს მეილი, რომელიც ამ ანგარიშთანაა დაკავშირებული, გაიგზავნება პაროლის თავიდან დასაყენებელი ელექტრონული ფოსტა.",
-       "passwordreset-emailsent-capture2": "პაროლის გაუქმების შესახებ {{PLURAL:$1|მეილი|მეილები}} გაიგზავნა. {{PLURAL:$1|სახელი და პაროლი|სახელებისა და პაროლების სია}} არის ნაჩვენები ქვემოთ.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|მომხმარებელთან}} მეილის გაგზავნა ვერ მოხერხდა: $1 {{PLURAL:$3|სახელი და პაროლი|სახელებისა და პაროლების სია}} არის ნაჩვენები ქვემოთ.",
        "passwordreset-nocaller": "გამომძახებელი უნდა იყოს მიწოდებული",
        "passwordreset-nosuchcaller": "გამომძახებელი არ არსებობს: $1",
        "passwordreset-ignored": "პაროლის გაუქმება არ იქნა შესრულებული. შეიძლება კონფიგურაციაში პროვაიდერი არ იყო გათვალისწინებული?",
        "sectioneditnotsupported-text": "სექციის რედაქტირება გათიშულია ამ გვერდისთვის",
        "permissionserrors": "ნებართვის შეცდომა",
        "permissionserrorstext": "თქვენ არ გაქვთ ამის გაკეთების უფლება, შემდეგი {{PLURAL:$1|მიზეზის|მიზეზების}} გამო:",
-       "permissionserrorstext-withaction": "თქვენ არ გაქვთ ამ მოქმედების - „$2“ განხორციელების ნებართვა შემდეგი {{PLURAL:$1|მიზეზის|მიზეზის}} გამო:",
+       "permissionserrorstext-withaction": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83\92á\83\90á\83¥á\83\95á\83\97 á\83\90á\83\9b á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\98á\83¡ - â\80\9e$2â\80\9c á\83\92á\83\90á\83\9cá\83®á\83\9dá\83 á\83ªá\83\98á\83\94á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83\9cá\83\94á\83\91á\83\90á\83 á\83\97á\83\95á\83\90 á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 {{PLURAL:$1|á\83\9bá\83\98á\83\96á\83\94á\83\96á\83\98á\83¡|á\83\9bá\83\98á\83\96á\83\94á\83\96á\83\94á\83\91á\83\98á\83¡}} á\83\92á\83\90á\83\9bá\83\9d:",
        "contentmodelediterror": "არ შეგიძლიათ ამ ვერსიის რედაქტირება, რადგან მისი კონტენტის მოდელი არის <code>$1</code>, რაც განსხვავდება გვერდის მიმდინარე კონტენტის მოედლისაგან <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''გაფრთხილება: თქვენ ხელახლა ქმნით გვერდს, რომელიც ადრე წაიშალა.'''\n\nგთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.\nინფორმაციისთვის ქვემოთ მოყვანილია ამ გვერდის წაშლის ისტორია:",
        "moveddeleted-notice": "ეს გვერდი წაიშალა. ინფორმაციის მისაღებად ქვემოთ წარმოდგენილია შესაბამისი ჩანაწერები წაშლისა და გადარქმევის ჟურნალებიდან.",
        "saveprefs": "შენახვა",
        "restoreprefs": "ყველა საწყისი პარამეტრის აღდგენა (ყველა სექციაში)",
        "prefs-editing": "რედაქტირება",
-       "rows": "რიგები:",
-       "columns": "სვეტები",
        "searchresultshead": "ძიება",
        "stub-threshold": "გაფორმების გასაუმჯობესებლად მოცემულია ესკიზის ბმული ($1):",
        "stub-threshold-sample-link": "მაგალითი",
        "userrights-reason": "შეცვლის მიზეზი:",
        "userrights-no-interwiki": "თქვენ არ გაქვთ მომხმარებლის უფლებების რედაქტირების უფლება სხვა ვიკი-ებში.",
        "userrights-nodatabase": "მონაცემთა ბაზა $1 არ არსებობს, ან არ არის ლოკალური.",
-       "userrights-nologin": "თქვენ უნდა [[Special:UserLogin|წარადგინოთ თავი სისტემისადმი]] ადმინისისტრატორის ანგარიშით იმისთვის, რომ გასცეთ მომხმარებელთა უფლებები.",
-       "userrights-notallowed": "თქვენ არ გაქვთ მომხმარებელთა უფლებების შეცვლის უფლება.",
        "userrights-changeable-col": "ჯგუფები, რომლებიც შეგიძლიათ შეცვალოთ",
        "userrights-unchangeable-col": "ჯგუფები, რომლებიც არ შეგიძლიათ შეცვალოთ",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "მომხმარებელთა უფლებების კონფლიქტი! გთხოვთ ხელმეორედ შეინახოთ თქვენი ცვლილებები.",
-       "userrights-removed-self": "თქვენ წაშალეთ საკუთარი უფლება. შესაბამისად, თქვენ აღარ გექნებათ ამ გვერდთან წვდომის საშუალება",
        "group": "ჯგუფი:",
        "group-user": "მომხმარებლები",
        "group-autoconfirmed": "ავტომატურად დადასტურებული მომხმარებლები",
        "right-siteadmin": "მონაცემთა ბაზის დაბლოკვა და განბლოკვა",
        "right-override-export-depth": "გვერდების ექსპორტირება, დაკავშირებული გვერდების ჩათვლით 5-მდე სიიღრმით",
        "right-sendemail": "გაგუგზავნე ელექტრონული ფოსტა სხვა მომხმარებლებს",
-       "right-passwordreset": "ელ.ფოსტის ნახვა პაროლის შეცვლით",
        "right-managechangetags": "[[Special:Tags|ტეგების]] შექმნა და (დე)აქტივაცია",
        "right-applychangetags": "[[Special:Tags|tags]] მიღება თქვენ ცვლილებებთან ერთად",
        "right-changetags": "თვითნებური [[Special:Tags|tags]] დამატება ან წაშლა ცალკეულ ცვლილებებსა და ჟურნალის ჩანაწერებში",
        "uploaded-setting-handler-svg": "SVG, რომელიც სვავს \"handler\" ატრიბუტს remote/data/script-ით, დაბლკილია. ნაპოვნია <code>$1=\"$2\"</code> ატვირთულ SVG ფაილში.",
        "uploaded-remote-url-svg": "SVG, რომელიც სვავს რომელიმე სტილის ატრიბუტს დაშორებული URL-თი, დაბლოკილია. ნაპოვნია <code>$1=\"$2\"</code> ატვირთულ SVG ფაილში.",
        "uploaded-image-filter-svg": "ნაპოვნია სურათის ფილტრი URL-ით: <code>&lt;$1 $2=\"$3\"&gt;</code> ატვირთულ SVG ფაილში.",
-       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"$1\".",
+       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML ჩატვირთულ ფაილში არ შეიძლება იყოს ანალიზირებული",
        "uploadvirus": "ფაილი ვირუსს შეიცავს! დეტალები: $1",
        "uploadjava": "ეს არის ZIP-ფაილი, რომელიც ჯავას CLASS-ფაილს შეიცავს.\nჯავა-ფაილების ატვირთვა დაუშვებელია, ვინაიდან მათ შესაძლოა შეზღუდონ უსაფრთხოება.",
        "listfiles_date": "თარიღი",
        "listfiles_name": "სახელი",
        "listfiles_user": "მომხმარებელი",
-       "listfiles_size": "ზომა (ბაიტები)",
+       "listfiles_size": "ზომა",
        "listfiles_description": "აღწერილობა",
        "listfiles_count": "ვერსიები",
        "listfiles-show-all": "სურათების ძველი ვერსიების ჩართვა",
        "protect-expiry-options": "1 საათი:1 hour,1 დღე:1 day,1 კვირა:1 week,2 კვირა:2 weeks,1 თვე:1 month,3 თვე:3 months,6 თვე:6 months,1 წელი:1 year,განუსაზღვრელი ვადით:infinite",
        "restriction-type": "უფლება",
        "restriction-level": "შეზღუდვის დონე:",
-       "minimum-size": "მინ ზომა",
+       "minimum-size": "მინ. ზომა",
        "maximum-size": "მაქს. ზომა",
        "pagesize": "(ბაიტი)",
        "restriction-edit": "რედაქტირება",
        "htmlform-user-not-exists": "<strong>$1</strong> არ არსებობს.",
        "htmlform-user-not-valid": "<strong>$1</strong> არ არის სწორი მომხმარებლის სახელი.",
        "logentry-delete-delete": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გვერდი: „$3“",
+       "logentry-delete-delete_redir": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გადამისამართება $3 გადაწერით",
        "logentry-delete-restore": "მომხმარებელმა $1 {{GENDER:$2|აღადგინა}} გვერდი $3",
        "logentry-delete-event": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4",
        "logentry-delete-revision": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა გვერდისათვის $3: $4",
        "feedback-useragent": "მომხმარებლის აგენტი:",
        "searchsuggest-search": "ძიება",
        "searchsuggest-containing": "შეიცავს...",
-       "api-error-autoblocked": "თქვენი IP მისამართი ავტომატურად დაიბლოკა, რადგან ის გამოიყენა დაბლოკილმა მომხმარებელმა.",
-       "api-error-badaccess-groups": "თქვენ არ გაქვთ ამ ვიკიში ფაილების ატვირთვის უფლება.",
        "api-error-badtoken": "შიდა შეცდომა: ცუდი ტოკენი.",
-       "api-error-blocked": "თქვენთვის რედაქტირება დაბლოკილია.",
-       "api-error-copyuploaddisabled": "ამ სერვერზე URL-მისამართის საშუალებით ატვირთვა გამორთულია.",
-       "api-error-duplicate": "საიტზე უკვე {{PLURAL:$1|არსებობს სხვა ფაილი|არსებობს სხვა ფაილები}} ანალოგიური შინაარსით.",
-       "api-error-duplicate-archive": "საიტზე ადრე {{PLURAL:$1|უკვე იყო ფაილი}} ანალოგიური შინაარსით, მაგრამ {{PLURAL:$1|ის წაიშალა|ისინი წაიშალა}}.",
-       "api-error-empty-file": "არჩეული ფაილი ცარიელია.",
        "api-error-emptypage": "ახალი, ცარიელი გვერდების შექმნა აკრძალულია.",
-       "api-error-fetchfileerror": "შიდა შეცდომა: ფაილის მიღებისას მოხდა რაღაც შეცდომა.",
-       "api-error-fileexists-forbidden": "ფაილი სახელით „$1“ უკვე არსებობს და მისი გადაწერა შეუძლებელია.",
-       "api-error-fileexists-shared-forbidden": "ფაილი სახელით „$1“ უკვე არსებობს საერთო ფაილების საცავში და გადაწერა შეუძლებელია.",
-       "api-error-file-too-large": "არჩეული ფაილი ძალიან დიდია.",
-       "api-error-filename-tooshort": "ფაილის სახელი ზედმეტად მოკლეა",
-       "api-error-filetype-banned": "ფაილის ეს ტიპი აკრძალულია",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|მიუღებელი ფაილის ტიპია|მიუღებელი ფაილის ტიპებია}}. მისაღებიი ფაილის {{PLURAL:$3|ტიპია|ტიპებია}} $2.",
-       "api-error-filetype-missing": "ფაილს აკლია გაფართოვება.",
-       "api-error-hookaborted": "თქვენ მიერ შემოთავაზებული ცვლილება მოინიშნა გაფართოების დოკუმენტაციაში.",
-       "api-error-http": "აღმოჩენილია შეცდომა სერვერთან დაკავშირებისას.",
-       "api-error-illegal-filename": "ფაილის ეს სახელი აკრძალულია.",
-       "api-error-internal-error": "შიდა შეცდომა: ვიკიში თქვენი ატვირთვის დამუშავებისას მოხდა შეცდომა.",
-       "api-error-invalid-file-key": "სერვერმა ვერ იპოვა თქვენ მიერ მითითებული ფაილი",
-       "api-error-missingparam": "შიდა შეცდომა: მოთხოვნილი პარამეტრები დაიკარგა.",
-       "api-error-missingresult": "შიდა შეცდომა. ვერ მოხერხდა იმის დადგენა, იყო თუ არა კოპირება წარმატებული.",
-       "api-error-mustbeloggedin": "ფაილების ასატვირთად თქვენ უნდა შეხვიდეთ სისტემაში.",
-       "api-error-mustbeposted": "პროგრამული შეცდომა; გამოყენებულია არასწორი HTTP-მეთოდი.",
-       "api-error-noimageinfo": "ატვირთვა წარმატებით განხორციელდა, მაგრამ სერვერმა არ აჩვენა ფაილის შესახებ არანაირი ინფორმაცია.",
-       "api-error-nomodule": "შიდა შეცდომა. ატვირთვის მოდული არ არის კონფიგურირებული.",
-       "api-error-ok-but-empty": "შიდა შეცდომა. სერვერს არ დაუბრუნებია ინფორმაცია ატვირთვადი ფაილის შესახებ.",
-       "api-error-overwrite": "არსებული ფაილის შეცვლა მიუღებელია.",
-       "api-error-stashfailed": "შიდა შეცდომა: სერვერმა ვერ შეძლო დროებითი ფაილის შენახვა.",
        "api-error-publishfailed": "შიდა შეცდომა: სერვერმა ვერ შეძლო დროებითი ფაილის შენახვა.",
-       "api-error-stasherror": "ფაილის ჩატვირთვისას საცავში მოხდა შეცდომა",
-       "api-error-stashedfilenotfound": "დროებითი საცავიდან ფაილის ჩატვირთვისას საწყისი ფაილი არ იქნა ნაპოვნი",
-       "api-error-stashpathinvalid": "გზა, რომელზედაც უნდა იყოს განლაგებული ფაილი, ჩატვირთული დროებით საცავში, არაკორექტულია",
-       "api-error-stashfilestorage": "ფაილის ჩატვირთვისას დროებით საცავში მოხდა შეცდომა.",
-       "api-error-stashzerolength": "სერვერს არ შეუძლია შეინახოს ფაილი დროებით საცავში, რამეთუ მას აქვს ნულოვანი სიგრძე",
-       "api-error-stashnotloggedin": "თქვენ უნდა შეხვიდეთ სისტემაში, რათა გქონდეთ შესაძლებლობა ფაილის შეინახვისა დროებით საცავში",
-       "api-error-stashwrongowner": "ფაილი, რომლის გახსნასაც ცდილობდით დროებით საცავში, თქვენ არ გეკუთვნით",
-       "api-error-stashnosuchfilekey": "ფაილის გასაღები, რომელთანაც ცდილობდით წვდომას დროებით საცავში, არ არსებობს",
-       "api-error-timeout": "სერვერმა არ მოახდინა რეაგირება მოსალოდნელ დროში.",
-       "api-error-unclassified": "აღმოჩენილია უცნობი შეცდომა.",
-       "api-error-unknown-code": "უცნობი შეცდომა : „$1“",
-       "api-error-unknown-error": "შიდა შეცდომა: ფაილის ატვირთვისას აღმოჩენილია უცნობი შეცდომა.",
+       "api-error-stashfailed": "შიდა შეცდომა: სერვერმა ვერ შეძლო დროებითი ფაილის შენახვა.",
        "api-error-unknown-warning": "უცნობი გაფრთხილება: „$1“.",
        "api-error-unknownerror": "უცნობი შეცდომა: „$1“.",
-       "api-error-uploaddisabled": "ატვირთვის მექანიზმი ამ ვიკიზე გამორთულია",
-       "api-error-verification-error": "ეს ფაილი ან რაიმე შეცდომას შეიცავს, ან არ აქვს სახელის გაფართოება.",
-       "api-error-was-deleted": "ფაილი ამ სახელწოდებით ადრე აიტვირთა და შემდეგ წაიშალა.",
        "duration-seconds": "$1 {{PLURAL:$1|წამი|წამი}}",
        "duration-minutes": "$1 {{PLURAL:$1|წუთი|წუთი}}",
        "duration-hours": "$1 {{PLURAL:$1|საათი|საათი}}",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "სიმბოლოები",
        "special-characters-group-greek": "ბერძნული",
+       "special-characters-group-greekextended": "ბერძნული გაფართოებული",
        "special-characters-group-cyrillic": "კირილიცა",
        "special-characters-group-arabic": "არაბული",
        "special-characters-group-arabicextended": "არაბული გაფართოება",
        "mw-widgets-dateinput-no-date": "თარიღი არ არის არჩეული",
        "mw-widgets-dateinput-placeholder-day": "წწწწ-თთ-დდ",
        "mw-widgets-dateinput-placeholder-month": "წწწწ-თთ",
+       "mw-widgets-mediasearch-noresults": "შედეგები ვერ მოიძებნა.",
        "mw-widgets-titleinput-description-new-page": "გვერდი ჯერ არ არსებობს",
        "mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე",
        "sessionmanager-tie": "შეუძლებელია მრავალი მოთხოვნის ავთენთიფიკაციის ტიპების გაერთიანება: $1.",
index 9275e71..2f4c06a 100644 (file)
        "searchprofile-advanced-tooltip": "کسٹم نیم اسپیسا تلاش کورے",
        "search-result-size": "$1 ({{PLURAL:$2|1 لوظ|$2 الفاظ}})",
        "search-result-category-size": "{{PLURAL:$1|1 رُکن|$1 اراکین}} ({{PLURAL:$2|1 ذیلی زمرہ|$2 ذیلی زمرہ جات}}, {{PLURAL:$3|1 ملف|$3 ملفات}})",
-       "search-redirect": "(رجوع مکرر $1)",
+       "search-redirect": "(Redirect $1)",
        "search-section": "(حصہ $1)",
        "search-suggest": "تہ مطلب ھیہ تھے نو اوشوئے؟: $1",
        "search-interwiki-caption": "ملگیری منصوبہ",
        "saveprefs": "محفوظ",
        "restoreprefs": "تمام بےنقص ترتیباتن بحال کورے",
        "prefs-editing": "تدوین",
-       "rows": "صف:",
-       "columns": "قطار:",
        "searchresultshead": "Search/تلاش",
        "stub-threshold-disabled": "غیر فعال",
        "timezonelegend": "وختو زون",
        "whatlinkshere-prev": "{{PLURAL:$1|سابقہ|سابقہ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|پروشٹیو|پروشٹیو$1}}",
        "whatlinkshere-links": "← لنکس",
-       "whatlinkshere-hideredirs": "$1 رجوع مکرر",
+       "whatlinkshere-hideredirs": "$1 Redirects",
        "whatlinkshere-hidetrans": "ٹرانسکلوژن $1",
        "whatlinkshere-hidelinks": "$1 لنکس",
        "whatlinkshere-hideimages": "ھوٹوان لنک $1",
index 1580a47..1b03b32 100644 (file)
@@ -8,7 +8,8 @@
                        "아라",
                        "Macofe",
                        "Kumkumuk",
-                       "Asmen"
+                       "Asmen",
+                       "Gırd"
                ]
        },
        "tog-underline": "Bınê gırey de xete bonce:",
        "hiddencategories": "Na pele mensuba {{PLURAL:$1|1 kategoriya nımıtiya|$1 kategoriunê nımıtuna}}:",
        "permissionserrors": "Xetê desturi",
        "permissionserrorstext-withaction": "Desturê to be $2 çino, serba {{PLURAL:$1|na sebebi|nê sebebu}} ra:",
-       "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:",
+       "recreate-moveddeleted-warn": "'''Hişyari: na perra ke şıma vırazenê verê cı vıraziyayo.'''\n\nŞıma diqat bıkerê no vırnayışê şıma gani bêro akerdış:",
        "moveddeleted-notice": "Ma ena pele wederna.\nQe referansi logê wedernayışi bın de mocnayiya.",
        "edit-conflict": "Têverabiyayena vurnayişi.",
        "post-expand-template-inclusion-warning": "'''Teme''': Zerrekê şabloni zaf gırso.\nTaê şabloni ilawe nêbenê.",
        "prefs-rendering": "Asais",
        "saveprefs": "Qeyd ke",
        "prefs-editing": "Vurnais",
-       "rows": "Rêji:",
-       "columns": "Ustıni:",
        "searchresultshead": "Cıcêre",
        "stub-threshold": "Tertibê şêmıga <a href=\"#\" class=\"stub\">stub link</a> (''bytes''):",
        "recentchangesdays": "Rozê ke vurnaisunê peyênun de asenê:",
        "rcshowhidebots": "Botu $1",
        "rcshowhideliu": "karberê qeydbiyayeyi $1",
        "rcshowhideanons": "$1 karberê anonimi",
-       "rcshowhidepatr": "Vurnayışê cıyê vênıtey $1",
+       "rcshowhidepatr": "Vırnayışê cıyê vênıtey $1",
        "rcshowhidemine": "Vurnayisanê mı $1",
        "rclinks": "Peyniya $2 rozu de $1 vurnayisu bıasne <br />$3",
        "diff": "ferq",
index 28e84bc..5829ad7 100644 (file)
        "mypage": "Жеке бет",
        "mytalk": "Талқылау",
        "anontalk": "Талқылау",
-       "navigation": "Ð\91аÒ\93Ñ\8bÑ\82Ñ\82ау",
+       "navigation": "ШаÑ\80лау",
        "and": "&#32;және",
        "qbfind": "Табу",
        "qbbrowse": "Шолу",
        "passwordreset-emaildisabled": "E-mail мүмкіндігі бұл уикиде өшірілген.",
        "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$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрынғы құпия сөзді қолдана беруіңізге болады.",
        "passwordreset-emailtext-user": "$1 есімді қатысушы {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунт|аккаунттар}} осы електронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз, және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрыңғы құпия сөзді қолдана беруіңізге болады.",
        "passwordreset-emailelement": "Қатысушы есімі: \n$1\n\nУақытша құпия сөз: \n$2",
        "passwordreset-emailsentemail": "Бұл email мекенжайы тіркелгіңізге байланысқан, сол себепті құпия сөзді өзгерту электронды пошта арқылы жөнелтіледі.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|email has|emails have}}үшін құпия сөздің қалпына келтіру хабарламасы жіберілді. {{PLURAL:$1|username and password|list of usernames and passwords}} мында көрсетілген.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|user}}-мен электронды поштамен хабарласу нәтижесіз қалды: $1 The {{PLURAL:$3|username and password|list of usernames and passwords}} мында көрсетілген.",
        "changeemail": "Е-пошта мекенжайын өзгерту немесе аластау",
        "changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
        "changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "saveprefs": "Сақтау",
        "restoreprefs": "Барлығын бастапқы баптауларға қайтару (барлық бөлімдердегі)",
        "prefs-editing": "Өңдеу",
-       "rows": "Жолдар:",
-       "columns": "Бағандар:",
        "searchresultshead": "Іздеу",
        "stub-threshold": "Бастама сілтемесін пішімдеу табалдырығы ($1):",
        "stub-threshold-sample-link": "қарапайым",
        "userrights-reason": "Себебі:",
        "userrights-no-interwiki": "Басқа уикилердегі қатысушы құқықтарын өңдеуге рұқсатыңыз жоқ.",
        "userrights-nodatabase": "$1 дерекқоры жоқ не жергілікті емес.",
-       "userrights-nologin": "Қатысушы құқықтарын тағайындау үшін әкімші тіркелгісімен [[Special:UserLogin|кіруіңіз]] жөн.",
-       "userrights-notallowed": "Сізге қатысушы құқықтарын қосуға немесе алып тастауға рұқсат берілмеген.",
        "userrights-changeable-col": "Өзгерте алатын топтар",
        "userrights-unchangeable-col": "Өзгерте алмайтын топтар",
        "userrights-conflict": "Қатысушы құқықтарының қақтығысы! Өзгертулеріңізді қайта қарап шығыңыз және құптаңыз.",
-       "userrights-removed-self": "Өзіңіздің құқықтарыңызды алып тастадыңыз.  Осылайша бұл бетке бұдан былай қатынай алмайсыз.",
        "group": "Топ:",
        "group-user": "Қатысушылар",
        "group-autoconfirmed": "Өздіктіқұпталған қатысушылар",
        "right-siteadmin": "Дерекқорды құлыптау және құлыптауын өшіру",
        "right-override-export-depth": "Тереңдігі 5-тен жоғары сілтенген бетттерді қамти беттерді экспорттау",
        "right-sendemail": "Басқа қатысушыларға е-пошта жіберу",
-       "right-passwordreset": "Өзгерген құпия сөз арқылы хабарламаларды шолу",
        "right-managechangetags": "[[Special:Tags|Тегтерді]] дерекқордан бастау және жою",
        "right-applychangetags": "[[Special:Tags|Тегтерді]] бір өзгерісімен қолдану",
        "right-changetags": "Кез келген [[Special:Tags|тегті]] жеке нұсқалардан және журнал жазбаларынан аластау және қосу",
        "uploaddisabledtext": "Файл жүктеу өшірілген.",
        "php-uploaddisabledtext": "PHP-де файл жүктеулері өшірілген.\nfile_uploads баптауын тексеріңіз.",
        "uploadscripted": "Бұл файлда веб шолғышты қателікпен талдатқызатын HTML не әмір коды бар.",
-       "uploadscriptednamespace": "Бұл SVG файл дұрыс емес «$1» есім кеңістігінен тұрады.",
+       "uploadscriptednamespace": "Бұл SVG файл дұрыс емес «<nowiki>$1</nowiki>» есім кеңістігінен тұрады.",
        "uploadinvalidxml": "Жүктелген файлдағы XML талданбайды.",
        "uploadvirus": "Бұл файлда вирус бар! Егжей-тегжейлері: $1",
        "uploadjava": "ZIP файл  Java . түріндегі файлдан тұрады.\nJava файлдарды жүктеу рұқсат етілмейді, себебі құпиялық шектеулерге айналуына себеп болады.",
        "trackingcategories-msg": "Санатты қадағалау",
        "trackingcategories-name": "Хабарлама атауы",
        "trackingcategories-desc": "Санаттарды қосу шарттары",
-       "restricted-displaytitle-ignored": "Еленбеген көретілетін атауларымен беттер",
+       "restricted-displaytitle-ignored": "Еленбеген көрcетілетін атауларымен беттер",
        "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> үлкенірек болады, сондықтан біраз үлгілер кеңейтілмейді.",
        "undeleterevisions": "$1 {{PLURAL:$1|нұсқа|нұсқа}} жойылды",
        "undeletehistory": "Егер бетті қалпына келтірсеңіз тарихындағы барлық түзетулер де қалпына келтіріледі. Егер жоюдан соң дәл солай атауымен жаңа бет басталса қалпына келтірілген түзетулер бұрынғы өңделу тарихында көрсетіледі.",
        "undeleterevdel": "Егер бұл үстіңгі бетте аяқталса, не файл түзетуі жарым-жартылай жойылған болса, жою болдырмауы орындалмайды.\nОсындай жағдайларда, ең жаңа жойылған түзетуін алып тастауыңыз не жасыруын болдырмауыңыз жөн.",
-       "undeletehistorynoadmin": "Бұл бет жойылған.\nЖою себебі алдындағы өңдеген қатысушылар егжей-тегжейлерімен бірге төмендегі қысқаша мазмұндамасында көрсетілген.\nМына жойылған түзетулерін көкейкесті мәтіні тек әкімшілерге жетімді.",
+       "undeletehistorynoadmin": "Бұл бет жойылған.\nЖойған себебі жою алдындағы өңдеген қатысушылар егжей-тегжейлерімен бірге төмендегі қысқаша мазмұндамасында көрсетілген. Осы жойылған нұсқалардың мәтіні тек әкімшілерге қатынаулы.",
        "undelete-revision": "$4,  $5  кезіндегі $3 жасаған $1 дегеннің жойылған түзетуі:",
        "undeleterevision-missing": "Жарамсыз не жоғалған түзету.\nСілтемеңіз жарамсыз, не түзету қалпына келтірілген, немесе мұрағаттан аласталған болуы мүмкін.",
        "undelete-nodiff": "Еш алдыңғы түзету табылмады.",
        "feedback-useragent": "Қатысушы агент:",
        "searchsuggest-search": "{{SITENAME}} жобасынан іздеу",
        "searchsuggest-containing": "қамтылуда...",
-       "api-error-badaccess-groups": "Сізге бұл уикиге файл жүктеуге рұқсат етілмеген.",
        "api-error-badtoken": "Ішкі қате: Жаман байрақша",
-       "api-error-copyuploaddisabled": "URL бойынша жүктеу бұл серверде өшірілген",
-       "api-error-duplicate": "{{PLURAL:$1|басқа [$2 файл]|кейбір [$2 басқа файл]}} әлеқашан сайтта ,бірдей мазмұнда бар.",
-       "api-error-empty-file": "Сіз жіберген файл бос.",
        "api-error-emptypage": "Бос бетті жаңадан бастау рұқсат етілмейді.",
-       "api-error-fetchfileerror": "Ішкі қателік: Файлды алу барысында қате кетті.",
-       "api-error-fileexists-forbidden": "\"$1\" атауымен файл әлдеқашан бар және үстінен жазылмайды.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" атауымен файл ортаққорда әлдеқашан бар және үстінен жазылмайды.",
-       "api-error-file-too-large": "Сіз жіберген файл тым үлкен.",
-       "api-error-filename-tooshort": "Файл атауы тым қысқа",
-       "api-error-filetype-banned": "Бұл файл түрі тыйым салынған.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|рұқсат етілмеген файл түрі|рұқсат етілмеген файл түрі}}. Рұқсат етілген {{PLURAL:$3|файл түрі|файл түрлері}}: $2.",
-       "api-error-filetype-missing": "Файл атауы кеңейтілім қажет етеді.",
-       "api-error-hookaborted": "Сіз жасамақ болған түрлендірім кеңейтілім арқылы тоқтатылды.",
-       "api-error-http": "Ішкі қате: Серверге қосылу қолайсыз.",
-       "api-error-illegal-filename": "Файл атауы рұқсат етілмеген.",
-       "api-error-internal-error": "Ішкі қателік: Уикидегі жүктеу барысында  қате кетті",
-       "api-error-invalid-file-key": "Ішкі қате: Файл уақытша сақтағыштан табылмады.",
-       "api-error-missingparam": "Ішкі қате: Ұсынылған параметрлерді қажет етеді",
-       "api-error-missingresult": "Ішкі қателік: Есе сәтті болғанын анықтамады.",
-       "api-error-mustbeloggedin": "Файлдар жүктеу үшін кіруіңіз қажет",
-       "api-error-mustbeposted": "Ішкі қателік: Сұраныс HTTP POST қажет етеді.",
-       "api-error-noimageinfo": "Жүктеу сәтті болды, бірақ бізге файл туралы қандай да бір мәліметті сервер бере алмады.",
-       "api-error-nomodule": "Ішкі қателік: Жүктеу модуль жиынтығы жоқ.",
-       "api-error-ok-but-empty": "Ішкі қателік: Серверден жауап жоқ.",
-       "api-error-overwrite": "Бар файлды ауыстыру рұқсат етілмейді.",
-       "api-error-stashfailed": "Ішкі қателік: Сервер уақытша файлды сақтамады.",
        "api-error-publishfailed": "Ішкі қателік: Сервер уақытша файлды жарияламады.",
-       "api-error-stasherror": "Сақтау орнына файлды жүктеу кезінде қате болды.",
-       "api-error-stashedfilenotfound": "Уақытша қоймадағы файлды жүктемекші болған кезде бастапқы файл табылмады.",
-       "api-error-stashpathinvalid": "Уақытша қоймада жүктелген файл табылуға тиіс болған жол жарамсыз.",
-       "api-error-stashfilestorage": "Файлды уақытша қоймаға жүктеу барысында қате болды.",
-       "api-error-stashzerolength": "Сервер файлды уақытша қорға сақтай алмайды, себебі ұзындығы нөдге тең.",
-       "api-error-stashnotloggedin": "Жүктеу қоймасына сақтау үшін сіздің кіруіңіз керек.",
-       "api-error-stashwrongowner": "Сіз қатынамақшы болған қордағы файл сізге қарасты емес.",
-       "api-error-stashnosuchfilekey": "Сіз қатынамақшы болған қордағы файл құпия сөзі жоқ.",
-       "api-error-timeout": "Сервер межелеген мерзімде жауап бермеді.",
-       "api-error-unclassified": "Белгісіз қателік орын алды.",
-       "api-error-unknown-code": "Белгісіз қате: \"$1\".",
-       "api-error-unknown-error": "Ішкі қателік: Сіздің файлыңызды жүктеу барысында қате кетті.",
+       "api-error-stashfailed": "Ішкі қателік: Сервер уақытша файлды сақтамады.",
        "api-error-unknown-warning": "Белгісіз ескерту: \"$1\".",
        "api-error-unknownerror": "Белгісіз қате: \"$1\".",
-       "api-error-uploaddisabled": "Бұл уикиде жүктеп беру өшірілген.",
-       "api-error-verification-error": "Бұл файл бүлінген болуы мүмкін немесе теріс кеңейтуі бар.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|сағат|сағат}}",
index de12302..7ea4dfd 100644 (file)
@@ -5,7 +5,8 @@
                        "GaiJin",
                        "Kaztrans",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Zpizza"
                ]
        },
        "tog-underline": "Siltemeniñ astın sız:",
        "userrights-reason": "Sebebi:",
        "userrights-no-interwiki": "Basqa wïkïlerdegi paýdalanwşı quqıqtarın öñdewge ruqsatıñız joq.",
        "userrights-nodatabase": "$1 derekqorı joq ne jergilikti emes.",
-       "userrights-nologin": "Qatıswşı quqıqtarın tağaýındaw üşin äkimşi tirkelgisimen [[{{#special:Userlogin}}|kirwiñiz]] jön.",
-       "userrights-notallowed": "Qatıswşı quqıqtarın tağaýındaw üşin tirkelgiñizde ruqsat joq.",
        "userrights-changeable-col": "Özgerte alatın toptar",
        "userrights-unchangeable-col": "Özgerte almaýtın toptar",
        "group": "Top:",
        "listusersfrom": "Mına qatıswşıdan bastap körsetw:",
        "listusers-submit": "Körset",
        "listusers-noresult": "Qatıswşı tabılğan joq.",
+       "activeusers-excludegroups": "Toptarğa jatatın paydalanwşılardı qospaw:",
        "listgrouprights": "Qatıswşı tobı quqıqtarı",
        "listgrouprights-summary": "Kelesi tizimde bul wïkïde tağaýındalğan qatıswşı quqıqtarı (baýlanıstı qatınaw quqıqtarımen birge) körsetiledi.\nJeke quqıqtar twralı köbirek aqparattı [[{{MediaWiki:Listgrouprights-helppage}}|mında]] taba alasız.",
        "listgrouprights-group": "Top",
index 7a417cb..52ff8e6 100644 (file)
@@ -64,7 +64,8 @@
                        "Ykhwong",
                        "Matma Rex",
                        "Tursetic",
-                       "Jerrykim306"
+                       "Jerrykim306",
+                       "Sukjong0406"
                ]
        },
        "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": "프로젝트 문서 보기",
        "eauthentsent": "입력한 이메일로 확인 이메일을 보냈습니다.\n다른 모든 형태의 이메일을 당신의 계정으로 보내기 전에, 계정이 정말 당신의 것인지 확인하기 위해 이메일 내용의 지시대로 계정 확인 절차를 실행해 주셔야 합니다.",
        "throttled-mailpassword": "비밀번호 재설정 이메일을 이미 최근 {{PLURAL:$1|$1시간}} 안에 보냈습니다.\n악용을 방지하기 위해 비밀번호 재설정 메일은 {{PLURAL:$1|$1시간}}마다 오직 하나씩만 보낼 수 있습니다.",
        "mailerror": "메일을 보내는 중 오류: $1",
-       "acct_creation_throttle_hit": "당신의 IP 주소를 이용한 방문자가 이전에 이미 {{PLURAL:$1|계정 $1개}}를 만들어, 계정 만들기 한도를 초과하였습니다.\n따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.",
+       "acct_creation_throttle_hit": "당신의 IP 주소를 이용한 이 위키의 방문자가 $2에 {{PLURAL:$1|계정 $1개}}를 만들었으며, 이 기간 안에 허용되는 계정 만들기 한도를 초과하였습니다.\n따라서 지금 이 IP 주소를 사용하는 방문자는 더 이상 계정을 만들 수 없습니다.",
        "emailauthenticated": "이메일 주소가 $2 $3에 인증되었습니다.",
        "emailnotauthenticated": "이메일 주소를 인증하지 않았습니다.\n이메일 확인 절차를 거치지 않으면 다음 이메일 기능을 사용할 수 없습니다.",
        "noemailprefs": "이 기능을 사용하려면 사용자 환경 설정에서 이메일 주소를 지정하세요.",
        "botpasswords-updated-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 업데이트되었습니다.",
        "botpasswords-deleted-title": "봇 비밀번호 제거",
        "botpasswords-deleted-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 삭제되었습니다.",
-       "botpasswords-newpassword": "<strong>$1</strong>님으로 로그인하기 위한 새 비밀번호가 <strong>$2</strong>입니다. <em>잊어버리지 않도록 기록해두시기 바랍니다.</em>",
+       "botpasswords-newpassword": "<strong>$1</strong>님으로 로그인하기 위한 새 비밀번호는 <strong>$2</strong>입니다. <em>추후 참조를 위해 이것을 기록해두시기 바랍니다.</em> <br> (로그인 이름이 최종 사용자 이름과 동일해야 하는 오래된 봇의 경우, 사용자 이름으로 <strong>$3</strong>을(를), 비밀번호로 <strong>$4</strong>을(를) 사용할 수도 있습니다)",
        "botpasswords-no-provider": "'BotPasswordsSessionProvider'는 이용할 수 없습니다.",
        "botpasswords-restriction-failed": "봇 비밀번호 제한으로 인해 로그인할 수 없습니다.",
        "botpasswords-invalid-name": "지정된 사용자 이름은 봇 비밀번호 구분자(\"$1\")를 포함하고 있지 않습니다.",
        "passwordreset-emaildisabled": "이 위키에서 이메일 기능이 비활성화되어 있습니다.",
        "passwordreset-username": "사용자 이름:",
        "passwordreset-domain": "도메인:",
-       "passwordreset-capture": "발송 결과 이메일을 보시겠습니까?",
-       "passwordreset-capture-help": "이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.",
        "passwordreset-email": "이메일 주소:",
        "passwordreset-emailtitle": "{{SITENAME}} 계정에 대한 자세한 정보",
        "passwordreset-emailtext-ip": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 사용자 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|1일|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailelement": "사용자 이름: \n$1\n\n임시 비밀번호: \n$2",
        "passwordreset-emailsentemail": "당신의 계정과 연결된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
        "passwordreset-emailsentusername": "이 사용자 이름과 연결된 이메일 주소가 있다면 비밀번호 초기화 이메일이 전송됩니다.",
-       "passwordreset-emailsent-capture2": "비밀번호 재설정 이메일을 보냈습니다. {{PLURAL:$1|사용자 이름과 비밀번호는|사용자 이름과 비밀번호의 목록은}} 아래에 나타납니다.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|사용자}}에게 이메일 보내기 실패: $1 {{PLURAL:$3|사용자 이름과 비밀번호가|사용자 이름과 비밀번호의 목록이}} 아래에 나타납니다.",
        "passwordreset-nocaller": "호출자를 지정해야 합니다",
        "passwordreset-nosuchcaller": "호출자가 존재하지 않습니다: $1",
        "passwordreset-ignored": "비밀번호 재설정을 처리하지 못했습니다. 제공자가 구성되지 않았기 때문일 수 있습니다.",
        "minoredit": "사소한 편집입니다",
        "watchthis": "이 문서 주시하기",
        "savearticle": "문서 저장",
-       "savechanges": "변경 사항 저장",
+       "savechanges": "변경사항 저장",
        "publishpage": "문서 게시",
-       "publishchanges": "변경 사항 게시",
+       "publishchanges": "변경사항 게시",
        "preview": "미리 보기",
        "showpreview": "미리 보기",
        "showdiff": "차이 보기",
        "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "missingcommenttext": "아래에 내용을 채워 넣어 주세요.",
        "missingcommentheader": "<strong>알림:</strong> 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
-       "summary-preview": "요약 미리 보기:",
+       "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[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
+       "systemblockedtext": "당신의 사용자 이름 또는 IP 주소가 자동으로 미디어위키에 의해 차단되었습니다.\n이유는 다음과 같습니다:\n\n:<em>$2</em>\n\n* 차단 시작: $8\n* 차단 만료: $6\n* 차단 대상: $7\n\n당신의 현재 IP 주소는 $3입니다.\n문의에 대해 상기의 상세 설명을 모두 포함해 주십시오.",
        "blockednoreason": "이유를 입력하지 않음",
        "whitelistedittext": "문서를 편집하기 전에 $1해야 합니다.",
        "confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
        "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검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
        "search-error": "검색하는 동안 오류가 발생했습니다: $1",
+       "search-warning": "검색하는 동안 경고가 발생했습니다: $1",
        "preferences": "환경 설정",
        "mypreferences": "환경 설정",
        "prefs-edits": "편집 수:",
        "saveprefs": "저장",
        "restoreprefs": "(모든 부분에서) 모두 기본 설정으로 되돌리기",
        "prefs-editing": "편집",
-       "rows": "줄 수:",
-       "columns": "열 수:",
        "searchresultshead": "검색",
        "stub-threshold": "링크를 토막글 형식으로 보여줄 문서 크기 ($1):",
        "stub-threshold-sample-link": "샘플",
        "prefs-help-recentchangescount": "이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.",
        "prefs-help-watchlist-token2": "내 주시문서 목록의 웹 피드의 비밀 키입니다.\n이 키를 알고 있는 사람은 내 주시문서 목록을 읽을 수 있으니 이 키를 공유하지 마세요.\n필요하다면 [[Special:ResetTokens|이 키를 재설정할 수 있습니다]].",
        "savedprefs": "설정을 저장했습니다.",
-       "savedrights": "$1의 사용자 권한이 저장되었습니다.",
+       "savedrights": "{{GENDER:$1|$1}}의 사용자 그룹이 저장되었습니다.",
        "timezonelegend": "시간대:",
        "localtime": "현지 시각:",
        "timezoneuseserverdefault": "위키 기본값 사용 ($1)",
        "youremail": "이메일:",
        "username": "{{GENDER:$1|사용자 이름}}:",
        "prefs-memberingroups": "{{GENDER:$2|소속}} {{PLURAL:$1|그룹}}:",
+       "group-membership-link-with-expiry": "$1 ($2 까지)",
        "prefs-registration": "등록 시간:",
        "yourrealname": "실명:",
        "yourlanguage": "언어:",
        "prefswarning-warning": "사용자 환경 설정에서 바뀐 것이 아직 저장되어 있지 않습니다.\n사용자 환경 설정에서 \"$1\"을 클릭하지 않고 이 페이지를 떠나면 바뀌지 않습니다.",
        "prefs-tabs-navigation-hint": "팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.",
        "userrights": "사용자 권한 관리",
-       "userrights-lookup-user": "사용자 권한 관리",
+       "userrights-lookup-user": "사용자 선택",
        "userrights-user-editname": "사용자 이름 입력:",
-       "editusergroup": "{{GENDER:$1|사용자}} 그룹 편집",
+       "editusergroup": "사용자 그룹 불러오기",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한 바꾸기",
-       "userrights-editusergroup": "사용자 그룹 편집",
+       "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한을 보는 중",
+       "userrights-editusergroup": "{{GENDER:$1|사용자}} 그룹 편집",
+       "userrights-viewusergroup": "{{GENDER:$1|사용자}} 그룹을 보기",
        "saveusergroups": "{{GENDER:$1|사용자}} 권한 저장",
        "userrights-groupsmember": "현재 권한:",
        "userrights-groupsmember-auto": "자동으로 부여된 권한:",
        "userrights-reason": "이유:",
        "userrights-no-interwiki": "다른 위키의 사용자 권한을 바꿀 권한이 없습니다.",
        "userrights-nodatabase": "데이터베이스 $1이 존재하지 않거나 로컬에 있지 않습니다.",
-       "userrights-nologin": "사용자의 권한을 바꾸기 위해서는 반드시 관리자 계정으로 [[Special:UserLogin|로그인]]해야 합니다.",
-       "userrights-notallowed": "다른 사용자의 권한을 추가하거나 제거할 권한이 없습니다.",
        "userrights-changeable-col": "바꿀 수 있는 권한",
        "userrights-unchangeable-col": "바꿀 수 없는 권한",
+       "userrights-expiry-current": "$1에 만료",
+       "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-conflict": "사용자 권한 바꾸기가 충돌합니다! 바뀜을 검토하고 확인하세요.",
-       "userrights-removed-self": "자신의 권한을 제거했습니다. 따라서 더 이상 이 문서에 접근할 수 없습니다.",
        "group": "그룹:",
        "group-user": "사용자",
        "group-autoconfirmed": "자동 인증된 사용자",
        "right-autoconfirmed": "IP 기반의 속도 제한에 영향을 받지 않음",
        "right-bot": "봇의 편집으로 취급",
        "right-nominornewtalk": "토론 문서에서 사소한 편집으로 새 메시지 알림을 보내지 않기",
-       "right-apihighlimits": "API ì\83\81í\95\9c ì\83\81ì\8a¹",
+       "right-apihighlimits": "API ì¿¼ë¦¬ì\97\90ì\84\9c ë\8d\94 ë\86\92ì\9d\80 ì \9cí\95\9c ì\82¬ì\9a©",
        "right-writeapi": "쓰기 API 사용",
        "right-delete": "문서 삭제",
        "right-bigdelete": "문서 역사가 긴 문서를 삭제",
        "right-siteadmin": "데이터베이스를 잠그거나 잠금 해제",
        "right-override-export-depth": "5단계로 링크된 문서를 포함하여 문서를 내보내기",
        "right-sendemail": "다른 사용자에게 이메일 보내기",
-       "right-passwordreset": "비밀번호 재설정 이메일을 보기",
        "right-managechangetags": "데이터베이스에서 [[Special:Tags|태그]]를 만들거나 지우기",
        "right-applychangetags": "자신이 편집할 때 [[Special:Tags|태그]]를 적용하기",
        "right-changetags": "문서의 특정 판과 특정 기록 항목에 임의의 [[Special:Tags|태그]]를 추가하거나 제거하기",
        "grant-editprotected": "보호된 문서 편집하기",
        "grant-highvolume": "대용량 편집",
        "grant-oversight": "사용자 숨기기와 판 억제",
-       "grant-patrol": "페이지 변경 사항 점검",
+       "grant-patrol": "문서의 변경사항 점검",
        "grant-privateinfo": "개인 정보 접근",
        "grant-protect": "문서 보호 및 보호 해제",
        "grant-rollback": "문서의 바뀜을 되돌리기",
        "grant-basic": "기본 권한",
        "grant-viewdeleted": "삭제된 파일과 문서 보기",
        "grant-viewmywatchlist": "내 주시문서 목록 보기",
+       "grant-viewrestrictedlogs": "제한된 로그 기록 보기",
        "newuserlogpage": "사용자 만들기 기록",
        "newuserlogpagetext": "사용자가 만들어진 기록입니다.",
        "rightslog": "사용자 권한 기록",
        "action-upload_by_url": "URL 주소를 통해 이 파일을 올리기",
        "action-writeapi": "API를 작성할",
        "action-delete": "이 문서 삭제하기",
-       "action-deleterevision": "이 판을 삭제",
-       "action-deletedhistory": "이 문서의 삭제된 기여의 역사 보기",
+       "action-deleterevision": "판을 삭제",
+       "action-deletelogentry": "로그 기록 삭제",
+       "action-deletedhistory": "문서의 삭제된 기여의 역사 보기",
+       "action-deletedtext": "삭제된 판의 문자열 보기",
        "action-browsearchive": "삭제된 문서 검색",
-       "action-undelete": "이 문서 되살리기",
-       "action-suppressrevision": "ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë\90\98ì\82´ë¦´",
+       "action-undelete": "문서 되살리기",
+       "action-suppressrevision": "ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë³µêµ¬í\95\98기",
        "action-suppressionlog": "비공개 기록 보기",
        "action-block": "이 사용자가 편집하지 못하도록 차단",
        "action-protect": "이 문서의 보호 설정을 바꾸기",
        "action-userrights-interwiki": "다른 위키의 사용자 권한을 조정",
        "action-siteadmin": "데이터베이스를 잠그거나 잠금 해제하기",
        "action-sendemail": "이메일 보내기",
+       "action-editmyoptions": "자신의 환경 설정 편집",
        "action-editmywatchlist": "내 주시문서 목록 편집",
        "action-viewmywatchlist": "내 주시문서 목록 보기",
        "action-viewmyprivateinfo": "자신의 개인정보 보기",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "보기",
+       "rcfilters-activefilters": "사용 중인 필터",
+       "rcfilters-restore-default-filters": "기본 필터 복구",
+       "rcfilters-clear-all-filters": "필터 모두 지우기",
+       "rcfilters-search-placeholder": "필터 최근 바뀜 (찾아보거나 입력을 시작하십시오)",
+       "rcfilters-invalid-filter": "유효하지 않은 필터",
+       "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
+       "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
+       "rcfilters-filtergroup-registration": "사용자 등록",
+       "rcfilters-filter-registered-label": "등록됨",
+       "rcfilters-filter-registered-description": "로그인된 편집자.",
+       "rcfilters-filter-unregistered-label": "등록 안 됨",
+       "rcfilters-filter-unregistered-description": "로그인하지 않은 편집자.",
+       "rcfilters-filtergroup-authorship": "원작자 편집",
+       "rcfilters-filter-editsbyself-label": "자신의 편집",
+       "rcfilters-filter-editsbyself-description": "당신의 편집.",
+       "rcfilters-filter-editsbyother-label": "다른 사용자의 편집",
+       "rcfilters-filter-editsbyother-description": "다른 사용자에 의한 편집 (당신의 편집이 아님).",
+       "rcfilters-filtergroup-userExpLevel": "경험 수준 (등록된 사용자 전용)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "신규 사용자",
+       "rcfilters-filter-userExpLevel-newcomer-description": "10회 미만의 편집 및 4일 미만의 활동.",
+       "rcfilters-filter-userExpLevel-learner-label": "학습자",
+       "rcfilters-filter-userExpLevel-learner-description": "\"신규 사용자\" 보다 활동일 및 편집 수가 더 많지만 \"능숙한 사용자\" 보다는 적습니다.",
+       "rcfilters-filter-userExpLevel-experienced-label": "능숙한 사용자",
+       "rcfilters-filter-userExpLevel-experienced-description": "30일 이상의 활동 및 500개 이상의 편집.",
+       "rcfilters-filtergroup-automated": "자동으로 된 기여",
+       "rcfilters-filter-bots-label": "봇",
+       "rcfilters-filter-bots-description": "자동 도구를 이용한 편집.",
+       "rcfilters-filter-humans-label": "사람 (봇이 아님)",
+       "rcfilters-filter-humans-description": "수동으로 한 편집.",
+       "rcfilters-filtergroup-significance": "의미",
+       "rcfilters-filter-minor-label": "사소한 편집",
+       "rcfilters-filter-major-label": "사소하지 않은 편집",
+       "rcfilters-filter-major-description": "사소한 편집으로 표시되지 않은 편집.",
+       "rcfilters-filtergroup-changetype": "차이 종류",
+       "rcfilters-filter-pageedits-label": "문서 편집",
+       "rcfilters-filter-newpages-label": "문서 생성",
+       "rcfilters-filter-newpages-description": "새 문서를 만드는 편집.",
+       "rcfilters-filter-categorization-label": "분류 차이",
+       "rcfilters-filter-categorization-description": "분류에서 추가되거나 제거되는 페이지의 기록.",
        "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집 $1",
        "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 파일은 사용할 수 없는 이름공간 '$1'을 포함하고 있습니다.",
+       "uploadscriptednamespace": "이 SVG 파일은 사용할 수 없는 이름공간 '<nowiki>$1</nowiki>'을 포함하고 있습니다.",
        "uploadinvalidxml": "업로드된 파일의 XML의 구문을 분석할 수 없습니다.",
        "uploadvirus": "파일이 바이러스를 포함하고 있습니다!\n자세한 설명: $1",
        "uploadjava": "이 ZIP 파일은 자바의 .class 파일을 포함하고 있습니다.\n보안 규제를 우회할 수 있기 때문에 자바 파일을 올리는 것이 허용되지 않습니다.",
        "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\" 토크을 가져오는데 실패했습니다.",
        "apisandbox-continue": "계속",
        "apisandbox-continue-clear": "지우기",
        "apisandbox-param-limit": "최대 한계치를 사용하려면 <kbd>max</kbd>를 입력하십시오.",
+       "apisandbox-multivalue-all-namespaces": "$1 (모든 이름공간)",
+       "apisandbox-multivalue-all-values": "$1 (모든 값)",
        "booksources": "책 찾기",
        "booksources-search-legend": "책 원본 검색",
        "booksources-isbn": "ISBN:",
        "allpages": "모든 문서 목록",
        "nextpage": "다음 문서 ($1)",
        "prevpage": "이전 문서 ($1)",
-       "allpagesfrom": "다음으로 시작하는 문서 보기:",
-       "allpagesto": "다음으로 끝나는 문서 보기:",
+       "allpagesfrom": "다음으로 시작하는 문서 표시:",
+       "allpagesto": "다음으로 끝나는 문서 표시:",
        "allarticles": "모든 문서",
        "allinnamespace": "$1 이름공간의 모든 문서",
        "allpagessubmit": "보기",
-       "allpagesprefix": "다음으로 시작하는 문서 보기:",
+       "allpagesprefix": "다음 접두어로 시작하는 문서 표시:",
        "allpagesbadtitle": "주어진 문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키가 있습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
        "allpages-bad-ns": "{{SITENAME}}에서는 \"$1\" 이름공간을 사용하지 않습니다.",
        "allpages-hide-redirects": "넘겨주기 숨기기",
        "categories": "분류 목록",
        "categories-submit": "보이기",
        "categoriespagetext": "문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.\n[[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.\n[[Special:WantedCategories|필요한 분류]]도 참조하세요.",
-       "categoriesfrom": "다음으로 시작하는 분류를 보여주기:",
+       "categoriesfrom": "다음으로 시작하는 분류 표시:",
        "deletedcontributions": "삭제된 사용자 기여",
        "deletedcontributions-title": "삭제된 사용자 기여",
        "sp-deletedcontributions-contribs": "기여",
        "linksearch-text": "\"*.wikipedia.org\"와 같이 와일드 카드를 사용할 수 있습니다.\n적어도 \"*.org\"와 같이 최상위 도메인을 입력해야 합니다.<br />\n지원하는 {{PLURAL:$2|프로토콜}}: $1 (프로토콜을 지정하지 않을 때 기본값은 http://)",
        "linksearch-line": "$1가 $2에서 링크됩니다.",
        "linksearch-error": "와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.",
-       "listusersfrom": "다음으로 시작하는 사용자 보기:",
+       "listusersfrom": "다음으로 시작하는 사용자 표시:",
        "listusers-submit": "보기",
        "listusers-noresult": "사용자를 찾을 수 없습니다.",
        "listusers-blocked": "(차단됨)",
        "activeusers": "활동하는 사용자 목록",
        "activeusers-intro": "다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.",
        "activeusers-count": "마지막 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회",
-       "activeusers-from": "다음으로 시작하는 사용자를 보기:",
+       "activeusers-from": "다음으로 시작하는 사용자 표시:",
        "activeusers-groups": "그룹에 속한 사용자 표시:",
+       "activeusers-excludegroups": "그룹에 속한 사용자 제외:",
        "activeusers-noresult": "사용자를 찾을 수 없습니다.",
-       "activeusers-submit": "활동하고 있는 사용자 보이기",
+       "activeusers-submit": "활동하고 있는 사용자 표시",
        "listgrouprights": "사용자 권한 목록",
        "listgrouprights-summary": "다음은 이 위키에 있는 사용자 권한 그룹의 목록입니다.\n각각의 권한에 대해서는 [[{{MediaWiki:Listgrouprights-helppage}}|추가 정보]]를 참조하세요.",
        "listgrouprights-key": "범례:\n* <span class=\"listgrouprights-granted\">부여된 권한</span>\n* <span class=\"listgrouprights-revoked\">해제된 권한</span>",
        "emailccsubject": "$1에게 보낸 메시지의 복사본: $2",
        "emailsent": "이메일 보냄",
        "emailsenttext": "이메일을 보냈습니다.",
-       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1님이 $2에게 \"{{int:emailuser}}\" 기능을 통해 보냈습니다.",
+       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1님이 $2님에게 \"{{int:emailuser}}\" 기능을 통해 보냈습니다. 만약, {{GENDER:$2|당신}}이 이 이메일을 답장하면, {{GENDER:$2|당신}}의 이메일은 {{GENDER:$1|원래 사용자}}에게 {{GENDER:$2|당신}}의 이메일 주소가  {{GENDER:$1|원래 사용자}}에게 공개되면서 보내집니다.",
        "usermessage-summary": "시스템 메시지 남기기",
        "usermessage-editor": "시스템 메신저",
        "usermessage-template": "MediaWiki:UserMessage",
        "modifiedarticleprotection": "님이 \"[[$1]]\" 문서의 보호 설정을 바꿨습니다",
        "unprotectedarticle": "\"[[$1]]\" 문서를 보호 해제했습니다",
        "movedarticleprotection": "님이 문서의 보호 설정을 \"[[$2]]\"에서 \"[[$1]]\"(으)로 이동했습니다",
-       "protectedarticle-comment": "{{GENDER:$2|보호됨}} \"[[$1]]\"",
-       "modifiedarticleprotection-comment": "\"[[$1]]문서의 {{GENDER:$2|보호 수준 변경하기}}",
-       "unprotectedarticle-comment": "\"[[$1]]'문서의 {{GENDER:$2|보호 해제하기}}",
+       "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]] 문서로 이동함",
        "proxyblockreason": "당신의 IP 주소는 공개 프록시로 밝혀져 자동으로 차단됩니다.\n만약 인터넷 사용에 문제가 있다면 인터넷 서비스 공급자나 기술 지원팀에게 문의해주세요.",
        "sorbsreason": "당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.",
        "sorbs_create_account_reason": "당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.\n계정을 만들 수 없습니다.",
+       "softblockrangesreason": "익명 기여가 당신의 IP 주소($1)에서 허용되지 않습니다. 로그인해 주십시오.",
        "xffblockreason": "X-Forwarded-For 헤더에 현재 사용하고 있는 프록시 서버 중 당신이나 해당 IP 주소가 차단되었습니다. 차단 이유는 다음과 같습니다: $1",
        "cant-see-hidden-user": "차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.\n사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.",
        "ipbblocked": "자신이 차단되어 있기 때문에 다른 사용자를 차단하거나 차단을 해제할 수 없습니다.",
        "cant-move-to-user-page": "문서를 사용자 문서로 이동할 권한이 없습니다 (하위 문서는 예외).",
        "cant-move-category-page": "분류 문서를 이동할 권한이 없습니다.",
        "cant-move-to-category-page": "문서를 분류 문서로 이동할 권한이 없습니다.",
+       "cant-move-subpages": "하위 문서를 이동할 권한이 없습니다.",
+       "namespace-nosubpages": "\"$1\" 이름공간은 하위 문서를 허용하지 않습니다.",
        "newtitle": "새 제목:",
        "move-watch": "원래 문서와 대상 문서를 주시하기",
        "movepagebtn": "문서 이동",
        "pageinfo-length": "문서 길이 (바이트)",
        "pageinfo-article-id": "문서 ID",
        "pageinfo-language": "문서 내용 언어",
+       "pageinfo-language-change": "바꾸기",
        "pageinfo-content-model": "문서 내용 모델",
        "pageinfo-content-model-change": "변경",
        "pageinfo-robot-policy": "로봇에 의한 색인",
        "log-show-hide-patrol": "점검 기록을 $1",
        "log-show-hide-tag": "태그 기록을 $1",
        "confirm-markpatrolled-button": "확인",
-       "confirm-markpatrolled-top": "$2의 판을 $3으로 점검된 것으로 표시",
+       "confirm-markpatrolled-top": "$2의 $3 판을 점검한 것으로 표시하시겠습니까?",
        "deletedrevision": "예전 $1 판이 삭제되었습니다.",
        "filedeleteerror-short": "파일 삭제 오류: $1",
        "filedeleteerror-long": "파일을 삭제하는 도중 오류가 발생했습니다:\n\n$1",
        "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|목록을 직접 편집]]할 수도 있습니다.",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|토론]])",
        "timezone-local": "로컬",
        "duplicate-defaultsort": "<strong>경고:</strong> 기본 정렬 키 \"$2\"가 이전의 기본 정렬 키 \"$1\"를 덮어쓰고 있습니다.",
-       "duplicate-displaytitle": "<strong>경고:</strong> \"$2\" 제목 표시는 기존의 표시되는 제목 \"$1\"을 덮어씁니다.",
+       "duplicate-displaytitle": "<strong>경고:</strong> \"$2\" 표시 제목은 먼저번의 표시 제목 \"$1\"을 덮어씁니다.",
        "restricted-displaytitle": "<strong>경고:</strong> 표시하려는 제목 \"$1\"은(는) 문서의 실제 제목과 동일하지 않으므로 무시되었습니다.",
        "invalid-indicator-name": "<strong>오류:</strong> 문서 상태 표시기의 <code>name</code> 특성은 비어 있지 않아야 합니다.",
        "version": "버전",
        "htmlform-date-placeholder": "YYYY-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "지정한 값은 인식할 수 있는 날짜가 아닙니다. YYYY-MM-DD 형식을 사용하세요.",
+       "htmlform-time-invalid": "지정한 값은 인식할 수 있는 시간이 아닙니다. HH:MM:SS 형식을 사용하세요.",
+       "htmlform-datetime-invalid": "지정한 값은 인식할 수 있는 날짜 및 시간이 아닙니다. YYYY-MM-DD HH:MM:SS 형식을 사용하세요.",
        "htmlform-title-badnamespace": "[[:$1]] 문서는 \"{{ns:$2}}\" 이름공간에 없습니다.",
        "htmlform-title-not-creatable": "\"$1\"은 만들 수 없는 문서 제목입니다.",
        "htmlform-title-not-exists": "$1 문서는 존재하지 않습니다.",
        "htmlform-user-not-exists": "<strong>$1</strong> 문서는 존재하지 않습니다.",
        "htmlform-user-not-valid": "<strong>$1</strong>은 올바른 사용자 이름이 아닙니다.",
        "logentry-delete-delete": "$1님이 $3 문서를 {{GENDER:$2|삭제했습니다}}",
+       "logentry-delete-delete_redir": "$1님이 덮어쓰기를 통해 $3 문서를 {{GENDER:$2|삭제했습니다}}",
        "logentry-delete-restore": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}}",
        "logentry-delete-event": "$1님이 $3의 {{PLURAL:$1|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-delete-revision": "$1님이 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "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": "감사합니다! 혹시 해당 사항이 [$1 기존의 버그 보고서]에 올라와 있는지 확인해주세요.",
        "feedback-subject": "제목:",
        "feedback-submit": "제출",
        "feedback-terms": "사용자 에이전트 정보가 나의 브라우저 정보, 운영 체제 버전을 포함하며 피드백과 함께 공개적으로 공유됨을 이해합니다.",
-       "feedback-termsofuse": "이용 약관을 준수하여 피드백을 제공할 것입니다.",
+       "feedback-termsofuse": "이용 약관을 준수하여 피드백 제공에 동의합니다.",
        "feedback-thanks": "감사합니다! \"[$2 $1]\" 문서에 의견을 남겼습니다.",
        "feedback-thanks-title": "감사합니다!",
        "feedback-useragent": "사용자 에이전트:",
        "searchsuggest-search": "{{SITENAME}} 검색",
        "searchsuggest-containing": "다음 문자열 포함...",
-       "api-error-autoblocked": "사용자의 IP 주소는 차단된 사용자에 의해 사용되었으므로 자동으로 차단된 상태입니다.",
-       "api-error-badaccess-groups": "이 위키에 파일을 올릴 권한이 없습니다.",
        "api-error-badtoken": "내부 오류: 토큰이 잘못되었습니다.",
-       "api-error-blocked": "편집에서 차단되어 있습니다.",
-       "api-error-copyuploaddisabled": "이 서버에서 URL을 통해 파일 올리기가 비활성화되어 있습니다.",
-       "api-error-duplicate": "이 위키에 내용이 똑같은 {{PLURAL:$1|다른 파일}}이 있습니다.",
-       "api-error-duplicate-archive": "같은 내용을 담고 있던 {{PLURAL:$1|다른 파일}}이 있었지만 이 {{PLURAL:$1|파일}}은 삭제되었습니다.",
-       "api-error-empty-file": "올리려는 파일이 비어 있습니다.",
        "api-error-emptypage": "새 문서로 빈 문서를 만들 수 없습니다.",
-       "api-error-fetchfileerror": "내부 오류: 파일을 불러오는 중 문제가 발생했습니다.",
-       "api-error-fileexists-forbidden": "\"$1\" 이름으로 된 파일은 이미 존재하고 덮어쓸 수 없습니다.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" 이름으로 된 파일이 이미 공용 저장소에 존재하며 덮어쓸 수 없습니다.",
-       "api-error-file-too-large": "올리려는 파일이 너무 큽니다.",
-       "api-error-filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "api-error-filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|파일 형식은 올릴 수 없습니다}}. $2 {{PLURAL:$3|파일 형식만 사용할 수 있습니다}}.",
-       "api-error-filetype-missing": "파일 이름에 확장자가 없습니다.",
-       "api-error-hookaborted": "수정하려고 한 것이 확장 기능에 의해 중지되었습니다.",
-       "api-error-http": "내부 오류: 서버에 연결할 수 없습니다.",
-       "api-error-illegal-filename": "이 파일 이름을 사용할 수 없습니다.",
-       "api-error-internal-error": "내부 오류: 올린 파일을 위키에서 처리하는 중 어떤 문제가 발생했습니다.",
-       "api-error-invalid-file-key": "내부 오류: 임시 저장소에서 파일을 찾지 못했습니다.",
-       "api-error-missingparam": "내부 오류: 요청에 변수가 없습니다.",
-       "api-error-missingresult": "내부 오류: 파일의 복제가 성공했는지 판단할 수 없습니다.",
-       "api-error-mustbeloggedin": "파일을 올리려면 로그인해야 합니다.",
-       "api-error-mustbeposted": "내부 오류: HTTP POST에 요청이 필요합니다.",
-       "api-error-noimageinfo": "파일 올리기는 성공했지만 서버가 파일에 대해 어떠한 정보도 주지 않았습니다.",
-       "api-error-nomodule": "내부 오류: 올리기 모듈이 설정되지 않았습니다.",
-       "api-error-ok-but-empty": "내부 오류: 서버에서 응답이 없습니다.",
-       "api-error-overwrite": "이미 있는 파일을 덮어쓸 수 없습니다.",
-       "api-error-ratelimited": "짧은 시간 안에 위키가 허용하는 것 보다 더 많은 파일을 업로드하려고 합니다.\n몇 분 뒤에 다시 시도해 주십시오.",
-       "api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
        "api-error-publishfailed": "내부 오류: 서버가 임시 파일을 게시하지 못했습니다.",
-       "api-error-stasherror": "파일을 미공개 위치로 업로드하는 동안 오류가 발생했습니다.",
-       "api-error-stashedfilenotfound": "임시 저장된 파일이 임시 저장소에서 올리려고 했을 때 찾을 수 없었습니다.",
-       "api-error-stashpathinvalid": "임시 저장된 파일이 존재해야 할 경로에 유효한 파일이 없습니다.",
-       "api-error-stashfilestorage": "파일을 임시 저장하는 동안 오류가 발생했습니다.",
-       "api-error-stashzerolength": "서버는 파일을 저장하지 못했는데, 파일의 용량이 0이기 때문입니다.",
-       "api-error-stashnotloggedin": "파일을 업로드하기 위해 로그인이 필요합니다.",
-       "api-error-stashwrongowner": "저장된 임시 저장소에 존재하는 파일에 접근할 권한이 없습니다.",
-       "api-error-stashnosuchfilekey": "미공개 위치에 접근을 시도한 파일 키는 존재하지 않습니다.",
-       "api-error-timeout": "서버가 제 시간 내에 응답하지 않았습니다.",
-       "api-error-unclassified": "알 수 없는 오류가 발생했습니다.",
-       "api-error-unknown-code": "알 수 없는 오류: \"$1\"",
-       "api-error-unknown-error": "내부 오류: 파일을 올리려 하는 도중에 무엇인가가 잘못되었습니다.",
-       "api-error-unknown-warning": "알 수 없는 경고: \"$1\"",
+       "api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
+       "api-error-unknown-warning": "알 수 없는 경고: \"$1\".",
        "api-error-unknownerror": "알 수 없는 오류: \"$1\"",
-       "api-error-uploaddisabled": "이 위키에서 파일 올리기가 비활성화되어 있습니다.",
-       "api-error-verification-error": "파일이 손상되었거나 잘못된 확장자를 사용하고 있습니다.",
-       "api-error-was-deleted": "이 이름으로 된 파일은 과거에 업로드된 이후 삭제된 적이 있습니다.",
        "duration-seconds": "$1{{PLURAL:$1|초}}",
        "duration-minutes": "$1{{PLURAL:$1|분}}",
        "duration-hours": "$1{{PLURAL:$1|시간}}",
        "pagelang-language": "언어",
        "pagelang-use-default": "기본 언어 사용",
        "pagelang-select-lang": "언어 선택",
+       "pagelang-reason": "이유",
        "pagelang-submit": "제출",
+       "pagelang-nonexistent-page": "$1 문서가 존재하지 않습니다.",
+       "pagelang-unchanged-language": "$1 문서는 이미 $2 언어로 설정되어 있습니다.",
+       "pagelang-unchanged-language-default": "$1 문서는 이미 위키의 기본 콘텐츠 언어로 설정되어 있습니다.",
+       "pagelang-db-failed": "데이터베이스가 문서 언어 변경에 실패했습니다.",
        "right-pagelang": "문서 언어 바꾸기",
        "action-pagelang": "문서 언어 바꾸기",
        "log-name-pagelang": "언어 바꾸기 기록",
        "special-characters-title-emdash": "em 대시",
        "special-characters-title-minus": "빼기 기호",
        "mw-widgets-dateinput-no-date": "선택된 날짜 없음",
+       "mw-widgets-mediasearch-input-placeholder": "미디어 검색",
+       "mw-widgets-mediasearch-noresults": "결과가 없습니다.",
        "mw-widgets-titleinput-description-new-page": "문서가 존재하지 않습니다",
        "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기",
+       "mw-widgets-categoryselector-add-category-placeholder": "분류 추가...",
+       "mw-widgets-usersmultiselect-placeholder": "더 추가하기...",
        "sessionmanager-tie": "여러 요청 인증 유형 결합할 수 없습니다: $1.",
        "sessionprovider-generic": "$1 세션",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "쿠키 기반 세션",
        "sessionprovider-nocookies": "브라우저의 쿠키 기능이 꺼져 있는지 확인하십시오. 쿠키 기능을 켠 다음 다시 시작해야 합니다.",
        "randomrootpage": "임의 루트 페이지",
        "log-action-filter-block": "차단의 유형:",
-       "log-action-filter-contentmodel": "콘텐츠 모델 수정 분류:",
+       "log-action-filter-contentmodel": "콘텐츠 모델 변경 분류:",
        "log-action-filter-delete": "삭제 종류:",
        "log-action-filter-import": "가져오기 종류:",
        "log-action-filter-managetags": "태그 관리 동작 종류:",
        "log-action-filter-block-reblock": "차단 변경",
        "log-action-filter-block-unblock": "차단 해제",
        "log-action-filter-contentmodel-change": "콘텐츠 모델 변경",
-       "log-action-filter-contentmodel-new": "비표준 콘텐츠 모델 문서 생성",
+       "log-action-filter-contentmodel-new": "기본이 아닌 콘텐츠 모델 문서 생성",
        "log-action-filter-delete-delete": "문서 삭제",
+       "log-action-filter-delete-delete_redir": "넘겨주기 덮어쓰기",
        "log-action-filter-delete-restore": "문서 복구",
        "log-action-filter-delete-event": "로그 삭제",
        "log-action-filter-delete-revision": "판 삭제",
        "usercssispublic": "주목해 주십시오: CSS의 하위 문서들은 다른 사용자들이 볼 수 있기 때문에 기밀 데이터를 포함해서는 안 됩니다.",
        "restrictionsfield-badip": "유효하지 않은 IP 주소나 대역: $1",
        "restrictionsfield-label": "허용된 IP 대역:",
-       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "오류: $1",
-       "edit-error-long": "오류:\n\n$1"
+       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "$1 판",
+       "pageid": "페이지 ID $1"
 }
index ede9c55..df813b8 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Jose77",
                        "Meno25",
-                       "Protostar"
+                       "Protostar",
+                       "Nemo bis"
                ]
        },
        "tog-underline": "Link ùndarlaintin",
        "versionrequired": "Yu nid MediaWiki Version $1",
        "versionrequiredtext": "Yu nid MediaWiki Versiòn $1 fòyuz dhis pej.\nLuk [[Special:Version|version page]].",
        "ok": "OK",
-       "pagetitle-view-mainpage": " \n{{SAITNEM}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "Dèn dòn ritriv am na\"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Yu gèt}} $1 ($2).",
        "editsection": "èdit",
index 7d67c36..3d70dbb 100644 (file)
        "passwordreset-emaildisabled": "Heh dat Wiki määt nix met <i lang=\"en\">e-mail</i>!",
        "passwordreset-username": "Metmaacher_Nahme:",
        "passwordreset-domain": "Domähn:",
-       "passwordreset-capture": "Wells De di <i lang=\"en\">e-mail</i> beloore?",
-       "passwordreset-capture-help": "Wann De heh e Krüzje määß, kriß de di <i lang=\"en\">e-mail</i> met däm neue Paßwoot aanjezeish, ußer dat dä Metmaacher se och zohjescheck kritt.",
        "passwordreset-email": "De Adräß för de <i lang=\"en\">e-mail</i>:",
        "passwordreset-emailtitle": "Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
        "passwordreset-emailelement": "Metmaacher Name: \n$1\n\nEijmohl-Paßwoot: \n$2",
        "passwordreset-emailsentemail": "Wann dat en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för Dinge Zohjang verschek, öm e neu Paßwoot ze krijje.",
        "passwordreset-emailsentusername": "Wann heh dä Metmaacher en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß hät, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> verschek, öm e neu Paßwoot ze krijje.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es|De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>s sin|Nix es}} verschek woode, öm e neu Paßwoot ze krijje. {{PLURAL:$1|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|Däm|Däm|Däm Metmaacher|Dä|Däm}} $1 en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze scheke hät nit jeflupp: {{PLURAL:$3|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
        "passwordreset-nocaller": "Entärne Fähler: Ene Oprohfer moß aanjejovve sin.",
        "passwordreset-nosuchcaller": "Entärne Fähler: Dä Oprohfer „$1“ känne mer nit.",
        "passwordreset-invalidemail": "Dat es en onjöltejje Addräß fö de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
        "saveprefs": "Faßhalde",
        "restoreprefs": "Donn en alle Afschnedde alles op der Schtandatt retuur schtälle",
        "prefs-editing": "Beim Beärbeijde",
-       "rows": "Reihe:",
-       "columns": "Spalte:",
        "searchresultshead": "Beim Söhke",
        "stub-threshold": "Lengks zopaß för klein Sigge ($1) fomatehre av esu vill <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>:",
        "stub-threshold-sample-link": "Beijschpell_Lengk",
        "userrights-reason": "Aanlaß odder Jrund:",
        "userrights-no-interwiki": "Do häs nit dat Rääsch, Metmaacher ier Rääschte in ander Wikis ze ändere.",
        "userrights-nodatabase": "De Datebank „<strong>$1</strong>“ is nit doh, oder se litt op enem andere ẞööver.",
-       "userrights-nologin": "Do moss als ene Wiki-Köbes [[Special:UserLogin|enjelog sin]], för dat De Metmaacher ier Rääschte ändere kanns.",
-       "userrights-notallowed": "Do häs nit dat Rääsch, Rääschde aan Metmaacher ze verdeile udder se fott ze nämme.",
        "userrights-changeable-col": "{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De ändere kanns",
        "userrights-unchangeable-col": "{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De nit ändere kanns",
        "userrights-irreversible-marker": "$1 *",
        "userrights-conflict": "Ene Andere hät di Rääschde ald verändert. Loor, wad_eruß kohm un versöhg_et norr_ens, wann nüüdesch.",
-       "userrights-removed-self": "Do häs Ding Rääsch dohzoh jraad drannjejovve, dröm kanns De heh di Sigg nit mih oprohfe.",
        "group": "Jropp:",
        "group-user": "Metmaacher",
        "group-autoconfirmed": "Bestätichte Metmaacher",
        "right-siteadmin": "De Dahtebangk deeschmaache un opmaache för Änderonge",
        "right-override-export-depth": "Beim Sigge Expoteere de Sigge metnämme, woh Lingks drop jon — beß fönef Schredde wigk",
        "right-sendemail": "<i lang=\"en\">e-mail</i> aan ander Metmaacher schecke",
-       "right-passwordreset": "De <i lang=\"en\">e-mails</i> vum Paßwoot neu Säze aanloore",
        "right-managechangetags": "[[Special:Tags|Kännzeijsche]] aanlähje udder ußschallde",
        "right-applychangetags": "[[Special:Tags|Makehronge]] met de eije Änderonge zersamme verjävve",
        "right-changetags": "[[Special:Tags|Makehronge]] vun Väsjohne un Enndrähsche em Logbohch fott nämme un zohföhje",
        "uploaded-setting-handler-svg": "Mer han „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1=\"$2\"</code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge. Esu en Datteije, di de Eijeschaff „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">handler</code>“ op ein vun „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">remote/data/script</code>“ säz sin jeschpächt.",
        "uploaded-remote-url-svg": "\n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Datteije di öhnds_e „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">style</code>“-Ellemänt obb_en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> ußerhallef vum Wikki säze sin verbodde un jeschpächt. Mer han \n„<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1=\"$2\"</code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
        "uploaded-image-filter-svg": "Mer han ene Belder_Felter met däm <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> en dä huhjelahde \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
-       "uploadscriptednamespace": "De aanjejovve <i lang=\"en\" xml:lang=\"en\">SVG</i>-Dattei benöds dä verbodde Nahme-Roum „$1“",
+       "uploadscriptednamespace": "De aanjejovve <i lang=\"en\" xml:lang=\"en\">SVG</i>-Dattei benöds dä verbodde Nahme-Roum „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "Dat <i lang=\"en\" xml:lang=\"en\">XML</i> en dä huh jelaade Dattei kunnt wohr nit en Oodenong beim Ongersöhke.",
        "uploadvirus": "Esu ene Dress:\n<br />\nEn dä Datei stich e Kompjutervirus!\n<br />\nDe Einzelheite: $1",
        "uploadjava": "Dat es en Sammel_Dattei em ZIP-Fommaat, woh en Java-.class-Datei dren shtich.\nJava-Datteie huhlaade es nit zohjelohße, weil mer domet de Enshtellunge ömjonn kann, di der ẞörver schöze un däm sing Sescherheit jarranteere.",
        "feedback-useragent": "Dä Brauser:",
        "searchsuggest-search": "Söhke",
        "searchsuggest-containing": "dren änthallde…",
-       "api-error-badaccess-groups": "Do häs nit et Rääsch, Datteije en heh dat Wiki huhzelaade.",
        "api-error-badtoken": "Fähler: et Kännzeijsche (<i lang=\"en\">token</i>) es kappott.",
-       "api-error-blocked": "Do bes föh et Änndere jeschpächt.",
-       "api-error-copyuploaddisabled": "Et Huhlaade vun enem <i lang=\"en\">URL</i> es op däm ẞööver heh nit zohjelohße.",
-       "api-error-duplicate": "Mer han em Wiki ald {{PLURAL:$1|[en Dattei]|[$1 andere Datteije]|[kein Dattei]}} mem akeraat sellve Enhalldt.",
-       "api-error-duplicate-archive": "Mer hatte {{PLURAL:$1|[en ander Dattei]|[ander Datteije]|[kein ander Dattei]}} heh em Wiki mem sellve Enhalt, ävver se {{PLURAL:$1|es|sen|es}} ald fottjeschmeße woode.",
-       "api-error-empty-file": "En dä huhjelaade Dattei wohr jaa_nix dren.",
        "api-error-emptypage": "Neu läddijje Sigge aanzelääje es verbodde.",
-       "api-error-fetchfileerror": "Fähler: Beim eronger Lahde hät jät nit jeflupp.",
-       "api-error-fileexists-forbidden": "En Dattei mem Name „$1“ es ald doh un mer künne se nit övverschriive.",
-       "api-error-fileexists-shared-forbidden": "En Dattei mem Name „$1“ es ald en ene jemeinsamme Sammlong, un mer künne se nit övverschriive.",
-       "api-error-file-too-large": "De huhjelaade Dattei wohr ze jruß.",
-       "api-error-filename-tooshort": "Der Name för di Dattei es ze koot.",
-       "api-error-filetype-banned": "Di Zoot Dattei es nit zohjelohße.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Dat Dateifommaat|De Dateifommaate|}} $1 wulle mer nit huhjelaade krijje. Älaup {{PLURAL:$3|es|sin_er|}}: $2",
-       "api-error-filetype-missing": "Dä Dattei iehre Nahme hät kein Ändong.",
-       "api-error-hookaborted": "Ding Änderong wood vun enem Zohsazprojramm nit zohjelohße.",
-       "api-error-http": "Fähler: Mer krijje kein Verbendung mem ẞööver.",
-       "api-error-illegal-filename": "Der Name för di Dattei es verbodde.",
-       "api-error-internal-error": "Fähler: Noh em Huhlaade en et Wiki es em Wiki jät scheif jeloufe.",
-       "api-error-invalid-file-key": "Fähler: En Dattei wohr nit em Zwescheschpeischer ze fenge.",
-       "api-error-missingparam": "Fähler: Doh fähle Parrameetere en däm, wat aan dä ẞööver övvermeddelt woode es.",
-       "api-error-missingresult": "Fähler: Mer kunnte nit eruß krijje, ob et Koppeere joht jejange wohr.",
-       "api-error-mustbeloggedin": "För Datteije huh_ze_laade moß de ald enjelogg sinn.",
-       "api-error-mustbeposted": "Fähler: Mer hätt dat mt <code lang=\"en\">HTTP POST</code> schecke mößße.",
-       "api-error-noimageinfo": "Et Huhlaade hät jeflupp, ävver der ẞööver hät ons övver di Dattei nix verzallt.",
-       "api-error-nomodule": "Fähler: Mer han kei Modul för et Huhlssde faßjelaat.",
-       "api-error-ok-but-empty": "Fähler: Mer krijje kein Antwoot vum ẞööver.",
-       "api-error-overwrite": "En Dattei ze övverschrieve es nit zohjelohße.",
-       "api-error-stashfailed": "Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.",
        "api-error-publishfailed": "Ene Fähler es em ẞööver opjetrodde. En zweschejescheischerte Dattei kunnt nit öffentlesch jemaat wääde.",
-       "api-error-stasherror": "Ene Fähler es opjetrodde, wi mer di Dattei en der Bunker huh aam lahde wohre.",
-       "api-error-stashedfilenotfound": "Di Dattei wohd em Bunker nit jefonge, wi mer se vun doh huh lahde wullte.",
-       "api-error-stashpathinvalid": "Di Dattei wohd em Bunker nit jefonge, weil dä Pad do hen nit jeschtemmp hät.",
-       "api-error-stashfilestorage": "Ene Fähler es opjetrodd, wi mer di Dattei en der Bunker donn wullte.",
-       "api-error-stashzerolength": "Dä ẞööver kunnt di Dattei nit en der Bunker donn, weil en dä Dattei nix dren schtund.",
-       "api-error-stashnotloggedin": "Do moß enjelogg sin, öm huhjelahde Datteije en der Bunker ze donn.",
-       "api-error-stashwrongowner": "Di Dattei em Bunker woh De draan wells, di jehürt Der nit.",
-       "api-error-stashnosuchfilekey": "Dä Schlößel fö_di Dattei, woh De draan wells, em Bunker, di jidd_et nit.",
-       "api-error-timeout": "Dä ẞööver hät en dä jewennde Zick nit jeantwoot.",
-       "api-error-unclassified": "Ene Fähler es opjetrodde, der mer nit kenne.",
-       "api-error-unknown-code": "Nit bekannte Fähler: „$1“",
-       "api-error-unknown-error": "Fähler: Mer han et Huhlaade versöhk, ävver et es jät donävve jejange.",
+       "api-error-stashfailed": "Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.",
        "api-error-unknown-warning": "En onbikannte Warnong: $1",
        "api-error-unknownerror": "Ene onbikannte Fähler: „$1“",
-       "api-error-uploaddisabled": "Et Huhlaade es en heh däm Wiki nit zohjelohße.",
-       "api-error-verification-error": "Di Dattei künnt kappott sin, udder en verkehte Endong em Nahme han.",
        "duration-seconds": "{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}",
        "duration-minutes": "{{PLURAL:$1|ein&nbsp;Menot|$1&nbsp;Menotte|kein&nbsp;Menot}}",
        "duration-hours": "{{PLURAL:$1|en&nbsp;Schtond|$1&nbsp;Schtonde|kein&nbsp;Schtond}}",
index d0d2336..2180402 100644 (file)
@@ -47,7 +47,7 @@
        "tog-enotifrevealaddr": "Navnîşana enameya min di agahdariyên enameyan de nîşan bide",
        "tog-shownumberswatching": "Hejmara bikarhênerên dişopînin nîşan bide",
        "tog-oldsig": "Îmzeya heye:",
-       "tog-fancysig": "Di îmzeyê de girêdana otomatîk a bikarhêner betal bike",
+       "tog-fancysig": "Îmzeyê wek wîkîtekstê nîşan bide (bê girêdana otomatîk)",
        "tog-uselivepreview": "Pêşdîtina \"zindî\" bi kar bîne",
        "tog-forceeditsummary": "Hinga kurteyeke vala hate tomarkirin min agahdar bike",
        "tog-watchlisthideown": "Guherandinên min ji lîsteya şopandinê veşêre",
        "history": "Dîroka rûpelê",
        "history_short": "Dîrok",
        "updatedmarker": "ji serdana min a dawî ve hate rojanekirin",
-       "printableversion": "Guhertoya bo çapkirinê",
+       "printableversion": "Guhertoya çapkirinê",
        "permalink": "Girêdana daîmî",
        "print": "Çap",
        "view": "Bibîne",
        "note": "<strong>Nîşe:</strong>",
        "previewnote": "'''Ji bîr neke ku ev tenê pêşdîtinek e.'''\nGuhertinên te hê nehatine tomarkirin!",
        "continue-editing": "Here qada sazandinê",
-       "editing": "$1 tê guherandin",
-       "creating": "$1 tê çêkirin",
-       "editingsection": "Tê guherandin: $1 (beş)",
-       "editingcomment": "$1 (beşek nû) tê guherandin.",
+       "editing": "\"$1\" tê guherandin",
+       "creating": "\"$1\" tê çêkirin",
+       "editingsection": "\"$1\" (beş) tê guherandin",
+       "editingcomment": "\"$1\" (beşek nû) tê guherandin.",
        "editconflict": "Têkçûna guherandinan: $1",
        "explainconflict": "Ji dema te dest bi guherandinê kir heta niha kesekê/î din ev rûpel guherand.\nLi jor guhertoya heyî tê dîtîn.\nGuherandinên te li jêr tên nîşandan.\nDivê tu wan bikî yek.\nHeke niha tomar bikî, '''bi tenê''' nivîsara qutiya jor wê bê tomarkirin.",
        "yourtext": "Nivîsara te",
        "shown-title": "Li her rûpelê $1 {{PLURAL:$1|encam|encaman}} nîşan bide",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) nîşan bide",
        "searchmenu-exists": "'''Rûpeleke bi navê \"[[:$1]]\" li ser vê wîkiyê heye.'''",
-       "searchmenu-new": "<strong>Rûpela \"[[:$1]]\" çêke!</strong>{{PLURAL:$2|0=|See also the page found with your search.|Herwiha li encamên hatiye dîtin jî binêre.}}",
+       "searchmenu-new": "<strong>Rûpela \"[[:$1]]\" çêke!</strong> {{PLURAL:$2|0=|Herwiha li encama hatiye dîtin jî binêre.|Herwiha li encamên hatine dîtin jî binêre.}}",
        "searchprofile-articles": "Rûpelên naverokê",
        "searchprofile-images": "Multîmedya",
        "searchprofile-everything": "Her tişt",
        "saveprefs": "Tomar bike",
        "restoreprefs": "Hemû eyarên berê ji nû ve ava bike (di hemû beşa da)",
        "prefs-editing": "Guherandin",
-       "rows": "Rêz:",
-       "columns": "Stûn:",
        "searchresultshead": "Lê bigere",
        "recentchangesdays-max": "Herî zêde $1 {{PLURAL:$1|roj|rojan}}",
        "savedprefs": "Tercîhên te qeyd kirî ne.",
        "userrights-reason": "Sedem:",
        "userrights-no-interwiki": "Mafê te ji bo guherandina mafên bikarhênerên di Wîkiyên din de nîne.",
        "userrights-nodatabase": "Danegeh $1 nîne an ne ya vir e.",
-       "userrights-nologin": "Ji bo guherandina mafên bikarhêneran, divê tu bi hesabê rêveber [[Special:UserLogin|têkevî]].",
-       "userrights-notallowed": "Account'a te mafê xwe tune ye ji bo guherandina mafên bikarhêneran.",
        "userrights-changeable-col": "Komên ku tu dikarî biguherînî",
        "userrights-unchangeable-col": "Komên ku tu nikarî biguherînî",
        "group": "Kom:",
        "rcshowhideanons-show": "nîşan bide",
        "rcshowhideanons-hide": "veşêre",
        "rcshowhidepatr": "Guherandinên kontrolkirî $1",
-       "rcshowhidepatr-show": "Nîşan bide",
-       "rcshowhidepatr-hide": "Veşêre",
+       "rcshowhidepatr-show": "nîşan bide",
+       "rcshowhidepatr-hide": "veşêre",
        "rcshowhidemine": "Guherandinên min $1",
        "rcshowhidemine-show": "nîşan bide",
        "rcshowhidemine-hide": "veşêre",
        "unwatchthispage": "Êdî neşopîne",
        "notanarticle": "Ne gotar e",
        "watchlist-details": "{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.",
-       "wlheader-enotif": "Agahdariya E-nameyê pêk tê.",
+       "wlheader-enotif": "Agahdariya e-nameyan hate çalakkirin",
        "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
        "wlnote": "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
        "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya  nîşan bide",
        "protectedarticle": "parastî [[$1]]",
        "modifiedarticleprotection": "parastina \"[[$1]]\" guherand",
        "unprotectedarticle": "parastina \"[[$1]]\" rakir",
-       "protect-title": "parastina \"$1\" biguherîne",
+       "protect-title": "Parastina \"$1\" biguherîne",
        "prot_1movedto2": "Navê [[$1]] weke [[$2]] hate guhertin",
        "protect-norestrictiontypes-title": "Rûpela neparastbar",
        "protect-legend": "Parastinê bipesinîne",
        "sp-contributions-hideminor": "Guherandinên biçûk veşêre",
        "sp-contributions-submit": "Lêgerîn",
        "whatlinkshere": "Girêdanên li ser vê rûpelê",
-       "whatlinkshere-title": "Rûpelan, yê berve $1 tên",
+       "whatlinkshere-title": "Rûpelên ku yê berve \"$1\" tên",
        "whatlinkshere-page": "Rûpel:",
        "linkshere": "Ev rûpel tên ser vê rûpelê '''[[:$1]]''':",
        "nolinkshere": "Ne ji rûpelekê lînk tên ser '''[[:$1]]'''.",
        "ilsubmit": "Lêgerîn",
        "bydate": "li gor dîrokê",
        "sp-newimages-showfrom": "Daneyên nû ji dema $1, saet $2 ve bibîne",
+       "seconds-abbrev": "$1 s",
+       "hours-abbrev": "$1 st",
+       "days-abbrev": "$1 r",
+       "seconds": "{{PLURAL:$1|$1 saniye}}",
+       "hours": "{{PLURAL:$1|$1 saet|$1 saet}}",
+       "days": "{{PLURAL:$1|$1 roj}}",
        "weeks": "{{PLURAL:$1|$1 hefte}}",
        "months": "{{PLURAL:$1|$1 meh}}",
        "years": "{{PLURAL:$1|$1 sal}}",
        "hours-ago": "berî $1 {{PLURAL:$1|demjimêr|demjimêran}}",
        "variantname-ku-arab": "Tîpên erebî",
        "variantname-ku-latn": "Tîpên latînî",
-       "variantname-ku": "disable",
+       "variantname-ku": "Kurdî/کوردی",
        "metadata": "Daneyên meta",
        "metadata-expand": "Detayên dirêj nîşan bide",
        "metadata-collapse": "Detayên dirêj veşêre",
        "feedback-subject": "Mijar:",
        "feedback-submit": "Tomar bike",
        "feedback-thanks-title": "Spas!",
-       "searchsuggest-search": "Lêgerîn",
+       "searchsuggest-search": "Li ser {{SITENAME}} bigere",
        "searchsuggest-containing": "dihundirîne...",
-       "api-error-filename-tooshort": "Navê dosyeyê pir kurt e.",
-       "api-error-unclassified": "Çewtiyeke nenas pêk hat.",
-       "api-error-unknown-code": "Çewtiya nenas: \"$1\".",
        "api-error-unknownerror": "Çewtiya nenas: \"$1\".",
        "duration-years": "$1 {{PLURAL:$1|sal}}",
+       "duration-centuries": "$1 {{PLURAL:$1|sedsal}}",
        "expand_templates_output": "Encam",
        "expand_templates_ok": "Baş e",
        "expand_templates_preview": "Pêşdîtin",
index 5fcbfd1..bb1c25e 100644 (file)
        "searcharticle": "Säit",
        "history": "Historique vun der Säit",
        "history_short": "Versiounen",
+       "history_small": "Versiounen",
        "updatedmarker": "geännert zanter ech d'Säit fir d'lescht gekuckt hunn",
        "printableversion": "Drockversioun",
        "permalink": "Zitéierfäege Link",
        "views": "Affichagen",
        "toolbox": "Geschirkëscht",
        "tool-link-userrights": "{{GENDER:$1|Benotzer}}gruppen änneren",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Benotzer}}gruppe weisen",
        "tool-link-emailuser": "{{GENDER:$1|Dëser Benotzerin|Dësem Benotzer}} eng Mail schécken",
        "userpage": "Benotzersäit",
        "projectpage": "Meta-Text",
        "passwordreset-emaildisabled": "D'E-Mail-Funktioune goufen op dëser Wiki ausgeschalt.",
        "passwordreset-username": "Benotzernumm:",
        "passwordreset-domain": "Domaine:",
-       "passwordreset-capture": "D'Mail kucken?",
-       "passwordreset-capture-help": "Wann Dir dës Këscht ukräizt, gëtt de Mail (mam temporäre Passwuert) Iech gewisen an dem Benotzer geschéckt.",
        "passwordreset-email": "E-Mail-Adress:",
        "passwordreset-emailtitle": "Detailer vum Benotzerkont op{{SITENAME}}",
        "passwordreset-emailtext-ip": "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:\n\n$2\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
        "passwordreset-emailsentemail": "Wann dës E-Mailadress mat Ärem Benotzerkont assoziéiert ass, da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
        "passwordreset-emailsentusername": "Wann eng E-Mailadress mat dësem Benotzernumm associéiert ass, da gëtt Eng E-Mail fir d'Passwuert zeréckzesetze geschéckt.",
+       "passwordreset-ignored": "D'Zrécksetze vum Passwuert gouf net verschafft. Vläicht war de Fournisseur net agestallt?",
        "passwordreset-invalidemail": "Net-valabel E-Mail-Adress",
        "passwordreset-nodata": "Et gouf weder e Benotzernumm nach e Passwuert uginn",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
        "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.",
        "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.",
-       "summary-preview": "Resumé kucken ouni ofzespäicheren:",
-       "subject-preview": "Sujett kucken:",
+       "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.",
        "blockedtitle": "Benotzer ass gespaart",
        "blockedtext": "Äre Benotzernumm oder Är IP-Adress gouf gespaart.\n\nD'Spär gouf vum $1 gemaach. Als Grond gouf ''$2'' uginn.\n\n* Ufank vun der Spär: $8\n* Enn vun der Spär: $6\n* Spär betrëfft: $7\n\nDir kënnt den/d' $1 kontaktéieren oder ee vun den aneren [[{{MediaWiki:Grouppage-sysop}}|Administrateure]] fir iwwer d'Spär ze schwätzen.\n\nDëst sollt Der besonnesch maachen, wann Der d'Gefill hutt, datt de Grond fir d'Spären net bei Iech läit.\nD'Ursaach dofir ass an deem Fall, datt der eng dynamesch IP hutt, iwwer en Access-Provider, iwwer deen och aner Leit fueren.\nAus deem Grond ass et recommandéiert, sech e Benotzernumm zouzeleeën, fir all Mëssverständnes z'evitéieren.\n\nDir kënnt d'Funktioun \"Dësem Benotzer eng E-Mail schécken\" nëmme benotzen, wann Dir eng gëlteg E-Mail Adress bei Ären [[Special:Preferences|Astellungen]] aginn hutt.\nÄr aktuell IP-Adress ass $3 an d'Nummer vun der Spär ass #$5.\nSchreift all dës Informatioune w.e.g. bei all Ufro derbäi.",
        "search-interwiki-caption": "Schwësterprojeten",
        "search-interwiki-default": "Resultater vu(n) $1:",
        "search-interwiki-more": "(méi)",
+       "search-interwiki-more-results": "méi Resultater",
        "search-relatedarticle": "A Verbindung",
        "searchrelated": "a Verbindng",
        "searchall": "all",
        "saveprefs": "Späicheren",
        "restoreprefs": "All Standardastellungen zrécksetzen (an allen Abschnitter)",
        "prefs-editing": "Änneren",
-       "rows": "Zeilen",
-       "columns": "Kolonnen",
        "searchresultshead": "Sichen",
        "stub-threshold": "Maximum bei deem e Link nach ëmmer am Skizze-Format ($1) gewise gëtt:",
        "stub-threshold-sample-link": "Beispill",
        "prefs-help-recentchangescount": "Inklusiv Rezent Ännerungen, Versiounshistoriquen a Logbicher.",
        "prefs-help-watchlist-token2": "Dëst ass de geheime Schlëssel fir de Webfeed vun Ärer Iwwerwaachungslëscht. Jiddwereen deen e kennt kann Är Iwwerwaachungslëscht liesen, dofir sollt Dir en net weider ginn. [[Special:ResetTokens|Klickt hei wann Dir en zrécksetze musst]].",
        "savedprefs": "Är Astellunge goufe gespäichert.",
-       "savedrights": "D'Benotzerrechter vum {{GENDER:$1|$1}} goufe gespäichert.",
+       "savedrights": "D'Benotzergruppe vum {{GENDER:$1|$1}} goufe gespäichert.",
        "timezonelegend": "Zäitzon:",
        "localtime": "Lokalzäit:",
        "timezoneuseserverdefault": "De Standardwäert vun der Wiki ($1) benotzen",
        "youremail": "E-Mail-Adress:",
        "username": "{{GENDER:$1|Benotzernumm}}:",
        "prefs-memberingroups": "{{GENDER:$2|Member}} vun {{PLURAL:$1|der Benotzergrupp|de Benotzergruppen}}:",
+       "group-membership-link-with-expiry": "$1 (bis $2)",
        "prefs-registration": "Zäitpunkt vum Opmaache vum Benotzerkont:",
        "yourrealname": "Richtegen Numm:",
        "yourlanguage": "Sprooch:",
        "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-lookup-user": "Benotzergruppe verwalten",
+       "userrights-lookup-user": "E Benotzer eraussichen",
        "userrights-user-editname": "Benotzernumm uginn:",
-       "editusergroup": "{{GENDER:$1|Benotzer}}gruppen änneren",
+       "editusergroup": "Benotzergruppe lueden",
        "editinguser": "Ännere vun de Rechter vum  {{GENDER:$1|Benotzer}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Benotzergruppen änneren",
+       "userrights-editusergroup": "{{GENDER:$1|Benotzer}}gruppen änneren",
+       "userrights-viewusergroup": "{{GENDER:$1|Benotzer}}gruppe weisen",
        "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 derbäigesat ass oder gouf.",
+       "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-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.",
-       "userrights-nologin": "Dir musst mat engem Administrateurs-Benotzerkont [[Special:UserLogin|ageloggt sinn]], fir Benotzerrechter änneren ze kënnen.",
-       "userrights-notallowed": "Dir hutt net déi néideg Rechter fir Rechter vun anere Benotzer derbäizesetzen oder ewechzehuelen.",
        "userrights-changeable-col": "Gruppen déi Dir ännere kënnt",
        "userrights-unchangeable-col": "Gruppen déi Dir net ännere kënnt",
+       "userrights-expiry-current": "Bis $1",
+       "userrights-expiry-none": "Leeft net of",
+       "userrights-expiry": "Valabel bis:",
+       "userrights-expiry-othertime": "Aner Zäit:",
+       "userrights-expiry-options": "1 Dag:1 day,1 Woch:1 week,1 Mount:1 month,3 Méint:3 months,6 Méint:6 months,1 Joer:1 year",
        "userrights-conflict": "Konflikt bei de Benotzerrechter! Kuckt Är Ännerunge w.e.g. no a maacht se w.e.g. nach eng Kéier.",
-       "userrights-removed-self": "Dir hutt Är eege Rechter ewechgeholl. Dofir kënnt Dir net méi op dës Säit zougräifen.",
        "group": "Grupp:",
        "group-user": "Benotzer",
        "group-autoconfirmed": "Registréiert Benotzer",
        "right-siteadmin": "Datebank spären an d'Spär ophiewen",
        "right-override-export-depth": "Säiten exportéieren inklusiv de verlinkte Säite bis zu enger Déift vu 5",
        "right-sendemail": "Anere Benotzer E-Maile schécken",
-       "right-passwordreset": "Maile vum Zrécksetze vum Passwuert weisen",
        "grant-group-page-interaction": "Mat Säiten interagéieren",
        "grant-group-watchlist-interaction": "Mat Ärer Iwwerwaachungslëscht interagéieren",
        "grant-group-email": "E-Mail schécken",
        "action-upload_by_url": "Fichiere vun enger Internetadress (URL) eropzelueden",
        "action-writeapi": "d'API mat Schreifzougrëff ze benotzen",
        "action-delete": "dës Säit ze läschen",
-       "action-deleterevision": "dës Versioun ze läschen",
-       "action-deletedhistory": "d'Lëscht vun de geläschte Versiounen gesinn",
+       "action-deleterevision": "Versioune läschen",
+       "action-deletedhistory": "déi geläscht Versiounen vun enger Säit weisen",
+       "action-deletedtext": "geläschte Versiounstext weisen",
        "action-browsearchive": "no geläschte Säiten ze sichen",
-       "action-undelete": "dës Säit ze restauréieren",
-       "action-suppressrevision": "déi verstoppt Versioun kucken a restauréieren",
+       "action-undelete": "Säite restauréieren",
+       "action-suppressrevision": "verstoppt Versiounen nokucken a restauréieren",
        "action-suppressionlog": "dës privat Lëscht ze kucken",
        "action-block": "dëse Benotzer fir Ännerungen ze spären",
        "action-protect": "de Protektiounsstatus vun dëser Säit änneren",
        "action-userrights-interwiki": "d'Rechter vu Benotzer vun anere Wikien z'änneren",
        "action-siteadmin": "d'Datebank ze spären oder d'Spär opzehiewen",
        "action-sendemail": "Maile schécken",
+       "action-editmyoptions": "ännert Är Astellungen",
        "action-editmywatchlist": "ännert Är Iwwerwaachungslëscht",
        "action-viewmywatchlist": "kuckt Är Iwwerwaachungslëscht",
        "action-viewmyprivateinfo": "Är privat Informatioune kucken",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Weisen",
+       "rcfilters-activefilters": "Aktiv Filteren",
+       "rcfilters-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-filterlist-title": "Filteren",
+       "rcfilters-filterlist-noresults": "Keng Filtere fonnt",
+       "rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
+       "rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
+       "rcfilters-filter-editsbyother-label": "Ännerunge vun Aneren",
+       "rcfilters-filter-editsbyother-description": "Ännerunge vun anere Benotzer (net vun Iech).",
+       "rcfilters-filtergroup-userExpLevel": "Niveau vun der Erfahrung (just fir registréiert Benotzer)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Neier",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Manner wéi 10 Ännerungen a manner wéi 4 Deeg Aktivitéit.",
+       "rcfilters-filter-userExpLevel-learner-label": "Ufänger",
+       "rcfilters-filter-userExpLevel-learner-description": "Aktivitéit vu méi Deeg a méi Ännerunge wéi ''Nei Benotzer'' awer manner wéi ''Erfuere Benotzer''.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfuere Benotzer.",
+       "rcfilters-filter-userExpLevel-experienced-description": "Méi wéi 30 Deeg Aktivitéit a méi wéi 500 Ännerungen.",
+       "rcfilters-filter-minor-label": "Kleng Ännerungen",
+       "rcfilters-filter-major-label": "Keng kleng Ännerungen",
+       "rcfilters-filter-pageedits-label": "Säitenännerungen",
        "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter <strong>$3, $4</strong> (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfrom": "Nei Ännerunge vum $3 $2 u weisen",
        "rcshowhideminor": "Kleng Ännerunge $1",
        "uploadscripted": "An dësem Fichier ass HTML- oder Scriptcode, dee vun engem Webbrowser falsch interpretéiert kéint ginn.",
        "upload-scripted-pi-callback": "Et ass net méiglech XML-Fichieren eropzelueden an deenen XML-Stylesheet Instruktioune fir d'Verschaffen drastinn",
        "uploaded-hostile-svg": "Net sécheren CSS am Stilelement vum eropgeluedene SVG-Fichier fonnt.",
-       "uploadscriptednamespace": "An dësem SVG-Fichier ass en illegalen Nummraum \"$1\"",
+       "uploaded-image-filter-svg": "Bildfilter mat der URL: <code>&lt;$1 $2=\"$3\"&gt;</code> am eropgeluedenen SVG-Fichier fonnt.",
+       "uploadscriptednamespace": "An dësem SVG-Fichier ass en illegalen Nummraum \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Den XML am eropgelueden Fichier konnt net verschafft ginn.",
        "uploadvirus": "An dësem Fichier ass ee Virus! Detailer: $1",
        "uploadjava": "An dësem ZIP-Fichier ass e JAVA CLASS-Fichier dran.\nD'Eropluede vu JAVA-Fichieren ass net erlaabt, well si d'Ëmgoe vu Sécherheetsmoossnamen erméigleche kënnen.",
        "apisandbox": "API-Sandkëscht",
        "apisandbox-jsonly": "Fir d'API-Sandkëscht ze benotze braucht Dir JavaScript.",
        "apisandbox-api-disabled": "API ass op dësem Site ausgeschalt.",
+       "apisandbox-fullscreen": "Panel expandéieren",
        "apisandbox-unfullscreen": "Säit weisen",
        "apisandbox-submit": "Ufro maachen",
        "apisandbox-reset": "Eidel maachen",
        "apisandbox-sending-request": "Schécke vun der API-Ufro...",
        "apisandbox-loading-results": "Ofruffe vun den API-Resultater...",
        "apisandbox-request-url-label": "URL fir Ufroen:",
+       "apisandbox-request-json-label": "JSON-Ufro:",
        "apisandbox-request-time": "Dauer vun der Ufro: {{PLURAL:$1|$1 ms}}",
        "apisandbox-alert-page": "Felder op dëser Säit sinn net valabel.",
        "apisandbox-alert-field": "De wäert vun dësem Feld ass net valabel.",
        "apisandbox-continue": "Virufueren",
        "apisandbox-continue-clear": "Eidel maachen",
+       "apisandbox-param-limit": "Gitt <kbd>max</kbd> fir déi maximal Limite ze benotzen.",
+       "apisandbox-multivalue-all-namespaces": "$1 (All Nummräim)",
+       "apisandbox-multivalue-all-values": "$1 (All Wäerter)",
        "booksources": "Bicherreferenzen",
        "booksources-search-legend": "No Bicherreferenze sichen",
        "booksources-search": "Sichen",
        "activeusers-count": "$1 {{PLURAL:$1|Aktioun|Aktiounen}} {{PLURAL:$3|gëschter|an de leschten $3 Deeg}}",
        "activeusers-from": "Benotzer weisen, ugefaange bei:",
        "activeusers-groups": "Benotzer weisen déi zu de Gruppe gehéieren:",
+       "activeusers-excludegroups": "Benotzer ausschléissen déi zu de Gruppe gehéieren:",
        "activeusers-noresult": "Keng Benotzer fonnt.",
        "activeusers-submit": "Aktiv Benotzer weisen",
        "listgrouprights": "Rechter vun de Benotzergruppen",
        "emailccsubject": "Kopie vun denger Noriicht un $1: $2",
        "emailsent": "E-Mail geschéckt",
        "emailsenttext": "Är E-Mail gouf fortgeschéckt.",
-       "emailuserfooter": "Dës E-Mail gouf  {{GENDER:$1|vum}} $1  {{GENDER:$2|dem}} $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailuser}}\" op {{SITENAME}} benotzt.",
+       "emailuserfooter": "Dës E-Mail gouf {{GENDER:$1|vum}} $1  {{GENDER:$2|dem}} $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailuser}}\" op {{SITENAME}} benotzt.Wann {{GENDER:$2|Dir}} op dës E-Mail äntwert, gëtt {{GENDER:$2|Är}} E-Mail direkt un den {{GENDER:$1|originalen Absender}} geschéckt dobäi gesäit {{GENDER:$1|deen}} {{GENDER:$2|Är}} E-Mail-Adress.",
        "usermessage-summary": "Benoriichtegung hannerloossen.",
        "usermessage-editor": "Benoriichtegungs-System",
        "watchlist": "Iwwerwaachungslëscht",
        "changecontentmodel-nodirectediting": "Den Inhaltsmodell $1 ënnerstëtzt keng direkt Ännerungen",
        "changecontentmodel-emptymodels-title": "Keng Modeller fir Inhalter disponibel",
        "changecontentmodel-emptymodels-text": "Den Inhalt vu(n) [[:$1]] kann net op een aneren Typ ëmgewandelt ginn.",
-       "log-description-contentmodel": "Evenementer a Relatioun mat den Inhaltsmodeller vun enger Säit",
+       "log-description-contentmodel": "OP dëser Säit stinn Ännerunge vum Inhaltsmodell vu Säiten a Säiten déi mat engem anere Säitmodell wéi dem Standard ugeluecht goufen.",
        "logentry-contentmodel-change-revertlink": "zrécksetzen",
        "logentry-contentmodel-change-revert": "zrécksetzen",
        "protectlogpage": "Protektiounslogbuch",
        "cant-move-to-user-page": "Dir hutt net d'Recht fir eng Säit op eng Benotzersäit (ausser op eng Ënnersäit vun enger Benotzersäit) ze réckelen.",
        "cant-move-category-page": "Dir hutt net déi néideg Rechter fir Kategorie-Säiten ze réckelen.",
        "cant-move-to-category-page": "Dir hutt net déi néideg Rechter fir eng Säit op eng Kategoriesäit ze réckelen.",
+       "cant-move-subpages": "Dir hutt net d'Recht fir Ënnersäiten ze réckelen.",
        "newtitle": "Neien Titel:",
        "move-watch": "Dës Säit iwwerwaachen",
        "movepagebtn": "Säit réckelen",
        "pageinfo-length": "Gréisst vun der Säit (a Bytes)",
        "pageinfo-article-id": "ID (Nummer) vun der Säit",
        "pageinfo-language": "Sprooch vum Inhalt vun der Säit",
+       "pageinfo-language-change": "änneren",
        "pageinfo-content-model": "Modell vun enger Säit mat Inhalt",
        "pageinfo-content-model-change": "änneren",
        "pageinfo-robot-policy": "Indexéierung duerch Botten",
        "svg-long-error": "Ongëltegen SVG-Fichier: $1",
        "show-big-image": "Original Fichier",
        "show-big-image-preview": "Gréisst vun dësem Preview: $1.",
+       "show-big-image-preview-differ": "Gréisst vun dësem $3-Preview vun dësem $2-Fichier: $1.",
        "show-big-image-other": "Aner {{PLURAL:$2|Opléisung|Opléisungen}}: $1.",
        "show-big-image-size": "$1 × $2 Pixel",
        "file-info-gif-looped": "endlos Schleef",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
        "newimages-showbots": "Vu Botten eropgeluede Fichiere weisen",
+       "newimages-hidepatrolled": "Nogekuckt Fichiere verstoppen",
        "noimages": "Keng Biller fonnt.",
        "ilsubmit": "Sichen",
        "bydate": "no Datum",
        "bad_image_list": "Format:\n\nNëmmen Zeilen, déi mat engem * ufänken, ginn ausgewäert. Als éischt no dem * muss ee Link op een net gewënscht Bild stoen.\nDuerno sti Linken déi Ausnamen definéieren, an deenen hirem Kontext dat Bild awer opdauchen däerf.",
        "metadata": "Metadaten",
        "metadata-help": "An dësem Fichier si weider Informatiounen, déi normalerweis vun der Digitalkamera oder dem benotzte Scanner kommen. Wann de Fichier nodréiglech geännert gouf, kann et sinn datt eenzel Detailer net mat dem aktuelle Fichier iwwereneestëmmen.",
-       "metadata-expand": "Weis detailléiert Informatiounen",
-       "metadata-collapse": "Verstopp detailléiert Informatiounen",
+       "metadata-expand": "Detailléiert Informatioune weisen",
+       "metadata-collapse": "Detailléiert Informatioune verstoppen",
        "metadata-fields": "D'Bild-Meta-Felder aus dëser Lëscht ginn op Bildbeschreiwungssäite gewise wann d'Metadatentafel zesummegeklappt ass.\nDéi aner sinn am Standard verstoppt.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Breet",
        "exif-imagelength": "Längt",
        "tags-edit-add": "Dës Markéierungen (tags) dobäisetzen:",
        "tags-edit-remove": "Dës Markéierungen (tags) ewechhuelen:",
        "tags-edit-remove-all-tags": "(all Markéierungen ewechhuelen)",
+       "tags-edit-chosen-placeholder": "E puer Markéierungen (tags) eraussichen",
        "tags-edit-chosen-no-results": "Keng Markéierunge fonnt déi passen",
        "tags-edit-reason": "Grond:",
        "tags-edit-revision-submit": "Ännerungen op {{PLURAL:$1|dës Versioun|$1 Versiounen}} uwennen",
        "htmlform-user-not-exists": "<strong>$1</strong> gëtt et net.",
        "htmlform-user-not-valid": "<strong>$1</strong> ass kee valabele Benotzernumm.",
        "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
+       "logentry-delete-delete_redir": "$1 huet d'Viruleedung $3 duerch Iwwerschreiwe {{GENDER:$2|geläscht}}.",
        "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
        "logentry-delete-event": "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
        "logentry-delete-revision": "$1 huet d'Visibilitéit {{PLURAL:$5|vun enger Versioun|vu(n) $5 Versiounen}} op der Säit $3:$4 {{GENDER:$2|geännert}}",
        "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",
        "feedback-bugcheck": "Super! Kuckt just no ob et net ee vun de scho [$1 bekannte Feeler] ass.",
        "feedback-useragent": "User Agent:",
        "searchsuggest-search": "Op {{SITENAME}} sichen",
        "searchsuggest-containing": "mat ...",
-       "api-error-autoblocked": "Är IP-Adress gouf automatesch gespaart wëll se vun engem gespaarte Benotzer  benotzt gouf",
-       "api-error-badaccess-groups": "Et ass Iech net erlaabt fir Fichieren op dës Wiki eropzelueden.",
        "api-error-badtoken": "Interne Feeler: falschen Token.",
-       "api-error-blocked": "Dir gouft gespaart a  kënnt dofir keng Ännerunge maachen.",
-       "api-error-copyuploaddisabled": "D'Eroplueden iwwer eng URL ass op dësem Server desaktivéiert.",
-       "api-error-duplicate": "Et gëtt schonn {{PLURAL:$1|en anere Fichier|e puer aner Fichiere}} mat dem selwechten Inhalt op dem Site",
-       "api-error-duplicate-archive": "Et gouf schonn {{PLURAL:$1| een anere Fichier|e puer aner Fichieren}} op dem Site mat deemselwechten Inhalt, {{PLURAL:$1|e gouf|se goufen}} awer geläscht.",
-       "api-error-empty-file": "De Fichier deen Dir geschéckt hutt war eidel.",
        "api-error-emptypage": "Et ass net erlaabt nei, eidel Säiten unzeleeën.",
-       "api-error-fetchfileerror": "Interne Feeler: beim Opruffe vum Fichier huet eppes net funktionéiert.",
-       "api-error-fileexists-forbidden": "E Fichier mam Numm \"$1\" gëtt et schonn an e kann net iwwerschriwwe ginn.",
-       "api-error-fileexists-shared-forbidden": "E Fichier mam Numm \"$1\" gëtt et schonn am gedeelte Repertoire an e kann net iwwerschriwwe ginn.",
-       "api-error-file-too-large": "De Fichier deen Dir geschéckt hutt war ze grouss.",
-       "api-error-filename-tooshort": "Den Numm vum Fichier ass ze kuerz.",
-       "api-error-filetype-banned": "Dësen Typ vu Fichier ass net zougelooss.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ass e Fichiersformat deen net erlaabt ass|si Fichiersformater déi net erlaabt sinn}}. Erlaabt {{PLURAL:$3|ass de Fichiersformat|sinn d'Fichiersformater}}: $2.",
-       "api-error-filetype-missing": "D'Erweiderung vum Fichier feelt.",
-       "api-error-hookaborted": "D'Ännerung déi Dir versicht hutt ze maachen ass duerch en 'extension-hook' ofgebrach ginn.",
-       "api-error-http": "Interne Feeler: net méiglech sech op de Server ze connectéieren.",
-       "api-error-illegal-filename": "Den Numm vum Fichier ass net erlaabt.",
-       "api-error-internal-error": "Interne Feeler: Et ass eppes schif gaang beim Verschaffe vum eropgeluedene Fichier op der Wiki.",
-       "api-error-invalid-file-key": "Interne Feeler: de Fichier gouf op der temporärer Späicherplaz net fonnt.",
-       "api-error-missingparam": "Interne Feeler: E vun de Parameter feelt an der Ufro.",
-       "api-error-missingresult": "Interne Feeler: et konnt net festgestallt ginn ob d'Kopie eppes ginn ass.",
-       "api-error-mustbeloggedin": "Dir musst ageloggt si fir Fichieren eropzelueden.",
-       "api-error-mustbeposted": "An dëser Software ass e Feeler; se benotzt net déi richteg HTTP-Method.",
-       "api-error-noimageinfo": "D'Eroplueden huet funktionéiert, awer de Server huet eis keng Informatiounen iwwer de Fichier ginn.",
-       "api-error-nomodule": "Interne Feeler: de Modul fir d'Eroplueden ass net agestallt.",
-       "api-error-ok-but-empty": "Interne Feeler: keng Äntwert vum Server.",
-       "api-error-overwrite": "D'Iwwerschreiwe vun engem Fichier ass net erlaabt.",
-       "api-error-ratelimited": "Dir probéiert fir méi ££Fichieren a kuerzer Zäit eropzeluede wéi der op dëser Wiki erlaabt sinn. Probéiert w.e.g. an e puer Minutten nach eng Kéier.",
-       "api-error-stashfailed": "Interne Feeler: de Server konnt den temporäre Fichier net späicheren.",
        "api-error-publishfailed": "Interne Feeler: de Server konnt den temporäre Fichier net publizéieren.",
-       "api-error-stasherror": "Beim Eropluede vum Fichier ass e Feeler geschitt.",
-       "api-error-stashfilestorage": "Beim Späichere vum Fichier ass ee Feeler geschitt.",
-       "api-error-stashzerolength": "De Server konnt de Fichier net späicheren, well en eng Längt vun Null hat.",
-       "api-error-stashnotloggedin": "Dir musst ageloggt si fir Fichiere späicheren ze kënnen.",
-       "api-error-timeout": "De Server huet net bannen där Zäit geäntwert déi virgesinn ass.",
-       "api-error-unclassified": "En onbekannte Feeler ass geschitt",
-       "api-error-unknown-code": "Onbekannte Feeler: \"$1\"",
-       "api-error-unknown-error": "Interne Feeler: beim Versuch fir Äre Fichier eropzelueden ass eppes schif gaang",
-       "api-error-unknown-warning": "Onbekannte Warnung: $1",
+       "api-error-stashfailed": "Interne Feeler: de Server konnt den temporäre Fichier net späicheren.",
+       "api-error-unknown-warning": "Onbekannte Warnung: \"$1\".",
        "api-error-unknownerror": "Onbekannte Feeler: \"$1\".",
-       "api-error-uploaddisabled": "D'Eroplueden ass op dëser Wiki ausgeschalt.",
-       "api-error-verification-error": "Dëse Fichier kéint korrupt sinn, oder en huet eng falsch Erweiderung.",
-       "api-error-was-deleted": "E Fichier mat dësem Numm gouf virdrun eropgelueden an duerno geläscht.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekonn|Sekonnen}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minutt|Minutten}}",
        "duration-hours": "$1 {{PLURAL:$1|Stonn|Stonnen}}",
        "pagelang-language": "Sprooch",
        "pagelang-use-default": "Standard-Sprooch benotzen",
        "pagelang-select-lang": "Sprooch eraussichen",
+       "pagelang-reason": "Grond",
        "pagelang-submit": "Späicheren",
+       "pagelang-nonexistent-page": "D'Säit $1 gëtt et net.",
+       "pagelang-unchanged-language": "D'Säit $1 ass schonn op d'Sprooch $2 gesat.",
+       "pagelang-unchanged-language-default": "D'säit $1 ass schonn op d'Standardsprooch vun dëser Wiki agestallt.",
+       "pagelang-db-failed": "D'Datebank konnt d'Sprooch vun der Säit net änneren.",
        "right-pagelang": "Sprooch vun der Säit änneren",
        "action-pagelang": "d'Sprooch vun der Säit änneren",
        "log-name-pagelang": "Log vum Ännere vun der Sprooch",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en dash",
+       "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "Minus-Zeechen",
        "mw-widgets-dateinput-no-date": "Keen Datum erausgesicht",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "No Medie sichen",
+       "mw-widgets-mediasearch-noresults": "Näischt fonnt.",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
        "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...",
        "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.",
        "randomrootpage": "Zoufalls-Stammsäit",
        "log-action-filter-block": "Typ vun der Spär:",
+       "log-action-filter-contentmodel": "Ännerung vum Typ vum Modell vum Inhalt:",
        "log-action-filter-delete": "Läschtyp:",
        "log-action-filter-import": "Importtyp:",
        "log-action-filter-move": "Réckeltyp:",
        "log-action-filter-block-block": "Spären",
        "log-action-filter-block-reblock": "Ännere vun enger Spär",
        "log-action-filter-block-unblock": "Spär ophiewen",
+       "log-action-filter-contentmodel-change": "Ännerung vum Modell vum Inhalt",
        "log-action-filter-delete-delete": "Säite läschen",
+       "log-action-filter-delete-delete_redir": "Viruleedung iwwerschreiwen",
        "log-action-filter-delete-restore": "Säiterestauratioun",
        "log-action-filter-delete-event": "Logbuch-Läschung",
        "log-action-filter-delete-revision": "Läsche vun enger Versioun",
        "authform-wrongtoken": "Falschen Token",
        "specialpage-securitylevel-not-allowed-title": "Net erlaabt",
        "specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
+       "authpage-cannot-create-continue": "Onméiglech fir mam Uleeë vum Benotzerkont virunzefueren. Är Sessioun hat wahrscheinlech en Timeout.",
+       "authpage-cannot-link": "D'Linke mam Benotzerkont konnt net ugefaange ginn.",
        "cannotauth-not-allowed-title": "Autorisatioun refuséiert",
        "cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
        "changecredentials-submit": "Idendifikatiounsinformatiounen änneren",
        "linkaccounts": "Benotzerkonte verbannen",
        "linkaccounts-success-text": "De Benotzerkont gouf verlinkt.",
        "linkaccounts-submit": "Benotzerkonte verbannen",
+       "unlinkaccounts": "Benotzerkonten trennen",
+       "unlinkaccounts-success": "De Benotzerkont gouf getrennt.",
        "userjsispublic": "DEnkt drun: Op JavaScript-Ënnersäite solle keng vertraulech Informatioune stoe well se vun anere Benotzer kënne gesi ginn.",
        "restrictionsfield-badip": "Net valabel IP-Adress oder Beräich: $1",
        "restrictionsfield-label": "Zougeloossen IP-Beräicher:",
-       "edit-error-short": "Feeler: $1",
-       "edit-error-long": "Feeler:\n\n$1"
+       "revid": "Versioun $1"
 }
index a497488..3bf5384 100644 (file)
        "actions": "Крар",
        "namespaces": "ТӀварарин генгвилер",
        "variants": "Жуьреяр",
+       "navigation-heading": "Навигация",
        "errorpagetitle": "ГъалатӀ",
        "returnto": "$1 ччиниз элкъвена хтун",
        "tagline": "{{SITENAME}} Cайтдихъай",
        "nstab-template": "Чешне",
        "nstab-help": "Куьмекдин ччин",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Кьилин чин",
        "nosuchaction": "Ихьтин кар авайд ттуш",
        "nosuchspecialpage": "Ихьтин куьмекчи ччин авайд ттуш",
        "error": "ГъалатӀ",
        "emailconfirmlink": "Куь электрон почтунин адрес тестикьун.",
        "accountcreated": "Аккаунт туькӀуьрнава",
        "loginlanguagelabel": "ЧӀал: $1",
+       "pt-login": "Гьахьун",
+       "pt-createaccount": "Аккаунт туькӀуьрун",
+       "pt-userlogout": "ЭкъечӀун",
        "changepassword": "Парол дегишарун",
        "resetpass_header": "Аккаунтдин парол дегишун",
        "oldpassword": "ЦӀуру парол:",
        "prevn": "Вилик фейи  {{PLURAL:$1|$1}}",
        "nextn": "Гуьгъуьнин {{PLURAL:$1|$1}}",
        "prevn-title": "Вилик фейи  $1 {{PLURAL:$1|1=нетижа|нетижаяр}}",
-       "nextn-title": "КЪведай $1 {{PLURAL:$1|1=нетижа|нетижаяр}}",
+       "nextn-title": "Къведай $1 {{PLURAL:$1|1=нетижа|нетижаяр}}",
        "shown-title": "Къалурин $1 {{PLURAL:$1|1=нетижа|нетижаяр}} чъина",
        "viewprevnext": "Килигун ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''И вики-проектда \"[[:$1]]\" тlвар алай ччин ава.'''",
        "saveprefs": "Хуьн",
        "restoreprefs": "Авайл хьиз кьунвай низамарунар туькIуьр хъувун",
        "prefs-editing": "Дуьзар хъувун",
-       "rows": "ЦIарар",
-       "columns": "Гулар:",
        "searchresultshead": "Ахтармишун",
        "stub-threshold-disabled": "Галуднава",
        "timezonelegend": "Вахтунин минзил",
        "newpageletter": "Цl",
        "boteditletter": "б",
        "rc_categories_any": "ГЬар са",
+       "rc-change-size-new": "Масакlа авунилай ахпа кьадар: $1 байт",
        "rc-enhanced-expand": "Куьлуь-шуьлуьяр къалурун (JavaScript герекзава)",
        "rc-enhanced-hide": "Куьлуь-шуьлуьяр чуьнуьха",
        "recentchangeslinked": "Галкlанвай дуьзар хъувунар",
        "brokenredirects-edit": "дуьзар хъувун",
        "brokenredirects-delete": "алудун",
        "withoutinterwiki-submit": "Къалурун",
-       "nbytes": "$1 {{PLURAL:$1|1=байт|байтар}}",
+       "nbytes": "$1 {{PLURAL:$1|байт|байт}}",
        "nmembers": "$1 {{PLURAL:$1|1=уьзви|уьзвияр}}",
        "lonelypages": "Eтим xъувун",
        "prefixindex": "Префикс галай вири ччинар",
        "suppress": "Чуьнуьхун",
        "booksources": "Ктабрин чешмеяр",
        "booksources-search-legend": "Ктабдикай малумат жугъурун",
+       "magiclink-tracking-isbn": "ISBN элячӀуникай менфят къачузвай чинар",
        "log": "Журналар",
        "allpages": "Вири ччинар",
        "prevpage": "Алатай чар ($1)",
        "namespace": "Тlварарин генгвал:",
        "invert": "Хкягънавайди элкъуьрун",
        "blanknamespace": "(Асул)",
-       "contributions": "Уртахди кутур крар",
+       "contributions": "{{GENDER:$1|Уртахдин}} кутур крар",
        "contributions-title": "$1 уртахди кутур крар",
        "mycontris": "Кутур кар",
+       "anoncontribs": "Кутур кар",
        "contribsub2": "($1)-ин кутур пай  ($2)",
        "uctop": "алай",
        "month": " Вацралай (ва адалай вилик)",
        "tooltip-pt-mycontris": "Куьне авунвай дуьзар хъувунрин сиягь",
        "tooltip-pt-login": "Квез гьахьиз теклифзава, анжах им мажбури туш",
        "tooltip-pt-logout": "ЭкъечIун",
+       "tooltip-pt-createaccount": "Им мажбури туштlани, чна квез учетдин кхьей затlар туькlуьриз ва системадиз гьахьиз теклифзава.",
        "tooltip-ca-talk": "Къене авайбурун ччин веревирд авун",
-       "tooltip-ca-edit": "Ð\9aвевай Ð¸ Ñ\87Ñ\87ин Ð¼Ð°Ñ\81акIа Ð¸Ð¹Ð¸Ð· Ð¶ÐµÐ´Ð°. Ð§Ñ\87ин Ñ\85Ñ\83Ñ\8cдалди Ð²Ð¸Ð»Ð¸Ðº, Ñ\81иÑ\84Ñ\82е ÐºÐ¸Ð»Ð¸Ð³Ñ\83ндиз Ð¸Ð»Ð¸Ñ\81.",
+       "tooltip-ca-edit": "Ð\98 Ñ\87Ñ\87ин Ð´Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вÑ\83н",
        "tooltip-ca-addsection": "Гатlунив цlийи кьил",
        "tooltip-ca-viewsource": "И ччин хвенвайд я, амма квевай адан къене авайбуруз килигиз жеда.",
        "tooltip-ca-history": "И ччинин алатай масакIавилерин журнал",
        "tooltip-rollback": "«Кьулухъди чӀугун» и ччиндиз эхиримжи кар кутазвайди патай авунвай дуьзар хъувунар са тӀампуналди paxкурзава",
        "tooltip-undo": "«Гьич авун»  авунвай дуьзар хъувун paxкурзава ва сифтедин килигунин режимда  дуьзар хъувундин форма ахъа йийзва. Им нетижадиз себеб алава йийз мумкинвал гузва",
        "tooltip-summary": "Куьруь нетижа гьадрун",
+       "simpleantispam-label": "Анти-спам юхламишун.\nИнал ацlур <strong>мийир</strong>!",
        "pageinfo-header-edits": "Дуьзар хъувун",
        "pageinfo-edits": "Дьузар хъувунрин кьадар",
+       "pageinfo-toolboxlink": "Чиникай малумат",
        "previousdiff": "Вилик алатай дуьзар хъувун",
        "nextdiff": "ЦIийи масакIаяр",
        "file-info-size": "$1 × $2 пикселар, файлдин кьадар: $3, MIME жуьре: $4",
        "file-nohires": "Идалайни хъсан ери авайд туш",
        "svg-long-desc": "SVG файл, номилдаказ $1 $2 × пикселяр, файлдин кьадар: $3",
        "show-big-image": "ЦӀарафа хвена тунвай жергедай",
+       "show-big-image-size": "$1 × $2 пиксел",
        "bad_image_list": "Формат гьихьтинди хьана кlанда:\n\nCиягьда авай анжах (* лишандихъ галаз эгечIзавай цIарарин) элементар гьисабдиз къачуда.\nЦlарцIе авай сад лагьай элячIун ттун патал къадагъа алай шикилдиз элячIун хьана кlанзава.\nГьар са цlарцIе авай гьар са ахпагьан элячIунар кьетIендинбур хьиз кьабулда, мисал яз, суьрет тваз мумкинвал авай ччинар.",
        "metadata": "Метамалуматар",
        "metadata-help": "И файлдин къене гилигнавай адет яз камера ва я сканер куьмекдалди алава авунвай  малумат ава. Файл ахпа дуьзур хъувуначтlа, бязи параметрар алай суьретдив кьун тахьун мумкин я.",
        "logentry-move-move-noredirect": "$1 $3 макъаладин тӀвар, ракъурунин винелай $4 -диз масакӀа хъувуна",
        "logentry-move-move_redir": "$1 $3 макъаладин тӀвар, ракъурун тун тавуна $4 -диз масакӀа хъувуна",
        "logentry-move-move_redir-noredirect": "$1 $3 макъаладин тӀвар, ракъурун тун тавуна ва ракъурунин винелай $4 -диз масакӀа хъувуна",
+       "logentry-newusers-create": "$1 уртахди гьисаб туькlуьрнава.",
        "logentry-newusers-autocreate": "Уртахдин $1 учётдин кхьин автоматиквилели туькӀуьр хьанва",
        "rightsnone": "(садни)",
        "feedback-cancel": "Гьич авун",
        "feedback-close": "Авунва",
        "feedback-message": "Чар:",
        "feedback-subject": "Тема:",
+       "searchsuggest-search": "{{SITENAME}} къекъуьн",
        "expand_templates_xml_output": "XML акъудун",
        "expand_templates_ok": "ОК",
        "expand_templates_remove_comments": "Баянар алудун"
index 3a8e61b..1d786c2 100644 (file)
@@ -6,38 +6,62 @@
                        "Malafaya",
                        "Reedy",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Katxis",
+                       "Chabi"
                ]
        },
        "tog-underline": "Sulinia lias:",
        "tog-hideminor": "Asconda editas minor en cambias resente",
+       "tog-hidepatrolled": "Asconde editas patruliada de cambias resente",
+       "tog-newpageshidepatrolled": "Asconde pajes patruliada de lista de pajes nova",
+       "tog-hidecategorization": "Asconde categori de pajes",
        "tog-extendwatchlist": "Grandi la lista oservada per mostra tota cambias aplicable",
        "tog-usenewrc": "Aumenta cambias resente (JavaScript)",
        "tog-numberheadings": "Dona automatica numeros a titula",
        "tog-showtoolbar": "Mostra la bara de utiles per edita (JavaScript)",
        "tog-editondblclick": "Edita pajes a du clicas (JavaScript)",
        "tog-editsectiononrightclick": "Engrana la edita de sesion par clica a la destra a titulos de sesion (JavaScript)",
-       "tog-watchcreations": "Junta la pajes ce me ia creada a me lista de pajes oservada",
-       "tog-watchdefault": "Junta pajes ce me ia edita a me lista de pajes oservada",
-       "tog-watchmoves": "Junta pajes ce me ia moveda a me lista de pajes oservada",
-       "tog-watchdeletion": "Junta pajes ce me ia sutrae a me lista de pajes oservada",
+       "tog-watchcreations": "Junta la pajes cual me ia crea e fixes cual me ia carga  a mea lista de pajes oservada",
+       "tog-watchdefault": "Junta pajes e imajes cual me ia edita a mea lista de pajes oservada",
+       "tog-watchmoves": "Junta pajes e fixes cual me ia moveda a mea lista de pajes oservada",
+       "tog-watchdeletion": "Junta pajes cual me ia sutrae a mea lista de pajes oservada",
+       "tog-watchuploads": "Ajunta fixes nova cual me ia carga a mea lista de pajes oservada",
+       "tog-watchrollback": "Ajunta pajes a cual me ia reversa a mea lista de pajes oservada",
        "tog-minordefault": "Marca costumal tota editas como minor",
        "tog-previewontop": "Mostra la previde ante la caxa de editas",
        "tog-previewonfirst": "Mostra la previde a la edita prima",
-       "tog-enotifwatchlistpages": "Envia un eposta a me cuando un paje ce me oserva es cambiada",
+       "tog-enotifwatchlistpages": "Envia un eposta a me cuando un paje o fix cual me oserva es cambiada",
        "tog-enotifusertalkpages": "Envia me un eposta cuando me paje de discutes es cambiada",
-       "tog-enotifminoredits": "Ance envia un eposta a me con edita minor de pajes",
+       "tog-enotifminoredits": "Ance envia un eposta a me con editas minor de pajes e fixes",
        "tog-enotifrevealaddr": "Descovre la me adirije de eposta en postas de nota",
        "tog-shownumberswatching": "Mostra la numero de usores oservante",
-       "tog-fancysig": "Sinias simple (sin lia automatica)",
+       "tog-oldsig": "Tua suscrive presente",
+       "tog-fancysig": "Trata la suscrive como vicitesto (sin lia automatica)",
+       "tog-uselivepreview": "Usa un previde direta",
+       "tog-forceeditsummary": "Recorda me cuando entera un resoma vacua de edita",
        "tog-watchlisthideown": "Asconde me editas de la lista de pajes oservada",
        "tog-watchlisthidebots": "Asconde editas par bot de la lista de pajes oservada",
        "tog-watchlisthideminor": "Asconde editas minor de la lista de pajes oservada",
+       "tog-watchlisthideliu": "Asconde editas par usores identifiada de la lista de pajes oservada",
+       "tog-watchlistreloadautomatically": "Recarga automata la lista de pajes oservada cuando un filtre es cambiada (JavaScript nesesada)",
+       "tog-watchlisthideanons": "Asconde editas par usores anonim de la lista de pajes oservada",
+       "tog-watchlisthidepatrolled": "Asconde editas patruliada de la lista de pajes oservada",
+       "tog-watchlisthidecategorization": "Asconde la categori de pajes",
        "tog-ccmeonemails": "Envia copias de la epostas ce me envia a otras a me ance",
+       "tog-diffonly": "No mostra la conteni de paje su diffes",
        "tog-showhiddencats": "Mostra categorias ascondeda",
+       "tog-norollbackdiff": "No mostra diff pos un reversa",
+       "tog-useeditwarning": "Avisa me cuando me sorti un paje de edita con cambias nonsalvada",
+       "tog-prefershttps": "Sempre usa un lia secur cuando identifiada",
        "underline-always": "A tota tempo",
        "underline-never": "A no tempo",
-       "underline-default": "Surfador costumal",
+       "underline-default": "Inisial de pel o surfador",
+       "editfont-style": "Edita area de stilo de leteras",
+       "editfont-default": "Inisial de surfador",
+       "editfont-monospace": "Leteras monospasida",
+       "editfont-sansserif": "Leteras sin serifes",
+       "editfont-serif": "Leteras con serifes",
        "sunday": "soldi",
        "monday": "lundi",
        "tuesday": "martedi",
        "oct": "oto",
        "nov": "nov",
        "dec": "des",
+       "january-date": "$1 janero",
+       "february-date": "$1 febrero",
+       "march-date": "$1 marto",
+       "april-date": "$1 april",
+       "may-date": "$1 maio",
+       "june-date": "$1 junio",
+       "july-date": "$1 julio",
+       "august-date": "$1 agosto",
+       "september-date": "$1 setembre",
+       "october-date": "$1 otobre",
+       "november-date": "$1 novembre",
+       "december-date": "$1 desembre",
+       "period-am": "am",
+       "period-pm": "pm",
        "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
        "category_header": "Articles en categoria \"$1\"",
        "subcategories": "Sucategorias",
        "category-empty": "''Aora, esta categoria no conteni pajes o medio.''",
        "hidden-categories": "{{PLURAL:$1|Categoria|Categorias}} ascondeda",
        "hidden-category-category": "Categorias ascondeda",
+       "category-subcat-count": "{{PLURAL:$2|Esta categoria ave sola la sucategoria seguente.|Esta categoria ave la {{PLURAL:$1|sucategoria|$1 sucategorias}} seguente, entre $2 tota.}}",
+       "category-subcat-count-limited": "Esta categoria ave la {{PLURAL:$1|sucategoria|$1sucategorias}} seguente.",
+       "category-article-count": "{{PLURAL:$2|Esta categoria conteni sola la paje seguente.|La {{PLURAL:$1|paje es|$1 pajes es}} seguente en esta categoria, estra $2 tota.}}",
+       "category-article-count-limited": "La {{PLURAL:$1|paje|$1pajes}} seguente es en la categoria presente.",
+       "category-file-count": "{{PLURAL:$2|Esta categoria conteni sola la fix seguente.|La {{PLURAL:$1|fix|$1 fixes}} seguente es en esta categoria, estra $2 tota.}}",
+       "category-file-count-limited": "The {{PLURAL:$1|fix|$1 fixes}} seguente es en la categoria presente.",
        "listingcontinuesabbrev": "cont.",
+       "index-category": "Pajes indiseda",
+       "noindex-category": "Pajes nonindiseda",
+       "broken-file-category": "Pajes con lias rompeda de fixes",
        "about": "Supra",
        "article": "Paje de contenis",
        "newwindow": "(va abri en fenetra nova)",
        "cancel": "Cansela",
        "moredotdotdot": "Plu...",
-       "mypage": "Me paje",
+       "morenotlisted": "Esta lista es posible noncompleta.",
+       "mypage": "Paje",
        "mytalk": "Discutes",
-       "anontalk": "Discutes per esta IP",
+       "anontalk": "Discute",
        "navigation": "Naviga",
        "and": "&#32;e",
        "qbfind": "Trova",
        "qbedit": "Edita",
        "qbpageoptions": "Esta paje",
        "qbmyoptions": "Me pajes",
+       "faq": "Demandas comun",
+       "faqpage": "Project: Demandas comun",
+       "actions": "Atas",
+       "namespaces": "Locas de nom",
+       "variants": "Varias",
+       "navigation-heading": "Menu per naviga",
        "errorpagetitle": "Era",
        "returnto": "Restora a $1.",
        "tagline": "De {{SITENAME}}",
        "help": "Disionario",
        "search": "Xerca",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Titulos cual va es iniorada par xerca.\n# Cambias a esta va aveni pronto cuando la paje con la titulo es indiseda.\n# Tu pote forsa la reindise de un paje par fa un edita vacua.\n# La sintax es como la seguente:\n#   * Tota de la sinia \"#\" a la fini de la linia es un comenta.\n#   * Tota linia nonvacua es la titulo esata per iniora, incluinte caso etc.\nReferes\nLias esterna\nVide ance\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "Xerca",
        "go": "Vade",
        "searcharticle": "Vade",
        "history": "Istoria de paje",
        "history_short": "Istoria",
+       "history_small": "istoria",
        "updatedmarker": "renovida de me visita presedente",
        "printableversion": "Varia primable",
        "permalink": "Lia permanente",
        "print": "Primi",
+       "view": "Vide",
+       "view-foreign": "Vide a $1",
        "edit": "Cambia",
+       "edit-local": "Edita descrive local",
        "create": "Crea",
+       "create-local": "Ajunta descrive local",
        "editthispage": "Cambia esta paje",
        "create-this-page": "Crea esta paje",
        "delete": "Sutrae",
        "deletethispage": "Sutrae esta paje",
+       "undeletethispage": "Desutrae esta paje",
        "undelete_short": "Desutrae {{PLURAL:$1|edita|editas}}",
+       "viewdeleted_short": "Vide {{PLURAL:$1|un edit desutraeda|$1 editas desutraeda}}",
        "protect": "Proteje",
        "protect_change": "cambia",
        "protectthispage": "Proteje esta paje",
-       "unprotect": "desproteje",
-       "unprotectthispage": "Desproteje esta paje",
+       "unprotect": "Cambia la proteje",
+       "unprotectthispage": "Cambia la proteje de esta paje",
        "newpage": "Paje nova",
        "talkpage": "Discute esta paje",
        "talkpagelinktext": "Parla",
        "talk": "Discutes",
        "views": "Vides",
        "toolbox": "Utiles",
+       "tool-link-userrights": "Cambia grupos de {{GENDER:$1|usor}}",
+       "tool-link-userrights-readonly": "Vide grupos de {{GENDER:$1|usor}}",
+       "tool-link-emailuser": "E-posta esta {{GENDER:$1|usor}}",
        "userpage": "Vide paje de usor",
        "projectpage": "Vide la paje de projeta",
        "imagepage": "Vide paje de fix",
        "otherlanguages": "En otra linguas",
        "redirectedfrom": "(Redirijeda de $1)",
        "redirectpagesub": "Redireta la paje",
+       "redirectto": "Redirije a:",
+       "lastmodifiedat": "Esta paje ia es cambiada a $1, a $2",
        "viewcount": "Esta paje es asesada a $1 {{PLURAL:$1|ves|veses}}.",
        "protectedpage": "Paje protejeda",
        "jumpto": "Salta a:",
        "jumptonavigation": "naviga",
        "jumptosearch": "xerca",
+       "view-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atenta vide esta paje.\nPer favore espeta ante cuanto tu atenta vide esta paje denova.\n\n$1",
+       "generic-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atentante vide esta recurso.\nPer favore espeta ante cuando tu atenta vide esta recurso denova.",
        "aboutsite": "Supra {{SITENAME}}",
        "aboutpage": "Project:Supra",
        "copyrightpage": "{{ns:project}}:Diretos de autor",
        "disclaimers": "Negas de respondablia",
        "disclaimerpage": "Project:Nega jeneral de respondablia",
        "edithelp": "Aida con edita",
+       "helppage-top-gethelp": "Aida",
        "mainpage": "Paje Prima",
        "mainpage-description": "Paje Prima",
        "policy-url": "Project:Politica",
        "toc": "Contenida",
        "showtoc": "mostra",
        "hidetoc": "asconde",
+       "collapsible-collapse": "Colasa",
+       "collapsible-expand": "Estende",
+       "confirmable-confirm": "Esce {{GENDER:$1|tu}} es serta?",
+       "confirmable-yes": "Si",
+       "confirmable-no": "No",
        "viewdeleted": "Vide $1?",
        "feedlinks": "Flue:",
        "site-rss-feed": "$1 RSS Flue",
        "site-atom-feed": "$1 Atom Flue",
        "page-rss-feed": "\"$1\" RSS Flue",
+       "page-atom-feed": "\"$1\" Enflue de atom",
        "red-link-title": "$1 (paje no esiste)",
        "nstab-main": "Paje",
        "nstab-user": "Paje de usor",
        "nstab-template": "Model",
        "nstab-help": "Paje de aida",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Paje Prima",
        "error": "Era",
        "databaseerror": "Era de base de datos",
        "missingarticle-diff": "(Difere: $1, $2)",
        "badtitletext": "La titulo de la paje tu ia desira ia es nonlegal, es vacua, o es un titulo intervici o interlingual no liada coreta. Es posable ce es un o plu simboles ce no pote es usada en titulos.",
        "viewsource": "Vide la orijin",
        "viewsourcetext": "Tu pote vide e copia la orijin de esta paje:",
+       "mycustomcssprotected": "Tu no ave permete per edita esta paje CSS.",
+       "mycustomjsprotected": "Tu no ave permete per edita esta paje JavaScript.",
+       "myprivateinfoprotected": "Tu no ave permete per edita tua informa privata.",
+       "mypreferencesprotected": "Tu no ave permete per edita tua preferes.",
+       "ns-specialprotected": "La pajes spesial no pote es editada.",
+       "welcomeuser": "Bonveni, $1!",
        "yourname": "Nom de usor:",
+       "userlogin-yourname": "Nom de usor",
+       "userlogin-yourname-ph": "Entra tua nom de usor",
        "yourpassword": "Sinia de entra:",
+       "userlogin-yourpassword": "Clave",
+       "userlogin-yourpassword-ph": "Entra tua sinia secreta",
+       "createacct-yourpassword-ph": "Entra un sinia secreta",
        "yourpasswordagain": "Retape la sinia:",
+       "createacct-yourpasswordagain": "Confirma la sinia secreta",
+       "createacct-yourpasswordagain-ph": "Entra un sinia secreta denova",
+       "userlogin-remembermypassword": "Reteni me como identifiada",
        "yourdomainname": "Tu domina:",
        "login": "Identifia",
        "nav-login-createaccount": "Sinia per entra",
        "userlogin": "Sinia per entra",
        "logout": "Retira",
        "userlogout": "Sinia per retira",
+       "userlogin-noaccount": "Tu no ave un conta?",
+       "userlogin-joinproject": "Crea un conta con {{SITENAME}}",
        "nologin": "Tu no ave un conta? '''$1'''.",
        "nologinlink": "Crea  un conta",
        "createaccount": "Crea un conta",
        "gotaccount": "Tu ave ja un conta? '''$1'''.",
        "gotaccountlink": "Sinia per entra",
+       "userlogin-resetpassword-link": "Tu ia oblida tua sinia secreta?",
+       "userlogin-helplink2": "Aida me per identifia me",
+       "createacct-emailrequired": "Adirije de e-posta",
+       "createacct-emailoptional": "Adirije de e-posta (elejable)",
+       "createacct-email-ph": "Entra tua adirije de e-posta",
+       "createacct-another-email-ph": "Entra tua adirije de e-posta",
+       "createaccountreason": "Razona:",
+       "createacct-reason": "Razona:",
+       "createacct-submit": "Crea tua conta",
+       "createacct-another-submit": "Crea un conta",
+       "createacct-benefit-heading": "{{SITENAME}} es fabricada par persones como tu.",
+       "createacct-benefit-body1": "{{PLURAL:$1|edita|editas}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|paje|pajes}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribuor|contribuores}}",
        "loginerror": "Era de entra",
-       "loginsuccesstitle": "Entra susedente",
+       "loginsuccesstitle": "Tu ia entra",
        "loginsuccess": "'''Tu ia entrada aora a {{SITENAME}} como \"$1\".'''",
-       "nosuchuser": "Es no usor con la nom \"$1\".\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
+       "nosuchuser": "On no ave un usor con la nom \"$1\".\nOn distingui entre leteras major e minor per nomes de usores.\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
        "nosuchusershort": "Es no usor con esta nom \"$1\". Esamina la spele.",
        "nouserspecified": "Tu debe indica un nom de usor.",
        "wrongpassword": "La sinia de entra no es coreta. Per favore, atenta ancora.",
        "wrongpasswordempty": "La sinia de entra es vacua. Per favore, atenta ancora.",
-       "passwordtooshort": "Tu sinia secreta no es legal o es tro corta.\nEl debe ave a min {{PLURAL:$1|1 simbol|$1 simboles}} e debe difere de tu nom de usor.",
-       "mailmypassword": "Envia la sinia secreta nova par eposta",
+       "passwordtooshort": "Sinias secreta debe ave minima {{PLURAL:$1|1 simbol|$1 simboles}}.",
+       "passwordtoolong": "Sinias secreta no pote ave plu ca {{PLURAL:$1|1 simbol|$1 simboles}}.",
+       "passwordtoopopular": "Sinias secreta comun debe no es usada. Per favore, eleje un sinia plu unica.",
+       "mailmypassword": "Cambia tua sinia secreta",
        "passwordremindertitle": "Sinia secreta temporer nova per {{SITENAME}}",
-       "passwordremindertext": "Algun (tu, probable, de adirije IP $1)\nia demanda ce nos envia a tu un sinia secreta nova per {{SITENAME}} ($4).\nLa sinia secreta per usor \"$2\" es aora \"$3\".\nTu debe sinia per entra e cambia tu sinia secreta aora.\n\nSi algun otra ce tu ia envia esta demanda a nos, o si tu ia recorda tu sinia secreta e no vole cambia el aora, tu pote iniora esta mesaje e continua usa tu sinia secreta vea.",
+       "passwordremindertext": "Algun (tu, probable, de adirije IP $1)\nia demanda un sinia secreta nova per {{SITENAME}} ($4).\nLa sinia secreta tempora per usor \"$2\" es aora \"$3\". Si esta ia es tua intende, tu debe identifia tu denova per entra e eleje tua sinia nova aora.\nTua sinia tempora va desvalidi en {{PLURAL:$5|un dia|$5 dias}}.\n\nSi algun otra ca tu ia envia esta demanda a nos, o si tu ia recorda tua sinia secreta e no vole cambia lo aora, tu pote iniora esta mesaje e continua usa tua sinia secreta vea.",
        "noemail": "No es un adirije de eposta per usor \"$1\".",
        "passwordsent": "Un sinia secreta ia es enviada a la adirije de eposta per \"$1\".\nPer favore, sinia per entra ancora pos tu ia reseta el.",
-       "eauthentsent": "Un eposta de serti ia es enviada a la adirije de eposta proposada.\nAnte alga otra eposta es enviada a la conta, tu va nesesa segue la instruis en la eposta, per serti ce la conta es vera de tu.",
+       "eauthentsent": "Un eposta de serti ia es enviada a la adirije de eposta spesifada.\nAnte cualce otra epostas es enviada a tua conta, tu va nesesa segue la instruis en la eposta, per serti ce la conta es vera la tua.",
        "emailconfirmlink": "Aproba tu adirije de eposta",
+       "accountcreated": "Conta es creada",
        "loginlanguagelabel": "Lingua: $1",
+       "pt-login": "Identifia se",
+       "pt-login-button": "Identifia tua",
+       "pt-createaccount": "Crea un conta",
+       "pt-userlogout": "Desidentifia",
        "oldpassword": "Sinia secreta vea:",
        "newpassword": "Sinia secreta nova:",
        "retypenew": "Re-entra tu sinia secreta nova:",
        "resetpass-submit-loggedin": "Cambia la sinia secreta",
        "resetpass-temp-password": "Sinia secreta tempora:",
+       "passwordreset": "Reinisia sinia secreta",
+       "passwordreset-username": "Nom de usor:",
+       "passwordreset-domain": "Domina:",
+       "passwordreset-email": "Adirije de e-posta",
+       "passwordreset-invalidemail": "Adirije de e-posta no es valida",
+       "changeemail-submit": "Cambia e-posta",
        "bold_sample": "Testo en leteras forte",
        "bold_tip": "Testo en leteras forte",
        "italic_sample": "Testo en leteras italica",
        "sig_tip": "Tu sinia con la primi de la ora",
        "hr_tip": "Linia orizonal (usa nonfrecuente)",
        "summary": "Soma:",
-       "subject": "Sujeto/titulo:",
+       "subject": "Sujeto:",
        "minoredit": "Esta es un cambia minor",
        "watchthis": "Oserva esta paje",
        "savearticle": "Fisa paje",
+       "publishpage": "Publici paje",
+       "publishchanges": "Publica la cambias",
        "preview": "Previde",
        "showpreview": "Mostra previde",
        "showdiff": "Mostra diferes",
-       "anoneditwarning": "'''Avisa:''' Tu no ia sinia per entra.\nTu adirije de IP va es memorada en la istoria de revisas de esta paje.",
+       "anoneditwarning": "'''Avisa:''' Tu no ia identifia se.\nTu adirije de IP va es memorada en la istoria de revisas de esta paje. Si tu <strong>[$1 identifia se]</strong> o <strong>[$2 crea un conta]</strong>, tua editas va es atribuida a tua nom de usor, con otra benefias.",
        "summary-preview": "Previde soma:",
        "blockedtitle": "Usor es impedida",
        "blockedtext": "'''Tu nom de usor o adirije de IP ia es impedida.'''\n\nLa impedi ia es fada par $1.\nLa razon donada es ''$2''.\n\n* Comensa de impedi: $8\n* Fini de impedi: $6\n* Ci algun intende impedi: $7\n\nTu pote contata $1 o un otra [[{{MediaWiki:Grouppage-sysop}}|dirijor]] per discute esta impedi.\nTu no pote usa la 'envia un eposta a esta usor' sin un adirije de eposta legal es indicada en tu\n[[Special:Preferences|preferis de conta]] e tu no es impedida de usa el.\nTu adirije de IP es aora $3, e la identia de la impedi es #$5.\nPer favore inclui tota esta detales en tu demandas.",
+       "loginreqtitle": "Entra de identia nesesada",
+       "loginreqlink": "Identifia se",
        "newarticle": "(Nova)",
        "newarticletext": "Tu ia segue un lia a un paje ce no esista ja.\nPer crea la paje, comensa scrive en la caxa a su\n(vide la [$1 paje de aida] per plu).\nSi tu es asi par era, clica a la boton '''retro''' de tu surfador.",
-       "noarticletext": "Es aora no testo a esta paje.\nTu pote [[Special:Search/{{PAGENAME}}|xerca per la titulo de esta paje]] en otra pajes,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca la arcivos relatada],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita esta paje]</span>.",
+       "noarticletext": "On ave aora no testo a esta paje.\nTu pote [[Special:Search/{{PAGENAME}}|xerca per la titulo de esta paje]] en otra pajes,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca la arcivos relatada],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita esta paje]</span>.",
+       "noarticletext-nopermission": "On ave presente no testo en esta paje.\nTu pote [[Special:Search/{{PAGENAME}}|xerca per esta titulo de paje]] en otra pajes, o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca arcivos relatada]</span>, ma tu no es permeteda per crea esta paje.",
        "previewnote": "'''Esta sola un previde; cambias no es fisada ja'''",
        "editing": "En la prosede de edita $1",
+       "creating": "Creante $1",
        "editingsection": "Edita $1 (sesion)",
        "editingcomment": "Edita $1 (sesion nova)",
        "yourdiff": "Diferes",
        "templatesusedpreview": "{{PLURAL:$1|Modele|Modeles}} usada en esta previde:",
        "template-protected": "(protejeda)",
        "template-semiprotected": "(proteje en parte)",
+       "hiddencategories": "Esta paje es un membro de {{PLURAL:$1|1 categoria ascondeda|$1 categorias ascondeda}}:",
        "nocreatetext": "{{SITENAME}} ave un restringe a la capas per crea pajes nova.\nTu pote vade a retro e edita un paje esistente, o  [[Special:UserLogin|sinia per entra o crea un conta]].",
-       "recreate-moveddeleted-warn": "'''Avisa: Tu es recrea un paje ce ia es sutraed en la pasada.'''\nTu debe pensa ce es bon continua edita esta paje.\nLa arcivo de sutraes per esta paje es asi per conveni:",
+       "permissionserrorstext-withaction": "Tua no es permeteda per $2, per la {{PLURAL:$1|razona|razonas}} seguente:",
+       "recreate-moveddeleted-warn": "<strong>Avisa: Tu es recreante un paje cual ia es sutraeda a ante.</strong>\nTu debe pensa si la continua de edita de esta paje conveni.\nLa arcivo de sutraes e moves per esta paje es asi per tua conveni:",
+       "moveddeleted-notice": "Esta paje ia es sutraeda.\nLa arcivo de sutraes e moves per la paje es furnida a su per refere.",
        "viewpagelogs": "Vide la arcivo de esta paje",
        "currentrev": "Cambia presente",
        "currentrev-asof": "Cambia presente a departi di $1",
        "page_last": "final",
        "histlegend": "Diferente eleje: Marca la caxas de radio de esta varias per compare e clica entra o la boton a la funda.<br />\n(presente) = difere de la varia presente,\n(presedente) = difere con varia presedente, M = edita minor.",
        "history-fieldset-title": "Surfa istoria",
-       "histfirst": "Prima",
-       "histlast": "Ultima",
+       "histfirst": "La plu vea",
+       "histlast": "La plu nova",
        "historysize": "({{PLURAL:$1|1 otuple|$1 otuples}})",
        "historyempty": "(vacua)",
        "history-feed-title": "Istoria de revises",
        "history-feed-item-nocomment": "$1 a $2",
        "rev-delundel": "mostra/asconde",
+       "rev-showdeleted": "mostra",
+       "revdelete-show-file-submit": "Si",
+       "revdelete-radio-set": "Ascondeda",
+       "revdelete-radio-unset": "Vidable",
+       "pagehist": "Istoria de paje",
+       "deletedhist": "Istoria sutraeda",
        "history-title": "Istoria de cambias de \"$1\"",
+       "difference-title": "Difere entre revisas de \"$1\"",
        "lineno": "Linia $1:",
        "compareselectedversions": "Compare varias elejeda",
        "editundo": "desfa",
+       "diff-multi-sameuser": "({{PLURAL:$1|Un revisa media|$1 revisas media}} par la mesma usor no mostrada)",
        "searchresults": "Resultas de xerca",
+       "searchresults-title": "Xerca la resultas per \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} presedente",
        "nextn": "{{PLURAL:$1|$1}} seguente",
+       "nextn-title": "Seguente $1 {{PLURAL:$1|resulta|resultas}}",
+       "shown-title": "Mostra $1 {{PLURAL:$1|resulta|resultas}} per paje",
        "viewprevnext": "Vide ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Crea la paje \"[[:$1]]\" a esta wiki!</strong> {{PLURAL:$2|0=|Vide ance la paje trovada con tua xerca.|Vide ance la resultas trovada par la xerca.}}",
+       "searchprofile-articles": "Pajes de contenis",
+       "searchprofile-images": "Multimedios",
+       "searchprofile-everything": "Tota",
+       "searchprofile-advanced": "Avansada",
+       "searchprofile-articles-tooltip": "Xerca en $1",
+       "searchprofile-images-tooltip": "Xerca per fixes",
+       "searchprofile-everything-tooltip": "Xerca tota contenidas (incluinte pajes de conversa)",
+       "searchprofile-advanced-tooltip": "Xerca en nomspasios unica",
        "search-result-size": "$1 ({{PLURAL:$2|1 parola|$2 parolas}})",
+       "search-redirect": "(redirije de $1)",
        "search-section": "(sesion $1)",
+       "search-suggest": "Tu ia intende: $1",
        "search-interwiki-default": "Resultas de $1:",
        "search-interwiki-more": "(plu)",
        "searchall": "tota",
+       "search-showingresults": "{{PLURAL:$4|Resulta <strong>$1</strong> de <strong>$3</strong>|Resultas <strong>$1 - $2</strong> de <strong>$3</strong>}}",
+       "search-nonefound": "On ave no resultas cual conforma con la demanda.",
+       "powersearch-toggleall": "Tota",
+       "powersearch-togglenone": "Zero",
        "preferences": "Preferis",
        "mypreferences": "Preferis",
        "skin-preview": "Previde",
        "saveprefs": "Fisa",
-       "rows": "Linias:",
-       "columns": "Colonas:",
        "searchresultshead": "Xerca",
        "savedprefs": "Tu preferis es fisada",
        "timezoneregion-africa": "Africa",
        "timezoneregion-pacific": "Mar Pasifica",
        "prefs-files": "Fixes",
        "youremail": "Eposta:",
-       "username": "Nom de usor:",
-       "prefs-memberingroups": "Membro de la {{PLURAL:$1|grupo|grupos}}:",
+       "username": "{{GENDER:$1|Nom de usor}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membro}} de {{PLURAL:$1|grupo|grupos}}:",
        "yourrealname": "Nom vera:",
        "yourlanguage": "Lingua:",
        "yournick": "Suscrive:",
-       "yourgender": "Seso:",
-       "gender-male": "Mas",
-       "gender-female": "Fema",
+       "yourgender": "Como tu prefere ce tu es descriveda?",
+       "gender-male": "El edita pajes de wiki",
+       "gender-female": "El edita pajes de wiki",
        "email": "Eposta",
-       "prefs-help-realname": "Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.",
+       "prefs-help-realname": "Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.\n\nTu no debe entra tua nom vera. Ma si tu entra tua noma vera, lo pote es usada per atribui tua laboras a tu.",
        "prefs-signature": "Suscrive",
        "userrights": "Dirije de la diretos de usores",
        "saveusergroups": "Fisa la grupo de usores",
        "group-user": "Usores",
        "group-sysop": "Dirijores",
        "group-all": "(tota)",
-       "group-user-member": "Usor",
+       "group-user-member": "{{GENDER:$1|usor}}",
        "grouppage-user": "{{ns:project}}:Usores",
        "grouppage-sysop": "{{ns:project}}:Dirijores",
+       "right-writeapi": "Usa de la API de scrive",
+       "newuserlogpage": "Arcivo de creas de usor",
        "rightslog": "Catalogo de diretos de usor",
        "action-edit": "edita esta paje",
        "nchanges": "$1 {{PLURAL:$1|cambia|cambias}}",
+       "enhancedrc-history": "istoria",
        "recentchanges": "Cambias resente",
+       "recentchanges-legend": "Elejes  per cambias resente",
        "recentchanges-summary": "Asi la lista de cambias resente en la vici.",
        "recentchanges-feed-description": "Seque la cambias plu resente a la vici en esta flue.",
+       "recentchanges-label-newpage": "Esta edita ia crea un paje nova",
+       "recentchanges-label-minor": "Esta es un edita minor",
+       "recentchanges-label-bot": "Esta edita ia es fada par un bot",
+       "recentchanges-label-unpatrolled": "Esta edita no ia es ja patruliada",
+       "recentchanges-label-plusminus": "La grandia de esta paje es cambiada par esta cuantia de baites",
+       "recentchanges-legend-heading": "<strong>Titulo:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide ance [[Special:NewPages|la lista de pajes nova]])",
        "rcnotefrom": "A su es la cambias de '''$2''' (asta '''$1''' es mostrada).",
        "rclistfrom": "Mostra cambias nova, comensante de $3 $2",
        "rcshowhideminor": "$1 editas minor",
+       "rcshowhideminor-show": "Mostra",
+       "rcshowhideminor-hide": "Asconde",
        "rcshowhidebots": "$1 botes",
-       "rcshowhideliu": "$1 usores ativa aora",
+       "rcshowhidebots-show": "Mostra",
+       "rcshowhidebots-hide": "Asconde",
+       "rcshowhideliu": "$1 usores identifiada aora",
+       "rcshowhideliu-hide": "Asconde",
        "rcshowhideanons": "$1 usores sin nom",
+       "rcshowhideanons-show": "Mostra",
+       "rcshowhideanons-hide": "Asconde",
        "rcshowhidepatr": "$1 editas patroliada",
        "rcshowhidemine": "$1 me editas",
+       "rcshowhidemine-show": "Mostra",
+       "rcshowhidemine-hide": "Asconde",
        "rclinks": "Mostra la $1 cambias presedente en la $2 dias presedente<br />$3",
        "diff": "dife",
        "hist": "isto",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
-       "rc_categories_any": "Cualce",
+       "rc_categories_any": "Cualce de la elejeda",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bait|baites}}  pos cambia",
        "rc-enhanced-expand": "Mostra detalias",
        "rc-enhanced-hide": "Asconde detalias",
        "recentchangeslinked": "Cambias relateda",
        "recentchangeslinked-title": "Cambias relatada a \"$1\"",
        "recentchangeslinked-summary": "Esta lista conteni la cambias plu resente de la pajes liada a otra (o de la membros de un categoria).\nPajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'''.",
        "recentchangeslinked-page": "Nom de la paje:",
+       "recentchangeslinked-to": "En loca, mostra cambia a pajes liada a la paje presentada",
        "upload": "Envia fixes",
        "uploadbtn": "Envia la fix",
        "uploadlogpage": "Envia arcivo",
+       "filedesc": "Resoma",
        "savefile": "Fisa fix",
        "upload-file-error": "Era interna",
+       "license-header": "Lisensa",
        "imgfile": "fix",
        "listfiles": "Lista de imajes",
        "listfiles_name": "Nom",
        "filehist-help": "Clica a un data/tempo per vide la fix como el ia aperi alora.",
        "filehist-current": "aora",
        "filehist-datetime": "Date/Tempo",
+       "filehist-thumb": "Imajeta",
+       "filehist-thumbtext": "Imajeta per varia pos $1",
        "filehist-user": "Usor",
        "filehist-dimensions": "Mesuras",
        "filehist-filesize": "Grandia de fix",
        "linkstoimage": "Esta {{PLURAL:$1|paje|pajes}} lia a esta fix:",
        "nolinkstoimage": "Es no pajes ce lia a esta fix.",
        "sharedupload": "Esta fix es parte de $1 e pote es usada par otra projetas.",
+       "sharedupload-desc-here": "Esta fix es de $1 e pote es usada par otra projetas.\nLa descrive su sua [$2 paje de descrive de fix] ala es mostra a su.",
        "uploadnewversion-linktext": "Envia un varia nova de esta fix",
+       "upload-disallowed-here": "Tu no pote suprascrive esta arcivo.",
        "mimesearch": "Xerca de MIME",
        "listredirects": "Lista redirijes",
        "unusedtemplates": "modeles no usada",
        "wantedpages": "Pajes desirada",
        "mostlinked": "Pajes la plu liada",
        "mostlinkedcategories": "Categorias a ce es la plu lias",
-       "mostlinkedtemplates": "Modeles a ce es la plu lias",
+       "mostlinkedtemplates": "Pajes la plu liada",
        "mostcategories": "Pajes con la plu categorias",
        "mostimages": "Fixes a ce es la plu lias",
        "mostrevisions": "Pajes con la plu revisas",
        "longpages": "Pajes longa",
        "deadendpages": "Pajes sin sorti",
        "protectedpages": "Pajes protejeda",
+       "protectedpages-page": "Paje",
+       "protectedpages-expiry": "Desvalidi",
        "listusers": "Lista de usores",
        "newpages": "Pajes nova",
        "ancientpages": "Pajes la plu vea",
        "pager-newer-n": "{{PLURAL:$1|1 plu resente|$1 plu resentes}}",
        "pager-older-n": "{{PLURAL:$1|1 plu vea|$1 plu veas}}",
        "booksources": "Orijines de libros",
+       "booksources-search-legend": "Xerca per fontes de libros",
+       "booksources-search": "Xerca",
        "specialloguserlabel": "Usor:",
        "speciallogtitlelabel": "Titulo:",
        "log": "Lista de atas",
        "listgrouprights-group": "Grupo",
        "listgrouprights-members": "(lista de membros)",
        "emailuser": "Envia un eposta a esta usor",
-       "emailfrom": "De",
-       "emailto": "Per",
-       "watchlist": "Pajes oservada",
+       "emailfrom": "De:",
+       "emailto": "A:",
+       "emailsubject": "Sujeto:",
+       "emailmessage": "Mesaje:",
+       "emailsend": "Envia",
+       "emailsent": "E-posta ia es enviada",
+       "watchlist": "Lista de pajes oservada",
        "mywatchlist": "Lista de pajes oservada",
+       "watchlistfor2": "Per $1 $2",
        "nowatchlist": "Tu ave no cosas en tu lista oservada",
        "addedwatchtext": "La paje \"[[:$1]]\" ia es juntada a tu [[Special:Watchlist|lista de pajes oservada]].\nCambias future a esta paje e se paje de discutes va es listada ala, e la paje va apera en leteras '''forte''' en la [[Special:RecentChanges|lista de cambias resente]] per es plu fasil oservada.\n\nSi tu vole sutrae la paje de tu lista de pajes oservada en la futur, clica a \"no oserva\" en la bara a la lado.",
        "removedwatchtext": "La paje \"[[:$1]]\" ia es sutraeda de [[Special:Watchlist|tu lista de pajes oservada]].",
        "deleteotherreason": "Otra/plu razona:",
        "deletereasonotherlist": "Otra razona",
        "rollbacklink": "retro",
+       "rollbacklinkcount": "reversa $1 {{PLURAL:$1|edita|editas}}",
        "protectlogpage": "Catalogo de protejes",
        "protectedarticle": "\"[[$1]]\" protejeda",
        "unprotectedarticle": "''[[$1]]'' desprotejeda",
        "undelete-search-submit": "Xerca",
        "namespace": "Loca de nom:",
        "invert": "Reversa la eleje",
+       "tooltip-invert": "Marca esta caxa per asconde cambias a pajes en la nomspasio elejeda (e la nomspasio asosiada si marcada)",
+       "namespace_association": "Nomspasio asosiada",
+       "tooltip-namespace_association": "Marca esta caxa per inclui ance la nomspasio de discute o sujeto asosiada con la nomspasio elejeda",
        "blanknamespace": "(Prima)",
-       "contributions": "Contribuis de usor",
-       "mycontris": "Me contribuis",
+       "contributions": "Contribuis de {{GENDER:$1|usor}}",
+       "mycontris": "Mea contribuis",
+       "anoncontribs": "Contribuis",
        "contribsub2": "Per $1 ($2)",
        "uctop": "(culmine)",
        "month": "De mensa (e plu vea):",
        "nolinkshere": "No pajes lia a '''[[:$1]]'''.",
        "isredirect": "redirije paje",
        "istemplate": "inclui",
-       "isimage": "lia de imaje",
+       "isimage": "lia de fix",
        "whatlinkshere-prev": "{{PLURAL:$1|presesdente|$1 presedente}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguente|$1 seguente}}",
        "whatlinkshere-links": "← lias",
        "whatlinkshere-hideredirs": "$1 redirijes",
+       "whatlinkshere-hidetrans": "$1 transcluis",
        "whatlinkshere-hidelinks": "$1 lias",
        "whatlinkshere-filters": "Filtros",
        "blockip": "Impedi usor",
        "move-page-legend": "Move paje",
        "movepagetext": "Usa la forma a su va cambia la nom de un paje, e va move tota se istoria a la nom nova.\nLa titulo vea va deveni un paje de redirije a la titulo nova.\nLias a la titulo de la paje vea no va es cambiada;\nTu debe vide serta ce es redirijes duple o rompeda.\nTu es respondable per es serta ce la lias va continua vade a la locas intendeda.\n\nNota ce la paje '''no''' va es moveda si es ja un paje a la titulo nova, sin el es vacua o un redirije e no ave un istoria de editas presedente.\nEsta sinifia ce tu pote cambia la nom de un paje a la loca presedente si tu era, e tu no pote scrive supra un paje ce esiste ja.\n\n'''AVISA!'''\nEsta pote es un cambia dramos e nonespetada per un paje poplal;\nper favore, es serta ce tu comprende la resulta de esta ata ante tu continua.",
        "movepagetalktext": "La paje de discuta de esta paje va es moveda automatica con el '''eseta si:'''\n*Un paje de discuta ce no es vacua esiste ja su la nom nova, o\n*Tu cambia la indica en la caxa su.\n\nEn esta casos, tu va nesesa move o fusa la paje per mano, si desirada.",
-       "newtitle": "A titulo nova:",
+       "newtitle": "Titulo nova:",
        "move-watch": "Oserva esta paje",
        "movepagebtn": "Move paje",
        "pagemovedsub": "La move ia susede",
        "thumbnail_error": "Era en crea la imajeta: $1",
        "import": "Emporta pajes",
        "importlogpage": "Importa arcivo",
-       "tooltip-pt-userpage": "Tu paje de usor",
-       "tooltip-pt-mytalk": "Tu paje de discutes",
-       "tooltip-pt-preferences": "Me preferis",
+       "tooltip-pt-userpage": "{{GENDER:|Tua}} page de usor",
+       "tooltip-pt-mytalk": "{{GENDER:|Tua}} paje de discutes",
+       "tooltip-pt-preferences": "{{GENDER:|Tua}} preferes",
        "tooltip-pt-watchlist": "La lista de pajes ce tu oserva per cambias",
-       "tooltip-pt-mycontris": "Lista de tu contribuis",
+       "tooltip-pt-mycontris": "Lista de tua contribuis",
        "tooltip-pt-login": "Nos preferi si tu sinia per entra, ma tu es no obligada.",
        "tooltip-pt-logout": "Sinia per retira",
+       "tooltip-pt-createaccount": "Tu es corajida per crea un conta e identifia se; an si, esta no es obligante",
        "tooltip-ca-talk": "Discute de la paje de contenis",
-       "tooltip-ca-edit": "Tu pote edita esta paje. Per favore, usa la boton de previde ante fisa.",
+       "tooltip-ca-edit": "Edita esta paje",
        "tooltip-ca-addsection": "Inisia un sesion nova",
        "tooltip-ca-viewsource": "Esta paje es protejeda. Tu pote vide se orijin.",
+       "tooltip-ca-history": "Revisas pasada de esta paje",
        "tooltip-ca-protect": "Proteje esta paje",
        "tooltip-ca-delete": "Sutrae esta paje",
        "tooltip-ca-move": "Move esta paje",
        "tooltip-ca-watch": "Junta esta paje a tu lista de pajes oservada",
        "tooltip-ca-unwatch": "Sutrae esta paje de tu lista de pajes oservada",
        "tooltip-search": "Xerca {{SITENAME}}",
+       "tooltip-search-go": "Vade a un paje con esta nom esata, si lo esiste",
+       "tooltip-search-fulltext": "MediaWiki:Tooltip-xerca-testoplen/lfn",
        "tooltip-p-logo": "Visita la paje prima",
        "tooltip-n-mainpage": "Visita la paje prima",
        "tooltip-n-mainpage-description": "Visita la paje prima",
        "tooltip-n-randompage": "Carga un paje acaso",
        "tooltip-n-help": "La loca per descovre.",
        "tooltip-t-whatlinkshere": "Lista de tota pajes de vici ce lia a asi",
-       "tooltip-t-contributions": "Vide la lista de contribuis de esta usor",
+       "tooltip-t-recentchangeslinked": "Cambia resente en pajes liada de esta paje",
+       "tooltip-feed-atom": "Enflue de atom per esta paje",
+       "tooltip-t-contributions": "Vide la lista de contribuis de {{GENDER:$1|esta usor}}",
        "tooltip-t-emailuser": "Envia un eposta a esta usor",
        "tooltip-t-upload": "Envia fixes",
        "tooltip-t-specialpages": "Lista de tota pajes spesial",
+       "tooltip-t-print": "Varia primable de esta paje",
+       "tooltip-t-permalink": "Lias permanente a esta revisa de la paje",
+       "tooltip-ca-nstab-main": "Vide la paje de contenis",
        "tooltip-ca-nstab-user": "Vide la paje de usor",
+       "tooltip-ca-nstab-special": "Esta es un paje special, e no pote es editada.",
        "tooltip-ca-nstab-project": "Vide la paje de la projeta",
        "tooltip-ca-nstab-image": "Vide la paje de fix",
        "tooltip-ca-nstab-template": "Mostra la model",
        "tooltip-diff": "Mostra tu cambias de la testo.",
        "tooltip-compareselectedversions": "Vide la diferes entre la du varias elejeda de esta paje.",
        "tooltip-watch": "Junta esta paje a tu lista de pajes oservada",
+       "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click\n\n\"Reversa\" reversa la edita o editas a esta paje par la contribuor presedente con un clica",
+       "tooltip-undo": "\"Desfa\" reversa esta edita e abri la forma de edita en la modo de previde. Lo permete la ajunta de un razona en la resoma.",
+       "tooltip-summary": "Entra un resoma corta",
        "others": "otras",
+       "simpleantispam-label": "Proba anti-spam.\n<strong>No</strong> completa esta!",
+       "pageinfo-toolboxlink": "Informa de paje",
        "previousdiff": "← Difere plu vea",
        "nextdiff": "Difere plu nova →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|paje|pajes}}",
        "file-info-size": "$1 × $2 pixel, grandia de fix: $3, MIME tipo: $4",
        "file-nohires": "No plu densia posable.",
        "svg-long-desc": "SVG fix, per nom $1 × $2 pixeles, grandia de fix: $3",
-       "show-big-image": "Densia masima",
+       "show-big-image": "Arcivo orijinal",
+       "show-big-image-preview": "Grandia de esta previde: $1",
+       "show-big-image-other": "Otra {{PLURAL:$2|densia|densias}}: $1.",
+       "show-big-image-size": "$1 × $2 pixeles",
        "newimages": "Imajes nova",
        "ilsubmit": "Xerca",
        "bad_image_list": "La forma es la seguente:\n\nSola linias de un lista (ce comensa con *) es considerada.\nLa lia prima a la linia nesesa es un lia a un mal fix.\nCada lias seguente a la mesma linia es considerada es esetas, ce es, la pajes do la fix pote aveni enlinia.",
        "metadata-help": "Esta fix conteni plu informa, posable juntada de un camera dijital o un scanador usada per crea o dijiti el.\nSi la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en la fix cambiada.",
        "metadata-expand": "Mostra detalias estendente",
        "metadata-collapse": "Asconde detalias estendeda",
-       "metadata-fields": "Campos de EXIF metadata listada en esta mesaje va es inclui cuando la table de metadata es minimida.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Campos de EXIF metadata listada en esta mesaje va es incluida cuando la table de metadata es minimida.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "Orienta",
+       "exif-xresolution": "Densia orizonal",
+       "exif-yresolution": "Densia vertical",
+       "exif-datetime": "Data e ora de cambia de fix",
+       "exif-make": "Fabricor de camera",
+       "exif-model": "Model de camera",
+       "exif-software": "Programas usada",
+       "exif-exifversion": "Varia de Exif",
+       "exif-colorspace": "Spasio de color",
+       "exif-datetimeoriginal": "Data e ora de jenera de datos",
+       "exif-datetimedigitized": "Data e ora de dijitali",
        "exif-exposuretime-format": "$1 sec. ($2)",
+       "exif-orientation-1": "Normal",
        "namespacesall": "tota",
        "monthsall": "tota",
        "confirm_purge_button": "Oce",
        "watchlisttools-view": "Vide cambias pertinente",
        "watchlisttools-edit": "Vide e edita la lista de pajes oservada",
        "watchlisttools-raw": "Edita la lista rua de pajes oservada",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discute]])",
        "version": "Varia",
        "version-version": "($1)",
        "fileduplicatesearch-submit": "Xerca",
        "specialpages": "Pajes spesial",
+       "tag-filter": "Filtre de [[Special:Tags|eticeta]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|sutraeda}} paje $3",
+       "logentry-move-move": "$1 {{GENDER:$2|moveda}} paje $3 a $4",
+       "logentry-newusers-create": "Conta de usor $1 ia es {{GENDER:$2|creada}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|cargada}} $3",
+       "searchsuggest-search": "Xerca {{SITENAME}}",
        "expand_templates_ok": "Oce"
 }
index d781df8..afd8cc5 100644 (file)
        "searcharticle": "Vanni",
        "history": "Stöia da pàgina",
        "history_short": "Stöia",
+       "history_small": "Stoia",
        "updatedmarker": "modificâ da-a mæ urtima vixita",
        "printableversion": "Verscion da stanpâ",
        "permalink": "Ingancio fisso",
        "views": "Vìxite",
        "toolbox": "Arneixi",
        "tool-link-userrights": "Modiffica groppi {{GENDER:$1|utente}}",
+       "tool-link-userrights-readonly": "Vixualizza groppi {{GENDER:$1|utente}}",
        "tool-link-emailuser": "Manda un'e-mail a questo {{GENDER:$1|utente}}",
        "userpage": "Veddi a paggina utente",
        "projectpage": "Amia a paggina de serviççio",
        "sort-descending": "Ordine decrescente",
        "sort-ascending": "Ordine crescente",
        "nstab-main": "Pàgina",
-       "nstab-user": "Utente",
+       "nstab-user": "Paggina utente",
        "nstab-media": "File murtimediâ",
        "nstab-special": "Pàgina speçiâ",
        "nstab-project": "Paggina de servissio",
        "nstab-category": "Categorîa",
        "mainpage-nstab": "Paggina prinçipâ",
        "nosuchaction": "No se poeu",
-       "nosuchactiontext": "L'açion specificâ inta URL a no l'è vallida.\nO che t'hæ scrito mâ, o che donque l'ea sbaliou o colegamento.\nO magara gh'è 'na cammoa into software doeuviou da {{SITENAME}}.",
+       "nosuchactiontext": "L'açion specificâ inta URL a no l'è vallida.\nÒ che t'hæ scrito mâ, ò che donque l'ea sbaliou l'ingancio.\nÒ magara gh'è 'na cammoa into software dœuviou da {{SITENAME}}.",
        "nosuchspecialpage": "Sta paggina speciale a no gh'è",
        "nospecialpagetext": "<strong>A paggina speciale domandâ a no l'è stæta riconosciua.</strong>\n\nA lista de paggine speciale vallide a se treuva in [[Special:SpecialPages|Lista de paggine speciale]].",
        "error": "Errô",
        "yourpasswordagain": "Riscrivi a pòula segrétta:",
        "createacct-yourpasswordagain": "Conferma a password",
        "createacct-yourpasswordagain-ph": "Conferma a password un'atra votta",
-       "userlogin-remembermypassword": "Mantegnime collegou",
+       "userlogin-remembermypassword": "Mantegnime conligou",
        "userlogin-signwithsecure": "Adoeuvia una conescion segua",
        "cannotlogin-title": "Imposcibbile intrâ",
        "cannotlogin-text": "L'accesso o no l'è poscibbile.",
        "botpasswords-label-delete": "Scassa",
        "botpasswords-label-resetpassword": "Reimposta a poula segretta",
        "botpasswords-label-grants": "Assegnaçioin applicabile:",
-       "botpasswords-help-grants": "Ogni assegnaçion a dà accesso a-i driti utente elencæ che un'utença a g'ha zà. Amia a [[Special:ListGrants|tabella d'e assegnaçioin]] pe de ulteioî informaçioin.",
+       "botpasswords-help-grants": "I assegnaçioin consentan l'accesso a di driti che a to utença a possede zà. Attivâ un'assegnaçion chì no fornisce l'accesso a arcun drito che a to utença atrimenti a no gh'aviæ. Amia a [[Special:ListGrants|tabella di assegnaçioin]] pe ciu informaçioin.",
        "botpasswords-label-grants-column": "Assegnaçioin",
        "botpasswords-bad-appid": "O nomme bot \"$1\" o no l'è vallido.",
        "botpasswords-insert-failed": "Imposcibile azonze o nomme bot \"$1\". O l'è za stæto azonto?",
        "passwordreset-emaildisabled": "E funçionalitæ de posta elettronnica son stæte disabilitæ in sce sta wiki.",
        "passwordreset-username": "Nomme utente",
        "passwordreset-domain": "Dominnio:",
-       "passwordreset-capture": "Visualizzâ o contegnuo do messaggio e-mail?",
-       "passwordreset-capture-help": "Se ti seleçion-i sta casella, l'e-mail (co-a poula segretta temporannia), o saiâ mostròu a ti, oltre ch'a ese inviòu a l'utente.",
        "passwordreset-email": "Addresso e-mail:",
        "passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quarcun (probabilmente ti, con adresso IP $1) o l'ha domandòu l'invio de 'na neuva poula segretta per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associòu|I utenti associæ}} a sto addresso e-mail son:\n\n$2\n\n{{PLURAL:$3|Questa poula segretta temporannia a descazziâ|Queste poule segrette temporannie descazzian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una neuva poula segretta oua. \n\nSe no t'ê stæto ti a fâ a domanda, ò se ti t'hæ aregordòu a poula segretta originale e no ti veu ciù cangiâla, ti peu ignorâ sto messaggio e continuâ a deuviâ a teu vegia poula segretta.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
        "passwordreset-emailsentemail": "Se questo addresso de posta elettronnica o l'è associou a-a teu utença, alloa saiâ inviou un'e-mail pe rempostâ a poula segretta.",
        "passwordreset-emailsentusername": "Se gh'è un adreçço de posta elettronica associou con questo nomme utente, alloa saiâ inviou una email pe rempostâ a password.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|L'|E }}e-mail de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì.",
-       "passwordreset-emailerror-capture2": "Invio d'e-mail {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
        "passwordreset-nocaller": "Un chi ciamma ti g'hæ da dâlo",
        "passwordreset-nosuchcaller": "O ciamante o no l'existe: $1",
        "passwordreset-ignored": "A reimpostaçion da password a no l'è stæta gestia. Foscia n'è stæto configuou nisciun provider ?",
        "blockedtitle": "L'utente o l'é bloccòu",
        "blockedtext": "''''O to nomme utente ò adresso IP o l'è stæto bloccòu.'''\n\nO blòcco o l'è stæto fæto da $1. A raxon dæta a l'è ''$2''.\n\n* Prinçippio do blocco: $8\n* Fin do blocco: $6\n* Utente blocou: $7\n\nL'è poscibbile contattâ $1 ò un atro [[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discûtte inscio blòcco.\nNo ti poeu doeuviâ o comando \"Manda un'e-mail a st'utente\" se no ti g'hæ 'n adreçço e-mail registròu inte to [[Special:Preferences|preferençe]] e se no t'ê stæto bloccòu ascì.\nO to adreçço IP o l'è $3, e o to blòcco ID o l'è #$5.\nPe piaxei, pe domandâ de informaçioin, speçifficali tutti doî.",
        "autoblockedtext": "O teu addresso IP o l'è stæto bloccòu outomaticamente perché o l'ea za usòu da 'n âtro utente, bloccòu da $1.\nA raxon dæta a l'è stæta:\n\n:''$2''\n\n* Prinsippio do blòcco: $8\n* Fin do blòcco: $6\n\nTi peu contattâ $1 ò un âtro\n[[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discutte o blòcco.\n\nDanni a mente a che no ti pêu ûsâ o comando \"manda 'na e-mail a sto utente\" se non ti g'hæ 'n addresso de posta elettronega registròu in te têu [[Special:Preferences|preferense]] e se ti no t'ê stæto bloccòu ascì.\n\nO to adresso IP o l'è $3, e o to blòcco ID o l'è #$5. Pe piaxei, pe domandâ informaçioin, speçifficali tutti doî.",
+       "systemblockedtext": "O to nomme utente ò l'adresso IP o l'è stæto blocou aotomaticamente da MediaWiki.\nA raxon do blocco a l'è:\n\n:''$2''\n\n* Començo do blocco: $8\n* Scadença do blocco: $6\n* Intervallo de blocco: $7\n\nL'adresso IP attoale o l'è $3.\nSe prega de specificâ tutti i dettalli chì incluxi into compilâ qualunque recesta de ciarimenti.",
        "blockednoreason": "nisciun-a motivaçion dæta",
        "whitelistedittext": "Pe modificâ e paggine l'è necessaio $1.",
        "confirmedittext": "Pe ese abilitæ a-a modiffica de paggine bezeugna confermâ o proppio addresso e-mail. Pe impostâ e confermâ l'adresso servîse de [[Special:Preferences|preferençe]].",
        "newarticle": "(Nêuvo)",
        "newarticletext": "Sto colegaménto o corisponde a 'na pàgina ch'a no l'existe ancon.\n\nSe se vêu creâ a pàgina òua, se pêu comensâ a scrive into spàçio chì sotta.\n(amia e [$1 paggine d'agiûtto] pe ciû informaçioìn).\n\nSe t'ê intròu chì pe sballio,  sciacca '''Inderê''' into navegatô.",
        "anontalkpagetext": "----\n<em>Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua.</em> Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonnimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:CreateAccount|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .",
-       "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. Ti poeu [[Special:Search/{{PAGENAME}}|çercâ sto tittolo]] inti atre pagine do scito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri correlæ] oppû [{{fullurl:{{FULLPAGENAME}}|action=edit}} creâ questa pagina]</span>.",
+       "noarticletext": "Po-u momento a paggina çercâ a l'è voeua. Ti poeu [[Special:Search/{{PAGENAME}}|çercâ sto tittolo]] inti atre pagine do scito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri correlæ] oppû [{{fullurl:{{FULLPAGENAME}}|action=edit}} creâ questa paggina]</span>.",
        "noarticletext-nopermission": "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
        "missing-revision": "La verscion #$1 da paggina \"{{FULLPAGENAME}}\" a no l'esiste.\n\nQuesto succede solitamente se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi peuan ese attrovæ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
        "userpage-userdoesnotexist": "L'utensa \"$1\" a no corisponde a un utente registròu.\nTi veu davei creâ o modificâ sta paggina?",
        "previewnote": "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
        "continue-editing": "Vanni a l'area de modiffica",
        "previewconflict": "L'anteprimma a mostra o scrito presente inta casella de modiffica de d'ato coscì comme o l'apaiâ se ti çerni de sarvalo òua.",
-       "session_fail_preview": "Spiaxenti. No è stæto poscibile elaboâ a modifica perché son andæti persci i dæti relativi a-a sescion.\n\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+       "session_fail_preview": "Spiaxenti. No l'è stæto poscibile elaboâ a modiffica pe via da pèrdia di dæti relativi a-a sescion.\n\nFoscia t'ê stæto disconesso. <strong>Veifica d'ese ancon conligou e prœuva torna</strong>.\nSe o problema o persciste, ti pœu provâ a [[Special:UserLogout|scollegate]] e effetoâ un nœuvo accesso, controlando che o to navegatô o l'açette i cookie da questo scito.",
        "session_fail_preview_html": "Spiaxenti. No è stæto poscibbile elaboâ a modifica perché son anæti persci i dæti relativi a-a sescion.\n\n<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e gh'è stæto una perdia di dæti da sescion, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de un normale tentativo d'anteprimma, riproeuva.</strong> \nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegati]] e effettuâ un noeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
        "token_suffix_mismatch": "'''A modiffica a no l'è stæta sarvâ perché o to client o l'ha mostrou de gestî in moddo errou i carattei de puntezatua into token associou a-a mæxima. Pe evitâ una poscibile corruçion do testo da pagina, l'è stæto refuou l'intrega modiffica. Questa scituaçion a poeu veificase, de votte, quande s'adoeuvia di serviççi de proxy anonnimi via web che presentan di bug.'''",
        "edit_form_incomplete": "'''De parte do formulaio de modiffica n'han razonto o server; controlla che e modiffiche seggian intatte e ripreuva.'''",
        "search-external": "Riçerca esterna",
        "searchdisabled": "A riçerca de {{SITENAME}} a no l'è attiva. Into fratempo ti peu çercâ in sce Google. \nNotta che i so indexi di contegnui de {{SITENAME}} porrieivan no ese aggiornæ.",
        "search-error": "S'è verificou 'n errô durante a riçerca: $1",
+       "search-warning": "Gh'è stæto in alerta durante a çerchia: $1",
        "preferences": "Preferençe",
        "mypreferences": "Preferençe",
        "prefs-edits": "Modiffiche effettuæ:",
        "saveprefs": "Sarva",
        "restoreprefs": "Ripristina e impostaçioin predefinie (in tutte e seçioin)",
        "prefs-editing": "Cangia",
-       "rows": "Righe:",
-       "columns": "Colonne:",
        "searchresultshead": "Çerca",
        "stub-threshold": "Limmite pe-i collegamenti a-i sboççi ($1):",
        "stub-threshold-sample-link": "esempio",
        "prefs-help-recentchangescount": "Comprende i urtime modiffiche, paggine de stoie e registri.",
        "prefs-help-watchlist-token2": "Questa a l'è a ciave segretta pe-o feed web di to oservæ.\nChiunque a conosce saiâ in graddo de leze i to oservæ, quindi no stanni a condividdila. [[Special:ResetTokens|Clicca chi se ti g'hæ de besoeugno de rempostâla]].",
        "savedprefs": "E teu preferençe son stæte sarvæ.",
-       "savedrights": "I driti utente de {{GENDER:$1|$1}} son stæti sarvæ.",
+       "savedrights": "I groppi utente de {{GENDER:$1|$1}} son stæti sarvæ.",
        "timezonelegend": "Fuso oraio:",
        "localtime": "Oa locale:",
        "timezoneuseserverdefault": "Adeuvia l'oa predefinia do wiki ($1)",
        "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-lookup-user": "Gestisci i gruppi di utenti",
+       "userrights-lookup-user": "Seleçion-a un utente",
        "userrights-user-editname": "Scrivi o teu nomme utente:",
-       "editusergroup": "Modiffica groppi {{GENDER:$1|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",
        "saveusergroups": "Sarva groppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro impliçito de:",
        "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-nologin": "Pe assegnâ di driti a-i utenti ti g'hæ da [[Special:UserLogin|intrâ]] comme amministratô.",
-       "userrights-notallowed": "No ti g'hæ o permisso de azonze ò rimeuve i driti di utenti.",
        "userrights-changeable-col": "Gruppi che ti peu modificâ",
        "userrights-unchangeable-col": "Gruppi che no ti peu modificâ",
+       "userrights-expiry-current": "O descazze o $1",
+       "userrights-expiry-none": "O no descazze",
+       "userrights-expiry": "O descazze:",
        "userrights-conflict": "Conflito de modiffica di driti utente! Pe piaxei controlla e conferma e teu modiffiche.",
-       "userrights-removed-self": "T'hæ rimosso i teu driti. E quindi, no ti saiæ ciù in grou de accede a questa paggina.",
        "group": "Gruppo:",
        "group-user": "Ûtenti",
        "group-autoconfirmed": "Utenti aotoconfermæ",
        "right-siteadmin": "Abbrocca e sbrocca o database",
        "right-override-export-depth": "Esporta e paggine includendo e pagine collegæ scin a 'na profonditæ de 5",
        "right-sendemail": "Manda de email a di atri utenti",
-       "right-passwordreset": "Vedde i messaggi de rempostaçion da password",
        "right-managechangetags": "Crea e attiva/disattiva i [[Special:Tags|etichette]]",
        "right-applychangetags": "Apprica di [[Special:Tags|etichette]] a-e proppie modiffiche",
        "right-changetags": "Azonze e leva de specifiche [[Special:Tags|etichette]] insce scingole verscioin o voxe de registro",
        "grant-generic": "Pacchetto diritti \"$1\"",
        "grant-group-page-interaction": "Interagisce co-e paggine",
        "grant-group-file-interaction": "Interagisce co-i file murtimediali",
-       "grant-group-watchlist-interaction": "Interagisce con i to oservæ speçiali",
+       "grant-group-watchlist-interaction": "A l'interagisce co-i to oservæ speciali",
        "grant-group-email": "Invia email",
        "grant-group-high-volume": "Esegue açioin mascive",
        "grant-group-customization": "Personalizzaçion e preferençe",
        "grant-basic": "Driti de base",
        "grant-viewdeleted": "Vedde i file e e pagine scassæ",
        "grant-viewmywatchlist": "Vedde i to öservæ speçiali",
+       "grant-viewrestrictedlogs": "Amia i valoî privæ do registro",
        "newuserlogpage": "Nêuvi utenti",
        "newuserlogpagetext": "Questo o l'è un registro de creaçioin di utençe.",
        "rightslog": "Diritti d'ûtente",
        "recentchangeslinked-feed": "Cangiamenti correlæ",
        "recentchangeslinked-toolbox": "Cangiaménti corelæ",
        "recentchangeslinked-title": "Modiffiche correlæ a \"$1\"",
-       "recentchangeslinked-summary": "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a questa.\nE pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
+       "recentchangeslinked-summary": "Sta paggina a fa védde i cangiaménti ciù reçenti a-e pàggine conligæ a questa.\nE pàggine che t'hæ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
        "recentchangeslinked-page": "Nómme da pàgina:",
-       "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ",
+       "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàggine conligæ a-a pàggina specificâ",
        "recentchanges-page-added-to-category": "[[:$1]] azonto a-a categoria",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] azonta a-a categoria, [[Special:WhatLinksHere/$1|questa pagina a l'è inclusa a l'interno di atre pagine]]",
        "recentchanges-page-removed-from-category": "[[:$1]] rimosso da-a categoria",
        "uploaded-script-svg": "Trovou elemento de script \"$1\" into file caregou in formato SVG.",
        "uploaded-hostile-svg": "Trovou CSS no seguo inte l'elemento de stile do file in formato SVG caregou.",
        "uploaded-event-handler-on-svg": "Impostâ i attributi de gestion di eventi <code>$1=\"$2\"</code> no l'è consentio inti file SGV",
-       "uploaded-href-attribute-svg": "i attributi href inti file SVG poeuan collegâse solo verso e destinaçioin http:// o https://, trovou <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-attribute-svg": "i attributi href inti file SVG pœuan ese inganciæ solo ch'a-e destinaçioin http:// o https://, trovou <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Trovou href a dæti non segui: destinaçion URI <code>&lt;$1 $2=\"$3\"&gt;</code> caregou into file SVG",
        "uploaded-animate-svg": "Trovou o tag \"animate\" ch'o poriæ cangiâ href, doeuviando l'attributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> into file SVG caregou.",
        "uploaded-setting-event-handler-svg": "A configuaçion di attributi pe-o gestô di eventi a l'è bloccâ, trovou <code>&lt;$1 $2=\"$3\"&gt;</code> into file SVG caregou.",
        "uploaded-setting-handler-svg": "o SVG ch'o l'imposta l'attributo \"handler\" con remote/data/script o l'è bloccou. Trovou <code>$1=\"$2\"</code>into file SVG caregou.",
        "uploaded-remote-url-svg": "o SVG ch'o l'imposta qua-se-sæ attributo de stile con di URL remoti o l'è bloccato. Trovou <code>$1=\"$2\"</code> into file SVG caregou.",
        "uploaded-image-filter-svg": "Trovou filtro immaggine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> into file in formato SVG caregou.",
-       "uploadscriptednamespace": "Questo file SVG o conten un namespace '$1' non consentio",
+       "uploadscriptednamespace": "Questo file SVG o conten un namespace '<nowiki>$1</nowiki>' non consentio",
        "uploadinvalidxml": "O codiçe XML into file caregou o no poeu ese elaboou.",
        "uploadvirus": "Questo file o conten un virus! Dettaggi: $1",
        "uploadjava": "Questo file o l'è un file ZIP ch'o conten un file .class Java.\nCaregâ i file Java no l'è consentio, perché poeuan caosâ l'aggiamento de restriçioin de segueçça.",
        "imagelinks": "Ûzo do file",
        "linkstoimage": "{{PLURAL:$1|A segoente pàgina a contegne|E segoenti $1 pàgine contegnan}} colegaménti a-o file:",
        "linkstoimage-more": "Ciù de $1 {{PLURAL:$1|pagina aponta|pagine apontan}} a questo file.\nA seguente lista a mostra {{PLURAL:$1|a primma paggina ch'a l'aponta|e primme $1 paggine ch'apontan}} a sto file.\nL'è disponibile un [[Special:WhatLinksHere/$2|elenco completo]].",
-       "nolinkstoimage": "No gh'è nisciûnn-a pàgina collegâ con 'sto file.",
+       "nolinkstoimage": "No gh'è nisciun-a paggina inganciâ a sto file.",
        "morelinkstoimage": "Vixualizza [[Special:WhatLinksHere/$1|di atri inganci]] a questo file.",
        "linkstoimage-redirect": "$1 (rendriççamento file) $2",
        "duplicatesoffile": "{{PLURAL:$1|O seguente file o l'è un dupricou|I seguenti $1 file son di dupricæ}} de questo file ([[Special:FileDuplicateSearch/$2|urteioî detaggi]]):",
        "mimetype": "Tipo MIME:",
        "download": "scarrega",
        "unwatchedpages": "Paggine non öservæ",
-       "listredirects": "Lista de rindirissamenti",
+       "listredirects": "Lista di rendriççi",
        "listduplicatedfiles": "Lista di file doggi",
        "listduplicatedfiles-summary": "Questo o l'è un elenco di file, donde a verscion ciù reçente de 'n file a l'è un dupricou da verscion ciù reçente de 'n atro file. Se piggia in  conscideraçion solo che i file locali.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] o g'ha [[$3|{{PLURAL:$2|un duplicou|$2 duplicæ}}]].",
        "pageswithprop-submit": "Vanni",
        "pageswithprop-prophidden-long": "valô testoale longo da propietæ ascoso ($1)",
        "pageswithprop-prophidden-binary": "valô binaio da propietæ ascoso ($1)",
-       "doubleredirects": "Rindirissamenti doggi",
+       "doubleredirects": "Rendriççi doggi",
        "doubleredirectstext": "In questa pagina gh'è elencou e paggine che rendiriççan a di atre paggine de redirect.\nOgni riga a conten i collegamenti a-o primmo e a-o segondo redirect, oltre a-a primma riga de testo do segondo redirect che a l'uso o conten a paggina de destinaçion \"corretta\" a-a quæ doviæ puntâ o primmo redirect ascì.\nI redirect <del>scassæ</del> son stæti corretti.",
        "double-redirect-fixed-move": "[[$1]] o l'è stæto mesciou.\nO l'è stato aggiornou aotomaticamente e oua o l'è un redirect a [[$2]].",
        "double-redirect-fixed-maintenance": "Corretto aotomaticamente o redirect doggio da [[$1]] a [[$2]] into travaggio de manutençion.",
        "double-redirect-fixer": "Correttô di redirect",
        "brokenredirects": "Rindirissamenti sballiæ",
-       "brokenredirectstext": "I rendriççi chì de sotta colegan a de paggine inexistente:",
+       "brokenredirectstext": "I rendriççi chì de sotta apontan a de paggine inexistente:",
        "brokenredirects-edit": "cangia",
        "brokenredirects-delete": "scassa",
        "withoutinterwiki": "Paggine sensa interwiki",
        "ntransclusions": "Doeuviou inte $1 {{PLURAL:$1|paggina|paggine}}",
        "specialpage-empty": "Questa paggina speciale a l'è attualmente voeua.",
        "lonelypages": "Paggine orfane",
-       "lonelypagestext": "E seguente paggine no son incluse ni colegæ a di atre paggine de {{SITENAME}}.",
+       "lonelypagestext": "E seguente paggine no son incluse ni conligæ a di atre paggine de {{SITENAME}}.",
        "uncategorizedpages": "Paggine sensa categorîa",
        "uncategorizedcategories": "Categorîe sensa categorîa",
        "uncategorizedimages": "Immaggini sensa categorîa",
        "unusedimages": "File inutilizæ",
        "wantedcategories": "Categorîe domandæ",
        "wantedpages": "Paggine domandæ",
-       "wantedpages-summary": "Lista de paggine inexistente co-o ciu gran nummero de collegamenti a lô, escludendo e pagine ch'han solo che i rendiriççi che-e collegan. Pe 'n elenco de pagine inexistente che g'han di rendriççi che-e collegan, amia [[{{#special:BrokenRedirects}}|a lista di rendriççi erræ]].",
+       "wantedpages-summary": "Lista de paggine inexistente co-o ciu gran nummero d'inganci a lô, escludendo e pagine inganciæ solo che da di rendriççi. Pe 'na lista de pagine inexistente inganciæ da di rendriççi, amia [[{{#special:BrokenRedirects}}|a lista di rendriççi erræ]].",
        "wantedpages-badtitle": "Tittolo invallido into groppo di risultæ: $1",
        "wantedfiles": "File domandæ",
        "wantedfiletext-cat": "I seguenti file son in doeuvia, ma no existan. I file ospitæ inte di repository esterni porieivan esighe elencæ sciben che existan. Questi fasci poxitivi saian <del>barræ</del>. E pagine che incòrpoan i file che no existan son elencæ in [[:$1]].",
        "ancientpages": "Paggine ciû vëgie",
        "move": "Mescia",
        "movethispage": "Mescia 'sta paggina",
-       "unusedimagestext": "I seguenti file existan ma no son doeuviæ inte nisciun-a paggina.\nNotta che di atri sciti web porieivan ese colegæ a 'n file co-in URL diretto, e coscì o poriæ ese inte sta lista sciuben ch'o segge in doeuvia.",
+       "unusedimagestext": "I seguenti file existan ma no son doeuviæ inte nisciun-a paggina.\nNotta che di atri sciti web porieivan ese conligæ a 'n file co-in URL diretto, e coscì o poriæ ese inte sta lista sciuben ch'o segge in doeuvia.",
        "unusedcategoriestext": "E seguente paggine de categoria existan, sciben che nisciun'atra paggina o categoria a-e doeuvie.",
        "notargettitle": "Dæti mancanti",
        "notargettext": "No t'hæ indicou una pagina o un utente con chi eseguî sta fonçion.",
        "apisandbox-alert-field": "O valô de questo campo o no l'è vallido.",
        "apisandbox-continue": "Continnoa",
        "apisandbox-continue-clear": "Nettezza",
+       "apisandbox-param-limit": "Inseisci <kbd>max</kbd> pe doeuviâ o limmite mascimo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tutti i namespace)",
+       "apisandbox-multivalue-all-values": "$1 (Tutti i valoî)",
        "booksources": "Fonte libraie",
        "booksources-search-legend": "Çerca e fonti",
        "booksources-isbn": "Codice ISBN:",
        "booksources-search": "Çerca",
        "booksources-text": "De sotta unn-a lista d'inganci a di ätri sciti che vendan libbri neuvi e vegi e che porrieivan avei ciu informaçioin in scî libbri che ti çerchi",
        "booksources-invalid-isbn": "O ISBN inserio pâ no ese vallido; controlla che no ghe segge stæto di ari into copiâlo da-a fonte originale.",
+       "magiclink-tracking-rfc": "Paggine ch'adoeuvian di inganci maggichi RFC",
+       "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.",
        "specialloguserlabel": "Açion effettuâ da:",
        "speciallogtitlelabel": "Açion effettuâ sciu (tittolo da paggina ò {{ns:user}}:Nomme utente):",
        "log": "Log",
        "nolinkshere-ns": "Pagine ch'apontan a '''[[:$1]]''' into namespace seleçionou no ghe n'è.",
        "isredirect": "Paggina de rindirissamento",
        "istemplate": "Incluxon",
-       "isimage": "Colegamento a file",
+       "isimage": "Ingancio a-o file",
        "whatlinkshere-prev": "{{PLURAL:$1|precedente|precedenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|sûccescivo|sûccescivi $1}}",
        "whatlinkshere-links": "← colegaménti",
        "export-addns": "Azonzi",
        "export-download": "Sarva comme file",
        "export-templates": "Inciodi i template",
-       "export-pagelinks": "Includdi paggine colegæ scin a 'na profonditæ de:",
+       "export-pagelinks": "Includdi paggine conligæ scin a 'na profonditæ de:",
        "export-manual": "Azonzi paggine manoalmente:",
        "allmessages": "Messaggi do scistema",
        "allmessagesname": "Nomme",
        "import-nonewrevisions": "Nisciun-a verscion importâ (ean zà tutte presente, ò satæ pe via di erroî)",
        "xml-error-string": "$1 a-a riga $2, colonna $3 (byte $4): $5",
        "import-upload": "Carrega dæti XML",
-       "import-token-mismatch": "I dæti relativi a-a sescion son anæti persci. Riproeuva.\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+       "import-token-mismatch": "I dæti relativi a-a sescion son anæti persci. Riprœuva.\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon conligou e riprœuva</strong>.\nSe o problema o persciste, ti pœu provâ a [[Special:UserLogout|sconligâte]] e effettuâ un nœuvo accesso, controlando che o to navegatô o l'açette i cookie da questo scito.",
        "import-invalid-interwiki": "Imposcibbile importâ da-o progetto wiki indicou.",
        "import-error-edit": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a modificâla.",
        "import-error-create": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a creâla.",
        "tooltip-n-recentchanges": "I ùrtimi cangiaménti into scîto",
        "tooltip-n-randompage": "Fanni vedde 'na pagina a brettio.",
        "tooltip-n-help": "Pagine d'agiùtto",
-       "tooltip-t-whatlinkshere": "Lista de tùtte e pagine che son colegæ a sta chì.",
-       "tooltip-t-recentchangeslinked": "Ùrtimi càngi de pàgine colegæ a quésta",
+       "tooltip-t-whatlinkshere": "Lista de tùtte e paggine ch'en conligæ a sta chì.",
+       "tooltip-t-recentchangeslinked": "Ùrtimi càngi de pàggine conligæ a questa",
        "tooltip-feed-rss": "Feed RSS pe questa paggina",
        "tooltip-feed-atom": "Feed Atom pe sta pàgina",
        "tooltip-t-contributions": "Lista de contribûssioin de {{GENDER:$1|questo|questa}} utente",
        "tooltip-t-print": "Verscion stanpabbile de sta paggina",
        "tooltip-t-permalink": "Colegaménto fisso a sta revixión da pàgina",
        "tooltip-ca-nstab-main": "Véddi a vôxe",
-       "tooltip-ca-nstab-user": "Veddi a pàgina d'utente",
+       "tooltip-ca-nstab-user": "Amîa a paggina utente",
        "tooltip-ca-nstab-media": "Veddi a paggina do file murtimediâ",
        "tooltip-ca-nstab-special": "Sta chi l'è 'na pàgina speciâle e a no peu êse cangiâ",
        "tooltip-ca-nstab-project": "Veddi a paggina de servissio",
        "exif-pixelxdimension": "Largheçça immaggine",
        "exif-pixelydimension": "Ateçça immaggine",
        "exif-usercomment": "Notte de l'utente",
-       "exif-relatedsoundfile": "File audio collegou",
+       "exif-relatedsoundfile": "File audio conligou",
        "exif-datetimeoriginal": "Dæta e oa de creassion di dæti",
        "exif-datetimedigitized": "Dæta e oa de digitalizzaçion",
        "exif-subsectime": "Dæta e oa, fraçioin de segondo",
        "exif-originaldocumentid": "ID univvoco do documento origin*a",
        "exif-licenseurl": "URL pe-a liçença do copyright",
        "exif-morepermissionsurl": "Informaçioin insce e liçençe alternative",
-       "exif-attributionurl": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei coleghite a",
+       "exif-attributionurl": "Se quest'œuvia ti l'adœuvi torna, pe piaxei metti 'n ingancio a",
        "exif-preferredattributionname": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei attribuiscine a paternitæ a",
        "exif-pngfilecomment": "Commento do file JPEG",
        "exif-disclaimer": "Avertençe",
        "confirmemail_loggedin": "L'adreçço e-mail o l'è stæto confermou.",
        "confirmemail_subject": "{{SITENAME}}: recesta de conferma de l'adreççoo",
        "confirmemail_body": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha registrou l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe *no* t'ê stæto ti a registrâ l'utença, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:\n\n$5\n\nQuesto coddiçe de conferma o descaziâ aotomaticamente a $4.",
-       "confirmemail_body_changed": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha modificou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e riattivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
-       "confirmemail_body_set": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha impostcou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
+       "confirmemail_body_changed": "Quarcun, foscia ti mæximo da l'adresso IP $1, o l'ha modificou l'adresso e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adresso e-mail.\n\nPe confermâ che l'utença a t'apparten davei e riattivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi l'ingancio seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui st'ingancio pe annulâ a conferma de l'adresso e-mail:",
+       "confirmemail_body_set": "Quarcun, foscia ti mæximo da l'adresso IP $1, o l'ha impostou l'adresso e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adresso e-mail.\n\nPe confermâ che l'utença a t'aparten davei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi l'ingancio seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui st'ingancio pe annulâ a conferma de l'adresso e-mail:",
        "confirmemail_invalidated": "Recesta de conferma adreçço e-mail annulâ",
        "invalidateemail": "Annulla a recesta de conferma e-mail",
        "notificationemail_subject_changed": "L'adreçço de posta elettronica registrou insce {{SITENAME}} o l'è stæto modificou",
        "feedback-useragent": "Agente utente:",
        "searchsuggest-search": "Çerca in {{SITENAME}}",
        "searchsuggest-containing": "ch'o conten...",
-       "api-error-autoblocked": "O to adreçço IP o l'è stæto bloccou aotomaticamente, perché o l'è stæto doeuviou da un utente bloccou.",
-       "api-error-badaccess-groups": "No t'ê aotorizzou a caregâ di file insce questa wiki.",
        "api-error-badtoken": "Errô interno: token errou.",
-       "api-error-blocked": "T'ê stæto bloccou, no ti poeu fâ modiffiche.",
-       "api-error-copyuploaddisabled": "O caregamento trammite URL o l'è disabilitou insce questo server.",
-       "api-error-duplicate": "Gh'è za {{PLURAL:$1|un atro file|di atri files}} into scito co-o mæximo contegnuo.",
-       "api-error-duplicate-archive": "Gh'ea za {{PLURAL:$1|un atro file|di ltri file}} into scito co-o mæximo contegnuo, ma {{PLURAL:$1|o l'è stæto scassou|son stæti scassæ}}.",
-       "api-error-empty-file": "O file che t'hæ inviou o l'è voeuo.",
        "api-error-emptypage": "A creaçion de noeuve pagine voeue a no l'è consentia.",
-       "api-error-fetchfileerror": "Errô interno: s'è verificou un problema durante o recuppero do file.",
-       "api-error-fileexists-forbidden": "Un file de nomme \"$1\" o l'existe za e o no poeu ese sorvescrito.",
-       "api-error-fileexists-shared-forbidden": "Un file de nomme \"$1\" o l'existe za into repository condiviso e o no poeu ese sorvescrito.",
-       "api-error-file-too-large": "O file che t'hæ inviou o l'ea troppo grande.",
-       "api-error-filename-tooshort": "O nomme do file o l'è troppo curto.",
-       "api-error-filetype-banned": "Questo tipo de file o l'è proibio.",
-       "api-error-filetype-banned-type": "\"$1\" {{PLURAL:$4|o no l'è un tipo de file consentio|no son di tipi de file consentii}}. {{PLURAL:$3|O tipo de file consentio o l'è|I tipi de file consentii son}} $2.",
-       "api-error-filetype-missing": "A-o file gh'amanca l'estenscion.",
-       "api-error-hookaborted": "A modiffica che t'hæ çercou de fâ a l'è stæta interrotta da un'estenscion.",
-       "api-error-http": "Errô interno: imposcibbile connettise a-o server.",
-       "api-error-illegal-filename": "O nomme do file o no l'è ammisso.",
-       "api-error-internal-error": "Errô interno: quarcosa o l'è anæto storto con l'elaboaçion do to caregamento in sciâ wiki.",
-       "api-error-invalid-file-key": "Errô interno: file non presente inta cartella di file temporannei.",
-       "api-error-missingparam": "Errô interno: parammetri da recesta mancanti.",
-       "api-error-missingresult": "Errô interno: imposcibbile determinâ se a coppia a l'è ariescîa.",
-       "api-error-mustbeloggedin": "Pe caregâ di file ti devi primma intrâ.",
-       "api-error-mustbeposted": "Errô interno: a recesta a richiede HTTP POST.",
-       "api-error-noimageinfo": "O caregamento o l'è ariescio, ma o server o no n'ha dæto arcun-a informaçion  in sciô file.",
-       "api-error-nomodule": "Errô interno: no l'è stæto impostou o moddulo de caregamento.",
-       "api-error-ok-but-empty": "Errô interno: nisciun-a risposta da-o server.",
-       "api-error-overwrite": "No l'è permisso soviascrive un file existente.",
-       "api-error-ratelimited": "Ti çerchi de caregâ ciù file in meno tempo de quante questo wiki o permette.\nRiproeuva tra pochi menuti.",
-       "api-error-stashfailed": "Errô interno: o server o no l'è ariescio a memorizzâ o documento temporannio.",
        "api-error-publishfailed": "Errô interno: o server o no l'è ariescio a pubbricâ o documento temporannio.",
-       "api-error-stasherror": "S'è veificou un errô durante o caregamento do file inta stash.",
-       "api-error-stashedfilenotfound": "O file inta stash o no l'è stæto trovou durante o tentativo de caregâ da-a stash.",
-       "api-error-stashpathinvalid": "O percorso ch'o l'aviæ dovuo portâ a-o file inta stash o no l'ea vallido.",
-       "api-error-stashfilestorage": "S'è veificou un errô durante a memorizzaçion do file inta stash.",
-       "api-error-stashzerolength": "O server o no poeu insei o file inta stash, perché o g'ha longheçça zero.",
-       "api-error-stashnotloggedin": "Pe poei sarvâ di file inta stash de caregamento ti devi primma intrâ.",
-       "api-error-stashwrongowner": "O file a-o quæ ti çercavi d'accede inta stash o no t'apparten.",
-       "api-error-stashnosuchfilekey": "A ciave do file a-a quæ ti çercavi d'accede inta stash a no l'existe.",
-       "api-error-timeout": "O server o no l'ha risposto entro o tempo previsto.",
-       "api-error-unclassified": "Gh'è stæto un aro sconosciuo.",
-       "api-error-unknown-code": "Errô sconosciuo: \"$1\"",
-       "api-error-unknown-error": "Errô interno: quarcosa l'è anæto storto provando a caregâ o file.",
+       "api-error-stashfailed": "Errô interno: o server o no l'è ariescio a memorizzâ o documento temporannio.",
        "api-error-unknown-warning": "Avviso sconosciuo: $1",
        "api-error-unknownerror": "Errô sconosciuo: \"$1\"",
-       "api-error-uploaddisabled": "O caregamento o l'è disabilitou insce questa wiki.",
-       "api-error-verification-error": "Questo file o poriæ ese dannezou, o aveighe l'estenscion sbaliâ.",
-       "api-error-was-deleted": "Un file co-o mæximo nomme o l'è stæto precedentemente caregou e succescivamente eliminou.",
        "duration-seconds": "$1 {{PLURAL:$1|segondo|segondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|menuto|menuti}}",
        "duration-hours": "$1 {{PLURAL:$1|oa|oe}}",
        "json-error-recursion": "Un o ciù rifeimenti ricorscivi into valô da codificâ",
        "json-error-inf-or-nan": "Un ò ciu valoî NAN o INF into valô da codificâ",
        "json-error-unsupported-type": "L'è stæto fornio un valô de un tipo ch'o no poeu ese codificou",
-       "headline-anchor-title": "Colegamento a questa seçion",
+       "headline-anchor-title": "Ingancio a questa seçion",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin esteiso",
        "special-characters-group-ipa": "IPA",
        "authmanager-authn-not-in-progress": "L'aotenticaçion a no l'è in corso ò i dæti da sescion son anæti persci. Se prega de recomençâ da cavo.",
        "authmanager-authn-no-primary": "E credençiæ fornie no poeuan ese aotenticæ.",
        "authmanager-authn-no-local-user": "E credençiæ fornie no son associæ a nisciun utente de questo wiki.",
-       "authmanager-authn-no-local-user-link": "E credençiæ fornie son vallide ma no son associæ a nisciun utente de questa wiki. Accedi inte 'n atro moddo ò crea un noeuvo utente, e ti gh'aviæ 'n'opçion pe collegâ e to credençiæ precedente a quell'utença.",
+       "authmanager-authn-no-local-user-link": "E credençiæ fornie son vallide ma no son associæ a nisciun utente de questa wiki. Accedi inte 'n atro moddo ò crea un nœuvo utente, e ti gh'aviæ 'n'opçion pe conligâ e to credençiæ precedente a quell'utença.",
        "authmanager-authn-autocreate-failed": "Creaçion aotomattica de 'n'utença locale fallia: $1",
        "authmanager-change-not-supported": "E credençiæ fornie no poeuan ese modificæ, dæto che no saieivan doeuviæ da ninte.",
        "authmanager-create-disabled": "A creaçion di utençe a l'è disabilitâ.",
        "authmanager-create-from-login": "Pe creâ a to utença, completa i campi chì de sotta.",
        "authmanager-create-not-in-progress": "A creaçion de un'utença a no l'è in corso ò i dæti da sescion son anæti perdui. Se prega de recomençâ da cavo.",
        "authmanager-create-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-a creaçion de l'utença.",
-       "authmanager-link-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-o colegamento de l'utença.",
-       "authmanager-link-not-in-progress": "O colegamento de l'utença o no procede ò i dæti da sescion so-anæti perdui. Se prega de recomençâ da cavo.",
+       "authmanager-link-no-primary": "E credençiæ fornie no pœuan ese dœuviæ pe conligâ l'utença.",
+       "authmanager-link-not-in-progress": "O conligamento de l'utença o no procede ò i dæti da sescion so-anæti perdui. Se prega de recomençâ da cavo.",
        "authmanager-authplugin-setpass-failed-title": "Modiffica da password fallia",
        "authmanager-authplugin-setpass-failed-message": "O plugin d'aotenticaçion o l'ha impedio a modiffica da password.",
        "authmanager-authplugin-create-fail": "O plugin d'aotenticaçion o l'ha impedio a creaçion de l'utença.",
        "authmanager-provider-temporarypassword": "Password temporannia",
        "authprovider-confirmlink-message": "Basandose insce di reçenti tentativi d'accesso, e seguente utençe poeuan ese collegæ a-o to account wiki. Collegandole ti poeu effettuâ l'accesso con quelle ascì. Se prega de seleçionâ quelle che devan ese collegæ.",
        "authprovider-confirmlink-request-label": "Utençe che dovieivan ese collegæ",
-       "authprovider-confirmlink-success-line": "$1: collegou correttamente.",
+       "authprovider-confirmlink-success-line": "$1: inganciou correttamente.",
        "authprovider-confirmlink-failed": "O collegamento de l'utença o no l'è pin-amente ariescio: $1",
        "authprovider-confirmlink-ok-help": "Continnoa doppo a visualizzaçion di messaggi de errô de collegamento.",
        "authprovider-resetpass-skip-label": "Sata",
        "authprovider-resetpass-skip-help": "Sata a rempostaçion da password.",
-       "authform-nosession-login": "L'aotenticaçion a l'ha avuo successo, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n\n$1",
-       "authform-nosession-signup": "L'utença a l'è stæta creâ, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n$1",
+       "authform-nosession-login": "L'aotenticaçion a l'ha avuo successo, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê conligou.\n\n$1",
+       "authform-nosession-signup": "L'utença a l'è stæta creâ, ma o to navegatô o no l'è in graddo d'\"aregordâ\" che t'ê conligou.\n$1",
        "authform-newtoken": "Token mancante. $1",
        "authform-notoken": "Token mancante",
        "authform-wrongtoken": "Token errou",
        "cannotlink-no-provider-title": "Utençe collegabbile no ghe n'è",
        "cannotlink-no-provider": "Utençe colegabbile no ghe n'è.",
        "linkaccounts": "Collega utençe",
-       "linkaccounts-success-text": "L'utença a l'è stæta colegâ.",
+       "linkaccounts-success-text": "L'utença a l'è stæta inganciâ.",
        "linkaccounts-submit": "Collega utençe",
        "unlinkaccounts": "Scollega utençe",
        "unlinkaccounts-success": "L'utença a l'è stæta scollegâ.",
index c906996..453060c 100644 (file)
@@ -5,7 +5,8 @@
                        "Erdemaslancan",
                        "Ohpuu",
                        "Warbola",
-                       "아라"
+                       "아라",
+                       "Kengšepā"
                ]
        },
        "sunday": "pivāpǟva",
@@ -71,7 +72,7 @@
        "noindex-category": "Lēḑõd bäz indeksõ",
        "about": "Titõl-tīetõkst",
        "newwindow": "(lǟb vāldiž ūdsõ läbūs)",
-       "cancel": " Kitõgid jarā",
+       "cancel": "Tijālizõks",
        "mytalk": "Nõvpidāmi",
        "navigation": "Navigīerimi",
        "qbfind": "Vȯtšõgid",
@@ -90,6 +91,8 @@
        "history_short": "Istōrij",
        "printableversion": "Drukkimiz versij",
        "permalink": "Iggi siḑīm",
+       "view": "Vaņțõl",
+       "view-foreign": "Vaņțõl pāikas $1",
        "edit": "Redigīer",
        "create": "Lūo",
        "editthispage": "Redigīer siedā līedtõ",
        "otherlanguages": "Mūši kīelši",
        "redirectedfrom": "(Jeddõpēḑõn sōtõd līedstõ $1)",
        "redirectpagesub": "Jeddõpēḑõn sōtimiz lēḑ",
-       "lastmodifiedat": "Perri mõitiņtimi: $2 $1",
+       "lastmodifiedat": "Perri mȭitiztimi: $2 $1",
        "jumpto": "Li:",
        "jumptonavigation": "navigīerimiz kast",
-       "jumptosearch": "Vȯtšõgid",
+       "jumptosearch": "vȯtš",
        "aboutsite": "Iļ {{SITENAME}}",
        "aboutpage": "Project:Tītõl tieutõkst",
        "copyright": "Amā tekstõ um kȭlbatõmist litsents #$1 pierrõ",
        "editold": "redigīerõgid",
        "viewsourceold": "vaņ ovāt-tekstõ",
        "editlink": "redigīerõgid",
-       "viewsourcelink": "vaņ ovāt-tekstõ",
+       "viewsourcelink": "vaņțõl ovāt-tekstõ",
        "editsectionhint": "Redigīer jaggõ $1",
        "toc": "Sižāli",
        "showtoc": "nägţõgid",
-       "hidetoc": "vōrõgid jarā",
+       "hidetoc": "vaŗț",
        "site-rss-feed": "$1 RSS sīeţ",
        "site-atom-feed": "$1 Atom sīeţ",
        "page-rss-feed": "\"$1\" RSS sīeţ",
        "nstab-image": "Bīlda",
        "nstab-template": "Mall",
        "nstab-category": "Kategōrij",
+       "mainpage-nstab": "Eḑḑilēḑ",
        "missing-article": " Datubāz äb lieudõn kizdõd līed ''$1'' $2 tekstõ. Sīkõks võib vȱlda mõitõkst agā istōrij siḑīm jarā kištāntõd lēḑ pǟlõ.  Až ažād äb ūo nei,  võib vȱlda ka vigā sistēms. Siz um kītõmõst ka [[Special:ListUsers/sysop| administrātorõn]] ja tämmõn āndamizt ka sīe līed internet adres",
        "missingarticle-rev": "(redaktsij: $1)",
        "badtitle": "Vigāli pēļikēra",
        "badtitletext": "Tōdõd līed pēļikēra vȯļ vigāli, tijā agā tuoizõst kīel versiōnist agā vikist äbõigistiz sidtõd. Sīe sizzõl võib vȱlda ikš agā jemīņ simbōlõ, midā äb sō pēļikēris kȭlbatõ.",
-       "viewsource": "Vaņ ovāt tekstõ",
+       "viewsource": "Vaņțõl ovāt tekstõ",
        "yourname": "Kȭlbatijiznim:",
        "yourpassword": "Sallisõnä:",
+       "userlogin-yourpassword": "Sallisõnā",
+       "userlogin-yourpassword-ph": "Kērat sallisõnā",
        "yourpasswordagain": "Kēratigid sallisõnā ūtstõ:",
        "login": "Log sīezõ",
        "nav-login-createaccount": "Log sīezõ agā registrīer kȭlbatijizõks",
        "userlogout": "Log ulzõ",
        "nologin": "Až täddõn äb ūo eņtš konto, '''$1'''.",
        "nologinlink": "Registrīerõgid täs",
-       "createaccount": "Lūogid ūž konto",
+       "createaccount": "Lūo kont",
        "gotaccount": "Až täddõn jubā um eņtš konto, '''$1'''.",
        "gotaccountlink": "Log sīezõ",
        "userlogin-resetlink": "Kas tēg unīztõ jarā eņtš sizzõlkēratimiz tīetõkst?",
+       "createacct-submit": "Lūo kont",
        "mailmypassword": "Sōtõgid e-kēras ūž sallisõnā",
        "loginlanguagelabel": "Kēļ: $1",
+       "pt-login": "Log sizzõl",
+       "pt-createaccount": "Lūo kont",
+       "pt-userlogout": "Log ulzõ",
        "bold_sample": "Razzi kēra",
        "bold_tip": "Razzi kēra",
        "italic_sample": "Slīp kēra",
        "hr_tip": "Horizontāli krīpš (kȭlbatõgid bäz tērõmizt)",
        "summary": "Kubbõ võtāmi:",
        "subject": "Pēļikēra:",
-       "minoredit": "Se um ikš piški parāmtimi",
+       "minoredit": "Se um ikš piški parāntimi",
        "watchthis": "Vaņ iļ siedā līedpūoltõ",
-       "savearticle": "Sa-gläbbõmi",
+       "savearticle": "Sa-glōibimi",
        "preview": "Jedmõl-vaņtlimi",
        "showpreview": "Nägţ jeddõl vaņtlimizt",
        "showdiff": "Nägţ mõitõkši",
        "histfirst": "Ežmizt",
        "histlast": "Perrizt",
        "history-feed-item-nocomment": "$1 - $2",
-       "rev-delundel": "nägţ/vaŗ jarā",
+       "rev-delundel": "nägț/vaŗț",
        "revdel-restore": "Mõitiņt nǟdõbõzt",
        "revertmerge": "Kīeld jarā kubbõ vieddimi",
-       "history-title": "Līed mõitõkst istōrij \"$1\"",
+       "history-title": "Līed mȭitõkst istōrij \"$1\"",
        "lineno": "Rīnda $1:",
        "compareselectedversions": "Līdzinţ vēļdõt redaktsijḑi",
        "editundo": "kištānt jarā",
        "search-interwiki-more": " (vel)",
        "searchrelated": "sidtõd",
        "searchall": "tikkiž",
-       "search-nonefound": "Vȯtšimizõn vȯtšimi äb lieudtõd vastūkst.",
+       "search-nonefound": "Vȯtšimizõn äb ūo lieudtõd vastūkst.",
        "powersearch-legend": " Juo akurāt vȯtšimi",
        "powersearch-ns": "Vȯtšimi nim-rūimšti:",
        "preferences": "Mīeldõbõd ulzõ-vēļimizt",
        "rightslog": "Kȭlbatijiz õigõmt log",
        "action-edit": "siedā līedtõ mõitiņtõ",
        "nchanges": "$1 {{PLURAL:$1|mõitõks|mõitõkst}}",
-       "recentchanges": "Perrizt mõitõkst",
+       "enhancedrc-history": "Istōrij",
+       "recentchanges": "Perrizt mȭitõkst",
        "recentchanges-legend": "Perrizt mõitõkst",
-       "recentchanges-summary": "Vaņ sīe līed pǟl tīedõd perīži mõitõkši.",
+       "recentchanges-summary": "Vaņțõl sīe līed pǟl tīedõd perīži mȭitõkši.",
        "recentchanges-feed-description": "Vaņ iļ vikipēdijõz tīedõd perīži mõitõkši.",
        "recentchanges-label-newpage": "Se mõitõks luoi ūd līed",
        "recentchanges-label-minor": "Se um ikš piški parāmtimi",
        "recentchanges-label-bot": "Sīe mõitõks tei ikš robot",
-       "recentchanges-label-unpatrolled": "Se mõitõks tēji vȯļ ikš robot",
+       "recentchanges-label-unpatrolled": "Se mȭitõks tēji vȯļ ikš robot",
        "rcnotefrom": "Allõ-pūol um tūodõd mõitõkst  '''$2''' sōņõst: (nägţõbõd amā jemīņ '''$1''' mõitõkst)",
        "rclistfrom": "Nägţ mõitõkši sōņõst: $3 $2",
        "rcshowhideminor": "$1 piškizt parāmtimizt",
+       "rcshowhideminor-show": "Nägț",
+       "rcshowhideminor-hide": "vaŗț",
        "rcshowhidebots": "$1 robōtõd",
+       "rcshowhidebots-show": "Nägț",
+       "rcshowhidebots-hide": "Vaŗț",
        "rcshowhideliu": "$1 sīezõ loggõnd kȭlbatijizt",
+       "rcshowhideliu-hide": "vaŗț",
        "rcshowhideanons": "$1 bäz nimmõ kȭlbatijizt",
+       "rcshowhideanons-show": "Nägț",
+       "rcshowhideanons-hide": "vaŗț",
        "rcshowhidepatr": "$1 vaņtlõd mõitõkst",
        "rcshowhidemine": "$1 min parāmtimizt",
+       "rcshowhidemine-show": "Nägț",
+       "rcshowhidemine-hide": "vaŗț",
        "rclinks": "Nägţ perīži $1 mõitõkši lǟndz $2 pǟva āigal <br />$3",
        "diff": "vaiţ",
        "hist": "istōrij",
-       "hide": "Vaŗ jarā",
+       "hide": "vaŗț",
        "show": "Nägţ",
        "minoreditletter": "p",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-enhanced-expand": "Nägţ jo akurātidi ažḑi (Javascriptõ um vajāg)",
        "rc-enhanced-hide": "Vaŗ jarā",
-       "recentchangeslinked": "Sidtõd mõitõkst",
+       "recentchangeslinked": "Sidtõd mȭitõkst",
        "recentchangeslinked-toolbox": "Sidtõd mõitõkst",
-       "recentchangeslinked-title": "\"$1\" sidtõd mõitõkst",
+       "recentchangeslinked-title": "\"$1\" sidtõd mȭitõkst",
        "recentchangeslinked-summary": "Täs um lugdõd andtõd līedstõ sidtõd (agā andtõd kategōrij) lēḑis tīedõd perrizt mõitõkst. Sin [[Special:Watchlist|iļ-vaņtlimiz.nimkēra]] lēḑõd ātõ  ' ' ' razzistiz ' ' ' jeddõ tūodõd.",
        "recentchangeslinked-page": "Līed nim:",
-       "recentchangeslinked-to": "Nägţ sīe azmõl mõitõkši lēḑis, mis sīen līed pǟlõ sidābõd",
+       "recentchangeslinked-to": "Nägţ sīe azmõl mȭitõkši lēḑis, mis sīen līed pǟlõ sidābõd",
        "upload": "Fail ilzõ-lōţimi",
        "uploadlogpage": "Ilzõ-lōţimiz log",
        "filedesc": "Kubbõ võtāmi:",
        "pager-older-n": "{{PLURAL:$1|jo vaņīmi 1|jo vaņīmizt $1}}",
        "booksources": "Rōntõ vȯtšimi",
        "booksources-search-legend": "Rōntõ vȯtšimi",
+       "booksources-search": "Vȯtš",
        "log": "Logūd",
        "allpages": "Amād lēḑõd",
        "prevpage": "Jedmõli lēḑ ($1)",
        "allpagesto": " Nägţ līedidi sīe pēļikēra sōņõ:",
        "allarticles": "Amād lēḑõd",
        "allpagessubmit": "Li",
-       "categories": "Kategōrijõd",
+       "categories": "Kategōrijd",
        "linksearch": "Uļļizt siḑīmõd",
        "linksearch-line": "$1 um sidtõd līedst $2",
        "listgrouprights-members": "(nõtkõmd nimkēra)",
        "watchlistfor2": "Kȭlbatijiz $1 ($2) pierāst",
        "addedwatchtext": "Lēḑ \"[[:$1]]\" um sin [[Special:Watchlist|iļ-vaņtlimiz nimkērrõz]] jūrõ pandõd. Jeddõpēḑõn tulbõd mõitõkst sīe līed pǟl ja sīenkõks sidtõd nõvpidāmiz-līed pǟl sugõbõd iļ-vaņtlimiz nimkērrõz  āt [[Special:RecentChanges|perrizt mõitõkst līed pǟl]]  kēratõd  '''razīz''' kēraks.",
        "removedwatchtext": "Lēḑ \"[[:$1]]\" um [[Special:Watchlist|iļ-vaņtlimiz nimkērast]] jarā viedtõd.",
-       "watch": "Vaņtligid iļ sīe",
+       "watch": "Vaņțõl iļ sīe",
        "watchthispage": "Vaņ iļ siedā līedpūoltõ",
        "unwatch": "Lopta iļ-vaņtlimi",
        "watchlist-details": " {{PLURAL:$1|$1 lēḑ|$1 līedtõ}} ātõ iļ-vaņtlimiz nimkēras,  bäz luggõmõt nõvpidāmiz-līedidi.",
        "wlshowlast": "Nägţ perīzt $1 stuņdõ $2 päuvõ",
+       "watchlist-hide": "↓Vaŗț",
        "watchlist-options": "Iļ-vaņtlimiz nimkēra pie-lēmizt",
        "watching": "Vaņtlimi iļ sīe...",
        "unwatching": "Iļ-vaņtlimiz loptimi...",
        "blanknamespace": "(Kēratõkst)",
        "contributions": "{{GENDER:$1|Kȭlbatijiz}} kubsõtīe",
        "contributions-title": "Kȭlbatijiz $1 kubsõtīe",
-       "mycontris": "Min kubsõtīed",
+       "mycontris": "Īņõtīe",
+       "anoncontribs": "Īņõtīe",
        "contribsub2": "Kȭlbatiji $1 ($2) pierāst",
        "uctop": "(tutkāms)",
        "month": " Kūstõ sōņist (un jo vārald)",
        "blocklink": "blokīer",
        "unblocklink": "lopta blokīerimi",
        "change-blocklink": "mõitiņt blokīerimizt",
-       "contribslink": "kubsõtīe",
+       "contribslink": "īņõtīe",
        "blocklogpage": "Blokīerimiz log",
        "blocklogentry": "Blokīerimiz kȭlbatijiz [[$1]], jarā loppõmiz āiga um $2 $3",
        "unblocklogentry": "võtiz jarā kȭlbatijiz $1 blokīerimiz",
        "tooltip-pt-userpage": "Sin kȭlbatijiz lēḑ",
        "tooltip-pt-mytalk": "Täd nõvpidāmiz lēḑ",
        "tooltip-pt-preferences": "Min mīeldõbõd ulzõ-vēļimizt",
-       "tooltip-pt-watchlist": "Lēḑõd nimkēra, mis iļ vaņtlõd mõitõkši",
-       "tooltip-pt-mycontris": "Sin kubsõtīed nimkēra",
+       "tooltip-pt-watchlist": "Lēḑõd nimkēra, mis iļ vaņtlõd mȭitõkši",
+       "tooltip-pt-mycontris": "Sin īņõtīe nimkēra",
        "tooltip-pt-login": "Mēg panām jeddõl tēḑi sīezõ kēratõm, bet siedā äb ūo vajāg",
        "tooltip-pt-logout": "Log ulzõ",
        "tooltip-ca-talk": "Nõvpidāmi sīe kēratõks iļ",
        "tooltip-n-mainpage-description": "Li eḑīz līed pǟlõ",
        "tooltip-n-portal": "Iļ projekt, midā tīedõ sōd, kui um ažḑi lieudõmist",
        "tooltip-n-currentevents": "Līeda tieutõkst iļ paldīž suggõbõd ažād",
-       "tooltip-n-recentchanges": "Vikipēdijs tīedõd perrizt mõitõkst nimkēra",
+       "tooltip-n-recentchanges": "Vikipēdijs tīedõd perrizt mȭitõkst nimkēra",
        "tooltip-n-randompage": "Li bäz tīedõmõt tulbõ līed pǟlõ",
        "tooltip-n-help": "Kūož laz lieudõg ilzõ",
        "tooltip-t-whatlinkshere": "Amād vikipēdij lēḑõd, kust um tǟnõ siḑīmḑi",
        "tooltip-ca-nstab-template": "Nägţ mallõ",
        "tooltip-ca-nstab-category": "Nägţ kategōrij līedtõ",
        "tooltip-minoredit": "Pangid tǟnõ merk ku se um ikš piški parāmtimi",
-       "tooltip-save": "Sa-gläbb mõitõkst",
-       "tooltip-preview": "Nägţ tīedõd mõitõkši. Pōlaks kȭlbatigid siedā jedmõl sa-gläbbõmizt!",
-       "tooltip-diff": "Nägţ tīedõd mõitõkši.",
+       "tooltip-save": "Sa-glōib mȭitõkst",
+       "tooltip-preview": "Nägţ tīedõd mȭitõkši. Pōlaks kȭlbatigid siedā jedmõl sa-glōibimizt!",
+       "tooltip-diff": "Nägţ tīedõd mȭitõkši.",
        "tooltip-compareselectedversions": "Nägţ vaiţidi kōd sīe līed vēļdõt versijõ vail",
        "tooltip-watch": "Pan jūrõ se līedpūol eņtš iļ-vaņtlimiz nimkerrõ",
        "tooltip-rollback": "Kištāntõb jarā īd glõbžõks lǟndz kubsõtīe tējiz tīedõd mõitõkst",
        "tooltip-undo": "\"Viedāgid jarā\" tīeb tijāks/kīeldõbjarā sīe mõitõks ja ovātõb redigīerimiz läb tekstõ jedmõl-vaņtlimizõks. Neiīž tēg võigid sǟl kēratõ, mis vȯļ sīe jarā vīmiz sī.",
        "tooltip-summary": "Kēratigid lītõ kubbõ-võtāmi",
+       "pageinfo-toolboxlink": "Līed dattõd",
        "previousdiff": "← Jedmõli redaktsij",
        "nextdiff": "Jo ūd redigīerimizt",
        "file-info-size": " $1 × $2 piksõlt, bildā sūrit: $3, MIME tīp: $4",
index 8c5fa41..24a123d 100644 (file)
@@ -8,14 +8,15 @@
                        "Macofe",
                        "Huji",
                        "Miladrahimi",
-                       "Ebraminio"
+                       "Ebraminio",
+                       "Process cq"
                ]
        },
-       "tog-underline": "کڕ(خط)کیشائن ژێر پیوندەل:",
+       "tog-underline": "خط کیشائن ژێر پیوندەل:",
        "tog-hideminor": "آشاردن دەسکاریەل گؤجەر  إژ گؤەڕیال(تغییرات) ایسە(اخیر)",
        "tog-hidepatrolled": "دسکاریۀل گه دیار بینۀ ئژ فئرست-رزگ تغییرات اخیر بشارا",
        "tog-newpageshidepatrolled": "وڵگۀل گه دیار بینۀ ئژ فئرست-رزگ ولگۀل تازۀ بشارا",
-       "tog-hidecategorization": "Hide categorization of pages",
+       "tog-hidecategorization": "فهرست بالا سی ئی صفحه",
        "tog-extendwatchlist": " کؤل رزگ-فئرست الؤن(آلشت)کریال-تغیرات نیشان دۀ،نۀ هر تنیا دؤمائنۀل",
        "tog-usenewrc": "تنیا آڵؤن(آلشتی)کریال تازۀ ؤ لیست پئگیریۀل رزگ بنی-گروه بندی کۀ",
        "tog-numberheadings": "شؤمارۀ  نئ خودکار سروڵگۀل-عناوین",
@@ -26,6 +27,7 @@
        "tog-watchdefault": "ولگۀل ؤ پرؤندۀلئ گه دسکاری مۀکم بنه نؤم فئرست سئرکردن",
        "tog-watchmoves": "ولگۀل ؤ پرؤندۀلئ گه هئزۀ مۀم-جابجا مۀکم بنه نؤم فئرست سئرکردن",
        "tog-watchdeletion": "ولگۀل ؤ پرؤندۀلئ گه پاکۀ مۀکم بنه نؤم فئرست سئرکردن",
+       "tog-watchuploads": "بلگه‌های نو اضافه بکه که من به فهرست تماشام بار مه‌کم",
        "tog-watchrollback": "ولگۀل گه ماره ما-بازگردانی مۀکم بنه نؤم فئرست سئرکردن",
        "tog-minordefault": "کؤڵ دسکاری بیۀل به عنؤان پئش فرض عڵامت بۀرن",
        "tog-previewontop": "پیش نمایش وهِ رئ جعبۀ نمایش نیشؤن به",
@@ -35,7 +37,7 @@
        "tog-enotifminoredits": "ئۀر تغییرۀل-آڵؤنۀل(آلشتۀل)گؤجۀریجی ئۀر وڵگۀل ؤ پرؤندۀلم کریا نامه ئۀرا مه کِل کۀ",
        "tog-enotifrevealaddr": "نیشانی ایمیل مه ئۀر ایمیل‌ل حاوواڵ رۀسن نیشؤن دۀ",
        "tog-shownumberswatching": "گلۀ شؤماری-شؤمار کاربۀل پی‌گیر نیشان دۀ",
-       "tog-oldsig": ":امضاێ گإ ایسگە درینێ",
+       "tog-oldsig": ":امضاێ موجود ایوه",
        "tog-fancysig": "(امضا چؤی ویکی‌متن بوو(بدون پئؤن خودکار نیائن",
        "tog-uselivepreview": "استفاده از پیش‌نمایش زنده",
        "tog-forceeditsummary": "هۀنئ گه-وختئ که خؤلاصۀ دسکاریم نَنیؤیسائۀ خۀؤۀ رم کۀ",
@@ -50,9 +52,9 @@
        "tog-ccmeonemails": "کپی إژ ایمیلێ گإ أڕا کاربەرەل کِلە مەکەم أڕا ووژم کِل کە",
        "tog-diffonly": "نۆم جِک(محتوا)وەڵگە، أ ژێر تفاوت دیار ناوو(نمایش ندهد)",
        "tog-showhiddencats": "دسۀل-رزگۀل آشاریآ نیشؤن دۀ",
-       "tog-norollbackdiff": "دؤما واگردانی تفاوت نیشؤن نه",
+       "tog-norollbackdiff": "ژ واگردانی پاش فرقه‌ل نشون نده",
        "tog-useeditwarning": "هەنێ(زمانی که)گِستم إژ وەڵگە دەسکاری ذخیره نؤي بِچمإ دەر.دەسگیرم کە",
-       "tog-prefershttps": "همؤیشۀ ئۀرا ئۀ نؤم سیستم هۀتن ئژ اتصالۀل امن بهرۀ بگر-استفادۀ کۀ",
+       "tog-prefershttps": "همیشه اتصاله‌ل امن استفاده بکه سی داخل بوون",
        "underline-always": "همؤیشۀ",
        "underline-never": "هؤیچ وخت",
        "underline-default": "پوسته یا مِنِی کەر پیش‌فرض",
        "newwindow": "(واز کردن ئۀر دۀروۀچۀ جدید)",
        "cancel": "ئآهووسانن/لغو",
        "moredotdotdot": "...ویشتر/فرةتر",
-       "morenotlisted": "لیست کامل نیۀ",
+       "morenotlisted": "بلکه ئی لیست کامل نییه",
        "mypage": "وةڵگە(پەڕە)",
        "mytalk": "گەپ(قسە)",
        "anontalk": "گەپ(قسە)",
        "searcharticle": "بِچۆ",
        "history": "تاریخ وةڵگة",
        "history_short": "تاریخچه",
+       "history_small": "تاریخ",
        "updatedmarker": "به‌روزشده از آخرین باری که سرزده‌ام",
        "printableversion": "نؤسخۀ قاوول چاپ",
        "permalink": "پیوۀند دائمی",
        "talk": "گەپ قسە",
        "views": "دیین/سئرکردن",
        "toolbox": "ابزارەل",
+       "tool-link-userrights": "گروهه‌ل {{GENDER:$1|کاربر}} تغییر بکه",
+       "tool-link-userrights-readonly": "گروه {{GENDER:$1|کاربر}} نشون بده",
+       "tool-link-emailuser": "ای-میل {{GENDER:$1|کاربر}}ئه",
        "userpage": "وةڵگة کاربۀر بؤین",
        "projectpage": "وةڵگة پروژۀ بوین",
        "imagepage": "وةڵگة پرونده بؤین",
        "copyright": " محتوایۀل هانإ ژئرنظر اجازه‌نامهٔ $1 مۀگۀر یۀگإ خلاف یۀ بوشرئ/ذکر بو",
        "copyrightpage": "{{ns:project}}:حق تکثیر",
        "currentevents": "پێش هەتێەل ایسگە",
-       "currentevents-url": "پێش هەتێەل ایسگە(ایسە)",
+       "currentevents-url": "Project:واقعهٔ نهایی",
        "disclaimers": "دروو نامه -تکذیب نامه",
        "disclaimerpage": "Project:تکذیب‌نامهٔ عمومی",
        "edithelp": "راهنمای دۀسکاری کردن",
        "createacct-yourpasswordagain-ph": "گذرواژه را وارد کنید برای بار دوم",
        "userlogin-remembermypassword": "مإ وارد  بی بیل",
        "userlogin-signwithsecure": "إژ ورود امن استفاده کةن",
+       "cannotlogin-title": "نتونه داخل نبئت",
+       "cannotlogin-text": "داخل بوون ممکن نییه",
        "cannotloginnow-title": "ایسه نمه‌تونین باینه نوم",
+       "cannotloginnow-text": "د زمان $1 استفاده مه‌که‌ی، ورود ممکن نبیه",
+       "cannotcreateaccount-title": "حسابان نتونه ایجاد نه‌که",
+       "cannotcreateaccount-text": "د ئی ویکی، بلا واسطه ایجاد حساب فعال نییه",
        "yourdomainname": ":دامنهٔ شما",
        "password-change-forbidden": ".شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید",
        "externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
        "userlogin-resetpassword-link": "رۀمزۀتان  ویر/ یاد  چئۀ؟",
        "userlogin-helplink2": "کمک با ورود",
        "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
+       "userlogin-reauth": "لازم تو دوباره داخل بئت سی حساب تو تأیید بکه {{GENDER:$1|$1}}",
        "userlogin-createanother": "حساووئ کاربةری تِر بِسازِن",
        "createacct-emailrequired": "نیشانی ایمیل",
        "createacct-emailoptional": ")نشانی ایمیل (اختیاری",
        "createacct-email-ph": "نیشانی ایمیل ووژت بنۆیس",
        "createacct-another-email-ph": "نیشانی ایمیل ووژتان بنؤیسِن",
        "createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
+       "createaccountmail-help": "تو مه‌تونی یک حساب ایجاد مه‌که‌ی سی کسی دیگر بدون شیفره نه‌زانی",
        "createacct-realname": "*نام راسکانی/واقعی *دل بخواهی",
        "createaccountreason": ":دةلیل",
        "createacct-reason": "دةلیل",
        "createacct-reason-ph": "ئةرا حساووێ  تر مةسازین؟",
+       "createacct-reason-help": "پیام د سیستم ایجاد خساب نمایش داده مه‌شوه",
        "createacct-submit": "حساووێ أڕا ووژت بِساز",
        "createacct-another-submit": "حساووئ أرا ووژتان بِسازِن",
+       "createacct-continue-submit": "ادامه سی ایحاد حساب",
+       "createacct-another-continue-submit": "ادامه سی ایجاد حساب",
        "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
        "createacct-benefit-body1": "{{PLURAL:$1|دۀسکاری|دۀسکاریۀل}}",
        "createacct-benefit-body2": "{{PLURAL:$1|وەڵگە|وەڵگەل}}",
        "nocookiesnew": "حساوو کاربةری سازیا، اما هؤمة أ سیستم نهةتینة/نهاتینة.\n{{SITENAME}} برای ورود کاربران به سامانه از کوکی استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید، و سپس با نام کاربری و گذرواژهٔ جدیدتان به سامانه وارد شوید.",
        "nocookieslogin": "{{SITENAME}} برای ورود کاربران به سامانه از کوکی‌ها استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید و دوباره امتحان کنید.",
        "nocookiesfornew": "حساوو کاربةری نةسازریا، زیرا نتوانستیم منبع آن را تأیید کنیم.\nمطمئن شوید که کوکی‌ها فعال هستند، آن‌گاه صفحه را از نو بارگیری کنید و دوباره امتحان کنید.",
+       "createacct-loginerror": "حساب با موفقيت ايجاد بوو، ليکن امکان ورود خودکارتان موجود نییه. لطفاً با [[Special:UserLogin|manual login]] ادامه بده.",
        "noname": ".هؤمة نام کاربةری معتبری دیاری نکردئة",
-       "loginsuccesstitle": "Ø¥Ù\86Û\86Ù\85 Ø³Û\8cستÙ\85 Ù\87Û\95تÙ\86 Ø§Ù\86جÛ\86Ù\85 Ú¯Ø±Øª",
+       "loginsuccesstitle": "بÙ\87 Ø³Û\8cستÙ\85 Ø¯Ø§Ø®Ù\84 Ø¨Ø¦",
        "loginsuccess": "هؤمة ایسة هةتیإ نؤم سیستم {{SITENAME}} وۀ نام\"$1\".'",
-       "nosuchuser": "کاربةرÛ\8c Ù\88Û\80 Ù\86اÙ\85 Â«$1» Ø¦Ø© Ø§Ø¦Ø±Ø© Ù\86Û\8cØ©.\nÙ\86اÙ\85 Ú©Ø§Ø±Ø¨Ø©Ø±Û\8c Ù\88Ø© Ú©Ø©ÚµÙ\86Ú¯Û\8c Ù\88 Ú¯Ø¤Ø¬Ø©Ø±Û\8c Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³Ø© .\nاÙ\85Ù\84اÛ\8c Ù\86اÙ\85 Ø±Ø§ Ø¨Ø±Ø±Ø³Û\8c Ú©Ù\86Û\8cدØ\8c Û\8cا [[Special:CreateAccount|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c ØªØ§Ø²Ù\87 Ø¨Ø³Ø§Ø²Û\8cد]].",
+       "nosuchuser": "کاربرÛ\8c Ø¨Ø§ Ù\86اÙ\88 \"$1\" Ù\86Û\8cÛ\8cÙ\87. \nÙ\86اÙ\88 Ú©Ø§Ø±Ø¨Ø± Ø¨Ù\87 Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³Ù\87. \nاÙ\85Ù\84اÛ\8c Ù\86اÙ\88Û\8c Ú©Ù\86ترÙ\84 Ø¨Ú©Ù\87Ø\8c Û\8cا\n[[Special:CreateAccount|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ù\86Ù\88 Ø§Û\8cجاد Ø¨Ú©Ù\87]].",
        "nosuchusershort": "هؤیچ کاربةری وة نام ''$1'' ئة ائرة نیة.\nاملایتان را وارسی کنید.",
        "nouserspecified": ".باید یإ گِلة  نام کاربةری دیاری کئین",
        "login-userblocked": ".ئی کاربرە بەسیائە. إنؤم هەتِن سیستم ڕاووآ(مجاز)نیە",
        "noemail": ".هؤیچ نیشانی ایمیلی ئةرا کاربةر «$1» ثبت نؤیة",
        "noemailcreate": "شما باید یک آدرس ایمیل درست فراهم کنید",
        "passwordsent": "گذرواژه‌ای جدید به آدرس ایمیل ثبت شده برای «$1» ارسال شد.\nلطفاً پس از دریافت آن، دوباره به سیستم وارد شوید.",
-       "blocked-mailpassword": "نشانی آی‌پی شما از ویرایش بازداشته شده‌است و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه را ندارد.",
+       "blocked-mailpassword": "نشانی آی‌پی‌تان اژ ویرایش بازداشته شده و اژ ای رو به منظور جلوگیری اژ سوءاستفاده اجازهٔ بهره‌گیری اژ قابلیت وازیابی شیفره را نداره.",
        "eauthentsent": "یک ایمیل تأیید برای آدرس ایمیل به نشانی مورد نظر ارسال شد.\nقبل از اینکه ایمیل دیگری قابل ارسال به این آدرس باشد، باید دستورهایی که در آن ایمیل آمده است را جهت تأیید این مساله که این آدرس متعلق به شماست، اجرا کنید.",
        "throttled-mailpassword": "یإ گِلة رمز عبور  {{PLURAL:$1| وۀ ساعت |$1 وۀساعتةل}}کِل/ارسال بیة/.\nسی نئهاگئری د أذیأت بییئن، فأقأط یئ گئل رازینە گوڤاردئن د أنجومانامە د نۊ زئنە بییە د هأر {{PLURAL:$1|ساعأت|$1 ساعأتیا}} کئل بییە.",
        "mailerror": "خطا در ارسال ایمیل: $1",
-       "acct_creation_throttle_hit": "بازدÛ\8cدکÙ\86Ù\86دگاÙ\86 Ø§Û\8cÙ\86 Ù\88Û\8cÚ©Û\8c Ú©Ù\87 Ø§Ø² Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø´Ù\85ا Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\86د Ø¯Ø± Ø±Ù\88ز Ú¯Ø°Ø´ØªÙ\87 {{PLURAL:$1|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c|$1 Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c}} Ø³Ø§Ø®ØªÙ\87â\80\8cاÙ\86دØ\8c Ú©Ù\87 Ø¨Û\8cشترÛ\8cÙ\86 ØªØ¹Ø¯Ø§Ø¯ Ù\85جاز Ø¯Ø± Ø¢Ù\86 Ø¨Ø§Ø²Ù\87Ù\94 Ø²Ù\85اÙ\86Û\8c Ø§Ø³Øª.\nبÙ\87 Ù\87Ù\85Û\8cÙ\86 Ø®Ø§Ø·Ø±Ø\8c Ø¨Ø§Ø²Ø¯Û\8cدکÙ\86Ù\86دگاÙ\86Û\8c Ú©Ù\87 Ø§Ø² Ø§Û\8cÙ\86 Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\86د Ù\86Ù\85Û\8câ\80\8cتÙ\88اÙ\86Ù\86د Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø­Ø³Ø§Ø¨ Ø¬Ø¯Û\8cدÛ\8c Ø¨Ø³Ø§Ø²Ù\86د.",
+       "acct_creation_throttle_hit": "زÛ\8cارتÚ\86Û\8cÛ\8cÙ\87â\80\8cÙ\84 Ø¯ Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ø§Ú\98 Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø§Û\8cÙ\88Ù\87 Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Ù\87â\80\8cÚ©Ù\87â\80\8cÙ\86 Ø¯ $2 Ú¯Ø°Ø´ØªÙ\87 {{PLURAL:$1|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c|$1 Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c}} Ø³Ø§Ø®ØªÙ\87â\80\8cاÙ\86Ø\8c Ú©Ù\87 Ø¨Û\8cشترÛ\8cÙ\86 ØªØ¹Ø¯Ø§Ø¯ Ù\85جاز Ø¯ Ø§Ù\88Ù\86 Ù\88ازÙ\87Ù\94 Ø²Ù\85اÙ\86Û\8cÛ\8cÙ\87.\nبÙ\87 Ù\87Ù\85Û\8cÙ\86 Ø®Ø§Ø·Ø±Ø\8c Ø²Û\8cارتÚ\86Û\8cÛ\8cÙ\87â\80\8cÙ\84 Ú©Ù\87 Ø§Ú\98 Ø§Û\8c Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Ù\87â\80\8cÚ©Ù\87Ù\86 Ù\86Ù\87â\80\8cتÙ\88Ù\86Ù\86 Ø¯ Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø­Ø³Ø§Ø¨ Ù\86Ù\88 Ø¨Ø³Ø§Ø²Ù\86.",
        "emailauthenticated": "نشانی ایمیل شما در $2 ساعت $3 تأیید شده است.",
        "emailnotauthenticated": "آدرس ایمیل شما هنوز تأیید نشده است.\nبرای هیچ‌یک از ویژگی‌های زیر، ایمیل ارسال نخواهد شد.",
        "noemailprefs": "برای راه‌اندازی این قابلیت‌ها یک آدرس ایمیل در ترجیحات خود مشخص کنید.",
        "createaccount-title": "ایجاد حساب کاربری در {{SITENAME}}",
        "createaccount-text": "یک نفر برای ایمیل شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3\nشما باید به سیستم وارد شوید تا گذرواژهٔ خود را تغییر بدهید.\n\nاگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.",
        "login-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
-       "login-abort-generic": "Ù\88رÙ\88د Ø´Ù\85ا Ù\86اÙ\85Ù\88Ù\81Ù\82 Ø¨Ù\88د - Ø®Ø§ØªÙ\85Ù\87Ù\94 Ù\86اگÙ\87اÙ\86Û\8c Ø¯Ø§Ø¯Ù\87 Ø´Ø¯",
+       "login-abort-generic": "Ù\88رÙ\88د Ø§Û\8cÙ\88Ù\87 Ù\86اÙ\85Ù\88Ù\81Ù\82 Ø¨Ù\88Ù\88 - Ø§Ø¨Ø¯Ø§Ù\84 Ø¨Ù\88Ù\88",
        "login-migrated-generic": "حساب کاربری شما منتقل شده‌است، و نام کاربری‌تان دیگر در این ویکی وجود ندارد.",
        "loginlanguagelabel": "$1:زوون",
        "suspicious-userlogout": "درخواست هؤمة ئةرا  دةرچئن إژ سیستم  رد بیة زیرا به نظر می‌رسد که این  .درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر کل/ارسال بیة",
        "createacct-another-realname-tip": "نام راسکانی/واقعی دڵ بخواهیة.\nاگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.",
        "pt-login": "إنۆم هەتِن.",
        "pt-login-button": "إ نۆم هەتن سیستم",
+       "pt-login-continue-button": "ادامه سی ورود سیستم",
        "pt-createaccount": "حساووئ أرا ووژتان بِسازِن",
        "pt-userlogout": "دەرچێن|خروج",
        "php-mail-error-unknown": "خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی",
        "newpassword": "گذرواژهٔ تازه:",
        "retypenew": "گذرواژهٔ تازه را دوباره وارد کنید",
        "resetpass_submit": "تنظیم گذرواژه و ورود به سامانه",
-       "changepassword-success": "گذرواژهٔ شما با موفقیت تغییر داده شد!",
+       "changepassword-success": "شیفرهٔ تو تغییر بوو",
        "changepassword-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
+       "botpasswords": "شیفرهٔ بؤت",
+       "botpasswords-summary": "<em>شیفره‌یه‌ل بؤت</em> اجازه دسترسی به یک حساب کاربری با ای‌پی‌آی بدون استفاده اژ رمز اصلی حسابه مه‌دهه. دسترسییه‌ل کاربری موجود هنگامی که با شیفرهٔ بؤتبک وارد مه‌شوین ممکن ئه محدود باشن.\n\nاگر نه‌زانین که ممکن ئه با ئی چه مه‌که‌ین، احتمالاً نباید هیچ کاری مه‌که‌ین. هیچ‌کس نباید اژ ایوه خواسته باشه که یکی اژ ئه‌مان درست مه‌کهین به اوان بدهین.",
+       "botpasswords-disabled": "شیفرهٔ بؤت غیر فعال بوو.",
+       "botpasswords-no-central-id": "سی استفاده ژ شیفرهٔ بؤت ایوه ابتدا مه‌بایست به یک حساب متمرکز وارد بوپ.",
+       "botpasswords-existing": "موجود شیفرهٔ بؤت",
+       "botpasswords-createnew": "نو شیفرهٔ بؤت ایجاد بکه",
+       "botpasswords-editexisting": "موجود شیفرهٔ بؤت تغییر بکه",
+       "botpasswords-label-appid": "ناو بؤت",
+       "botpasswords-label-create": "ایجاد بکه",
+       "botpasswords-label-update": "آپدیت",
+       "botpasswords-label-cancel": "ابدال",
+       "botpasswords-label-delete": "پاک بکه",
+       "botpasswords-label-resetpassword": "شیفره ابدال بکه",
+       "botpasswords-label-grants": "یارمته‌ل مه‌تونه تطبیق مه‌که",
+       "botpasswords-help-grants": "هر اجازه به ربات اجازه دسترسی به اختیاراتی را که حساب ایوه داره مه‌دهه. فعال کردن یک اجازه د ایره/اینجا هیچ دسترسی نو که حساب ایوه همینک دارا نییه را به اون نه‌بخشه. [[Special:ListGrants|table of grants]] را سی اطلاعات بیشتر مشاهده مه‌که‌ین.",
+       "botpasswords-label-grants-column": "اعطا بوو",
+       "botpasswords-bad-appid": "ناو بؤت \"$1\" معتبر نییه.",
+       "botpasswords-insert-failed": "اضافهٔ ناو بؤت \"$1\" ناموفق بوو. اون ناو ذاتًا اضافه بوو.",
+       "botpasswords-update-failed": "به‌روژ ناو بؤت \"$1\" ناموفق بوو. آیا اون حذف بوو؟",
+       "botpasswords-created-title": "شیفرهٔ بؤت ایجاد بوو",
+       "botpasswords-created-body": "سی کاربر \"$2\" و سی ناو بؤت ئی کاربر \"$1\" یک شیفرهٔ بؤت ایجاد بوو.",
+       "botpasswords-updated-title": "شیفرهٔ بؤت به‌روژ بوو",
+       "botpasswords-updated-body": "سی کاربر \"$2\" و سی ناو بؤت ئی کاربر \"$1\" یک شیفرهٔ بؤت به‌روژ بوو.",
+       "botpasswords-deleted-title": "شیفرهٔ بؤت پاک بوو",
+       "botpasswords-deleted-body": "سی کاربر \"$2\" و سی ناو بؤت ئی کاربر \"$1\" یک شیفرهٔ بؤت حذف بوو.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider موجود نییه.",
+       "botpasswords-restriction-failed": "محدودیته‌ل شیفره بؤت، به ئی ورود مانع مه‌بئت",
        "resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
+       "resetpass_forbidden-reason": "شیفره نتونه تغییر نه‌که: $1",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-submit-loggedin": "تغییردائن رمز",
        "resetpass-submit-cancel": "ئآهووسانن/لغو",
        "passwordreset-emaildisabled": "قابلیت‌های ایمیل در این ویکی غیرفعال شده‌اند.",
        "passwordreset-username": ":نۆم کاربەری",
        "passwordreset-domain": "دامنه:",
-       "passwordreset-capture": "ایمیل نهایی نشان داده شود؟",
-       "passwordreset-capture-help": "اگر این گزینه را علامت بزنید، ایمیل (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.",
        "passwordreset-email": ":نیشانی ایمیل",
        "passwordreset-emailtitle": "جزئیات حساوو أڕ {{SITENAME}}",
        "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را داده است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
        "passwordreset-emailsentemail": "اگر نشانی پست الکترونیکی که وارد کردید برای حساب کاربریتان ثبت شده باشد، یک نامهٔ بازنشانی گذرواژه به آن فرستاده می‌شود.",
        "passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
+       "passwordreset-nocaller": "زنگ مجبور نییه به تأمین کردن",
+       "passwordreset-nosuchcaller": "زنگ موجود نییه: $1",
+       "passwordreset-invalidemail": "آدرس ایمیل نامعتبره",
        "changeemail": "تغییر یا حذف نشانی ایمیل",
        "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
        "changeemail-no-info": ".برای دسترسی مستقیم به این صفحه شما باید به سیستم وارد شده باشید",
        "minoredit": "یۀ دۀسکاری جزئیکۀ",
        "watchthis": "پئ گیری اێ وەلگە",
        "savearticle": "وەڵگە بِیل(ذخیره کە)",
+       "savechanges": "تغییراتی قید بکه",
+       "publishpage": "صفحهٔ انتشار",
+       "publishchanges": "تغییرات انتشار",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "گؤەڕیال(تغییرات) بۆین",
        "invalid-content-data": "داده محتوای نامعتبر",
        "content-not-allowed-here": "محتوای «$1» در صفحهٔ [[$2]] مجاز نیست",
        "editwarning-warning": "خروج از این برگه ممکن است باعث شود که شما هر شانسی که به وجود آورده‌اید را از دست بدهید.\nاگر شما وارد سامانه شده‌اید، می‌توانید این هشدار را در بخش «{{int:prefs-editing}}» ترجیحاتتان غیرفعال کنید.",
+       "editpage-invalidcontentmodel-title": "مودل محتوا دستک نبینه",
+       "editpage-invalidcontentmodel-text": "مودل محتوا \"$1\" دستک نبینه",
        "editpage-notsupportedcontentformat-title": "فرمت نۆم جِک(محتوا)پشتیبانی نشده",
        "editpage-notsupportedcontentformat-text": "فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.",
        "content-model-wikitext": "ویکی‌متن",
        "revdelete-unsuppress": "حذف محدودیت‌ها در بازبینی‌های ترمیم‌شده",
        "revdelete-log": ":دةلیل",
        "revdelete-submit": "اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده",
-       "revdelete-success": "'''پیدایی ورژن با موفقیت به روز شد.'''",
+       "revdelete-success": "نمایش رویزیون به‌روژ بوو",
        "revdelete-failure": "'''پیدایی ورژن ها قابل به روز کردن نیست:'''\n$1",
-       "logdelete-success": "تغییر پیدایی مورد با موفقیت انجام شد.",
+       "logdelete-success": "ورود نمایش ست",
        "logdelete-failure": "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''\n$1",
        "revdel-restore": "گؤەڕانن/تغییر پیدایی",
        "pagehist": "تاریخ وةڵگة",
        "mergehistory-empty": "هیچ‌یک از ورژن ها قابل ادغام نیستند.",
        "mergehistory-done": "$3 نسخه از $1 در {{PLURAL:$3|ادغام شد}}به [[:$2]].",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
+       "mergehistory-fail-bad-timestamp": "برچسب زمانی معتبر نییه",
+       "mergehistory-fail-invalid-source": "صفحه منبع معتبر نییه",
+       "mergehistory-fail-invalid-dest": "صفحه مقصد معتبر نییه",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "mergehistory-no-destination": "صفحهٔ مقصد $1 وجود ندارد.",
        "searchprofile-advanced-tooltip": "جستجو در فضاهای نام دلخواه",
        "search-result-size": "$1 ({{PLURAL:$2|1 واژۀ|$2 واژۀل}})",
        "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک زیررده|$2 زیررده}}، {{PLURAL:$3|یک پرونده|$3 پرونده}})",
-       "search-redirect": "(تغییرمسیر $1)",
+       "search-redirect": "(تغییرمسیر اژ $1)",
        "search-section": "(بۀخش $1)",
        "search-category": "(ڕِزگ $1)",
        "search-file-match": "(تشابه محتوی پرونده)",
        "saveprefs": "هیشتن(ذخیره)",
        "restoreprefs": "برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)",
        "prefs-editing": "دەسکاری کردن",
-       "rows": "تعداد سطرها:",
-       "columns": "تعداد ستون‌ها:",
        "searchresultshead": "مِنِی کِردِن(گێردین)",
        "stub-threshold": "آستانهٔ ویرایش پیوندهای ناقص ($1):",
        "stub-threshold-sample-link": "نمونه",
        "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
        "userrights": "مدیریت اختیارات کاربر",
-       "userrights-lookup-user": "مدیریت گروه‌های کاربری",
+       "userrights-lookup-user": "یک کاربر انتخاب بکه",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
-       "editusergroup": "ویرایش گروه‌های کاربری",
+       "editusergroup": "گروهه‌ل کاربر بار مه‌بئ",
        "editinguser": "تغییر اختیارات کاربری کاربر {{GENDER:$1|کاربر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "ویرایش گروه‌های کاربری",
-       "saveusergroups": "هیشتِن(ذخیرە)گؤەڕیال(تغییرات)کوو(گروە)کاربەری",
+       "userrights-viewusergroup": "گروهه‌ل کاربری نشان بده",
+       "saveusergroups": "گروه {{GENDER:$1|کاربر}} قید بده",
        "userrights-groupsmember": "عضو:",
        "userrights-groupsmember-auto": "عضو ضمنی:",
        "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.",
        "userrights-reason": ":دةلیل",
        "userrights-no-interwiki": "شما اجازهٔ تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.",
        "userrights-nodatabase": "پایگاه دادهٔ $1 وجود ندارد یا محلی نیست.",
-       "userrights-nologin": "شما باید با یک حساب کاربری مدیر [[Special:UserLogin|به سامانه وارد شوید]] تا بتوانید اختیارات کاربران را تعیین کنید.",
-       "userrights-notallowed": "شما مجوز برای افزودن یا حذف حقوق کاربر را ندارید.",
        "userrights-changeable-col": "گروه‌هایی که می‌توانید تغییر دهید",
        "userrights-unchangeable-col": "گروه‌هایی که نمی‌توانید تغییر دهید",
        "userrights-conflict": "تعارض دسترسی‌های کاربری! لطفاً بررسی کنید و تغییرات را تأیید کنید.",
-       "userrights-removed-self": "شما با موفقیت دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صفحه دسترسی ندارید.",
        "group": "گروه:",
        "group-user": "کاربۀر",
        "group-autoconfirmed": "کاربران تأییدشدهٔ خودکار",
        "right-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "right-override-export-depth": "برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵",
        "right-sendemail": "ارسال ایمیل به دیگر کاربران",
-       "right-passwordreset": "مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه",
        "right-managechangetags": "ایجاد و حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
        "right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
        "right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
+       "right-deletechangetags": "[[Special:Tags|tags]] را اژ پایگاه پاک بکه",
+       "grant-generic": "حقوق \"$1\" بسته",
+       "grant-group-page-interaction": "تعاول با صفحه",
+       "grant-group-file-interaction": "تعامل با میدیا",
+       "grant-group-watchlist-interaction": "تعامل با لیست تماشای ایوه",
+       "grant-group-email": "ایمیل کل بکه",
+       "grant-group-high-volume": "انجام فعالیته‌ل حجم بالا",
        "grant-group-customization": "سفارشی‌سازی و تنظیمات",
+       "grant-group-administration": "انجام اقدامات اداری",
+       "grant-group-other": "فعالیته‌ل متفرقه",
+       "grant-blockusers": "کاربره‌ل بستن و واز کردن",
+       "grant-createaccount": "حسابه ایجاد بکه",
+       "grant-createeditmovepage": "صحفاته ایحاد بکه، تغییر بکه و انتقال بکه",
+       "grant-delete": "صفحاته، رویزیونه‌لی و ورود یومی را پاک بکه",
+       "grant-editinterface": "ناو میدیا-ویکی را و کربر CSS/JavaScript را تغییر بکه",
+       "grant-editmycssjs": "کاربر ایوه CSS/JavaScript را تغییر بکه",
+       "grant-editmyoptions": "ترجیحات کاربر ایوه را تغییر بکه",
+       "grant-editmywatchlist": "لیست تماشای ایوه را تغییر بکه",
+       "grant-editpage": "صفحات موجوده تغییر بکه",
+       "grant-editprotected": "صفحات محافظه را تغییر بکه",
+       "grant-highvolume": "تغییرات د سویه بالایه",
        "newuserlogpage": "سیاههٔ ایجاد کاربر",
        "newuserlogpagetext": "این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.",
        "rightslog": "سیاههٔ اختیارات کاربر",
        "uploaded-setting-handler-svg": "پرونده SVG تنظیم شده با مشخصهٔ \"handler\"  با remote/data/script بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-remote-url-svg": "پرونده SVG تنظیم شده با remote URL بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-image-filter-svg": "پالایه پرونده در نشانی:<code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده SVG بارگذاری‌شده یافت شد.",
-       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
+       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '<nowiki>$1</nowiki>' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "این پرونده ویروس دارد!\nجزئیات : $1",
        "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
        "importlogpagetext": "درون‌ریزی صفحات به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه ها}} واردشده",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه ها}} واردشده از $2",
-       "javascripttest": "آزمایش جاوا اسکریپت",
+       "javascripttest": "آزمایش جاوااسکریپت",
        "javascripttest-pagetext-unknownaction": "تابع ناشناختهٔ \"$1\".",
        "javascripttest-qunit-intro": "[$1 مستندات آزمایش] را در mediawiki.org ببینید.",
        "tooltip-pt-userpage": "وةڵگة کاربۀری هؤمۀ",
        "feedback-useragent": "رابط کاربر:",
        "searchsuggest-search": "مِنِی کِردِن(گێردین)",
        "searchsuggest-containing": "وةڵگةل  دربردارنده...",
-       "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
-       "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
-       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
-       "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
        "api-error-emptypage": "ایجاد وةڵگةل خالی مجاز نیست.",
-       "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
-       "api-error-fileexists-forbidden": "یک پرونده با نام \"$1\" موجود است و امکان بازنویسی نیست.",
-       "api-error-fileexists-shared-forbidden": "یک پرونده با نام \"$1\" در انبار اشتراک پرونده موجود است و امکان بازنویسی نیست.",
-       "api-error-file-too-large": "پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.",
-       "api-error-filename-tooshort": "نام پرونده بیش از اندازه کوتاه است.",
-       "api-error-filetype-banned": "این نوع پرونده ممنوع است.",
-       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.",
-       "api-error-filetype-missing": "پرونده فرمت ندارد.",
-       "api-error-hookaborted": "اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.",
-       "api-error-http": "خطای داخلی: قادر به اتصال به سرور نیست.",
-       "api-error-illegal-filename": "نام پرونده مجاز نیست.",
-       "api-error-internal-error": "خطای داخلی: با پردازش بارگذاری شما در ویکی، یک چیز اشتباه پیش رفت.",
-       "api-error-invalid-file-key": "خطای داخلی: پرونده در حافظهٔ موقت موجود نیست.",
-       "api-error-missingparam": "خطای داخلی: پارامترهای ناموجود در درخواست.",
-       "api-error-missingresult": "خطای داخلی: نمی‌توان فهمید کپی‌برداری موفق بوده‌است یا نه.",
-       "api-error-mustbeloggedin": "برای بارگذاری پرونده‌ها شما باید به سامانه وارد شوید.",
-       "api-error-mustbeposted": "خطای داخلی: درخواست باید از روش POST HTTP ارسال گردد.",
-       "api-error-noimageinfo": "بارگذاری موفق بود، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده به ما نداد.",
-       "api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
-       "api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
-       "api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
-       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
-       "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
-       "api-error-stashedfilenotfound": "زمانی که تلاش برای بارگذاری فایل استش بود، فایل استش یافت نشد.",
-       "api-error-stashpathinvalid": "مسیری که فایل استش در آن باید یافت می‌شد اشتباه است.",
-       "api-error-stashfilestorage": "برای ذخیرهٔ فایل استش خطایی رخ داده است.",
-       "api-error-stashzerolength": "سرور نمی‌تواند فایل استش را ذخیره کند چون حجم آن صفر است.",
-       "api-error-stashnotloggedin": "برای ذخیرهٔ فایل‌ها در بارگذاری استش باید وارد سامانه شده‌باشید.",
-       "api-error-stashwrongowner": "فایلی که در استش قصد داشتید به آن دسترسی داشته‌باشید متعلق به شما نیست.",
-       "api-error-stashnosuchfilekey": "کلیدی که در فایل استش می خواستید به آن دسترسی داشته‌باشید، وجود ندارد.",
-       "api-error-timeout": "کارساز در زمان انتظار هیچ پاسخی نداد.",
-       "api-error-unclassified": "یإگِلة خطا نادیاری/ناشناخته رخ داد.",
-       "api-error-unknown-code": "خطای نادیاری/ناشناخته: \" $1 \"",
-       "api-error-unknown-error": "خطای داخلی: در زمانی که شما در حال تلاش برای بارگذاری پروندهٔ‌تان بودید، یک چیز اشتباه پیش رفت.",
+       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-unknown-warning": "هشدار نادیاری/ ناشناخته: $1",
        "api-error-unknownerror": "خطای نادیاری/ناشناخته: \" $1 \"",
-       "api-error-uploaddisabled": "بارگذاری در این ویکی غیرفعال است.",
-       "api-error-verification-error": "ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه ها}} قبل",
        "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقةلئ}} دماتر",
        "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتةلئ}} دماتر",
index 8123636..15b6624 100644 (file)
@@ -8,41 +8,57 @@
                        "Aefgh39622"
                ]
        },
-       "tog-underline": "ຂີດເສັ້ນກ້ອງລິງກ໌:",
-       "tog-hideminor": "ເຊື່ອງການດັດແກ້ເລັກນ້ອຍ ໃນ ການປ່ຽນແປງຫຼ້າສຸດ",
-       "tog-hidepatrolled": "ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ການດັດແກ້ຫຼ້າສຸດ",
-       "tog-newpageshidepatrolled": "ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ລາຍການໜ້າໃໝ່",
-       "tog-extendwatchlist": "ຂະຫຍາຍລາຍການຕິດຕາມເພື່ອສະແດງການປ່ຽນແປງທັງໝົດ, ບໍ່ແມ່ນພຽງລ້າສຸດ",
-       "tog-usenewrc": "ສະແດງການປ່ຽນແປງໃນໜ້າຢູ່ໃນການປ່ຽນແປງລ້າສຸດແລະລາຍການຕິດຕາມ",
-       "tog-numberheadings": "ໜາຍເລກຫົວຂໍ້ແບບອັດຕະໂນມັດ",
+       "tog-underline": "ການຂີດເສັ້ນກ້ອງລິງກ໌:",
+       "tog-hideminor": "ເຊື່ອງການແກ້ໄຂເລັກນ້ອຍໃນໜ້າປັບປຸງລ້າສຸດ",
+       "tog-hidepatrolled": "ເຊື່ອງການແກ້ໄຂທີ່ກວດສອບແລ້ວໃນໜ້າປັບປຸງລ້າສຸດ",
+       "tog-newpageshidepatrolled": "ເຊື່ອງໜ້າທີ່ກວດສອບແລ້ວໃນລາຍການໜ້າໃໝ່",
+       "tog-hidecategorization": "ເຊື່ອງການຈັດໝວດໝູ່ໜ້າ",
+       "tog-extendwatchlist": "ຂະຫຍາຍລາຍການຕິດຕາມໃຫ້ສະແດງການປ່ຽນແປງທັງໝົດ, ບໍ່ແມ່ນພຽງການປ່ຽນແປງລ້າສຸດ",
+       "tog-usenewrc": "ຈັດກຸ່ມການປ່ຽນແປງແບ່ງຕາມໜ້າຢູ່ໃນລາຍການປັບປຸງລ້າສຸດແລະລາຍການຕິດຕາມ",
+       "tog-numberheadings": "ກຳນົດເລກຫົວເລື່ອງອັດຕະໂນມັດ",
        "tog-showtoolbar": "ສະແດງແຖບເຄື່ອງມືແກ້ໄຂ",
        "tog-editondblclick": "ແກ້ໄຂໜ້າເມື່ອກົດສອງເທື່ອ",
-       "tog-editsectiononrightclick": "ເປີດໃຫ້ສາມາດແກ້ໄຂໄດ້ໂດຍກົດປຸ່ມຂວາຂອງເມົາສ໌ຢູ່ເທິງຫົວຂໍ້ຂອງພາກ",
-       "tog-watchcreations": "ເພີ່ມໜ້າທີ່ຂ້ອຍສ້າງແລະໄຟລ໌ທີ່ຂ້ອຍອັບໂຫຼດເຂົ້າໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchdefault": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍແກ້ໄຂເຂົ້າໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchmoves": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍຍ້າຍເຂົ້າໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchdeletion": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍລຶບເຂົ້າໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-minordefault": "ຖ້າບໍ່ມີການຕັ້ງ ກຳໜົດໃຫ້ທຸກໆການດັດແກ້ ເປັນ ການດັດແກ້ເລັກນ້ອຍ",
-       "tog-previewontop": "ສະແດງ ຜົນການດັດແກ້ ເທິງ ຊ່ອງດັດແກ້",
-       "tog-previewonfirst": "ສະແດງ ຜົນການດັດແກ້ ໃນ ເວລາດັດແກ້ເທື່ອທຳອິດ",
-       "tog-enotifwatchlistpages": "ສົ່ງອີເມລມາໃຫ້ຂ້ອຍເມື່ອໜ້າຫຼືໄຟລ໌ທີ່ຂ້ອຍຕິດຕາມມີການປ່ຽນແປງ",
-       "tog-enotifusertalkpages": "ສົ່ງ ອີເມລ ມາໃຫ້ ຂ້ອຍ ເວລາ ໜ້າສົນທະນາຂ້ອຍ ມີການປ່ຽນແປງ",
-       "tog-enotifminoredits": "ສົ່ງອີເມລມາໃຫ້ຂ້ອຍເມື່ອມີການແກ້ໄຂໜ້າແລະໄຟລ໌ເລັກນ້ອຍ",
-       "tog-enotifrevealaddr": "ສະແດງ ອີເມລ ຂອງຂ້ອຍ ໃນ ການແຈ້ງວ່າມີຂໍ້ຄວາມອີເມລ",
-       "tog-shownumberswatching": "ສະແດງ ຈຳນວນຜູ້ໃຊ້ ຕິດຕາມໝ້ານີ້",
-       "tog-forceeditsummary": "ເຕື່ອນຂ້ອຍ ຖ້າບໍ່ໄດ້ຂຽນຫຍັງໃສ່ ຊ່ອງ ສະຫຼຸບການດັດແກ້",
-       "tog-watchlisthideown": "ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchlisthidebots": "ເຊື່ອງ ການດັດແກ້ ໂດຍ ບອທ໌ ໃນລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchlisthideminor": "ເຊື່ອງ ການດັດແກ້ເລັກນ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchlisthideliu": "ເຊື່ອງການດັດແກ້ ໂດຍ ຜູ້ໃຊ້ໄດ້ເຊັນເຂົາ ໃນ ລາຍການຕິດຕາມ",
-       "tog-watchlisthideanons": "ເຊື່ອງ ການດັດແກ້ໂດຍຜູ້ໃຊ້ ບໍ່ສະແດງຊື່ ຈາກ ລາຍການຕິດຕາມ",
-       "tog-watchlisthidepatrolled": "ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ລາຍການຕິດຕາມ",
-       "tog-ccmeonemails": "ສົ່ງສຳເນົາ ອີເມລ ທີ່ ຂ້ອຍສົ່ງຫາຜູ້ອື່ນ ໃຫ້ ຂ້ອຍ",
-       "tog-diffonly": "ບໍ່ສະແດງເນື້ອໃນຂອງບົດຄວາມ ຢູ່ທາງລຸ່ມ ສ່ວນຕ່າງ",
-       "tog-showhiddencats": "ສະແດງໝວດເຊື່ອງ",
+       "tog-editsectiononrightclick": "ເປີດໃຊ້ງານການແກ້ໄຂສ່ວນໂດຍກົດເມົາສ໌ດ້ານຂວາຢູ່ເທິງຊື່ເລື່ອງຂອງສ່ວນນັ້ນ",
+       "tog-watchcreations": "ເພີ່ມໜ້າທີ່ຂ້ອຍສ້າງແລະໄຟລ໌ທີ່ຂ້ອຍອັບໂຫຼດເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchdefault": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍແກ້ໄຂເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchmoves": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍຍ້າຍເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchdeletion": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍລຶບເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchuploads": "ເພີ່ມໄຟລ໌ໃໝ່ທີ່ຂ້ອຍອັບໂຫຼດເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchrollback": "ເພີ່ມໜ້າທີ່ຂ້ອຍໄດ້ກັບຄືນຢ່າງສຸກເສີນເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-minordefault": "ກຳນົດການແກ້ໄຂທຸກຄັ້ງເປັນການແກ້ໄຂເລັກນ້ອຍໂດຍປະລິຍາຍ",
+       "tog-previewontop": "ສະແດງໂຕຢ່າງກ່ອນກ່ອງແກ້ໄຂ",
+       "tog-previewonfirst": "ສະແດງໂຕຢ່າງໃນການແກ້ໄຂຄັ້ງທຳອິດ",
+       "tog-enotifwatchlistpages": "ອີເມວບອກຂ້ອຍເມື່ອໜ້າຫຼືໄຟລ໌ໃດໜຶ່ງໃນລາຍການຕິດຕາມມີການປ່ຽນແປງ",
+       "tog-enotifusertalkpages": "ອີເມວບອກຂ້ອຍເມື່ອໜ້າສົນທະນາກັບຜູ້ໃຊ້ຂອງຂ້ອຍມີການປ່ຽນແປງ",
+       "tog-enotifminoredits": "ອີເມວບອກຂ້ອຍເຊັ່ນກັນສຳລັບການແກ້ໄຂໜ້າແລະໄຟລ໌ເລັກນ້ອຍ",
+       "tog-enotifrevealaddr": "ເປີດເຜີຍທີ່ຢູ່ອີເມວຂອງຂ້ອຍໃນອີເມວແຈ້ງເຕືອນ",
+       "tog-shownumberswatching": "ສະແດງຈຳນວນຜູ້ໃຊ້ທີ່ຕິດຕາມ",
+       "tog-oldsig": "ລາຍເຊັນຂອງທ່ານທີ່ມີຢູ່:",
+       "tog-fancysig": "ຖືລາຍເຊັນເປັນຂໍ້ຄວາມວິກິ (ໂດຍບໍ່ມີລິງກ໌ອັດຕະໂນມັດ)",
+       "tog-uselivepreview": "ໃຊ້ການສະແດງໂຕຢ່າງແບບສົດ",
+       "tog-forceeditsummary": "ເຕືອນເມື່ອຊ່ອງຄຳອະທິບາຍໂດຍຫຍໍ້ວ່າງເປົ່າ",
+       "tog-watchlisthideown": "ເຊື່ອງການແກ້ໄຂຂອງຂ້ອຍຈາກລາຍການຕິດຕາມ",
+       "tog-watchlisthidebots": "ເຊື່ອງການແກ້ໄຂໂດຍບັອດໃນລາຍການຕິດຕາມຂອງຂ້ອຍ",
+       "tog-watchlisthideminor": "ເຊື່ອງການແກ້ໄຂເລັກນ້ອຍໃນລາຍການຕິດຕາມຂອງຂ້ອຍ",
+       "tog-watchlisthideliu": "ເຊື່ອງການແກ້ໄຂໂດຍຜູ້ໃຊ້ທີ່ໄດ້ເຂົ້າສູ່ລະບົບແລ້ວໃນລາຍການຕິດຕາມ",
+       "tog-watchlistreloadautomatically": "ໂຫຼດລາຍການຕິດຕາມຄືນໃໝ່ເມື່ອໃດກໍຕາມທີ່ໂຕກັ່ນຕອງມີການປ່ຽນແປງ (ຕ້ອງໃຊ້ JavaScript)",
+       "tog-watchlisthideanons": "ເຊື່ອງການແກ້ໄຂໂດຍຜູ້ໃຊ້ທີ່ບໍ່ສະແດງຊື່ໃນລາຍການຕິດຕາມ",
+       "tog-watchlisthidepatrolled": "ເຊື່ອງການແກ້ໄຂແບບລາດຕະເວນໃນລາຍການຕິດຕາມ",
+       "tog-watchlisthidecategorization": "ເຊື່ອງການຈັດໝວດໝູ່ໜ້າ",
+       "tog-ccmeonemails": "ສົ່ງສຳເນົາອີເມວທີ່ຂ້ອຍໄດ້ສົ່ງຫາຜູ້ອື່ນໃຫ້ຂ້ອຍ",
+       "tog-diffonly": "ບໍ່ສະແດງເນື້ອໃນຂອງບົດຄວາມຢູ່ຂ້າງລຸ່ມ ສ່ວນຕ່າງ",
+       "tog-showhiddencats": "ສະແດງໝວດທີ່ເຊື່ອງຢູ່",
+       "tog-norollbackdiff": "ບໍ່ຕ້ອງສະແດງສ່ວນຕ່າງຫຼັງຈາກດຳເນີນການກັບຄືນຢ່າງສຸກເສີນ",
+       "tog-useeditwarning": "ເຕືອນຂ້ອຍເມື່ອຂ້ອຍຈະອອກຈາກໜ້າແກ້ໄຂໂດຍທີ່ຍັງບໍ່ໄດ້ບັນທຶກການປ່ຽນແປງ",
+       "tog-prefershttps": "ໃຊ້ການເຊື່ອມຕໍ່ແບບປອດໄພທຸກຄັ້ງທີ່ເຂົ້າສູ່ລະບົບແລ້ວ",
        "underline-always": "ທຸກຄັ້ງ",
-       "underline-never": "ບໍ່ຂີດ",
-       "underline-default": "ສະກິນຫຼືຄ່າທີ່ຖືກກຳນົດໄວ້ຂອງບຣາວເຊີ",
+       "underline-never": "ບໍ່ຕ້ອງ",
+       "underline-default": "ສະກິນຫຼືຄ່າເລີ່ມຕົ້ນຂອງບຣາວເຊີ",
+       "editfont-style": "ແກ້ໄຂຮູບແບບໂຕໜັງສືໃນພື້ນທີ່:",
+       "editfont-default": "ຄ່າເລີ່ມຕົ້ນຂອງບຣາວເຊີ",
+       "editfont-monospace": "ແບບໂຕໜັງສືທີ່ມີຄວາມກວ້າງຄົງທີ່",
+       "editfont-sansserif": "ແບບໂຕໜັງສືແບບບໍ່ມີເຊີງ",
+       "editfont-serif": "ແບບໂຕໜັງສືແບບມີເຊີງ",
        "sunday": "ວັນອາທິດ",
        "monday": "ວັນຈັນ",
        "tuesday": "ວັນອັງຄານ",
        "oct": "ຕຸລາ",
        "nov": "ພະຈິກ",
        "dec": "ທັນວາ",
+       "january-date": "$1 ມັງກອນ",
+       "february-date": "$1 ກຸມພາ",
+       "march-date": "$1 ມີນາ",
+       "april-date": "$1 ເມສາ",
+       "may-date": "$1 ພຶດສະພາ",
+       "june-date": "$1 ມິຖຸນາ",
+       "july-date": "$1 ກໍລະກົດ",
+       "august-date": "$1 ສິງຫາ",
+       "september-date": "$1 ກັນຍາ",
+       "october-date": "$1 ຕຸລາ",
+       "november-date": "$1 ພະຈິກ",
+       "december-date": "$1 ທັນວາ",
+       "period-am": "ກ່ອນທ່ຽງ",
+       "period-pm": "ຫຼັງທ່ຽງ",
        "pagecategories": "{{PLURAL:$1|ໝວດ|ໝວດ}}",
        "category_header": "ບົດຄວາມໃນໝວດ \"$1\"",
        "subcategories": "ໝວດຍ່ອຍ",
-       "category-media-header": "ໜ້າຕ່າງ າ ໃນ \"$1\"",
-       "category-empty": "''ບໍ່ມີໜ້າໃດຢູ່ໃນໝວດນີ້''",
-       "hidden-categories": "{{PLURAL:$1|ໜວດທີ່ຖືກເຊື່ອງ|ໜວດທີ່ຖືກເຊື່ອງ}}",
-       "hidden-category-category": "ບັນດາໜວດເຊື່ອງ",
-       "category-subcat-count-limited": "ໜວດນີ້ ມີ ໜວດຍ່ອຍ ດັ່ງຕໍ່ໄປນີ້ {{PLURAL:$1|ໜວດຍ່ອຍ|$1 ໜວດຍ່ອຍ}}.",
-       "category-article-count": "{{PLURAL:$2|ໝວດນີ້ມີໜ້າຢູ່ພຽງໜ້າດຽວ|ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້ ເຕັມ $2}}",
+       "category-media-header": "ສື່ໃນໝວດ \"$1\"",
+       "category-empty": "<em>ປັດຈຸບັນໜ້ານີ້ບໍ່ມີໜ້າຫຼືສື່ໃດໆ.</em>",
+       "hidden-categories": "{{PLURAL:$1|ໝວດທີ່ຖືກເຊື່ອງ}}",
+       "hidden-category-category": "ໝວດທີ່ຖືກເຊື່ອງຢູ່",
+       "category-subcat-count": "{{PLURAL:$2|ໝວດນີ້ມີສະເພາະໝວດຍ່ອຍດັ່ງຕໍ່ໄປນີ້.|ໝວດນີ້ມີ {{PLURAL:$1|ໝວດຍ່ອຍ|$1 ໝວດຍ່ອຍ}}, ຈາກ $2 ທັງໝົດ.}}",
+       "category-subcat-count-limited": "ໝວດນີ້ມີ {{PLURAL:$1|ໜວດຍ່ອຍ|$1 ໜວດຍ່ອຍ}} ດັ່ງຕໍ່ໄປນີ້.",
+       "category-article-count": "{{PLURAL:$2|ໝວດນີ້ມີພຽງໜ້າດັ່ງຕໍ່ໄປນີ້.|ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້, ຈາກທັງໝົດ $2.}}",
+       "category-article-count-limited": "ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້.",
+       "category-file-count": "{{PLURAL:$2|ໝວດນີ້ມີພຽງໄຟລ໌ດັ່ງຕໍ່ໄປນີ້.|ມີ {{PLURAL:$1|ໄຟລ໌ດຽວ|ໄຟລ໌ $1 ໄຟລ໌}} ໃນໝວດນີ້, ຈາກທັງໝົດ $2.}}",
+       "category-file-count-limited": "ມີ {{PLURAL:$1|ໄຟລ໌|ໄຟລ໌ $1 ໄຟລ໌}} ໃນໝວດນີ້.",
        "listingcontinuesabbrev": "ຕໍ່.",
+       "index-category": "ໜ້າທີ່ມີດັດຊະນີ",
+       "noindex-category": "ໜ້າທີ່ບໍ່ມີດັດຊະນີ",
+       "broken-file-category": "ໜ້າທີ່ມີລິງກ໌ໄຟລ໌ເສຍ",
        "about": "ກ່ຽວກັບ",
-       "article": "ບົດຄວາມ",
-       "newwindow": "(ເປີດເປັນ ປ່ອງຢ້ຽມ(ວິນໂດ)ໃໝ່ )",
-       "cancel": "ລົບລ້າງ",
-       "moredotdotdot": "ຕື່ມ...",
+       "article": "ໜ້າເນື້ອໃນ",
+       "newwindow": "(ເປີດໃນວິນໂດໃໝ່)",
+       "cancel": "ຍົກເລີກ",
+       "moredotdotdot": "ເພີ່ມເຕີມ...",
+       "morenotlisted": "ລາຍການນີ້ອາດຈະບໍ່ສົມບູນ.",
        "mypage": "ໜ້າ",
        "mytalk": "ສົນທະນາ",
        "anontalk": "ສົນທະນາ",
-       "navigation": "àº\99ຳàº\97ິàº\94",
+       "navigation": "àº\9bà»\89າàº\8dàº\9aອàº\81àº\97າàº\87",
        "and": "&#32;ແລະ",
-       "qbfind": "ຊອກຫາ",
-       "qbedit": "ດັດແກ້",
+       "qbfind": "ຄົ້ນຫາ",
+       "qbbrowse": "ເອີ້ນເບິ່ງ",
+       "qbedit": "ແກ້ໄຂ",
        "qbpageoptions": "ໜ້ານີ້",
-       "qbmyoptions": "ໝ້າຂ້ອຍ",
-       "navigation-heading": "ເມນູນຳທາງ",
-       "errorpagetitle": "ຜິດພາດ",
-       "returnto": "ກັບໄປ  $1.",
+       "qbmyoptions": "ໜ້າຂອງຂ້ອຍ",
+       "faq": "ຄຳຖາມທີ່ພົບເລື້ອຍໆ",
+       "faqpage": "Project:ຄຳຖາມທີ່ພົບເລື້ອຍໆ",
+       "actions": "ການກະທຳ",
+       "namespaces": "ຊື່ຂອບເຂດ",
+       "variants": "ຄວາມແຕກຕ່າງ",
+       "navigation-heading": "ລາຍການການນຳທາງ",
+       "errorpagetitle": "ຂໍ້ຜິດພາດ",
+       "returnto": "ກັບໄປຫາ $1.",
        "tagline": "ຈາກ {{SITENAME}}",
        "help": "ຊ່ວຍເຫຼືອ",
        "search": "ຄົ້ນຫາ",
        "searcharticle": "ໄປ",
        "history": "ປະຫວັດ",
        "history_short": "ປະຫວັດການດັດແກ້",
+       "updatedmarker": "ອັບເດດຕັ້ງແຕ່ຄັ້ງທີ່ຂ້ອຍມາຢ້ຽມຊົມລ້າສຸດ",
        "printableversion": "ສະບັບພິມໄດ້",
-       "permalink": "ລິàº\87àº\84໌ຖາວອນ",
+       "permalink": "ລິàº\87àº\81໌ຖາວອນ",
        "print": "ພິມ",
+       "view": "ເບິ່ງ",
+       "view-foreign": "ເບິ່ງໃນ $1",
        "edit": "ແກ້ໄຂ",
+       "edit-local": "ແກ້ໄຂຄຳອະທິບາຍທ້ອງຖິ່ນ",
        "create": "ສ້າງ",
-       "editthispage": "ດັດແກ້ໜ້ານີ້",
+       "create-local": "ເພີ່ມຄຳອະທິບາຍທ້ອງຖິ່ນ",
+       "editthispage": "ແກ້ໄຂໜ້ານີ້",
        "create-this-page": "ສ້າງໜ້ານີ້",
        "delete": "ລຶບ",
        "deletethispage": "ລຶບໜ້ານີ້",
+       "undeletethispage": "ຍົກເລີກການລຶບໜ້ານີ້",
+       "undelete_short": "ຍົກເລີກການລຶບ {{PLURAL:$1|ການແກ້ໄຂໜຶ່ງຄັ້ງ|ການແກ້ໄຂ $1 ຄັ້ງ}}",
+       "viewdeleted_short": "ເບິ່ງ {{PLURAL:$1|ການແກ້ໄຂໜຶ່ງຄັ້ງທີ່ລຶບໄປແລ້ວ|ການແກ້ໄຂ $1 ຄັ້ງທີ່ລຶບໄປແລ້ວ}}",
        "protect": "ປົກປ້ອງ",
        "protect_change": "ການປ່ຽນແປງ",
-       "protectthispage": "ປ້ອງກັນໜ້ານີ້",
-       "unprotect": "ປ່ຽນແປງການປ້ອງກັນ",
+       "protectthispage": "ປົກປ້ອງໜ້ານີ້",
+       "unprotect": "ປ່ຽນແປງການປົກປ້ອງ",
+       "unprotectthispage": "ປ່ຽນແປງການປົກປ້ອງຂອງໜ້ານີ້",
        "newpage": "ໜ້າໃໝ່",
-       "talkpage": "ປຶກສາຫາລືໜ້ານີ້",
+       "talkpage": "àº\9bຶàº\81ສາຫາລືàº\81à»\88ຽວàº\81ັàº\9aà»\9cà»\89າàº\99ີà»\89",
        "talkpagelinktext": "ສົນທະນາ",
-       "specialpage": "à»\9d້າພິເສດ",
+       "specialpage": "à»\9c້າພິເສດ",
        "personaltools": "ເຄື່ອງມືສ່ວນບຸກຄົນ",
        "articlepage": "ເບິ່ງໜ້າເນື້ອໃນ",
        "talk": "ສົນທະນາ",
        "views": "ເທື່ອເບິ່ງ",
        "toolbox": "ເຄື່ອງມື",
-       "userpage": "ເບິ່ງໜ້າສົນທະນາຂອງຜູ້ໃຊ້",
-       "projectpage": "ເບິ່ງໝ້າໂຄງການ",
-       "mediawikipage": "ເບິ່ງ ໝ້າຂໍ້ຄວາມ",
+       "tool-link-userrights": "ປ່ຽນກຸ່ມ{{GENDER:$1|ຜູ້ໃຊ້}}",
+       "tool-link-userrights-readonly": "ເບິ່ງກຸ່ມ{{GENDER:$1|ຜູ້ໃຊ້}}",
+       "tool-link-emailuser": "ສົ່ງອີເມວຫາ{{GENDER:$1|ຜູ້ໃຊ້}}ຄົນນີ້",
+       "userpage": "ເບິ່ງໜ້າຜູ້ໃຊ້",
+       "projectpage": "ເບິ່ງໜ້າໂຄງການ",
+       "imagepage": "ເບິ່ງໜ້າໄຟລ໌",
+       "mediawikipage": "ເບິ່ງໜ້າຂໍ້ຄວາມ",
        "templatepage": "ເບິ່ງໜ້າແມ່ແບບ",
-       "viewhelppage": "ເບິ່ງ ໝ້າຊ່ອຍເຫຼືອ",
-       "categorypage": "ເບິ່ງ ໜ້າ ໝວດ",
+       "viewhelppage": "ເບິ່ງໜ້າວິທີໃຊ້",
+       "categorypage": "ເບິ່ງໜ້າໝວດ",
+       "viewtalkpage": "ເບິ່ງການປຶກສາຫາລື",
        "otherlanguages": "ເປັນພາສາອື່ນໆ",
-       "redirectedfrom": "(ໂອນມາຈາກ $1)",
-       "redirectpagesub": "ໜ້າໂອນ",
-       "lastmodifiedat": "ໜ້ານີ້ຖຶກດັດແກ້ຫຼ້າສຸດ $2, $1.",
-       "viewcount": "ໜ້ານີ້ຖືກເຂົ້າເບິ່ງ {{PLURAL:$1|ເທື່ອໜຶ່ງ|$1 ເທື່ອ}}.",
-       "protectedpage": "ໜ້າຖືກປົກປ້ອງ",
-       "jumpto": "ໄປຫາ:",
+       "redirectedfrom": "(ປ່ຽນເສັ້ນທາງມາຈາກ $1)",
+       "redirectpagesub": "ໜ້າປ່ຽນເສັ້ນທາງ",
+       "redirectto": "ປ່ຽນເສັ້ນທາງໄປຫາ:",
+       "lastmodifiedat": "ໜ້ານີ້ຖຶກແກ້ໄຂຄັ້ງລ້າສຸດເມື່ອວັນທີ່ $1, ເວລາ $2.",
+       "viewcount": "ໜ້ານີ້ຖືກເຂົ້າເບິ່ງແລ້ວ {{PLURAL:$1|ເທື່ອໜຶ່ງ|$1 ເທື່ອ}}.",
+       "protectedpage": "ໜ້າທີ່ຖືກປົກປ້ອງ",
+       "jumpto": "ຂ້າມໄປຫາ:",
        "jumptonavigation": "ປ້າຍບອກທາງ",
        "jumptosearch": "ຄົ້ນຫາ",
-       "aboutsite": "ກ່ຽວກັບ{{SITENAME}}",
+       "view-pool-error": "ຂໍອະໄພ, ເຊີເວີກຳລັງເຮັດວຽກໜັກເກີນໄປໃນຂະນະນີ້.\nຈຳນວນຜູ້ໃຊ້ທີ່ກຳລັງພະຍາຍາມເຂົ້າເບິ່ງໜ້ານີ້ມີຫຼາຍເກີນໄປ.\nກະລຸນາລໍຖ້າໄລຍະໜຶ່ງ ແລ້ວຈຶ່ງພະຍາຍາມເຂົ້າເບິ່ງໜ້ານີ້ໃໝ່.\n\n$1",
+       "generic-pool-error": "ຂໍອະໄພ, ເຊີເວີກຳລັງເຮັດວຽກໜັກເກີນໄປໃນຂະນະນີ້.\nຈຳນວນຜູ້ໃຊ້ທີ່ກຳລັງພະຍາຍາມເຂົ້າເບິ່ງຊັບພະຍາກອນນີ້ມີຫຼາຍເກີນໄປ.\nກະລຸນາລໍຖ້າໄລຍະໜຶ່ງ ແລ້ວຈຶ່ງພະຍາຍາມເຂົ້າເບິ່ງຊັບພະຍາກອນນີ້ໃໝ່.",
+       "pool-timeout": "ການລໍຖ້າການໝົດເວລາສຳລັບການລັອກ",
+       "pool-errorunknown": "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ຈັກ",
+       "poolcounter-usage-error": "ຂໍ້ຜິດພາດໃນການໃຊ້ງານ: $1",
+       "aboutsite": "ກ່ຽວກັບ {{SITENAME}}",
        "aboutpage": "Project:ກ່ຽວກັບ",
-       "copyright": "à»\80àº\99ືà»\89ອà»\83àº\99à»\81ມà»\88àº\99ສາມາàº\94à»\83àº\8aà»\89à»\84àº\94à»\89àº\9eາàº\8dà»\83àº\95à»\89 $1 àº\96à»\89າàº\9aà»\8dà»\88à»\81ມà»\88àº\99ຢà»\88າàº\87ອືà»\88àº\99à»\83àº\94àº\97ີà»\88ລະàº\9aຸà»\84ວà»\89.",
+       "copyright": "ເນື້ອໃນສາມາດໃຊ້ໄດ້ພາຍໃຕ້ $1 ຖ້າບໍ່ແມ່ນຢ່າງອື່ນໃດທີ່ລະບຸໄວ້.",
        "copyrightpage": "{{ns:project}}:ລິຂະສິດ",
        "currentevents": "ເຫດການປັດຈຸບັນ",
        "currentevents-url": "Project:ເຫດການປັດຈຸບັນ",
        "disclaimers": "ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
        "disclaimerpage": "Project:ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
-       "edithelp": "ວິàº\97ີàº\94ັàº\94à»\81àº\81à»\89à»\9cà»\89າ",
-       "helppage-top-gethelp": "àº\8aà»\88ວàº\8dà»\80ຫຼືອ",
+       "edithelp": "ວິàº\97ີà»\81àº\81à»\89à»\84àº\82",
+       "helppage-top-gethelp": "ວິàº\97ີà»\83àº\8aà»\89",
        "mainpage": "ໜ້າຫຼັກ",
        "mainpage-description": "ໜ້າຫຼັກ",
-       "policy-url": "Project:àº\9bະàº\95ູສູà»\88àº\8aຸມàº\8aົàº\99",
-       "portal": "ປະຕູຊຸມຊົນ",
+       "policy-url": "Project:àº\99ະà»\82àº\8dàº\9aາàº\8d",
+       "portal": "àº\9bະàº\95ູສູà»\88àº\8aຸມàº\8aົàº\99",
        "portal-url": "Project:ປະຕູສູ່ຊຸມຊົນ",
        "privacy": "ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ",
        "privacypage": "Project:ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ",
        "badaccess": "ການອະນຸມັດບໍ່ຖືກຕ້ອງ",
-       "badaccess-group0": "ທ່ານ ບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ປະຕິບັດການ ທີ່ ທ່ານ ສັ່ງ.",
-       "versionrequired": "ຕ້ອງການເວີຣ໌ຊັ່ນ $1 ຂອງມີເດຍວິກິ",
+       "badaccess-group0": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ປະຕິບັດການຕາມທີ່ທ່ານຮ້ອງຂໍໄວ້.",
+       "badaccess-groups": "ການກະທຳທີ່ທ່ານຮ້ອງຂໍຖືກຈຳກັດໃຫ້ກັບຜູ້ໃຊ້ໃນ{{PLURAL:$2|ກຸ່ມ}}ດັ່ງຕໍ່ໄປນີ້: $1.",
+       "versionrequired": "ຕ້ອງໃຊ້ມີເດຍວິກິເວີຊັນ $1",
+       "versionrequiredtext": "ຕ້ອງໃຊ້ມີເດຍວິກິເວີຊັນ $1 ເພື່ອເຂົ້າເບິ່ງໜ້ານີ້.\nເບິ່ງ [[Special:Version|ໜ້າເວີຊັນ]].",
        "ok": "ຕົກລົງ",
        "retrievedfrom": "ດຶງຂໍ້ມູນຈາກ \"$1\"",
-       "youhavenewmessages": "ທ່ານ ມີ $1 ($2).",
-       "youhavenewmessagesmulti": "ທ່ານມີຂໍ້ຄວາມໃໝ່ ຢູ່ $1",
+       "youhavenewmessages": "{{PLURAL:$3|ທ່ານມີ}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|ທ່ານມີ}} $1 ຈາກ {{PLURAL:$3|ຜູ້ໃຊ້ຄົນອື່ນ|ຜູ້ໃຊ້ຄົນອື່ນ $3 ຄົນ}} ($2).",
+       "youhavenewmessagesmanyusers": "ທ່ານມີ $1 ຈາກຜູ້ໃຊ້ຫຼາຍຄົນ ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|ຂໍ້ຄວາມໃໝ່ໜຶ່ງຂໍ້ຄວາມ|999=ຂໍ້ຄວາມໃໝ່}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|ການປ່ຽນແປງ|999=ການປ່ຽນແປງ}}ລ້າສຸດ",
+       "youhavenewmessagesmulti": "ທ່ານມີຂໍ້ຄວາມໃໝ່ຢູ່ $1",
        "editsection": "ແກ້ໄຂ",
-       "editold": "ດັດແກ້",
-       "viewsourceold": "ເບິ່ງ ຊອສ",
-       "editlink": "ດັດແກ້",
+       "editold": "ແກ້ໄຂ",
+       "viewsourceold": "ເບິ່ງຊອຣ໌ສ",
+       "editlink": "ແກ້ໄຂ",
+       "viewsourcelink": "ເບິ່ງຊອຣ໌ສ",
        "editsectionhint": "ແກ້ໄຂພາກ: $1",
        "toc": "ເນື້ອໃນ",
        "showtoc": "ສະແດງ",
        "hidetoc": "ເຊື່ອງ",
-       "viewdeleted": "ເບິ່ງ $1 ບໍ?",
+       "collapsible-collapse": "ຍຸບ",
+       "collapsible-expand": "ຂະຫຍາຍ",
+       "confirmable-confirm": "{{GENDER:$1|ທ່ານ}}ແນ່ໃຈບໍ່?",
+       "confirmable-yes": "ແມ່ນ",
+       "confirmable-no": "ບໍ່",
+       "thisisdeleted": "ຕ້ອງການເບິ່ງຫຼືຄືນຄ່າ $1 ບໍ່?",
+       "viewdeleted": "ຕ້ອງການເບິ່ງ $1 ບໍ່?",
+       "restorelink": "{{PLURAL:$1|ການແກ້ໄຂໜຶ່ງຄັ້ງທີ່ຖືກລຶບໄປແລ້ວ|ການແກ້ໄຂ $1 ຄັ້ງທີ່ຖືກລຶບໄປແລ້ວ}}",
+       "feedlinks": "ຟີດ:",
+       "feed-invalid": "ປະເພດຂອງຟີດການຕິດຕາມບໍ່ຖືກຕ້ອງ.",
        "site-rss-feed": "$1 RSS ຟີດ",
        "site-atom-feed": "ອະຕອມຟີດ $1",
        "page-rss-feed": "\"$1\" RSS ຟີດ",
+       "page-atom-feed": "\"$1\" Atom feed",
        "red-link-title": "$1 (ບໍ່ມີໜ້ານີ້)",
        "nstab-main": "ໜ້າ",
        "nstab-user": "ໜ້າຜູ້ໃຊ້",
+       "nstab-media": "ໜ້າສື່",
        "nstab-special": "ໜ້າພິເສດ",
        "nstab-project": "ໜ້າໂຄງການ",
        "nstab-image": "ໄຟລ໌",
        "nstab-mediawiki": "ຂໍ້ຄວາມ",
        "nstab-template": "ແມ່ແບບ",
-       "nstab-help": "à»\9cà»\89າàº\8aà»\88ອàº\8dà»\80ຫຼືອ",
+       "nstab-help": "à»\9cà»\89າວິàº\97ີà»\83àº\8aà»\89",
        "nstab-category": "ໝວດ",
        "mainpage-nstab": "ໜ້າຫຼັກ",
-       "nosuchspecialpage": "ບໍ່ມີໝ້າພິເສດຊື່ນັ້ນ",
-       "databaseerror": "ມີຄວາມຜິດພາດ ດ້ານ ຖານຂໍ້ມູນ",
-       "readonly": "ຖານຂໍ້ມູນຖືກລອັກ",
-       "enterlockreason": "ກະລຸນາຂຽນເຫດຜົນໃນການລອັກ, ລວມທັງ ປະມານເວລາທີ່ຈະປົດລອັກ",
+       "nosuchaction": "ບໍ່ມີການກະທຳດັ່ງກ່າວ",
+       "nosuchspecialpage": "ບໍ່ມີໝ້າພິເສດດັ່ງກ່າວ",
+       "error": "ຂໍ້ຜິດພາດ",
+       "databaseerror": "ມີຂໍ້ຜິດພາດກ່ຽວກັບຖານຂໍ້ມູນ",
+       "databaseerror-error": "ຂໍ້ຜິດພາດ: $1",
+       "laggedslavemode": "<strong>ຄຳເຕືອນ:</strong> ໜ້ານີ້ອາດຈະບໍ່ລວມຂໍ້ມູນລ້າສຸດ.",
+       "readonly": "ຖານຂໍ້ມູນຖືກລັອກ",
+       "enterlockreason": "ກະລຸນາຂຽນເຫດຜົນໃນການລັອກ, ລວມທັງປະມານເວລາທີ່ຈະປົດລັອກ",
        "missingarticle-diff": "(ສ່ວນຕ່າງ: $1, $2)",
-       "internalerror": "ມີຄວາມຜິດພາດພາຍໃນ",
-       "filerenameerror": "ບໍ່ສາມາດ ປ່ຽນ ຊື່ໄຟລ໌  \"$1\" ໄປເປັນ  \"$2\" ໄດ້.",
+       "readonly_lag": "ຖານຂໍ້ມຸນໄດ້ຖືກລັອກແລ້ວໂດຍອັດຕະໂນມັດຂະນະທີ່ເຊີເວີ slave database ຖືກຈັບໃຫ້ອັນຫຼັກ",
+       "internalerror": "ມີຂໍ້ຜິດພາດພາຍໃນ",
+       "internalerror_info": "ມີຂໍ້ຜິດພາດພາຍໃນ: $1",
+       "filecopyerror": "ບໍ່ສາມາດເຮັດສຳເນົາໄຟລ໌ \"$1\" ໄປເປັນ \"$2\" ໄດ້.",
+       "filerenameerror": "ບໍ່ສາມາດປ່ຽນຊື່ໄຟລ໌  \"$1\" ໄປເປັນ  \"$2\" ໄດ້.",
+       "filedeleteerror": "ບໍ່ສາມາດລຶບໄຟລ໌ \"$1\" ໄດ້.",
+       "directorycreateerror": "ບໍ່ສາມາດສ້າງໄດເຣກທໍຣີ \"$1\" ໄດ້.",
+       "directoryreadonlyerror": "ໄດເຣກທໍຣີ \"$1\" ສາມາດອ່ານໄດ້ເທົ່ານັ້ນ.",
+       "directorynotreadableerror": "ໄດເຣກທໍຣີ \"$1\" ບໍ່ສາມາດອ່ານໄດ້.",
+       "filenotfound": "ບໍ່ພົບໄຟລ໌ \"$1\".",
+       "formerror": "ຂໍ້ຜິດພາດ: ບໍ່ສາມາດສົ່ງແບບຟອມໄດ້.",
+       "badarticleerror": "ບໍ່ສາມາດດຳເນີນການນີ້ຢູ່ເທິງໜ້ານີ້ໄດ້.",
        "cannotdelete": "ບໍ່ສາມາດລຶບໜ້າຫຼືໄຟລ໌ \"$1\" ໄດ້.\nມັນອາດຈະຖືກລຶບໂດຍໃຜຜູ້ໜຶ່ງແລ້ວ.",
+       "cannotdelete-title": "ບໍ່ສາມາດລຶບໜ້າ \"$1\" ໄດ້",
        "badtitle": "ຫົວຂໍ້ບໍ່ຖືກຕ້ອງ",
-       "viewsource": "ເບິ່ງຊອສ໌",
-       "namespaceprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ ດັດແກ້ ໜ້າ ໃນ  '''$1'''.",
+       "viewsource": "ເບິ່ງຊອຣ໌ສ",
+       "viewsource-title": "ເບິ່ງຊອຣ໌ສສຳລັບ $1",
+       "viewsourcetext": "ທ່ານສາມາດເບິ່ງແລະເຮັດສຳເນົາຊອຣ໌ສຂອງໜ້ານີ້ໄດ້.",
+       "viewyourtext": "ທ່ານສາມາດເບິ່ງແລະເຮັດສຳເນົາຊອຣ໌ສ<strong>ການແກ້ໄຂຂອງທ່ານ</strong>ຂອງໜ້ານີ້ໄດ້.",
+       "namespaceprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າທີ່ມີເນມສະເປດ <strong>$1</strong>.",
+       "customcssprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ CSS ນີ້ເນື່ອງຈາກມີຂໍ້ມູນການຕັ້ງຄ່າສ່ວນບຸກຄົນຂອງຜູ້ໃຊ້ລວມມີຢູ່.",
+       "customjsprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ JavaScript ນີ້ເນື່ອງຈາກມີຂໍ້ມູນການຕັ້ງຄ່າສ່ວນບຸກຄົນຂອງຜູ້ໃຊ້ລວມຢູ່ໃນໜ້ານີ້.",
+       "mycustomcssprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ CSS ນີ້.",
+       "mycustomjsprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ JavaScript ນີ້.",
+       "myprivateinfoprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າຂໍ້ມູນສ່ວນບຸກຄົນຂອງທ່ານ.",
+       "mypreferencesprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂການຕັ້ງຄ່າຂອງທ່ານ.",
+       "ns-specialprotected": "ບໍ່ສາມາດແກ້ໄຂໜ້າພິເສດໄດ້.",
+       "invalidtitle-knownnamespace": "ຊື່ເລື່ອງທີ່ມີຂອບເຂດຊື່ \"$2\" ແລະຂໍ້ຄວາມ \"$3\" ບໍ່ຖືກຕ້ອງ",
+       "invalidtitle-unknownnamespace": "ຊື່ເລື່ອງທີ່ມີຂອບເຂດຊື່ໝາຍເລກ $1 ແລະຂໍ້ຄວາມ \"$2\"",
+       "exception-nologin": "ບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ",
+       "exception-nologin-text": "ກະລຸນາເຂົ້າສູ່ລະບົບເພື່ອໃຫ້ສາມາດເຂົ້າເບິ່ງ ຫຼື ດຳເນີນການໃດໆກັບໜ້ານີ້ໄດ້.",
+       "exception-nologin-text-manual": "ກະລຸນາ $1 ເພື່ອໃຫ້ສາມາດເຂົ້າເບິ່ງ ຫຼື ດຳເນີນການໃດໆກັບໜ້ານີ້ໄດ້.",
        "logouttext": "<strong>ທ່່ານໄດ້ອອກຈາກລະບົບແລ້ວ.<strong>\n\nກະລຸນາຮັບຊາບວ່າບາງໜ້າຈະຍັງຄົງສະແດງຜົນຕໍ່ໄປເຖິງແມ້ວ່າທ່ານຈະເຂົ້າສູ່ລະບົບແລ້ວ, ຈົນກວ່າທ່ານຈະລ້າງແຄຊໃນບຣາວເຊີຂອງທ່ານທັງໝົດ.",
-       "yourname": "ຊື່ຜູ້ໃຊ້",
-       "yourpassword": "ລະຫັດຜ່ານ",
-       "yourpasswordagain": "ພິມລະຫັດຜ່ານອີກ",
-       "yourdomainname": "ໂດເມນ ຂອງ ທ່ານ",
-       "login": "ເຊັນເຂົ້າ",
-       "nav-login-createaccount": "ເຊັນເຂົ້າ / ສ້າງບັນຊີ",
-       "userlogin": "ເຊັນເຂົ້າ / ສ້າງບັນຊີ",
-       "logout": "ເຊັນອອກ",
-       "userlogout": "ເຊັນອອກ",
+       "cannotlogoutnow-title": "ບໍ່ສາມາດອອກຈາກລະບົບໄດ້ໃນຂະນະນີ້",
+       "welcomeuser": "ຍິນດີຕ້ອນຮັບ, $1!",
+       "welcomecreation-msg": "ບັນຊີຜູ້ໃຊ້ຂອງທ່ານໄດ້ຖືກສ້າງຂຶ້ນແລ້ວ.\nທ່ານສາມາດປ່ຽນແປງ[[Special:Preferences|ການຕັ້ງຄ່າ]]ຂອງທ່ານໃນ {{SITENAME}} ຖ້າທ່ານຕ້ອງການ.",
+       "yourname": "ຊື່ຜູ້ໃຊ້:",
+       "userlogin-yourname": "ຊື່ຜູ້ໃຊ້",
+       "userlogin-yourname-ph": "ປ້ອນຊື່ຜູ້ໃຊ້ຂອງທ່ານ",
+       "createacct-another-username-ph": "ປ້ອນຊື່ຜູ້ໃຊ້",
+       "yourpassword": "ລະຫັດຜ່ານ:",
+       "userlogin-yourpassword": "ລະຫັດຜ່ານ",
+       "userlogin-yourpassword-ph": "ປ້ອນລະຫັດຜ່ານຂອງທ່ານ",
+       "createacct-yourpassword-ph": "ປ້ອນລະຫັດຜ່ານ",
+       "yourpasswordagain": "ພິມລະຫັດຜ່ານໃໝ່ອີກ:",
+       "createacct-yourpasswordagain": "ຢືນຢັນລະຫັດຜ່ານ",
+       "createacct-yourpasswordagain-ph": "ປ້ອນລະຫັດຜ່ານໃໝ່ອີກ",
+       "userlogin-remembermypassword": "ໃຫ້ຂ້ອຍຢູ່ໃນລະບົບຕໍ່ໄປ",
+       "userlogin-signwithsecure": "ໃຊ້ການເຊື່ອມຕໍ່ແບບປອດໄພ",
+       "cannotlogin-title": "ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້",
+       "cannotlogin-text": "ບໍ່ສາມາດດຳເນີນການເຂົ້າສູ່ລະບົບໄດ້.",
+       "cannotloginnow-title": "ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້ໃນຂະນະນີ້",
+       "cannotloginnow-text": "ບໍ່ສາມາດດຳເນີນການເຂົ້າສູ່ລະບົບໄດ້ເມື່ອກຳລັງໃຊ້ $1 ຢູ່.",
+       "cannotcreateaccount-title": "ບໍ່ສາມາດສ້າງບັນຊີໄດ້",
+       "cannotcreateaccount-text": "ການສ້າງບັນຊີໂດຍກົງບໍ່ໄດ້ຖືກເປີດໃຊ້ໃນວິກິນີ້.",
+       "yourdomainname": "ໂດເມນຂອງທ່ານ:",
+       "password-change-forbidden": "ທ່ານບໍ່ສາມາດປ່ຽນລະຫັດຜ່ານໃນວິກິນີ້ໄດ້.",
+       "login": "ເຂົ້າສູ່ລະບົບ",
+       "login-security": "ຢືນຢັນຕົວຕົນຂອງທ່ານ",
+       "nav-login-createaccount": "ເຂົ້າສູ່ລະບົບ / ສ້າງບັນຊີ",
+       "userlogin": "ເຂົ້າສູ່ລະບົບ / ສ້າງບັນຊີ",
+       "userloginnocreate": "ເຂົ້າສູ່ລະບົບ",
+       "logout": "ອອກຈາກລະບົບ",
+       "userlogout": "ອອກຈາກລະບົບ",
+       "notloggedin": "ບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ",
+       "userlogin-noaccount": "ຍັງບໍ່ມີບັນຊີເທື່ອບໍ່?",
+       "userlogin-joinproject": "ເຂົ້າຮ່ວມກັບ {{SITENAME}}",
        "nologin": "ຍັງບໍ່ມີບັນຊີເທື່ອບໍ່? $1.",
        "nologinlink": "ສ້າງບັນຊີໃໝ່",
        "createaccount": "ສ້າງບັນຊີ",
-       "gotaccount": "ມີ ບັນຊີແລ້ວບໍ? '''$1'''.",
-       "gotaccountlink": "ເຊັນເຂົ້າ",
+       "gotaccount": "ມີບັນຊີແລ້ວບໍ? $1.",
+       "gotaccountlink": "ເຂົ້າສູ່ລະບົບ",
+       "userlogin-resetlink": "ລືມຂໍ້ມູນການເຂົ້າສູ່ລະບົບຂອງທ່ານບໍ່?",
+       "userlogin-resetpassword-link": "ລືມລະຫັດຜ່ານຂອງທ່ານບໍ່?",
+       "userlogin-helplink2": "ວິທີໃຊ້ການເຂົ້າສູ່ລະບົບ",
+       "userlogin-loggedin": "ທ່ານໄດ້ເຂົ້າສູ່ລະບົບໃນຊື່ {{GENDER:$1|$1}} ແລ້ວ.\nກະລຸນາໃຊ້ແບບຟອມຂ້າງລຸ່ມເພື່ອເຂົ້າສູ່ລະບົບໃນຊື່ອື່ນໆ.",
        "createaccountmail": "ໃຊ້ລະຫັດຜ່ານແບບສຸ່ມຊົ່ວຄາວແລະສົ່ງມັນໄປໃຫ້ທີ່ຢູ່ອີເມວທີ່ລະບຸ",
-       "badretype": "ລະຫັດຜ່ານ ທີ່ ທ່ານພິມຄືນ ບໍ່ຖືກກັບ ທີ່ພິມກ່ອນ.",
-       "loginerror": "ມີບັນຫາໃນການເຊັນເຂົ້າ",
+       "badretype": "ລະຫັດຜ່ານທີ່ທ່ານໄດ້ພິມຄືນບໍ່ກົງກັບທີ່ພິມກ່ອນ.",
+       "loginerror": "ຂໍ້ຜິດພາດໃນການເຂົ້າສູ່ລະບົບ",
+       "createacct-error": "ຂໍ້ຜິດພາດໃນການສ້າງບັນຊີ",
+       "createaccounterror": "ບໍ່ສາມາດສ້າງບັນຊີໄດ້: $1",
        "loginsuccesstitle": "ເຂົ້າສູ່ລະບົບແລ້ວ",
        "loginsuccess": "'''ທ່ານ ເຊັນເຂົ້າ  {{SITENAME}} ໃນນາມ \"$1\".'''",
        "wrongpassword": "ລະຫັດຜ່ານບໍ່ຖືກ. ກະລຸນາເຮັດຄືນໃໝ່.",
        "wrongpasswordempty": "ບໍ່ມີລະຫັດຜ່ານຖືກພິມເຂົ້າ. ກະລຸນາເຮັດຄືນໃໝ່.",
        "mailmypassword": "ຕັ້ງຄ່າລະຫັດຜ່ານໃໝ່",
+       "blocked-mailpassword": "ທີ່ຢູ່ IP ຂອງທ່ານໄດ້ຖືກບລັອກບໍ່ໃຫ້ແກ້ໄຂ. ເພື່ອເປັນການປ້ອງກັນການໃຊ້ງານໃນທາງທີ່ຜິດ, ຈຶ່ງບໍ່ອະນຸຍາດໃຫ້ໃຊ້ການກູ້ຄືນລະຫັດຜ່ານໂດຍໃຊ້ທີ່ຢູ່ IP ນີ້.",
        "acct_creation_throttle_hit": "ຂໍໂທດຫຼາຍໆ, ທ່ານ ໄດ້ສ້າງ $1 ບັນຊີແລ້ວ. ທ່ານ ບໍ່ສາມາດ ສ້ງບັນຊີໄດ້ອີກ.",
        "emailauthenticated": "ອີເມລຂອງທ່ານໄດ້ຖືກຢືນຢັນແລ້ວເມື່ອວັນທີ່ $2 ເວລາ $3.",
        "emailconfirmlink": "ຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ",
        "accountcreated": "ບັນຊີ ໄດ້ຖືກສ້າງ ແລ້ວ",
-       "accountcreatedtext": "ບັນຊີ ຂອງ  $1 ໄດ້ ຖືກສ້າງແລ້ວ.",
+       "accountcreatedtext": "ບັນຊີຜູ້ໃຊ້ຂອງ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ໄດ້ຖືກສ້າງຂຶ້ນແລ້ວ.",
        "pt-login": "ເຂົ້າສູ່ລະບົບ",
        "pt-createaccount": "ສ້າງບັນຊີ",
        "changepassword": "ປ່ຽນລະຫັດຜ່ານ",
        "newpassword": "ລະຫັດຜ່ານໃໝ່:",
        "retypenew": "ພິມລະຫັດຜ່ານໃໝ່ອີກ:",
        "resetpass_submit": "ຕັ້ງລະຫັດຜ່ານ ແລະ ເຊັນເຂົ້າ",
-       "changepassword-success": "ສຳà»\80ລັàº\94àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87 àº¥àº°àº«àº±àº\94àº\9cà»\88າàº\99àº\82ອàº\87àº\97à»\88າàº\99à»\81ລà»\89ວ! àº\94ຽວàº\99ີà»\89 àº\97à»\88າàº\99 à»\80àº\8aັà»\88àº\99à»\80àº\82ົà»\89າ à»\83àº\99 ...",
+       "changepassword-success": "ລະຫັàº\94àº\9cà»\88າàº\99àº\82ອàº\87àº\97à»\88າàº\99àº\96ືàº\81àº\9bà»\88ຽàº\99à»\81ລà»\89ວ!",
        "passwordreset-invalidemail": "ທີ່ຢູ່ອີເມລບໍ່ຖືກຕ້ອງ",
        "bold_sample": "ໂຕໜັງສືເຂັ້ມ",
        "bold_tip": "ໂຕໜັງສືເຂັ້ມ",
        "preview": "ລອງເບິ່ງຜົນ",
        "showpreview": "ລອງເບິ່ງຜົນ",
        "showdiff": "ສະແດງສ່ວນຕ່າງ",
-       "anoneditwarning": "'''ເຕືອນ:''' ທ່ານ ບໍ່ໄດ້ເຊັນເຂົ້າ. ທີ່ຢູ່ IP ຂອງ ທ່ານ ຈະຖືກບັນທຶກໄວ້ ໃນ ປະຫວັດການດັດແກ້ ຂອງ ໜ້ານີ້.",
+       "anoneditwarning": "<strong>ເຕືອນ:</strong> ທ່ານບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ. ທຸກໆຄົນຈະເຫັນທີ່ຢູ່ IP ຂອງທ່ານ ຖ້າທ່ານເຮັດການແກ້ໄຂໃດໆ. ຖ້າທ່ານ<strong>[$1 ເຂົ້າສູ່ລະບົບ]</strong> ຫຼື <strong>[$2 ສ້າງບັນຊີ]</strong>, ການແກ້ໄຂຂອງທ່ານຈະຖືວ່າແມ່ນຂອງຜູ້ໃຊ້ຄົນນັ້ນແທນ, ນອກຈາກນີ້ ຍັງມີປະໂຫຍດອື່ນໆອີກຫຼາຍຢ່າງນຳກັນ.",
        "blockedtitle": "ຜູ້ໃຊ້ຖືກຫ້າມ",
        "whitelistedittext": "ທ່ານ ຈະຕ້ອງ  $1 ເພື່ອ ຈະດັດແກ້.",
        "loginreqtitle": "ຈຳເປັນຕ້ອງ ເຊັນເຂົ້າ",
-       "loginreqlink": "ເຊັນເຂົ້າ",
+       "loginreqlink": "ເຂົ້າສູ່ລະບົບ",
+       "loginreqpagetext": "ກະລຸນາ $1 ເພື່ອເຂົ້າເບິ່ງໜ້າອື່ນໆ.",
        "accmailtitle": "ໄດ້ສົ່ງ ລະຫັດຜ່ານ ໄປແລ້ວ.",
        "accmailtext": "ລະຫັດຜ່ານ ຂອງ \"$1\" ໄດ້ຖືກສົ່ງໄປ  $2 ແລ້ວ.",
        "newarticle": "(ໃໝ່)",
        "newarticletext": "ທ່ານ ໄດ້ມາຮອດ ໜ້າທີ່ຍັງບໍ່ໄດ້ຖືກສ້າງຂຶ້ນເທື່ອ. ທ່ານ ສາມາດເລີ່ມ ສ້າງໜ້າ ໂດຍ ພິມໃສ່ ກັບ ຂ້າງລຸ່ມ.(ເບິ່ງລາຍລະອຽດຕື່ມ ທີ່ [$1 ໜ້າຊ່ວຍເຫຼືອ]).\nຖ້າ ທ່ານ ມາຮອດນີ້ ໂດຍຄວາມຜິດພາດ, ກະລຸນາ ກົດ ປຸ່ມ '''ກັບຄືນ''', ຢູ່ ໂປຣແກຣມ ທ່ອງເວັບ ຂອງທ່ານ.",
-       "noarticletext": "àº\8dັàº\87àº\9aà»\8dà»\88ມີà»\80àº\99ືà»\89ອà»\83àº\99 àº¢àº¹à»\88 à»\9cà»\89າàº\99ີà»\89, àº\97à»\88າàº\99ສາມາàº\94 [[Special:Search/{{PAGENAME}}|àº\84ົà»\89àº\99ຫາà»\9cà»\89າຫົວàº\82à»\8dà»\89àº\99ີà»\89]] àº«àº¼àº· [{{fullurl:{{FULLPAGENAME}}|action=edit}} àº\94ັàº\94à»\81àº\81à»\89ໜ້ານີ້].",
-       "previewnote": "'''ນີ້ ແມ່ນ ການລອງເບິ່ງຜົນເທົ່ານັ້ນ; ການດັດແກ້ຍັງບໍ່ທັນຖືກບັນທຶກ!'''",
+       "noarticletext": "àº\95ອàº\99àº\99ີà»\89à»\9cà»\89າàº\99ີà»\89àº\8dັàº\87àº\9aà»\8dà»\88ມີà»\80àº\99ືà»\89ອà»\83àº\99à»\83àº\94à»\86, àº\97à»\88າàº\99ສາມາàº\94[[Special:Search/{{PAGENAME}}|àº\84ົà»\89àº\99ຫາà»\9cà»\89າຫົວàº\82à»\8dà»\89àº\99ີà»\89]]à»\83àº\99à»\9cà»\89າອືà»\88àº\99à»\86, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} àº\84ົà»\89àº\99ຫາàº\9aັàº\99àº\97ຶàº\81ອືà»\88àº\99à»\86àº\97ີà»\88àº\81à»\88ຽວàº\82à»\89ອàº\87], àº«àº¼àº· [{{fullurl:{{FULLPAGENAME}}|action=edit}} àºªà»\89າàº\87ໜ້ານີ້].",
+       "previewnote": "<strong>ຈຳໄວ້ວ່ານີ້ແມ່ນພຽງການສະແດງໂຕຢ່າງເທົ່ານັ້ນ.</strong>\nການແກ້ໄຂຂອງທ່ານຍັງບໍ່ທັນຖືກບັນທຶກ!",
        "editing": "ພວມດັດແກ້ $1",
        "editingsection": "ພວມດັດແກ້ $1 (ພາກ)",
        "yourtext": "ເນື້ອໃນ",
        "page_first": "ທຳອິດ",
        "page_last": "ສຸດທ້າຍ",
        "histlegend": "ເລືອກສ່ວນຕ່າງ: ເລືອກກັບວົງມົນ ລະຫວ່າງສະບັບ ຢາກສົມທຽບ ແລ້ວ ກົດເອັນເຕີ ຫຼື ປຸ່ນຢູ່ທາງລຸ່ມ.<br />\nຄວາມໝາຍ: (ດຽວນີ້) = ສ່ວນຕ່າງສົມທຽບໃສ່ສະບັບດຽວນີ້,\n(ຫຼ້າສຸດ) = ສ່ວນຕ່າງສົມທຽບໃສ່ສະບັບກ່ອນໜ້ານີ້, M = ດັດແກ້ເລັກນ້ອຍ.",
-       "histfirst": "àº\97ຳອິດ",
-       "histlast": "ຫຼà»\89າສຸດ",
+       "histfirst": "à»\80àº\81ົà»\88າສຸດ",
+       "histlast": "à»\83à»\9dà»\88ສຸດ",
        "rev-delundel": "ສະແດງ/ເຊື່ອງ",
-       "history-title": "àº\9bະຫວັàº\94àº\81າàº\99àº\94ັàº\94à»\81àº\81à»\89 ຂອງ \"$1\"",
+       "history-title": "àº\9bະຫວັàº\94àº\81າàº\99à»\81àº\81à»\89à»\84àº\82ຂອງ \"$1\"",
        "lineno": "ແຖວ $1:",
        "compareselectedversions": "ສົມທຽບ ລະຫວ່າງ ສະບັບເລືອກ",
        "editundo": "ກັບຄືນ",
+       "searchresults": "ຜົນການຄົ້ນຫາ",
+       "searchresults-title": "ຜົນການຄົ້ນຫາສຳລັບ \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} ກ່ອນໜ້າ",
        "nextn": "{{PLURAL:$1|$1}} ຕໍ່ໄປ",
+       "shown-title": "ສະແດງ{{PLURAL:$1|ຜົນທີ່ໄດ້ຮັບ}} $1 ລາຍການຕໍ່ໜຶ່ງໜ້າ",
        "viewprevnext": "ເບິ່ງ ($1 {{int:pipe-separator}} $2) ($3).",
        "search-result-size": "$1 ({{PLURAL:$2|1 ຄຳ|$2 ຄຳ}})",
-       "search-redirect": "(à»\82ອàº\99 $1)",
+       "search-redirect": "(àº\9bà»\88ຽàº\99à»\80ສັà»\89àº\99àº\97າàº\87ມາàº\88າàº\81 $1)",
        "search-relatedarticle": "ກ່ຽວຂ້ອງ",
        "searchrelated": "ກ່ຽວຂ້ອງ",
        "searchall": "ທັງໜົດ",
        "showingresults": "ສະແດງທາງລຸ່ມ ຮອດ {{PLURAL:$1|'''1''' ຜົນ|'''$1''' ຜົນ}} ເລີ່ມຈາກ  #'''$2'''.",
        "preferences": "ການຕັ້ງຄ່າ",
-       "mypreferences": "ຕັ້ງຄ່າ",
+       "mypreferences": "àº\81າàº\99àº\95ັà»\89àº\87àº\84à»\88າ",
        "prefs-edits": "ຈຳນວນການດັດແກ້:",
        "prefs-skin": "ລວດລາຍ",
        "skin-preview": "ລອງເບິ່ງ",
        "prefs-misc": "ແລະອື່ນໆ",
        "saveprefs": "ບັນທຶກ",
        "prefs-editing": "ການດັດແກ້",
-       "rows": "ແຖວ:",
-       "columns": "ຖັນ:",
        "searchresultshead": "ຊອກຫາ",
        "recentchangesdays": "ຈຳນວນມື້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:",
-       "recentchangescount": "àº\88ຳàº\99ວàº\99àº\81າàº\99àº\94ັàº\94à»\81àº\81à»\89ສະà»\81àº\94àº\87à»\83àº\99àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87ຫຼà»\89າສຸàº\94:",
+       "recentchangescount": "àº\88ຳàº\99ວàº\99àº\81າàº\99à»\81àº\81à»\89à»\84àº\82àº\97ີà»\88àº\95à»\89ອàº\87àº\81າàº\99ສະà»\81àº\94àº\87à»\82àº\94àº\8dàº\9bະລິàº\8dາàº\8d:",
        "savedprefs": "ການຕັ້ງຄ່າຂອງທ່ານໄດ້ຖືກບັນທຶກແລ້ວ.",
-       "timezonelegend": "ເຂດເວລາ",
-       "localtime": "ເວລາທ້ອງຖິ່ນ",
-       "servertime": "ເວລາເຊີເວີ",
+       "timezonelegend": "ເຂດເວລາ:",
+       "localtime": "ເວລາທ້ອງຖິ່ນ:",
+       "servertime": "ເວລາເຊີເວີ:",
        "guesstimezone": "ເອົາເວລາຈາກໂປຣແກຣມທ່ອງເວັບ",
        "allowemail": "ອະນຸຍາດ ໃຫ້ຜູ້ໃຊ້ອື່ນ ສົ່ງອີເມລຫາຂ້ອຍ",
        "prefs-files": "ໄຟລ໌",
        "youremail": "ອີເມລ *:",
-       "username": "ຊື່ຜູ້ໃຊ້:",
+       "username": "{{GENDER:$1|ຊື່ຜູ້ໃຊ້}}:",
        "yourrealname": "ຊື່ແທ້ *:",
        "yourlanguage": "ພາສາ:",
        "yournick": "ຊື່ຫຼິ້ນ:",
        "show": "ສະແດງ",
        "minoreditletter": "ລ",
        "newpageletter": "ມ",
-       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ຫຼັງການປ່ຽນແປງ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|ໄບຕ໌}}ຫຼັງຈາກການປ່ຽນແປງ",
        "recentchangeslinked": "ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ",
        "recentchangeslinked-feed": "ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ",
        "recentchangeslinked-toolbox": "ການປ່ຽນແປງທີ່ກ່ຽວຂ້ອງ",
        "filehist-dimensions": "ມິຕິ",
        "filehist-filesize": "ຂະໜາດໄຟລ໌",
        "filehist-comment": "ຄຳເຫັນ",
-       "imagelinks": "ລິà»\89àº\87àº\84໌",
-       "linkstoimage": "ລິ້ງຄ໌ຕໍ່ໄປນີ້ເຊື່ອມຕໍ່ຫາໄຟລ໌:",
+       "imagelinks": "àº\81າàº\99à»\83àº\8aà»\89à»\84àº\9fລ໌",
+       "linkstoimage": "{{PLURAL:$1|ໜ້າຕໍ່ໄປນີ້ເຊື່ອມໂຍງ|$1 ໜ້າຕໍ່ໄປນີ້ເຊື່ອມໂຍງ}}ຫາໄຟລ໌ນີ້:",
        "nolinkstoimage": "ບໍ່ມີໜ້າໃດ ລິ້ງຄ໌ ຫາ ໄຟລ໌ນີ້.",
        "sharedupload": "ໄຟລ໌ນີ້ແມ່ນການອັບໂຫຼດຣ່ວມ ແລະ ອາດຖືກໃຊ້ໂດຍໂຄງການອື່ນໆ.",
        "listredirects": "ລາຍການການໂອນໜ້າ",
        "undeletepagetext": "ໜ້າຕ່ອໄປນີ້ຖຶກລຶບໄປແຕ່ຍັງຄົງຢູ່ໃນກຸທີ່ສາມາດຮຽກຄືນໄດ້ (ກຸຂໍ້ມູນອາດຖຶກລຶບເປັນລະຍະ)",
        "cannotundelete": "ບໍ່ສາມາດ ກັບຄືນ ຫາສະບັບກ່ອນການລຶບ; ບາງຄົນອາດເຮັດກ່ອນແລ້ວ.",
        "undelete-search-submit": "ຊອກຫາ",
-       "namespace": "àº\82ອàº\9aà»\80àº\82àº\94àº\8aືà»\88:",
+       "namespace": "àº\8aືà»\88àº\82ອàº\9aà»\80àº\82àº\94:",
        "blanknamespace": "(ຫຼັກ)",
        "contributions": "ການປະກອບສ່ວນ",
        "mycontris": "ປະກອບສ່ວນ",
        "ipblocklist": "ລາຍການ ທີ່ຢູ່ IP ແລະ ຊື່ຜູ້ໃຊ້ ທີ່ຖືກຫ້າມ",
        "blocklink": "ຫ້າມ",
        "contribslink": "ເລື່ອງທີ່ຂຽນ",
-       "autoblocker": "ຫà»\89າມà»\82àº\94àº\8dອັàº\94àº\95າà»\82àº\99ມັàº\94 àº\8dà»\89ອàº\99 àº\97ີà»\88ຢູà»\88 IP àº\82ອàº\87àº\97à»\88າàº\99 àº\96ືàº\81à»\83àº\8aà»\89à»\82àº\94àº\8d \"[[User:$1|$1]]\" à»\83àº\99à»\84ລàº\8dະຫຼັàº\87. à»\80ຫàº\94àº\9cົàº\99à»\83àº\99àº\81າàº\99ຫà»\89າມ  $1 à»\81ມà»\88àº\99 : \"$2\"",
+       "autoblocker": "àº\96ືàº\81àº\9aລັອàº\81à»\82àº\94àº\8dອັàº\94àº\95ະà»\82àº\99ມັàº\94àº\8dà»\89ອàº\99àº\97ີà»\88ຢູà»\88 IP àº\82ອàº\87àº\97à»\88າàº\99àº\96ືàº\81à»\83àº\8aà»\89à»\82àº\94àº\8d \"[[User:$1|$1]]\" à»\80ມືà»\88ອà»\84ວà»\86àº\99ີà»\89.\nà»\80ຫàº\94àº\9cົàº\99à»\83àº\99àº\81າàº\99àº\9aລັອàº\81 $1 à»\81ມà»\88àº\99 \"$2\"",
        "blocklogpage": "ບັນທຶກການຫ້າມ",
        "blocklogentry": "ໄດ້ຫ້າມ \"[[$1]]\" ຈົນຮອດ $2 $3",
        "move-page-legend": "ຍ້າຍໜ້າ",
        "tooltip-pt-mycontris": "ລາຍການປະກອບສ່ວນຂອງຂ້ອຍ",
        "tooltip-pt-login": "ນີ້ບໍ່ແມ່ນການບັງຄັບ. ແຕ່ຢ່າງໃດກໍຕາມ, ທ່ານຄວນທີ່ຈະເຂົ້າສູ່ລະບົບ.",
        "tooltip-pt-logout": "ເຊັນອອກ",
-       "tooltip-pt-createaccount": "àº\99ີà»\89ິàº\9aà»\8dà»\88à»\81ມà»\88àº\99àº\81າàº\99àº\9aັàº\87àº\84ັàº\9a. à»\81àº\95à»\88ຢà»\88າàº\87à»\83àº\94àº\81à»\8dàº\95າມ, àº\97à»\88າàº\99àº\84ວàº\99àº\97ີà»\88àº\88ະສà»\89າàº\87àº\9aັàº\99àº\8aີà»\81ລະà»\80àº\82ົà»\89າສູà»\88ລະàº\9aົàº\9a.",
+       "tooltip-pt-createaccount": "ນີ້ບໍ່ແມ່ນການບັງຄັບ. ແຕ່ຢ່າງໃດກໍຕາມ, ທ່ານຄວນທີ່ຈະສ້າງບັນຊີແລະເຂົ້າສູ່ລະບົບ.",
        "tooltip-ca-talk": "ສົນທະນາກ່ຽວກັບເນື້ອໃນຂອງໜ້າ",
        "tooltip-ca-edit": "ແກ້ໄຂໜ້ານີ້",
-       "tooltip-ca-addsection": "à»\80àº\9eີà»\88ມ àº\84ຳà»\80ຫັàº\99 à»\83ສà»\88 àº\81າàº\99ສົàº\99àº\97ະàº\99າàº\99ີà»\89.",
+       "tooltip-ca-addsection": "à»\80ລີà»\88ມàº\9eາàº\81à»\83à»\9dà»\88",
        "tooltip-ca-viewsource": "ໜ້ານີ້ຖືກປົກປ້ອງ. ທ່ານສາມາດເບິ່ງຊອສ.",
        "tooltip-ca-history": "ລຸ້ນແກ້ໄຂເກົ່າຂອງໜ້ານີ້",
        "tooltip-ca-protect": "ປົກປ້ອງໜ້ານີ້",
        "tooltip-search": "ຄົ້ນຫາ {{SITENAME}}",
        "tooltip-search-go": "ໄປຫາໜ້າທີ່ມີຊື່ທີ່ແນ່ນອນນີ້ຖ້າມັນມີຢູ່",
        "tooltip-search-fulltext": "ຄົ້ນຫາຂໍ້ຄວາມນີ້ໃນໜ້າ",
-       "tooltip-p-logo": "à»\80àº\82ົà»\89າສູà»\88ໜ້າຫຼັກ",
+       "tooltip-p-logo": "ຢà»\89ຽມàº\8aົມໜ້າຫຼັກ",
        "tooltip-n-mainpage": "ໄປເບິ່ງໜ້າຫຼັກ",
-       "tooltip-n-mainpage-description": "à»\80àº\82ົà»\89າສູà»\88ໜ້າຫຼັກ",
+       "tooltip-n-mainpage-description": "à»\80àº\82ົà»\89າຢà»\89ຽມàº\8aົມໜ້າຫຼັກ",
        "tooltip-n-portal": "ກ່ຽວກັບໂຄງການ, ສິ່ງທີ່ທ່ານເຮັດໄດ້, ແລະບ່ອນທີ່ສາມາດຫາສິ່ງຕ່າງໆໄດ້",
        "tooltip-n-currentevents": "ຄົ້ນຫາມູນກ່ຽວກັບກິດຈະກຳທີ່ກຳລັງດຳເນີນ",
        "tooltip-n-recentchanges": "ລາຍການການປ່ຽນແປງລ້າສຸດໃນວິກິ",
        "tooltip-t-permalink": "ລິງຄ໌ຖາວອນມາລຸ້ນແກ້ໄຂເກົ່າຂອງໜ້ານີ້",
        "tooltip-ca-nstab-main": "ເບິ່ງໜ້າເນື້ອໃນ",
        "tooltip-ca-nstab-user": "ເບິ່ງໜ້າຜູ້ໃຊ້",
+       "tooltip-ca-nstab-special": "ໜ້ານີ້ແມ່ນໜ້າພິເສດ, ແລະບໍ່ສາມາດແກ້ໄຂໄດ້",
        "tooltip-ca-nstab-project": "ເບິ່ງໜ້າໂຄງການ",
-       "tooltip-ca-nstab-image": "ເບິງໜ້າໄຟລ໌",
+       "tooltip-ca-nstab-image": "à»\80àº\9aິà»\88àº\87à»\9cà»\89າà»\84àº\9fລà»\8c",
        "tooltip-ca-nstab-template": "ເບິ່ງແມ່ແບບ",
        "tooltip-ca-nstab-category": "ເບິ່ງ ໜ້າໝວດ",
        "tooltip-minoredit": "ໝາຍວ່າແມ່ນການດັດແກ້ເລັກນ້ອຍ",
        "thumbsize": "ຂະໜາດສະແດງ:",
        "file-info-size": "$1 × $2  ປິກເຊລ, ຂະໜາດໄຟລ໌: $3, MIME type: $4",
        "file-nohires": "ບໍ່ມີຂະໜາດລະອຽດກວ່າ",
-       "show-big-image": "à»\80àº\95ັມàº\82ະà»\9cາàº\94",
+       "show-big-image": "à»\84àº\9fລà»\8càº\95ົà»\89àº\99ສະàº\9aັàº\9a",
        "show-big-image-size": "$1 × $2 ພິກເຊວ",
        "newimages": "ໄຟລ໌ຮູບໃໝ່",
        "newimages-summary": "ໜ້າພິເສດນີ້ສະແດງໄຟລ໌ທີ່ຖຶກອັປໂຫຼດຫຼ້າສຸດ",
index 996551b..4a39965 100644 (file)
        "passwordreset-emaildisabled": "چیا هأنی کئ هان د أنجومانامە د ئی ڤیکی ناکونئشتگأر بینە.",
        "passwordreset-username": "نوم کاریاری:",
        "passwordreset-domain": "پوشگئر",
-       "passwordreset-capture": "أنجومانامە نأتیجە نە سئل بأکیت؟",
-       "passwordreset-capture-help": "أر شوما ئی جأڤە نئ ڤارئسی بأکیت.أنجومانامە (ڤا رازینە گوڤاردئن موڤأقأتی) جوٙری کئ سی کاریاریا هأنی کئل بییە دیاری میکە.",
        "passwordreset-email": "تیرنئشوٙن أنجومانامە",
        "passwordreset-emailtitle": "جوزئیات حئساڤ ها د {{نوم مالگە}}",
        "passwordreset-emailtext-ip": "یە کئسی(گاسی خوتوٙ، ڤا تیرنئشوٙن آی پی $1) د نۊ زئنە کئردئن رازینە گوڤاردئنئتوٙ د {{SITENAME}} حاستیتە($4).\nسی کاریار «$2» یئ گئل رازینە گوڤاردئن موڤأقتی رأڤأندیاری بییە و هومبأراڤأر «$3» ە.\nأر دالئتوٙ یە بییە ئیسئ ڤاس بیائیت ڤامین ساموٙنە و یئ گئل رازینە گوڤاردئن هأنی بئهایت.\n رازینە گوڤاردئن {{PLURAL:$3|ئی رازینە یا گوڤاردئن موڤأقأتی|ئی رازینە یا گوڤاردئن موڤأقأتی}} شوما د گات {{PLURAL:$5|یئ روٙ|$5 روٙ}} باطئل بوٙە.\n\nأر کأسی هأنی چئن حاستی داشتە یا یە کئ رازینە گوڤاردئن دئمایی شوما د ڤیرئتوٙ ئوٙما و دە نئمیهایت ڤئنە آلئشت کاری بأکیت، می توٙنیت د ئی پئیغوم تیە پوٙشی بأکیت و هأموٙ رازینە گوڤاردئن دئمایی نە بونیت د کار.",
        "saveprefs": "ئمایە کئردئن",
        "restoreprefs": "د نو زنه کردن همه میزونکاریا پیش فرض(د همه جایا)",
        "prefs-editing": "د حال و بال ڤیرایئشت",
-       "rows": "رأگیا:",
-       "columns": "ستينا:",
        "searchresultshead": "پئی جوٙری",
        "stub-threshold": "آستوٙنە ڤیرایئشتکاریا د یأک دیسئسە <a href=\"#\" class=\"stub\">ناقئص</a> (بایت):",
        "stub-threshold-sample-link": "نئموٙنە",
        "userrights-reason": "دألیل:",
        "userrights-no-interwiki": "شما سی ویرایشت حقوق کاریار د ویکی یا هنی دسرسی ناریت.",
        "userrights-nodatabase": "پاگا دونسمنی $1 یا نیئش یا د ولاتنشین نئ.",
-       "userrights-nologin": "شما باید وا یه گل حساو کاریاری دیووندار [[Special:UserLogin|روئیت وامین ]] تا تونستوییت حقوق کاریاری کاریار نه گماشته کاری بکیت.",
-       "userrights-notallowed": "شما سی اضاف کردن  حقوق کاریار یا ورداشتنش دسرسی ناریت.",
        "userrights-changeable-col": "گرویایی که شما تونیت ویرایشت بکید",
        "userrights-unchangeable-col": "گرویایی که شما نتونیت ویرایشت بکید",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "تعارض دسرسیا کاریاری! لطف بکیت یه گل وارسی انجوم بئیت و آلشتانه پشت راس بکیت.",
-       "userrights-removed-self": "شما د خوئی حقوق خوتونه ؤرداشتیته، چی یه که مثلا شما تر نمی تونیت وه ای بلگه دسرسی داشتویت.",
        "group": "جأرغە",
        "group-user": "کاریاریا",
        "group-autoconfirmed": "کاریاریا خود پوشت راس بییە",
        "right-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
        "right-override-export-depth": "وه در دئن بلگه یایی که بلگه یا هوم پیوند بیه تا پی یا 5 ها دشو",
        "right-sendemail": "سی کاریاریا هنی انجومانامه کل بکید",
-       "right-passwordreset": "رازینه گواردن انجومانامه د نو دئه بیه نه بوینیت",
        "right-managechangetags": "راس کئردئن [[Special:سأردیسیا|سأردیسیا]] پاکسا کئردئن د رئسینە جا",
        "right-applychangetags": "ڤئ کار گئرئتئنئ [[Special:سأردیسیا|سأردیسیا]] ڤاگئرد آلئشتیا ھأرکومئشوٙ.",
        "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "php-uploaddisabledtext": "سوارکرد جانیایا د پی اچ پی ناکشتگر بیه.\nلطفن میزونکاری سوارکرد جانیا نه وارسی بکیت.",
        "uploadscripted": "ای بلگه مینونه دار رازینه اچ تی امل یا نیسسه یه که شایت وه ناخوشی وا دوراته نیئر واشکافت با.",
        "upload-scripted-pi-callback": "نأبوٙە جانیایایی کئ د ڤأرگئرئتە آموختارکاری پأردازئشت بألگە یا ئیکس ئم ئلئن سوڤار بأکیت.",
-       "uploadscriptednamespace": "ای جانیا اس‌ وی‌ جی نوم جا غیرقانونی '$1' داره.",
+       "uploadscriptednamespace": "ای جانیا اس‌ وی‌ جی نوم جا غیرقانونی '<nowiki>$1</nowiki>' داره.",
        "uploadinvalidxml": "ایکس ام الی که سوار بیه نبوئه نوتیج با.",
        "uploadvirus": "د ای جانیا ویروس هئ!\nجزیات:$1",
        "uploadjava": "ای جانیا یه گل جانیا زیپه که مینونه دار جانیایی د نوع کلاس جاوائه.\nسوارکردن جانیایا جاوا قدقن بیه، سی یه که شایت ونو صلا دور زئن محدودیتیا امنیتی نه بی ئن.",
        "feedback-useragent": "راوط کاریا:",
        "searchsuggest-search": "پی جوری",
        "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": "&lrm;$1 {{PLURAL:$4|یه جور جانیا ناصلاداره|چن جور جانیا ناصلادارن}}. {{PLURAL:$3|جور جانیا صلاداره|چن جور جانیا صلادارن}} چنیه: $2.",
-       "api-error-filetype-missing": "نوم جانیا یه گل دمادیس گم بیه ئه.",
-       "api-error-hookaborted": "آلشکاری که شما میهاستیت ره وندیاریش بکیت وا یه گل دما دیس انجوم شیو بیه.",
-       "api-error-http": "خطا مینجایی:نبوئه د رسینه جا وصل بوئیت.",
-       "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
-       "api-error-internal-error": "خطا مینجاکار: وا پردازشتکاری سوارکرد شما د ویکی ، یه گل اشتوا پیش اوما.",
-       "api-error-invalid-file-key": "خطا مینجاکار: جانیا د اماییه جا موقت نئ.",
-       "api-error-missingparam": "خطا مینجاکار: پارامتریایی که د حاست نیئن.",
-       "api-error-missingresult": "خطا مینجاکار: نبوئه بفمئی که ورداشت کاری خوش سرانجوم بیه یا نه.",
-       "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
-       "api-error-mustbeposted": "خطای مینجاکار: حاستن واس د طریق روشت POST HTTP کل با.",
-       "api-error-noimageinfo": "سوارکرد خوش سرانجوم بی، ولی رسینه جا هیچ جور دونسمنی یی د جانیا وه ایما نه دئه.",
-       "api-error-nomodule": "خطا مینجاکار: ماجول سوارکرد میزونکاری نبیه.",
-       "api-error-ok-but-empty": "خطا مینجاکار: رسینه جا جواوی نده.",
-       "api-error-overwrite": "نیسنن ری یه گل جانیایی که هیئش صلا ندئه بیه",
-       "api-error-stashfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
        "api-error-publishfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
-       "api-error-stasherror": "د گات جا وه جاکاری جانیا سی اماییه کاری یه گل خطا پیش اوما.",
-       "api-error-stashedfilenotfound": "د گاتی که سی سوارکرد جانیا استش تلاش می کردیت، جانیا استش دیاری نکرد.",
-       "api-error-stashpathinvalid": "مسیری که جانیا استش واس د وه با اشتوا بی.",
-       "api-error-stashfilestorage": "د گات اماییه کاری جانیا سی اماییه کاری یه گل خطا پیش اوما.",
-       "api-error-stashzerolength": "رسینه جا نمی تونه جانیا استش نه اماییه بکه سی یه انازه وه صفره.",
-       "api-error-stashnotloggedin": "سی اماییه کاری جانیایا د سوارکرد استش واس روئیت مین سامونه.",
-       "api-error-stashwrongowner": "جانیا کلیتی که شما میهاستیت د وه دسرسی داشتوئیت،مال شما نئ.",
-       "api-error-stashnosuchfilekey": "جانیا کلیتی که شما میهاستیت د وه دسرسی داشتوئیت، نیئش.",
-       "api-error-timeout": "رسینه جا د گات تیه وه را بیین جواوی نده.",
-       "api-error-unclassified": "یه گل خطا نادیار ری ون کرده.",
-       "api-error-unknown-code": "خطا نادیار:\"$1\".",
-       "api-error-unknown-error": "خطا مینونه: د گاتی که شما د حال و بار تلاش سی سوارکرد جانیاتو بییت، یه گل اشتوا پیش اوما.",
+       "api-error-stashfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
        "api-error-unknown-warning": "هشدار نادیار:\"$1\".",
        "api-error-unknownerror": "خطا نادیار:\"$1\".",
-       "api-error-uploaddisabled": "سوار کردن د ای ویکی ناکشتگر بیه.",
-       "api-error-verification-error": "شایت جانیا خراو بیه، یا پسون غلط داشتوئه.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقه یا}}",
        "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتیا}}",
index 4883327..9d4c115 100644 (file)
        "views": "Peržiūros",
        "toolbox": "Įrankiai",
        "tool-link-userrights": "Keisti {{GENDER:$1|naudotojo|naudotojos}} grupes",
+       "tool-link-userrights-readonly": "Žiūrėti {{GENDER:$1|vartotojo|vartotojos}} grupes",
        "tool-link-emailuser": "Siųsti {{GENDER:$1|šiam naudotojui|šiai naudotojai}} el. laišką",
        "userpage": "Rodyti naudotojo puslapį",
        "projectpage": "Rodyti projekto puslapį",
        "ok": "Gerai",
        "retrievedfrom": "Gauta iš „$1“",
        "youhavenewmessages": "Jūs turite $1 ($2).",
-       "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito naudotojo|$3 naudotojų}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Jūs gavote}} $1 iš {{PLURAL:$3|kito naudotojo|$3 naudotojų}} ($2).",
        "youhavenewmessagesmanyusers": "Jūs turite $1 iš daugelio vartotojų ( $2 ) .",
        "newmessageslinkplural": "{{PLURAL:$1|nauja žinutė|999=naujos žinutės}}",
        "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|999=pakeitimai}}",
        "passwordreset-emaildisabled": "El. pašto funkcijos uždraustos šiame wiki.",
        "passwordreset-username": "Naudotojo vardas:",
        "passwordreset-domain": "Domenas:",
-       "passwordreset-capture": "Peržiūrėti galutinį e-mail laišką?",
-       "passwordreset-capture-help": "Jei jūs čia pažymėsite, tai e-mail laiškas (su laikinuoju slaptažodžiu) bus parodytas jums prieš išsiunčiant jį naudotojui.",
        "passwordreset-email": "E-pašto adresas:",
        "passwordreset-emailtitle": "Paskyros informacija apie {{sitename}}",
        "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, iš IP adreso $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei priminti slaptažodį paprašė kažkas kitas arba jūs prisiminėte savo pirminį slaptažodį ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailelement": "Naudotojo vardas: \n$1\n\nLaikinas slaptažodis: \n$2",
        "passwordreset-emailsentemail": "Jeigu šis el. pašto adresas yra susietas su jūsų paskyra, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
        "passwordreset-emailsentusername": "Jeigu buvo el. paštas susietas su šiuo naudotojo vardu, tai slaptažodžio atkūrimo el. laiškas bus išsiųstas.",
-       "passwordreset-emailsent-capture2": "Slaptažodžio keitimo {{PLURAL:$1|el. laiškas buvo išsiųstas|el. laiškai buvo išsiųsti}}. {{PLURAL:$1|vartotojo vardas ir slaptažodis rodomi|vartotojų vardų ir slaptažodžių sąrašas rodomas}} čia.",
-       "passwordreset-emailerror-capture2": "El. laiško siuntimas {{GENDER:$2|naudotojui|naudotojai}} nepavyko: $1 {{PLURAL:$3|{{GENDER:$2|naudotojo|naudotojos}} vardas ir slaptažodis rodomi|naudotojų vardų ir slaptažodžių sąrašas rodomi}} čia.",
        "passwordreset-nocaller": "Skambinantysis turi būti nurodytas",
        "passwordreset-nosuchcaller": "Skambinantysis neegzistuoja: $1",
        "passwordreset-invalidemail": "Neteisingas el. pašto adresas",
        "saveprefs": "Išsaugoti",
        "restoreprefs": "Grąžinti visus numatytuosius nustatymus (visose skiltyse)",
        "prefs-editing": "Redagavimas",
-       "rows": "Eilutės:",
-       "columns": "Stulpeliai:",
        "searchresultshead": "Paieškos nustatymai",
        "stub-threshold": "Ribinė reikšmė nepilnų puslapių nuorodų formatavimui ($1):",
        "stub-threshold-sample-link": "pavyzdys",
        "editusergroup": "Redaguoti {{GENDER:$1|naudotojo}} grupes",
        "editinguser": "Redaguojamos {{GENDER:$1|naudotojo}} <strong>[[User:$1|$1]]</strong> $2 teisės",
        "userrights-editusergroup": "Redaguoti naudotojų grupes",
+       "userrights-viewusergroup": "Žiūrėti naudotojo grupes",
        "saveusergroups": "Saugoti {{GENDER:$1|naudotojo}} grupes",
        "userrights-groupsmember": "Narys:",
        "userrights-groupsmember-auto": "Narys automatiškai:",
        "userrights-reason": "Priežastis:",
        "userrights-no-interwiki": "Jūs neturite leidimo keisti naudotojų teises kituose projektuose.",
        "userrights-nodatabase": "Duomenų bazė $1 neegzistuoja arba yra ne vietinė.",
-       "userrights-nologin": "Jūs privalote [[Special:UserLogin|prisijungti]] kaip administratorius, kad galėtumėte priskirti naudotojų teises.",
-       "userrights-notallowed": "Jūs neturite leidimo įtraukti arba pašalinti vartotojo teisių.",
        "userrights-changeable-col": "Grupės, kurias galite keisti",
        "userrights-unchangeable-col": "Grupės, kurių negalite keisti",
+       "userrights-expiry-current": "Baigiasi $1",
+       "userrights-expiry-none": "Nesibaigia",
+       "userrights-expiry": "Baigiasi:",
+       "userrights-expiry-othertime": "Kitas laikas:",
        "userrights-conflict": "Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.",
-       "userrights-removed-self": "Jūs pašalinote savo paties teises. Taigi, nebegalite pasiekti šio puslapio.",
        "group": "Grupė:",
        "group-user": "Naudotojai",
        "group-autoconfirmed": "Automatiškai patvirtinti naudotojai",
        "right-siteadmin": "Atrakinti ir užrakinti duomenų bazę",
        "right-override-export-depth": "Eksportuoti puslapius įtraukiant susietus puslapius iki 5 lygio gylio",
        "right-sendemail": "Siųsti el. laišką kitiems naudotojams",
-       "right-passwordreset": "Peržiūrėti slaptažodžio pakeitimo e-mail laiškus",
        "right-managechangetags": "Kurti ir (de)aktyvuoti [[Special:Tags|žymes]]",
        "right-applychangetags": "Taikyti [[Special:Tags|žymes]] kartu su pokyčiais",
        "right-changetags": "Pridėti ir ištrinti savavališkus [[Special:Tags|žymes]] individualiuose pakeitimuose ir žurnalo įrašuose",
        "action-upload_by_url": "įkelti šią rinkmeną iš URL adreso",
        "action-writeapi": "naudotis rašymo API",
        "action-delete": "ištrinti šį puslapį",
-       "action-deleterevision": "ištrinti šią reviziją",
-       "action-deletedhistory": "žiūrėti šio ištrinto puslapio istoriją",
+       "action-deleterevision": "ištrinti revizijas",
+       "action-deletelogentry": "trinti žurnalo įrašus",
+       "action-deletedhistory": "žiūrėti puslapio ištrintą istoriją",
        "action-browsearchive": "ieškoti ištrintų puslapių",
-       "action-undelete": "atkurti šį puslapį",
+       "action-undelete": "atkurti puslapius",
        "action-suppressrevision": "peržiūrėti ir atkurti šią paslėptą versiją",
        "action-suppressionlog": "peržiūrėti šį privatų registrą",
        "action-block": "neleisti šiam naudotojui redaguoti",
        "action-userrights-interwiki": "keisti naudotojų teises kitose wiki svetainėse",
        "action-siteadmin": "užrakinti ar atrakinti duomenų bazę",
        "action-sendemail": "siųsti e-mail laiškus",
+       "action-editmyoptions": "keisti savo nustatymus",
        "action-editmywatchlist": "redaguoti savo stebėjimų sąrašą",
        "action-viewmywatchlist": "rodyti savo stebėjimų sąrašą",
        "action-viewmyprivateinfo": "peržiūrėti jūsų privačią informaciją",
        "recentchanges-legend-heading": "<strong>Paaiškinimai:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taip pat žiūrėkite [[Special:NewPages|naujausių straipsnių sąrašą]])",
        "recentchanges-submit": "Rodyti",
+       "rcfilters-activefilters": "Aktyvūs filtrai",
+       "rcfilters-clear-all-filters": "Valyti visus filtrus",
+       "rcfilters-invalid-filter": "Negalimas filtras",
+       "rcfilters-filterlist-title": "Filtrai",
+       "rcfilters-filterlist-noresults": "Nerastas toks filtras",
+       "rcfilters-filtergroup-registration": "Vartotojo registracija",
+       "rcfilters-filter-registered-label": "Registruoti",
+       "rcfilters-filter-unregistered-label": "Neregistruoti",
+       "rcfilters-filter-editsbyself-label": "Jūsų keitimai",
+       "rcfilters-filter-editsbyself-description": "Jūsų keitimai.",
+       "rcfilters-filter-editsbyother-label": "Kitų keitimai",
+       "rcfilters-filter-editsbyother-description": "Kaitimai sukurti kitų vartotojų (ne jūsų).",
+       "rcfilters-filtergroup-userExpLevel": "Patirties lygis (tik registruotiems vartotojams)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Naujokai",
+       "rcfilters-filter-userExpLevel-learner-label": "Mokiniai",
+       "rcfilters-filter-userExpLevel-experienced-label": "Patyrę vartotojai",
+       "rcfilters-filter-userExpLevel-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
+       "rcfilters-filter-bots-label": "Robotas",
+       "rcfilters-filter-bots-description": "Keitimai, atlikti automatinių įrankių.",
+       "rcfilters-filter-humans-label": "Žmogaus (ne roboto)",
+       "rcfilters-filter-humans-description": "Keitimai atlikti žmonių.",
+       "rcfilters-filtergroup-significance": "Reikšmė",
+       "rcfilters-filter-minor-label": "Smulkūs pakeitimai",
+       "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip mažus.",
+       "rcfilters-filter-major-label": "Nesmulkūs pakeitimai",
+       "rcfilters-filter-major-description": "Keitimai, nepažymėti kaip smulkūs.",
+       "rcfilters-filtergroup-changetype": "Pakeitimo tipas",
+       "rcfilters-filter-pageedits-label": "Puslapių keitimai",
+       "rcfilters-filter-newpages-label": "Puslapių sukūrimai",
+       "rcfilters-filter-newpages-description": "Keitimai, kurie sukuria naujus puslapius.",
+       "rcfilters-filter-categorization-label": "Kategorijų pakeitimai",
+       "rcfilters-filter-categorization-description": "Įrašai puslapių, kurie yra pridedami ar pašalinami iš kategorijų.",
        "rcnotefrom": "Žemiau yra {{PLURAL:$5|pakeitimas|pakeitimai}} pradedant <strong>$3, $4</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
        "rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2",
        "rcshowhideminor": "$1 smulkius keitimus",
        "uploaded-setting-handler-svg": "SVG, kurie nustato \"handler\" atributą naudodami remote/data/script, yra užblokuoti. Įkeltame SVG faile rasta <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "Užblokuoti SVG, kurie nustato style atributą naudodami nuotolinį URL. Įkeltame SVG faile rasta <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "Įkeltame SVG faile rastas paveikslėlio filtras su URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Šis SVG failas turi neteisėtą vietą vardui '$1'",
+       "uploadscriptednamespace": "Šis SVG failas turi neteisėtą vietą vardui '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML įkeltoje rinkmenoje negali būti išnagrinėtas.",
        "uploadvirus": "Šiame faile yra virusas! Smulkiau: $1",
        "uploadjava": "Ši rinkmena tai ZIP rinkmena, kurioje yra Java .class rinkmena.\nĮkelti Java rinkmenų neleidžiama, nes jos gali padėti apeiti saugumo apribojimus.",
        "apisandbox-alert-field": "Šio lauko reikšmė yra neteisinga.",
        "apisandbox-continue": "Tęsti",
        "apisandbox-continue-clear": "Išvalyti",
+       "apisandbox-multivalue-all-values": "$1 (Visos reikšmės)",
        "booksources": "Knygų šaltiniai",
        "booksources-search-legend": "Knygų šaltinių paieška",
        "booksources-search": "Ieškoti",
        "activeusers-count": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} per {{PLURAL:$3|paskutinę dieną|$3 paskutines dienas|$3 paskutinių dienų}}",
        "activeusers-from": "Rodyti naudotojus, pradedant:",
        "activeusers-groups": "Rodyti vartotojus, priklausančius grupėms:",
+       "activeusers-excludegroups": "Išskirti vartotojus, priklausančius grupėms:",
        "activeusers-noresult": "Nerasta jokių naudotojų.",
        "activeusers-submit": "Rodyti aktyvius vartotojus",
        "listgrouprights": "Naudotojų grupių teisės",
        "proxyblockreason": "Jūsų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. Prašome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneškite jiems apie šią svarbią saugumo problemą.",
        "sorbsreason": "Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės.",
        "sorbs_create_account_reason": "Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės. Jūs negalite sukurti paskyros",
+       "softblockrangesreason": "Anoniminiai įnašai nėra leidžiami iš jūsų IP adreso ($1). Prašome prisijungti.",
        "xffblockreason": "IP adresas esantys X-Forwarded-For antraštėje, jūsų ar tarpinio serverio, kuriuo jūs naudojatės, buvo užblokuotas. Originali bloko priežastis buvo: $1",
        "cant-see-hidden-user": "Naudotojas, kurį bandote užblokuoti, jau yra užblokuotas arba paslėptas.\nKadangi jūs neturi hideuser teisės, jūs negalite pamatyti arba pakeisti naudotojo blokavimo.",
        "ipbblocked": "Jūs negalite blokuoti ar atblokuoti kitų naudotojų, nes pats esate užblokuotas",
        "pageinfo-length": "Puslapio ilgis (baitais)",
        "pageinfo-article-id": "Puslapio ID",
        "pageinfo-language": "Puslapio turinio kalba",
+       "pageinfo-language-change": "keisti",
        "pageinfo-content-model": "Puslapio turinio modelis",
        "pageinfo-content-model-change": "keisti",
        "pageinfo-robot-policy": "Robotų indeksavimas",
        "htmlform-user-not-exists": "<strong>$1</strong> neegzistuoja.",
        "htmlform-user-not-valid": "<strong>$1</strong> nėra tinkamas naudotojo vardas.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3",
+       "logentry-delete-delete_redir": "$1 pervadindamas {{GENDER:$2|ištrynė}} buvusį nukreipimą $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|atkūrė}} puslapį $3",
        "logentry-delete-event": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|versijos|$5 versijų}} puslapyje $3: $4",
        "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",
        "feedback-bugcheck": "Puiku! Tiesiog patikrinkite, ar tai ne viena [$1 jau žinomų klaidų].",
        "feedback-useragent": "Vartotojo veiksnys:",
        "searchsuggest-search": "Ieškoti",
        "searchsuggest-containing": "turintys",
-       "api-error-autoblocked": "Jūsų IP adresas buvo automatiškai užblokuotas, nes jį naudojo užblokuotas naudotojas.",
-       "api-error-badaccess-groups": "Jums neleidžiama įkelti failus į šią wiki.",
        "api-error-badtoken": "Vidinė klaida: blogai atpažinimo ženklas.",
-       "api-error-blocked": "Jus buvote užblokuotas, kad negalėtumėte redaguoti.",
-       "api-error-copyuploaddisabled": "Siuntimas pagal URL yra išjungtas šiame serveryje.",
-       "api-error-duplicate": "Jau {{PLURAL:$1|yra kitas failas|yra kiti failai}} puslapyje su tuo pačiu turiniu.",
-       "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo kitas failas|buvo kitų failų}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo ištrintas|buvo ištrinti}}.",
-       "api-error-empty-file": "Pateikta failas buvo tuščias.",
        "api-error-emptypage": "Kurti naujus, tuščius puslapius neleidžiama.",
-       "api-error-fetchfileerror": "Vidinė klaida: Kažkas nutiko gaunant failą.",
-       "api-error-fileexists-forbidden": "Failas, kurio pavadinimas \"$1\" jau egzistuoja, ir negali būti perrašytas.",
-       "api-error-fileexists-shared-forbidden": "Failas, kurio pavadinimas \"$1\" jau egzistuoja bendro naudojimo failų saugykloje, ir negali būti perrašytas.",
-       "api-error-file-too-large": "Failą, kurį pateikėte buvo per didelis.",
-       "api-error-filename-tooshort": "Failo vardas yra per trumpas.",
-       "api-error-filetype-banned": "Šis failų tipas yra uždraustas.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nėra leistinas failo tipas|nėra leistini failo tipai}}.{{PLURAL:$3|Leistinas failo tipas yra|Leistini failo tipai yra}} $2.",
-       "api-error-filetype-missing": "Failas neturi galūnės.",
-       "api-error-hookaborted": "Pakeitimą, kurį bandėte atlikti, nutraukė priedas.",
-       "api-error-http": "Vidinė klaida: nepavyko prisijungti prie serverio.",
-       "api-error-illegal-filename": "Failo vardas neleidžiamas.",
-       "api-error-internal-error": "Vidinė klaida: Kažkas ne taip su jūsų įkėlimo apdorojimu wiki.",
-       "api-error-invalid-file-key": "Vidinė klaida: failas nerastas saugykloje.",
-       "api-error-missingparam": "Vidinė klaida: Trūksta reikalingų parametrų.",
-       "api-error-missingresult": "Vidinė klaida: nepavyko nustatyti, ar pavyko nukopijuoti.",
-       "api-error-mustbeloggedin": "Jūs turite būti prisijungęs kad galėtumėte įkelti failus.",
-       "api-error-mustbeposted": "Vidinė klaida: prašymas reikalauja HTTP POST.",
-       "api-error-noimageinfo": "Įkelti pavyko, bet serveris nepateikė mums jokios informacijos apie failą.",
-       "api-error-nomodule": "Vidinė klaida: nėra nustatytas įkėlimų modulis.",
-       "api-error-ok-but-empty": "Vidinė klaida: nėra atsakymo iš serverio.",
-       "api-error-overwrite": "Perrašymas esamą failą neleidžiamas.",
-       "api-error-ratelimited": "Jūs per trumpą laiko tarpą bandote įkelti daugiau failų, nei leidžiama šiame projekte.\nPabandykite dar kartą po keleto minučių.",
-       "api-error-stashfailed": "Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.",
        "api-error-publishfailed": "Vidinė klaida: serveriui nepavyko paskelbti laikino failo.",
-       "api-error-stasherror": "Įvyko klaida keliant failą į laikyklą.",
-       "api-error-stashedfilenotfound": "Saugomas failas nebuvo rastas bandant įkelti jį iš saugyklos.",
-       "api-error-stashpathinvalid": "Kelias, kuriuo saugomas failas būtų surastas yra negalimas.",
-       "api-error-stashfilestorage": "Įvyko klaida saugant failą saugykloje.",
-       "api-error-stashzerolength": "Serveris negalėjo išsaugoti failo, nes jo ilgis yra nulinis.",
-       "api-error-stashnotloggedin": "Jūs turite būti prisijungęs jei norite išsaugoti failus įkėlimų saugykloje.",
-       "api-error-stashwrongowner": "Failas, kuri bandėte pasiekti saugykloje jums nepriklauso.",
-       "api-error-stashnosuchfilekey": "Failo raktas, kurį bandėte pasiekti saugykloje neegzistuoja.",
-       "api-error-timeout": "Serveris neatsakė per numatytą laiką.",
-       "api-error-unclassified": "Įvyko nežinoma klaida",
-       "api-error-unknown-code": "Nežinoma klaida: \" $1 \"",
-       "api-error-unknown-error": "Vidinė klaida: kažkas nutiko bandant įkelti failą.",
+       "api-error-stashfailed": "Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.",
        "api-error-unknown-warning": "Nežinomas įspėjimas: $1",
        "api-error-unknownerror": "Nežinoma klaida: \"$1\"",
-       "api-error-uploaddisabled": "Įkėlimas išjungtas šioje wiki.",
-       "api-error-verification-error": "Šis failas gali būti sugadintas arba turi neteisingą papildinį.",
-       "api-error-was-deleted": "Failas tokiu pavadinimu anksčiau jau yra buvęs įkeltas, o paskui ištrintas.",
        "duration-seconds": "$1 {{PLURAL:$1|sekundė|sekundės|sekundžių}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutė|minutės|minučių}}",
        "duration-hours": "$1 {{PLURAL:$1|valanda|valandos|valandų}}",
        "pagelang-language": "Kalba",
        "pagelang-use-default": "Naudoti numatytąją kalbą",
        "pagelang-select-lang": "Pasirinkite kalbą",
+       "pagelang-reason": "Priežastis",
        "pagelang-submit": "Pateikti",
+       "pagelang-nonexistent-page": "Puslapis $1 neegzistuoja.",
+       "pagelang-db-failed": "Duomenų bazei nepavyko pakeisti puslapio kalbos.",
        "right-pagelang": "Keisti puslapio kalbą",
        "action-pagelang": "keisti puslapio kalbą",
        "log-name-pagelang": "Kalbos keitimų žurnalas",
        "special-characters-title-emdash": "em brūkšnys",
        "special-characters-title-minus": "minuso ženklas",
        "mw-widgets-dateinput-no-date": "Nepasirinkta data",
+       "mw-widgets-mediasearch-input-placeholder": "Ieškoti medijų",
+       "mw-widgets-mediasearch-noresults": "Rezultatų nerasta.",
        "mw-widgets-titleinput-description-new-page": "puslapis dar neegzistuoja",
        "mw-widgets-titleinput-description-redirect": "nukreipti į $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Pridėti kategoriją...",
        "sessionmanager-tie": "Negalima kombinuoti kelių užklausų autentikacijos tipų: $1.",
        "sessionprovider-generic": "$1 sesijos",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesijos su slapukais",
        "authprovider-resetpass-skip-help": "Praleisti slaptažodžio perstatymą.",
        "specialpage-securitylevel-not-allowed-title": "Neleidžiama",
        "specialpage-securitylevel-not-allowed": "Apgailestaujame, tačiau jūs negalite naudotis šiuo puslapiu, nes nepavyko patvirtinti jūsų tapatybės.",
+       "authpage-cannot-login": "Negalima pradėti prisijungimo.",
+       "authpage-cannot-login-continue": "Negalima tęsti prisijungimo. Greičiausiai baigėsi jūsų sesijos laikas.",
+       "authpage-cannot-create": "Nepavyko pradėti paskyros kūrimo.",
+       "authpage-cannot-create-continue": "Negalima tęsti paskyros kūrimo. Greičiausiai baigėsi jūsų sesijos laikas.",
+       "authpage-cannot-link": "Nepavyko pradėti paskyros susiejimo.",
+       "authpage-cannot-link-continue": "Negalima tęsti paskyros susiejimo. Greičiausiai baigėsi jūsų sesijos laikas.",
        "cannotauth-not-allowed-title": "Teisė nesuteikta",
        "cannotauth-not-allowed": "Jūs negalite naudotis šiuo puslapiu",
        "credentialsform-account": "Paskyros vardas:",
        "linkaccounts-submit": "Susieti paskyras",
        "unlinkaccounts": "Atsieti paskyras",
        "unlinkaccounts-success": "Paskyra buvo atsieta.",
-       "edit-error-short": "Klaida: $1",
-       "edit-error-long": "Klaidos:\n\n$1"
+       "revid": "apžvalga $1",
+       "pageid": "puslapio ID $1"
 }
index 0adbac6..ee597e7 100644 (file)
@@ -4,7 +4,8 @@
                        "Bonevarluri",
                        "علی ساکی لرستانی",
                        "Mjbmr",
-                       "Hosseinblue"
+                       "Hosseinblue",
+                       "MtDu"
                ]
        },
        "tog-underline": "لینکیا خط وه دومن",
        "pool-queuefull": "صف استخر پر هسی",
        "pool-errorunknown": "خطا ناشناخته",
        "pool-servererror": "شمارنده سرویس استخر ور تیه نی ($1).",
-       "aboutsite": "پۉرۉجھ : دأربارھ",
+       "aboutsite": "پۉرۉجھ : دأربارھ{{SITENAME}}",
        "aboutpage": "Project:دأربارھ",
        "copyright": "مطلب دومن $ 1 هس نکه خلاف هونو ذکر وابی.",
        "copyrightpage": "{{ns:project}}:کۉپی رایت",
index 0b8c8c4..a204c39 100644 (file)
@@ -42,6 +42,7 @@
        "tog-watchdefault": "Pievienot manis izmainītās lapas un failus uzraugāmo lapu sarakstam",
        "tog-watchmoves": "Pievienot manis pārvietotās lapas un failus uzraugāmo lapu sarakstam",
        "tog-watchdeletion": "Pievienot manis izdzēstās lapas un failus uzraugāmo lapu sarakstam",
+       "tog-watchuploads": "Pievienot manis augšuplādētos failus uzraugāmo lapu sarakstam",
        "tog-watchrollback": "Pievienot lapas, kurās es novērsu izmaiņas, manam uzraugāmo rakstu sarakstam",
        "tog-minordefault": "Atzīmēt visus labojumus jau sākotnēji par maznozīmīgiem",
        "tog-previewontop": "Parādīt priekšskatījumu virs labošanas lauka, nevis zem",
@@ -62,7 +63,7 @@
        "tog-watchlisthideanons": "Paslēpt anonīmo dalībnieku labojumus uzraugāmo lapu sarakstā",
        "tog-watchlisthidepatrolled": "Paslēpt pārbaudītās lapas uzraugāmo lapu sarakstā",
        "tog-watchlisthidecategorization": "Paslēpt lapu kategorizēšanu",
-       "tog-ccmeonemails": "Sūtīt sev citiem dalībniekiem nosūtīto epastu kopijas",
+       "tog-ccmeonemails": "Sūtīt sev citiem dalībniekiem nosūtīto e-pastu kopijas",
        "tog-diffonly": "Nerādīt lapu saturu zem izmaiņām",
        "tog-showhiddencats": "Rādīt slēptās kategorijas",
        "tog-norollbackdiff": "Neņemt vērā atšķirības, veicot atriti",
        "passwordreset-emaildisabled": "Šajā viki ir atspējotas e-pasta iespējas.",
        "passwordreset-username": "Lietotājvārds:",
        "passwordreset-domain": "Domēns:",
-       "passwordreset-capture": "Apskatīt izveidoto e-pastu?",
        "passwordreset-email": "E-pasta adrese:",
        "passwordreset-emailtitle": "Konta informācija {{SITENAME}}",
        "passwordreset-emailelement": "Lietotājvārds: \n$1\n\nPagaidu parole: \n$2",
        "preview": "Pirmskats",
        "showpreview": "Rādīt pirmskatu",
        "showdiff": "Rādīt izmaiņas",
-       "anoneditwarning": "'''Uzmanību:''' tu neesi iegājis. Lapas hronoloģijā tiks ierakstīta tava IP adrese.",
+       "anoneditwarning": "<strong>Uzmanību:</strong> tu neesi pieslēdzies. Ja veiksi labojumus, publiski būs redzama tava IP adrese. Ja tu <strong>[$1 pieslēgsies]</strong> vai <strong>[$2 izveidosi kontu]</strong>, visi labojumi tiks piesaistīti tavam kontam; būs arī citi ieguvumi.",
        "anonpreviewwarning": "''Tu neesi ienācis. Saglabājot lapu, Tava IP adrese tiks ierakstīta šīs lapas hronoloģijā.''",
        "missingsummary": "'''Atgādinājums''': Tu neesi norādījis izmaiņu kopsavilkumu. Vēlreiz klikšķinot uz \"Saglabāt lapu\", Tavas izmaiņas tiks saglabātas bez kopsavilkuma.",
        "missingcommenttext": "Lūdzu, ievadi tekstu zemāk redzamajā logā!",
        "preferences": "Izvēles",
        "mypreferences": "Izvēles",
        "prefs-edits": "Izmaiņu skaits:",
+       "prefsnologintext2": "Lūdzu pieslēdzies, lai mainītu savas izvēles.",
        "prefs-skin": "Apdare",
        "skin-preview": "Priekšskats",
        "datedefault": "Vienalga",
        "saveprefs": "Saglabāt",
        "restoreprefs": "Atjaunot noklusētos uzstādījumus (visās sadaļās)",
        "prefs-editing": "Labošana",
-       "rows": "Rindiņu skaits:",
-       "columns": "Simbolu skaits rindiņā:",
        "searchresultshead": "Meklēšana",
        "stub-threshold": "Slieksnis <a href=\"#\" class=\"stub\">aizmetņa saites</a> formatēšanai (baiti):",
        "stub-threshold-sample-link": "piemērs",
        "gender-unknown": "Es nevēlos norādīt",
        "gender-male": "Viņš labo viki lapas",
        "gender-female": "Viņa labo viki lapas",
-       "prefs-help-gender": "Dzimums nav obligāti jānorāda (šo parametru programmatūra izmanto, lai ģenerētu paziņojumus, kas atkarīgi no lietotāja dzimuma). Šī informācija būs publiski pieejama.",
+       "prefs-help-gender": "Dzimums nav obligāti jānorāda (šo parametru programmatūra izmanto, lai ģenerētu paziņojumus, kas atkarīgi no dalībnieka dzimuma). Šī informācija būs publiski pieejama.",
        "email": "E-pasts",
        "prefs-help-realname": "Īstais vārds nav obligāti jānorāda.\nJa tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (ieguldījumu {{grammar:lokatīvs|{{SITENAME}}}}).",
        "prefs-help-email": "E-pasta adrese nav obligāta, bet ir nepieciešama nozaudētas paroles atjaunošanai.",
-       "prefs-help-email-others": "Tu arī vari izvēlēties, ka citi var sazināties ar tevi ar saites tavā lietotāja lapā vai lietotāja diskusijas lapā palīdzību. Citiem lietotājiem netiek atklāta tava e-pasta adrese, kad viņi sazinās ar tevi.",
+       "prefs-help-email-others": "Tu arī vari izvēlēties, ka citi var sazināties ar tevi ar saites tavā dalībnieka lapā vai dalībnieka diskusijas lapā palīdzību. Citiem dalībniekiem netiek atklāta tava e-pasta adrese, kad viņi sazinās ar tevi.",
        "prefs-help-email-required": "E-pasta adrese ir obligāta.",
        "prefs-info": "Pamatinformācija",
        "prefs-i18n": "Internacionalizācija",
        "userrights-reason": "Iemesls:",
        "userrights-no-interwiki": "Tev nav atļaujas izmainīt dalībnieku tiesības citos wiki.",
        "userrights-nodatabase": "Datubāze $1 neeksistē vai nav lokāla.",
-       "userrights-nologin": "Tev ir [[Special:UserLogin|jāieiet iekšā]] kā adminam, lai varētu izmainīt dalībnieku grupas.",
-       "userrights-notallowed": "Tev nav atļaujas pievienot vai noņemt dalībnieku tiesības.",
        "userrights-changeable-col": "Grupas, kuras tu vari izmainīt",
        "userrights-unchangeable-col": "Grupas, kuras tu nevari izmainīt",
        "group": "Grupa:",
        "right-editmyusercss": "Rediģējiet savus dalībnieka CSS failus",
        "right-editmyuserjs": "Rediģējiet savus dalībnieka JavaScript failus",
        "right-viewmywatchlist": "Apskatīt savu uzraugāmo rakstu sarakstu",
+       "right-viewmyprivateinfo": "Skatit savus privātos datus (piemēram, e-pasta adresi, īsto vārdu)",
+       "right-editmyprivateinfo": "Labot savus privātos datus (piemēram, e-pasta adresi, īsto vārdu)",
+       "right-editmyoptions": "Labot savas izvēles",
        "right-rollback": "Ātri veikt atriti pēdējā dalībnieka labojumiem, kas veica izmaiņas kādā konkrētā lapā",
        "right-markbotedits": "Atzīmēt labojumus, kam veikta atrite, kā bota labojumus",
        "right-noratelimit": "Būt darbību ātruma ierobežojumu neietekmētiem",
        "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-passwordreset": "Apskatīt paroles atiestatīšanas e-pasta ziņojumus",
        "grant-group-email": "Sūtīt e-pastu",
        "grant-createaccount": "Izveidot kontu",
        "grant-editmywatchlist": "Labot uzraugāmo rakstu sarakstu",
        "statistics-files": "Augšuplādētie faili",
        "statistics-edits": "Lapu izmaiņas kopš {{grammar:ģenitīvs{{SITENAME}}}} izveidošanas",
        "statistics-edits-average": "Vidējais izmaiņu skaits uz lapu",
-       "statistics-users": "Reģistrēti lietotāji",
+       "statistics-users": "Reģistrēti [[Special:ListUsers|dalībnieki]]",
        "statistics-users-active": "Aktīvi lietotāji",
        "statistics-users-active-desc": "Lietotāji, kas ir veikuši jebkādu darbību {{PLURAL:$1|iepriekšējās $1 dienās|iepriekšējā $1 dienā|iepriekšējās $1 dienās}}",
        "pageswithprop-prop": "Īpašības nosaukums:",
        "listgrouprights-removegroup": "Noņemt {{PLURAL:$2|grupas|grupu|grupas}}: $1",
        "listgrouprights-addgroup-all": "Pievienot visas grupas",
        "listgrouprights-removegroup-all": "Noņemt visas grupas",
+       "listgrouprights-removegroup-self": "Noņemt {{PLURAL:$2|grupu|grupas}} no sava konta: $1",
        "listgrouprights-addgroup-self-all": "Pievienot visas grupas savam kontam",
        "listgrouprights-removegroup-self-all": "Noņemt visas grupas no sava konta",
        "listgrouprights-namespaceprotection-header": "Vārdtelpas ierobežojumi",
        "wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī .",
        "watchlist-hide": "Slēpt",
        "watchlist-submit": "Rādīt",
+       "wlshowhideminor": "maznozīmīgos labojumus",
        "wlshowhidebots": "boti",
-       "wlshowhideliu": "reģistrēti lietotāji",
+       "wlshowhideliu": "reģistrēti dalībnieki",
        "wlshowhideanons": "anonīmi lietotāji",
        "wlshowhidepatr": "pārbaudīti labojumi",
        "wlshowhidemine": "mani labojumi",
        "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",
        "sp-contributions-username": "IP adrese vai dalībnieka vārds:",
-       "sp-contributions-toponly": "Rādīt tikai labojumus, kuri ir jaunākās versijas",
+       "sp-contributions-toponly": "Rādīt tikai labojumus, kas ir jaunākās versijas",
        "sp-contributions-submit": "Meklēt",
        "whatlinkshere": "Norādes uz šo rakstu",
        "whatlinkshere-title": "Lapas, kurās ir saites uz lapu \"$1\"",
        "tooltip-pt-anoncontribs": "Labojumi, kas veikti no šīs IP adreses",
        "tooltip-pt-login": "Aicinām tevi ieiet {{grammar:lokatīvs|{{SITENAME}}}}, tomēr tas nav obligāti.",
        "tooltip-pt-logout": "Iziet",
+       "tooltip-pt-createaccount": "Ieteicams izveidot kontu un pieslēgties; tomēr tas nav obligāti.",
        "tooltip-ca-talk": "Diskusija par šī raksta lapu",
        "tooltip-ca-edit": "Labot šo lapu",
        "tooltip-ca-addsection": "Sākt jaunu sadaļu",
        "monday-at": "Pirmdiena $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 visticamk 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).",
+       "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).",
        "metadata-expand": "Parādīt papildu detaļas",
        "metadata-collapse": "Paslēpt papildu detaļas",
        "metadata-fields": "Šajā paziņojumā esošie metadatu lauki būs redzami attēla lapā arī tad, kad metadatu tabula būs sakļauta.\nPārējie lauki, pēc noklusējuma, būs paslēpti.\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",
        "specialpages-group-login": "Pieslēgties / izveidot kontu",
        "specialpages-group-changes": "Pēdējās izmaiņas un reģistri",
        "specialpages-group-media": "Failu atskaites un augšuplāde",
-       "specialpages-group-users": "Lietotāji un piekļuves tiesības",
+       "specialpages-group-users": "Dalībnieki un piekļuves tiesības",
        "specialpages-group-highuse": "Bieži izmantotās lapas",
        "specialpages-group-pages": "Lapu saraksti",
        "specialpages-group-pagetools": "Lapu rīki",
        "htmlform-cloner-create": "Pievienot vairāk",
        "htmlform-cloner-delete": "Noņemt",
        "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",
        "revdelete-content-hid": "saturs slēpts",
        "revdelete-summary-hid": "labojuma kopsavilkums slēpts",
        "feedback-thanks-title": "Paldies!",
        "searchsuggest-search": "Meklēt {{SITENAME}}",
        "searchsuggest-containing": "Meklējamā frāze:",
-       "api-error-badaccess-groups": "Jums nav atļauts augšupielādēt failus šajā wiki.",
-       "api-error-copyuploaddisabled": "Augšupielāde no URL šajā serverī ir atspējota.",
-       "api-error-filename-tooshort": "Faila nosaukums ir pārāk īss.",
-       "api-error-filetype-banned": "Šis failu veids ir aizliegts.",
-       "api-error-http": "Iekšēja kļūda: Nevar izveidot savienojumu ar serveri.",
-       "api-error-mustbeloggedin": "Tev jāpieslēdzas, lai augšupielādētu failus.",
-       "api-error-ok-but-empty": "Iekšēja kļūda: Nav atbildes no servera.",
-       "api-error-timeout": "Serveris neatbildēja paredzētajā laikā.",
-       "api-error-unclassified": "Nezināma kļūda.",
-       "api-error-unknown-code": "Nezināma kļūda: \" $1 \"",
        "api-error-unknown-warning": "Nezināms brīdinājums: $1",
        "api-error-unknownerror": "Nezināma kļūda: \"$1\"",
-       "api-error-uploaddisabled": "Augšupielāde šajā wiki  ir atslēgta.",
        "limitreport-title": "Parsētāja profilēšanas dati:",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "limitreport-templateargumentsize": "Veidnes argumenta izmērs",
        "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",
-       "edit-error-short": "Kļūda: $1",
-       "edit-error-long": "Kļūdas:\n\n$1"
+       "specialpage-securitylevel-not-allowed-title": "Nav atļauts"
 }
index c997386..ef6dbf2 100644 (file)
        "passwordreset-emaildisabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
        "passwordreset-username": "प्रयोक्तानाम:",
        "passwordreset-domain": "क्षेत्र:",
-       "passwordreset-capture": "परिणाम ई-पत्र देखी?",
-       "passwordreset-capture-help": "जँ अहाँ ई बक्शाकेँ देखै छी, ई-पत्र (तात्कालिक कूटशब्दकसंग) अहाँकेँ देखाएल जाएत आ संगे प्रयोक्ताकेँ पठाएल जाएत।",
        "passwordreset-email": "ई-पत्र सङ्केत:",
        "passwordreset-emailtitle": "{{SITENAME}} पर खाता विवरण",
        "passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{SITENAME}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि|लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
        "saveprefs": "सङ्ग्रह करी",
        "restoreprefs": "सभटा पूर्वनिर्धारित चयनकेँ फेरसँ आनी",
        "prefs-editing": "सम्पादन कऽ रहल छी",
-       "rows": "पाँतीसभ",
-       "columns": "स्तम्भसभ",
        "searchresultshead": "ताकी",
        "stub-threshold": "आधार लिङ्क हेतु प्रारूपण ($1):",
        "stub-threshold-sample-link": "उदाहरण",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "अहाँकेँ दोसर विकीपर प्रयोक्ता अधिकारकेँ बदलबाक अधिकार नै अछि।",
        "userrights-nodatabase": "दत्तनिधि $1 नै अछि वा स्थानीय नै अछि।",
-       "userrights-nologin": "अहाँ [[Special:UserLogin|सम्प्रवेश]] प्रयोक्ता अधिकार देबा लेल संचालक खातासँ सम्प्रवेश करू।",
-       "userrights-notallowed": "अहाँक खाता दोसराक प्रयोक्ता अधिकारमे कमी बेशी नै करैत अछि।",
        "userrights-changeable-col": "वर्ग जे अहाँ बदलि सकै छी",
        "userrights-unchangeable-col": "वर्ग जे अहाँ नै बदलि सकै छी",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "प्रयोक्ता अधिकार बदलावक समयमे अंतर्विरोध! कृपया अपन बदलाव जाँच करु आ पुनः सुनिश्चित करु।",
-       "userrights-removed-self": "अहाँ सफलतापूर्वक अपन अधिकार हटा देने छी। अतः अहाँ आब ई पृष्ठ नै देख सकैत छी।",
        "group": "समूह:",
        "group-user": "प्रयोक्तासभ",
        "group-autoconfirmed": "स्वतःअनुमोदित प्रयोक्ता",
        "right-siteadmin": "दत्तनिधिकेँ प्रतिबन्धित करू आ फेर प्रतिबन्ध हटाउ",
        "right-override-export-depth": "५ परत धरि जा  पन्ना सभ निर्यात, जइमे लागिबला पन्ना सभ शामिल अछि, करू।",
        "right-sendemail": "ई-पत्र दोसर प्रयोक्ता लोकनिकेँ पठाउ",
-       "right-passwordreset": "कूटशब्द पुनर्निर्धारण ई-पत्र देखू",
        "right-managechangetags": "[[Special:Tags|ट्यागसभ]] बनाबी आ नुकाबी",
        "right-applychangetags": "प्रयोग में लाबू [[Special:Tags|tags]] कक्रो बदलाव के साथ।",
        "right-changetags": "जमा करु आर हटाबु स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरण आर लॉग प्रविक्ति पे",
        "uploadscripted": "ई संचिका पर्यंकभाषा वा कूटलिपि युक्त अछि जे गवेषक द्वारा गलत रूपमे व्याख्यायित कएल जा सकैए।",
        "upload-scripted-pi-callback": "ओ फाइल अपलोड नै केल जा सकैत अछि जाहिमे एक्सएमएल-स्टाइलसिट प्रसंस्करण निर्देश समाविष्ट अछि।",
        "uploaded-script-svg": "अपलोड केल गेल एसभिजी फाइलमे स्क्रिप्ट अवयव \"$1\" पाबल गेल।",
-       "uploadscriptednamespace": "इ एस॰वी॰जी फाइलमे अमान्य नामस्थान \"$1\" अछि।",
+       "uploadscriptednamespace": "इ एस॰वी॰जी फाइलमे अमान्य नामस्थान \"<nowiki>$1</nowiki>\" अछि।",
        "uploadinvalidxml": "अपलोड केएल गेल फाइलमे स्थित XML पार्स नै केएल जा सकैत अछि।",
        "uploadvirus": "ई संचिका विषविधियुक्त अछि।\nवर्णन:$1",
        "uploadjava": "ई संचिका एकटा संकुचित संचिका अछि जइमे अछि एकटा जावा .class संचिका।\nजावा संचिका सभक उपारोपण प्रतिबन्धित अछि, कारण ओ सभ सुरक्षा प्रतिबन्ध सभ छी जकरासँ ई तड़पल जा सकैए।",
        "feedback-useragent": "सदस्य कर्ता:",
        "searchsuggest-search": "ताकी",
        "searchsuggest-containing": "...सऽ युक्त",
-       "api-error-badaccess-groups": "अहि विकी सें अहां कोनो प्रारूप लोड नहि क सकब.",
        "api-error-badtoken": "आन्तरिक त्रुटि: खराब टोकन।",
-       "api-error-copyuploaddisabled": "युआरयलद्वारा इ सर्वर पर अपलोड अक्षम अछि।",
-       "api-error-filename-tooshort": "ई संचिका नाम बड छोट अछि |",
-       "api-error-filetype-banned": "ऐ तरहक संचिका नाम प्रतिबंधित  अछि।",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|मान्य संचिका प्रकार नै अछि|मान्य संचिका प्रकार सभ नै अछि}}। मान्य अछि {{PLURAL:$3|संचिका प्रकार अछि|संचिका प्रकार सभ अछि}} $2।",
-       "api-error-http": "आन्तरिक भ्रम: वितरकसँ सम्पर्क करबामे असफल",
-       "api-error-illegal-filename": "ऐ तरहक संचिका नाम अमान्य अछि।",
-       "api-error-mustbeloggedin": "अहाँ के फाइल अपलोड करए के लेल सम्प्रवेष करए पडत।",
-       "api-error-mustbeposted": "आन्तरिक भ्रम: आग्रहक लेल परिपाठ्य संचार संविद पाठ चाही।",
-       "api-error-nomodule": "आन्तरिक भ्रम: कोनो उपारोपण तरीका निर्धारित नै अछि।",
-       "api-error-ok-but-empty": "आन्तरिक भ्रम: वितरकसँ कोनो सम्पर्क नै",
-       "api-error-unclassified": "एकटा अबूझ भ्रम आएल",
-       "api-error-unknown-code": "अबूझ भ्रम:\"$1\"",
        "api-error-unknown-warning": "अज्ञात चेतौनी: $1",
        "api-error-unknownerror": "अज्ञात भ्रम:\"$1\"",
-       "api-error-uploaddisabled": "ऐ विकीपर उपारोपण अशक्त कएल गेल अछि।",
        "expand_templates_output": "परिणाम",
        "expand_templates_xml_output": "XML आउटपुट",
        "expand_templates_ok": "ठीक अछि",
index 74f57ae..c85e767 100644 (file)
@@ -26,6 +26,7 @@
        "tog-watchdefault": "Hanaraka ny pejy ary ny rakitra ovaiko",
        "tog-watchmoves": "Hanaraka ny pejy ary ny rakitra ovaiko anarana",
        "tog-watchdeletion": "Hanaraka ny pejy ary ny rakitra voafafako",
+       "tog-watchuploads": "Ampiana amin'ny pejy arahako ireo rakitra vaovao nalefako",
        "tog-watchrollback": "Hanaraka pejy nanaovako famoana",
        "tog-minordefault": "Mariho ho madinika foana aloha ny fanovana rehetra",
        "tog-previewontop": "Asehoy alohan'ny boaty fanovana ny tsipalotra",
@@ -35,7 +36,7 @@
        "tog-enotifminoredits": "Andefasana imailaka na dia fanovana madinika aza no atao amin'ny pejy sy ny rakitra",
        "tog-enotifrevealaddr": "Asehoy ny adiresy imailako any amin'ny imailaka fampilazana",
        "tog-shownumberswatching": "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
-       "tog-oldsig": "Topi-mason'ny sonia :",
+       "tog-oldsig": "Topi-mason'ny sonianao :",
        "tog-fancysig": "Sonia tsotra (tsy misy rohy)",
        "tog-uselivepreview": "Hampiasa ny topi-maso mivantana",
        "tog-forceeditsummary": "Teneno ahy ra tsy nametraka ny ambangovangony",
@@ -50,7 +51,7 @@
        "tog-ccmeonemails": "Andefaso tahaka ny imailaka alefako amin'ny mpikambana hafa",
        "tog-diffonly": "Aza ampiseho ny voatonin'ny pejy eo amban'ny diff",
        "tog-showhiddencats": "Asehoy ny sokajy misitrika",
-       "tog-norollbackdiff": "Aza aseho ny diff rehefa avy namafa fanàvana iray",
+       "tog-norollbackdiff": "Aza aseho ny fahasamihafana aorian'ny famoanana",
        "tog-useeditwarning": "Ampitandremo aho raha miala sady mamela pejy ovaiko nefa tsy notahiriziko",
        "tog-prefershttps": "Fanohizana azo antoka foana no ampaisaina rehefa tafiditra",
        "underline-always": "Foana foana",
        "newwindow": "(sokafy anaty takila hafa)",
        "cancel": "Aoka ihany",
        "moredotdotdot": "Tohiny...",
-       "morenotlisted": "Tsy feno ity lisitra ity.",
+       "morenotlisted": "Mety tsy feno ity lisitra ity.",
        "mypage": "Pejy",
        "mytalk": "Dinika",
        "anontalk": "Pejin-dresaka",
        "tagline": "Avy amin'i {{SITENAME}}",
        "help": "Fanoroana",
        "search": "Tadiavo",
+       "search-ignored-headings": "#<!-- Avelao ho toa izao ity andalana ity --> <pre>\n# Ny lohatenim-pizarana dia tsy horaharahiana amin'ny karoka.\n# Ny fiovana atao eto dia hihatra rehefa voasoratra ao amin'ny tondro ilay pejy miaraka amin'ilay lohateny.\n# Azonao atao ny famerenana an-tondro an'ilay pejy amin'ny alalan'ny fanovana tsy misy inona inona.\n# Ny rariteny dia ireo manaraka:\n# *Izay andalana rehetra manomboka amin'ny \"#\" dia resaka\n# *Izay andalana tsy fotsy dia lohateny tsy horaharahiana, iaraka amin'ny haben-tsoratra\nTsiahy\nRohy ivelany\nJereo koa\n#</pre> <!-- Avelao ho toa izao ity andalana ity -->",
        "searchbutton": "Tadiavo",
        "go": "Ndao",
        "searcharticle": "Tsidiho",
        "history": "Tantaran'ny pejy",
        "history_short": "Tantara",
+       "history_small": "tantara",
        "updatedmarker": "niova hatry ny tsidiko farany",
        "printableversion": "Ny votoatiny azo atonta printy",
        "permalink": "Rohy maharitra",
        "talk": "dinika",
        "views": "Fijerena",
        "toolbox": "Fitaovana",
+       "tool-link-userrights": "Hanova ny vondron'i {{GENDER:$1|}}mpikambana",
+       "tool-link-userrights-readonly": "Hijery ny vondron'ny mpikambana{{GENDER:$1|}}",
+       "tool-link-emailuser": "Handefa mailaka an'ity mpikambana ity{{GENDER:$1|}}",
        "userpage": "Hijery ny pejy manokan'ny mpikambana",
        "projectpage": "Pejy meta",
        "imagepage": "Jereo ny pejin'ny sary",
        "createacct-yourpasswordagain-ph": "Mbola ampidiro fanindroany ny tenimiafinao",
        "userlogin-remembermypassword": "Tadidio aho",
        "userlogin-signwithsecure": "Fidirana amin'ny alalan'ny fanohizana azo antoka",
+       "cannotlogin-title": "Tsy afaka miditra",
+       "cannotlogin-text": "Tsy afaka atao ny fidirana",
        "cannotloginnow-title": "Tsy afaka miditra izao",
        "cannotloginnow-text": "Tsy afaka miditra rehefa mampiasa $1.",
+       "cannotcreateaccount-title": "Tsy afaka mamorona kaonty",
+       "cannotcreateaccount-text": "Tsy ampiasaina eto amin'ty wiki ity ny famoronana kaontim-pikambana avy hatrany.",
        "yourdomainname": "faritra (domaine) misy anao",
        "password-change-forbidden": "Tsy afaka manova ny tenimiafina ianao eto amin'ity wiki ity.",
        "externaldberror": "Nisy tsy fetezana angamba teo amin'ny fanamarinana anao tamin'ny sehatra ivelan'ity wiki ity, na tsy manana alalana hanova ny kaontinao ivelany ianao.",
        "login": "Midira",
+       "login-security": "Hamarino ny famantarana anao",
        "nav-login-createaccount": "Ampidiro ny solonanarana",
        "userlogin": "Hiditra na hanokatra kaonty",
        "userloginnocreate": "hiditra",
        "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.",
+       "userlogin-reauth": "{{GENDER:$1|}}Tsy maintsy miditra indray ianao mba ahafantarana hoe $1 ianao.",
        "userlogin-createanother": "Hamorona kaonty hafa",
        "createacct-emailrequired": "Adiresy mailaka :",
        "createacct-emailoptional": "Adiresy mailaka (azo tsy atao) :",
        "createacct-email-ph": "Atsofohy ny adiresy mailakao",
        "createacct-another-email-ph": "Atsofohy ny adiresy mailaka",
        "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",
        "createacct-submit": "Hamorona ny kaontinao",
        "createacct-another-submit": "Hamorona kaonty vaovao",
+       "createacct-continue-submit": "Hanohy ny famoronan-kaonty",
+       "createacct-another-continue-submit": "Hanohy ny famoronan-kaonty",
        "createacct-benefit-heading": "Olona tahaka ianao no manoratra eo amin'i {{SITENAME}}",
        "createacct-benefit-body1": "fanovana{{PLURAL:$1}}",
        "createacct-benefit-body2": "pejy{{PLURAL:$1}}",
        "nocookiesnew": "Voasikatra ny kaontim-pikambana, fa tsy tafiditra amin'ny kaontinao ianao.\nMampiasa cookies ny {{SITENAME}} ho an'ny fidirana amin'ny kaonty.\nTsy avelanao mandeha ny cookies.\nAvelao mandeha ny fampidirana cookies, ary midira amin'ny kaontinao.",
        "nocookieslogin": "Mampiasa cookies i {{SITENAME}} nefa ny mpiteti-tranonkalanao no tsy manaiky na mandà azy. Ovay mba hanaiky cookies aloha ny mpiteti-tranonkalanao dia aveo manandrama mihiditra ato indray.",
        "nocookiesfornew": "Tsy mbola noforonina ilay kaontim-pikambana, satria tsy afaka marinanay ilay loharanony.\nMarino tsara raha mahazo mametraka cookie ao amin'ny kompioteranao ny sehata, dia havaozy ilay pejy",
+       "createacct-loginerror": "Noforonina soa aman-tsara ity kaonty ity fa tsy tafiditra ho azy ianao. Midira amin'ny alalan'ny [[Special:UserLogin|pejy fidirana]] azafady.",
        "noname": "Tsy nanome solonanarana mety ianao.",
        "loginsuccesstitle": "Tafiditra soa aman-tsara",
        "loginsuccess": "'''Tafiditra amin'ny {{SITENAME}} ianao ry \"$1\".'''",
-       "nosuchuser": "Tsy misy mpikambana manana izany solonanarana \"$1\" izany. Hamarino ny tsipelina na manokafa kaonty vaovao.",
+       "nosuchuser": "Tsy misy mpikambana manana izany solonanarana \"$1\" izany.\nManavaka ny renisoratra sy ny zanatsoratra ny anaram-pikambana.\nHamarino ny tsipelina na [[Special:CreateAccount|manokafa kaonty vaovao]].",
        "nosuchusershort": "Tsy misy mpikambana hoe \"$1\". Hamarino ny tsipelina.",
        "nouserspecified": "Tsy maintsy mampiditra solonanarana ianao.",
        "login-userblocked": "Voasakana io mpikambana io. Fidirana tsy nahazoan-dalana.",
        "wrongpasswordempty": "Tsy nampiditra tenimiafina ianao, azafady mba avereno indray.",
        "passwordtooshort": "{{PLURAL:}}Fohy loatra io tenimiafina io.\nFarafahakeliny tokony hisy litera $1 ny tenimiafina.",
        "passwordtoolong": "Tsy azo atao ho lava noho ny soratra {{PLURAL:$1|iray|$1}} ny tenimiafina.",
+       "passwordtoopopular": "Tsy azo ampiasana ny tenimiafina ampiasaina matetika. Misafidiana tenimiafina manokana kokoa.",
        "password-name-match": "Tsy maintsy samihafa ny solonanaranao sy ny tenimiafinao tompoko.",
        "password-login-forbidden": "Norarana ny fampiasana io anaram-pikambana ary io tenimiafina io.",
        "mailmypassword": "Hamerina ny tenimiafina",
        "noemail": "Tsy nanome adiresy imailaka i \"$1\".",
        "noemailcreate": "Tsy maintsy misy ny adiresy imailaka ho atsofokao",
        "passwordsent": "Nandefasana tenimiafina vaovao any amin'ny adiresy imailak'i \"$1\".\nAzafady midira rehefa voarainao io imailaka io.",
-       "blocked-mailpassword": "Voasakana ny adiresy IP-nao, nesorina aminao ny asa ''password recovery'' mba tsy hanararaotra.",
+       "blocked-mailpassword": "Voasakana tsy afa-manova ny adiresy IP-nao. Mba tsy hisian'ny fanararaotana dia tsy azo atao ny famerenana tenimiafina avy amin'ity adiresy IP ity.",
        "eauthentsent": "Efa nandefasana imailaka fanamarinana ilay adiresy nomenao.\nAlohan'ny handefasana mailaka hafa any amin'ity kaonty ity dia mila manaraka ny torolalana ianao hahafahana manamarina anao ho tompon'ilay kaonty.",
        "throttled-mailpassword": "Efa nandefasana mailaka famerenana tenimiafiana ianao tanatin'ny {{PLURAL:$1|ora|$1 ora}}.\nMba tsy hisian'ny fanararaotana dia mailaka famerenana tenimiafiana iray ihany no azo ampiasaina isaky ny adin'ny $1{{PLURAL:}}.",
        "mailerror": "Nisy olana tamin'ny fandefasana imailaka: $1",
-       "acct_creation_throttle_hit": "Miala tsiny, efa nanokatra kaonty miisa $1 ianao, ka tsy afaka mamorona hafa intsony.{{PLURAL:}}",
+       "acct_creation_throttle_hit": "Ireo mpitsidika avy amin'ny adiresy IP-nao dia namorona {{PLURAL:$1|kaonty iray|kaonty $1}} tanatin'ny $2, izay isam-panoronana farafahabetsany azo atao anatin'izay fe-potoana izay.\nNy vokatr'izany dia tsy afa-mamorona kaonty vaovao ity adiresy ity amin'izao fotoana izao.",
        "emailauthenticated": "Voamarina tamin'ny $2 tamin'ny $3 ny adiresy mailakao.",
        "emailnotauthenticated": "Tsy mbola nomarinina ny adiresy mailakao.\nTsy handefa mailaka izy ho an'ireo asa ireo.",
        "noemailprefs": "Manomeza adiresy imailaka raha hampiasa ireo fitaovana ireo ianao.",
        "createacct-another-realname-tip": "Azo tsy atsofoka ny tena anarana.\nRaha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
        "pt-login": "Hiditra",
        "pt-login-button": "Hiditra",
+       "pt-login-continue-button": "Hanohy ny fidirana",
        "pt-createaccount": "Hamorona kaonty",
        "pt-userlogout": "Hivoaka",
        "php-mail-error-unknown": "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
        "botpasswords-insert-failed": "Tsy afaka nanampy ny anarana rôbô \"$1\". Tsy efa nampiana ve ilay izy?",
        "botpasswords-update-failed": "Tsy afaka nanavao ny anarana rôbô \"$1\". Nofafàna ve ilay izy?",
        "botpasswords-created-title": "Noforonina ilay tenimiafina rôbô",
-       "botpasswords-created-body": "Noforonina ny tenimiafina rôbô \"$1\".",
+       "botpasswords-created-body": "Noforonina ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
        "botpasswords-updated-title": "Nohavaozina ny tenimiafina rôbô",
-       "botpasswords-updated-body": "Nohavaozina ny tenimiafina rôbô \"$1\".",
+       "botpasswords-updated-body": "Nohavaozina ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
        "botpasswords-deleted-title": "Nofafàna ny tenimiafina rôbô",
-       "botpasswords-deleted-body": "Nofafàna ny tenimiafina rôbô \"$1\".",
+       "botpasswords-deleted-body": "Nofafàna ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
        "botpasswords-newpassword": "Ny tenimiafina idirana amin'i <strong>$1</strong> dia <strong>$2</strong>. <em>Raiketo ilay izy ho an'ny fampiasàna any aoriana any.</em>",
        "botpasswords-no-provider": "Tsy afaka antsoina ny BotPasswordsSessionProvider.",
        "botpasswords-restriction-failed": "Manakana ity fidirana ity ny fepetra mifehy ny tenimiafina rôbô.",
        "passwordreset-emaildisabled": "Tsy avela ny fampiasana mailaka eto amin'ity wiki ity.",
        "passwordreset-username": "Anaram-pikambana :",
        "passwordreset-domain": "Vala (domain) :",
-       "passwordreset-capture": "Hijery ny imailaka vokany ?",
-       "passwordreset-capture-help": "Raha marihanao ity boaty ity, ny mailaka (miaraka amin'ilay tenimiafina vonjimaika) dia ho aseho aminao ary koa ho alefa amin'ilay mpikambana.",
        "passwordreset-email": "Adiresy imailaka :",
        "passwordreset-emailtitle": "Antsipirihan'ny kaonty eo amin'i {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nisy olona (izay mety ianao, avy amin'ny adiresy IP $1) nangataka ny hamerina ny tenimiafin'ny kaontim-pikambany ho an'i {{SITENAME}} ($4). Mampiasa ity adiresy mailaka ity {{PLURAL:$3|ity kaontim-pikambana mpikambana io|ireo kaontim-mpikambana ireo}}:\n\n$2\n\nHitsahatra afaka $5 andro {{PLURAL:$3|io tenimiafina io|ireo tenimiafina ireo}}.\nTokony miditra ianao ary mifidy tenimiafina vaovao. Raha misy olon-kafa nanao ity hataka ity, na efa tadidinao indray ilay tenimiafinao taloha, ary raha tsy tia hanova azy intsony, azonao tsy raharahiana ity hafatra ity ary mitohy mampiasa ny tenimiafinao taloha.",
        "passwordreset-emailtext-user": "Nisy mpikambana mitondra anarana $1 eo amin'i {{SITENAME}} nangataka fampatsiahivana mikasika ny kaontinao eo amin'i {{SITENAME}} ($4). Manana io adiresy imailaka {{PLURAL:$3|io kaontim-pikambana io|ireo kaontim-pikambana ireo}} :\n\n$2\n\nHitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {{PLURAL:$3|io|ireo}}. Mila miditra dien'izao ianao izao ary mifidy tenimiafina vaovao. Raha tsy avy aminao ity hataka ity na efa nahatadidy ny tenimiafinao taloha ianao, ary raha tsy tianao hovaina intsony ilay tenimiafinao, dia azonao tsy raharahiana ity hafatra ity ary mampiasa ny tenimiafinao taloha.",
        "passwordreset-emailelement": "Anaram-pikambana : \n$1\n\nTenimiafina miserana : \n$2",
        "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",
        "changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
        "minoredit": "Fanovàna kely",
        "watchthis": "Araho maso ity pejy ity",
        "savearticle": "Tehirizo",
+       "savechanges": "Hitahiry ny fiovana",
+       "publishpage": "Hamoaka pejy",
+       "publishchanges": "Hamoaka ny fiovana",
        "preview": "Topi-maso",
        "showpreview": "Asehoy aloha",
        "showdiff": "Asehoy ny fiovana",
        "yourdiff": "Fampitahana",
        "copyrightwarning": "Ny zavatra rehetra apetraka amin'ny {{SITENAME}} dia raisina ho azo adika malalaka araka ny fahazoan-dalana $2 (Jereo $1 ny fanazavana fanampiny). Raha toa ka tianao ho anao manokana ny tahirin-kevitra dia aleo tsy apetraka ato.\n\n<b>AZA MAMPIASA TAHIRINKEVITRA TSY NAHAZOAN-DALANA</b>",
        "copyrightwarning2": "Ny fandraisana anjara ao amin'i {{SITENAME}} dia azo ovaina ary fafan'ny mpikambana hafa. Raha tsy tianao ho ampiasainan, ovaina na zarazaraina ny soratrao, dia aza alefa eto ilay vokatr'asanao<br />\nNy zava-tsoratanao eto dia vokatr'asa naverinao soratana na nodikainao tany amina loharano ao amin'ny vala sarababem-bahoaka na loharano malalaka hafa (Jereo $1 ho an'ny antsipirihany).\n\n'''Aza mampiasa tahirin-kevitra tsy nahazoan-dalana!'''",
+       "editpage-cannot-use-custom-model": "Tsy mety ovaina ny modelim-botoatin'ity pejy ity.",
        "longpageerror": "'''Hadisoana : Ny tahirin-tsoratra nalefanao dia manana halava {{PLURAL:$1|iray|$1}} kilooktety, izay lava kokoa nohon'ny fetra avo indridra izay natao ho {{PLURAL:$2|iray|$2}} kilooktety.'''\nTsy afaka tahirizina ilay tahirin-tsoratra.",
        "readonlywarning": "'''FAMPITANDREMANA: Nohidiana noho ny antony fikolokoloana aloha ny banky angona,\nkoa tsy afaka mitahiry ny fanovana nataonao aloha ianao izao. Angamba tokony hanao Couper coller aloha\nianao dia tehirizo anaty rakitra ny fanovanao mandra-paha.'''\n\nNy mpandrindra nanidy ny banky angona dia nanome ny antony : <br />$1",
        "protectedpagewarning": "'''FAMPITANDREMANA:  Voaaro ity pejy ity ka ny mpikambana manana ny fahazoan-dàlana sysop ihany no afaka manova azy.'''",
        "invalid-content-data": "Data anaty votoatiny tsy miady amin'ny fepetra",
        "content-not-allowed-here": "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
        "editwarning-warning": "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.\nRaha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"{{int:prefs-editing}}\" ao amin'ny safidinao.",
+       "editpage-invalidcontentmodel-title": "Andrefim-botoatiny tsy zaka",
+       "editpage-invalidcontentmodel-text": "Andrefim-botoatiny \"$1\" tsy zaka.",
        "editpage-notsupportedcontentformat-title": "Tsy zaka io andrefim-botoatiny io",
        "editpage-notsupportedcontentformat-text": "Tsy zakan'ny maodelim-botoatiny $1 ny firafi-botoatiny $1",
        "content-model-wikitext": "wiki-soratra",
        "content-model-css": "CSS",
        "content-json-empty-object": "Zavatra foana",
        "content-json-empty-array": "Tabilao foana",
+       "deprecated-self-close-category": "Pejy mampiasa balizy HTML mihidy ho azy izay tsy azo raisina",
        "duplicate-args-category": "Pejy mampiasa dika mitovy hevitra amin'ny fiantsoana endrika",
        "expensive-parserfunction-warning": "Tandremo : Betsaka loatra ny fanantsoana ny tao parser.\n\nTsy maintsy latsaky ny $2 ny tao, kanefa misy $1. {{PLURAL:$2||}}",
        "expensive-parserfunction-category": "Pejy mampiasa be loatra ny tao parser",
        "searchprofile-advanced-tooltip": "Hitady ny anaran-tsehatra ho an'ny fikarohana",
        "search-result-size": "$1 ({{PLURAL:$2|teny|teny}} $2)",
        "search-result-category-size": "Mpiray sokajy $1{{PLURAL:$1}} (zana-tsokajy $2{{PLURAL:}}, rakitra $3{{PLURAL:}})",
-       "search-redirect": "(redirect avy amin'ny/amin'i $1)",
+       "search-redirect": "(fihodinana avy amin'i $1)",
        "search-section": "(fizaràna $1)",
        "search-category": "(sokajy $1)",
        "search-file-match": "(miady amin'ny votoatin-drakitra)",
        "search-interwiki-caption": "zandri-tetikasa",
        "search-interwiki-default": "Valiny amin'ny $1 :",
        "search-interwiki-more": "(be kokoa)",
+       "search-interwiki-more-results": "Valiny be kokoa",
        "search-relatedarticle": "voadinika",
        "searchrelated": "voadinika",
        "searchall": "rehetra",
        "saveprefs": "Tehirizo",
        "restoreprefs": "Hamerina ny safidy taloha (amin'ny fizarana rehetra)",
        "prefs-editing": "Fanovana",
-       "rows": "Filaharana :",
-       "columns": "Tsanganana/Tioba :",
        "searchresultshead": "Fikarohana",
        "stub-threshold": "Fetra ambony ho an'i <a href=\"#\" class=\"stub\">rohim-bangovango</a> (oktety):",
        "stub-threshold-sample-link": "santiôna",
        "youremail": "Imailaka:",
        "username": "{{GENDER:$1}}Anaram-pikambana :",
        "prefs-memberingroups": "Mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}}:",
+       "group-membership-link-with-expiry": "$1 (hatramin'i $2)",
        "prefs-registration": "Daty fidirana :",
        "yourrealname": "Tena anarana marina:",
        "yourlanguage": "Tenim-pirenena:",
        "prefswarning-warning": "Efa nanova tamin'ny safidinao tsy mbola voatahiry ianao. Raha miala amin'ity pejy ity amin'ny alalan'ny fanindriana an'i \"$1\" ianao dia tsy ho voavao ny safidinao.",
        "prefs-tabs-navigation-hint": "Torohevitra: afaka mampiasa ny zana-tsipika havia ary havanana ianao ho an'ny fitetezana ny vakizoro ao amin'ny lisi-bakizoro",
        "userrights": "Fandrindràna ny fahefahan'ny mpikambana",
-       "userrights-lookup-user": "Handrindra vondrom-pikambana",
+       "userrights-lookup-user": "Hisafidy mpikambana",
        "userrights-user-editname": "Manomeza solonanarana:",
-       "editusergroup": "Hanova satan'ny {{GENDER:$1|}}mpikambana",
+       "editusergroup": "Hampiditra vondrom-pikambana",
        "editinguser": "Fanovana ny zon'ny mpikambana <strong>{{GENDER:$1|}}[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Hanova vondrom-pikambana",
        "saveusergroups": "{{GENDER:$1|}}Tehirizo ny vondrom-pikambana",
        "userrights-reason": "Antony :",
        "userrights-no-interwiki": "Tsy manana alalana manova ny alalan'ny mpikambana eny amin'ny wiki hafa ianao.",
        "userrights-nodatabase": "Tsy eto akaiky na tsy misy ny banky angona « $1 ».",
-       "userrights-nologin": "Tsy maintsy [[Special:UserLogin|miditra]] ary manana kaontim-pandrindra ianao raha hanova ny alalan'ny mpikambana.",
-       "userrights-notallowed": "Tsy manana alalana ny manova na manampy zom-pikambana ianao.",
        "userrights-changeable-col": "Ny gropy azonao ovaina",
        "userrights-unchangeable-col": "Ny gropy tsy azonao ovaina",
+       "userrights-expiry-current": "Mitsahatra ny $1",
+       "userrights-expiry-none": "Tsy mitsahatra",
+       "userrights-expiry": "Fitsaharana:",
+       "userrights-expiry-existing": "Fotoam-pitsaharana ankehitriny: $3, $2",
+       "userrights-expiry-othertime": "Fotoana hafa:",
+       "userrights-expiry-options": "1 andro:1 day,herinandro:1 week,1 volana:1 month,3 volana:3 months,6 volana:6 months,herintaona:1 year",
+       "userrights-invalid-expiry": "Tsy azo raisina ny fotoam-pitsaharana ho an'ny vondrona \"$1\".",
        "userrights-conflict": "Fifandonana fanovana zom-pikambana! Avereno vakiana ary marino ny fanovanao.",
-       "userrights-removed-self": "Nanala ny zonao ianao. Noho izany dia tsy afaka mitsidika ity pejy ity intsony ianao.",
        "group": "Gropy :",
        "group-user": "Mpikambana",
        "group-autoconfirmed": "Mpikambana voamarina",
        "right-siteadmin": "Manidy sy manokatra ny banky angona",
        "right-override-export-depth": "Mamoaka ny pejy miaraka amin'ny zana-pejy hatramin'ny ambaratonga fahadimy",
        "right-sendemail": "Mandefa imailaka any amin'ny mpikambana hafa",
-       "right-passwordreset": "Hijery ny imailaka famerenana ny tenimiafina",
        "right-managechangetags": "Mamorona ary mamafa [[Special:Tags|balizy]] ao amin'ny banky angona",
        "grant-generic": "\"$1\" vondron-jo",
        "grant-group-page-interaction": "Mifanakalo amin'ny pejy",
        "grant-group-watchlist-interaction": "Mifanakalo amin'ny lisitry ny pejy arahanao",
        "grant-group-email": "Mandefa mailaka",
        "grant-group-high-volume": "Manao zavatra haingana",
+       "grant-group-customization": "Fikirakirana ary safidy",
        "grant-group-administration": "Hanao asam-pandrindrana",
        "grant-group-other": "Manao hetsika maro samihafa",
        "grant-blockusers": "Manakana sy manala sakan'ny mpikambana",
        "rightslogtext": "Ity ny laogim-piovan'ny zom-pikambana",
        "action-read": "mamaky ity pejy ity",
        "action-edit": "manova ity pejy ity",
-       "action-createpage": "hanao pejy",
-       "action-createtalk": "hanao pejin-dresaka",
+       "action-createpage": "hamorona ity pejy ity",
+       "action-createtalk": "hanao ity pejin-dresaka ity",
        "action-createaccount": "amboary io kaontim-pikambana io",
        "action-autocreateaccount": "foronina ho azy io kaontim-pikambana ivelany io",
        "action-history": "hijery ny tantaran'ity pejy ity",
        "action-upload_by_url": "hampiditra io rakitra io avy amina adiresy URL",
        "action-writeapi": "hanova ny API fanoratana",
        "action-delete": "hamafa io pejy io",
-       "action-deleterevision": "hamafa io version io",
-       "action-deletedhistory": "mijery ny tantara voafafa n'ity pejy ity",
+       "action-deleterevision": "hamafa ireo versiona ireo",
+       "action-deletelogentry": "hamafa iditry ny laogy",
+       "action-deletedhistory": "hijery ny tantara voafafan'ilay pejy",
+       "action-deletedtext": "hijery version-tsoratra voafafa",
        "action-browsearchive": "hitady pejy efa voafafa",
-       "action-undelete": "hamerina io pejy io",
-       "action-suppressrevision": "hijery sy hamerina io version nofafàna io",
+       "action-undelete": "hamerina pejy",
+       "action-suppressrevision": "hijery sy hamerina versiona nafenina",
        "action-suppressionlog": "hijery io tao tsy sarababem-bahoaka",
        "action-block": "manakana am-panoratana ny mpikambana iray",
        "action-protect": "manova ny fanovàn'ity pejy ity",
        "action-userrights-interwiki": "hanova ny fahefan'ny mpikambana any amin'ny wiki hafa",
        "action-siteadmin": "Manidy sy manokatra ny banky angona",
        "action-sendemail": "handefa imailaka",
+       "action-editmyoptions": "hanova ny safidinao",
        "action-editmywatchlist": "Manova ny lisitry ny pejy arahana",
        "action-viewmywatchlist": "Mijery ny pejy arahanao",
        "action-viewmyprivateinfo": "Mijery ny fampahalalana tsy sarababem-bahoakanao",
        "action-editmyprivateinfo": "Mijery ny fampahalalana sarababem-bahoakanao",
        "action-editcontentmodel": "manova ny modelim-botoatin'ny pejy",
-       "action-managechangetags": "hamorona ary hamafa balizy ao amin'ny banky angona",
+       "action-managechangetags": "hamorona ary hampiasa (na tsia) ireo balizy",
        "action-applychangetags": "mampihatra balizy miaraka amin'ny fanovanao",
        "action-changetags": "manampy ary manala balizy amin'ny versiona manokana ary iditry ny laogy",
+       "action-deletechangetags": "hamafa balizy amin'ny banky angona",
+       "action-purge": "handio an'ity pejy ity",
        "nchanges": "{{PLURAL:$1|fanovana|fanovana}} $1",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "recentchanges-legend-heading": "<strong>Maribolana:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
        "recentchanges-submit": "Aseho",
+       "rcfilters-activefilters": "Sivana miasa",
+       "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-noresults": "Tsy nahitana sivana",
+       "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-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-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-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-filtergroup-changetype": "Karazam-piovana",
+       "rcfilters-filter-pageedits-label": "Fiovam-pejy",
        "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",
        "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.",
-       "uploadscriptednamespace": "ahitana valan'anarana \"$1\" ny rakitra SVG.",
+       "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",
        "uploadjava": "Ny rakitra dia rakitra ZIP ahitana rakitra .class Java.\nVoarara ny mandefa rakitra Java satria mety hahavaky ny fepetra mikasika ny antoka ireo rakitra ireo.",
        "whatlinkshere-next": "$1 manaraka{{PLURAL:$1||}}",
        "whatlinkshere-links": "← rohy",
        "whatlinkshere-hideredirs": "$1 ny fihodinana",
-       "whatlinkshere-hidetrans": "$1 ny tsofo-pejy",
+       "whatlinkshere-hidetrans": "$1 ny fampiasam-pejy",
        "whatlinkshere-hidelinks": "$1 ny rohy",
        "whatlinkshere-hideimages": "$1 ny rakitra mirohy",
        "whatlinkshere-filters": "sivana",
        "feedback-submit": "Alefa",
        "feedback-thanks": "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Karohy",
+       "searchsuggest-search": "Hikaroha eto amin'i {{SITENAME}}",
        "searchsuggest-containing": "misy...",
-       "api-error-badaccess-groups": "Tsy afaka mampiditra rakitra eto amin'ity wiki ity ianao.",
        "api-error-badtoken": "Hadisoana anaty : \"token\" diso.",
-       "api-error-copyuploaddisabled": "Tsy avela atao eto amin'ity lohamilina ity ny fampidiran-drakitra amin'ny alalan'ny URL.",
-       "api-error-empty-file": "Tsy misy na inona na inna ilay rakitra nalefanao.",
        "api-error-emptypage": "Tsy azo atao ny mamorona pejy vaovao tsy misy votoatiny.",
-       "api-error-fetchfileerror": "Hadisoana naaty : misy hadisoana nitranga teo am-pangalana ilay rakitra.",
-       "api-error-file-too-large": "Lehibe loatra ny rakitra nalefanao.",
-       "api-error-filename-tooshort": "Fohy loatra ny anaran'ilay rakitra.",
-       "api-error-filetype-banned": "Voarara io karazan-drakitra io.",
-       "api-error-filetype-missing": "Tsy ampy tovana ilay anaran-drakitra.",
-       "api-error-hookaborted": "Najanon'ny faraingon'itatra ny fanovana nandramanao natao.",
-       "api-error-http": "Hadisoana anaty: Tsy tafaray tamin'ilay lohamilina.",
-       "api-error-illegal-filename": "Tsy azo ampiasaina io anaran-drakitra io.",
-       "api-error-internal-error": "Hadisoana anaty: Nisy hadisoana nitranga teo am-pikajikajiana ny rakitrao",
-       "api-error-invalid-file-key": "Hadisoana anaty: Tsy hita tao amin'ilay tahiry vonjimaika ilay rakitra.",
-       "api-error-missingparam": "Hadisoana anaty: Parametatra tsy ampy ao amin'ny hataka.",
-       "api-error-missingresult": "Hadisoana anaty: Tsy afaka milaza izahay raha tena nahomby ilay fandikana.",
-       "api-error-mustbeloggedin": "Mila tafiditra ianao mba handefa rakitra.",
-       "api-error-mustbeposted": "Hadisoana anaty: Mila HTTP POST ilay hataka.",
-       "api-error-noimageinfo": "Nahomby ilay fandikana, fa tsy nanome antsika fampahalalana mikasika ilay raktira ilay lohamilina.",
-       "api-error-nomodule": "Hadisoana anaty: Tsy namaritra joro fandefasana.",
-       "api-error-ok-but-empty": "Hadisoana anaty: Tsy nisy valiny avy amin'ilay lohamilina.",
-       "api-error-overwrite": "Tsy azo atao ny manitsaka rakitra efa misy.",
        "api-error-stashfailed": "Hadisoana anaty: Tsy nahomby ny fitahirizana ilay rakitra vonjimaika ilay lohamilina.",
-       "api-error-timeout": "Tsy namaly tanatin'ny fe-potoana nandrasana ilay lohamilina.",
-       "api-error-unclassified": "Nisy hadisoana tsy fantatra nitranga.",
-       "api-error-unknown-code": "Hadisoana tsy fantatra : ''$1''.",
-       "api-error-unknown-error": "Hadisoana anaty: Nisy hadisoana tam-pandefasana ny rakitrao.",
        "api-error-unknown-warning": "Fampitandremana tsy fantatra : ''$1''.",
        "api-error-unknownerror": "Hadisoana tsy fantatra : ''$1''.",
-       "api-error-uploaddisabled": "Tsy alefa eto amin'ity wiki ity ny fandefasan-drakita.",
-       "api-error-verification-error": "Mety tapaka ity rakitra ity, na diso tovan-drakitra.",
        "special-characters-group-latin": "latina",
        "special-characters-group-latinextended": "latina nitarina",
        "special-characters-group-ipa": "AAI",
index b28c0d1..b979c67 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": "Преглед на проектната страница",
        "eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
        "throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
        "mailerror": "Грешка при испраќање на е-поштата: $1",
-       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иÑ\82ели Ð½Ð° Ð¾Ð²Ð° Ð²Ð¸ÐºÐ¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\98Ñ\9cи Ñ\98а Ð²Ð°Ñ\88аÑ\82а IP-адÑ\80еÑ\81а Ñ\81оздале {{PLURAL:$1|1 Ñ\81меÑ\82ка|$1 Ñ\81меÑ\82ки}} Ð²Ð¾ Ð¿Ð¾Ñ\81ледниве $2, Ð¿Ñ\80и Ñ\88Ñ\82о Ðµ Ð´Ð¾Ñ\81Ñ\82игнаÑ\82 Ð¼Ð°ÐºÑ\81ималниоÑ\82 број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
+       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иÑ\82ели Ð½Ð° Ð¾Ð²Ð° Ð²Ð¸ÐºÐ¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\98Ñ\9cи Ñ\98а Ð²Ð°Ñ\88аÑ\82а IP-адÑ\80еÑ\81а Ñ\81оздале {{PLURAL:$1|1 Ñ\81меÑ\82ка|$1 Ñ\81меÑ\82ки}} Ð²Ð¾ Ð¿Ð¾Ñ\81ледниве $2, Ð¿Ñ\80и Ñ\88Ñ\82о Ðµ Ð´Ð¾Ñ\81Ñ\82игнаÑ\82 Ð½Ð°Ñ\98големиоÑ\82 Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ен број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
        "emailauthenticated": "Вашата е-пошта адреса е потврдена на $2 во $3 ч.",
        "emailnotauthenticated": "Вашата е-поштенска адреса сè уште не е потврдена.\nНема да биде испратена е-пошта во ниту еден од следниве случаи.",
        "noemailprefs": "Наведете е-поштенска адреса за да функционираат следниве својства.",
        "passwordreset-emaildisabled": "Можностите за е-пошта се исклучени на ова вики",
        "passwordreset-username": "Корисничко име:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Да ја прикажам пораката?",
-       "passwordreset-capture-help": "Ако го штиклирате кутивчево, ќе ви се прикаже пораката (со привремената лозинка) и истата ќе му биде испратена на корисникот.",
        "passwordreset-email": "Е-пошта:",
        "passwordreset-emailtitle": "Најавни податоци за {{SITENAME}}",
        "passwordreset-emailtext-ip": "Некој (веројатно вие, од IP-адресата $1) побара измена на вашата\nлозинка за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во\n{{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
        "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
        "passwordreset-emailsentemail": "Ако ова е регистрираната е-пошта поврзана со вашата сметка, тогаш ќе ви биде испратено писмо за задавање на нова лозинка.",
        "passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта поврзана со ова корисничко име, тогаш ќе ви биде испратена порака за промена на лозинката.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Е-поштата за задавање на нова лозинка|Е-поштата за задавање на нови лозинки}} е испратена. Тука е {{PLURAL:$1|е прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
-       "passwordreset-emailerror-capture2": "Испраќањето е-пошта на {{GENDER:$2|корисникот}} не успеа: $1 Тука е {{PLURAL:$3|прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
        "passwordreset-nocaller": "Мора да се укаже повикувач",
        "passwordreset-nosuchcaller": "Повикувачот не постои: $1",
        "passwordreset-ignored": "Менувањето на лозинката не успеа. Можеби не е поставен услужник?",
        "blockedtitle": "Корисникот е блокиран",
        "blockedtext": "'''Вашето корисничко име или IP-адреса е блокирано.'''\n\nБлокирањето е направено од страна на $1.\nДаденото образложение е ''$2''.\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Корисникот што требало да биде блокиран: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со блокирањето.\nМожете да ја искористите можноста „Е-пошта до овој корисник“ ако е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и не ви е забрането да ја користите.\nВашата сегашна IP-адреса е $3, а назнака на блокирањето гласи #$5.\nВе молиме наведете ги сите подробности прикажани погоре, во вашата евентуална реакција.",
        "autoblockedtext": "Вашата IP-адреса е автоматски блокирана бидејќи била користена од страна на друг корисник, кој бил блокиран од $1.\nДаденото образложение е следново:\n\n:''$2''\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Со намера да се блокира: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со ова блокирање.\n\nИмајте предвид дека можеби нема да можете да ја искористите можноста „Е-пошта до овој корисник“ доколку не е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и ви е забрането користитење на истата.\n\nВашата IP-адреса е $3, a ID на блокирањеto е $5.\nВе молиме наведете ги овие подробности доколку реагирате на блокирањето.",
+       "systemblockedtext": "Вашето корисничко име или IP-адреса е автоматски блокирано од МедијаВики.\nПонудена причина:\n\n:<em>$2</em>\n\n* Почеток на блокот: $8\n* Истек на блокот: $6\n* Блокот е наменет за: $7\n\nВашата тековна IP-адреса гласи $3.\nПрепишете ги сите горенаведени поединости доколку сакате да се распрашате кај надлежните во врска со блокот.",
        "blockednoreason": "не е наведена причина",
        "whitelistedittext": "Мора да сте $1 за да уредувате страници.",
        "confirmedittext": "Морате да ја потврдите вашата е-поштенска адреса пред да уредувате страници.\nПоставете ја и валидирајте ја вашата е-поштенска адреса преку вашите [[Special:Preferences|нагодувања]].",
        "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
        "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
        "node-count-exceeded-category": "Страници каде е надминат бројот на јазли",
-       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ð³Ð¾ Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð¼Ð°ÐºÑ\81ималниот број на јазли.",
+       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ð³Ð¾ Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ениот број на јазли.",
        "node-count-exceeded-warning": "Страницата го надмина бројот на јазли",
        "expansion-depth-exceeded-category": "Страници каде е пречекорена длабочината на проширувањето",
-       "expansion-depth-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\98а Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð¼Ð°ÐºÑ\81ималнаÑ\82а Ð´Ð»Ð°Ð±Ð¾Ñ\87ина Ð½Ð° Ð¿Ñ\80оÑ\88иÑ\80Ñ\83ваÑ\9aе.",
+       "expansion-depth-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\98а Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð½Ð°Ñ\98големаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 Ð½Ð° Ð¿Ñ\80оÑ\88иÑ\80Ñ\83ваÑ\9aеÑ\82о.",
        "expansion-depth-exceeded-warning": "Страницата ја надмина длабочината на проширувањето",
        "parser-unstrip-loop-warning": "Утврдена е јамка",
        "parser-unstrip-recursion-limit": "Пречекорена е границата на рекурзија ($1)",
        "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": "Број на уредувања:",
        "prefs-editwatchlist-clear": "Исчисти набљудувани",
        "prefs-watchlist-days": "Број на денови за приказ во набљудуваните",
        "prefs-watchlist-days-max": "Највеќе $1 {{PLURAL:$1|ден|дена}}",
-       "prefs-watchlist-edits": "Ð\9cакÑ\81имален Ð±Ñ\80оÑ\98 Ð½Ð° прикажани промени во проширениот список на набљудувања:",
+       "prefs-watchlist-edits": "Ð\9dаÑ\98веÑ\9cе прикажани промени во проширениот список на набљудувања:",
        "prefs-watchlist-edits-max": "Највеќе: 1000",
        "prefs-watchlist-token": "Шифра на набљудувањата:",
        "prefs-misc": "Други нагодувања",
        "saveprefs": "Зачувај",
        "restoreprefs": "Врати сè по основно (во сите делови)",
        "prefs-editing": "Уредување",
-       "rows": "Редови:",
-       "columns": "Колони:",
        "searchresultshead": "Пребарување",
        "stub-threshold": "Праг за форматирање на врска за никулци ($1):",
        "stub-threshold-sample-link": "примерок",
        "prefs-help-recentchangescount": "Подразбира скорешни промени, истории на страници и дневници.",
        "prefs-help-watchlist-token2": "Ова е тајна шифра за вашиот канализиран список на набљудувања.\nСекој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.\n[[Special:ResetTokens|Стиснете тука ако треба да зададете нова]].",
        "savedprefs": "Вашите нагодувања се зачувани.",
-       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87киÑ\82е Ð¿Ñ\80ава Ð½Ð° {{GENDER:$1|$1}} Ð½Ðµ се зачувани.",
+       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87киÑ\82е Ð³Ñ\80Ñ\83пи Ð½Ð° {{GENDER:$1|$1}} се зачувани.",
        "timezonelegend": "Часовен појас:",
        "localtime": "Месно време:",
        "timezoneuseserverdefault": "Од викито ($1)",
        "youremail": "Е-пошта:",
        "username": "{{GENDER:$1|Корисничко име}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} на {{PLURAL:$1|групата|групите}}:",
+       "group-membership-link-with-expiry": "$1 (до $2)",
        "prefs-registration": "Време на регистрација:",
        "yourrealname": "Вистинско име:",
        "yourlanguage": "Јазик:",
        "prefswarning-warning": "Направивте промени во нагодувањата, но не ги зачувавте.\nИзмената нема да се изврши ако ја напуштите страницава без да стиснете на „$1“.",
        "prefs-tabs-navigation-hint": "Совет: Можете да ги користите стрелките на тастатурата за да преоѓате од едно на друго јазиче во списокот на јазичиња.",
        "userrights": "Раководење со кориснички права",
-       "userrights-lookup-user": "РаководеÑ\9aе Ñ\81о ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð³Ñ\80Ñ\83пи",
+       "userrights-lookup-user": "Ð\98збеÑ\80еÑ\82е ÐºÐ¾Ñ\80иÑ\81ник",
        "userrights-user-editname": "Внесете корисничко име:",
-       "editusergroup": "УÑ\80еди {{GENDER:$1|коÑ\80иÑ\81ниÑ\87ки}} групи",
+       "editusergroup": "Ð\92Ñ\87иÑ\82аÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки групи",
        "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-nologin": "Мора да сте [[Special:UserLogin|најавени]] со администраторска корисничка сметка за да може да вршите промена на кориснички права.",
-       "userrights-notallowed": "Немате дозвола за додавање и отстранување на кориснички права.",
        "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": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.",
-       "userrights-removed-self": "Ги отстранивте вашите права. Затоа, повеќе немате пристап на страницава.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Автопотврдени корисници",
        "right-userrights": "Уредување на сите кориснички права",
        "right-userrights-interwiki": "Уредување на кориснички права на корисници на други викија",
        "right-siteadmin": "Заклучување и отклучување на базата на податоци",
-       "right-override-export-depth": "Ð\98звезÑ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð´Ð»Ð°Ð±Ð¾Ñ\87ина до 5",
+       "right-override-export-depth": "Ð\98звезÑ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 до 5",
        "right-sendemail": "Испраќање на е-пошта до други корисници",
-       "right-passwordreset": "Преглед на пораки по е-пошта за промена на лозинка",
        "right-managechangetags": "Создавање и (де)активирање на [[Special:Tags|ознаки]]",
        "right-applychangetags": "Задавање на [[Special:Tags|ознаки]] заедно со направените измени",
        "right-changetags": "Додавате и отстранување на произволни [[Special:Tags|ознаки]] во поединечни преработки и дневнички записи",
        "grant-editprotected": "Уредување на заштитени страници",
        "grant-highvolume": "Високообемно уредување",
        "grant-oversight": "Скривање на корисници и преработки",
-       "grant-patrol": "Ð\9fаÑ\82Ñ\80ола Ð½Ð° Ð¸Ð·мени во страници",
+       "grant-patrol": "Ð\9fаÑ\82Ñ\80ола Ð½Ð° Ð¿Ñ\80омени во страници",
        "grant-privateinfo": "Пристап до лични информации",
        "grant-protect": "Заштита на незаштитени страници",
-       "grant-rollback": "Ð\9eÑ\82повикÑ\83ваÑ\9aе Ð½Ð° Ð¸Ð·мени во страници",
+       "grant-rollback": "Ð\9eÑ\82повикÑ\83ваÑ\9aе Ð½Ð° Ð¿Ñ\80омени во страници",
        "grant-sendemail": "Испраќање на е-пошта до други корисници",
        "grant-uploadeditmovefile": "Подигање, замена и преместување на податотеки",
        "grant-uploadfile": "Подигање нови податотеки",
        "action-upload_by_url": "подигни ја податотекава од URL-адреса",
        "action-writeapi": "употребете запишување во извршникот",
        "action-delete": "избриши ја страницава",
-       "action-deleterevision": "избриши ја ревизијава",
-       "action-deletedhistory": "прегледај ја историјата на бришења за оваа страница",
+       "action-deleterevision": "бришење преработки",
+       "action-deletelogentry": "бришење на дневнички записи",
+       "action-deletedhistory": "преглед на историјата на бришења на оваа страница",
+       "action-deletedtext": "преглед на текст на избришани преработки",
        "action-browsearchive": "барање на избришани страници",
-       "action-undelete": "обнови Ñ\98а Ñ\81Ñ\82Ñ\80аниÑ\86ава",
-       "action-suppressrevision": "прегледај ја и обнови ја оваа скриена преработка",
+       "action-undelete": "обнова Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и",
+       "action-suppressrevision": "преглед ја и обнова на скриени преработки",
        "action-suppressionlog": "преглед на овој li;en дневник",
        "action-block": "оневозможување на уредувањето на корисников",
        "action-protect": "измени го степенот на заштита на оваа страница",
        "action-userrights-interwiki": "уредување на кориснички права на корисници на други викија",
        "action-siteadmin": "заклучување или отклучување на базата на податоци",
        "action-sendemail": "испраќање на е-пошта",
+       "action-editmyoptions": "уредување на вашите нагодувања",
        "action-editmywatchlist": "уредување на мои набљудувани",
        "action-viewmywatchlist": "преглед на вашиот список на набљудувања",
        "action-viewmyprivateinfo": "преглед на вашите лични податоци",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Прикажи",
+       "rcfilters-activefilters": "Активни филтри",
+       "rcfilters-restore-default-filters": "Поврати основни филтри",
+       "rcfilters-clear-all-filters": "Тргни ги сите филтри",
+       "rcfilters-search-placeholder": "Филтрирај скорешни промени (прелстајте или почнете да пишувате)",
+       "rcfilters-invalid-filter": "Неважечки филтер",
+       "rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
+       "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
+       "rcfilters-filtergroup-registration": "Регистрација на корисници",
+       "rcfilters-filter-registered-label": "Регистрирани",
+       "rcfilters-filter-registered-description": "Најавени уредници.",
+       "rcfilters-filter-unregistered-label": "Нерегистрирани",
+       "rcfilters-filter-unregistered-description": "Уредници кои не се најавени.",
+       "rcfilters-filtergroup-authorship": "Уреди авторство",
+       "rcfilters-filter-editsbyself-label": "Ваши сопствени уредувања",
+       "rcfilters-filter-editsbyself-description": "Ваши уредувања.",
+       "rcfilters-filter-editsbyother-label": "Туѓи уредувања",
+       "rcfilters-filter-editsbyother-description": "Уредувања направени од други корисници (не од вас).",
+       "rcfilters-filtergroup-userExpLevel": "Корисничка искусност (само за регистрирани)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новодојденци",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Помалку од 10 уредувања и 4 дена активност.",
+       "rcfilters-filter-userExpLevel-learner-label": "Ученици",
+       "rcfilters-filter-userExpLevel-learner-description": "Повеќе денови активност од „новодојденците“, но помалку од „искусните корисници“.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Искусни корисници",
+       "rcfilters-filter-userExpLevel-experienced-description": "Повеќе од 30 дена активност и 500 уредувања.",
+       "rcfilters-filtergroup-automated": "Автоматизирани придонеси",
+       "rcfilters-filter-bots-label": "Ботовски",
+       "rcfilters-filter-bots-description": "Уредувања со автоматизирани алатки.",
+       "rcfilters-filter-humans-label": "Човечки (неботовски)",
+       "rcfilters-filter-humans-description": "Уредувања направени од човечки уредници.",
+       "rcfilters-filtergroup-significance": "Значајност",
+       "rcfilters-filter-minor-label": "Ситни уредувања",
+       "rcfilters-filter-minor-description": "Уредувања кои авторот ги означил како ситни.",
+       "rcfilters-filter-major-label": "Неситни уредувања",
+       "rcfilters-filter-major-description": "Уредувања кои не се означени како ситни.",
+       "rcfilters-filtergroup-changetype": "Вид на промена",
+       "rcfilters-filter-pageedits-label": "Уредувања на страници",
+       "rcfilters-filter-pageedits-description": "Уредувања во содржината, разговорите, описите на категориите...",
+       "rcfilters-filter-newpages-label": "Создавања на страници",
+       "rcfilters-filter-newpages-description": "Уредувања кои создаваат нови страници.",
+       "rcfilters-filter-categorization-label": "Промени во категории",
+       "rcfilters-filter-categorization-description": "Записи од ставање на страници во категории или нивно отстранување од нив.",
+       "rcfilters-filter-logactions-label": "Заведени дејства",
+       "rcfilters-filter-logactions-description": "Административни постапки, создавања на сметки, бришења на страници, подигања...",
        "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "filename": "Име на податотеката",
        "filedesc": "Опис",
        "fileuploadsummary": "Опис:",
-       "filereuploadsummary": "Ð\98змени во податотеката:",
+       "filereuploadsummary": "Ð\9fÑ\80омени во податотеката:",
        "filestatus": "Авторскоправен статус:",
        "filesource": "Извор:",
        "ignorewarning": "Занемари ги предупредувањата и зачувај ја податотеката",
        "tmp-create-error": "Не можев да создадам привремена податотека.",
        "tmp-write-error": "Грешка при запис на привремената податотека.",
        "large-file": "Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.",
-       "largefileserver": "Ð\93олеминаÑ\82а Ð½Ð° Ð¾Ð²Ð°Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð¼Ð°ÐºÑ\81имално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ\82а Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° Ð¾Ð´ Ñ\81еÑ\80веÑ\80от.",
+       "largefileserver": "Ð\9fодаÑ\82оÑ\82екава Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82еноÑ\82о Ð¾Ð´ Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87от.",
        "emptyfile": "Податотеката што ја подигнавте е празна.\nОва може да се должи на грешка во нејзиното име.\nПроверете дали навистина сакате да ја подигнете ваквата податотека.",
        "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со псоебни знаци.",
        "fileexists": "Податотека со ова име веќе постои. Проверете <strong>[[:$1]]</strong> ако не {{GENDER:|сте}} сигурни дали сакате да ја промените.\n[[$1|thumb]]",
        "uploaded-setting-handler-svg": "SVG што го задава атрибутот „handler“ со оддалечено/податочна/скриптна е спречен. Пронајдов <code>$1=\"$2\"</code> во подигнатата SVG-податотека.",
        "uploaded-remote-url-svg": "SVG што задава било каков стилски атрибут со оддалечена URL е спречен. Пронајдов <code>$1=\"$2\"</code> во подигнатата SVG-податотека.",
        "uploaded-image-filter-svg": "Пронајдов филтер за слики со URL: <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
-       "uploadscriptednamespace": "Овааа SVG-податотека го содржи недопуштениот именски простор „$1“",
+       "uploadscriptednamespace": "Овааа SVG-податотека го содржи недопуштениот именски простор „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "Не можев да го расчленам XML-от што се наоѓа во подигнатата податотека.",
        "uploadvirus": "Оваа податотека содржи вирус! Повеќе подробности: $1",
        "uploadjava": "Податотеката е од типот ZIP што содржи податотека со наставка .class за Java.\nПодигањето на податотеки за Java не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.",
        "sourcefilename": "Изворно име на податотеката:",
        "sourceurl": "Изворен URL:",
        "destfilename": "Целно име на податотеката:",
-       "upload-maxfilesize": "Ð\9cакÑ\81имална големина на податотеката: $1",
+       "upload-maxfilesize": "Ð\94опÑ\83Ñ\88Ñ\82ена големина на податотеката: $1",
        "upload-description": "Опис на податотека",
        "upload-options": "Нагодувања на подигањето",
        "watchthisupload": "Набљудувај ја податотекава",
        "uncategorizedcategories": "Некатегоризирани категории",
        "uncategorizedimages": "Некатегоризирани податотеки",
        "uncategorizedtemplates": "Некатегоризирани преуредувања",
+       "uncategorized-categories-exceptionlist": " # Содржи список на категории кои не треба да се споменуваат во Special:UncategorizedCategories. По една во секој нов ред што почнува со „*“. Редовите што почнуваат со друг знак (заклучно со празни места) ќе се занемарат. Користете „#“ за прибелешки.",
        "unusedcategories": "Неискористени категории",
        "unusedimages": "Неискористени слики",
        "wantedcategories": "Потребни категории",
        "apisandbox-sending-request": "Испраќам барање до извршникот...",
        "apisandbox-loading-results": "Добивам исход од извршникот...",
        "apisandbox-results-error": "Се појави грешка при вчитувањето на одговорот од барањето до извршникот: $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 милисекунда|$1 милисекунди}}",
        "apisandbox-results-fixtoken": "Исправи ја шифрата и поднеси одново",
        "apisandbox-results-fixtoken-fail": "Не успеав да ја добијам шифрата „$1“.",
        "apisandbox-continue-clear": "Исчисти",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} ќе [https://www.mediawiki.org/wiki/API:Query#Continuing_queries продолжи] со последното барање; „{{int:apisandbox-continue-clear}}“ ќе ги исчисти параметрите поврзани со продолжување.",
        "apisandbox-param-limit": "Внесете <kbd>max</kbd> за да ја користите најгорната граница.",
+       "apisandbox-multivalue-all-namespaces": "$1 (сите именски простори)",
+       "apisandbox-multivalue-all-values": "$1 (сите вредности)",
        "booksources": "Печатени извори",
        "booksources-search-legend": "Пребарување на извори за книга",
        "booksources-isbn": "ISBN:",
        "activeusers-count": "$1 {{PLURAL:$1|дејство|дејства}} {{PLURAL:$3|денес|во последните $3 дена}}",
        "activeusers-from": "Прикажи корисници почнувајќи од:",
        "activeusers-groups": "Прикажи ги корисниците кои членуваат во групите:",
+       "activeusers-excludegroups": "Изземи ги корисниците што членуваат во групите:",
        "activeusers-noresult": "Не пронајдов ниеден корисник.",
        "activeusers-submit": "Прикажи активни корисници",
        "listgrouprights": "Права на кориснички групи",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
        "emailsenttext": "Писмото е испратено.",
-       "emailuserfooter": "$1 го испрати писмово на {{GENDER:$2|$2}} со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}.",
+       "emailuserfooter": "$1 го испрати писмово на {{GENDER:$2|$2}} со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}. Ако {{GENDER:$2|одговорите}} на ова писмо, {{GENDER:$2|Вашата}} е-пошта ќе му биде испратена право на {{GENDER:$1|изворниот испраќач}}, откривајќи {{GENDER:$1|му}} ја {{GENDER:$2|вашата}} адреса.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "usermessage-template": "MediaWiki:КорисникПорака",
        "changecontentmodel-emptymodels-title": "Нема содржински модели на располагање",
        "changecontentmodel-emptymodels-text": "Содржината на [[:$1]] не може да се претвори во ниеден тип.",
        "log-name-contentmodel": "Дневник на измени во содржинските модели",
-       "log-description-contentmodel": "Настани поврзани со содржинските модели на една страница",
+       "log-description-contentmodel": "На страницава се наведени промените во содржинскиот модел на страниците, како и страници создадени со содржински модел поинаков од основно зададениот.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|ја создаде}} страницата $3 користејќи го нестандардниот содржински модел „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|го смени}} содржиснкиот модел на страницата $3 од „$4“ на „$5“",
        "logentry-contentmodel-change-revertlink": "отповикај",
        "protect-expiry-options": "1 час: 1 hour,1 ден:1 day,1 недела:1 week,2 недели:2 weeks,1 месец:1 month,3 месеци:3 months,6 месеци:6 months,1 година:1 year,бесконечно:infinite",
        "restriction-type": "Дозвола:",
        "restriction-level": "Степен на заштита:",
-       "minimum-size": "Ð\9cинимална големина",
-       "maximum-size": "Ð\9cакÑ\81имална големина",
+       "minimum-size": "Ð\9dаÑ\98мала големина",
+       "maximum-size": "Ð\94опÑ\83Ñ\88Ñ\82ена големина",
        "pagesize": "(бајти)",
        "restriction-edit": "Уредување",
        "restriction-move": "Преместување",
        "sorbs": "DNSBL",
        "sorbsreason": "Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..",
        "sorbs_create_account_reason": "Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}.\nНе можете да создадете корисничка сметка.",
+       "softblockrangesreason": "Анонимните придонеси не се дозволени од вашата IP-адреса ($1). Најавете се.",
        "xffblockreason": "Блокирана е IP-адреса присутна во заглавието X-Forwarded-For, која е ваша или на застапничкиот опслужувач што го користите. Наведеното образложение гласи: $1",
        "cant-see-hidden-user": "Корисникот кој се обидувате да го блокирате е веќе блокиран и сокриен. Бидејќи вие немате права за сокривање на корисник, не можете да ги видите или уредувате корисничките блокирања.",
        "ipbblocked": "Не можете да блокирате или одблокирате други корисници бидејќи и самите сте блокирани",
        "cant-move-to-user-page": "Немате дозвола за преместување на страница во ваша корисничка страница (освен во корисничка потстраница)",
        "cant-move-category-page": "Немате дозвола да преместувате категориски страници.",
        "cant-move-to-category-page": "Немате дозвола да преместувате страници во категориски страници.",
+       "cant-move-subpages": "Немате дозвола за преместување на потстраници.",
+       "namespace-nosubpages": "Именскиот простор „$1“ не дозволува потстраници.",
        "newtitle": "Нов наслов:",
        "move-watch": "Набљудувај ја страницава",
        "movepagebtn": "Премести страница",
        "movepage-page-exists": "Страницата $1 веќе постои и не може автоматски да биде заменета.",
        "movepage-page-moved": "Страницата $1 е преместена на $2.",
        "movepage-page-unmoved": "Страницата $1 не може да биде преместена во $2.",
-       "movepage-max-pages": "Максимално $1 {{PLURAL:$1|страница|страници}} беа преместени, повеќе не може да бидат автоматски преместени.",
+       "movepage-max-pages": "{{PLURAL:$1|Преместен е највеќе $1 страница|Преместени се највеќе $1 страници}}. Повеќе од тоа не може да се преместува автоматски.",
        "movelogpage": "Дневник на преместувања",
        "movelogpagetext": "Подолу е наведен список на преместени страници.",
        "movesubpage": "{{PLURAL:$1|Потстраница|Потстраници}}",
        "export-addns": "Додај",
        "export-download": "Зачувај како податотека",
        "export-templates": "Вклучи и шаблони",
-       "export-pagelinks": "Ð\92клÑ\83Ñ\87и Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ð´Ð¾ Ð´Ð»Ð°Ð±Ð¾Ñ\87ина од:",
+       "export-pagelinks": "Ð\92клÑ\83Ñ\87и Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ð´Ð¾ Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 од:",
        "export-manual": "Додајте страници рачно:",
        "allmessages": "Системски пораки",
        "allmessagesname": "Име",
        "pageinfo-length": "Големина на страницата (во бајти)",
        "pageinfo-article-id": "Назнака на страницата",
        "pageinfo-language": "Јазик на содржината на страницата",
+       "pageinfo-language-change": "смени",
        "pageinfo-content-model": "Модел на содржината на страницата",
        "pageinfo-content-model-change": "смени",
        "pageinfo-robot-policy": "Индексирање со роботи",
        "file-info": "големина: $1, MIME-тип: $2",
        "file-info-size": "$1 × $2 пиксели, големина: $3, MIME-тип: $4",
        "file-info-size-pages": "$1 × $2 пиксели, големина: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страници}}",
-       "file-nohires": "Ð\9dема Ð²ÐµÑ\80зиÑ\98а Ñ\81о Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ñ\80азделеноÑ\81Ñ\82.",
+       "file-nohires": "Нема верзија со поголема разделност.",
        "svg-long-desc": "SVG податотека, номинално $1 × $2 пиксели, големина: $3",
        "svg-long-desc-animated": "Анимирана SVG-податотека, номинално: $1 × $2 пиксели, големина: $3",
        "svg-long-error": "Неважечка SVG-податотека: $1",
        "show-big-image": "Изворна податотека",
        "show-big-image-preview": "Големина на овој преглед: $1.",
        "show-big-image-preview-differ": "Големина на овој $3-преглед на оваа $2-податотека: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80азделеноÑ\81Ñ\82\94Ñ\80Ñ\83ги Ñ\80азделености}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80азделноÑ\81Ñ\82\94Ñ\80Ñ\83ги Ñ\80азделности}}: $1.",
        "show-big-image-size": "$1 × $2 пиксели",
        "file-info-gif-looped": "кружно",
        "file-info-gif-frames": "$1 {{PLURAL:$1|кадар|кадри}}",
        "file-info-png-repeat": "пуштено {{PLURAL:$1|еднаш|$1 пати}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|кадар|кадри}}",
        "file-no-thumb-animation": "'''Напомена: Поради технички ограничувања, минијатурите на оваа податотека нема да се анимираат.'''",
-       "file-no-thumb-animation-gif": "'''Ð\9dапомена: Ð\9fоÑ\80ади Ñ\82еÑ\85ниÑ\87ки Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aа, Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80иÑ\82е Ð½Ð° GIF-Ñ\81лики Ñ\81о Ð²Ð¸Ñ\81ока Ñ\80азделеноÑ\81Ñ\82 ÐºÐ°ÐºÐ¾ Ð¾Ð²Ð°Ð° Ð½ÐµÐ¼Ð° Ð´Ð° Ñ\81е Ð°Ð½Ð¸Ð¼Ð¸Ñ\80ааÑ\82.'''",
+       "file-no-thumb-animation-gif": "'''Напомена: Поради технички ограничувања, минијатурите на GIF-слики со висока разделност како оваа нема да се анимираат.'''",
        "newimages": "Галерија на нови податотеки",
        "imagelisttext": "Следи список на '''$1''' {{PLURAL:$1|податотека|податотеки}} подредени $2.",
        "newimages-summary": "Оваа службена страница ги покажува скоро подигнатите податотеки.",
        "exif-planarconfiguration": "Распоред на податоците",
        "exif-ycbcrsubsampling": "Однос на величината на Y спрема C",
        "exif-ycbcrpositioning": "Положби на Y и C",
-       "exif-xresolution": "ХоÑ\80изонÑ\82ална Ñ\80азделеноÑ\81Ñ\82",
-       "exif-yresolution": "Ð\92еÑ\80Ñ\82икална Ñ\80азделеноÑ\81Ñ\82",
+       "exif-xresolution": "Хоризонтална разделност",
+       "exif-yresolution": "Вертикална разделност",
        "exif-stripoffsets": "Положба на податоците",
        "exif-rowsperstrip": "Број на редови по блок",
        "exif-stripbytecounts": "Бајти по набиен блок",
        "exif-aperturevalue": "APEX-oтвор",
        "exif-brightnessvalue": "APEX-светлост",
        "exif-exposurebiasvalue": "Надоместок на изложувањето",
-       "exif-maxaperturevalue": "Ð\9cакÑ\81. отвореност на блендата",
+       "exif-maxaperturevalue": "Ð\9dаÑ\98г. отвореност на блендата",
        "exif-subjectdistance": "Оддалеченост до објектот",
        "exif-meteringmode": "Режим на мерачот",
        "exif-lightsource": "Светлосен извор",
        "exif-focallength-format": "$1 мм",
        "exif-subjectarea": "Положба и површина на објектот",
        "exif-flashenergy": "Енергија на блицот",
-       "exif-focalplanexresolution": "РазделеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88наÑ\82а Ñ\80амнина X",
-       "exif-focalplaneyresolution": "РазделеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88наÑ\82а Ñ\80амнина Y",
-       "exif-focalplaneresolutionunit": "Ð\95диниÑ\86а Ð·Ð° Ñ\80азделеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88наÑ\82а Ñ\80амнина",
+       "exif-focalplanexresolution": "Разделност на жаришната рамнина X",
+       "exif-focalplaneyresolution": "Разделност на жаришната рамнина Y",
+       "exif-focalplaneresolutionunit": "Единица за разделност на жаришната рамнина",
        "exif-subjectlocation": "Положба на субјектот",
        "exif-exposureindex": "Показател на изложувањето",
        "exif-sensingmethod": "Метод на сензорот",
        "exif-exposureprogram-2": "Нормален режим",
        "exif-exposureprogram-3": "Приоритет на блендата",
        "exif-exposureprogram-4": "Приоритет на затворачот",
-       "exif-exposureprogram-5": "Креативен режим (врз основа на потребната длабочина на острина)",
+       "exif-exposureprogram-5": "Креативен режим (врз основа на потребната длабочина на острината)",
        "exif-exposureprogram-6": "Спортски режим (на основа на што побрз затворач)",
        "exif-exposureprogram-7": "Портретен режим (за фотографии одблизу со заматена позадина)",
        "exif-exposureprogram-8": "Пејзажен режим (за фотографии на пејзажи со остра позадина)",
        "table_pager_limit": "Прикажи $1 записи по страница",
        "table_pager_limit_label": "Ставки по страница:",
        "table_pager_limit_submit": "Дај",
-       "table_pager_empty": "Нема резултати",
+       "table_pager_empty": "Нема исход",
        "autosumm-blank": "Целосно избришана страница",
        "autosumm-replace": "Ја заменувам страницата со '$1'",
        "autoredircomment": "Пренасочување кон [[$1]]",
        "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-user-not-exists": "<strong>$1</strong> не постои.",
        "htmlform-user-not-valid": "<strong>$1</strong> не претставува важечко корисничко име.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ја избриша}} страницата $3",
+       "logentry-delete-delete_redir": "$1 го {{GENDER:$2|избриша}} пренасочувањето $3 со презапишување",
        "logentry-delete-restore": "$1 {{GENDER:$2|ја возобнови}} страницата $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|преработка|$5 преработки}} на страницата $3: $4",
        "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-useragent": "Кориснички вршител:",
        "searchsuggest-search": "Пребарајте по {{SITENAME}}",
        "searchsuggest-containing": "содржи...",
-       "api-error-autoblocked": "Вашата IP-адреса е автоматски блокирана бидејќи ја има користено блокиран корисник.",
-       "api-error-badaccess-groups": "Не ви е дозволено да подигате податотеки на ова вики.",
        "api-error-badtoken": "Внатрешна грешка: неисправна шифра.",
-       "api-error-blocked": "Блокирани сте од уредување.",
-       "api-error-copyuploaddisabled": "Подигањата со URL се оневозможени на овој опслужувач.",
-       "api-error-duplicate": "Веќе {{PLURAL:$1|постои друга податотека|постојат други податотеки}} со истата содржина.",
-       "api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела друга податотека|постоеле други податотеки}} со истата содржина, но во меѓувреме {{PLURAL:$1|била избришана|биле избришани}}.",
-       "api-error-empty-file": "Поднесената податотека е празна.",
        "api-error-emptypage": "Создавањето на нови празни страници не е дозволено.",
-       "api-error-fetchfileerror": "Внатрешна грешка: нешто тргна наопаку при добивањето на податотеката.",
-       "api-error-fileexists-forbidden": "Веќе постои податотека наречена „$1“ и не може да се презапише.",
-       "api-error-fileexists-shared-forbidden": "Веќе постои податотека наречена „$1“ во заедничкото складиште и не може да се презапише.",
-       "api-error-file-too-large": "Поднесената податотека е преголема.",
-       "api-error-filename-tooshort": "Името на податотеката е прекратко.",
-       "api-error-filetype-banned": "Овој тип на податотека е забранет.",
-       "api-error-filetype-banned-type": "$1 не {{PLURAL:$4|е допуштен тип на податотека|се допуштени типови на податотека}}. {{PLURAL:$3|Допуштен е|Допуштени се}} $2.",
-       "api-error-filetype-missing": "На податотеката ѝ недостасува наставка.",
-       "api-error-hookaborted": "Измената што се обидовте да ја направите е откажана од пресретник за наставки.",
-       "api-error-http": "Внатрешна грешка: не можам да се поврзам со опслужувачот.",
-       "api-error-illegal-filename": "Податотеката има недозволено име.",
-       "api-error-internal-error": "Внатрешна грешка: нешто тргна наопаку при обработката на она што го подигате на викито.",
-       "api-error-invalid-file-key": "Внатрешна грешка: не ја пронајдов податотеката во привременото складиште.",
-       "api-error-missingparam": "Внатрешна грешка: недостасуваат параметри за барањето.",
-       "api-error-missingresult": "Внатрешна грешка: не можев да одредам дали копирањето заврши успешно.",
-       "api-error-mustbeloggedin": "Мора да сте најавени за да подигате податотеки.",
-       "api-error-mustbeposted": "Во програмов има грешка. Не користи исправен HTTP-метод.",
-       "api-error-noimageinfo": "Погидањето успеа, но опслужувачот не понуди никакви информации за податотеката.",
-       "api-error-nomodule": "Внатрешна грешка: нема зададено модул за подигање.",
-       "api-error-ok-but-empty": "Внатрешна грешка: опслужувачот не одговара.",
-       "api-error-overwrite": "Презапишувањето врз постоечки податотеки не е дозволено.",
-       "api-error-ratelimited": "Се обидувате да подигнете повеќе податотеки отколку што викито допушта за дадено време.\nОбидете се повторно за неколку минути.",
-       "api-error-stashfailed": "Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.",
        "api-error-publishfailed": "Внатрешна грешка: Опслужувачот не успеа да ја објави привремената податотека.",
-       "api-error-stasherror": "Се јави грешка при подигањето на податотеката во складот.",
-       "api-error-stashedfilenotfound": "Не ја најдов наплстената податотека при обидот да ја подигнам од пластот.",
-       "api-error-stashpathinvalid": "Патеката кајшто требаше да се најде складираната податотека е неважечка.",
-       "api-error-stashfilestorage": "Се јави грешка при ставањето на податотеката во складот.",
-       "api-error-stashzerolength": "Опслужувачот не можеше да ја складира податотеката бидејќи има нулта должина.",
-       "api-error-stashnotloggedin": "Мора да се најавени за да зачувувате податотеки во складот на подигнати.",
-       "api-error-stashwrongowner": "Податотеката во складот до која сакате да дојдете не ви припаѓа вам.",
-       "api-error-stashnosuchfilekey": "Клучот на податотеката во складот до кој сакате да дојдете не постои.",
-       "api-error-timeout": "Опслужувачот не одговори во очекуваното време.",
-       "api-error-unclassified": "Се појави непозната грешка.",
-       "api-error-unknown-code": "Непозната грешка: „$1“",
-       "api-error-unknown-error": "Внатрешна грешка: нешто тргна наопаку при обидот да ја подигнете податотеката.",
-       "api-error-unknown-warning": "Непознато предупредување: $1",
+       "api-error-stashfailed": "Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.",
+       "api-error-unknown-warning": "Непознато предупредување: „$1“",
        "api-error-unknownerror": "Непозната грешка: „$1“.",
-       "api-error-uploaddisabled": "Подигањето е оневозможено на ова вики.",
-       "api-error-verification-error": "Податотеката е оштетена или има погрешна наставка.",
-       "api-error-was-deleted": "Податотека со ова име веќе е подигана и потоа избришана.",
        "duration-seconds": "{{PLURAL:$1|една секунда|$1 секунди}}",
        "duration-minutes": "{{PLURAL:$1|една минута|$1 минути}}",
        "duration-hours": "{{PLURAL:$1|еден час|$1 часа}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|бајт|бајти}}",
        "limitreport-templateargumentsize": "Големина на аргументот во шаблонот",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|бајт|бајти}}",
-       "limitreport-expansiondepth": "Ð\9dаÑ\98голема Ð´Ð»Ð°Ð±Ð¾Ñ\87ина на проширувањето",
+       "limitreport-expansiondepth": "Ð\9dаÑ\98голема Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 на проширувањето",
        "limitreport-expensivefunctioncount": "Бр. на сложени расчленувачки функции",
        "expandtemplates": "Прошири шаблони",
        "expand_templates_intro": "Оваа службена страница зема еден текст и рекурзивно ги проширува сите шаблони во него.\nИсто така проширува и расчленувачки функции како\n<code><nowiki>{{</nowiki>#language:…}}</code> и променливи како\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nВсушност, го проширува сето она што стои во двојни аглести загради.",
        "pagelang-language": "Јазик",
        "pagelang-use-default": "Користи стандарден јазик",
        "pagelang-select-lang": "Одберете јазик",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Поднеси",
+       "pagelang-nonexistent-page": "Страницата $1 не постои.",
+       "pagelang-unchanged-language": "Страницата $1 е веќе наместена на јазикот $2.",
+       "pagelang-unchanged-language-default": "Страницата $1 е веќе наместена на матичниот содржински јазик на викито.",
+       "pagelang-db-failed": "Базата не успеа да го смени содржинскиот јазик.",
        "right-pagelang": "Менување јазик на страница",
        "action-pagelang": "менување јазик на страница",
        "log-name-pagelang": "Дневник на менување на јазикот",
        "mediastatistics-header-total": "Сите податотеки",
        "json-warn-trailing-comma": "{{PLURAL:$1|Отстранета е една завршна запирка|Отстранети се $1 завршни запирки}} од JSON",
        "json-error-unknown": "Се јави проблем со JSON. Грешка: $1.",
-       "json-error-depth": "Ð\9dадминаÑ\82а Ðµ Ð¼Ð°ÐºÑ\81ималнаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð´Ð»Ð°Ð±Ð¾Ñ\87ина на пластот",
+       "json-error-depth": "Ð\9dадминаÑ\82а Ðµ Ð½Ð°Ñ\98големаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 на пластот",
        "json-error-state-mismatch": "Неважечки или погрешно срочен JSON",
        "json-error-ctrl-char": "Грешка во контролниот знак. Можеби е неисправно кодиран",
        "json-error-syntax": "Синтаксна грешка",
        "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": "седници со колачиња",
        "sessionprovider-nocookies": "Колачињата може да се оневозможени. Ако е така, овозможете ги, и почнете одново.",
        "randomrootpage": "Случајна основна страница",
        "log-action-filter-block": "Тип на блок:",
-       "log-action-filter-contentmodel": "Тип Ð½Ð° Ð·мена на содржинскиот модел:",
+       "log-action-filter-contentmodel": "Тип Ð½Ð° Ð¿Ñ\80омена на содржинскиот модел:",
        "log-action-filter-delete": "Тип на бришење:",
        "log-action-filter-import": "Тип на увоз:",
        "log-action-filter-managetags": "Тип на дејство за управување со ознаки:",
        "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": "Бришење на преработка",
        "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>",
-       "edit-error-short": "Грешка: $1",
-       "edit-error-long": "Грешки:\n\n$1"
+       "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "revid": "преработка $1",
+       "pageid": "назнака на страницата $1"
 }
index cbb7d06..a1b4175 100644 (file)
@@ -30,7 +30,8 @@
                        "아라",
                        "Viswaprabha",
                        "Nesi",
-                       "Macofe"
+                       "Macofe",
+                       "Jameela P."
                ]
        },
        "tog-underline": "കണ്ണികൾക്ക് അടിവരയിടുക:",
        "passwordreset-emaildisabled": "ഈ വിക്കിയിൽ ഇമെയിൽ സൗകര്യങ്ങൾ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.",
        "passwordreset-username": "ഉപയോക്തൃനാമം:",
        "passwordreset-domain": "ഡൊമൈൻ:",
-       "passwordreset-capture": "ഫലമായുണ്ടാകുന്ന ഇമെയിൽ കാണണോ?",
-       "passwordreset-capture-help": "ഈ പെട്ടിയിൽ ശരി ചേർത്താൽ, ഉപയോക്താവിന് അയയ്ക്കുന്നതോടൊപ്പം ഇമെയിൽ (താത്കാലിക രഹസ്യവാക്കിനൊപ്പം) പ്രദർശിപ്പിക്കപ്പെടുന്നതാണ്.",
        "passwordreset-email": "ഇമെയിൽ വിലാസം:",
        "passwordreset-emailtitle": "{{SITENAME}} സംരംഭത്തിലെ അംഗത്വവിവരങ്ങൾ",
        "passwordreset-emailtext-ip": "ആരോ ഒരാൾ (മിക്കവാറും താങ്കളായിരിക്കും, $1 എന്ന ഐ.പി. വിലാസത്തിൽ നിന്നും) {{SITENAME}} സംരംഭത്തിലെ ($4) താങ്കളുടെ രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:\n\n$2\n\n\nഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.\nതാങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.",
        "minoredit": "ഇതൊരു ചെറിയ തിരുത്താണ്",
        "watchthis": "ഈ താളിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "savearticle": "താൾ സേവ് ചെയ്യുക",
+       "savechanges": "മാറ്റങ്ങൾ സേവ് ചെയ്യുക",
        "preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
        "searchprofile-advanced-tooltip": "തിരഞ്ഞെടുത്ത നാമമേഖലകളിൽ തിരച്ചിൽ നടത്തുവാൻ",
        "search-result-size": "$1 ({{PLURAL:$2|ഒരു വാക്ക്|$2 വാക്കുകൾ}})",
        "search-result-category-size": "{{PLURAL:$1|ഒരു അംഗം|$1 അംഗങ്ങൾ}} ({{PLURAL:$2|ഒരു ഉപവർഗ്ഗം|$2 ഉപവർഗ്ഗങ്ങൾ}}, {{PLURAL:$3|ഒരു പ്രമാണം|$3 പ്രമാണങ്ങൾ}})",
-       "search-redirect": "(തിരിച്ചുവിടൽ താൾ $1)",
+       "search-redirect": "($1 എന്ന താളിൽ നിന്ന് തിരിച്ചുവിട്ടത്)",
        "search-section": "(വിഭാഗം $1)",
        "search-category": "(വർഗ്ഗം $1)",
        "search-file-match": "(പ്രമാണ ഉള്ളടക്കവുമായി ഒത്തുപോകുന്നുണ്ട്)",
        "saveprefs": "സേവ് ചെയ്യുക",
        "restoreprefs": "സ്വതേയുള്ള ക്രമീകരണങ്ങൾ പുനഃസ്ഥാപിക്കുക (എല്ലാ ഭാഗങ്ങളിലേയും)",
        "prefs-editing": "തിരുത്തൽ",
-       "rows": "വരി:",
-       "columns": "നിര:",
        "searchresultshead": "തിരയൂ",
        "stub-threshold": "അപൂർണ്ണമായ കണ്ണിയെന്നു സ്ഥാപിക്കാനുള്ള ത്വരകം ($1):",
        "stub-threshold-sample-link": "സാമ്പിൾ",
        "prefs-help-recentchangescount": "പുതിയ മാറ്റങ്ങൾ, താളിന്റെ നാൾവഴികൾ, രേഖകൾ എന്നിവക്കും ഇത് ബാധകമാണ്.",
        "prefs-help-watchlist-token2": "ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ  പട്ടികയുടെ വെബ്‌ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.\nഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.\n[[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കണമെങ്കിൽ ഇവിടെ ഞെക്കുക]].",
        "savedprefs": "താങ്കളുടെ ക്രമീകരണങ്ങൾ കാത്തുസൂക്ഷിച്ചിരിക്കുന്നു.",
-       "savedrights": "{{GENDER:$1|$1}} à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dà´±àµ\86 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശങ്ങൾ സേവ് ചെയ്തിരിക്കുന്നു.",
+       "savedrights": "{{GENDER:$1|$1}} à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dà´±àµ\86 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´¸à´\82à´\98ങ്ങൾ സേവ് ചെയ്തിരിക്കുന്നു.",
        "timezonelegend": "സമയ മേഖല:",
        "localtime": "പ്രാദേശിക സമയം:",
        "timezoneuseserverdefault": "വിക്കിയിൽ സ്വതേയുള്ളത് ഉപയോഗിക്കുക ($1)",
        "userrights-reason": "കാരണം:",
        "userrights-no-interwiki": "മറ്റ് വിക്കികളിലെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുവാൻ താങ്കൾക്ക് അനുമതിയില്ല.",
        "userrights-nodatabase": "$1 എന്ന ഡാറ്റാബേസ് നിലവിലില്ല അല്ലെങ്കിൽ പ്രാദേശികമല്ല.",
-       "userrights-nologin": "ഉപയോക്താക്കൾക്ക് അവകാശങ്ങൾ കൊടുക്കണമെങ്കിൽ താങ്കൾ കാര്യനിർവാഹക അംഗത്വം ഉപയോഗിച്ച് [[Special:UserLogin|പ്രവേശിച്ചിരിക്കണം]].",
-       "userrights-notallowed": "ഉപയോക്താക്കൾക്ക് അവകാശങ്ങൾ കൊടുക്കാനും എടുത്തുകളയാനുമുള്ള അനുമതി താങ്കൾക്കില്ല.",
        "userrights-changeable-col": "താങ്കൾക്ക് മാറ്റാവുന്ന സംഘങ്ങൾ",
        "userrights-unchangeable-col": "താങ്കൾക്ക് മാറ്റാനാവാത്ത സംഘങ്ങൾ",
        "userrights-conflict": "ഉപയോക്തൃ അവകാശങ്ങളുടെ മാറ്റം സമരസപ്പെടായ്കയുണ്ടായി! ദയവായി താങ്കളുടെ മാറ്റങ്ങൾ വീണ്ടും സംശോധനം ചെയ്ത് സ്ഥിരീകരിച്ച് നടപ്പിലാക്കുക.",
-       "userrights-removed-self": "താങ്കൾ സ്വന്തം അവകാശങ്ങൾ സ്വയം ഒഴിവാക്കിയിരിക്കുന്നു. അതിനാൽ ഈ താൾ ഇനി താങ്കൾക്ക് ലഭ്യമായിരിക്കില്ല.",
        "group": "സംഘം:",
        "group-user": "ഉപയോക്താക്കൾ",
        "group-autoconfirmed": "യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾ",
        "right-siteadmin": "ഡേറ്റാബേസ് തുറക്കുക, പൂട്ടുക",
        "right-override-export-depth": "കണ്ണിവത്കരിക്കപ്പെട്ട താളുകളുടെ ആഴം 5 വരെയുള്ള താളുകൾ കയറ്റുമതി ചെയ്യുക",
        "right-sendemail": "മറ്റുപയോക്താക്കൾക്ക് ഇമെയിൽ അയയ്ക്കുക",
-       "right-passwordreset": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കാനുള്ള ഇമെയിലുകൾ കാണുക",
        "right-managechangetags": "ഡേറ്റാബേസിൽ നിന്നുള്ള [[Special:Tags|ടാഗുകൾ]] സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മായ്ക്കുക",
        "right-applychangetags": "മാറ്റങ്ങളോടൊപ്പം [[Special:Tags|ടാഗുകളും]] ബാധകമാക്കുക",
        "right-changetags": "ഒറ്റയൊറ്റ നാൾപ്പതിപ്പുകൾക്കും രേഖയിലെ ഉൾപ്പെടുത്തലുകൾക്കും ഐച്ഛിക [[Special:Tags|ടാഗുകൾ]] ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "recentchanges-legend-heading": "<strong>സൂചന:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
        "recentchanges-submit": "പ്രദർശിപ്പിക്കുക",
+       "rcfilters-filterlist-title": "അരിപ്പകൾ",
+       "rcfilters-filter-userExpLevel-newcomer-label": "പുതിയ അംഗങ്ങളുടെ തിരുത്തലുകൾ",
+       "rcfilters-filter-bots-label": "യന്ത്രം",
+       "rcfilters-filter-minor-label": "ചെറുതിരുത്തുകൾ",
        "rcnotefrom": "<strong>$3, $4</strong> മുതലുള്ള {{PLURAL:$5|മാറ്റം|മാറ്റങ്ങൾ}} ആണ് താഴെയുള്ളത്  (<strong>$1</strong> എണ്ണം വരെ കൊടുക്കുന്നതാണ്).",
        "rclistfrom": "$3 $2 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "rcshowhideminor": "ചെറുതിരുത്തലുകൾ $1",
        "uploaded-setting-handler-svg": "വിദൂര/ഡേറ്റ/സ്ക്രിപ്റ്റിനൊപ്പം \"handler\" ആട്രിബ്യൂട്ട് സജ്ജീകരിക്കുന്ന എസ്.വി.ജി. തടഞ്ഞിരിക്കുന്നു. അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>$1=\"$2\"</code> കണ്ടെത്തി.",
        "uploaded-remote-url-svg": "റിമോട്ട് യു.ആർ.എലിനൊപ്പം ഏതെങ്കിലും സ്റ്റൈൽ ആട്രിബ്യൂട്ട് സജ്ജീകരിക്കുന്ന എസ്.വി.ജി. തടഞ്ഞിരിക്കുന്നു. അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>$1=\"$2\"</code> കണ്ടെത്തി.",
        "uploaded-image-filter-svg": "യു.ആർ.എൽ. ഉൾപ്പെടെയുള്ള ചിത്ര അരിപ്പ : <code>&lt;$1 $2=\"$3\"&gt;</code>, അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. ചിത്രത്തിൽ കണ്ടെത്തി.",
-       "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"$1\" ഉണ്ട്",
+       "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"<nowiki>$1</nowiki>\" ഉണ്ട്",
        "uploadinvalidxml": "അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.",
        "uploadvirus": "പ്രമാണത്തിൽ വൈറസുണ്ട്! വിശദാംശങ്ങൾ: $1",
        "uploadjava": "ഇത്, ജാവ .class പ്രമാണങ്ങൾ അടക്കം ചെയ്തിട്ടുള്ള ഒരു സിപ് (ZIP) പ്രമാണം ആണ്.\nസുരക്ഷാതടയലുകൾ മറികടക്കാൻ കഴിയുമെന്ന കാരണത്താൽ ജാവ പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുന്നത് അനുവദിച്ചിട്ടില്ല.",
        "revdelete-restricted": "കാര്യനിർവാഹകർക്ക് പ്രവർത്തന അതിരുകൾ ഏർപ്പെടുത്തിയിരിക്കുന്നു",
        "revdelete-unrestricted": "കാര്യനിർവാഹകർക്ക് ഏർപ്പെടുത്തിയ പ്രവർത്തന അതിരുകൾ നീക്കം ചെയ്തിരിക്കുന്നു",
        "logentry-block-block": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
-       "logentry-block-unblock": "{{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
+       "logentry-block-unblock": "{{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ തടഞ്ഞത് $1 {{GENDER:$2|ഒഴിവാക്കിയിരിക്കുന്നു}}",
        "logentry-block-reblock": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തിന്റെ തടയൽ സജ്ജീകരണങ്ങൾ $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-suppress-block": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
        "logentry-suppress-reblock": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തിന്റെ തടയൽ സജ്ജീകരണങ്ങൾ $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "feedback-thanks": "നന്ദി! താങ്കളുടെ പ്രതികരണം \"[$2 $1]\" എന്ന താളിൽ പ്രസിദ്ധീകരിച്ചിട്ടുണ്ട്.",
        "feedback-thanks-title": "നന്ദി!",
        "feedback-useragent": "യൂസർ ഏജന്റ്:",
-       "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|അനുവദനീയമല്ലാത്ത തരം പ്രമാണമാണ്‌|അനുവദനീയമല്ലാത്ത തരങ്ങളിലുള്ള പ്രമാണങ്ങളാണ്}}. $2 {{PLURAL:$3|തരത്തിലുള്ള പ്രമാണം|തരങ്ങളിലുള്ള പ്രമാണങ്ങൾ}} ആണ് അഭിലഷണീയം.",
-       "api-error-filetype-missing": "പ്രമാണത്തിന് എക്സ്‌റ്റെൻഷൻ ഇല്ല.",
-       "api-error-hookaborted": "താങ്കൾ വരുത്താൻ ശ്രമിച്ച മാറ്റം ഒരു അനുബന്ധത്തിന്റെ കൊളുത്തിനാൽ റദ്ദാക്കപ്പെട്ടു.",
-       "api-error-http": "ആന്തരിക പിഴവ്: സെർവറുമായി ബന്ധപ്പെടാൻ കഴിയുന്നില്ല.",
-       "api-error-illegal-filename": "പ്രമാണത്തിന്റെ പേര് അനുവദനീയമല്ല.",
-       "api-error-internal-error": "ആന്തരിക പിഴവ്: താങ്കളുടെ അപ്‌ലോഡ് കൈകാര്യം ചെയ്തപ്പോൾ എന്തോ കുഴപ്പണ്ടായി.",
-       "api-error-invalid-file-key": "ആന്തരിക പിഴവ്: താത്കാലിക സംഭരണിയിൽ നിന്ന് പ്രമാണം കണ്ടെത്താനായില്ല.",
-       "api-error-missingparam": "ആന്തരിക പിഴവ്: ഈ അഭ്യർത്ഥനയിൽ ആവശ്യമായ ചരങ്ങൾ ലഭിച്ചില്ല.",
-       "api-error-missingresult": "ആന്തരിക പിഴവ്: പകർത്തൽ വിജയകരമായിരുന്നോ എന്ന് നിർണ്ണയിക്കാനാവുന്നില്ല.",
-       "api-error-mustbeloggedin": "പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യാൻ താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
-       "api-error-mustbeposted": "ഈ സോഫ്റ്റ്‌വേറിൽ ബഗ് ഉണ്ട്; ഉപയോഗിക്കുന്നത് ശരിയായ എച്ച്.റ്റി.റ്റി.പി. രീതിയല്ല.",
-       "api-error-noimageinfo": "അപ്‌ലോഡ് വിജയകരമായിരുന്നു, പക്ഷേ സെർവർ പ്രമാണത്തെക്കുറിച്ച് യാതൊരു വിവരവും ഇവിടെ തന്നിട്ടില്ല.",
-       "api-error-nomodule": "ആന്തരിക പിഴവ്: അപ്‌ലോഡ് ഘടകം സജ്ജമാക്കിയിട്ടില്ല.",
-       "api-error-ok-but-empty": "ആന്തരിക പിഴവ്: സെർവറിൽ നിന്ന് പ്രതികരണമൊന്നും ലഭിക്കുന്നില്ല.",
-       "api-error-overwrite": "നിലവിലുള്ള പ്രമാണത്തിന്റെ മുകളിൽ സ്ഥാപിക്കൽ അനുവദിച്ചിട്ടില്ല.",
-       "api-error-stashfailed": "ആന്തരിക പിഴവ്: പ്രമാണം താത്കാലികമായി സംഭരിക്കുന്നതിൽ സെർവർ പരാജയപ്പെട്ടു.",
        "api-error-publishfailed": "ആന്തരിക പിഴവ്: താത്കാലിക പ്രമാണം പ്രസിദ്ധീകരിക്കുന്നതിൽ സെർവർ പരാജയപ്പെട്ടു.",
-       "api-error-stasherror": "പ്രമാണം സ്റ്റാഷിലേയ്ക്ക് അപ്‌ലോഡ് ചെയ്യുന്നതിനിടെ പിഴവുണ്ടായി.",
-       "api-error-timeout": "പ്രതീക്ഷിക്കപ്പെട്ട കാലാവധിക്കുള്ളിൽ സെർവർ പ്രതികരിച്ചില്ല.",
-       "api-error-unclassified": "അപരിചിതമായ പിഴവ് സംഭവിച്ചിരിക്കുന്നു",
-       "api-error-unknown-code": "അപരിചിതമായ പിഴവ്: \"$1\"",
-       "api-error-unknown-error": "ആന്തരിക പിഴവ്: പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ ശ്രമിക്കുമ്പോൾ എന്തോ കുഴപ്പമുണ്ടായി.",
+       "api-error-stashfailed": "ആന്തരിക പിഴവ്: പ്രമാണം താത്കാലികമായി സംഭരിക്കുന്നതിൽ സെർവർ പരാജയപ്പെട്ടു.",
        "api-error-unknown-warning": "അപരിചിതമായ മുന്നറിയിപ്പ്: $1",
        "api-error-unknownerror": "അപരിചിതമായ പിഴവ്: \"$1\".",
-       "api-error-uploaddisabled": "ഈ വിക്കിയിൽ അപ്‌ലോഡിങ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുകയാണ്.",
-       "api-error-verification-error": "ഈ പ്രമാണത്തിൽ പിഴവുണ്ട്, അല്ലെങ്കിൽ തെറ്റായ എക്സ്‌റ്റെൻഷനാണുള്ളത്.",
        "duration-seconds": "{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}",
        "duration-minutes": "{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}",
        "duration-hours": "{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}",
        "pagelang-language": "ഭാഷ",
        "pagelang-use-default": "സ്വതേയുള്ള ഭാഷ ഉപയോഗിക്കുക",
        "pagelang-select-lang": "ഭാഷ തിരഞ്ഞെടുക്കുക",
+       "pagelang-reason": "കാരണം",
        "pagelang-submit": "സമർപ്പിക്കുക",
        "right-pagelang": "താളിന്റെ ഭാഷ മാറ്റുക",
        "action-pagelang": "താളിന്റെ ഭാഷ മാറ്റുക",
index ddc46f0..864bdeb 100644 (file)
@@ -92,7 +92,7 @@
        "tog-ccmeonemails": "मी इतर सदस्यांना पाठविलेल्या ई-मेल च्या प्रती मलाही माझ्या ई-मेल पत्त्यावर पाठवा",
        "tog-diffonly": "निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.",
        "tog-showhiddencats": "लपविलेले वर्ग दाखवा",
-       "tog-norollbackdiff": "दà¥\8dरà¥\81तमाà¤\98ार à¤\98à¥\87तलà¥\8dयास à¤¬à¤¦à¤² à¤µà¤\97ळा",
+       "tog-norollbackdiff": "दà¥\8dरà¥\81तमाà¤\98ार à¤\98à¥\87तलà¥\8dयास à¤«à¤°à¤\95 à¤¦à¤¾à¤\96वà¥\82 à¤¨à¤\95ा",
        "tog-useeditwarning": "जर मी संपादित करीत असलेल्या पानावरील माझे संपादिलेले बदल जतन न केल्यास मला इशारा द्या",
        "tog-prefershttps": "सनोंद प्रवेशित असतांना प्रत्येक वेळी  सुरक्षित अनुबंध वापरा",
        "underline-always": "नेहमी",
        "namespaces": "नामविश्वे",
        "variants": "चले(व्हेरियंट्स)",
        "navigation-heading": "दिक्चालन यादी",
-       "errorpagetitle": "à¤\9aà¥\82à¤\95",
+       "errorpagetitle": "तà¥\8dरà¥\81à¤\9fà¥\80",
        "returnto": "$1 कडे परत चला.",
        "tagline": "{{SITENAME}} कडून",
        "help": "साहाय्य",
        "search": "शोधा",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "शोधा",
        "go": "चला",
        "searcharticle": "जा",
        "history": "पानाचा इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "माझ्या शेवटच्या भेटीनंतर अद्यतन केले",
        "printableversion": "छापण्यायोग्य आवृत्ती",
        "permalink": "शाश्वत दुवा",
        "talk": "चर्चा",
        "views": "दृष्ये",
        "toolbox": "साधने",
+       "tool-link-userrights": "{{GENDER:$1|वापरकर्ता}} गट बदला",
        "tool-link-emailuser": "{{GENDER:$1|सदस्याला}} विपत्र पाठवा",
        "userpage": "सदस्य पृष्ठ",
        "projectpage": "प्रकल्प पान पहा",
        "password-change-forbidden": "तुम्ही या विकिवर तुमचा परवलीचा शब्द बदलू शकत नाही.",
        "externaldberror": "विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.",
        "login": "सनोंद-प्रवेश(लॉग-ईन)",
+       "login-security": "तुमची ओळख पटवा",
        "nav-login-createaccount": "सनोंद-प्रवेश / सदस्यखाते उघडा",
        "userlogin": "सनोंद-प्रवेश करा /सदस्यखाते उघडा",
        "userloginnocreate": "सनोंद-प्रवेश",
        "nocookieslogin": "{{SITENAME}} सदस्यांना सनोंद-प्रवेश देतांना, त्यांच्या स्मृतिशेष (cookies) वापरते.तुम्ही स्मृतिशेष सुविधा अनुपलब्ध ठेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा आणि सनोंद-प्रवेशासाठी पुन्हा प्रयत्न करा.",
        "nocookiesfornew": "हे सदस्य खाते अस्तित्वात नाही, त्यामुळे आम्ही त्याच्या स्रोताची खात्री करू शकलो नाही.\nतुमचे स्मृतिशेष उपलब्ध असण्याची खात्री करा,या पानास पुनर्भारण(रिलोड) करा  किंवा पुन्हा प्रयत्न करा.",
        "noname": "आपण वैध सदस्यनाम नमूद केले नाही.",
-       "loginsuccesstitle": "à¤\86पलà¥\8dया à¤¸à¤¨à¥\8bà¤\82द-पà¥\8dरवà¥\87शाà¤\9aà¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤¯à¤¶à¤¸à¥\8dवà¥\80रà¥\80तà¥\8dया à¤ªà¥\82रà¥\8dण à¤\9dालà¥\80",
+       "loginsuccesstitle": "सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शित",
        "loginsuccess": "'''तुम्ही {{SITENAME}} वर \"$1\" नावाने सनोंद प्रवेशित आहात.'''",
        "nosuchuser": "\"$1\" या नावाचा कोणताही सदस्य नाही.तुमचे शुद्धलेखन तपासा, किंवा [[Special:CreateAccount|नवीन खाते]] तयार करा.",
        "nosuchusershort": "\"$1\" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?",
        "newpassword": "नवीन परवलीचा शब्द:",
        "retypenew": "पुन्हा एकदा परवलीचा शब्द टंका:",
        "resetpass_submit": "परवलीचा शब्द टाका आणि सनोंद-प्रवेश करा",
-       "changepassword-success": "तà¥\81मà¤\9aा à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¯à¤¶à¤¸à¥\8dवà¥\80रितà¥\8dया à¤¬à¤¦à¤²à¤²à¥\87ला à¤\86हà¥\87!",
+       "changepassword-success": "तुमचा परवलीचा शब्द बदललेला आहे!",
        "changepassword-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "botpasswords": "सांगकाम्याचे परवलीचे शब्द",
        "botpasswords-summary": "<em>सांगकाम्याचे परवलीचे शब्द</em>हे त्या खात्याची मुख्य सनोंद-प्रवेश अधिकारपत्रे न वापरता, एपीआय मार्फत, सदस्य खात्याच्या प्रवेशास पोहोच देतात.सांगकाम्याचा परवलीचा शब्द वापरुन सनोंद प्रवेश केलेल्यांचे उपलब्ध सदस्य अधिकार प्रतिबंधित असू शकतात.\n\nजर आपणास कळत नसेल आपण हे कां करीत आहोत,तर आपण ते बहुतेक करावयास नको.कोणीही आपणास असे कधीही सांगु नये कि यापैकी एखादे उत्पादित करा व त्यांना द्या.",
        "passwordreset-emaildisabled": "या विकिवर विपत्र पाठविणे 'अशक्य' करण्यात आलेले आहे.",
        "passwordreset-username": "सदस्यनाव:",
        "passwordreset-domain": "डोमेन",
-       "passwordreset-capture": "ईमेल कशी असेल ते बघायचेय ?",
-       "passwordreset-capture-help": "या चौकटीत खूण केली तर, ईमेल (तात्पुरत्या परवलीच्या शब्दासह) दाखविण्यात व सदस्यास पाठविण्यात येईल.",
        "passwordreset-email": "विपत्र पत्ता",
        "passwordreset-emailtitle": "{{SITENAME}} वरील खात्याची माहिती",
        "passwordreset-emailtext-ip": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 वरुन) {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\"$2\"\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "watchthis": "या लेखावर लक्ष ठेवा",
        "savearticle": "हा लेख साठवा",
        "savechanges": "बदल जतन करा",
+       "publishpage": "पानाचे प्रकाशन करा",
        "publishchanges": "बदल प्रकाशित करा",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "saveprefs": "जतन करा",
        "restoreprefs": "सर्व अविचल(डिफॉल्ट) मांडणी पूर्ववत करा (सर्व विभागात)",
        "prefs-editing": "संपादन",
-       "rows": "ओळी:",
-       "columns": "स्तंभ:",
        "searchresultshead": "शोध",
        "stub-threshold": "रिकाम्या पानाच्या दुव्याची अध:सीमा (Threshold) ($1):",
        "stub-threshold-sample-link": "नमुना",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "इतर विकींवरचे सदस्य अधिकार बदलण्याची परवानगी तुम्हाला नाही.",
        "userrights-nodatabase": "विदा $1 अस्तित्वात नाही अथवा स्थानिक नाही.",
-       "userrights-nologin": "सदस्य अधिकार देण्यासाठी तुम्ही प्रबंधक म्हणून [[Special:UserLogin|सनोंद प्रवेशित]] असणे आवश्यक आहे.",
-       "userrights-notallowed": "तुमच्या सदस्य खात्यास, सदस्य अधिकारांची निश्चिती करण्याची परवानगी नाही.",
        "userrights-changeable-col": "गट जे तुम्ही बदलू शकता",
        "userrights-unchangeable-col": "गट जे तुम्ही बदलू शकत नाही",
        "userrights-conflict": "बदलाबाबत सदस्य-हक्क विसंवाद !कृपया आपले बदल पुन्हा पुनरावलोकित व नक्की करा.",
-       "userrights-removed-self": "आपण आपले हक्क यशस्वीरित्या काढलेत.म्हणुन, या पानात आपण दाखल होऊ शकणार नाही.",
        "group": "गट:",
        "group-user": "सदस्य",
        "group-autoconfirmed": "स्वयंशाबीत सदस्य",
        "right-siteadmin": "माहितीसाठ्याला कुलूप लावा अथवा काढा",
        "right-override-export-depth": "जोडलेल्या पानांचा पाचव्या पातळीपर्यंत अंतर्भाव करुन पाने निर्यात करा",
        "right-sendemail": "इतर सदस्यांना विपत्रे पाठवा",
-       "right-passwordreset": "परवलीचा शब्द पुनर्स्थापित केल्याचे विपत्र पहा.",
        "right-managechangetags": "डाटाबेस मधून [[Special:Tags|खूणपताका]] तयार करा किंवा  वगळा",
        "right-applychangetags": "कोणाच्याही बदलास [[Special:Tags|खूणपताका]] जोडा",
        "right-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) [[Special:Tags|खूणपताका]] जोडा अथवा हटवा",
        "grant-generic": "\"$1\" अधिकार गठ्ठा",
        "grant-group-email": "विपत्र पाठवा",
-       "grant-blockusers": "सदसà¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धन/अप्रतिबंधित करा",
+       "grant-blockusers": "सदसà¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धित/अप्रतिबंधित करा",
        "grant-createaccount": "खाते तयार करा",
        "grant-createeditmovepage": "पाने बनवा,संपादा व स्थानांतरण करा",
        "grant-delete": "पाने, आवृत्त्या व नोंदी वगळा",
        "grant-editinterface": "मिडियाविकि नामविश्व व सदस्यांची CSS/JS संपादा",
-       "grant-editmycssjs": "à¤\86पलà¥\87 सदस्य CSS/JavaScript संपादित करा",
+       "grant-editmycssjs": "à¤\86पलà¥\80 सदस्य CSS/JavaScript संपादित करा",
        "grant-editmyoptions": "आपला सदस्य पसंतीक्रम संपादा",
        "grant-editmywatchlist": "आपली निरीक्षणयादी संपादित करा",
        "grant-editpage": "अस्तित्वात असलेली पाने संपादा",
        "grant-highvolume": "अत्त्युच्च-जागा घेणारे संपादन",
        "grant-oversight": "सदस्य लपवा व आवृत्त्या दाबा",
        "grant-patrol": "पानांच्या बदलांवर गस्त घाला",
+       "grant-privateinfo": "वैयक्तिक माहिती बघा",
        "grant-protect": "पाने सुरक्षित किंवा असुरक्षित करा",
-       "grant-rollback": "पानाचे बदल परतवा",
+       "grant-rollback": "पानाà¤\82à¤\9aà¥\87 à¤¬à¤¦à¤² à¤ªà¤°à¤¤à¤µà¤¾",
        "grant-sendemail": "इतर सदस्यांना विपत्र पाठवा",
+       "grant-uploadeditmovefile": "संचिकांचे अपभारण, बदल व स्थानांतरण करा",
+       "grant-uploadfile": "नविन संचिका चढवा",
        "grant-basic": "मूळ अधिकार",
        "grant-viewdeleted": "वगळलेल्या संचिका व पाने बघा",
        "grant-viewmywatchlist": "आपली निरीक्षणसूची बघा",
+       "grant-viewrestrictedlogs": "प्रतिबंधित लॉग नोंदी बघा",
        "newuserlogpage": "नवीन सदस्यांची नोंद",
        "newuserlogpagetext": "ही नवीन सदस्यांची नोंद यादी आहे.",
        "rightslog": "सदस्य आधिकार नोंद",
        "action-upload_by_url": "यूआरएल वरुन संचिकेचे अपभारण करा",
        "action-writeapi": "लेखन एपीआय वापरा",
        "action-delete": "हे पान वगळा",
-       "action-deleterevision": "हे आवर्तन वगळा",
-       "action-deletedhistory": "या पानाचा वगळलेला इतिहास पहा",
+       "action-deleterevision": "आवर्तने वगळा",
+       "action-deletelogentry": "लॉग प्रविष्ट्या वगळा",
+       "action-deletedhistory": "एखाद्या पानाचा वगळलेला इतिहास पहा",
+       "action-deletedtext": "वगळलेल्या आवृत्तीतील मजकूर बघा",
        "action-browsearchive": "वगळलेली पाने शोधा",
-       "action-undelete": "वà¤\97ळà¥\8dलà¥\87लà¥\87 à¤ªà¥\83षà¥\8dठ पुनर्स्थापित करा",
-       "action-suppressrevision": "लपलà¥\87लà¥\87 à¤ªà¥\81नरावरà¥\8dतन à¤ªà¤¹à¤¾ à¤µ à¤¸à¤¦à¥\8dयसà¥\8dथितà¥\80त à¤\86णा",
+       "action-undelete": "वà¤\97ळà¥\8dलà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\80 पुनर्स्थापित करा",
+       "action-suppressrevision": "लपविलà¥\87लà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤ªà¤¹à¤¾ à¤µ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रा",
        "action-suppressionlog": "ही खासगी नोंद पहा",
        "action-block": "या सदस्यास संपादन करण्यापासून प्रतिबंधित करा",
        "action-protect": "या पानाचा सुरक्षास्तर बदला",
        "action-userrights-interwiki": "इतर विकिंवरच्या सदस्यांचे अधिकार संपादित करा",
        "action-siteadmin": "माहितीसाठ्याला कुलूप लावा अथवा काढा",
        "action-sendemail": "विपत्रे (ई-मेल्स) पाठवा.",
+       "action-editmyoptions": "आपल्या स्वत:चा 'पसंतीक्रम' संपादा",
        "action-editmywatchlist": "'माझी निरीक्षणसूची' संपादा",
        "action-viewmywatchlist": "'माझी निरीक्षणसूची' बघा",
        "action-viewmyprivateinfo": "आपली वैयक्तिक माहिती बघा",
        "action-editmyprivateinfo": "आपली वैयक्तिक माहिती संपादा",
        "action-editcontentmodel": "पानाचा आशय नमूना संपादा",
-       "action-managechangetags": "डाà¤\9fाबà¥\87समधà¥\8dयà¥\87 à¤\96à¥\82णपतà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रा à¤\95िà¤\82वा à¤µà¤\97ळा",
+       "action-managechangetags": "à¤\96à¥\82णपताà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रा à¤\95िà¤\82वा (à¤\85)सà¤\95à¥\8dरिय à¤\95रा",
        "action-applychangetags": "आपल्या बदलांसोबतच खूणपताका जोडा",
        "action-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) खूणपताका जोडा अथवा हटवा",
+       "action-deletechangetags": "डाटाबेसमधून खूणपताका वगळा",
+       "action-purge": "या पानास तरोताजे (पर्ज) करा",
        "nchanges": "$1 {{PLURAL:$1|बदल}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|मागील भेटीनंतर}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "recentchanges-submit": "दाखवा",
+       "rcfilters-activefilters": "सक्रिय गाळण्या",
+       "rcfilters-search-placeholder": "अलीकडील बदल गाळा (न्याहाळा किंवा टंकन सुरू करा)",
+       "rcfilters-invalid-filter": "अवैध गाळणी",
+       "rcfilters-filterlist-title": "गाळण्या",
+       "rcfilters-filterlist-noresults": "कोणतीच गाळणी सापडली नाही",
+       "rcfilters-filtergroup-registration": "सदस्य नोंदणी",
+       "rcfilters-filter-registered-label": "नोंदणीकृत",
+       "rcfilters-filter-registered-description": "प्रवेशलेले सदस्य",
+       "rcfilters-filter-unregistered-label": "अ-नोंदणीकृत",
+       "rcfilters-filter-unregistered-description": "संपादक जे प्रवेशित नाहीत.",
+       "rcfilters-filtergroup-authorship": "संपादनाचा लेखक",
+       "rcfilters-filter-editsbyself-label": "आपली स्वत:ची संपादने",
+       "rcfilters-filter-editsbyself-description": "आपली संपादने",
+       "rcfilters-filter-editsbyother-label": "इतरांची संपादने",
+       "rcfilters-filter-editsbyother-description": "इतर सदस्यांनी तयार केलेली संपादने (आपण नाही).",
+       "rcfilters-filtergroup-userExpLevel": "अनुभवाचा स्तर (फक्त नोंदणीकृत सदस्यांसाठीच)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "नवागत",
+       "rcfilters-filter-userExpLevel-newcomer-description": "१० संपादनांपेक्षा कमी व ४ दिवसांची सक्रियता.",
+       "rcfilters-filter-userExpLevel-learner-label": "शिकाऊ",
        "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
        "rclistfrom": "$2,$3 पासून सुरुवात करुन, नविन केल्या गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "upload-scripted-pi-callback": "ज्या संचिकेत XML-stylesheet च्या प्रक्रियेचे अनुदेश असतील अशी संचिकेचे अपभारण करु शकत नाही.",
        "uploaded-script-svg": "अपभारीलेल्या SVG संचिकेत,\"$1\" हे लेखनीय अवयव आढळले.",
        "uploaded-hostile-svg": "अपभारीलेल्या SVG संचिकेत,असुरक्षित CSS स्टाईल अवयव आढळले.",
-       "uploadscriptednamespace": "या SVG संचिकेत \"$1\" हे अवैध नामविश्व आहे.",
+       "uploadscriptednamespace": "या SVG संचिकेत \"<nowiki>$1</nowiki>\" हे अवैध नामविश्व आहे.",
        "uploadinvalidxml": "अपभारीत संचिकेतील XML पार्स करता आले नाही.",
        "uploadvirus": "या संचिकेत विषाणू(व्हायरस) आहे. अधिक माहिती: $1",
        "uploadjava": "ही फाईल झीप ह्या प्रकारातील आहे ज्यामधे जावा .क्लास फाईल. आहे,जावा फाईलचे अपभारणास परवानगी नाही कारण त्याने सुरक्षा-बंधने टाळल्या जाऊ शकतात.",
        "apisandbox-intro": "<strong>मिडियाविकि वेब सर्व्हीस एपीआय</strong> वर प्रयोग करण्यासाठी या पानाचा वापर करा. एपीआय वापरण्याच्या अधिक तपशिलासाठी  [[mw:API:Main page| एपीआय दस्ताऐवजीकरण]] हे पान बघा. उदाहरणार्थ:[https://www.mediawiki.org/wiki/API#A_simple_example मुख्य पानाचा आशय मिळवा]. अधिक उदाहरणे बघण्यास एखादी क्रिया निवडा.\n\nयाची नोंद घ्या कि ही धूळपाटी असली तरी, या पानावर आपण केलेल्या क्रियांद्वारे विकिवर फेरफार होऊ शकतो.",
        "apisandbox-submit": "विनंती करा",
        "apisandbox-reset": "हटवा",
-       "apisandbox-examples": "उदाहरण",
+       "apisandbox-examples": "उदाहरण",
        "apisandbox-results": "निकाल",
        "apisandbox-request-url-label": "'यूआरएल'ची विनंती करा:",
-       "apisandbox-request-time": "विनंती वेळ:$1",
+       "apisandbox-request-time": "विनंती वेळ:{{PLURAL:$1|$1 मिलीसेकंद}}",
        "booksources": "पुस्तक स्रोत",
        "booksources-search-legend": "पुस्तक स्रोत शोधा",
        "booksources-search": "शोधा",
        "listgrants": "अनुदाने",
        "listgrants-grant": "अनुदान",
        "listgrants-rights": "अधिकार",
-       "trackingcategories": "वर्ग शोधत आहोत",
-       "trackingcategories-summary": "या पानात ते रेखापथनातील वर्ग(tracking categories) आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {{ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
+       "trackingcategories": "मागोवा घेणारे वर्ग",
+       "trackingcategories-summary": "या पानात ते मागोवा घेणारे वर्ग (tracking categories) आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {{ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
+       "trackingcategories-msg": "मागोवा घेणारा वर्ग",
        "trackingcategories-name": "संदेश नाम",
        "trackingcategories-desc": "वर्ग अंतर्भूत करण्याचे निकष",
+       "restricted-displaytitle-ignored-desc": "या पानात दुर्लक्षित <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> आहे कारण ते पानाच्या मूळ शीर्षकासम नाही.",
+       "noindex-category-desc": "हे पान सांगकाम्यांद्वारे अनुक्रमित नाही कारण त्यात <code><nowiki>__NOINDEX__</nowiki></code> हा जादुई शब्द आहे व ते त्या नामविश्वात आहे, जेथे या खूणपताकेची परवानगी आहे.",
+       "index-category-desc": "या पानात <code><nowiki>__INDEX__</nowiki></code> ही खूणपताका आहे (व ते अश्या नामविश्वात आहे जेथे या खूणपताकेची परवानगी आहे), आणि म्हणून ही सांगकाम्यांद्वारे अनुक्रमित आहे, जेथे ती सामान्यपणे असावयास नको.",
+       "post-expand-template-inclusion-category-desc": "येथील सर्व साच्यांचा विस्तार केल्यावर, या पानाचा आकार <code>$wgMaxArticleSize</code> पेक्षा जास्त मोठा झाला आहे, म्हणून काही साचे विस्तारल्या गेले नाहीत.",
+       "broken-file-category-desc": "या पानात तुटलेला संचिका-दुवा आहे (तो दुवा, जो अस्तित्वात नसलेल्या संचिकेस जोडण्याचा प्रयत्न करतो).",
+       "hidden-category-category-desc": "या वर्गाच्या आशय मजकूरात <code><nowiki>__HIDDENCAT__</nowiki></code> ही खूणपताका आहे, जी त्या पानास, पानांसाठी   असलेल्या वर्गदुवेपेटीत दिसण्यापासून अविचलरित्या रोखते.",
        "trackingcategories-nodesc": "वर्णन उपलब्ध नाही.",
        "trackingcategories-disabled": "वर्ग अक्षम केल्या गेला आहे",
        "mailnologin": "पाठविण्याचा पत्ता नाही",
        "created": "तयार केले",
        "changed": "बदलले",
        "deletepage": "पान वगळा",
-       "confirm": "निश्चीत",
+       "confirm": "निश्चीत करा",
        "excontent": "मजकूर होता: '$1'",
        "excontentauthor": "मजकूर होता: \"$1\" आणि फक्त [[Special:Contributions/$2|$2]]  ([[User talk:$2|चर्चा]])यांचेच योगदान होते.",
        "exbeforeblank": "वगळण्यापूर्वीचा मजकूर पुढीलप्रमाणे: '$1'",
        "modifiedarticleprotection": "\"[[$1]]\"करिता सुरक्षापातळी बदलली",
        "unprotectedarticle": "\"[[$1]]\" असुरक्षित केला.",
        "movedarticleprotection": "सुरक्षापातळी \"[[$2]]\" येथून \"[[$1]]\" येथे हलवली.",
+       "protectedarticle-comment": "\"[[$1]]\" ला {{GENDER:$2|ने संरक्षित केले}}",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" ची {{GENDER:$2| ने संरक्षण पातळी बदलली}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" ची {{GENDER:$2| ने सुरक्षा हटविली}}",
        "protect-title": "\"$1\" सुरक्षित करत आहे",
        "protect-title-notallowed": "\"$1\" ची सुरक्षा पातळी पहा",
        "prot_1movedto2": "\"[[$1]]\" हे पान \"[[$2]]\" मथळ्याखाली स्थानांतरित केले.",
        "pageinfo-display-title": "दृश्य शीर्षक",
        "pageinfo-default-sort": "डिफॉल्ट निवड-कळ (सॉर्ट कि)",
        "pageinfo-length": "पानाचा आकार (बाइट्समध्ये)",
-       "pageinfo-article-id": "पà¥\83षà¥\8dठ-परिà¤\9aय",
-       "pageinfo-language": "पानाच्या मजकूराची भाषा",
-       "pageinfo-content-model": "पान आशय नमूना",
+       "pageinfo-article-id": "पà¥\83षà¥\8dठ-à¤\93ळà¤\96ण",
+       "pageinfo-language": "पान-आशय भाषा",
+       "pageinfo-content-model": "पान-आशय नमूना",
        "pageinfo-content-model-change": "बदला",
-       "pageinfo-robot-policy": "यà¤\82तà¥\8dरमानवादà¥\8dवारà¥\87 à¤\85नà¥\81à¤\95à¥\8dरमन",
+       "pageinfo-robot-policy": "यà¤\82तà¥\8dरमानवाà¤\82दà¥\8dवारà¥\87 à¤\85नà¥\81à¤\95à¥\8dरमण",
        "pageinfo-robot-index": "अनुमती दिली",
        "pageinfo-robot-noindex": "अनुमती दिल्या जात नाही",
        "pageinfo-watchers": "पानावर पहारा देणाऱ्यांची संख्या",
+       "pageinfo-visiting-watchers": "या पानात झालेल्या अलीकडील संपादनांना पहारा देणाऱ्यांची संख्या",
        "pageinfo-few-watchers": "$1 पेक्षा कमी {{PLURAL:$1|पहारेदार}}",
        "pageinfo-redirects-name": "या पानास असलेली  पुनर्निर्देशनांची संख्या",
-       "pageinfo-subpages-name": "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤\89प-पान",
+       "pageinfo-subpages-name": "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\89प-पानà¥\87",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देशन|पुनर्निर्देशने}}; $3 {{PLURAL:$3|अ-पुनर्निर्देशन|अ-पुनर्निर्देशने}})",
-       "pageinfo-firstuser": "पà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमानक",
+       "pageinfo-firstuser": "पà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमाणक",
        "pageinfo-firsttime": "पान निर्मितीचा दिनांक",
        "pageinfo-lastuser": "अलीकडील संपादक",
        "pageinfo-lasttime": "अलीकडिल संपादनाचा दिनांक",
        "pageinfo-edits": "एकूण संपादने",
        "pageinfo-authors": "सुस्पष्ट-लेखकांची एकुण संख्या",
-       "pageinfo-recent-edits": "सध्याची संपादनसंख्या (मागील $1 मध्ये)",
+       "pageinfo-recent-edits": "सध्याची संपादनसंख्या (मागील $1)",
        "pageinfo-recent-authors": "सुस्पष्ट लेखकांची सध्या असलेली संख्या",
        "pageinfo-magic-words": "जादुई {{PLURAL:$1|शब्द}} ($1)",
        "pageinfo-hidden-categories": "लपविलेले {{PLURAL:$1|वर्ग}} ($1)",
        "pageinfo-category-pages": "पानांची संख्या",
        "pageinfo-category-subcats": "उपवर्गांची संख्या",
        "pageinfo-category-files": "संचिकांची संख्या",
+       "pageinfo-user-id": "सदस्य ओळखण",
        "markaspatrolleddiff": "टेहळणी केल्याची खूण करा",
        "markaspatrolledtext": "या पानावर गस्त झाल्याची खूण करा",
        "markaspatrolledtext-file": "या संचिकेच्या आवृत्तीस गस्त घातली म्हणून् खूण करा",
        "watchlistedit-raw-done": "तुमची पहाऱ्याची सूची परिष्कृत करण्यात आली आहे.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} भर घातली:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} वगळले:",
-       "watchlistedit-clear-title": "निरà¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80 à¤¸à¤¾à¤« à¤\95à¥\87लà¥\80",
+       "watchlistedit-clear-title": "निरà¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80 à¤¸à¤¾à¤« à¤\95रा",
        "watchlistedit-clear-legend": "निरीक्षणसूची साफ करा",
-       "watchlistedit-clear-explain": "à¤\86पलà¥\8dया à¤¨à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤¸à¤°à¥\8dव à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¤\9fविलà¥\8dया à¤\9cातà¥\80ल.",
+       "watchlistedit-clear-explain": "आपल्या निरीक्षणसूचीतील सर्व शिर्षक हटविल्या जातील.",
        "watchlistedit-clear-titles": "शिर्षके:",
        "watchlistedit-clear-submit": "निरीक्षणसूची साफ करा(हे कायमस्वरुपी आहे!)",
        "watchlistedit-clear-done": "तुमची पहाऱ्याची सूची स्वच्छ करण्यात आली आहे.",
        "feedback-useragent": "सदस्य प्रतिनीधी:",
        "searchsuggest-search": "शोधा {{SITENAME}}",
        "searchsuggest-containing": ".......हे असलेले",
-       "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "api-error-badtoken": "अंतर्गत चूक: अयोग्य टोकन",
-       "api-error-copyuploaddisabled": "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
-       "api-error-duplicate": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहेत.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहे परंतु{{PLURAL:$1|ते वगळल्या गेले|ती वगळल्या गेलीत}}",
-       "api-error-empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "api-error-emptypage": "नवीन आणि मोकळी पाने बनवायला परवानगी नाही",
-       "api-error-fetchfileerror": "अंतर्गत चूक: फाइल मिळवतांना काहीतरी चूक झाली आहे",
-       "api-error-fileexists-forbidden": "\"$1\" या नावाची संचिका पूर्वीच उपलब्ध आहे व त्यावर पुनर्लेखन करता येऊ शकत नाही.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" या नावाची संचिका, 'सहभागी संचिका भांडारात' पूर्वीच उपलब्ध आहे,व त्यावर पुनर्लेखन करता येऊ शकत नाही.",
-       "api-error-file-too-large": "तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप मोठी होती.",
-       "api-error-filename-tooshort": "संचिकेचे नाव खूपच छोटे आहे.",
-       "api-error-filetype-banned": "याप्रकारची संचिका प्रतिबंधित आहे.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|हा परवानगी नसलेला  संचिका-प्रकार आहे|या परवानगी नसलेल्या संचिका-प्रकार आहेत}}. $2 {{PLURAL:$3|हा परवानगी असलेला संचिका-प्रकार आहे|या परवानगी असलेल्या संचिका-प्रकार आहेत}}.",
-       "api-error-filetype-missing": "या संचिकेस विस्तार(एक्सटेंशन) नाही.",
-       "api-error-hookaborted": "तुम्ही केलेला बदल extension ने उलटवला आहे",
-       "api-error-http": "अंतर्गत त्रुटी: सर्व्हरशी जोडणी होऊ शकली नाही.",
-       "api-error-illegal-filename": "हे संचिकानाम प्रतिबंधित आहे.",
-       "api-error-internal-error": "अंतर्गत त्रुटी:आपण विकिवर चढविलेल्या संचिकेवर प्रक्रिया करतांना काहीतरी चुकले आहे.",
-       "api-error-invalid-file-key": "अंतर्गत त्रुटी: तात्पुरत्या साठवणीत संचिका सापडली नाही.",
-       "api-error-missingparam": "अंतर्गत चूक: मागणीतील काही नोंदी राहून गेल्या आहेत",
-       "api-error-missingresult": "आंतरिक त्रुटी : प्रत यशस्वी झाली की नाही हे ठरवता  येत नाही",
-       "api-error-mustbeloggedin": "संचिका चढविण्यासाठी आपण दाखल होणे जरुरी आहे.",
-       "api-error-mustbeposted": "अंतर्गत चूक: मागणी पूर्ण करण्यासाठी HTTP POST असायला हवे",
-       "api-error-noimageinfo": "डाटा अपलोड यशस्वी झाले आहे पण सर्व्हर कडून तशी माहिती अजून मिळाली नाही",
-       "api-error-nomodule": "अंतर्गत चूक: module set चढवलेला नाही",
-       "api-error-ok-but-empty": "आंतरिक त्रुटी : विदादाता प्रतिक्रिया देत नहीं",
-       "api-error-overwrite": "अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.",
-       "api-error-ratelimited": "आपण, हा विकी परवानगी देत असल्यापेक्षा अधिक संचिका, कमी कालावधीत अपभारणाचा प्रयत्न करीत आहात.\nकाही मिनिटांनी पुन्हा प्रयत्न करा.",
-       "api-error-stashfailed": "इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी",
        "api-error-publishfailed": "अंतर्गत त्रुटी:विदादात्यास, या तात्पुरत्या संचिकेच्या प्रकाशनास अपयश आले.",
-       "api-error-stasherror": "स्टॅचमध्ये ही संचिका अपभारणात त्रुटी आली.",
-       "api-error-timeout": "अपेक्षित वेळेत विदागार (server)ने प्रतिसाद दिला नाही.",
-       "api-error-unclassified": "एक अज्ञात चूक उद्भवली.",
-       "api-error-unknown-code": "अज्ञात त्रुटी: \"$1\"",
-       "api-error-unknown-error": "अंतर्गत त्रुटी:आपली संचिका चढवितांना काहीतरी चुकले आहे.",
+       "api-error-stashfailed": "इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी",
        "api-error-unknown-warning": "अज्ञात इशारा : $1",
        "api-error-unknownerror": "अज्ञात चूक $1",
-       "api-error-uploaddisabled": "चढवण्याचे कार्य ह्या विकिवर अवरुद्ध करण्यात आले आहे",
-       "api-error-verification-error": "ही संचिका भ्रष्ट(करप्ट) झाली किंवा चुकीचा विस्तार(एक्सटेंशन) असलेली असू शकते.",
        "duration-seconds": "$1 {{PLURAL:$1|सेकंदापूर्वी|सेकंदांपूर्वी}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनिटापूर्वी|मिनिटांपूर्वी}}",
        "duration-hours": "$1 {{PLURAL:$1|तासापूर्वी|तासांपूर्वी}}",
        "randomrootpage": "अविशिष्ट मूळ पान",
        "log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे",
        "changecredentials": "अधिकारपत्रे (क्रेडेंटियल्स)बदला",
-       "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा",
-       "edit-error-short": "त्रुटी: $1",
-       "edit-error-long": "त्रुटी:$1"
+       "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा"
 }
index 0a5267d..865fa33 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Tambahkan laman-laman dan fail-fail yang saya sunting ke dalam senarai pantau saya",
        "tog-watchmoves": "Tambahkan laman-laman dan fail-fail yang saya pindah ke dalam senarai pantau saya",
        "tog-watchdeletion": "Tambahkan laman-laman dan fail-fail yang saya hapuskan ke dalam senarai pantau saya",
+       "tog-watchuploads": "Tambahkan fail baru yang saya muat naik ke senarai pantauan",
        "tog-watchrollback": "Tambahkan laman-laman yang saya undurkan ke dalam senarai pantau saya",
        "tog-minordefault": "Tandakan semua suntingan sebagai kecil secara lalai",
        "tog-previewontop": "Tunjukkan pralihat di atas kotak sunting",
@@ -49,7 +50,7 @@
        "tog-enotifminoredits": "Juga e-melkan saya untuk suntingan-suntingan laman dan fail yang kecil",
        "tog-enotifrevealaddr": "Serlahkan alamat e-mel saya dalam e-mel pemberitahuan",
        "tog-shownumberswatching": "Tunjukkan bilangan pemantau",
-       "tog-oldsig": "Tanda tangan yang sedia ada:",
+       "tog-oldsig": "Tandatangan yang sedia ada:",
        "tog-fancysig": "Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)",
        "tog-uselivepreview": "Gunakan prebiu langsung",
        "tog-forceeditsummary": "Tanya saya jika ringkasan suntingan kosong",
        "october-date": "$1 Oktober",
        "november-date": "$1 November",
        "december-date": "$1 Disember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
        "category_header": "Laman-laman dalam kategori \"$1\"",
        "subcategories": "Subkategori",
        "category-file-count-limited": "$1 fail berikut terdapat dalam kategori ini.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Laman terindeks",
-       "noindex-category": "Laman tak diindeks",
+       "noindex-category": "Laman tak diindekskan",
        "broken-file-category": "Laman yang ada pautan fail yang terputus",
        "about": "Perihal",
        "article": "Laman kandungan",
        "newwindow": "(dibuka di tetingkap baru)",
        "cancel": "Batal",
        "moredotdotdot": "Lagi...",
-       "morenotlisted": "Senarai ini tidak lengkap.",
+       "morenotlisted": "Senarai ini mungkin tidak lengkap.",
        "mypage": "Halaman",
        "mytalk": "Perbincangan",
        "anontalk": "Perbincangan",
        "searcharticle": "Pergi",
        "history": "Sejarah laman",
        "history_short": "Sejarah",
+       "history_small": "sejarah",
        "updatedmarker": "dikemaskinikan sejak kunjungan terakhir saya",
        "printableversion": "Versi boleh cetak",
        "permalink": "Pautan kekal",
        "talk": "Perbincangan",
        "views": "Rupa",
        "toolbox": "Peralatan",
+       "tool-link-userrights": "Tukar kumpulan {{GENDER:$1|pengguna}}",
+       "tool-link-userrights-readonly": "Lihat kumpulan {{GENDER:$1|pengguna}}",
+       "tool-link-emailuser": "Email {{GENDER:$1|pengguna}} ini",
        "userpage": "Lihat laman pengguna",
        "projectpage": "Lihat laman projek",
        "imagepage": "Lihat laman fail",
        "databaseerror-query": "Pertanyaan: $1",
        "databaseerror-function": "Fungsi: $1",
        "databaseerror-error": "Ralat: $1",
-       "transaction-duration-limit-exceeded": "Demi mengelakkan terjadinya jeda pengulangan yang tinggi, transaksi ini dibatalkan kerana tempoh menulis ($1) telah melebihi had $2 saat.",
+       "transaction-duration-limit-exceeded": "Demi mengelakkan terjadinya kelewatan pengulangan yang tinggi, transaksi ini dibatalkan kerana tempoh menulis ($1) telah melebihi had $2 saat.",
        "laggedslavemode": "Amaran: Laman ini mungkin bukan yang terkini.",
        "readonly": "Pangkalan data dikunci",
        "enterlockreason": "Sila nyatakan sebab penguncian dan jangkaan\nbila kunci ini akan dibuka.",
        "virus-scanfailed": "pengimbasan gagal (kod $1)",
        "virus-unknownscanner": "antivirus tidak dikenali:",
        "logouttext": "'''Anda telah log keluar.'''\n\nSila ingat bahawa sesetengah halaman mungkin masih dipaparkan seolah-olah anda masih log masuk hingga anda memadamkan cache pelayar anda.",
+       "cannotlogoutnow-title": "Tidak boleh melog keluar sekarang",
+       "cannotlogoutnow-text": "Melog keluar tidak boleh dilakukan apabila menggunakan $1",
        "welcomeuser": "Selamat datang, $1!",
        "welcomecreation-msg": "Akaun anda telah dibuka.\nJangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]].",
        "yourname": "Nama pengguna:",
        "createacct-yourpasswordagain-ph": "Isikan kata laluan semula",
        "userlogin-remembermypassword": "Biar saya kekal log masuk",
        "userlogin-signwithsecure": "Gunakan sambungan terlindung",
+       "cannotlogin-title": "Tidak boleh melog masuk",
+       "cannotlogin-text": "Tidak mungkin boleh melog masuk.",
+       "cannotloginnow-title": "Tidak boleh melog masuk sekarang",
+       "cannotloginnow-text": "Melog masuk tidak boleh dilakukan apabila menggunakan $1",
+       "cannotcreateaccount-title": "Tidak boleh mencipta akaun",
+       "cannotcreateaccount-text": "Penciptaan akaun langsung tidak diaktifkan di wiki ini.",
        "yourdomainname": "Domain anda:",
        "password-change-forbidden": "Anda tidak dapat mengubah kata laluan di wiki ini.",
        "externaldberror": "Berlaku ralat pangkalan data bagi pengesahan luar atau anda tidak dibenarkan mengemaskinikan akaun luar anda.",
        "login": "Log masuk",
+       "login-security": "Mengesahkan identiti anda",
        "nav-login-createaccount": "Log masuk / buka akaun",
        "userlogin": "Log masuk / buka akaun",
        "userloginnocreate": "Log masuk",
        "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.",
+       "userlogin-reauth": "Anda mesti log masuk sekali lagi untuk mengesahkan bahawa anda adalah {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Buka satu lagi akaun",
        "createacct-emailrequired": "Alamat e-mel",
        "createacct-emailoptional": "Alamat e-mel (pilihan)",
        "createacct-email-ph": "Isikan alamt e-mel anda",
        "createacct-another-email-ph": "Masukkan alamat e-mel",
        "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",
        "createacct-submit": "Wujudkan akaun anda",
        "createacct-another-submit": "Buka akaun",
+       "createacct-continue-submit": "Teruskan penciptaan akaun",
+       "createacct-another-continue-submit": "Teruskan penciptaan akaun",
        "createacct-benefit-heading": "{{SITENAME}} dijayakan oleh orang ramai seperti anda.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntingan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
        "nocookieslogin": "{{SITENAME}} menggunakan ''cookies'' untuk mencatat status log masuk pengguna. Sila aktifkan sokongan ''cookies'' pada pelayar anda dan cuba lagi.",
        "nocookiesfornew": "Akaun pengguna tidak dicipta kerana kami tidak dapat sahkan sumbernya.\nPastikan anda telah bolehkan kuki, muat semula laman ini dan cuba lagi.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Akaun ini telah berjaya dicipta tetapi anda tidak boleh log masuk secara automatik. Sila ke [[Special:UserLogin|log masuk manual]].",
        "noname": "Nama pengguna tidak sah.",
-       "loginsuccesstitle": "Berjaya log masuk",
+       "loginsuccesstitle": "Berjaya melog masuk",
        "loginsuccess": "'''Anda telah log masuk ke dalam {{SITENAME}} sebagai \"$1\".'''",
-       "nosuchuser": "Pengguna \"$1\" tidak wujud. Nama pengguna adalah peka huruf besar. Sila semak ejaan anda, atau anda boleh [[Special:CreateAccount|membuka akaun baru]].",
+       "nosuchuser": "Tiada pengguna yang menggunakan nama \"$1\".\nNama pengguna adalah kes sensitif.\nSemak ejaan anda, atau sila [[Special:CreateAccount|membuka akaun baru]].",
        "nosuchusershort": "Pengguna \"$1\" tidak wujud. Sila semak ejaan anda.",
        "nouserspecified": "Sila nyatakan nama pengguna.",
        "login-userblocked": "Pengguna ini disekat. Log masuk tidak dibenarkan.",
        "noemail": "Tiada alamat e-mel direkodkan bagi pengguna \"$1\".",
        "noemailcreate": "Anda perlu memberikan alamat e-mel sah",
        "passwordsent": "Kata laluan baru telah dikirim kepada alamat\ne-mel yang didaftarkan oleh \"$1\".\nSila log masuk semula setelah anda menerima e-mel tersebut.",
-       "blocked-mailpassword": "Alamat IP anda telah disekat daripada sebarang penyuntingan, oleh itu, untuk\nmengelak penyalahgunaan, anda tidak dibenarkan menggunakan ciri pemulihan kata laluan.",
+       "blocked-mailpassword": "Alamat IP anda disekat dari menyunting. Untuk mengelakkan penyalahgunaan, ia tidak dibenarkan untuk menggunakan pemulihan kata laluan dari alamat IP ini.",
        "eauthentsent": "Sepucuk e-mel pengesahan telah dikirim kepada alamat e-mel yang dinyatakan.\nSebelum e-mel lain boleh dikirim kepada alamat tersebut, anda perlu mematuhi arahan-arahan pada e-mel pengesahan tersebut untuk mengesahkan bahawa alamat tersebut benar-benar kepunyaan anda.",
        "throttled-mailpassword": "E-mel set semula kata laluan telah dihantar dalam tempoh $1 jam yang lalu.\nUntuk mencegah salah guna, hanya sepucuk e-mel set semula kata laluan dihantar setiap {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Ralat ketika mengirim e-mel: $1",
-       "acct_creation_throttle_hit": "Pengunjung wiki ini yang menggunakan alamat IP anda telah membuka sebanyak $1 akaun semenjak sehari lepas, iaitu merupakan had maksimum yang dibenarkan dalam tempoh tersebut.\nAkibatknya, pengunjung dari alamat IP ini tidak boleh membuka akaun lagi pada masa sekarang.",
+       "acct_creation_throttle_hit": "Pelawat yang datang ke wiki ini menggunakan alamat IP anda telah mencipta $1 akaun dalam $2 terakhir, iaitu maksimum yang dibenarkan dalam tempoh masa ini.\nHasilnya, pelawat menggunakan alamat IP ini tidak boleh membuat apa-apa lebih akaun pada masa ini.",
        "emailauthenticated": "Alamat e-mel anda telah disahkan pada $2, $3.",
        "emailnotauthenticated": "Alamat e-mel anda belum disahkan. Oleh itu, e-mel tidak boleh dikirim bagi ciri-ciri berikut.",
        "noemailprefs": "Anda perlu menetapkan alamat e-mel terlebih dahulu untuk menggunakan ciri-ciri ini.",
        "createaccount-title": "Pembukaan akaun {{SITENAME}}",
        "createaccount-text": "Seseorang telah membuka akaun untuk\nalamat e-mel anda di {{SITENAME}} ($4) dengan nama \"$2\" dan kata laluan \"$3\".\nAnda boleh log masuk dan tukar kata laluan anda sekarang.\n\nSila abaikan mesej ini jika anda tidak meminta untuk membuka akaun tersebut.",
        "login-throttled": "Anda telah mencuba log masuk berulang kali.\nSila tunggu $1 dan cuba lagi.",
-       "login-abort-generic": "Log masuk anda tidak berjaya, dan terpaksa dibatalkan",
+       "login-abort-generic": "Log masuk anda tidak berjaya - Dibatalkan",
        "login-migrated-generic": "Akaun anda telah dipindahkan dan nama pengguna anda tidak lagi wujud di wiki ini.",
        "loginlanguagelabel": "Bahasa: $1",
        "suspicious-userlogout": "Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.",
        "createacct-another-realname-tip": "Nama sebenar adalah tidak wajib.\nJika anda memilih untuk menyatakannya, ini akan digunakan untuk memberikan atribusi kepada pengguna atas sumbangan mereka.",
        "pt-login": "Log masuk",
        "pt-login-button": "Log masuk",
+       "pt-login-continue-button": "Teruskan melog masuk",
        "pt-createaccount": "Buka akaun",
        "pt-userlogout": "Log keluar",
        "php-mail-error-unknown": "Ralat tak diketahui dalam fungsi mail() PHP",
        "newpassword": "Kata laluan baru:",
        "retypenew": "Ulangi kata laluan baru:",
        "resetpass_submit": "Tetapkan kata laluan dan log masuk",
-       "changepassword-success": "Kata laluan anda berjaya ditukar!",
+       "changepassword-success": "Kata laluan anda sudah ditukar!",
        "changepassword-throttled": "Anda telah melakukan terlalu banyak cubaan log masuk baru-baru ini.\nSila tunggu $1 dan cuba lagi.",
+       "botpasswords": "Kata laluan bot",
+       "botpasswords-summary": "<em>Kata laluan bot</em> membenarkan akses kepada akaun pengguna melalui API tanpa menggunakan butiran log masuk utama akaun. Hak-hak pengguna yang apabila log masuk dengan kata laluan bot mungkin terhad.\n\nJika anda tidak tahu mengapa anda mungkin mahu untuk melakukan ini, anda perlu mungkin tidak melakukannya. Tiada siapa yang pernah meminta kepada kamu untuk menjana satu ini dan memberikannya kepada mereka.",
+       "botpasswords-disabled": "Kata laluan bot dilumpuhkan.",
+       "botpasswords-no-central-id": "Untuk menggunakan kata laluan bot, anda mesti log masuk ke akaun berpusat.",
+       "botpasswords-existing": "Kata laluan bot yang sedia ada",
+       "botpasswords-createnew": "Buat kata laluan bot baru",
+       "botpasswords-editexisting": "Ubah kata laluan bot yang sedia ada",
+       "botpasswords-label-appid": "Nama bot:",
+       "botpasswords-label-create": "Cipta",
+       "botpasswords-label-update": "Kemas kini",
+       "botpasswords-label-cancel": "Batalkan",
+       "botpasswords-label-delete": "Hapuskan",
+       "botpasswords-label-resetpassword": "Set semula kata laluan",
+       "botpasswords-label-grants": "Pemberian berkenaan:",
        "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",
        "passwordreset-emaildisabled": "Ciri-ciri e-mel telah dipadamkan di wiki ini.",
        "passwordreset-username": "Nama pengguna:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Lihat e-mel yang terhasil?",
-       "passwordreset-capture-help": "Jika anda menandai ruang ini, e-mel (yang membawa kata laluan sementara) akan ditunjukkan kepada anda dan juga dihantar kepada pengguna itu.",
        "passwordreset-email": "Alamat e-mel:",
        "passwordreset-emailtitle": "Butiran akaun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Seseorang (mungkin anda, dari alamat IP $1) telah memohon supaya kata laluan diset semula untuk {{SITENAME}} anda ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut\ndikaitkan dengan alamat e-mel ini:\n\n$2\n\n{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa $5 hari. Anda harus log masuk dan membuat kata laluan yang baru sekarang. Jika permohonan ini dibuat oleh orang lain, atau jika anda teringat kembali kata laluan asal anda dan anda tidak lagi berhasrat untuk mengubahnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.",
        "saveprefs": "Simpan",
        "restoreprefs": "Pulihkan semua tetapan asali (dalam semua bahagian)",
        "prefs-editing": "Menyunting",
-       "rows": "Baris:",
-       "columns": "Lajur:",
        "searchresultshead": "Cari",
        "stub-threshold": "Ambang untuk pemformatan pautan tunas ($1):",
        "stub-threshold-sample-link": "contoh",
        "userrights-reason": "Sebab:",
        "userrights-no-interwiki": "Anda tidak mempunyai keizinan untuk mengubah hak-hak pengguna di wiki lain.",
        "userrights-nodatabase": "Pangkalan data $1 tiada atau bukan tempatan.",
-       "userrights-nologin": "Anda mesti [[Special:UserLogin|log masuk]] dengan akaun penyelia terlebih dahulu untuk memperuntukkan hak-hak pengguna.",
-       "userrights-notallowed": "Akuan anda tidak dibenarkan untuk menambah atau membuang hak pengguna.",
        "userrights-changeable-col": "Kumpulan yang anda boleh ubah",
        "userrights-unchangeable-col": "Kumpulan yang anda tak boleh ubah",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Percanggahan perubahan hak pengguna! Sila semak dan sahkan perubahan anda.",
-       "userrights-removed-self": "Anda telah berjaya menggugurkan hak-hak sendiri. Oleh yang demikian, anda tidak boleh mengakses halaman ini lagi.",
        "group": "Kumpulan:",
        "group-user": "Pengguna",
        "group-autoconfirmed": "Pengguna sah automatik",
        "right-siteadmin": "Mengunci dan membuka kunci pangkalan data",
        "right-override-export-depth": "Mengeksport laman termasuk laman dipaut sehingga kedalaman 5",
        "right-sendemail": "Mengirim e-mel kepada pengguna-pengguna lain",
-       "right-passwordreset": "Lihat e-mel set semula kata laluan",
        "right-managechangetags": "Mencipta dan menghapuskan [[Special:Tags|teg]] dari pangkalan data",
        "right-applychangetags": "Mengenakan [[Special:Tags|teg]] di samping suntingan seseorang",
        "right-changetags": "Menambah dan menggugurkan [[Special:Tags|teg]] yang dikenakan sembarangan pada semakan dan entri log individu",
        "uploaded-setting-handler-svg": "SVG yang menentukan atribut \"handler\" dengan remote/data/script disekat. Terdapat <code>$1=\"$2\"</code> dalam fail SVG yang dimuat naik.",
        "uploaded-remote-url-svg": "SVG yang menetapkan sebarang atribut style dengan URL luar dikekang. <code>$1=\"$2\"</code> ditemui di dalam fail SVG yang dimuat naik.",
        "uploaded-image-filter-svg": "Terdapat penapis imej dengan URL: <code>&lt;$1 $2=\"$3\"&gt;</code> dalam fail SVG yang dimuat naik.",
-       "uploadscriptednamespace": "Fail SVG ini mengandungi ruang nama terlarang \"$1\"",
+       "uploadscriptednamespace": "Fail SVG ini mengandungi ruang nama terlarang \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML dalam fail yang dimuat naik ini tidak dapat dihuraikan.",
        "uploadvirus": "Fail tersebut mengandungi virus! Butiran: $1",
        "uploadjava": "Fail ini ialah fail ZIP yang mengandungi fail .class Java.\nMemuat naik fail Java tidak dibenarkan, kerana boleh menyebabkan sekatan keselamatan dipintas.",
        "feedback-useragent": "Ejen pengguna:",
        "searchsuggest-search": "Cari",
        "searchsuggest-containing": "mengandungi...",
-       "api-error-badaccess-groups": "Anda tidak dibenarkan memuat naik fail di wiki ini.",
        "api-error-badtoken": "Ralat dalaman: token tak elok.",
-       "api-error-copyuploaddisabled": "Ciri memuat naik melalui URL dimatikan di pelayan ini.",
-       "api-error-duplicate": "Di tapak ini sudah ada {{PLURAL:$1|satu fail lain|fail-fail lain}} yang sama kandungannya.",
-       "api-error-duplicate-archive": "Di tapak ini pernah ada {{PLURAL:$1|satu fail lain|fail-fail lain}} yang sama kandungannya, tetapi telah dihapuskan.",
-       "api-error-empty-file": "Fail yang anda serahkan adalah kosong.",
        "api-error-emptypage": "Anda tidak dibenarkan membuat laman baru yang kosong.",
-       "api-error-fetchfileerror": "Ralat dalaman: ada malasah ketika mengambil fail itu.",
-       "api-error-fileexists-forbidden": "Fail bernama \"$1\" sudah wujud, dan tidak boleh ditulis ganti.",
-       "api-error-fileexists-shared-forbidden": "Fail bernama \"$1\" sudah wujud dalam repositori fail kongsian, dan tidak boleh ditulis ganti.",
-       "api-error-file-too-large": "Fail yang anda serahkan adalah terlalu besar.",
-       "api-error-filename-tooshort": "Nama fail ini terlalu pendek.",
-       "api-error-filetype-banned": "Fail jenis ini adalah dilarang.",
-       "api-error-filetype-banned-type": "$1 merupakan {{PLURAL:$4|jenis|jenis-jenis}} fail yang dilarang. {{PLURAL:$3|Jenis|Jenis-jenis}} fail yang dibenarkan ialah $2.",
-       "api-error-filetype-missing": "Fail ini tiada sambungannya.",
-       "api-error-hookaborted": "Pengubahsuaian yang anda buat telah disekat oleh cangkuk sambungan.",
-       "api-error-http": "Ralat dalaman: tidak dapat bersambung dengan pelayan.",
-       "api-error-illegal-filename": "Nama fail ini tidak dibenarkan.",
-       "api-error-internal-error": "Ralat dalaman: ada masalah ketika memproseskan muat naik anda di wiki ini.",
-       "api-error-invalid-file-key": "Ralat dalaman: fail tidak dijumpai dalam storan sementara.",
-       "api-error-missingparam": "Ralat dalaman: kekosongan parameter pada permohonan.",
-       "api-error-missingresult": "Ralat dalaman: tidak dapat ditentukan sama ada penyalinan berjaya.",
-       "api-error-mustbeloggedin": "Anda mesti log masuk untuk memuat naik fail.",
-       "api-error-mustbeposted": "Ralat dalaman: permohonan memerlukan POST HTTP.",
-       "api-error-noimageinfo": "Muat naik berjaya, tetapi pelayan tidak memberi kita sebarang maklumat tentang fail itu.",
-       "api-error-nomodule": "Ralat dalaman: tiada modul muat naik yang ditetapkan.",
-       "api-error-ok-but-empty": "Ralat dalaman: tiada gerak balas dari pelayan.",
-       "api-error-overwrite": "Menulis ganti fail yang telah wujud adalah tidak dibenarkan.",
-       "api-error-stashfailed": "Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.",
        "api-error-publishfailed": "Ralat dalaman: Pelayan tidak dapat menerbitkan fail sementara.",
-       "api-error-stasherror": "Terdapat ralat ketika menyimpan fail yang dimuat naik.",
-       "api-error-stashedfilenotfound": "Fail yang disimpan tidak dijumpai apabila cuba untuk memuat naik dari simpanan.",
-       "api-error-stashpathinvalid": "Laluan di mana fail disimpan sepatutnya didapati tidak sah.",
-       "api-error-stashfilestorage": "Terdapat ralat semasa menyimpan fail dalam simpanan.",
-       "api-error-stashzerolength": "Pelayan tidak dapat menyimpan fail, kerana ia mempunyai panjang sifar.",
-       "api-error-stashnotloggedin": "Anda mesti log masuk untuk menyimpan fail-fail dalam stor muat naik.",
-       "api-error-stashwrongowner": "Fail yang anda cuba akses dalam stor itu bukan milik anda.",
-       "api-error-stashnosuchfilekey": "Kunci fail yang anda cuba akses dalam stor itu tidak wujud.",
-       "api-error-timeout": "Pelayan tidak bergerak balas dalam tempoh yang diharapkan.",
-       "api-error-unclassified": "Berlakunya ralat yang tidak diketahui",
-       "api-error-unknown-code": "Ralat tidak diketahui: \"$1\"",
-       "api-error-unknown-error": "Ralat dalaman: ada masalah apabila cuba memuat naik fail anda.",
+       "api-error-stashfailed": "Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.",
        "api-error-unknown-warning": "Amaran tidak diketahui: $1",
        "api-error-unknownerror": "Ralat tidak dikenali: \"$1\".",
-       "api-error-uploaddisabled": "Ciri muat naik dimatikan di wiki ini.",
-       "api-error-verification-error": "Fail ini mungkin tercemar atau tersalah sambungannya.",
        "duration-seconds": "$1 saat",
        "duration-minutes": "$1 minit",
        "duration-hours": "$1 jam",
index db52b06..4166acc 100644 (file)
        "passwordreset-emaildisabled": "Karatteristiċi tal-posta elettronika ġew diżattivati fuq din il-wiki.",
        "passwordreset-username": "Isem l-utent:",
        "passwordreset-domain": "Dominju:",
-       "passwordreset-capture": "Ara l-kontenut tal-messaġġ?",
-       "passwordreset-capture-help": "Jekk tagħżel din il-kaxxa, l-indirizz elettroniku (bil-password temporanja) se jiġi muri lilek barra milli jintbagħat lill-utent.",
        "passwordreset-email": "Indirizz elettroniku:",
        "passwordreset-emailtitle": "Dettalji tal-kont fuq {{SITENAME}}",
        "passwordreset-emailtext-ip": "Xi ħadd (probabbilment int, mill-indirizz IP $1) għamel rikjesta sabiex jingħata password ġdida sabiex jaċċessa l-{{SITENAME}} ($4). L-{{PLURAL:$3|utent assoċjat|utenti assoċjati}} ma' dan l-indirizz elettroniku {{PLURAL:$3|huwa|huma}}:\n\n$2\n\n{{PLURAL:$3|Din il-password temporanja se tiskadi|Dawn il-passwords temporanji se jiskadu}} fi żmien {{PLURAL:$5|ġurnata|$5 jum}}. Inti għadek tidħol fil-kont tiegħek u tagħżel password ġdida issa. Jekk xi ħadd ieħor għamel din ir-rikjesta, jew jekk ftakart il-password oriġinali, u m'għadekx trid tbiddilha, inti tista' tinjora dan il-messaġġ u tibqa' tuża' l-password il-qadima.",
        "saveprefs": "Salva l-preferenzi",
        "restoreprefs": "Irkupra l-konfigurazzjoni oriġinali (fis-sezzjonijiet kollha)",
        "prefs-editing": "Modifiki",
-       "rows": "Fillieri:",
-       "columns": "Kolonni:",
        "searchresultshead": "Fittex",
        "stub-threshold": "Valur minimu għall-<a href=\"#\" class=\"stub\">ħoloq għall-abozzi</a>, f'bytes:",
        "stub-threshold-disabled": "Diżattivat",
        "userrights-reason": "Raġuni:",
        "userrights-no-interwiki": "M'għandekx permess tagħmel modifiki fid-drittijiet tal-utenti fuq siti oħrajn.",
        "userrights-nodatabase": "Id-Database $1 ma jeżistix jew inkella mhux database lokali.",
-       "userrights-nologin": "Sabiex tkun tista' tagħti drittijiet lill-utenti hemm bżonn li [[Special:UserLogin|tidħol]] bħala amministratur.",
-       "userrights-notallowed": "Il-kont tiegħek m'għandux il-permessi neċessarji li jżid jew ineħħi drittijiet tal-utent.",
        "userrights-changeable-col": "Gruppi li tista' tbiddel",
        "userrights-unchangeable-col": "Gruppi li ma tistax tbiddel",
-       "userrights-removed-self": "Neħħejt b'suċċess id-drittijiet tiegħek. B'hekk, m'għadekx tista' taċċessa din il-paġna.",
        "group": "Grupp:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti konfermati awtomatikament",
        "right-siteadmin": "Agħlaq u iftaħ id-database",
        "right-override-export-depth": "Jesporta paġni li jinkludu paġni b'ħoloq sa fond ta' 5",
        "right-sendemail": "Jibgħat ittri-e lil utenti oħra",
-       "right-passwordreset": "Jara l-messaġġi tal-impostazzjoni mill-ġdid tal-password",
        "right-managechangetags": "Joħloq u jħassar [[Special:Tags|tikketti]] mid-''database''",
        "right-applychangetags": "Japplika [[Special:Tags|tikketti]] flimkien mal-modifiki tiegħu",
        "right-changetags": "Iżid u jneħħi [[Special:Tags|tikketti]] partikulari f'reviżjonijiet u f'daħliet fir-reġistru",
        "uploaddisabledtext": "It-tlugħ ta' fajls mhuwiex attiv.",
        "php-uploaddisabledtext": "It-tlugħ tal-fajls permezz tal-PHP huwa diżattivat. Iċċekkja l-konfigurazzjoni ta' file_uploads.",
        "uploadscripted": "Dan il-fajl fih kodiċi ta' ''HTML'' u ''script'' li jista' jkun interpretat hażin mill-''web browser''.",
-       "uploadscriptednamespace": "Il-fajl SVG jinkludi spazju tal-isem \"$1\" li mhuwiex permess.",
+       "uploadscriptednamespace": "Il-fajl SVG jinkludi spazju tal-isem \"<nowiki>$1</nowiki>\" li mhuwiex permess.",
        "uploadinvalidxml": "L-XML fil-fajl imtella' ma setax jiġi analizzat.",
        "uploadvirus": "Dan il-fajl huwa infettat b'virus! Dettalji: $1",
        "uploadjava": "Il-fajl huwa fajl ZIP li jinkludi fajl .class tal-Java.\nIt-tlugħ ta' fajls tal-Java mhuwiex permess, minħabba li jistgħu jaqbżu restrizzjonijiet ta' sigurtà.",
        "feedback-useragent": "Aġent tal-utent:",
        "searchsuggest-search": "Fittex",
        "searchsuggest-containing": "li tinkludi...",
-       "api-error-badaccess-groups": "Mintix permess li ttella' fajls fuq din il-wiki.",
        "api-error-badtoken": "Żball intern: <em>Token</em> ħażin.",
-       "api-error-copyuploaddisabled": "It-tlugħ ta' fajls bl-użu tal-URL mhuwiex permess fuq dan is-server.",
-       "api-error-duplicate": "Hemm {{PLURAL:$1|fajl ieħor|xi fajls oħra}} diġà fuq dan is-sit bl-istess kontenut.",
-       "api-error-empty-file": "Il-fajl li bgħatt kien vojt.",
        "api-error-emptypage": "Mhuwiex permess il-ħolqien ta' paġna ġdida vojta.",
-       "api-error-fetchfileerror": "Żball intern: Kien hemm problema waqt il-kisba tal-fajl.",
-       "api-error-fileexists-forbidden": "Fajl bl-isem \"$1\" diġà jeżisti, u ma jistax jiġi miktub fuqu.",
-       "api-error-fileexists-shared-forbidden": "Fajl bl-isem \"$1\" diġà jeżisti fir-repożitorju maqsum u ma jistax jiġi miktub fuqu.",
-       "api-error-file-too-large": "Il-fajl magħżul huwa wisq kbir.",
-       "api-error-filename-tooshort": "L-isem tal-fajl huwa qasir wisq.",
-       "api-error-filetype-banned": "It-tip ta' fajl mhuwiex aċċettat.",
-       "api-error-filetype-missing": "L-isem tal-fajl jonqsu l-estensjoni.",
-       "api-error-http": "Żball intern: Mhuwiex possibbli li taqbad mas-server.",
-       "api-error-illegal-filename": "L-isem tal-fajl mhuwiex permess.",
-       "api-error-internal-error": "Żball intern: Xi ħaġa marret ħażina fl-ipproċessar tat-tlugħ tiegħek fuq din il-wiki.",
-       "api-error-invalid-file-key": "Żball intern: Il-fajl ma nstabx fil-ħażna temporanja.",
-       "api-error-missingparam": "Żball intern: Parametri tar-rikjesta nieqsa.",
-       "api-error-missingresult": "Żball intern: Mhuwiex magħruf jekk il-kopja rnexxietx.",
-       "api-error-mustbeloggedin": "Trid tkun fil-kont tiegħek sabiex ittella' fajls.",
-       "api-error-mustbeposted": "Żball intern: Ir-rikjesta għandha bżonn tal-HTTP POST.",
-       "api-error-noimageinfo": "It-tlugħ tal-fajl irnexxa, imma s-server ma ta lura l-ebda informazzjoni dwar il-fajl.",
-       "api-error-ok-but-empty": "Żball intern: L-ebda rispons mis-server.",
-       "api-error-overwrite": "Li tikteb fuq fajl diġà eżistenti mhuwiex permess.",
-       "api-error-stashfailed": "Żball intern: Is-server falla milli jżomm fajl temporanju.",
        "api-error-publishfailed": "Żball intern: Is-server falla milli jippubblika l-fajl temporanju.",
-       "api-error-timeout": "Is-server ma tax risposta lura fil-ħin previst.",
-       "api-error-unclassified": "Inqala żball mhux magħruf.",
-       "api-error-unknown-code": "Żball mhux magħruf: \"$1\".",
-       "api-error-unknown-error": "Żball intern: Xi ħaġa marret ħażin fit-tlugħ tal-fajl.",
+       "api-error-stashfailed": "Żball intern: Is-server falla milli jżomm fajl temporanju.",
        "api-error-unknown-warning": "Avviż mhux magħruf: \"$1\".",
        "api-error-unknownerror": "Żball mhux magħruf: \"$1\"",
-       "api-error-uploaddisabled": "It-tlugħ ta' fajls mhuwiex attivat fuq din il-wiki.",
-       "api-error-verification-error": "Dan il-fajl jista' jkun imħassar, jew għandu l-estensjoni l-ħażina.",
        "duration-seconds": "$1 {{PLURAL:$1|sekonda|sekondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|siegħa|sigħat}}",
index f0376cb..1555a31 100644 (file)
@@ -27,7 +27,7 @@
                ]
        },
        "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ -",
-       "tog-hideminor": "á\80\9cá\80\90á\80ºá\80\90á\80\9cá\80±á\80¬ á\80¡á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80¡á\80\9cá\80²á\80\99á\80»á\80¬á\80¸á\80\90á\80½á\80\84á\80º á\80¡á\80\9bá\80±á\80¸á\80\99á\80\80á\80¼á\80®á\80¸á\80\9eá\80\8aá\80ºá\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ ဝှက်ရန်",
+       "tog-hideminor": "á\80¡á\80\9bá\80±á\80¸á\80\99á\80\80á\80¼á\80®á\80¸á\80\9eá\80±á\80¬ á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\99á\80¾á\80¯á\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\9cá\80\90á\80ºá\80\90á\80\9cá\80±á\80¬ á\80¡á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80¡á\80\9cá\80²á\80\99á\80»á\80¬á\80¸á\80\99á\80¾ ဝှက်ရန်",
        "tog-hidepatrolled": "လတ်တလော အပြောင်းအလဲများတွင် ကင်းလှည့်တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "tog-newpageshidepatrolled": "စာမျက်နှာသစ်စာရင်းတွင် ကင်းလှည့်စာမျက်နှာများကို ဝှက်ရန်",
        "tog-hidecategorization": "စာမျက်နှာများ၏ ကဏ္ဍကို ဝှက်ရန်",
@@ -38,7 +38,7 @@
        "tog-editondblclick": "ကလစ်နှစ်ခါနှိပ်ပြီး စာမျက်နှာများအား ပြင်ဆင်ရန်",
        "tog-editsectiononrightclick": "အပိုင်းလိုက်ခေါင်းစဉ်များကို ညာကလစ်နှိပ်ခြင်းဖြင့် အပိုင်းလိုက် တည်းဖြတ်ခြင်းကို အသုံးပြုရန်",
        "tog-watchcreations": "ကျွန်ုပ်စတင်ရေးသားခဲ့သည့်စာမျက်နှာများနှင့် အပ်လုပ်တင်ခဲ့သည့် ဖိုင်များကို စောင့်​ကြည့်​စာ​ရင်း​ထဲ ပေါင်းထည့်ရန်",
-       "tog-watchdefault": "á\80\80á\80»á\80½á\80\94á\80ºá\80¯á\80\95á\80º á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\81á\80²á\80·á\80\9eá\80\8aá\80·á\80º á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\94á\80¾á\80\84á\80·á\80º á\80\96á\80­á\80¯á\80\84á\80ºá\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\80á\80¼á\80\8aá\80·á\80ºá\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸á\80\9eá\80­á\80¯á\80·  á\80\95á\80±á\80«á\80\84á\80ºá\80¸á\80\91á\80\8aá\80·á\80ºá\80\95á\80«á\81\8b",
+       "tog-watchdefault": "á\80\80á\80»á\80½á\80\94á\80ºá\80¯á\80\95á\80º á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\81á\80²á\80·á\80\9eá\80\8aá\80·á\80º á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\94á\80¾á\80\84á\80·á\80º á\80\96á\80­á\80¯á\80\84á\80ºá\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\80á\80¼á\80\8aá\80·á\80ºá\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸á\80\9eá\80­á\80¯á\80·  á\80\95á\80±á\80«á\80\84á\80ºá\80¸á\80\91á\80\8aá\80·á\80ºá\80\9bá\80\94á\80º",
        "tog-watchmoves": "ကျွန်ုပ်ရွှေ့လိုက်သော စာမျက်နှာများနှင့် ဖိုင်များကို စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်",
        "tog-watchdeletion": "ဖျက်လိုက်သောစာမျက်နှာများနှင့် ဖိုင်များကို စောင့်ကြည့်စာရင်သို့ ပေါင်းထည့်ရန်",
        "tog-watchuploads": "ကျွန်ုပ်တင်လိုက်သော ဖိုင်အသစ်များအား ကျွန်ုပ်၏ စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်",
@@ -57,9 +57,9 @@
        "tog-watchlisthideown": "ကျွန်ုပ်၏ တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
        "tog-watchlisthidebots": "ဘော့တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
        "tog-watchlisthideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
-       "tog-watchlisthideliu": "စောင့်ကြည့်စာရင်းမှ loggin ဝင်ထားသော အသုံးပြုသူတို့၏ တည်းဖြတ်မှုများကို ဝှက်ရန်",
+       "tog-watchlisthideliu": "စောင့်ကြည့်စာရင်းမှ log in ဝင်ထားသော အသုံးပြုသူတို့၏ တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "tog-watchlisthideanons": "စောင့်ကြည့်စာရင်းမှ အမည်မသိ အသုံးပြုသူများ၏ တည်းဖြတ်မှုများကို ဝှက်ရန်",
-       "tog-watchlisthidepatrolled": "patrolled တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
+       "tog-watchlisthidepatrolled": "စောင့်ကြည့်စစ်ဆေးထားသော တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
        "tog-watchlisthidecategorization": "စာမျက်နှာများ၏ ကဏ္ဍကို ဝှက်ရန်",
        "tog-ccmeonemails": "ကျွန်ုပ် အခြားအသုံးပြုသူများထံပို့သော အီးမေးမိတ္တူကို ကျွန်ုပ်ထံ ပြန်ပို့ရန်",
        "tog-diffonly": "ကွဲပြားမှုများအောက်ရှိ စာမျက်နှာတွင်ပါဝင်သည်များကို မပြပါနှင့်",
        "and": "&#32;နှင့်",
        "qbfind": "ရှာပါ",
        "qbbrowse": "ရှာဖွေလှန်လှောရန်",
-       "qbedit": "ပြင်​ဆင်​ရန်​",
+       "qbedit": "ပြင်ဆင်ရန်",
        "qbpageoptions": "ဤစာမျက်နှာ",
        "qbmyoptions": "ကျွန်ုပ် စာမျက်နှာများ",
        "faq": "မေးလေ့ရှိကြသည်များ",
        "help": "အ​ကူ​အ​ညီ​",
        "search": "ရှာဖွေရန်",
        "searchbutton": "ရှာဖွေရန်",
-       "go": "သွား​ပါ​",
-       "searcharticle": "သွား​ပါ​",
+       "go": "သွားပါ",
+       "searcharticle": "သွားပါ",
        "history": "စာမျက်နှာ ရာဇဝင်",
        "history_short": "ရာဇဝင်",
        "updatedmarker": "နောက်ဆုံးကြည့်ပြီးသည့်နောက်ပိုင်း တည်းဖြတ်ထားသည်။",
        "print": "ပရင့်",
        "view": "ကြည့်ရန်",
        "view-foreign": "$1 တွင် ကြည့်ရန်",
-       "edit": "ပြင်​ဆင်​ရန်​",
+       "edit": "ပြင်ဆင်ရန်",
        "create": "စတင်ရေးသားရန်",
+       "create-local": "ဒေသတွင်း ဖော်ပြချက် ထည့်ရန်",
        "editthispage": "ဤစာမျက်နှာကို ပြင်ရန်",
        "create-this-page": "ဤစာမျက်နှာကို စတင်ရေးသားရန်",
        "delete": "ဖျက်​ပါ​",
        "talk": "ဆွေးနွေးချက်",
        "views": "အမြင်ပုံစံများ",
        "toolbox": "ကိရိယာများ",
+       "tool-link-userrights": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို ပြောင်းလဲရန်",
+       "tool-link-userrights-readonly": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို ကြည့်ရန်",
+       "tool-link-emailuser": "ဤ{{GENDER:$1|အသုံးပြုသူ}}ကို အီးမေးပို့ရန်",
        "userpage": "အသုံးပြုသူ၏ စာမျက်နှာကို ကြည့်ရန်",
        "projectpage": "ပရောဂျက်စာမျက်နှာကို ကြည့်ရန်",
        "imagepage": "ဖိုင်စာမျက်နှာကိုကြည့်ရန်",
        "currentevents-url": "Project:လက်ရှိဖြစ်ရပ်များ",
        "disclaimers": "သတိပြုစရာများ",
        "disclaimerpage": "Project: အထွေထွေ သတိပြုဖွယ်",
-       "edithelp": "á\80\95á\80¼á\80\84á\80ºâ\80\8bá\80\86á\80\84á\80ºâ\80\8bá\80\9bá\80\94á\80º á\80¡â\80\8bá\80\80á\80°â\80\8bá\80¡â\80\8bá\80\8aá\80®â\80\8b",
+       "edithelp": "á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\81á\80¼á\80\84á\80ºá\80¸ á\80¡á\80\80á\80°á\80¡á\80\8aá\80®",
        "helppage-top-gethelp": "အကူအညီ",
        "mainpage": "ဗဟိုစာမျက်နှာ",
-       "mainpage-description": "ဗ​ဟို​စာ​မျက်​နှာ​",
+       "mainpage-description": "ဗဟိုစာမျက်နှာ",
        "policy-url": "Project:မူဝါဒ",
        "portal": "ပေါင်းကူးနေရာ",
        "portal-url": "Project:ပေါင်းကူးနေရာ",
        "newmessageslinkplural": "{{PLURAL:$1|စာလွှာအသစ် တစ်စောင်|999=စာလွှာ အသစ်များ}}",
        "newmessagesdifflinkplural": "နောက်ဆုံး {{PLURAL:$1|ပြောင်းလဲမှု|999=ပြောင်းလဲမှုများ}}",
        "youhavenewmessagesmulti": "$1 မှာ စာတိုအသစ်များ ရှိသည်",
-       "editsection": "ပြင်​ဆင်​ရန်​",
-       "editold": "ပြင်​ဆင်​ရန်​",
+       "editsection": "ပြင်ဆင်ရန်",
+       "editold": "ပြင်ဆင်ရန်",
        "viewsourceold": "ရင်းမြစ်ကို ကြည့်ရန်",
-       "editlink": "ပြင်​ဆင်​ရန်",
+       "editlink": "ပြင်ဆင်ရန်",
        "viewsourcelink": "ရင်းမြစ်ကို ကြည့်ရန်",
        "editsectionhint": "ဤအပိုင်းကို တည်းဖြတ်ရန် - $1",
        "toc": "မာတိကာ",
        "red-link-title": "$1 (စာမျက်နှာ မရှိသေးပါ)",
        "sort-descending": "အစဉ်လိုက်စီရန်",
        "sort-ascending": "အစဉ်လိုက် ပြောင်းပြန်စီရန်",
-       "nstab-main": "စာ​မျက်​နှာ​",
-       "nstab-user": "အ​သုံး​ပြု​သူ​၏ ​စာ​မျက်​နှာ​",
+       "nstab-main": "စာမျက်နှာ",
+       "nstab-user": "အသုံးပြုသူ စာမျက်နှာ",
        "nstab-media": "မီဒီယာ စာမျက်နှာ",
        "nstab-special": "အထူး စာမျက်နှာ",
        "nstab-project": "ပရောဂျက်စာမျက်နှာ",
        "retypenew": "စကားဝှက် အသစ်ကို ထပ်ရိုက်ပါ -",
        "resetpass_submit": "စကားဝှက်ကို သတ်မှတ်ပြီးနောက် Log in ဝင်ရန်",
        "changepassword-success": "သင့်စကားဝှက်ကို ပြောင်းလဲပြီးပါပြီ!",
+       "botpasswords": "ဘော့ စကားဝှက်များ",
        "botpasswords-label-appid": "ဘော့အမည်-",
        "botpasswords-label-create": "ဖန်တီး",
        "botpasswords-label-cancel": "မလုပ်တော့ပါ",
        "revdelete-confirm": "ဤသို့ ဖျက်ပစ်ရန် သင် အမှန်တကယ် ရည်ရွယ်လျက် နောက်ဆက်တွဲ အကျိုးဆက်များကို သိရှိနားလည်ပြီး [[{{MediaWiki:Policy-url}}|မူဝါဒ]]အတိုင်း လုပ်ဆောင်နေခြင်းဖြစ်ကြောင်းကို ကျေးဇူးပြု၍ အတည်ပြုပေးပါ။",
        "revdelete-legend": "မြင်နိုင်စွမ်းရှိမှုတို့အား ကန့်သတ်ခြင်းကို သတ်မှတ်ရန်",
        "revdelete-hide-text": "တည်းဖြတ်မူမှ စာသား",
-       "revdelete-hide-image": "á\80\96á\80­á\80¯á\80\84á\80ºá\80\95á\80« á\80¡á\80±á\80\80á\80¼ာင်းအရာများကို ဝှက်ရန်",
+       "revdelete-hide-image": "á\80\96á\80­á\80¯á\80\84á\80ºá\80\95á\80« á\80¡á\80\80á\80¼á\80±ာင်းအရာများကို ဝှက်ရန်",
        "revdelete-hide-comment": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
        "revdelete-hide-user": "တည်းဖြတ်သူ၏ အသုံးပြုသူအမည်/အိုင်ပီလိပ်စာ",
        "revdelete-radio-same": "(မပြောင်းလဲ)",
        "showhideselectedversions": "ရွေးချယ်ထားသော မူများကို ပြရန်/ဝှက်ရန်",
        "editundo": "နောက်ပြန် ပြန်ပြင်ရန်",
        "diff-empty": "(ကွဲပြားမှု မရှိ)",
+       "diff-multi-sameuser": "(တူညီသော အသုံးပြုသူ၏ {{PLURAL:$1|အလယ်ကြား မူတစ်ခု|အလယ်ကြား မူများ $1 ခု}} အား ပြသမထားပါ)",
        "searchresults": "ရှာဖွေမှု ရလဒ်များ",
        "searchresults-title": "\"$1\" အတွက် ရှာတွေ့သည့် ရလဒ်များ",
        "titlematches": "စာမျက်နှာခေါင်းစဉ်ကိုက်ညီသည်",
        "searchprofile-advanced-tooltip": "စိတ်ကြိုက်အမည်ညွှန်းများတွင် ရှာရန်",
        "search-result-size": "$1 ({{PLURAL:$2|စကားလုံး 1 လုံး|စကားလုံး $2 လုံး}})",
        "search-result-category-size": "{{PLURAL:$1|အသင်းဝင်တစ်ခု|အသင်းဝင် $1 ခု}} ({{PLURAL:$2|ကဏ္ဍခွဲတစ်ခု|ကဏ္ဍခွဲ $2 ခု}}, {{PLURAL:$3|ဖိုင်တစ်ခု|ဖိုင် $3 ခု}})",
-       "search-redirect": "($1 á\80\9eá\80­á\80¯á\80· á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºးသည်)",
+       "search-redirect": "($1 á\80\99á\80¾ á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\91á\80¬းသည်)",
        "search-section": "(အပိုင်း $1)",
        "search-category": "(ကဏ္ဍ $1)",
        "search-suggest": "$1 ဟု ဆိုလိုပါသလား။",
        "search-relatedarticle": "ဆက်နွယ်သော",
        "searchrelated": "ဆက်နွယ်သော",
        "searchall": "အားလုံး",
-       "showingresults": "'''$2''' နှင့်စသော ရလဒ် {{PLURAL:$1|'''1''' ခု|'''$1''' ခု}}ထိကို အောက်တွင် ပြထားသည်။",
+       "showingresults": "№<strong>$2</strong> နှင့်စသော ရလဒ် {{PLURAL:$1|<strong>1</strong> ခု|<strong>$1</strong> ခု}}ထိကို အောက်တွင် ပြထားသည်။",
+       "showingresultsinrange": "№<strong>$2</strong> မှ #<strong>$3</strong> အထိ ရလဒ် {{PLURAL:$1|<strong>1</strong> ခု|<strong>$1</strong> ခု}}ထိကို အောက်တွင် ပြထားသည်။",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ၏ <strong>$1</strong> ရလဒ်|<strong>$3</strong> ၏ <strong>$1 - $2</strong> ရလဒ်များ}}",
        "search-nonefound": "စုံစမ်းမှုနှင့်ကိုက်ညီသော ရလဒ်မရှိပါ။",
        "powersearch-legend": "အထူးပြု ရှာဖွေရန်",
        "powersearch-ns": "အမည်ညွှန်းတို့တွင် ရှာရန် -",
        "prefs-skin": "အသွင်အပြင်",
        "skin-preview": "နမူနာ",
        "datedefault": "မရွေးချယ်",
-       "prefs-user-pages": "အသုံးပြုသူ စာမျက်နှာများ",
+       "prefs-user-pages": "အသုံးပြုသူ စာမျက်နှာများ",
        "prefs-personal": "အသုံးပြုသူ ပရိုဖိုင်",
        "prefs-rc": "လတ်​တ​လောအ​ပြောင်း​အ​လဲ​",
        "prefs-watchlist": "စောင့်ကြည့်စာရင်း",
        "saveprefs": "သိမ်းရန်",
        "restoreprefs": "မူလအပြင်အဆင်အားလုံးသို့ ပြန်ပြောင်းရန် (အပိုင်းအားလုံးတွင်)",
        "prefs-editing": "တည်းဖြတ်ခြင်း",
-       "rows": "အလျားလိုက်တန်း -",
-       "columns": "ဒေါင်လိုက်တန်း -",
        "searchresultshead": "ရှာဖွေရန်",
        "stub-threshold-disabled": "ပိတ်ထားသည်",
        "recentchangesdays": "လတ်တလောအပြောင်းအလဲများကို ပြရန်နေ့များ -",
        "prefs-tokenwatchlist": "တိုကင်",
        "prefs-diffs": "ကွဲပြားချက်",
        "userrights": "အသုံးပြုသူ၏ အခွင့်အရေးများကို စီမံခန့်ခွဲခြင်း",
-       "userrights-lookup-user": "á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80¡á\80¯á\80\95á\80ºá\80\85á\80¯á\80\80á\80­á\80¯ á\80\85á\80®á\80\99á\80ရန်",
+       "userrights-lookup-user": "á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80\90á\80\85á\80ºá\80¦á\80¸á\80\80á\80­á\80¯ á\80\9bá\80½á\80±á\80¸á\80\81á\80»á\80\9aá\80ºရန်",
        "userrights-user-editname": "အသုံးပြုသူအမည်တစ်ခုကို ထည့်ပါ -",
-       "editusergroup": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို တည်းဖြတ်ရန်",
+       "editusergroup": "အသုံးပြုသူအုပ်စုကို ဖော်ပြရန်",
        "editinguser": "{{GENDER:$1|အသုံးပြုသူ}} <strong>[[User:$1|$1]]</strong> $2 ၏ အသုံးပြုအခွင့်အရေးများကို ပြောင်းလဲခြင်း",
        "userrights-editusergroup": "အသုံးပြုသူအုပ်စုကို တည်းဖြတ်ရန်",
        "saveusergroups": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို သိမ်းရန်",
        "userrights-groupsmember": "အဖွဲ့ဝင်",
        "userrights-reason": "အ​ကြောင်း​ပြ​ချက်:",
-       "userrights-notallowed": "သင့်တွင် အသုံးပြုသူအခွင့်အရေး ပေါင်းထည့်ရန်  သို့ ဖယ်ရှားရန် အခွင့်အရေး မရှိပါ။",
        "userrights-changeable-col": "သင်ပြောင်းလဲပေးနိုင်သောအုပ်စုများ",
        "userrights-unchangeable-col": "သင်ပြောင်းလဲမပေးနိုင်သောအုပ်စုများ",
        "group": "အုပ်စု -",
        "group-user": "အသုံးပြုသူများ",
        "group-autoconfirmed": "အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူများ",
        "group-bot": "ဘော့များ",
-       "group-sysop": "á\80¡á\80\80á\80ºá\80\92á\80\99á\80\84á\80ºများ",
+       "group-sysop": "á\80\85á\80®á\80\99á\80¶á\80\81á\80\94á\80·á\80ºá\80\81á\80½á\80²á\80\9eá\80°များ",
        "group-bureaucrat": "ဗျူရိုကရက်",
        "group-all": "(အားလုံး)",
        "group-user-member": "{{GENDER:$1|အသုံးပြုသူ}}",
        "grouppage-user": "{{ns:project}}:အသုံးပြုသူများ",
        "grouppage-autoconfirmed": "{{ns:project}}:အလိုအလျောက်အတည်ပြုထားသောအသုံးပြုသူများ",
        "grouppage-bot": "{{ns:project}}:ဘော့များ",
-       "grouppage-sysop": "{{ns:project}}: အက်ဒမင်များ",
+       "grouppage-sysop": "{{ns:project}}:စီမံခန့်ခွဲသူများ",
        "grouppage-bureaucrat": "{{ns:project}}:ဗျူရိုကရက်များ",
        "right-read": "စာမျက်နှာများကို ဖတ်ရန်",
        "right-edit": "စာမျက်နှာများကို တည်းဖြတ်ရန်",
        "action-reupload": "ဤရှိပြီးသားဖိုင်ကို ထပ်ရေးရန်",
        "action-writeapi": "ရေးသားမှု API ကို သုံးရန်",
        "action-delete": "ဤစာမျက်နှာကို ဖျက်ရန်",
-       "action-deleterevision": "á\80¤á\80\99á\80°ကို ဖျက်ရန်",
-       "action-deletedhistory": "á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\81\8fဖျက်လိုက်သောရာဇဝင်ကို ကြည့်ရန်",
+       "action-deleterevision": "á\80\99á\80°á\80\99á\80»á\80¬á\80¸ကို ဖျက်ရန်",
+       "action-deletedhistory": "á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\90á\80\85á\80ºá\80\81á\80¯á\81\8f ဖျက်လိုက်သောရာဇဝင်ကို ကြည့်ရန်",
        "action-browsearchive": "ဖျက်ပစ်လိုက်သော စာမျက်နှာများကို ရှာရန်",
-       "action-undelete": "á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\80á\80­á\80¯ မဖျက်တော့ရန်",
+       "action-undelete": "á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸ á\80\95á\80¼á\80\94á\80ºမဖျက်တော့ရန်",
        "action-suppressionlog": "ဤကိုယ်ပိုင်မှတ်တမ်းကို ကြည့်ရန်",
        "action-block": "တည်းဖြတ်ခြင်းမှ ဤအသုံးပြုသူကို ပိတ်ပင်ရန်",
        "action-protect": "ဤစာမျက်နှာအတွက် ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲရန်",
        "action-import": "အခြားဝီကီများမှ စာမျက်နှာများကို ထည့်သွင်းရန်",
        "action-importupload": "Upload တင်လိုက်သော ဖိုင်တစ်ခုမှ စာမျက်နှာများကို ထည့်သွင်းရန်",
+       "action-patrol": "အခြားသူများ၏ တည်းဖြတ်မှုများအား စောင့်ကြည့်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်",
        "action-autopatrol": "သင့်တည်းဖြတ်မှုကို စောင့်ကြပ်စစ်ဆေးနေသည်ဟု မှတ်သားထားရန်",
        "action-unwatchedpages": "စောင့်မကြည့်တော့သော စာမျက်နှာများ၏ စာရင်းကို ကြည့်ရန်",
        "action-mergehistory": "ဤစာမျက်နှာ၏ရာဇဝင်ကို ပေါင်းရန်",
        "recentchanges-label-bot": "ဤတည်းဖြတ်မှုကို ဘော့က လုပ်ဆောင်သွားသည်။",
        "recentchanges-label-unpatrolled": "ဤတည်းဖြတ်မှုကို မစောင့်ကြပ်မစစ်ဆေးရသေးပါ",
        "recentchanges-label-plusminus": "စာမျက်နှာ အရွယ်အစားမှာ အောက်ပါ ဘိုက်ပမာဏ ပြောင်းလဲသွားခဲ့သည်",
+       "recentchanges-legend-heading": "<strong>အညွှန်း:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|စာမျက်နှာသစ်များ စာရင်း]]ကိုလည်း ကြည့်ရန်)",
        "recentchanges-submit": "ပြသရန်",
        "rcnotefrom": "အောက်ပါတို့မှာ <strong>$3၊ $4</strong> မှစ၍ {{PLURAL:$5|ပြောင်းလဲမှု|ပြောင်းလဲမှုများ}} ဖြစ်သည်  (<strong>$1</strong> အထိ ပြထား)။",
        "rcshowhideminor-hide": "ဝှက်",
        "rcshowhidebots": "ဘော့များ $1ရန်",
        "rcshowhidebots-show": "ပြ",
-       "rcshowhidebots-hide": "ဝှက်ရန်",
+       "rcshowhidebots-hide": "ဝှက်",
        "rcshowhideliu": "မှတ်ပုံတင်ထားသော အသုံးပြုသူများ $1",
        "rcshowhideliu-show": "ပြသရန်",
        "rcshowhideliu-hide": "ဝှက်",
        "tmp-create-error": "ယာယီဖိုင် မဖန်တီးနိုင်ပါ။",
        "tmp-write-error": "ယာယီဖိုင်ရေးသားရာတွင် အမှားဖြစ်ပေါ်နေသည်။",
        "largefileserver": "ဤဖိုင်သည် ဆာဗာတွင် ခွင့်ပြုရန်သတ်မှတ်ထားသော ဖိုင်အရွယ်အစားထက် ကြီးနေသည်။",
+       "file-exists-duplicate": "ဤဖိုင်သည် အောက်ပါ {{PLURAL:$1|ဖိုင်|ဖိုင်များ}}၏ ထပ်တူပုံပွား ဖြစ်သည် -",
        "uploadwarning": "Upload တင်ရာတွင် သတ်ပေးချက်",
        "savefile": "ဖိုင်သိမ်းရန်",
        "uploaddisabled": "Upload တင်ခြင်း ပိတ်ထားသည်။",
        "upload-options": "Upload တင်သည့် ရွေးချယ်မှုများ",
        "watchthisupload": "ဤဖိုင်အား စောင့်ကြည့်ရန်",
        "upload-misc-error": "upload တင်ရာတွင် အမည်မသိ အမှား",
+       "upload-form-label-infoform-categories": "ကဏ္ဍများ",
        "img-auth-accessdenied": "ဝင်ရောက်ခြင်းကို ငြင်းပယ်လိုက်သည်",
        "img-auth-nofile": "\"$1\" ဟူသည့်ဖိုင် မရှိပါ။",
        "img-auth-streaming": "\"$1\" ကို စထရင်းမင်း ဆွဲနေသည်။",
        "filepage-nofile-link": "ဤအမည်ဖြင့် မည်သည့်ဖိုင်မှ မရှိပါ။ သိုရာတွင် ယင်းကို [$1 upload တင်]နိုင်သည်။",
        "uploadnewversion-linktext": "ဤဖိုင်၏ နောက်ဆုံး version ကို upload တင်ရန်",
        "shared-repo-from": "$1 ထံမှ",
+       "shared-repo-name-wikimediacommons": "ဝီကီမီဒီယာ ကွန်မွန်းစ်",
        "upload-disallowed-here": "သင်သည် ဤဖိုင်အား ထပ်၍ ရေးသားမရနိုင်ပါ။",
        "filerevert": "$1 ကို ပြန်ပြောင်းရန်",
        "filerevert-legend": "ဖိုင်ကို ပြန်ပြောင်းရန်",
        "download": "ဒေါင်းလုဒ်",
        "unwatchedpages": "မစောင့်ကြည့်တော့သော စာမျက်နှာများ",
        "listredirects": "ပြန်ညွှန်းသည့် လင့်များစာရင်း",
+       "listduplicatedfiles": "ထပ်တူပုံပွားဖိုင်များ စာရင်း",
        "unusedtemplates": "မသုံးသော တမ်းပလိတ်များ",
-       "unusedtemplateswlh": "အခြားလိပ်စာများ",
-       "randompage": "ကျ​ပန်း​စာ​မျက်​နှာ​",
+       "unusedtemplateswlh": "အခြားလင့်ခ်များ",
+       "randompage": "ကျပန်းစာမျက်နှာ",
+       "randomincategory": "ကဏ္ဍတွင်းရှိ ကျပန်း စာမျက်နှာ",
+       "randomincategory-category": "ကဏ္ဍ:",
        "randomredirect": "ကျပန်းပြန်ညွှန်း",
        "randomredirect-nopages": "အမည်ညွှန်း \"$1\" တွင် ပြန်ညွှန်းမရှိပါ။",
        "statistics": "စာရင်းအင်း",
        "double-redirect-fixed-move": "[[$1]] ကို ရွှေ့ပြောင်းပြီးဖြစ်သည်။ ၎င်းအား အလိုအလျောက် ပြင်ဆင်ပြီး [[$2]] သို့ ပြန်ညွှန်းထားသည်။",
        "brokenredirects": "ကျိုးပျက်နေသော ပြန်ညွှန်းများ",
        "brokenredirectstext": "အောက်ပါ ပြန်ညွှန်းများသည် မရှိသောစာမျက်နှာများသို့ လင့်ထားသည် -",
-       "brokenredirects-edit": "ပြင်​ဆင်​ရန်",
+       "brokenredirects-edit": "ပြင်ဆင်ရန်",
        "brokenredirects-delete": "ဖျက်​ပါ",
        "withoutinterwiki": "ဘာသာစကားလင့်မပါသော စာမျက်နှာများ",
        "withoutinterwiki-summary": "အောက်ပါစာမျက်နှာများသည် အခြားဘာသာစကားဗားရှင်းများသို့ လင့်မထားပါ။",
        "wantedpages": "အလိုရှိသော စာမျက်နှာများ",
        "wantedfiles": "အလိုရှိသော ဖိုင်များ",
        "wantedtemplates": "အလိုရှိသော တမ်းပလိတ်များ",
+       "mostlinked": "အများဆုံး လာရောက်ချိတ်ဆက်ထားသည့် စာမျက်နှာများ",
+       "mostlinkedcategories": "အများဆုံး လာရောက် ချိတ်ဆက်ထားသည့် ကဏ္ဍများ",
        "mostcategories": "ကဏ္ဍအများဆုံးပါသော စာမျက်နှာများ",
+       "mostimages": "အများဆုံး လာရောက်ချိတ်ဆက်ထားသည့် ဖိုင်များ",
+       "mostrevisions": "တည်းဖြတ်မှု အများဆုံး စာမျက်နှာများ",
        "prefixindex": "ရှေ့ဆုံးမှ prefix ပါသော စာမျက်နှာ အားလုံး",
        "prefixindex-submit": "ပြသရန်",
        "shortpages": "စာမျက်နှာတို",
        "longpages": "ရှည်လျားသောစာမျက်နှာများ",
-       "deadendpages": "လမ်းပိတ်နေသော (လင့်မရှိသော) စာမျက်နှာများ",
+       "deadendpages": "လမ်းဆုံးနေသော (လင့်ခ်မချိတ်ထားသော) စာမျက်နှာများ",
+       "deadendpagestext": "အောက်ပါ စာမျက်နှာများသည် {{SITENAME}} တွင် အခြား စာမျက်နှာများသို့ လင့်ခ်ချိတ်ဆက်ထားခြင်း မရှိပါ။",
        "protectedpages": "ကာကွယ်ထားသော စာမျက်နှာများ",
        "protectedpages-noredirect": "ပြန်ညွှန်းများအား ဝှက်ရန်",
+       "protectedpages-page": "စာမျက်နှာ",
        "protectedtitles": "ကာကွယ်ထားသော ခေါင်းစဉ်များ",
        "listusers": "အသုံးပြုသူစာရင်း",
        "listusers-editsonly": "တည်းဖြတ်ထားဖူးသော အသုံးပြုသူများကိုသာ ဖော်ပြရန်",
        "ancientpages": "အဟောင်းဆုံးစာမျက်နှာ",
        "move": "ရွှေ့ရန်",
        "movethispage": "ဤစာမျက်နှာကို ရွှေ့ပြောင်းရန်",
+       "unusedimagestext": "အောက်ပါဖိုင်များသည် မည်သည့်စာမျက်နှာတွင်မှ သုံးစွဲထားခြင်း မရှိပါ။\nအခြားသော ဝက်ဘ်ဆိုဒ်များမှနေ၍ ဖိုင်တစ်ခုခုသို့ တိုက်ရိုက် URL ဖြင့် တိုက်ရိုက်ချိတ်ဆက်ထားခြင်း ရှိနေနိုင်ပြီး သုံးစွဲနေခြင်းမရှိသော်လည်း ဤနေရာတွင် ဖော်ပြထားနိုင်ကြောင်း ကျေးဇူးပြု၍ မှတ်သားပါ။",
        "pager-newer-n": "{{PLURAL:$1|ပိုသစ်သော တစ်ခု|ပိုသစ်သော $1 ခု}}",
        "pager-older-n": "{{PLURAL:$1|ပိုဟောင်းသော တစ်ခု|ပိုဟောင်းသော $1 ခု}}",
        "booksources": "မှီငြမ်း စာအုပ်များ",
        "all-logs-page": "အများနှင့်ဆိုင်သောမှတ်တမ်းအားလုံး",
        "alllogstext": "{{SITENAME}}၏ ရရှိနိုင်သော မှတ်တမ်းများအားလုံး ပေါင်းစည်းပြသခြင်း ဖြစ်သည်။\nမှတ်တမ်းအမျိုးအစား၊ အသုံးပြုသူအမည် (စာလုံးအကြီးအသေး)၊ သို့မဟုတ် သက်ဆိုင်ရာ စာမျက်နှာ (စာလုံးအကြီးအသေး) ကို ရွေးချယ်ခြင်းဖြင့် ကြည့်ရှုမှုကို အကျဉ်းချုံးနိုင်ပါသည်။",
        "logempty": "မှတ်တမ်းထဲတွင် ကိုက်ညီသော အရာများ မရှိပါ။",
+       "checkbox-all": "အားလုံး",
        "allpages": "စာမျက်နှာအားလုံး",
        "nextpage": "နောက်ထပ်စာမျက်နှာ ($1)",
        "prevpage": "ယခင် စာမျက်နှာ ($1)",
        "allpagesto": "ဤသည်တွင်ဆုံးသော စာမျက်နှာများကို ပြရန် -",
        "allarticles": "စာမျက်နှာအားလုံး",
        "allinnamespace": "စာမျက်နှာအားလုံး (အမည်ညွှန်း $1)",
-       "allpagessubmit": "သွား​ပါ​",
+       "allpagessubmit": "သွားပါ",
        "allpages-hide-redirects": "ပြန်ညွှန်းများအား ဝှက်ရန်",
        "categories": "ကဏ္ဍများ",
        "categories-submit": "ပြသရန်",
        "listusers-blocked": "(ပိတ်ပင်ထားသည်)",
        "activeusers": "တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူစာရင်း",
        "activeusers-intro": "ဤသည်မှာ နောက်ဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}အတွင်း တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူများ စာရင်း ဖြစ်သည်။",
+       "activeusers-count": "{{PLURAL:$3|ရက်|$3 ရက်}}အတွင်း {{PLURAL:$1|လုပ်ဆောင်မှု|လုပ်ဆောင်မှု}} $1 ခု",
        "activeusers-from": "ဤမှစသော အသုံးပြုသူများကို ပြရန် -",
        "activeusers-noresult": "အသုံးပြုသူ မတွေ့ပါ။",
        "listgrouprights": "အသုံးပြုသူအုပ်စု အခွင့်အရေးများ",
        "listgrouprights-removegroup-all": "အုပ်စုအားလုံးကို ဖယ်ရှားရန်",
        "listgrouprights-addgroup-self-all": "အုပ်စုအားလုံးကို မိမိ၏အကောင့်သို့ ပေါင်းထည့်ရန်",
        "listgrouprights-removegroup-self-all": "မိမိ၏အကောင့်မှ အုပ်စုအားလုံးကို ဖယ်ရှားရန်",
+       "trackingcategories": "နောက်ယောင်ခံ ကဏ္ဍများ",
+       "trackingcategories-msg": "နောက်ယောင်ခံ ကဏ္ဍ",
        "mailnologin": "ပို့ရန်လိပ်စာ မရှိပါ",
        "emailuser": "ဤ​အ​သုံး​ပြု​သူ​အား​ အီး​မေး​ပို့​ပါ​",
        "emailuser-title-target": "{{GENDER:$1|အသုံးပြုသူ}}ကို အီးမေးပို့ရန်",
        "minimum-size": "အသေးဆုံးအရွယ်အစား",
        "maximum-size": "အကြီးဆုံးအရွယ်အစား -",
        "pagesize": "(ဘိုက်)",
-       "restriction-edit": "ပြင်​ဆင်​ရန်​",
+       "restriction-edit": "ပြင်ဆင်ရန်",
        "restriction-move": "ရွှေ့ရန်",
        "restriction-create": "ထွင်",
        "restriction-upload": "Upload တင်ရန်",
        "invert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်",
        "tooltip-invert": "ဤအကွက်ကို အမှန်ခြစ်၍ ရွေးချယ်ထားသော အမည်ညွှန်း (နှင့် ဆက်စပ်အမည်ညွှန်း)တွင် ပြောင်းလဲမှုများကို ဝှက်ပါ။",
        "namespace_association": "ဆက်စပ်နေသော အမည်ညွှန်း",
+       "tooltip-namespace_association": "ရွေးချယ်ထားသည့် အမည်ညွှန်းနှင့် ဆက်စပ်နေသည့် ဆွေးနွေးချက် သို့မဟုတ် အကြောင်းအရာ အမည်ညွှန်း ပါဝင်စေရန် ဤအကွက်တွင် အမှန်ခြစ်ရန်",
        "blanknamespace": "(ပင်မ)",
        "contributions": "{{GENDER:$1|အသုံးပြုသူ}}၏ ဆောင်ရွက်ချက်များ",
        "contributions-title": "$1 အတွက် အသုံးပြုသူ၏ ဆောင်ရွက်ချက်များ",
        "mycontris": "ဆောင်ရွက်ချက်များ",
        "anoncontribs": "ဆောင်ရွက်ချက်များ",
        "contribsub2": "{{GENDER:$3|$1}}အတွက် ($2)",
+       "nocontribs": "ဤသတ်မှတ်ချက်များနှင့် ကိုက်ညီသည့် ပြောင်းလဲမှုများ မရှိပါ။",
        "uctop": "(လက်ရှိ)",
        "month": "အဆိုပါ လမှစ၍ ( အဆိုပါလထက်လည်း စောသော) :",
        "year": "အဆိုပါ နှစ်မှစ၍ ( အဆိုပါနှစ်ထက်လည်း စောသော) :",
        "sp-contributions-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်",
        "sp-contributions-newbies-sub": "အကောင့်အသစ်များအတွက်",
        "sp-contributions-blocklog": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း",
+       "sp-contributions-deleted": "ဖျက်ခံထားရသည့် {{GENDER:$1|အသုံးပြုသူ}} ဆောင်ရွက်ချက်များ",
        "sp-contributions-uploads": "အပ်လုပ်တင်ထားသည်များ",
        "sp-contributions-logs": "မှတ်​တမ်း​များ​",
        "sp-contributions-talk": "ဆွေးနွေး",
        "sp-contributions-search": "ပံ့ပိုးမှုများကို ရှာရန်",
        "sp-contributions-username": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် :",
        "sp-contributions-toponly": "နောက်ဆုံးတည်းဖြတ်မူများသာပြရန်",
+       "sp-contributions-hideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "sp-contributions-submit": "ရှာဖွေရန်",
        "whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ",
-       "whatlinkshere-title": "\"$1\" á\80\80á\80­á\80¯ á\80\9cá\80\84á\80·်ထားသော စာမျက်နှာများ",
+       "whatlinkshere-title": "\"$1\" á\80\9eá\80­á\80¯á\80· á\80\81á\80»á\80­á\80\90á\80ºá\80\86á\80\80်ထားသော စာမျက်နှာများ",
        "whatlinkshere-page": "စာမျက်နှာ -",
-       "linkshere": "အောက်ပါစာမျက်နှာများသည် '''[[:$1]]''' သို့ လင့်ထားသည် -",
+       "linkshere": "အောက်ပါစာမျက်နှာများသည် <strong>[[:$1]]</strong> သို့ ချိတ်ဆက်ထားသည် -",
        "nolinkshere": "'''[[:$1]]''' သို့ လင့်ထားသော စာမျက်နှာ မရှိပါ။",
        "isredirect": "ပြန်ညွှန်းသော စာမျက်နှာ",
        "istemplate": "ထည့်သွင်းကူးယူချက်",
        "ipaddressorusername": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် -",
        "ipbexpiry": "သက်တမ်းကုန်လွန်ရက် -",
        "ipbreason": "အ​ကြောင်း​ပြ​ချက်:",
+       "ipb-hardblock": "ဤအိုင်ပီလိပ်စာမှ လော့ဂ်အင်ဝင်ထားသော အသုံးပြုသူများကို တည်းဖြတ်ခြင်းမှ တားမြစ်ရန်",
        "ipbcreateaccount": "အကောင့်အသစ်ပြုလုပ်ခြင်းကို တားဆီးရန်",
        "ipbemailban": "အီးမေးပို့ခြင်းမှ အသုံးပြုသူကို တားဆီးရန်",
+       "ipbenableautoblock": "ဤအသုံးပြုသူ အသုံးပြုသော အိုင်ပီလိပ်စာနှင့် သူတို့ ပြင်ဆင်ရန် ကြိုးစားသည့် နောက်ဆက်တွဲ အိုင်ပီလိပ်စာများကိုပါ အလိုအလျောက်ပိတ်ပင်ရန်",
        "ipbsubmit": "ဤအသုံးပြုသူကို ပိတ်ပင်ရန်",
        "ipbother": "အခြားအချိန်:",
        "ipboptions": "၂ နာရီ:2 hours,၁ ရက်:1 day,၃ ရက်:3 days,၁ ပတ်:1 week,၂ ပတ်:2 weeks,၁ လ:1 month,၃ လ:3 months,၆ လ:6 months,၁ နှစ်:1 year,အနန္တ:infinite",
        "ipbhidename": "အသုံးပြုသူအမည်ကို တည်းဖြတ်မှုများနှင့် စာရင်းမှထဲတွင် ဝှက်ထားရန်",
-       "ipbwatchuser": "ဤအသုံးပြုသူ၏စာမျက်နှနှင့် ဆွေးနွေးချက်တို့ကို စောင့်ကြည့်ရန်",
+       "ipbwatchuser": "ဤအသုံးပြုသူ၏ စာမျက်နှာနှင့် ဆွေးနွေးချက်တို့ကို စောင့်ကြည့်ရန်",
+       "ipb-disableusertalk": "ပိတ်ပင်ထားစဉ်အတွင်း ဤအသုံးပြုသူအား သူတို့၏ ကိုယ်ပိုင်ဆွေးနွေးချက် စာမျက်နှာကို ပြင်ဆင်ခြင်းမှ ပိတ်ပင်ရန်",
+       "ipb-change-block": "အသုံးပြုသူအား ဤအပြင်အဆင်များဖြင့် ထပ်မံပိတ်ပင်ရန်",
        "badipaddress": "တရားမဝင်သော IP address",
        "blockipsuccesssub": "ပိတ်ပင်ခြင်း အောင်မြင်သည်",
        "ipb-edit-dropdown": "ပိတ်ပင်ရသောအကြောင်းရင်းများ",
        "change-blocklink": "စာကြောင်းအမည် ပြောင်းရန်",
        "contribslink": "ပံ့ပိုး",
        "blocklogpage": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း",
+       "blocklog-showlog": "ဤအသုံးပြုသူအား ယခင်က ပိတ်ပင်ထားပြီး ဖြစ်သည်။\nပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "blocklogentry": "[[$1]] ကို $2 ကြာအောင် ပိတ်ပင် တားဆီးလိုက်သည် $3",
        "blocklogtext": "ဤသည်မှာ အသုံးပြုသူအား ပိတ်ပင်ခြင်းနှင့် ပိတ်ပင်မှုဖယ်ရှားခြင်း ဆောင်ရွက်မှု မှတ်တမ်း ဖြစ်သည်။\nအလိုအလျောက် ပိတ်ပင်ထားသည့် အိုင်ပီလိပ်စာများအား မထည့်သွင်းထားပါ။\nလက်ရှိ တားမြစ်မှုများနှင့် ပိတ်ပင်မှုများ စာရင်းအတွက် [[Special:BlockList|ပိတ်ပင်စာရင်း]]ကို ကြည့်ပါ။",
        "unblocklogentry": "$1 ကို ပိတ်ထားရာမှ ပြန်ဖွင့်ရန်",
        "block-log-flags-nousertalk": "မိမိ၏ဆွေးနွေးချက်စာမျက်နှာကို တည်းဖြတ်မရနိုင်ပါ",
        "block-log-flags-hiddenname": "အသုံးပြုသူအမည် ဝှက်ထားသည်",
        "ipb_expiry_invalid": "သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။",
-       "ipb_already_blocked": "\"$1\" ကို အစကတည်းက ပိတ်ထားသည်",
+       "ipb_already_blocked": "\"$1\" ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။",
+       "ipb-needreblock": "$1 ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။ အပြင်အဆင်များကို ပြောင်းလဲလိုပါသလား?",
        "move-page": "$1 ကို ရွှေ့ရန်",
-       "move-page-legend": "စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်",
+       "move-page-legend": "စာမျက်နှာကို ရွှေ့ပြောင်းရန်",
        "movepagetext": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\nအမည်ဟောင်းသည် အမည်သစ်သို့ ပြန်ညွှန်းစာမျက်နှာ ဖြစ်လာမည်။\nသင်သည် မူလခေါင်းစဉ်သို့ ပြန်ညွှန်းများကို အလိုအလျောက် အပ်ဒိတ် update လုပ်နိုင်သည်။\nအကယ်၍ မပြုလုပ်လိုပါက [[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို မှတ်သားရန် မမေ့ပါနှင့်။\nလင့်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီး ဖြစ်ပါက (သို့) ယင်းစာမျက်နှာသည် အလွတ်မဖြစ်ပါက (သို့) ပြန်ညွှန်းတစ်ခု မရှိပါက (သို့) ယခင်က ပြုပြင်ထားသော မှတ်တမ်း မရှိပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
        "movepagetext-noredirectfixer": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\n[[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို စစ်ဆေးရန် မမေ့ပါနှင့်။\nလင့်ခ်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနေနှင့်ပြီး ပြန်ညွှန်းတစ်ခု မရှိပါက သို့မဟုတ် ယခင်က ပြုပြင်ထားသော မှတ်တမ်း ရှိနေပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
        "movepagetalktext": "ဤအကွက်ကို အမှန်ခြစ်လိုက်ခြင်းဖြင့် ဗလာမဟုတ်သော ဆွေးနွေးချက်စာမျက်နှာသည် ရှိနှင့်ပြီး မဟုတ်လျှင် ဆက်နွယ်နေသော ဆွေးနွေးချက် စာမျက်နှာကို ခေါင်းစဉ်အသစ်သို့  အလိုအလျောက် ရွှေ့ပစ်မည် ဖြစ်သည်။\n\nဤကိစ္စရပ်တွင် သင် ဆန္ဒရှိလျှင် စာမျက်နှာကို မိမိကိုယ်တိုင် သွားရောက်ရွှေ့ပြောင်း ပေါင်းစပ်နိုင်သည်။",
        "newtitle": "ခေါင်းစဉ်အသစ်:",
        "move-watch": "မူရင်းစာမျက်နှာနှင့် ဦးတည်ထားသော စာမျက်နှာတို့ကို စောင့်ကြည့်ရန်",
-       "movepagebtn": "စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်",
+       "movepagebtn": "စာမျက်နှာကို ရွှေ့ပြောင်းရန်",
        "pagemovedsub": "ပြောင်းရွှေ့ခြင်းအောင်မြင်သည်",
        "movepage-moved": "'''\"$1\" ကို \"$2\" သို့ ရွှေ့ပြီးဖြစ်သည်'''",
        "movepage-moved-redirect": "ပြန်ညွှန်းတစ်ခုကို ဖန်တီးပြီးဖြစ်သည်။",
        "movereason": "အ​ကြောင်း​ပြ​ချက် -",
        "revertmove": "ပြောင်းရန်",
        "delete_and_move_confirm": "ဟုတ်ပါသည်။ စာမျက်နှာကို ဖျက်ပါ။",
+       "delete_and_move_reason": "\"[[$1]]\" ရွှေ့ပြောင်းရန်အတွက် ဖျက်ပစ်ခြင်း",
        "immobile-source-page": "ဤစာမျက်နှာကို ရွှေ့မရပါ။",
        "move-leave-redirect": "ပြန်ညွှန်းတစ်ခု ချန်ထားရန်",
        "export": "စာမျက်နှာများကို Export ထုတ်ရန်",
        "tooltip-preferences-save": "ရေးချယ်စရာများကို သိမ်းရန်",
        "tooltip-summary": "အတိုချုပ်ထည့်ရန်",
        "others": "အခြား",
+       "simpleantispam-label": "Anti-spam စစ်ဆေးခြင်း။\nဤအရာအား <strong>မဖြည့်ပါနှင့်</strong>!",
        "pageinfo-language": "စာမျက်နှာ စာကိုယ် ဘာသာစကား",
        "pageinfo-toolboxlink": "စာမျက်နှာ အချက်အလက်များ",
        "markaspatrolleddiff": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်",
        "show-big-image": "မူရင်းဖိုင်",
        "show-big-image-preview": "ဤနမူနာ၏ အရွယ်အစား - $1။",
        "show-big-image-other": "အခြား {{PLURAL:$2|ပုံရိပ်ပြတ်သားမှု|ပုံရိပ်ပြတ်သားမှု}}: $1။",
+       "show-big-image-size": "$1 × $2 ပစ်ဇယ်",
        "newimages": "ပုံအသစ်များပြခန်း",
        "newimages-legend": "စိစစ်မှု",
        "newimages-label": "ဖိုင်အမည် (သို့ ယင်း၏အစိတ်အပိုင်း) -",
        "exif-imagewidth": "အကျယ်",
        "exif-imagelength": "အမြင့်",
        "exif-bitspersample": "အစိတ်အပိုင်းတစ်ခုတွင်ပါဝင်သော အပိုင်းငယ်များ",
+       "exif-orientation": "မျက်နှာပြင် အသားကျမှု",
        "exif-xresolution": "အလျားလိုက် ပုံရိပ်ပြတ်သားမှု",
        "exif-yresolution": "ဒေါင်လိုက် ပုံရိပ်ပြတ်သားမှု",
        "exif-datetime": "ဖိုင်အပြောင်းအလဲ ရက်စွဲနှင့် အချိန်",
        "exif-usercomment": "အသုံးပြုသူ မှတ်ချက်များ",
        "exif-relatedsoundfile": "ဆက်နွယ်သော အသံဖိုင်",
        "exif-datetimeoriginal": "ဒေတာဖန်တီးခဲ့သော နေ့စွဲနှင့် အချိန်",
+       "exif-datetimedigitized": "ဒီဂျစ်တယ်ပြောင်းသည့် နေ့ရက်နှင့် အချိန်",
        "exif-exposuretime-format": "$1 စက္ကန့် ($2)",
        "exif-shutterspeedvalue": "APEX ရှပ်တာ အမြန်နှုန်း",
        "exif-flash": "ဖလက်ရှ်",
        "confirm_purge_button": "အိုကေ",
        "imgmultipageprev": "← ပြီးခဲ့သော စာမျက်နှာ",
        "imgmultipagenext": "နောက်စာမျက်နှာ →",
-       "imgmultigo": "သွားပါ!",
+       "imgmultigo": "သွားပါ!",
        "imgmultigoto": "စာမျက်နှာ $1 ကို သွားရန်",
        "img-lang-default": "(ပင်မ ဘာသာစကား)",
        "table_pager_next": "နောက်စာမျက်နှာ",
        "table_pager_prev": "ပြီးခဲ့သော စာမျက်နှာ",
        "table_pager_first": "ပထမဆုံး စာမျက်နှာ",
        "table_pager_last": "နောက်ဆုံးစာမျက်နှာ",
-       "table_pager_limit_submit": "သွား​ပါ​",
+       "table_pager_limit_submit": "သွားပါ",
        "table_pager_empty": "မည်သည့်ရလဒ်မှ မရှိပါ",
        "autosumm-blank": "စာမျက်နှာကို ဗလာလုပ်လိုက်သည်",
        "autoredircomment": "စာမျက်နှာကို [[$1]] သို့ ပြန်ညွှန်းလိုက်သည်",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ဆွေးနွေး]])",
        "duplicate-defaultsort": "'''သတိပေးချက် -''' ပုံမှန် sort key \"$2\" oသည် ယခင်ပုံမှန်ဖြစ်သော sort key \"$1\" ကို override ထပ်ရေးမည်ဖြစ်သည်.",
        "version": "ဗားရှင်း",
-       "version-specialpages": "အ​ထူး ​စာ​မျက်​နှာ​များ",
+       "version-specialpages": "အထူး စာမျက်နှာများ",
        "version-other": "အခြား",
        "version-license": "မီဒီယာဝီကီ လိုင်စင်",
        "version-software": "သွင်းထားသော ဆော့ဝဲ",
        "fileduplicatesearch": "နှစ်ခုထပ်နေသောဖိုင်များကို ရှာရန်",
        "fileduplicatesearch-filename": "ဖိုင်အမည် -",
        "fileduplicatesearch-submit": "ရှာဖွေရန်",
-       "specialpages": "အ​ထူး ​စာ​မျက်​နှာ​များ",
+       "specialpages": "အထူး စာမျက်နှာများ",
+       "specialpages-note": "* ပုံမှန် အထူးစာမျက်နှာများ။\n* <span class=\"mw-specialpagerestricted\">ကန့်သတ်ထားသော အထူးစာမျက်နှာများ။</span>",
        "specialpages-group-maintenance": "ထိန်းသိမ်းမှု အစီရင်ခံချက်များ",
        "specialpages-group-other": "အခြားအထူးစာမျက်နှာများ",
        "specialpages-group-login": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
        "tags": "အသုံးပြုနေသော အပြောင်းအလဲစာတွဲများ",
        "tag-filter": "[[Special:Tags|Tag]] သီးသန့်စစ်ထုတ်ရန် -",
        "tag-filter-submit": "စိစစ်မှု",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|စာတွဲ|စာတွဲများ}}]]: $2)",
        "tags-title": "အမည်တွဲ",
        "tags-tag": "အမည်တွဲ အမည်",
-       "tags-edit": "ပြင်​ဆင်​ရန်",
+       "tags-edit": "ပြင်ဆင်ရန်",
        "comparepages": "စာမျက်နှာများကို နှိုင်းယှဉ်ရန်",
        "compare-page1": "စာမျက်နှာတစ်",
        "compare-page2": "စာမျက်နှာနှစ်",
        "htmlform-reset": "ပြောင်းလဲထားသည်များ မလုပ်တော့ရန်",
        "htmlform-selectorother-other": "အခြား",
        "logentry-delete-delete": "$3 စာမျက်နှာကို $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}",
+       "logentry-delete-delete_redir": "ပြန်ညွှန်း $3 ကို ထပ်ပိုးရေးသားခြင်းဖြင့် $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}",
        "logentry-delete-revision": "$3 စာမျက်နှာပေါ်ရှိ {{PLURAL:$5|တည်းဖြတ်မူတစ်ခု|တည်းဖြတ်မူ $5 ခု}}၏ အမြင်ပုံစံကို $1 က {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}: $4",
        "revdelete-content-hid": "အကြောင်းအရာ ဝှက်ခြင်း",
        "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်",
        "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်",
+       "logentry-suppress-block": "{{GENDER:$4|$3}} အား $5 ကြာအောင် $1 က {{GENDER:$2|ပိတ်ပင်ခဲ့သည်}} $6",
        "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
-       "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားပဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားဘဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move_redir": "$3 စာမျက်နှာကို $4 သို့ ပြန်ညွှန်းပေါ်ထပ်၍ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move_redir-noredirect": "$3 မှ $4 သို့ ပြန်ညွှန်ပေါ်ထပ်အုပ်ကာ ပြန်ညွှန်းချန်မထားဘဲ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
        "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
+       "logentry-newusers-autocreate": "အသုံးပြုသူအကောင့် $1 ကို အလိုအလျောက် {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-upload-upload": "$1 သည် $3 ကို {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "logentry-upload-overwrite": "$3 ၏ ဗားရှင်းအသစ်ကို $1 {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "rightsnone": "(ဘာမှမရှိ)",
        "revdelete-summary": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
-       "searchsuggest-search": "ရှာဖွေရန်",
-       "api-error-filename-tooshort": "ဖိုင်အမည်သည် တိုလွန်းသည်။",
-       "api-error-filetype-banned": "ဤဖိုင်အမျိုးအစားကို တားမြစ်ထားသည်။",
-       "api-error-http": "အတွင်းပိုင်းအမှား - ဆာဗာကို မဆက်သွယ်နိုင်ပါ။",
-       "api-error-illegal-filename": "ဖိုင်အမည်ကို ခွင့်မပြုပါ။",
-       "api-error-mustbeloggedin": "ဖိုင်တင်ရန် login ဝင်ထားရမည်။",
-       "api-error-ok-but-empty": "အတွင်းပိုင်းအမှား - ဆာဗာထံမှ တုံ့ပြန်မှု မရပါ။",
-       "api-error-unknown-code": "အမည်မသိ အမှား - \"$1\"",
+       "searchsuggest-search": "{{SITENAME}} တွင် ရှာဖွေရန်",
        "api-error-unknown-warning": "အမည်မသိ သတိပေးချက် - $1",
-       "api-error-uploaddisabled": "ဤဝီကီတွင် ဖိုင်တင်ခြင်း ပိတ်ထားသည်။",
-       "api-error-verification-error": "ဖိုင်ပျက်နေသည် (သို့) ဖိုင်နောက်ဆက် extension မှားနေသည်။",
        "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
+       "pagelang-name": "စာမျက်နှာ",
        "pagelang-language": "ဘာသာစကား",
        "pagelang-use-default": "ပင်မ ဘာသာစကားကို အသုံးပြုရန်",
        "right-pagelang": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
        "log-name-pagelang": "ဘာသာစကား ပြောင်းလဲမှု မှတ်တမ်း",
-       "log-description-pagelang": "ဤအရာသည် စာမျက်နှာ၏ဘာသာစကားများ ပြောင်းလဲမှုမှတ်တမ်း ဖြစ်သည်။"
+       "log-description-pagelang": "ဤအရာသည် စာမျက်နှာ၏ဘာသာစကားများ ပြောင်းလဲမှုမှတ်တမ်း ဖြစ်သည်။",
+       "log-action-filter-newusers": "အကောင့်ဖန်တီးမှု အမျိုးအစား:",
+       "log-action-filter-all": "အားလုံး",
+       "log-action-filter-newusers-create": "အမည်မသိ အသုံးပြုသူများမှ ဖန်တီးမှု",
+       "log-action-filter-newusers-create2": "မှတ်ပုံတင်ထားသော အသုံးပြုသူမှ ဖန်တီးမှု",
+       "log-action-filter-newusers-autocreate": "အလိုအလျောက် ဖန်တီးမှု",
+       "log-action-filter-newusers-byemail": "အီးမေးလ်မှတဆင့် စကားဝှက်ပို့၍ ဖန်တီးမှု"
 }
index e61e6d7..ecff7b5 100644 (file)
                        "Akapochtli"
                ]
        },
-       "tog-underline": "Mokìnxòîkuilòtzàswis tzòwilistìn:",
+       "tog-underline": "Moquinxoihcuilotzazhuiz tzohuiliztin:",
        "tog-hideminor": "Motlàtìs tepỉtzìn tlayèktlàlilistli ìpan welok tlapảtlalistli",
        "tog-hidepatrolled": "Motlàtìs tlapîpialli tlayèktlàlilistli ìpan welok tlapảtlalistli",
        "tog-newpageshidepatrolled": "Mokintlàtis tlapîpialtlaìxtlapaltìn ìwikpa ìtlapòpòwaltekpànal in yâyankuik tlaìxtlapaltìn",
-       "tog-extendwatchlist": "Mìxmảnas in tlapòpòwaltekpàntlachialli ìka mỏtas nochi in tlapảtlalistli, âmò in san okachi yankuik.",
+       "tog-extendwatchlist": "Mixmanaz in tlapopohualtecpantlachialli ica mottaz nochi in tlapatlaliztli, ahmo in zan ocachi yancuic.",
        "tog-usenewrc": "Molōloāzqueh in tlapatlaliztli in yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)",
        "tog-showtoolbar": "Motlaīxtlatīz in tlachihchīhualōni pāntli",
        "tog-editondblclick": "Tiquimpatlāz in zāzanilli intlā ōme tiquimpachoa",
        "tog-previewontop": "Tiquittāz achtochīhualiztli achtopa tlapatlaliztli caxitl",
        "tog-previewonfirst": "Xiquitta achtochīhualiztli inic cē tlapatlalizpan",
        "tog-enotifwatchlistpages": "Notech moēhualtia cē maltzinteyōtl netitlaniztli ihcuāc mopatla zāzanilli in notlachiyaliz.",
-       "tog-enotifusertalkpages": "Nēchihtoa ihcuāc tlecpatla motēixnāmiquiliz",
+       "tog-enotifusertalkpages": "Ma annechihtoa ica ce tetitlaniliztli ihcuāc mopatla noteixnamiquiliz",
        "tog-enotifminoredits": "Notech moēhualtia cē maltzinteyōtl netitlaniztli nō ihcuāc mopatla tepitōn zāzanilli in notlachiyaliz.",
        "tog-enotifrevealaddr": "Ticnēxtīz mo e-mailcān āxcāncayōtechcopa āmatlacuilizpan",
        "tog-shownumberswatching": "Tiquinttāz tlatequitiltilīlli tlein tlachiyacateh",
        "tog-oldsig": "Nicān tōcāyoh:",
        "tog-fancysig": "Wikitext īpan ticmatiz tōcāyoh (in ahtleh auto-link)",
        "tog-forceeditsummary": "Xinēchnōtzāz ihcuāc ahmo niquihtōz inōn ōnitlapatlac",
-       "tog-watchlisthideown": "Tiquintlātīz mopatlaliz motlachiyalizpan",
+       "tog-watchlisthideown": "Tictlatiz mopatlaliz ipan motlachiyaliz",
        "tog-watchlisthidebots": "Tiquintlātīz tepozpatlaliztli motlachiyalizpan",
-       "tog-watchlisthideminor": "Tiquintlātīz tlapatlalitzintli motlachiyalizpan",
+       "tog-watchlisthideminor": "Tictlatiz in tlapatlalitzintli ipan motlachiyaliz",
        "tog-watchlisthideliu": "Tiquintlātīz tlācah ōmocalacqueh īntlapatlaliz motlachiyalizpan",
        "tog-watchlisthideanons": "Tiquintlātīz tlācah ahtōcāitl īntlapatlaliz motlachiyalizpan",
        "tog-ccmeonemails": "Nō xinēch-mailīz ihcuāc nitē-mailīz tlatequitiltilīlli",
        "tog-showhiddencats": "Mà monèxtìkàn in tlatlatìltìn tlaìxmatkàtlàlilòmë",
        "underline-always": "Mochipa",
        "underline-never": "Aīc",
-       "editfont-monospace": "Cencoyāhualiztli machiyōtlahtōliztli",
-       "editfont-sansserif": "Sans-serif machiyōtlahtōliztli",
-       "editfont-serif": "Serif machiyōtlahtōliztli",
-       "sunday": "Īccemilhuitl",
-       "monday": "Īcōmilhuitl",
-       "tuesday": "Īcyēyilhuitl",
-       "wednesday": "Īcnāhuilhuitl",
-       "thursday": "Īcmācuīlilhuitl",
-       "friday": "Īcchicuacemilhuitl",
-       "saturday": "Īcchicōmilhuitl",
+       "editfont-monospace": "Cencoyahualiztli machiyotlahtoliztli",
+       "editfont-sansserif": "Sans-serif machiyotlahtoliztli",
+       "editfont-serif": "Serif machiyotlahtoliztli",
+       "sunday": "Iccemilhuitl",
+       "monday": "Icomilhuitl",
+       "tuesday": "Icyeyilhuitl",
+       "wednesday": "Icnahuilhuitl",
+       "thursday": "Icmacuililhuitl",
+       "friday": "Icchicuacemilhuitl",
+       "saturday": "Icchicomilhuitl",
        "sun": "Cemilhui",
        "mon": "Ōmilhui",
        "tue": "Ēyilhui",
-       "wed": "Nāuhilhui",
-       "thu": "Mācuililhui",
+       "wed": "Nahuilhui",
+       "thu": "Macuililhui",
        "fri": "6 ilhui",
        "sat": "7 ilhui",
        "january": "Icce metztli",
        "february": "Icome metztli",
-       "march": "3 Metz",
-       "april": "Ic nāuhtetl mētztli",
-       "may_long": "Ic mācuīlli mētztli",
-       "june": "Ic chicuacē mētztli",
-       "july": "7 Metz",
-       "august": "8 Metz",
-       "september": "9 Metz",
-       "october": "10 Metz",
+       "march": "Ic yetetl metztli",
+       "april": "Ic nauhtetl metztli",
+       "may_long": "Ic macuiltetl metztli",
+       "june": "Ic chicuacentetl metztli",
+       "july": "Ic chicontetl metztli",
+       "august": "Ic chicuetetl metztli",
+       "september": "Ic chiucnahtetl metztli",
+       "october": "Ic mahtlactetl metztli",
        "november": "11 Metz",
        "december": "12 Metz",
        "january-gen": "Ic cē mētztli",
        "february-gen": "Īcōmemētztli",
        "march-gen": "Īcyēyimētztli",
-       "april-gen": "Ic nāuhtetl mētztli",
+       "april-gen": "Ic nauhtetl metztli",
        "may-gen": "Īcmācuīllimētztli",
-       "june-gen": "Ic chicuacemmētztli",
-       "july-gen": "Ic chicōme mētztli",
+       "june-gen": "Ic chicuacemmetztli",
+       "july-gen": "Ic chicome metztli",
        "august-gen": "Īcchicuēyimētztli",
        "september-gen": "Īcchiucnāhuimētztli",
        "october-gen": "Īcmahtlāctetlmētztli",
        "november-gen": "Īcmahtlāctetloncēmētztli",
-       "december-gen": "Īcmahtlāctetlomōmemētztli",
-       "jan": "Ic cē",
-       "feb": "2 Metz",
-       "mar": "Ic ēyi",
-       "apr": "Nāhui",
-       "may": "Mācuilli",
-       "jun": "Chicuacē",
-       "jul": "Chicōme",
-       "aug": "Chicuēyi",
-       "sep": "Chiucnāhui",
-       "oct": "Mahtlāctli",
-       "nov": "Mahtlāctlioncē",
-       "dec": "Mahtlāctliomōme",
+       "december-gen": "Icmahtlactetlomomemetztli",
+       "jan": "Icce m",
+       "feb": "Icome m",
+       "mar": "Ic eyi m",
+       "apr": "Icnahui m",
+       "may": "Icmacuil m",
+       "jun": "Icchicuace m",
+       "jul": "Icchicome m",
+       "aug": "Icchicueyi m",
+       "sep": "Icchiucnauh m",
+       "oct": "Icmahtlac m",
+       "nov": "Icmahtlacce m",
+       "dec": "Icmahtlacome m",
        "january-date": "Īccēmētztli $1",
        "february-date": "Īcōmemētztli $1",
        "march-date": "Īquēyimētztli $1",
        "november-date": "Īcmahtlactlioncēmētztli $1",
        "december-date": "Īcmahtlactliomōmemētztli $1",
        "pagecategories": "{{PLURAL:$1|Neneuhcayotl|Neneuhcayomeh}}",
-       "category_header": "Tlâkuilòlpiltin ìpan tlaìxmatkàtlàlilòtl \"$1\"",
-       "subcategories": "Tlaìxmatkàtlàlilòpilòmë",
-       "category-media-header": "Media \"$1\" neneuhcāyōc",
-       "category-empty": "''Cah ahtlein inīn neneuhcāyōc.''",
-       "hidden-categories": "{{PLURAL:$1|tlatlàtìlli tlaìxmatkàyòtlàlilòtl|tlatlàtìltìn tlaìxmatkàyòtlàlilòme}}",
-       "hidden-category-category": "Tlatlàtìlkàtlaìxmatkàtlàlilòmë",
-       "category-subcat-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya in tetoquilli tlani-neneuhcayotl.|Inn neneuhcayotl {{PLURAL:$1|quipiya intetoquilli tlani-neneuhcayotl|in tetoquiltin $1 tlani-neneuhcayomeh}}, itech tlacecempohualoni $2.}}",
-       "category-subcat-count-limited": "Inīn {{PLURAL:$1|neneuhcāyōtzintli cah|$1 neneuhcāyōtzintli cateh}} inīn neneuhcāyōc.",
+       "category_header": "Tlahcuiloltin ipan neneuhcayotl \"$1\"",
+       "subcategories": "Tlani-neneuhcayotl",
+       "category-media-header": "Media \"$1\" ipan neneuhcayotl",
+       "category-empty": "''Ahtle oncah ipan neneuhcayotl.''",
+       "hidden-categories": "{{PLURAL:$1|tlatlatilli neneuhcayotl|tlatlatiltin neneuhcayomeh}}",
+       "hidden-category-category": "Tlahyanalli neneuhcayotl",
+       "category-subcat-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya in tetoquilli tlani-neneuhcayotl.|Inin neneuhcayotl {{PLURAL:$1|quipiya in tetoquilli tlani-neneuhcayotl|in tetoquiltin $1 tlani-neneuhcayomeh}}, itech tlacecempohualoni $2.}}",
+       "category-subcat-count-limited": "Inin {{PLURAL:$1|neneuhcayotl quipiya|$1 in tetoquilli tlani-neneuhcayotl|in tetoquiltin tlani-neneuhcayomeh}}.",
        "category-article-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya in tetoquilli tlahcuilolli.|{{PLURAL:$1|In tetoquilli tlahcuilolli itech pohui|In tetoquiltin $1 tlahcuiloltin itech pohui}}, inin neneuhcayotl itech tlacecempohualoni ipan $2.}}",
        "category-article-count-limited": "Inīn {{PLURAL:$1|zāzanilli cah|$1 zāzanilli cateh}} inīn neneuhcāyōc.",
-       "category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl san kipia|Inìn tlaìxmatkàyòtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîke $1 èwaltìn}}, ìwikpa $2.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Inìn tlâkuilòlèwalli kä|Inîkë $1 tlâkuilòlèwaltìn katêkë}} ìpan inìn tlaìxmatkàtlàlilòtl.",
+       "category-file-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya|Inin neneuhcayotl quimpiya {{PLURAL:$1|inin ehualli|inihqueh $1 ehualtin}}, ihuicpa $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Inin tlahcuilolehualli kah|Inihqueh $1 tlahcuilolehualtin catehqueh}} ipan inin neneuhcayotl.",
        "listingcontinuesabbrev": "niman",
-       "about": "Ītechcopa",
-       "article": "Tlâkuilòpilli",
-       "newwindow": "(Motlapoāz cē yancuīc tlanexillōtl)",
+       "about": "Itechcopa",
+       "article": "Tlahcuilolamatl",
+       "newwindow": "(Motlapoaz ce yancuic tlanexillotl)",
        "cancel": "Moxitiniz",
        "moredotdotdot": "Huehca ōmpa...",
        "mypage": "Noāmauh",
        "mytalk": "Teixnamiquiliztli",
-       "anontalk": "Tēixnāmiquiliztli",
-       "navigation": "Nēnemōhualiztli",
+       "anontalk": "Teixnamiquiliztli",
+       "navigation": "Panoliztli",
        "and": "&#32;ihuan",
-       "qbfind": "Xicahci",
+       "qbfind": "Tlatemoliztli",
        "qbbrowse": "Xitlatepotztoca",
        "qbedit": "Xicpatla",
        "qbpageoptions": "Inīn tlaīxtli",
        "faqpage": "Project:FAQ",
        "actions": "Āyiliztli",
        "namespaces": "Tocatlacauhtli",
-       "variants": "Nepāpan",
+       "variants": "Nepapan",
        "navigation-heading": "Nemiliztlahtolpohualamatl",
        "errorpagetitle": "Aiuhcāyōtl",
-       "returnto": "Ximocuepa īhuīc $1.",
+       "returnto": "Ximocuepa ihuic $1.",
        "tagline": "Itechcopa {{SITENAME}}",
        "help": "Tepalehuiliztli",
        "search": "Tlatemoliztli",
        "searchbutton": "Tlatemoliztli",
-       "go": "Xiyauh",
-       "searcharticle": "Xiyauh",
-       "history": "Tlaīxtli ītlahtōllo",
+       "go": "Yaliztica",
+       "searcharticle": "Yaliztica",
+       "history": "Tlahtollotl",
        "history_short": "Tlahtollotl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
        "printableversion": "Tepoztlahcuilolli",
        "view-foreign": "Īpan xiquitta in $1",
        "edit": "Xicpatla",
        "edit-local": "Xicpatla nicān tlahtōlli",
-       "create": "Xicchīhua",
+       "create": "Xicchihua",
        "create-local": "Xicahxilti nicān tlahtōlli",
-       "editthispage": "Xicpatla inīn tlaīxtli",
+       "editthispage": "Xicpatla inin tlahcuilolamatl",
        "create-this-page": "Xicchīhua inīn tlaīxtli",
        "delete": "Xicpolo",
        "deletethispage": "Xicpolo inīn tlaīxtli",
        "protectthispage": "Xicpiya inīn tlaīxtli",
        "unprotect": "Xicpatla in tlapiyaliztli",
        "unprotectthispage": "Xicpatla inīn tlaīxtli ītlapiyaliz",
-       "newpage": "Yancuic tlaīxtli",
+       "newpage": "Yancuic tlahcuilolli",
        "talkpage": "Xictlahto inīn tlaīxtli ītechcopa",
        "talkpagelinktext": "Teixnamiquiliztli",
-       "specialpage": "Nònkuâkìskàtlaìxtlapalli",
+       "specialpage": "Noncuahquizcatlahcuilolamatl",
        "personaltools": "In tlein nitēquitiltilia",
-       "articlepage": "Xiquitta in tlamantlaīxtli",
+       "articlepage": "Xiquitta tlahcuilolamatl",
        "talk": "Teixnamiquiliztli",
        "views": "Tlachiyaliztli",
        "toolbox": "Tequitihualoni",
        "userpage": "Xiquitta tlatequitiltilīlli zāzanilli",
        "projectpage": "Xiquitta tlachīhualiztli zāzanilli",
-       "imagepage": "Xiquitta in zāzanilli īāma",
-       "mediawikipage": "Xiquitta tlahcuilōltzin zāzanilli",
-       "templatepage": "Xiquitta neīxcuītīllaīxtli",
+       "imagepage": "Tiquittaz in tlahcuilolamatl itecpanaliztlapiyaliz",
+       "mediawikipage": "Xiquitta tetitlaniliztli itlahcuilolamauh",
+       "templatepage": "Xiquitta tlahcuilolamatl ineixcuitil",
        "viewhelppage": "Xiquitta tēpalēhuiliztli zāzanilli",
-       "categorypage": "Mà mỏta in tlaìxmatkàyòtlàlilòtlaìxtlapalli",
+       "categorypage": "Tiquittaz neneuhcayotl itlahcuilolamauh",
        "viewtalkpage": "Xiquitta tēixnāmiquiliztli zāzanilli",
-       "otherlanguages": "Occequīntīn tlahtōlcopa",
+       "otherlanguages": "Occequintin tlahtlahtolcopa",
        "redirectedfrom": "(Ōmotlacuep īhuīcpa $1)",
        "redirectpagesub": "Ōmotlacuep zāzanilli",
        "lastmodifiedat": "Inin tlahcuilolli omopatlac immanin $1, ipan $2.",
        "viewcount": "Inīn zāzanilli quintlapōhua {{PLURAL:$1|cē tlahpololiztli|$1 tlahpololiztli}}.",
        "protectedpage": "Ōmoquīxtix zāzanilli",
        "jumpto": "Īhuīcpa ticholōz:",
-       "jumptonavigation": "nēnemōhualiztli",
+       "jumptonavigation": "amapanoliztli",
        "jumptosearch": "Tlatemoliztli",
        "aboutsite": "Itechcopa {{SITENAME}}",
        "aboutpage": "Project:Itechcopa",
-       "copyright": "In tlahcuilōlli cah tlacēcencāhuani īpan $1 tel ahmo intlā īcuepca motēnēhua.",
+       "copyright": "In tlahcuilolpiyaliztli cah tlani tlacecencahuani $1 tel ahmo icuepca motenehua.",
        "copyrightpage": "{{ns:project}}:Tlachīhualōni ītlapiyaliz",
        "currentevents": "Axcancayotl",
-       "currentevents-url": "Project:Āxcāncāyōtl",
+       "currentevents-url": "Project:Axcancayotl",
        "disclaimers": "tlamamalquixtiliztli",
-       "edithelp": "Tlapatlaliztechcopa tēpalēhuiliztli",
+       "edithelp": "Tepalehuiliztli ica tlapatlaliztli",
        "helppage-top-gethelp": "Tēpalēhuiliztli",
        "mainpage": "Yacatlahcuilolli",
        "mainpage-description": "Yacatlahcuilolli",
        "privacy": "Tlahcuilolli piyaliznahuatilli",
        "privacypage": "Project:Tlahcuilōlpiyaliztechcopa nahuatīltōn",
        "badaccess": "Tlahuelītiliztechcopa ahcuallōtl",
-       "badaccess-group0": "Tehhuātl ahmo tiquichīhua inōn tiquiēlēhuia.",
-       "badaccess-groups": "Inōn tiquiēlēhuia zan quichīhuah tlatequitiltilīlli {{PLURAL:$2|oncān}}: $1.",
-       "ok": "Cualli",
+       "badaccess-group0": "Tehhuatl ahmo hueli ticchihua in tlein tiquelehuia.",
+       "badaccess-groups": "Inin tlen tiquelehuia zan quichihuah tequitiuhqueh {{PLURAL:$2|itech necentlaliliztli| centetl itech inin $2 necentlaliliztin}}: $1.",
+       "ok": "Cayecualli",
        "retrievedfrom": "Ōquīzqui ītech  \"$1\"",
        "youhavenewmessages": "Tiquimpiya $1 ($2).",
        "youhavenewmessagesmulti": "Tiquimpiya yancuīc tlahcuilōlli īpan $1",
        "site-rss-feed": "$1 RSS huelītiliztli",
        "site-atom-feed": "$1 Atom huelītiliztli",
        "page-rss-feed": "\"$1\" RSS huelītiliztli",
-       "page-atom-feed": "\"$1\" RSS huelītiliztli",
-       "red-link-title": "$1 (ahmo oncah tlahcuilolli)",
-       "nstab-main": "Tlahcuilolli-amatl",
-       "nstab-user": "Tlatequitiltilīlli",
-       "nstab-media": "Mēdiatl",
+       "page-atom-feed": "\"$1\" RSS huelitiliztli",
+       "red-link-title": "$1 (ahmo oncah tlahcuilolamatl)",
+       "nstab-main": "Tlahcuilolamatl",
+       "nstab-user": "Tequitiuhqui itlahcuilolamauh",
+       "nstab-media": "Multimedia",
        "nstab-special": "Noncuahquizqui tlahcuilolli",
        "nstab-project": "Ìtlaìxtlapal in tlayẻkàntekitl",
        "nstab-image": "Tlahcuilolpiyalli",
        "nstab-mediawiki": "Tlahcuilōltzintli",
-       "nstab-template": "Nemachiòtl",
-       "nstab-help": "Tèpalèwilistli",
+       "nstab-template": "Nemachiyotilli",
+       "nstab-help": "Tepalehuiliztli",
        "nstab-category": "Neneuhcayotl",
        "mainpage-nstab": "Yacatlahcuilolli",
        "nosuchaction": "Ahmo ia tlachīhualiztli",
        "filerenameerror": "Ahmō ōmohuelītic tlazaca \"$1\" īhuīc \"$2\".",
        "filedeleteerror": "Ahmō ōmohuelītic tlapoloa \"$1\".",
        "filenotfound": "Ahmō ōmohuelītic tlanāmiqui \"$1\".",
-       "cannotdelete": "Ahmō ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
-       "badtitle": "Ahcualli tōcāitl",
+       "cannotdelete": "Ahmo omopoloh in tlahcuilolamatl \"$1\".\nHueli tlein occe tequitiuhqui oquipoloh achtopa.",
+       "badtitle": "Ahcualli tocaitl",
        "badtitletext": "Zāzanilli ticnequi in ītōca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tōcāhuicpa.\nHueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.",
-       "viewsource": "Xiquitta mēyalli",
+       "viewsource": "Tiquittaz itzintiliz",
        "viewsource-title": "Xiquitta in $1 īmēyal",
        "actionthrottled": "Tlachīhualiztli ōmotzacuili",
        "viewsourcetext": "Tihuelīti tiquittaz auh ticcopīnaz inīn zāzanilli īmachiyōnecaquilizmēyal.",
        "virus-unknownscanner": "ahmatic antivirus:",
        "welcomeuser": "Ximopanōlti, $1!",
        "yourname": "Tequihuihcātōcāitl:",
-       "userlogin-yourname": "Tequihuihcātōcāitl",
+       "userlogin-yourname": "Tequitiuhcatocaitl",
        "userlogin-yourname-ph": "Xiquihcuilo motoca iuhqui tequitihuani",
        "yourpassword": "Motlahtōlichtacāyo",
        "userlogin-yourpassword": "Ichtacamachiyotl",
        "yourdomainname": "Moāxcāyō",
        "login": "Xicalaqui",
        "nav-login-createaccount": "Ximocalaqui / ximomachiyōmaca",
-       "userlogin": "Ximomachiyōmaca/Ximocalaqui",
+       "userlogin": "Ximomachiyomaca/Ximocalaqui",
        "userloginnocreate": "Ximocalaqui",
        "logout": "Xiquīza",
        "userlogout": "Xiquīza",
        "notloggedin": "Ahmō ōtimocalac",
-       "userlogin-noaccount": "Cuix ahmō titlapōhualeh?",
+       "userlogin-noaccount": "Cuix ahmo titlapohualeh?",
        "nologin": "Cuix ahmō titlapōhualeh? $1.",
        "nologinlink": "Xicchīhua cē tlapōhualli",
        "createaccount": "Xicchīhua tlapōhualli",
        "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": "Tleīpampa:",
+       "createaccountreason": "Tleipampa:",
        "createacct-reason": "Tleīpampa",
        "createacct-submit": "Xicchīhua in motlapōhual",
        "badretype": "Ahneneuhqui motlahtōlichtacāyo.",
        "noname": "Ahmo ōtiquihto cualli tlatequitiltilīlli tōcāitl.",
        "loginsuccesstitle": "Ōticalac",
        "loginsuccess": "'''Ōticalac {{SITENAME}} quemeh \"$1\".'''",
-       "nosuchuser": "Ayāc tlatequitiltilīlli motōcāitīlo «$1».\nn tlatequitiltilīltōcāitl quimati in huēyimachiyōtlahtōliztli.\nXiquitta moyēquihcuilōl, ahnozo [[Special:CreateAccount|xicchīhua yancuīc cuentah]].",
+       "nosuchuser": "Ahmo oncah tequitiuhqui tlen quipiya tocaitl «$1».\nIn tequitiuhqueh intoca monequi pehua ic hueyimachiyotlahtoliztli.\nXiquitta moyequihcuilol, ahnozo [[Special:CreateAccount|xicchihua yancuic cuentah]].",
        "nosuchusershort": "Ayāc tlatequitiltilīlli motōcāitia \"$1\". Xiquitta in tlein ōtitlahcuiloh melāhuacā cah.\nXiquitta moyēquihcuilōl.",
        "nouserspecified": "Mohuīquilia tiquihtoa cualli tlatequitiltilīltōcāitl.",
        "wrongpassword": "Ahcualli motlahtōlichtacāyo.\nTimitztlātlauhtia xicchīhua occeppa.",
        "changepassword-success": "Moichtacātlahtōl ōmopatlac.",
        "resetpass_forbidden": "Tlahtōlichtacayōtl ahmo mohuelītih mopatlah",
        "resetpass-submit-loggedin": "Ticpatlāz motlahtōlichtacāyo",
-       "resetpass-submit-cancel": "Xiccāhua",
+       "resetpass-submit-cancel": "Xiccahua",
        "passwordreset-username": "Tequihuihcātōcāitl:",
-       "bold_sample": "Tlīltic tlahcuilōlli",
+       "bold_sample": "Tliltic tlahcuilolpiyaliz",
        "bold_tip": "Tlīltic tlahcuilōlli",
-       "italic_sample": "Cōliuhqui tlahcuilōliztli",
-       "italic_tip": "Cōliuhqui tlahcuilōliztli",
+       "italic_sample": "Nacacic tlahcuiloliztli",
+       "italic_tip": "Nacacic tlahcuiloliztli",
        "link_sample": "Tzonhuiliztli ītōcā",
        "link_tip": "Tlahtic tzonhuiliztli",
        "extlink_sample": "http://www.machiyōtl.com Tzonhuiliztōcāitl",
        "extlink_tip": "Calān tzonhuiliztli (xiquilnamiqui ticaquiāz in http://)",
        "headline_sample": "Cuātlahcuilōlli",
        "headline_tip": "Iuhcāyōtl 2 tōcāyōtl",
-       "image_sample": "Machiyōtl.jpg",
-       "media_sample": "Machiyōtl.ogg",
+       "image_sample": "Machiyotl.jpg",
+       "media_sample": "Machiyotl.ogg",
        "media_tip": "Mēdiahuīc tzonhuiliztli",
        "sig_tip": "Motōcā īca cāhuitl",
        "hr_tip": "Pāntli",
        "summary": "Mopatlaliz:",
-       "subject": "Ītechpa:",
-       "minoredit": "Ca tepitōn inīn tlapatlaliztli",
-       "watchthis": "Xicpiya inīn tlaīxtli",
+       "subject": "Itechpa:",
+       "minoredit": "Ca tepiton inin tlapatlaliztli",
+       "watchthis": "Tictlachiyaz inin tlahcuilolli",
        "savearticle": "Xicpiya tlahcuilolli",
        "preview": "Xiquitta achtochīhualiztli",
-       "showpreview": "Xiquitta achtochīhualiztli",
-       "showdiff": "Xicnēxti tlapatlaliztli",
+       "showpreview": "Xiquitta achtochihualiztli",
+       "showdiff": "Monextiz tlapatlaliztli",
        "missingcommenttext": "Timitztlātlauhtiah xitlanitlahcuiloa.",
        "summary-preview": "Tlahcuilōltōn achtochīhualiztli:",
        "blockedtitle": "Ōmotzacuili tlatequitiltilīlli",
        "blockednoreason": "ahmo cah īxtlamatiliztli",
-       "whitelistedittext": "Tihuīquilia $1 ic ticpatla zāzaniltin.",
-       "nosuchsectiontitle": "In xeliuhcāyōtl ahmo ōquināmic",
+       "whitelistedittext": "Monequi tlen $1 ic ticpatla tlahcuilolamatl.",
+       "nosuchsectiontitle": "In xeliuhcayotl ahmo oquinamic",
        "loginreqtitle": "Ximocalaqui",
        "loginreqlink": "ximocalaqui",
-       "loginreqpagetext": "Tihuīquilia $1 ic tiquintta occequīntīn zāzaniltin.",
+       "loginreqpagetext": "Monequi $1 ic tiquimitta occequintin tlahcuilolamameh.",
        "accmailtitle": "Tlahtōlichtacāyōtl ōmoihuah.",
-       "accmailtext": "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
+       "accmailtext": "Oquiyocox ce ichtacatlahtolli ipan [[User talk:$1|$1]] auh omoquititlan ihuic $2. Hueli ticpatlazquia ipan ''[[Special:ChangePassword|Ticpatlaz in ]]'' niman oticalaco achtopa.",
        "newarticle": "(Yancuic)",
        "newarticletext": "Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [$1 tēpalēhuiliztli zāzanilli] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.",
-       "noarticletext": "In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.\nTihuelīti [[Special:Search/{{PAGENAME}}|tictēmōz inīn zāzanilli ītōca]] occequīntīn zāzanilpan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xictēmoa īpan in tlapōhualāmatechpa],\nahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} xichīhua inīn zāzanilli]</span>.",
+       "noarticletext": "In axcan, ahmo oncah tlahcuilolli ipan inin amatl.\nTihueliti [[Special:Search/{{PAGENAME}}|tictemoz inin tlahcuilolli itoca]] occequintin tlahcuilolli,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xictemoa ipan in occe tlahcuilolmachiyotl],\nahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} xichihua inin tlahcuilolli]</span>.",
        "userpage-userdoesnotexist": "Ahmo ia cuentah \"<nowiki>$1</nowiki>\" ītōca. Timitztlātlauhtiah xitēchquinōtza intlā ticchīhuāz intlā nozo ticpatlāz inīn zāzanilli.",
        "usercsspreview": "'''Ca inīn moachtochīhualiz ītechcopa moCSS.'''\n'''¡Ahmo ōmochīuh nozan!'''",
        "userjspreview": "'''Ca inīn moachtochīhualiz ītechcopa moJavaScript.'''\n'''¡Ahmo ōmochīuh nozan!'''",
        "updated": "(Ōmoyancuīli)",
        "note": "'''Tlahtōlcaquiliztilōni:'''",
-       "previewnote": "'''Xiquilnamiqui tein inīn zan tlaachtopaittaliztli.'''\n¡Motlapatlaliz ayamo ōquinpix!",
+       "previewnote": "'''Xiquilnamiqui tlein inin zan tlaachtopaittaliztli.'''\n¡Ayamo omopix motlapatlaliz!",
        "editing": "Ticpatla $1",
        "creating": "Ticchīhua $1",
        "editingsection": "Ticpatlacah $1 (tlahtōltzintli)",
-       "editingcomment": "Ticpatlacah $1 (tlahtōltzintli)",
+       "editingcomment": "tlapatlaliztli itech $1 (yancuic xeliuhcayotl)",
        "editconflict": "Tlapatlaliztli yāōyōtōn: $1",
-       "yourtext": "Motlahcuilōl",
+       "yourtext": "Motlahcuilolpiyaliz",
        "yourdiff": "Ahneneuhquiliztli",
-       "copyrightwarning": "<small>Timitztlātlauhtiah xiquitta mochi mopatlaliz cana {{SITENAME}} tlatzayāna īpan $2 (huēhca ōmpa xiquitta $1). Āqueh tlācah quipatlazqueh in motlahcuilōl auh tlatzayāna occeppa; intlā ahmō ticnequi, zātēpan ahmō titlahcuilōz nicān. Nō mitzihtoah in ōtitlahcuiloh ahmō quipiya in copyright nozo in yōllōxoxouhqui tlahcuilōlli. '''¡AHMŌ XITĒQUITILTIA AHYŌLLŌXOXOUHQUI TLAHCUILŌLLI!'''</small>",
+       "copyrightwarning": "<small>Timitztlatlauhtiah ximomati mochi ipatlaliz ihuicpa {{SITENAME}} tiquittah iuhqui tetlanextililiztli tlanipa $2 (xiquitta $1 itech oc tlahtolmelahualiztli). Intlacamo tiquelehuia occequintin tlacah quipatlazqueh motlahcuilol ihuan quipanitlazazqueh, macamo xitlahcuiloz nican. No titechcemihtoa in tlein otiquihcuiloh ahmo quipiya in copyright ihuan itech pohui in yolloxoxouhqui tlahcuilolli. '''¡AHMO XICTEQUITILTIA AHYOLLOXOXOUHQUI TLAHCUILOLLI!'''</small>",
        "copyrightwarning2": "<small>Āqueh tlācah quipatlazqueh in motlahcuilōl auh tlatzayāna occeppa; intlā ahmō ticnequi, zātēpan ahmō titlahcuilōz nicān {{SITENAME}}. Nō mitzihtoah in ōtitlahcuiloh ahmō quipiya in copyright nozo in yōllōxoxouhqui tlahcuilōlli (huēhca ōmpa xiquitta $1). '''¡AHMŌ TIQUINTEQUITILTIA AHYŌLLŌXOXOUHQUI TLAHCUILŌLLI!'''</small>",
        "longpageerror": "'''Aiuhcāyōtl: In tlahcuilōlli tlein ōtiquihuah tlatamachīhua {{PLURAL:$1|cē kilobyte|$1 kilobyte}}, tzonēhua {{PLURAL:$2|cē kilobyte|$2 kilobyte}}. Ahmo mopiyāz.'''",
-       "templatesused": "{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn tlaìxtlapalli:",
-       "templatesusedpreview": "{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn achtochìwalistli:",
-       "templatesusedsection": "{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn tlaxélòlistli:",
+       "templatesused": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin tlahcuilolamatl:",
+       "templatesusedpreview": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin achtochihualiztli:",
+       "templatesusedsection": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin tlaxeloliztli:",
        "template-protected": "(ōmoquīxti)",
-       "hiddencategories": "Inīn zāzanilli mopiya {{PLURAL:$1|1 neneuhcāyōc ōmotlāti|$1 neneuhcāyōc ōmotlāti}}:",
-       "nocreatetext": "Inīn huiqui ōquitzacuili tlahuelītiliztli ic tlachīhua yancuīc zāzaniltin. Tichuelīti ticcuepa auh ticpatla cē zāzanilli, [[Special:UserLogin|xicalaqui nozo xicchīhua cē cuentah]].",
-       "nocreate-loggedin": "Ahmo tihuelīti tiquinchīhua yancuīc zāzaniltin.",
+       "hiddencategories": "Inin tlahcuilolli pohui {{PLURAL:$1|1 tlatlalilli neneuhcayotl|$1 tlatlaliltin neneuhcayomeh}}:",
+       "nocreatetext": "Inin huiqui oquitzacuili ic mochihua yancuic tlahcuilolamatl. Quil ticcuepaznequi auh ticpatlaz occe tlahcuilolamatl, [[Special:UserLogin|xicalaqui nozo xicchihua ce cuentah]].",
+       "nocreate-loggedin": "Ahmo hueli ticchihua yancuic tlahcuilolamatl.",
        "permissionserrors": "Tēmācāhualiztli aiuhcāyōtl",
        "permissionserrorstext": "Ahmo tihuelīti quichīhua inōn, inīn {{PLURAL:$1|īxtlamatilizpampa}}:",
        "permissionserrorstext-withaction": "Ahmo tiquihuelīti $2 inīn {{PLURAL:$1|īxtlamatilizpampa}}:",
-       "moveddeleted-notice": "Inīn zāzanilli ōmopolo.\nIn tlapololiztli īhuān in tlazacaliztli tlahcuilōlloh cah tlani.",
+       "moveddeleted-notice": "Inin tlahcuilolamatl omopoloh.\nIn tlapololiztli ihuan in tlazacaliztli tlahcuilolloh cah tlani.",
        "edit-gone-missing": "Ahmo huelīti yancuīya zāzanilli.\nHueliz ōmopolo.",
        "edit-conflict": "Tlapatlaliztli yāōyōtōn",
        "edit-already-exists": "Ahmo mohuelīti mochīhua yancuīc zāzanilli.\nYe ia.",
        "nohistory": "Nicān ahmō oncah tlaīxtlapatlaliztlahtōllōtl.",
        "currentrev": "Āxcān tlapatlaliztli",
        "currentrev-asof": "Āxcān tlachiyaliztli īpan $1",
-       "revisionasof": "Tlachiyaliztli īpan $1",
-       "revision-info": "Tlachiyaliztli īpan $1 īpal {{GENDER:$6|$2}}$7",
-       "previousrevision": "← Huēhueh tlapatlaliztli",
-       "nextrevision": "Yancuīc tlapatlaliztli →",
-       "currentrevisionlink": "Āxcān tlapatlaliztli",
-       "cur": "āxcān",
+       "revisionasof": "Tlachiyaliztli ipan $1",
+       "revision-info": "Tlachicahualiztli ixquichca $1 ihuicpa {{GENDER:$6|$2}}$7",
+       "previousrevision": "← Huehueh tlapatlaliztli",
+       "nextrevision": "Yancuic tlapatlaliztli →",
+       "currentrevisionlink": "Axcan tlapatlaliztli",
+       "cur": "axcan",
        "next": "niman",
-       "last": "xōcoyōc",
+       "last": "xocoyoc",
        "page_first": "achto",
        "page_last": "xōcoyōc",
        "history-fieldset-title": "Xitlatēmo īpan tlahtōllōtl",
-       "history-show-deleted": "Zan tlapolōlli",
+       "history-show-deleted": "Zan tlapololtin",
        "histfirst": "in achto",
        "histlast": "in tlatzaucticah",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "rev-delundel": "tiquittāz/tictlātīz",
        "rev-showdeleted": "xicnēxti",
        "revisiondelete": "Tiquimpolōz/ahtiquimpolōz tlachiyaliztli",
-       "revdelete-show-file-submit": "Quēmah",
+       "revdelete-show-file-submit": "Quemah",
        "revdelete-hide-text": "In tlahtlachiyaliztli ītlahcuilōl",
        "revdelete-hide-image": "Tictlātīz tlahcuilōlli ītlapiyaliz",
-       "revdelete-radio-set": "Tlaīnāyalli",
-       "revdelete-radio-unset": "Ittalōni",
+       "revdelete-radio-set": "Tlahnayalli",
+       "revdelete-radio-unset": "Ittaloni",
        "revdelete-log": "Tleīpampa:",
        "revdel-restore": "Ticpatlāz tlattaliztli",
        "pagehist": "Tlaīxtli ītlahtōllo",
        "mergehistory-autocomment": "Ōmocēntili [[:$1]] īpan [[:$2]]",
        "mergehistory-comment": "Ōmocēntili [[:$1]] īpan [[:$2]]: $3",
        "mergehistory-reason": "Tleīpampa:",
-       "revertmerge": "Tiquīxipehuaz",
+       "revertmerge": "Ticahtletiliz in cetiliztli",
        "history-title": "«$1» ītlaceppahuiliztlahtōllo",
-       "lineno": "Pāntli $1:",
+       "lineno": "Pantli $1:",
        "editundo": "Ticxitiniz",
        "searchresults": "motlatemoliz itlananquilizhuan",
        "searchresults-title": "«$1» tlatemoliztli imochihualiz",
        "prevn": "{{PLURAL:$1|$1}} achtopa",
        "nextn": "niman {{PLURAL:$1|$1}}",
-       "shown-title": "Quinēxiltīz $1 {{PLURAL:$1|mochīhualiztli}} cece āmac",
+       "shown-title": "Monextiz $1 {{PLURAL:$1|mochihualiztli}} cecen amatl",
        "viewprevnext": "Xiquintta ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Ye ia zāzanilli ītōca \"[[$1]]\" inīn huiquipan'''",
-       "searchmenu-new": "<strong>Ticchīhuāz in zāzanilli «[[:$1]]» inīn huiquipan.</strong> {{PLURAL:$2|0=|Nō xiquitta in tlanāmiquiliztli in mochīhualiztli.}}",
-       "searchprofile-articles": "Tlapiyaliztli zāzanilli",
+       "searchmenu-new": "<strong>Ticchihuaz in tlahcuilolamatl «[[:$1]]» inin huiquipan.</strong> {{PLURAL:$2|0=|No xiquitta in tlanamiquiliztli itech tlatemoliztli.}}",
+       "searchprofile-articles": "Itech tlahcuilolamatl",
        "searchprofile-images": "Nepapan media",
        "searchprofile-everything": "Mochi",
        "searchprofile-advanced": "Huehca ōmpa",
        "searchprofile-articles-tooltip": "Tictēmōz īpan $1",
-       "searchprofile-images-tooltip": "Tiquintēmōz tlahcuilōlli",
+       "searchprofile-images-tooltip": "motemoz tlapiyaliztecpaliztli",
        "searchprofile-everything-tooltip": "Tictēmōz mochi tlapiyalizpan (mopiyah tēixnāmiquiliztli zāzanilli)",
        "search-result-size": "$1 ({{PLURAL:$2|1 tlahtōl|$2 tlahtōltin}})",
        "search-redirect": "(ixquichca ompa mitzhuica $1)",
        "search-section": "(tlahtōltzintli $1)",
-       "search-category": "(tlaìxmatkàyòtlàlilòtl $1)",
+       "search-category": "(neneuhcayotl $1)",
        "search-suggest": "Ahnōceh tiquihtōznequiya: $1",
        "search-interwiki-caption": "Tlachīhualiztli īcnīhuān",
        "search-interwiki-more": "(huehca ōmpa)",
        "powersearch-togglenone": "Ahtlein",
        "search-external": "Tlatēmotiliztli calāmpa",
        "preferences": "Panitlatlālīlli",
-       "mypreferences": "Notlaēlēhuiliz",
+       "mypreferences": "Notlaelehuiliz",
        "prefs-edits": "Tlapatlaliztli tlapōhualli:",
        "prefs-skin": "Ēhuatl",
-       "skin-preview": "Xiquitta quemeh yez",
+       "skin-preview": "Xiquitta quenin yez",
        "datedefault": "Ayāc tlanequiliztli",
        "prefs-labs": "Ìntlâtlamảtilis in tlayêyẻkòyàntìn",
        "prefs-personal": "Tequihuihcātlapōhualli",
        "prefs-rc": "Yancuic tlapatlaliztli",
        "prefs-watchlist": "Tlachiyaliztli",
        "prefs-watchlist-days": "Tōnaltin tiquinttāz tlachiyalizpan:",
-       "prefs-watchlist-edits": "Tlapatlaliztli tiquintta tlachiyalizpan:",
+       "prefs-watchlist-edits": "Oc cencah tlapohualli itech tlapatlaliztli tlen monextia ipan canahuac tlatecpanaliztli:",
        "prefs-misc": "Zāzo",
        "prefs-resetpass": "Ticpatlāz motlahtōlichtacāyo",
        "saveprefs": "Xicpiya",
        "prefs-editing": "Tlapatlaliztli",
-       "rows": "Pāntli:",
-       "searchresultshead": "Tlatēmoliztli",
+       "searchresultshead": "Tlatemoliztli",
        "recentchangesdays": "Tōnaltin tiquinttāz yancuīc tlapatlalizpan:",
        "localtime": "Cāhuitl nicān:",
        "timezoneregion-africa": "Africa",
-       "timezoneregion-america": "Ixachitlān",
+       "timezoneregion-america": "America",
        "timezoneregion-antarctica": "Antártida",
        "timezoneregion-arctic": "Ártico",
        "timezoneregion-asia": "Asia",
-       "timezoneregion-atlantic": "Atlántico Ilhuicaātl",
+       "timezoneregion-atlantic": "Atlantico Ilhuicaatl",
        "timezoneregion-australia": "Australia",
        "timezoneregion-europe": "Europan",
-       "timezoneregion-indian": "Índico Ilhuicaātl",
-       "timezoneregion-pacific": "Pacífico Ilhuicaātl",
+       "timezoneregion-indian": "Indico Ilhuicaatl",
+       "timezoneregion-pacific": "Pacifico Ilhuicaatl",
        "prefs-searchoptions": "Titlatēmōz",
        "prefs-namespaces": "Tōcātlacāuhtli",
        "default": "ic default",
        "username": "{{GENDER:$1|Tequihuihcātōcāitl}}:",
        "prefs-memberingroups": "{{GENDER:$2|Tlacotōncayōtl}} in {{PLURAL:$1|tēolōlolli|tēolōloltin}}",
        "yourrealname": "Melāhuac motōcā:",
-       "yourlanguage": "Tlahtōlli:",
+       "yourlanguage": "Tlahtolli:",
        "yournick": "Motōcātlaliz:",
-       "badsiglength": "Motōcātlaliz cah ocachi huēyac.\nAhmo quihuīquilia quimpiya achi $1 {{PLURAL:$1|machiyōtlahtōliztli}}.",
+       "badsiglength": "Motocatlaliz cah huel hueyac.\nAhmo hueli quipiya achi $1 {{PLURAL:$1|machiyotlahtoliztli}}.",
        "gender-male": "Oquichtli",
        "gender-female": "Cihuātl",
        "email": "E-mail",
        "prefs-help-email-required": "Tihuīquilia quihcuiloa mo e-mailcān.",
        "prefs-signature": "Motōcā",
        "userrights-user-editname": "Xihcuiloa cē tlatequitiltilīltōcāitl:",
-       "editusergroup": "Tiquimpatlāz {{GENDER:$1|tlatequitiltilīlli}} īolōl",
+       "editusergroup": "Tiquimpatlaz {{GENDER:$1|tequitiuhqui}} itlacentlalilizhuan",
        "userrights-editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
-       "saveusergroups": "Tiquimpiyāz {{GENDER:$1|tlatequitiltilīlli}} īolōl",
+       "saveusergroups": "Tiquimpiyaz {{GENDER:$1|tequitiuhqui}} itlacentlalilizhuan",
        "userrights-groupsmember": "Olōlco:",
        "userrights-reason": "Īxtlamatiliztli:",
        "userrights-no-interwiki": "Ahmo tihuelīti ticpatla tlatequitiltilīlli huelītiliztli occequīntīn huiquipan.",
-       "group": "Olōlli:",
+       "group": "Necentlaliliztli:",
        "group-user": "Tequihuihqueh",
        "group-bot": "Tepoztlācah",
        "group-sysop": "Tlahcuilōlpixqueh",
        "rightslog": "Tlatequitiltilīlli huelītiliztli tlahcuilōlloh",
        "action-read": "xāmapōhua inīn tlaīxtli",
        "action-edit": "xicpatla inīn tlaīxtli",
-       "action-createpage": "xicchīhua inīn āmatl",
-       "action-createtalk": "xicchīhuā inīn tēixnāmiquiliztli zāzaniltin",
+       "action-createpage": "xicchihua inin tlahcuilolamatl",
+       "action-createtalk": "xicchihua inin tlahcuilolamatl iteixnamiquiliz",
        "action-createaccount": "ticchīhuaz inīn tlatequitiltilīlli īcuentah",
        "action-move": "ticpatlāz inīn zāzanilli",
        "action-move-subpages": "tiquimpatlāz inīn zāzanilli īhuān zāzaniltōn",
        "enhancedrc-history": "Tlahtollotl",
        "recentchanges": "Yancuic tlapatlaliztli",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
-       "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
+       "recentchanges-summary": "Tictoquiliz itlapatlaliz oc yancuic inahuac huiqui inin tlahcuilolpan.",
        "recentchanges-label-newpage": "Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl",
-       "recentchanges-label-minor": "Ca tepitōn inīn tlapatlaliztli",
-       "rclistfrom": "Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $3 $2",
+       "recentchanges-label-minor": " Inin tepiton tlapatlaliztli",
+       "recentchanges-label-bot": "Inin tlapaltlaliztli oquichiuh ce robot",
+       "rclistfrom": "Xiquittaz yancuic tlapatlaliztli ixquichca $3 ihuicpa $2",
        "rcshowhideminor": "$1 tlapatlalitzintli",
-       "rcshowhideminor-show": "Ticnēxtīz",
-       "rcshowhidebots": "$1 tepoztlācah",
-       "rcshowhidebots-show": "Xicnēxti",
+       "rcshowhideminor-show": "Xicnexti",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "Xicnexti",
        "rcshowhidebots-hide": "Tiquihyānaz",
        "rcshowhideliu": "$1 tēmachiyōmacalli tlatequitiltilīltin",
-       "rcshowhideanons": "$1 ahtōcā tlatequitiltilīlli",
-       "rcshowhideanons-show": "Xicnēxti",
+       "rcshowhideanons": "$1 ahtocatl tequitiuhqui",
+       "rcshowhideanons-show": "Xicnexti",
        "rcshowhidepatr": "$1 tlapatlaliztli mochiyahua",
-       "rcshowhidemine": "$1 notlahcuilōl",
-       "rcshowhidemine-show": "Xicnēxti",
-       "rclinks": "Xiquintta xōcoyōc $1 tlapatlaliztli xōcoyōc $2 tōnalpan.<br />$3",
+       "rcshowhidemine": "$1 notlahcuilol",
+       "rcshowhidemine-show": "Xicnexti",
+       "rclinks": "Xiquitta yancuic $1 tlapatlaliztli yancuic $2 tonalpan.<br />$3",
        "diff": "ahneneuhqui",
        "hist": "tlahtollotl",
-       "hide": "Tiquintlātīz",
+       "hide": "Tictlatiz",
        "show": "Xicnēxti",
        "minoreditletter": "p",
        "newpageletter": "Y",
        "recentchangeslinked": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-toolbox": "Itloc itlapatlalizhuan",
-       "recentchangeslinked-title": "Tlapatlaliztli \"$1\" ītechcopa",
-       "recentchangeslinked-page": "Tlaīxtli ītōcā:",
+       "recentchangeslinked-title": "Tlapatlaliztli \"$1\" itechcopa",
+       "recentchangeslinked-page": "Tlahcuilolamatl itoca:",
        "upload": "Tlahcuilolquetzaliztli",
        "uploadbtn": "Tlahcuilōlquetza",
        "uploadnologin": "Ahmo ōtimocalac",
        "uploaderror": "Tlaquetzaliztli ahcuallōtl",
-       "uploadlogpage": "Tlaquetzaliztli tlahcuilōlloh",
+       "uploadlogpage": "Tlaquetzaliztli itlahcuilolloh",
        "filename": "Tlahcuilōlli ītōcā",
        "filedesc": "Tlahcuilōltōn",
        "fileuploadsummary": "Tlahcuilōltōn:",
        "filetype-missing": "Tlahcuilōlli ahmo quipiya huēiyaquiliztli (quemeh \".jpg\").",
        "large-file": "Mā tlahcuilōlli ahmo achi huēiyac $1; inīn cah $2.",
        "fileexists-extension": "Tlahcuilōlli zan iuh tōcātica ia: [[$2|thumb]]\n* Tlahcuilōlli moquetzacah: <strong>[[:$1]]</strong>\n* Tlahcuilōlli tlein ia ītōca: <strong>[[:$2]]</strong>\nTimitztlātlauhtiah, xitlahcuiloa occē tōcāitl.",
-       "savefile": "Quipiyāz tlahcuilōlli",
+       "savefile": "Mopiyaz in tlahcuilolli",
        "uploaddisabled": "Ahmo mohuelīti tlahcuilōlquetzā",
        "uploaddisabledtext": "Ahmo huelīti moquetzazqueh tlahcuilōlli.",
        "upload-source": "Mēyalihcuilōlli",
        "sourcefilename": "Mēyalihcuilōltōcāitl:",
        "sourceurl": "Mēyal-URL:",
        "destfilename": "Tōcāhuīc:",
-       "watchthisupload": "Tictlachiyāz inīn zāzanilli",
+       "watchthisupload": "Tictlachiyaz inin tecpanaliztlapiyaliztli",
        "upload-form-label-infoform-name": "Tōcāitl",
        "upload-form-label-usage-filename": "Ihcuilōlli ītōcā",
-       "upload_source_file": " (cē tlahcuilōlli mochīuhpōhualhuazco)",
+       "upload_source_file": "(ticpepenaz ce tlahcuilolli mochiuhpohualhuazco)",
        "listfiles_search_for": "Tlatēmōz mēdiatl tōcācopa:",
        "imgfile": "ihcuilōlli",
        "listfiles": "Mochīntīn īxiptli",
        "listfiles_name": "Tōcāitl",
        "listfiles_user": "Tequihuihqui",
-       "listfiles_size": "Octacayōtl (bytes)",
+       "listfiles_size": "Octacayotl (bytes)",
        "listfiles_count": "Cuepaliztli",
        "listfiles-latestversion-yes": "Quēmah",
        "listfiles-latestversion-no": "Ahmō",
-       "file-anchor-link": "Ihcuilōlli",
+       "file-anchor-link": "Tlapiyaliztecpanaliztli",
        "filehist": "Ihcuilōlli ītlahtōllo",
        "filehist-deleteall": "tiquimpolōz mochīntīn",
        "filehist-deleteone": "xicpolo",
        "filehist-revert": "tlacuepāz",
        "filehist-current": "āxcān",
-       "filehist-datetime": "Tlapōhualpan/Cāhuitl",
-       "filehist-thumb": "Īxiptlahtōn",
-       "filehist-user": "Tequihuihqui",
-       "filehist-dimensions": "Octacayōtl",
+       "filehist-datetime": "Tonallapohualpan ihuan imman",
+       "filehist-thumb": "Ixiptlatontli",
+       "filehist-user": "Tequitiuhqui",
+       "filehist-dimensions": "Octacayotl",
        "filehist-comment": "TlahtoIcaquiliztiloni",
        "imagelinks": "In canin oquitlalihqueh",
        "linkstoimage": "Inīn {{PLURAL:$1|zāzanilli motzonhuilia|$1 zāzanilli motzonhuiliah}} inīn tlahcuilōlhuīc:",
        "nolinkstoimage": "Ahmo cateh zāzaniltin tlein tzonhuiliah inīn tlahcuilōlhuīc.",
        "morelinkstoimage": "Tiquinttāz [[Special:WhatLinksHere/$1|achi tzonhuiliztli]] inīn tlahcuilōlhuīc.",
-       "duplicatesoffile": "Inōn {{PLURAL:$1|tlahcuilōlli cah|$1 tlahcuilōlli cateh}} ōntiah inīn zāzanilli ([[Special:FileDuplicateSearch/$2|ocahci]]):",
-       "sharedupload": "Inīn $1 zāzanilli huelīti motequitiltia zāzocāmpa.",
+       "duplicatesoffile": "Inin {{PLURAL:$1|tlahcuilolli oppa ochihualoc|$1 tlahcuiloltin oppa ochihualoqueh}} ixquichca inin tlahcuilolli ([[Special:FileDuplicateSearch/$2|oc temachiztiliztli]]):",
+       "sharedupload": "Inin tlahcuilolli itech pohui $1 ihuan hueli motequitiltia ipan occe proyectos.",
        "uploadnewversion-linktext": "Ticquetzāz yancuīc tlahcuilōlli",
        "filerevert": "Ticcuepāz $1",
        "filerevert-legend": "Tlahcuilōlli tlacuepaliztli",
-       "filerevert-comment": "Tlèka:",
+       "filerevert-comment": "Tleca:",
        "filerevert-submit": "Tlacuepāz",
        "filedelete": "Ticpolōz $1",
        "filedelete-legend": "Ticpolōz tlahcuilōlli",
        "filedelete-nofile": "'''$1''' ahmo ia.",
        "filedelete-otherreason": "Occē īxtlamatiliztli:",
        "filedelete-reason-otherlist": "Occē īxtlamatiliztli",
-       "filedelete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "mimesearch": "MIME tlatēmoliztli",
+       "filedelete-edit-reasonlist": "Xiquihto ipampa ticpohpoloznequi in",
+       "mimesearch": "MIME tlatemoliztli",
        "mimetype": "MIME iuhcāyōtl:",
        "download": "tictemōz",
        "unwatchedpages": "Zāzaniltin ahmo motlachiya",
        "listredirects": "Tlacuepaliztli",
        "unusedtemplates": "Nemachiyōtīlli ahmotequitiltiah",
        "unusedtemplateswlh": "occequīntīn tzonhuiliztli",
-       "randompage": "Centlaīxtli",
-       "randompage-nopages": "Ahmo oncah zāzanilli īpan inīn {{PLURAL:$2|tōcāitl}}: $1.",
-       "randomincategory-submit": "Yāuh",
+       "randompage": "Cecen tlahcuilolli",
+       "randompage-nopages": "Ahmo oncah tlahcuilolamameh ipan inin {{PLURAL:$2|tocatlacauhtli|tocatlacauhtin}}: $1.",
+       "randomincategory-submit": "Yaliztica",
        "randomredirect": "Zāzotlacuepaliztli",
        "statistics": "Tlapōhualiztli",
        "statistics-header-pages": "Zāzaniltin tlapōhualli",
        "withoutinterwiki": "Zāzaniltin ahtle tzonhuiliztli",
        "withoutinterwiki-submit": "Tiquittāz",
        "nbytes": "$1 {{PLURAL:$1|byte}}",
-       "ncategories": "$1 {{PLURAL:$1|tlaìxmatkàyòtlàlilòtl|tlaìxmatkàyòtlàlilòme}}",
-       "nlinks": "$1 {{PLURAL:$1|tzòwilistli|tzòwilistìn}}",
-       "nmembers": "$1 {{PLURAL:$1|tlâkuilòpilli|tlâkuilòpiltìn}}",
+       "ncategories": "$1 {{PLURAL:$1|neneuhcayotl|neneuhcayomeh}",
+       "nlinks": "$1 {{PLURAL:$1|tzohuililiztli|tzohuililiztin}}",
+       "nmembers": "$1 {{PLURAL:$1|tlahcuilolamatl|tlahcuilolamameh}}",
        "nrevisions": "$1 {{PLURAL:$1|tlapiyaliztli}}",
        "nimagelinks": "Motekìuhtia ìpan $1 {{PLURAL:$1|tlaìxtlapalli|tlaìxtlapaltìn}}",
        "ntransclusions": "motekìuhtia ìpan $1 {{PLURAL:$1|tlaìxtlapalli|tlaìxtlapaltìn}}",
        "uncategorizedcategories": "Tlaìxmatkàtlàlilòmë âmò tlatlaìxmatkàtlàlìltìn",
        "uncategorizedimages": "Ìxiptìn âmò tlatlaìxmatkàtlàlìltìn",
        "uncategorizedtemplates": "Nemachiòmë âmò tlatlaìxmatkàtlàlìltìn",
-       "unusedcategories": "Tlaìxmatkàtlàlilòmë tlèn âmò mokìntekìuhtia",
+       "unusedcategories": "Neneuhcayomeh tlen ahmo motequitiltia",
        "unusedimages": "Ìxiptìn tlèn âmò mokìntekìuhtia",
-       "wantedcategories": "Ìtech kineki tlaìxmatkàtlàlilòtl",
-       "wantedpages": "Zāzaniltin moēlēhuiah",
+       "wantedcategories": "Itech monequini neneuhcayotl",
+       "wantedpages": "Tlahcuilolamameh tlen elehuiloh",
        "wantedfiles": "Ìpan moneki èwaltìn",
        "wantedtemplates": "Ìtech moneki nemachiòmë",
        "mostlinked": "Tlâkuilòlpiltìn tlèn okachi tlatzòtzòwìllôkë",
        "protectedpages-reason": "Tleīpampa",
        "protectedtitles": "Tōcāitl ōmoquīxtih",
        "listusers": "Tlatequitiltilīlli",
-       "newpages": "Yancuīc zāzaniltin",
+       "newpages": "Yancuic tlahcuiloltin",
        "newpages-username": "Tlatequitiltilīltōcāitl:",
-       "ancientpages": "Huēhuehzāzanilli",
+       "ancientpages": "Huehcauh tlahcuilolamatl",
        "move": "Ticzacāz",
        "movethispage": "Ticzacāz inīn zāzanilli",
-       "pager-newer-n": "{{PLURAL:$1|1 yancuīc|$1 yancuīc}}",
-       "pager-older-n": "{{PLURAL:$1|1 huēhuetl|$1 huēhueh}}",
-       "booksources": "Āmoxmēyalli",
-       "booksources-search-legend": "Tiquīxtēmōz āmoxmēyalli",
-       "booksources-search": "Tiquīxtēmōz",
+       "pager-newer-n": "{{PLURAL:$1|1 yancuic|$1 yancuicqueh}}",
+       "pager-older-n": "{{PLURAL:$1|1 huehcauh|$1 huehcauhqueh}}",
+       "booksources": "Amoxtzintiliztli",
+       "booksources-search-legend": "Tiquixtemoz amoxtli itzintiliz",
+       "booksources-search": "Tlatemoliztli",
        "specialloguserlabel": "Tlatequitiltilīlli:",
        "speciallogtitlelabel": "Tōcāitl:",
-       "log": "Tlahcuilōlloh",
-       "all-logs-page": "Mochīntīn tlācah īntlahcuilōlloh",
-       "allpages": "Mochīntīn zāzanilli",
+       "log": "Tlahcuilolloh",
+       "all-logs-page": "Mochintin nohuiyanyoh intlahcuilolhuan",
+       "allpages": "Mochintin tlahcuilolamatl",
        "nextpage": "Niman zāzanilli ($1)",
        "prevpage": "Achto zāzanilli ($1)",
-       "allarticles": "Mochīntīn tlahcuilōlli",
-       "allinnamespace": "Mochīntīn zāzanilli (īpan $1)",
-       "allpagessubmit": "Tiyāz",
-       "categories": "Tlaìxmatkàyòtlàlilòme",
-       "categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàyòtlàlilòtl kimpia|Inîke tlaìxmatkàyòtlàlilòme kimpiâke}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâke nikàn in [[Special:UnusedCategories|tlaìxmatkàyòtlàlilòme tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàyòtlàlilòtl]].",
-       "categoriesfrom": "Mà monèxtìkàn tlaìxmatkàtlàlilòmë tlèn pèwâkë ìka:",
-       "linksearch": "Calān tzonhuiliztli tlatemoliztli",
+       "allarticles": "Mochintin tlahcuilolamameh",
+       "allinnamespace": "Mochintin tlahcuilolamameh (tocatlacauhtli $1)",
+       "allpagessubmit": "Tiyaz",
+       "categories": "Neneuhcayotl",
+       "categoriespagetext": "In tetoquiltin {{PLURAL:$1|neneuhcayotl quimpiya|neneuhcayomeh quimpiyah}} tlahcuiloltin nozo medios.\nAhmo monextiah nican in [[Special:UnusedCategories|neneuhcayomeh tlen ahmo moquintequitiltia]].\nNo ma motta in tlen [[Special:WantedCategories|ipan quinequi neneuhcayomeh]].",
+       "categoriesfrom": "Ma monextican neneuhcayomeh tlen pehuaz ica:",
+       "linksearch": "Tlatemoliztli ihuic quiyahuac tzonhuiliztli",
        "linksearch-ns": "Tōcātzin:",
        "linksearch-ok": "Tictēmōz",
        "linksearch-line": "$1 tzonhuīlo īxquichca $2",
        "removedwatchtext": "Zāzanilli \"[[:$1]]\" ōmopolo [[Special:Watchlist|motlachiyalizco]].",
        "watch": "Tictlachiyāz",
        "watchthispage": "Tictlachiyāz inīn zāzanilli",
-       "unwatch": "Ahtictlachiyāz",
+       "unwatch": "Ahmo titlachiyaz",
        "watchlist-details": "{{PLURAL:$1|$1 zāzanilli|$1 zāzaniltin}} motlachiyaliz, ahmo mopōhua tēixnāmiquiliztli.",
        "wlshowlast": "Tiquinttāz tlapatlaliztli īhuīcpa achto $1 yēmpohualminuhtli, $2 tōnaltin",
        "watching": "Tlachiyacah...",
        "unwatching": "Ahtlachiyacah...",
        "enotif_impersonal_salutation": "tlatequitiltilīlli īpan {{SITENAME}}",
-       "enotif_anon_editor": "ahtōcātlatequitiltilīlli $1",
+       "enotif_anon_editor": "ahtocatl tequitiuhqui $1",
        "enotif_body": "Māhuiztic $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTlapatlani ītlahtōlpehuallo:  $PAGESUMMARY $PAGEMINOREDIT\n\nXicnotzāz in tlapatlani:\nīnetitlanizyeyān:$PAGEEDITOR_EMAIL\nīhuiqui:$PAGEEDITOR_WIKI\n\nAhmo occēppa mitztlamachiztīz intlā yancuīc tlapatlaliztli, zā mā tiquittaz inīn āmatl. Tihueliti ticcencahulīz in tēmachiztīlizpāmitl in mochintin motlachixāmatl in motlachiyaliz.\n\nIn {{SITENAME}} icnīuhtīliztica motēmachiztīliztlacentetilīz.\n\nIntlā ticnequi ticpatlaz in maltzinteyōtl monetitlanizyeyān, xiquihitta:\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nIntlā ticnequi ticpatlaz in motlachiyaliz tlaēlēhuiliztli, xiquihitta:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nIntlā ticnequi ticpolōz in āmatl ītech motlachiyaliz, xiquihitta:\n$UNWATCHURL\n\nMotlahtōlcaquiliztīlōni īhuān ocachi tēpalēhuiliztli, xiquihitta:\n$HELPPAGE",
        "created": "ōmochīuh",
        "changed": "ōmotlacuep",
        "excontentauthor": "Tlapiyaliztli ōcatca: '$1' (auh zancē ōquipatlac ōcatca '[[Special:Contributions/$2|$2]]')",
        "delete-confirm": "Ticpolōz \"$1\"",
        "delete-legend": "Ticpolōz",
-       "actioncomplete": "Cēntetl",
+       "actioncomplete": "Ye tlachihualiztli",
        "deletedtext": "\"$1\" ōmopolo.\nXiquitta $2 ic yancuīc tlapololiztli.",
        "dellogpage": "Tlapololiztli tlahcuilōlloh",
-       "deletionlog": "tlapololiztli tlahcuilōlloh",
+       "deletionlog": "tlapohpololiztli itlahcuilolloh",
        "deletecomment": "Īxtlamatiliztli:",
-       "deleteotherreason": "Occē īxtlamatiliztli:",
+       "deleteotherreason": "Occe ixtlamatiliztli:",
        "deletereasonotherlist": "Occē īxtlamatiliztli",
-       "delete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "rollbacklink": "ticcuepaz",
+       "delete-edit-reasonlist": "Xiquihto ipampa ticpohpoloznequi in",
+       "rollbacklink": "ticxitiniz",
        "rollback-success": "Ōmotlacuep $1 ītlahcuilōl; āxcān achto $2 ītlahcuilōl.",
        "changecontentmodel-title-label": "Tlaīxtōcāitl",
        "changecontentmodel-reason-label": "Tleīpampa:",
-       "protectlogpage": "Tlapiyaliztlīlmachiyōtīlli",
+       "protectlogpage": "Tlapiyaliztlilmachiyotilli",
        "protectedarticle": "ōmoquīxti \"[[$1]]\"",
        "unprotectedarticle": "ōahmoquīxtih «[[$1]]»",
        "prot_1movedto2": "[[$1]] ōmozacac īhuīc [[$2]]",
        "protectcomment": "Tleīpampa:",
        "protectexpiry": "Tlamiliztli:",
        "protect_expiry_invalid": "Ahcualli tlamiliztli cāhuitl.",
-       "protect-default": "Ticmācāhuaz mochintin in tlatequitiltilīltin",
+       "protect-default": "Macahualo ica mochintin in tequitiuhqueh",
        "protect-fallback": "Zan momācāhuazqueh tlatequitiltilīltin in tēmācāhualiztica «$1»",
-       "protect-level-autoconfirmed": "Zan momācāhuaz moneltilīlli tlatequitiltilīltin",
-       "protect-level-sysop": "Zan momācāhuaz tētlamahmacanimeh",
+       "protect-level-autoconfirmed": "Zan macahualo ica neneltililli tequitiuhqueh",
+       "protect-level-sysop": "Zan macahualo in tetlamahmacanimeh",
        "protect-expiring": "motlamīz $1 (UTC)",
-       "protect-expiry-options": "1 hora:1 hour,1 tōnalli:1 day,1 chicuēyilhuitl:1 week,2 chicuēyilhuitl:2 weeks,1 mētztli:1 month,3 mētztli:3 months,6 mētztli:6 months,1 xihuitl:1 year,mochipa:infinite",
-       "restriction-type": "Mācāhualiztli:",
+       "protect-expiry-options": "1 hora:1 hour,1 tonalli:1 day,1 chicueyilhuitl:1 week,2 chicueyilhuitl:2 weeks,1 metztli:1 month,3 metztli:3 months,6 metztli:6 months,1 xihuitl:1 year,mochipa:infinite",
+       "restriction-type": "Temacahualiztli:",
        "restriction-edit": "xicpatla",
        "restriction-move": "Ticzacāz",
        "restriction-create": "Ticchīhuāz",
        "restriction-upload": "Tlahcuilōlquetza",
-       "undelete": "Xiquitta mopoloh tlaīxtli",
-       "viewdeletedpage": "Tiquinttāz zāzaniltin ōmopolōzqueh",
+       "undelete": "Tiquimittaz tlahcuilolamameh tlen omopohpolohqueh",
+       "viewdeletedpage": "Tiquimittaz tlahcuilolamameh tlen omopohpolohqueh",
        "undelete-revision": "Tlapoloc $1 ītlachiyaliz (īpan $4, $5) īpal $3:",
        "undeletebtn": "Ahticpolōz",
-       "undeletelink": "xiquitta/xicmācuepa",
-       "undeleteviewlink": "tiquittāz",
+       "undeletelink": "tlattaliztli/tlacuepaliztli",
+       "undeleteviewlink": "tiquittaz",
        "undeletecomment": "Tleīpampa:",
-       "undelete-search-box": "Tiquintlatēmōz zāzaniltin ōmopolōz",
-       "undelete-search-prefix": "Tiquittāz zāzaniltin mopēhua īca:",
-       "undelete-search-submit": "Tlatēmōz",
+       "undelete-search-title": "Tiquintemoz tlahcuilolamameh tlen omopohpolohqueh",
+       "undelete-search-box": "Tiquintemoz tlahcuilolamameh tlen omopohpolohqueh",
+       "undelete-search-prefix": "Tiquimittaz tlahcuilolamameh tlen pehuah ica:",
+       "undelete-search-submit": "Tlatemoliztli",
        "undelete-error-short": "Ahcuallōtl ihcuāc momāquīxtiya: $1",
        "undelete-show-file-submit": "Quemah",
-       "namespace": "Tōcātlacāuhtli:",
-       "invert": "Tlacuepāz motlahtōl",
-       "blanknamespace": "(Huēyi)",
+       "namespace": "Tocatlacauhtli:",
+       "invert": "Ticcuepaz in tocatecpanaliztli",
+       "blanknamespace": "(Tlayacatic)",
        "contributions": "In {{GENDER:$1|tlatequitiltilīlli}} ītlahcuilōl",
        "contributions-title": "Tlatequitiltilīlli $1 ītlahcuilōl",
        "mycontris": "Notlahcuilol",
        "contribsub2": "$1 ($2)",
-       "uctop": "(āxcān tlapatlaliztli)",
+       "uctop": "(axcan tlapatlaliztli)",
        "month": "Īhuīcpa mētztli (auh achtopa):",
        "year": "Xiuhhuīcpa (auh achtopa):",
        "sp-contributions-newbies": "Tiquinttāz zan yancuīc tlatequitiltilīlli īntlapatlaliz",
        "sp-contributions-newbies-sub": "Ic yancuīc",
        "sp-contributions-newbies-title": "Yancuīc tlatequitiltilīlli ītlahcuilōl",
        "sp-contributions-blocklog": "Tlatzacuiliztli tlahcuilōlloh",
-       "sp-contributions-uploads": "tlahcuilōlquetzaliztli",
-       "sp-contributions-talk": "zānīlli",
-       "sp-contributions-search": "Tiquintlatēmōz tlapatlaliztli",
+       "sp-contributions-uploads": "tlahcuilolquetzaliztli",
+       "sp-contributions-talk": "teixnamiquiliztli",
+       "sp-contributions-search": "Tiquitemoz tlapatlaliztin",
        "sp-contributions-username": "IP nozo tlatequitiltilīlli ītōcā:",
-       "sp-contributions-submit": "Tlatēmōz",
+       "sp-contributions-submit": "Tlatemoliztli",
        "whatlinkshere": "In tlein quitzonhuilia nican",
        "whatlinkshere-title": "Zāzaniltin quitzonhuiliah $1",
-       "whatlinkshere-page": "Zāzanilli:",
+       "whatlinkshere-page": "Tlahcuilolamatl:",
        "linkshere": "Inīn zāzaniltin quitzonhuiliah '''[[:$1]]''' īhuīc:",
        "nolinkshere": "Ahtle quitzonhuilia '''[[:$1]]''' īhuīc.",
        "isredirect": "ōmotlacuep zāzanilli",
        "isimage": "īxiptlahtli tzonhuiliztli",
        "whatlinkshere-prev": "{{PLURAL:$1|achtopa|$1 achtopa}}",
        "whatlinkshere-next": "{{PLURAL:$1|niman|$1 niman}}",
-       "whatlinkshere-links": "← tzòwilistìn",
+       "whatlinkshere-links": "← tzohuiliztin",
        "whatlinkshere-hideredirs": "$1 tlacuepaliztli",
        "whatlinkshere-hidelinks": "$1 tzonhuiliztli",
        "whatlinkshere-hideimages": "$1 tlahcuilōltzonhuīliztli",
        "unblockip": "Ahtiquitzacuilīz tlatequitiltilīlli",
        "ipblocklist": "Tlatequitiltilīltzacualli",
        "blocklist-reason": "Tleīpampa",
-       "ipblocklist-submit": "Tlatēmōz",
+       "ipblocklist-submit": "Tlatemoliztli",
        "infiniteblock": "ahtlamic",
-       "expiringblock": "tlami īpan $1 īpan $2",
-       "anononlyblock": "zan ahtōcā",
+       "expiringblock": "tlami ipan $1 ipan $2",
+       "anononlyblock": "zan ahtocaitl",
        "blocklink": "tictzacuiliz",
        "unblocklink": "ahtiquitzacuilīz",
        "change-blocklink": "Ticpatlaz tlatzacualli",
        "contribslink": "tlapatlaliztli",
        "blocklogpage": "Tlatequitiltilīlli ōmotzacuili",
        "move-page": "Ticzacāz $1",
-       "move-page-legend": "Ticzacāz zāzanilli",
+       "move-page-legend": "Tictocapatlaliz inin tlahcuilolamatl",
        "movepagetext": "Nicān mohcuiloa quemeh ticzacāz cē zāzanilli auh mochi in ītlahcuillōloh īhuīc occē yancuīc ītōca.\nHuēhuehtōcāitl yez tlacuepaliztli yancuīc tōcāhuīc.\nTzonhuiliztli huēhuehzāzanilhuīc ahmo mopatlāz.\nXiquitta ic māca xicchīhua [[Special:DoubleRedirects|ōntlacuepaliztli]] ahnozo [[Special:BrokenRedirects|tzomoc]].\nTitzonhuilizpiyāz.\n\nXicmati in zāzanilli ahmo mozacāz intlā ye ia cē zāzanilli tōcātica, zan cah iztāc zāzanilli ahnozo tlacuepaliztli īca ahmo tlahcuilōlloh.\nQuihtōznequi tihuelītīz ticuepāz cē zāzanilli īhuīc ītlācatōca intlā ahcuallōtl ticchīhuāz, tēl ahmo tihuelītīz occeppa tihcuilōz īpan zāzanilli tlein ia.\n\n'''¡XICPŌHUA!'''\nHueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl auh ahcuallōtl achtopa ticzacāz.",
        "movenotallowed": "Ahmo tihuelīti tiquinzaca zāzaniltin.",
-       "newtitle": "Yancuīc tōcāhuīc",
-       "move-watch": "Tictlachiyāz inīn zāzanilli",
+       "newtitle": "Yancuic tocaitl",
+       "move-watch": "Tictlachiyaz tlahcuilolamatl itzintiliz ihuan itlatzaccan",
        "movepagebtn": "Ticzacāz zāzanilli",
        "pagemovedsub": "Cualli ōmozacac",
        "movepage-moved": "'''\"$1\" ōmotlacuep īhuīc \"$2\".'''",
-       "movetalk": "Xiczaca yehhuātl īzānīllaīx",
+       "movetalk": "tictocapatlaliz in tlahcuilolamatl iixiptla",
        "movepage-page-moved": "Zāzanilli $1 ōmozacac īhuīc $2.",
        "movepage-page-unmoved": "Ahmo huelīti $1 mozaca īhuīc $2.",
        "movelogpage": "Tlazacaliztli tlahcuilōlloh",
        "immobile-source-namespace": "Ahmo huelīti mozaca zāzanilli tōcātzimpan \"$1\"",
        "immobile-target-namespace": "Ahmo huelīti mozaca zāzanilli tōcātzinhuīc \"$1\"",
        "immobile-source-page": "Ahmo huelīti mozacāz zāzanilli.",
-       "move-leave-redirect": "Ticcāhuāz cē tlacuepaliztli",
+       "move-leave-redirect": "Ma ticcahua ce tlatzonhuiliztli",
        "export": "Tiquinnamacāz zāzaniltin",
        "export-submit": "Ticnamacāz",
        "export-addcattext": "Mà tlatlaìxtlapalwilo ìwikpa tlatlaìxmatkàyòtlàlilòpa:",
        "export-addcat": "Ticcētilīz",
        "export-download": "Ticpiyāz quemeh tlahcuilōlli",
        "export-templates": "Tiquimpiyāz nemachiyōtīlli",
-       "allmessages": "Mochīntīn Huiquimedia tlahcuilōltzintli",
-       "allmessagesname": "Tōcāitl",
-       "allmessagescurrent": "Āxcān tlahcuilōlli",
+       "allmessages": "Mochintin tetitlaniliztli ipan liHuiquimedia",
+       "allmessagesname": "Tocaitl",
+       "allmessagescurrent": "Tlahcuilolpiyaliztli itech axcan",
        "allmessages-filter-all": "Mochi",
-       "allmessages-language": "Tlâtòlli:",
-       "allmessages-filter-submit": "Yāuh",
+       "allmessages-language": "Tlahtolli:",
+       "allmessages-filter-submit": "Tiyaz",
        "thumbnail-more": "Tiquihuēyiyāz",
        "thumbnail_error": "Aiuhcāyōtl ihcuāc mochīhuaya tepitōntli: $1",
        "import": "Tiquincōhuāz zāzaniltin",
        "importbadinterwiki": "Ahcualli interhuiqui tzonhuiliztli",
        "import-upload": "Tiquinquetzāz XML tlahcuilōlli",
        "importlogpage": "Tiquincōhuāz tlahcuilōlloh",
-       "tooltip-pt-userpage": "{{GENDER:|Motlatequitiltilīlzāzanil}}",
-       "tooltip-pt-mytalk": "{{GENDER:|Motēīxnāmiquiliztli}}",
+       "tooltip-pt-userpage": "{{GENDER:|Motequitiuhcatlahcuilolamauh}}",
+       "tooltip-pt-mytalk": "{{GENDER:|Moteixnamiquiliz}}",
        "tooltip-pt-preferences": "{{GENDER:|Motlaēlēhuiliz}}",
-       "tooltip-pt-watchlist": "Zāzaniltin tiquintlachiya ic tlapatlaliztli",
-       "tooltip-pt-mycontris": "{{GENDER:|Motlahcuilōl}}",
-       "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
-       "tooltip-pt-logout": "Tiquīzāz",
+       "tooltip-pt-watchlist": "Tlahcuilolamatl itecpantiliz tlen tictlachiyalia itlapatlaliz",
+       "tooltip-pt-mycontris": "{{GENDER:|Motlahcuilol}}",
+       "tooltip-pt-login": "Tihueliti timocalaqui, tel ahmo tihuiquilia.",
+       "tooltip-pt-logout": "Tiquizaz",
        "tooltip-ca-talk": "Iteixnamiquiliz itechpa inin tlahcuilolli",
        "tooltip-ca-edit": "Ticpatlaz inin tlahcuilolli",
-       "tooltip-ca-addsection": "Tictzintīz yancuic xeliuhcāyōtl.",
+       "tooltip-ca-addsection": "Ticpehualiz ce yancuic xeliuhcayotl.",
        "tooltip-ca-viewsource": "Inīn zāzanilli ōmoquīxti. Tihuelīti tiquitta ītlahtōlcaquiliztilōni.",
        "tooltip-ca-history": "Achtopa āxcān zāzanilli īhuān in tlatequitiltilīlli ōquinchīuhqueh",
        "tooltip-ca-protect": "Ticquīxtiāz inīn zāzanilli",
        "tooltip-ca-delete": "Ticpolōz inīn zāzanilli",
        "tooltip-ca-undelete": "Ahticpolōz inīn zāzanilli",
-       "tooltip-ca-move": "Ticzacāz inīn zāzanilli",
+       "tooltip-ca-move": "Ticzacaz inin tlahcuilolamatl",
        "tooltip-ca-watch": "Ticcentiliz inin tlahtolli motecpanaliz",
-       "tooltip-ca-unwatch": "Ahtictlachiyāz inīn zāzanilli",
+       "tooltip-ca-unwatch": "Ticpohpoloz inin tlahcuilolamatl ipan motlachiyaliz",
        "tooltip-search": "Tlatemoliztli ipan {{SITENAME}}",
-       "tooltip-search-go": "Tiyaz ihuicpa tlahcuilolli ica inin huel melahuac tocaitl intla oncah",
+       "tooltip-search-go": "Tiyaz ihuicpa tlahcuilolamatl ica inin huel melahuac tocaitl intla oncah",
        "tooltip-search-fulltext": "Tictemoz inin tlahcuilolli ipan amatl",
        "tooltip-p-logo": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-mainpage": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-mainpage-description": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-portal": "Tlachīhualiztechcopa, inōn tihuelīti titlachīhua, tlatēmoyān",
        "tooltip-n-recentchanges": "Yancuic īpan tlapatlaliztli in huiqui",
-       "tooltip-n-randompage": "Tiquittaz centlaīxtli",
+       "tooltip-n-randompage": "Tiquittaz cecen tlahcuilolli",
        "tooltip-n-help": "In tēmachtīlōyān",
-       "tooltip-t-whatlinkshere": "Mochīntīn zāzaniltin huiquipan quitzonhuiliah nicān",
+       "tooltip-t-whatlinkshere": "Mochintin tlahcuiloltin huiquipan quitzonhuiliah nican",
        "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli ipan tlahcuiloltin tlein quitzonhuilia nican",
-       "tooltip-feed-rss": "RSS tlachicāhualiztli inīn zāzaniltechcopa",
+       "tooltip-feed-rss": "RSS tlachicahualiztli inin tlahcuilolamatl",
        "tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-t-contributions": "Tlapōhualmatl ītechpa {{GENDER:$1|inīn tlatequitiltilīlli}} ītlahcuilōl",
        "tooltip-t-emailuser": "Tiquihcuilōz inīn tlatequitiltililhuīc",
        "tooltip-t-specialpages": "Intlahtoltecpanaliz mochtin in noncuahquizquitlahcuiloltin",
        "tooltip-t-print": "Tepoztlahcuilolli",
        "tooltip-ca-nstab-main": "Tiquittaz tlein quipiya in tlahcuilolli",
-       "tooltip-ca-nstab-user": "Xiquitta tlatequitiltilīlli īzāzanil",
+       "tooltip-ca-nstab-user": "Xiquitta tequitiuhqui itlahcuilolamauh",
        "tooltip-ca-nstab-special": "Inīn nōncuahquīzqui āmatl, auh ahmohuelitizpatla",
-       "tooltip-ca-nstab-project": "Xiquitta in tlatequipanōllaīxtli",
+       "tooltip-ca-nstab-project": "Xiquitta in tlayecantequitl itlahcuilolamauh",
        "tooltip-ca-nstab-image": "Xiquittāz īxipzāzanilli",
        "tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
        "tooltip-ca-nstab-template": "Xiquitta in nemachiyōtīlli",
        "tooltip-compareselectedversions": "Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.",
        "tooltip-watch": "Ticcēntilīz inīn zāzanilli motlachiyalizhuīc",
        "tooltip-upload": "Ticpēhua quetzaliztli",
-       "tooltip-summary": "Xicaquilia tepitōn tlahcuilōltōntli",
+       "tooltip-summary": "Xiquihcuilo ce tepiton tlahcuiloltontli",
        "anonymous": "Ahtōcāitl {{PLURAL:$1|tlatequitiltilīlli}} īpan {{SITENAME}}",
        "siteuser": "$1 tlatequitiltilīlli īpan {{SITENAME}}",
-       "lastmodifiedatby": "Inīn zāzanilli ōtlapatlac catca īpan $2, $1 īpal $3.",
+       "lastmodifiedatby": "Inin tlahcuilolamatl omopatlac ipan $2, $1 ipal $3.",
        "others": "occequīntīn",
-       "siteusers": "$1 {{PLURAL:$2|tlatequitiltilīlli}} īpan {{SITENAME}}",
+       "siteusers": "$1 {{PLURAL:$2|{{GENDER:$1|tequitiuhqui}}|tequitiuhqueh}} īpan {{SITENAME}}",
        "spam_reverting": "Mocuepacah īhuīc xōcoyōc tlapatlaliztli ahmo tzonhuilizca īhuīc $1",
        "spam_blanking": "Mochi tlapatlaliztli quimpiyah tzonhuiliztli īhuīc $1, iztāctiliacah",
        "pageinfo-firstuser": "Tlaīxchīuhqui",
-       "pageinfo-toolboxlink": "Tlaīxtlahtōlmelāhualiztli",
+       "pageinfo-toolboxlink": "Tlahtolamatl itlahtolmelahualiz",
        "pageinfo-contentpage-yes": "Quēmah",
        "pageinfo-protect-cascading-yes": "Quēmah",
        "previousdiff": "← Achtopa",
-       "nextdiff": "Oc ye cencah yancuīc tlapatlaliztli →",
+       "nextdiff": "Oc ye cencah yancuic tlapatlaliztli →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:|zāzanilli|zāzanilli}}",
-       "file-info-size": "$1 × $2 pixel; zāzanilli octacayōtl: $3; machiyōtl MIME: $4",
+       "file-info-size": "$1 × $2 pixel; tlaixiptlayotl octacayotl: $3; machiyotl MIME: $4",
        "file-nohires": "Ahmo ia achi cualli ahmo occē īxiptli.",
        "show-big-image": "Tzintiliztlahcuilolli",
+       "show-big-image-size": "$1 × $2 pixels",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
        "noimages": "Ahtlein ic tlatta.",
-       "ilsubmit": "Tlatēmōz",
-       "bydate": "tōnalcopa",
+       "ilsubmit": "Tlatemoliztli",
+       "bydate": "tonaltica",
        "metadata": "Metadata",
        "metadata-expand": "Tiquittāz tlanōnōtzaliztli huehca ōmpa",
        "metadata-collapse": "Tictlātīz tlanōnōtzaliztli huehca ōmpa",
        "exif-photometricinterpretation": "Pixel tlachīhualiztli",
-       "exif-imagedescription": "Īxiptli ītōcā",
+       "exif-imagedescription": "Ixiptli itoca",
        "exif-software": "Software ōmotēquitilti",
        "exif-artist": "Chīhualōni",
        "exif-exifversion": "Exif-cuepaliztli",
        "exif-isospeedratings": "ISO iciuhquiliztli tlapōhualcāyōtl",
        "exif-flash": "Flax",
        "exif-flashenergy": "Flax chicāhualiztli",
-       "exif-gpslatituderef": "Mictlāmpa ahnozo huitztlāmpa āncāyōtl",
-       "exif-gpslatitude": "Āncāyōtl",
-       "exif-gpslongituderef": "Tlāpcopa ahnozo cihuātlāmpa huehtlatzīncāyōtl",
+       "exif-gpslatituderef": "Mictlampa nozo huitztlampa ancayotl",
+       "exif-gpslatitude": "Ancayotl",
+       "exif-gpslongituderef": "Tlapcopa nozo cihuatlampa huehtlatzincayotl",
        "exif-gpslongitude": "Huehtlatzīncāyōtl",
        "exif-gpsaltitude": "Huehcapancayōtl",
        "exif-gpstimestamp": "GPS cāhuitl (atomic tepozcāhuitl)",
-       "exif-iimcategory": "Tlaìxmatkàyòtlàlilòtl",
+       "exif-iimcategory": "Neneuhcayotl",
        "exif-orientation-1": "Yēctli",
        "exif-meteringmode-255": "Occē",
        "exif-lightsource-1": "Tōnameyōtl",
        "exif-gpslatitude-s": "Huiztlān",
        "exif-gpslongitude-e": "Tlāpcopa huehtlatzīncāyōtl",
        "exif-gpslongitude-w": "Cihuātlāmpa huehtlatzīncāyōtl",
-       "namespacesall": "mochīntīn",
+       "namespacesall": "mochintin",
        "monthsall": "(mochīntīn)",
        "confirmemail": "Ticchicāhuāz e-mail",
        "confirmemail_needlogin": "Tihuīquilia $1 ic ticchicāhua mo e-mail.",
-       "confirmemail_success": "Mocorreo ōmotlahtōlneltilih\nNiman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.",
+       "confirmemail_success": "Mocorreo omotlahtolneltilih\nNiman tihueliti [[Special:UserLogin|timocalaquiz]] auh ticpactiaz huiquitica.",
        "confirmemail_loggedin": "Mo e-mailcān ōmochicāuh.",
        "confirmemail_subject": "e-mailcān {{SITENAME}} ītlachicāhualiz",
-       "scarytranscludetoolong": "[In URL achi huel huēiyac ca]",
+       "scarytranscludetoolong": "[In URL huel hueyac]",
        "recreate": "Ticchīhuāz occeppa",
        "confirm_purge_button": "Cualli",
        "imgmultipageprev": "← achto zāzanilli",
        "imgmultipagenext": "niman zāzanilli →",
-       "imgmultigo": "¡uh!",
-       "imgmultigoto": "Yāuh $1 zāzanilhuīc",
+       "imgmultigo": "¡Ma xiyauh!",
+       "imgmultigoto": "Yaliztica ihuicpa tlahtolamatl $1",
        "ascending_abbrev": "quetza",
        "descending_abbrev": "temoa",
        "table_pager_next": "Niman zāzanilli",
        "table_pager_prev": "Achto zāzanilli",
        "table_pager_first": "Achtopa zāzanilli",
        "table_pager_last": "Xōcoyōc zāzanilli",
-       "table_pager_limit_submit": "Yāuh",
+       "table_pager_limit_submit": "Yaliztica",
        "table_pager_empty": "Ahtlein",
-       "autosumm-blank": "Tlaiztāctilīlli zāzanilli",
+       "autosumm-blank": "Tlaiztaliztli in tlahcuilolamatl",
        "autoredircomment": "Mocuepahua īhuīc [[$1]]",
-       "autosumm-new": "Tlachīhualli zāzanilli īca: \"$1\"",
+       "autosumm-new": "Tlachiuhtli tlahcuilolamatl ica: \"$1\"",
        "size-bytes": "$1 B",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "version-version": "($1)",
        "version-software-version": "Machiyōtzin",
        "fileduplicatesearch-filename": "Tlahcuilōlli ītōcā:",
-       "fileduplicatesearch-submit": "Tlatēmōz",
+       "fileduplicatesearch-submit": "Tlatemoliztli",
        "fileduplicatesearch-info": "$1 × $2 pixelli<br />Tlahcuilōlli īxquichiliz: $3<br />MIME iuhcāyōtl: $4",
        "specialpages": "Noncuahquizqui tlahcuilolli",
        "specialpages-note": "* Yeliztli nōncuahquīzqui āmatl.\n* <span class=\"mw-specialpagerestricted\">Tlaquīxtīlli nōncuahquīzqui āmatl.</span>\n* <span class=\"mw-specialpagecached\">Tlatlātīlli nōncuahquīzqui āmatl (aocmo monemitīa).</span>",
        "specialpages-group-changes": "Yancuīc tlapatlaliztli īhuān tlahcuilōlloh",
        "specialpages-group-users": "Tlatequitiltilīlli īhuān huelītiliztli",
        "specialpages-group-highuse": "Zāzaniltin tlatequitiliztechcopa",
-       "specialpages-group-pages": "Mochīntīn zāzaniltin",
+       "specialpages-group-pages": "Mochintin tlahcuilolamameh",
        "specialpages-group-redirects": "Tlatēmoliztli īhuān  tlacuepaliztli",
        "blankpage": "Iztāc zāzanilli",
-       "htmlform-selectorother-other": "Occē",
+       "htmlform-selectorother-other": "Occe",
        "rightsnone": "ahtlein",
        "revdelete-summary": "ticpatlāz tlahcuilōltōn",
        "searchsuggest-search": "Tlatemoliztli",
-       "api-error-ok-but-empty": "Tlâtek îtlakawilistli: Âmò tènankilia in tlatèmakani.",
-       "api-error-overwrite": "Awel motlâkuilnepanòltis sè èwalli tlèn yi katki.",
        "api-error-stashfailed": "Tlâtek îtlakawilistli: In tlatèmakani awel òkeuh in èwalpanòni.",
-       "api-error-timeout": "In tlatèmakani âmò òwalnàwat kèn òmochìxtikatka.",
-       "api-error-unclassified": "Òpanòk sè âmò ìxmatkàyo îtlakawilistli.",
-       "api-error-unknown-code": "Âmò ìxmatkàyo îtlakawilistli: \"$1\".",
-       "api-error-unknown-error": "Tlâtek îtlakawilistli: Îtlâtlèn òîtlakauh îkuàk òmonekià motilànas in èwalli.",
        "api-error-unknown-warning": "Âmò ìxmatkàyo tlanawatilistli: \"$1\".",
        "api-error-unknownerror": "Âmò ìxmatkàyo îtlakawilistli: \"$1\".",
-       "api-error-uploaddisabled": "Sèuhtok in êkawilistli ìpan inìn wiki.",
-       "api-error-verification-error": "Inìn èwalli welis îtlakauhtok, noso âmò kualli motzòwîtok.",
-       "expand_templates_ok": "Cualli",
+       "expand_templates_ok": "Cayecualli",
        "expand_templates_preview": "Xiquitta achtochīhualiztli",
-       "special-characters-group-latin": "Latintlahcuilōlli",
-       "special-characters-group-latinextended": "Mantoc latintlahcuilōlli",
+       "special-characters-group-latin": "Latintlahcuilolli",
+       "special-characters-group-latinextended": "Mantoc latintlahcuilolli",
        "special-characters-group-greek": "Greciatlahcuilōlli",
        "special-characters-group-cyrillic": "Cirilotlahcuilōlli",
        "special-characters-group-arabic": "Arabiatlahcuilōlli",
        "special-characters-group-thai": "Taitlahcuilōlli",
        "special-characters-group-lao": "Laotlahcuilōlli",
        "special-characters-group-khmer": "Jemertlahcuilōlli",
-       "randomrootpage": "Sâsaìntlèn nelwatlaìxtlapalli"
+       "randomrootpage": "Zazantlen nelhuatlahcuilolamatl"
 }
index 2b1bc3e..ef4d79c 100644 (file)
@@ -7,7 +7,8 @@
                        "아라",
                        "唐吉訶德的侍從",
                        "Luuva",
-                       "Macofe"
+                       "Macofe",
+                       "進也"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sû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--khí-lâi ê lūi-piat",
        "category-subcat-count": "{{PLURAL:$2|Chit ê lūi-piat chí-ū ē-bīn ê ē-lūi-pia̍t.|Chit ê lūi-piat ū ē-bīn {{PLURAL:$1| ê ē-lūi-piat|$1 ê ē-lūi-piat}}, choân-pō͘ $2 ê.}}",
        "category-subcat-count-limited": "Chit ê lūi-piat ū ē-bīn ê {{PLURAL:$1| ē-lūi-pia̍t|$1 ē-lūi-pia̍t}}.",
        "category-article-count": "{{PLURAL:$2|Chit ê lūi-piat chí-ū ē-bīn ê ia̍h.|Ē-bīn {{PLURAL:$1|bīn ia̍h sī|$1bīn ia̍h sī}} tī chit lūi-pia̍t, choân-pō͘ $2 bīn ia̍h}}",
        "category-file-count-limited": "Chit-má chit-ê lūi-pia̍t ū {{PLURAL:$1| ê tóng-àn}}",
        "listingcontinuesabbrev": "(chiap-sòa thâu-chêng)",
        "index-category": "Ū sek-ín ê ia̍h",
-       "noindex-category": "Bī sik-ín ê ia̍h.",
-       "broken-file-category": "Sit-khì tóng-àn liân-kiat ê ia̍h.",
+       "noindex-category": "Bī sik-ín ê ia̍h",
+       "broken-file-category": "Sit-khì tóng-àn liân-kiat ê ia̍h",
        "about": "Koan-hē",
        "article": "Loē-iông ia̍h",
        "newwindow": "(ē khui sin thang-á hián-sī)",
        "prefs-misc": "Kî-thaⁿ ê siat-tēng",
        "saveprefs": "Pó-chûn siat-tēng",
        "prefs-editing": "Pian-chi̍p",
-       "rows": "Chōa:",
-       "columns": "Nôa",
        "searchresultshead": "Chhiau-chhōe kiat-kó ê siat-tēng",
        "recentchangesdays": "Hián-sī kúi ji̍t chòe-kīn ê kái-piàn:",
        "recentchangesdays-max": "siōng-choē $1 {{PLURAL:$1|kang|kang}}",
        "metadata-expand": "Hián-sī iù-chiat",
        "metadata-collapse": "Am iù-chiat",
        "metadata-fields": "佇顯示圖片的頁,若掀開元資料,下跤的EXIF資料會儂看著。其他的元資料是先看無。\n* 廠商\n* 機型\n* 翕像的時陣\n* 曝光\n* 光圈\n* ISO 速率\n* 焦距\n* 作者\n* 版權\n* 說明\n* 緯度(GPS)\n* 經度(GPS)\n* 海拔(GPS)",
+       "exif-xresolution": "Chúi-pêⁿ kái-siōng-tō͘",
+       "exif-yresolution": "Sûi-ti̍t kái-siōng-tō͘",
        "exif-software": "Sú-iōng ê nńg-thé",
        "exif-colorspace": "Sek-chhái khong-kan",
        "namespacesall": "choân-pō·",
        "expandtemplates": "Khok-chhiong pang-bô͘",
        "expand_templates_input": "Su-ji̍p bûn-jī:",
        "expand_templates_output": "Kiat-kó:",
-       "expand_templates_remove_comments": "Comments the̍h tiāu"
+       "expand_templates_remove_comments": "Comments the̍h tiāu",
+       "mw-widgets-mediasearch-input-placeholder": "搜揣媒體"
 }
index 5cb16cb..47d2bcf 100644 (file)
        "passwordreset-emaildisabled": "'E funzione e-mail songo state stutate dint'a sta wiki.",
        "passwordreset-username": "Nomme utente:",
        "passwordreset-domain": "Duminio:",
-       "passwordreset-capture": "Vulite vedé 'e cuntenute d' 'a mmasciata mail?",
-       "passwordreset-capture-help": "Si se seleziona sta cascia, 'a mmasciata e-mail (c' 'a password temporanea), se mmustarrà a vuje e poi pure se mannarrà a l'utente.",
        "passwordreset-email": "Indirizzo e-mail:",
        "passwordreset-emailtitle": "Dettaglie d' 'o cunto pe' {{SITENAME}}",
        "passwordreset-emailtext-ip": "Coccherun (può darse ca sì tu, cu n'indirizzo IP $1) ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPassword temporanea: \n$2",
        "passwordreset-emailsentemail": "Si chesto fosse nu cunto e-mail suoccio a 'o cunto vuost, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
        "passwordreset-emailsentusername": "Si esistesse nu cunto e-mail suòccio a stu nomme utente, allora se mannarrà na mmasciata pe' riabbià 'a password.",
-       "passwordreset-emailsent-capture2": "L'email 'e reimpostazione d' 'a password {{PLURAL:$1|è stata mannata|so' state mannate}}. {{PLURAL:$1|'O nomme|L'elenco 'e nomme}} utente e password è mmustato ccà.",
-       "passwordreset-emailerror-capture2": "'O mannà 'email {{GENDER:$2|a ll'utente}} guastaje: $1. {{PLURAL:$3|'O nomme|L'elenco 'e nomme}} utente e password se ffà vedé ccà.",
        "passwordreset-nocaller": "Nu chiammate s'avess'a dà",
        "passwordreset-nosuchcaller": "'O chiammante nun esiste: $1",
        "passwordreset-ignored": "'A reimpustazione d' 'a password nun s'è gistita. Fosse ca nisciunu fornitore è stato mpustato?",
        "saveprefs": "Sarva",
        "restoreprefs": "Arripiglia 'e mpustaziune predefinite (inta tutte 'e seziune)",
        "prefs-editing": "Cascia 'e cagnamiento",
-       "rows": "Righe:",
-       "columns": "Culonne:",
        "searchresultshead": "Truova",
        "stub-threshold": "Valore lemmeto p' 'o furmato d' 'o cullegamento stub ($1):",
        "stub-threshold-sample-link": "mostra",
        "userrights-reason": "Mutivo:",
        "userrights-no-interwiki": "Nun tenite permesse pe' cagnà 'e deritte 'e l'utente ncopp'a l'ati wiki.",
        "userrights-nodatabase": "'O database $1 nun esiste o nun è nu database lucale.",
-       "userrights-nologin": "Avite 'a [[Special:UserLogin|trasì]] comme ammenistratore si vulite assegnà 'e deritte 'e l'utente.",
-       "userrights-notallowed": "Nun tenite 'e permesse pe' jognere o luvà 'e permesse utente.",
        "userrights-changeable-col": "Gruppe ca putite cagnà",
        "userrights-unchangeable-col": "Gruppe ca nun putite cagnà",
        "userrights-conflict": "Conflitto 'e cagnamiento 'e deritte utente! Cuntrullate e cunfermate 'e cagnamiente vuoste.",
-       "userrights-removed-self": "Avite rimosso 'e deritte vuoste. Picciò nun putite trasì cchiù dint'a sta paggena.",
        "group": "Gruppo:",
        "group-user": "Utente",
        "group-autoconfirmed": "Utente autocunfermate",
        "right-siteadmin": "Blocca e sblocca 'o database",
        "right-override-export-depth": "Esporta 'e paggene azzeccanno 'e paggene cullegate nfin'a na profondità 'e 5",
        "right-sendemail": "Manna na mail a ll'at'utente",
-       "right-passwordreset": "Vide 'e mmasciate 'e rimpustazione d' 'a password",
        "right-managechangetags": "Crìa e appiccia/stuta 'e [[Special:Tags|tag]]",
        "right-applychangetags": "Appreca [[Special:Tags|tag]] pe' tramente ca se fanno 'e cagnamiente 'e coccheruno",
        "right-changetags": "Azzecca o lèva a caso 'e [[Special:Tags|tag]] dint'a verziune nnividuale e riggistre 'e log",
        "uploaded-setting-handler-svg": "'o SVG ca mpustasse l'attribbuto \"handler\" cu nu remoto/date/script è bluccato. Truvato <code>$1=\"$2\"</code> dint' 'o file SVG carrecato.",
        "uploaded-remote-url-svg": "SVG ca mpustasse n'attribbuto 'e stile cu n'URL remota bluccata. Truvate <code>$1=\"$2\"</code> int' 'o file carrecato SVG.",
        "uploaded-image-filter-svg": "Truvato filtro immaggene cu n'URL: <code>&lt;$1 $2=\"$3\"&gt;</code> int' 'o file SVG carrecato.",
-       "uploadscriptednamespace": "Stu file SVG cuntene nu namespace '$1' nun permesso.",
+       "uploadscriptednamespace": "Stu file SVG cuntene nu namespace '<nowiki>$1</nowiki>' nun permesso.",
        "uploadinvalidxml": "'O códece XML d' 'o file carrecato nun se può passà.",
        "uploadvirus": "Stu file cuntene nu virus! Dettaglie: $1",
        "uploadjava": "Stu file è nu file ZIP ca cuntene nu file .class Java.\nCarrecà 'e file Java nun è permesso, pecché ponno appassà 'e restriziune 'e sicurezza.",
        "feedback-useragent": "Aggente utente:",
        "searchsuggest-search": "Truova",
        "searchsuggest-containing": "tène...",
-       "api-error-autoblocked": "Ll'indirizzo IP d' 'o vuosto è stato bloccato automaticamente, pecché a nu mumento l'ausaje n'utenza bloccata.",
-       "api-error-badaccess-groups": "Tun putite carrecà file ncopp' 'a sta wiki.",
        "api-error-badtoken": "Errore interno: 'O token nun è buono.",
-       "api-error-blocked": "Site stato/a bloccato/a, nun putite ffà cagnamiente.",
-       "api-error-copyuploaddisabled": "'A funzione carrcà 'e n'URL nun è appicciata dint'a stu server.",
-       "api-error-duplicate": "Nce {{PLURAL:$1|sta è n'atu file|stanno ati file}} ncopp' 'o sito ch' 'e cuntenute eguale eguale.",
-       "api-error-duplicate-archive": "Nce {{PLURAL:$1|steva n'atu file|stevano ati file}} già ncopp' 'o sito ch' 'e stisse cuntenute, però {{PLURAL:$1|è stato|so' state}} scancellate.",
-       "api-error-empty-file": "'O file ch'avite mannato è abbacante.",
        "api-error-emptypage": "'A criazione 'e paggene nuove abbacante nun è permessa.",
-       "api-error-fetchfileerror": "Errore interno: Coccosa ascette stuorta quanno se steva 'analizzà stu file.",
-       "api-error-fileexists-forbidden": "Nu file c' 'o nomme \"$1\" esiste già, e chisto nun pò essere sovrascritto.",
-       "api-error-fileexists-shared-forbidden": "Nu file c' 'o nomme \"$1\" esiste già dint' 'a l'archivio 'e file, e chisto nun pò essere sovrascritto.",
-       "api-error-file-too-large": "'O file ch'avite mannato è troppo gruosso.",
-       "api-error-filename-tooshort": "'O nomme d' 'o file è troppo curto.",
-       "api-error-filetype-banned": "Stu tipo 'e file nun è permesso.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun è nu tipo 'e file permesso|nun songo tipe 'e file permesse}}. {{PLURAL:$3|'O tipo 'e file permesso è|'E tipe 'e file permesse songo}} $2.",
-       "api-error-filetype-missing": "Stu file nun tene estensione.",
-       "api-error-hookaborted": "'O cagnamiento c'avite pruvato 'e fà è stato spezzato 'a na stensione.",
-       "api-error-http": "Errore interno: Nun putimmo ngarrà a nce cullegà a 'o server.",
-       "api-error-illegal-filename": "'O nomme d' 'o file nun è permesso.",
-       "api-error-internal-error": "Errore interno: Coccosa ascette male pe' tramente ca se steva processanno 'a carreca dint'a stu wiki.",
-       "api-error-invalid-file-key": "Errore interno: 'O file nun se pò truvà dint' 'a memoria temporanea.",
-       "api-error-missingparam": "Errore interno: nun se trovano 'e parametre pe' ne putè fà 'a richiesta.",
-       "api-error-missingresult": "Errore interno: Nun se pò sapè si 'a copia ascette bbona.",
-       "api-error-mustbeloggedin": "Avite 'a trasì ô sito si vulite carrecà file.",
-       "api-error-mustbeposted": "Errore interno: 'A richiesta vole HTTP POST.",
-       "api-error-noimageinfo": "A carreca ngarraje, ma 'o server nun ce ha pututo dà nisciuna nformazione ncopp' 'o file.",
-       "api-error-nomodule": "Errore interno: Nisciuno modulo 'e carreca mpustato.",
-       "api-error-ok-but-empty": "Errore interno: Nisciuna resposta 'a 'o server.",
-       "api-error-overwrite": "Sovrascrivere nu file ch'esiste già nun è permesso.",
-       "api-error-ratelimited": "Vuje avite tntato 'e carrecà cchiù file dint'a nu mumento curt' 'e tiempo ca sta wiki premmettesse.\nPe' piacere, tentate n'ata vota int'a nu poch' 'e minute.",
-       "api-error-stashfailed": "Errore interno: 'O server nun ngarraje a s'astipà 'o file temporaneo.",
        "api-error-publishfailed": "Errore interno: 'O server nun ngarraje a pubbrecà 'o file temporaneo.",
-       "api-error-stasherror": "'A carreca d' 'o file 'n stash è asciuta male, ce sta n'errore.",
-       "api-error-stashedfilenotfound": "'O file 'n stash nun è stato truvato pe' tramente ca se faceva 'a prova 'e carreca d' 'o stash.",
-       "api-error-stashpathinvalid": "'O cullegamento a 'o pizzo addò avesse stà 'o file 'e stash nun è bbuono.",
-       "api-error-stashfilestorage": "L'astipamento d' 'o file 'n stash è asciuto male, ce sta n'errore.",
-       "api-error-stashzerolength": "'O server nun può nzertà 'o file dint'a 'o stash, pecché è luongo zero zero.",
-       "api-error-stashnotloggedin": "Avisseve 'a trasì pe' ne putè astipà 'e file din' 'o stash 'e càrreca.",
-       "api-error-stashwrongowner": "'O file addò stavate a trasì dint' 'o stash nun v'appartene.",
-       "api-error-stashnosuchfilekey": "'A chiave d' 'o file addò stavate a trasì dint' 'o stash nun esiste.",
-       "api-error-timeout": "'O server nun rispunnette dint'a 'o tiempo stabbelito.",
-       "api-error-unclassified": "È capitato n'errore scanusciuto.",
-       "api-error-unknown-code": "Errore scanusciuto: \"$1\"",
-       "api-error-unknown-error": "Errore interno: Coccosa jette a fernì malalamente quano facisteve 'a carreca d' 'o file vuosto.",
+       "api-error-stashfailed": "Errore interno: 'O server nun ngarraje a s'astipà 'o file temporaneo.",
        "api-error-unknown-warning": "Avvertimento scanusciute: $1",
        "api-error-unknownerror": "Errore scanusciuto: \"$1\"",
-       "api-error-uploaddisabled": "'E carreche so' stutate dint'a sta siki.",
-       "api-error-verification-error": "Stu file putesse stà nguacchiato, o tene n'estensione sbagliata.",
-       "api-error-was-deleted": "Nu file cu stu nomme s'è carrecato primma e po' s'è scancellaje.",
        "duration-seconds": "$1 {{PLURAL:$1|secondo|seconde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minute}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
index f3de384..15125c6 100644 (file)
@@ -78,7 +78,7 @@
        "tog-enotifminoredits": "Send meg e-post også ved mindre endringer av sider og filer",
        "tog-enotifrevealaddr": "Vis min e-postadresse i utgående meldinger",
        "tog-shownumberswatching": "Vis antall brukere som overvåker",
-       "tog-oldsig": "Nåværende signatur:",
+       "tog-oldsig": "Gjeldende signatur:",
        "tog-fancysig": "Behandle signaturen som wikitekst (uten automatisk lenke)",
        "tog-uselivepreview": "Bruk levende forhåndsvisning",
        "tog-forceeditsummary": "Advar meg når jeg ikke gir noen redigeringsforklaring",
        "searcharticle": "Gå",
        "history": "Sidehistorikk",
        "history_short": "Historikk",
+       "history_small": "historikk",
        "updatedmarker": "oppdatert siden mitt forrige besøk",
        "printableversion": "Utskriftsvennlig versjon",
        "permalink": "Permanent lenke",
        "views": "Visninger",
        "toolbox": "Verktøy",
        "tool-link-userrights": "Endre {{GENDER:$1|brukergrupper}}",
+       "tool-link-userrights-readonly": "Vis {{GENDER:$1|brukergrupper}}",
        "tool-link-emailuser": "Send {{GENDER:$1|brukeren}} en e-post",
        "userpage": "Vis brukerside",
        "projectpage": "Vis prosjektside",
        "passwordreset-emaildisabled": "E-posttjenester er slått av på denne wikien.",
        "passwordreset-username": "Brukernavn:",
        "passwordreset-domain": "Domene:",
-       "passwordreset-capture": "Vise resulterende e-post?",
-       "passwordreset-capture-help": "Hvis du krysser av her, vil du se e-posten (med foreløpig passord) i tillegg til at den blir sendt til brukeren.",
        "passwordreset-email": "E-postadresse:",
        "passwordreset-emailtitle": "Kontodetaljer på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Noen (sannsynligvis deg fra IP-adressen $1) ba om en tilbakestilling av ditt passord for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er\ntilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{PLURAL:$5|én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
        "passwordreset-emailelement": "Brukernavn: \n$1\n\nMidlertidig passord: \n$2",
        "passwordreset-emailsentemail": "Hvis denne epostadressen er koblet til din konto, så vil det bli sendt en epost om tilbakestilling av passord.",
        "passwordreset-emailsentusername": "Hvis det finnes en epostadresse knyttet til dette brukernavnet, vil en epost med informasjon om tilbakestilling av passord bli sendt.",
-       "passwordreset-emailsent-capture2": "{{PLURALS:$1|E-posten|E-postene}} om passordtilbakestilling har blitt sendt. {{PLURAL:$1|Brukernavnet og passordet|Listen over brukernavn og passord}} vises under.",
-       "passwordreset-emailerror-capture2": "Kunne ikke sende e-post til {{GENDER:$2|brukeren}}: $1 {{PLURAL:$3|Brukernavnet og passordet|Listen over brukernavn og passord}} vises her.",
        "passwordreset-nocaller": "En bruker må angis",
        "passwordreset-nosuchcaller": "Brukeren finnes ikke: $1",
        "passwordreset-ignored": "Passordtilbakestillingen ble ikke håndtert. Har ingen leverandør blitt konfigurert?",
        "changeemail": "Endre eller fjerne epostadresse",
        "changeemail-header": "Fyll ut dette skjemaet for å bytte din epost-adresse. Hvis du vil fjerne epostadressen fra din konto, kan du la ny epostadresse-feltet være tomt når.",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
-       "changeemail-oldemail": "Nåværende e-postadresse:",
+       "changeemail-oldemail": "Gjeldende e-postadresse:",
        "changeemail-newemail": "Ny e-postadresse:",
        "changeemail-newemail-help": "Dette feltet bør stå blankt hvis du ønsker å fjerne epostadressen din. Det vil ikke være mulig å nullstille et glemt passord og du vil ikke motta noen eposter fra denne wikien hvis epostadressen fjernes.",
        "changeemail-none": "(ingen)",
        "blockedtitle": "Brukeren er blokkert",
        "blockedtext": "'''Ditt brukernavn eller din IP-adresse har blitt blokkert.'''\n\nBlokkeringen ble utført av $1. Grunnen som ble oppgitt var ''$2''.\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkering ment på: $7\n\nDu kan kontakte $1 eller en annen [[{{MediaWiki:Grouppage-sysop}}|administrator]] for å diskutere blokkeringen.\nDu kan ikke bruke «E-post til denne brukeren»-funksjonen med mindre du har oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]] og du ikke er blokkert fra å sende e-post.\nDin nåværende IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta all denne informasjonen ved henvendelser.",
        "autoblockedtext": "Din IP-adresse har blitt automatisk blokkert fordi den ble brukt av en annen bruker som ble blokkert av $1.\nDen oppgitte grunnen var:\n\n:'''$2'''\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkeringen er ment for: $7\n\nDu kan kontakte $1 eller en av de andre [[{{MediaWiki:Grouppage-sysop}}|administratorene]] for å diskutere blokkeringen.\n\nMerk at du ikke kan bruke «E-post til denne brukeren»-funksjonen med mindre du har registrert en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].\n\nDin IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta med all denne informasjonen ved henvendelser.",
+       "systemblockedtext": "Ditt brukernavn eller IP-adresse har blitt blokkert automatisk av MediaWiki.\n\nBlokkeringen grunnes:\n\n:<em>$2</em>\n\n* Blokkeringen startet: $8\n* Blokkeringen gjelder til: $6\n* Blokkeringen er ment for: $7\n\nDin nåværende IP-adresse er $3.\nVennligst inkluder informasjonen over i alle spørsmål du spør angående dette.",
        "blockednoreason": "ingen grunn gitt",
        "whitelistedittext": "Du må $1 for å redigere artikler.",
        "confirmedittext": "Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og bekreft e-postadressen din via [[Special:Preferences|innstillingene dine]].",
        "nosuchsectiontitle": "Finner ikke avsnittet",
        "nosuchsectiontext": "Du prøvde å redigere et avsnitt som ikke eksisterer.\nDet kan ha blitt flyttet eller slettet mens du så på siden.",
        "loginreqtitle": "Innlogging kreves",
-       "loginreqlink": "logg inn",
+       "loginreqlink": "logge inn",
        "loginreqpagetext": "Du må $1 for å se andre sider.",
        "accmailtitle": "Passord sendt.",
        "accmailtext": "Et tilfeldig passord for [[User talk:$1|$1]] har blitt sendt til $2. Det kan endres på [[Special:ChangePassword|passordendringssiden]] under innlogging.",
        "search-interwiki-caption": "Søsterprosjekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mer)",
+       "search-interwiki-more-results": "flere resultater",
        "search-relatedarticle": "Relatert",
        "searchrelated": "relatert",
        "searchall": "alle",
        "search-external": "Eksternt søk",
        "searchdisabled": "Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.",
        "search-error": "En feil oppsto under søk: $1",
+       "search-warning": "En advarsel oppsto under søk: $1",
        "preferences": "Innstillinger",
        "mypreferences": "Innstillinger",
        "prefs-edits": "Antall redigeringer:",
        "saveprefs": "Lagre",
        "restoreprefs": "Tilbakestill alt til standardinnstillinger",
        "prefs-editing": "Redigering",
-       "rows": "Rader:",
-       "columns": "Kolonner",
        "searchresultshead": "Søk",
        "stub-threshold": "Grense for stubblenkeformatering ($1):",
        "stub-threshold-sample-link": "eksempel",
        "prefs-help-recentchangescount": "Dette inkluderer nylige endringer, sidehistorikk og logger.",
        "prefs-help-watchlist-token2": "Dette er den hemmelige nøkkelen til webmatingen for din overvåkningsliste.\nEnhver som kjenner nøkkelen vil kunne lese din overvåkningsliste, så ikke vis den til andre.\n[[Special:ResetTokens|Klikk her om du trenger å nullstille nøkkelen]].",
        "savedprefs": "Innstillingene ble lagret.",
-       "savedrights": "Brukerrettighetene til {{GENDER:$1|$1}} har blitt lagret.",
+       "savedrights": "Brukergruppene til {{GENDER:$1|$1}} har blitt lagret.",
        "timezonelegend": "Tidssone:",
        "localtime": "Lokaltid:",
        "timezoneuseserverdefault": "Bruk wikistandard ($1)",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Brukernavn}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} i følgende {{PLURAL:$1|gruppe|grupper}}:",
+       "group-membership-link-with-expiry": "$1 (til $2)",
        "prefs-registration": "Registreringstidspunkt:",
        "yourrealname": "Virkelig navn:",
        "yourlanguage": "Språk:",
        "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-lookup-user": "Ordne brukergrupper",
+       "userrights-lookup-user": "Velg en bruker",
        "userrights-user-editname": "Fyll inn et brukernavn:",
-       "editusergroup": "Endre {{GENDER:$1|brukergrupper}}",
+       "editusergroup": "Last brukergrupper",
        "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Rediger brukergrupper",
+       "viewinguserrights": "Viser {{GENDER:$1|brukerrettighetene}} til  <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Rediger {{GENDER:$1|brukergrupper}}",
+       "userrights-viewusergroup": "Se {{GENDER:$1|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.",
+       "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-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-nologin": "Du må [[Special:UserLogin|logge inn]] med en administratorkonto for å endre brukerrettigheter.",
-       "userrights-notallowed": "Du har ikke tillatelse til å gi eller fjerne brukerrettigheter.",
        "userrights-changeable-col": "Grupper du kan endre",
        "userrights-unchangeable-col": "Grupper du ikke kan endre",
        "userrights-irreversible-marker": "$1 *",
+       "userrights-expiry-current": "Løper ut $1",
+       "userrights-expiry-none": "Utløper ikke",
+       "userrights-expiry": "Utløper:",
+       "userrights-expiry-existing": "Gjeldende utløpstid: $2 $3",
+       "userrights-expiry-othertime": "Annen tid:",
+       "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-conflict": "En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.",
-       "userrights-removed-self": "Du har fjernet dine egne rettigheter. Du har derfor ikke lengre adgang til denne siden.",
        "group": "Gruppe:",
        "group-user": "Brukere",
        "group-autoconfirmed": "Autobekreftede brukere",
        "right-writeapi": "Redigere via API",
        "right-delete": "Slette sider",
        "right-bigdelete": "Slette sider med stor historikk",
-       "right-deletelogentry": "Slett og gjenopprett spesifikke loggoppføringer",
+       "right-deletelogentry": "Slette og gjenopprette spesifikke loggoppføringer",
        "right-deleterevision": "Slette og gjenopprette enkeltrevisjoner av sider",
        "right-deletedhistory": "Se slettet sidehistorikk uten tilhørende sidetekst",
        "right-deletedtext": "Vise slettet tekst og endringer mellom slettede versjoner",
        "right-browsearchive": "Søke i slettede sider",
        "right-undelete": "Gjenopprette sider",
-       "right-suppressrevision": "Se på, skjul og hent frem igjen spesifikke siderevisjoner for alle brukere",
+       "right-suppressrevision": "Se, skjule og hente frem igjen spesifikke siderevisjoner for alle brukere",
        "right-viewsuppressed": "Se på revisjoner som er skjult for alle brukere",
        "right-suppressionlog": "Se private logger",
        "right-block": "Blokkere andre brukere fra å redigere",
        "right-ipblock-exempt": "Kan redigere fra blokkerte IP-adresser",
        "right-unblockself": "Fjerne blokkering av seg selv",
        "right-protect": "Endre beskyttelsesnivåer og redigere beskyttete sider",
-       "right-editprotected": "Redigere beskyttede sider som «{{int:protect-level-sysop}}»",
-       "right-editsemiprotected": "Redigere beskyttede sider som «{{int:protect-level-autoconfirmed}}»",
-       "right-editcontentmodel": "Rediger innholdsmodellen til en side",
+       "right-editprotected": "Redigere beskyttede sider som er «{{int:protect-level-sysop}}»",
+       "right-editsemiprotected": "Redigere beskyttede sider som er «{{int:protect-level-autoconfirmed}}»",
+       "right-editcontentmodel": "Redigere innholdsmodellen til en side",
        "right-editinterface": "Redigere brukergrensesnittet",
        "right-editusercssjs": "Redigere andre brukeres CSS- og JS-filer",
        "right-editusercss": "Redigere andre brukeres CSS-filer",
        "right-edituserjs": "Redigere andre brukeres JS-filer",
-       "right-editmyusercss": "Rediger dine egne CSS-filer",
-       "right-editmyuserjs": "Rediger dine egne Javascript-filer",
-       "right-viewmywatchlist": "Vis din egen overvåkningsliste",
-       "right-editmywatchlist": "Redigere din egen overvåkningsliste. Legg merke til at noen aksjoner fortsatt vil legge til sider uten denne rettigheten.",
-       "right-viewmyprivateinfo": "Vise dine egne private data (f.eks. epostadresse og virkelig navn)",
-       "right-editmyprivateinfo": "Redigere dine egne private data (f.eks. epostadresse og virkelig navn)",
-       "right-editmyoptions": "Redigere dine egne innstillinger",
+       "right-editmyusercss": "Redigere sine egne CSS-filer",
+       "right-editmyuserjs": "Redigere sine egne JavaScript-filer",
+       "right-viewmywatchlist": "Vise sin egen overvåkningsliste",
+       "right-editmywatchlist": "Redigere sin egen overvåkningsliste. Legg merke til at noen handlinger fortsatt vil legge til sider uten denne rettigheten.",
+       "right-viewmyprivateinfo": "Vise sine egne private data (f.eks. epostadresse og virkelig navn)",
+       "right-editmyprivateinfo": "Redigere sine egne private data (f.eks. epostadresse og virkelig navn)",
+       "right-editmyoptions": "Redigere sine egne innstillinger",
        "right-rollback": "Raskt tilbakestille den siste brukeren som har redigert en gitt side",
        "right-markbotedits": "Markere tilbakestillinger som robotredigeringer",
        "right-noratelimit": "Påvirkes ikke av hastighetsgrenser",
        "right-import": "Importere sider fra andre wikier",
        "right-importupload": "Importere sider via opplasting",
        "right-patrol": "Markere redigeringer som patruljerte",
-       "right-autopatrol": "Får sine egne redigeringer merket som patruljerte",
+       "right-autopatrol": "Få sine egne redigeringer merket som patruljerte",
        "right-patrolmarks": "Bruke patruljeringsfunksjoner i siste endringer",
        "right-unwatchedpages": "Se listen over uovervåkede sider",
        "right-mergehistory": "Flette sidehistorikker",
        "right-userrights-interwiki": "Redigere rettigheter for brukere på andre wikier",
        "right-siteadmin": "Låse og låse opp databasen",
        "right-override-export-depth": "Eksporter sider inkludert lenkede sider til en dypde på 5",
-       "right-sendemail": "Send e-post til andre brukere",
-       "right-passwordreset": "Vis e-poster over tilbakestilte passord",
+       "right-sendemail": "Sende e-post til andre brukere",
        "right-managechangetags": "Opprette og (de)aktivere [[Special:Tags|tagger]]",
-       "right-applychangetags": "Legg til [[Special:Tags|merker]] sammen med ens endringer",
-       "right-changetags": "Legg til og fjern vilkårlige [[Special:Tags|merker]] på individuelle revisjoner og loggposter",
+       "right-applychangetags": "Legge til [[Special:Tags|tagger]] sammen med ens endringer",
+       "right-changetags": "Legge til og fjerne vilkårlige [[Special:Tags|tagger]] på individuelle revisjoner og loggoppføringer",
        "right-deletechangetags": "Slette [[Special:Tags|tagger]] fra databasen",
        "grant-generic": "Rettighetspakken «$1»",
        "grant-group-page-interaction": "Interagere med sider",
        "action-upload_by_url": "laste opp denne filen fra en URL",
        "action-writeapi": "bruke skrive-API-en",
        "action-delete": "slette denne siden",
-       "action-deleterevision": "slette denne revisjonen",
-       "action-deletedhistory": "se denne sidens slettede historikk",
+       "action-deleterevision": "slett revisjoner",
+       "action-deletelogentry": "slette loggoppføringer",
+       "action-deletedhistory": "se en sides slettede historikk",
+       "action-deletedtext": "se slettet revisjonstekst",
        "action-browsearchive": "søke i slettede sider",
-       "action-undelete": "gjenopprette denne siden",
-       "action-suppressrevision": "se og gjenopprette denne skjulte revisjonen",
+       "action-undelete": "gjenopprette sider",
+       "action-suppressrevision": "se gjennom og gjenopprette skjulte revisjoner",
        "action-suppressionlog": "se denne private loggen",
        "action-block": "blokkere denne brukeren fra å redigere",
        "action-protect": "endre denne sidens beskyttelsesnivåer",
        "action-userrights-interwiki": "endre brukerrettigheter for brukere på andre wikier",
        "action-siteadmin": "låse eller låse opp databasen",
        "action-sendemail": "sende e-poster",
+       "action-editmyoptions": "redigere innstillingene dine",
        "action-editmywatchlist": "redigere din overvåkningsliste",
        "action-viewmywatchlist": "Vis din overvåkningsliste",
        "action-viewmyprivateinfo": "vise din private informasjon",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|liste over nye sider]])",
        "recentchanges-legend-plusminus": "«(±123)»",
        "recentchanges-submit": "Vis",
+       "rcfilters-activefilters": "Aktive filtre",
+       "rcfilters-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-noresults": "Ingen filtre funnet",
+       "rcfilters-filtergroup-registration": "Brukerregistrering",
+       "rcfilters-filter-registered-label": "Registrerte",
+       "rcfilters-filter-registered-description": "Innloggede brukere.",
+       "rcfilters-filter-unregistered-label": "Uregistrerte",
+       "rcfilters-filter-unregistered-description": "Brukere som ikke er logget inn.",
+       "rcfilters-filtergroup-authorship": "Redigeringens forfatter",
+       "rcfilters-filter-editsbyself-label": "Dine egne redigeringer",
+       "rcfilters-filter-editsbyself-description": "Redigeringer gjort av deg.",
+       "rcfilters-filter-editsbyother-label": "Redigeringer av andre",
+       "rcfilters-filter-editsbyother-description": "Redigeringer som er gjort av andre brukere enn deg.",
+       "rcfilters-filtergroup-userExpLevel": "Erfaringsnivå (kun for registrerte brukere)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nykommere",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Færre enn 10 redigeringer og 4 dagers aktivitet.",
+       "rcfilters-filter-userExpLevel-learner-label": "Nybegynnere",
+       "rcfilters-filter-userExpLevel-learner-description": "Flere dagers aktivitet enn «Nykommere», men mindre enn «Erfarne brukere».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfarne brukere",
+       "rcfilters-filter-userExpLevel-experienced-description": "Mer enn 30 dagers aktivitet og 500 redigeringer.",
+       "rcfilters-filtergroup-automated": "Automatiske bidrag",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Redigeringer gjort med automatiske verktøy.",
+       "rcfilters-filter-humans-label": "Menneske (ikke bot)",
+       "rcfilters-filter-humans-description": "Redigeringer gjort av menneskelige brukere.",
+       "rcfilters-filtergroup-significance": "Betydning",
+       "rcfilters-filter-minor-label": "Mindre endringer",
+       "rcfilters-filter-minor-description": "Redigeringer merket som mindre av brukeren.",
+       "rcfilters-filter-major-label": "Ikke-mindre endringer",
+       "rcfilters-filter-major-description": "Redigeringer som ikke er merket som mindre.",
+       "rcfilters-filtergroup-changetype": "Type endring",
+       "rcfilters-filter-pageedits-label": "Sideredigeringer",
+       "rcfilters-filter-pageedits-description": "Redigeringer til wikiinnhold, diskusjoner, kategoribeskrivelser ...",
+       "rcfilters-filter-newpages-label": "Sideopprettelser",
+       "rcfilters-filter-newpages-description": "Redigeringer som oppretter nye sider.",
+       "rcfilters-filter-categorization-label": "Kategoriendringer",
+       "rcfilters-filter-categorization-description": "Sporer sider som legges til i eller fjernes fra kategorier.",
+       "rcfilters-filter-logactions-label": "Loggførte handlinger",
+       "rcfilters-filter-logactions-description": "Administrative handlinger, kontoopprettelser, sideslettinger, opplastinger ...",
        "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "rcshowhideminor": "$1 mindre endringer",
        "recentchangeslinked-summary": "Dette er en liste over de siste endringene på sidene lenket fra en spesifisert side (eller til meldlemmer av en spesifisert kategori).\nSider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
        "recentchangeslinked-page": "Sidenavn:",
        "recentchangeslinked-to": "Vis endringer på sider som lenker til den gitte siden istedet",
-       "recentchanges-page-added-to-category": "[[:$1]] lagt til kategori",
+       "recentchanges-page-added-to-category": "[[:$1]] ble lagt til i kategorien",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] lagt til i kategori, [[Special:WhatLinksHere/$1|denne siden er inkludert i andre sider]]",
        "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] fjernet fra kategori, [[Special:WhatLinksHere/$1|denne siden er inkludert i andre sider]]",
        "uploaded-setting-handler-svg": "SVG-er som setter «handler»-attributtet med remote/data/script er blokkert. Fant <code>$1=\"$2\"</code> i den opplastede SVG-fila.",
        "uploaded-remote-url-svg": "SVG-er som setter et stilattributt med ekstern URL er blokkert. Fant <code>$1=\"$2\"</code> i den opplastede SVG-fila.",
        "uploaded-image-filter-svg": "Fant bildefilter med URL: <code>&lt;$1 $2=\"$3\"&gt;</code> i den opplastede SVG-fila.",
-       "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"$1\"",
+       "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML-en i den opplastede filen kunne ikke tolkes.",
        "uploadvirus": "Denne filen inneholder virus! Detaljer: $1",
        "uploadjava": "Filen er en ZIP-fil som inneholder en Java-fil av typen .class.\nDet er ikke tillatt å laste opp Java-filer, fordi de kan omgå sikkerhetsrestriksjoner.",
        "filerevert-submit": "Tilbakestill",
        "filerevert-success": "'''[[Media:$1|$1]]''' ble tilbakestilt til [$4 versjonen à $2, $3].",
        "filerevert-badversion": "Det er ingen tidligere lokal versjon av denne filen med det gitte tidstrykket.",
-       "filerevert-identical": "Den nåværende versjonen av fila er allerede identisk med den valgte.",
+       "filerevert-identical": "Den gjeldende versjonen av fila er allerede identisk med den valgte.",
        "filedelete": "Slett $1",
        "filedelete-legend": "Slett fil",
        "filedelete-intro": "Du er i ferd med å slette filen '''[[Media:$1|$1]]''' sammen med hele dens historikk.",
        "uncategorizedcategories": "Ukategoriserte kategorier",
        "uncategorizedimages": "Ukategoriserte filer",
        "uncategorizedtemplates": "Ukategoriserte maler",
+       "uncategorized-categories-exceptionlist": "# Inneholder ei liste over kategorier som ikke skal nevnes på Special:UncategorizedCategories. Én kategori per linje, som starter med «*». Linjer som starter med adre tegn (inkludert mellomrom) ignoreres. Bruk «#» for kommentarer.",
        "unusedcategories": "Ubrukte kategorier",
        "unusedimages": "Ubrukte filer",
        "wantedcategories": "Ønskede kategorier",
        "apisandbox-sending-request": "Sender API-forespørsel...",
        "apisandbox-loading-results": "Mottar API-resultater...",
        "apisandbox-results-error": "En feil oppsto under lasting av API-spørringssvaret: $1.",
+       "apisandbox-request-selectformat-label": "Vis forespørselsdata som:",
+       "apisandbox-request-format-url-label": "URL-spørringsstreng",
        "apisandbox-request-url-label": "Forespurt URL:",
+       "apisandbox-request-json-label": "Spør om JSON:",
        "apisandbox-request-time": "Forespørselstid: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Fiks nøkkelen og send på nytt",
        "apisandbox-results-fixtoken-fail": "Henting av nøkkelen «$1» mislyktes.",
        "apisandbox-continue-clear": "Tøm",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} vil [https://www.mediawiki.org/wiki/API:Query#Continuing_queries fortsette] forrige forespørsel; {{int:apisandbox-continue-clear}} vil tømme fortsettelsesrelaterte parametre.",
        "apisandbox-param-limit": "Skriv <kbd>max</kbd> for å bruke maksgrensa.",
+       "apisandbox-multivalue-all-namespaces": "$1 (alle navnerom)",
+       "apisandbox-multivalue-all-values": "$1 (alle verdier)",
        "booksources": "Bokkilder",
        "booksources-search-legend": "Søk etter bokkilder",
        "booksources-search": "Søk",
        "activeusers-count": "$1 {{PLURAL:$1|endring|endringer}} {{PLURAL:$3|det siste døgnet|de siste $3 dagene}}",
        "activeusers-from": "Vis brukere fra og med:",
        "activeusers-groups": "Vis brukere som tilhører gruppene:",
+       "activeusers-excludegroups": "Ekskluder brukere som hører til gruppene:",
        "activeusers-noresult": "Ingen brukere funnet.",
        "activeusers-submit": "Vis",
        "listgrouprights": "Rettigheter for brukergrupper",
        "emailccsubject": "Kopi av din beskjed til $1: $2",
        "emailsent": "E-post sendt",
        "emailsenttext": "E-postbeskjeden er sendt",
-       "emailuserfooter": "Denne e-posten ble {{GENDER:$1|sendt}} av $1 til {{GENDER:$2|$2}}  via funksjonen «{{int:emailuser}}» på {{SITENAME}}.",
+       "emailuserfooter": "Denne e-posten ble {{GENDER:$1|sendt}} av $1 til {{GENDER:$2|$2}}  via funksjonen «{{int:emailuser}}» på {{SITENAME}}. Om {{GENDER:$2|du}} svarer på denne eposten vil den sendes direkte til {{GENDER:$1|opprinnelig avsender}} og avsløre {{GENDER:$2|din}} epostadresse for {{GENDER:$1|ham|henne|dem}}.",
        "usermessage-summary": "Etterlater en systembeskjed.",
        "usermessage-editor": "Systembudbringer",
        "watchlist": "Overvåkningsliste",
        "enotif_subject_restored": "{{SITENAME}}-siden $1 har blitt gjenopprettet av {{gender:$2|$2}}",
        "enotif_subject_changed": "{{SITENAME}}-siden $1 har blitt endret av {{gender:$2|$2}}",
        "enotif_body_intro_deleted": "{{SITENAME}}-siden $1 ble slettet $PAGEEDITDATE av {{gender:$2|$2}}; se $3.",
-       "enotif_body_intro_created": "{{SITENAME}}-siden $1 ble opprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
+       "enotif_body_intro_created": "{{SITENAME}}-siden $1 ble opprettet $PAGEEDITDATE av {{GENDER:$2|$2}}. Se $3 for den nåværende versjonen.",
        "enotif_body_intro_moved": "{{SITENAME}}-siden $1 ble flyttet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
        "enotif_body_intro_restored": "{{SITENAME}}-siden $1 ble gjenopprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
-       "enotif_body_intro_changed": "{{SITENAME}}-siden $1 ble endret $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
+       "enotif_body_intro_changed": "{{SITENAME}}-siden $1 ble endret $PAGEEDITDATE av {{GENDER:$2|$2}}. Se $3 for den nåværende versjonen.",
        "enotif_lastvisited": "Se $1 for alle endringer siden ditt forrige besøk.",
        "enotif_lastdiff": "Se $1 for å se denne endringen.",
        "enotif_anon_editor": "anonym bruker $1",
        "changecontentmodel-emptymodels-title": "Ingen innholdsmodeller er tilgjengelige",
        "changecontentmodel-emptymodels-text": "Innholdet på [[:$1]] kan ikke konverteres til noen type.",
        "log-name-contentmodel": "Logg over endringer i endringsloggen",
-       "log-description-contentmodel": "Hendelseslogg relatert til innholdsmodellen for en side",
+       "log-description-contentmodel": "Denne siden lister endringer i innholdsmodellen til sider, og sider som ble laget med andre innholdsmodeller enn den som er standard.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|opprettet}} siden $3 med den ikke-standard innholdsmodellen «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|endret}} innholdsmodellen for siden $3 fra «$4» til «$5»",
        "logentry-contentmodel-change-revertlink": "tilbakestill",
        "protect-unchain-permissions": "Lås opp flere beskyttelsesinnstillinger",
        "protect-text": "Du kan se og endre beskyttelsesnivået for siden '''$1''' her.",
        "protect-locked-blocked": "Du kan ikke endre beskyttelsesnivåer mens du er blokkert. Dette er de nåværende innstillingene for siden '''$1''':",
-       "protect-locked-dblock": "Beskyttelsesnivåer kan ikke endres under en aktiv databasebeskyttelse. Dette er de nåværende innstillingene for siden '''$1''':",
+       "protect-locked-dblock": "Beskyttelsesnivåer kan ikke endres under en aktiv databasebeskyttelse. Dette er de gjeldende innstillingene for siden '''$1''':",
        "protect-locked-access": "Kontoen din har ikke tillatelse til å endre sidebeskyttelsesnivå.\nDette er de nåværende innstillingene for siden '''$1''':",
        "protect-cascadeon": "Denne siden er for tiden beskyttet fordi den er transkludert på følgende {{PLURAL:$1|side|sider}} som har dypbeskyttelse slått på.\nDu kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.",
        "protect-default": "Tillat alle brukere",
        "proxyblockreason": "IP-adressen din ble blokkert fordi den er en åpen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.",
        "sorbsreason": "IP-adressen din er listet som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.",
        "sorbs_create_account_reason": "Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto",
+       "softblockrangesreason": "Anonyme bidrag tillates ikke fra din IP-adresse ($1). Vennligst logg inn.",
        "xffblockreason": "En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1",
        "cant-see-hidden-user": "Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.",
        "ipbblocked": "Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert",
        "cant-move-to-user-page": "Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).",
        "cant-move-category-page": "Du har ikke tillatelse til å flytte kategorisider.",
        "cant-move-to-category-page": "Du har ikke tillatelse til å flytte en side til en kategoriside.",
+       "cant-move-subpages": "Du har ikke tillatelse til å flytte undersider.",
+       "namespace-nosubpages": "Navnerommet «$1» tillater ikke undersider.",
        "newtitle": "Ny tittel:",
        "move-watch": "Overvåk kilde- og målsiden",
        "movepagebtn": "Flytt side",
        "allmessages": "Systemmeldinger",
        "allmessagesname": "Navn",
        "allmessagesdefault": "Standardtekst",
-       "allmessagescurrent": "Nåværende tekst",
+       "allmessagescurrent": "Gjeldende beskjedtekst",
        "allmessagestext": "Dette er en liste over tilgjengelige systemmeldinger i MediaWiki-navnerommet.\nBesøk [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Oversettelse] og [https://translatewiki.net translatewiki.net] om du ønsker å bidra med oversettelse av MediaWiki.",
        "allmessagesnotsupportedDB": "''{{ns:special}}:Allmessages'' kan ikke brukes fordi '''$wgUseDatabaseMessages''' er slått av.",
        "allmessages-filter-legend": "Filtrér",
        "pageinfo-length": "Sidestørrelse (i bytes)",
        "pageinfo-article-id": "Side-ID",
        "pageinfo-language": "Språk for sideinnholdet",
+       "pageinfo-language-change": "endre",
        "pageinfo-content-model": "Modell for sideinnhold",
        "pageinfo-content-model-change": "endre",
        "pageinfo-robot-policy": "Bot-indeksering",
        "version-variables": "Variabler",
        "version-antispam": "Søppelpostforebygging",
        "version-other": "Annet",
-       "version-mediahandlers": "Mediahåndterere",
+       "version-mediahandlers": "Mediehåndterere",
        "version-hooks": "Haker",
        "version-parser-extensiontags": "Tilleggstagger",
        "version-parser-function-hooks": "Parserfunksjoner",
        "htmlform-user-not-exists": "<strong>$1</strong> eksisterer ikke.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettet}} omdirigeringen $3 ved å overskrive",
        "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4",
        "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",
        "feedback-bugcheck": "Suprert! Bare sjekk at den ikke er en av de [$1 kjente feilene]",
        "feedback-useragent": "Brukeragent",
        "searchsuggest-search": "Søk i {{SITENAME}}",
        "searchsuggest-containing": "inneholder …",
-       "api-error-autoblocked": "Din IP-adresse har blitt blokkert automatisk fordi den ble brukt av en blokkert bruker.",
-       "api-error-badaccess-groups": "Du har ikke tillatelse til å laste opp filer til denne wikien.",
        "api-error-badtoken": "Intern feil: Ugyldig nøkkel.",
-       "api-error-blocked": "Du har blitt blokkert fra å redigere.",
-       "api-error-copyuploaddisabled": "Opplasting ved URL er deaktivert på denne tjeneren.",
-       "api-error-duplicate": "Det er allerede {{PLURAL:$1|en annen fil|flere andre filer}} på denne siden med samme innhold.",
-       "api-error-duplicate-archive": "Det fantes {{PLURAL:$1|en annen fil|noen andre filer}} på siden som hadde samme innhold, men {{PLURAL:$1|den|de}} ble slettet.",
-       "api-error-empty-file": "Filen du sendte inn var tom.",
        "api-error-emptypage": "Det er ikke tillatt å opprette nye, tomme sider.",
-       "api-error-fetchfileerror": "Intern feil: Noe gikk galt ved henting av denne filen.",
-       "api-error-fileexists-forbidden": "En fil med navnet «$1» finnes allerede, og kan ikke overskrives.",
-       "api-error-fileexists-shared-forbidden": "En fil med navnet «$1» finnes allerede i det delte filsystemet, og kan ikke overskrives.",
-       "api-error-file-too-large": "Filen du la inn var for stor.",
-       "api-error-filename-tooshort": "Filnavnet er for kort.",
-       "api-error-filetype-banned": "Denne filtypen er ikke tillatt.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Filtypen|Filtypene}} $1 er ikke {{PLURAL:$4|tillatt|tillatte}}. {{PLURAL:$3|Tillatt filtype|Tillatte filtyper}} er $2.",
-       "api-error-filetype-missing": "Filen mangler filendelse.",
-       "api-error-hookaborted": "Endringen du prøvde å gjøre ble avbrutt av en utvidelsestilkobling.",
-       "api-error-http": "Intern feil: kan ikke få forbindelse til server.",
-       "api-error-illegal-filename": "Filnavnet er ikke tillatt.",
-       "api-error-internal-error": "Intern feil: Noe gikk galt ved prosessering av din opplastning til wikien.",
-       "api-error-invalid-file-key": "Intern feil: Fil ble ikke funnet i midlertidig lagerplass",
-       "api-error-missingparam": "Intern feil: Manglende parameter i forespørselen",
-       "api-error-missingresult": "Intern feil: Kan ikke bekrefte at kopieringen var vellykket.",
-       "api-error-mustbeloggedin": "Du må være logget inn for å laste opp filer.",
-       "api-error-mustbeposted": "Intern feil: forespørsel krever HTTP POST.",
-       "api-error-noimageinfo": "Opplastingen var vellykket, men serveren returnerte ikke noe informasjon om filen.",
-       "api-error-nomodule": "Intern feil: ingen opplastningsmodul har blitt valgt.",
-       "api-error-ok-but-empty": "Intern feil: ingen svar fra server.",
-       "api-error-overwrite": "Det er ikke tillatt å overskrive eksisterende filer.",
-       "api-error-ratelimited": "Du prøver å laste opp flere filer enn wikien tillater i et kort tidsrom.\nPrøv igjen om noen minutter.",
-       "api-error-stashfailed": "Internal error: tjeneren greide ikke å lagre midlertidig fil.",
        "api-error-publishfailed": "Intern feil: Tjeneren greide ikke å publisere midlertidig fil.",
-       "api-error-stasherror": "Det oppstod en feil mens filen ble lastet opp til stash.",
-       "api-error-stashedfilenotfound": "Den temporære filen ble ikke funnet ved forsøk på å laste den opp fra lageret.",
-       "api-error-stashpathinvalid": "Stien som den temporære filen skulle vært funnet via var ugyldig.",
-       "api-error-stashfilestorage": "Det oppsto en feil når filen skulle lastes opp til lageret.",
-       "api-error-stashzerolength": "Tjenermaskinen kunne i lagre den temporære filen fordi den hadde null lengde.",
-       "api-error-stashnotloggedin": "Du må være innlogget for å lagre filene i opplastingslageret.",
-       "api-error-stashwrongowner": "Filen du prøvde å få tilgang til tilhører ikke deg.",
-       "api-error-stashnosuchfilekey": "Filnøkkelen du prøvde å få tilgang til finnes ikke.",
-       "api-error-timeout": "Serveren svarte ikke innenfor forventet tid.",
-       "api-error-unclassified": "En ukjent feil har oppstått",
-       "api-error-unknown-code": "Ukjent feil: \"$1\"",
-       "api-error-unknown-error": "Intern feil: Noe gikk galt ved opplastning av filen din.",
-       "api-error-unknown-warning": "Ukjent advarsel: $1",
+       "api-error-stashfailed": "Internal error: tjeneren greide ikke å lagre midlertidig fil.",
+       "api-error-unknown-warning": "Ukjent advarsel: «$1».",
        "api-error-unknownerror": "Ukjent feil: «$1».",
-       "api-error-uploaddisabled": "Opplastning har blitt deaktivert på denne wikien.",
-       "api-error-verification-error": "Filen kan være korrupt, eller ha feil filendelse.",
-       "api-error-was-deleted": "En fil med dette navnet har tidligere blitt lastet opp og senere slettet.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunder}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutt|minutter}}",
        "duration-hours": "$1 {{PLURAL:$1|time|timer}}",
        "pagelang-language": "Språk",
        "pagelang-use-default": "Bruk standardspråk",
        "pagelang-select-lang": "Velg språk",
+       "pagelang-reason": "Årsak",
        "pagelang-submit": "Lagre",
+       "pagelang-nonexistent-page": "Siden «$1» eksisterer ikke.",
+       "pagelang-unchanged-language": "Siden «$1» er allerede satt til språket $2.",
+       "pagelang-unchanged-language-default": "Siden $1 er allerede satt til wikiens standard innholdsspråk.",
+       "pagelang-db-failed": "Databasen kunne ikke endre sidespråket.",
        "right-pagelang": "Endre sidespråk",
        "action-pagelang": "endre sidespråket",
        "log-name-pagelang": "Logg for språkendringer",
        "mw-widgets-dateinput-no-date": "Ingen dato valgt",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Søk etter media",
+       "mw-widgets-mediasearch-noresults": "Ingen resultater funnet.",
        "mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
        "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 ...",
        "sessionmanager-tie": "Kan ikke kombinere flere forespørselsautentiseringstyper: $1",
        "sessionprovider-generic": "$1 sesjoner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
        "log-action-filter-contentmodel-change": "Endring av innholdsmodell",
        "log-action-filter-contentmodel-new": "Oppretting av side med ikke-standard innholdsmodell",
        "log-action-filter-delete-delete": "Sidesletting",
+       "log-action-filter-delete-delete_redir": "Overskriving av omdirigering",
        "log-action-filter-delete-restore": "Sidegjenoppretting",
        "log-action-filter-delete-event": "Loggsletting",
        "log-action-filter-delete-revision": "Revisjonssletting",
        "usercssispublic": "Merk: CSS-undersidene bør ikke inneholde konfidensielle data siden de kan ses av andre brukere.",
        "restrictionsfield-badip": "Ugyldig IP-adresse eller intervall: $1",
        "restrictionsfield-label": "Tillatte IP-intervaller:",
-       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk <br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
-       "edit-error-short": "Feil: $1",
-       "edit-error-long": "Feil:\n\n$1"
+       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revisjon $1",
+       "pageid": "side-ID $1"
 }
index 0039ab6..bc84842 100644 (file)
        "passwordreset-emaildisabled": "इमेल सुविधा यस विकिमा निस्क्रिय बनाइएको छ ।",
        "passwordreset-username": "प्रयोगकर्ता नाम:",
        "passwordreset-domain": "डोमेन",
-       "passwordreset-capture": "निस्कने इमेलको नमुना हेर्ने ?",
-       "passwordreset-capture-help": "यदि तपाईंले यो कोठामा दाग दिनुभयो भनें यो इमेल (अस्थायी पासवर्ड सहित) तपाईंलाई देखा पर्नेछ साथै प्रयोगकर्तालाई पनि पठाइनेछ।",
        "passwordreset-email": "इमेल ठेगाना:",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailtext-ip": "कसैले (सायद तपाईंले, $1 आईपि ठेगानाबाट) {{SITENAME}} ($4)मा तपाईंको खाता विवरणको निम्ति एउटा अनुस्मारकको अनुरोध गरेको छ। निम्न प्रयोगकर्ता {{PLURAL:$3|खाता यस इमेल ठेगानासित सम्बन्धित छ|खाताहरू यस इमेल ठेगानासित सम्बन्धित छन्}}:\n\n$2\n\n{{PLURAL:$3|यो अस्थाई पासवर्डको|यी अस्थाई पासवर्डहरुको}} समय {{PLURAL:$5|एक दिन|$5 दिन}}मा सकिनेछ।\nतपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड छान्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनुहुन्न भने, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।",
        "viewpagelogs": "यस पृष्ठका लगहरू हेर्नुहोस्",
        "nohistory": "यस पृष्ठको लागी कुनै सम्पादन इतिहास छैन।",
        "currentrev": "हालको संस्करण",
-       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमा à¤¹à¤¾à¤²à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमा à¤¹à¤¾à¤²à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revisionasof": "$1 जस्तै गरी पुनरावलोकन",
        "revision-info": "{{GENDER:$6|$2}}$7 द्वारा $1को संशोधन",
        "previousrevision": "← पुरानो संशोधन",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन <strong>थिचिएको छ</strong>।\nप्रबन्धकको हैसियतले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा विवरण पाउन सकिन्छ]",
        "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन <strong>मेटाइएको छ</strong>'।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
        "rev-suppressed-no-diff": "तपाईं यसको भिन्नता हेर्न सक्नुहुन्न किनभने यसको एउटा संशोधन <strong>मेटाइएको</strong>छ।",
-       "rev-deleted-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
-       "rev-suppressed-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
+       "rev-deleted-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
+       "rev-suppressed-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-diff-view": "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं <strong>मेटियो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} मेटाइएको लग]मा पाउन सकिनेछ।",
        "rev-suppressed-diff-view": "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं  <strong>दबाइयो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} दबाइएको लग]मा पाउन सकिनेछ।",
        "rev-delundel": "दृश्यता परिवर्तन गर्ने",
        "rev-showdeleted": "देखाउनुहोस्",
-       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\87/मà¥\87à¤\9fाà¤\8fà¤\95à¥\8b à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\87/मà¥\87à¤\9fाà¤\8fà¤\95à¥\8b à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-nooldid-text": "यस क्रियालाई गर्नको लागि तपाईंले लक्ष्य अवतरण दिनु भएको छैन, वा तपाईंले दिएको अवतरण अस्तित्वमा छैन वा तपाईं सद्य अवतरणलाई लुकाउने प्रयत्न गर्दै हुनुहुन्छ।",
        "revdelete-no-file": "खुलाइएको पृष्ठ अस्तित्वमा छैन",
        "mergehistory-merge": "[[:$1]]को निम्न अवतरण [[:$2]]मा समाविष्ट गर्न सकिनेछ।\nदिइएको समय वा त्यस भन्दा पहिले भएको अवतरणहरूलाई एकत्रित गर्नका लागि  रेडियो बटनको प्रयोग गर्नुहोस।\nन्याभिगेसन लिङ्कहरूको प्रयोग पछी यो कलम आफ्नो पुरानै स्थितिमा आउनेछ।",
        "mergehistory-go": "जोड्न मिल्ने सम्पादनहरू",
        "mergehistory-submit": "पुनरावलोकहरु जोड्नुहोस्",
-       "mergehistory-empty": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 जोड्न मिल्दैन ।",
+       "mergehistory-empty": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 जोड्न मिल्दैन ।",
        "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
        "mergehistory-fail": "इतिहास जोड्न सकिएन कृपया पृष्ठको नाम र समयमान जाँच गर्नुहोस्।",
        "mergehistory-fail-toobig": "इतिहास समाहित गर्न सम्भव छैन किनभने अवतरण सिमा $1 भन्दा बढी {{PLURAL:$1|अवतरण|अवतरणहरू}} लाई स्थानान्तरित गर्नु पर्छ।",
        "difference-multipage": "(पृष्ठहरूमा भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
-       "showhideselectedversions": "à¤\9bानिà¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 देखाउने/लुकाउने",
+       "showhideselectedversions": "à¤\9bानिà¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 देखाउने/लुकाउने",
        "editundo": "रद्द गर्ने",
        "diff-empty": "(कुनै भिन्नता छैन)",
        "diff-multi-sameuser": "(यस प्रयोगकर्ताद्वारा {{PLURAL:$1|गरिएको बीचको एउटा अवतरण देखाइएन|गरिएको बीचको $1 अवतरण देखाइएन}})",
        "saveprefs": "संग्रह",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)",
        "prefs-editing": "सम्पादन",
-       "rows": "हरफहरू :",
-       "columns": "स्तम्भहरू :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
        "stub-threshold-sample-link": "उदाहरण",
        "userrights-reason": "कारण :",
        "userrights-no-interwiki": "तपाईंलाई अन्य विकिमा प्रयोगकर्ता अधिकार सम्पादन गर्ने अनुमति छैन।",
        "userrights-nodatabase": "डेटाबेस $1 उपलब्ध छैन या स्थानीय हैन।",
-       "userrights-nologin": "प्रयोगकर्ता अधिकार प्रदान गर्न तपाईंले प्रबन्धक खाताबाट [[Special:UserLogin|प्रवेश]] गर्नुपर्छ।",
-       "userrights-notallowed": "प्रयोगकर्तालाई अधिकार प्रदान गर्ने वा हटाउने अनुमति तपाईंलाई छैन।",
        "userrights-changeable-col": "तपाईंले परिवर्तन गर्न सक्ने समूहहरू",
        "userrights-unchangeable-col": "तपाईंले परिवर्तन गर्न नसक्ने समूहहरू",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमा मतभेद भयो ! कृपया तपाईंको परिवर्तन पुनरावलोकन तथा पुष्टि गर्नुहोस् ।",
-       "userrights-removed-self": "तपाईंले सफलतापूर्वक आफ्नो अधिकारहरूलाई मेटाउनु भयो । त्यस कारण तपाईं अब यो पृष्ठ हेर्न सक्नु हुन्न ।",
        "group": "समूह :",
        "group-user": "प्रयोगकर्ताहरू",
        "group-autoconfirmed": "स्वत निश्चित गरिएका प्रयोगकर्ताहरू",
        "right-siteadmin": "डेटाबेसको ताल्चामार्ने र ताल्चाखोल्ने",
        "right-override-export-depth": "गहिराइ ५ सम्मको लिंक गरिएका पृष्ठहरू सहित निर्यात गर्ने",
        "right-sendemail": "अन्य प्रयोगकर्ताहरूलाई इमेल पठाउने",
-       "right-passwordreset": "पासवर्ड परिवर्तन गर्ने ईमेलहरु हेर्नुहोस",
        "right-managechangetags": "डाटाबेसबाट [[Special:Tags|tags]] बनाउने र हटाउने",
        "right-applychangetags": "एकको परिवर्तन सहित [[Special:Tags|tags]] लागु गर्ने",
        "right-changetags": "जोड्ने र हटाउने स्वतन्त्र [[Special:Tags|ट्याग]] व्यक्तिगत अवतरणहरू र लग इन्ट्रीहरूमा",
        "uploaddisabledtext": "फाइल उर्ध्वभरण अक्षम पारिएकोछ",
        "php-uploaddisabledtext": "PHP मा फाइल उर्ध्वभरण अक्षम गरिएकोछ।\nकृपया फाइल उर्ध्वभरण व्यवस्था(setting) जाँच्नुहोस्।",
        "uploadscripted": "यस फाइलमा एचटीएमयल वा स्क्रिप्ट कोड छ, जुन वेब ब्राउजरद्वारा गलत पढ्न सकिनेछ।",
-       "uploadscriptednamespace": "यो एसभिजी फाइलमा गैह्रकानुनी नेमस्पेस \"$1\" रहेको छ ।",
+       "uploadscriptednamespace": "यो एसभिजी फाइलमा गैह्रकानुनी नेमस्पेस \"<nowiki>$1</nowiki>\" रहेको छ ।",
        "uploadinvalidxml": "अपलोड गरिएको फाइलमा रहेको एक्सयमयल पार्स गर्न सकिंदैन।",
        "uploadvirus": "फाइलमा भाइरस छ!\nविवरण:$1",
        "uploadjava": "यो फाइल एक जिप फाइल हो जसमा एउटा जाभा .class फाइल छ।\nजाभा फाइलहरू अपलोड गर्नु बन्देज छ, किनकि यसको कारण सुरक्षा बाधाहरू पार गर्न सकिन्छ।",
        "nlinks": "$1 {{PLURAL:$1|लिंक|लिंकहरू}}",
        "nmembers": "$1 {{PLURAL:$1|सदस्य|सदस्यहरू}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्य|सदस्यहरू}}",
-       "nrevisions": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\81}}",
+       "nrevisions": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\82}}",
        "nimagelinks": "$1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}माथि प्रयोग गरिएको",
        "ntransclusions": "$1 {{PLURAL:$1पृष्ठमा प्रयोग गरिएको|पृष्ठहरूमा प्रयोग गरिएका}}",
        "specialpage-empty": "यो पृष्ठ खाली छ।",
        "restriction-level-all": "कुनै स्तर",
        "undelete": "मेटिएका पृष्ठहरू हेर्नुहोस्",
        "undeletepage": "मेटाइएका पृष्ठहरू हेर्ने अनि पुनर्स्थापित गर्ने",
-       "undeletepagetitle": "'''[[:$1|$1]]à¤\95ा à¤®à¥\87à¤\9fाà¤\87à¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 यसभित्र  छन् '''।",
+       "undeletepagetitle": "'''[[:$1|$1]]à¤\95ा à¤®à¥\87à¤\9fाà¤\87à¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 यसभित्र  छन् '''।",
        "viewdeletedpage": "मेटिएका पृष्ठहरू हेर्नुहोस्",
        "undeletepagetext": "निम्नलिखित {{PLURAL:$1|पृष्ठ मेटिएकोछ तर पूरालेखभित्रै छ|$1 पृष्ठ मेटिएकाछन् तर पूरालेखभित्रै छन्}} र पुनर्स्थापित गर्न सकिन्छ।\nपूरालेखको समय-समयमा सफाई गर्न सकिन्छ।",
-       "undelete-fieldset-title": "पà¥\81नरावलà¥\8bà¤\95नहरà¥\81  पूर्वावस्थामा ल्याउनुहोस्",
+       "undelete-fieldset-title": "पà¥\81नरावलà¥\8bà¤\95नहरà¥\82  पूर्वावस्थामा ल्याउनुहोस्",
        "undeleteextrahelp": "यस पृष्ठक पुरै इतिहास पूर्वरुपमा फर्काउनको लागि  छनोट सन्दुकहरुलाई नछानी '''''{{int:undeletebtn}}''''' मा क्लिक गर्नुहोस।\nअनुकुल पूर्वरुपमा फर्काउने कार्य गर्न छनौट चाहिएका संस्करणक सन्दुकहरुलाई छानेर '''''{{int:undeletebtn}}'''''मा क्लिक गर्नुहोस।",
        "undeleterevisions": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} संग्रहित",
        "undeletehistory": "यदि कुनै पृष्टलाई पुन: स्थापन गराउनु भयो भने सम्पूर्ण संस्करणहरू इतिहासमा पुन:स्थापन हुनेछन् ।\nयदि यसै नामबाट  नयाँ पृष्ठ निर्माण भैसकेको छ भने पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमा स्थापित हुनेछन् ।",
        "undeletehistorynoadmin": "यस पृष्ठ मेटिएको छ।\nमेटिनाको कारण निम्न जानकारीहरुमा खुलाइएको छ र मेटिनु अगिका योगदानकर्ताहरुको नाम पनि \nमेटिएका पृष्ठको पूरा पाठ प्रवन्धकहरुलाई मात्र उपलब्ध हुन्छ ।",
        "undelete-revision": "$3द्वारा $1को ($4को  समय $5 मा) मेटाइएका संशोधनहरू :",
        "undeleterevision-missing": "अमान्य या मेटिएको संस्करण ।\nखराब लिन्क पनि सक्छ  या संस्करण पुन: स्थापना गरिएको या अभिलेखबाट हटाइएको हुनसक्छ ।",
-       "undelete-nodiff": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81रानà¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 भेटिएन ।",
+       "undelete-nodiff": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81रानà¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 भेटिएन ।",
        "undeletebtn": "पूर्वावस्थामा ल्याउनुहोस्",
        "undeletelink": "हेर्ने/पूर्वरुपमा फर्काउने",
        "undeleteviewlink": "अवलोकन",
        "import-comment": "टिप्पणी :",
        "importtext": "कृपया स्रोत विकिबाट फाइल निर्यात गर्नका लागि [[Special:Export|निर्यात सुविधा]]को प्रयोग गर्नुहोस। यसलाई आफ्नो कम्प्युटरमा सङ्ग्रह गरे यहाँ अपलोड गर्नुहोस।",
        "importstart": "पृष्ठ आयात गरिदै...",
-       "import-revision-count": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\81}}",
+       "import-revision-count": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\82}}",
        "importnopages": "आयातगर्नको लागि कुनै पृष्ठ छैन।",
        "imported-log-entries": "आयातित $1 {{PLURAL:$1|लग प्रविष्टी|लग प्रविष्टीहरू}}",
        "importfailed": "आयात असफल भयो :<nowiki>$1</nowiki>",
        "importlogpage": "आयात सूची",
        "importlogpagetext": "अन्य विकिहरूबाट प्रवन्धकहरूद्वारा गरिएको सम्पादन इतिहाससँग हुने पृष्ठहरूको आयात।",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} आयात भयो",
-       "import-logentry-interwiki-detail": "$2 à¤¦à¥\87à¤\96ि $1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\81}} आयात भयो",
+       "import-logentry-interwiki-detail": "$2 à¤¦à¥\87à¤\96ि $1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\82}} आयात भयो",
        "javascripttest": "JavaScript जाँच गरिदै",
        "javascripttest-pagetext-unknownaction": "अज्ञात कारवाही \"$1\" ।",
        "javascripttest-qunit-intro": "mediawiki.org मा [$1 जाँचको कागजात] हेर्नुहोस् ।",
        "patrol-log-header": "गस्ती गरिएका संस्करणहरूको लग यस प्रकार रहेका छन् ।",
        "log-show-hide-patrol": "$1 निगरानी लग",
        "log-show-hide-tag": "$1 ट्याग लग",
-       "deletedrevision": "पà¥\81राना à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 $1 मेटिए",
+       "deletedrevision": "पà¥\81राना à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 $1 मेटिए",
        "filedeleteerror-short": "$1 फाइल मेटाइमा भूल",
        "filedeleteerror-long": "निम्न फाइल मेट्ने क्रममा त्रुटी भयो:\n\n$1",
        "filedelete-missing": "\"$1\" फाइल मेट्न सकिंदैन किनभनें यो फाइल नैं छैन।",
        "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
        "searchsuggest-search": "{{SITENAME}} मा खोज्नुहोस्",
        "searchsuggest-containing": "समावेश भएको...",
-       "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-badtoken": "आन्तरिक समस्याः खराब टोकन ।",
-       "api-error-copyuploaddisabled": "यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।",
-       "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल छ|भएका  केहि अरु फाइलहरू छन्}} ।",
-       "api-error-duplicate-archive": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल थियो|भएका  केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेटाइएको थियो|यी मेटाइएका थिए}} ।",
-       "api-error-empty-file": "तपाईंले बुझाएको फाइल खालि छ।",
        "api-error-emptypage": "नयाँ तयार गर्दै, खाली पृष्ठ तयार गर्न अनुमति छैन ।",
-       "api-error-fetchfileerror": "आन्तरिक समस्याः फाइल तान्दा केही कुरा गलत भएछ ।",
-       "api-error-fileexists-forbidden": "\"$1\" नामको फाइल पहिले नै छ र अधिलेखित गर्न सकिंदैन।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" नामको फाइल पहिले नै साझा फाइल भण्डारमा छ, र अधिलेखित गर्न सकिंदैन।",
-       "api-error-file-too-large": "तपाईंले बुझाएको फाइल अति ठूलो छ।",
-       "api-error-filename-tooshort": "फाइलको नाम अति छोटो भयो।",
-       "api-error-filetype-banned": "यस प्रकारको फाइलमाथि प्रतिबन्ध छ।",
-       "api-error-filetype-banned-type": "$1 फाइल {{PLURAL:$4|प्रकार|प्रकारहरू}} को अनुमति छैन। फाइल प्रकार {{PLURAL:$3|जसको|जुनको}} अनुमति छ: $2।",
-       "api-error-filetype-missing": "फाइलमा एक्स्टेन्शनको अभाव छ।",
-       "api-error-hookaborted": "एक्सटेन्शन हुकले गर्दा यस फाइललाई नयाँ रुप दिने क्रिया रद्द भयो।",
-       "api-error-http": "आन्तरिक त्रुटि: सर्वरसित जोड़न असमर्थ",
-       "api-error-illegal-filename": "यस्तो फाइल नामको अनुमति छैन।",
-       "api-error-internal-error": "आन्तरिक त्रुटि: विकिमा आफ्नो अपलोड प्रसंस्करणसँग केहि त्रुटि देखिएको छ।",
-       "api-error-invalid-file-key": "आन्तरिक त्रुटि: अस्थाई भण्डारमा फाइल पाइएन।",
-       "api-error-missingparam": "आन्तरिक त्रुटि: अनुरोधमा पैरामीटरहरुको कमी",
-       "api-error-missingresult": "आन्तरिक त्रुटि: कपी सफल भयो भएन भनेर निश्चय गर्ने सकिएन।",
-       "api-error-mustbeloggedin": "फाइल अपलोड गर्न तपाईंले प्रवेश गरेको हुनुपर्छ।",
-       "api-error-mustbeposted": "आन्तरिक त्रुटि: अनुरोधको निम्ति HTTP POST को आवश्यकता",
-       "api-error-noimageinfo": "अपलोड सफल भयो, तर सर्वरले फाइलको बारेमा कुनै सूचना दिएन।",
-       "api-error-nomodule": "आन्तरिक त्रुटि: अपलोड मोडुल सेट नगरिएको।",
-       "api-error-ok-but-empty": "आन्तरिक त्रुटि: सर्वरबाट कुनै उत्तर आएन।",
-       "api-error-overwrite": "वर्तमान फाइलमाथि अधिलेखन(Overwriting)को अनुमति छैन।",
-       "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राख्न सर्वर असफल भयो।",
        "api-error-publishfailed": "आन्तरिक समस्याः अस्थायी फाइल प्रकाशन गर्न सर्भर असफर भयो ।",
-       "api-error-stasherror": "स्टासमा फाइल अपलोड गर्दा समस्या आएको छ ।",
-       "api-error-stashedfilenotfound": "स्ट्यासमा राखिएको फाइल त्यहाँ अपलोड गरिने प्रयासको समयमा भेटिएन।",
-       "api-error-stashpathinvalid": "त्यो स्थान जहाँ स्ट्यास भएको फाइल भेट्नु पर्ने थियो त्यो अमान्य छ।",
-       "api-error-stashfilestorage": "फाइललाई स्ट्यासमा अपलोड गर्दा समय एक त्रुटि देखिएको छ।",
-       "api-error-stashzerolength": "सर्भर त्यस फाइललाई स्ट्यास गर्न सकेन, किनभने त्यसको लम्बाई शून्य छ।",
-       "api-error-stashnotloggedin": "तपाईंलाई लग इन हुनु आवश्यक छ ताकि फाइललाई अपलोड स्ट्यासमा सुरक्षित गर्न सकियोस।",
-       "api-error-stashwrongowner": "स्ट्यासको जुन फाइल सम्म तपाईं पुग्न चाहनुहुन्छ त्यो तपाईंसँग सम्बन्धित छैन।",
-       "api-error-stashnosuchfilekey": "फाइलको साँचो जसलाई तपाईं स्ट्यासमा प्रयोगमा ल्याउन प्रयास गर्दै हुनुहुन्छ, त्यो अस्तित्वमा छैन।",
-       "api-error-timeout": "अपेक्षित समय भित्रमा सर्वरले प्रतिक्रिया देखाएन।",
-       "api-error-unclassified": "अज्ञात समस्या आइ पर्यो",
-       "api-error-unknown-code": "अज्ञात त्रुटि: \"$1\"",
-       "api-error-unknown-error": "आन्तरिक त्रुटि: तपाईंद्वारा फाइल अपलोड गरिने प्रयास गर्दा समय केहि गलत भएको थियो।",
+       "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राख्न सर्वर असफल भयो।",
        "api-error-unknown-warning": "अज्ञात चेतावनी: \"$1\"",
        "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\".",
-       "api-error-uploaddisabled": "यस विकिमा अपलोड निस्क्रिय गरिएकोछ।",
-       "api-error-verification-error": "यह फाइल खराब भइसकेको छ, वा गलत एक्सटेन्सन हो।",
        "duration-seconds": "$1 {{PLURAL:$1|सेकेण्ड|सेकेण्डहरू}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनेट|मिनेटहरू}}",
        "duration-hours": "$1 {{PLURAL:$1|घण्टा|घण्टाहरू}}",
index a9e9ed6..96e323e 100644 (file)
                        "Jdforrester",
                        "Jeleniccz",
                        "MrLeopold",
-                       "Hex"
+                       "Hex",
+                       "Xxmarijnw",
+                       "Mainframe98",
+                       "QZanden"
                ]
        },
-       "tog-underline": "Koppelingen onderstrepen:",
+       "tog-underline": "Verwijzingen onderstrepen:",
        "tog-hideminor": "Kleine bewerkingen verbergen in recente wijzigingen",
        "tog-hidepatrolled": "Gemarkeerde wijzigingen verbergen in recente wijzigingen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
        "searcharticle": "OK",
        "history": "Geschiedenis",
        "history_short": "Geschiedenis",
+       "history_small": "geschiedenis",
        "updatedmarker": "bewerkt sinds mijn laatste bezoek",
        "printableversion": "Printvriendelijke versie",
        "permalink": "Permanente koppeling",
        "unprotectthispage": "Beveiliging van deze pagina wijzigen",
        "newpage": "Nieuwe pagina",
        "talkpage": "Overlegpagina",
-       "talkpagelinktext": "Overleg",
+       "talkpagelinktext": "overleg",
        "specialpage": "Speciale pagina",
        "personaltools": "Persoonlijke instellingen",
        "articlepage": "Pagina bekijken",
        "views": "Weergaven",
        "toolbox": "Hulpmiddelen",
        "tool-link-userrights": "{{GENDER:$1|Gebruikersgroepen}} wijzigen",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Gebruikers}}groepen weergeven",
        "tool-link-emailuser": "Deze {{GENDER:$1|gebruiker}} e-mailen",
        "userpage": "Gebruikerspagina bekijken",
        "projectpage": "Projectpagina bekijken",
        "pool-servererror": "De dienst \"pool counter\" is niet beschikbaar ($1).",
        "poolcounter-usage-error": "Gebruiksfout: $1",
        "aboutsite": "Over {{SITENAME}}",
-       "aboutpage": "Project:Info",
+       "aboutpage": "Project:Over",
        "copyright": "De inhoud is beschikbaar onder de $1 tenzij anders aangegeven.",
        "copyrightpage": "{{ns:project}}:Auteursrechten",
        "currentevents": "In het nieuws",
        "passwordreset-emaildisabled": "E-mailmogelijkheden zijn uitgeschakeld op deze wiki.",
        "passwordreset-username": "Gebruikersnaam:",
        "passwordreset-domain": "Domein:",
-       "passwordreset-capture": "De resulterende e-mail bekijken?",
-       "passwordreset-capture-help": "Als u dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan u weergegeven.",
        "passwordreset-email": "E-mailadres:",
        "passwordreset-emailtitle": "Accountgegevens op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De 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}}. Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
        "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
        "passwordreset-emailsentemail": "Als dit e-mailadres aan uw account gekoppeld is, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
-       "passwordreset-emailsent-capture2": "De wachtwoordherstel-{{PLURAL:$1|e-mail is|e-mails zijn}} verzonden. {{PLURAL:$1|De gebruikersnaam en het wachtwoord worden|De lijst van gebruikersnamen en wachtwoorden wordt}} hier weergegeven.",
-       "passwordreset-emailerror-capture2": "Het e-mailen naar de {{GENDER:$2|gebruiker}} is mislukt: $1 {{PLURAL:$3|De gebruikersnaam en het wachtwoord|De lijst met gebruikersnamen en wachtwoorden}} wordt hieronder weergegeven.",
        "passwordreset-nocaller": "Een aanroeper moet worden opgegeven",
        "passwordreset-nosuchcaller": "Aanroeper bestaat niet: $1",
        "passwordreset-ignored": "Opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
        "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.",
        "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.",
-       "summary-preview": "Bewerkingssamenvatting nakijken:",
-       "subject-preview": "Onderwerp nakijken:",
+       "summary-preview": "Voorvertoning van de bewerkingssamenvatting:",
+       "subject-preview": "Voorvertoning van het onderwerp:",
        "previewerrortext": "Er is een fout opgetreden tijdens het weergeven van uw wijzigingen.",
        "blockedtitle": "Gebruiker is geblokkeerd",
        "blockedtext": "'''Uw gebruiker of IP-adres is geblokkeerd.'''\n\nDe blokkade is uitgevoerd door $1.\nDe opgegeven reden is ''$2''.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "autoblockedtext": "Uw IP-adres is automatisch geblokkeerd, omdat het is gebruikt door een andere gebruiker, die is geblokkeerd door $1.\nDe opgegeven reden is:\n\n:''$2''\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt deze blokkade bespreken met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]].\n\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet is geblokkeerd.\n\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
+       "systemblockedtext": "Uw gebruikersnaam of IP-adres is automatisch geblokkeerd door MediaWiki.\nDe opgegeven reden is:\n\n:<em>$2</em>\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nUw huidige IP-adres is $3.\nVermeld alle bovenstaande gegevens in een query die u maakt.",
        "blockednoreason": "geen reden opgegeven",
        "whitelistedittext": "U moet $1 om pagina's te bewerken.",
        "confirmedittext": "U moet uw e-mailadres bevestigen voor u kunt bewerken.\nVoer uw e-mailadres in en bevestig het via uw [[Special:Preferences|voorkeuren]].",
        "search-interwiki-caption": "Zusterprojecten",
        "search-interwiki-default": "Resultaten van $1:",
        "search-interwiki-more": "(meer)",
+       "search-interwiki-more-results": "meer resultaten",
        "search-relatedarticle": "Gerelateerd",
        "searchrelated": "gerelateerd",
        "searchall": "alle",
        "search-external": "Extern zoeken",
        "searchdisabled": "Zoeken in {{SITENAME}} is niet mogelijk.\nU kunt gebruik maken van Google.\nDe gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.",
        "search-error": "Er is een fout opgetreden tijdens het zoeken: $1",
+       "search-warning": "Een waarschuwing is opgetreden tijdens het zoeken: $1",
        "preferences": "Voorkeuren",
        "mypreferences": "Voorkeuren",
        "prefs-edits": "Aantal bewerkingen:",
        "saveprefs": "Opslaan",
        "restoreprefs": "Voorkeuren herstellen (voor alle instellingen)",
        "prefs-editing": "Bewerken",
-       "rows": "Regels:",
-       "columns": "Kolommen:",
        "searchresultshead": "Zoekresultaten",
        "stub-threshold": "Drempel voor markering als beginnetje ($1):",
        "stub-threshold-sample-link": "voorbeeld",
        "prefs-help-recentchangescount": "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
        "prefs-help-watchlist-token2": "Dit is de geheime sleutel voor de webfeed van uw volglijst.\nIedereen die het token kent, kan uw volglijst bekijken, dus deel dit token niet.\nU kunt de [[Special:ResetTokens|tokens opnieuw instellen]] als u dat wilt.",
        "savedprefs": "Uw voorkeuren zijn opgeslagen.",
-       "savedrights": "De gebruikersrechten van {{GENDER:$1|$1}} zijn opgeslagen.",
+       "savedrights": "De gebruikergroepen van {{GENDER:$1|$1}} zijn opgeslagen.",
        "timezonelegend": "Tijdzone:",
        "localtime": "Plaatselijke tijd:",
        "timezoneuseserverdefault": "Wikistandaard gebruiken ($1)",
        "youremail": "E-mailadres:",
        "username": "{{GENDER:$1|Gebruikersnaam}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepen}}:",
+       "group-membership-link-with-expiry": "$1 (tot $2)",
        "prefs-registration": "Registratiedatum:",
        "yourrealname": "Echte naam:",
        "yourlanguage": "Taal:",
        "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-lookup-user": "Gebruikersgroepen beheren",
+       "userrights-lookup-user": "Een gebruiker selecteren",
        "userrights-user-editname": "Voer een gebruikersnaam in:",
-       "editusergroup": "{{GENDER:$1|Gebruikersgroepen}} wijzigen",
+       "editusergroup": "Gebruikersgroepen wijzigen",
        "editinguser": "Bezig met wijzigen van de gebruikersrechten van gebruiker '''[[User:$1|$1]]''' $2",
-       "userrights-editusergroup": "Gebruikersgroepen wijzigen",
+       "viewinguserrights": "Gebruikersrechten bekijken van {{GENDER:$1|gebruiker}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "{{GENDER:$1|Gebruikersgroepen}} wijzigen",
+       "userrights-viewusergroup": "Toon {{GENDER:$1|gebruikersgroepen}}",
        "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.",
+       "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-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-nologin": "U moet [[Special:UserLogin|aangemeld]] zijn met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.",
-       "userrights-notallowed": "U bent niet gemachtigd om gebruikersrechten toe te voegen of te verwijderen.",
        "userrights-changeable-col": "Groepen die u kunt beheren",
        "userrights-unchangeable-col": "Groepen die u niet kunt beheren",
+       "userrights-expiry-current": "Vervalt op $1",
+       "userrights-expiry-none": "Vervalt niet",
+       "userrights-expiry": "Vervalt:",
+       "userrights-expiry-existing": "Bestaande vervaldatum: $2 om $3",
+       "userrights-expiry-othertime": "Andere tijd:",
+       "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-conflict": "Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten! Controleer en bevestig uw wijzigingen.",
-       "userrights-removed-self": "U hebt uw eigen bevoegdheden ingetrokken. U kunt deze pagina niet langer raadplegen.",
        "group": "Groep:",
        "group-user": "gebruikers",
        "group-autoconfirmed": "autobevestigde gebruikers",
        "right-siteadmin": "De database blokkeren en weer vrijgeven",
        "right-override-export-depth": "Pagina's exporteren inclusief pagina's waarnaar verwezen wordt tot een diepte van vijf",
        "right-sendemail": "E-mail versturen aan andere gebruikers",
-       "right-passwordreset": "E-mails voor wachtwoord opnieuw instellen bekijken",
        "right-managechangetags": "[[Special:Tags|Labels]] aanmaken en (de)activeren",
        "right-applychangetags": "[[Special:Tags|Labels]] aan bewerkingen toewijzen",
        "right-changetags": "Willekeurige [[Special:Tags|labels]] toevoegen aan en verwijderen van versies en logboekregels",
        "action-upload_by_url": "dit bestand vanaf een URL te uploaden",
        "action-writeapi": "via de API bewerkingen uit te voeren",
        "action-delete": "deze pagina te verwijderen",
-       "action-deleterevision": "deze versie te verwijderen",
-       "action-deletedhistory": "de verwijderde versies van deze pagina te bekijken",
+       "action-deleterevision": "verwijder versies",
+       "action-deletelogentry": "logboekregels te verwijderen",
+       "action-deletedhistory": "de verwijderde versies van een pagina te bekijken",
+       "action-deletedtext": "de verwijderde versietekst te bekijken",
        "action-browsearchive": "verwijderde pagina's te zoeken",
        "action-undelete": "deze pagina terug te plaatsen",
-       "action-suppressrevision": "deze verborgen versie te bekijken en terug te plaatsen",
+       "action-suppressrevision": "verborgen versies te bekijken en terug te plaatsen",
        "action-suppressionlog": "dit beschermde logboek te bekijken",
        "action-block": "deze gebruiker een bewerkingsblokkade op te leggen",
        "action-protect": "het beveiligingsniveau van deze pagina aan te passen",
        "action-userrights-interwiki": "gebruikersrechten van gebruikers van andere wiki's te bewerken",
        "action-siteadmin": "de database af te sluiten of open te stellen",
        "action-sendemail": "e-mails te verzenden",
+       "action-editmyoptions": "uw eigen voorkeuren bewerken",
        "action-editmywatchlist": "uw eigen volglijst te bewerken",
        "action-viewmywatchlist": "uw eigen volglijst te bekijken",
        "action-viewmyprivateinfo": "uw eigen privégegevens te bekijken",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|lijst met nieuwe pagina's]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Weergeven",
+       "rcfilters-activefilters": "Actieve filters",
+       "rcfilters-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-noresults": "Geen filters gevonden",
+       "rcfilters-filtergroup-registration": "Gebruikers-registratie",
+       "rcfilters-filter-registered-label": "Geregistreerd",
+       "rcfilters-filter-registered-description": "Ingelogde gebruikers.",
+       "rcfilters-filter-unregistered-label": "Niet-geregistreerd",
+       "rcfilters-filter-unregistered-description": "Gebruikers die niet zijn ingelogd.",
+       "rcfilters-filter-editsbyself-label": "Uw eigen bewerkingen",
+       "rcfilters-filter-editsbyself-description": "Bewerkingen door u.",
+       "rcfilters-filter-editsbyother-label": "Bewerkingen door anderen",
+       "rcfilters-filter-editsbyother-description": "Bewerkingen die gemaakt zijn door andere gebruikers (niet door uzelf).",
+       "rcfilters-filtergroup-userExpLevel": "Gebruikerservarings niveau (alleen voor geregistreerde gebruikers)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nieuwkomers",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Minder dan 10 bewerkingen en 4 dagen van activiteit.",
+       "rcfilters-filter-userExpLevel-learner-label": "Leerlingen",
+       "rcfilters-filter-userExpLevel-learner-description": "Meer dagen van activiteit en bewerkingen dan \"Nieuwkomers\", maar minder dan \"Ervaren gebruikers\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Ervaren gebruikers",
+       "rcfilters-filter-userExpLevel-experienced-description": "Meer dan 30 dagen van activiteit en 500 bewerkingen.",
+       "rcfilters-filtergroup-automated": "Automatische bijdragen",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "De wijzigingen van geautomatiseerde hulpmiddelen.",
+       "rcfilters-filter-humans-label": "Menselijk (geen bot)",
+       "rcfilters-filter-humans-description": "Bewerkingen door menselijke bewerkers.",
+       "rcfilters-filtergroup-significance": "Belangrijkheid",
+       "rcfilters-filter-minor-label": "Kleine bewerkingen",
+       "rcfilters-filter-minor-description": "Bewerkingen die door de bewerker zijn gelabeld als klein.",
+       "rcfilters-filter-major-label": "Geen kleine bewerking",
+       "rcfilters-filter-major-description": "Bewerkingen niet gelabeld als klein.",
+       "rcfilters-filtergroup-changetype": "Soort wijziging",
+       "rcfilters-filter-pageedits-label": "Paginabewerkingen",
+       "rcfilters-filter-pageedits-description": "Wijzigingen aan de wiki inhoud, discussies, categorie beschrijvingen....",
+       "rcfilters-filter-newpages-label": "Nieuwe pagina's",
+       "rcfilters-filter-newpages-description": "Bewerkingen die een nieuwe pagina aanmaken.",
+       "rcfilters-filter-categorization-label": "Categorie wijzigingen",
+       "rcfilters-filter-categorization-description": "Categorisatie van pagina's tonen",
+       "rcfilters-filter-logactions-label": "Geregistreerde acties",
+       "rcfilters-filter-logactions-description": "Administratieve handelingen, account creaties, pagina verwijderingen, uploads....",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
        "rcshowhideminor": "Kleine bewerkingen $1",
        "uploaded-setting-handler-svg": "SVG-bestanden die de eigenschap \"handler\" instellen met remote, data of script worden geblokkeerd. <code>$1=\"$2\"</code> is aangetroffen in het geüploade SVG-bestand.",
        "uploaded-remote-url-svg": "SVG-bestanden die de style-eigenschap gebruiken met een remote URL worden geblokkeerd. <code>$1=\"$2\"</code> is aangetroffen in het geüploade SVG-bestand.",
        "uploaded-image-filter-svg": "Er is een afbeeldingsfilter met URL aangetroffen: <code>&lt;$1 $2=\"$3\"&gt;</code> in het geüploade SVG-bestand.",
-       "uploadscriptednamespace": "Dit SVG-bestand bevat een ongeldige naamruimte \"$1\".",
+       "uploadscriptednamespace": "Dit SVG-bestand bevat een ongeldige naamruimte <nowiki>\"$1\"</nowiki>.",
        "uploadinvalidxml": "De XML in het geüploade bestand kon niet worden verwerkt.",
        "uploadvirus": "Het bestand bevat een virus! Details: $1",
        "uploadjava": "Het bestand is een ZIP-bestand dat een Java .class-bestand bevat.\nHet uploaden van Java-bestanden is niet toegestaan omdat hiermee beveiligingsinstellingen omzeild kunnen worden.",
        "uncategorizedcategories": "Niet-gecategoriseerde categorieën",
        "uncategorizedimages": "Niet-gecategoriseerde bestanden",
        "uncategorizedtemplates": "Niet-gecategoriseerde sjablonen",
+       "uncategorized-categories-exceptionlist": "# Bevat een lijst van categorieën, welke niet op Speciaal:NietGecategoriseerdeCategorieën getoond moeten worden. Een per regel, beginnend met \"*\". Regels die starten met een ander teken (inclusief witruimte) worden genegeerd. Gebruik \"#\" voor opmerkingen.",
        "unusedcategories": "Ongebruikte categorieën",
        "unusedimages": "Ongebruikte bestanden",
        "wantedcategories": "Niet-bestaande categorieën met de meeste koppelingen",
        "apisandbox-sending-request": "API-verzoek verzenden...",
        "apisandbox-loading-results": "API-resultaten ontvangen...",
        "apisandbox-results-error": "Er is een fout opgetreden tijdens het laden van het antwoord op het API-verzoek: $1.",
+       "apisandbox-request-selectformat-label": "Toon resultaat als:",
+       "apisandbox-request-format-url-label": "URL query string",
        "apisandbox-request-url-label": "Verzoek-URL:",
+       "apisandbox-request-json-label": "Verzoek JSON:",
        "apisandbox-request-time": "Doorlooptijd verzoek: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Token corrigeren en opnieuw verzenden",
        "apisandbox-results-fixtoken-fail": "Het ophalen van het token van type \"$1\" is mislukt.",
        "apisandbox-continue-clear": "Wissen",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} zal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries doorgaan] met het laatste verzoek; {{int:apisandbox-continue-clear}} zal de voortgangsparameters wissen.",
        "apisandbox-param-limit": "Gebruik <kbd>max</kbd> voor de maximale limiet.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Alle naamruimtes)",
+       "apisandbox-multivalue-all-values": "$1 (Alle waarden)",
        "booksources": "Boekinformatie",
        "booksources-search-legend": "Bronnen en gegevens over een boek zoeken",
        "booksources-search": "Zoeken",
        "activeusers-count": "$1 recente {{PLURAL:$1|handeling|handelingen}} in de {{PLURAL:$3|afgelopen dag|laatste $3 dagen}}",
        "activeusers-from": "Gebruikers worden weergegeven vanaf:",
        "activeusers-groups": "Gebruikers weergeven die horen bij de groepen:",
+       "activeusers-excludegroups": "Gebruikers uitsluiten die behoren tot de groepen:",
        "activeusers-noresult": "Geen actieve gebruikers gevonden.",
        "activeusers-submit": "Weergeven",
        "listgrouprights": "Rechten van gebruikersgroepen",
        "listgrants-grant": "Toestemming",
        "listgrants-rights": "Rechten",
        "trackingcategories": "Volgcategorieën",
-       "trackingcategories-summary": "Op deze pagina worden volgcategorieën weergegeven die automatisch worden gevuld door de MediaWikisoftware. De namen van de categorieën kunnen gewijzigd worden door de bijbehorende systeemberichten in de naamruimte \"{{ns:8}}\" bij te werken.",
+       "trackingcategories-summary": "Op deze pagina worden volgcategorieën weergegeven die automatisch worden gevuld door de MediaWiki software. De namen van de categorieën kunnen gewijzigd worden door de bijbehorende systeemberichten in de naamruimte \"{{ns:8}}\" bij te werken.",
        "trackingcategories-msg": "Volgcategorie",
        "trackingcategories-name": "Berichtnaam",
        "trackingcategories-desc": "Opnamecriteria",
        "emailccsubject": "Kopie van uw bericht aan $1: $2",
        "emailsent": "E-mail verzonden",
        "emailsenttext": "Uw e-mail is verzonden.",
-       "emailuserfooter": "Deze e-mail is {{GENDER:$1|verstuurd}} door $1 aan {{GENDER:$2|$2}} door de functie \"{{int:emailuser}}\" van {{SITENAME}}.",
+       "emailuserfooter": "Deze e-mail is door $1 aan {{GENDER:$2|$2}} {{GENDER:$1|verstuurd}} middels de functie \"{{int:emailuser}}\" van {{SITENAME}}. Indien {{GENDER:$2|uw}} reageert op deze e-mail, wordt uw e-mail direct naar de {{GENDER:$1|oorspronkelijke afzender}} verstuurd, waardoor {{GENDER:$2|uw}} e-mailadres aan {{GENDER:$1|hem|haar|hem of haar}} onthuld wordt.",
        "usermessage-summary": "Systeembericht achtergelaten",
        "usermessage-editor": "Systeembericht",
        "watchlist": "Volglijst",
        "watchlistanontext": "Om uw volglijst te bekijken of te bewerken moet u zich aanmelden.",
        "watchnologin": "U bent niet aangemeld",
        "addwatch": "Toevoegen aan volglijst",
-       "addedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
-       "addedwatchtext-talk": "\"[[:$1]]\" en de gerelateerde pagina zijn toegevoegd aan je [[Special:Watchlist|volglijst]].",
+       "addedwatchtext": "\"[[:$1]]\" en de bijbehorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" en de bijbehorende pagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
        "addedwatchtext-short": "De pagina \"$1\" is aan uw volglijst toegevoegd.",
        "removewatch": "Verwijderen uit volglijst",
-       "removedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
-       "removedwatchtext-talk": "\"[[:$1]]\" en de bijhorende pagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
+       "removedwatchtext": "\"[[:$1]]\" en de bijbehorende overlegpagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" en de bijbehorende pagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
        "removedwatchtext-short": "De pagina \"$1\" is van uw volglijst verwijderd.",
        "watch": "Volgen",
        "watchthispage": "Pagina volgen",
        "changecontentmodel-emptymodels-title": "Geen inhoudsmodellen beschikbaar",
        "changecontentmodel-emptymodels-text": "De inhoud van [[:$1]] kan niet worden omgezet in een ander type.",
        "log-name-contentmodel": "Wijzigingenlogboek van inhoudsmodel",
-       "log-description-contentmodel": "Gebeurtenissen rond het inhoudsmodel van een pagina",
+       "log-description-contentmodel": "Deze pagina bevat wijzigingen rond het inhoudsmodel van pagina's en pagina's die aangemaakt zijn met een inhoudsmodel anders dan het standaardmodel.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|maakte}} de pagina $3 aan met behulp van een niet-standaard inhoudsmodel \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|heeft}} het inhoudsmodel gewijzigd van pagina $3 van \"$4\" in \"$5\"",
        "logentry-contentmodel-change-revertlink": "terugdraaien",
        "modifiedarticleprotection": "heeft het beveiligingsniveau gewijzigd voor \"[[$1]]\"",
        "unprotectedarticle": "heeft de beveiliging van \"[[$1]]\" opgeheven",
        "movedarticleprotection": "heeft beveiligingsinstellingen verplaatst van \"[[$2]]\" naar \"[[$1]]\"",
-       "protectedarticle-comment": "{{GENDER:$2|Beschermd}} \"[[$1]]\"",
-       "modifiedarticleprotection-comment": "{{GENDER:$2|Beschermingsniveau gewijzigd}} voor \"[[$1]]\"",
-       "unprotectedarticle-comment": "{{GENDER:$2|Bescherming verwijderd}} van \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Beveiligde}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Heeft het beveiligingsniveau voor \"[[$1]]\" gewijzigd}}",
+       "unprotectedarticle-comment": "{{GENDER:$2|Heeft de beveiliging van \"[[$1]]\" opgeheven}}",
        "protect-title": "Beveiligingsniveau instellen voor \"$1\"",
        "protect-title-notallowed": "Beveiligingsniveau voor \"$1\" bekijken",
        "prot_1movedto2": "[[$1]] is hernoemd naar [[$2]]",
        "sp-contributions-newonly": "Alleen nieuwe pagina's weergeven",
        "sp-contributions-hideminor": "Kleine bewerkingen verbergen",
        "sp-contributions-submit": "Bekijken",
-       "whatlinkshere": "Koppelingen naar deze pagina",
+       "whatlinkshere": "Verwijzingen naar deze pagina",
        "whatlinkshere-title": "Pagina's die verwijzen naar \"$1\"",
        "whatlinkshere-page": "Pagina:",
        "linkshere": "De volgende pagina's verwijzen naar '''[[:$1]]''':",
        "proxyblockreason": "Uw IP-adres is geblokkeerd, omdat u gebruik maakt van een open proxyserver.\nNeem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.",
        "sorbsreason": "Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.",
        "sorbs_create_account_reason": "Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.\nU kunt geen gebruiker registreren.",
+       "softblockrangesreason": "Anonieme bijdragen zijn niet toegestaan op basis van uw IP-adres ($1). Gelieve in te loggen.",
        "xffblockreason": "Een IP-adres dat u gebruikt is geblokkeerd. Dit staat de X-Forwarded-For van de header. De oorspronkelijke blokkadereden is: $1",
        "cant-see-hidden-user": "De gebruiker die u probeert te blokken is al geblokkeerd en verborgen.\nOmdat u het recht \"hideuser\" niet hebt, kunt u de blokkade van de gebruiker niet bekijken of bewerken.",
        "ipbblocked": "U kunt geen andere gebruikers (de)blokkeren, omdat u zelf geblokkeerd bent",
        "cant-move-to-user-page": "U hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.",
        "cant-move-category-page": "U hebt geen rechten om categoriepagina's te hernoemen.",
        "cant-move-to-category-page": "U hebt geen rechten om een pagina naar een categoriepagina te hernoemen.",
+       "cant-move-subpages": "U hebt geen rechten om deelpagina's te hernoemen.",
+       "namespace-nosubpages": "Naamruimte \"$1\" laat geen deelpagina's toe.",
        "newtitle": "Nieuwe paginanaam:",
        "move-watch": "Bronpagina en doelpagina volgen",
        "movepagebtn": "Pagina hernoemen",
        "movelogpagetext": "Hieronder staan hernoemde pagina's.",
        "movesubpage": "{{PLURAL:$1|Subpagina|Subpagina's}}",
        "movesubpagetext": "De {{PLURAL:$1|subpagina|$1 subpagina's}} van deze pagina {{PLURAL:$1|wordt|worden}} hieronder weergegeven.",
+       "movesubpagetalktext": "De bijbehorende overlegpagina heeft $1 {{PLURAL:$1|deelpagina|deelpagina's}} hierbeneden getoond.",
        "movenosubpage": "Deze pagina heeft geen subpagina's.",
        "movereason": "Reden:",
        "revertmove": "terugdraaien",
        "tooltip-ca-move": "Deze pagina hernoemen",
        "tooltip-ca-watch": "Deze pagina aan mijn volglijst toevoegen",
        "tooltip-ca-unwatch": "Deze pagina van mijn volglijst verwijderen",
-       "tooltip-search": "Zoeken in {{SITENAME}}",
-       "tooltip-search-go": "Naar een pagina met deze naam gaan als die bestaat",
+       "tooltip-search": "Doorzoek {{SITENAME}}",
+       "tooltip-search-go": "Naar een pagina met deze naam gaan als deze bestaat",
        "tooltip-search-fulltext": "Alle pagina's op deze tekst doorzoeken",
        "tooltip-p-logo": "Naar de hoofdpagina gaan",
        "tooltip-n-mainpage": "Naar de hoofdpagina gaan",
        "pageinfo-length": "Paginalengte (in bytes)",
        "pageinfo-article-id": "Paginanummer",
        "pageinfo-language": "Taal voor de pagina",
+       "pageinfo-language-change": "wijzigen",
        "pageinfo-content-model": "Paginainhoudmodel",
        "pageinfo-content-model-change": "wijzigen",
        "pageinfo-robot-policy": "Indexering door robots",
        "pageinfo-category-pages": "Aantal pagina's",
        "pageinfo-category-subcats": "Aantal subcategorieën",
        "pageinfo-category-files": "Aantal bestanden",
+       "pageinfo-user-id": "Gebruikers-ID",
        "markaspatrolleddiff": "Als gecontroleerd markeren",
        "markaspatrolledtext": "Deze pagina als gecontroleerd markeren",
        "markaspatrolledtext-file": "Deze bestandsversie als gecontroleerd markeren",
        "log-show-hide-patrol": "markeerlogboek $1",
        "log-show-hide-tag": "labellogboek $1",
        "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Wilt u bewerking $3 van $2 als gecontroleerd markeren?",
        "deletedrevision": "De oude versie $1 is verwijderd",
        "filedeleteerror-short": "Fout bij het verwijderen van bestand: $1",
        "filedeleteerror-long": "Er zijn fouten opgetreden bij het verwijderen van het bestand:\n\n$1",
        "newimages-showbots": "Uploads door bots weergeven",
        "newimages-hidepatrolled": "Gecontroleerde uploads verbergen",
        "noimages": "Er is niets te zien.",
+       "gallery-slideshow-toggle": "Miniaturen schakelen",
        "ilsubmit": "Zoeken",
        "bydate": "op datum",
        "sp-newimages-showfrom": "Nieuwe bestanden bekijken vanaf $1 om $2.",
        "confirmemail_body_set": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls deze gebruiker *niet* aan u toebehoort, klik dan op de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
        "confirmemail_invalidated": "De e-mailbevestiging is geannuleerd",
        "invalidateemail": "E-mailbevestiging annuleren",
+       "notificationemail_subject_changed": "{{SITENAME}} geregistreerd e-mailadres is gewijzigd",
+       "notificationemail_subject_removed": "{{SITENAME}} geregistreerd e-mailadres is verwijderd",
+       "notificationemail_body_changed": "Iemand, waarschijnlijk u, met het IP-adres $1, heeft het e-mailadres van de gebruiker \"$2\" op {{SITENAME}} gewijzigd naar \"$3\". \n\nAls u dit niet was, neem dan onmiddellijk contact op met een sitebeheerder.",
+       "notificationemail_body_removed": "Iemand, waarschijnlijk u, met het IP-adres $1, heeft het e-mailadres geregistreerd voor gebruiker \"$2\" verwijderd op {{SITENAME}}. \n\nAls u dit niet was, neem dan onmiddellijk contact op met een sitebeheerder.",
        "scarytranscludedisabled": "[Interwiki-invoeging van sjablonen is uitgeschakeld]",
        "scarytranscludefailed": "[De sjabloon $1 kon niet opgehaald worden]",
        "scarytranscludefailed-httpstatus": "[De sjabloon $1 kon niet opgehaald worden: HTTP $2]",
        "tag-filter": "[[Special:Tags|Labelfilter]]:",
        "tag-filter-submit": "Filteren",
        "tag-list-wrapper": "([[Special:Tags|Label{{PLURAL:$1||s}}]]: $2)",
+       "tag-mw-contentmodelchange": "inhoudsmodel wijzigen",
+       "tag-mw-contentmodelchange-description": "Bewerkingen die [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel het  inhoudsmodel van een pagina wijzigen]",
        "tags-title": "Labels",
        "tags-intro": "Op deze pagina staan de labels waarmee de software iedere bewerking kan markeren, en hun betekenis.",
        "tags-tag": "Labelnaam",
        "tags-delete-not-found": "Het label \"$1\" bestaat niet.",
        "tags-delete-too-many-uses": "Het label \"$1\" is toegepast op meer dan $2 {{PLURAL:$2|versies}}. Daardoor kan het niet verwijderd worden.",
        "tags-delete-warnings-after-delete": "Het label \"$1\" is verwijderd, maar de volgende {{PLURAL:$2|waarschuwing is|waarschuwingen zijn}} opgetreden:",
+       "tags-delete-no-permission": "U hebt geen rechten om wijzigingslabels te verwijderen.",
        "tags-activate-title": "Label activeren",
        "tags-activate-question": "U activeert het label \"$1\".",
        "tags-activate-reason": "Reden:",
        "htmlform-date-placeholder": "JJJJ-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "JJJJ-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "De waarde die u hebt opgegeven is niet herkend als datum. Probeer het YYYY-MM-DD datumformaat.",
+       "htmlform-time-invalid": "De waarde die u hebt opgegeven is niet herkend als tijd. Probeer het HH:MM:SS tijdformaat.",
+       "htmlform-datetime-invalid": "De waarde die u hebt opgegeven is niet herkend als datum en tijd. Probeer het JJJJ-MM-DD HH:MM:SS formaat.",
+       "htmlform-date-toolow": "De waarde die u hebt opgegeven ligt voor de vroegste toegestane datum van $1.",
+       "htmlform-date-toohigh": "De waarde die u hebt opgegeven ligt na de laatste toegestane datum van $1.",
+       "htmlform-time-toolow": "De waarde die u hebt opgegeven ligt voor de vroegste toegestane tijd van $1.",
+       "htmlform-time-toohigh": "De waarde die u hebt opgegeven ligt na de laatste toegestane tijd van $1.",
+       "htmlform-datetime-toolow": "De waarde die u hebt opgegeven ligt voor de vroegste toegestane datum en tijd van $1.",
+       "htmlform-datetime-toohigh": "De waarde die u hebt opgegeven ligt na de laatste toegestane datum en tijd van $1.",
        "htmlform-title-badnamespace": "[[:$1]] bevindt zich niet in de naamruimte \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" is geen paginanaam die aangemaakt kan worden",
        "htmlform-title-not-exists": "$1 bestaat niet.",
        "htmlform-user-not-exists": "<strong>$1</strong> bestaat niet.",
        "htmlform-user-not-valid": "<strong>$1</strong> is geen geldige gebruikersnaam.",
        "logentry-delete-delete": "$1 {{GENDER:$2|heeft}} de pagina $3 verwijderd",
+       "logentry-delete-delete_redir": "$1 heeft de doorverwijzing $3 {{GENDER:$2|verwijderd}} door deze te overschrijven",
        "logentry-delete-restore": "$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst",
        "logentry-delete-event": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4",
        "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",
        "feedback-bugcheck": "Geweldig! Controleer even of het niet al één van de [$1 bekende problemen] is.",
        "feedback-thanks": "Bedankt! Uw terugkoppeling is op de pagina \"[$2 $1]\" geplaatst.",
        "feedback-thanks-title": "Bedankt!",
        "feedback-useragent": "Useragent:",
-       "searchsuggest-search": "Zoeken in {{SITENAME}}",
+       "searchsuggest-search": "Doorzoek {{SITENAME}}",
        "searchsuggest-containing": "bevat...",
-       "api-error-badaccess-groups": "U mag geen bestanden uploaden in deze wiki.",
        "api-error-badtoken": "Interne fout: het token klopt niet.",
-       "api-error-blocked": "U bent geblokkeerd en kunt niet bewerken.",
-       "api-error-copyuploaddisabled": "Uploaden via URL is uitgeschakeld op deze server.",
-       "api-error-duplicate": "Er {{PLURAL:$1|staat al een bestand|staan al bestanden}} met dezelfde inhoud in de wiki.",
-       "api-error-duplicate-archive": "Er {{PLURAL:$1|was al een ander bestand|waren al $1 andere bestanden}}  op de site met dezelfde inhoud, maar {{PLURAL:$1|dat is|die zijn}} verwijderd.",
-       "api-error-empty-file": "Het bestand dat u hebt geüpload is leeg.",
        "api-error-emptypage": "Het aanmaken van nieuwe, lege pagina's is niet toegestaan.",
-       "api-error-fetchfileerror": "Interne fout: er is iets misgegaan bij het ophalen van het bestand.",
-       "api-error-fileexists-forbidden": "Er bestaat al een bestand met de naam \"$1\" dat niet overschreven kan worden.",
-       "api-error-fileexists-shared-forbidden": "Er bestaat al een bestand met de naam \"$1\" in de gedeelde repository dat niet overschreven kan worden.",
-       "api-error-file-too-large": "Het bestand dat u hebt geüpload is te groot.",
-       "api-error-filename-tooshort": "De bestandsnaam is te kort.",
-       "api-error-filetype-banned": "Dit bestandstype mag niet geüpload worden.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Het bestandstype $1 wordt|De bestandstypes $1 worden}} niet toegelaten. {{PLURAL:$3|Het toegelaten bestandstype is|De toegelaten bestandstypes zijn}} $2.",
-       "api-error-filetype-missing": "Het bestand heeft geen extensie.",
-       "api-error-hookaborted": "De wijziging die u probeert te maken is afgebroken door een uitbreiding.",
-       "api-error-http": "Interne fout: er kon geen verbinding gemaakt worden met de server.",
-       "api-error-illegal-filename": "Deze bestandsnaam is niet toegestaan.",
-       "api-error-internal-error": "Interne fout: er is iets misgegaan tijdens het verwerken van uw upload door de wiki.",
-       "api-error-invalid-file-key": "Interne fout: het bestand is niet aangetroffen in de tijdelijke opslag.",
-       "api-error-missingparam": "Interne fout: niet alle parameters zijn in het verzoek meegeleverd.",
-       "api-error-missingresult": "Interne fout: het was niet mogelijk vast te stellen of het kopiëren is geslaagd.",
-       "api-error-mustbeloggedin": "U moet aangemeld zijn om bestanden te kunnen uploaden.",
-       "api-error-mustbeposted": "Er zit een fout in de software. Er wordt geen gebruik gemaakt van de juiste HTTP-methode.",
-       "api-error-noimageinfo": "De upload is afgerond, maar de server heeft geen gegevens over het bestand verstrekt.",
-       "api-error-nomodule": "Interne fout: er is geen uploadmodule ingesteld.",
-       "api-error-ok-but-empty": "Interne fout: de server heeft geen gegevens teruggeleverd.",
-       "api-error-overwrite": "Het overschrijven van een bestand bestand is niet toegestaan.",
-       "api-error-ratelimited": "U probeert meer bestanden te uploaden in een korte periode dan deze wiki toelaat.\nProbeer het over een aantal minuten opnieuw.",
-       "api-error-stashfailed": "Interne fout: de server kon het tijdelijke bestand niet opslaan.",
        "api-error-publishfailed": "Interne fout: de server kon het tijdelijke bestand niet publiceren.",
-       "api-error-stasherror": "Er is een fout opgetreden tijdens het uploaden van het bestand naar de tijdelijke opslagruimte.",
-       "api-error-stashedfilenotfound": "Het opgeslagen bestand is niet aangetroffen tijdens het uploaden vanuit de stash.",
-       "api-error-stashpathinvalid": "Het pad waar het bestand in de stash werd verwacht is ongeldig.",
-       "api-error-stashfilestorage": "Er is een fout opgetreden tijdens het opslaan van het bestand in de stash.",
-       "api-error-stashzerolength": "De server kon het bestand niet opslaan in de stash, omdat het een lengte van nul had.",
-       "api-error-stashnotloggedin": "U moet aangemeld zijn om bestanden te kunnen opslaan in de stash.",
-       "api-error-stashwrongowner": "U bent geen eigenaar van het bestand waar u toegang tot probeerde te krijgen.",
-       "api-error-stashnosuchfilekey": "Het sleutelbestand in de stash waar u toegang tot probeert te krijgen bestaat niet.",
-       "api-error-timeout": "De server heeft niet binnen de verwachte tijd geantwoord.",
-       "api-error-unclassified": "Er is een onbekende fout opgetreden",
-       "api-error-unknown-code": "Interne fout: \"$1\"",
-       "api-error-unknown-error": "Interne fout: er is iets misgegaan tijdens het uploaden van uw bestand.",
-       "api-error-unknown-warning": "Onbekende waarschuwing: $1",
+       "api-error-stashfailed": "Interne fout: de server kon het tijdelijke bestand niet opslaan.",
+       "api-error-unknown-warning": "Onbekende waarschuwing: \"$1\".",
        "api-error-unknownerror": "Onbekende fout: \"$1\"",
-       "api-error-uploaddisabled": "Uploaden is niet mogelijk in deze wiki.",
-       "api-error-verification-error": "Dit bestand is mogelijk beschadigd of heeft een onjuiste extensie.",
-       "api-error-was-deleted": "Een bestand met deze naam is al eerder geüpload en vervolgens verwijderd.",
        "duration-seconds": "$1 {{PLURAL:$1|seconde|seconden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuut|minuten}}",
        "duration-hours": "$1 {{PLURAL:$1|uur|uren}}",
        "pagelang-language": "Taal",
        "pagelang-use-default": "Standaard taal gebruiken",
        "pagelang-select-lang": "Taal selecteren",
+       "pagelang-reason": "Reden",
        "pagelang-submit": "Opslaan",
+       "pagelang-nonexistent-page": "De pagina $1 bestaat niet.",
+       "pagelang-unchanged-language": "De pagina $1 is al ingesteld op de taal $2.",
+       "pagelang-unchanged-language-default": "De pagina $1 is al ingesteld op de wiki's standaard inhoudstaal.",
+       "pagelang-db-failed": "De database kon de paginataal niet wijzigen.",
        "right-pagelang": "Paginataal wijzigen",
        "action-pagelang": "paginataal te wijzigen",
        "log-name-pagelang": "Logboek taalwijzigingen",
        "mw-widgets-dateinput-no-date": "Geen datum geselecteerd",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Zoeken naar media",
+       "mw-widgets-mediasearch-noresults": "Geen resultaten gevonden.",
        "mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
        "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Voeg een categorie toe...",
+       "mw-widgets-usersmultiselect-placeholder": "Meer toevoegen...",
        "sessionmanager-tie": "Het is niet mogelijk om meerdere authenticatietypen voor verzoeken te combineren: $1.",
        "sessionprovider-generic": "$1-sessies",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "op cookies gebaseerde sessies",
        "sessionprovider-nocookies": "Cookies kunnen uitgeschakeld zijn. Zorg ervoor dat u cookies hebt ingeschakeld en probeer het opnieuw.",
        "randomrootpage": "Willekeurige hoofdpagina",
        "log-action-filter-block": "Soort blokkade:",
+       "log-action-filter-contentmodel": "Soort inhoudsmodel wijziging:",
        "log-action-filter-delete": "Soort verwijdering:",
+       "log-action-filter-import": "Type import:",
        "log-action-filter-managetags": "Type labelbeheerhandeling:",
        "log-action-filter-move": "Soort hernoeming:",
        "log-action-filter-newusers": "Type accountaanmaak:",
        "log-action-filter-patrol": "Soort markering:",
        "log-action-filter-protect": "Soort beveiliging:",
        "log-action-filter-rights": "Soort verandering van rechten:",
+       "log-action-filter-suppress": "Soort verberging:",
        "log-action-filter-upload": "Soort upload:",
        "log-action-filter-all": "Alles",
        "log-action-filter-block-block": "Blokkade",
        "log-action-filter-block-reblock": "Aanpassing van blokkade",
        "log-action-filter-block-unblock": "Opheffing van blokkade",
+       "log-action-filter-contentmodel-change": "Wijziging van het inhoudsmodel",
+       "log-action-filter-contentmodel-new": "Pagina creatie met een niet-standaard inhoudsmodel",
        "log-action-filter-delete-delete": "Verwijderen van pagina",
+       "log-action-filter-delete-delete_redir": "Overschrijven van doorverwijzingen",
        "log-action-filter-delete-restore": "Terugplaatsen van pagina",
+       "log-action-filter-delete-event": "Verwijderen van logboekregels",
+       "log-action-filter-delete-revision": "Verwijderen van versies",
+       "log-action-filter-import-interwiki": "Transwiki imports",
+       "log-action-filter-import-upload": "Import doormiddel van XML uploads",
        "log-action-filter-managetags-create": "Aanmaken van label",
        "log-action-filter-managetags-delete": "Verwijderen van label",
        "log-action-filter-managetags-activate": "Activeren van label",
        "log-action-filter-suppress-event": "Verbergen van logboekregel",
        "log-action-filter-suppress-revision": "Verbergen van versie",
        "log-action-filter-suppress-delete": "Verbergen van pagina",
+       "log-action-filter-suppress-block": "Verbergen van gebruiker tijdens blokkade",
+       "log-action-filter-suppress-reblock": "Verbergen van gebruiker tijdens wijzigen blokkade",
        "log-action-filter-upload-upload": "Nieuwe upload",
        "log-action-filter-upload-overwrite": "Herupload",
        "authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
        "authmanager-create-disabled": "Het aanmaken van accounts is uitgeschakeld.",
+       "authmanager-create-from-login": "Om een account aan te maken, gelieve de velden in te vullen.",
+       "authmanager-authplugin-setpass-failed-title": "Wachtwoord wijzigen is mislukt",
+       "authmanager-authplugin-setpass-denied": "De verificatie-invoegtoepassing staat het wijzigen van wachtwoorden niet toe.",
+       "authmanager-authplugin-setpass-bad-domain": "Ongeldig domein.",
+       "authmanager-autocreate-noperm": "Het automatisch aanmaken van accounts is niet toegestaan.",
+       "authmanager-autocreate-exception": "Het automatisch aanmaken van accounts is tijdelijk uitgeschakelijk vanwege eerdere fouten.",
+       "authmanager-userdoesnotexist": "Gebruikersaccount \"$1\" is niet geregistreerd.",
+       "authmanager-userlogin-remembermypassword-help": "Of het wachtwoord moet worden opgeslagen voor langer dan de duur van de sessie.",
+       "authmanager-username-help": "Gebruikersnaam for authentificatie.",
+       "authmanager-password-help": "Wachtwoord for authentificatie.",
+       "authmanager-domain-help": "Domein voor externe authentificatie.",
+       "authmanager-retype-help": "Wachtwoord ter bevestiging.",
        "authmanager-email-label": "E-mail",
        "authmanager-email-help": "E-mailadres",
        "authmanager-realname-label": "Echte naam",
        "authmanager-realname-help": "Echte naam van de gebruiker",
        "authmanager-provider-password": "Op wachtwoord gebaseerde authenticatie",
+       "authmanager-provider-password-domain": "Wachtwoord- en domeingebaseerde authentificatie",
        "authmanager-provider-temporarypassword": "Tijdelijk wachtwoord",
+       "authprovider-confirmlink-request-label": "Accounts die aan elkaar moeten worden gekoppeld.",
+       "authprovider-confirmlink-success-line": "$1: Succesvol gekoppeld.",
+       "authprovider-confirmlink-failed": "Account koppelen is niet volledig gelukt: $1",
        "authprovider-resetpass-skip-label": "Overslaan",
+       "authprovider-resetpass-skip-help": "Sla het resetten van het wachtwoord over.",
+       "authform-newtoken": "Ontbrekend token. $1",
+       "authform-notoken": "Ontbrekend token",
+       "authform-wrongtoken": "Verkeerd token",
        "specialpage-securitylevel-not-allowed-title": "Niet toegestaan",
+       "authpage-cannot-create": "Kon het account aanmaken niet starten.",
        "cannotauth-not-allowed-title": "Geen toegang",
+       "cannotauth-not-allowed": "U hebt geen toestemming om deze pagina te gebruiken",
        "changecredentials": "Authenticatiegegevens wijzigen",
        "changecredentials-submit": "Authenticatiegegevens wijzigen",
+       "changecredentials-invalidsubpage": "$1 is geen geldig identificatietype.",
        "changecredentials-success": "Uw authenticatiegegevens zijn gewijzigd.",
        "removecredentials": "Authenticatiegegevens verwijderen",
        "removecredentials-submit": "Authenticatiegegevens verwijderen",
+       "removecredentials-invalidsubpage": "$1 is geen geldig identificatietype.",
        "removecredentials-success": "Uw authenticatiegegevens zijn verwijderd.",
        "credentialsform-provider": "Soort authenticatiegegevens:",
        "credentialsform-account": "Gebruikersnaam:",
        "linkaccounts-success-text": "Het account is gekoppeld.",
        "linkaccounts-submit": "Accounts koppelen",
        "unlinkaccounts": "Accounts ontkoppelen",
-       "unlinkaccounts-success": "Het account is ontkoppeld."
+       "unlinkaccounts-success": "Het account is ontkoppeld.",
+       "userjsispublic": "Let op: JavaScript deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
+       "usercssispublic": "Let op: CSS deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
+       "restrictionsfield-badip": "Ongeldig IP-adres of range: $1",
+       "restrictionsfield-label": "Toegestane IP-ranges:",
+       "restrictionsfield-help": "Een IP-adres of CIDR bereik per lijn. Om alles toe te staan, gebruik:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "versie $1",
+       "pageid": "Pagina-ID $1"
 }
index 66b151e..bfba48c 100644 (file)
        "newwindow": "(vert opna i eit nytt vindauge)",
        "cancel": "Avbryt",
        "moredotdotdot": "Meir …",
-       "morenotlisted": "Lista er ikkje heil.",
+       "morenotlisted": "Lista er kanskje ikkje heil.",
        "mypage": "Sida mi",
        "mytalk": "Diskusjon",
        "anontalk": "Diskusjon",
        "tagline": "Frå {{SITENAME}}",
        "help": "Hjelp",
        "search": "Søk",
+       "search-ignored-headings": "#<!-- la denne lina vere som ho er --> <pre>\n# Overskrifter som skal ignorerast av søk.\n# Endringar til denne trer i kraft så snart sida med overskrifta blir indeksert.\n# Du kan tvinge gjenindeksering av sida ved å gjere ein null-redigering.\n# Syntaksen er som fylgjer:\n# * Alt frå eit «#»-teikn til slutten av lina er ein kommentar.\n# * Kvar ikkje-blank line er den eksakte tittelen som skal ignorerast, det vert òg skilt mellom store og små bokstavar\nLitteratur\nBakgrunnsstoff\nKjelder\nReferansar\n#</pre> <!-- la denne line vere som ho er -->",
        "searchbutton": "Søk",
        "go": "Vis",
        "searcharticle": "Vis",
        "history": "Sidehistorikk",
        "history_short": "Historikk",
+       "history_small": "historikk",
        "updatedmarker": "oppdatert etter førre vitjinga mi",
        "printableversion": "Utskriftsversjon",
        "permalink": "Fast lenkje",
        "views": "Visningar",
        "toolbox": "Verktøy",
        "tool-link-userrights": "Endra {{GENDER:$1|brukargrupper}}",
+       "tool-link-userrights-readonly": "Syn {{GENDER:$1|brukar}}grupper",
        "tool-link-emailuser": "Send e-post til {{GENDER:$1|brukaren}}",
        "userpage": "Vis brukarside",
        "projectpage": "Sjå prosjektsida",
        "jumptonavigation": "navigering",
        "jumptosearch": "søk",
        "view-pool-error": "Diverre er filtenarane nett no opptekne.\nFor mange brukarar prøver å sjå denne sida.\nVent ei lita stund, før du prøver å sjå på sida.\n\n$1",
+       "generic-pool-error": "Beklagar, tjenarane er overbelasta for augneblinken.\nFor mange brukarar prøver å sjå denne ressursen.\nVent litt før du prøver igjen.",
        "pool-timeout": "Tidsavbrot under venting på låsing.",
        "pool-queuefull": "Køen er full.",
        "pool-errorunknown": "Ukjend feil",
        "error": "Feil",
        "databaseerror": "Databasefeil",
        "databaseerror-text": "Ein spørjefeil mot databasen har oppstått.\nDette kan indikere ein feil i programvara.",
+       "databaseerror-textcl": "Ein databasespørringsfeil oppsto.",
        "databaseerror-query": "Spørjing: $1",
        "databaseerror-function": "Funksjon: $1",
        "databaseerror-error": "Feil: $1",
        "readonly_lag": "Databasen er mellombels skriveverna for at databasetenarane skal kunna synkronisere seg mot kvarandre",
        "internalerror": "Intern feil",
        "internalerror_info": "Intern feil: $1",
+       "internalerror-fatal-exception": "Alvorleg unntak av typen «$1»",
        "filecopyerror": "Kunne ikkje kopiere fila frå «$1» til «$2».",
        "filerenameerror": "Kunne ikkje døype om fila frå «$1» til «$2».",
        "filedeleteerror": "Kunne ikkje slette fila «$1».",
        "cannotdelete": "Kunne ikkje slette sida eller fila «$1».\nHo kan allereie vere sletta av andre.",
        "cannotdelete-title": "Kan ikkje sletta sida «$1»",
        "delete-hook-aborted": "Slettinga vart avbroten av ein funksjon.\nFunksjonen oppgav inga årsak.",
+       "no-null-revision": "Kunne ikkje opprette ny nullrevisjon for sida «$1»",
        "badtitle": "Feil i tittelen",
        "badtitletext": "Den ønskte tittelen var ulovleg, tom eller feillenkja frå ein annan wiki. Kanskje inneheld han eitt eller fleire teikn som ikkje kan brukast i sidetitlar.",
+       "title-invalid-empty": "Den etterspurde sidetittelen er tom eller inneheld berre namnet til eit namnerom.",
+       "title-invalid-utf8": "Den etterspurde sidetittelen inneheld ein ugyldig UTF-8-sekvens.",
+       "title-invalid-interwiki": "Den etterspurde sidetittelen inneheld ei interwikilenkje som ikkje kan nyttast i titlar.",
+       "title-invalid-talk-namespace": "Den etterspurde sidetittilen refererer til ei diskusjonsside som ikkje kan eksistere.",
+       "title-invalid-characters": "Den etterspurde sidetittelen inneheld ugyldige teikn: «$1».",
+       "title-invalid-relative": "Tittelen har ein relativ sti. Relative stititlar (./, ../) er ugyldige, fordi dei ofte ikkje vil vere tilgjengelege for brukarens nettlesar.",
+       "title-invalid-magic-tilde": "Den etterspurde sidetittelen inneheld ein ugyldig sekvens med magiske tildar (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Den etterspurde sidetittelen er for lang. Den kan ikkje vere lengre enn $1 {{PLURAL:$1|byte}} i UTF-8-koding.",
+       "title-invalid-leading-colon": "Den etterspurde sidetittelen inneheld eit ugyldig kolon i byrjinga.",
        "perfcached": "Dei følgjande dataa er frå mellomlageret åt tenaren og er ikkje utan vidare oppdatert. Høgst {{PLURAL:$1|eitt resultat er tilgjengeleg|$1 resultat er tilgjengelege}} i mellomlageret.",
        "perfcachedts": "Desse dataa er mellomlagra, og vart sist oppdaterte $1. Høgst {{PLURAL:$4|eitt resultat er tilgjengeleg|$4 resultat er tilgjengelege}} i mellomlageret.",
        "querypage-no-updates": "Oppdatering av denne sida er slått av, og data her vil ikkje verte fornya.",
        "actionthrottled": "Handlinga vart stoppa",
        "actionthrottledtext": "For å hindre spamming kan du ikkje utføre denne handlinga for mange gonger på kort tid. Ver venleg og prøv igjen litt seinare.",
        "protectedpagetext": "Sida har vorte verna for å hindra endring eller andre handlingar.",
-       "viewsourcetext": "Du kan sjå og kopiere kjeldekoden til denne sida:",
-       "viewyourtext": "Du kan sjå og kopiera kjelda til '''endringane dine''' på sida:",
+       "viewsourcetext": "Du kan sjå og kopiere kjeldekoden til denne sida.",
+       "viewyourtext": "Du kan sjå og kopiera kjelda til <strong>endringane dine</strong> på sida.",
        "protectedinterface": "Denne sida inneheld tekst nytta av brukargrensesnittet for programvara på wikien, og er låst for å hindra hærverk.\nFor å leggja til eller endra omsetjingar for alle wikiar, gjer vel å nytta [https://translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
        "editinginterface": "'''Åtvaring:''' Du endrar på ei side som inneheld tekst nytta av brukargrensesnittet for programvara.\nEndringar på denne sida påverkar utsjånaden til brukargrensesnittet for dei andre brukarane av wikien.\nFor å leggja til eller endra omsetjingar, gjer vel å nytta [https://translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
-       "cascadeprotected": "Denne sida er verna mot endring fordi ho er inkludert i {{PLURAL:$1|den opplista sida|dei opplista sidene}} som har djupvern slått på:\n$2",
+       "translateinterface": "For å legge til eller endre omsetjingar for alle wikiar, nytt [https://translatewiki.net/ translatewiki.net], lokaliseringsprosjektet til MediaWiki.",
+       "cascadeprotected": "Denne sida er verna mot endring fordi ho er inkludert i fylgjande {{PLURAL:$1|side|sider}} som har djupvern slått på:\n$2",
        "namespaceprotected": "Du har ikkje tilgang til å endre sidene i '''$1'''-namnerommet.",
        "customcssprotected": "↓Du har ikkje tilgang til å endre denne sida, fordi ho inneheld ein annan brukar sine personlege innstillingar.",
        "customjsprotected": "↓Du har ikkje tilgang til å endra denne JavaScript-sida fordi ho inneheld ein annen brukar sine personlege innstillingar.",
        "invalidtitle-knownnamespace": "Ugyldig tittel med namnerommet «$2» og teksten «$3»",
        "invalidtitle-unknownnamespace": "Ugyldig tittel med ukjend namneromstal $1 og teksten «$2»",
        "exception-nologin": "Ikkje innlogga",
-       "exception-nologin-text": "Sida eller handlinga krev at du er innlogga på wikien.",
+       "exception-nologin-text": "Logg inn for å få tilgang til denne sida eller handlinga.",
+       "exception-nologin-text-manual": "Du må $1 for å få tilgang til denne sida eller handlinga.",
        "virus-badscanner": "Dårleg konfigurasjon: ukjend virusskanner: ''$1''",
        "virus-scanfailed": "skanning mislukkast (kode $1)",
        "virus-unknownscanner": "ukjend antivirusprogram:",
-       "logouttext": "'''Du er no utlogga.'''\n\nDu kan no halde fram å bruke {{SITENAME}} anonymt, eller du kan <span class='plainlinks'>[$1 logge inn att]</span>  med same kontoen eller ein annan brukar kan logge inn.\nVer merksam på at nokre sider framleis kan visast fram som om du er innlogga fram til du slettar mellomlageret til nettlesaren din.",
+       "logouttext": "<strong>Du er no utlogga.</strong>\n\nVer merksam på at nokre sider framleis kan visast fram som om du er innlogga fram til du slettar mellomlageret til nettlesaren din.",
+       "cannotlogoutnow-title": "Kan ikkje logga ut nå",
+       "cannotlogoutnow-text": "Utlogging er ikkje mogleg når du nyttar $1.",
        "welcomeuser": "Velkomen, $1!",
        "welcomecreation-msg": "Brukarkontoen din er oppretta.\nGløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].",
        "yourname": "Brukarnamn:",
        "createacct-yourpasswordagain-ph": "Skriv inn passordet på nytt",
        "userlogin-remembermypassword": "Hald meg innlogga",
        "userlogin-signwithsecure": "Nytt trygg kopling",
+       "cannotlogin-title": "Kan ikkje logga inn",
+       "cannotlogin-text": "Innlogging er ikkje mogleg.",
+       "cannotloginnow-title": "Kan ikkje logga inn no",
+       "cannotloginnow-text": "Innlogging er ikkje mogleg når du nyttar $1.",
+       "cannotcreateaccount-title": "Kan ikkje opprette kontoar",
+       "cannotcreateaccount-text": "Direkte kontooppretting er ikkje slått på på denne wikien.",
        "yourdomainname": "Domenet ditt",
        "password-change-forbidden": "Du kan ikkje endra passord på denne wikien.",
        "externaldberror": "Det var anten ein ekstern databasefeil i tilgjengekontrollen, eller du har ikkje løyve til å oppdatere den eksterne kontoen din.",
        "login": "Logg inn",
+       "login-security": "Stadfest identiteten din",
        "nav-login-createaccount": "Lag brukarkonto / logg inn",
        "userlogin": "Lag brukarkonto / logg inn",
        "userloginnocreate": "Logg inn",
        "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.",
+       "userlogin-reauth": "Du må logga inn igjen for å stadfesta at du er {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Opprett ein annan konto",
        "createacct-emailrequired": "E-postadresse:",
        "createacct-emailoptional": "E-postadresse (valfritt)",
        "createacct-email-ph": "Skriv inn e-postadressa di",
        "createacct-another-email-ph": "Skriv inn e-postadresse",
        "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",
-       "createacct-another-submit": "Opprett ein konto til",
+       "createacct-another-submit": "Opprett konto",
+       "createacct-continue-submit": "Hald fram med kontooppretting",
+       "createacct-another-continue-submit": "Hald fram med kontooppretting",
        "createacct-benefit-heading": "{{SITENAME}} er laga av folk som deg.",
        "createacct-benefit-body1": "{{PLURAL:$1|éi endring|$1 endringar}}",
        "createacct-benefit-body2": "{{PLURAL:$1|éi side|$1 sider}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nyleg bidragsytar|nylege bidragsytarar}}",
        "badretype": "Passorda du skreiv inn er ikkje like.",
+       "usernameinprogress": "Ei kontooppretting for dette brukarnamnet pågår allereie.\nVent.",
        "userexists": "Brukarnamnet er alt i bruk. Vel eit anna brukarnamn.",
        "loginerror": "Innloggingsfeil",
        "createacct-error": "Kontoopprettingsfeil",
        "nocookiesnew": "Brukarkontoen vart oppretta, men du er ikkje innlogga. {{SITENAME}} bruker informasjonskapslar for å logge inn brukarar,\nnettlesaren din er innstilt for ikkje å godta desse. Etter at du har endra innstillingane slik at nettlesaren godtek informasjonskapslar, kan du logge inn med det nye brukarnamnet og passordet ditt.",
        "nocookieslogin": "{{SITENAME}} bruker informasjonskapslar for å logge inn brukarar, nettlesaren din er innstilt for ikkje å godta desse.\nEtter at du har endra innstillingane slik at nettlesaren godtek informasjonskapslar kan du prøve å logge inn på nytt.",
        "nocookiesfornew": "Brukarkontoen blei ikkje oppretta ettersom kjelda ikkje kunne stadfestast.\nSjå etter om du tek imot informasjonskapslar (cookies), last ned sida ein gong til og prøv igjen.",
+       "createacct-loginerror": "Kontoen ble oppretta, men du kunne ikkje bli logga inn automatisk. Hald fram til [[Special:UserLogin|manuell innlogging]].",
        "noname": "Du har ikkje oppgjeve gyldig brukarnamn.",
-       "loginsuccesstitle": "Du er no innlogga",
+       "loginsuccesstitle": "Innlogga",
        "loginsuccess": "Du er no innlogga som «$1».",
-       "nosuchuser": "Det finst ikkje nokon brukar med brukarnamnet «$1».\nBrukarnamn skil mellom stor og liten bokstav. Sjekk at du har skrive brukarnamet rett eller [[Special:CreateAccount|opprett ein ny konto]].",
+       "nosuchuser": "Det finst ikkje nokon brukar med brukarnamnet «$1».\nBrukarnamn skil mellom stor og liten bokstav.\nSjekk at du har skrive brukarnamet rett eller [[Special:CreateAccount|opprett ein ny konto]].",
        "nosuchusershort": "Det finst ikkje nokon brukar med brukarnamnet «$1». Sjekk at du har skrive rett.",
        "nouserspecified": "Du må oppgje eit brukarnamn.",
        "login-userblocked": "Denne brukaren er blokkert. Innlogging er ikkje tillate.",
        "wrongpassword": "Du har oppgjeve eit ugyldig passord. Prøv om att.",
        "wrongpasswordempty": "Du oppgav ikkje noko passord. Ver venleg og prøv igjen.",
        "passwordtooshort": "Passord må innehalda minst {{PLURAL:$1|eitt teikn|$1 teikn}}.",
+       "passwordtoolong": "Passord kan ikkje vera lengre enn {{PLURAL:$1|eitt|$1}} teikn.",
+       "passwordtoopopular": "Alminneleg valde passord kan ikkje nyttast. Vel eit meir unikt passord.",
        "password-name-match": "Passordet ditt lyt vera noko anna enn brukarnamnet ditt.",
        "password-login-forbidden": "Bruk av dette brukarnamnet og passordet er vorte forbode.",
        "mailmypassword": "Attendestill passord",
        "passwordreset-emaildisabled": "E-postfunksjonen er slegen av på wikien.",
        "passwordreset-username": "Brukarnamn:",
        "passwordreset-domain": "Domene:",
-       "passwordreset-capture": "Vis resulterande epost",
-       "passwordreset-capture-help": "Huk av her dersom du vil sjå eposten (med førebels passord) i tillegg til at han blir sendt til brukaren.",
        "passwordreset-email": "↓E-postadresse:",
        "passwordreset-emailtitle": "↓Kontodetaljar på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nokon (sannsynlegvis deg, frå IP-adressa $1) bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
+       "deprecated-self-close-category": "Sider som nyttar ugyldige sjølvlukkande HTML-merke.",
        "duplicate-args-warning": "<strong>Åtvaring:</strong> [[:$1]] kallar [[:$2]] med meir enn éin verdi for argumentet «$3». Berre den sist oppgjevne verdien vert nytta.",
        "expensive-parserfunction-warning": "Åtvaring: Denne sida inneheld for mange prosesskrevande parserfunksjonar.\n\nDet burde vere færre enn {{PLURAL:$2|$2|$2}}, men er no {{PLURAL:$1|$1|$1}}.",
        "expensive-parserfunction-category": "Sider med for mange prosesskrevande parserfunksjonar",
        "history-feed-description": "Endringshistorikk for denne sida på wikien",
        "history-feed-item-nocomment": "$1 på $2",
        "history-feed-empty": "Den etterspurde sida finst ikkje. Ho kan vere sletta frå wikien, eller vere flytta. Prøv å [[Special:Search|søke på wikien]] for relevante nye sider.",
+       "history-edit-tags": "Endra merka til dei valde versjonane",
        "rev-deleted-comment": "(endringssamandrag fjerna)",
        "rev-deleted-user": "(brukarnamnet er fjerna)",
        "rev-deleted-event": "(fjerna loggoppføring)",
        "saveprefs": "Lagre",
        "restoreprefs": "Hent attende alle standardinnstillingane (i alle bolkane)",
        "prefs-editing": "Endring",
-       "rows": "Rekkjer",
-       "columns": "Kolonnar",
        "searchresultshead": "Søk",
-       "stub-threshold": "Grense (i byte) for at frø/spirer skal formaterast <a href=\"#\" class=\"stub\">slik</a>:",
+       "stub-threshold": "Grense for spireformatering ($1):",
        "stub-threshold-disabled": "Deaktivert",
        "recentchangesdays": "Tal på dagar som viser på siste endringar:",
        "recentchangesdays-max": "(høgst $1 {{PLURAL:$1|dag|dagar}})",
        "userrights-reason": "Årsak:",
        "userrights-no-interwiki": "Du har ikkje tilgang til å endre brukartilgangar på andre wikiar.",
        "userrights-nodatabase": "Databasen $1 finst ikkje eller er ikkje lokal.",
-       "userrights-nologin": "Du må [[Special:UserLogin|logge inn]] med ein administrator- og/eller byråkratkonto for å endre brukartilgangar.",
-       "userrights-notallowed": "Du har ikkje løyve til å leggja til eller fjerna brukarrettar.",
        "userrights-changeable-col": "Grupper du kan endre",
        "userrights-unchangeable-col": "Grupper du ikkje kan endre",
        "group": "Gruppe:",
        "right-siteadmin": "Låse og låse opp databasen",
        "right-override-export-depth": "Eksporter sider inkludert lenkte sider til ei djupn på 5",
        "right-sendemail": "Senda e-post til andre brukarar",
-       "right-passwordreset": "Sjå e-postar for passord som er stilte attende",
        "newuserlogpage": "Brukaropprettingslogg",
        "newuserlogpagetext": "Dette er ein logg over oppretta brukarkontoar.",
        "rightslog": "Brukartilgangslogg",
        "mywatchlist": "Overvakingsliste",
        "watchlistfor2": "For $1 $2",
        "nowatchlist": "Du har ikkje noko i overvakingslista di.",
-       "watchlistanontext": "Du lyt $1 for å vise eller endre sider på overvakingslista di.",
+       "watchlistanontext": "Logg inn for å vise eller endre sider på overvakingslista di.",
        "watchnologin": "Ikkje innlogga",
        "addwatch": "↓Legg til i overvakingslista",
        "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførte der.",
        "modifiedarticleprotection": "endra nivået på vernet av «[[$1]]»",
        "unprotectedarticle": "fjerna vern av «[[$1]]»",
        "movedarticleprotection": "flytta verneinnstillingar frå «[[$2]]» til «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Fjerna}} vern av «[[$1]]»",
        "protect-title": "Vernar «$1»",
        "protect-title-notallowed": "Sjå vernenivået til «$1»",
        "prot_1movedto2": "«[[$1]]» flytt til «[[$2]]»",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Vel ein",
        "logentry-delete-delete": "$1 {{GENDER:$2|sletta}} sida $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|sletta}} omdirigeringa $3 gjennom overskriving",
        "logentry-delete-restore": "$1 {{GENDER:$2|attoppretta}} sida $3",
        "logentry-delete-event": "$1 {{GENDER:$2|endra}} synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endra}} synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4",
        "logentry-newusers-create2": "Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1",
        "logentry-newusers-byemail": "Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1 og passord vart sendt med e-post",
        "logentry-newusers-autocreate": "Brukarkontoen $1 vart {{GENDER:$2|oppretta}} av seg sjølv",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|fjerna}} vern av $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|verna}} $3 $4",
        "logentry-rights-rights": "$1 {{GENDER:$2|endra}} gruppemedlemskap for $3 frå $4 til $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|endra}} gruppemedlemskap for $3",
        "feedback-thanks": "Takk! Attendemeldinga di er lagd inn på sida «[$2 $1]».",
        "searchsuggest-search": "Søk i {{SITENAME}}",
        "searchsuggest-containing": "som inneheld …",
-       "api-error-badaccess-groups": "Du har ikkje løyve til å lasta opp filer til wikien.",
        "api-error-badtoken": "Intern feil: ugild token.",
-       "api-error-copyuploaddisabled": "Opplasting etter URL er avslege på tenaren.",
-       "api-error-duplicate": "Det finst {{PLURAL:$1|ei anna fil|andre filer}} på nettstaden med same innhaldet.",
-       "api-error-duplicate-archive": "Det fanst {{PLURAL:$1|ei anna fi|andre file}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
-       "api-error-empty-file": "Fila du sende var tom.",
        "api-error-emptypage": "Det er ikkje tillate å oppretta nye tomme sider.",
-       "api-error-fetchfileerror": "Intern feil: Noko gjekk gale då fila vart henta.",
-       "api-error-fileexists-forbidden": "Ei fil med namnet «$1» finst alt, og kan ikkje skrivast over.",
-       "api-error-fileexists-shared-forbidden": "Ei fil med namnet «$1» finst alt i den delte filsamlinga, og kan ikkje skrivast over.",
-       "api-error-file-too-large": "Fila du sende var for stor.",
-       "api-error-filename-tooshort": "Filnamnet er for stutt.",
-       "api-error-filetype-banned": "Denne filtypen er ikkje tillaten.",
-       "api-error-filetype-banned-type": "$1 er ikkje {{PLURAL:$4|ein tillaten filtype|tillatne filtypar}}. {{PLURAL:$3|Tillaten filtype|Tillatne filtypar}} er $2.",
-       "api-error-filetype-missing": "Fila saknar ei ending.",
-       "api-error-hookaborted": "Endringa du freista vart avbroten av ei utviding.",
-       "api-error-http": "Intern feil: kan ikkje kopla til tenaren.",
-       "api-error-illegal-filename": "Filnamnet er ikkje tillate.",
-       "api-error-internal-error": "Intern feil: Noko gjekk gale med handsaminga av opplastinga di til wikien.",
-       "api-error-invalid-file-key": "Intern feil: Fila vart ikkje funnen i mellombels lagringsplass.",
-       "api-error-missingparam": "Intern feil: det saknar parametrar i førespurnaden.",
-       "api-error-missingresult": "Intern feil: kunne ikkje avgjera om koperinga var vellukka.",
-       "api-error-mustbeloggedin": "Du lyt vera innlogga for å lasta opp filer.",
-       "api-error-mustbeposted": "Intern feil: førespurnad krev HTTP POST.",
-       "api-error-noimageinfo": "Opplastinga gjekk greitt, men tenaren gav oss ikkje noko informasjon om fila.",
-       "api-error-nomodule": "Intern feil: ingen opplastingsmodul er vald.",
-       "api-error-ok-but-empty": "Intern feil: ikkje noko svar frå tenaren.",
-       "api-error-overwrite": "Det er ikkje tillate å skriva over filer som alt finst.",
-       "api-error-stashfailed": "Intern feil: tenaren greidde ikkje å lagra ei mellombels fil.",
        "api-error-publishfailed": "Intern feil: tenaren greidde ikkje å publisera mellombels fil.",
-       "api-error-timeout": "Tenaren svara ikkje innan tida svar var venta.",
-       "api-error-unclassified": "Det oppstod ein ukjend feil.",
-       "api-error-unknown-code": "Ukjend feil: «$1»",
-       "api-error-unknown-error": "Intern feil: Noko gjekk gale då fila di vart freista lasta opp.",
+       "api-error-stashfailed": "Intern feil: tenaren greidde ikkje å lagra ei mellombels fil.",
        "api-error-unknown-warning": "Ukjend åtvaring: $1",
        "api-error-unknownerror": "Ukjend feil: «$1».",
-       "api-error-uploaddisabled": "Det er ikkje høve til å lasta opp filer til wikien.",
-       "api-error-verification-error": "Fila kan vera øydelagd eller ha rang filending.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutt|minutt}}",
        "duration-hours": "$1 {{PLURAL:$1|time|timar}}",
        "limitreport-cputime": "CPU-tidsbruk",
        "limitreport-cputime-value": "{{PLURAL:$1|eitt sekund|$1 sekund}}",
        "limitreport-walltime-value": "{{PLURAL:$1|eitt sekund|$1 sekund}}",
-       "limitreport-ppvisitednodes": "Tal på knutepunktsvitjingar av førhandsamar",
+       "limitreport-ppvisitednodes": "Nodar vitja av preprosessor",
+       "limitreport-ppgeneratednodes": "Nodar laga av preprosessor",
+       "limitreport-postexpandincludesize": "Inkluderingsstorleik etter utviding",
        "limitreport-postexpandincludesize-value": "$1/$2 byte",
        "limitreport-templateargumentsize": "Storleik på malargument",
        "limitreport-templateargumentsize-value": "$1/$2 byte",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sida finst ikkje enno",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
-       "randomrootpage": "Tilfeldig rotsida"
+       "randomrootpage": "Tilfeldig rotsida",
+       "userjsispublic": "Merk: JavaScript-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar.",
+       "usercssispublic": "Merk: CSS-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar."
 }
index 3493eb7..3cfbe34 100644 (file)
                        "아라",
                        "Macofe",
                        "Matma Rex",
-                       "Xð"
+                       "Xð",
+                       "Nicolas Eynaud",
+                       "Fitoschido",
+                       "Vriullop"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
@@ -35,7 +38,7 @@
        "tog-watchdeletion": "Apondre las paginas e los fichièrs que suprimissi de ma lista de seguiment",
        "tog-watchuploads": "Apondre los novèls fichièrs qu’impòrti a ma lista de seguiment",
        "tog-watchrollback": "Apondre a ma lista de seguiment las paginas sus las qualas ai efectuat una revocacion",
-       "tog-minordefault": "Considerar mas modificacions coma menoras per defaut",
+       "tog-minordefault": "Considerar totas las modificacions coma menoras per defaut",
        "tog-previewontop": "Far veire la previsualizacion al dessús de la zòna de modificacion",
        "tog-previewonfirst": "Far veire la previsualizacion al moment de la primièra edicion",
        "tog-enotifwatchlistpages": "M’avertir per corrièr electronic quand una pagina o un fichièr de ma lista de seguiment es modificat",
        "october": "d'octobre",
        "november": "de novembre",
        "december": "de decembre",
-       "january-gen": "Genièr",
-       "february-gen": "Febrièr",
-       "march-gen": "Març",
+       "january-gen": "de genièr",
+       "february-gen": "de febrièr",
+       "march-gen": "de març",
        "april-gen": "Abril",
-       "may-gen": "Mai",
-       "june-gen": "Junh",
-       "july-gen": "Julhet",
+       "may-gen": "de mai",
+       "june-gen": "de junh",
+       "july-gen": "de julhet",
        "august-gen": "d'agost",
-       "september-gen": "Setembre",
+       "september-gen": "de setembre",
        "october-gen": "Octobre",
-       "november-gen": "Novembre",
-       "december-gen": "Decembre",
+       "november-gen": "de novembre",
+       "december-gen": "de decembre",
        "jan": "de gen",
        "feb": "de feb",
        "mar": "de març",
        "oct": "d'oct",
        "nov": "de nov",
        "dec": "de dec",
-       "january-date": "$1 de genièr",
-       "february-date": "$1 de febrièr",
-       "march-date": "$1 de març",
+       "january-date": "{{PLURAL:$1|1=1èr|$1}} de genièr",
+       "february-date": "{{PLURAL:$1|1=1èr|$1}} de febrièr",
+       "march-date": "{{PLURAL:$1|1=1èr|$1}} de març",
        "april-date": "$1 d'abril",
        "may-date": "$1 de mai",
        "june-date": "$1 de junh",
        "september-date": "$1 de setembre",
        "october-date": "$1 d'octobre",
        "november-date": "$1 de novembre",
-       "december-date": "$1 de decembre",
+       "december-date": "{{PLURAL:$1|1=1èr|$1}} de decembre",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
        "listingcontinuesabbrev": "(seguida)",
        "index-category": "Paginas indexadas",
        "noindex-category": "Paginas pas indexadas",
-       "broken-file-category": "Paginas amb ligams copats",
+       "broken-file-category": "Paginas amb ligams de fichièrs copats",
        "about": "A prepaus",
        "article": "Article",
        "newwindow": "(dobrís una fenèstra novèla)",
        "searcharticle": "Consultar",
        "history": "Istoric",
        "history_short": "Istoric",
+       "history_small": "istoric",
        "updatedmarker": "modificat dempuèi ma darrièra visita",
        "printableversion": "Version imprimibla",
        "permalink": "Ligam istoric",
        "edit": "Modificar",
        "edit-local": "Modificar la descripcion locala",
        "create": "Crear",
-       "create-local": "apondre una descripcion locala",
+       "create-local": "Apondre una descripcion locala",
        "editthispage": "Modificar aquesta pagina",
        "create-this-page": "Crear aquesta pagina",
        "delete": "Suprimir",
        "views": "Afichatges",
        "toolbox": "Aisinas",
        "tool-link-userrights": "Modificar los gropes de {{GENDER:$1|l’utilizaire|l’utilizaira}}",
+       "tool-link-userrights-readonly": "Veire los {{GENDER:$1|gropes utilizaire}}",
        "tool-link-emailuser": "Mandar un corrièr electronic a {{GENDER:$1|l’utilizaire|l’utilizaira}}",
        "userpage": "Pagina d'utilizaire",
        "projectpage": "Pagina meta",
        "currentevents-url": "Project:Actualitats",
        "disclaimers": "Avertiments",
        "disclaimerpage": "Project:Avertiments generals",
-       "edithelp": "Ajuda",
+       "edithelp": "Ajuda per l'edicion",
        "helppage-top-gethelp": "Ajuda",
        "mainpage": "Acuèlh",
        "mainpage-description": "Acuèlh",
        "internalerror_info": "Error intèrna: $1",
        "internalerror-fatal-exception": "Error fatala de tipe \"$1\"",
        "filecopyerror": "Impossible de copiar lo fichièr « $1 » cap a « $2 ».",
-       "filerenameerror": "Impossible de tornar nomenar lo fichièr « $1 » en « $2 ».",
+       "filerenameerror": "Impossible de renomenar lo fichièr « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de suprimir lo fichièr « $1 ».",
        "directorycreateerror": "Impossible de crear lo dorsièr « $1 ».",
        "directoryreadonlyerror": "Lo repertòri « $1 » es en lectura sola.",
        "no-null-revision": "Impossible de crear una novèla revision voida per la pagina « $1 »",
        "badtitle": "Títol marrit",
        "badtitletext": "Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.",
+       "title-invalid-talk-namespace": "Lo títol de la pagina demandada fa referéncia a una pagina de discussion que pòt pas existir.",
+       "title-invalid-characters": "Lo títol  de la pagina demandada conten de caractèrs invalids : « $1 ».",
        "perfcached": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
        "perfcachedts": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
        "querypage-no-updates": "Las mesas a jorn per aquesta pagina son actualamnt desactivadas. Las donadas çaijós son pas mesas a jorn.",
        "viewyourtext": "Podètz veire e copiar lo contengut de <strong>vòstras modificacions</strong> a aquesta pagina.",
        "protectedinterface": "Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.\nPer apondre o modificar de traduccions sus totes los wikis, utilizatz [https://translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.",
        "editinginterface": "<strong>Atencion :<strong> sètz a mand de modificar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial.\nLos cambiaments sus aquesta pagina se repercutaràn sus l'aparéncia de l'interfàcia d'utilizaire pels autres utilizaires d'aqueste wiki.",
-       "cascadeprotected": "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :\n$2",
+       "cascadeprotected": "Aquesta pagina es protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :\n$2",
        "namespaceprotected": "Avètz pas la permission de modificar las paginas de l’espaci de noms « '''$1''' ».",
        "customcssprotected": "Avètz pas la permission d'editar aquesta pagina CSS perque conten de preferéncias d’autres utilizaires.",
        "customjsprotected": "Avètz pas la permission d'editar aquesta pagina JavaScript perque conten de preferéncias d’autres utilizaires.",
        "myprivateinfoprotected": "Avètz pas los dreits per modificar vòstras informacions personalas.",
        "mypreferencesprotected": "Avètz pas los dreits per modificar vòstras preferéncias.",
        "ns-specialprotected": "Las paginas dins l’espaci de noms « {{ns:special}} » pòdon pas èsser modificadas",
-       "titleprotected": "Aqueste títol es estat protegit a la creacion per [[User:$1|$1]].\nLo motiu avançat es <em>$2</em>.",
+       "titleprotected": "Aqueste títol es estat protegit contra tota creacion per [[User:$1|$1]].\nLo motiu avançat es <em>$2</em>.",
        "filereadonlyerror": "Impossible de modificar lo fichièr « $1 » perque lo repertòri de fichièrs « $2 » es en lectura sola.\n\nL'administrator del sistèma que l'a verrolhat a provesit aqueste motiu : « $3 ».",
        "invalidtitle-knownnamespace": "Títol invalid amb l'espaci de noms « $2 » e l'intitulat « $3 »",
        "invalidtitle-unknownnamespace": "Títol invalid amb lo numèro d'espaci de noms $1 e l'intitulat « $2 » desconeguts",
        "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",
        "createacct-submit": "Creatz vòstre compte",
        "createacct-another-submit": "Crear un compte",
        "createacct-continue-submit": "Contunhar la creacion de compte",
        "nocookiesnew": "Lo compte d'utilizaire es estat creat, mas sètz pas connectat. {{SITENAME}} utiliza de cookies per la connexion mas los avètz desactivats. Activatz-los e reconnectatz-vos amb lo meteis nom e lo meteis senhal.",
        "nocookieslogin": "{{SITENAME}} utiliza de cookies per la connexion mas avètz los cookies desactivats. Activatz-los e reconnectatz-vos.",
        "nocookiesfornew": "Lo compte d'utilizaire es pas estat creat, perque avèm pas pogut identificar son origina.\nVerificatz qu'avètz activat los cookies, recargatz la pagina e tornatz ensajar.",
+       "createacct-loginerror": "Lo compte es estat creat corrèctament mas vos podètz pas connectar automaticament. [[Special:UserLogin|Connectatz-vos manualament]].",
        "noname": "Avètz pas picat de nom d'utilizaire valid.",
        "loginsuccesstitle": "Connectat",
-       "loginsuccess": "Sètz actualament connectat(ada) sus {{SITENAME}} en tant que « $1 ».",
+       "loginsuccess": "<strong>Sètz actualament connect{{GENDER:$1||at|ada}} a {{SITENAME}} en tant que « $1 ».</strong>",
        "nosuchuser": "L'utilizaire « $1 » existís pas.\nLo nom d'utilizaire es sensible a la cassa.\nVerificatz vòstra ortografia, o [[Special:CreateAccount|creatz-vos un compte novèl]].",
        "nosuchusershort": "I a pas de contributor amb lo nom « $1 ». Verificatz l’ortografia.",
        "nouserspecified": "Vos cal especificar vòstre nom d'utilizaire.",
        "noemail": "Cap d'adreça electronica es pas estada enregistrada per l'utilizaire « $1 ».",
        "noemailcreate": "Vos cal provesir una adreça de corrièl valida",
        "passwordsent": "Un senhal novèl es estat mandat a l'adreça electronica de l'utilizaire « $1 ».\nIdentificatz-vos tre que l'aurètz recebut.",
-       "blocked-mailpassword": "Vòstra adreça IP es blocada en edicion, la foncion de rapèl del senhal es doncas desactivada per evitar los abuses.",
+       "blocked-mailpassword": "Vòstra adreça IP es blocada en edicion. Per evitar los abuses, es pas autorizat d'utilizar la recuperacion de senhal a partir d'aquesta adreça IP.",
        "eauthentsent": "Un corrièr de confirmacion es estat mandat a l’adreça indicada.\nAbans qu’un autre corrièr sià mandat a aqueste compte, vos caldrà seguir las instruccions donadas dins lo messatge per confirmar que lo compte es plan vòstre.",
        "throttled-mailpassword": "Un corrièr electronic de reïnicializacion de vòstre senhal es ja estat mandat durant {{PLURAL:$1|la darrièra ora|las $1 darrièras oras}}. Per evitar los abuses, un sol corrièr de reïnicializacion de vòstre senhal serà pas mandat per {{PLURAL:$1|ora|interval de $1 oras}}.",
        "mailerror": "Error en mandant lo corrièr electronic : $1",
-       "acct_creation_throttle_hit": "De visitors d'aqueste wiki qu'utilizan vòstra adreça IP an creat $1 {{PLURAL:$1|compte|comptes}} lo jorn darrièr, aquò es lo limit maximum autorizat pendent aqueste periòde.\nAtal los visitors qu'utilizan aquesta adreça IP pòdon pas crear mai de compte novèl pel moment.",
+       "acct_creation_throttle_hit": "Los visitors d'aqueste wiki qu'utilizan vòstra adreça IP an creat {{PLURAL:$1|compte|comptes}} durant las darrièras $2, aquò es lo limit maximum autorizat pendent aqueste periòde.\nEn consequéncia, la creacion de compte pels visitors qu'utilizan aquesta adreça IP es temporàriament suspenduda.",
        "emailauthenticated": "Vòstra adreça de corrièr electronic es estada confirmada lo $2 a $3.",
        "emailnotauthenticated": "Vòstra adreça de corrièr electronic es pas encara confirmada. Cap de corrièr serà pas mandat per caduna de las foncions seguentas.",
        "noemailprefs": "Cap d'adreça electronica es pas estada indicada, las foncions seguentas seràn pas disponiblas.",
        "changepassword-success": "Vòstre senhal es estat modificat !",
        "changepassword-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
        "botpasswords": "Senhals de robòts",
+       "botpasswords-disabled": "Los senhals robòts son desactivats.",
+       "botpasswords-no-central-id": "Per utilizar los senhals de robòts, vos cal èsser connectat a un compte centralizat.",
+       "botpasswords-existing": "Senhals de robòts existents",
+       "botpasswords-createnew": "Crear un novèl senhal de robòts",
+       "botpasswords-editexisting": "Modificar un senhal de robòts existent",
        "botpasswords-label-appid": "Nom del robòt :",
        "botpasswords-label-create": "Crear",
        "botpasswords-label-update": "Metre a jorn",
        "botpasswords-label-grants": "Dreits aplicables :",
        "botpasswords-label-grants-column": "Acordat",
        "botpasswords-bad-appid": "Lo nom del robòt «$1» es pas valid.",
+       "botpasswords-insert-failed": "Fracàs de l’apondon del nom de robòt « $1 ». Es ja estat apondut ?",
+       "botpasswords-created-title": "Senhal de robòts creat",
+       "botpasswords-created-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat creat.",
+       "botpasswords-updated-title": "Senhal de robòts mes a jorn",
+       "botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat mes a jorn.",
+       "botpasswords-deleted-title": "Senhal de robòts suprimit",
+       "botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat suprimit.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible.",
        "resetpass_forbidden": "Los senhals pòdon pas èsser cambiats",
+       "resetpass_forbidden-reason": "Los senhaus pòdon pas èsser cambiats : $1",
        "resetpass-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "resetpass-submit-loggedin": "Modificar lo senhal",
        "resetpass-submit-cancel": "Anullar",
        "passwordreset-emaildisabled": "Las foncionalitats e-mail son estadas desactivadas sus aqueste wiki.",
        "passwordreset-username": "Nom d'utilizaire :",
        "passwordreset-domain": "Domeni:",
-       "passwordreset-capture": "Veire lo corrièl resultant ?",
-       "passwordreset-capture-help": "Se marcatz aquesta casa, lo corrièr electronic (amb lo senhal temporari) vos serà afichat al meteis temps que serà mandat a l'utilizaire.",
        "passwordreset-email": "Adreça de corrièr electronic :",
        "passwordreset-emailtitle": "Detailhs d'un compte per {{SITENAME}}",
        "passwordreset-emailtext-ip": "Qualqu'un (probablament vos, dempuèi l'adreça IP $1) a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que volètz pas mai lo modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
        "passwordreset-emailtext-user": "L'utilizaire $1 sus {{SITENAME}} a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que lo volètz pas mai modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
        "passwordreset-emailelement": "Utilizaire: \n$1\n\nSenhal temporari: \n$2",
-       "passwordreset-emailsentemail": "Un corrièr electronic de reïnicializacion de senhal es estat mandat.",
+       "passwordreset-emailsentemail": "Se aquesta adreça de corrièl es associada a vòstre compte, alara un corrièl de reïnicializacion de senhal serà mandat.",
+       "passwordreset-emailsentusername": "Se i a una adreça de corrièr electronic associada a aqueste nom d’utilizaire, alara un corrièl de reïnicializacion senhal serà mandat.",
+       "passwordreset-nosuchcaller": "L’apelant existís pas : $1",
+       "passwordreset-invalidemail": "Adreça de corrièr electronic invalida",
        "changeemail": "Cambiar o suprimir l'adreça electronica",
-       "changeemail-header": "Cambiar l'adreça electronica del compte",
+       "changeemail-header": "Completatz aqueste formulari per modificar vòstra adreça de corrièl. Se volètz suprimir l’associacion d’una adreça de corrièl amb vòstre compte, daissatz la novèla adreça de corrièl voida al moment de la somission del formulari.",
        "changeemail-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "changeemail-oldemail": "Adreça electronica actuala:",
        "changeemail-newemail": "Novela adreça electronica:",
        "changeemail-none": "(pas cap)",
        "changeemail-password": "Vòstre senhal sus {{SITENAME}} :",
-       "changeemail-submit": "Cambiar l'adreça electronica:",
+       "changeemail-submit": "Cambiar l'adreça electronica :",
        "changeemail-throttled": "Avètz fait tròp de temptativas de connexion.\nEsperatz $1 abans d’ensajar tornarmai.",
        "resettokens": "Reïnicializar los getons",
        "resettokens-text": "Aici, podètz reïnicializar los getons que permeton d’accedir a d'unas donadas privadas associadas a vòstre compte.\n\nLo vos caldriá far se las avètz partejats accidentalament amb qualqu'un o se vòstre compte es estat compromés.",
        "accmailtext": "Un senhal generat aleatòriament per [[User talk:$1|$1]] es estat mandat a $2.\nLo senhal per aqueste compte novèl pòt èsser cambiat sus la pagina ''[[Special:ChangePassword|Cambiament de senhal]]'' aprèp connexion.",
        "newarticle": "(Novèl)",
        "newarticletext": "Avètz seguit un ligam cap a una pagina qu’existís pas encara o qu'es estada [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} escafada].\nPer crear aquesta pagina, picatz vòstre tèxte dins la bóstia çaijós (podètz consultar [$1 la pagina d’ajuda] per mai d’entresenhas).\nSe sètz arribat(ada) aicí per error, clicatz sul boton '''retorn''' de vòstre navigador.",
-       "anontalkpagetext": "---- ''Sètz sus la pagina de discussion d'un utilizaire anonim qu'a pas encara creat un compte o que n'utiliza pas.\nPer aquesta rason, devèm utilizar son adreça IP per l'identificar. Una adreça d'aqueste tipe pòt èsser partejada entre mantun utilizaire. Se sètz un utilizaire anonim e se constatatz que de comentaris que vos concernisson pas vos son estats adreçats, podètz [[Special:CreateAccount|crear un compte]] o [[Special:UserLogin|vos connectar]] per evitar tota confusion venenta amb d’autres contributors anonims.''",
+       "anontalkpagetext": "----\n<em>Sètz sus la pagina de discussion d'un utilizaire anonim qu'a pas encara creat un compte o que n'utiliza pas<em>.\nPer aquesta rason, nos cal utilizar son adreça IP per l'identificar.\nUna adreça d'aqueste tipe pòt èsser partejada entre mantun utilizaire.\nSe sètz un{{GENDER:||a|}} utilizair{{GENDER:|e|a|e}} anonim{{GENDER:||a|}} e se constatatz que de comentaris que vos concernisson pas vos son estats adreçats, podètz [[Special:CreateAccount|crear un compte]] o [[Special:UserLogin|vos connectar]] per evitar tota confusion venenta amb d’autres contributors anonims.",
        "noarticletext": "Pel moment, i a pas cap de tèxte sus aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|aviar una recèrca sul títol d'aqueste títol de pagina]] dins las autras pagina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins las operacions ligadas],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.",
        "noarticletext-nopermission": "Actualament i a pas cap de tèxte dins aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|far una recèrca sul títol de la pagina]] dins las autras paginas,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins los jornals associats]</span>.",
        "missing-revision": "La revision n° $1 de la pagina intitulada « {{FULLPAGENAME}} » existís pas.\n\nAquò se produtz en general en seguent un ligam istoric obsolèt cap a una pagina qu'es estada suprimida.\nPodètz trobar mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "userpage-userdoesnotexist": "Lo compte d'utilizaire « <nowiki>$1</nowiki> » es pas enregistrat. Indicatz se volètz crear o editar aquesta pagina.",
        "userpage-userdoesnotexist-view": "Lo compte d'utilizaire « $1 » es pas enregistrat.",
        "blocked-notice-logextract": "Aqueste utilizaire es actualament blocat.\nLa darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
-       "clearyourcache": "'''Nòta :''' Aprèp aver enregistrat vòstras modificacions, es possible que vos calga forçar lo recargament complet de l'escondedor de vòstre navigador per veire los cambiaments : \n*'''Firefox / Safari :''' mantenètz la tòca ''Majuscula'' (''Shift'') en clicant lo boton ''Actualizar'' (''Reload,'') o quichatz sus ''Ctrl-F5'' o ''Ctrl-R''  (''⌘-R'' sus un Mac)\n* '''Google Chrome:''' Quichatz sus ''Ctrl-Shift-R'' (''⌘-Shift-R'' sus un Mac) \n* '''Internet Explorer:''' Mantenètz la tòca ''Ctrl'' en clicant sul boton ''Actualizar'', o quichatz ''Ctrl-F5'' \n* '''Opera:''' Voidatz l'escondedor dins ''Aisinas → Preferéncias''",
+       "clearyourcache": "<strong>Nòta</strong>: Aprèp aver enregistrat vòstras modificacions, es possible que vos calga forçar lo recargament complet de l'escondedor de vòstre navigador per veire los cambiaments : \n* <strong>Firefox / Safari :</strong> mantenètz la tòca <em>Maj</em> (<em>Shift</em>) en clicant lo boton <em>Actualizar</em> o quichatz sus <em>Ctrl-F5</em> o <em>Ctrl-R</em>  (<em>⌘-R</em> sus un Mac)\n* <strong>Google Chrome :</strong> Quichatz sus <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> sus un Mac) \n* <strong>Internet Explorer :</strong> Mantenètz la tòca <em>Ctrl</em> en clicant sul boton <em>Actualizar</em>, o quichatz <em>Ctrl-F5</em> \n* <strong>Opera :</strong> anatz dins <em>Menú → Settings</em> (<em>Opera → Preferéncias</em> sus un Mac) e puèi a <em>Confidencialitat & seguretat → Escafar las donadas d’exploracion → Imatges e fichièrs en cache</em>.",
        "usercssyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
        "userjsyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
        "usercsspreview": "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''\n'''Es pas estada encara enregistrada !'''",
        "permissionserrorstext": "Avètz pas la permission d’efectuar l’operacion demandada per {{PLURAL:$1|la rason seguenta|las rasons seguentas}} :",
        "permissionserrorstext-withaction": "Sètz pas autorizat(ada) a $2, per {{PLURAL:$1|la rason seguenta|las rasons seguentas}} :",
        "recreate-moveddeleted-warn": "'''Atencion : sètz a tornar crear una pagina qu'es estada suprimida precedentament.'''\n\nDemandatz-vos s'es vertadièrament apropriat de contunhar de l’editar.\nL’istoric de las supressions e dels cambiaments de nom es afichat çaijós :",
-       "moveddeleted-notice": "Aquesta pagina es estat suprimida.\nL'istoric de las supressions e dels cambiaments de nom es afichat çaijós coma referéncia.",
+       "moveddeleted-notice": "Aquesta pagina es estada suprimida.\nL'istoric de las supressions e dels cambiaments de nom es afichat çaijós coma referéncia.",
        "log-fulllog": "Veire lo jornal complet",
        "edit-hook-aborted": "Modificacion fracassada per croquet.\nCap d'explicacion pas balhada.",
        "edit-gone-missing": "A pas pogut metre a jorn la pagina.\nSembla que siá estada suprimida.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objècte void",
        "content-json-empty-array": "Tablèu void",
+       "duplicate-args-category": "Paginas utilizant d'arguments duplicats dins los apèls de modèl",
        "expensive-parserfunction-warning": "Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.\n\nI deurià aver mens de {{PLURAL:$2|ampèl|ampèls}}, e actualament {{PLURAL:$1|i a $1 ampèl|i a $1 ampèls}}..",
        "expensive-parserfunction-category": "Paginas amb tròp d’apèls dispendioses de foncions parsaires",
        "post-expand-template-inclusion-warning": "Atencion : Aquesta pagina conten tròp d'inclusions de modèls.\nD'unas inclusions seràn pas efectuadas.",
        "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|es estada fusionada|son estada fusionadas}} dins [[:$2]].",
        "mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
        "mergehistory-fail-bad-timestamp": "L’orodatatge es pas valid.",
+       "mergehistory-fail-invalid-source": "La pagina font es pas valida.",
+       "mergehistory-fail-invalid-dest": "La pagina de destinacion es invalida",
        "mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
        "mergehistory-no-source": "La pagina d'origina $1 existís pas.",
        "mergehistory-no-destination": "La pagina de destinacion $1 existís pas.",
        "search-interwiki-caption": "Projèctes fraires",
        "search-interwiki-default": "Resultats de $1 :",
        "search-interwiki-more": "(mai)",
+       "search-interwiki-more-results": "mai de resultats",
        "search-relatedarticle": "Relatat",
        "searchrelated": "relatat",
        "searchall": "Totes",
        "showingresultsinrange": "Afichar çaijós fins a {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultats}} dins la seria #<strong>$2</strong> a #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> demest <strong>$3</strong>|Resultats <strong>$1 a $2</strong> demest <strong>$3</strong>}}",
        "search-nonefound": "I a pas cap de resultat correspondent a la requèsta.",
+       "search-nonefound-thiswiki": "I a pas de resultats que correspondon a la requèsta sus aqueste site.",
        "powersearch-legend": "Recèrca avançada",
        "powersearch-ns": "Recercar dins los espacis de nom :",
        "powersearch-togglelabel": "Marcar :",
        "saveprefs": "Enregistrar las preferéncias",
        "restoreprefs": "Restablir totes los paramètres per defaut (dins totas las seccions)",
        "prefs-editing": "Fenèstra de modificacion",
-       "rows": "Rengadas :",
-       "columns": "Colomnas :",
        "searchresultshead": "Recèrca",
        "stub-threshold": "Limit pel formatatge dels ligams d’esbòs ($1) :",
+       "stub-threshold-sample-link": "exemple",
        "stub-threshold-disabled": "Desactivat",
        "recentchangesdays": "Nombre de jorns d'afichar dins los darrièrs cambiaments :",
        "recentchangesdays-max": "(maximum $1 {{PLURAL:$1|jorn|jorns}})",
        "prefs-help-recentchangescount": "Aquò inclutz las modificacions recentas, las paginas d’istorics e los jornals.",
        "prefs-help-watchlist-token2": "Aquí la clau secreta del flux Web de vòstra lista de seguiment.\nTota persona que la coneis poirà legir vòstra lista de seguiment, doncas, la comuniquetz pas.\n[[Special:ResetTokens|Clicatz aicí se la vos cal reïnicializar]].",
        "savedprefs": "Las preferéncias son estadas salvadas.",
+       "savedrights": "Los dreits d'utilizaire de {{GENDER:$1|$1}} son estats enregistrats.",
        "timezonelegend": "Fus orari :",
        "localtime": "Ora locala :",
        "timezoneuseserverdefault": "Utilizar la valor del servidor ($1)",
        "youremail": "Adreça de corrièr electronic :",
        "username": "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre|Membra}} {{PLURAL:$1|del grop|dels gropes}}:",
+       "group-membership-link-with-expiry": "$1 (fins a $2)",
        "prefs-registration": "Data de creacion del compte :",
        "yourrealname": "Nom vertadièr :",
        "yourlanguage": "Lenga de l'interfàcia :",
        "badsig": "Signatura bruta incorrècta, verificatz vòstras balisas HTML.",
        "badsiglength": "Vòstra signatura es tròp longa.\nDeu aver, al maximum $1 caractèr{{PLURAL:$1||s}}.",
        "yourgender": "Cossí vos agrada mai d'èsser descrit ?",
-       "gender-unknown": "M'agrada mai sens detalh",
+       "gender-unknown": "Quand farà mencion de vos, lo logicial utilizarà de mots de genre neutre, quand serà possible",
        "gender-male": "Modifica de pagina del wiki",
        "gender-female": "Modifica de paginas del wiki",
        "prefs-help-gender": "Definir aquesta preferéncia es facultatiu.\nAqueste logicial utiliza sa valor per s’adreçar a vos e vos mencionar als autres en utilizant lo bon genre gramatical.\nAquesta informacion serà publica.",
        "email": "Corrièr electronic",
        "prefs-help-realname": "Lo nom vertadièr es facultatiu.\nSe l'especificatz, serà utilizat per vos atribuir vòstras contribucions.",
        "prefs-help-email": "L’adreça de corrièr electronic es facultativa mas vos permet de reçaupre lo senhal se lo doblidatz.\nTanben podètz causir de permetre a d’autres de vos contactar per vòstra pagina d’utilizaire o la de discussion sens sofracha de desvelar vòstra idenditat.",
-       "prefs-help-email-others": "Tanben podètz causir de daissar los autres vos contactar sus vòstra pagina de discussion d'utilizaire sens que siá necessari de revelar vòstra identitat.",
+       "prefs-help-email-others": "Tanben podètz causir de daissar los autres vos contactar per corrièl via un ligam sus vòstra pagina de discussion d'utilizaire o pagina d'utilizaire.\nVòstra adreça de corrièr electronic es pas revelada quand los utilizaires vos contactan.",
        "prefs-help-email-required": "Una adreça de corrièr electronic es requesa.",
        "prefs-info": "Informacion de basa",
        "prefs-i18n": "Internationalizacion",
        "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-lookup-user": "Gestion dels dreits d'utilizaire",
+       "userrights-lookup-user": "Seleccionar un utilizaire",
        "userrights-user-editname": "Entrar un nom d’utilizaire :",
-       "editusergroup": "Modificacion dels gropes d’{{GENDER:$1|utilizaires}}",
+       "editusergroup": "Cargar de gropes d’utilizaires",
        "editinguser": "Modificacion dels dreits de l’{{GENDER:$1|utilizaire|utilizaira}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar los gropes de l’utilizaire",
+       "userrights-editusergroup": "Modificar los gropes de l'utilizai{{GENDER:$1|e|a}}",
+       "userrights-viewusergroup": "Afichar los gropes de l'utilizair{{GENDER:$1|e|a}}",
        "saveusergroups": "Enregistrar los gropes de l’{{GENDER:$1|utilizaire|utilizaira}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicit de :",
-       "userrights-groups-help": "Podètz modificar los gropes alsquals aparten aqueste utilizaire.\n* Una casa marcada significa que l'utilizaire se tròba dins aqueste grop.\n* Una casa pas marcada significa, al contrari, que s’i tròba pas.\n* Una * indica que podretz pas levar aqueste grop un còp que l'auretz apondut e vice-versa.",
+       "userrights-groups-help": "Podètz modificar los gropes als quals aparten {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}.\n* Una casa marcada significa que l'utilizair{{GENDER:$1|e|a}} se tròba dins aqueste grop.\n* Una casa pas marcada significa, al contrari, que s’i tròba pas.\n* Un asterisc * indica que podètz pas levar aqueste grop un còp que l'avètz apondut e vice-versa.\n* Un dièsi (#) indica que podètz que ralongar lo delai d'expiracion del grop e non pas l'acorchir.",
        "userrights-reason": "Motiu :",
        "userrights-no-interwiki": "Sètz pas abilitat per modificar los dreits dels utilizaires sus d'autres wikis.",
        "userrights-nodatabase": "La basa de donadas « $1 » existís pas o es pas en local.",
-       "userrights-nologin": "Vos cal [[Special:UserLogin|vos connectar]] amb un compte d'administrator per balhar los dreits d'utilizaire.",
-       "userrights-notallowed": "Avètz pas la permission d'apondre o suprimir de dreits d'utilizaire.",
        "userrights-changeable-col": "Los gropes que podètz cambiar",
        "userrights-unchangeable-col": "Los gropes que podètz pas cambiar",
+       "userrights-expiry-current": "Expira lo $1",
+       "userrights-expiry-none": "Expira pas",
+       "userrights-expiry": "Data d’expiracion :",
+       "userrights-expiry-existing": "Data d'expiracion existenta : $2 à $3",
+       "userrights-expiry-othertime": "Autre temps :",
+       "userrights-expiry-options": "1 jorn:1 day,1 setmana:1 week,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 an:1 year",
        "userrights-conflict": "Conflicte de modificacion de dreits d'utilizaire ! Relegissètz e confirmatz vòstras modificacions.",
-       "userrights-removed-self": "Avètz suprimit vòstres pròpris dreits. Del còp, podètz pas mai accedir a aquesta pagina.",
        "group": "Grop :",
        "group-user": "Utilizaires",
        "group-autoconfirmed": "Utilizaires enregistrats",
        "right-minoredit": "Marcar de cambiaments coma menors",
        "right-move": "Renomenar de paginas",
        "right-move-subpages": "Desplaçar de paginas amb lor sospaginas",
-       "right-move-rootuserpages": "Tornar nomenar las paginas de l’utilizaire de banca.",
+       "right-move-rootuserpages": "Renomenar la pagina principala d’un utilizaire",
        "right-move-categorypages": "Renomenar de paginas de categoria",
        "right-movefile": "Desplaçar los fichièrs",
        "right-suppressredirect": "Crear pas de redireccion dempuèi la pagina anciana en renomenant la pagina",
        "right-siteadmin": "Verrolhar e desverrolhar la basa de donadas",
        "right-override-export-depth": "Exportar las paginas en incluent las paginas ligadas fins a una prigondor de 5 nivèls",
        "right-sendemail": "Mandar un corrièl als autres utilizaires",
-       "right-passwordreset": "Veire los corrièrs electronics de reïnicializacion dels senhals",
        "right-applychangetags": "Aplicar [[Special:Tags|las balisas]] amb sas pròprias modificacions",
        "grant-generic": "ensemble de dreits « $1 »",
+       "grant-group-page-interaction": "Interagir amb de paginas",
+       "grant-group-file-interaction": "Interagir amb de mèdias",
+       "grant-group-watchlist-interaction": "Interagir amb vòstra lista de seguiment",
+       "grant-group-email": "Mandar un corrièr electronic",
+       "grant-group-customization": "Personalizacion e preferéncias",
+       "grant-group-administration": "Efectuar d'accions administrativas",
+       "grant-group-private-information": "Accedir a vòstras donadas privadas",
+       "grant-group-other": "Activitats divèrsas",
        "grant-blockusers": "Blocar e desblocar d'utilizaires",
+       "grant-createaccount": "Crear de comptes",
+       "grant-createeditmovepage": "Crear, modificar e desplaçar de paginas",
+       "grant-editmyoptions": "Modificar vòstras preferéncias d'utilizaire",
+       "grant-editpage": "Modificar de paginas existentas",
+       "grant-editprotected": "Modificar de paginas protegidas",
        "grant-patrol": "Verificar las modificacions de paginas",
+       "grant-privateinfo": "Accedir a las informacions privadas",
+       "grant-sendemail": "Mandar de corriers electronics als autres utilizaires",
+       "grant-uploadeditmovefile": "Telecargar, remplaçar e renomenar de fichièrs",
+       "grant-uploadfile": "Importar de fichièrs novèls",
+       "grant-basic": "Dreits de basa",
+       "grant-viewdeleted": "Afichar los fichièrs e paginas suprimits",
+       "grant-viewmywatchlist": "Afichar vòstra lista de seguiment",
        "newuserlogpage": "Istoric de las creacions de comptes",
        "newuserlogpagetext": "Jornal de las creacions de comptes d'utilizaires.",
        "rightslog": "Istoric de las modificacions d'estatut",
        "action-history": "afichar l’istoric d'aquesta pagina",
        "action-minoredit": "marcar aqueste cambiament coma menor",
        "action-move": "renomenar aquesta pagina",
-       "action-move-subpages": "tornar nomenar aquesta pagina e sas sospaginas",
+       "action-move-subpages": "renomenar aquesta pagina e sas sospaginas",
        "action-move-rootuserpages": "renomenar las paginas de l’utilizaire de basa.",
        "action-move-categorypages": "Renomenar de paginas de categoria",
        "action-movefile": "renomenar aqueste fichièr",
        "action-upload_by_url": "importar aqueste fichièr a partir d’una adreça internet",
        "action-writeapi": "utilizar l‘API d’escritura",
        "action-delete": "suprimir aquesta pagina",
-       "action-deleterevision": "suprimir aquesta version",
-       "action-deletedhistory": "veire l’istoric suprimit d'aquesta pagina",
+       "action-deleterevision": "suprimir las revisions",
+       "action-deletelogentry": "suprimir las entradas del jornal",
+       "action-deletedhistory": "veire l’istoric suprimit d'una pagina",
        "action-browsearchive": "recercar de paginas suprimidas",
-       "action-undelete": "restablir aquesta pagina",
-       "action-suppressrevision": "tornar veire e restablir aquesta version suprimida",
+       "action-undelete": "restablir de paginas",
+       "action-suppressrevision": "visionar e restablir de revisions suprimidas",
        "action-suppressionlog": "veire aqueste jornal privat",
        "action-block": "blocar aqueste utilizaire a l’edicion",
        "action-protect": "modificar los nivèls de proteccion per aquesta pagina",
        "action-userrights-interwiki": "modificar los dreits d’utilizaire e los sus d’autres wikis",
        "action-siteadmin": "verrolhar o desverrolhar la basa de donadas",
        "action-sendemail": "mandar corrièrs electronics",
+       "action-editmyoptions": "modificar vòstras preferéncias",
        "action-editmywatchlist": "modificar vòstra lista de seguiment",
        "action-viewmywatchlist": "afichar vòstra pròpria lista de seguiment",
        "action-viewmyprivateinfo": "veire vòstras informacions personalas",
        "action-editmyprivateinfo": "modificar vòstras informacions personalas",
+       "action-purge": "purgar aquesta pagina",
        "nchanges": "$1 {{PLURAL:$1|cambiament|cambiaments}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dempuèi la darrièra visita}}",
        "enhancedrc-history": "istoric",
        "recentchanges-label-plusminus": "La talha de la pagina a cambiat d'aqueste nombre d’octets.",
        "recentchanges-legend-heading": "<strong>Legenda :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
+       "recentchanges-submit": "Afichar",
+       "rcfilters-activefilters": "Filtres actius",
+       "rcfilters-invalid-filter": "Filtre pas valid",
+       "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-noresults": "Cap de filtre pas trobat",
+       "rcfilters-filtergroup-registration": "Inscripcion de l'utilizaire",
+       "rcfilters-filter-registered-label": "Enregistrat",
+       "rcfilters-filter-registered-description": "Editors connectats.",
+       "rcfilters-filter-unregistered-label": "Desinscrit",
+       "rcfilters-filter-unregistered-description": "Editors que son pas connectats.",
+       "rcfilters-filtergroup-authorship": "Modificar la paternitat",
+       "rcfilters-filter-editsbyself-label": "Vòstras pròprias modificacions",
+       "rcfilters-filter-editsbyself-description": "Vòstras modificacions.",
+       "rcfilters-filter-editsbyother-label": "Modificacions per d’autres.",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novèls arribants",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprenents",
+       "rcfilters-filter-userExpLevel-experienced-label": "Utilizaires experimentats",
+       "rcfilters-filtergroup-automated": "Contribucions automatizadas",
+       "rcfilters-filter-bots-label": "Robòt",
+       "rcfilters-filter-humans-label": "Èsser uman (pas robòt)",
+       "rcfilters-filter-humans-description": "Modificacions faitas per d'editors umans.",
+       "rcfilters-filtergroup-significance": "Significacion",
+       "rcfilters-filter-minor-label": "Cambiaments menors",
+       "rcfilters-filter-minor-description": "Modificacions que l'autor a marcadas coma menoras.",
+       "rcfilters-filter-major-label": "Modificacions pas menoras",
+       "rcfilters-filter-major-description": "Modificacions pas marcadas coma menoras.",
+       "rcfilters-filtergroup-changetype": "Tipe de cambiament",
+       "rcfilters-filter-pageedits-label": "Modificacions de pagina",
+       "rcfilters-filter-pageedits-description": "Modificacions del contengut del wiki, de las discussions, de las descripcions de las categorias...",
+       "rcfilters-filter-newpages-label": "Creacions de pagina",
+       "rcfilters-filter-newpages-description": "Modificacions a l'origina de paginas novèlas.",
+       "rcfilters-filter-categorization-label": "Cambiaments de categoria",
+       "rcfilters-filter-logactions-label": "Accions traçadas",
+       "rcfilters-filter-logactions-description": "Accions dels administrators, creacions de comptes, supressions de paginas, telecargaments...",
        "rcnotefrom": "Çaijós {{PLURAL:$5|la modificacion efectuada|las modificacions efectuadas}} dempuèi lo <strong>$3, $4</strong> (afichadas fins a <strong>$1</strong>).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "rcshowhidemine": "$1 mas modificacions",
        "rcshowhidemine-show": "Afichar",
        "rcshowhidemine-hide": "Amagar",
+       "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.",
        "diff": "dif",
        "hist": "ist",
        "recentchangeslinked-summary": "Aquesta pagina especiala fa veire los darrièrs cambiaments sus las paginas que son ligadas. Las paginas de [[Special:Watchlist|vòstra lista de seguimznt]] son '''en gras'''.",
        "recentchangeslinked-page": "Nom de la pagina :",
        "recentchangeslinked-to": "Afichar los cambiaments cap a las paginas ligadas al luòc de la pagina donada",
+       "recentchanges-page-added-to-category": "[[:$1]] apondut a la categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] suprimit de la categoria",
+       "autochange-username": "Cambiament automatic de MediaWiki",
        "upload": "Importar un fichièr",
        "uploadbtn": "Importar un fichièr",
        "reuploaddesc": "Anullar lo cargament e tornar al formulari.",
        "file-thumbnail-no": "Lo nom del fichièr comença per <strong>$1</strong>.\nEs possible que s’agisca d’una version reducha ''(miniatura)''.\nSe dispausatz del fichièr en resolucion nauta, importatz-lo, si que non cambiatz lo nom del fichièr.",
        "fileexists-forbidden": "Un fichièr amb aqueste nom existís ja e pòt pas èsser espotit.\nSe volètz totjorn importar aquel fichièr, mercé de tornar en arrièr e d'utilizar un nom novèl. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Un fichièr amb lo meteis nom existís ja dins la basa de donadas comuna.\nS'o volètz importar tornamai, tornatz en rèire e importatz-lo jos un autre nom. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Lo fichièr telecargat es una còpia exacta de la version actuala de <strong>[[:$1]]</strong>",
+       "fileexists-duplicate-version": "Lo fichièr mandat es una còpia exacta {{PLURAL:$2|d'una version precedenta|de versions precedentas}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Aqueste fichièr es un doble {{PLURAL:$1|del fichièr seguent|dels fichièrs seguents}} :",
        "file-deleted-duplicate": "Un fichièr identic a aqueste ([[:$1]]) ja es estat suprimit. Vos caldriá verificar lo jornal de las supressions d'aqueste fichièr abans de la tornar telecargar.",
        "file-deleted-duplicate-notitle": "Un fichièr identic a aqueste fichièr es ja estat suprimit amai lo títol. \nVos caldriá demandar a qualqu'un la possibilitat de verificar lo jornal d'aqueste fichièr suprimit per tal d'examinar la situacion  abans de l'importar tornarmai.",
        "uploaddisabledtext": "L'impòrt de fichièrs cap al servidor es desactivat.",
        "php-uploaddisabledtext": "Lo telecargament de fichièrs es estat desactivat dins PHP. Verificatz l'opcion de configuracion file_uploads.",
        "uploadscripted": "Aqueste fichièr conten de còdi HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
-       "uploadscriptednamespace": "Aqueste fichièr SVG conten un espaci de noms '$1' pas autorizat.",
+       "uploadscriptednamespace": "Aqueste fichièr SVG conten un espaci de noms '<nowiki>$1</nowiki>' pas autorizat.",
        "uploadinvalidxml": "Lo XML dins lo fichièr importat a pas pogut èsser analisat.",
        "uploadvirus": "Aqueste fichièr conten un virús ! Per mai de detalhs, consultatz : $1",
        "uploadjava": "Es un fichièr ZIP que conten un fichièr Java .class.\nLo telecargament de fichièrs Java es pas autorizat, perque pòdon contornar de restriccions de seguretat.",
        "upload-too-many-redirects": "L'URL conten tròp de redireccions",
        "upload-http-error": "Una error HTTP es intervenguda : $1",
        "upload-copy-upload-invalid-domain": "La còpia dels telecargaments es pas disponibla dempuèi aqueste domeni.",
+       "upload-dialog-title": "Mandar un fichièr",
+       "upload-dialog-button-cancel": "Anullar",
+       "upload-dialog-button-back": "Retorn",
+       "upload-dialog-button-done": "Acabat",
+       "upload-dialog-button-save": "Enregistrar",
+       "upload-dialog-button-upload": "Mandar",
+       "upload-form-label-infoform-title": "Detalhs",
+       "upload-form-label-infoform-name": "Nom",
+       "upload-form-label-infoform-description": "Descripcion",
+       "upload-form-label-usage-title": "Utilizacion",
+       "upload-form-label-usage-filename": "Nom del fichièr",
+       "upload-form-label-own-work": "Soi l'autor d'aquesta òbra",
+       "upload-form-label-infoform-categories": "Categorias",
+       "upload-form-label-infoform-date": "Data",
+       "upload-form-label-not-own-work-local-generic-local": "Tanben podètz ensajar [[Special:Upload|la pagina de telecargament per defaut]].",
+       "upload-form-label-own-work-message-generic-foreign": "Compreni que mandi aqueste fichièr cap a un depaus partejat. Confirmi qu'agissi en acòrd amb las condicions d'utilizacion e las règlas relativas a las licéncias en vigor.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Se sètz pas en capacitat de mandar aqueste fichièr segon las règlas d'aqueste depaus partejat, mercé de tampar aquesta bóstia de dialòg a d'ensajar un autre metòde.",
        "backend-fail-stream": "Impossible de legir lo fichièr $1.",
        "backend-fail-backup": "Impossible de salvar lo fichièr $1.",
        "backend-fail-notexists": "Lo fichièr $1 existís pas.",
        "zip-bad": "Lo fichièr es un archiu ZIP corromput o illegible.\nPòt pas èsser verificat corrèctament per la seguretat.",
        "zip-unsupported": "Lo fichièr es un archiu ZIP qu'utiliza de caracteristicas pas suportadas per MediaWiki. \nSa seguretat pòt pas èsser verificada corrèctament.",
        "uploadstash": "Cache d'impòrt",
+       "uploadstash-summary": "Aquesta pagina dona accès als fichièrs que son importats (o en cors d'importacion), mas son pas encara publicats dins lo wiki. Aqueles fichièrs son pas encara visibles, levat per l'utilizaire a l'origina de l'importacion.",
        "uploadstash-clear": "Escafar los fichièrs en cache",
        "uploadstash-nofiles": "Avètz pas de fichièrs en cache d'impòrt.",
        "uploadstash-errclear": "La supression dels fichièrs a fracassat.",
        "uploadstash-refresh": "Actualizar la lista dels fichièrs",
+       "uploadstash-thumbnail": "afichar una miniatura",
        "invalid-chunk-offset": "Offset de segment invalid",
        "img-auth-accessdenied": "Accès refusat",
        "img-auth-nopathinfo": "PATH_INFO mancant. Vòstre servidor es pas parametrat per passar aquesta informacion.\nBenlèu que fonciona en CGI e supòrta pas img_atuh. Consultatz https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "listfiles-delete": "suprimir",
        "listfiles-summary": "Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.",
        "listfiles_search_for": "Recèrca del mèdia nomenat :",
+       "listfiles-userdoesnotexist": "Lo compte d'utilizaire « $1 » es pas enregistrat.",
        "imgfile": "fichièr",
        "listfiles": "Lista dels imatges",
        "listfiles_thumb": "Apercebut",
        "uploadnewversion-linktext": "Importar una version novèla d'aqueste fichièr",
        "shared-repo-from": "de $1",
        "shared-repo": "un depaus partejat",
+       "shared-repo-name-wikimediacommons": "Wikimèdia Commons",
        "upload-disallowed-here": "Podètz pas remplaçar aqueste fichièr.",
        "filerevert": "Revocar $1",
        "filerevert-legend": "Revocar lo fichièr",
        "filerevert-submit": "Revocar",
        "filerevert-success": "'''[[Media:$1|$1]]''' es estat revocat fins a [$4 la version del $2 a $3].",
        "filerevert-badversion": "I a pas de version mai anciana del fichièr amb lo Timestamp donat.",
+       "filerevert-identical": "La version actuala del fichièr es ja identica a aquela qu'es seleccionada.",
        "filedelete": "Suprimir $1",
        "filedelete-legend": "Suprimir lo fichièr",
        "filedelete-intro": "Sètz a suprimir '''[[Media:$1|$1]]''' amb tot son istoric.",
        "withoutinterwiki-summary": "Las paginas seguentas an pas de ligams cap a las versions dins d'autras lengas.",
        "withoutinterwiki-legend": "Prefix",
        "withoutinterwiki-submit": "Afichar",
-       "fewestrevisions": "Articles mens modificats",
+       "fewestrevisions": "Paginas las mens modificadas",
        "nbytes": "$1 {{PLURAL:$1|octet|octets}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorias}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
        "unusedimages": "Imatges orfanèls",
        "wantedcategories": "Categorias mai demandadas",
        "wantedpages": "Paginas mai demandadas",
-       "wantedpages-summary": "Aquesta pagina compta totes los ligams, encluses los inserits via de modèls de navigacion. Per una lista dels articles mai demandats, vejatz articles mai demandats, que comptabiliza pas que las referéncias que provenon de l'espaci de nom dels articles. Vejatz tanben lo '''articles mai demandats'''.",
+       "wantedpages-summary": "Lista de las paginas inexistentas qu'an lo mai de ligams cap a elas, en excluent las paginas qu'an pas que de redireccions puntant cap a elas. Per aver una lista de las paginas inexistentas qu'an de redireccions puntant cap a elas, vejatz [[{{#special:BrokenRedirects}}|la lista de las redireccions copadas]].",
        "wantedpages-badtitle": "Títol invalid dins los resultats : $1",
        "wantedfiles": "Fichièrs desirats",
        "wantedfiletext-cat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fait, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>. Amai, las paginas qu'intègran de fichièrs qu'existisson pas son repertoriadas dins [[:$1]].",
        "mostlinked": "Paginas mai ligadas",
        "mostlinkedcategories": "Categorias mai utilizadas",
        "mostlinkedtemplates": "Paginas las mai inclusas",
-       "mostcategories": "Articles utilizant mai de categorias",
+       "mostcategories": "Articles utilizant lo mai de categorias",
        "mostimages": "Fichièrs mai utilizats",
        "mostinterwikis": "Paginas amb lo mai d'interwikis",
-       "mostrevisions": "Articles mai modificats",
+       "mostrevisions": "Paginas las mai modificadas",
        "prefixindex": "Totas las paginas que començan per…",
        "prefixindex-namespace": "Totas las paginas amb prefix (espaci de noms $1)",
+       "prefixindex-submit": "Afichar",
        "prefixindex-strip": "Levar lo prefix dins la lista",
        "shortpages": "Paginas brèvas",
        "longpages": "Paginas longas",
        "protectedpages-performer": "Proteccion de l’utilizaire",
        "protectedpages-params": "Paramètres de proteccion",
        "protectedpages-reason": "Motiu",
+       "protectedpages-submit": "Afichar las paginas",
        "protectedpages-unknown-timestamp": "Desconegut",
        "protectedpages-unknown-performer": "Utilizaire desconegut",
        "protectedtitles": "Títols protegits",
+       "protectedtitles-summary": "Aquò es una lista dels títols de pagina que son a l'ora d'ara protegits contra la creacion. Per una lista de las paginas existentas que son protegidas, veire [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Cap de títol es pas actualament protegit amb aquestes paramètres.",
+       "protectedtitles-submit": "Afichar los títols",
        "listusers": "Lista dels participants",
        "listusers-editsonly": "Far veire sonque los utilizaires qu'an al mens una contribucion",
        "listusers-creationsort": "Triar per data de creacion",
        "usereditcount": "$1 {{PLURAL:$1|cambiament|cambiaments}}",
        "usercreated": "{{GENDER:$3|Creat}} lo $1 a $2",
        "newpages": "Paginas novèlas",
+       "newpages-submit": "Afichar",
        "newpages-username": "Nom d'utilizaire :",
        "ancientpages": "Articles mai ancians",
        "move": "Renomenar",
        "apihelp-no-such-module": "Lo modul « $1 » es introbable.",
        "apisandbox": "Nauc de sabla API",
        "apisandbox-api-disabled": "API es desactivat sus aqueste site.",
+       "apisandbox-fullscreen": "Espandir lo panèl",
+       "apisandbox-unfullscreen": "Afichar la pagina",
        "apisandbox-submit": "Far la demanda",
        "apisandbox-reset": "Escafar",
+       "apisandbox-retry": "Ensajar tornarmai",
+       "apisandbox-load-error": "Una error s'es produita pendent lo cargament de las informacions del modul \"$1\" de l'API : $2",
+       "apisandbox-no-parameters": "Aqueste modul API a pas cap de paramètre.",
+       "apisandbox-helpurls": "Ligams d'ajuda",
        "apisandbox-examples": "Exemples",
+       "apisandbox-dynamic-parameters": "Paramètres suplementaris",
+       "apisandbox-dynamic-parameters-add-label": "Apondon del paramètre",
+       "apisandbox-dynamic-parameters-add-placeholder": "Nom del paramètre",
+       "apisandbox-dynamic-error-exists": "Existís ja un paramètre nomenat \"$1\"",
+       "apisandbox-deprecated-parameters": "Paramètres obsolèts",
+       "apisandbox-fetch-token": "Auto-emplenatge del geton",
+       "apisandbox-submit-invalid-fields-title": "Certans camps son invalids",
+       "apisandbox-submit-invalid-fields-message": "Corregissètz los camps indicats e ensajatz tornamai.",
        "apisandbox-results": "Resultats",
+       "apisandbox-sending-request": "Mandadís de la requèsta a l'API...",
+       "apisandbox-loading-results": "Recepcion dels resultats de l'API...",
+       "apisandbox-request-selectformat-label": "Afichar las donadas de la requèsta coma :",
+       "apisandbox-request-format-url-label": "Cadena de requèsta de l'URL",
        "apisandbox-request-url-label": "Requèsta URL :",
+       "apisandbox-request-json-label": "Demandar de JSON :",
        "apisandbox-request-time": "Durada de la demanda : {{PLURAL:$1|$1 ms}}",
+       "apisandbox-alert-page": "Los camps d'aquesta pagina son pas valids.",
+       "apisandbox-alert-field": "La valor d'aqueste camp es pas valida.",
+       "apisandbox-continue": "Contunhar",
+       "apisandbox-continue-clear": "Escafar",
+       "apisandbox-param-limit": "Entrar <kbd>max</kbd> per utilizar lo limit maximal.",
+       "apisandbox-multivalue-all-namespaces": "$1 (totes los espacis de noms)",
+       "apisandbox-multivalue-all-values": "$1 (totas las valors)",
        "booksources": "Obratges de referéncia",
        "booksources-search-legend": "Recercar demest d'obratges de referéncia",
        "booksources-isbn": "ISBN :",
        "booksources-search": "Recercar",
        "booksources-text": "Vaquí una lista de ligams cap a d’autres sites que vendon de libres nòus e d’ocasion e suls quals trobaretz benlèu d'entresenhas suls obratges que cercatz. {{SITENAME}} es pas ligada a cap d'aquestas societats, a pas l’intencion de ne far la promocion.",
        "booksources-invalid-isbn": "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fait una error al moment de la còpia dempuèi la font.",
+       "magiclink-tracking-rfc": "Paginas utilizant de ligams magics RFC",
+       "magiclink-tracking-pmid": "Paginas utilizant de ligams magics PMID",
+       "magiclink-tracking-isbn": "Paginas utilizant de ligams magics ISBN",
        "specialloguserlabel": "Autor :",
        "speciallogtitlelabel": "Cibla (títol o {{ns:user}}:nom d'utilizaire) :",
        "log": "Jornals",
+       "logeventslist-submit": "Afichar",
        "all-logs-page": "Totas las operacions publicas",
        "alllogstext": "Afichatge combinat de totes los jornals de {{SITENAME}}.\nPodètz restrénher la vista en seleccionant un tipe de jornal, un nom d’utilizaire (cassa sensibla) o una pagina ciblada (idem).",
        "logempty": "I a pas res dins l’istoric per aquesta pagina.",
        "log-title-wildcard": "Recercar de títols que començan per aqueste tèxte",
        "showhideselectedlogentries": "Afichar/amagar las entradas de jornal seleccionadas",
+       "checkbox-select": "Seleccionar : $1",
+       "checkbox-all": "Tot",
+       "checkbox-none": "Pas cap",
+       "checkbox-invert": "Inversar",
        "allpages": "Totas las paginas",
        "nextpage": "Pagina seguenta ($1)",
        "prevpage": "Pagina precedenta ($1)",
        "allpagesfrom": "Afichar las paginas a partir de :",
        "allpagesto": "Afichar las paginas fins a :",
        "allarticles": "Totas las paginas",
-       "allinnamespace": "Totas las paginas (espaci de noms $1)",
+       "allinnamespace": "Totas las paginas (dins l'espaci de noms $1)",
        "allpagessubmit": "Validar",
        "allpagesprefix": "Afichar las paginas que començan pel prefix :",
        "allpagesbadtitle": "Lo títol rensenhat per la pagina es incorrècte o possedís un prefix reservat. Conten segurament un o mantun caractèr especial que pòt pas èsser utilizats dins los títols.",
        "cachedspecial-viewing-cached-ttl": "Visualizatz una version d'aquesta pagina mesa en cache, que pòt èsser datada d’al mai $1.",
        "cachedspecial-refresh-now": "Veire lo mai recent.",
        "categories": "Categorias",
+       "categories-submit": "Afichar",
        "categoriespagetext": "{{PLURAL:$1|La categoria seguenta es utilizada|Las categorias seguentas son utilizadas}} per de paginas o de fichièrs.\n[[Special:UnusedCategories|Las categorias inutilizadas]] son pas afichadas aicí.\nVejatz tanben [[Special:WantedCategories|las categorias demandadas]].",
        "categoriesfrom": "Afichar las categorias que començan a :",
        "deletedcontributions": "Contribucions suprimidas d’un utilizaire",
        "linksearch-error": "Los caractèrs « joker » pòdon pas èsser utilizats qu’al començament del nom de domeni.",
        "listusersfrom": "Afichar los utilizaires a partir de :",
        "listusers-submit": "Mostrar",
-       "listusers-noresult": "S'es pas trobat de noms d'utilizaires correspondents. Cercatz tanben amb de majusculas e minusculas.",
+       "listusers-noresult": "Cap d’utilizaires pas trobat.",
        "listusers-blocked": "(blocat)",
        "activeusers": "Lista dels utilizaires actius",
        "activeusers-intro": "Aquò es una lista dels utilizaires qu'an exerçat una activitat quina que siá al cors {{PLURAL:$1|de la darrièra jornada|dels $1 darrièrs jorns}}.",
        "activeusers-count": "$1 {{PLURAL:$1|accion|accions}} al moment {{PLURAL:$3|del darrièr jorn|dels $3 darrièrs jorns}}",
        "activeusers-from": "Afichar los utilizaires dempuèi :",
        "activeusers-noresult": "Cap d'utilizaire pas trobat.",
+       "activeusers-submit": "Afichar los utilizaires actius",
        "listgrouprights": "Dreits dels gropes d'utilizaires",
        "listgrouprights-summary": "Aquesta pagina conten una lista de gropes definits sus aqueste wiki e mai los dreits d'accès qu'i son associats.\nI pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàrias]] a prepaus dels dreits.",
        "listgrouprights-key": "Legenda :\n*<span class=\"listgrouprights-granted\">Dreit autrejat</span>\n*<span class=\"listgrouprights-revoked\">Dreit revocat</span>",
        "listgrouprights-namespaceprotection-header": "Restriccions d'espaci de noms",
        "listgrouprights-namespaceprotection-namespace": "Espaci de noms",
        "listgrouprights-namespaceprotection-restrictedto": "Dreit(s) que permet(on) a l'utilizaire de modificar",
+       "listgrants": "Autorizacions",
+       "listgrants-grant": "Acordar",
+       "listgrants-rights": "Dreits",
        "trackingcategories": "Categorias de seguiment",
        "trackingcategories-msg": "Categoria de seguiment",
        "trackingcategories-name": "Nom del messatge",
        "trackingcategories-desc": "Critèri d’inclusion de la categoria",
+       "restricted-displaytitle-ignored": "Paginas amb de títols d'afichatge ignorats",
        "trackingcategories-nodesc": "Cap de descripcion pas disponibla.",
        "trackingcategories-disabled": "La categoria es desactivada",
        "mailnologin": "Pas d'adreça",
        "emailusername": "Nom d'utilizaire :",
        "emailusernamesubmit": "Sometre",
        "email-legend": "Mandar un corrièr electronic a un autre utilizaire de {{SITENAME}}",
-       "emailfrom": "Expeditor :",
+       "emailfrom": "De :",
        "emailto": "Destinatari :",
        "emailsubject": "Subjècte :",
        "emailmessage": "Messatge :",
        "emailccsubject": "Còpia de vòstre messatge a $1 : $2",
        "emailsent": "Messatge mandat",
        "emailsenttext": "Vòstre messatge es estat mandat.",
-       "emailuserfooter": "Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « {{int:emailuser}} » sus {{SITENAME}}.",
+       "emailuserfooter": "Aqueste corrièr electronic es {{GENDER:$1|estat mandat}} per « $1 » a « {{GENDER:$2|$2}} » per la foncion « {{int:emailuser}} » sus {{SITENAME}}. Se {{GENDER:$2|respondètz}} a aqueste corrièl, {{GENDER:$2|vòstre}} corrièl serà mandat dirèctament a l’{{GENDER:$1|emeteire inicial}}, en {{GENDER:$1|li}} mencionant {{GENDER:$2|vòstra}} adreça de courrièl .",
        "usermessage-summary": "A daissat un messatge de sistèma.",
        "usermessage-editor": "Messatgièr del sistèma",
        "watchlist": "Lista de seguiment",
        "watchlistanontext": "Connectatz-vos per visualizar o modificar los elements de vòstra lista de seguiment.",
        "watchnologin": "Vos sètz pas identificat(ada)",
        "addwatch": "Apondre a la lista de seguiment",
-       "addedwatchtext": "La pagina « [[:$1]] » es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]]. Las modificacions venentas d'aquesta pagina e de la pagina de discussion associada i seràn repertoriadas.",
+       "addedwatchtext": "La pagina « [[:$1]] » e sa pagina de discussion son estadas apondudas a vòstra [[Special:Watchlist|lista de seguiment]].",
        "addedwatchtext-short": "La pagina « $1 » es estada aponduda a vòstra lista de seguiment.",
        "removewatch": "Suprimir de la lista de seguiment",
-       "removedwatchtext": "La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].",
+       "removedwatchtext": "La pagina « [[:$1]] » e sa pagina de discussion son estadas levadas de vòstra [[Special:Watchlist|lista de seguiment]].",
        "removedwatchtext-short": "La pagina « $1 » es estada suprimida de vòstra lista de seguiment.",
        "watch": "Seguir",
        "watchthispage": "Seguir aquesta pagina",
        "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
        "wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
        "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns",
+       "watchlist-hide": "Amagar",
+       "watchlist-submit": "Afichar",
+       "wlshowtime": "Periòde afichat :",
        "wlshowhideminor": "cambiaments menors",
+       "wlshowhidebots": "Robòts",
+       "wlshowhideliu": "utilizaires enregistrats",
+       "wlshowhideanons": "utilizaires anonims",
+       "wlshowhidepatr": "modificacions repassadas",
+       "wlshowhidemine": "mas modificacions",
+       "wlshowhidecategorization": "categorizacion de la pagina",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "unwatching": "Fin del seguit...",
        "delete-confirm": "Escafar «$1»",
        "delete-legend": "Escafar",
        "historywarning": "<strong>Atencion :</strong> la pagina que sètz a mand de suprimir a un istoric amb $1 {{PLURAL:$1|version|versions}} :",
+       "historyaction-submit": "Afichar",
        "confirmdeletetext": "Sètz a mand de suprimir una pagina o un fichièr, e mai totas sas versions anterioras istorizadas.\nConfirmatz qu'es plan çò que volètz far, que ne comprenètz las consequéncias e que fasètz aquò en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].",
        "actioncomplete": "Accion efectuada",
        "actionfailed": "L’accion a fracassat",
        "changecontentmodel-title-label": "Títol de la pagina",
        "changecontentmodel-model-label": "Novèl modèl de contengut",
        "changecontentmodel-reason-label": "Motiu :",
+       "changecontentmodel-submit": "Modificar",
+       "changecontentmodel-emptymodels-title": "Cap de modèl de contengut pas disponible",
        "logentry-contentmodel-change-revertlink": "restablir",
        "logentry-contentmodel-change-revert": "restablir",
        "protectlogpage": "Istoric de las proteccions",
        "modifiedarticleprotection": "a modificat lo nivèl de proteccion de « [[$1]] »",
        "unprotectedarticle": "a suprimit la proteccion de « [[$1]] »",
        "movedarticleprotection": "a desplaçat los paramètres de proteccion dempuèi « [[$2]] » cap a « [[$1]] »",
+       "protectedarticle-comment": "{{GENDER:$2|A protegit}} « [[$1]] »",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|A cambiat lo nivèl de proteccion}} per « [[$1]] »",
+       "unprotectedarticle-comment": "{{GENDER:$2|A suprimit la proteccion}} de « [[$1]] »",
        "protect-title": "Cambiar lo nivèl de proteccion de « $1 »",
        "protect-title-notallowed": "Veire lo nivèl de proteccion de « $1 »",
        "prot_1movedto2": "a renomenat [[$1]] en [[$2]]",
        "protect-locked-blocked": "Podètz pas modificar los nivèls de proteccion tant que sètz bloca{{GENDER:||t|ada}}.. Vaquí los reglatges actuals de la pagina <strong>$1</strong> :",
        "protect-locked-dblock": "Lo nivèl de proteccion pòt pas èsser modificat perque la basa de donadas es verrolhada.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
        "protect-locked-access": "Avètz pas los dreits necessaris per modificar los nivèls de proteccion de las paginas.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
-       "protect-cascadeon": "Aquesta pagina es protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}}, amb l’opcion « proteccion en cascada » activada. Podètz cambiar lo nivèl de proteccion d'aquesta pagina sens qu'aquò afècte la proteccion en cascada.",
+       "protect-cascadeon": "Aquesta pagina es protegida perque es transclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}}, amb l’opcion « proteccion en cascada » d'activada.\nPodètz cambiar lo nivèl de proteccion d'aquesta pagina sens qu'aquò afècte la proteccion en cascada.",
        "protect-default": "Autorizar totes los utilizaires",
        "protect-fallback": "Autorizar unicament los utilizaires amb lo dreit « $1 »",
        "protect-level-autoconfirmed": "Autorizar unicament los utilizaires autoconfirmats",
        "sp-contributions-username": "Adreça IP o nom d’utilizaire :",
        "sp-contributions-toponly": "Mostrar sonque las contribucions que son las darrièras dels articles",
        "sp-contributions-newonly": "Afichar unicament las modificacions que son de creacions de pagina",
+       "sp-contributions-hideminor": "Amagar las modificacions menoras",
        "sp-contributions-submit": "Cercar",
        "whatlinkshere": "Paginas ligadas a aquesta",
        "whatlinkshere-title": "Paginas que puntan cap a « $1 »",
        "whatlinkshere-hidelinks": "$1 ligams",
        "whatlinkshere-hideimages": "$1 los ligams cap al fichièr",
        "whatlinkshere-filters": "Filtres",
+       "whatlinkshere-submit": "Validar",
        "autoblockid": "Blocatge automatic #$1",
        "block": "Blocar un utilizaire",
        "unblock": "Desblocar un utilizaire",
        "blockip": "Blocar l’{{GENDER:$1|utilizaire|utilizaira}}",
        "blockip-legend": "Blocar en escritura",
-       "blockiptext": "Utilizatz lo formulari çaijós per blocar l'accès a las modificacions a partir d'una adreça IP especifica o d'un nom d'utilizaire.\nUna tala mesura deu pas èsser presa pas que per empachar lo vandalisme e en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].\nDonatz çaijós un motiu precís (per exemple en citant las paginas que son estadas vandalizadas).",
+       "blockiptext": "Utilizatz lo formulari çaijós per blocar las temptativas de modificacion a partir d'una adreça IP especifica o d'un nom d'utilizaire.\nUna tala mesura deuriá pas èsser presa pas que per empachar lo vandalisme e en acòrd amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].\nDonatz çaijós un motiu precís (per exemple en citant las paginas que son estadas vandalizadas).\nPodètz blocar de plajas d’adreças IP en utilizant la sintaxi [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] ; la mai granda plaja autorizada es /$1 per IP v4 e /$2 per IP v6.",
        "ipaddressorusername": "Adreça IP o nom d’utilizaire :",
        "ipbexpiry": "Durada del blocatge :",
        "ipbreason": "Motiu :",
        "ipb-unblock": "Desblocar un compte d'utilizaire o una adreça IP",
        "ipb-blocklist": "Vejatz los blocatges existents",
        "ipb-blocklist-contribs": "Contribucions per {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 restant",
        "unblockip": "Desblocar un utilizaire o una adreça IP",
        "unblockiptext": "Utilizatz lo formulari çaijós per restablir l'accès en escritura\na partir d'una adreça IP precedentament blocada.",
        "ipusubmit": "Suprimir aqueste blocatge",
        "databasenotlocked": "La basa de donadas es pas verrolhada.",
        "lockedbyandtime": "(per $1 lo $2 a $3)",
        "move-page": "Renomenar $1",
-       "move-page-legend": "Tornar nomenar una pagina",
-       "movepagetext": "Utilizatz lo formulari çaijós per tornar nomenar una pagina, en desplaçant tot son istoric cap al nom novèl. Lo títol ancian vendrà una pagina de redireccion cap al títol novèl. Podètz metre a jorn automaticament las redireccions actualas que puntan cap al títol original. Se causissètz de lo far pas, asseguratz-vos de verificar tota [[Special:DoubleRedirects|redireccion dobla]] o [[Special:BrokenRedirects|redireccion copada]]. Avètz la responsabilitat de vos assegurar que los ligams contunhen de puntar cap a lor destinacion supausada.\n\nNotatz que la pagina serà '''pas''' renomada s'existís ja una pagina amb lo novèl títol, levat se aquesta darrièra a un istoric de modificacions verge e es una simpla redireccion. Aquò permet de renomenar una pagina cap a sa posicion d'origina se lo desplaçament s'avera erronèu.\n\n'''ATENCION !'''\nAquò pòt provocar un cambiament radical e imprevist per una pagina consultada frequentament ; asseguratz-vos de n'aver comprés las consequéncias abans de contunhar.",
-       "movepagetalktext": "La pagina de discussion associada, se presenta, serà automaticament desplaçada amb ''' levat se :'''\n*Desplaçatz una pagina cap a un autre espaci,\n*Una pagina de discussion ja existís amb lo nom novèl, o\n*Avètz deseleccionat lo boton çaijós.\n\nDins aqueste cas, vos caldrà desplaçar o fusionar la pagina manualament se o volètz.",
+       "move-page-legend": "Renomenar una pagina",
+       "movepagetext": "Utilizatz lo formulari çaijós per renomenar una pagina, en desplaçant tot son istoric cap al nom novèl. Lo títol ancian vendrà una pagina de redireccion cap al títol novèl.\nPodètz metre a jorn automaticament las redireccions actualas que puntan cap al títol original.\nSe causissètz de lo far pas, asseguratz-vos de verificar tota [[Special:DoubleRedirects|redireccion dobla]] o [[Special:BrokenRedirects|redireccion copada]]. Avètz la responsabilitat de vos assegurar que los ligams contunhan de puntar cap a lor destinacion supausada.\n\nNotatz que la pagina serà <strong>pas</strong>  renomada s'existís ja una pagina amb lo novèl títol, levat se aquesta darrièra a un istoric de modificacions verge e es una simpla redireccion. \nAquò significa que podètz renomenar una pagina cap a sa posicion d'origina se vos sètz enganat e que podètz pas espotir una pagina existenta.\n\n<strong>Atencion !</strong>\nAquò pòt provocar un cambiament radical e imprevist per una pagina consultada frequentament ; asseguratz-vos qu'avètz comprés las consequéncias de vòstra accion abans de contunhar.",
+       "movepagetext-noredirectfixer": "Utilizatz lo formulari çaijós per renomenar una pagina, en desplaçant tot son istoric cap al nom novèl.\nL’ancian títol vendrà una pagina de redireccion cap al novèl títol.\nVerificatz plan las [[Special:DoubleRedirects|doblas redireccions]] o las [[Special:BrokenRedirects|redireccions copadas]].\nAvètz la responsabilitat de vos assegurar que los ligams contuhan de puntar cap a lor destinacion supausada.\n\nNotatz que la pagina serà <strong>pas</strong> desplaçada se existís ja una pagina amb lo títol novèl, levat se aquesta darrièra a un istoric de modificacions verge e es siá void, siá una simpla redireccion. Aquò permet de renomenar una pagina cap a sa posicion d’origina se lo desplaçament s’avèra erronèu, e es impossible d’espotir una pagina existenta.\n\n<strong>Atencion !</strong>\nAquò pòt provocar un cambiament radical e imprevist per una pagina sovent consultada ; asseguratz-vos de n'aver comprés las consequéncias abans de contunhar.",
+       "movepagetalktext": "Se marcatz aquesta casa, la pagina de discussion associada serà automaticament renomenada levat se una pagina de discussion, non voida, existís ja amb aqueste nom novèl.\n\nDins aqueste cas, vos caldrà renomenar o fusionar la pagina manualament se o volètz.",
        "moveuserpage-warning": "'''Atencion :''' Sètz a mand de tornar nomenar una pagina d’utilizaire. Notatz que sola la pagina serà renomenada e que l’utilizaire '''ne''' serà '''pas''' renomenat.",
        "movenologintext": "Per poder renomenar una pagina, vos cal èsser [[Special:UserLogin|indentific{{GENDER:||t|da)}}]]\nen tant qu'utilizaire enregistrat amb pro d'ancianetat.",
        "movenotallowed": "Avètz pas la permission de renomenar de paginas.",
        "cant-move-user-page": "Avètz pas la permission de renomenar las paginas principalas d'utilizaires.",
        "cant-move-to-user-page": "Avètz pas la permission de tornar nomenar una pagina cap a una pagina d'utilizaire (a l'excepcion d'una sospagina).",
        "cant-move-category-page": "Avètz pas la permission de renomenar las paginas de categorias.",
+       "cant-move-to-category-page": "Avètz pas lo dreit de renomenar una pagina cap a una pagina de categoria.",
+       "cant-move-subpages": "Avètz pas lo dreit de renomenar de sospaginas.",
+       "namespace-nosubpages": "L’espaci de noms « $1 » autoriza pas las sospaginas.",
        "newtitle": "Títol novèl :",
        "move-watch": "Seguir aquesta pagina",
        "movepagebtn": "Renomenar l'article",
        "articleexists": "Existís ja un article que pòrta aqueste títol, o lo títol qu'avètz causit es pas valid.\nCausissètz-ne un autre.",
        "cantmove-titleprotected": "Avètz pas la possibilitat de desplaçar una pagina cap a aqueste emplaçament perque lo títol es estat protegit a la creacion.",
        "movetalk": "Renomenar tanben la pagina de discussion associada",
-       "move-subpages": "Tornar nomenar las sospaginas (fins a $1 paginas)",
-       "move-talk-subpages": "Tornar nomenar las sospaginas de la pagina de discussion (fins a $1 paginas)",
+       "move-subpages": "Renomenar las sospaginas (maximum $1)",
+       "move-talk-subpages": "Renomenar las sospaginas de la pagina de discussion (maximum $1 paginas)",
        "movepage-page-exists": "La pagina $1 existís ja e pòt pas èsser espotida automaticament.",
        "movepage-page-moved": "La pagina $1 es estada renomenada en $2.",
        "movepage-page-unmoved": "La pagina $1 pòt èsser renomenada en $2.",
        "movepage-max-pages": "Lo maximum de $1 {{PLURAL:$1|pagina es estada renomenada|paginas son estadas renomenadas}} e cap d'autra o poirà pas èsser automaticament.",
        "movelogpage": "Istoric dels cambiaments de nom",
        "movelogpagetext": "Vaquí la lista de las darrièras paginas renomenadas.",
-       "movesubpage": "{{PLURAL:$1|Sospagina|Sospaginas}}",
+       "movesubpage": "Sospagina{{PLURAL:$1||s}}",
        "movesubpagetext": "Aquesta pagina a $1 {{PLURAL:$1|sospagina afichada|sospaginas afichadas}} çaijós.",
        "movenosubpage": "Aquesta pagina a pas cap de sospagina.",
        "movereason": "Motiu :",
        "revertmove": "anullar",
-       "delete_and_move_text": "==Supression requerida==\nL’article de destinacion « [[:$1]] » existís ja.\nLo volètz suprimir per permetre lo cambiament de nom ?",
+       "delete_and_move_text": "La pagina de destinacion « [[:$1]] » existís ja.\nSètz segur{{GENDER:||a|}} que la volètz suprimir pe permetre aqueste cambiament de nom ?",
        "delete_and_move_confirm": "Òc, accèpti de suprimir la pagina de destinacion per permetre lo cambiament de nom.",
        "delete_and_move_reason": "Pagina suprimida per permetre lo cambiament de nom dempuèi « [[$1]] »",
        "selfmove": "Los títols d’origina e de destinacion son los meteisses : impossible de tornar nomenar una pagina sus ela-meteissa.",
-       "immobile-source-namespace": "Podètz pas tornar nomenar de paginas dins l'espaci de noms « $1 »",
+       "immobile-source-namespace": "Podètz pas renomenar las paginas dins l'espaci de noms « $1 »",
        "immobile-target-namespace": "Podètz pas desplaçar de paginas cap a l'espaci de noms « $1 »",
        "immobile-target-namespace-iw": "Los ligams interwikis son pas una cibla valida pels cambiaments de nom.",
-       "immobile-source-page": "Aquesta pagina se pòt pas tornar nomenar.",
+       "immobile-source-page": "Aquesta pagina se pòt pas renomenar.",
        "immobile-target-page": "Es pas possible de desplaçar la pagina cap a aqueste títol.",
        "imagenocrossnamespace": "Pòt pas desplaçar un imatge cap a un espaci de nomenatge que siá pas un imatge.",
        "nonfile-cannot-move-to-file": "Impossible de renomenar quicòm mai qu'un fichièr cap a l'espaci de noms fichièr.",
        "move-leave-redirect": "Daissar una redireccion darrièr",
        "protectedpagemovewarning": "'''ATENCION:''' Aquesta pagina es estada protegida per que sonque los utilizaires qu'an los dreits d'administrators la pòscan renomenar. La darrièra entrada del jornal es afichada çaijós per referéncia :",
        "semiprotectedpagemovewarning": "'''Nòta :''' Aquesta pagina es estada blocada per que sonque los utilizaires enregistrats la pòscan tornar nomenar. La darrièra entrada del jornal es afichada çaijós per referéncia :",
-       "move-over-sharedrepo": "== Lo fichièr existís ==\n[[:$1]] existís ja sus un depaus partejat. Tornar nomenar aqueste fichièr farà lo fichièr sul depaus partatge inaccessible.",
+       "move-over-sharedrepo": "[[:$1]] existís ja sus un depaus partejat. Renomenar aqueste fichièr rendrà lo fichièr sul depaus partejat inaccessible.",
        "file-exists-sharedrepo": "Lo nom causit es ja utilizat per un fichièr sus un depaus partejat.\nCausissètz un autre nom.",
        "export": "Exportar de paginas",
        "exporttext": "Podètz exportar en XML lo tèxte e l’istoric d’una pagina o d’un ensemble de paginas; lo resultat pòt alara èsser importat dins un autre wiki que fonciona amb lo logicial MediaWiki.\n\nPer exportar de paginas, entratz lors títols dins la bóstia de tèxte çaijós, un títol per linha, e seleccionatz s'o desiratz o pas la version actuala amb totas las versions ancianas, amb la pagina d’istoric, o simplament la pagina actuala amb d'informacions sus la darrièra modificacion.\n\nDins aqueste darrièr cas, podètz tanben utilizar un ligam, coma [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per la pagina [[{{MediaWiki:Mainpage}}]].",
        "export-download": "Salvar en tant que fichièr",
        "export-templates": "Enclure los modèls",
        "export-pagelinks": "Enclure las paginas ligadas a una prigondor de :",
+       "export-manual": "Apondre de paginas manualament :",
        "allmessages": "Lista dels messatges del sistèma",
        "allmessagesname": "Nom del camp",
        "allmessagesdefault": "Messatge per defaut",
        "thumbnail_image-missing": "Lo fichièr seguent es introbable : $1",
        "import": "Importar de paginas",
        "importinterwiki": "Importar a partir d'un autre wiki",
-       "import-interwiki-text": "Seleccionatz un wiki e un títol de pagina d'importar.\nLas datas de las versions e los noms dels editors seràn preservats.\nTotas las accions d’importacion interwiki son conservadas dins lo [[Special:Log/import|jornal d’impòrt]].",
+       "import-interwiki-text": "Seleccionatz un wiki e un títol de pagina d'importar.\nLas datas de las versions e los noms dels contributors seràn preservats.\nTotas las accions d’importacion a partir d'autres wikis son conservadas dins l' [[Special:Log/import|istoric de las importacions]].",
        "import-interwiki-sourcewiki": "Wiki font :",
        "import-interwiki-sourcepage": "Pagina font :",
        "import-interwiki-history": "Copiar totas las versions de l'istoric d'aquesta pagina",
-       "import-interwiki-templates": "Enclure totes los modèls",
+       "import-interwiki-templates": "Inclure totes los modèls",
        "import-interwiki-submit": "Importar",
        "import-mapping-default": "Importar als emplaçaments per defaut",
        "import-mapping-namespace": "Importar cap a un espaci de noms :",
        "importcantopen": "Impossible de dobrir lo fichièr d'importar",
        "importbadinterwiki": "Ligam interwiki marrit",
        "importsuccess": "L'impòrt a capitat !",
-       "importnosources": "Cap de font interwiki es pas estada definida e la còpia dirècta d’istoric es desactivada.",
+       "importnosources": "Cap de font wiki es pas estada definida e l'impòrt dirècte d’istorics es desactivat.",
        "importnofile": "Cap de fichièr es pas estat importat.",
        "importuploaderrorsize": "Lo telecargament del fichièr d'importar a pas capitat. Sa talha es mai granda que la autorizada.",
        "importuploaderrorpartial": "Lo telecargament del fichièr d'importar a pas capitat. Aqueste o es pas estat que parcialament.",
        "tooltip-ca-unprotect": "Cambiar la proteccion d'aquesta pagina",
        "tooltip-ca-delete": "Suprimir aquesta pagina",
        "tooltip-ca-undelete": "Restablir aquesta pagina",
-       "tooltip-ca-move": "Tornar nomenar aquesta pagina",
+       "tooltip-ca-move": "Renomenar aquesta pagina",
        "tooltip-ca-watch": "Apondètz aquesta pagina a vòstra lista de seguiment",
        "tooltip-ca-unwatch": "Levatz aquesta pagina de vòstra lista de seguiment",
        "tooltip-search": "Cercar dins {{SITENAME}}",
        "tooltip-p-logo": "Pagina principala",
        "tooltip-n-mainpage": "Visitatz la pagina principala",
        "tooltip-n-mainpage-description": "Anar a l’acuèlh",
-       "tooltip-n-portal": "A prepaus del projècte",
+       "tooltip-n-portal": "A prepaus del projècte, çò que podètz far, ont trobar d'informacions",
        "tooltip-n-currentevents": "Trobar d'entresenhas suls eveniments actuals",
        "tooltip-n-recentchanges": "Lista dels darrièrs cambiaments sul wiki",
        "tooltip-n-randompage": "Afichar una pagina a l'azard",
        "spambot_username": "Netejatge de spam de MediaWiki",
        "spam_reverting": "Restabliment de la darrièra version que conten pas de ligam cap a $1",
        "spam_blanking": "Totas las versions que contenon de ligams cap a $1 son blanquidas",
-       "spam_deleting": "Totas las versions contenonián de ligams cap a $1, supression",
+       "spam_deleting": "Totas las versions contenián de ligams cap a $1, supression",
        "simpleantispam-label": "Verificacion antispam.\nInscriviscatz '''PAS RES''' dedins !",
        "pageinfo-title": "Informacions per « $1 »",
        "pageinfo-not-current": "O planhèm, impossible de provesir aquesta informacion per las ancianas revisions.",
        "pageinfo-length": "Talha de la pagina (en octets)",
        "pageinfo-article-id": "Numèro de la pagina",
        "pageinfo-language": "Lenga del contengut de la pagina",
+       "pageinfo-language-change": "modificar",
        "pageinfo-content-model": "Modèl de contengut de la pagina",
+       "pageinfo-content-model-change": "modificar",
        "pageinfo-robot-policy": "Indexacion per robòts",
        "pageinfo-robot-index": "Autorizada",
        "pageinfo-robot-noindex": "Interdicha",
        "pageinfo-edits": "Nombre total de modificacions",
        "pageinfo-authors": "Nombre total d'autors distinctes",
        "pageinfo-recent-edits": "Nombre de modificacions recentas (dins los darrièrs $1)",
-       "pageinfo-recent-authors": "Nombre d'autors distinctes recents",
+       "pageinfo-recent-authors": "Nombre d'autors distintes recents",
        "pageinfo-magic-words": "{{PLURAL:$1|Mot magic|Mots magics}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria amagada|Categorias amagadas}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Modèl inclús|Modèls incluses}} ($1)",
        "pageinfo-category-pages": "Nombre de paginas",
        "pageinfo-category-subcats": "Nombre de soscategorias",
        "pageinfo-category-files": "Nombre de fichièrs",
+       "pageinfo-user-id": "ID de l'utilizaire",
        "markaspatrolleddiff": "Marcar coma essent pas un vandalisme",
        "markaspatrolledtext": "Marcar aqueste article coma pas vandalizat",
        "markedaspatrolled": "Marcat coma pas vandalizat",
        "patrol-log-header": "Vaquí un jornal de las versions patrolhadas.",
        "log-show-hide-patrol": "$1 l'istoric de las relecturas",
        "log-show-hide-tag": "$1 lo jornal de las balisas",
+       "confirm-markpatrolled-button": "D'acòrdi",
        "deletedrevision": "La version anciana $1 es estada suprimida.",
        "filedeleteerror-short": "Error al moment de la supression del fichièr : $1",
        "filedeleteerror-long": "D'errors son estadas rencontradas al moment de la supression del fichièr :\n\n$1",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom del fichièr (o una partida d'aqueste) :",
        "newimages-showbots": "Afichar los impòrts per de robòts",
+       "newimages-hidepatrolled": "Amagar los telecargaments patrolhats",
        "noimages": "Cap d'imatge d'afichar pas.",
+       "gallery-slideshow-toggle": "Bascular las vinhetas",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "sp-newimages-showfrom": "Afichar los imatges novèls importats dempuèi lo $2, $1",
        "exif-compression-4": "CCITT Grop 4 encodatge del fax",
        "exif-copyrighted-true": "Somés al dreit d'autor",
        "exif-copyrighted-false": "Estat dels dreits d’autor pas definit",
+       "exif-photometricinterpretation-1": "Blanc e negre (0 pel negre)",
        "exif-unknowndate": "Data desconeguda",
        "exif-orientation-1": "Normala",
        "exif-orientation-2": "Inversada orizontalament",
        "confirmemail_body_set": "Qualqu’un, probablament vos, dempuèi l’adreça IP $1, a modificat l'adreça de corrièr electronic del compte « $2 » amb aquesta sul site {{SITENAME}}.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e reactivar las foncions de messatjariá sus {{SITENAME}}, seguissètz lo ligam çaijós dins vòstre navigador :\n\n$3\n\nAqueste còdi de confirmacion expirarà lo $4.\n\nSe s’agís *pas* de vòstre compte, seguissètz aqueste ligam per anullar la confirmacion de l'adreça de corrièr electronic :\n\n$5",
        "confirmemail_invalidated": "Confirmacion de l’adreça de corrièr electronic anullada",
        "invalidateemail": "Anullar la confirmacion del corrièr electronic",
+       "notificationemail_subject_changed": "L'adreça de corrièr electronic enregistrada de {{SITENAME}} es estada cambiada",
+       "notificationemail_subject_removed": "L'adreça de corrièr electronic enregistrada de {{SITENAME}} es estada suprimida",
        "scarytranscludedisabled": "[La transclusion interwiki es desactivada]",
        "scarytranscludefailed": "[La recuperacion de modèl a pas capitat per $1]",
        "scarytranscludefailed-httpstatus": "[Fracàs de la recuperacion del modèl per  $1 : HTTP  $2 ]",
        "scarytranscludetoolong": "[L’URL es tròp longa]",
        "deletedwhileediting": "'''Atencion''' : aquesta pagina es estada suprimida aprèp qu'avètz començat de la modificar !",
-       "confirmrecreate": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|talk]]) a suprimit aquesta pagina, alara que l'aviatz començat d'editar, pel motiu seguent:\n: ''$2''\nConfirmatz que desiratz tornar crear aqueste article.",
-       "confirmrecreate-noreason": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de la modificar. Confirmatz que desiratz tornar crear aquesta pagina.",
+       "confirmrecreate": "L'utilizair{{GENDER:$1|e|a}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de l'editar, pel motiu seguent:\n: <em>$2</em>\nConfirmatz que sètz segur que volètz tornar crear aquesta pagina.",
+       "confirmrecreate-noreason": "L'utilizair{{GENDER:$1|e|a}}[[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de la modificar. Confirmatz que sètz segur que volètz tornar crear aquesta pagina.",
        "recreate": "Tornar crear",
        "confirm_purge_button": "Confirmar",
        "confirm-purge-top": "Volètz refrescar aquesta pagina (purgar l'escondedor) ?",
        "confirm-watch-top": "Apondre aquesta pagina a vòstra lista de seguiment ?",
        "confirm-unwatch-button": "D'acòrdi",
        "confirm-unwatch-top": "Levar aquesta pagina de vòstra lista de seguiment ?",
+       "confirm-rollback-button": "D'acòrdi",
        "colon-separator": "&nbsp;:&#32;",
        "quotation-marks": "« $1 »",
        "imgmultipageprev": "← pagina precedenta",
        "watchlisttools-edit": "Veire e modificar la lista de seguiment",
        "watchlisttools-raw": "Modificar la lista (mòde brut)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
+       "timezone-local": "Local",
        "duplicate-defaultsort": "Atencion : La clau de triada per defaut « $2 » espotís la mai recenta « $1 ».",
        "duplicate-displaytitle": "<strong>Atencion :</strong> Lo títol d'afichatge «$2» remplaça l'ancian títol d'afichatge «$1».",
        "version": "Version",
        "redirect-page": "ID de pagina",
        "redirect-revision": "Revision de la pagina",
        "redirect-file": "Nom del fichièr",
+       "redirect-logid": "ID de jornal",
        "redirect-not-exists": "Valor pas trobada",
        "fileduplicatesearch": "Recèrca dels fichièrs en doble",
        "fileduplicatesearch-summary": "Recèrca de las còpias de fichièrs identics d'aprèp lor emprenta de hachatge.",
        "tags-actions-header": "Accions",
        "tags-active-yes": "Òc",
        "tags-active-no": "Non",
-       "tags-source-extension": "Definida per una extension",
+       "tags-source-extension": "Definit pel logicial",
        "tags-source-manual": "Aplicada manualament pels utilizaires e los bòts",
        "tags-source-none": "Obsolèt",
        "tags-edit": "modificar",
        "htmlform-cloner-create": "Apondre encara",
        "htmlform-cloner-delete": "Suprimir",
        "htmlform-cloner-required": "Una valor al mens es obligatòria.",
+       "htmlform-date-placeholder": "AAAA-MM-JJ",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-MM-JJ HH:MM:SS",
+       "htmlform-title-not-exists": "$1 existís pas.",
+       "htmlform-user-not-exists": "<strong>$1</strong> existís pas.",
+       "htmlform-user-not-valid": "<strong>$1</strong> es pas un nom d'utilizaire valid.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a suprimit}} la pagina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|suprimit}} redirigit cap a $3 per espotiment.",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restablit}} la pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a modificat}} la visibilitat {{PLURAL:$5|d'un eveniment del jornal|de $5 eveniments del jornal}} sus $3 : $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|a modificat}} la visibilitat {{PLURAL:$5|d'una revision|de $5 revisions}} sus la pagina $3 : $4",
        "logentry-newusers-create2": "Lo compte d'utilizaire $3 {{GENDER:$2|es estat creat}} per $1",
        "logentry-newusers-byemail": "Lo compte d'utilizaire $3 {{GENDER:$2|es estat creat}} per $1 e lo senhal es estat mandat per corrièr electronic",
        "logentry-newusers-autocreate": "Lo compte $1 {{GENDER:$2|es estat creat}} automaticament",
-       "logentry-rights-rights": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3 de $4 a $5",
+       "logentry-rights-rights": "$1 a modificat l’apartenéncia al grop per {{GENDER:$6|$3}} de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|es estat promolgut}} automaticament de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|a mandat}} $3",
        "logentry-managetags-activate": "$1 {{GENDER:$2|a activat}} la balisa \"$4\" per l’usatge dels utilizaires e dels robòts",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|a desactivat}} la balisa « $4 » per l’usatge dels utilizaires e dels robòts",
        "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-useragent": "Agent utilizaire :",
        "searchsuggest-search": "Recercar sus {{SITENAME}}",
        "searchsuggest-containing": "que conten...",
-       "api-error-badaccess-groups": "Sètz pas autorizat a cargar de fichièrs sus aqueste wiki.",
        "api-error-badtoken": "Error intèrna : marrit « geton ».",
-       "api-error-copyuploaddisabled": "Los cargaments via URL son desactivats sus aqueste servidor.",
-       "api-error-duplicate": "I a ja {{PLURAL:$1|un autre fichièr present|d'autres fichièrs presents}} sul site amb lo meteis contengut.",
-       "api-error-duplicate-archive": "I aviá ja {{PLURAL:$1|un autre fichièr present|d'autres fichièrs presents}} sul site amb lo meteis contengut, mas {{PLURAL:$1|es estat suprimit|son estats suprimits}}.",
-       "api-error-empty-file": "Lo fichièr qu'avètz somés èra void.",
        "api-error-emptypage": "Creacion de paginas voidas pas autorizada.",
-       "api-error-fetchfileerror": "Error intèrna : Quicòm s'es mal passat al moment de la recuperacion del fichièr.",
-       "api-error-fileexists-forbidden": "Un fichièr nomenat \"$1\" existís ja, e pòt pas èsser espotir.",
-       "api-error-fileexists-shared-forbidden": "Un fichièr nomenat \"$1\" existís ja dins lo repertòri dels fichièrs partejats, e pòt pas èsser espotit.",
-       "api-error-file-too-large": "Lo fichièr qu'avètz somés èra tròp grand.",
-       "api-error-filename-tooshort": "Lo nom del fichièr es tròp cort.",
-       "api-error-filetype-banned": "Aqueste tipe de fichièr es interdich",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|es pas un tipe de fichièr autorizat|son pas de tipes de fichièrs autorizats}}. \n{{PLURAL:$3|Lo tipe de fichièr autorizat es|Los tipes de fichièrs autorizats son}} $2.",
-       "api-error-filetype-missing": "L'extension del fichièr es mancanta.",
-       "api-error-hookaborted": "La modificacion qu'avètz ensajat de realizar es estada anullada per una extension.",
-       "api-error-http": "Error intèrna : se pòt pas connectar al servidor.",
-       "api-error-illegal-filename": "Lo nom del fichièr es pas autorizat.",
-       "api-error-internal-error": "Error intèrna : Quicòm s'es mal passat al moment del tractament de vòstre impòrt sul wiki.",
-       "api-error-invalid-file-key": "Error intèrna : cap de fichièr pas trobat dins l'emmagazinatge temporari.",
-       "api-error-missingparam": "Error intèrna : Manca de paramètres dins la requèsta.",
-       "api-error-missingresult": "Error intèrna : Avèm pas pogut determinar se la còpia aviá capitat.",
-       "api-error-mustbeloggedin": "Vos cal èsser connectat per telecargar de fichièrs.",
-       "api-error-mustbeposted": "Error intèrna : aquesta requèsta necessita lo metòde HTTP POST.",
-       "api-error-noimageinfo": "Lo mandadís a capitat, mas lo servidor a pas donat cap d'informacions sul fichièr.",
-       "api-error-nomodule": "Error intèrna : cap de modul de versament pas definit.",
-       "api-error-ok-but-empty": "Error intèrna : Lo servidor a pas respondut.",
-       "api-error-overwrite": "Espotir un fichièr existent es pas autorizat.",
-       "api-error-stashfailed": "Error intèrna : lo servidor a pas pogut enregistrar lo fichièr temporari.",
        "api-error-publishfailed": "Error intèrna: Lo servidor a pas pogut publicar lo fichièr temporari.",
-       "api-error-stasherror": "Una error s'es produsida al moment del telecargament del fichièr per lo dissimular.",
-       "api-error-timeout": "Lo servidor a pas respondut dins lo relambi pervist.",
-       "api-error-unclassified": "Una error desconeguda s'es produita.",
-       "api-error-unknown-code": "Error desconeguda : « $1 »",
-       "api-error-unknown-error": "Error intèrna : Quicòm a mal virat al moment del mandadís de vòstre fichièr.",
-       "api-error-unknown-warning": "Avertiment desconegut : $1",
+       "api-error-stashfailed": "Error intèrna : lo servidor a pas pogut enregistrar lo fichièr temporari.",
+       "api-error-unknown-warning": "Avertiment desconegut : « $1 ».",
        "api-error-unknownerror": "Error desconeguda : « $1 »",
-       "api-error-uploaddisabled": "Lo cargament es desactivat sus aqueste wiki.",
-       "api-error-verification-error": "Aqueste fichièr pòt èsser corromput, o son extension es incorrècta.",
        "duration-seconds": "$1 segonda{{PLURAL:$1||s}}",
        "duration-minutes": "$1 minuta{{PLURAL:$1||s}}",
        "duration-hours": "$1 ora{{PLURAL:$1||s}}",
        "pagelang-language": "Lenga",
        "pagelang-use-default": "Utilizar la lenga per defaut",
        "pagelang-select-lang": "Seleccionar la lenga",
+       "pagelang-reason": "Motiu",
+       "pagelang-submit": "Mandar",
+       "pagelang-nonexistent-page": "La pagina $1 existís pas.",
        "right-pagelang": "Cambiar la lenga de la pagina",
        "action-pagelang": "cambiar la lenga de la pagina",
        "log-name-pagelang": "Traçar los cambiaments de lenga",
        "mediastatistics-header-text": "Textual",
        "mediastatistics-header-executable": "Executables",
        "mediastatistics-header-archive": "Formats compressats",
+       "mediastatistics-header-total": "Totes los fichièrs",
        "json-error-state-mismatch": "JSON invalid o mal format",
        "json-error-syntax": "Error de sintaxi",
        "headline-anchor-title": "Ligam cap a aquesta seccion",
        "special-characters-group-ipa": "API",
        "special-characters-group-symbols": "Simbòls",
        "special-characters-group-greek": "Grèc",
+       "special-characters-group-greekextended": "Grèc espandit",
        "special-characters-group-cyrillic": "Cirillic",
        "special-characters-group-arabic": "Arabi",
        "special-characters-group-arabicextended": "Arabi espandit",
        "special-characters-title-endash": "jonhent anglés",
        "special-characters-title-emdash": "jonhent em",
        "special-characters-title-minus": "signe mens",
+       "mw-widgets-dateinput-no-date": "Cap de data pas seleccionada",
+       "mw-widgets-mediasearch-input-placeholder": "Recercar de mèdias",
+       "mw-widgets-mediasearch-noresults": "Cap de resultat pas trobat.",
+       "mw-widgets-categoryselector-add-category-placeholder": "Apondre una categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Apondre mai...",
+       "sessionprovider-generic": "sessions $1",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basadas sus de cookies",
+       "sessionprovider-nocookies": "Es possible que los testimònis (''cookies'') sián desactivats. Asseguratz-vos qu'avètz activat los testimònis e recomençatz.",
        "randomrootpage": "Pagina raiç aleatòria",
+       "log-action-filter-block": "Tipe de blocatge :",
+       "log-action-filter-delete": "Tipe de supression :",
+       "log-action-filter-import": "Tipe d'importacion :",
+       "log-action-filter-managetags": "Tipe d'accion de gestion de las etiquetas :",
+       "log-action-filter-move": "Tipe de desplaçament :",
+       "log-action-filter-newusers": "Tipe de creacion de compte :",
+       "log-action-filter-patrol": "Tipe de patrolha :",
+       "log-action-filter-protect": "Tipe de proteccion :",
        "log-action-filter-rights": "Tipe de cambiament de dreits :",
        "log-action-filter-suppress": "Tipe de supression :",
-       "changecredentials": "Modificar las informacions d’identificacion"
+       "log-action-filter-upload": "Tipe de mandadís :",
+       "log-action-filter-all": "Tot",
+       "log-action-filter-block-block": "Blocatge",
+       "log-action-filter-block-reblock": "Modificacion de blocatge",
+       "log-action-filter-block-unblock": "Desblocar",
+       "log-action-filter-delete-delete": "Supression de paginas",
+       "log-action-filter-delete-restore": "Restabliment de pagina",
+       "log-action-filter-import-interwiki": "Impòrt transwiki",
+       "log-action-filter-managetags-create": "Creacion de balisa",
+       "log-action-filter-managetags-delete": "Supression de balisa",
+       "log-action-filter-managetags-activate": "Activacion de l'etiqueta",
+       "log-action-filter-managetags-deactivate": "Desactivacion de l'etiqueta",
+       "log-action-filter-newusers-create": "Creacion per un utilizaire anonim",
+       "log-action-filter-newusers-create2": "Creacion per un utilizaire enregistrat",
+       "log-action-filter-newusers-autocreate": "Creacion automatica",
+       "log-action-filter-newusers-byemail": "Creacion amb un senhal mandat per corrièr electronic",
+       "log-action-filter-patrol-patrol": "Patrolha manuala",
+       "log-action-filter-patrol-autopatrol": "Patrolha automatica",
+       "log-action-filter-protect-protect": "Proteccion",
+       "log-action-filter-protect-modify": "Modificacion de la proteccion",
+       "log-action-filter-protect-unprotect": "Desproteccion",
+       "log-action-filter-protect-move_prot": "Proteccion de renomenatge",
+       "log-action-filter-rights-rights": "Cambiament manual",
+       "log-action-filter-rights-autopromote": "Cambiament automatic",
+       "log-action-filter-suppress-event": "Supression de jornal",
+       "log-action-filter-suppress-revision": "Supression de revision",
+       "log-action-filter-suppress-delete": "Supression de pagina",
+       "log-action-filter-upload-upload": "Mandadís novèl",
+       "log-action-filter-upload-overwrite": "Tornar mandar",
+       "authmanager-authn-autocreate-failed": "La creacion automatica d’un compte local a fracassat : $1",
+       "authmanager-create-disabled": "La creacion de compte es desactivada.",
+       "authmanager-authplugin-setpass-bad-domain": "Domeni invalid.",
+       "authmanager-autocreate-noperm": "La creacion automatica de compte es pas autorizada.",
+       "authmanager-password-help": "Senhal per l'autentificacion.",
+       "authmanager-domain-help": "Domeni per l'autentificacion extèrna.",
+       "authmanager-retype-help": "Senhal un còp de mai per confirmacion.",
+       "authmanager-email-label": "Corrièr electronic",
+       "authmanager-email-help": "Adreça de corrièr electronic",
+       "authmanager-realname-label": "Nom vertadièr",
+       "authmanager-realname-help": "Nom real de l'utilizaire",
+       "authmanager-provider-password": "Autentificacion amb senhal",
+       "authmanager-provider-temporarypassword": "Senhal provisòri",
+       "authprovider-confirmlink-message": "D’aprèp vòstras darrièras temtativas de connexion, los comptes seguents pòson èsser ligats a vòstre compte wiki. Los ligar vos permetrà de vos connectar via aquestes comptes. Seleccionatz los que devon èsser ligats.",
+       "authprovider-confirmlink-request-label": "Comptes que devon èsser ligats",
+       "authprovider-confirmlink-success-line": "$1 : Ligats amb succès.",
+       "authprovider-confirmlink-failed": "La ligason del compte a pas plan capitat : $1",
+       "authprovider-resetpass-skip-label": "Sautar",
+       "authform-newtoken": "Geton mancant. $1",
+       "authform-notoken": "Geton mancant",
+       "authform-wrongtoken": "Marrit geton",
+       "specialpage-securitylevel-not-allowed-title": "Interdit",
+       "changecredentials": "Modificar las informacions d’identificacion",
+       "removecredentials": "Suprimir las informacions d'identificacion",
+       "removecredentials-submit": "Suprimir las informacions d'identificacion",
+       "credentialsform-provider": "Tipe d’informacion d’identificacion :",
+       "credentialsform-account": "Nom de compte :",
+       "cannotlink-no-provider-title": "I a pas de comptes que pòdon èsser ligats",
+       "cannotlink-no-provider": "I a pas de compte que pòsca èsser ligat.",
+       "linkaccounts": "Ligar los comptes",
+       "linkaccounts-success-text": "Lo compte es estat ligat.",
+       "linkaccounts-submit": "Ligar los comptes",
+       "restrictionsfield-badip": "Adreça IP o plaja invalida : $1",
+       "revid": "version $1",
+       "pageid": "ID de pagina $1"
 }
index 1f25b38..19e7e17 100644 (file)
                        "아라",
                        "Macofe",
                        "Nistha.aslp",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Susant purohit"
                ]
        },
-       "tog-underline": "ଲିଙ୍କତଳେଗାର ଟାଣିବା:",
+       "tog-underline": "ଲିଙ୍କତଳେ ଗାର ଟାଣିବା:",
        "tog-hideminor": "ନିକଟରେ ହୋଇଥିବା ଛୋଟ ବଦଳସବୁକୁ ଲୁଚାଇବେ",
        "tog-hidepatrolled": "ନଗଦ ବଦଳରେ ନିରିକ୍ଷଣ କରାଯାଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
        "tog-newpageshidepatrolled": "ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ପରଖା ହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ",
@@ -58,7 +59,7 @@
        "tog-showhiddencats": "ଲୁଚାଯାଇଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକ ଦେଖାଇବେ",
        "tog-norollbackdiff": "ପଛକୁ ଫେରାଇଲାପରେ ତୁଳନା ଦେଖାନ୍ତୁ ନାହିଁ",
        "tog-useeditwarning": "ଯେତେବେଳେ ମୁଁ ଗୋଟିଏ ସାଇତାଯାଇନଥିବା ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିଦିଏ ମୋତେ ଚେତାବନୀ ଦେବେ",
-       "tog-prefershttps": "ଲà¬\97 à¬\87ନ à¬\95ଲାପରà­\87 à¬¸à¬°à­\8dବଦା à¬¸à­\81ରà¬\95à­\8dଷିତ à¬\95ନà­\87à¬\95à­\8dସନ ବ୍ୟବହାର କରିବେ",
+       "tog-prefershttps": "ଲà¬\97 à¬\87ନ à¬¹à­\87ଲା à¬ªà¬°à­\87  à¬¸à¬°à­\8dବଦା à¬¸à­\81ରà¬\95à­\8dଷିତ à¬¸à¬\82ଯà­\8bà¬\97  ବ୍ୟବହାର କରିବେ",
        "underline-always": "ସବୁବେଳେ",
        "underline-never": "କେବେନୁହେଁ",
        "underline-default": "ବ୍ରାଉଜର କିମ୍ବା ସ୍କିନରେ ଆଗରୁ ଥିବା ସୁବିଧା",
        "newwindow": "(ଏହା ନୂଆ ଉଇଣ୍ଡୋରେ ଖୋଲିବ)",
        "cancel": "ନାକଚ",
        "moredotdotdot": "ଅଧିକ...",
-       "morenotlisted": "à¬\8fହି à¬¤à¬¾à¬²à¬¿à¬\95ା à¬ªà­\82ରା à¬¹à­\8bà¬\87 à¬¨à¬¾à¬¹à¬¿à¬\81",
+       "morenotlisted": "ହà­\81à¬\8fତ à¬\8fହି à¬¤à¬¾à¬²à¬¿à¬\95ା à¬\85ସମà­\8dପà­\82ରà­\8dଣ.",
        "mypage": "ପୃଷ୍ଠା",
        "mytalk": "ଆଲୋଚନା",
        "anontalk": "ଆଲୋଚନା",
        "searcharticle": "ଯାଆନ୍ତୁ",
        "history": "ଫାଇଲ ଇତିହାସ",
        "history_short": "ଇତିହାସ",
+       "history_small": "ଇତିହାସ",
        "updatedmarker": "ମୋ ଶେଷ ଆସିବା ପରେ ଅପଡେଟ କରାଯାଇଅଛି",
        "printableversion": "ଛପାହୋଇପାରିବା ପୃଷ୍ଠା",
        "permalink": "ସବୁଦିନିଆ ଲିଙ୍କ",
        "talk": "ଆଲୋଚନା",
        "views": "ଦେଖା",
        "toolbox": "ଉପକରଣ",
+       "tool-link-emailuser": "{{GENDER:$1|user}}ଙ୍କୁ ଇ-ମେଲ କରନ୍ତୁ",
        "userpage": "ବ୍ୟବହାରକାରୀଙ୍କ ପୃଷ୍ଠା ଦେଖନ୍ତୁ",
        "projectpage": "ପ୍ରକଳ୍ପ ପୃଷ୍ଠାଟି ଦେଖାଇବା",
        "imagepage": "ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ",
        "badtitletext": "ଆପଣ ଅନୁରୋଧ କରିଥିବା ପୃଷ୍ଠାଟି ଭୁଲ, ଖାଲି ଅଛି ବା ବାକି ଭାଷା ସାଙ୍ଗରେ ଭୁଲରେ ଯୋଡ଼ା ଯାଇଛି ବା ଭୁଲ ଇଣ୍ଟର ଉଇକି ନାମ ଦିଆଯାଇଛି ।\nଏଥିରେ ଥିବା ଗୋଟିଏ ବା ଦୁଇଟି ଅକ୍ଷର ଶିରୋନାମା ଭାବରେ ବ୍ୟବହାର କରାଯାଇ ପାରିବ ନାହିଁ ।",
        "title-invalid-empty": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠାର ଶର୍ଷକଟି ଖାଲି ଅଛି କିମ୍ବା ନେମସ୍ପସର ନାମ ଅଛି ।",
        "title-invalid-utf8": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠାର ଶର୍ଷକରେ ଅବୈଧ UTF-8 ଧାରା ଅଛି ।",
+       "title-invalid-interwiki": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠା ଶିରୋନାମା ରେ ଇଣ୍ଟରଉଇକି ଲିଙ୍କ ରହିଥିବାରୁ ଏହି ଶିରୋନାମା ରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ।",
+       "title-invalid-talk-namespace": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠା ଶିରୋନାମା ଏକ ଟକ ପୃଷ୍ଠା କୁ ଆଧାର କରେ ଯାହା ଉପଲବ୍ଧ ନୁହେଁ।",
+       "title-invalid-characters": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠା ଶିରୋନାମା ଏକ ଅଗ୍ରହଣୀୟ ଚରିତ୍ର \"$1\" ରହିଛି।",
+       "title-invalid-magic-tilde": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷା ଶିରୋନାମା ରେ ଅଗ୍ରହଣୀୟ ମେଜିକ ଟିଲଡ଼େ ଅନୁକ୍ରମ (<nowiki>~~~</nowiki>)ରହିଛି।",
+       "title-invalid-leading-colon": "ଅନୁରୋଧ କରାଯାଇଥିବା ପ୍ରୁଷ୍ଠା ଶିରୋନାମାର ଆରମ୍ଭ  ରେ ଏକ ଅଗ୍ରହଣୀୟ କୋଲନ ରହିଛି।",
        "perfcached": "ତଳଲିଖିତ ତଥ୍ୟଗୁଡିକୁ ଅସ୍ଥାୟୀ ଭାବେ ରଖାଗଲା ଏବଂ ଏହା ଅପଡେଟ ନ ହୋଇପାରେ । ଅତିବେଶିରେ {{PLURAL:$1|ଫଳ|$1ଫଳଗୁଡିକ }} ଅସ୍ଥାୟୀ ରୂପେ ରହି ପାରିବ ।",
        "perfcachedts": "ତଳଲିଖିତ ତଥ୍ୟଗୁଡିକୁ ଅସ୍ଥାୟୀ ଭାବେ ରଖାଗଲା ଏବଂ  $1ରେ ଶେଷଥର ଅପଡେଟ ହୋଇଥିଲା । ଅତିବେଶିରେ {{PLURAL:$1|ଫଳ|$1ଫଳଗୁଡିକ }} ଅସ୍ଥାୟୀ ରୂପେ ରହି ପାରିବ ।",
        "querypage-no-updates": "ଏହି ପୃଷ୍ଠାଟି ପାଇଁ ଅପଡେଟସବୁ ଏବେ ଅଚଳ କରାଯାଇଅଛି ।\nଏଠାରେ ଥିବା ତଥ୍ୟ ସବୁ ଏବେ ସତେଜ ହୋଇପାରିବ ନାହିଁ ।",
        "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": "ଲଗ-ଇନ (Log in)",
+       "login-security": "ଆପଣଙ୍କ ପରିଚୟ ଯାଞ୍ଚ କରନ୍ତୁ",
        "nav-login-createaccount": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
        "userlogin": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
        "userloginnocreate": "ଲଗ-ଇନ (Log in)",
        "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-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|ପୃଷ୍ଠା|ପୃଷ୍ଠାମାନ}}",
        "nocookiesnew": "ଇଉଜର ନାମଟି ତିଆରି କରିଦିଆଗଲା, ହେଲେ ଆପଣ ଲଗ ଇନ କରିନାହାନ୍ତି ।\n{{SITENAME}} ସଭ୍ୟମାନଙ୍କୁ ଲଗ ଇନ କରିବା ନିମନ୍ତେ କୁକି ବ୍ୟବହାର କରିଥାଏ । ଆପଣଙ୍କ କୁକି ଅଚଳ କରାଯାଇଅଛି ।\nଦୟାକରି ତାହାକୁ ସଚଳ କରନ୍ତୁ ଓ ତାହା ପରେ ଆପଣଙ୍କ ନୂଆ ଇଉଜର ନାମ ଓ ପାସୱାର୍ଡ଼ ସହିତ ଲଗ ଇନ କରନ୍ତୁ ।",
        "nocookieslogin": "{{SITENAME}} ସଭ୍ୟ ମାନଙ୍କୁ ଲଗ ଇନ କରାଇବା ପାଇଁ କୁକି ବ୍ୟବହାର କରିଥାଏ ।\nଆପଣଙ୍କର କୁକି ଅଚଳ ହୋଇଅଛି ।\nଦୟାକରି ତାହାକୁ ସଚଳ କରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "nocookiesfornew": "ଯେହେତୁ ଆମ୍ଭେ ଏହାର ମୂଳାଧାର ଜାଣିପାରିଲୁ ନାହିଁ ଏହି ଇଉଜର ଖାତାଟି ତିଆରି କରାଗଲା ନାହିଁ ।\nଥୟ କରନ୍ତୁ କି ଆପଣ କୁକି ସଚଳ କରିଅଛନ୍ତି, ପୃଷ୍ଠାଟିକୁ ଆଉଥରେ ଲୋଡ଼ କରି ଚେଷ୍ଟା କରନ୍ତୁ ।",
+       "createacct-loginerror": "ଖାତା ସଫଳ ଭାବରେ ଖୋଲା ଗଲା କିନ୍ତୁ ଆପଣଙ୍କୁ ସ୍ଵତଃ ଲଗ ଇନ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି [[Special:UserLogin|manual login]] କୁ ଦେଖନ୍ତୁ।",
        "noname": "ଆପଣ ଗୋଟିଏ ବୈଧ ଇଉଜର ନାମ ଦେଇନାହାନ୍ତି ।",
        "loginsuccesstitle": "ଠିକଭାବେ ଲଗ-ଇନ ହେଲା",
        "loginsuccess": "'''ଆପଣ {{SITENAME}}ରେ \"$1\" ନାମରେ ଲଗ-ଇନ କରିଛନ୍ତି ।'''",
        "wrongpasswordempty": "ଦିଆଯାଇଥିବା ପାସବାର୍ଡ଼ଟି ଖାଲି ଛଡ଼ାଯାଇଛି ।\nଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "passwordtooshort": "ପାସୱାର୍ଡ଼ଟି ଅତି କମରେ {{PLURAL:$1|ଗୋଟିଏ ଅକ୍ଷର|$1ଟି ଅକ୍ଷର}}ର ହୋଇଥିବା ଲୋଡ଼ା ।",
        "passwordtoolong": "ପସସ୍ୱାର୍ଡଟି {{PLURAL:$1|1 ଅକ୍ଷର|$1 ଅକ୍ଷରଗୁଡିକ}}ଠାରୁ ଅଧିକ ହୋଇ ପାରିବ ନାହିଁ ।",
+       "passwordtoopopular": "ସାଧାରଣ ଭାବରେ ବଛାଯାଇଥିବା ପାସୱାର୍ଡ ବ୍ୟବହାର କରିହେବ ନାହିଁ। ଦୟାକରି ଏକ ଅଦ୍ଵିତୀୟ ପାସୱାର୍ଡ ବାଛନ୍ତୁ।",
        "password-name-match": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ଆପଣଙ୍କ ଇଉଜର ନାମ ଠାରୁ ଅଲଗା ହେବା ଉଚିତ ।",
        "password-login-forbidden": "ଏହି ଇଉଜର ନାମ ଓ ପାସୱାର୍ଡ଼ର ବ୍ୟବହାରକୁ ବାରଣ କରାଯାଇଅଛି ।",
        "mailmypassword": "ପାସୱାର୍ଡ଼ଟି ରିସେଟ କରିବେ",
        "eauthentsent": "ଆପଣ ଦେଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ଏକ ମେଲଟିଏ ପଠାଗଲା ।\nଆହୁରି ଅଧିକ ଇ-ମେଲ ଆପଣଙ୍କ ଖାତାକୁ ପଠାହେବା ଆଗରୁ, ଏହି ଖାତାଟି ନିଜର ବୋଲି ଥୟ କରିବା ପାଇଁ ପଠାଯାଇଥିବା ଇ-ମେଲରେ ଥିବା ସୂଚନା ଅନୁସାରେ କାମ କରନ୍ତୁ ।",
        "throttled-mailpassword": "ଗତ {{PLURAL:$1|ଏକ ଘଣ୍ଟାରେ|$1 ଘଣ୍ଟାରେ}} ଆପଣଙ୍କୁ ଏକ ପୁନଃସ୍ଥାପନ ଇମେଲଟିଏ ପଠାଯାଇଛି ।\nଅବ୍ୟବହାରକୁ ରୋକିବା ନିମନ୍ତେ, {{PLURAL:$1|ଏକ ଘଣ୍ଟାରେ|$1 ଘଣ୍ଟାରେ}} କେବଳ ଗୋଟିଏ ଇମେଲ ହିଁ ପଠାହେବ ।",
        "mailerror": "ମେଲ ପଠାଇବାରେ ଭୁଲ : $1",
-       "acct_creation_throttle_hit": "ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ ଦିନରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।\nତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।",
+       "acct_creation_throttle_hit": "ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ $2 ରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।\nତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।",
        "emailauthenticated": "$2 ତାରିଖ $3 ଘଟିକା ସମୟରେ ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାଟି ଥୟ ହେଲା ।",
        "emailnotauthenticated": "ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାଟି ଏ ଯାଏ ଥୟ ହୋଇନାହିଁ ।\nଏହି ସବୁ ସୁବିଧାକୁ ନେଇ ଆପଣଙ୍କୁ କୌଣସି ଇ-ମେଲ ପଠାଯିବ ନାହିଁ ।",
        "noemailprefs": "ଆପଣଙ୍କ ପସନ୍ଦ ଭିତରେ ଏକ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ ଯାହା ଏହି ସବୁ ସୁବିଧାକୁ ସଚଳ କରାଇବ ।",
        "createacct-another-realname-tip": "ପ୍ରକୃତ ନାମ ଦେବା ଆପଣଙ୍କ ଉପରେ ନିର୍ଭର କରେ ।\nଯଦି ଆପଣ ଏହା ଦିଅନ୍ତି, ତେବେ ଏହା ଆପଣଙ୍କ କାମ ପାଇଁ ଶ୍ରେୟ ଦେବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ।",
        "pt-login": "ଲଗ-ଇନ",
        "pt-login-button": "ଲଗ-ଇନ",
+       "pt-login-continue-button": "ଲଗଇନ ଜାରି ରଖନ୍ତୁ",
        "pt-createaccount": "ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "pt-userlogout": "ଲଗ-ଆଉଟ",
        "php-mail-error-unknown": "PHP ର ମେଲ() କାମରେ ଅଜଣା ଅସୁବିଧା ।",
        "changepassword-success": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ସଫଳତା ପୂର୍ବକ ବଦଳାଇ ଦିଆଗଲା !",
        "changepassword-throttled": "ଆପଣ ନିକଟରେ ଖୁବ ଅଧିକ ଥର ଲଗ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରିଛନ୍ତି ।\nଆଉ ଅଧିକ ଥର ଚେଷ୍ଟା କରିବା ଆଗରୁ ଦୟାକରି $1 ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ ।",
        "botpasswords": "ବଟ ପାସୱାର୍ଡ଼",
+       "botpasswords-disabled": "Bot ପାସୱାର୍ଡ ଅକାମି କରାଯାଇଛି।",
+       "botpasswords-no-central-id": "Bot ପାସୱାର୍ଡ ବ୍ୟବହାର କରିବାକୁ ଆପଣ ନିଶ୍ଚୟ ଏକ କେନ୍ଦ୍ରୀକୃତ ଖାତା ରେ ଲଗ ଇନ ହେଇଥିବାକୁ ହେବ।",
        "botpasswords-label-appid": "ବଟ ନାମ:",
        "botpasswords-label-create": "ତିଆରି କରିବେ",
        "botpasswords-label-update": "ଅପଡେଟ କରିବେ",
        "botpasswords-label-cancel": "ବାତିଲ",
        "botpasswords-label-delete": "ଲିଭାଇବେ",
        "botpasswords-label-resetpassword": "ପାସୱାର୍ଡ଼ଟି ରିସେଟ କରିବେ",
+       "botpasswords-bad-appid": "Bot ନାମ \"$1\"ବୈଧ ନୁହେଁ।",
+       "botpasswords-insert-failed": "Bot ନାମ \"$1\" ଯୋଗ କରାଯାଇ ପାରିଲା ନାହିଁ। ଏହା ଆଗରୁ ଯୋଗ ହେଇଥିଲା କି?",
+       "botpasswords-update-failed": "ବୋଟ ନାମ \"$1\" ଅଧୁନାତନ ହେଇପାରିଲା ନାହିଁ। ଏହା ଲିଭାଇ ଦିଆଯାଇଥିଲା କି ?",
+       "botpasswords-created-title": "Bot ପାସୱାର୍ଡ ତିଆରି ହେଲା",
+       "botpasswords-deleted-title": "Bot ପାସୱାର୍ଡ ଲିଭାଇ ଦିଆଗଲା",
+       "botpasswords-deleted-body": "ବ୍ୟବହାରକାରୀ \"$2\" ଙ୍କ bot ନାମ \"$1\"ରେ ଥିବା ପାସୱାର୍ଡ କୁ ଲିଭାଇ ଦିଆଗଲା।",
+       "botpasswords-not-exist": "ବ୍ୟବହାରକାରୀ \"$1\" ଙ୍କ \"$2\" ନାମକ bot ପାସୱାର୍ଡ ନାହିଁ।",
        "resetpass_forbidden": "ପାସୱାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ",
+       "resetpass_forbidden-reason": " ପାସୱାର୍ଡମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ:$1",
        "resetpass-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "resetpass-submit-loggedin": "ପାସୱାର୍ଡ଼ ବଦଳାନ୍ତୁ",
        "resetpass-submit-cancel": "ନାକଚ",
        "passwordreset-emaildisabled": "ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।",
        "passwordreset-username": "ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:",
        "passwordreset-domain": "ଡୋମେନ:",
-       "passwordreset-capture": "ଯାଉଥିବା ଇ-ମେଲଟି ଦେଖିବେ?",
-       "passwordreset-capture-help": "ଯଦି ଆପଣ ଘରଟିକୁ ଦେଖନ୍ତି ତେବେ (ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ସହିତ) ଇ-ମେଲଟି ଆପଣଙ୍କୁ ଦେଖାଯିବ ଓ ବାକି ସଭ୍ୟମାନଙ୍କୁ ଚାଲିଯିବ ।",
        "passwordreset-email": "ଇ-ମେଲ ଠିକଣା:",
        "passwordreset-emailtitle": "{{SITENAME}} ର ଖାତା ସବିଶେଷ",
        "passwordreset-emailtext-ip": "କେହିଜଣେ (ବୋଧେ ଆପଣ, $1 IP addressରୁ) {{SITENAME}} ($4)ରେ ପାସୱାର୍ଡ଼ ରି-ସେଟ କରିବା ପାଇଁ ଅନୁରୋଧ କରିଛନ୍ତି । ଉକ୍ତ ଇମେଲ ଠିକଣା ସହିତ ଏହି {{PLURAL:$3|ସଭ୍ୟ ଖାତାଟି|ସଭ୍ୟ ଖାତାମାନ}} ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି କିମ୍ବା ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଲା, ଏବଂ ଆଉ ପାସୱାର୍ଡ଼ଟି ବଦଳାଇବାକୁ ଚାହୁଁନାହାଁନ୍ତି ତାହେଲେ ଏହି ମେଲଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ।",
        "passwordreset-emailtext-user": "$1 ନାମକ ସଭ୍ୟଜଣକ {{SITENAME}}ରେ {{SITENAME}} ($4) ପାଇଁ ଆପଣଙ୍କ ପାସ ୱାର୍ଡ଼ ରିସେଟ କରିବାର ଅନୁରୋଧ କରିଛନ୍ତି । ତଳ {{PLURAL:$3|ଖାତାଟି|ଖାତାମାନ}} ଉକ୍ତ ଇମେଲ ସହିତ ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧଟି କରିଥାନ୍ତି କିମ୍ବା ଆପଣଙ୍କର ନିଜ ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଗଲା ତେବେ ଆପଣଙ୍କୁ ଆଉ ପାସୱାର୍ଡ଼ ବଦଳାଇବାର ଆବଶ୍ୟକତା ନାହିଁ । ଆପଣ ଏହି ମେସେଜଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରୁଥାନ୍ତୁ ।",
        "passwordreset-emailelement": "ଇଉଜର ନାମ: \n$1\n\nଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼: \n$2",
        "passwordreset-emailsentemail": "ଏକ ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲ ପଠାଇଦିଆଯାଇଅଛି ।",
+       "passwordreset-emailsentusername": "ଯଦି ଏହି ବ୍ୟବହାରକାରୀନାମ ସହିତ ଇମେଲ ଠିକଣା ସଂଯୁକ୍ତ ଥାଏ, ତେବେ ଏକ ପାସୱାର୍ଡ ପୁନଃସ୍ଥାପନ ଇମେଲ ପଠାଯିବ।",
+       "passwordreset-invalidemail": "ଅଯୋଗ୍ୟ ଇମେଲ ଠିକଣା",
+       "passwordreset-nodata": "ବ୍ୟବହାରକାରୀନାମ ବା ଏକ ଇମେଲ ଦିଆ ଯାଇନଥିଲା",
        "changeemail": "ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ କିମ୍ବା କାଢିବେ",
-       "changeemail-header": "à¬\96ାତା à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬¬à¬¦à¬³à¬¾à¬\87ବà­\87",
+       "changeemail-header": "à¬\87ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬¬à¬¦à¬³à¬¾à¬\87ବା à¬ªà¬¾à¬\87à¬\81 à¬\8fହି à¬«à¬°à­\8dମ à¬­à¬°à¬¨à­\8dତà­\81। à¬¯à¬¦à¬¿ à¬\86ପଣ à¬¨à¬¿à¬\9cର à¬\96ାତା à¬°à­\81 à¬\95à­\8cଣଶି à¬\87ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬° à¬¸à¬\82ଯà­\8bà¬\97  à¬¹à¬\9fାà¬\87ବାà¬\95à­\81 à¬\9aାହିà¬\81ବà­\87,ଫରà­\8dମ à¬¦à¬¾à¬\96ଲ à¬\95ଲାବà­\87ଳà­\87 à¬¨à­\82ତନ à¬\87ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬\95à­\81 à¬\96ାଲି à¬°à¬\96ନà­\8dତà­\81।",
        "changeemail-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "changeemail-oldemail": "ଏବେର ଇ-ମେଲ ଠିକଣା:",
        "changeemail-newemail": "ନୂଆ ଇ-ମେଲ ଠିକଣା:",
        "sig_tip": "ସମୟ ସହ ଆପଣଙ୍କ ସନ୍ତକ",
        "hr_tip": "ସମାନ୍ତରାଳ ରେଖା (ବେଳେବେଳେ ବ୍ୟବହାର କରିବେ)",
        "summary": "ସାରକଥା:",
-       "subject": "ବିଷୟ/ଶିରୋନାମା",
+       "subject": "ବିଷୟ:",
        "minoredit": "ଏହା ଏକ ସାମାନ୍ୟ ସମ୍ପାଦନା",
        "watchthis": "ଏହି ପୃଷ୍ଠାଟିକୁ ଦେଖିବେ",
        "savearticle": "ସାଇତିବେ [Save]",
        "savechanges": "ସାଇତିବେ [Save]",
+       "publishpage": "ପୃଷ୍ଠା ପ୍ରକାଶ କରନ୍ତୁ",
+       "publishchanges": "ବଦଳଗୁଡିକ ପ୍ରକାଶ କରନ୍ତୁ",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
        "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "saveprefs": "ସାଇତିବେ [Save]",
        "restoreprefs": "(ସମସ୍ତ ସ୍ଥାନରେ) ଆରମ୍ଭରୁ ଥିବା ମୂଳ ସଜାଣିକୁ ଫେରିଯିବେ",
        "prefs-editing": "ସମ୍ପାଦନା",
-       "rows": "ଧାଡ଼ି:",
-       "columns": "ସ୍ତମ୍ଭସବୁ:",
        "searchresultshead": "ଖୋଜନ୍ତୁ",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ଅସମ୍ପୂର୍ଣ ପୃଷ୍ଠା ଲିଙ୍କ</a> ସଜାଣି (ବାଇଟ) ପାଇଁ ସୀମା:",
        "stub-threshold-disabled": "ଅଚଳ କରିଦିଆଯାଇଛି",
        "userrights-reason": "କାରଣ:",
        "userrights-no-interwiki": "ଆପଣଙ୍କୁ ବାକି ଉଇକିରେ ସଭ୍ୟ ଅଧିକାର ବଦଳାଇବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।",
        "userrights-nodatabase": "$1 ଡାଟାବେସଟି ନାହିଁ ବା କେବଳ ସ୍ଥାନୀୟ ହୋଇ ରହିଛି ।",
-       "userrights-nologin": "ଆପଣ ପରିଚାଳକ ଖାତାରୁ [[Special:UserLogin|ଲଗ ଇନ]] କରି ସଭ୍ୟ ଅଧିକାରର ସୁବିଧା ଦେଇପାରିବେ ।",
-       "userrights-notallowed": "ଆପଣଙ୍କ ଖାତାରେ ସଭ୍ୟ ଅଧିକାର ଯୋଡ଼ିବା ବା କାଢ଼ିବାର ଅନୁମତି ନାହିଁ ।",
        "userrights-changeable-col": "ଆପଣ ବଦଳାଇପାରିବା ଗୋଠସମୂହ",
        "userrights-unchangeable-col": "ଯେଉଁ ଗୋଠସବୁ ଆପଣ ବଦଳାଇପାରିବେ ନାହିଁ",
        "userrights-conflict": "ସଭ୍ୟଙ୍କ ଅଧିକାର ବଦଳାଇବାରେ ମତଭେଦ! କରିଥିବା ବଦଳକୁ ପରଖି ନିଶ୍ଚିତ କରନ୍ତୁ ।",
-       "userrights-removed-self": "ଆପଣ ସଫଳ ଭାବେ ନିଜର ଅଧିକାର କାଢ଼ିଦେଲେ । ଆଗକୁ ଆପଣ ଆଉ ଏହା ଦେଖିପାରିବେ ନାହିଁ ।",
        "group": "ଗୋଠ:",
        "group-user": "ବ୍ୟବହାରକାରୀଗଣ",
        "group-autoconfirmed": "ଆପେଆପେ ଥୟ କରା ସଭ୍ୟ",
        "right-siteadmin": "ଡାଟାବେସକୁ କିଳିବେ ଓ ଖୋଲିବେ",
        "right-override-export-depth": "୫ଟି ଯାଏଁ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠା ସହିତ ସବୁ ପୃଷ୍ଠାକୁ ରପ୍ତାନୀ କରିବେ",
        "right-sendemail": "ବାକି ସଭ୍ୟ ମାନଙ୍କୁ ଇ-ମେଲ ପଠାଇବେ",
-       "right-passwordreset": "ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ ଇମେଲ କରିବେ",
        "newuserlogpage": "ବ୍ୟବହାରକାରୀ ତିଆରି ଲଗ",
        "newuserlogpagetext": "ସଭ୍ୟଙ୍କର ଖାତା ଗଠନ ପାଇଁ ଏକ ଇତିହାସ ଅଛି ।",
        "rightslog": "ସଭ୍ୟଙ୍କ ଅଧିକାରର ଲଗ",
        "uploaddisabledtext": "ଫାଇଲ ଅପଲୋଡ଼  ଅଚଳ କରାଯାଇଅଛି ।",
        "php-uploaddisabledtext": "PHPରେ ଫାଇଲ ଅପଲୋଡ଼କୁ ଅଚଳ କରାଯାଇଅଛି ।\nଦୟାକରି ଫାଇଲ_ଅପଲୋଡ଼ ସଜାଣିକୁ ପରଖି ନିଅନ୍ତୁ ।",
        "uploadscripted": "ଏହି ଫାଇଲଟିରେ HTML ବା ସ୍କ୍ରିପ୍ଟ କୋଡ଼ ଥିବାରୁ ଏକ ବେବ ବ୍ରାଉଜରରେ ଅଲଗା ରଖିବେ ।",
-       "uploadscriptednamespace": "ଏହି SVG ଫାଇଲରେ ଏକ ଅନୀତିକର ନେମସ୍ପେସ \"$1\" ରହିଛି ।",
+       "uploadscriptednamespace": "ଏହି SVG ଫାଇଲରେ ଏକ ଅନୀତିକର ନେମସ୍ପେସ \"<nowiki>$1</nowiki>\" ରହିଛି ।",
        "uploadinvalidxml": "ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲରେ XML ପାର୍ସ ହୋଇପାରିବ ନାହିଁ ।",
        "uploadvirus": "ଏହି ଫାଇଲଟିରେ ଏକ ଭାଇରସ ରହିଅଛି!\nସବିଶେଷ: $1",
        "uploadjava": "ଏହି ଫାଇଲଟି ଏକ ZIP ଫାଇଲ ଯେଉଁଥିରେ Java .class ଫାଇଲ ଅଛି ।\nJava ଫାଇଲ ଅପଲୋଡ଼ କରିବା ଅନୁମୋଦିତ ନୁହେଁ କାରଣ ସେସବୁ ସୁରକ୍ଷା ବଳୟକୁ ନଷ୍ଟ କରିଦିଅନ୍ତି ।",
        "whatlinkshere": "ଏଠାରେ ଥିବା ଲିଙ୍କ",
        "whatlinkshere-title": "\"$1\" କୁ ପୃଷ୍ଠା ଲିଙ୍କ",
        "whatlinkshere-page": "ପୃଷ୍ଠା:",
-       "linkshere": "ଏହି ପୃଷ୍ଠା ସବୁ  <strong>[[:$1]]</strong> ସହ ଯୋଡା ଯାଇଅଛି:",
+       "linkshere": "à¬\8fହି à¬ªà­\83ଷà­\8dଠା à¬¸à¬¬à­\81  <strong>[[:$1]]</strong> à¬¸à¬¹ à¬¯à­\8bଡ଼ା à¬¯à¬¾à¬\87à¬\85à¬\9bି:",
        "nolinkshere": "'''[[:$1]]''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
        "nolinkshere-ns": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''[[:$1]]''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
        "isredirect": "ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା",
        "lag-warn-high": "ଅଧିକ ଡାଟାବେସ ସର୍ଭର ପଛୁଆ ଅବସ୍ଥା ହେତୁ $1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}ରୁ ନୂଆ ବଦଳସବୁ ଏହି ତାଲିକାରେ ଦେଖାଯିବ ନାହିଁ ।",
        "watchlistedit-normal-title": "ଦେଖଣାତାଲିକା ସମ୍ପାଦନା କରିବେ",
        "watchlistedit-normal-legend": "ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡିକରୁ ଶିରୋନାମା ହଟାଇବେ ।",
-       "watchlistedit-normal-explain": "à¬\86ପଣà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାର à¬¶à¬¿à¬°à­\8bନାମାà¬\97à­\81ଡିà¬\95 à¬¤à¬³à­\87 à¬¦à­\87à¬\96ା à¬¯à¬¾à¬\87à¬\9bି à¥¤\nଶିରà­\8bନାମା  ହଟାଇବାକୁ ଚାହୁଁଥିଲେ, ଏହାର ପାଖରେ ଥିବା ବାକ୍ସରେ ଟିକ ମାରନ୍ତୁ ଏବଂ \"{{int:Watchlistedit-normal-submit}}\"ରେ କ୍ଲିକ କରନ୍ତୁ ।\nଆପଣ [[Special:EditWatchlist/raw|edit the raw list]] ମଧ୍ୟ କରିପାରିବେ ।",
+       "watchlistedit-normal-explain": "à¬\86ପଣà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାର à¬¶à¬¿à¬°à­\8bନାମà¬\97à­\81ଡ଼ିà¬\95 à¬¤à¬³à­\87 à¬¦à­\87à¬\96ା à¬¯à¬¾à¬\87à¬\9bି à¥¤\nଶିରà­\8bନାମ ହଟାଇବାକୁ ଚାହୁଁଥିଲେ, ଏହାର ପାଖରେ ଥିବା ବାକ୍ସରେ ଟିକ ମାରନ୍ତୁ ଏବଂ \"{{int:Watchlistedit-normal-submit}}\"ରେ କ୍ଲିକ କରନ୍ତୁ ।\nଆପଣ [[Special:EditWatchlist/raw|edit the raw list]] ମଧ୍ୟ କରିପାରିବେ ।",
        "watchlistedit-normal-submit": "ଶିରୋନାମାଗୁଡିକୁ ଲିଭାଇବେ",
        "watchlistedit-normal-done": "{{PLURAL:$1|ଗୋଟିଏ ନାମ|$1 ଗୋଟି ନାମ}} ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରୁ କାଢ଼ିଦିଆଗଲା:",
        "watchlistedit-raw-title": "ଫାଙ୍କା ଦେଖା ତାଲିକାଟିର ସମ୍ପାଦନା କରିବେ",
        "feedback-thanks-title": "ସାଧୁବାଦ!",
        "searchsuggest-search": "ଖୋଜନ୍ତୁ",
        "searchsuggest-containing": "ଖୋଜୁଛି...",
-       "api-error-badaccess-groups": "ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।",
        "api-error-badtoken": "ଭିତର ଅସୁବିଧା: ଖରାପ ଟୋକନ ।",
-       "api-error-copyuploaddisabled": "URL ଦେଇ ଅପଲୋଡ଼ କରିବା ଏହି ସର୍ଭରରେ ଅଚଳ କରାଯାଇଅଛି ।",
-       "api-error-duplicate": "ଏହି ସାଇଟରେ ସେହି ଏକା ତଥ୍ୟ ଥିବା {{PLURAL:$1| ଆଉ ଏକ ଫାଇଲ ରହିଅଛି|ଆଉ କିଛି ଫାଇଲ ରହି ଅଛନ୍ତି}} ।",
-       "api-error-duplicate-archive": "ସେହି ସାଇଟରେ ସେହି ଏକା ଭିତର ଭାଗ ସହିତ ଆଗରୁ {{PLURAL:$1|ଆଉ ଫାଇଲଟିଏ ଥିଲା|ଆଉ କେତେକ ଫାଇଲ ଥିଲା}}, କିନ୍ତୁ {{PLURAL:$1|ତାହାକୁ|ସେସବୁକୁ}} ଲିଭାଇ ଦିଆଯାଇଅଛି ।",
-       "api-error-empty-file": "ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ଖାଲି ଅଟେ ।",
        "api-error-emptypage": "ନୂଆ, ଖାଲି ପୃଷ୍ଠ ତିଆରି କରିବାର ଅନୁମତି ନାହି ।",
-       "api-error-fetchfileerror": "ଭିତର ଅସୁବିଧା: ଏହି ଫାଇଲଟି ପାଖରେ ପହଞ୍ଚିବା ବେଳେ କିଛି ଅସୁବିଧା ହେଲା ।",
-       "api-error-fileexists-forbidden": "\"$1\" ନାମରେ ଗୋଟିଏ ଫାଇଲ ଆଗରୁ ଅଛି, ଏବଂ ଏହା ଉପରେ ଲେଖି ହେବନି ।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" ନାମରେ ଗୋଟିଏ ଫାଇଲ ବଣ୍ଟାଯାଇଥିବା ସାଇତାଗୃହରେ ଅଛି, ଏବଂ ଏହା ବାଲାଯାଇପାରିବ ନାହିଁ ।",
-       "api-error-file-too-large": "ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ବିରାଟ ଅଟେ ।",
-       "api-error-filename-tooshort": "ଫାଇଲ ନାମଟି ଖୁବ ଛୋଟ ।",
-       "api-error-filetype-banned": "ଏହି ପ୍ରକାରର ଫାଇଲ ବାରଣ କରାଯାଇଅଛି ।",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ଏକ ଅନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର ନୁହେଁ|ମାନ ଅନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର ନୁହଁନ୍ତି}} ।\nଅନୁମୋଦିତ {{PLURAL:$3|ଫାଇଲ ପ୍ରକାର ହେଲା|ଫାଇଲଗୁଡିକର ପ୍ରକାର ହେଲା}} $2 ।",
-       "api-error-filetype-missing": "ଫାଇଲଟିର ଏକ୍ସଟେନସନ ନାହିଁ ।",
-       "api-error-hookaborted": "ଏକ ଏକ୍ସଟେନସନ ହୁକ ଦେଇ ଆପଣ କରୁଥିବା ବଦଳଟି ବନ୍ଦ କରିଦିଆଗଲା ।",
-       "api-error-http": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ସହ ଯୋଡ଼ି ହେଉନାହିଁ ।",
-       "api-error-illegal-filename": "ଏହି ଫାଇଲ ନାମଟି ଅନୁମୋଦିତ ନୁହେଁ ।",
-       "api-error-internal-error": "ଆଭ୍ୟନ୍ତରୀଣ ଅସୁବିଧା: ଏହି ଉଇକିରେ ଆପଣଙ୍କ ଅପଲୋଡ଼ କରିବା କାଳରେ କିଛି ଅସୁବିଧା ଘଟିଲା ।",
-       "api-error-invalid-file-key": "ଭିତର ଅସୁବିଧା: ଫାଇଲଟି ଅସ୍ଥାୟୀ ସାଇତାଘର ଭିତରୁ ମିଳିଲାନାହିଁ ।",
-       "api-error-missingparam": "ଭିତର ଅସୁବିଧା: ହଜିଯାଇଥିବା ପାରାମିଟର ସବୁକୁ ଅନୁରୋଧ କ୍ରମେ ଦେଖାଇଦିଆଗଲା ।",
-       "api-error-missingresult": "ଭିତର ଅସୁବିଧା: ନକଲ କରିବା ଠିକରେ ହେଲାକି ନାହିଁ  ଜାଣି ପାରିଲା ନାହିଁ ।",
-       "api-error-mustbeloggedin": "ଫାଇଲ ଅପଲୋଡ଼ କରିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
-       "api-error-mustbeposted": "ଭିତର ଅସୁବିଧା: କରାଯାଇଥିବା ଅନୁରୋଧ ପାଇଁ HTTP POST ଦରକାର ।",
-       "api-error-noimageinfo": "ଅପଲୋଡ଼ ସଫଳ ହେଲା, କିନ୍ତୁ ସର୍ଭରଟି ଆମ୍ଭଙ୍କୁ ଫାଇଲଟୀ ବାବଦରେ କିଛି ବିବରଣୀ ଦେଲା ନାହିଁ ।",
-       "api-error-nomodule": "ଭିତର ଅସୁବିଧା: ଅପଲୋଡ଼ ମୋଡୁଲ ଠିକ କରାଯାଇନାହିଁ ।",
-       "api-error-ok-but-empty": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଠାରୁ କିଛି ଖବର ନାହିଁ ।",
-       "api-error-overwrite": "ଆଗରୁଥିବା ଏକ ଫାଇଲ ଉପରେ ମଡ଼ାଇବା ଅନୁମୋଦିତ ନୁହେଁ ।",
-       "api-error-stashfailed": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଅସ୍ଥାୟୀ ଫାଇଲକୁ ସାଇତି ପାରିଲା ନାହିଁ ।",
        "api-error-publishfailed": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଅସ୍ଥାୟୀ ଫାଇଲକୁ ପ୍ରକାଶ କରିପାରିଲା ନାହିଁ ।",
-       "api-error-stasherror": "ଫାଇଲଟିକୁ ଷ୍ଟାସରେ ଅପଲୋଡ଼ କଲାବେଳେ ତ୍ରୁଟିଟିଏ ପରିଲକ୍ଷିତ ହେଲା ।",
-       "api-error-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 0156bdb..7171bae 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Macofe",
                        "ਪ੍ਰਚਾਰਕ",
-                       "Tow"
+                       "Tow",
+                       "Sony dandiwal"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
@@ -50,7 +51,7 @@
        "tog-enotifminoredits": "ਸਫ਼ਿਆਂ ਅਤੇ ਫ਼ਾਈਲਾਂ ਦੀਆਂ ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੀ ਮੈਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "tog-enotifrevealaddr": "ਇਤਲਾਹ ਦੇਣ ਵਾਲੀਆਂ ਈ-ਮੇਲਾਂ ਵਿੱਚ ਮੇਰਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਕਰੋ",
        "tog-shownumberswatching": "ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ",
-       "tog-oldsig": "ਮੌਜੂਦਾ ਦਸਤਖ਼ਤ:",
+       "tog-oldsig": "ਤà©\81ਹਾਡà©\87 à¨®à©\8cà¨\9cà©\82ਦਾ à¨¦à¨¸à¨¤à¨\96਼ਤ:",
        "tog-fancysig": "ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕੀਲਿਖਤ ਮੰਨੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)",
        "tog-uselivepreview": "ਮੌਜੂਦਾ ਝਲਕ ਵਰਤੋ",
        "tog-forceeditsummary": "ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦੇਵਾਂ ਤਾਂ ਮੈਨੂੰ ਆਗਾਹ ਕਰੋ",
        "talk": "ਚਰਚਾ",
        "views": "ਵਿਊ",
        "toolbox": "ਸੰਦ",
+       "tool-link-emailuser": "ਇਹ {{GENDER:$1|ਯੂਜ਼ਰ}} ਨੂੰ ਈਮੇਲ ਭੇਜੋ",
        "userpage": "ਵਰਤੋਂਕਾਰ ਸਫ਼ਾ ਵੇਖੋ",
        "projectpage": "ਪ੍ਰੋਜੈਕਟ ਸਫ਼ਾ ਵੇਖੋ",
        "imagepage": "ਫਾਇਲ ਸਫ਼ਾ ਵੇਖੋ",
        "sort-descending": "ਘਟਦਾ ਕ੍ਰਮ",
        "sort-ascending": "ਵਧਦਾ ਕ੍ਰਮ",
        "nstab-main": "ਸਫ਼ਾ",
-       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨µà¨°à¨\95ਾ",
+       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¸à¨«à¨¼ਾ",
        "nstab-media": "ਮੀਡੀਆ ਸਫ਼ਾ",
        "nstab-special": "ਖ਼ਾਸ ਸਫ਼ਾ",
        "nstab-project": "ਪਰੋਜੈਕਟ ਸਫ਼ਾ",
        "createacct-yourpasswordagain-ph": "ਪਾਸਵਰਡ ਫੇਰ ਦਿਉ",
        "userlogin-remembermypassword": "ਮੈਨੂੰ ਲਾਗਇਨ ਰੱਖੋ",
        "userlogin-signwithsecure": "ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਰੱਖੋ",
+       "cannotcreateaccount-title": "ਖਾਤੇ ਨਹੀਂ ਬਣ ਸਕੇ",
        "yourdomainname": "ਤੁਹਾਡਾ ਡੋਮੇਨ:",
        "password-change-forbidden": "ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।",
        "externaldberror": "ਜਾਂ ਤਾਂ ਪ੍ਰਮਾਣਕੀ ਡਾਟਾਬੇਸ ਦੋਸ਼ ਆਇਆ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਾਹਰੀ ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "passwordreset-emaildisabled": "ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।",
        "passwordreset-username": "ਵਰਤੋਂਕਾਰ ਨਾਂ:",
        "passwordreset-domain": "ਡੋਮੇਨ:",
-       "passwordreset-capture": "ਨਤੀਜੇ ਵਜੋਂ ਬਣਦੀ ਈਮੇਲ ਵੇਖੋ?",
-       "passwordreset-capture-help": "ਜੇਕਰ ਤੁਸੀਂ ਇਹ ਬਕਸਾ ਸਹੀ ਕਰਦੇ ਹੋ ਤਾਂ ਇਹ ਈਮੇਲ (ਅਸਥਾਈ ਪਾਸਵਰਡ ਸਮੇਤ) ਤੁਹਾਨੂੰ ਵਿਖਾਈ ਜਾਵੇਗੀ ਅਤੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਵੀ ਭੇਜੀ ਜਾਵੇਗੀ।",
        "passwordreset-email": "ਈਮੇਲ ਐਡਰੈੱਸ:",
        "passwordreset-emailtitle": "{{SITENAME}} ਤੇ ਖਾਤੇ ਦੀ ਜਾਣਕਾਰੀ",
        "passwordreset-emailtext-ip": "ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}}\n($4) ਲਈ ਖਾਤਾ ਤਫ਼ਸੀਲ ਯਾਦ-ਦਹਾਨੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਹ {{PLURAL:\n$3|ਖਾਤਾ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜਿਆ ਹੈ|ਖਾਤੇ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜੇ ਹਨ}}:\n$2\n\nਇਹ ਆਰਜ਼ੀ ਪਾਸਵਰਡ\n{{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ {{PLURAL:$3|ਜਾਵੇਗਾ|ਜਾਣਗੇ}}।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।",
        "savechanges": "ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ",
        "preview": "ਝਲਕ",
        "showpreview": "ਝਲਕ ਵਿਖਾਓ",
-       "showdiff": "ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\89",
+       "showdiff": "ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\93",
        "anoneditwarning": "'''ਖ਼ਬਰਦਾਰ:''' ਤੁਸੀਂ ਦਾਖ਼ਲ ਨਹੀਂ ਹੋ। ਕੋਈ ਵੀ ਸੋਧ ਕਰਨ 'ਤੇ ਤੁਹਾਡਾ ਆਈ.ਪੀ. ਪਤਾ ਲੋਕਾਂ ਨੂੰ ਵਿਖਾਈ ਦੇਵੇਗਾ। ਜੇਕਰ ਤੁਸੀਂ <strong>[$1 ਦਾਖ਼ਲ ਹੁੰਦੇ ਹੋ]</strong> ਜਾਂ <strong>[$2 ਖਾਤਾ ਬਣਾਉਂਦੇ ਹੋ]</strong> ਤਾਂ ਤੁਹਾਡੀਆਂ ਸੋਧਾਂ ਦਾ ਸਿਹਰਾ, ਹੋਰ ਫ਼ਾਇਦਿਆਂ ਸਮੇਤ, ਤੁਹਾਡੇ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਸਿਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।",
        "anonpreviewwarning": "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
        "missingsummary": "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
        "nosuchsectiontitle": "ਭਾਗ ਲੱਭ ਨਹੀਂ ਰਿਹਾ",
        "nosuchsectiontext": "ਤੁਸੀਂ ਨਾ-ਮੌਜੂਦ ਭਾਗ ਨੂੰ ਸੋਧਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੈ।\nਸ਼ਾਇਦ ਤੁਹਾਡੇ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੇ ਦੌਰਾਨ ਇਹ ਮਿਟਾਇਆ ਜਾਂ ਇਸਦਾ ਸਿਰਲੇਖ ਬਦਲਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।",
        "loginreqtitle": "ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ",
-       "loginreqlink": "ਦਾਖਲ",
+       "loginreqlink": "ਦਾà¨\96਼ਲ",
        "loginreqpagetext": "ਹੋਰ ਸਫ਼ੇ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ $1 ਕਰਨਾ ਪਵੇਗਾ।",
        "accmailtitle": "ਪਾਸਵਰਡ ਭੇਜਿਆ।",
        "accmailtext": "[[User talk:$1|$1]] ਲਈ ਰਲ਼ਵੇਂ ਤੌਰ ’ਤੇ ਬਣਿਆ ਪਾਸਵਰਡ $2 ਨੂੰ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।\nਇਸ ਨਵੇਂ ਖਾਤੇ ਲਈ ਲਾਗਇਨ ਕਰਨ ਤੋਂ ਬਾਅਦ ''[[Special:ChangePassword|ਪਾਸਵਰਡ ਬਦਲੋ]]'' ’ਤੇ ਜਾ ਕੇ ਪਾਸਵਰਡ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।",
        "searchprofile-advanced-tooltip": "ਆਪਣੀਆਂ ਬਣਾਈਆਂ ਨਾਂ-ਥਾਂਵਾਂ ਵਿੱਚ ਖੋਜੋ",
        "search-result-size": "$1 ({{PLURAL:$2|1 ਸ਼ਬਦ|$2 ਸ਼ਬਦ}})",
        "search-result-category-size": "{{PLURAL:$1|1 ਮੈਂਬਰ|$1 ਮੈਂਬਰ}} ({{PLURAL:$2|1 ਉਪਸ਼੍ਰੇਣੀ|$2 ਉਪਸ਼੍ਰੇਣੀਆਂ}}, {{PLURAL:$3|1 ਫ਼ਾਈਲ|$3 ਫ਼ਾਈਲਾਂ}})",
-       "search-redirect": "($1 à¨°à©\80ਡਿਰੈਕਟ)",
+       "search-redirect": "($1 à¨¤à©\8bà¨\82 à¨°à©\80ਡਾà¨\87ਰੈਕਟ)",
        "search-section": "(ਹਿੱਸਾ $1)",
        "search-category": "(ਸ਼੍ਰੇਣੀ $1)",
        "search-file-match": "(ਫ਼ਾਈਲ ਦੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਰਲ਼ਦਾ-ਮਿਲ਼ਦਾ)",
        "saveprefs": "ਸੰਭਾਲੋ",
        "restoreprefs": "ਸਾਰੀਆਂ ਮੂਲ ਸੈਟਿੰਗਾਂ ਬਹਾਲ ਕਰੋ (ਸਾਰੇ ਹਿੱਸਿਆਂ ਵਿੱਚ)",
        "prefs-editing": "ਸੋਧ ਜਾਰੀ",
-       "rows": "ਕਤਾਰਾਂ:",
-       "columns": "ਕਾਲਮ:",
        "searchresultshead": "ਖੋਜ",
        "stub-threshold-sample-link": "ਨਮੂਨਾ",
        "stub-threshold-disabled": "ਬੰਦ ਹੈ",
        "userrights-reason": "ਕਾਰਨ:",
        "userrights-no-interwiki": "ਤੁਹਾਨੂੰ ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਹੱਕਾਂ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-nodatabase": "ਡੈਟਾਬੇਸ $1 ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਕਾਮੀ ਨਹੀਂ ਹੈ।",
-       "userrights-notallowed": "ਤੁਹਾਡੇ ਕੋਲ਼ ਵਰਤੋਂਕਾਰ ਹੱਕ ਦੇਣ ਜਾਂ ਖੋਹਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-changeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਸਕਦੇ ਹੋ",
        "userrights-unchangeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਨਹੀਂ ਸਕਦੇ",
        "group": "ਟੋਲੀ:",
        "right-upload_by_url": "URL ਤੋਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ",
        "right-autoconfirmed": "ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ",
        "right-bot": "ਇੱਕ ਸਵੈ-ਚਾਲਤ ਅਮਲ ਵਜੋਂ ਗਿਣਿਆ ਜਾਣਾ",
-       "right-writeapi": "ਲਿਖਾਈ ਏਪੀਆਈ ਦੀ ਵਰਤੋੰ",
+       "right-writeapi": "ਲਿਖਾਈ API ਵਰਤੋ",
        "right-delete": "ਸਫ਼ੇ ਹਟਾਓ",
        "right-bigdelete": "ਵੱਡੇ ਅਤੀਤ ਵਾਲੇ ਪੰਨੇ ਮਿਟਾਉਣੇ",
        "right-browsearchive": "ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ",
        "right-userrights-interwiki": "ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਸੋਧ ਕਰਨਾ",
        "right-siteadmin": "ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣਾ ਤੇ ਖੋਲ੍ਹਣਾ",
        "right-sendemail": "ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ",
-       "right-passwordreset": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈਮੇਲ ਵੇਖੋ",
        "grant-group-email": "ਈ-ਮੇਲ ਭੇਜੋ",
        "grant-group-customization": "ਅਨੁਕੂਲਨ ਅਤੇ ਪਸੰਦਾੰ",
        "grant-createaccount": "ਖਾਤੇ ਬਣਾਓ",
        "recentchanges-legend-plusminus": "(''±੧੨੩'')",
        "recentchanges-submit": "ਦਿਖਾਓ",
        "rcnotefrom": "'''$2''' ਤੱਕ ('''$1''' ਤੱਕ ਦਿੱਸਦੇ) ਬਦਲਾਵ ਹੇਠ ਦਿੱਤੀਆਂ ਹਨ।",
-       "rclistfrom": "$3 $2 ਤੋਂ ਸ਼ੁਰੂ ਕਰਕੇ ਨਵੀਆਂ ਸੋਧਾਂ ਵਖਾਓ",
+       "rclistfrom": "$3 $2 à¨¤à©\8bà¨\82 à¨¸à¨¼à©\81ਰà©\82 à¨\95ਰà¨\95à©\87 à¨¨à¨µà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨µà¨¿à¨\96ਾà¨\93",
        "rcshowhideminor": "ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ $1",
        "rcshowhideminor-show": "ਵੇਖੋ",
        "rcshowhideminor-hide": "ਓਹਲੇ",
        "rcshowhidemine-hide": "ਓਹਲੇ",
        "rcshowhidecategorization-show": "ਦਿਖਾਓ",
        "rcshowhidecategorization-hide": "ਲੁਕਾਉ",
-       "rclinks": "ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿੱਚ ਹੋਈਆਂ $1 ਤਬਦੀਲੀਆਂ ਵਖਾਓ<br /> $3",
+       "rclinks": "ਪਿà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 $1 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\93<br /> $3",
        "diff": "ਫ਼ਰਕ",
        "hist": "ਅਤੀਤ",
        "hide": "ਲੁਕਾਓ",
        "uploaddisabled": "ਅੱਪਲੋਡ ਆਯੋਗ ਹੈ",
        "copyuploaddisabled": "URL ਰਾਹੀਂ ਅੱਪਲੋਡ ਰੋਕੇ ਹੋਏ ਹਨ।",
        "uploaddisabledtext": "ਫ਼ਾਈਲਾਂ ਦੇ ਅੱਪਲੋਡ ਰੋਕੇ ਹੋਏ ਹਨ।",
-       "uploadscriptednamespace": "ਇਸ ਐੱਸ.ਵੀ.ਜੀ. ਫ਼ਾਈਲ ਵਿੱਚ ਇੱਕ ਗ਼ੈਰ-ਕਨੂੰਨੀ ਨਾਂ-ਥਾਂ \"$1\" ਹੈ।",
+       "uploadscriptednamespace": "ਇਸ ਐੱਸ.ਵੀ.ਜੀ. ਫ਼ਾਈਲ ਵਿੱਚ ਇੱਕ ਗ਼ੈਰ-ਕਨੂੰਨੀ ਨਾਂ-ਥਾਂ \"<nowiki>$1</nowiki>\" ਹੈ।",
        "uploadvirus": "ਇਹ ਫਾਇਲ ਵਿੱਚ ਵਾਇਰਸ ਹੈ! ਵੇਰਵੇ ਲਈ ਵੇਖੋ: $1",
        "upload-source": "ਸਰੋਤ ਫਾਇਲ",
        "sourcefilename": "ਸੋਰਸ ਫਾਇਲ ਨਾਂ:",
        "tooltip-ca-talk": "ਸਮਗੱਰੀ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ",
        "tooltip-ca-edit": "ਇਹ ਸਫ਼ਾ ਸੋਧੋ",
        "tooltip-ca-addsection": "ਨਵਾਂ ਭਾਗ ਸ਼ੁਰੂ ਕਰੋ",
-       "tooltip-ca-viewsource": "à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¸à©\81ਰੱà¨\96ਿà¨\85ਤ à¨¹à©\88।\nਤà©\81ਸà©\80à¨\82 à¨\87ਹਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।",
+       "tooltip-ca-viewsource": "à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¸à©\81ਰੱà¨\96ਿà¨\85ਤ à¨¹à©\88।\nਤà©\81ਸà©\80à¨\82 à¨\87ਸਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।",
        "tooltip-ca-history": "ਇਸ ਸਫ਼ੇ ਦੇ ਪਿਛਲੇ ਰੀਵਿਜਨ",
        "tooltip-ca-protect": "ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਕਰੋ",
        "tooltip-ca-unprotect": "ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ",
        "tooltip-minoredit": "ਇਸ ’ਤੇ ਬਤੌਰ ਛੋਟੀ ਤਬਦੀਲੀ ਨਿਸ਼ਾਨ ਲਾਓ",
        "tooltip-save": "ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ",
        "tooltip-preview": "ਆਪਣੀ ਤਬਦੀਲੀ ਦੀ ਝਲਕ ਵੇਖੋ, ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ!",
-       "tooltip-diff": "ਤੁਹਾਡੇ ਵੱਲੋਂ ਲਿਖਤ ਵਿੱਚ ਕੀਤੀਆਂ ਤਬਦੀਲੀਆਂ ਵਖਾਉਂਦਾ ਹੈ",
+       "tooltip-diff": "ਤà©\81ਹਾਡà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨²à¨¿à¨\96ਤ à¨µà¨¿à©±à¨\9a à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\89à¨\82ਦਾ à¨¹à©\88",
        "tooltip-compareselectedversions": "ਇਸ ਸਫ਼ੇ ਦੀਆਂ ਦੋ ਚੁਣੀਆਂ ਹੋਈਆਂ ਸੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਵੇਖੋ",
        "tooltip-watch": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਪਾਓ",
        "tooltip-watchlistedit-normal-submit": "ਸਿਰਲੇਖ ਹਟਾਓ",
        "file-info-size": "$1 × $2 ਪਿਕਸਲ, ਫ਼ਾਈਲ ਅਕਾਰ: $3, MIME ਕਿਸਮ: $4",
        "file-nohires": "ਇਸ ਤੋਂ ਵੱਡੀ ਤਸਵੀਰ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "svg-long-desc": "SVG ਫ਼ਾਈਲ, ਆਮ ਤੌਰ ’ਤੇ $1 × $2 ਪਿਕਸਲ, ਫ਼ਾਈਲ ਦਾ ਅਕਾਰ: $3",
-       "show-big-image": "ਅਸਲ ਫਾਈਲ",
+       "show-big-image": "à¨\85ਸਲ à¨«à¨¼à¨¾à¨\88ਲ",
        "show-big-image-preview": "ਇਸ ਝਾਤ ਦਾ ਅਕਾਰ: $1.",
        "show-big-image-other": "ਹੋਰ {{PLURAL:$2|ਰੈਜ਼ੋਲਿਊਸ਼ਨ|ਰੈਜ਼ੋਲਿਊਸ਼ਨਜ਼}}: $1.",
        "show-big-image-size": "$1 × $2 ਪਿਕਸਲ",
        "feedback-submit": "ਹਵਾਲੇ ਕਰੋ",
        "feedback-thanks-title": "ਧੰਨਵਾਦ!",
        "feedback-useragent": "ਉਪਭੋਗੀ ਏਜੰਟ:",
-       "searchsuggest-search": "ਖੋਜ",
-       "api-error-badaccess-groups": "ਤੁਹਾਨੂੰ ਇਸ ਵਿਕੀ ਉੱਤੇ ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+       "searchsuggest-search": "ਖੋਜ {{SITENAME}}",
        "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-missing": "ਇਸ ਫ਼ਾਈਲ ਨਾਂ ਵਿਚ ਐਕਸਟੈਂਸ਼ਨ ਨਹੀਂ ਹੈ।",
-       "api-error-http": "ਅੰਦਰੂਨੀ ਦੋਸ਼: ਸਰਵਰ ਨਾਲ਼ ਰਾਬਤਾ ਨਹੀਂ ਹੋ ਰਿਹਾ",
-       "api-error-illegal-filename": "ਇਸ ਫ਼ਾਈਲ-ਨਾਂ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
-       "api-error-mustbeloggedin": "ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਤੁਹਾਡਾ ਦਾਖ਼ਲ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।",
-       "api-error-mustbeposted": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਬੇਨਤੀ ਲਈ HTTP POST ਲੋੜੀਂਦੀ ਹੈ।",
-       "api-error-noimageinfo": "ਅੱਪਲੋਡ ਸਫਲ਼ ਹੋਇਆ ਪਰ ਸਰਵਰ ਨੇ ਇਸ ਫ਼ਾਈਲ ਬਾਰੇ ਸਾਨੂੰ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ।",
-       "api-error-nomodule": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਕੋਈ ਅੱਪਲੋਡ ਮਾਪਦੰਡ ਨਹੀਂ ਰੱਖਿਆ ਗਿਆ।",
-       "api-error-ok-but-empty": "ਅੰਦਰੂਨੀ ਦੋਸ਼: ਸਰਵਰ ਵੱਲੋਂ ਕੋਈ ਜੁਆਬ ਨਹੀਂ।",
-       "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 d96cf90..8f3f530 100644 (file)
@@ -25,6 +25,7 @@
        "tog-enotifusertalkpages": "Éspédier un imèle su em bouéte quante m'pache \"Dvise Uzeu\" est candgée.",
        "tog-enotifminoredits": "M'éspédier étou un imèle pou chés tiots canjemints d'chés paches o d'chés fichiés",
        "tog-shownumberswatching": "Aficher ch'nombe ed gins qu'ont vu.",
+       "tog-uselivepreview": "Implouéyer ch'rade intrévir",
        "tog-watchlisthideown": "Muche ems édicions dseur el lisse à suire",
        "tog-watchlisthidebots": "Muche chés édicions des robots su el lisse à suire",
        "tog-watchlisthideminor": "Muche chés tiotes édicions su el lisse à suire.",
        "oct": "Oct",
        "nov": "Nov",
        "dec": "Déc",
+       "january-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} jinvié",
+       "february-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} févrié",
+       "march-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} marche",
+       "april-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} avri",
+       "may-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} moai",
+       "june-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} join",
+       "july-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} juilet",
+       "august-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} eut",
+       "september-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} siétimbe",
+       "october-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} octobe",
+       "november-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} novimbe",
+       "december-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} déchimbe",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Catégorie|Catégories}}",
        "category_header": "Paches in catégorie \"$1\"",
        "subcategories": "Dsoucatégories",
        "hidden-category-category": "Catégouries muchées",
        "category-subcat-count": "{{PLURAL:$2|Chol catégorie ale o seulemint el dsou-catégorie-lo:|Chol catégorie ale o  {{PLURAL:$1|l'dsou-catégorie-lo|chés $1 dsou-catégories suivantes}}, pou un total éd $2.}}",
        "category-subcat-count-limited": "L'catégorie-lo ale o {{PLURAL:$1|el dsous-catégorie|chés $1 dsous-catégories}} -lo:",
-       "category-article-count": "Chol catégorie ale o {{PLURAL:$2|seulemint l'pache-lo:|$2 paches, dont{{PLURAL:$1|chelle-chi:|chés $1 paches chi:}} }}",
+       "category-article-count": "Chol catégorie ale o {{PLURAL:$2|0= autchune pache|1=seulemint l'pache-lo:|$2 paches, dont{{PLURAL:$1|0=autchune|1=chelle-chi|chés $1 paches in-dsous}} }}:",
        "category-article-count-limited": "{{PLURAL:$1|L' pache d'apré ale est|Chés $1 paches d'apré sont}} dins l'catégorie-lo.",
        "category-file-count": "Chol catégorie ale o  {{PLURAL:$2|seulemint ech fichié-lo:|$2 fichiés dont chés $1 fichiés suivants:}}",
        "category-file-count-limited": "{{PLURAL:$1|Ech fichié d'apré est|Chés $1 fichiés d'apré sont}} dins l'catégorie-lo.",
        "listingcontinuesabbrev": "cont.",
+       "index-category": "Paches indécsées",
        "noindex-category": "Paches nin indécsées",
        "broken-file-category": "Paches aveuc des loïens d'fichiés bérzillés",
        "about": "À pérpos",
        "newwindow": "(ouvrir din eune nouvèle fernéte)",
        "cancel": "Canchler",
        "moredotdotdot": "Plu...",
+       "morenotlisted": "Chol lisse peut ète incomplète.",
        "mypage": "Pache",
        "mytalk": "Min bavouér",
-       "anontalk": "Bavouér pou chl'IP-lo",
+       "anontalk": "Bavouér",
        "navigation": "Navigachon",
        "and": "&#32;pi",
        "qbfind": "Trouvoèr",
        "actions": "Acchons",
        "namespaces": "Éspaces d'chés noms",
        "variants": "Ércanjantes",
+       "navigation-heading": "Menu éd navigacion",
        "errorpagetitle": "Bérlure",
        "returnto": "Értrouve $1.",
        "tagline": "Cha vient éd {{SITENAME}}",
        "searcharticle": "Aller",
        "history": "Historique deul pache",
        "history_short": "Histoère",
+       "history_small": "Histoère",
        "updatedmarker": "Cangé édpui em darinne visite",
        "printableversion": "Imprimabe vérchon",
        "permalink": "Loïen pérmanint",
        "print": "Imprimer",
        "view": "Vir",
+       "view-foreign": "Vir su $1",
        "edit": "Éditer",
+       "edit-local": "Modifier el déscripcion locale",
        "create": "Créer",
+       "create-local": "Ajouter ène déscripcion locale",
        "editthispage": "Éditer chl'pache-lo",
        "create-this-page": "Créer chl'pache lo",
        "delete": "Défacer",
        "deletethispage": "Défacer chl'pache lo",
+       "undeletethispage": "n'poin défacer chol pache",
        "undelete_short": "Déface poin {{PLURAL:$1|un édite|$1 édites}}",
        "viewdeleted_short": "{{PLURAL:$1|eune édition défacée|$1  éditions défacées}}",
        "protect": "Garantir",
        "talk": "distchuter",
        "views": "Vues",
        "toolbox": "Boéte à otis",
+       "tool-link-userrights": "Modifier chés groupes éd {{GENDER:$1|l’uzeu|l’uzeuse}}",
+       "tool-link-userrights-readonly": "Vir chés {{GENDER:$1|groupes d'uzeu}}",
+       "tool-link-emailuser": "Invouéyer un courriel à {{GENDER:$1|l’uzeu|l’uzeuse}}",
        "userpage": "Vir el pache dech uzeu",
        "projectpage": "Vir l'pache dech prodjé",
        "imagepage": "Vir el pache dech fichié",
        "otherlanguages": "Din d'eutes langaches",
        "redirectedfrom": "(Érdirection édpis $1)",
        "redirectpagesub": "Pache érdérivée",
+       "redirectto": "Ardiriger vers :",
        "lastmodifiedat": "L'pache-lo ale o té modifiée l'fouos darin l' $1, à $2.",
        "viewcount": "L' page-lo ale o té vue {{PLURAL:$1|1 foués|$1 foués}}.",
        "protectedpage": "Pache défènnée",
        "jumpto": "Aler à:",
        "jumptonavigation": "navigachon",
        "jumptosearch": "tracher",
+       "pool-errorunknown": "Bérlurage inconnu",
+       "poolcounter-usage-error": "Bérlurage d’utilisacion : $1",
        "aboutsite": "à pérpos éd {{SITENAME}}",
        "aboutpage": "Project:à pérpos",
-       "copyright": "Ch'contnu, il est disponipe dsou $1.",
+       "copyright": "Ch'contnu, il est disponipe dsou licince $1 sauf mincion invérse.",
        "copyrightpage": "{{ns:project}}:Copyrights",
        "currentevents": "Darinnetés picardes",
        "currentevents-url": "Project:Darinnetés picardes",
        "disclaimers": "Démintis",
        "disclaimerpage": "Project:Déminti général",
        "edithelp": "Éditer el aiyude",
+       "helppage-top-gethelp": "Aïude",
        "mainpage": "Moaite Pache",
        "mainpage-description": "Moaite Pache",
+       "policy-url": "Project:Régues",
        "portal": "Portal del conmeunauté",
        "portal-url": "Project:Accueul del conminnité",
        "privacy": "Politique d'éscrè",
        "ok": "OK",
        "retrievedfrom": "Érprind din  \"$1\"",
        "youhavenewmessages": "Os avez $1 ($2).",
+       "youhavenewmessagesmanyusers": "Os avez $1 granmint d'uzeus ($2).",
+       "newmessagesdifflinkplural": "$1 {{PLURAL:$1|darin cangemint|darins cangemints}}",
        "youhavenewmessagesmulti": "Os avez des nouvieus messaches su $1",
        "editsection": "éditer",
        "editold": "éditer",
        "toc": "Étnus",
        "showtoc": "Aficher",
        "hidetoc": "muche",
+       "collapsible-collapse": "Érplier",
+       "collapsible-expand": "diswalper",
+       "confirmable-confirm": "Ètes-vos seur{{GENDER:$1||e}} ?",
+       "confirmable-yes": "Oui",
+       "confirmable-no": "Non",
        "thisisdeleted": "Vir ou érfoaire $1?",
        "viewdeleted": "Vir $1?",
        "restorelink": "{{PLURAL:$1|eune édition défacée|$1 chés éditions défacées}}",
        "nstab-template": "Modéle",
        "nstab-help": "Pache d'aiyude",
        "nstab-category": "Catégorie",
+       "mainpage-nstab": "Moaite Pache",
        "nosuchspecialpage": "I n'y o poin chot éspéchiale pache-lo",
        "error": "Bérlurache",
        "databaseerror": "Bérlurache din l'database",
        "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 ?",
-       "createaccountmail": "par imèle",
+       "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.",
+       "userlogin-reauth": "Os d'vez vous arconnécter pour vérifier éq vos ètes {{GENDER:$1|$1}}.",
+       "userlogin-createanother": "Créer un eute compte",
+       "createacct-emailrequired": "Adrèche courriel",
+       "createacct-emailoptional": "Adrèche courriel (facultative)",
+       "createacct-email-ph": "Intrez vote adrèche courriel",
+       "createacct-another-email-ph": "Intrez l' adrèche courriel",
+       "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",
+       "createacct-submit": "Créez vote compte",
+       "createacct-another-submit": "Créer un compte",
+       "createacct-continue-submit": "Continuer el créachon du compte",
+       "createacct-another-continue-submit": "Continuer el créachon du compte",
+       "createacct-benefit-heading": "{{SITENAME}} est foait pèr des gins conme vous.",
+       "createacct-benefit-body1": "modificacion{{PLURAL:$1||s}}",
+       "createacct-benefit-body2": "pache{{PLURAL:$1||s}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contributeu nouvieu|contributeus nouvieus}}",
        "badretype": "Chés mots d'passe intrés, is sont poin bon.",
+       "usernameinprogress": "Ène créachon d' compte pour ch' nom d’uzeu est déjo in cours.\nVoulez attènne.",
        "userexists": "Nom d’utilisateur entré déjà utilisé.\nNom d’uzeu intré déjo donné.\ni feut prinde un eute nom.\nj'm'escuse mais i feut prinde un aute nom.",
        "loginerror": "Bérlurache del intrée",
+       "createacct-error": "Bérlurage pour l'créachon du compte",
+       "createaccounterror": "Impossibe ed créer ch' compte : $1",
+       "nocookiesnew": "Ch' compte d'uzeu il o té créé, mais os n’ètes poin connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} doét implouéyer des ''cookies'' pour warder el connecsion mais os les avez désactivés.\nVoulez les activer pi vos arconnecter aveuc ch' meume nom et pi ch' meume mot d'passe.",
+       "nocookieslogin": "{{SITENAME}} doét implouéyer des ''cookies'' pour warder el connecsion mais os les avez désactivés.\nVoulez les activer pi vos arconnecter.",
+       "nocookiesfornew": "Ch' compte d'uzeu il n'o poin té créé, pasqué os n’avons poin pu idintifier esn origine.\n{{SITENAME}} doét implouéyer des ''cookies'', vérifiez qu'ils sont activés, arquétchez l' pache pi érquérminchez.",
        "noname": "Os n'avez poin donné un nom d'uzeu valabe.",
        "loginsuccess": "'''Achteur os ètes intré{{GENDER:||e|(e)}} din {{SITENAME}} conme \"$1\".'''",
        "nouserspecified": "Os dvez intrer un nom d'uzeu.",
index 5abf99c..7f9b120 100644 (file)
@@ -85,7 +85,8 @@
                        "Mateuszek045",
                        "Sethakill",
                        "Mateon1",
-                       "Jdx"
+                       "Jdx",
+                       "Kirsan"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "searcharticle": "Przejdź",
        "history": "Historia strony",
        "history_short": "historia",
+       "history_small": "historia",
        "updatedmarker": "zmienione od ostatniej wizyty",
        "printableversion": "Wersja do druku",
        "permalink": "Link do tej wersji",
        "views": "Widok",
        "toolbox": "Narzędzia",
        "tool-link-userrights": "Zmiana grup {{GENDER:$1|użytkownika|użytkowniczki}}",
+       "tool-link-userrights-readonly": "Zobacz grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "tool-link-emailuser": "Wyślij e-mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki}}",
        "userpage": "Pokaż stronę użytkownika",
        "projectpage": "Pokaż stronę projektu",
        "policy-url": "Project:Zasady",
        "portal": "Portal społeczności",
        "portal-url": "Project:Portal społeczności",
-       "privacy": "Zasady zachowania poufności",
-       "privacypage": "Project:Zasady zachowania poufności",
+       "privacy": "Polityka ochrony prywatności",
+       "privacypage": "Project:Polityka ochrony prywatności",
        "badaccess": "Błąd uprawnień",
        "badaccess-group0": "Nie masz uprawnień wymaganych do wykonania tej operacji.",
        "badaccess-groups": "Wykonywanie tej operacji zostało ograniczone do użytkowników w {{PLURAL:$2|grupie|jednej z grup:}} $1.",
        "botpasswords-label-delete": "Usuń",
        "botpasswords-label-resetpassword": "Zresetuj hasło",
        "botpasswords-label-grants": "Zastosowane uprawnienia:",
+       "botpasswords-help-grants": "Nadawane uprawnienia upoważniają do działań, które możesz już obecnie wykonywać. Wyrażenie zgody tutaj nie daje dostępu do nowych uprawnień. Zobacz [[Special:ListGrants|tabelę uprawnień]], aby uzyskać więcej informacji.",
        "botpasswords-label-grants-column": "Przyznane",
        "botpasswords-bad-appid": "Nazwa bota \"$1\" nie jest prawidłowa.",
        "botpasswords-insert-failed": "Nie udało się dodać robota o nazwie \"$1\". Czy był już wcześniej dodany?",
        "passwordreset-emaildisabled": "Wysyłanie emaili zostało wyłączone na tej wiki",
        "passwordreset-username": "Nazwa użytkownika:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Czy pokazywać treść wiadomości e‐mail?",
-       "passwordreset-capture-help": "Jeśli zaznaczysz to pole, zobaczysz treść wiadomości e‐mail z tymczasowym hasłem, w tej samej formie w jakiej jest wysyłana do użytkownika.",
        "passwordreset-email": "Adres e‐mail:",
        "passwordreset-emailtitle": "Dane konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Ktoś (prawdopodobnie Ty, spod adresu IP $1) poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
        "passwordreset-emailelement": "Nazwa użytkownika: \n$1\n\nTymczasowe hasło: \n$2",
        "passwordreset-emailsentemail": "Jeśli ten adres e‐mail jest przypisany do Twojego konta, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Został wysłany e-mail|Zostały wysłane e-maile}} z informacjami o resetowaniu hasła. {{PLURAL:$1|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} tutaj.",
-       "passwordreset-emailerror-capture2": "Wysyłanie e-maila do {{GENDER:$2|użytkownika|użytkowniczki}} nie powiodło się: $1 {{PLURAL:$3|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} tutaj.",
        "passwordreset-nocaller": "Musi być podany wywołujący",
        "passwordreset-nosuchcaller": "Wywołujący nie istnieje: $1",
+       "passwordreset-ignored": "Zresetowanie hasła nie powiodło się. Może żaden dostawca nie został skonfigurowany?",
        "passwordreset-invalidemail": "Nieprawidłowy adres e-mail",
        "passwordreset-nodata": "Nie podano ani nazwy użytkownika, ani adresu e-mail",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
        "blockedtitle": "Użytkownik jest zablokowany",
        "blockedtext": "'''Twoje konto lub adres IP zostały zablokowane.'''\n\nBlokada została nałożona przez $1.\nPodany powód to: ''$2''.\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nW celu wyjaśnienia przyczyny zablokowania możesz się skontaktować z $1 lub innym [[{{MediaWiki:Grouppage-sysop}}|administratorem]].\nNie możesz użyć funkcji „Wyślij e‐mail do tego użytkownika”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to $5.\nProsimy o podanie obu tych informacji przy wyjaśnianiu blokady.",
        "autoblockedtext": "Ten adres IP został zablokowany automatycznie, gdyż korzysta z niego inny użytkownik, zablokowany przez administratora $1.\nPowód blokady:\n\n:''$2''\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nMożesz skontaktować się z $1 lub jednym z pozostałych [[{{MediaWiki:Grouppage-sysop}}|administratorów]] w celu uzyskania informacji o blokadzie.\n\nNie możesz użyć funkcji „Wyślij e‐mail do tego użytkownika”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\n\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to $5.\nProsimy o podanie obu tych numerów przy wyjaśnianiu blokady.",
+       "systemblockedtext": "Twoja nazwa użytkownika lub adres IP zostały automatycznie zablokowane przez MediaWiki.\nPodany powód to:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zamierzano zablokować: $7\n\nTwój obecny adres IP to $3.\nProsimy o dołączenie powyższych szczegółów w jakichkolwiek zadawanych pytaniach.",
        "blockednoreason": "nie podano przyczyny",
        "whitelistedittext": "Musisz $1, by edytować strony.",
        "confirmedittext": "Edytowanie jest możliwe dopiero po zweryfikowaniu adresu e‐mail.\nPodaj adres e‐mail i potwierdź go w swoich [[Special:Preferences|ustawieniach użytkownika]].",
        "mergehistory-fail-no-change": "Łączenie historii nie połączyło żadnych wersji. Proszę ponownie sprawdzić stronę i parametry czasowe.",
        "mergehistory-fail-permission": "Brak uprawnień, aby połączyć historię.",
        "mergehistory-fail-self-merge": "Strona źródłowa i docelowa są takie same.",
+       "mergehistory-fail-timestamps-overlap": "Wersje źródłowe pokrywają się lub są późniejsze niż wersja docelowa.",
        "mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.",
        "mergehistory-no-source": "Strona źródłowa $1 nie istnieje.",
        "mergehistory-no-destination": "Strona docelowa $1 nie istnieje.",
        "search-interwiki-caption": "Projekty siostrzane",
        "search-interwiki-default": "Wyniki od $1:",
        "search-interwiki-more": "(więcej)",
+       "search-interwiki-more-results": "Więcej wyników",
        "search-relatedarticle": "Pokrewne",
        "searchrelated": "pokrewne",
        "searchall": "wszystkie",
        "search-external": "Wyszukiwanie zewnętrzne",
        "searchdisabled": "Wyszukiwanie w {{GRAMMAR:MS.lp|{{SITENAME}}}} zostało wyłączone.\nW międzyczasie możesz skorzystać z wyszukiwania Google.\nJednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google nieaktualne.",
        "search-error": "Wystąpił błąd podczas wyszukiwania: $1",
+       "search-warning": "Podczas wyszukiwania wystąpił błąd: $1",
        "preferences": "Preferencje",
        "mypreferences": "Preferencje",
        "prefs-edits": "Liczba edycji:",
        "saveprefs": "Zapisz",
        "restoreprefs": "Przywróć wszystkie domyślne preferencje (we wszystkich zakładkach)",
        "prefs-editing": "Edycja",
-       "rows": "Wiersze:",
-       "columns": "Kolumny:",
        "searchresultshead": "Wyszukiwanie",
        "stub-threshold": "Maksymalny rozmiar strony oznaczanej jako zalążek ($1):",
        "stub-threshold-sample-link": "przykład",
        "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
        "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli chcesz go zresetować]].",
        "savedprefs": "Twoje preferencje zostały zapisane.",
-       "savedrights": "Zapisano uprawnienia {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
+       "savedrights": "Zapisano grupy {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
        "timezonelegend": "Strefa czasowa:",
        "localtime": "Czas lokalny:",
        "timezoneuseserverdefault": "Użyj domyślnej dla tej wiki ($1)",
        "youremail": "Twój adres e‐mail:",
        "username": "{{GENDER:$1|Nazwa użytkownika}}:",
        "prefs-memberingroups": "{{GENDER:$2|Członek}} {{PLURAL:$1|grupy|grup}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Data rejestracji:",
        "yourrealname": "Imię i nazwisko:",
        "yourlanguage": "Język interfejsu:",
        "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-lookup-user": "Zarządzaj grupami użytkownika",
+       "userrights-lookup-user": "Wybierz użytkownika",
        "userrights-user-editname": "Wprowadź nazwę użytkownika:",
-       "editusergroup": "Edytuj grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
+       "editusergroup": "Wczytaj grupy użytkownika",
        "editinguser": "Zmiana uprawnień {{GENDER:$1|użytkownika|użytkowniczki}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Edytuj grupy użytkownika",
+       "viewinguserrights": "Przeglądanie grup, do których należy {{GENDER:$1|użytkownik|użytkowniczka}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Edytuj grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
+       "userrights-viewusergroup": "Przeglądanie grup {{GENDER:$1|użytkownika|użytkowniczki}}",
        "saveusergroups": "Zapisz grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "userrights-groupsmember": "Należy do:",
        "userrights-groupsmember-auto": "Na stałe należy do:",
        "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-nologin": "Musisz [[Special:UserLogin|zalogować się]] na konto administratora, by nadawać uprawnienia użytkownikom.",
-       "userrights-notallowed": "Nie jesteś upoważniony do nadawania i odbierania uprawnień użytkownikom.",
        "userrights-changeable-col": "Grupy, które możesz wybrać",
        "userrights-unchangeable-col": "Grupy, których nie możesz wybrać",
+       "userrights-expiry-current": "wygasa $1",
+       "userrights-expiry-none": "Bezterminowo",
+       "userrights-expiry": "Czas wygaśnięcia:",
+       "userrights-expiry-existing": "Obecny czas wygaśnięcia: $2 o $3",
+       "userrights-expiry-othertime": "Inny termin:",
+       "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-conflict": "Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.",
-       "userrights-removed-self": "Odebrałeś sobie uprawnienia. W związku z tym nie masz już dostępu do tej strony.",
        "group": "Grupa:",
        "group-user": "Użytkownicy",
        "group-autoconfirmed": "Automatycznie zatwierdzeni użytkownicy",
        "right-siteadmin": "Blokowanie i odblokowywanie bazy danych",
        "right-override-export-depth": "Eksport stron wraz z linkowanymi do głębokości 5 linków",
        "right-sendemail": "Wysyłanie e‐maili do innych użytkowników",
-       "right-passwordreset": "Sprawdzanie treści e‐maila o resetowaniu hasła",
        "right-managechangetags": "Tworzenie i (dez)aktywowanie [[Special:Tags|znaczników]]",
        "right-applychangetags": "Wprowadzanie [[Special:Tags|znaczników]] wraz z własnymi zmianami",
        "right-changetags": "Dodawanie i usuwanie dowolnych [[Special:Tags|znaczników]] z poszczególnych wersji i wpisów w rejestrze",
        "right-deletechangetags": "Usuwanie [[Special:Tags|znaczników]] z bazy danych",
+       "grant-generic": "zestaw uprawnień „$1“",
        "grant-group-page-interaction": "Interakcja ze stronami",
        "grant-group-file-interaction": "Interakcja z plikami multimedialnymi",
        "grant-group-watchlist-interaction": "Interakcja z listą obserwowanych",
        "grant-basic": "Podstawowe uprawnienia",
        "grant-viewdeleted": "Wyświetlanie usuniętych plików i stron",
        "grant-viewmywatchlist": "Zobacz swoją listę obserwowanych",
+       "grant-viewrestrictedlogs": "Przeglądanie zastrzeżonych wpisów w rejestrach",
        "newuserlogpage": "Nowi użytkownicy",
        "newuserlogpagetext": "To jest rejestr ostatnio utworzonych kont użytkowników",
        "rightslog": "Uprawnienia",
        "action-upload_by_url": "przesłania tego pliku z adresu URL",
        "action-writeapi": "zapisu poprzez interfejs API",
        "action-delete": "usunięcia tej strony",
-       "action-deleterevision": "usunięcia tej wersji",
-       "action-deletedhistory": "podglądu historii usunięć tej strony",
+       "action-deleterevision": "usuwania wersji",
+       "action-deletelogentry": "usuwania wpisów w rejestrze",
+       "action-deletedhistory": "podglądu historii usunięć strony",
+       "action-deletedtext": "wyświetlania tekstu usuniętej wersji",
        "action-browsearchive": "przeszukiwania usuniętych stron",
-       "action-undelete": "odtworzenia tej strony",
-       "action-suppressrevision": "podglądu i odtworzenia tej wersji ukrytej",
+       "action-undelete": "odtwarzania stron",
+       "action-suppressrevision": "podglądu i odtwarzania ukrytych wersji",
        "action-suppressionlog": "podglądu rejestru ukrywania",
        "action-block": "zablokowania temu użytkownikowi możliwości edycji",
        "action-protect": "zmiany poziomu zabezpieczenia tej strony",
        "action-userrights-interwiki": "edytowania uprawnień użytkowników na innych witrynach wiki",
        "action-siteadmin": "blokowania i odblokowywania bazy danych",
        "action-sendemail": "wysyłania e-maili",
+       "action-editmyoptions": "edycja swoich preferencji",
        "action-editmywatchlist": "edycji swojej listy obserwowanych stron",
        "action-viewmywatchlist": "zobaczenia swojej listy obserwowanych stron",
        "action-viewmyprivateinfo": "zobaczenia swoich prywatnych danych",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Pokaż",
+       "rcfilters-activefilters": "Aktywne filtry",
+       "rcfilters-restore-default-filters": "Przywrócić 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-noresults": "Nie znaleziono filtrów",
+       "rcfilters-filtergroup-registration": "Rejestracja użytkownika",
+       "rcfilters-filter-registered-label": "Zarejestrowany",
+       "rcfilters-filter-registered-description": "Zalogowani edytorzy.",
+       "rcfilters-filter-unregistered-label": "Niezarejestrowany",
+       "rcfilters-filter-unregistered-description": "Niezalogowani",
+       "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-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-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-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-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...",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne edycje",
        "upload-scripted-pi-callback": "Nie można przesłać pliku, zawierającego instrukcję obsługi arkusza stylów XML.",
        "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.",
        "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.",
-       "uploadscriptednamespace": "Ten plik SVG zawiera niedozwoloną przestrzeń nazw '$1'",
+       "uploaded-event-handler-on-svg": "Ustawianie atrybutów obsługi zdarzeń <code>$1=\"$2\"</code> jest niedozwolone w plikach SVG.",
+       "uploaded-href-attribute-svg": "atrybuty href w plikach SVG mogą linkować tylko do celów z http:// lub https://, znaleziono <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Znaleziono atrybut href kierujący do niebezpiecznych danych: cel URI <code>&lt;$1 $2=\"$3\"&gt;</code> w przesłanym pliku SVG.",
+       "uploaded-animate-svg": "Znaleziono znacznik \"animate\", który może zmieniać atrybut href, przy użyciu atrybutu \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> w przesłanym pliku SVG.",
+       "uploaded-setting-event-handler-svg": "Ustawianie atrybutów obsługi zdarzeń jest zablokowane, znaleziono <code>&lt;$1 $2=\"$3\"&gt;</code> w przesyłanym pliku SVG.",
+       "uploaded-setting-href-svg": "Użycie znacznika \"set\" do dodania atrybutu \"href\" do elementu nadrzędnego jest zablokowane.",
+       "uploaded-wrong-setting-svg": "Użycie znacznika \"set\" do dodania do dowolnych atrybutów zdalnych elementów/danych/skryptów jest zablokowane. Znaleziono <code>&lt;set to=\"$1\"&gt;</code> w przesyłanym pliku SVG.",
+       "uploaded-setting-handler-svg": "SVG ustawiające atrybut \"handler\" z zdalnymi elementami/danymi/skryptami są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
+       "uploaded-remote-url-svg": "SVG, które ustawiają w dowolnym atrybucie stylu zdalne URL, są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
+       "uploaded-image-filter-svg": "Znaleziono filtr obrazu zawierający URL: <code>&lt;$1 $2=\"$3\"&gt;</code> w przesyłanym pliku SVG.",
+       "uploadscriptednamespace": "Ten plik SVG zawiera niedozwoloną przestrzeń nazw „<nowiki>$1</nowiki>”.",
        "uploadinvalidxml": "Nie udało się przeanalizować XML w załadowanym pliku.",
        "uploadvirus": "W pliku jest wirus! Szczegóły: $1",
        "uploadjava": "Ten plik zawiera deklarację klasy Java skompresowaną ZIP.\nPrzesyłanie plików Java nie jest dozwolone, ponieważ mogłoby zostać użyte do obchodzenia zabezpieczeń.",
        "zip-file-open-error": "Wystąpił błąd podczas otwierania pliku ZIP, aby go sprawdzić.",
        "zip-wrong-format": "Wybrany plik nie jest w formacie ZIP.",
        "zip-bad": "Plik ZIP jest uszkodzony lub w inny sposób niemożliwy do odczytania. \nNie może zostać odpowiednio sprawdzony pod kątem bezpieczeństwa.",
-       "zip-unsupported": "Plik jest w formacie ZIP ale wykorzystuje funkcje, które nie są obsługiwane przez MediaWiki.\nPlik nie może zostać odpowiednio sprawdzony pod kątem bezpieczeństwa.",
+       "zip-unsupported": "Plik jest w formacie ZIP, ale wykorzystuje funkcje, które nie są obsługiwane przez MediaWiki.\nPlik nie może zostać odpowiednio sprawdzony pod kątem bezpieczeństwa.",
        "uploadstash": "Schowek z przesłanymi plikami",
        "uploadstash-summary": "Ta strona umożliwia dostęp do przesłanych lub właśnie przesyłanych plików, ale jeszcze nie opublikowanych na wiki. Pliki widzi wyłącznie użytkownik, które je przesłał.",
        "uploadstash-clear": "Wyczyść schowek z plikami",
        "uploadstash-errclear": "Czyszczenie plików nie powiodło się.",
        "uploadstash-refresh": "Odśwież listę plików",
        "uploadstash-thumbnail": "pokaż miniaturkę",
+       "uploadstash-exception": "Nie udało się zapisać przesyłanego pliku w magazynie tymczasowym ($1): „$2”.",
        "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu",
        "img-auth-accessdenied": "Odmowa dostępu",
        "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "uncategorizedcategories": "Nieskategoryzowane kategorie",
        "uncategorizedimages": "Nieskategoryzowane pliki",
        "uncategorizedtemplates": "Nieskategoryzowane szablony",
+       "uncategorized-categories-exceptionlist": " # Zawiera listę kategorii, które nie powinny być wymieniane na stronie Specjalna:Nieskategoryzowane_kategorie. Każda w osobnej linii, zaczynającej się \"*\". Linie zaczynające się innym znakiem (włącznie ze spacjami) będą ignorowane. Użyj \"#\" dla komentarzy.",
        "unusedcategories": "Puste kategorie",
        "unusedimages": "Nieużywane pliki",
        "wantedcategories": "Brakujące kategorie",
        "apisandbox-sending-request": "Wysyłanie zapytania API…",
        "apisandbox-loading-results": "Pobieranie wyników API...",
        "apisandbox-results-error": "Wystąpił błąd podczas pobierania odpowiedzi na zapytanie API: $1.",
+       "apisandbox-request-selectformat-label": "Pokaż dane z zapytania jako:",
+       "apisandbox-request-format-url-label": "zapytanie w adresie URL",
        "apisandbox-request-url-label": "URL zapytania:",
+       "apisandbox-request-json-label": "Zapytanie JSON:",
        "apisandbox-request-time": "Czas przetwarzania zapytania: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Popraw token i wyślij ponownie",
        "apisandbox-results-fixtoken-fail": "Nie udało się pobrać tokena „$1”.",
        "apisandbox-alert-field": "Wartość tego pola jest nieprawidłowa.",
        "apisandbox-continue": "Kontynuuj",
        "apisandbox-continue-clear": "Wyczyść",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} spowoduje [https://www.mediawiki.org/wiki/API:Query#Continuing_queries pobranie kolejnej części wyników] ostatnio wykonanego żądania; {{int:apisandbox-continue-clear}} wyczyści parametry związane z kontynuowaniem wyników.",
        "apisandbox-param-limit": "Wpisz <kbd>max</kbd>, aby wykorzystać maksymalny limit.",
+       "apisandbox-multivalue-all-namespaces": "$1 (wszystkie przestrzenie nazw)",
+       "apisandbox-multivalue-all-values": "$1 (wszystkie wartości)",
        "booksources": "Książki",
        "booksources-search-legend": "Szukaj informacji o książkach",
        "booksources-search": "Szukaj",
        "activeusers-count": "w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|operację|operacje|operacji}}",
        "activeusers-from": "Wyświetl użytkowników, zaczynając od:",
        "activeusers-groups": "Wyświetl użytkowników należących do grup:",
+       "activeusers-excludegroups": "Wyklucz użytkowników należących do grup:",
        "activeusers-noresult": "Nie odnaleziono żadnego użytkownika.",
        "activeusers-submit": "Wyświetl aktywnych użytkowników",
        "listgrouprights": "Uprawnienia grup użytkowników",
        "emailccsubject": "Kopia Twojej wiadomości do $1: $2",
        "emailsent": "Wiadomość została wysłana",
        "emailsenttext": "Twoja wiadomość została wysłana.",
-       "emailuserfooter": "Ten e-mail został {{GENDER:$1|wysłany}} z {{GRAMMAR:D.lp|{{SITENAME}}}} do {{GENDER:$2|$2}} przez $1 przy użyciu funkcji „{{int:emailuser}}”.",
+       "emailuserfooter": "Ten e-mail został {{GENDER:$1|wysłany}} z {{GRAMMAR:D.lp|{{SITENAME}}}} do {{GENDER:$2|$2}} przez $1 przy użyciu funkcji „{{int:emailuser}}”. Jeśli wyślesz odpowiedź na ten e-mail do {{GENDER:$1|oryginalnego nadawcy}}, wówczas {{GENDER:$2|Twój}} adres e-mail zostanie {{GENDER:$1|mu|jej}} ujawniony.",
        "usermessage-summary": "Pozostawianie komunikatu systemowego.",
        "usermessage-editor": "Nadawca komunikatów systemowych",
        "watchlist": "Obserwowane",
        "rollbacklinkcount-morethan": "cofnij więcej niż $1 {{PLURAL:$1|edycję|edycje|edycji}}",
        "rollbackfailed": "Nie udało się cofnąć zmiany",
        "rollback-missingparam": "W żądaniu nie podano wymaganych parametrów.",
+       "rollback-missingrevision": "Nie udało się załadować informacji o wersji.",
        "cantrollback": "Nie można cofnąć edycji tego autora, ponieważ jest jedynym autorem tej strony.",
        "alreadyrolled": "Nie można dla strony [[:$1|$1]] cofnąć ostatniej zmiany, którą wykonał [[User:$2|$2]] ([[User talk:$2|dyskusja]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).\nKtoś inny zdążył już to zrobić lub wprowadził własne poprawki do treści strony.\n\nAutorem ostatniej zmiany jest teraz [[User:$3|$3]] ([[User talk:$3|dyskusja]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Edycję opisał: <em>$1</em>.",
        "changecontentmodel-emptymodels-title": "Nie ma dostępnych modeli treści",
        "changecontentmodel-emptymodels-text": "Zawartość [[:$1]] nie może być przekształcona do żadnego typu.",
        "log-name-contentmodel": "Rejestr zmian modelu zawartości",
-       "log-description-contentmodel": "Wydarzenia związane z modelami zawartości stron",
+       "log-description-contentmodel": "Ta strona wymienia zmiany w modelu zawartości stron oraz tworzenie nowych stron z modelem zawartości innym niż domyślnie.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|utworzył|utworzyła}} stronę $3 o niebędącym domyślnym modelu zawartości \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} model zawartości strony $3 z „$4” na „$5”",
        "logentry-contentmodel-change-revertlink": "Przywróć",
        "logentry-contentmodel-change-revert": "Przywróć",
        "undeletehistorynoadmin": "Ta strona została usunięta.\nPrzyczyna usunięcia podana jest w podsumowaniu poniżej, razem z danymi użytkownika, który edytował stronę przed usunięciem.\nSama treść usuniętych wersji jest dostępna jedynie dla administratorów.",
        "undelete-revision": "Usunięto wersję $1 (z $5 $4) autorstwa $3:",
        "undeleterevision-missing": "Nieprawidłowa lub brakująca wersja.\nMożesz mieć zły link lub wersja mogła zostać odtworzona lub usunięta z archiwum.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Jedna wersja|$1 wersji}} nie może zostać przywróconych, ponieważ {{PLURAL:$1|jej|ich}} <code>rev_id</code> jest już w użyciu.",
        "undelete-nodiff": "Nie znaleziono poprzednich wersji.",
        "undeletebtn": "Odtwórz",
        "undeletelink": "pokaż lub odtwórz",
        "proxyblockreason": "Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy.\nO tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.",
        "sorbsreason": "Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.",
        "sorbs_create_account_reason": "Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.\nNie możesz utworzyć konta",
+       "softblockrangesreason": "Edycje niezalogowanych z Twojego adresu IP ($1) są niedozwolone. Proszę się zalogować.",
        "xffblockreason": "Adres IP obecny w nagłówku X-Forwarded-For – twój lub serwera proxy, z którego korzystasz – został zablokowany. Powód blokady to: $1",
        "cant-see-hidden-user": "Konto użytkownika, które próbujesz zablokować, zostało już zablokowane oraz ukryte. Bez uprawnienia do ukrywania kont nie możesz zobaczyć oraz modyfikować blokady tego użytkownika.",
        "ipbblocked": "Nie możesz blokować i odblokowywać innych użytkowników, ponieważ sam jesteś zablokowany",
        "cant-move-to-user-page": "Nie masz uprawnień do przenoszenia strony do strony użytkownika (za wyjątkiem podstron użytkownika).",
        "cant-move-category-page": "Nie masz uprawnień do przenoszenia stron kategorii.",
        "cant-move-to-category-page": "Nie masz uprawnień do przenoszenia strony do strony kategorii.",
+       "cant-move-subpages": "Nie masz uprawnień do przenoszenia podstron.",
+       "namespace-nosubpages": "Przestrzeń nazw „$1” nie pozwala na korzystanie z podstron.",
        "newtitle": "Nowy tytuł:",
        "move-watch": "Obserwuj",
        "movepagebtn": "Przenieś stronę",
        "movelogpagetext": "Lista stron, które ostatnio zostały przeniesione.",
        "movesubpage": "{{PLURAL:$1|Podstrona|Podstrony}}",
        "movesubpagetext": "Ta strona posiada $1 {{PLURAL:$1|podstronę|podstrony|podstron}}:",
+       "movesubpagetalktext": "Odpowiadająca strona dyskusji ma $1 {{PLURAL:$1|podstronę|podstron}} pokazanych poniżej.",
        "movenosubpage": "Ta strona nie posiada podstron.",
        "movereason": "Powód:",
        "revertmove": "cofnij",
        "allmessages-filter-translate": "Przetłumacz",
        "thumbnail-more": "Powiększ",
        "filemissing": "Brak pliku",
-       "thumbnail_error": "Błąd przy generowaniu miniatury $1",
+       "thumbnail_error": "Błąd przy generowaniu miniatury: $1",
        "thumbnail_error_remote": "Komunikat o błędzie z {{grammar:2sg|$1}}:\n$2",
        "djvu_page_error": "Strona DjVu poza zakresem",
        "djvu_no_xml": "Nie można pobrać danych w formacie XML dla pliku DjVu",
        "tooltip-p-logo": "Strona główna",
        "tooltip-n-mainpage": "Zobacz stronę główną",
        "tooltip-n-mainpage-description": "Przejdź na stronę główną",
-       "tooltip-n-portal": "O projekcie, co możesz zrobić, gdzie możesz znaleźć informacje",
+       "tooltip-n-portal": "O projekcie - co możesz zrobić, gdzie możesz znaleźć informacje",
        "tooltip-n-currentevents": "Informacje o aktualnych wydarzeniach",
-       "tooltip-n-recentchanges": "Lista ostatnich zmian na {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
+       "tooltip-n-recentchanges": "Lista ostatnich zmian w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "tooltip-n-randompage": "Załaduj losową stronę",
-       "tooltip-n-help": "Tutaj możesz się dowiedzieć wielu rzeczy.",
+       "tooltip-n-help": "Tutaj możesz dowiedzieć się wielu rzeczy.",
        "tooltip-t-whatlinkshere": "Pokaż listę wszystkich stron linkujących do tej strony",
        "tooltip-t-recentchangeslinked": "Ostatnie zmiany w stronach, do których ta strona linkuje",
        "tooltip-feed-rss": "Kanał RSS dla tej strony",
        "pageinfo-length": "Długość strony (w bajtach)",
        "pageinfo-article-id": "Identyfikator strony",
        "pageinfo-language": "Język zawartości strony",
+       "pageinfo-language-change": "zmień",
        "pageinfo-content-model": "Model zawartości",
        "pageinfo-content-model-change": "zmień",
        "pageinfo-robot-policy": "Indeksowanie przez roboty",
        "pageinfo-watchers": "Liczba obserwujących",
        "pageinfo-visiting-watchers": "Liczba obserwujących stronę, którzy ostatnio ją odwiedzili",
        "pageinfo-few-watchers": "Mniej niż $1 {{PLURAL:$1|obserwujący|obserwujących}}",
+       "pageinfo-few-visiting-watchers": "Może być lub nie użytkownik, który odwiedza ostatnie edycje",
        "pageinfo-redirects-name": "Liczba przekierowań do tej strony",
        "pageinfo-subpages-name": "Liczba podstron tej strony",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|przekierowanie|przekierowania|przekierowań}}; $3 {{PLURAL:$3|bez przekierowania|bez przekierowań|bez przekierowań}})",
        "confirmemail_body_set": "Ktoś łącząc się z komputera o adresie IP $1\nustawił w {{GRAMMAR:MS.lp|{{SITENAME}}}} dla konta „$2” adres e‐mail na ten właśnie.\n\nAby potwierdzić, że to Ty {{GENDER:|ustawiłeś|ustawiłaś}} adres otwórz w swojej\nprzeglądarce ten link:\n\n$3\n\nJeśli *nie* jest to Twoje konto, otwórz w swojej przeglądarce\nponiższy link, aby anulować potwierdzenie adresu e‐mail:\n\n$5\n\nKod zawarty w linku straci ważność $4.",
        "confirmemail_invalidated": "Potwierdzenie adresu e‐mail zostało anulowane",
        "invalidateemail": "Anulowanie potwierdzenia adresu e‐mail",
+       "notificationemail_subject_changed": "Został zmieniony zarejestrowany adres e-mail na {{SITENAME}}",
+       "notificationemail_subject_removed": "Zarejestrowany adres e-mail w {{GRAMMAR:MS.lp|SITENAME}} został usunięty",
        "scarytranscludedisabled": "[Transkluzja przez interwiki jest wyłączona]",
        "scarytranscludefailed": "[Pobranie szablonu dla $1 nie powiodło się]",
        "scarytranscludefailed-httpstatus": "[Pobranie szablonu dla $1 nie powiodło się: HTTP $2]",
        "version-software": "Zainstalowane oprogramowanie",
        "version-software-product": "Nazwa",
        "version-software-version": "Wersja",
-       "version-entrypoints": "Adres URL punktu wejścia",
+       "version-entrypoints": "Adresy URL punktów wejścia",
        "version-entrypoints-header-entrypoint": "Punkt wejścia",
        "version-entrypoints-header-url": "URL",
        "version-libraries": "Zainstalowane biblioteki",
        "htmlform-user-not-exists": "<strong>$1</strong> nie istnieje.",
        "htmlform-user-not-valid": "<strong>$1</strong> nie jest prawidłową nazwą użytkownika.",
        "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-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-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",
        "feedback-bugcheck": "Świetnie! Tylko sprawdź, czy nie jest to jeden z już [$1 znanych błędów].",
        "feedback-useragent": "Aplikacja klienta:",
        "searchsuggest-search": "Przeszukaj {{GRAMMAR:B.lp|{{SITENAME}}}}",
        "searchsuggest-containing": "zawierające...",
-       "api-error-autoblocked": "Twój adres IP został automatycznie zablokowany, ponieważ był używany przez zablokowanego użytkownika.",
-       "api-error-badaccess-groups": "Nie masz uprawnień aby przesyłać pliki do tej wiki.",
        "api-error-badtoken": "Błąd wewnętrzny – nieprawidłowy kod weryfikacyjny (token).",
-       "api-error-blocked": "Została ci zablokowana możliwość edycji.",
-       "api-error-copyuploaddisabled": "Przesyłanie poprzez podanie adresu URL zostało na tym serwerze wyłączone.",
-       "api-error-duplicate": "{{PLURAL:$1|Jest już inny plik|Są już inne pliki}} o tej samej zawartości",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Był już inny plik|Były już inne pliki}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.",
-       "api-error-empty-file": "Przesłany przez Ciebie plik jest pusty.",
        "api-error-emptypage": "Tworzenie nowych, pustych stron jest niedozwolone.",
-       "api-error-fetchfileerror": "Błąd wewnętrzny – wystąpił błąd w trakcie pobierania pliku.",
-       "api-error-fileexists-forbidden": "Plik o nazwie \"$1\" już istnieje i nie może być nadpisany.",
-       "api-error-fileexists-shared-forbidden": "Plik o nazwie \"$1\" już istnieje we współdzielonym repozytorium i nie może być nadpisany.",
-       "api-error-file-too-large": "Przesłany przez Ciebie plik jest zbyt duży.",
-       "api-error-filename-tooshort": "Nazwa pliku jest zbyt krótka.",
-       "api-error-filetype-banned": "Zabroniony format pliku.",
-       "api-error-filetype-banned-type": "$1 nie {{PLURAL:$4|jest dozwolonym typem pliku|są dozwolonymi typami plików}}. Dopuszczalne są pliki w {{PLURAL:$3|formacie|formatach}} $2.",
-       "api-error-filetype-missing": "Brak rozszerzenia w nazwie pliku.",
-       "api-error-hookaborted": "Zmiana, którą próbowałeś wykonać została przerwana przez hak rozszerzenia.",
-       "api-error-http": "Błąd wewnętrzny – brak połączenia z serwerem.",
-       "api-error-illegal-filename": "Niedopuszczalna nazwa pliku.",
-       "api-error-internal-error": "Błąd wewnętrzny – wystąpił błąd w trakcie przetwarzania przesłanego pliku.",
-       "api-error-invalid-file-key": "Błąd wewnętrzny – nie można odnaleźć pliku w wśród plików tymczasowych.",
-       "api-error-missingparam": "Błąd wewnętrzny –  brak jest niektórych wymaganych informacji do realizacji przesłania.",
-       "api-error-missingresult": "Błąd wewnętrzny – nie można określić czy kopiowanie się udało.",
-       "api-error-mustbeloggedin": "Aby przesyłać pliki, musisz się zalogować.",
-       "api-error-mustbeposted": "Wystąpił błąd w oprogramowaniu. Nie użyto właściwej metody HTTP.",
-       "api-error-noimageinfo": "Plik przesłano, ale serwer nie zwrócił informacji na jego temat.",
-       "api-error-nomodule": "Błąd wewnętrzny – nie określono modułu przesyłania plików.",
-       "api-error-ok-but-empty": "Błąd wewnętrzny – brak odpowiedzi od serwera.",
-       "api-error-overwrite": "Nadpisanie istniejącego pliku nie jest dopuszczalne.",
-       "api-error-ratelimited": "Próbujesz przesłać więcej plików w krótszym odstępie czasowym, niż ta wiki na to pozwala.\nSpróbuj jeszcze raz za kilka minut.",
-       "api-error-stashfailed": "Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.",
        "api-error-publishfailed": "Błąd wewnętrzny: serwer nie mógł zapisać pliku tymczasowego.",
-       "api-error-stasherror": "Wystąpił błąd podczas przesyłania pliku.",
-       "api-error-stashedfilenotfound": "Nie odnaleziono pliku podczas próby pobrania go ze schowka.",
-       "api-error-stashpathinvalid": "Ścieżka do pliku zapasowego jest błędna.",
-       "api-error-stashfilestorage": "Wystąpił błąd podczas przesyłania pliku do archiwum.",
-       "api-error-stashzerolength": "Serwer nie może zapisać pliku zapasowego do archiwum, gdyż ma on zerową długość.",
-       "api-error-stashnotloggedin": "Musisz się zalogować, aby móc zapisać plik zapasowy do archiwum.",
-       "api-error-stashwrongowner": "Plik w archiwum, do którego próbujesz uzyskać dostęp, nie należy do Ciebie.",
-       "api-error-stashnosuchfilekey": "Klucz zbioru w archiwum, do którego próbujesz uzyskać dostęp, nie należy do Ciebie.",
-       "api-error-timeout": "Serwer nie odpowiedział w oczekiwanym czasie.",
-       "api-error-unclassified": "Wystąpił nieznany błąd",
-       "api-error-unknown-code": "Błąd nieznany – „$1”",
-       "api-error-unknown-error": "Błąd wewnętrzny – wysŧapił nierozpoznany błąd w trakcie próby przesłania pliku.",
-       "api-error-unknown-warning": "Nieznane ostrzeżenie – $1",
+       "api-error-stashfailed": "Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.",
+       "api-error-unknown-warning": "Nieznane ostrzeżenie: „$1”.",
        "api-error-unknownerror": "Nieznany błąd: „$1”",
-       "api-error-uploaddisabled": "Na tej wiki przesyłanie zostało wyłączone.",
-       "api-error-verification-error": "Plik może być uszkodzony lub nazwa pliku ma nieprawidłowe rozszerzenie.",
-       "api-error-was-deleted": "Plik o tej nazwie już istniał, ale został usunięty.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundy|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuty|minut}}",
        "duration-hours": "$1 {{PLURAL:$1|godzina|godziny|godzin}}",
        "expand_templates_generate_rawhtml": "Pokaż surowy HTML",
        "expand_templates_preview": "Podgląd",
        "expand_templates_preview_fail_html": "<em>Ponieważ {{SITENAME}} ma włączony surowy kod HTML i zaistniała strata danych z sesji, podgląd jest ukryty jako zabezpieczenie przed atakiem JavaScript.</em>\n\n<strong>Jeśli to jest próba słusznego podglądu, proszę spróbować ponownie.</strong>\nJeśli to nie pomoże – spróbuj [[Special:UserLogout|wylogować się]] i zalogować ponownie, a także upewnij się, że twoja przeglądarka akceptuje ciasteczka z tej witryny.",
+       "expand_templates_preview_fail_html_anon": "<em>Ponieważ {{SITENAME}} ma włączoną możliwość korzystania z surowego HTML a jesteś niezalogowany, podgląd został ukryty - jest to środek zapobiegawczy przeciwko atakom JavaScript.</em>\n\n<strong>Jeżeli jest to spodziewana próba podglądu, [[Special:UserLogin|zaloguj się]] i spróbuj ponownie.</strong>",
        "expand_templates_input_missing": "Trzeba wpisać jakiś tekst.",
        "pagelanguage": "Zmiana języka strony",
        "pagelang-name": "Strona",
        "pagelang-language": "Język",
        "pagelang-use-default": "Użyj domyślnego języka",
        "pagelang-select-lang": "Wybierz język",
+       "pagelang-reason": "Powód",
        "pagelang-submit": "Wyślij",
+       "pagelang-nonexistent-page": "Strona $1 nie istnieje.",
+       "pagelang-unchanged-language": "Strona $1 ma już ustawiony język $2.",
+       "pagelang-unchanged-language-default": "Strona $1 ma już ustawiony język taki, jak domyślny język zawartości wiki.",
+       "pagelang-db-failed": "Nie udało się zmienić języka strony w bazie danych.",
        "right-pagelang": "Zmiana języka strony",
        "action-pagelang": "zmiany języka strony",
        "log-name-pagelang": "Rejestr zmian języka",
        "log-description-pagelang": "Rejestr zmian języków przypisanych do poszczególnych stron",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|zmienił|zmieniła}} język strony $3 z „$4” na „$5”.",
        "default-skin-not-found": "Ups! Domyślna skórka dla Twojej wiki, zdefiniowana jako <code dir=\"ltr\">$wgDefaultSkin</code> jako <code>$1</code>, nie jest dostępna.\n\nTwoja instalacja, jak się wydaje, zawiera {{PLURAL:$4|następującą skórkę|następujące skórki}}. Zobacz [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pl Podręcznik:Konfiguracja skórki] z informacjami o tym, jak {{PLURAL:$4|ją włączyć|je włączyć i wybrać domyślną}}.\n\n$2\n\n; Jeśli zainstalowałeś właśnie MediaWiki:\n: Prawdopodobnie zrobiłeś to z Git lub bezpośrednio z kodu źródłowego z wykorzystaniem innej metody. Wtedy jest to możliwe. Spróbuj zainstalować niektóre skórki z [https://www.mediawiki.org/wiki/Category:All_skins/pl folderu skórek serwisu mediawiki.org]:\n:* pobierając [https://www.mediawiki.org/wiki/Download/pl archiwum plików instalacyjnych], zawierające kilka skórek i rozszerzeń. Możesz skopiować i wkleić z niego folder <code>skins/</code>;\n:* pobierając archiwa poszczególnych skórek z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git/pl#Korzystanie_z_Git_do_pobrania_rozszerzeń_MediaWiki Używając Git do pobrania skórek].\n: Jeśli jesteś programistą MediaWiki, nie powinno to zaszkodzić twojemu repozytorium Git.\n\n\n; Jeśli tylko aktualizowałeś MediaWiki:\n: MediaWiki w wersji 1.24 i nowszej nie zawiera automatycznie zainstalowanych skórek (zobacz [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:Skin autodiscovery]).\nMożna wstawić {{PLURAL:$5|następujący linię|następujące linie}} do <code>LocalSettings.php</code>, aby włączyć {{PLURAL:$5|zainstalowaną skórkę|wszystkie zainstalowane skórki}}: \n\n<pre dir=\"ltr\">$3</pre>\n\n; Jeśli właśnie zmodyfikowałeś <code>LocalSettings.php</code>:\n: Dokładnie sprawdź nazwy skórek pod kątem literówek.",
+       "default-skin-not-found-no-skins": "Ups! Domyślna skórka dla Twojej wiki, zdefiniowana w <code>$wgDefaultSkin</code> jako <code>$1</code> nie jest dostępna.\n\nNie masz zainstalowanych żadnych skórek.\n\n; Jeżeli właśnie zainstalowałeś lub zaktualizowałeś MediaWiki:\n: Prawdopodobnie zainstalowałeś z gita lub bezpośrednio z kodu źródłowego z użyciem innej metody. Jest to możliwe. MediaWiki 1.24 i nowsze nie mają dołączonych żadnych skórek w głównym repozytorium. Spróbuj zainstalować jakieś skórki z [https://www.mediawiki.org/wiki/Category:All_skins katalogu skórek na mediawiki.org], poprzez:\n:* Pobranie [https://www.mediawiki.org/wiki/Download spakowanej wersji instalacyjnej], która zawiera kilka skórek i rozszerzeń. Możesz skopiować i wkleić z niej katalog <code>skins/</code>.\n:* Pobranie pojedynczych archiwów tar z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Wykorzystanie Gita do pobierania skórek].\n: Zrobienie tego nie powinno kolidować z Twoim repozytorium git, jeżeli jesteś twórcą MediaWiki. Zobacz [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pl Podręcznik: Konfiguracja skórek] po informacje jak włączać skórki i wybrać domyślną.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (włączone)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>wyłączone</strong>)",
        "mediastatistics": "Statystyki mediów",
        "mw-widgets-dateinput-no-date": "Nie wybrano daty",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Szukaj multimediów",
+       "mw-widgets-mediasearch-noresults": "Nie znaleziono wyników.",
        "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
        "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorię...",
+       "mw-widgets-usersmultiselect-placeholder": "Dodaj więcej...",
        "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",
        "sessionprovider-nocookies": "Być może cookies są wyłączone. Upewnij się, że masz włączone cookies i zacznij od nowa.",
        "randomrootpage": "Losowa strona (bez podstron)",
        "log-action-filter-block": "Rodzaj blokady:",
-       "log-action-filter-contentmodel": "Typ modyfikacji modelu zawartości:",
+       "log-action-filter-contentmodel": "Typ zmiany modelu zawartości:",
        "log-action-filter-delete": "Rodzaj usunięcia:",
        "log-action-filter-import": "Typ importu:",
        "log-action-filter-managetags": "Typ działania zarządzania znacznikami:",
        "log-action-filter-block-reblock": "Zmiana blokady",
        "log-action-filter-block-unblock": "Odblokowanie",
        "log-action-filter-contentmodel-change": "Zmiana modelu zawartości",
-       "log-action-filter-contentmodel-new": "Utworzenie strony z niestandardowym modelem zawartości",
+       "log-action-filter-contentmodel-new": "Utworzenie strony z niedomyślnym modelem zawartości",
        "log-action-filter-delete-delete": "Usunięcie strony",
+       "log-action-filter-delete-delete_redir": "Nadpisanie przekierowania",
        "log-action-filter-delete-restore": "Odtworzenie strony",
        "log-action-filter-delete-event": "Usunięcie wpisu rejestru",
        "log-action-filter-delete-revision": "Usunięcie wersji",
        "authmanager-provider-password": "Uwierzytelnianie oparte na haśle",
        "authmanager-provider-password-domain": "Uwierzytelnianie na podstawie hasła i domeny",
        "authmanager-provider-temporarypassword": "Hasło tymczasowe",
+       "authprovider-confirmlink-request-label": "Konta, które powinny być powiązane",
        "authprovider-confirmlink-success-line": "$1: Połączono.",
+       "authprovider-confirmlink-failed": "Powiązanie konta nie udało się w pełni: $1",
        "authprovider-confirmlink-ok-help": "Kontynuuj po wyświetleniu komunikatów o błędach linkowania.",
        "authprovider-resetpass-skip-label": "Pomiń",
        "authprovider-resetpass-skip-help": "Pomiń resetowanie hasła.",
        "authform-newtoken": "Brakujący token. $1",
        "authform-notoken": "Brakujący token",
        "authform-wrongtoken": "Nieprawidłowy token",
+       "specialpage-securitylevel-not-allowed-title": "Brak dostępu",
        "specialpage-securitylevel-not-allowed": "Niestety, nie możesz korzystać z tej strony, ponieważ twoja tożsamość nie może zostać zweryfikowana.",
        "authpage-cannot-login": "Nie można uruchomić logowania.",
        "authpage-cannot-login-continue": "Nie można kontynuować logowania. Sesja najprawdopodobniej wygasła.",
        "authpage-cannot-create": "Nie można rozpocząć tworzenie konta.",
        "authpage-cannot-create-continue": "Nie można kontynuować tworzenia konta. Twoja sesja najprawdopodobniej wygasła.",
+       "authpage-cannot-link": "Nie udało się rozpocząć dowiązania konta.",
        "cannotauth-not-allowed-title": "Brak dostępu",
        "cannotauth-not-allowed": "Nie masz uprawnień, aby skorzystać z tej strony",
        "changecredentials": "Zmiana poświadczeń",
        "changecredentials-submit": "Zmień poświadczenie",
+       "changecredentials-invalidsubpage": "$1 nie jest prawidłowym typem uwierzytelnienia.",
+       "changecredentials-success": "Twoje dane zostały zmienione.",
        "removecredentials": "Usuwanie poświadczeń",
        "removecredentials-submit": "Usuń poświadczenie",
+       "removecredentials-invalidsubpage": "$1 nie jest prawidłowym typem danych logowania.",
+       "removecredentials-success": "Twoje dane zostały usunięte.",
        "credentialsform-provider": "Rodzaj poświadczeń:",
        "credentialsform-account": "Nazwa konta:",
+       "cannotlink-no-provider-title": "Brak kont możliwych do przyłączenia",
+       "cannotlink-no-provider": "Brak kont możliwych do przyłączenia.",
        "linkaccounts": "Połącz konta",
        "linkaccounts-success-text": "Konto zostało połączone.",
        "linkaccounts-submit": "Połącz konta",
        "usercssispublic": "Uwaga: Podstrony z kodem CSS są widoczne publicznie i nie powinny zawierać poufnych danych.",
        "restrictionsfield-badip": "Nieprawidłowy adres IP lub zakres adresów: $1",
        "restrictionsfield-label": "Dozwolone zakresy adresów IP:",
-       "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Błąd: $1",
-       "edit-error-long": "Błędy:\n\n$1"
+       "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "wersja $1",
+       "pageid": "ID strony: $1"
 }
index fe7db17..5ac7c99 100644 (file)
        "passwordreset-emaildisabled": "Le fonsionalità ëd pòsta eletrònica a son ëstàite disativà su sta wiki.",
        "passwordreset-username": "Stranòm:",
        "passwordreset-domain": "Domini:",
-       "passwordreset-capture": "Vëdde ël mëssagi arzultant?",
-       "passwordreset-capture-help": "S'a marca costa casela, ël mëssagi ëd pòsta eletrònica (con la ciav provisòria) a-j sarà smonù e ant l'istess temp a sarà mandà a l'utent.",
        "passwordreset-email": "Adrëssa ëd pòsta eletrònica:",
        "passwordreset-emailtitle": "Detaj dël cont ansima a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quaidun (a l'é bel fé ch'a sia chiel, da l'adrëssa IP $1) a l'ha ciamà na riampostassion ëd soa ciav për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} \nassocià a st'adrëssa ëd pòsta eletrònica:\n\n$2\n\n{{PLURAL:$3|Costa ciav provisòria|Coste ciav provisòrie}} a scadran da-sì {{PLURAL:$5|un di|$5 di}}.\nA dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peule ignoré ës mëssagi e continué a dovré soa veja ciav.",
        "saveprefs": "Salvé ij sò gust",
        "restoreprefs": "Buté torna j'ampostassion dë stàndard (an tute le session)",
        "prefs-editing": "Quàder ëd modìfica dël test",
-       "rows": "Righe:",
-       "columns": "Colòne:",
        "searchresultshead": "Specifiché soe preferense d'arserca",
        "stub-threshold": "Valor mìnim për buté an forma j'anliure dë sbòss ($1):",
        "stub-threshold-sample-link": "esempi",
        "userrights-reason": "Rason:",
        "userrights-no-interwiki": "A l'ha pa ij përmess dont a fa da manca për podèj cambieje ij drit a dj'utent ansima a dj'àutre wiki.",
        "userrights-nodatabase": "La base ëd dat $1 a-i é pa, ò pura a l'é nen local.",
-       "userrights-nologin": "A l'ha da [[Special:UserLogin|rintré ant ël sistema]] con un cont da aministrator për podej-je dé dij drit a j'utent.",
-       "userrights-notallowed": "Chiel a l'ha pa ij përmess për dé o gavé dij drit a j'utent.",
        "userrights-changeable-col": "Partìe ch'a peul cambié",
        "userrights-unchangeable-col": "Partìe ch'a peul pa cambié",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflit ëd modìfica ëd drit utent! Për piasì, ch'a lesa torna e ch'a confirma soe modìfiche.",
-       "userrights-removed-self": "A l'ha gavà për da bin ij sò drit. Parèj a peul pa pi acede a costa pàgina.",
        "group": "Partìa:",
        "group-user": "Utent",
        "group-autoconfirmed": "Utent ch'a son convalidasse daspërlor",
        "right-siteadmin": "Bloché e dësbloché la base ëd dàit",
        "right-override-export-depth": "Esporté le pàgine ancludend le pàgine colegà fin-a a na profondeur ëd 5",
        "right-sendemail": "Mandé un mëssagi an pòsta eletrònica a j'àutri utent",
-       "right-passwordreset": "Vëdde ij mëssagi ëd pòsta eletrònica ëd riampostassion dle ciav",
        "right-managechangetags": "Creé e dëscancelé dle [[Special:Tags|tichëtte]] da la base ëd dàit",
        "right-applychangetags": "Apliché [[Special:Tags|le tichëtte]] con soe pròpie modìfiche",
        "right-changetags": "Gionté e gavé dle [[Special:Tags|tichëtte]] qualsëssìa an s'dle revision andividuaj e dle vos d'argistr",
        "uploaded-animate-svg": "Trovà na tichëtta «animate», ch'a podrìa modifiché ël href an dovrand l'atribù «from» <code>&lt;$1 $2=\"$3\"&gt;</code> ant l'archivi SVG carià.",
        "uploaded-setting-event-handler-svg": "Ël posissionament dj'atribù ëd mansé a l'é blocà, <code>&lt;$1 $2=\"$3\"&gt;</code> trovà ant l'archivi SVG carià.",
        "uploaded-setting-href-svg": "L’usage dla tichëtta «set» për gionté n'atribù «href» a l’element pare a l'é blocà.",
-       "uploadscriptednamespace": "S'archivi SVG a conten në spassi nominal «$1» nen autorisà",
+       "uploadscriptednamespace": "S'archivi SVG a conten në spassi nominal «<nowiki>$1</nowiki>» nen autorisà",
        "uploadinvalidxml": "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
        "uploadvirus": "St'archivi-sì a l'han andrinta un '''vìrus!''' Detaj: $1",
        "uploadjava": "L'archivi a l'é n'archivi ZIP ch'a conten n'archivi Java .class.\nAs peulo pa cariesse dj'archivi Java, përché a peulo causé l'agirament ëd le restrission ëd sicurëssa.",
        "feedback-useragent": "Agent d'utent:",
        "searchsuggest-search": "Arserché",
        "searchsuggest-containing": "contenent ...",
-       "api-error-badaccess-groups": "Chiel a peul pa carié d'archivi su costa wiki.",
        "api-error-badtoken": "Eror antern: sìmbol pa bon.",
-       "api-error-copyuploaddisabled": "Le carie a travers ëd liure a son disabilità ansima a cost servent.",
-       "api-error-duplicate": "A-i {{PLURAL:$1|é n'àutr archivi|son àutri archivi}} già an sël sit col ël midem contnù.",
-       "api-error-duplicate-archive": "A-i {{PLURAL:$1|era n'àutr archivi|ero àutri archivi}} già an sël sit con ël midem contnù, ma {{PLURAL:$1|a l'é stàit|a son ëstàit}} ëscancelà.",
-       "api-error-empty-file": "L'archivi ch'a l'ha mandà a l'era veuid.",
        "api-error-emptypage": "La creassion ëd pàgine neuve veujde a l'é nen përmëttùa.",
-       "api-error-fetchfileerror": "Eror antern: quaicòs a l'é andàit mal antramentre ch'as arcuperava l'archivi.",
-       "api-error-fileexists-forbidden": "N'archivi con nòm «$1» a esist già, e a peul pa esse dzorascrivù.",
-       "api-error-fileexists-shared-forbidden": "N'archivi con nòm «$1» a esist già ant ël depòsit condivis ëd j'archivi, e a peul pa esse dzorascrivù.",
-       "api-error-file-too-large": "L'archivi ch'a l'ha mandà a l'era tròp gròss.",
-       "api-error-filename-tooshort": "Ël nòm ëd l'archivi a l'é tròp curt.",
-       "api-error-filetype-banned": "Costa sòrt d'archivi a l'é proibìa.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|a l'é na sòrt d'archivi proibìa|a son ëd sòrt d'archivi proibìe}}. {{PLURAL:$3|La sòrt d'archivi consentìa a l'é|Le sòrt d'archivi consentìe a son}} $2.",
-       "api-error-filetype-missing": "L'archivi a l'é sensa estension.",
-       "api-error-hookaborted": "La modìfica ch'a l'ha provà a fé a l'é stàita blocà dal gancio ëd n'estension.",
-       "api-error-http": "Eror antern: As peul pa coleghesse al servent.",
-       "api-error-illegal-filename": "Ël nòm dl'archivi a l'é nen consentì.",
-       "api-error-internal-error": "Eror antern: Cheicòs a l'é andàit mal con ël tratament ëd soa amportassion an sla wiki.",
-       "api-error-invalid-file-key": "Eror antern: archivi pa trovà ant la memòria a temp.",
-       "api-error-missingparam": "Eror antern: paràmetr mancant ant l'arcesta.",
-       "api-error-missingresult": "Eror antern: as peul pa determiné se la còpia a l'é andàita bin.",
-       "api-error-mustbeloggedin": "A dev esse intrà ant ël sistema për carié dj'archivi.",
-       "api-error-mustbeposted": "Eror antern: L'arcesta a l'ha da manca d'HTTP POST.",
-       "api-error-noimageinfo": "Ël cariament a l'é andàit bin, ma ël servent a l'ha dane gnun-e anformassion an sl'archivi.",
-       "api-error-nomodule": "Eror antern: gnun mòdoj ëd caria ampostà.",
-       "api-error-ok-but-empty": "Eror antern: Gnun-a rispòsta dal servent.",
-       "api-error-overwrite": "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
-       "api-error-stashfailed": "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
        "api-error-publishfailed": "Eror antern: Ël servent a l'ha pa podù publiché l'archivi provisòri.",
-       "api-error-stasherror": "A-i é staje n'eror durant ël cariament dl'archivi da stërmé.",
-       "api-error-stashedfilenotfound": "L'archivi stërmà a l'é nen trovasse durant ël tentativ ëd carielo da sò strem.",
-       "api-error-stashpathinvalid": "Ël përcors anté ch'a l'avrìa dovù trovesse l'archivi stërmà a l'era nen bon.",
-       "api-error-stashfilestorage": "A-ié staje n'eror an rangiand l'archivi an sò strem.",
-       "api-error-stashzerolength": "Ël servent a l'ha nen podù stërmé l'archivi, përchè a l'era ëd taja nula.",
-       "api-error-stashnotloggedin": "A dev esse rintrà ant ël sistema për argistré dj'archivi ant lë strem ëd cariament.",
-       "api-error-stashwrongowner": "L'archivi al qual a sërcava d'acede ant lë strem a l'é nen sò.",
-       "api-error-stashnosuchfilekey": "La ciav dl'archivi al qual a sërcava d'acede ant lë strem a esist pa.",
-       "api-error-timeout": "Ël servent a l'ha pa rëspondù ant ël temp ëspetà.",
-       "api-error-unclassified": "A l'é capitaje n'eror nen conossù.",
-       "api-error-unknown-code": "Eror sconossù: «$1».",
-       "api-error-unknown-error": "Eror antern: Cheicòs a l'é andàit mal quand a l'é provasse a carié sò archivi.",
+       "api-error-stashfailed": "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
        "api-error-unknown-warning": "Avis pa conossù: $1",
        "api-error-unknownerror": "Eror sconossù: «$1».",
-       "api-error-uploaddisabled": "Ël cariagi a l'é disabilità su sta wiki.",
-       "api-error-verification-error": "Cost archivi a peul esse danegià, o avèj l'estension sbalià.",
        "duration-seconds": "$1 {{PLURAL:$1|second|second}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minute}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
index 33d0afe..4898c19 100644 (file)
                        "Macofe",
                        "Matma Rex",
                        "Saanvel",
-                       "Satdeep gill"
+                       "Satdeep gill",
+                       "Abbas dhothar"
                ]
        },
-       "tog-underline": "Ø­وڑ تھلے لین:",
+       "tog-underline": "جوڑ تھلے لین:",
        "tog-hideminor": "چھوٹیاں تبدیلیاں چھپاؤ",
        "tog-hidepatrolled": "ویکھیاں تبدیلیاں لکاؤ",
        "tog-newpageshidepatrolled": "نویاں صفیاں توں ویکھیاں تبدیلیاں لکاؤ",
-       "tog-hidecategorization": "صÙ\81Ø­Û\8cاں Ø¯Û\8c Ú¯Ù¹Ú¾ Ù\84کائÙ\88۔",
+       "tog-hidecategorization": "صÙ\81Ø­Û\92Ø¢Úº Ø¯Û\8c Ú¯Ù¹Ú¾ Ù\84Ù\8fکاؤ۔",
        "tog-extendwatchlist": "نظر تھلے رکھے صفحے نوں ودھاو, تاں جے اوہ تبدیلیاں جیڑیاں کم دے قابل نیں ویکھیاں جا سکن",
-       "tog-usenewrc": "تھوڑا خر پہلے کیتیاں گیاں تبدیلیاں ورتو",
+       "tog-usenewrc": "نویاں تبدیلیاں اتے میری اکھ تھلے لسٹ وچ صفحہ وار گروپ تبدیلیاں",
        "tog-numberheadings": "آپ نمبر دین والیاں سرخیاں",
        "tog-showtoolbar": "ایڈٹ ٹولبار وکھاؤ",
        "tog-editondblclick": "صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ",
@@ -41,7 +42,7 @@
        "tog-enotifminoredits": "صفحیاں چ چھوٹیاں موٹیاں تبدیلیاں تے وی مینوں ای میل کر دیو",
        "tog-enotifrevealaddr": "میرے ای میل دے پتے نوں سندیسے آلی ای میل دے وچ وکھاؤ۔",
        "tog-shownumberswatching": "ویکھن آلے لوکاں دی گنتی وکھاؤ۔",
-       "tog-oldsig": "ہن والے دسخط:",
+       "tog-oldsig": "تواڈے ہُن والے دستخط:",
        "tog-fancysig": "دستخط نوں وکی ٹیکسڈ ونگوں؎ ورتو(without an automatic link)",
        "tog-uselivepreview": "لائیو پریویو ورتو",
        "tog-forceeditsummary": "مینون اوسے ویلے دسو جدوں خالی سمری تے آؤ۔",
        "newwindow": "(نئی ونڈو چ کھولو)",
        "cancel": "مکاؤ",
        "moredotdotdot": "مزید۔۔۔۔",
-       "morenotlisted": "ایہ لسٹ پوری نئی۔",
+       "morenotlisted": "ایہ لسٹ پوری نئیں۔",
        "mypage": "صفہ",
        "mytalk": "میریاں گلاں",
        "anontalk": "گل",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "کم",
-       "namespaces": "ناواں دی تھاں:",
+       "namespaces": "ناں تھانواں:",
        "variants": "قسماں",
        "navigation-heading": "کھوج پتر",
        "errorpagetitle": "مسئلہ",
        "search": "کھوج",
        "searchbutton": "کھوج",
        "go": "جاؤ",
-       "searcharticle": "چلو جی",
+       "searcharticle": "چلو",
        "history": "پچھلے کم",
        "history_short": "ریکارڈ",
+       "history_small": "تریخ",
        "updatedmarker": "میرے پچھلی وار آن توں مگروں دیاں تبدیلیاں",
-       "printableversion": "چھپن جوگا صفہ",
+       "printableversion": "چھپن جوگا صفحہ",
        "permalink": "پکا جوڑ",
        "print": "چھاپو",
        "view": "وکھالہ",
        "articlepage": "مضمون آلا صفحہ",
        "talk": "گل بات",
        "views": "وکھالے",
-       "toolbox": "اÙ\88زار",
+       "toolbox": "سÙ\8eÙ\86د",
        "userpage": "ورتن آلے دا صفہ ویکھو",
        "projectpage": "ویونت والا صفہ ویکھو",
        "imagepage": "فائل آلا صفہ ویکھو",
        "redirectedfrom": "(لیایا گیا $1)",
        "redirectpagesub": "صفحہ ریڈائریکٹ کرو",
        "redirectto": "اگے کرو:",
-       "lastmodifiedat": "اس صفحے نوں آخری آری $1 تریخ نوں $2 وجے بدلیا گیا۔",
+       "lastmodifiedat": "اس صفحے نوں آخری واری $1 تریخ نوں $2 وجے بدلیا گیا۔",
        "viewcount": "اس صفحے نوں {{PLURAL:$1|اک واری|$1 واری}} کھولیا گیا اے۔",
        "protectedpage": "بجایا صفحہ",
        "jumpto": "جاؤ:",
        "copyrightpage": "{{ns:project}}:نقل دے حق",
        "currentevents": "اج کل دیاں گلاں",
        "currentevents-url": "Project:اج کل دیاں گلاں",
-       "disclaimers": "Ù\85Ù\86کرÙ\86ا",
-       "disclaimerpage": "Project:عاÙ\85 Ù\85Ù\86کرÙ\86ا",
+       "disclaimers": "Ù\84اتعÙ\84Ù\82Û\8c Ø§Ø¸Û\81ار",
+       "disclaimerpage": "Project:عاÙ\85 Ù\84اتعÙ\84Ù\82Û\8c Ø§Ø¸Û\81ار",
        "edithelp": "لکھن وچ مدد",
+       "helppage-top-gethelp": "مدد",
        "mainpage": "پہلا صفہ",
-       "mainpage-description": "پہلا صفہ",
+       "mainpage-description": "پہلا صفحہ",
        "policy-url": "Project:پالیسی",
        "portal": "بیٹھک",
        "portal-url": "ویونت:بیٹھک",
-       "privacy": "بچاؤ پالیسی",
-       "privacypage": "Project:بچاؤ پالیسی",
+       "privacy": "پرائیویسی پالیسی",
+       "privacypage": "Project:پرائیویسی پالیسی",
        "badaccess": "اجازت دے وچ غلطی اے",
        "badaccess-group0": "تھاونوں ایس کم دی اجازت نیں جیہڑا تسیں آکھیا اے۔",
        "badaccess-groups": "جیڑا کم تسی کرنا چا رۓ او اوہ صرف {{PLURAL:$2|اس گروپ|ایناں گروپاں}} دے ورتن آلے کر سکدے نیں: $1۔",
        "toc": "حصے",
        "showtoc": "وکھاؤ",
        "hidetoc": "چھپاؤ",
-       "collapsible-collapse": "ڈگنا",
+       "collapsible-collapse": "لُکاؤ",
        "collapsible-expand": "ودھاؤ",
+       "confirmable-no": "نئیں",
        "thisisdeleted": "$1 ویکھو یا واپس لاؤ",
        "viewdeleted": "ویکھو 1$ ؟",
        "restorelink": "{{PLURAL:$1|اک مٹائی گئی تبدیلی|1$ مٹائیاں گئیاں تبدیلیاں}}",
        "nstab-main": "صفہ",
        "nstab-user": "ورتن والے دا صفہ",
        "nstab-media": "میڈیا آلا صفہ",
-       "nstab-special": "خاص صفہ",
+       "nstab-special": "خاص صفحہ",
        "nstab-project": "ویونت دا صفہ",
        "nstab-image": "فائل",
-       "nstab-mediawiki": "سنیعا",
+       "nstab-mediawiki": "سنیہہ",
        "nstab-template": "سانچہ",
        "nstab-help": "مدد آلا صفہ",
        "nstab-category": "گٹھ",
        "badarticleerror": "اے کم اس صفحے تے نئیں ہو سکدا۔",
        "cannotdelete": "صفحہ یا فائل \"$1\" نوں مٹایا نا جاسکیا۔\nاینوں پہلاں توں ای کسے نے مٹایا ہوۓ گا۔",
        "cannotdelete-title": "صفہ مٹا نئیں سکدے \"$1\"",
-       "badtitle": "Ù¾Û\8cÚ\91ا Ø¹Ù\86Ù\88اÙ\86",
+       "badtitle": "بھÛ\8cÚ\91ا Ø¹Ù\86Ù\88اÙ\86",
        "badtitletext": "منگیا گۓ صفے دا ناں غلط اے، خالی، یا ایہ غلط ول نال جوڑیا گیا اے۔\nہوسکدا اے ایدے چ اک دو ھندسے ایسے ہون جیڑے ناں وچ ورتے نہیں جاسکدے۔",
        "perfcached": "تھلے دتا گیا ڈیٹا کاشیڈ اے تے پانویں نواں ناں ہووے. زیادہ توں زیادہ کاشے چ  {{PLURAL:$1|اک نتیجہ ہووے|$1 نتیجے ہوون}} گے.",
        "perfcachedts": "تھلے دتا گیا ڈیٹا کاشیڈ اے تے  $1 نوں نواں کیتا گیا۔ زیادہ توں زیادہ {{PLURAL:$4|اک نتیجہ ہووے|$4 نتیجے ہوون}} نتیجے کاشے چ ہیگے نیں .",
        "protectedpagetext": "اس صفحے دے اتے تبدیلی کرن نوں روکیا گیا اے۔",
        "viewsourcetext": "تسی اس صفحے دی لکھائی نوں ویکھ تے نقل کر سکدے او:",
        "viewyourtext": "تسیں آپنی تبدیلیاں دا ذریعہ ایس صفے تے ویکھ تے کاپی کرسکدے او۔",
-       "protectedinterface": "اÛ\92 صفحے سافٹویئر نوں ورتن دی تھاں دیندا اے تے ایدے غلط ورتن نوں روکن واسطے اینوں بچایا ہویا اے۔",
+       "protectedinterface": "اÛ\8cÛ\81 صفحے سافٹویئر نوں ورتن دی تھاں دیندا اے تے ایدے غلط ورتن نوں روکن واسطے اینوں بچایا ہویا اے۔",
        "editinginterface": "'''خبردار:''' تسیں اک ایسا صفہ بدل رۓ او جیہڑا مکھی صفے دے سوفٹویر نوں لکھت دیندا اے۔ ایس صفے ج تبدیلی ورتنن والیاں دے مکھی صفے دے وکھالے نوں بدل دے گی۔ بولی وٹاندرے لئی، مہربانی کرکے میڈیاوکی بولی ویونت [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ول ویکھو۔",
        "cascadeprotected": "ایس صفے نوں تبدیلی توں بچایا گیا اے، کیوں جے ایہ تھلے دتے گۓ {{PLURAL:$1|صفہ|صفے}} چ ہیگا اے تے اینوں ''کیسکیڈنگ'' چنوتی نال بچایا گیا اے:\n\n $2",
        "namespaceprotected": "'''$1''' ناں دے صفحے تسی نئیں لکھ سکدے۔",
        "createacct-email-ph": "اپنا ای-میل پتہ دیؤ",
        "createaccountmail": "ای میل دے نال",
        "createaccountreason": "وجہ:",
+       "createacct-reason": "وجہ",
+       "createacct-reason-ph": "تسیں اک ہور کھاتہ کیوں بنا رہے او",
        "createacct-submit": "اپنا کھاتا کھولو",
        "createacct-benefit-heading": "پنجابی وکی نوں تواڈے ورگے لوکاں نے بنایا اے۔",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "blocked-mailpassword": "تواڈے IP پتے تے تبدیلی کرن تے روک اے، تے تسی کنجی وی واپس نئیں لیا سکدے تاکے ایدا غلط ورت نا ہوۓ۔",
        "eauthentsent": "اک کنفرمیشن ای میل دتے گۓ ای میل پتے تے پیج دتی گئی اے۔ اس توں پہلاں کہ کوئی دوجی ای میل کھاتے تے پیجی جاۓ، توانوں ای میل چ دتیاں ہدایات تے عمل کرنا ہوۓ گا، تا کے اے پکا ہو سکے کہ اے کھاتہ تواڈا ہی اے۔",
        "throttled-mailpassword": "اک کنجی بارے سنیعہ پہلے ای پیجیا جاچکیا اے، پچھلے {{PLURAL:$1|کینٹہ|$1 کینٹے}} چ۔ \nکوئی غلط کم ہون توں پہلے صرف اک کنجی سنیغہ {{PLURAL:$1|کینٹہ|$1 کینٹے}} پیجیا جائیکا۔",
-       "mailerror": "چٹھی پیجن چ غلطی: $1",
+       "mailerror": "ای میل بھیجن وچ غلطی: $1",
        "acct_creation_throttle_hit": "ایس وکی تے آن والے تے تواڈے آئی پی پتے ورتدیاں ہویاں {{PLURAL:$1|1 کھاتہ|$1 کھاتے}} پچھلے دن چ جیہڑا کی ایس ویلے چ زیادہ توں زیادہ دی اجازت اے۔ \nایس لئی ایتھے آن والے  تے ایس آئی پی پتے نوں ورتن والے ایس ویلے ہور کھاتہ نئیں کھول سکدے۔",
        "emailauthenticated": "تھواڈا ای-میل پتہ $2 نوں $3 تے پکا کیتا گیا۔",
-       "emailnotauthenticated": "تھواڈا ای-میل پتہ ہجے پکا نئیں ہویا۔\nکوئی ای-میل اینج دے فیچر والی نئیں پیجی جاۓ گی۔",
+       "emailnotauthenticated": "تھواڈا ای-میل پتہ ہجے پکا نئیں ہویا۔\nکوئی ای-میل اینج دے فیچر والی نئیں بھیجی جائے گی۔",
        "noemailprefs": "ایناں فیچراں نوں کم کرن لئی اپنیاں تانگاں چ ای-میل پتہ دسو۔",
        "emailconfirmlink": "ای میل پتہ پکا کرو",
        "invalidemailaddress": "ایہ ای-میل پتہ نئیں چلے گا کیوں جے اے ناں منے جان والے فارمیٹ تے بنیا ہویا اے۔\nمہربانی کرکے منے جان والے فارمیٹ پتے نوں دسو یا فیر اے تھاں خالی چھڈ دیو۔",
        "resetpass_announce": "تسی اک کچے ای-میل کود تے لاگ ان ہوگۓ او۔\nلاگ ان مکان لئی تھوانوں ایتھے اک نویں کنجی بنانی پوے گی:",
        "resetpass_header": "کھاتے دی کنجی بدلو",
        "oldpassword": "پرانی کنجی:",
-       "newpassword": "نوی کنجی:",
-       "retypenew": "نئی کنجی دوبارہ لکھو:",
+       "newpassword": "نویں کنجی:",
+       "retypenew": "نویں کنجی دوبارہ لکھو:",
        "resetpass_submit": "کنجی رکھو تے لاگ ان ہو جاو",
-       "changepassword-success": "تھواڈی کنجی بدلی جاچکی اے!\nتسی لاگ ان ہورۓ او۔۔۔۔۔۔",
+       "changepassword-success": "تھواڈی کنجی بدلی جاچکی اے!\nتسی لاگ ان ہو رہے او۔۔۔۔۔۔",
+       "botpasswords-label-appid": "بوٹ ناں",
+       "botpasswords-label-create": "بناؤ",
        "resetpass_forbidden": "کنجی بدلی نئیں جاسکدی",
        "resetpass-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "resetpass-submit-loggedin": "کنجی بدلو",
        "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 دناں}} چ مک جاوے گی۔ تسیں لاگان ہوو تے اپنی اک نويں کنجی چنو. اگر کسے ہور نے اے کنجی والی چٹھی پیجی اے یا توانوں پرانی کنجی یاد آگئی اے تے تسیں پرانی کنجی نال ای کم چلانا چاندے او تے تسیں ایس سنیعے نوں پل جاؤ تے پرانی کنجی ای ورتو۔",
        "passwordreset-emailtext-user": "ورتنوالے $1 نے {{سائیٹناں}} تے تواڈے کھاتے بارے پچھیا اے {{SITENAME}} لئی ($4)۔ تھلے دتا گیا ورتن {{PLURAL:$3|کھاتہ|کھاتے}} ایس ای-میل نال جڑدا اے۔\n\n$2\n\n{{PLURAL:$3|ایہ عارضی کنجی|اے عارضی کنجیاں}} مک جائیگا {{PLURAL:$5|اک دن|$5 دن}}۔ تسیں ہن لاکان ہوو تے نویں کنجی چنو۔ اگر کسے ہور نے اے چٹھی پیجی یا توانوں اپنی پہلی کنجی یاد آگئی اے تے تسیں اونوں بدلنا نئیں چاندے تے تسیں ایس سنیعے نوں پھل جاؤ تے پرانی کنجی نال ای کم چلاؤ۔",
        "passwordreset-emailelement": "ورتن ناں: \n$1\n\nعارضی کنجی: \n$2",
-       "passwordreset-emailsentemail": "یاد کران واسطے اک ای-میل Ù¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8c Ø§Û\92Û\94",
+       "passwordreset-emailsentemail": "یاد کران واسطے اک ای-میل Ø¨Ú¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8c Ø§Û\92Û\94",
        "changeemail": "ای-میل پتہ بدلو",
        "changeemail-header": "کھاتے دا ای-میل پتہ بدلو",
        "changeemail-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "headline_sample": "شہ سرخی",
        "headline_tip": "دوسرے درجے دی سرخی",
        "nowiki_sample": "فارمیٹ نہ ہوئی لکھائی ایتھے پاؤ",
-       "nowiki_tip": "وکی فارمیٹ رھندیو۔",
+       "nowiki_tip": "وکی فارمیٹ رہن دیؤ۔",
        "image_sample": "Example.jpg",
        "image_tip": "وچ مورت لگاؤ",
        "media_sample": "Example.ogg",
        "blockednoreason": "کوئی وجہ نئیں دسی گئی",
        "whitelistedittext": "تھواڈے کول $1 ہونا چآغیدا اے صفے تبدیل کرن لئی۔",
        "confirmedittext": "توانوں اپنا ای-میل پتہ پکا کرنا چائیدا اے تبدیلیاں کرن توں پہلے۔\nمہربانی کرکے اپنا ای-میل پتہ بناؤ تے پکا کرو [[Special:Preferences|user preferences]]",
-       "nosuchsectiontitle": "اÛ\92 ہو جیا کوئی ٹوٹا نئیں",
+       "nosuchsectiontitle": "اÛ\8cہو جیا کوئی ٹوٹا نئیں",
        "nosuchsectiontext": "تساں اک ایسے پاسے نوں بدلن دی کوشش کیتی اے جیہڑا ہے ای نئیں۔\nخورے جدوں تسی تک رۓ سے اودوں اینوں مٹادتا گیا ہووۓ یا بدل دتا گیا ہووے۔",
        "loginreqtitle": "لاگ ان چائیدا اے",
        "loginreqlink": "لاگ ان ہو جاو",
        "editconflict": "تبدیلی رپھڑ: $1",
        "explainconflict": "جدوں تسیں لکھنا شروع کیتا کسے ہور نے صفہ بدل دتا اے۔ اتلا لکھت تھاں چ چ لکھت ہے جیویں اوہ ہن ہیگی اے۔\nتواڈیاں تبدیلیاں تھلویں لکھت چ دسیاں جاریاں نیں۔ توانوں اپنیاں تبدیلیاں ہن دی لکھت چ رلانیاں پین گیاں۔\nتوانوں اپنیاں تبدیلیاںہن دی لکھت چ رلانیاں پین گیا۔\n'''صرف''' اتلی لکھت ددی تھاں بچائی جاسیگی جدوں تسیں \"{{int:savearticle}}\" دباؤ گے",
        "yourtext": "تواڈی لکھائی",
-       "storedversion": "سانبیا ورژن",
-       "nonunicodebrowser": "'''خبردار: تھواڈا براؤزر تے یونیکوڈ نئیں چلدا۔'''\nاک کم تھانوں ایس قابل کریگا جے بچت نال صفے بچا سکو: non-ASCII کیریکٹر تبدیلی ڈبے چ ہیکساڈیسیمل کوڈ دسن گے۔",
+       "storedversion": "سانبھی لکھائی",
+       "nonunicodebrowser": "'''خبردار: تھواڈے براؤزر اُتے یونیکوڈ نئیں چلدا۔'''\nاک کم تھانوں ایس قابل کریگا جے بچت نال صفے بچا سکو: non-ASCII کیریکٹر تبدیلی ڈبے چ ہیکساڈیسیمل کوڈ دسن گے۔",
        "editingold": "'''خبردار: تسیں ایس صفے دی پرانی ریوین بدل رۓ او۔'''\nاگر تسیں اینوں بچاندےاو، ایس ریوین مگروں کوئی وی تبدیلی مک جائیگی۔",
        "yourdiff": "تبدیلیاں",
        "copyrightwarning": "مہربانی کر کے اے گل یاد رکھ لو کے سارے کم {{SITENAME}} ایتھے $2 دے تھلے آن گے (زیادہ علم واسطے $1 تکو)۔<br />\nاگر تسی نئیں چاندے کے تواڑی لکھائی نوں بے رحمی نال ٹھیک کیتا جاۓ تے نالے اپنی مرضی نال اونھوں چھاپیا جاۓ تے ایتدے مت لکھو۔<br />\nتسی اے وی ساڈے نال وعدہ کر رہے او کہ اینوں تسی آپ لکھیا اے یا فیر کسی پبلک ڈومین توں یا ایہو جۓ کسے آزاد ذریعے توں نقل کیتا اے۔<br />\n'''ایتھے او کم بغیر اجازت توں نا لکھو جیدے حق راکھویں نے '''",
        "post-expand-template-inclusion-category": "صفے جتھے ٹمپلیٹ ناپ وڈا ہوگیا اے۔",
        "post-expand-template-argument-warning": "'''خبردار:''' ایس صفے تے اک ٹمپلیٹ گل بات دتی گئی اے جیہڑا چوکھا وڈا اے۔\nاے گلاں کڈ دتیاں گیاں نیں۔",
        "post-expand-template-argument-category": "صفے جناں چ کڈے گۓ ٹمپلیٹ دیاں گلاں نیں۔",
-       "parser-template-loop-warning": "ٹمپلیٹ لوپ لب لئی گئی: [[$1]]",
+       "parser-template-loop-warning": "سانچہ لوپ لبھ لئی گئی: [[$1]]",
        "parser-template-recursion-depth-warning": "ٹمپلیٹ ریکرشن ڈپتھ لمٹ ودی ($1)",
        "language-converter-depth-warning": "بولی بدلن دی ولگن ودی ($1)",
        "undo-success": "تبدیلیاں واپس ہوسکدیاں نیں۔\nتھلے فرق ویکھو اے ویکھن لئی جے ایہو ای تسی چاندے او، تے تھلے تبدیلیاں بچاؤ، تبدیلیاں مکاں دی روک نوں۔",
        "currentrevisionlink": "موجودہ حالت",
        "cur": "ہنوالا",
        "next": "اگلا",
-       "last": "پہلا",
+       "last": "پچھلا",
        "page_first": "پہلا",
        "page_last": "آخری",
        "histlegend": "ڈف سلیکشن: وکھری تبدیلیاں دا مقابلا کرن واسطے ریڈیو ڈبیاں تے نشان لاؤ تے اینٹر یا تھلے دتا گیا بٹن دباؤ۔<br />\nلیجنڈ: (موجودہ) = موجودہ تبدیلی نال مقابلہ،\n(آخری) = پچھلی تبدیلی توں فرق، M = تھوڑی تبدیلی",
        "history-fieldset-title": "ریکارڈ ویکھو",
        "history-show-deleted": "صرف مٹایا گیا اے۔",
-       "histfirst": "سب توں پہلا",
-       "histlast": "سب توں نواں",
+       "histfirst": "سبتوں پرانا",
+       "histlast": "سبتوں نواں",
        "historysize": "({{PLURAL:$1|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|searching on the wiki]] کرو چائیدے نویں صفیاں لئی۔",
        "rev-deleted-comment": "تبدیلی سمری مٹادتی گئی۔",
        "revdelete-confirm": "اے پکا کرلو جے تسیں ایہ کرنا چاندے او، تے توانوں ایدے نتیجے دا پتہ اے، تے تسیں [[{{MediaWiki:Policy-url}}|پالیسی]] تے چل کے ک رۓ او۔",
        "revdelete-suppress-text": "دبانا اودوں ای ٹھیک اے جدوں اے تھلے دتے کۓ مسلیاں لئی ہووے۔\n* غلط جانکاری\n**تھوڑی اپنے بارے جانکاری\n*:''کعر دا پتہ تے فون نمبر.''",
        "revdelete-legend": "ویکھن چانن دیاں ولگناں بناؤ",
-       "revdelete-hide-text": "ریوژن ٹیکسٹ لکاؤ",
+       "revdelete-hide-text": "ریویژن ٹیکسٹ",
        "revdelete-hide-image": "فائل دا مواد لکاؤ",
-       "revdelete-hide-name": "کم تے نشانہ چھپاؤ",
-       "revdelete-hide-comment": "Ù\84Ú©Ú¾Ù\86 Ø¯Û\92 Ø¨Ø§Ø±Û\92 Ú\86 ØµÙ\84اع Ù\84کاؤ",
+       "revdelete-hide-name": "پیرامیٹر تے ٹارگٹ چھپاؤ",
+       "revdelete-hide-comment": "Ù\84Ú©Ú¾Ù\86 Ø³Ù\85رÛ\8c",
        "revdelete-hide-user": "لکھن آلے دا ناں/آئی پی پتہ لکاؤ",
        "revdelete-hide-restricted": "ایڈمنسٹریٹراں تے ہوراں کولاں ڈیٹا لکاؤ۔",
        "revdelete-radio-same": "(اینوں ناں بدلو)",
-       "revdelete-radio-set": "ہاں",
-       "revdelete-radio-unset": "Ù\86ئÛ\8cÚº",
+       "revdelete-radio-set": "لُکی",
+       "revdelete-radio-unset": "Ù\86ظز Ø¢Ù\86دÛ\8c",
        "revdelete-suppress": "چھڈن دی چنوتی",
        "revdelete-unsuppress": "واپس کیتیاں ریویناں چ روکاں نوں ہٹاؤ۔",
        "revdelete-log": "وجہ:",
        "revdelete-submit": "{{PLURAL:$1|ریوین|ریویناں}} تے ورتو",
-       "revdelete-success": "'''ریوین وکھالہ کامیابی نال نواں کردتا گیا اے.'''",
+       "revdelete-success": "'''ریویژن وکھالہ کامیابی نال نواں کردتا گیا اے.'''",
        "revdelete-failure": "'''ریوین وکھالہ نویں نئیں کیتی جاسکدی:'''\n$1",
-       "logdelete-success": "'''Ù\84اک وکھالہ کامیابی نال سیٹ کردتا گیا.'''",
+       "logdelete-success": "'''Ù\84اگ وکھالہ کامیابی نال سیٹ کردتا گیا.'''",
        "logdelete-failure": "'''لاک وکھالہ ویکھیا نئیں جاسکدا:'''\n$1",
        "revdel-restore": "وکھالا بدلو",
        "pagehist": "صفحے دی تریخ",
        "deletedhist": "مٹائی گئی تریخ",
-       "revdelete-hide-current": "آئیٹم نوں $2 تے $1 تریخاں چ لکان چ غلطی۔\nایہ نئیں لکائی جاسکدی۔",
-       "revdelete-show-no-access": "$2، $1 دی تریخاں دیاں آئٹماں دے دسن چ غلطی ہوئی اے : ایہ آئٹم حد چ اے۔\nتسیں ایدے تک نئیں جاسکدے او۔",
+       "revdelete-hide-current": "آئیٹم نوں $2 تے $1 تریخاں چ لُکان وچ غلطی۔\nایہ نئیں لکائی جاسکدی۔",
+       "revdelete-show-no-access": "$2، $1 دی تریخاں دیاں آئٹماں دے دسن چ غلطی ہوئی اے : ایہ آئٹم حد وچ اے۔\nتسیں ایدے تک نئیں جاسکدے او۔",
        "revdelete-modify-no-access": "$2، $1 تریخ دی آئٹم بدلن چ غلطی ہوئی: ایہ آئٹم نوں حد چ رکھیا اے۔ تواڈی ایتھوں تک رسائی نئیں۔",
        "revdelete-modify-missing": "آئی ڈی آئیٹم $1 توں بدلن چ فلطی: ایہ ڈیٹابیس چ نئیں اے۔",
        "revdelete-no-change": "'''خبردار:''' $2 تریخ دی آئیٹم، $1 پہلے ای دیس سیٹنگ لئی آکھی جاچکی اے۔",
        "revdelete-otherreason": ":دوجی وجہ",
        "revdelete-reasonotherlist": "ہور وجہ",
        "revdelete-edit-reasonlist": "مٹانے دی وجہ لکھو",
-       "revdelete-offender": "ریوین لکھاری",
+       "revdelete-offender": "ریویژن لکھاری",
        "suppressionlog": "دبان لاگ",
-       "suppressionlogtext": "تھÙ\84Û\92 Ù\85ٹاÙ\86 ØªÛ\92 Ø±Ù\88Ú©Ù\86 Ø¯Û\92 Ú©Ù\85 Ø¯Û\8c Ù\84سٹ Ø§Û\92 Ø¬Û\8cÛ\81Ú\91ا Ù\85Ú©Ú¾Û\8cاÙ\88اں Ú©Ù\88Ù\84Ù\88Úº Ù\84Ú©Û\8cا Ø§Û\92Û\94\n[[Special:BlockList|IP block list]] Ù\88Û\8cÚ©Ú¾Ù\88  Û\81Ù\86 Ø¯Û\8c اوپریشنل بنداں تے روکاں تے۔",
+       "suppressionlogtext": "تھÙ\84Û\92 Ù\85ٹاÙ\86 ØªÛ\92 Ø±Ù\88Ú©Ù\86 Ø¯Û\92 Ú©Ù\85 Ø¯Û\8c Ù\84سٹ Ø§Û\92 Ø¬Û\8cÛ\81Ú\91ا Ù¾Ø±Ø¨Ù\86دھکاں Ú©Ù\88Ù\84Ù\88Úº Ù\84Ù\8fÚ©Û\8cا Ø§Û\92Û\94\nÙ\88Û\8cÚ©Ú¾Ù\88[[Special:BlockList|IP block list]]    Û\81Ù\86 Ø¯Û\8cاں اوپریشنل بنداں تے روکاں تے۔",
        "mergehistory": "صفیاں دا رکارڈ رلاؤ",
        "mergehistory-header": "ایہ صفہ توانوں اک سورس صفے دیاں ریویناں دا رکارڈ اک ہور صفے چ رلان دیوے گا۔\nایہ گل پکی کرو جے تبدیلی رکارڈ دی لکاتاری نوں رکھے گی۔",
        "mergehistory-box": "دوصفیاں دیاں رلیاں ریویني",
        "searchprofile-advanced-tooltip": "کسٹم ناواں چ لبو",
        "search-result-size": "$1 ({{PLURAL:$2|1 شبد|$2 شبد}})",
        "search-result-category-size": "{{PLURAL:$1|1 سنگی|$1 سنگی}} ({{PLURAL:$2|1 نکیاں گٹھاں|$2 نکیاں گٹھاں}}, {{PLURAL:$3|1 فائل|$3 فائلاں}})",
-       "search-redirect": "($1 Ø±Û\8cÚ\88ائرÛ\8cÚ©Ù¹)",
+       "search-redirect": "($1 ØªÙ\88Úº Ù\85Ú\91 Ø±Ø¬Ù\88ع)",
        "search-section": "($1 ٹوٹا)",
+       "search-category": "(کیٹیگری $1)",
        "search-suggest": "تسی $1 دی گل تے نئیں کر رۓ:",
        "search-interwiki-caption": "رلدے ویونت",
        "search-interwiki-default": "$1 نتارے:",
        "search-interwiki-more": "(اور)",
+       "search-interwiki-more-results": "ہور نتیجے",
        "search-relatedarticle": "جڑیاں",
        "searchrelated": "جڑیا",
        "searchall": "سارے",
        "saveprefs": "بچاؤ",
        "restoreprefs": "ڈیفالٹ سیٹنگز دوبارہ لیاؤ",
        "prefs-editing": "لکھائی",
-       "rows": "قطار:",
-       "columns": "کالم:",
        "searchresultshead": "کھوج",
        "stub-threshold": "بوآ <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes): لئی",
        "stub-threshold-disabled": "ناکارہ",
        "timezoneuseserverdefault": "وکی ڈیفالٹ ($1) ورتو۔",
        "timezoneuseoffset": "دوجے (آفسٹ دسو)",
        "servertime": "سرور دا ویلا:",
-       "guesstimezone": "براؤزر توں پعرو۔",
+       "guesstimezone": "براؤزر توں بھرو۔",
        "timezoneregion-africa": "افریقہ",
        "timezoneregion-america": "امریکہ",
        "timezoneregion-antarctica": "انٹارکٹکا",
        "yourlanguage": "بولی:",
        "yourvariant": "ورتی بولی دی اک ہور ونڈ:",
        "prefs-help-variant": "تسیں وکھرے یا اورتوگرافی چنی اے ایس وکی دیاں لکھتاں نوں دکھان لئی۔",
-       "yournick": "دسخط:",
-       "prefs-help-signature": "Ú¯Ù\84 Ø¨Ø§Øª ØµÙ\81Û\92 ØªÛ\92 \"<nowiki>~~~~</nowiki>\"  Ø¯Û\92 Ù\86اÙ\84 Ø¯Ø³Ø®Ø· Û\81Ù\88Ù\86Û\92 Ú\86ائÛ\8cدÛ\92 Ù\86Û\8cÚº Ø¬Ù\86اں Ù\86Ù\88Úº Ø¯Ø³Ø®Ø· ØªÛ\92 Ù\88Û\8cÙ\84Û\92 چ دسیا جائیگا۔",
-       "badsig": "ناں منیا جان والا کچا دسخط۔\nایچ ٹی ایم ایل ٹیگ۔",
-       "badsiglength": "تھÙ\88اÚ\88Û\92 Ø¯Ø³Ø®Ø· Ø¨Ø¹Ù\88ت Ù\84Ù\85بÛ\92 Ù\86Û\8cÚºÛ\94\n\nاÛ\92 $1 {{PLURAL:$1|اکرا|اکرے}}توں لمبے ناں ہون۔",
+       "yournick": "نویں دستخط:",
+       "prefs-help-signature": "Ú¯Ù\84 Ø¨Ø§Øª ØµÙ\81Û\92 ØªÛ\92 \"<nowiki>~~~~</nowiki>\"  Ø¯Û\92 Ù\86اÙ\84 Ø¯Ø³ØªØ®Ø· Û\81Ù\88Ù\86Û\92 Ú\86ائÛ\8cدÛ\92 Ù\86Û\8cÚº Ø¬Ù\86Û\81اں Ù\86Ù\88Úº Ø¯Ø³ØªØ®Ø· ØªÛ\92 Ù\88Û\8cÙ\84Û\92 Ù\88چ دسیا جائیگا۔",
+       "badsig": "Ù\86اں Ù\85Ù\86Û\8cا Ø¬Ø§Ù\86 Ù\88اÙ\84ا Ú©Ú\86ا Ø¯Ø³ØªØ®Ø·Û\94\nاÛ\8cÚ\86 Ù¹Û\8c Ø§Û\8cÙ\85 Ø§Û\8cÙ\84 Ù¹Û\8cÚ¯Û\94",
+       "badsiglength": "تھÙ\88اÚ\88Û\92 Ø¯Ø³ØªØ®Ø· Ø¨Ù\88Û\81ت Ù\84Ù\85بÛ\92 Ù\86Û\8cÚºÛ\94\n\nاÛ\8cÛ\81 $1 {{PLURAL:$1|اکرا|اکرے}}توں لمبے ناں ہون۔",
        "yourgender": "جنس",
        "gender-unknown": "نئیں دسیا گیا۔",
        "gender-male": "نر",
        "prefs-help-email": "ای-میل پتہ اوپشنل اے، پر کنجی ٹھیک کرن لئی ورتیا جاندا اے، کیا تسیں اپنی کنجی پعل جاؤگے۔",
        "prefs-help-email-others": "تسیں آپ چن سکدے او جے توانوں ملیا جاوے ای-میل توں  تواڈے جوڑ توں تواڈے ورتن والے یا گل بات صفے تے۔\nتواڈا ای-میل پتہ نئیں دسیا جاندا جدوں دوجے ورتن والے توانوں ملدے نیں۔",
        "prefs-help-email-required": "ای میل پتہ چائیدا اے۔",
-       "prefs-info": "مڈلی جانکاری",
+       "prefs-info": "مڈھلی جانکاری",
        "prefs-i18n": "انٹرنیشنلائزیشن",
-       "prefs-signature": "دسخط",
+       "prefs-signature": "دستخط",
        "prefs-dateformat": "تریخ فارمیٹ",
        "prefs-timeoffset": "ٹائم آفسیٹ",
        "prefs-advancedediting": "ہور چنوتیاں",
        "prefs-displayrc": "چنوتیاں دسو",
        "prefs-displaywatchlist": "چنوتیاں دسو",
        "prefs-diffs": "ڈفز",
-       "userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø³Ø¹اب کتاب",
+       "userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø­Ø³اب کتاب",
        "userrights-lookup-user": "ورتن ٹولی بچاؤ",
        "userrights-user-editname": "اک ورتن والا ناں لکھو:",
        "editusergroup": "ورتن ٹولی چ تبدیلی",
        "userrights-reason": "وجہ:",
        "userrights-no-interwiki": "تساں نوں ورتن حق بدلن دی اجازت دوسرے وکی تے نئیں۔",
        "userrights-nodatabase": "ڈیٹابیس $1 ہے ای نئیں یا لوکل نئیں۔",
-       "userrights-nologin": "تسیں لازمی [[Special:UserLogin|log in]] اک مکھیا کھاتے نال  اپنے ح‍اں لئی۔",
-       "userrights-notallowed": "تواڈے کھاتے نوں اے اجازت نئیں جے اے ورتن حق دے سکے۔",
        "userrights-changeable-col": "ٹولیاں جیہڑیاں تسی بدل ےکدے او۔",
        "userrights-unchangeable-col": "ٹولیاں جیہڑیاں تسی بدل نئیں سکدے",
        "group": "ٹولی:",
        "group-user": "ورتن آلے",
        "group-autoconfirmed": "اپنے آپ منے گۓ ورتن والے",
        "group-bot": "بوٹ",
-       "group-sysop": "Ù\85Ú©Ú¾Û\8cÛ\93",
+       "group-sysop": "پربÙ\86دھک",
        "group-bureaucrat": "بیوروکریٹ",
        "group-suppress": "چھڈیا گیا",
        "group-all": "(سارے)",
        "group-user-member": "{{GENDER:$1|ورتن والا}}",
        "group-autoconfirmed-member": "{{GENDER:$1|اپنے آپ منے گۓ ورتن والے}}",
        "group-bot-member": "{{GENDER:$1|بوٹ}}",
-       "group-sysop-member": "{{GENDER:$1|Ù\85Ú©Ú¾Û\8cا}}",
+       "group-sysop-member": "{{GENDER:$1|پربÙ\86دھک}}",
        "group-bureaucrat-member": "{{GENDER:$1|بیوروکریٹ}}",
        "group-suppress-member": "{{GENDER:$1|چھڈی گئی}}",
        "grouppage-user": "{{ns:project}}:ورتن آلے",
        "right-move-rootuserpages": "ورتن جڑ صفے لے چلو",
        "right-movefile": "فائلاں لے چلو۔",
        "right-suppressredirect": "جدوں صفے بل رۓ ہوو تے سورس توں ریڈائرکٹس ناں بناؤ",
-       "right-upload": "فائل چڑہاؤ",
-       "right-reupload": "پہلاں دی لکھی ہوئی فائل دے اتے لکھو",
-       "right-reupload-own": "آپ چڑھائیاں ہوئیاں فائلاں تے لکھو۔",
-       "right-reupload-shared": "رلی میڈیا فائلاں تے چڑھاؤ",
-       "right-upload_by_url": "ۃڈي توں چرھائی گئی فاغلاں",
+       "right-upload": "فائل چڑھاؤ",
+       "right-reupload": "پہلاں دی لکھی ہوئی فائل دے اُتے لکھو",
+       "right-reupload-own": "آپ Ú\86Ú\91ھائÛ\8cاں Û\81Ù\88ئÛ\8cاں Ù\81ائÙ\84اں Ø§Ù\8fتÛ\92 Ù\84Ú©Ú¾Ù\88Û\94",
+       "right-reupload-shared": "رÙ\84Û\8c Ù\85Û\8cÚ\88Û\8cا Ù\81ائÙ\84اں Ø§Ù\8fتÛ\92 Ú\86Ú\91ھاؤ",
+       "right-upload_by_url": "URL توں چرھائیاں گئیاں فائلاں",
        "right-purge": "جیہڑے صفے دی پک ناں ہووے اوس دی سائٹ کاشے صاف کرو",
-       "right-autoconfirmed": "کج بچاۓ گۓ صفے نوں تبدیل کرو۔",
+       "right-autoconfirmed": "آئی پی بیسڈ ریٹ حداں توں پریشان نا ہوو",
        "right-bot": "اپنے آپ ہوندے کم ورگا ورتو",
        "right-nominornewtalk": "نکیاں تبدیلیاں کوئی نين گل بات والے صفے تے جیہڑیاں نویں سنیعے نون ٹران",
        "right-apihighlimits": "API  کھوجاں چ آخدی جد تک جاؤ",
        "right-deleterevision": "مٹاؤ تے واپس لیاؤ صفیاں دیاں خاص ریوین",
        "right-deletedhistory": "مٹایا ہویا ریکارڈ ویکھو بنا اودیاں لکھتاں دے۔",
        "right-deletedtext": "مٹائی لکھت تے مٹیاں ریویناں دیاں تبدیلیاں ویکھو۔",
-       "right-browsearchive": "مٹاۓ ہوۓ صفحے کھوجو",
+       "right-browsearchive": "مٹائے ہوئے صفحے کھوجو",
        "right-undelete": "مٹایا صفحہ واپس لیاو",
        "right-suppressrevision": "اوہ ریویناں  نوں دوبارہ لیاؤ تے ویکھو جیہڑیاں مکھیاں توں لکیاں نیں۔",
        "right-suppressionlog": "پرائیویٹ لاگز ویکھو",
        "right-siteadmin": "ڈیٹابیس نوں کھولو تے بند کرو",
        "right-override-export-depth": "5 تک صفے تے جڑے صفے لے کے جاؤ",
        "right-sendemail": "دوجے ورتن والیاں نوں ای-میل کرو",
-       "right-passwordreset": "کنجی بدلی ای-میلاں نوں وکھاؤ",
        "newuserlogpage": "ورتنوالا بنان آلی لاگ",
        "newuserlogpagetext": "اے ورتن والا بنان دی لاگ اے۔",
        "rightslog": "ورتن والے دے حقاں دی لاگ",
        "action-autopatrol": "کیا تساں تبدیلی دے نشاں تے گشت دا نشان لایا",
        "action-unwatchedpages": "بنا اکھ تھلے رکھیاں صفیاں دی لسٹ ویکھو",
        "action-mergehistory": "ایس صفے دا رکارڈ رلاؤ",
-       "action-userrights": "ورتن ح‌ق چ تبدیلی کرو",
+       "action-userrights": "ورتن حق وچ تبدیلی کرو",
        "action-userrights-interwiki": "ورتن حقاں نوں دوجے وکیاں تے تبدیل کرو۔",
        "action-siteadmin": "ڈیٹابیس نوں کھولو یا بند کرو",
-       "action-sendemail": "ای-میلاں Ù¾Û\8cجÙ\88",
+       "action-sendemail": "ای-میلاں Ø¨Ú¾Û\8cجÙ\88",
        "nchanges": "$1 {{PLURAL:$1|change|تبدیلیاں}}",
        "enhancedrc-history": "پچھلا کم",
        "recentchanges": "نویاں تبدیلیاں",
        "rclistfrom": "$3 $2 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
        "rcshowhideminor": "$1 معمولی تبدیلیاں",
        "rcshowhideminor-show": "وکھاو",
-       "rcshowhideminor-hide": "لکاؤ",
+       "rcshowhideminor-hide": "لُکاؤ",
        "rcshowhidebots": "$1 بوٹ",
        "rcshowhidebots-show": "وکھاؤ",
-       "rcshowhidebots-hide": "لکاؤ",
+       "rcshowhidebots-hide": "لُکاؤ",
        "rcshowhideliu": "$1 ورتن آلے اندر نیں",
-       "rcshowhideliu-hide": "لکاؤ",
+       "rcshowhideliu-hide": "لُکاؤ",
        "rcshowhideanons": "$1 گمنام ورتن والے",
        "rcshowhideanons-show": "وکھاو",
-       "rcshowhideanons-hide": "لکاؤ",
+       "rcshowhideanons-hide": "لُکاؤ",
        "rcshowhidepatr": "$1 ویکھی گئی لکھائی",
        "rcshowhidemine": "$1 میرے کم",
        "rcshowhidemine-show": "وکھاو",
-       "rcshowhidemine-hide": "لکاؤ",
+       "rcshowhidemine-hide": "لُکاؤ",
        "rclinks": "آخری $2 دناں دیاں $1 تبدیلیاں وکھاؤ<br />$3",
        "diff": "فرق",
        "hist": "پچھلا کم",
        "minoreditletter": "چھوٹا کم",
        "newpageletter": "نواں",
        "boteditletter": "بوٹ",
-       "number_of_watching_users_pageview": "[ $1 ویکہ ریا اے{{PLURAL:$1|ورتن والا|والے}}]",
+       "number_of_watching_users_pageview": "[ $1 ویکھ رہیا اے{{PLURAL:$1|ورتن والا|والے}}]",
        "rc_categories": "گٹھاں دی حد (وکھرے کرو \"|\")",
        "rc_categories_any": "کوئی",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹاں}} تبدیلی مگروں",
        "newsectionsummary": "/* $1 */ نواں پاسہ",
-       "rc-enhanced-expand": "لمبی کہانی وکھاؤ (جاوا سکرپٹ چائیدا اے)",
-       "rc-enhanced-hide": "لمبی کہانی لکاؤ",
+       "rc-enhanced-expand": "تفضیل وکھاؤ (جاوا سکرپٹ چائیدا اے)",
+       "rc-enhanced-hide": "تفضیل لکاؤ",
        "recentchangeslinked": "ملدیاں جلدیاں تبدیلیاں",
        "recentchangeslinked-feed": "ملدیاں جلدیاں تبدیلیاں",
        "recentchangeslinked-toolbox": "رلدیاں ملدیاں تبدیلیاں",
        "windows-nonascii-filename": "اے وکی فائل ناں جناں چ کوئی خاص کیریکٹر ہووے سپورٹ نئیں کردا۔",
        "fileexists": "اک فائل ایس ناں نال پہلے ای ہے مہربانی کرکے <strong>[[:$1]]</strong>  ویکھو\nاگر تھانوں یقین نئیں اگ تسیں اینون بدلنا چاندے اوہ۔\n[[$1|thumb]]",
        "filepageexists": "ایس فائل دا دسن والا صفہ پہلے ای <strong>[[:$1]]</strong> تے بنایا جاچکیا اے، پر این ناں دی کوئی فائل ایس ویلے نئیں ہیگی۔\nسمری جیہڑی تسیں لکھو گے اوہ دسن والے صفے تے نئیں دسے گی۔\nاپنی سموری اوتھے دیکھن لئی توانوں اپنے ہتھیں اینون تبدیل کرنا پوے گا۔\n[[$1|thumb]]",
-       "fileexists-extension": "ایس ناں دی شائل ہیگی اے: [[$2|thumb]]\n* چڑھائی گئی فائل دا ناں: <strong>[[:$1]]</strong>\n* ہیگی فائل دا ناں: <strong>[[:$2]]</strong>\nمہربانی کرکے وکھرا ناں چنو.",
+       "fileexists-extension": "ایس ناں دی فائل ہیگی اے: [[$2|thumb]]\n* چڑھائی گئی فائل دا ناں: <strong>[[:$1]]</strong>\n* ہیگی فائل دا ناں: <strong>[[:$2]]</strong>\nمہربانی کرکے وکھرا ناں چنو.",
        "fileexists-thumbnail-yes": "ایہ اک ناپ دی مورت دی فائل دسدی اے ''(تھمبنیل)''.\n[[$1|thumb]]\nمہربانی کرکے فائل ویکھو <strong>[[:$1]]</strong>.\nاگر ویکھی فائل اوسے مورت دے اصل ناپ دی اے تے فیر ایہ ضروری نئیں جے اک فالتو تھمبنیل چڑھائی جاۓ۔.",
        "file-thumbnail-no": "فائل ناں <strong>$1</strong> توں شروع ہوندا اے۔\nاے اک نکے ناپ دی مورت لگدی اے ''(تھمبنیل)''۔\nاگر تواڈے کول ایہ مورت پورے وڈے ناپ چ اے تسیں اینوں چڑھا سکدے او، نئیں تے فیر ایس فائل دا ناں بدلو۔",
        "fileexists-forbidden": "ایس ناں دی فائل پہلے ای ہیگی اے تے اودے اتے نئیں لکھیا جاسکدا۔\nاگر تسیں ہلے وی اپنی فائل چڑھاناں چاندے اوہ مہربانی کرکے نویں ناں نال چڑھاؤ۔\n[[File:$1|تھمب|وشکار|$1]]",
        "uploadwarning": "فائل چڑانے توں خبردار",
        "uploadwarning-text": "تھلے فائل بارے دس بدلو تے فیر کوشش کرو۔",
        "savefile": "فائل بچاؤ",
-       "uploaddisabled": "فائل چڑانا بند اے",
+       "uploaddisabled": "فائل چڑھانا بند اے",
        "copyuploaddisabled": "یو آر این لے چڑھانا نکارہ کیتا۔",
-       "uploaddisabledtext": "فائل چڑانے چ رکاوٹ اے۔",
+       "uploaddisabledtext": "فائل چڑھانے وچ رکاوٹ اے۔",
        "php-uploaddisabledtext": "پی ایچ پی چ فائل چڑھانا نکارہ کیتا ہویا جے۔\nمہربانی کرکے فائل چڑھان دی سیٹنک ویکھو۔",
-       "uploadscripted": "ایس فائل چ  ایچ ٹی ایم ایل یا سکرپٹ کوڈ ہیگا اے جینوں کسے ویب براؤزر نے غلط سمجیا ہووے۔",
+       "uploadscripted": "ایس فائل چ  ایچ ٹی ایم ایل یا سکرپٹ کوڈ ہیگا اے جینوں کسے ویب براؤزر نے غلط سمجھیا ہووے۔",
        "uploadvirus": "اس فائل چ وائرس اے! تفصیل: $1",
        "uploadjava": "ایہ فائل اک زپ فائل اے جیدے چ جاوا کلاس فائل اے۔\nجاوا فائلاں نوں چڑھان دی اجازت نئیں کیوں جے او بچاؤ ولاں توں بچ کے لنکدے نیں۔",
        "upload-source": "سورس فائل",
        "backend-fail-readonly": "سٹوریج بیکنڈ \"$1\"  ایس ویلے صرف پڑھیا جاسکدا اے۔ وجہ دتی اے: \"$2\"",
        "backend-fail-synced": "فائل \"$1\" اندرلے سٹوریح بیکنڈ چ اک کچی حالت چ اے۔",
        "backend-fail-connect": "سٹوریج بیکنڈ \"$1\" نال جوڑ ناں ہوسکیا۔",
-       "backend-fail-internal": "اک نان سمج ج ان والی غلطی سٹوریج بیکنڈ \"$1\" چ ہوؤی۔",
+       "backend-fail-internal": "اک ن سمجھ وچ آن والی غلطی سٹوریج بیکنڈ \"$1\" وچ ہوئی۔",
        "backend-fail-contenttype": "\"$1\" تے فائل نوں سٹور کرن لئی فائل دے اندر کی اے نئیں پتہ لگ سکیا۔",
        "backend-fail-batchsize": "سٹوریج بیکنڈ نوں $1 فائل دا بیچ {{PLURAL:$1|اوپریشن|اوپریشن}} دتا گیا؛ ایدی حد $2 {{PLURAL:$2|اوپریشن|اوپریشن}} جے۔",
        "lockmanager-notlocked": "\"$1\"  ناں کھولیا جاسکیا؛ اینوں تالا نئیں سی لگیا۔",
        "upload_source_file": " (تواڈے کمپیوٹر تے اک فائل)",
        "listfiles-summary": "ایس خاص صفے تے ساریاں چڑھائیاں فائلاں  دسیاں نیں۔\nجدوں ورتن والا اینوں فلٹر کرے، صرف اوہ فائلاں جتھے ورتن والے نیں نویں ورین دیاں فائلاں چڑھاغیاں ہون دسیاں جاندیاں نیں۔",
        "listfiles_search_for": "میڈیا نان نوں کھوجو:",
-       "imgfile": "فائل",
+       "imgfile": "تصویر",
        "listfiles": "فائل لسٹ",
        "listfiles_thumb": "نکی مورت",
        "listfiles_date": "تریخ",
        "listfiles_size": "ناپ",
        "listfiles_description": "تفصیل",
        "listfiles_count": "ورژن",
-       "file-anchor-link": "فائل",
+       "file-anchor-link": "تصویر",
        "filehist": "فائل ورتن",
        "filehist-help": "فائل نو اس ویلے دی حالت وچ ویکھن واسطے تاریخ/ویلے تے کلک کرو۔",
        "filehist-deleteall": "سب نوں مٹاؤ",
        "filehist-user": "ورتن والا",
        "filehist-dimensions": "پاسے",
        "filehist-filesize": "فائل دا ناپ",
-       "filehist-comment": "راۓ",
+       "filehist-comment": "رائے",
        "imagelinks": "فائل ورتن",
        "linkstoimage": "تھلے دتے گۓ {{PLURAL:$1|$1 صفے}} اس فائل نال جڑدے نے",
        "linkstoimage-more": "$1 توں چوکھے {{PLURAL:$1|صفہ جوڑ|صفہ جوڑ}} ایس فائل نوں۔\nتھلے دتی گئی لسٹ {{PLURAL:$1|پہلا صفہ جوڑ|پہلا $1 صفہ جوڑ}} ایس فائل نال دسدی اے۔\nاک خاص [[Special:WhatLinksHere/$2|پوری لسٹ]] ہیگی اے۔",
        "nolinkstoimage": "اس فائل نال جڑیا کوئی صفحہ نہیں۔",
        "morelinkstoimage": "ایس فائل نوں [[Special:WhatLinksHere/$1|ہور جوڑ]] ویکھو",
-       "linkstoimage-redirect": "$1 (فائل Ø±Û\8cÚ\88ائÛ\8cدکٹ) $2",
+       "linkstoimage-redirect": "$1 (فائل Ù\85Ú\91 Ø±Ø¬Ù\88ع) $2",
        "duplicatesoffile": "تھلے دتی گئی {{PLURAL:$1|فائل دوہری اے|1$ فائل دوہری نیں}} ایس فائل دیاں ([[Special:FileDuplicateSearch/$2|ہور گلاں]]) کاپی نیں۔",
        "sharedupload": "اے فائل $1 مشترکہ اپلوڈ اے تے اے دوجے منصوبے وی استعمال کر سکدے نے۔",
        "sharedupload-desc-there": "ایہ فائل $1 توں اے تے اینوں دوجے ویونت وی ورت سکدے نیں۔\nمہربانی کرکے [$2 فائل دس صفہ] ویکھو ہور دساں لئی۔",
        "download": "فائل کاپی کرو",
        "unwatchedpages": "اندیکھے صفحے",
        "listredirects": "لسٹ ریڈائریکٹس",
-       "unusedtemplates": "نا استعمال ہوۓ سچے",
+       "unusedtemplates": "نا استعمال ہوۓ سانچے",
        "unusedtemplatestext": "ایس صفے چ  سارے صفیاں دی لسٹ اے {{ns:ٹمپلیٹ}} تے جیہڑے کسے ہور صفے نال نئیں رلے۔  ٹمپلیٹ تے  ہور جوڑ ویکھ لو مٹان توں پہلے۔",
        "unusedtemplateswlh": "دوجے جوڑ",
        "randompage": "رلے ملے صفے",
        "statistics-header-pages": "صفے دے آنکڑے",
        "statistics-header-edits": "تبدیلیاں دا آنکڑہ",
        "statistics-header-users": "ورتن آلیاں دا سعاب کتاب",
-       "statistics-header-hooks": "دÙ\88جÛ\92 Ø³Ø¹اب کتاب",
+       "statistics-header-hooks": "دÙ\88جÛ\92 Ø­Ø³اب کتاب",
        "statistics-articles": "لسٹ صفے",
        "statistics-pages": "صفحے",
        "statistics-pages-desc": "اس وکی دے سارے صفحے، گل بات، اگے ٹور آلے تے دوجے صفحے ملا کے۔",
        "listusers-creationsort": "بنان تریخ توں وکھریاں کرو۔",
        "usereditcount": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "usercreated": "{{GENDER:$3|بنائی گئی}} نوں $1 تے $2",
-       "newpages": "نویں صفے",
+       "newpages": "نویں صفحے",
        "newpages-username": "ورتن آلا ناں:",
        "ancientpages": "سب توں پرانے صفے",
        "move": "لے چلو",
        "suppress": "چھڈیا گیا",
        "querypage-disabled": "اے صفہ ناکارہ کیتا گیا پرفارمنس وجہ توں۔",
        "booksources": "کتاب توں اتہ پتہ",
-       "booksources-search-legend": "اس مضمون تے کتاباں لبو",
+       "booksources-search-legend": "اس مضمون تے کتاباں لبھو",
        "booksources-search": "کھوج",
        "booksources-text": "تھلے اوناں جوڑاں دی لسٹ اے جتھے نویاں تے پرانیاں کتاباں وکدیاں نیں، تے ہور وی جانکاری ہوسکدی اے  کتاباں بارے تسیں ویکھدے او:",
        "booksources-invalid-isbn": "دتی گئی آئی ایس بی این چلدی نئیں لکدی ؛ اصل سورس نوں چیک کرو کاپی کرن توں پہلے۔",
        "activeusers-count": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}} پچھلے{{PLURAL:$3|دن|$3 دن}} چ",
        "activeusers-from": "ورتن والے ایس توں شروع ہون والے دسو:",
        "activeusers-noresult": "کوئی ورتن والا نئیں لبیا۔",
-       "listgrouprights": "ورتن ٹرلی حق",
+       "listgrouprights": "ورتن گروہ حق",
        "listgrouprights-summary": "تھلے اک لسٹ اے ورتن ٹولیاں دی ای وکی تے، اپنے رلدے حقاں نال۔ \n\nہربندے دے ح‍ق‍اں [[{{MediaWiki:Listgrouprights-helppage}}|ہور جانکاری]]",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">حق دتا گیا</span>\n* <span class=\"listgrouprights-revoked\">حق راپس</span>",
        "listgrouprights-group": "ٹولی",
        "listgrouprights-removegroup-self": "ہٹاؤ {{PLURAL:$2|ٹولی|ٹولیاں}} اپنے کھاتے چوں: $1",
        "listgrouprights-addgroup-self-all": "ساریاں ٹولیاں کٹھیاں کرو کھاتہ لئی",
        "listgrouprights-removegroup-self-all": "ایس کھاتے توں ساریاں ٹولیاں ہٹاؤ",
-       "mailnologin": "Ù\86اں Ù¾Û\8cØ­ Ù¾ØªÛ\81",
+       "mailnologin": "پتÛ\81 Ù\86ئÛ\8cÚº Ø¨Ú¾Û\8cجÛ\8cا",
        "mailnologintext": "تسیں لازمی [[Special:UserLogin|لاگان]] ہوو تے اک پکا ای-میل پتہ تواڈی [[Special:Preferences|تانگ]] چ ہووے تاں جے دوجے ورتن والے توانوں ای-میل کرسکن۔",
        "emailuser": "اس ورتن والے نو ای میل کرو",
        "emailpagetext": "تسیں تھلے دتا گیا فارم  ورت سکدے اوہ ایس ورتن والے نوں ای-میل سنیعہ کلن لئی۔ \nای-میل پتہ تساں [[Special:Preferences|تواڈے ورتن تانکآں]] چ پایا اے  ای-میل توں تواڈا پتہ دسے گا جتھے چٹھی چلی تاں جے چٹھی لین والا توانوں سدا جواب دے سکے۔",
        "emailnotarget": "لین والے ۂئی ناں ہون والا ورتن ناں۔",
        "emailtarget": "لین والے دا ورتن ناں لکھو",
        "emailusername": "ورتن آلے دا ناں:",
-       "emailusernamesubmit": "Ù¾Û\8cجÙ\88",
+       "emailusernamesubmit": "بھÛ\8cجÙ\88",
        "email-legend": "دوجے ورتن والے نوں {{سائٹ ناں}} ای-میل پیجو",
        "emailfrom": "توں:",
        "emailto": "نوں:",
        "emailsubject": "مضمون:",
-       "emailmessage": "سنیعا:",
-       "emailsend": "Ù¾Û\8cجÙ\88",
-       "emailccme": "میرے سنیعÛ\92 Ø¯Û\8c Ù\85Û\8cÙ\86Ù\88Úº Ø§Ú© Ø§Û\8c\85Û\8cÙ\84 Ú©Ø§Ù¾Û\8c Ù¾Û\8cجÙ\88Û\94",
-       "emailccsubject": "تھواڈے سنیعے دی کاپی $1 نوں:$2",
-       "emailsent": "ای-میل Ù¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8cÛ\94",
-       "emailsenttext": "تھواڈا ای-میل سنیعہ پیج دتا گیا اے۔",
+       "emailmessage": "سنیہہ:",
+       "emailsend": "بھÛ\8cجÙ\88",
+       "emailccme": "میرے سنیÛ\81Û\92 Ø¯Û\8c Ù\85Û\8cÙ\86Ù\88Úº Ø§Ú© Ø§Û\8c\85Û\8cÙ\84 Ú©Ø§Ù¾Û\8c Ø¨Ú¾Û\8cجÙ\88Û\94",
+       "emailccsubject": "تھواڈے سنیہے دی کاپی $1 نوں:$2",
+       "emailsent": "ای-میل Ø¨Ú¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8cÛ\94",
+       "emailsenttext": "تھواڈا ای-میل سنیہہ پیج دتا گیا اے۔",
        "emailuserfooter": "ایہ ای-میل $1 نے پیجی $2  نوں {{SITENAME}} تے \"ای-میل ورتن\" فنکشن نال",
-       "usermessage-summary": "پربندھ چھڈن سنیعہ",
+       "usermessage-summary": "پربندھ چھڈن سنیہہ",
        "usermessage-editor": "پربندھ ڈاکیا۔",
        "watchlist": "میریاں اکھاں تھلے رکھی لسٹ",
        "mywatchlist": "میری اکھ تھلے رکھی لسٹ",
        "watchlistfor2": "$1 تے $2 ل‏ی",
        "nowatchlist": "تھواڈی اکھ تھلے لسٹ چ کوئی شے نئیں۔",
        "watchlistanontext": "مہربانی کرکے $1 نوں ویکھو یا اپنی اکھ تھلے رکھی لسٹ نوں بدلو۔",
-       "watchnologin": "لاگ ان نئیں ہوۓ او",
+       "watchnologin": "لاگ ان نئیں ہوئے او",
        "addwatch": "اکھ تھلے کرو",
        "addedwatchtext": "اے صفحہ \"[[:$1]] تواڈیاں اکھاں تھلے آگیا اے۔<br />\nمستقبل وچ اس صفحہ تے ایدے بارے چ گل بات نویاں تبدیلیاں وچ موٹے نظر آن گے تا کہ آسانی نال کھوجیا جا سکے۔",
        "removewatch": "اکھ تھلیوں ہٹاؤ",
        "protectlogpage": "بچت لاگ",
        "protectlogtext": "تھلے صفے نوں بچان لئی تبدیلیاں دی لسٹ اے۔\n[[Special:ProtectedPages|بچاۓ صفیاں دی لسٹ]] ویکھو ہن دے اوپریشنل صفیاں دے بچاؤ دی لسٹ ویکھو۔",
        "protectedarticle": "\"[[$1]]\" بچایا گیا اے",
-       "modifiedarticleprotection": "\"[[$1]]\" آستے بچاؤ بدلیا",
+       "modifiedarticleprotection": "\"[[$1]]\" واسطے بچاؤ بدلیا",
        "unprotectedarticle": "\"[[$1]]\" توں بچاؤ ہٹا لیا گیا۔",
        "movedarticleprotection": "بچاؤ سیٹنگ \"[[$2]]\" توں \"[[$1]]\" ول پلٹی۔",
        "protect-title": "\"$1\" لئی بچاؤ پدھر تبدیل۔",
        "protect-cantedit": "تسی اس صفحے دے حفاظتی درجے نوں نہیں بدل سکدے کیونکہ توانوں اس کم دی اجازت نہیں اے۔",
        "protect-othertime": "دوجے ویلے:",
        "protect-othertime-op": "دوجے ویلے:",
-       "protect-existing-expiry": "ہن دا مکن ویاہ: $3، $2",
+       "protect-existing-expiry": "مُکن ویلہ حالے ہیگا اے: $3، $2",
        "protect-otherreason": ":دوجی وجہ",
        "protect-otherreason-op": "ہور وجہ",
        "protect-dropdown": "*بچاؤ دیاں عام وجہاں\n** زیادہ وینڈالزم\n** زیادہ سپامنگ\n**  بے مقصد لکھت چگڑے\n** زیادہ ویکھیا جان والا صفہ",
        "restriction-edit": "لکھو",
        "restriction-move": "لے چلو",
        "restriction-create": "بناؤ",
-       "restriction-upload": "اتے چاڑو",
+       "restriction-upload": "اُتے چاڑھو",
        "restriction-level-sysop": "پوری طرح بچایا ہویا",
        "restriction-level-autoconfirmed": "کج بچایا گیا",
        "restriction-level-all": "کسے وی درجے تے",
        "undelete-cleanup-error": "ناں ورتی گئی آرکائیو فائل \"$1\" دے مٹانے چ غلطی۔",
        "undelete-missing-filearchive": "فائل آرکائیو آئی ڈی $1 نوں واپس کرن چ ناکامی کیوں جے اے ڈیٹابیس نئیں اے۔\nخورے اے پہلے ای مٹ چکی ہووے۔",
        "undelete-error": "مٹاۓ صفے واپس لیان چ غلطی",
-       "undelete-error-short": "Ù\81اغÙ\84 Ù\88اپس Ú©Ø±Ù\86 چ غلطی: $1",
+       "undelete-error-short": "Ù\81ائÙ\84 Ù\88اپس Ú©Ø±Ù\86 Ù\88چ غلطی: $1",
        "undelete-error-long": "فائل واپس کرن  لگیاں غلطیاں ہوئیاں:\n$1",
        "undelete-show-file-confirm": "تساں نوں کیا پک اے جے تسیں فائل \"<nowiki>$1</nowiki>\" دی مٹائی ریوین  $2 توں $3 تک ویکھنا چاندے او؟",
        "undelete-show-file-submit": "ہاں جی",
        "month": "مہینے توں (تے پہلاں):",
        "year": "سال توں (تے پہلاں):",
        "sp-contributions-newbies": "صرف نویں ورتن والیاں دے کم وکھاؤ",
-       "sp-contributions-newbies-sub": "نویں کھاتیاں آستے",
-       "sp-contributions-newbies-title": "نویں کھاتے چ ورتن والے دے کم",
+       "sp-contributions-newbies-sub": "نویاں کھاتےآں واسطے",
+       "sp-contributions-newbies-title": "نویں کھاتے وچ ورتن والے دے کم",
        "sp-contributions-blocklog": "لاگ روکو",
        "sp-contributions-deleted": "ورتن والے دے کم مٹادتے گۓ۔",
        "sp-contributions-uploads": "چڑھائیاں فائلاں",
        "sp-contributions-logs": "لاگز",
        "sp-contributions-talk": "گل بات",
-       "sp-contributions-userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø³Ø¹اب کتاب",
+       "sp-contributions-userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø­Ø³اب کتاب",
        "sp-contributions-blocked-notice": "ایس ورتن والے تے اجکل روک اے۔ \nروکن لاگ چ ایدے بارے تھلے لکھیا اے۔",
        "sp-contributions-blocked-notice-anon": "ایس آئی پی پتے تے اجکل روک اے۔ \nروکن لاگ چ ایدے بارے تھلے لکھیا اے۔",
-       "sp-contributions-search": "حصے پان آلیاں دی تلاش",
+       "sp-contributions-search": "حصے پاؤن آلیاں دی تلاش",
        "sp-contributions-username": "آئی پی پتہ یا ورتن آلا ناں:",
        "sp-contributions-toponly": "صرف اوہ تبدیلیاں وکھاؤ جیہڑیاں سب توں نیڑے ویلے ہویاں نیں۔",
        "sp-contributions-submit": "کھوجو",
        "whatlinkshere": "ایتھے کیدا جوڑ اے",
-       "whatlinkshere-title": "اÙ\88 ØµÙ\81Û\92 Ø¬Û\8cڑے \"$1\" نال جڑے نیں",
+       "whatlinkshere-title": "اÙ\88 ØµÙ\81Û\92 Ø¬Û\81ڑے \"$1\" نال جڑے نیں",
        "whatlinkshere-page": "صفہ:",
        "linkshere": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''[[:$1]]''':",
        "nolinkshere": "'''[[:$1]]''' دے نال کسے دا جوڑ نہیں",
        "whatlinkshere-prev": "{{PLURAL:$1|پچھلا $1ا|پچھلا}}",
        "whatlinkshere-next": "{{PLURAL:$1|اگلا $1|اگلا}}",
        "whatlinkshere-links": "← جوڑ",
-       "whatlinkshere-hideredirs": "$1 ریڈائریکٹس",
+       "whatlinkshere-hideredirs": "$1 ریڈائریکٹ",
        "whatlinkshere-hidetrans": "$1 ٹرانسکلوژن",
        "whatlinkshere-hidelinks": "$1 جوڑ",
        "whatlinkshere-hideimages": "$1 مورت جوڑ",
        "ipb-unblock": "ورتن والا یا آئی پی پتہ کھولو",
        "ipb-blocklist": "روکیاں گياں نوں ویکھو",
        "ipb-blocklist-contribs": "$1 دے کم",
+       "ipb-blocklist-duration-left": "سجے",
        "unblockip": "ورتن آلے تے روک بند کرو",
        "unblockiptext": "تھلے دتا گیا فارم ورتو لکھن دی ازادی لین لئی پہلاں توں روکے آئی پی پتے  یا ورتن ناں لئی۔",
        "ipusubmit": "ایس روک نوں ہٹاؤ",
        "semiprotectedpagemovewarning": "'''نوٹ:''' ایہ صفہ نوں بچایا گیا اے تاں جے کھاتے والے ورتن والے ای اینوں ایتھں لجا سکن۔\nآخری لاگ انٹری اتے پتے لئی تھلے دتی گئی اے:",
        "move-over-sharedrepo": "== فائل ہیگی ==\nفائل نون ایس ٹائٹل[[:$1]]  ول لجانا اک ہور فائل تے اینوں چڑھا دے گا۔.",
        "file-exists-sharedrepo": "جیہڑا فائل ناں چنیاں گیا جے اوہ پہلے ای اک سانجی چ ورتیا جاریا اے۔\nمہربانی کرکے اک ہور ناں چنو۔",
-       "export": "صفحے باہر Ù¾Û\8cجÙ\88",
+       "export": "صفحے باہر Ø¨Ú¾Û\8cجÙ\88",
        "exporttext": "تسیں اے لکھت اگے پیج سکدے او تے لکھت تریخ اک خاص صفے دی یا کسے ایکس ایم ایل چ صفیاں صفیاں چ لپیٹی۔ اے کسے ہور وکی چ وی لیایا جاسکدا اے میڈیاوکی ورتدیاں [[Special:Import|صفے لیاؤ]] دی راہ۔\n\nصفے بار لجان لئی، تھلے دتے گۓ لکھت ڈبے چ سرناواں لکھو، اک سرناواں اک لائن چ  اور چنوں کیا جے تسیں  ہن دی ریوین چاندے پرانیاں دے ناۂ نال، رکارڈ صفہ لین چ، یا ہن دی ریوین  آخری تبدیلی دی جانکاری نال۔\n\nدوجے کیس چ تسیں جوڑ وی ورت سکدے او، ادھارن لئی [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] صفہ \"[[{{MediaWiki:Mainpage}}]]\" لئی۔",
        "exportall": "سارے صفے لجاؤ",
        "exportcuronly": "صرف ہن والیاں ریوین نال نئں۔ پورا ریکارڈ نیں۔",
        "export-download": "فائل دے طور تے بچاؤ",
        "export-templates": "سچہ شامل کرو",
        "export-pagelinks": "جوڑ والے صفے جوڑو ایتھوں تک:",
-       "allmessages": "سسٹم سنیآ",
+       "allmessages": "سسٹم سنیہہ",
        "allmessagesname": "ناں",
        "allmessagesdefault": "ڈیفالٹ لکھائی",
        "allmessagescurrent": "موجودہ لکھائی",
        "importfailed": "لیانا فیل: <nowiki>$1</nowiki>",
        "importunknownsource": "انجان لیان سورس ٹائپ",
        "importcantopen": "لیاندی گئی فائل نئیں کھولی جاسکی",
-       "importbadinterwiki": "Ù¾Û\8cÚ\91ا Ø§Ù\86ٹرÙ\88Ú©Û\8c Ù\84Ù\86Ú©",
+       "importbadinterwiki": "بھÛ\8cÚ\91ا Ø§Ù\86ٹرÙ\88Ú©Û\8c Ù\84Ù\86Ú©",
        "importsuccess": "لے کے آگۓ آں!",
        "importnosources": "کوئی ٹرانسوکی امپورٹ سورسز نئیں دسیا گیا تے ڈائرکٹ رکارڈ چڑھاۓ کم نئیں کر رۓ۔",
        "importnofile": "لیاندی ہوئی کوئی فائل نئیں چڑہائی گئی۔",
        "import-error-special": "\"$1\" صفہ نئیں لیایا گیا کیوں جے ایہ اک خاص ناں تھان توں نال جڑدا اے جیءرا صفیاں لئی نئیں۔",
        "import-error-invalid": "\"$1\" صفہ نئیں لیایا گیا ایدا ناں نئیں رکھیا جاسکدا۔",
        "importlogpage": "لاگ لے کے آؤ",
-       "importlogpagetext": "پربنھک لیان صفیاں دا ایڈٹ رکارڈ نال دوجے وکیاں توں۔",
+       "importlogpagetext": "پربندھک لیان صفیاں دا ایڈٹ رکارڈ نال دوجے وکیاں توں۔",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|ریوین|ریویناں}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|ریوین|ریویناں }} $2 توں",
        "javascripttest": "JavaScript ٹیسٹنگ",
        "tooltip-ca-talk": "اس صفے بارے گل بات",
        "tooltip-ca-edit": "اس صفے تے لکھو",
        "tooltip-ca-addsection": "اس گل بات وچ حصہ لے لو۔",
-       "tooltip-ca-viewsource": "اے صفہ بچایا گیا اے۔\nتسی اینو صرف ویکھ سکدے او۔",
-       "tooltip-ca-history": "اس صفے دا پرانہ ورژن۔",
+       "tooltip-ca-viewsource": "اے صفہ بچایا گیا اے۔\nتسی اینوں صرف ویکھ سکدے او۔",
+       "tooltip-ca-history": "اس صفے دا پرانا ورژن۔",
        "tooltip-ca-protect": "اس صفے نوں بچاؤ",
        "tooltip-ca-unprotect": "ایس صفے دا بچاؤ بدلو۔",
        "tooltip-ca-delete": "اس صفے نوں مٹاؤ",
        "tooltip-ca-watch": "اس صفحہ تے نظر رکھو",
        "tooltip-ca-unwatch": "اس صفحے توں نظر ہٹاؤ",
        "tooltip-search": "کھوج {{SITENAME}}",
-       "tooltip-search-go": "اس Ù\86اں Ø¯Û\92 ØµÙ\81Û\92 ØªÛ\92 Ú\86Ù\84Ù\88Ø\8c Ø§Ú¯Ø± ایہ ہیگا اے",
-       "tooltip-search-fulltext": "اس شبد نوں صفیاں چ لبو",
-       "tooltip-p-logo": "پہلا صفہ",
+       "tooltip-search-go": "اس Ù\86اں Ø¯Û\92 ØµÙ\81Û\92 ØªÛ\92 Ú\86Ù\84Ù\88Ø\8c Ø¬Û\92 ایہ ہیگا اے",
+       "tooltip-search-fulltext": "اس شبد نوں صفحےآں وچ لبھو",
+       "tooltip-p-logo": "پہلا صفہ ویکھو",
        "tooltip-n-mainpage": "پہلے صفے نوں ویکھو",
        "tooltip-n-mainpage-description": "پہلے صفے تے جاؤ",
-       "tooltip-n-portal": "پربندھ بارے ، تسیں کی کر سکدے او تے کنج کھوج سکدے او",
+       "tooltip-n-portal": "پربندھ بارے ، تسیں کیہ کر سکدے او تے کنج کھوج سکدے او",
        "tooltip-n-currentevents": "موجودہ حالات تے پچھلیاں معلومات دیکھو",
        "tooltip-n-recentchanges": "وکی تے نویاں تبدیلیاں۔",
        "tooltip-n-randompage": "کوئی صفہ کھولو۔",
-       "tooltip-n-help": "Ù\85دد Ù\84Û\8cÙ\86Û\92 Ø¢Ù\84ی جگہ۔",
+       "tooltip-n-help": "Ù\84بھÙ\86 Ø¯ی جگہ۔",
        "tooltip-t-whatlinkshere": "اس نال جڑے سارے وکی صفے۔",
        "tooltip-t-recentchangeslinked": "اس صفے توں جڑے صفیاں چ نویاں تبدیلیاں",
        "tooltip-feed-rss": "RSS feed for this page",
        "tooltip-t-emailuser": "اس ورتن والے نو ای میل کرو",
        "tooltip-t-upload": "فائل چڑھاؤ",
        "tooltip-t-specialpages": "سارے خاص صفیاں دی اک لسٹ",
-       "tooltip-t-print": "اس صفے دا چھپنے آلا ورژن ویکھو",
+       "tooltip-t-print": "اس صفحے دا چھپن والا ورژن ویکھو",
        "tooltip-t-permalink": "اس صفے دے اس ورژن نال پکا جوڑ",
        "tooltip-ca-nstab-main": "مواد آلا صفہ ویکھو",
        "tooltip-ca-nstab-user": "ورتن آلے دا صفہ ویکھو",
        "tooltip-ca-nstab-special": "ایہ اک خاص صفہ اے، تے ایہنوں لکھیا نئی جا سکدا۔",
        "tooltip-ca-nstab-project": "وینت دا صفہ ویکھو",
        "tooltip-ca-nstab-image": "فائل دا صفہ ویکھو",
-       "tooltip-ca-nstab-mediawiki": "پربÙ\86دھ Ø³Ù\86Û\8cعہ ویکھو",
+       "tooltip-ca-nstab-mediawiki": "Ù\86ظاÙ\85Û\8c Ø³Ù\86Û\8cÛ\81ہ ویکھو",
        "tooltip-ca-nstab-template": "سانچہ ویکھو",
        "tooltip-ca-nstab-help": "مدد دا صفحہ ویکھو",
        "tooltip-ca-nstab-category": "کیٹاگری آلا صفہ ویکھو",
        "spamprotectiontitle": "سپام بچاؤ فلٹر",
        "spamprotectiontext": "لکھت جیہڑی تسی بچانا چاندے او اونوں سپام فلٹر نے روکیا اے۔\nایہ خورے کسے جوڑ دی بارلے  بلیکلسٹڈ سائٹ نال ہون توں ہوئی اے۔",
        "spamprotectionmatch": "تھلے دتی گئی لکھت نے ساڈے سپام فلٹر نوں چلایا: $1",
-       "spambot_username": "Ù\85Û\8cÚ\88Û\8cاÙ\88Ú©Û\8c Ø³Ù¾Ø§Ù\85 Ø³فائی",
+       "spambot_username": "Ù\85Û\8cÚ\88Û\8cاÙ\88Ú©Û\8c Ø³Ù¾Ø§Ù\85 Øµفائی",
        "spam_reverting": "آخری ریوین ول جیدے چ $1 دے جوڑ ناں ہون۔",
        "spam_blanking": "سارے ریوین جناں چ $1 نوں جوڑ نیں، طاف کیتا جاریا اے۔",
        "simpleantispam-label": "سپام روک پھاٹک\nDo <strong>not</strong> fill this in!",
        "pageinfo-watchers": "ویکھن والے",
        "pageinfo-edits": "تبدیلیاں گنتی",
        "pageinfo-authors": "وکھرے لکھاریاں دی گنتی",
-       "pageinfo-toolboxlink": "صفہ وات",
+       "pageinfo-toolboxlink": "صفحہ جانکاری",
        "markaspatrolleddiff": "ویکھے گۓ دا نشان لاؤ",
        "markaspatrolledtext": "ایس صفے تے ویکھن دا نشان لاؤ",
        "markedaspatrolled": "ویکھن دا نشان لاؤ",
        "file-info": "فائل ناپ: $1، MIME  ٹائپ: $2",
        "file-info-size": "پکسل:$1 × $2, فائل سائز: $3, مائم ٹائپ: $4",
        "file-info-size-pages": "$1 × $2 پکسل, فائل ناپ: $3, مائم ٹائپ: $4, $5 {{PLURAL:$5|صفہ|صفے}}",
-       "file-nohires": "اس ØªÙ\88Úº Ù\88Ú\88Û\8c Ù\81Ù\88Ù¹Ù\88 موجود نہیں۔",
+       "file-nohires": "اس ØªÙ\88Úº Ù\88Ú\88Û\8c Ù\85Ù\88رت موجود نہیں۔",
        "svg-long-desc": "ایس وی جی فائل، پکسل:$1 × $2، فائل سائز: $3",
        "show-big-image": "اصلی فائل",
        "show-big-image-preview": "ایس وکھالے دا ناپ: $1۔",
        "feedback-thanks": "شکریہ ! تواڈی صلاع  صفہ \"[$2 $1]\" تے چاڑ دتی گئی اے۔",
        "searchsuggest-search": "کھوج",
        "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-file-too-large": "جیڑی فائل تسی دسی اے اوہ بوت وڈی اے۔",
-       "api-error-filename-tooshort": "اس فائل دا ناں بوت چھوٹا اے۔",
-       "api-error-filetype-banned": "اس قسم دی فائل تے پابندی اے۔",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|اینج دی فائل دی اجازت نئیں|اینج دیاں فائلاں دی اجازت نئیں}} اجازت دتی {{PLURAL:$3|فائل ٹائپ اے|فائل ٹائپ نیں}} $2۔",
-       "api-error-filetype-missing": "فائل چ ایکسٹنشن نئیں اے۔",
-       "api-error-hookaborted": "جیڑی تبدیلی تسی کرنا چاہی اے، اونوں اک ایکسٹنشن کنڈے نیں بند کردتا اے۔",
-       "api-error-http": "انٹرنیٹ ئلطی: سرور نال کوئی جوڑ نئیں۔",
-       "api-error-illegal-filename": "اس فائل دے ناں تے پابندی اے۔",
-       "api-error-internal-error": "اندر دی غلطی:  تواڈے وکی تے چڑھاندیاں کوئی غلطی ہوئی اے۔",
-       "api-error-invalid-file-key": "اندر دی غلطی: فائل ناں لبی کچے سٹور ج",
-       "api-error-missingparam": "اندر دی غلطی: غیب پیرامیٹرز منگن تے۔",
-       "api-error-missingresult": "اندر دی غلطی: سعاب نئیں لاسکدے جے کاپی چلے گی۔",
-       "api-error-mustbeloggedin": "فائلاں اپلوڈ کرن واسطے توانوں لاگ ان کرنا ضروری اے۔",
-       "api-error-mustbeposted": "اندر دی غلطی: ایچ ٹیٹیپی پوسٹ چائیدی اے۔",
-       "api-error-noimageinfo": "فائل چڑھانا کامیاب، پر سرور نے فائل بارے سانوں کوئی دس نئیں پیجی۔",
-       "api-error-nomodule": "انٹنیٹ غلطی: فائل چڑھان والا موڈیول سیٹ ںئیں",
-       "api-error-ok-but-empty": "انٹرنیٹ غلطی: سرور ولوں کوئی جواب نئیں۔",
-       "api-error-overwrite": "اک ہونی فائل تے ہور لکھن دی اجازت نئیں۔",
        "api-error-stashfailed": "اندر دی غلطی: سرور کچیاں فائلاں نوں رکھن چ نکام۔",
-       "api-error-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": "اے فائل کرپٹ ہو سکدی یا فیر ایدا فارمیٹ غلط اے۔",
        "special-characters-group-latin": "لاطینی",
        "special-characters-group-latinextended": "ودویں لاطینی",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-gujarati": "گجراتی",
        "special-characters-group-thai": "تھائی",
        "special-characters-group-lao": "لاؤ",
-       "special-characters-group-khmer": "کھیمر"
+       "special-characters-group-khmer": "کھیمر",
+       "mw-widgets-titleinput-description-redirect": "مڑ رجوع $1 نوں"
 }
index c23e1c5..fe83af4 100644 (file)
        "passwordreset-emaildisabled": "په دې ويکي باندې د برېښليک ځانتياوې ناچارنې شوي دي.",
        "passwordreset-username": "کارن-نوم:",
        "passwordreset-domain": "شپول:",
-       "passwordreset-capture": "د پايلې برېښليک کتل غواړې؟",
        "passwordreset-email": "برېښليک پته:",
        "passwordreset-emailtitle": "د {{SITENAME}} د گڼون څرگندنې",
        "passwordreset-emailelement": "کارن-نوم: \n$1\n\nلنډمهاله پټنوم: \n$2",
        "saveprefs": "خوندي کول",
        "restoreprefs": "ټولې تلواليزې امستنې پرځای کول (په ټولو برخو کې)",
        "prefs-editing": "سمېدنې کې دی",
-       "rows": "ليکې:",
-       "columns": "ستنې:",
        "searchresultshead": "پلټل",
        "stub-threshold-sample-link": "مخبېلگه",
        "stub-threshold-disabled": "ناچارن",
        "right-userrights-interwiki": "په نورو ويکي گانو د نورو کارنانو  کارن-رښتې سمول",
        "right-siteadmin": "توکبنسټ کولپول او پرانيستل",
        "right-sendemail": "نورو کارنانو ته برېښليک لېږل",
-       "right-passwordreset": "د پټنوم بياپرځايولو برېښليکونه کتل",
        "grant-group-email": "برېښليک لېږل",
        "grant-group-other": "بېلابېل فعاليتونه",
        "grant-blockusers": "په کارنانو بنديز لگول او بنديز ليرې کول",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ښکاره کول",
+       "rcfilters-filterlist-title": "چاڼگران",
+       "rcfilters-filter-userExpLevel-newcomer-label": "نوي راغلي",
+       "rcfilters-filter-userExpLevel-learner-label": "زده کوونکي",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
        "rclistfrom": "نوي بدلونونه چې له $3، $2 څخه پيلېږي ښکاره کول",
        "rcshowhideminor": "وړې سمونې $1",
        "uploaddisabledtext": "د دوتنې پورته کولو آسانتياوې ناچارن شوي.",
        "php-uploaddisabledtext": "په PHP کې دوتنې پورته کېدنې ناچارن شوي.\nلطفاً د file_uploads امستنې وڅارئ.",
        "uploadscripted": "دا دوتنه د HTML يا سکرېپټ کوډ لري چې کېدای شي په تېروتنه د جال يو کتنمل له خوا تفسير شوې وي.",
-       "uploadscriptednamespace": "د SVG دا دوتنه يو ناقانونه نومتشيال لري \"$1\".",
+       "uploadscriptednamespace": "د SVG دا دوتنه يو ناقانونه نومتشيال لري \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "د پورته شوې دوتنې XML نه شي تحليل کېدلی.",
        "uploadvirus": "دا دوتنه ويروس لري! تفصيل: $1",
        "upload-source": "سرچينيزه دوتنه",
        "feedback-thanks-title": "مننه!",
        "feedback-useragent": "کارن پلاوی:",
        "searchsuggest-search": "پلټل",
-       "api-error-badaccess-groups": "تاسې دې ويکي کې د دوتونو ورپورته کولو پرېښه نه لرۍ.",
-       "api-error-empty-file": "کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.",
        "api-error-emptypage": "د نوي تشو مخونو جوړولو پرېښنه نه شته.",
-       "api-error-file-too-large": "کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.",
-       "api-error-filename-tooshort": "د دوتنې نوم ډېر لنډ دی.",
-       "api-error-filetype-banned": "په دې ډول دوتنې بنديز دی.",
-       "api-error-filetype-missing": "دوتنې نوم يو شاتاړی نه لري.",
-       "api-error-illegal-filename": "د دوتنې نوم نه دی پرېښل شوی.",
-       "api-error-mustbeloggedin": "د دوتنو د پورته کولو لپاره بايد تاسې غونډال کې ننوتلی اوسۍ.",
-       "api-error-unclassified": "يوه ناڅرگنده تېروتنه رامېنځته شوه.",
-       "api-error-unknown-code": "ناڅرگنده تېروتنه: \"$1\"",
        "api-error-unknown-warning": "ناڅرگنده گواښنه: \"$1\".",
        "api-error-unknownerror": "ناڅرگنده تېروتنه: \"$1\".",
-       "api-error-uploaddisabled": "په دې ويکي باندې پورته کېدنې ناچارنې شوي.",
-       "api-error-verification-error": "کېدای شي دا دوتنه خرابه وي او يا هم ناسم شاتاړی ولري.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
        "duration-minutes": "$1 {{PLURAL:$1|دقيقه|دقيقې}}",
        "duration-hours": "$1 {{PLURAL:$1|گړۍ|گړۍ}}",
index 76a44d5..69f8df1 100644 (file)
                        "Cristofer Alves",
                        "Tark",
                        "O Andarilho",
-                       "Bruno.S.Alves 270"
+                       "Bruno.S.Alves 270",
+                       "!Silent",
+                       "Joao Xavier",
+                       "Nahime2015",
+                       "Alex Great"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "tog-enotifminoredits": "Notificar-me por email também sobre edições menores de páginas ou arquivos",
        "tog-enotifrevealaddr": "Revelar meu endereço de email nas mensagens de notificação",
        "tog-shownumberswatching": "Mostrar o número de usuários que estão vigiando",
-       "tog-oldsig": "Sua Assinatura Existente:",
+       "tog-oldsig": "Assinatura atual:",
        "tog-fancysig": "Tratar assinatura como wikitexto (sem link automático)",
        "tog-uselivepreview": "Utilizar pré-visualização em tempo real",
        "tog-forceeditsummary": "Avisar-me ao introduzir um sumário de edição vazio",
        "searcharticle": "Ir",
        "history": "Histórico da página",
        "history_short": "Histórico",
+       "history_small": "Histórico",
        "updatedmarker": "atualizado desde a minha última visita",
        "printableversion": "Versão para impressão",
        "permalink": "Ligação permanente",
        "unprotectthispage": "Alterar a proteção desta página",
        "newpage": "Página nova",
        "talkpage": "Discutir sobre esta página",
-       "talkpagelinktext": "Discussão",
+       "talkpagelinktext": "discussão",
        "specialpage": "Página especial",
        "personaltools": "Ferramentas pessoais",
        "articlepage": "Ver página de conteúdo",
        "talk": "Discussão",
        "views": "Visualizações",
        "toolbox": "Ferramentas",
-       "tool-link-userrights": "Editar grupos {{GENDER:$1|usuário}}",
+       "tool-link-userrights": "Editar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
+       "tool-link-userrights-readonly": "Ver grupos {{GENDER:$1|do usuário|da usuária}}",
+       "tool-link-emailuser": "Enviar e-mail a {{GENDER:$1|este usuário|esta usuária|este(a) usuário(a)}}",
        "userpage": "Ver página de usuário",
        "projectpage": "Ver página de projeto",
        "imagepage": "Ver página do arquivo",
        "viewsourcetext": "Você pode ver e copiar o código desta página.",
        "viewyourtext": "Você pode ver e copiar o código fonte '''das suas edições''' a esta página.",
        "protectedinterface": "Esta página fornece texto de interface ao software deste wiki, se encontrando protegida para prevenir abusos.\n\nPara adicionar ou alterar traduções em todos os wikis, utilize o [https://translatewiki.net/ translatewiki.net], projeto de traduções do MediaWiki.",
-       "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.\nPara alterar ou adicionar traduções, considere utilizar a [https://translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
+       "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários desta wiki.",
        "translateinterface": "Para adicionar ou modificar traduções para todas as wikis, por favor use  [https://translatewiki.net/ translatewiki.net], o projeto de localização do MediaWiki.",
        "cascadeprotected": "Esta página foi protegida contra edições porque é transcluída {{PLURAL:$1| na seguinte página que está protegida|nas seguintes páginas que estão protegidas}} com a opção \"em cascata\" ativada: $2",
        "namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
        "welcomecreation-msg": "A sua conta foi criada.\nNão se esqueça de personalizar as suas [[Special:Preferences|preferências no wiki {{SITENAME}}]].",
        "yourname": "Nome de usuário:",
        "userlogin-yourname": "Nome de usuário(a)",
-       "userlogin-yourname-ph": "Escreva seu nome de usuário",
+       "userlogin-yourname-ph": "Escreva seu nome de usuário(a)",
        "createacct-another-username-ph": "Forneça o nome de usuário",
        "yourpassword": "Senha:",
        "userlogin-yourpassword": "Senha",
        "yourpasswordagain": "Redigite sua senha",
        "createacct-yourpasswordagain": "Confirmar senha",
        "createacct-yourpasswordagain-ph": "Digite a senha novamente",
-       "userlogin-remembermypassword": "Mantenha-me conectado",
+       "userlogin-remembermypassword": "Mantenha-me conectado(a)",
        "userlogin-signwithsecure": "Use a conexão segura",
        "cannotlogin-title": "Não é possível entrar com sua conta",
        "cannotlogin-text": "Não é possível conectar-se.",
        "userloginnocreate": "Entrar",
        "logout": "Sair",
        "userlogout": "Sair",
-       "notloggedin": "Não autenticado",
+       "notloggedin": "Não autenticado(a)",
        "userlogin-noaccount": "Não possui uma conta?",
        "userlogin-joinproject": "Junte-se ao projeto {{SITENAME}}",
        "nologin": "Não possui uma conta? $1.",
        "eauthentsent": "Uma mensagem de confirmação foi enviada para o endereço de e-mail fornecido.\nAntes de qualquer outro e-mail ser enviado para a sua conta, você precisará seguir as instruções da mensagem, de modo a confirmar que a conta é mesmo sua.",
        "throttled-mailpassword": "Um lembrete de senha já foi enviado {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, apenas um lembrete poderá ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.",
        "mailerror": "Erro a enviar o email: $1",
-       "acct_creation_throttle_hit": "Visitantes deste wiki utilizando o seu endereço IP criaram {{PLURAL:$1|1 conta|$1 contas}} no último dia, o que é o máximo permitido neste período de tempo.\nComo resultado, visitantes que usam este endereço IP não podem criar mais nenhuma conta no momento.",
+       "acct_creation_throttle_hit": "Visitantes desta wiki com endereço IP igual ao seu criaram {{PLURAL:$1|uma conta|$1 contas}} nos últimos (ou últimas) $2, o que é o máximo permitido neste período de tempo.\nComo resultado, visitantes com este endereço IP não podem criar mais nenhuma conta no momento.",
        "emailauthenticated": "O seu endereço de e-mail foi autenticado às $3 de $2.",
        "emailnotauthenticated": "O seu endereço de e-mail ainda não foi autenticado.\nNão lhe será enviado nenhum e-mail sobre nenhuma das seguintes funcionalidades.",
        "noemailprefs": "Especifique um endereço de e-mail para que os seguintes recursos funcionem.",
        "botpasswords-label-delete": "Apagar",
        "botpasswords-label-resetpassword": "Redefinir a sua senha",
        "botpasswords-label-grants": "Permissões aplicáveis",
-       "botpasswords-help-grants": "Cada permissão da acesso à lista permissões de usuários que um usuário já tenha. Veja o [[Special:ListGrants|Lista de Permissões]] para mais informações.",
+       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de usuário. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a usa conta de usuário não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "O nome de robô \"$1\" não é válido.",
        "botpasswords-insert-failed": "Falha ao adicionar o nome de robô \"$1\". Ele já foi adicionado?",
        "passwordreset-emaildisabled": "Os recursos de e-mail foram desativados nesta wiki.",
        "passwordreset-username": "Nome de usuário:",
        "passwordreset-domain": "Domínio:",
-       "passwordreset-capture": "Ver o e-mail resultante?",
-       "passwordreset-capture-help": "Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o usuário.",
        "passwordreset-email": "Endereço de e-mail:",
        "passwordreset-emailtitle": "Detalhes da conta em {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1)\nsolicitou um lembrete dos seus detalhes de conta para {{SITENAME}} ($4).\n{{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:\n\n$2\n\n{{PLURAL:$3|Esta senha temporária vai|Essas senhas temporárias vão}} expirar em {{PLURAL:$5|um dia|$5 dias}}.\nVocê deve efetuar login e escolher uma nova senha agora.\nSe você conseguir lembrar da senha, ignore este e-mail e continue\nusando sua senha anterior. Caso contrário, prossiga com as instruções\ndisponíveis no link.",
        "passwordreset-emailelement": "Usuário: \n$1\n\nSenha temporária: \n$2",
        "passwordreset-emailsentemail": "Se este é um endereço de e-mail registrado para a sua conta, em seguida, um e-mail de redefinição de senha será enviada.",
        "passwordreset-emailsentusername": "Se houver um endereço de email associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua senha.",
-       "passwordreset-emailsent-capture2": "A redefinição da senha {{PLURAL:$1|do e-mail|dos e-mails}} foi enviada. {{PLURAL:$1|O nome de usuário e senha|A lista de nomes de usuário e senhas}} encontram-se a seguir.",
-       "passwordreset-emailerror-capture2": "O envio do e-mail {{GENDER:$2|usuário}} falhou: $1 Os {{PLURAL:$3|nome de usuário e senha|lista de nomes de usuários e senhas}} são mostrados abaixo.",
        "passwordreset-nocaller": "Um interlocutor deve ser fornecido",
        "passwordreset-nosuchcaller": "O interlocutor não existe: $1",
        "passwordreset-ignored": "A redefinição da senha não foi realizada. Talvez o provedor não tenha sido configurado?",
        "blockedtitle": "O usuário está bloqueado",
        "blockedtext": "'''O seu nome de usuário ou endereço de IP foi bloqueado.'''\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi ''$2''.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destino do bloqueio: $7\n\nVocê pode contatar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir sobre o bloqueio.\n\nVocê só poderá utilizar a funcionalidade \"Contatar usuário\" se um endereço de ''e-mail'' válido estiver especificado em suas [[Special:Preferences|preferências de usuário]] e você não tiver sido bloqueado de utilizar tal recurso.\nO seu endereço de IP atual é $3 e a ID de bloqueio é #$5.\nPor favor, inclua todos os detalhes acima em quaisquer tentativas de esclarecimento.",
        "autoblockedtext": "O seu endereço de IP foi bloqueado de forma automática, uma vez que foi utilizado recentemente por outro usuário, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:''$2''\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destino do bloqueio: $7\n\nVocê pode contatar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir sobre o bloqueio.\n\nNote que não poderá utilizar a funcionalidade \"Contatar usuário\" se não possuir uma conta nesta wiki ({{SITENAME}}) com um endereço de ''e-mail'' válido indicado nas suas [[Special:Preferences|preferências de usuário]] ou se tiver sido bloqueado de utilizar tal recurso.\n\nSeu endereço de IP no momento é $3 e sua ID de bloqueio é #$5.\nPor favor, inclua tais dados em qualquer tentativa de esclarecimentos que for realizar.",
+       "systemblockedtext": "O seu nome de usuário ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contatos sobre este assunto, por favor.",
        "blockednoreason": "sem motivo especificado",
        "whitelistedittext": "Você precisa $1 para poder editar páginas.",
        "confirmedittext": "Você precisa confirmar o seu endereço de e-mail antes de começar a editar páginas.\nPor favor, introduza um e valide-o através das suas [[Special:Preferences|preferências de usuário]].",
        "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:",
-       "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 Chorme:</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>.",
+       "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.",
        "usercsspreview": "'''Lembre-se de que você está apenas previsualizando o seu CSS particular.'''\n'''Ele ainda não foi salvo!'''",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de usuário(a) removido)",
        "rev-deleted-event": "(registros de detalhes eliminados)",
-       "rev-deleted-user-contribs": "[nome de usuário(a) ou endereço de IP eliminado – edição ocultada das contribuições]",
+       "rev-deleted-user-contribs": "[nome de usuário(a) ou endereço de IP ocultado no histórico – edição invisível nas contribuições públicas]",
        "rev-deleted-text-permission": "Esta revisão desta página foi '''eliminada'''.\nPodem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].",
        "rev-suppressed-text-permission": "A revisão desta página foi '''eliminada'''.\nVocê pode visualizá-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "rev-deleted-text-unhide": "Esta revisão desta página foi '''removida'''.\nPoderá haver detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].\nVocê ainda pode [$1 ver esta revisão] se deseja prosseguir.",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
-       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).",
+       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados da pesquisa encontrados.}}",
        "searchmenu-new": "<strong>Criar a página \"[[:$1]]\" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada com sua pesquisa.|Veja também os resultados da pesquisa encontrados.}}",
        "searchprofile-articles": "Páginas de conteúdo",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
+       "search-interwiki-more-results": "Mais resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "search-external": "Pesquisa externa",
        "searchdisabled": "A busca em {{SITENAME}} se encontra desativada.\nVocê poderá pesquisar através do Google enquanto isso.\nNote que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.",
        "search-error": "Ocorreu um erro ao buscar por: $1",
+       "search-warning": "Ocorreu um aviso ao pesquisar: $1",
        "preferences": "Preferências",
        "mypreferences": "Preferências",
        "prefs-edits": "Número de edições:",
        "saveprefs": "Salvar",
        "restoreprefs": "Restaurar todas as configurações padrão (em todas as seções)",
        "prefs-editing": "Opções de edição",
-       "rows": "Linhas:",
-       "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
        "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
        "stub-threshold-sample-link": "amostra",
        "prefs-help-recentchangescount": "Isto inclui mudanças recentes, histórico de páginas e registros.",
        "prefs-help-watchlist-token2": "Esta é a senha secreta para o feed da Web com sua lista de tokens vigiados.\nQualquer pessoa que descobrir esta senha será capaz de ler sua lista, então não a compartilhe.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram salvas.",
-       "savedrights": "Os direitos de usuário de {{GENDER:$1|$1}} foram salvos.",
+       "savedrights": "Os grupos {{GENDER:$1|do usuário|da usuária}} $1 foram gravados.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Horário local:",
        "timezoneuseserverdefault": "Utilizar padrão do wiki ($1)",
        "youremail": "Seu e-mail:",
        "username": "Nome de {{GENDER:$1|usuário|usuária|usuário(a)}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
+       "group-membership-link-with-expiry": "$1 (até $2)",
        "prefs-registration": "Hora de registro:",
        "yourrealname": "Nome verdadeiro:",
        "yourlanguage": "Língua:",
        "yourvariant": "Variante da língua de conteúdo:",
        "prefs-help-variant": "A sua variante preferida ou ortografia para mostrar no conteúdo das páginas deste wiki.",
-       "yournick": "Assinatura:",
+       "yournick": "Nova assinatura:",
        "prefs-help-signature": "Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles (<nowiki>~~~~</nowiki>) no fim dos comentários. Ao salvar, estes serão convertidos na sua assinatura mais a data e a hora da edição.",
        "badsig": "Assinatura inválida; verifique o código HTML utilizado.",
        "badsiglength": "A sua assinatura é muito longa.\nEla deve ter menos de $1 {{PLURAL:$1|caractere|caracteres}}.",
        "prefswarning-warning": "Você fez alterações em suas preferências, que não foram salvas ainda. \nSe você sair desta página sem clicar em \"$1\" suas preferências não serão atualizado.",
        "prefs-tabs-navigation-hint": "Dica: Você pode usar as teclas de seta esquerda e direita para navegar entre as abas da lista de abas.",
        "userrights": "Gestão de privilégios {{GENDER:{{BASEPAGENAME}}|do usuário|da usuária|de usuário(a)}}",
-       "userrights-lookup-user": "Administrar grupos de usuários",
+       "userrights-lookup-user": "Selecionar um usuário",
        "userrights-user-editname": "Forneça um nome de usuário(a):",
-       "editusergroup": "Editar grupos {{GENDER:$1|do(a) usuário(a)}}",
+       "editusergroup": "Carregar grupos de usuários",
        "editinguser": "Modificando privilégios d{{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} <strong>[[User:$1|$1]]</Strong> $2",
+       "viewinguserrights": "Visualizar os privilégios {{GENDER:$1|do usuário|da usuária}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
+       "userrights-viewusergroup": "Ver grupos de {{GENDER:$1|usuários}}",
        "saveusergroups": "Salvar grupos de{{GENDER:$1|usuário}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
        "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-nologin": "Você precisa [[Special:UserLogin|autenticar-se]] como um administrador para especificar os privilégios de usuário.",
-       "userrights-notallowed": "Você não tem permissão para adicionar ou remover privilégios a usuários.",
        "userrights-changeable-col": "Grupos que pode alterar",
        "userrights-unchangeable-col": "Grupos que não pode alterar",
+       "userrights-expiry-current": "Expira a $1",
+       "userrights-expiry-none": "Não expira",
+       "userrights-expiry": "Expira em:",
+       "userrights-expiry-existing": "A proteção atual expirará às $3 de $2",
+       "userrights-expiry-othertime": "Outra duração:",
+       "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-conflict": "Há um comflito de permissões de usuário! Por favor, revise e confirme as alterações novamente.",
-       "userrights-removed-self": "Você removeu seus privilégios. Portanto, você agora não pode mais acessar esta página.",
        "group": "Grupo:",
        "group-user": "Usuários",
        "group-autoconfirmed": "Usuários autoconfirmados",
        "right-siteadmin": "Bloquear e desbloquear o banco de dados",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar email a outros usuários",
-       "right-passwordreset": "Ver todos os e-mails de reposição de senhas",
        "right-managechangetags": "Criar e (des)ativar [[Special:Tags|tags]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações de alguém",
        "right-changetags": "Adicionar e remover [[Special:Tags|etiquetas]] arbitrárias em revisões e ''logs'' individuais",
        "grant-basic": "Direitos básicos",
        "grant-viewdeleted": "Ver páginas e arquivos excluídos",
        "grant-viewmywatchlist": "Veja sua lista de páginas vigiadas",
+       "grant-viewrestrictedlogs": "Ver entradas de registro restritas",
        "newuserlogpage": "Registro de criação de usuários",
        "newuserlogpagetext": "Este é um registro de novas contas de usuário",
        "rightslog": "Registro de privilégios de usuários",
        "action-upload_by_url": "enviar este arquivo a partir de um URL",
        "action-writeapi": "utilizar o modo de escrita da API",
        "action-delete": "excluir esta página",
-       "action-deleterevision": "eliminar esta revisão",
-       "action-deletedhistory": "ver o histórico de edições eliminadas desta página",
+       "action-deleterevision": "eliminar revisões",
+       "action-deletelogentry": "eliminar entradas de registro",
+       "action-deletedhistory": "ver o histórico de edições eliminadas de uma página",
+       "action-deletedtext": "ver o texto de uma revisão eliminada",
        "action-browsearchive": "pesquisar páginas eliminadas",
-       "action-undelete": "restaurar esta página",
-       "action-suppressrevision": "rever e restaurar esta edição oculta",
+       "action-undelete": "restaurar páginas",
+       "action-suppressrevision": "rever e restaurar edições ocultas",
        "action-suppressionlog": "ver este registro privado",
        "action-block": "impedir que este usuário edite",
        "action-protect": "alterar os níveis de proteção desta página",
        "action-userrights-interwiki": "editar privilégios de usuários de outros wikis",
        "action-siteadmin": "bloquear ou desbloquear o banco de dados",
        "action-sendemail": "enviar e-mails",
+       "action-editmyoptions": "editar as suas preferências",
        "action-editmywatchlist": "modifique sua lista de páginas vigiadas",
        "action-viewmywatchlist": "veja sua lista de páginas vigiadas",
        "action-viewmyprivateinfo": "veja suas informações privadas",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Exibir",
+       "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-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-invalid-filter": "Filtro inválido",
+       "rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "Nenhum filtro encontrado",
+       "rcfilters-filtergroup-registration": "Registro de usuário",
+       "rcfilters-filter-registered-label": "Registrado",
+       "rcfilters-filter-registered-description": "Editores conectados.",
+       "rcfilters-filter-unregistered-label": "Não registrado",
+       "rcfilters-filter-unregistered-description": "Editores que não estão conectados.",
+       "rcfilters-filtergroup-authorship": "Editar autoria",
+       "rcfilters-filter-editsbyself-label": "Suas próprias edições",
+       "rcfilters-filter-editsbyself-description": "Edições por você.",
+       "rcfilters-filter-editsbyother-label": "Edições de outros",
+       "rcfilters-filter-editsbyother-description": "Edições criadas por outros usuários (não você.)",
+       "rcfilters-filtergroup-userExpLevel": "Nível de experiência (apenas para usuário registados)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Recém-chegados",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendizes",
+       "rcfilters-filter-userExpLevel-learner-description": "Mais dias de atividade e edições do que \"Novatos\", mas menos do que \"Usuários experientes\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuários experientes",
+       "rcfilters-filter-userExpLevel-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
+       "rcfilters-filtergroup-automated": "Contribuições automatizadas",
+       "rcfilters-filter-bots-label": "Robô",
+       "rcfilters-filter-bots-description": "Edições feitas por ferramentas automatizadas.",
+       "rcfilters-filter-humans-label": "Humano (não bot)",
+       "rcfilters-filter-humans-description": "Edições feitas por editores humanos.",
+       "rcfilters-filtergroup-significance": "Significado",
+       "rcfilters-filter-minor-label": "Edições menores",
+       "rcfilters-filter-minor-description": "Edita o autor rotulado como menor.",
+       "rcfilters-filter-major-label": "Edições não menores",
+       "rcfilters-filter-major-description": "Edições não rotuladas como menores.",
+       "rcfilters-filtergroup-changetype": "Tipo de mudança",
+       "rcfilters-filter-pageedits-label": "Edições da página",
+       "rcfilters-filter-pageedits-description": "Edições para conteúdo wiki, discussões, descrições de categorias ....",
+       "rcfilters-filter-newpages-label": "Criações de páginas",
+       "rcfilters-filter-newpages-description": "Edições que fazem novas páginas.",
+       "rcfilters-filter-categorization-label": "Mudanças de categoria",
+       "rcfilters-filter-categorization-description": "Registros de páginas que estão sendo adicionadas ou removidas de categorias.",
+       "rcfilters-filter-logactions-label": "Acções registadas",
+       "rcfilters-filter-logactions-description": "Ações administrativas, criação de contas, eliminação de páginas, carregamentos ...",
        "rcnotefrom": "Abaixo {{PLURAL:$5|é a mudança|são as mudanças}} desde <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Mostrar as novas alterações a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "fileexists-forbidden": "Já existe um arquivo com este nome e ele não pode ser sobrescrito.\nSe ainda pretende enviar seu arquivo, volte e use um novo nome.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Já existe um arquivo com este nome no repositório de arquivos compartilhados.\nSe você ainda quer enviar seu arquivo, volte e use um novo nome.\n[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "O arquivo carregado é uma duplicata exata da versão atual de <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "O arquivo carregado é um duplicado exato {{PLURAL:$2|de uma versão anterior|de uma das versões anteriores}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Este arquivo é uma duplicata do seguinte {{PLURAL:$1|arquivo|arquivos}}:",
        "file-deleted-duplicate": "Um arquivo idêntico a este ([[:$1]]) foi eliminado anteriormente.\nVerifique o histórico de eliminação de tal arquivo antes de tentar re-enviar.",
        "file-deleted-duplicate-notitle": "Um arquivo idêntico a este foi anteriormente excluído, e o título foi suprimido. Você deve comunicar com alguém capaz de visualizar dados suprimidos, para verificar a situação antes de enviá-lo novamente.",
        "uploaded-href-attribute-svg": "os atributos href nos ficheiros SVG só están autorizados a ligar a direccións http:// ou https://, atopado <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Encontrado href para dados não seguros: alvo URI <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
        "uploaded-animate-svg": "Encontrado a tag \"animate\" que pode estar mudando \"href\", usando o atributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
-       "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"",
+       "uploaded-setting-event-handler-svg": "A definição de atributos controladores de eventos está bloqueada. Foi detetado <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
+       "uploaded-setting-href-svg": "O uso da tag \"set\" para adicionar o atributo \"href\" ao elemento mãe está bloqueado.",
+       "uploaded-wrong-setting-svg": "O uso da tag \"set\" para adicionar um destino remoto/de dados/<i>script</i> a qualquer atributo está bloqueado. No arquivo SVG enviado foi encontrado <code>&lt;set to=\"$1\"&gt;</code>.",
+       "uploaded-setting-handler-svg": "A configuração do atributo \"handler\" com destino remoto/de dados/<i>script</i> em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
+       "uploaded-remote-url-svg": "A configuração de qualquer atributo de estilo com um URL remoto em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
+       "uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com o URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
+       "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "O XML no arquivo enviado não pôde ser analisado.",
        "uploadvirus": "O arquivo contém vírus!\nDetalhes: $1",
        "uploadjava": "Este é um arquivo ZIP que contém um arquivo .class de Java.\nNão é permitido o upload de arquivos Java já que eles podem contornar as restrições de segurança.",
        "upload-options": "Opções de envio",
        "watchthisupload": "Vigiar este arquivo",
        "filewasdeleted": "Um arquivo com este nome foi enviado anteriormente e eliminado.\nVerifique o $1 antes de enviar novamente.",
+       "filename-thumb-name": "Este título parece ser o de uma miniatura. Não coloque miniaturas na wiki donde as obteve, por favor. Se não a obteve desta wiki, altere o nome do arquivo para que este seja mais fácil de compreender e não tenha o prefixo de uma miniatura, por favor.",
        "filename-bad-prefix": "O nome do arquivo que você está enviando começa com '''\"$1\"''', um nome pouco esclarecedor, comumente associado de forma automática por câmeras digitais.\nEscolha um nome de arquivo mais explicativo.",
        "filename-prefix-blacklist": " #<!-- deixe esta linha exatamente como está --> <pre>\n# A sintaxe é a seguinte:\n#   * Tudo a partir do caractere \"#\" até ao fim da linha é um comentário\n#   * Todas as linhas não vazias são um prefixo para nomes de arquivos típicos atribuídos automaticamente por câmaras digitais\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alguns telefones móveis\nIMG # genérico\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- deixe esta linha exatamente como está -->",
        "upload-proto-error": "Protocolo incorreto",
        "upload-too-many-redirects": "A URL contém redirecionamentos demais",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar envios remotos neste domínio.",
+       "upload-foreign-cant-upload": "Este wiki não está configurado para carregar arquivos para o repositório de arquivos externo solicitados.",
+       "upload-foreign-cant-load-config": "Falha ao carregar a configuração para carregamentos de arquivos para o repositório de arquivos externo.",
+       "upload-dialog-disabled": "Essa wiki desativou o envio de arquivos através dessa caixa de diálogo.",
        "upload-dialog-title": "Enviar arquivo",
        "upload-dialog-button-cancel": "Cancelar",
+       "upload-dialog-button-back": "Voltar",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Salvar",
        "upload-dialog-button-upload": "Enviar",
        "upload-form-label-infoform-title": "Detalhes",
        "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-name-tooltip": "Um título descritivo e único para o arquivo, que servirá como nome do arquivo. É possível usar linguagem simples com espaços. Não inclua a extensão de arquivo.",
        "upload-form-label-infoform-description": "Descrição",
+       "upload-form-label-infoform-description-tooltip": "Descreva de forma breve todos os elementos de nota sobre a obra.\nPara uma fotografia, mencione as principais coisas que estão fotografadas, a ocasião e o lugar.",
        "upload-form-label-usage-title": "Uso",
        "upload-form-label-usage-filename": "Nome do arquivo",
        "upload-form-label-own-work": "Isto é o meu próprio trabalho",
        "upload-form-label-infoform-categories": "Categorias",
        "upload-form-label-infoform-date": "Data",
+       "upload-form-label-own-work-message-generic-local": "Garanto que estou enviando este arquivo em conformidade com os termos de serviço e as políticas de licenciamento do site {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Se não for possível enviar este arquivo sob as políticas do site {{SITENAME}}, feche essa caixa de diálogo e tente outro método.",
        "upload-form-label-not-own-work-local-generic-local": "Você pode também querer tentar [[Special:Upload|the default upload page]]",
+       "upload-form-label-own-work-message-generic-foreign": "Entendo que estou enviando este arquivo para um repositório compartilhado. Garanto que minha ação está em conformidade com os respectivos termos de serviço e políticas de licenciamento.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Se não for possível enviar este arquivo sob as políticas desse repositório compartilhado, feche essa caixa de diálogo e tente outro método.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Experimente também usar a [[Special:Upload|página de envios]] do site {{SITENAME}}, caso as políticas do mesmo permitam o envio.",
        "backend-fail-stream": "Não foi possível transmitir o arquivo  $1.",
        "backend-fail-backup": "Não foi possível fazer backup do arquivo  $1 .",
        "backend-fail-notexists": "O arquivo $1 não existe.",
        "uploadstash-errclear": "A limpeza dos arquivos falhou.",
        "uploadstash-refresh": "Atualizar a lista de arquivos",
        "uploadstash-thumbnail": "ver miniatura",
+       "uploadstash-exception": " Não foi possível armazenar o upload no cache ($1): \"$2\".",
        "invalid-chunk-offset": "Deslocamento de fragmento inválido",
        "img-auth-accessdenied": "Acesso negado",
        "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Image Authorization].",
        "filehist-filesize": "Tamanho do arquivo",
        "filehist-comment": "Comentário",
        "imagelinks": "Uso do arquivo",
-       "linkstoimage": "{{PLURAL:$1|A página|As $1 páginas}} a seguir tem link para este arquivo:",
+       "linkstoimage": "{{PLURAL:$1|A página a seguir tem|As $1 páginas a seguir têm}} link para este arquivo:",
        "linkstoimage-more": "Mais de $1 {{PLURAL:$1|página|páginas}} tem algum link para este arquivo.\nA lista a seguir mostra apenas {{PLURAL:$1|o primeiro link|os $1 primeiros links}} para este arquivo.\nUma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.",
        "nolinkstoimage": "Nenhuma página contém links para este arquivo.",
        "morelinkstoimage": "Ver [[Special:WhatLinksHere/$1|mais links]] para este arquivo.",
        "filerevert-submit": "Reverter",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' foi revertida para a [$4 versão de $2 - $3].</span>",
        "filerevert-badversion": "Não há uma versão local anterior deste arquivo no período de tempo especificado.",
+       "filerevert-identical": "A versão atual do arquivo é idêntica à versão do selecionado.",
        "filedelete": "Eliminar $1",
        "filedelete-legend": "Eliminar arquivo",
        "filedelete-intro": "Você está prestes a eliminar o arquivo '''[[Media:$1|$1]]''' junto com todo o seu histórico.",
        "statistics-header-hooks": "Outras estatísticas",
        "statistics-articles": "Páginas de conteúdo",
        "statistics-pages": "Páginas",
-       "statistics-pages-desc": "Todas as páginas no wiki, incluindo páginas de discussão, redirecionamentos, etc.",
+       "statistics-pages-desc": "Todas as páginas da wiki, incluindo páginas de discussão, redirecionamentos etc.",
        "statistics-files": "Arquivos carregados",
        "statistics-edits": "Edições de página desde que {{SITENAME}} foi instalado",
        "statistics-edits-average": "Média de edições por página",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Imagens não categorizadas",
        "uncategorizedtemplates": "Predefinições não categorizadas",
+       "uncategorized-categories-exceptionlist": " # Contém uma lista de categorias que não devem ser mencionadas na página Especial:Categorias não categorizadas. Uma por linha, iniciada por \"*\". As linhas iniciadas por qualquer outro carácter (incluindo espaços em branco) são ignoradas. Use \"#\" para comentários.",
        "unusedcategories": "Categorias não utilizadas",
        "unusedimages": "Arquivos não utilizados",
        "wantedcategories": "Categorias pedidas",
        "usercreated": "{{GENDER:$3|criado|criada|criado(a)}} em $1 às $2",
        "newpages": "Páginas novas",
        "newpages-submit": "Exibir",
-       "newpages-username": "Nome de usuário:",
+       "newpages-username": "Nome de usuário(a):",
        "ancientpages": "Páginas mais antigas",
        "move": "Mover",
        "movethispage": "Mover esta página",
        "apihelp": "Ajuda de API",
        "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
        "apisandbox": "Caixa de areia da API",
+       "apisandbox-jsonly": "JavaScript é necessário para usar o sandbox API.",
        "apisandbox-api-disabled": "A API está desabilitada neste site.",
-       "apisandbox-intro": "Use esta página para realizar testes com o '''serviço web de API do MediaWiki'''.\nConsulte a [https://www.mediawiki.org/wiki/API:Main_page a documentação API] para obter mais detalhes de uso da API.  Exemplo: [https://www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo de uma Página principal].  Selecione uma ação para mais exemplos.\n\nNote que, embora esta seja uma área de testes, as ações que executar nesta página podem modificar a wiki.",
+       "apisandbox-intro": "Use esta página para fazer experiências com a <strong>API operacional do MediaWiki</strong>.\nConsulte a [[mw:API:Main page|documentação da API]] para informações sobre o seu uso. Exemplo: [https://www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo da Página Principal]. Selecione uma operação para ver mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-fullscreen": "Expandir painel",
+       "apisandbox-fullscreen-tooltip": "Expanda o painel do sandbox para preencher a janela do navegador.",
        "apisandbox-unfullscreen": "Mostrar página",
+       "apisandbox-unfullscreen-tooltip": "Reduza o painel do sandbox, para que os links de navegação do MediaWiki estejam disponíveis.",
        "apisandbox-submit": "Fazer requisição",
        "apisandbox-reset": "Limpar",
        "apisandbox-retry": "Tentar novamente",
        "apisandbox-loading": "Carregando informação para o módulo API \"$1\"...",
+       "apisandbox-load-error": "Ocorreu um erro ao carregar informações para o módulo API \"$1\": $2",
+       "apisandbox-no-parameters": "Este módulo API não tem parâmetros.",
        "apisandbox-helpurls": "Links de ajuda",
        "apisandbox-examples": "Exemplos",
        "apisandbox-dynamic-parameters": "Parâmetros adicionais",
        "apisandbox-dynamic-parameters-add-label": "Parâmetro adicional",
        "apisandbox-dynamic-parameters-add-placeholder": "Nome do parâmetro",
+       "apisandbox-dynamic-error-exists": "Um parâmetro chamado \"$1\" já existe.",
        "apisandbox-deprecated-parameters": "Parâmetros obsoletos",
+       "apisandbox-fetch-token": "Preencher automaticamente o token",
        "apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos",
+       "apisandbox-submit-invalid-fields-message": "Corrija os campos marcados e tente novamente.",
        "apisandbox-results": "Resultados",
+       "apisandbox-sending-request": "Enviando solicitação de API ...",
+       "apisandbox-loading-results": "Recebendo resultados da API ...",
+       "apisandbox-results-error": "Ocorreu um erro ao carregar a resposta de consulta da API: $1.",
+       "apisandbox-request-selectformat-label": "Mostrar dados do pedido como:",
+       "apisandbox-request-format-url-label": "Sequência de consulta de URL",
        "apisandbox-request-url-label": "URL solicitante:",
+       "apisandbox-request-json-label": "Pedido JSON:",
        "apisandbox-request-time": "Tempo do pedido: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Corrigir token e reenviar",
+       "apisandbox-results-fixtoken-fail": "Falha ao buscar token \"$1\".",
+       "apisandbox-alert-page": "Os campos nesta página não são válidos.",
+       "apisandbox-alert-field": "O valor deste campo não é válido.",
+       "apisandbox-continue": "Continuar",
+       "apisandbox-continue-clear": "Limpar",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] o último pedido; {{int:apisandbox-continue-clear}} limpará os parâmetros relativos à continuação.",
+       "apisandbox-param-limit": "Entre <kbd>max</kbd> para usar o limite máximo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Todos os espaços de nomes)",
+       "apisandbox-multivalue-all-values": "$1 (Todos os valores)",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
        "booksources-text": "É exibida a seguir uma listagem de links para outros sites que vendem livros novos e usados e que possam possuir informações adicionais sobre os livros que você está pesquisando:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique se houve erros ao copiar da fonte original.",
+       "magiclink-tracking-rfc": "Páginas usando links mágicos de RFC",
+       "magiclink-tracking-rfc-desc": "Esta página usa links mágicos RFC. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-pmid": "Páginas que usam links mágicos do PMID",
+       "magiclink-tracking-pmid-desc": "Esta página usa links mágicos PMID. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-isbn": "Páginas usando links mágicos do ISBN",
+       "magiclink-tracking-isbn-desc": "Esta página usa links mágicos ISBN. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
        "specialloguserlabel": "Executor:",
        "speciallogtitlelabel": "Alvo (título da página ou {{ns:user}}:'nomedeusuário' para usuários):",
        "log": "Registros",
        "linksearch-ns": "Espaço nominal:",
        "linksearch-ok": "Pesquisar",
        "linksearch-text": "É possível usar caracteres coringa, como \"*.wikipedia.org\".\nNecessário no mínimo um domínio de nível superior, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: $1 (caso nenhum seja especificado, o protocolo http:// será selecionado automaticamente).",
-       "linksearch-line": "$2 possui links para $1",
+       "linksearch-line": "$1 na página $2",
        "linksearch-error": "\"Caracteres mágicos\" (''wildcards'') só podem ser usados no início do endereço.",
        "listusersfrom": "Mostrar usuários começando em:",
        "listusers-submit": "Exibir",
        "activeusers-intro": "Esta é uma lista de usuários com algum tipo de atividade nos últimos $1 {{PLURAL:$1|dia|dias}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
        "activeusers-from": "Mostrar usuários começando por:",
+       "activeusers-groups": "Exibir usuários pertencentes a grupos:",
+       "activeusers-excludegroups": "Excluir usuários pertencentes a grupos:",
        "activeusers-noresult": "Nenhum usuário encontrado.",
        "activeusers-submit": "Mostrar usuários ativos",
        "listgrouprights": "Privilégios de grupos de usuários",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
        "listgrants": "Atribuições",
-       "listgrants-summary": "Esta é uma lista de atribuições com os respetivos acessos às permissões de usuário. Os usuários podem autorizar aplicações a utilizar suas contas, mas com permissões limitadas baseadas nas atribuições dadas pelos usuários a cada aplicação. No entanto, uma aplicação agindo em nome de um usuário não pode utilizar permissões que o usuário não possui.\nPode haver [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre permissões individuais.",
+       "listgrants-summary": "Esta é uma lista das possíveis concessões de permissões e das respetivas permissões dos usuários que são atribuídas por cada concessão. Os usuários podem autorizar aplicações a utilizar a sua conta, agindo assim em seu nome mas com as permissões limitadas com base nestas concessões. Uma aplicação que age em nome de um usuário não pode utilizar permissões que o utilizador não possui.\nPoderá existir [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre as permissões individuais.",
        "listgrants-grant": "Atribuição",
        "listgrants-rights": "Direitos",
        "trackingcategories": "Categorias de rastreamento",
        "emailsubject": "Assunto:",
        "emailmessage": "Mensagem:",
        "emailsend": "Enviar",
-       "emailccme": "Enviar ao meu e-mail uma cópia de minha mensagem.",
+       "emailccme": "Enviar ao meu e-mail uma cópia de minha mensagem",
        "emailccsubject": "Cópia de sua mensagem para $1: $2",
        "emailsent": "E-mail enviado",
        "emailsenttext": "Sua mensagem foi enviada.",
-       "emailuserfooter": "Este e-mail foi {{GENDER:$1|enviado}} por $1 para {{GENDER:$2|$2}} através do recurso \"{{int:emailuser}}\" do site {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi enviada {{GENDER:$1|pelo usuário|pela usuária}} $1 para {{GENDER:$2|$2}} através da opção “{{int:emailuser}}” do projeto {{SITENAME}}. {{GENDER:$2|A sua}} resposta será enviada diretamente para {{GENDER:$1|o|a}} remetente original, e revelar-lhe-á {{GENDER:$2|o seu}} endereço de e-mail.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "watchnologin": "Não está autenticado",
        "addwatch": "Adicionar às páginas vigiadas",
        "addedwatchtext": "A página \"[[:$1]]\" e sua página de discussão foram adicionadas à sua [[Special:Watchlist|lista de páginas vigiadas]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram adicionadas à sua lista de [[Special:Watchlist|páginas vigiadas]].",
        "addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de páginas vigiadas.",
        "removewatch": "Remover das páginas vigiadas",
        "removedwatchtext": "A página \"[[:$1]]\" e sua página de discussão foram removidas de sua [[Special:Watchlist|lista de páginas vigiadas]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
        "removedwatchtext-short": "A página \"$1\" foi removida de sua lista de páginas vigiadas.",
        "watch": "Vigiar",
        "watchthispage": "Vigiar esta página",
        "notvisiblerev": "Edição eliminada",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
-       "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
+       "wlheader-showupdated": "As páginas modificadas desde a sua última visita são mostradas em <strong>negrito</strong>.",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
        "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-hide": "Ocultar",
        "deletepage": "Eliminar página",
        "confirm": "Confirmar",
        "excontent": "o conteúdo era: '$1'",
-       "excontentauthor": "o conteúdo era: \"$1\",e o único editor era \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|discussão]])",
+       "excontentauthor": "o conteúdo era: \"$1\", e {{GENDER:$2|o único editor|a única editora|o(a) único(a) editor(a)}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: '$1'",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "actioncomplete": "Ação concluída",
        "actionfailed": "Falha na ação",
        "deletedtext": "\"$1\" foi eliminada.\nConsulte $2 para um registro de eliminações recentes.",
-       "dellogpage": "Registro de eliminação",
+       "dellogpage": "Registro de eliminações",
        "dellogpagetext": "Abaixo uma lista das eliminações mais recentes.",
        "deletionlog": "registro de eliminações",
        "reverted": "Revertido para versão anterior",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "rollbacklinkcount-morethan": "reverter mais de $1 {{PLURAL:$1|edição|edições}}",
        "rollbackfailed": "A reversão falhou",
+       "rollback-missingparam": "Falta de parâmetros necessários a pedido.",
+       "rollback-missingrevision": "Não foi possível carregar os dados de revisão.",
        "cantrollback": "Não foi possível reverter a edição; o último contribuidor é o único autor desta página",
        "alreadyrolled": "Não foi possível reverter a última edição de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguém já editou ou reverteu a página.\n\nA última edição da página foi feita por [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O sumário de edição era: <em>$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]",
        "revertpage-nouser": "Revertidas as edições de um usuário oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
+       "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detetados problemas com a sua sessão;\nEsta ação foi cancelada como medida de proteção contra a intercepção de sessões.\nExperimente usar o botão \"Voltar\" e atualizar a página de onde veio e tente novamente.",
        "changecontentmodel": "Alterar o modelo de conteúdo de uma página",
        "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-model-label": "Modelo de conteúdo novo",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-submit": "Mudar",
        "changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
        "changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
+       "changecontentmodel-cannot-convert": "O conteúdo em [[:$1]] não pode ser convertido para um tipo de $2.",
+       "changecontentmodel-nodirectediting": "O modelo de conteúdo $1 não suporta edição direta",
+       "changecontentmodel-emptymodels-title": "Não há modelos de conteúdo disponíveis",
+       "changecontentmodel-emptymodels-text": "O conteúdo da [[:$1]] não pode ser convertido para nenhum tipo.",
        "log-name-contentmodel": "Log de alterações do modelo de conteúdo",
+       "log-description-contentmodel": "Esta página lista alterações ao modelo de conteúdo de páginas e páginas que foram criadas com um modelo de conteúdo diferente do padrão.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|criado}} a página $3 usando um modelo de conteúdo não-padrão \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|alterou}} o modelo de conteúdo da página $3 de \"$4\" para \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "logentry-contentmodel-change-revert": "reverter",
-       "protectlogpage": "Registro de proteção",
+       "protectlogpage": "Registro de proteções",
        "protectlogtext": "Encontra-se abaixo o registro de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "modifiedarticleprotection": "alterou o nível de proteção para \"[[$1]]\"",
        "unprotectedarticle": "removeu a proteção de \"[[$1]]\"",
        "movedarticleprotection": "moveu as configurações de proteção de \"[[$2]]\" para \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protegido}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Alterou o nível de proteção}} de \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removeu a proteção}} de \"[[$1]]\"",
        "protect-title": "Protegendo \"$1\"",
        "protect-title-notallowed": "Ver o nível de proteção de \"$1\"",
        "prot_1movedto2": "[[$1]] foi movido para [[$2]]",
        "undeletehistorynoadmin": "Esta página foi eliminada. O motivo de eliminação é apresentado no súmario abaixo, junto dos detalhes do usuário que editou esta página antes de eliminar. O texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "undelete-revision": "Edição eliminada da página $1 (das $5 de $4), por $3:",
        "undeleterevision-missing": "Edição inválida ou não encontrada. Talvez você esteja com um link incorreto ou talvez a edição foi restaurada ou removida dos arquivos.",
+       "undeleterevision-duplicate-revid": "Não foi possível restaurar {{PLURAL:$1|uma revisão|$1 revisões}}, porque {{PLURAL:$1|a sua <code>rev_id</code> já estava usada|as respetivas <code>rev_id</code> já estavam usadas}}.",
        "undelete-nodiff": "Não foram encontradas edições anteriores.",
        "undeletebtn": "Restaurar",
        "undeletelink": "ver/restaurar",
        "undeletedrevisions": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}}",
        "undeletedrevisions-files": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}",
        "undeletedfiles": "{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}",
-       "cannotundelete": "Falha ao restaurar:\n$1",
+       "cannotundelete": "Algumas ou todas as restaurações falharam:\n$1",
        "undeletedpage": "'''$1 foi restaurada'''\n\nConsulte o [[Special:Log/delete|registro de eliminações]] para um registro das eliminações e restaurações mais recentes.",
        "undelete-header": "Veja o [[Special:Log/delete|registro de deleções]] para as páginas recentemente eliminadas.",
        "undelete-search-title": "Pesquisar páginas eliminadas",
        "sp-contributions-newbies-sub": "Para contas novas",
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "sp-contributions-blocklog": "registro de bloqueios",
-       "sp-contributions-suppresslog": "Contribuições de usuário suprimidas",
-       "sp-contributions-deleted": "contribuições eliminadas",
+       "sp-contributions-suppresslog": "Contribuições de {{GENDER:$1|usuário}} suprimidas",
+       "sp-contributions-deleted": "contribuições eliminadas do {{GENDER:$1|usuário}}",
        "sp-contributions-uploads": "envios",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "disc",
        "sp-contributions-username": "Endereço de IP ou usuário(a):",
        "sp-contributions-toponly": "Mostrar somente as edições que sejam a última alteração",
        "sp-contributions-newonly": "Mostrar somente as criações de páginas",
+       "sp-contributions-hideminor": "Ocultar edições menores",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas que têm links para \"$1\"",
        "unblock": "Desbloquear usuário",
        "blockip": "Bloquear {{GENDER:$1|usuário|usuária|usuário(a)}}",
        "blockip-legend": "Bloquear usuário(a)",
-       "blockiptext": "Utilize o formulário abaixo para bloquear o acesso à escrita de um endereço específico de IP ou nome de usuário(a).\nIsto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Preencha com um motivo específico a seguir (por exemplo, citando páginas que sofreram vandalismo).",
+       "blockiptext": "Utilize o formulário abaixo para bloquear o acesso à escrita de um endereço específico de IP ou nome de usuário(a).\nIsto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Preencha com um motivo específico a seguir (por exemplo, citando páginas que sofreram vandalismo).\nVocê pode bloquear os intervalos de endereços IP com a sintaxe [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] A maior faixa permitida é de $1 para IPv4 $2 para IPv6.",
        "ipaddressorusername": "Endereço de IP ou nome de usuário(a):",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "ipb-unblock": "Desbloquear um usuário ou endereço de IP",
        "ipb-blocklist": "Ver bloqueios em vigência",
        "ipb-blocklist-contribs": "Contribuições de $1",
+       "ipb-blocklist-duration-left": "$1 restantes",
        "unblockip": "Desbloquear usuário",
        "unblockiptext": "Utilize o formulário a seguir para restaurar o acesso à escrita para um endereço de IP ou usuário previamente bloqueado.",
        "ipusubmit": "Remover este bloqueio",
        "block-log-flags-hiddenname": "nome de usuário oculto",
        "range_block_disabled": "A funcionalidade de bloquear gamas de IPs encontra-se desativada.",
        "ipb_expiry_invalid": "Tempo de expiração inválido.",
+       "ipb_expiry_old": "O tempo de expiração está no passado.",
        "ipb_expiry_temp": "Bloqueios com nome de usuário ocultado devem ser permanentes.",
        "ipb_hide_invalid": "Não foi possível suprimir esta conta; ela tem mais de {{PLURAL:$1|uma}}edições.",
        "ipb_already_blocked": "\"$1\" já se encontra bloqueado",
        "proxyblockreason": "O seu endereço de IP foi bloqueado por ser um proxy público. Por favor contacte o seu fornecedor do serviço de Internet ou o apoio técnico e informe-os deste problema de segurança grave.",
        "sorbsreason": "O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.",
        "sorbs_create_account_reason": "O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta",
+       "softblockrangesreason": "Contribuições anônimas não são permitidas do seu endereço  IP $1 Por favor, faça login.",
        "xffblockreason": "Um endereço IP presente no cabeçalho X-Forwarded-For, seu ou do servidor proxy que está usando, foi bloqueado. O motivo original do bloqueio foi: $1",
        "cant-see-hidden-user": "O usuário que você está tentando bloquear já está bloqueado ou oculto. Como você não possui privilégio de ocultar usuários, você não pode ver ou editar o bloqueio desse usuário.",
        "ipbblocked": "Não é possível que você bloqueie ou desbloqueie outros usuários, já que você se encontra bloqueado",
        "lockdbsuccesstext": "A base de dados da {{SITENAME}} foi bloqueada.\n<br />Lembre-se de remover o bloqueio após a manutenção.",
        "unlockdbsuccesstext": "O banco de dados foi desbloqueado.",
        "lockfilenotwritable": "O arquivo de bloqueio da base de dados não pode ser escrito. Para bloquear ou desbloquear a base de dados, este precisa de poder ser escrito pelo servidor Web.",
+       "databaselocked": "O banco de dados já está bloqueado.",
        "databasenotlocked": "A base de dados não encontra-se bloqueada.",
        "lockedbyandtime": "(por $1 em $2 às $3)",
        "move-page": "Mover $1",
        "move-page-legend": "Mover página",
-       "movepagetext": "Utilizando o formulário a seguir você poderá renomear uma página, movendo todo o histórico para o novo título.\nO título anterior será transformado em um redirecionamento para o novo.\nVocê poderá optar em atualizar automaticamente os redirecionamentos que se destinem ao título original.\nCaso escolha pela não-atualização, se certifique de verificar por redirecionamentos [[Special:DoubleRedirects|duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ de sua responsabilidade que os links continuem direcionando para onde eles devem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a não ser que ele seja um redirecionamento e não tenha histórico de edições.\nIsto significa que você pode renomear uma página de volta para o seu nome anterior se cometer algum engano e que não poderá sobrescrever uma página existente.\n\n'''CUIDADO!'''\nEsta pode ser uma mudança drástica e inesperada para uma página popular;\ntenha certeza de que compreende as consequências da mudança antes de prosseguir.",
-       "movepagetext-noredirectfixer": "Usando o formulário abaixo, você irá alterar o nome de uma página e moverá todo o histórico desta para o nome novo.\nA página antiga será transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ sua responsabilidade certificar-se de que os links continuam a apontar para onde eles deveriam apontar.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto significa que, se você cometer um engano, poderá alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
+       "movepagetext": "Utilizando o formulário a seguir você poderá renomear uma página, movendo todo o histórico para o novo título.\nO título anterior será transformado em um redirecionamento para o novo.\nVocê poderá optar em atualizar automaticamente os redirecionamentos que se destinem ao título original.\nCaso escolha pela não-atualização, se certifique de verificar por redirecionamentos [[Special:DoubleRedirects|duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ de sua responsabilidade que os links continuem direcionando para onde eles devem.\n\nNote que a página <strong>não</strong> será movida se já existir uma página com o novo título, a não ser que ele seja um redirecionamento e não tenha histórico de edições.\nIsto significa que você pode renomear uma página de volta para o seu nome anterior se cometer algum engano e que não poderá sobrescrever uma página existente.\n\n<strong>Nota:</strong>\nEsta pode ser uma mudança drástica e inesperada para uma página popular;\ntenha certeza de que compreende as consequências da mudança antes de prosseguir.",
+       "movepagetext-noredirectfixer": "Usando o formulário abaixo, você irá alterar o nome de uma página e moverá todo o histórico desta para o nome novo.\nA página antiga será transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ sua responsabilidade certificar-se de que os links continuam a apontar para onde eles deveriam apontar.\n\nNote que a página <strong>não</strong> será movida se já existir uma página com o nome novo, a menos que esta página esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto significa que, se você cometer um engano, poderá alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n<strong>Nota:</strong>\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
        "movepagetalktext": "Caso marcar esta caixa, a página de discussão associada será automaticamente movida para um novo título, a menos que uma página de discussão com conteúdo já existir lá.\n\n\nNeste caso, você deverá mover ou mesclar a página manualmente se desejar.",
        "moveuserpage-warning": "'''Aviso:''' Você irá mover uma página de usuário. Note que apenas a página será movida, ''sem'' alterar o nome do usuário.",
        "movecategorypage-warning": "<strong>Aviso:</strong> Você está prestes a mover uma página de categoria. Por favor, note que apenas a página será transferida e quaisquer páginas da categoria antiga <em>não</em> serão recategorizadas para o novo.",
        "cant-move-to-user-page": "Você não tem permissão para mover uma página para uma página de usuários (exceto para uma subpágina de usuário).",
        "cant-move-category-page": "Você não possui permissão para mover páginas de categorias.",
        "cant-move-to-category-page": "Você não tem permissão para mover uma página para uma categoria de páginas.",
+       "cant-move-subpages": "Você não tem permissão para mover subpáginas.",
+       "namespace-nosubpages": "O espaço nominal \"$1\" não permite subpáginas.",
        "newtitle": "Novo título:",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "movepage-page-moved": "A página $1 foi movida para $2",
        "movepage-page-unmoved": "A página $1 não pôde ser movida para $2.",
        "movepage-max-pages": "O limite de $1 {{PLURAL:$1|página movida|páginas movidas}} foi atingido; não será possível mover mais páginas de forma automática.",
-       "movelogpage": "Registro de movimento",
+       "movelogpage": "Registro de movimentos",
        "movelogpagetext": "Abaixo encontra-se uma lista de páginas movidas.",
        "movesubpage": "{{PLURAL:$1|Subpágina|Subpáginas}}",
        "movesubpagetext": "Esta página tem $1 {{PLURAL:$1|subpágina mostrada|subpáginas mostradas}} abaixo.",
+       "movesubpagetalktext": "A página de discussão correspondente tem $1 {{PLURAL:$1|subpágina|subpáginas}}, mostradas abaixo.",
        "movenosubpage": "Esta página não tem subpáginas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
-       "delete_and_move_text": "==Eliminação necessária==\nA página de destino (\"[[:$1]]\") já existe. Deseja eliminá-la de modo a poder mover?",
+       "delete_and_move_text": "A página de destino \"[[:$1]]\" já existe. Deseja excluí-lo para abrir caminho para o movimento?",
        "delete_and_move_confirm": "Sim, eliminar a página",
        "delete_and_move_reason": "Eliminada para mover \"[[$1]]\"",
        "selfmove": "O título fonte e o título destinatário são os mesmos; não é possível mover uma página para ela mesma.",
        "move-leave-redirect": "Criar um redirecionamento",
        "protectedpagemovewarning": "'''Atenção:''' Esta página foi protegida de modo que apenas usuários com privilégio de administrador possam movê-la.\nA última entrada no histórico é fornecida abaixo para referência:",
        "semiprotectedpagemovewarning": "''Nota:''' Esta página foi protegida de modo que apenas usuários registrados possam movê-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "move-over-sharedrepo": "=== Arquivo existente ===\n[[:$1]] existe em um repositório compartilhado. Mover um arquivo para este título irá sobrescrever o arquivo compartilhado.",
+       "move-over-sharedrepo": "[[:$1]] existe em um repositório compartilhado. Mover um arquivo para este título irá sobrescrever o arquivo compartilhado.",
        "file-exists-sharedrepo": "O nome de arquivo escolhido já está em uso em um repositório compartilhado.\nPor favor, escolha outro nome.",
        "export": "Exportar páginas",
        "exporttext": "Você pode exportar o texto e o histórico de edições, ou de uma página em particular ou de um conjunto de páginas, para um arquivo XML.\nA partir disso, será possível importar esse conteúdo em outro wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].\n\nPara exportar páginas, insira os títulos na caixa de texto abaixo, um título por linha; selecione entre a edição atual acompanhada das edições anteriores e respectivo histórico de edições ou entre apenas a última edição e suas respectivas informações.\n\nPara o último caso, é possível obter o XML a partir de um link direto (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a edição mais recente da página \"[[{{MediaWiki:Mainpage}}]]\").",
        "import-nonewrevisions": "Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).",
        "xml-error-string": "$1 na linha $2, coluna $3 (byte $4): $5",
        "import-upload": "Enviar dados em XML",
-       "import-token-mismatch": "Perda dos dados da sessão. Por favor tente novamente.",
+       "import-token-mismatch": "Perda de dados da sessão.\n\nVocê pode ter sido desconectado. <strong>Verifique se você ainda está conectado e tente novamente</strong>.\nSe ainda não funcionar, tente [[Special:UserLogout|sair]] e efetuando login novamente e verifique se seu navegador permite cookies neste site.",
        "import-invalid-interwiki": "Não é possível importar do wiki especificado.",
        "import-error-edit": "A página \"$1\" não foi importada porque você não tem permissão para editá-la.",
        "import-error-create": "A página \"$1\" não foi importada porque você não tem permissão para criá-la.",
        "tooltip-feed-rss": "Feed RSS desta página",
        "tooltip-feed-atom": "Feed Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições {{GENDER:$1|deste usuário|desta usuária|deste(a) usuário(a)}}",
-       "tooltip-t-emailuser": "Enviar um e-mail a {{GENDER:{{BASEPAGENAME}}|este usuário|esta usuária|este(a) usuário(a)}}",
+       "tooltip-t-emailuser": "Enviar um e-mail a {{GENDER:$1|este usuário|esta usuária|este(a) usuário(a)}}",
        "tooltip-t-info": "Mais informações sobre esta página",
        "tooltip-t-upload": "Enviar arquivos",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-ca-nstab-category": "Ver a página descritiva da categoria",
        "tooltip-minoredit": "Marcar esta alteração como uma edição menor",
        "tooltip-save": "Salva as suas alterações",
+       "tooltip-publish": "Publicar suas alterações",
        "tooltip-preview": "Prevê as alterações feitas por você. Antes de salvar, use para ver se está tudo como esperado!",
        "tooltip-diff": "Visualizar as alterações que você fez no texto",
        "tooltip-compareselectedversions": "Ver o que há de diferente entre as duas versões selecionadas desta página.",
        "lastmodifiedatby": "Esta página foi modificada pela última vez à(s) $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "others": "outros",
-       "siteusers": "{{PLURAL:$2|um usuário|$2 usuários}} da {{SITENAME}} ($1)",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|um usuário}}|$2 usuários}} da {{SITENAME}} ($1)",
        "anonusers": "{{PLURAL:$2|usuário anônimo|usuários anônimos}} da {{SITENAME}} ($1)",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informações disponíveis sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "O texto que deseja salvar foi bloqueado pelo filtro de spam.\nIsso é provavelmente causado por um link para um site externo que está na lista negra.",
+       "spamprotectiontext": "O texto que desejava salvar foi bloqueado pelo filtro de ''spam''.\nProvavelmente isso foi causado por um link para um site externo que está na lista negra.",
        "spamprotectionmatch": "O seguinte texto ativou o filtro de spam: $1",
        "spambot_username": "MediaWiki limpeza de spam",
        "spam_reverting": "Revertendo para a última versão que não contém links para $1",
        "pageinfo-length": "Tamanho da página (em bytes)",
        "pageinfo-article-id": "ID da página",
        "pageinfo-language": "Idioma do conteúdo da página",
+       "pageinfo-language-change": "alterar",
        "pageinfo-content-model": "Modelo de conteúdo de página",
+       "pageinfo-content-model-change": "alterar",
        "pageinfo-robot-policy": "Indexado por robôs",
        "pageinfo-robot-index": "Autorizado",
        "pageinfo-robot-noindex": "Desautorizado",
        "pageinfo-watchers": "Número de vigilantes da página",
        "pageinfo-visiting-watchers": "Número de vigilantes que consultaram as edições recentes da página",
        "pageinfo-few-watchers": "Menos de  $1  {{PLURAL:$1|vigilante|vigilantes}}",
+       "pageinfo-few-visiting-watchers": "Pode haver ou não ser um usuário assistindo visitando edições recentes",
        "pageinfo-redirects-name": "Número de redirecionamentos para esta página",
        "pageinfo-subpages-name": "Subpáginas desta página",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não redirecionamento|não redirecionamentos}})",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorias",
        "pageinfo-category-files": "Número de arquivos",
+       "pageinfo-user-id": "ID de usuário",
        "markaspatrolleddiff": "Marcar como patrulhada",
        "markaspatrolledtext": "Marcar esta página como patrulhada",
        "markaspatrolledtext-file": "Marcar esta versão de artigo como patrulhada",
        "patrol-log-header": "Este é um registro de edições patrulhadas.",
        "log-show-hide-patrol": "$1 registro de edições patrulhadas",
        "log-show-hide-tag": "$1 etiqueta de log",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Marque a revisão $3 de $2 como patrulhado?",
        "deletedrevision": "Apagou a versão antiga $1",
        "filedeleteerror-short": "Erro ao eliminar arquivo: $1",
        "filedeleteerror-long": "Foram encontrados erros ao tentar eliminar o arquivo:\n\n$1",
        "svg-long-error": "Arquivo SVG inválido: $1",
        "show-big-image": "Arquivo original",
        "show-big-image-preview": "Tamanho desta previsualização: $1.",
+       "show-big-image-preview-differ": "Tamanho desta visualização de $3 deste arquivo de $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "cíclico",
        "newimages-showbots": "Mostrar uploads realizados por robôs",
        "newimages-hidepatrolled": "Ocultar os carregamentos patrulhados.",
        "noimages": "Nada para ver.",
+       "gallery-slideshow-toggle": "Alternar miniaturas",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar novos arquivos a partir das $2 de $1",
+       "seconds-abbrev": "$1&nbsp;s",
+       "minutes-abbrev": "$1&nbsp;min",
+       "hours-abbrev": "$1&nbsp;h",
        "seconds": "{{PLURAL:$1|um segundo|$1 segundos}}",
        "minutes": "{{PLURAL:$1|um minuto|$1 minutos}}",
        "hours": "{{PLURAL:$1|uma hora|$1 horas}}",
        "confirmemail_body_set": "Alguém, provavelmente você, com o endereço de IP $1,\ndefiniu o endereço de e-mail da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de email em {{SITENAME}},\nabra o seguinte link no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, siga o seguinte link\npara cancelar a confirmação do endereço de e-mail:\n\n$5\n\nEste código de confirmação irá expirar em $4.",
        "confirmemail_invalidated": "Confirmação de endereço de e-mail cancelada",
        "invalidateemail": "Cancelar confirmação de e-mail",
+       "notificationemail_subject_changed": "O endereço de e-mail registrado {{SITENAME}} foi alterado",
+       "notificationemail_subject_removed": "O endereço de e-mail registrado {{SITENAME}} foi removido",
+       "notificationemail_body_changed": "Alguém, provavelmente você, do endereço IP $1,\nalterou o endereço de e-mail da conta \"$2\" para \"$3\" em {{SITENAME}}.\n\nSe este não foi você, entre em contato com um administrador do site imediatamente.",
+       "notificationemail_body_removed": "Alguém, provavelmente você, a partir do endereço IP $1, eliminou o e-mail da conta \"$2\" na wiki {{SITENAME}}.\n\nSe este não foi você, entre em contato com um administrador do site imediatamente.",
        "scarytranscludedisabled": "[A transclusão de páginas de outros wikis encontra-se desabilitada]",
        "scarytranscludefailed": "[Não foi possível obter a predefinição a partir de $1]",
        "scarytranscludefailed-httpstatus": "[Não foi possível obter a predefinição a partir de $1: erro HTTP $2]",
        "scarytranscludetoolong": "[URL longa demais]",
        "deletedwhileediting": "'''Aviso''': Esta página foi eliminada após você ter começado a editar!",
        "confirmrecreate": "O usuário [[User:$1|$1]] ([[User talk:$1|Discussão]]) eliminou esta página após você ter começado a editar, pelo seguinte motivo:\n: ''$2''\nPor favor, confirme que realmente deseja recriar esta página.",
-       "confirmrecreate-noreason": "O usuário [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de você ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
+       "confirmrecreate-noreason": "{{GENDER:$1|O usuário|A usuário|O(a) usuário(a)}} [[User:$1|$1]] ([[User talk:$1|discussão]]) {{GENDER:$1|eliminou}} esta página depois de ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
        "recreate": "Recriar",
+       "unit-pixel": "&nbsp;px",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Limpar a memória cache desta página?",
        "confirm-purge-bottom": "Purgar uma página limpa o ''cache'' e força a sua versão mais recente a aparecer.",
        "confirm-watch-top": "Adicionar esta página às suas páginas vigiadas?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remover esta página das páginas vigiadas?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Reverter edições nesta página?",
        "quotation-marks": "$1",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "próxima página →",
        "watchlistedit-raw-done": "Sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionado um título|Foram adicionados $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
-       "watchlistedit-clear-title": "Lista de páginas vigiadas limpa",
+       "watchlistedit-clear-title": "Lista de páginas vigiadas",
        "watchlistedit-clear-legend": "Limpar a lista de páginas vigiadas",
        "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas",
        "watchlistedit-clear-titles": "Títulos:",
        "version-libraries-description": "Descrição",
        "version-libraries-authors": "Autores",
        "redirect": "Redirecionar por arquivo, usuário, página, revisão ou registro de identificação.",
-       "redirect-summary": "Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão ou ID da página) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão ou ID da página) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ou [[{{#Special:Redirect}}/user/101]] ou  [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Ir",
        "redirect-lookup": "Buscar",
        "redirect-value": "Valor:",
        "redirect-page": "ID da página",
        "redirect-revision": "Revisão da página",
        "redirect-file": "Nome do arquivo",
+       "redirect-logid": "ID de log",
        "redirect-not-exists": "Valor não encontrado",
        "fileduplicatesearch": "Procurar por arquivos duplicados",
        "fileduplicatesearch-summary": "Procure por arquivos duplicados tendo por base seu valor \"hash\".",
        "tag-filter": "Filtrar [[Special:Tags|etiquetas]]:",
        "tag-filter-submit": "Filtrar",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)",
+       "tag-mw-contentmodelchange": "Mudança de modelo de conteúdo",
+       "tag-mw-contentmodelchange-description": "Edições que [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel alteram o modelo de conteúdo] de uma página",
        "tags-title": "Etiquetas",
        "tags-intro": "Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.",
        "tags-tag": "Nome da etiqueta",
        "tags-actions-header": "Ações",
        "tags-active-yes": "Sim",
        "tags-active-no": "Não",
-       "tags-source-extension": "Definida por uma extensão",
+       "tags-source-extension": "Definida por um software",
        "tags-source-manual": "Aplicado manualmente pelos usuários e pelos robôs",
        "tags-source-none": "Não mais em uso",
        "tags-edit": "editar",
        "tags-deactivate": "Desativar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificação|modificações}}",
        "tags-manage-no-permission": "Você não possui permissão para gerenciar alterações de etiquetas",
-       "tags-manage-blocked": "Você não pode fazer mudanças nas etiquetas enquanto bloqueado.",
+       "tags-manage-blocked": "Você não pode fazer mudanças nas etiquetas enquanto {{GENDER:$1|você}} bloqueado.",
        "tags-create-heading": "Criar uma nova etiqueta",
        "tags-create-explanation": "Por padrão, etiquetas recém-criadas serão disponibilizadas para usuários e robôs",
        "tags-create-tag-name": "Nome de etiqueta",
        "tags-delete-not-allowed": "Etiquetas definidas por uma extensão não podem ser apagadas a menos que a extensão especificamente o permita.",
        "tags-delete-not-found": "A etiqueta \"$1\" não existe.",
        "tags-delete-too-many-uses": "A etiqueta \"$1\" é aplicada em mais que $2 {{PLURAL:$2|edição|edições}}, o que significa que não pode ser apagada.",
-       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" foi apagada com sucesso, mas {{PLURAL:$2|o seguinte aviso foi encontrado|os seguintes avisos foram encontrados}}:",
+       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" foi apagada, mas {{PLURAL:$2|o seguinte aviso foi encontrado|os seguintes avisos foram encontrados}}:",
+       "tags-delete-no-permission": "Você não tem permissão para excluir as etiquetas de alteração.",
        "tags-activate-title": "Ativar etiqueta",
        "tags-activate-question": "Você está prestes a ativar a etiqueta \"$1\".",
        "tags-activate-reason": "Motivo:",
        "tags-deactivate-not-allowed": "Não é possível desativar a etiqueta \"$1\".",
        "tags-deactivate-submit": "Desativar",
        "tags-apply-no-permission": "Você não tem permissão para aplicar mudanças de etiquetas, juntamente com suas alterações.",
-       "tags-apply-blocked": "Você não pode aplicar as mudanças nas etiquetas enquanto está bloqueado.",
+       "tags-apply-blocked": "Você não pode aplicar as mudanças nas etiquetas enquanto {{GENDER:$1|você}} está bloqueado.",
        "tags-apply-not-allowed-one": "A etiqueta \"$1\" não pode ser aplicada manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser aplicada|As seguintes etiquetas não podem ser aplicadas}} manualmente: $1",
        "tags-update-no-permission": "Você não tem permissão para adicionar ou remover mudanças de etiquetas de revisões individuais ou entradas de registro.",
-       "tags-update-blocked": "Você não pode adicionar ou remover mudanças nas etiquetas enquanto bloqueado.",
+       "tags-update-blocked": "Você não pode adicionar ou remover mudanças nas etiquetas enquanto {{GENDER:$1|você}} bloqueado.",
        "tags-update-add-not-allowed-one": "A etiqueta \"$1\" não pode ser adicionada manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser adicionada|As seguintes etiquetas não podem ser adicionadas}} manualmente: $1",
        "tags-update-remove-not-allowed-one": "A remoção da etiqueta \"$1\" não é permitida.",
        "htmlform-cloner-create": "Adicionar mais",
        "htmlform-cloner-delete": "Remover",
        "htmlform-cloner-required": "Pelo menos um valor é requerido",
+       "htmlform-date-placeholder": "AAAA-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "O valor que você especificou não é uma data reconhecida. Tente usar o formato AAAA-MM-DD.",
+       "htmlform-time-invalid": "O valor especificado não é um tempo reconhecido. Tente usar o formato HH:MM:SS.",
+       "htmlform-datetime-invalid": "O valor especificado não é uma data e hora reconhecidas. Tente usar o formato AAAA-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "O valor especificado é anterior à data mais antiga permitida de $1.",
+       "htmlform-date-toohigh": "O valor especificado é posterior à data mais recente permitida de $1.",
+       "htmlform-time-toolow": "O valor que você especificou está antes do tempo permitido mais antigo de $1.",
+       "htmlform-time-toohigh": "O valor especificado é posterior à horário  mais recente permitida de $1.",
+       "htmlform-datetime-toolow": "O valor que você especificou está antes da data e hora de $1.",
+       "htmlform-datetime-toohigh": "O valor especificado é posterior à data e hora máxima permitida, $1.",
+       "htmlform-title-badnamespace": "[[:$1]] não se encontra no domínio \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" não é um título que possa ser atribuído a uma página",
        "htmlform-title-not-exists": "$1 não existe.",
        "htmlform-user-not-exists": "<strong>$1</strong> não existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> não é um nome de usuário válido.",
        "logentry-delete-delete": "$1 apagou a página $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|eliminou}} o redirecionamento $3, sobrescrevendo-o",
        "logentry-delete-restore": "$1 restaurou a página $3",
        "logentry-delete-event": "$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|alterou}} a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} na página $3: $4",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|modificou}} configurações de bloqueio de {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importado}} $3 por envio de arquivo",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importou}} $3 por carregamento de arquivo($4 {{PLURAL:$4|revisão|revisões}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importado}} $3 de outra wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importou}} $3 de $5 ($4 {{PLURAL:$4|revisão|revisões}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|fundiu}} $3 com $4 (edições até $5)",
-       "logentry-move-move": "$1 moveu a página $3 para $4",
-       "logentry-move-move-noredirect": "$1 moveu a página $3 para $4 sem deixar um redirecionamento",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} a página $3 para seu redirecionamento $4",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para seu redirecionamento $4 suprimindo o primeiro",
+       "logentry-move-move": "$1 moveu $3 para $4",
+       "logentry-move-move-noredirect": "$1 moveu $3 para $4 sem deixar um redirecionamento",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} $3 para seu redirecionamento $4",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} $3 para seu redirecionamento $4 suprimindo o primeiro",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada",
        "logentry-newusers-newusers": "A conta de usuário $1 foi {{GENDER:$2|criada}}",
        "logentry-newusers-create2": "A conta de usuário $3 foi criada por $1",
        "logentry-newusers-byemail": "A conta de usuário $3 foi criada por $1, com a senha sendo enviada por e-mail",
        "logentry-newusers-autocreate": "A conta de usuário $1 foi criada automaticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|moveu}} as preferências de proteção de $4 para $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|removeu}} a proteção de $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|protegeu}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeu}} $3 $4 [em cascata]",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|atualizou}} etiquetas em revisão $4 da página $3 ({{PLURAL:$7|adicionou}} $6; {{PLURAL:$9|removeu}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|atualizou}} etiquetas na entrada de registro $5 da página $3 ({{PLURAL:$7|adicionou}} $6; {{PLURAL:$9|removeu}} $8)",
        "rightsnone": "(nenhum)",
-       "revdelete-summary": "sumário de edição",
+       "revdelete-summary": "resumo da edição",
+       "rightslogentry-temporary-group": "$1 (temporário, até $2)",
        "feedback-adding": "Adicionando os comentários na página...",
        "feedback-back": "Voltar",
        "feedback-bugcheck": "Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].",
        "feedback-thanks": "Obrigado! O seu comentário foi adicionado à página \"[$2 $1]\".",
        "feedback-thanks-title": "Obrigado!",
        "feedback-useragent": "Agente de usuário:",
-       "searchsuggest-search": "Pesquisa",
+       "searchsuggest-search": "Pesquisar em {{SITENAME}}",
        "searchsuggest-containing": "páginas contendo…",
-       "api-error-badaccess-groups": "Você não tem permissão para enviar arquivos para este wiki.",
        "api-error-badtoken": "Erro interno: token inválido.",
-       "api-error-copyuploaddisabled": "O upload por URL está desativado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|há outro arquivo|existem outros arquivos}} no site com o mesmo conteúdo",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|existiu outro arquivo|existiram outros arquivos}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.",
-       "api-error-empty-file": "O arquivo que você enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
-       "api-error-fetchfileerror": "Erro interno: ocorreu um problema indeterminado ao acessar o arquivo.",
-       "api-error-fileexists-forbidden": "Já existe um arquivo com o nome \"$1\". Não é possível substituí-lo.",
-       "api-error-fileexists-shared-forbidden": "Já existe, no repositório de arquivos partilhados, um arquivo com o nome \"$1\". Não é possível substituí-lo.",
-       "api-error-file-too-large": "O arquivo que você enviou é muito grande.",
-       "api-error-filename-tooshort": "O nome do arquivo é curto demais.",
-       "api-error-filetype-banned": "Este tipo do arquivo é proibido.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|não é um tipo de arquivo permitido|não são tipos de arquivos permitidos}}. {{PLURAL:$3|O tipo de arquivo permitido é|Os tipos de arquivos permitidos são}} $2.",
-       "api-error-filetype-missing": "Falta a extensão de arquivo.",
-       "api-error-hookaborted": "A modificação que você tentou realizar foi abortada pelo hook de uma extensão.",
-       "api-error-http": "Erro interno: não foi possível conectar ao servidor.",
-       "api-error-illegal-filename": "O nome do arquivo não é permitido.",
-       "api-error-internal-error": "Erro interno: ocorreu algum erro ao processar o arquivo que você enviou ao wiki.",
-       "api-error-invalid-file-key": "Erro interno: o arquivo não foi encontrado no armazenamento temporário.",
-       "api-error-missingparam": "Erro interno: parâmetros em falta no pedido.",
-       "api-error-missingresult": "Erro interno: não foi possível determinar se a cópia foi feita.",
-       "api-error-mustbeloggedin": "Você precisa estar autenticado para enviar arquivos.",
-       "api-error-mustbeposted": "Erro interno: a solicitação requer HTTP POST",
-       "api-error-noimageinfo": "O upload foi concluído, mas o servidor não retornou informações sobre o arquivo.",
-       "api-error-nomodule": "Erro interno: o módulo de upload não está configurado.",
-       "api-error-ok-but-empty": "Erro interno: não há resposta do servidor.",
-       "api-error-overwrite": "Não é permitido sobrescrever um arquivo já existente.",
-       "api-error-stashfailed": "Erro interno: o servidor não conseguiu armazenar o arquivo temporário.",
        "api-error-publishfailed": "Erro interno: O servidor falhou ao publicar o arquivo temporário.",
-       "api-error-stasherror": "Houve um erro durante o upload do arquivo para a pilha.",
-       "api-error-stashedfilenotfound": "O arquivo escondido não foi encontrado ao tentar enviá-lo de seu esconderijo.",
-       "api-error-stashpathinvalid": "O caminho no qual o arquivo escondido deveria ter sido encontrado era inválido.",
-       "api-error-stashfilestorage": "Ocorreu um erro ao armazenar o arquivo em seu esconderijo.",
-       "api-error-stashzerolength": "O servidor não pôde esconder o arquivo, porque ele tinha zero de tamanho.",
-       "api-error-stashnotloggedin": "Você precisa estar logado para salvar arquivos no esconderijo.",
-       "api-error-stashwrongowner": "O arquivo que você estava tentando acessar no esconderijo não pertence a você.",
-       "api-error-stashnosuchfilekey": "O arquivo chave que você estava tentando acessar no esconderijo não existe.",
-       "api-error-timeout": "O servidor não respondeu dentro do tempo esperado.",
-       "api-error-unclassified": "Ocorreu um erro desconhecido",
-       "api-error-unknown-code": "Erro desconhecido: \"$1\"",
-       "api-error-unknown-error": "Erro interno: ocorreu um erro indeterminado ao tentar enviar o arquivo.",
-       "api-error-unknown-warning": "Aviso desconhecido: $1",
+       "api-error-stashfailed": "Erro interno: o servidor não conseguiu armazenar o arquivo temporário.",
+       "api-error-unknown-warning": "Aviso desconhecido: \"$1\".",
        "api-error-unknownerror": "Erro desconhecido: \"$1\".",
-       "api-error-uploaddisabled": "Este wiki está com o upload de arquivos desabilitado.",
-       "api-error-verification-error": "Este arquivo pode estar corrompido ou ter a extensão errada.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "expand_templates_generate_xml": "Mostrar árvore de análise (parse) do XML",
        "expand_templates_generate_rawhtml": "Mostrar HTML puro",
        "expand_templates_preview": "Pré-visualização",
-       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, tente novamente.</strong> Se não funcionar, tente [[Special:UserLogout|sair]] e iniciar novamente a sessão.",
+       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, tente novamente.</strong> Se não funcionar, tente [[Special:UserLogout|sair]] e iniciar novamente a sessão e verifique se o seu navegador permite cookies neste site.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e você não estar logado, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, [[Special:UserLogin|entre]] e tente novamente.</strong>",
-       "pagelanguage": "Seletor de idioma de página",
+       "expand_templates_input_missing": "Você precisa fornecer pelo menos algum texto de entrada.",
+       "pagelanguage": "Mudar idioma da página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Idioma padrão de uso",
        "pagelang-select-lang": "Selecionar idioma",
+       "pagelang-reason": "Razão:",
        "pagelang-submit": "Enviar",
+       "pagelang-nonexistent-page": "O artigo $1 não existe.",
+       "pagelang-unchanged-language": "A pagina $1 já está definido para idioma $2.",
+       "pagelang-unchanged-language-default": "A pagina $1 já está na língua de conteúdo padrão da wiki.",
+       "pagelang-db-failed": "O banco de dados falhou ao alterar o idioma da página.",
        "right-pagelang": "Mudar idioma da página",
        "action-pagelang": "mudar idioma da página",
-       "log-name-pagelang": "Mudar idioma do log",
+       "log-name-pagelang": "Registro de alteração de idioma",
        "log-description-pagelang": "Este é um registro de alterações aos idiomas das páginas.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da  $3 de $4 para $5",
        "default-skin-not-found": "Ops! A aparência padrão para sua wiki, definida em <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nSua instalação parece incluir a(s) seguinte(s) {{PLURAL:$4|aparência|aparências}}. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuração de aparência] para informações sobre como  {{PLURAL:$4|habilitá-la|habilitá-las e escolha a padrão}}.\n\n$2\n\n; Se você já instalou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git/pt-br#Usando_o_Git_para_baixar_extensões_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.\n\n; Se você já atualizou o MediaWiki:\n: O MediaWiki 1.24 e os mais recentes não permitem mais aparências instaladas automaticamente (veja [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Você pode colar {{PLURAL:$5|a seguinte linha|as seguintes linhas}} em <code>LocalSettings.php</code> para habilitar {{PLURAL:$5|a|todas as}} {{PLURAL:$5|aparência instalada|aparências instaladas}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se você já modificou <code>LocalSettings.php</code>:\n: Verifique cuidadosamente se não há erros de digitação nos nomes das aparências.",
        "default-skin-not-found-no-skins": "Opa! A aparência padrão da sua wiki, definida em <code>$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nVocê não tem aparências instaladas.\n\n; Se você acabou de instalar ou atualizar o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código-fonte usando usando algum outro método. Isto é esperado. O MediaWiki 1.24 e mais recentes não incluem aparências no repositório principal. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins/pt-br diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download/pt-br instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência do [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Usando_o_Git_para_baixar_aparências_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você for um(a) desenvolvedor(a) do MediaWiki. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pt-br Manual:Configuração de aparências] para informações sobre como habilitar aparências e escolher a padrão.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitado)",
        "mediastatistics": "Estatísticas de mídia",
        "mediastatistics-summary": "Estatísticas sobre os tipos de arquivos carregados. Inclui apenas a versão mais recente do arquivo. Versões antigas ou apagadas são excluídas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Tamanho total dos arquivos desta secção: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Tamanho total de todos os arquivos: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Possíveis extensões",
        "mediastatistics-table-count": "Número de arquivos",
        "special-characters-group-ipa": "AFI (IPA)",
        "special-characters-group-symbols": "Símbolos",
        "special-characters-group-greek": "Grego",
+       "special-characters-group-greekextended": "Grego estendido",
        "special-characters-group-cyrillic": "Cirílico",
        "special-characters-group-arabic": "Árabe",
        "special-characters-group-arabicextended": "Árabe estendido",
        "mw-widgets-dateinput-no-date": "Nenhuma data selecionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Procurar por mídia",
+       "mw-widgets-mediasearch-noresults": "Nenhum resultado encontrado.",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
-       "randomrootpage": "Página raiz aleatória"
+       "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Adicione mais...",
+       "sessionmanager-tie": "Não é possível combinar vários tipos de autenticação de solicitação: $1.",
+       "sessionprovider-generic": "$1 sessões",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "Sessões baseadas em cookie",
+       "sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e comece novamente.",
+       "randomrootpage": "Página raiz aleatória",
+       "log-action-filter-block": "Tipo de bloqueio:",
+       "log-action-filter-contentmodel": "Tipo de alteração do modelo de conteúdo:",
+       "log-action-filter-delete": "Tipo de exclusão:",
+       "log-action-filter-import": "Tipo de importação:",
+       "log-action-filter-managetags": "Tipo de acção de gestão de etiqueta:",
+       "log-action-filter-move": "Tipo de movimento:",
+       "log-action-filter-newusers": "Tipo de criação de conta:",
+       "log-action-filter-patrol": "Tipo de patrulha:",
+       "log-action-filter-protect": "Tipo de proteção:",
+       "log-action-filter-rights": "Tipo de mudança direita:",
+       "log-action-filter-suppress": "Tipo de supressão:",
+       "log-action-filter-upload": "Tipo de upload:",
+       "log-action-filter-all": "Todos",
+       "log-action-filter-block-block": "Bloquear",
+       "log-action-filter-block-reblock": "Modificação do bloqueio",
+       "log-action-filter-block-unblock": "Desbloquear",
+       "log-action-filter-contentmodel-change": "Modelo de alteração de conteúdo",
+       "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo não padrão",
+       "log-action-filter-delete-delete": "Exclusão de página",
+       "log-action-filter-delete-delete_redir": "Sobrescrição de redirecionamento",
+       "log-action-filter-delete-restore": "Restauro de página",
+       "log-action-filter-delete-event": "Excluir registro",
+       "log-action-filter-delete-revision": "Exclusão de revisão",
+       "log-action-filter-import-interwiki": "Importar transwiki",
+       "log-action-filter-import-upload": "Importação por upload XML",
+       "log-action-filter-managetags-create": "Criar Etiqueta",
+       "log-action-filter-managetags-delete": "Deletar etiqueta",
+       "log-action-filter-managetags-activate": "Ativar etiqueta",
+       "log-action-filter-managetags-deactivate": "Desativar etiqueta",
+       "log-action-filter-move-move": "Mover sem sobrescrever redirecionamentos",
+       "log-action-filter-move-move_redir": "Mover com substituição de redirecionamentos",
+       "log-action-filter-newusers-create": "Criação por usuário anônimo",
+       "log-action-filter-newusers-create2": "Criação por usuário registrado",
+       "log-action-filter-newusers-autocreate": "Criação automática",
+       "log-action-filter-newusers-byemail": "Criação com a senha enviada por e-mail",
+       "log-action-filter-patrol-patrol": "Patrulha manual",
+       "log-action-filter-patrol-autopatrol": "Patrulha automática",
+       "log-action-filter-protect-protect": "Proteção",
+       "log-action-filter-protect-modify": "Modificação de protecção",
+       "log-action-filter-protect-unprotect": "Desprotecção",
+       "log-action-filter-protect-move_prot": "Proteção movida",
+       "log-action-filter-rights-rights": "Mudança manual",
+       "log-action-filter-rights-autopromote": "Mudança automática",
+       "log-action-filter-suppress-event": "Supressão de registro",
+       "log-action-filter-suppress-revision": "Supressão de revisão",
+       "log-action-filter-suppress-delete": "Supressão de páginas",
+       "log-action-filter-suppress-block": "Supressão de usuário por bloqueio",
+       "log-action-filter-suppress-reblock": "Supressão de usuário por rebloqueio",
+       "log-action-filter-upload-upload": "Novo Upload",
+       "log-action-filter-upload-overwrite": "Recarregar",
+       "authmanager-authn-not-in-progress": "A autenticação não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
+       "authmanager-authn-no-primary": "As credenciais fornecidas não puderam ser autenticadas.",
+       "authmanager-authn-no-local-user": "As credenciais fornecidas não estão associadas a nenhum usuário neste wiki.",
+       "authmanager-authn-no-local-user-link": "As credenciais fornecidas são válidas, mas não estão associadas a nenhum usuário neste wiki. Efetue login de uma maneira diferente ou crie um novo usuário e você terá uma opção para vincular suas credenciais anteriores a essa conta.",
+       "authmanager-authn-autocreate-failed": "Falha na criação automática de uma conta local: $1",
+       "authmanager-change-not-supported": "As credenciais fornecidas não podem ser alteradas, pois nada as utilizaria.",
+       "authmanager-create-disabled": "A criação da conta está desativada.",
+       "authmanager-create-from-login": "Para criar sua conta, preencha os campos.",
+       "authmanager-create-not-in-progress": "A criação da conta não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
+       "authmanager-create-no-primary": "As credenciais fornecidas não puderam ser usadas para criação de conta.",
+       "authmanager-link-no-primary": "As credenciais fornecidas não puderam ser usadas para vinculação de contas.",
+       "authmanager-link-not-in-progress": "A associação de contas não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
+       "authmanager-authplugin-setpass-failed-title": "Falha na alteração da senha",
+       "authmanager-authplugin-setpass-failed-message": "O plugin de autenticação negou a alteração da senha.",
+       "authmanager-authplugin-create-fail": "O plugin de autenticação negou a criação da conta.",
+       "authmanager-authplugin-setpass-denied": "O plugin de autenticação não permite alterar senhas.",
+       "authmanager-authplugin-setpass-bad-domain": "Domínio inválido.",
+       "authmanager-autocreate-noperm": "A criação automática de conta não é permitida.",
+       "authmanager-autocreate-exception": "Criação automática de conta temporariamente desativada devido a erros anteriores.",
+       "authmanager-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
+       "authmanager-userlogin-remembermypassword-help": "Se a senha deve ser lembrada por mais tempo do que a duração da sessão.",
+       "authmanager-username-help": "Nome de usuário para autenticação.",
+       "authmanager-password-help": "Senha para autenticação.",
+       "authmanager-domain-help": "Domínio para autenticação externa.",
+       "authmanager-retype-help": "Senha novamente para confirmar.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "Endereço de e-mail",
+       "authmanager-realname-label": "Nome real",
+       "authmanager-realname-help": "Nome real do usuário",
+       "authmanager-provider-password": "Autenticação baseada em senha",
+       "authmanager-provider-password-domain": "Autenticação baseada em senha e domínio",
+       "authmanager-provider-temporarypassword": "Senha temporária",
+       "authprovider-confirmlink-message": "Com base nas tentativas de login recentes, as seguintes contas podem ser vinculadas à sua conta do wiki. Vinculá-los permite o login através dessas contas. Selecione quais devem ser vinculados.",
+       "authprovider-confirmlink-request-label": "Contas que devem ser vinculadas",
+       "authprovider-confirmlink-success-line": "$1: Vinculado com sucesso.",
+       "authprovider-confirmlink-failed": "A associação de contas não teve êxito total: $1",
+       "authprovider-confirmlink-ok-help": "Continue depois de exibir mensagens de falha de vinculação.",
+       "authprovider-resetpass-skip-label": "Pular",
+       "authprovider-resetpass-skip-help": "Ignorar a redefinição da senha.",
+       "authform-nosession-login": "A autenticação foi bem-sucedida, mas seu navegador não pode \"lembrar\" de estar conectado.\n\n$1",
+       "authform-nosession-signup": "A conta foi criada, mas seu navegador não pode \"lembrar\" de estar conectado.\n\n\n$1",
+       "authform-newtoken": "Token faltando. $1",
+       "authform-notoken": "Token faltando",
+       "authform-wrongtoken": "Token errado",
+       "specialpage-securitylevel-not-allowed-title": "Não permitido",
+       "specialpage-securitylevel-not-allowed": "Desculpe, você não tem permissão para usar esta página porque sua identidade não pôde ser verificada.",
+       "authpage-cannot-login": "Não é possível iniciar o login.",
+       "authpage-cannot-login-continue": "Não foi possível continuar o login. Sua sessão provavelmente esgotou o tempo limite.",
+       "authpage-cannot-create": "Não é possível iniciar a criação da conta.",
+       "authpage-cannot-create-continue": "Não é possível continuar a criação da conta. Sua sessão provavelmente esgotou o tempo limite.",
+       "authpage-cannot-link": "Não é possível iniciar a associação de contas.",
+       "authpage-cannot-link-continue": "Não é possível continuar vinculando a conta. Sua sessão provavelmente esgotou o tempo limite.",
+       "cannotauth-not-allowed-title": "Permissão negada",
+       "cannotauth-not-allowed": "Você não está autorizado a ver esta página",
+       "changecredentials": "Alterar credenciais",
+       "changecredentials-submit": "Alterar credenciais",
+       "changecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
+       "changecredentials-success": "Suas credenciais foram alteradas.",
+       "removecredentials": "Remover credenciais",
+       "removecredentials-submit": "Remover credenciais",
+       "removecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
+       "removecredentials-success": "Suas credenciais foram removidas.",
+       "credentialsform-provider": "Tipo de credenciais:",
+       "credentialsform-account": "Nome da conta:",
+       "cannotlink-no-provider-title": "Não há contas vinculáveis",
+       "cannotlink-no-provider": "Não há contas vinculáveis.",
+       "linkaccounts": "Vincular contas",
+       "linkaccounts-success-text": "A conta foi vinculada.",
+       "linkaccounts-submit": "Vincular contas",
+       "unlinkaccounts": "Desassociar contas",
+       "unlinkaccounts-success": "A conta foi desassociada.",
+       "authenticationdatachange-ignored": "A alteração de dados de autenticação não foi processada. Talvez nenhum provedor tenha sido configurado?",
+       "userjsispublic": "Observação: as subpáginas JavaScript não devem conter dados confidenciais, pois são visíveis por outros usuários.",
+       "usercssispublic": "Observação: As subpáginas CSS não devem conter dados confidenciais, pois são visíveis por outros usuários.",
+       "restrictionsfield-badip": "Endereço IP ou intervalo inválido: $1",
+       "restrictionsfield-label": "Intervalos IP permitidos:",
+       "restrictionsfield-help": "Um endereço IP ou intervalo CIDR por linha. Para ativar tudo, use\n<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revisão $1",
+       "pageid": "ID da página $1"
 }
index 53f4062..0ed8589 100644 (file)
@@ -72,7 +72,8 @@
                        "Luan",
                        "Gato Preto",
                        "Jdforrester",
-                       "Mansil"
+                       "Mansil",
+                       "Ngl2016"
                ]
        },
        "tog-underline": "Sublinhar ligações:",
        "searcharticle": "Ir",
        "history": "Histórico",
        "history_short": "Histórico",
+       "history_small": "histórico",
        "updatedmarker": "atualizado desde a minha última visita",
        "printableversion": "Versão para impressão",
        "permalink": "Ligação permanente",
        "views": "Vistas",
        "toolbox": "Ferramentas",
        "tool-link-userrights": "Alterar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
+       "tool-link-userrights-readonly": "Ver grupos {{GENDER:$1|do utilizador|da utilizadora}}",
        "tool-link-emailuser": "Enviar correio eletrónico a {{GENDER:$1|este utilizador|esta utilizadora|este(a) utilizador(a)}}",
        "userpage": "Ver página de utilizador",
        "projectpage": "Ver página de projeto",
        "invalidtitle-unknownnamespace": "Título inválido com número de domínio $1 desconhecido e texto \"$2\"",
        "exception-nologin": "Não está autenticado",
        "exception-nologin-text": "Por favor, inicie sessão para poder aceder a esta página ou ação.",
-       "exception-nologin-text-manual": "Por favor $1, para poder aceder a esta página ou acção.",
+       "exception-nologin-text-manual": "Por favor $1, para poder aceder a esta página ou ação.",
        "virus-badscanner": "Má configuração: antivírus desconhecido: ''$1''",
        "virus-scanfailed": "a verificação falhou (código $1)",
        "virus-unknownscanner": "antivírus desconhecido:",
        "botpasswords-label-delete": "Eliminar",
        "botpasswords-label-resetpassword": "Redefinir palavra-passe",
        "botpasswords-label-grants": "Concessões de permissões aplicáveis:",
-       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de utilizador. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a usa conta de utilizador não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
+       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de utilizador. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a sua conta de utilizador não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "O nome do robô \"$1\" não é válido.",
        "botpasswords-insert-failed": "Falhou ao adicionar o nome do robô \"$1\". Já foi adicionado?",
        "botpasswords-update-failed": "Falha ao atualizar o nome do robô \"$1\". Será que foi eliminado?",
        "botpasswords-created-title": "Criada palavra-passe para o robô",
-       "botpasswords-created-body": "A palavra-passe de robô para o robô \"$1\" do utilizador \"$2\" foi criada.",
+       "botpasswords-created-body": "A palavra-passe de robô, para o nome de robô \"$1\" do utilizador \"$2\" foi criada.",
        "botpasswords-updated-title": "A palavra-passe de robô foi atualizada.",
-       "botpasswords-updated-body": "O robô palavra-passe para o nome do robô \"$1\" do utilizador \"$2\" foi atualizado.",
+       "botpasswords-updated-body": "A palavra-passe de robô, para o nome de robô \"$1\" do utilizador \"$2\" foi atualizada.",
        "botpasswords-deleted-title": "Palavra-passe de robô eliminada",
-       "botpasswords-deleted-body": "O robô palavra-passe para o nome do robô \"$1\"do utilizador \"$2\" foi eliminado.",
+       "botpasswords-deleted-body": "A palavra-passe de robô, para o nome de robô \"$1\" do utilizador \"$2\" foi eliminada.",
        "botpasswords-newpassword": "A nova palavra-passe para iniciar sessão com <strong>$1</strong> é <strong>$2</strong>. <em>Anote-a para referência futura, por favor.</em> <br> (Para robôs antigos cujo nome de acesso tenha de ser igual ao eventual nome de utilizador, também pode usar o nome de utilizador <strong>$3</strong> e a palavra-passe <strong>$4</strong>.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider não está disponível.",
        "botpasswords-restriction-failed": "Restrições de palavra-passe de robô evitam esta autenticação.",
        "passwordreset-emaildisabled": "A funcionalidade de correio eletrónico foi desativada nesta wiki.",
        "passwordreset-username": "Nome de utilizador(a):",
        "passwordreset-domain": "Domínio:",
-       "passwordreset-capture": "Ver a mensagem resultante?",
-       "passwordreset-capture-help": "Se marcar esta caixa, a mensagem (com a palavra-passe temporária) ser-lhe-á mostrada e enviada ao utilizador.",
        "passwordreset-email": "Correio eletrónico:",
        "passwordreset-emailtitle": "Detalhes da conta na wiki {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe na wiki {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailelement": "{{GENDER:$1|Utilizador|Utilizadora}}: \n$1\n\nPalavra-passe temporária: \n$2",
        "passwordreset-emailsentemail": "Se este é o endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma palavra-passe de reposição.",
        "passwordreset-emailsentusername": "Se houver um endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua palavra-passe.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|A mensagem|As mensagens}} de redefinição da palavra-passe {{PLURAL:$1|foi enviada|foram enviadas}} para o seu correio eletrónico. {{PLURAL:$1|O nome de utilizador e palavra-passe encontram-se|A lista de nomes de utilizador e palavras-passe encontra-se}} a seguir.",
-       "passwordreset-emailerror-capture2": "O envio do correio {{GENDER:$2|ao utilizador|à utilizadora|a(o) utilizador(a)}} falhou: $1 {{PLURAL:$3|O nome de utilizador e palavra-passe são mostrados aqui|A lista de nomes de utilizador e palavras-passe é mostrada aqui}}.",
        "passwordreset-nocaller": "Um interlocutor deve ser fornecido",
        "passwordreset-nosuchcaller": "A pessoa que chama não existe: $1",
        "passwordreset-ignored": "A reposição de palavra-passe não foi realizada. Talvez o fornecedor não tenha sido configurado?",
        "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.",
        "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.",
-       "summary-preview": "Antevisão do resumo:",
+       "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.",
        "blockedtitle": "O utilizador está bloqueado",
        "blockedtext": "<strong>O seu nome de utilizador ou endereço IP foram bloqueados.</strong>\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\nNote que para utilizar a funcionalidade \"Contactar utilizador\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
        "autoblockedtext": "O seu endereço IP foi bloqueado de forma automática porque foi utilizado recentemente por outro utilizador, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\n\nNote que para utilizar a funcionalidade \"Contactar utilizador\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\n\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
+       "systemblockedtext": "O seu nome de utilizador ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contatos sobre este assunto, por favor.",
        "blockednoreason": "sem motivo especificado",
        "whitelistedittext": "Precisa de $1 para poder editar páginas.",
        "confirmedittext": "Precisa de confirmar o seu endereço de correio eletrónico antes de começar a editar páginas.\nIntroduza e valide o endereço através das [[Special:Preferences|preferências do utilizador]], por favor.",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de utilizador(a) removido)",
        "rev-deleted-event": "(registos de detalhes eliminados)",
-       "rev-deleted-user-contribs": "[nome de utilizador(a) ou IP removido – edição ocultada das contribuições]",
+       "rev-deleted-user-contribs": "[nome de utilizador(a) ou IP removido do histórico – edição ocultada das contribuições públicas]",
        "rev-deleted-text-permission": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
        "rev-suppressed-text-permission": "Esta revisão de página foi <strong>suprimida</strong>.\nPode consultar os detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
        "rev-deleted-text-unhide": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].\nPode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
-       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).",
+       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados encontrados.}}",
        "searchmenu-new": "<strong>Crie a página \"[[:$1]]\" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada na pesquisa.|Veja também os resultados da pesquisa.}}",
        "searchprofile-articles": "Páginas de conteúdo",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
+       "search-interwiki-more-results": "mais resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "search-external": "Pesquisa externa",
        "searchdisabled": "Foi impossibilitada a realização de pesquisas na wiki {{SITENAME}}.\nEntretanto, pode realizar pesquisas através do Google.\nNote, no entanto, que a indexação da wiki {{SITENAME}} neste motor de busca pode estar desatualizada.",
        "search-error": "Um erro ocorreu enquanto se efectuava a pesquisa: $1",
+       "search-warning": "Ocorreu um aviso ao pesquisar: $1",
        "preferences": "Preferências",
        "mypreferences": "Preferências",
        "prefs-edits": "Número de edições:",
        "saveprefs": "Gravar",
        "restoreprefs": "Repor todas as configurações padrão (em todas as secções)",
        "prefs-editing": "Edição",
-       "rows": "Linhas:",
-       "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
        "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
        "stub-threshold-sample-link": "amostra",
        "prefs-help-recentchangescount": "Inclui mudanças recentes, histórico de páginas e registos.",
        "prefs-help-watchlist-token2": "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.\nQualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram gravadas.",
-       "savedrights": "Os privilégios de utilizador para {{GENDER:$1|$1}} foram gravados.",
+       "savedrights": "Os grupos {{GENDER:$1|do utilizador|da utilizadora}} $1 foram gravados.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar padrão da wiki ($1)",
        "youremail": "Correio eletrónico:",
        "username": "Nome de {{GENDER:$1|utilizador|utilizadora|utilizador(a)}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
+       "group-membership-link-with-expiry": "$1 (até $2)",
        "prefs-registration": "Hora de registo:",
        "yourrealname": "Nome verdadeiro:",
        "yourlanguage": "Língua:",
        "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-lookup-user": "Gerir grupos de utilizadores",
+       "userrights-lookup-user": "Selecionar um utilizador",
        "userrights-user-editname": "Introduza um nome de utilizador(a):",
-       "editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
+       "editusergroup": "Carregar grupos do utilizador",
        "editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}  <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
+       "viewinguserrights": "A ver os privilégios {{GENDER:$1|do utilizador|da utilizadora}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
+       "userrights-viewusergroup": "Ver grupos {{GENDER:$1|do utilizador|da utilizadora}}",
        "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|este(a) utilizador(a)}} pertence:\n* Uma caixa de seleção marcada significa que {{GENDER:$1|o utilizador|a utilizadora|o(a) utilizador(a)}} se encontra no grupo.\n* Uma caixa de seleção desmarcada significa que {{GENDER:$1|o utilizador|a utilizadora|o(a) utilizador(a)}} não se encontra no grupo.\n* Um asterisco (*) indica que não pode remover o grupo depois de o adicionar, ou vice-versa.",
+       "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-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-nologin": "Precisa de [[Special:UserLogin|iniciar sessão]] com uma conta de administrador para atribuir privilégios aos utilizadores.",
-       "userrights-notallowed": "A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.",
        "userrights-changeable-col": "Grupos que pode alterar",
        "userrights-unchangeable-col": "Grupos que não pode alterar",
+       "userrights-expiry-current": "Expira a $1",
+       "userrights-expiry-none": "Não expira",
+       "userrights-expiry": "Expira a:",
+       "userrights-expiry-existing": "Prazo de expiração: $3, $2",
+       "userrights-expiry-othertime": "Outra duração:",
+       "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-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, reveja e confirme as suas mudanças.",
-       "userrights-removed-self": "Removeu os seus privilégios. Como resultado disto, já não consegue aceder a esta página.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
        "group-autoconfirmed": "Utilizadores autoconfirmados",
        "right-siteadmin": "Bloquear e desbloquear a base de dados",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar correio eletrónico a outros utilizadores",
-       "right-passwordreset": "Ver mensagens de redefinição da palavra-passe",
        "right-managechangetags": "Criar e (des)ativar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações",
        "right-changetags": "Adicionar ou remover [[Special:Tags|etiquetas]] arbitrárias em revisões e entradas de registo individuais",
        "action-history": "ver histórico desta página",
        "action-minoredit": "marcar esta edição como uma edição menor",
        "action-move": "mover esta página",
-       "action-move-subpages": "mover esta página e as respectivas subpáginas",
+       "action-move-subpages": "mover esta página e as respetivas subpáginas",
        "action-move-rootuserpages": "mover páginas raiz de utilizadores",
        "action-move-categorypages": "mover categorias",
        "action-movefile": "mover este ficheiro",
        "action-upload_by_url": "enviar este ficheiro através de um URL",
        "action-writeapi": "utilizar o modo de escrita da API",
        "action-delete": "eliminar esta página",
-       "action-deleterevision": "eliminar esta edição",
-       "action-deletedhistory": "ver o histórico de edições eliminadas desta página",
+       "action-deleterevision": "eliminar revisões",
+       "action-deletelogentry": "eliminar entradas de registo",
+       "action-deletedhistory": "ver o histórico de edições eliminadas de uma página",
+       "action-deletedtext": "ver o texto de uma revisão eliminada",
        "action-browsearchive": "pesquisar páginas eliminadas",
-       "action-undelete": "restaurar esta página",
-       "action-suppressrevision": "rever e restaurar esta edição oculta",
+       "action-undelete": "restaurar páginas",
+       "action-suppressrevision": "rever e restaurar edições ocultas",
        "action-suppressionlog": "ver este registo privado",
        "action-block": "impedir este utilizador de editar",
        "action-protect": "alterar os níveis de proteção desta página",
        "action-userrights-interwiki": "editar privilégios de utilizadores de outras wikis",
        "action-siteadmin": "bloquear ou desbloquear a base de dados",
        "action-sendemail": "enviar correio eletrónico",
+       "action-editmyoptions": "editar as suas preferências",
        "action-editmywatchlist": "editar a sua lista de páginas vigiadas",
        "action-viewmywatchlist": "ver a sua lista de páginas vigiadas",
        "action-viewmyprivateinfo": "ver a sua informação privada",
        "recentchanges": "Mudanças recentes",
        "recentchanges-legend": "Opções das mudanças recentes",
        "recentchanges-summary": "Acompanhe nesta página as mudanças mais recentes da wiki.",
-       "recentchanges-noresult": "Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.",
+       "recentchanges-noresult": "Não foi realizada nenhuma alteração correspondente a esses critérios durante o período selecionado.",
        "recentchanges-feed-description": "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
        "recentchanges-label-newpage": "Esta edição criou uma nova página",
        "recentchanges-label-minor": "Esta é uma edição menor",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Mostrar",
+       "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-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-noresults": "Não foram encontrados filtros",
+       "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-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-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-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-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-newpages-label": "Criações de páginas",
+       "rcfilters-filter-newpages-description": "Edições que criam novas páginas.",
+       "rcfilters-filter-categorization-label": "Alterações de categoria",
+       "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....",
        "rcnotefrom": "Abaixo {{PLURAL:$5|está a mudança|estão as mudanças}} desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
        "rclistfrom": "Mostrar as novas mudanças a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "upload-permitted": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|permitido|permitidos}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|preferido|preferidos}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|proibido|proibidos}}: $1.",
-       "uploadlogpage": "Registo de carregamento",
+       "uploadlogpage": "Registo de carregamentos",
        "uploadlogpagetext": "Segue-se uma lista dos carregamentos mais recentes.\nConsulte a [[Special:NewFiles|galeria de novos ficheiros]] para visioná-los.",
        "filename": "Nome do ficheiro",
        "filedesc": "Descrição do ficheiro",
        "uploaded-setting-handler-svg": "A configuração do atributo \"handler\" com destino remoto/de dados/<i>script</i> em ficheiros SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no ficheiro SVG carregado.",
        "uploaded-remote-url-svg": "A configuração de qualquer atributo de estilo com um URL remoto em ficheiros SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no ficheiro SVG carregado.",
        "uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com o URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG carregado.",
-       "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"$1\".",
+       "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Erro detectado na análise do XML do ficheiro carregado.",
        "uploadvirus": "O ficheiro contém um vírus! \nDetalhes: $1",
        "uploadjava": "Este é um ficheiro ZIP que contém um ficheiro .class de Java.\nNão é permitido o carregamento de ficheiros Java, porque estes podem contornar as restrições de segurança.",
        "listfiles-latestversion-no": "Não",
        "file-anchor-link": "Ficheiro",
        "filehist": "Histórico do ficheiro",
-       "filehist-help": "Clique numa data/hora para ver o ficheiro tal como se encontrava nesse momento.",
+       "filehist-help": "Clique uma data e hora para ver o ficheiro tal como ele se encontrava nessa altura.",
        "filehist-deleteall": "eliminar todas",
        "filehist-deleteone": "eliminar",
        "filehist-revert": "restaurar",
        "imagelinks": "Uso do ficheiro",
        "linkstoimage": "{{PLURAL:$1|A seguinte página contém ligação|As seguintes $1 páginas contêm ligações}} para este ficheiro:",
        "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém ligação|$1 páginas contêm ligações}} para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
-       "nolinkstoimage": "Nenhuma página contém ligação para este ficheiro.",
+       "nolinkstoimage": "Não há nenhuma página que contenha ''links'' para este ficheiro.",
        "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm ligações para este ficheiro.",
        "linkstoimage-redirect": "$1 (redirecionamento de ficheiro) $2",
        "duplicatesoffile": "{{PLURAL:$1|O seguinte ficheiro é duplicado|Os seguintes $1 ficheiros são duplicados}} deste ficheiro ([[Special:FileDuplicateSearch/$2|mais detalhes]]):",
        "statistics-header-hooks": "Outras estatísticas",
        "statistics-articles": "Páginas de conteúdo",
        "statistics-pages": "Páginas",
-       "statistics-pages-desc": "Todas as páginas da wiki, incluindo páginas de discussão, redirecionamentos, etc.",
+       "statistics-pages-desc": "Todas as páginas da wiki, incluindo páginas de discussão, redirecionamentos etc.",
        "statistics-files": "Ficheiros carregados",
        "statistics-edits": "Edições de páginas desde que a wiki {{SITENAME}} foi instalada",
        "statistics-edits-average": "Média de edições por página",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Ficheiros não categorizados",
        "uncategorizedtemplates": "Predefinições não categorizadas",
+       "uncategorized-categories-exceptionlist": " # Contém uma lista de categorias que não devem ser mencionadas na página Especial:Categorias não categorizadas. Uma por linha, iniciada por \"*\". As linhas iniciadas por qualquer outro carácter (incluindo espaços em branco) são ignoradas. Use \"#\" para comentários.",
        "unusedcategories": "Categorias não utilizadas",
        "unusedimages": "Ficheiros não utilizados",
        "wantedcategories": "Categorias desejadas",
        "apisandbox-sending-request": "A enviar solicitação de API...",
        "apisandbox-loading-results": "A receber resultados da API...",
        "apisandbox-results-error": "Ocorreu um erro ao carregar a resposta à consulta por API: $1",
+       "apisandbox-request-selectformat-label": "Mostrar dados do pedido como:",
+       "apisandbox-request-format-url-label": "Sequência de consulta da URL",
        "apisandbox-request-url-label": "URL do pedido:",
+       "apisandbox-request-json-label": "Pedido JSON:",
        "apisandbox-request-time": "Tempo de processamento: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrija o identificador e volte a submete-lo",
        "apisandbox-results-fixtoken-fail": "Não foi possível obter o identificador \"$1\".",
        "apisandbox-continue-clear": "Limpar",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] o último pedido; {{int:apisandbox-continue-clear}} limpará os parâmetros relativos à continuação.",
        "apisandbox-param-limit": "Introduza <kbd>max</kbd> para usar o limite máximo.",
+       "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": "Pesquisar",
        "logeventslist-submit": "Mostrar",
        "all-logs-page": "Todos os registos públicos",
        "alllogstext": "Apresentação combinada de todos os registos disponíveis na wiki {{SITENAME}}.\nPode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um título de página. Respeite maiúsculas e minúsculas.",
-       "logempty": "Nenhum item correspondente no registo.",
+       "logempty": "Não existe nenhuma entrada correspondente no registo.",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "log-edit-tags": "Editar etiquetas das entradas de registo selecionadas",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
        "activeusers-from": "Mostrar utilizadores começados por:",
        "activeusers-groups": "Apresentar os utilizadores que pertencem aos grupos:",
-       "activeusers-noresult": "Nenhum utilizador encontrado.",
+       "activeusers-excludegroups": "Excluir os utilizadores que pertencem aos grupos:",
+       "activeusers-noresult": "Não foram encontrados utilizadores.",
        "activeusers-submit": "Mostrar utilizadores ativos",
        "listgrouprights": "Privilégios dos grupos de utilizadores",
-       "listgrouprights-summary": "A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respectivos privilégios de acesso.\nEncontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.",
+       "listgrouprights-summary": "A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respetivos privilégios de acesso.\nEncontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Privilégio concedido</span>\n* <span class=\"listgrouprights-revoked\">Privilégio revogado</span>",
        "listgrouprights-group": "Grupo",
        "listgrouprights-rights": "Privilégios",
        "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "A página contém uma ligação quebrada para um ficheiro (uma ligação para incorporar um ficheiro que não existe).",
        "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de ligações de categoria nas páginas, por omissão.",
-       "trackingcategories-nodesc": "Nenhuma descrição disponível.",
+       "trackingcategories-nodesc": "Sem descrição disponível.",
        "trackingcategories-disabled": "A categoria está desativada.",
        "mailnologin": "Não existe endereço de envio",
        "mailnologintext": "Precisa de estar [[Special:UserLogin|autenticado]] e ter um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio eletrónico a outros utilizadores.",
        "emailsubject": "Assunto:",
        "emailmessage": "Mensagem:",
        "emailsend": "Enviar",
-       "emailccme": "Enviar uma cópia desta mensagem para o meu correio eletrónico.",
+       "emailccme": "Enviar uma cópia desta mensagem para o meu correio eletrónico",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi {{GENDER:$1|enviada}} por $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" da wiki {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi enviada {{GENDER:$1|pelo utilizador|pela utilizadora}} $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" da wiki {{SITENAME}}. Se {{GENDER:$2|responder}} a esta mensagem, {{GENDER:$2|a sua}} resposta será enviada diretamente para {{GENDER:$1|o|a}} remetente original, e irá revelar-lhe {{GENDER:$2|o seu}} endereço de correio eletrónico.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "deletepage": "Eliminar página",
        "confirm": "Confirmar",
        "excontent": "o conteúdo era: \"$1\"",
-       "excontentauthor": "o conteúdo era: \"$1\", e o único editor \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
+       "excontentauthor": "o conteúdo era: \"$1\", e {{GENDER:$2|o único editor|a única editora|o(a) único(a) editor(a)}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: \"$1\"",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "changecontentmodel-emptymodels-title": "Não há modelos de conteúdo disponíveis",
        "changecontentmodel-emptymodels-text": "O conteúdo em [[:$1]] não pode ser convertido para qualquer tipo.",
        "log-name-contentmodel": "Registo de alteração de modelo de conteúdo",
-       "log-description-contentmodel": "Eventos relacionados com os modelos de conteúdo de uma página",
+       "log-description-contentmodel": "Esta página lista alterações do modelo de conteúdo das páginas e páginas criadas com um modelo de conteúdo diferente do padrão.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|criou}} a página $3 com o modelo de conteúdo desconhecido \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|alterou}} o modelo de conteúdo da página $3 de \"$4\" para \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "proxyblockreason": "O seu endereço IP foi bloqueado por ser um ''proxy'' público.\nContacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.",
        "sorbsreason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela wiki {{SITENAME}}.",
        "sorbs_create_account_reason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela wiki {{SITENAME}}. Não pode criar uma conta.",
+       "softblockrangesreason": "Não são permitidas contribuições anónimas a partir do seu endereço IP ($1). Inicie uma sessão, por favor.",
        "xffblockreason": "Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1",
        "cant-see-hidden-user": "O utilizador que está a tentar bloquear já está bloqueado e oculto.\nComo não tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
        "ipbblocked": "Não pode bloquear ou desbloquear outros, porque está bloqueado",
        "cant-move-to-user-page": "Não tem permissão para mover uma página para uma página de utilizador (pode movê-la para uma subpágina de utilizador).",
        "cant-move-category-page": "Não possui permissão para mover categorias.",
        "cant-move-to-category-page": "Não possui permissão para mover uma página para uma categoria.",
+       "cant-move-subpages": "Não tem permissão para mover subpáginas.",
+       "namespace-nosubpages": "O espaço nominal \"$1\" não permite subpáginas.",
        "newtitle": "Novo título:",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "importbadinterwiki": "Ligação interlíngua incorreta",
        "importsuccess": "Importação completa!",
        "importnosources": "Não foram definidas as wikis das quais importar e o carregamento direto de históricos encontra-se desativado.",
-       "importnofile": "Nenhum ficheiro de importação foi carregado.",
+       "importnofile": "Não foi carregado nenhum ficheiro de importação.",
        "importuploaderrorsize": "O carregamento do ficheiro importado falhou.\nO ficheiro é maior do que o tamanho máximo permitido.",
        "importuploaderrorpartial": "O carregamento do ficheiro importado falhou.\nO ficheiro foi recebido parcialmente.",
        "importuploaderrortemp": "O carregamento do ficheiro importado falhou.\nNão há um diretório temporário.",
        "import-parse-failure": "Falha ao importar dados XML",
        "import-noarticle": "Sem páginas para importar!",
-       "import-nonewrevisions": "Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).",
+       "import-nonewrevisions": "Não foi importada nenhuma revisão (já estavam todas presentes ou foram ignoradas devido a erros).",
        "xml-error-string": "$1 na linha $2, coluna $3 (byte $4): $5",
        "import-upload": "Enviar dados em XML",
        "import-token-mismatch": "Perda de dados da sessão.\n\nA sua sessão poderá ter sido encerrada. <strong>Por favor, verifique se ainda está autenticado e tente novamente</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "import-error-interwiki": "A página \"$1\" não pode ser importada pois o seu nome está reservado para um ligação externa (interlíngua).",
        "import-error-special": "A página \"$1\" não pode ser importada porque pertence a um domínio especial que não permite páginas.",
        "import-error-invalid": "A página \"$1\" não pode ser importada porque o seu nome é inválido nesta wiki.",
-       "import-error-unserialize": "Revisão $2 da página \"$1\" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.",
+       "import-error-unserialize": "Não foi possível anular a seriação da revisão $2 da página \"$1\". Foi reportado que a revisão usava o modelo de conteúdo $3, seriado como $4.",
        "import-error-bad-location": "A revisão $2, que usa o modelo de conteúdo $3, não pode ser gravada em \"$1\" nesta wiki, porque o modelo não é suportado nessa página.",
        "import-options-wrong": "{{PLURAL:$2|Opção errada|Opções erradas}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "A raiz da página dada é um título inválido.",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por uma ligação para um sítio externo que consta da lista negra.",
+       "spamprotectiontext": "O texto que desejava gravar foi bloqueado pelo filtro de ''spam''.\nProvavelmente este bloqueio foi causado por uma ligação para um sítio externo que consta da lista negra.",
        "spamprotectionmatch": "O seguinte texto ativou o filtro de <i>spam</i>: $1",
        "spambot_username": "MediaWiki limpeza de spam",
        "spam_reverting": "A reverter para a última revisão que não contém ligação para $1",
        "pageinfo-length": "Tamanho da página (em bytes)",
        "pageinfo-article-id": "ID da página",
        "pageinfo-language": "Idioma do conteúdo da página",
+       "pageinfo-language-change": "alterar",
        "pageinfo-content-model": "Modelo de conteúdo de página",
        "pageinfo-content-model-change": "alterar",
        "pageinfo-robot-policy": "Indexação por robôs",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar novos ficheiros a partir das $2 de $1",
+       "seconds-abbrev": "$1&nbsp;s",
+       "minutes-abbrev": "$1&nbsp;min",
+       "hours-abbrev": "$1&nbsp;h",
        "seconds": "{{PLURAL:$1|um segundo|$1 segundos}}",
        "minutes": "{{PLURAL:$1|um minuto|$1 minutos}}",
        "hours": "{{PLURAL:$1|uma hora|$1 horas}}",
        "recreate": "Recriar",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Limpar a memória cache desta página?",
-       "confirm-purge-bottom": "Recarregar uma página, limpa a cache e força a sua versão mais recente a aparecer.",
+       "confirm-purge-bottom": "Recarregar uma página limpa a cache e força a sua versão mais recente a aparecer.",
        "confirm-watch-button": "OK",
        "confirm-watch-top": "Adicionar esta página à lista de páginas vigiadas?",
        "confirm-unwatch-button": "OK",
        "htmlform-user-not-exists": "<strong>$1</strong> não existe.",
        "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-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-import-interwiki": "$1 {{GENDER:$2|importou}} $3 de outra wiki",
        "logentry-import-interwiki-details": "$1 {{GENDER:$2|importou}} $3 de $5 ($4 {{PLURAL:$4|revisão|revisões}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|fundiu}} $3 com $4 (edições até $5)",
-       "logentry-move-move": "$1 moveu a página $3 para $4",
-       "logentry-move-move-noredirect": "$1 moveu a página $3 para $4 sem deixar um redirecionamento",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} a página $3 para o seu redirecionamento $4",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para o seu redirecionamento $4, suprimindo o primeiro",
+       "logentry-move-move": "$1 moveu $3 para $4",
+       "logentry-move-move-noredirect": "$1 moveu $3 para $4 sem deixar um redirecionamento",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} $3 para o seu redirecionamento $4",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} $3 para o seu redirecionamento $4, suprimindo o primeiro",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada",
        "logentry-newusers-newusers": "A conta de utilizador $1 foi {{GENDER:$2|criada}}",
        "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",
        "feedback-bugcheck": "Perfeito! Verifique apenas que não é já um dos [$1 defeitos conhecidos].",
        "feedback-useragent": "Agente de utilizador:",
        "searchsuggest-search": "Pesquisar na wiki {{SITENAME}}",
        "searchsuggest-containing": "contendo...",
-       "api-error-autoblocked": "O seu endereço IP foi bloqueado automaticamente, pois foi utilizado por um utilizador bloqueado.",
-       "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "api-error-badtoken": "Erro interno: Chave incorrecta.",
-       "api-error-blocked": "Foi bloqueado de editar.",
-       "api-error-copyuploaddisabled": "O carregamento de ficheiros por URL não foi possibilitado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|existia outro ficheiro|existiam outros ficheiro}} na wiki com o mesmo conteúdo.",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|estava outro ficheiro|estavam outros ficheiros}} no  site com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
-       "api-error-empty-file": "O ficheiro que enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
-       "api-error-fetchfileerror": "Erro interno: Ocorreu um problema indeterminado ao aceder ao ficheiro.",
-       "api-error-fileexists-forbidden": "Já existe um ficheiro com o nome \"$1\" e não pode ser substituído.",
-       "api-error-fileexists-shared-forbidden": "Já existe um ficheiro com o nome \"$1\" no repositório de ficheiros partilhados e não pode ser substituído.",
-       "api-error-file-too-large": "O ficheiro que enviou era demasiado grande.",
-       "api-error-filename-tooshort": "O nome do ficheiro é demasiado curto.",
-       "api-error-filetype-banned": "Este tipo de ficheiro é proibido.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|não é um tipo de ficheiro permitido|não são tipos de ficheiro permitidos}}. {{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos são}} $2.",
-       "api-error-filetype-missing": "Falta a extensão do ficheiro.",
-       "api-error-hookaborted": "A modificação que tentou fazer foi cancelada por uma extensão.",
-       "api-error-http": "Erro interno: Ocorreu um problema na ligação ao servidor.",
-       "api-error-illegal-filename": "Este nome de ficheiro não é permitido.",
-       "api-error-internal-error": "Erro interno: Ocorreu um erro indeterminado na wiki ao processar o ficheiro que enviou.",
-       "api-error-invalid-file-key": "Erro interno: O ficheiro não foi encontrado no armazenamento temporário.",
-       "api-error-missingparam": "Erro interno: Há parâmetros em falta no pedido.",
-       "api-error-missingresult": "Erro interno: Não foi possível determinar se a cópia foi feita.",
-       "api-error-mustbeloggedin": "Tem de iniciar sessão para enviar ficheiros.",
-       "api-error-mustbeposted": "Erro interno: O pedido necessita do HTTP POST.",
-       "api-error-noimageinfo": "O envio correu bem, mas o servidor não forneceu nenhuma informação sobre o ficheiro.",
-       "api-error-nomodule": "Erro interno: Não está definido nenhum módulo para o carregamento de ficheiros.",
-       "api-error-ok-but-empty": "Erro interno: o servidor não respondeu.",
-       "api-error-overwrite": "Não é permitido sobrescrever um ficheiro existente.",
-       "api-error-ratelimited": "Está a tentar carregar mais ficheiros do que esta wiki permite num espaço de tempo curto. Tente de novo dentro de alguns minutos, por favor.",
-       "api-error-stashfailed": "Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.",
        "api-error-publishfailed": "Erro interno: Servidor não conseguiu publicar ficheiro temporário.",
-       "api-error-stasherror": "Ocorreu um erro no carregamento do ficheiro escondido.",
-       "api-error-stashedfilenotfound": "O ficheiro escondido não foi encontrado ao tentar carregá-lo.",
-       "api-error-stashpathinvalid": "O caminho no qual o ficheiro escondido deveria ter sido encontrado era inválido.",
-       "api-error-stashfilestorage": "Ocorreu um erro no carregamento do ficheiro escondido.",
-       "api-error-stashzerolength": "Não foi possível o servidor esconder o ficheiro, porque este tinha comprimento zero.",
-       "api-error-stashnotloggedin": "Tem de ter uma sessão iniciada para gravar ficheiros na área de ficheiros escondidos.",
-       "api-error-stashwrongowner": "O ficheiro a que estava a tentar aceder na área de ficheiros escondidos não lhe pertence.",
-       "api-error-stashnosuchfilekey": "O chave do ficheiro a que estava a tentar aceder na área de ficheiros escondidos não existe.",
-       "api-error-timeout": "O servidor não respondeu no prazo esperado.",
-       "api-error-unclassified": "Ocorreu um erro desconhecido",
-       "api-error-unknown-code": "Erro desconhecido: \"$1\"",
-       "api-error-unknown-error": "Erro interno: Ocorreu um erro indeterminado ao tentar receber o ficheiro.",
+       "api-error-stashfailed": "Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.",
        "api-error-unknown-warning": "Aviso desconhecido: $1",
        "api-error-unknownerror": "Erro desconhecido: \"$1\".",
-       "api-error-uploaddisabled": "Esta wiki não está configurada para poder receber ficheiros.",
-       "api-error-verification-error": "Este ficheiro pode estar corrompido, ou ter a extensão errada.",
-       "api-error-was-deleted": "Um ficheiro com este nome foi carregado anteriormente e posteriormente eliminado.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Língua",
        "pagelang-use-default": "Usar idioma pré-definido",
        "pagelang-select-lang": "Escolher o idioma",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Submeter",
+       "pagelang-nonexistent-page": "A página $1 não existe.",
+       "pagelang-unchanged-language": "A pagina $1 já está na língua $2.",
+       "pagelang-unchanged-language-default": "A pagina $1 já está na língua de conteúdo padrão da wiki.",
+       "pagelang-db-failed": "A base de dados não conseguiu alterar a língua da página.",
        "right-pagelang": "Alterar o idioma da página",
        "action-pagelang": "alterar o idioma da página",
        "log-name-pagelang": "Registo de alteração de idioma",
        "special-characters-title-endash": "hífen",
        "special-characters-title-emdash": "travessão",
        "special-characters-title-minus": "sinal de subtração",
-       "mw-widgets-dateinput-no-date": "Nenhuma data selecionada",
+       "mw-widgets-dateinput-no-date": "Não foi selecionada nenhuma data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Procurar ficheiros multimédia",
+       "mw-widgets-mediasearch-noresults": "Não foram encontrados resultados.",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Adicionar mais...",
        "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-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e inicie novamente.",
        "randomrootpage": "Página aleatória de raiz",
        "log-action-filter-block": "Tipo de bloqueio:",
-       "log-action-filter-contentmodel": "Tipo de alteração de modelo de conteúdo:",
+       "log-action-filter-contentmodel": "Tipo de alteração do modelo de conteúdo:",
        "log-action-filter-delete": "Tipo de eliminação:",
        "log-action-filter-import": "Tipo de importação:",
        "log-action-filter-managetags": "Tipo de ação de gestão de etiqueta:",
-       "log-action-filter-move": "Tipo do movimento:",
+       "log-action-filter-move": "Tipo de movimentação:",
        "log-action-filter-newusers": "Tipo de criação de conta:",
        "log-action-filter-patrol": "Tipo de patrulha:",
        "log-action-filter-protect": "Tipo de proteção:",
        "log-action-filter-suppress": "Tipo de supressão:",
        "log-action-filter-upload": "Tipo de carregamento:",
        "log-action-filter-all": "Todas",
-       "log-action-filter-block-block": "Bloquear",
+       "log-action-filter-block-block": "Bloqueio",
        "log-action-filter-block-reblock": "Alteração de bloqueio",
-       "log-action-filter-block-unblock": "Desbloquear",
-       "log-action-filter-contentmodel-change": "Edição de modelo de conteúdo",
-       "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo desconhecido",
+       "log-action-filter-block-unblock": "Desbloqueio",
+       "log-action-filter-contentmodel-change": "Alteração do modelo de conteúdo",
+       "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo não padronizado",
        "log-action-filter-delete-delete": "Eliminação de página",
+       "log-action-filter-delete-delete_redir": "Sobrescrição de redirecionamento",
        "log-action-filter-delete-restore": "Restauro de página",
        "log-action-filter-delete-event": "Eliminação de registo",
        "log-action-filter-delete-revision": "Eliminação de revisão",
-       "log-action-filter-import-interwiki": "Importação de transwiki",
+       "log-action-filter-import-interwiki": "Importação transwikis",
        "log-action-filter-import-upload": "Importação por carregamento XML",
        "log-action-filter-managetags-create": "Criação de etiqueta",
        "log-action-filter-managetags-delete": "Eliminação de etiqueta",
        "log-action-filter-managetags-activate": "Ativação de etiqueta",
        "log-action-filter-managetags-deactivate": "Desativação de etiqueta",
-       "log-action-filter-move-move": "Mover sem a substituição de páginas de redirecionamento",
-       "log-action-filter-move-move_redir": "Mover com a substituição de páginas de redirecionamento",
+       "log-action-filter-move-move": "Movimentação sem sobrescrever páginas de redirecionamento",
+       "log-action-filter-move-move_redir": "Movimentação sobrescrevendo páginas de redirecionamento",
        "log-action-filter-newusers-create": "Criação por utilizador anónimo",
        "log-action-filter-newusers-create2": "Criação por utilizador registado",
        "log-action-filter-newusers-autocreate": "Criação automática",
        "log-action-filter-protect-protect": "Proteção",
        "log-action-filter-protect-modify": "Alteração da proteção",
        "log-action-filter-protect-unprotect": "Desproteção",
-       "log-action-filter-protect-move_prot": "Proteção de movimentos",
+       "log-action-filter-protect-move_prot": "Proteção de movimentações",
        "log-action-filter-rights-rights": "Alteração manual",
        "log-action-filter-rights-autopromote": "Alteração automática",
        "log-action-filter-suppress-event": "Supressão de registo",
        "log-action-filter-suppress-block": "Supressão de utilizadores por bloqueio",
        "log-action-filter-suppress-reblock": "Supressão de utilizador por rebloqueio",
        "log-action-filter-upload-upload": "Novo carregamento",
-       "log-action-filter-upload-overwrite": "Recarregar",
+       "log-action-filter-upload-overwrite": "Recarregamento",
        "authmanager-authn-not-in-progress": "A autenticação não está em curso ou os dados da sessão foram perdidos. Comece novamente desde o princípio, por favor.",
        "authmanager-authn-no-primary": "As informações de identificação fornecidas não podem ser autenticadas.",
        "authmanager-authn-no-local-user": "As credenciais fornecidas não estão associadas a nenhum utilizador nesta wiki.",
        "usercssispublic": "Nota: As subpáginas de CSS não devem conter dados confidenciais porque podem ser vistas por outros utilizadores.",
        "restrictionsfield-badip": "Endereço IP (ou gama de endereços IP) inválido: $1",
        "restrictionsfield-label": "Gamas de endereços IP permitidas:",
-       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Erro: $1",
-       "edit-error-long": "Erros:\n\n$1"
+       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse: <pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revisão $1",
+       "pageid": "identificador de página $1"
 }
index e1b6c9b..7665f80 100644 (file)
                        "Ата",
                        "Matěj Suchánek",
                        "Chaduvari",
-                       "MarcoAurelio"
+                       "MarcoAurelio",
+                       "Joao Xavier",
+                       "Winstonyin"
                ]
        },
        "sidebar": "{{notranslate}}",
        "october-gen": "{{doc-months|10|genitive}}\n{{Identical|October}}",
        "november-gen": "{{doc-months|11|genitive}}\n{{Identical|November}}",
        "december-gen": "{{doc-months|12|genitive}}\n{{Identical|December}}",
-       "jan": "{{doc-months|1|short}}",
-       "feb": "{{doc-months|2|short}}",
-       "mar": "{{doc-months|3|short}}",
-       "apr": "{{doc-months|4|short}}",
-       "may": "{{doc-months|5|short}}",
-       "jun": "{{doc-months|6|short}}",
-       "jul": "{{doc-months|7|short}}",
-       "aug": "{{doc-months|8|short}}",
-       "sep": "{{doc-months|9|short}}",
-       "oct": "{{doc-months|10|short}}",
-       "nov": "{{doc-months|11|short}}",
-       "dec": "{{doc-months|12|short}}",
+       "jan": "{{doc-months|1|short}}\n{{Identical|January}}",
+       "feb": "{{doc-months|2|short}}\n{{Identical|February}}",
+       "mar": "{{doc-months|3|short}}\n{{Identical|March}}",
+       "apr": "{{doc-months|4|short}}\n{{Identical|April}}",
+       "may": "{{doc-months|5|short}}\n{{Identical|May}}",
+       "jun": "{{doc-months|6|short}}\n{{Identical|June}}",
+       "jul": "{{doc-months|7|short}}\n{{Identical|July}}",
+       "aug": "{{doc-months|8|short}}\n{{Identical|August}}",
+       "sep": "{{doc-months|9|short}}\n{{Identical|September}}",
+       "oct": "{{doc-months|10|short}}\n{{Identical|October}}",
+       "nov": "{{doc-months|11|short}}\n{{Identical|November}}",
+       "dec": "{{doc-months|12|short}}\n{{Identical|December}}",
        "january-date": "A date in the Gregorian month of January. $1 is the numerical date, for example \"23\".\n{{Identical|January}}",
        "february-date": "A date in the Gregorian month of February. $1 is the numerical date, for example \"23\".\n{{Identical|February}}",
        "march-date": "A date in the Gregorian month of March. $1 is the numerical date, for example \"23\".\n{{Identical|March}}",
-       "april-date": "A date in the Gregorian month of April. $1 is the numerical date, for example \"23\".",
+       "april-date": "A date in the Gregorian month of April. $1 is the numerical date, for example \"23\".\n{{Identical|April}}",
        "may-date": "A date in the Gregorian month of May. $1 is the numerical date, for example \"23\". The month name is not abbreviated.\n{{Identical|May}}",
-       "june-date": "A date in the Gregorian month of June. $1 is the numerical date, for example \"23\".",
-       "july-date": "A date in the Gregorian month of July. $1 is the numerical date, for example \"23\".",
-       "august-date": "A date in the Gregorian month of August. $1 is the numerical date, for example \"23\".",
-       "september-date": "A date in the Gregorian month of September. $1 is the numerical date, for example \"23\".",
-       "october-date": "A date in the Gregorian month of October. $1 is the numerical date, for example \"23\".",
+       "june-date": "A date in the Gregorian month of June. $1 is the numerical date, for example \"23\".\n{{Identical|June}}",
+       "july-date": "A date in the Gregorian month of July. $1 is the numerical date, for example \"23\".\n{{Identical|July}}",
+       "august-date": "A date in the Gregorian month of August. $1 is the numerical date, for example \"23\".\n{{Identical|August}}",
+       "september-date": "A date in the Gregorian month of September. $1 is the numerical date, for example \"23\".\n{{Identical|September}}",
+       "october-date": "A date in the Gregorian month of October. $1 is the numerical date, for example \"23\".\n{{Identical|October}}",
        "november-date": "A date in the Gregorian month of November. $1 is the numerical date, for example \"23\".\n{{Identical|November}}",
-       "december-date": "A date in the Gregorian month of December. $1 is the numerical date, for example \"23\".",
+       "december-date": "A date in the Gregorian month of December. $1 is the numerical date, for example \"23\".\n{{Identical|December}}",
        "period-am": "Text indicating the first period of the day when using a 12-hour calendar.",
        "period-pm": "Text indicating the second period of the day when using a 12-hour calendar.",
        "pagecategories": "Used in the categories section of pages.\n\nFollowed by a colon and a list of categories.\n\nParameters:\n* $1 - number of categories\n{{Identical|Category}}",
        "searcharticle": "Button description in the search menu displayed on every page. The \"Search\" button is {{msg-mw|Searchbutton}}.\n{{Identical|Go}}",
        "history": "{{Identical|Page history}}",
        "history_short": "Text used on the history tab.\n\n{{Identical|History}}",
+       "history_small": "Uncapitalized version of {{msg-mw|History short}}.\n\n{{Identical|History}}",
        "updatedmarker": "Displayed in the page history (of a page you are [[Special:Watchlist|watching]]), when the page has been edited since the last time you visited it. This feature is used if [[mw:Manual:$wgShowUpdatedMarker|$wgShowUpdatedMarker]] is enabled.",
        "printableversion": "Display name for link in wiki menu that leads to a printable version of a content page. Example: see one but last menu item on [[Main Page]].\n\nSee also:\n* {{msg-mw|Printableversion}}\n* {{msg-mw|Accesskey-t-print}}\n* {{msg-mw|Tooltip-t-print}}\n{{Identical|Printable version}}",
        "permalink": "Display name for a permanent link to the current revision of a page. When the page is edited, permalink will still link to this revision. Example: Last menu link on [[{{MediaWiki:Mainpage}}]]\n\nSee also:\n* {{msg-mw|Permalink}}\n* {{msg-mw|Accesskey-t-permalink}}\n* {{msg-mw|Tooltip-t-permalink}}\n{{Identical|Permalink}}",
        "talk": "Used as display name for the tab to all {{msg-mw|Talk}} pages. These pages accompany all content pages and can be used for discussing the content page. Example: [[Talk:Example]].\n\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}\n{{Identical|Discussion}}",
        "views": "Subtitle for the list of available views, for the current page. In \"monobook\" skin the list of views are shown as tabs, so this sub-title is not shown. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].\n\n'''Note:''' This is \"views\" as in \"appearances\"/\"representations\", '''not''' as in \"visits\"/\"accesses\".\n{{Identical|View}}",
        "toolbox": "The title of the toolbox below the search menu.\n{{Identical|Tool}}",
-       "tool-link-userrights": "Link to [[Special:UserRights]] (user rights management) in the sidebar toolbox.\n\nParameters:\n* $1 - Name of user for the user group management (usable for GENDER)",
+       "tool-link-userrights": "Link to [[Special:UserRights]] (user rights management) in the sidebar toolbox, shown if the current user is allowed to change given user's groups.\n\nParameters:\n* $1 - Name of user for the user group management (usable for GENDER)",
+       "tool-link-userrights-readonly": "Link to [[Special:UserRights]] (user rights management) in the sidebar toolbox, shown if the current user is '''not''' allowed to change given user's groups.\n\nParameters:\n* $1 - Name of user for the user group management (usable for GENDER)",
        "tool-link-emailuser": "Link to [[Special:EmailUser]] (email user tool) in the sidebar toolbox.\n\nParameters:\n* $1 - Name of user who would receive the email\n\nSee also:\n* {{msg-mw|Emailuser-title-target}}",
        "userpage": "Used in user talk pages as the text of the link to the user page, with the Cologne Blue skin.",
        "projectpage": "Used as link text in Talk page of project page with the Cologne Blue skin.",
        "passwordreset-emaildisabled": "Used as error message in changing password when site's email feature is disabled.",
        "passwordreset-username": "{{Identical|Username}}",
        "passwordreset-domain": "A domain like used in Domain Name System (DNS) or more specifically like a domain component in the Lightweight Directory Access Protocol (LDAP).\n{{Identical|Domain}}",
-       "passwordreset-capture": "Label for checkbox asking the user whether they want to see the contents of the password reset email (only shown if they have the <code>passwordreset</code> permission).",
-       "passwordreset-capture-help": "Longer explanatory message for the capture checkbox label.",
        "passwordreset-email": "{{Identical|E-mail address}}",
        "passwordreset-emailtitle": "Used as subject (title) of email.",
        "passwordreset-emailtext-ip": "Be consistent with {{msg-mw|Passwordreset-emailtext-user}}.\n\nParameters:\n* $1 - an IP address\n* $2 - message {{msg-mw|Passwordreset-emailelement}} repeated $3 times\n* $3 - the number of repetitions in $2\n* $4 - base URL of the wiki\n* $5 - number of days",
        "passwordreset-emailelement": "This is a body of a password reset email to allow them into the system with a new password. Parameters:\n* $1 - the user's login name. This parameter can be used for GENDER.\n* $2 - the temporary password given by the system",
        "passwordreset-emailsentemail": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailsentusername": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-nocaller": "Shown when a password reset was requested but the process failed due to an internal error related to missing details about the origin (caller) of the password reset request.",
        "passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
        "passwordreset-ignored": "Shown when password reset was unsuccessful due to configuration problems.",
        "sig_tip": "This is the text that appears when you hover the mouse over the second key from the right on the edit toolbar.\n{{Identical|Signature with timestamp}}",
        "hr_tip": "This is the text that appears when you hover the mouse over the first button on the right on the edit toolbar.",
        "summary": "The Summary text beside the edit summary field\n\nSee also:\n* {{msg-mw|Subject}}\nSee also:\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}\n{{Identical|Summary}}",
-       "subject": "Used as label for input box in the EditPage page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
+       "subject": "Used as label for the section title input box when adding a new section on a talk page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
        "minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "watchthis": "Text of checkbox above {{msg-mw|Showpreview}} button in editor.\n\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}\n{{Identical|Watch this page}}",
        "savearticle": "Text on the button to create a new page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savechanges}} for the label for the button when the page is being modified.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save page}}",
        "missingcommenttext": "This message is shown, when the textbox by a new-section is empty.",
        "missingcommentheader": "Edit summary that is shown if you enable \"Prompt me when entering a blank summary\" and add a new section without headline to a talk page.\n\n\"Subject\" is {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Missingsummary}}\n* {{msg-mw|Savearticle}}",
        "summary-preview": "Preview of the edit summary, shown under the edit summary itself.\nShould match: {{msg-mw|summary}}.",
-       "subject-preview": "Should match {{msg-mw|subject}}",
+       "subject-preview": "Used as label for preview of the section title when adding a new section on a talk page.\n\nShould match {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Summary-preview}}\n\n{{Identical|Subject}}",
        "previewerrortext": "When a user has the editing preference LivePreview enabled, clicked the Preview or Show Changes button in the edit page and the action did not succeed.",
-       "blockedtitle": "Used as title displayed for blocked users. The corresponding message body is one of the following messages:\n* {{msg-mw|Blockedtext|notext=1}}\n* {{msg-mw|Autoblockedtext|notext=1}}",
-       "blockedtext": "Text displayed to blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link)\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Autoblockedtext}}",
-       "autoblockedtext": "Text displayed to automatically blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block (in case of autoblocks: {{msg-mw|autoblocker}})\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link). Use it for GENDER.\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}",
+       "blockedtitle": "Used as title displayed for blocked users. The corresponding message body is one of the following messages:\n* {{msg-mw|Blockedtext|notext=1}}\n* {{msg-mw|Autoblockedtext|notext=1}}\n* {{msg-mw|Systemblockedtext}}",
+       "blockedtext": "Text displayed to blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link)\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Autoblockedtext}}\n* {{msg-mw|Systemblockedtext}}",
+       "autoblockedtext": "Text displayed to automatically blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block (in case of autoblocks: {{msg-mw|autoblocker}})\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link). Use it for GENDER.\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}\n* {{msg-mw|Systemblockedtext}}",
+       "systemblockedtext": "Text displayed to requests blocked by MediaWiki configuration.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - (Unused) A dummy user attributed as the blocker, possibly as a link to a user page.\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the dummy blocking user's username (plain text, without the link).\n* $5 - A short string indicating the type of system block.\n* $6 - the expiry of the block\n* $7 - the intended target of the block\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}\n* {{msg-mw|Autoblockedtext}}",
        "blockednoreason": "Substituted with <code>$2</code> in the following message if the reason is not given:\n* {{msg-mw|cantcreateaccount-text}}.\n{{Identical|No reason given}}",
        "whitelistedittext": "Used as error message. Parameters:\n* $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description\nSee also:\n* {{msg-mw|Nocreatetext}}\n* {{msg-mw|Uploadnologintext}}\n* {{msg-mw|Loginreqpagetext}}",
        "confirmedittext": "Used as error message.",
        "permissionserrorstext-withaction": "This message is \"with action\" version of {{msg-mw|Permissionserrorstext}}.\n\nParameters:\n* $1 - the number of reasons that were found why the action cannot be performed\n* $2 - one of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.",
        "contentmodelediterror": "Error message shown when trying to edit an old revision with a content model different from that of the current revision\n* $1 - content model of the old revision\n* $2 - content model of the current revision",
        "recreate-moveddeleted-warn": "Warning shown when creating a page which has already been deleted. See for example [[Test]].",
-       "moveddeleted-notice": "Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
-       "moveddeleted-notice-recent": "Shown on top of a recently deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
+       "moveddeleted-notice": "Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).\n\nSee also {{msg-mw|moveddeleted-notice-recent}}",
+       "moveddeleted-notice-recent": "Shown on top of a recently deleted page in normal view modus ([{{canonicalurl:Test}} example]).\n\nSee also {{msg-mw|moveddeleted-notice}}",
        "log-fulllog": "Used as link text.",
        "edit-hook-aborted": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
        "edit-gone-missing": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
        "search-interwiki-default": "Parameters:\n* $1 - the hostname of the remote wiki from where the additional results listed below are returned",
        "search-interwiki-custom": "#REDIRECT [[MediaWiki:Wmf-search-interwiki-custom/qqq]]",
        "search-interwiki-more": "{{Identical|More}}",
+       "search-interwiki-more-results": "Label for a link that leads to more search results from a given wiki.",
        "search-relatedarticle": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
        "searchrelated": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
        "searchall": "{{Identical|All}}",
        "searchdisabled": "{{doc-singularthey}}\nIn this sentence, \"their indexes\" refers to \"Google's indexes\".\n\nShown on [[Special:Search]] when the internal search is disabled.",
        "googlesearch": "{{notranslate}}\nShown when [[mw:Manual:$wgDisableTextSearch|$wgDisableTextSearch]] is set to true and no [[mw:Manual:$wgSearchForwardUrl|$wgSearchForwardUrl]] is set.\n\nParameters:\n* $1 - the search term\n* $2 - \"UTF-8\" (hard-coded)\n* $3 - the message {{msg-mw|Searchbutton}}",
        "search-error": "Shown when an error has occurred when performing a search. Parameters:\n* $1 - the localized error that was returned",
+       "search-warning": "Shown when a warning has occured when performing a search. Parameters:\n* $1 - the localized warning that was returned.",
        "opensearch-desc": "{{ignored}}Link description of the [www.opensearch.org/ OpenSearch] link in the HTML head of pages.",
        "preferences": "Title of the [[Special:Preferences]] page.\n{{Identical|Preferences}}",
        "preferences-summary": "{{doc-specialpagesummary|preferences}}",
        "saveprefs": "Button for saving changes in the preferences page.\n\nSee also:\n* {{msg-mw|Saveprefs}}\n* {{msg-mw|Accesskey-preferences-save}}\n* {{msg-mw|Tooltip-preferences-save}}\n{{Identical|Save}}",
        "restoreprefs": "Used as link text in [[Special:Preferences]]. The link points to [[Special:Preferences/reset]] which shows the \"Restore all default settings\" form.\n\nAlso used as label for the Submit button in [[Special:Preferences/reset]].",
        "prefs-editing": "Title of a tab in [[Special:Preferences]].\nWhen changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.\n{{Identical|Editing}}",
-       "rows": "Used on [[Special:Preferences]], \"Editing\" section in the \"Size of editing window\" fieldset.\n{{Identical|Row}}",
-       "columns": "Used on [[Special:Preferences]], \"Editing\" section in the \"Size of editing window\" fieldset.\n{{Identical|Column}}",
        "searchresultshead": "Replaced by {{msg-mw|prefs-searchoptions}}, though may still be used in some extensions. DEPRECATED.\n\n{{Identical|Search}}",
        "stub-threshold": "Used in [[Special:Preferences]], \"Advanced options\" section. The setting allows the user to select a threshold value, in bytes, from a predefined list of options. Any links that lead to pages smaller than the threshold (\"stub links\") will be styled differently.\n\nParameters:\n* $1: the text of {{msg-mw|stub-threshold-sample-link}}, styled as a stub link",
        "stub-threshold-sample-link": "Passed as a parameter to the {{msg-mw|stub-threshold}} message.\n{{Identical|Sample}}",
        "prefs-help-recentchangescount": "Used in [[Special:Preferences]], tab \"Recent changes\".",
        "prefs-help-watchlist-token2": "Used in [[Special:Preferences]], tab Watchlist. (Formerly in {{msg-mw|prefs-help-watchlist-token}}.)",
        "savedprefs": "This message appears after saving changes to your user preferences.",
-       "savedrights": "This message appears after saving the user rights on [[Special:UserRights]].\n* $1 - The user name of the user which rights was saved.",
+       "savedrights": "This message appears after saving the user groups on [[Special:UserRights]].\n* $1 - The user name of the user which groups was saved.",
        "timezonelegend": "{{Identical|Time zone}}",
        "localtime": "Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].",
        "timezoneuseserverdefault": "[[Special:Preferences]] > Date and time > Time zone\n\nThis option lets your time zone setting use the one that is used on the wiki (often UTC).\n\nParameters:\n* $1 - timezone name, or timezone offset (in \"%+03d:%02d\" format)",
        "username": "Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).\n\n{{Identical|Username}}",
        "prefs-memberingroups": "This message is shown on [[Special:Preferences]], first tab.\n\nParameters:\n* $1 - number of user groups\n* $2 - the username for GENDER\nSee also:\n* {{msg-mw|Prefs-memberingroups-type}}",
        "prefs-memberingroups-type": "{{optional}}\nParameters:\n* $1 - list of group names\n* $2 - list of group member names. Label for these is {{msg-mw|Prefs-memberingroups}}",
+       "group-membership-link-with-expiry": "Used as part of a list of user groups, to show the time and date when a user's membership of a group expires. That is, they are a member of that group \"until\" the specified date and time.\n\nParameters:\n* $1 - group name\n* $2 - time and date of expiry\n* $3 - date of expiry\n* $4 - time of expiry",
        "prefs-registration": "Used in [[Special:Preferences]].",
        "prefs-registration-date-time": "{{optional}}\nUsed in [[Special:Preferences]]. Parameters are:\n* $1 date and time of registration\n* $2 date of registration\n* $3 time of registration",
        "yourrealname": "Used in [[Special:Preferences]], first tab.\n{{Identical|Real name}}",
        "userrights-summary": "{{doc-specialpagesummary|userrights}}",
        "userrights-lookup-user": "Label text when managing user rights ([[Special:UserRights]])",
        "userrights-user-editname": "Displayed on [[Special:UserRights]].",
-       "editusergroup": "Button name, in page [[Special:Userrights]] (only available to administrators), in the section named {{MediaWiki:userrights-lookup-user}}.\n\n{{Identical|Edit user groups}}.\nParameters:\n* $1 - username, for GENDER support",
-       "editinguser": "Appears on [[Special:UserRights]]. Parameters:\n* $1 - a plaintext username\n* $2 - user tool links. e.g. \"(Talk | contribs | block | send email)\"",
-       "userrights-editusergroup": "Parameter:\n* $1 - (Optional) a username, can be used for GENDER\n{{Identical|Edit user groups}}",
+       "editusergroup": "Button name, in page [[Special:Userrights]], in the section named {{MediaWiki:userrights-lookup-user}}. The username or gender of the user is not known when this message is displayed.",
+       "editinguser": "Appears on [[Special:UserRights]]. Parameters:\n* $1 - a plaintext username\n* $2 - user tool links. e.g. \"(Talk | contribs | block | send email)\"\n\nRelated messages:\n* {{msg-mw|viewinguserrights}}",
+       "viewinguserrights": "Appears on [[Special:UserRights]]. Parameters:\n* $1 - a plaintext username\n* $2 - user tool links. e.g. \"(Talk | contribs | block | send email)\"\n\nRelated messages:\n* {{msg-mw|editinguser}}",
+       "userrights-editusergroup": "Parameter:\n* $1 - (Optional) a username, can be used for GENDER\n\nRelated messages:\n* {{msg-mw|userrights-viewusergroup}}",
+       "userrights-viewusergroup": "Parameter:\n* $1 - (Optional) a username, can be used for GENDER\n\nRelated messages:\n* {{msg-mw|userrights-editusergroup}}",
        "saveusergroups": "Button text when editing user groups.\nParameters:\n* $1 - username, for GENDER support",
        "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-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",
-       "userrights-nologin": "Error displayed on [[Special:UserRights]] when you aren't logged in.\n\nIf you are logged in, but don't have the correct permission, you see {{msg-mw|Userrights-notallowed}}.",
-       "userrights-notallowed": "Error displayed on [[Special:UserRights]] when you don't have the permission.",
        "userrights-changeable-col": "Used when editing user groups in [[Special:Userrights]].\n\nThe message is the head of a column of group assignments.\n\nParameters:\n* $1 - (Optional) for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language can do without.",
        "userrights-unchangeable-col": "Used when editing user groups in [[Special:Userrights]]. The message is the head of a column of group assignments.\n\nParameters:\n* $1 - (Optional) for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language allows that.",
        "userrights-irreversible-marker": "{{optional}}\nParameters:\n* $1 - group member",
+       "userrights-no-shorten-expiry-marker": "{{optional}}\nParameters:\n* $1 - group member",
+       "userrights-expiry-current": "Indicates when a user's membership of a user group expires.\n\nParameters:\n* $1 - time and date of expiry\n* $2 - date of expiry\n* $3 - time of expiry\n{{Identical|Expire}}",
+       "userrights-expiry-none": "Indicates that a user's membership of a user group lasts indefinitely, and does not expire.",
+       "userrights-expiry": "Used as a label for a form element which can be used to select an expiry date/time.\n{{Identical|Expire}}",
+       "userrights-expiry-existing": "Shows the existing expiry time in the drop down menu underneath the individual user right on Special:UserRights.\n\nParameters:\n* $1 - Date and time of the existing expiry\n* $2 - date of the existing expiry\n* $3 - time of the existing expiry\n\nSee also:\n* {{msg-mw|protect-existing-expiry}}",
+       "userrights-expiry-othertime": "{{Identical|Other time}}",
+       "userrights-expiry-options": "{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}\nOptions for the duration of the user group membership. Example: See e.g. [[MediaWiki:Userrights-expiry-options/nl]] if you still don't know how to do it.\n\nSee also {{msg-mw|protect-expiry-options}}.",
+       "userrights-invalid-expiry": "Error message on [[Special:UserRights]].\n\nParameters:\n* $1 - group name",
+       "userrights-expiry-in-past": "Error message on [[Special:UserRights]] when the user types an expiry date that has already passed.\n\nParameters:\n* $1 - group name",
+       "userrights-cannot-shorten-expiry": "Error message on [[Special:UserRights]] when the user tries to move the expiry date to be closer to the present and they do not have permission to do so. \"Bring forward\" is a phrasal verb meaning \"move to an earlier time\".\n\nParameters:\n* $1 - group name",
        "userrights-conflict": "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
-       "userrights-removed-self": "Shown on [[Special:UserRights]] in a green box after the user removed its own rights to access that page.",
        "group": "{{Identical|Group}}",
        "group-user": "{{doc-group|user}}\n{{Identical|User}}",
        "group-autoconfirmed": "{{doc-group|autoconfirmed}}\nOn Wikimedia sites autoconfirmed users are users which are older than 4 days. After those 4 days, they have more rights.",
        "right-reupload": "{{doc-right|reupload}}\nThe right to upload a file under a file name that already exists.\n\nRelated messages:\n* {{msg-mw|right-upload}}\n* {{msg-mw|right-reupload-own}}\n* {{msg-mw|right-reupload-shared}}",
        "right-reupload-own": "{{doc-right|reupload-own}}\nRight to upload a file under a file name that already exists, and that the same user has uploaded.\n\nRelated messages:\n* {{msg-mw|right-upload}}\n* {{msg-mw|right-reupload}}",
        "right-reupload-shared": "{{doc-right|reupload-shared}}\nThe right to upload a file locally under a file name that already exists in a shared database (for example Commons).\n\nRelated messages:\n* {{msg-mw|right-upload}}\n* {{msg-mw|right-reupload}}",
-       "right-upload_by_url": "{{doc-right|upload by url}}",
+       "right-upload_by_url": "{{doc-right|upload_by_url}}",
        "right-purge": "{{doc-right|purge}}\nThe right to use <code>&action=purge</code> in the URL, without needing to confirm it (by default, anonymous users need to confirm it).",
        "right-autoconfirmed": "{{doc-right|autoconfirmed}}\nIf your account is older than [[mw:Manual:$wgAutoConfirmAge|wgAutoConfirmAge]] and if you have at least [[mw:Manual:$wgAutoConfirmCount|$wgAutoConfirmCount]] edits, you are in the '''group \"autoconfirmed\"''' (note that you can't see this group at [[Special:ListUsers]]).\nIf you are in that group, you have (by default) the '''right \"autoconfirmed\"''', which exempts you from certain rate limits (those based on your IP address or otherwise intended solely for new users). Other rate limits may still apply; see {{msg-mw|right-noratelimit}}.",
        "right-bot": "{{doc-right|bot}}",
        "right-siteadmin": "{{doc-right|siteadmin}}",
        "right-override-export-depth": "{{doc-right|override-export-depth}}",
        "right-sendemail": "{{doc-right|sendemail}}",
-       "right-passwordreset": "{{doc-right|passwordreset}}",
        "right-managechangetags": "{{doc-right|managechangetags}}",
        "right-applychangetags": "{{doc-right|applychangetags}}",
        "right-changetags": "{{doc-right|changetags}}",
        "grant-group-private-information": "{{Related|Grant-group}}",
        "grant-group-other": "{{Related|Grant-group}}",
        "grant-blockusers": "Name for grant \"blockusers\".\n{{Related|Grant}}",
-       "grant-createaccount": "Name for grant \"createaccount\".\n{{Related|Grant}}",
+       "grant-createaccount": "Name for grant \"createaccount\".\n{{Related|Grant}}\n{{Identical|Create account}}",
        "grant-createeditmovepage": "Name for grant \"createeditmovepage\".\n{{Related|Grant}}",
        "grant-delete": "Name for grant \"delete\".\n{{Related|Grant}}",
        "grant-editinterface": "Name for grant \"editinterface\".\n\n\"JS\" stands for \"JavaScript\".\n{{Related|Grant}}",
        "action-upload": "{{Doc-action|upload}}",
        "action-reupload": "{{Doc-action|reupload}}",
        "action-reupload-shared": "{{Doc-action|reupload-shared}}",
-       "action-upload_by_url": "{{Doc-action|upload by url}}",
+       "action-upload_by_url": "{{Doc-action|upload_by_url}}",
        "action-writeapi": "{{Doc-action|writeapi}}\n\nAPI is an abbreviation for [[w:API|application programming interface]].",
        "action-delete": "{{Doc-action|delete}}",
        "action-deleterevision": "{{Doc-action|deleterevision}}",
+       "action-deletelogentry": "{{Doc-action|deletelogentry}}",
        "action-deletedhistory": "{{Doc-action|deletedhistory}}",
+       "action-deletedtext": "{{Doc-action|deletedtext}}",
        "action-browsearchive": "{{Doc-action|browsearchive}}",
        "action-undelete": "{{Doc-action|undelete}}",
        "action-suppressrevision": "{{Doc-action|suppressrevision}}",
        "action-userrights-interwiki": "{{Doc-action|userrights-interwiki}}",
        "action-siteadmin": "{{Doc-action|siteadmin}}",
        "action-sendemail": "{{doc-action|sendemail}}\n{{Identical|E-mail}}",
+       "action-editmyoptions": "{{Doc-action|editmyoptions}}",
        "action-editmywatchlist": "{{doc-action|editmywatchlist}}\n{{Identical|Edit your watchlist}}",
        "action-viewmywatchlist": "{{doc-action|viewmywatchlist}}\n{{Identical|View your watchlist}}",
        "action-viewmyprivateinfo": "{{doc-action|viewmyprivateinfo}}",
        "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-unpatrolled}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
        "recentchanges-submit": "Label for submit button in [[Special:RecentChanges]]\n{{Identical|Show}}",
+       "rcfilters-activefilters": "Title for the filters selection showing the active filters.",
+       "rcfilters-restore-default-filters": "Label for the button that resets filters to defaults",
+       "rcfilters-clear-all-filters": "Title for the button that clears all filters",
+       "rcfilters-search-placeholder": "Placeholder for the filter search input.",
+       "rcfilters-invalid-filter": "A label for an invalid filter.",
+       "rcfilters-empty-filter": "Placeholder for the filter list when no filters were chosen.",
+       "rcfilters-filterlist-title": "Title for the filters list.\n{{Identical|Filter}}",
+       "rcfilters-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-filterlist-noresults": "Message showing no results found for searching a filter.",
+       "rcfilters-filtergroup-registration": "Title for the filter group for editor registration type.",
+       "rcfilters-filter-registered-label": "Label for the filter for showing edits made by logged-in users.\n{{Identical|Registered}}",
+       "rcfilters-filter-registered-description": "Description for the filter for showing edits made by logged-in users.",
+       "rcfilters-filter-unregistered-label": "Label for the filter for showing edits made by logged-out users.",
+       "rcfilters-filter-unregistered-description": " Description for the filter for showing edits made by logged-out users.",
+       "rcfilters-filtergroup-authorship": "Title for the filter group for edit authorship. This filter group allows the user to choose between \"Your own edits\" and \"Edits by others\". More info: https://phabricator.wikimedia.org/T149859\n\n{{doc-important|This is another typical example of ambiguity in the English language. Only the documentation will reveal that this message means \"(filter by) authorship of these edits\", not \"edit the authorship\". That is, \"edit\" is a modifying noun, not a verb.}}",
+       "rcfilters-filter-editsbyself-label": "Label for the filter for showing edits made by the current user.",
+       "rcfilters-filter-editsbyself-description": "Description for the filter for showing edits made by the current user.",
+       "rcfilters-filter-editsbyother-label": "Label for the filter for showing edits made by anyone other than the current user.",
+       "rcfilters-filter-editsbyother-description": "Description for the filter for showing edits made by anyone other than the current user.",
+       "rcfilters-filtergroup-userExpLevel": "Title for the filter group for user experience levels.",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Label for the filter for showing edits made by new editors.",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Description for the filter for showing edits made by new editors.",
+       "rcfilters-filter-userExpLevel-learner-label": "Label for the filter for showing edits made by learning editors.",
+       "rcfilters-filter-userExpLevel-learner-description": "Description for the filter for showing edits made by learning editors.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Label for the filter for showing edits made by experienced editors.",
+       "rcfilters-filter-userExpLevel-experienced-description": "Description for the filter for showing edits made by experienced editors.",
+       "rcfilters-filtergroup-automated": "Title for the filter group for editor automation type.",
+       "rcfilters-filter-bots-label": "Label for the filter for showing edits made by automated tools.\n{{Identical|Bot}}",
+       "rcfilters-filter-bots-description": "Description for the filter for showing edits made by automated tools.",
+       "rcfilters-filter-humans-label": "Label for the filter for showing edits made by human editors.",
+       "rcfilters-filter-humans-description": "Description for the filter for showing edits made by human editors.",
+       "rcfilters-filtergroup-significance": "Title for the filter group for edit significance.\n{{Identical|Significance}}",
+       "rcfilters-filter-minor-label": "Label for the filter for showing edits marked as minor.",
+       "rcfilters-filter-minor-description": "Description for the filter for showing edits marked as minor.",
+       "rcfilters-filter-major-label": "Label for the filter for showing edits not marked as minor.",
+       "rcfilters-filter-major-description": " Description for the filter for showing edits not marked as minor.",
+       "rcfilters-filtergroup-changetype": "Title for the filter group for edit type.",
+       "rcfilters-filter-pageedits-label": "Label for the filter for showing edits to existing pages.",
+       "rcfilters-filter-pageedits-description": "Description for the filter for showing edits to existing pages.",
+       "rcfilters-filter-newpages-label": "Label for the filter for showing edits that create a page.",
+       "rcfilters-filter-newpages-description": "Description for the filter for showing edits that create a page.",
+       "rcfilters-filter-categorization-label": "Label for the filter for showing edits adding or removing pages to categories.",
+       "rcfilters-filter-categorization-description": "Description for the filter for showing edits adding or removing pages to categories.",
+       "rcfilters-filter-logactions-label": "Label for the filter for showing logged actions.",
+       "rcfilters-filter-logactions-description": "Description for the filter for showing logged actions.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "upload-form-label-own-work-message-generic-foreign": "Message shown by default when a user affirms that they are allowed to upload a file to a remote wiki.",
        "upload-form-label-not-own-work-message-generic-foreign": "Message shown by default when a user cannot upload a file to a remote wiki.",
        "upload-form-label-not-own-work-local-generic-foreign": "Suggests uploading a file locally instead of to a remote wiki.",
-       "backend-fail-stream": "Parameters:\n* $1 - a filename",
-       "backend-fail-backup": "Parameters:\n* $1 - a filename",
-       "backend-fail-notexists": "Parameters:\n* $1 - a filename",
-       "backend-fail-hashes": "Definition of \"[[w:en:Hash_function|hashes]]\".",
-       "backend-fail-notsame": "Parametreler:\n* $1 bir dosya ismi.",
-       "backend-fail-invalidpath": "Parameters:\n* $1 - a storage path",
-       "backend-fail-delete": "Parameters:\n* $1 - a file path",
-       "backend-fail-describe": "Parameters:\n* $1 - a file path",
-       "backend-fail-alreadyexists": "Parameters:\n* $1 - a filename",
-       "backend-fail-store": "Parameters:\n* $1 - a filename\n* $2 - a storage path",
-       "backend-fail-copy": "Parameters:\n* $1 - a file path\n* $2 - a file path",
-       "backend-fail-move": "Parameters:\n* $1 - a file path\n* $2 - a file path",
+       "backend-fail-stream": "Parameters:\n* $1 - a filename\n{{Related|Backend-fail}}",
+       "backend-fail-backup": "Parameters:\n* $1 - a filename\n{{Related|Backend-fail}}",
+       "backend-fail-notexists": "Parameters:\n* $1 - a filename\n{{Related|Backend-fail}}",
+       "backend-fail-hashes": "Definition of \"[[w:en:Hash_function|hashes]]\".\n{{Related|Backend-fail}}",
+       "backend-fail-notsame": "Parameters:\n* $1 is a filename.\n{{Related|Backend-fail}}",
+       "backend-fail-invalidpath": "Parameters:\n* $1 - a storage path\n{{Related|Backend-fail}}",
+       "backend-fail-delete": "Parameters:\n* $1 - a file path\n{{Related|Backend-fail}}",
+       "backend-fail-describe": "Parameters:\n* $1 - a file path\n{{Related|Backend-fail}}",
+       "backend-fail-alreadyexists": "Parameters:\n* $1 - a filename\n{{Related|Backend-fail}}",
+       "backend-fail-store": "Parameters:\n* $1 - a filename\n* $2 - a storage path\n{{Related|Backend-fail}}",
+       "backend-fail-copy": "Parameters:\n* $1 - a file path\n* $2 - a file path\n{{Related|Backend-fail}}",
+       "backend-fail-move": "Parameters:\n* $1 - a file path\n* $2 - a file path\n{{Related|Backend-fail}}",
        "backend-fail-opentemp": "Used as error message.\n{{Related|Backend-fail}}",
        "backend-fail-writetemp": "Used as error message.\n{{Related|Backend-fail}}",
        "backend-fail-closetemp": "Used as error message.\n{{Related|Backend-fail}}",
        "backend-fail-read": "Used as error message. Parameters:\n* $1 - filename\n{{Related|Backend-fail}}",
-       "backend-fail-create": "Parameters:\n* $1 - a filename",
-       "backend-fail-maxsize": "Parameters:\n* $1 - destination storage path\n* $2 - max file size (in bytes)",
-       "backend-fail-readonly": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.\n\nParameters:\n* $1 - name\n* $2 - reason for being read-only",
-       "backend-fail-synced": "Used as fatal error message.\n\nParameters:\n* $1 - file path\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
-       "backend-fail-connect": "Used as fatal error message. Parameters:\n* $1 - backend name\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
-       "backend-fail-internal": "Used as fatal error message. Parameters:\n* $1 - backend name\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
-       "backend-fail-contenttype": "Used as fatal error message. Parameters:\n* $1 - a storage (file) path",
-       "backend-fail-batchsize": "Error message when the limit of operations to be done at once in the file backend was reached.\nParameters:\n* $1 - the number of operations attempted at once in this case\n* $2 - the maximum number of operations that can be attempted at once\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
-       "backend-fail-usable": "Parameters:\n* $1 - the file name, including the path, formatted for the storage backend used",
+       "backend-fail-create": "Parameters:\n* $1 - a filename\n{{Related|Backend-fail}}",
+       "backend-fail-maxsize": "Parameters:\n* $1 - destination storage path\n* $2 - max file size (in bytes)\n{{Related|Backend-fail}}",
+       "backend-fail-readonly": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.\n\nParameters:\n* $1 - name\n* $2 - reason for being read-only\n{{Related|Backend-fail}}",
+       "backend-fail-synced": "Used as fatal error message.\n\nParameters:\n* $1 - file path\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.\n{{Related|Backend-fail}}",
+       "backend-fail-connect": "Used as fatal error message. Parameters:\n* $1 - backend name\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.\n{{Related|Backend-fail}}",
+       "backend-fail-internal": "Used as fatal error message. Parameters:\n* $1 - backend name\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.\n{{Related|Backend-fail}}",
+       "backend-fail-contenttype": "Used as fatal error message. Parameters:\n* $1 - a storage (file) path\n{{Related|Backend-fail}}",
+       "backend-fail-batchsize": "Error message when the limit of operations to be done at once in the file backend was reached.\nParameters:\n* $1 - the number of operations attempted at once in this case\n* $2 - the maximum number of operations that can be attempted at once\nBoth parameters are PLURAL supported\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.\n{{Related|Backend-fail}}",
+       "backend-fail-usable": "Parameters:\n* $1 - the file name, including the path, formatted for the storage backend used\n{{Related|Backend-fail}}",
        "filejournal-fail-dbconnect": "Parameters:\n* $1 is the name of the \"[[:wikipedia:Front and back ends|backend]]\" that the file journal logs changes for.",
        "filejournal-fail-dbquery": "Parameters:\n* $1 is the name of the \"[[:wikipedia:Front and back ends|backend]]\" that the file journal logs changes for.",
        "lockmanager-notlocked": "Parameters:\n* $1 is a resource path (e.g. \"mwstore://media-public/a/ab/file.jpg\").",
        "uncategorizedimages-summary": "{{notranslate}}\nused in [[Special:Uncategorizedimages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "uncategorizedtemplates": "{{doc-special|UncategorizedTemplates}}",
        "uncategorizedtemplates-summary": "{{doc-specialpagesummary|uncategorizedtemplates}}",
+       "uncategorized-categories-exceptionlist": "{{optional}}\nSystem message used as a list of exceptions for Special:UncategorizedCategories.",
        "unusedcategories": "{{doc-special|UnusedCategories}}",
        "unusedcategories-summary": "{{doc-specialpagesummary|unusedcategories}}",
        "unusedimages": "{{doc-special|UnusedImages}}",
        "apisandbox-sending-request": "JavaScript message displayed while the request is being sent.",
        "apisandbox-loading-results": "JavaScript message displayed while the response is being read.",
        "apisandbox-results-error": "Displayed as an error message from JavaScript when the request failed.\n\nParameters:\n* $1 - Error message",
-       "apisandbox-request-url-label": "Label for the text field displaying the URL used to make this request.",
+       "apisandbox-request-selectformat-label": "Label for the format selector on the results page.",
+       "apisandbox-request-format-url-label": "Label for the menu item to select URL format.\n\nSee also:\n* {{msg-mw|apisandbox-request-selectformat-label}}\n* {{msg-mw|apisandbox-request-url-label}}",
+       "apisandbox-request-url-label": "Label for the text field displaying the URL used to make this request.\n\nSee also:\n* {{msg-mw|apisandbox-request-format-url-label}}",
+       "apisandbox-request-format-json-label": "Label for the menu item to select JSON format.\n\nSee also:\n* {{msg-mw|apisandbox-request-selectformat-label}}\n* {{msg-mw|apisandbox-request-json-label}}",
+       "apisandbox-request-json-label": "Label for text field display the request parameters as JSON.\n\nSee also:\n* {{msg-mw|apisandbox-request-format-json-label}}",
        "apisandbox-request-time": "Label and value for displaying the time taken by the request.\n\nParameters:\n* $1 - Time taken in milliseconds",
        "apisandbox-results-fixtoken": "JavaScript button label",
        "apisandbox-results-fixtoken-fail": "Displayed as an error message from JavaScript when a CSRF token could not be fetched.\n\nParameters:\n* $1 - Token type",
        "apisandbox-continue-clear": "Button text for clearing query continuation parameters.\n{{Identical|Clear}}",
        "apisandbox-continue-help": "Help text for the continue and clear buttons.",
        "apisandbox-param-limit": "Additional documentation text for 'limit'-type parameters.",
+       "apisandbox-multivalue-all-namespaces": "Used as an entry in a multiple-namespace widget to select all available namespaces. Parameters:\n* $1 - API input value meaning \"all namespaces\".",
+       "apisandbox-multivalue-all-values": "Used as an entry in a multiple-value widget to select all available values. Parameters:\n* $1 - API input value meaning \"all values\".",
        "booksources": "{{doc-special|BookSources}}\n\n'''This message shouldn't be changed unless it has serious mistakes.'''\n\nIt's used as the page name of the configuration page of [[Special:BookSources]]. Changing it breaks existing sites using the default version of this message.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-summary": "{{doc-specialpagesummary|booksources}}",
        "booksources-search-legend": "Box heading on [[Special:BookSources|book sources]] special page. The box is for searching for places where a particular book can be bought or viewed.",
        "booksources-search": "Search button in [[Special:BookSources]]\n\n{{Identical|Search}}",
        "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
-       "magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.",
-       "magiclink-tracking-rfc-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-rfc}}",
+       "magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.\n\nSee [https://en.wikipedia.org/wiki/Help:Magic_links#RFC Help:Magic links] for more information on RFC magic links.",
+       "magiclink-tracking-rfc-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-rfc}}",
        "magiclink-tracking-pmid": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use PMID magic links will be added.",
-       "magiclink-tracking-pmid-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-pmid}}",
+       "magiclink-tracking-pmid-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-pmid}}",
        "magiclink-tracking-isbn": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use ISBN magic links will be added.",
-       "magiclink-tracking-isbn-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-isbn}}",
+       "magiclink-tracking-isbn-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-isbn}}",
        "rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
        "pubmedurl": "{{notranslate}}\nParameters:\n* $1 - Pubmed number\nSee also:\n* {{msg-mw|Rfcurl}}",
        "specialloguserlabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions ''performed'' by the specified user.  \"Carried out\" and \"done\" are possible alternatives for \"performed\".",
        "listgrouprights": "The name of the special page [[Special:ListGroupRights]].",
        "listgrouprights-summary": "The description used on [[Special:ListGroupRights]].\n\nRefers to {{msg-mw|Listgrouprights-helppage}}.",
        "listgrouprights-key": "Footer note for the [[Special:ListGroupRights]] page",
-       "listgrouprights-group": "The title of the column in the table, about user groups (like you are in the ''translator'' group).\n\n{{Identical|Group}}",
+       "listgrouprights-group": "The title of the column in the table, about user groups (like you are in the ''translator'' group).\n\n{{Identical|Group}}\n{{Related|Listgrouprights}}",
        "listgrouprights-rights": "The title of the column in the table, about user rights (like you can ''edit'' this page).\n{{Identical|Right}}",
        "listgrouprights-helppage": "The link used on [[Special:ListGroupRights]]. Just translate \"Group rights\", and '''leave the \"Help:\" namespace exactly as it is'''.",
        "listgrouprights-members": "Used on [[Special:ListGroupRights]] and [[Special:Statistics]] as a link to [[Special:ListUsers|Special:ListUsers/\"group\"]], a list of members in that group.",
        "listgrouprights-right-display": "{{optional}}\nParameters:\n* $1 - the text from the \"right-...\" messages, i.e. {{msg-mw|Right-edit}}\n* $2 - the codename of this right",
        "listgrouprights-right-revoked": "{{optional}}\nParameters:\n* $1 - the text from the \"right-...\" messages, i.e. {{msg-mw|Right-edit}}\n* $2 - the codename of this right",
-       "listgrouprights-addgroup": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - an enumeration of group names\n* $2 - the number of group names in $1\nSee also:\n* {{msg-mw|listgrouprights-removegroup}}",
+       "listgrouprights-addgroup": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - an enumeration of group names\n* $2 - the number of group names in $1\nSee also:\n* {{msg-mw|listgrouprights-removegroup}}\n{{Related|Listgrouprights}}",
        "listgrouprights-removegroup": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - an enumeration of group names\n* $2 - the number of group names in $1\nSee also:\n* {{msg-mw|listgrouprights-addgroup}}",
        "listgrouprights-addgroup-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
        "listgrouprights-removegroup-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
-       "listgrouprights-addgroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1",
-       "listgrouprights-removegroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1",
+       "listgrouprights-addgroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1\n{{Related|Listgrouprights}}",
+       "listgrouprights-removegroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1\n{{Related|Listgrouprights}}",
        "listgrouprights-addgroup-self-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
        "listgrouprights-removegroup-self-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
        "listgrouprights-namespaceprotection-header": "Shown on [[Special:ListGroupRights]] as the header for the namespace restrictions table.",
        "listgrants-summary": "Explanatory text shown at the top of the grant/rights mapping table.\n\nRefers to {{msg-mw|Listgrouprights-helppage}}.",
        "listgrants-grant": "Used as table header for the grant/rights mapping table.\n{{Identical|Grant}}",
        "listgrants-rights": "Used as table header for the grant/rights mapping table.\n{{Identical|Right}}",
+       "listgrants-grant-display": "{{optional}}\nUsed to display the code name of a grant next to the grant. Parameters:\n* $1 - the text from the \"grant-...\" messages, i.e. {{msg-mw|Grant-highvolume}}\n* $2 - the codename of this grant",
        "trackingcategories": "[[Special:TrackingCategories]] page implementing list of Tracking categories [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]].\n{{Identical|Tracking category}}",
        "trackingcategories-summary": "Description for [[Special:TrackingCategories]] page [[mw:Help:Tracking categories|tracking category]]",
        "trackingcategories-msg": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the mediawiki message that controls the tracking category in question.\n{{Identical|Tracking category}}",
        "emailccsubject": "Used in [[Special:EmailUser]].\n\nSubject of the carbon-copied email for the sender sent through MediaWiki.\n\nParameters:\n* $1 - target username\n* $2 - email subject",
        "emailsent": "Title of [[Special:EmailUser]] when it says you it sent an email",
        "emailsenttext": "Confirmation page: when you send an email, [[Special:EmailUser]] says you this (Your email has been sent).\n\nParameters:\n* $1 - (Optional) the recipient's username, for local customizations",
-       "emailuserfooter": "This message is appended to every email sent through the \"Email user\" function. Parameters:\n* $1 - username of the sender\n* $2 - username of the recipient",
+       "emailuserfooter": "This message is appended to every email sent through the \"Email user\" function. Parameters:\n* $1 - username of the sender\n* $2 - username of the recipient\n\n{{doc-singularthey}}",
        "usermessage-summary": "This message is used as an edit summary for any message that is posted because of a system event. Translate \"leaving a message\" in the sense of: to give a message to someone; to deliver a message somewhere; to deposit.",
        "usermessage-editor": "The user name for the user that is the editor of system messages. See [{{canonicalurl:Thread:Support/Message_info_please}} discussion on Support].",
        "usermessage-template": "{{optional}}",
        "removedwatchtext": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a content namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext}}\n* {{msg-mw|Removedwatchtext-talk}}",
        "removedwatchtext-talk": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a talk namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext-talk}}\n* {{msg-mw|Removedwatchtext}}",
        "removedwatchtext-short": "Explanation shown when unwatching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Addedwatchtext-short}}.\n* {{msg-mw|Removedwatchtext}}.",
-       "watch": "{{doc-actionlink}}\nName of the Watch tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}",
+       "watch": "{{doc-actionlink}}\nName of the Watch tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}\n{{Identical|Watch}}",
        "watchthispage": "Used as link text.\n\nSee also:\n* {{msg-mw|Unwatchthispage|link text}}\n* {{msg-mw|Notanarticle|error message}}\n{{Identical|Watch this page}}",
        "unwatch": "{{doc-actionlink}}\nLabel of \"Unwatch\" tab.\n\nSee also:\n* {{msg-mw|Unwatch}}\n* {{msg-mw|Accesskey-ca-unwatch}}\n* {{msg-mw|Tooltip-ca-unwatch}}",
        "unwatchthispage": "Used as link text.\n\nSee also:\n* {{msg-mw|Watchthispage|link text}}\n* {{msg-mw|Notanarticle|error message}}",
        "editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
        "revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
        "revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
-       "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
+       "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). Parameters:\n* $1 - user whose changes have been reverted\n* $2 - user who produced version, which replaces reverted version\n* $3 - the first user's name, can be used for GENDER\n* $4 - the second user's name, can be used for GENDER\n{{Identical|Revert}}\n{{Identical|Rollback}}",
        "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{related|rollback-success}}\n{{Format|jquerymsg}}",
        "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
        "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
        "sorbs": "{{optional}}",
        "sorbsreason": "See also:\n* {{msg-mw|Sorbsreason}}\n* {{msg-mw|Sorbs create account_reason}}",
        "sorbs_create_account_reason": "Used in [[Special:UserLogin]] when creating an account.\n\nSee also:\n* {{msg-mw|Sorbsreason}}\n* {{msg-mw|Sorbs create account_reason}}",
+       "softblockrangesreason": "This text is shown to the user as a block reason and describes that the user is being blocked because the user is not logged in and their IP is in [[mw:Special:MyLanguage/Manual:$wgSoftBlockRanges|$wgSoftBlockRanges]].\n\nParameters:\n* $1 - The IP address that is blocked.",
        "xffblockreason": "This text is shown to the user as a block reason and describes that the user is being blocked because an IP in the X-Forwarded-For header (which lists the user's IP as well as all IPs of the transparent proxy servers they went through) sent when they loaded the page has been blocked:\n* $1 is the original block reason for the IP address matched in the X-Forwarded-For header",
        "cant-see-hidden-user": "Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.",
        "ipbblocked": "Error message shown when a user tries to alter block settings when they are themselves blocked.",
        "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-to-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-subpages": "Used as an error message.",
+       "namespace-nosubpages": "Used as an error message. Parameters:\n* $1 - Namespace name.",
        "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
        "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
        "movepagebtn": "Button label on the special 'Move page'.\n\n{{Identical|Move page}}",
        "pageinfo-length": "The length of the page, in bytes.",
        "pageinfo-article-id": "The numeric identifier of the page.\n{{Identical|Page ID}}",
        "pageinfo-language": "Language in which the page content is written.",
+       "pageinfo-language-change": "Link text for a link to Special:PageLanguage. The link will be wrapped in parenthesis.\n{{Identical|Change}}",
        "pageinfo-content-model": "The model in which the page content is written.\n\nUsed as label at [{{fullurl:Main Page|action=info}} action=info]. Followed by one of the following messages:\n* {{msg-mw|Content-model-wikitext}}\n* {{msg-mw|Content-model-javascript}}\n* {{msg-mw|Content-model-css}}\n* {{msg-mw|Content-model-text}}",
        "pageinfo-content-model-change": "Link text for a link to Special:ChangeContentModel. The link will be wrapped in parenthesis.\n{{Identical|Change}}",
        "pageinfo-robot-policy": "The search engine status of the page.\n\nUsed as label. Followed by any one of the following messages:\n*{{msg-mw|Pageinfo-robot-index}}\n*{{msg-mw|Pageinfo-robot-noindex}}",
        "htmlform-user-not-valid": "Error message shown if the name provided by the user isn't a valid username. $1 is the username.",
        "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-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",
        "newuserlog-autocreate-entry": "This message is used in the [[:mw:Extension:Newuserlog|new user log]] to mark an account that was created by MediaWiki as part of a [[:mw:Extension:CentralAuth|CentralAuth]] global account.",
        "rightslogentry": "This message is displayed in the [[Special:Log/rights|User Rights Log]] when a bureaucrat changes the user groups for a user.\n\nParameters:\n* $1 - the username\n* $2 - list of user groups or {{msg-mw|Rightsnone}}\n* $3 - list of user groups or {{msg-mw|Rightsnone}}\n\nThe name of the bureaucrat who did this task appears before this message.\n\nSimilar to {{msg-mw|Gur-rightslog-entry}}",
        "rightslogentry-autopromote": "This message is displayed in the [[Special:Log/rights|User Rights Log]] when a user is automatically promoted to a user group.\n\nParameters:\n* $1 - (Unused)\n* $2 - a comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $3 - a comma separated list of new user groups",
+       "rightslogentry-temporary-group": "This message is displayed in the [[Special:Log/rights|User Rights Log]] to show that a user group has been allocated temporarily.\n\nParameters:\n* $1 - group name\n* $2 - date and time of expiry\n* $3 - date of expiry\n* $4 - time of expiry",
        "feedback-adding": "Progress notice",
        "feedback-back": "Button to go back to the previous action in the feedback dialog.\n{{Identical|Back}}",
        "feedback-bugcheck": "Message that appears before the user submits a bug, reminding them to check for known bugs.\n\nParameters:\n* $1 - bug list page URL",
        "feedback-useragent": "A label denoting the user agent in the feedback that is posted to the feedback page.\n{{Identical|User agent}}",
        "searchsuggest-search": "Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)\n{{Identical|Search}}",
        "searchsuggest-containing": "Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term.",
-       "api-error-autoblocked": "API error message that can be used for client side localisation of API errors.\n\nCf. {{msg-mw|Autoblockedtext}}.",
-       "api-error-badaccess-groups": "API error message that can be used for client side localisation of API errors.",
        "api-error-badtoken": "API error message that can be used for client side localisation of API errors.",
-       "api-error-blocked": "API error message that can be used for client side localisation of API errors.",
-       "api-error-copyuploaddisabled": "API error message that can be used for client side localisation of API errors.",
-       "api-error-duplicate": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 - a number of files",
-       "api-error-duplicate-archive": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 - a number of files",
-       "api-error-empty-file": "API error message that can be used for client side localisation of API errors.",
        "api-error-emptypage": "API error message that can be used for client side localisation of API errors.",
-       "api-error-fetchfileerror": "API error message that can be used for client side localisation of API errors.",
-       "api-error-fileexists-forbidden": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - filename\nSee also:\n* {{msg-mw|Api-error-fileexists-shared-forbidden}}",
-       "api-error-fileexists-shared-forbidden": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - filename\nSee also:\n* {{msg-mw|Api-error-fileexists-forbidden}}",
-       "api-error-file-too-large": "API error message that can be used for client side localisation of API errors.",
-       "api-error-filename-tooshort": "API error message that can be used for client side localisation of API errors.",
-       "api-error-filetype-banned": "API error message that can be used for client side localisation of API errors.",
-       "api-error-filetype-banned-type": "API error message that can be used for client side localisation of API errors.\n\n* $1 is the extension(s) of the file which cannot be uploaded\n* $2 is the list of file extensions that can be uploaded (Example: ''png, gif, jpg, jpeg, ogg, pdf, svg.'')\n* $3 is the number of allowed file formats (to be used for the PLURAL function)\n* $4 is the number of extensions that could not be uploaded (to be used for the PLURAL function)",
-       "api-error-filetype-missing": "The word \"extension\" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.",
-       "api-error-hookaborted": "The word \"extension\" here refers to a [[:mw:Manual:Extensions|MediaWiki Extension]] which extends the functionality of the basic wiki by adding something to its capabilities. \"… aborted by an extension\" implies that an operation could not be performed successfully or was not allowed to continue to its intended end.",
-       "api-error-http": "API error message that can be used for client side localisation of API errors.",
-       "api-error-illegal-filename": "API error message that can be used for client side localisation of API errors.",
-       "api-error-internal-error": "API error message that can be used for client side localisation of API errors.",
-       "api-error-invalid-file-key": "API error message that can be used for client side localisation of API errors.",
-       "api-error-missingparam": "API error message that can be used for client side localisation of API errors.",
-       "api-error-missingresult": "API error message that can be used for client side localisation of API errors.",
-       "api-error-mustbeloggedin": "API error message that can be used for client side localisation of API errors.",
-       "api-error-mustbeposted": "API error message that can be used for client side localisation of API errors.",
-       "api-error-noimageinfo": "API error message that can be used for client side localisation of API errors.",
-       "api-error-nomodule": "API error message that can be used for client side localisation of API errors.",
-       "api-error-ok-but-empty": "API error message that can be used for client side localisation of API errors.",
-       "api-error-overwrite": "API error message that can be used for client side localisation of API errors.",
-       "api-error-ratelimited": "API error message that can be used for client side localisation of API errors.\n\nCf. {{msg-mw|Actionthrottledtext}}",
-       "api-error-stashfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-publishfailed": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stasherror": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashedfilenotfound": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashpathinvalid": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashfilestorage": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashzerolength": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashnotloggedin": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashwrongowner": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashnosuchfilekey": "API error message that can be used for client side localisation of API errors.",
-       "api-error-timeout": "API error message that can be used for client side localisation of API errors.",
-       "api-error-unclassified": "API error message that can be used for client side localisation of API errors.",
-       "api-error-unknown-code": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - may contain more error details\n{{Identical|Unknown error}}",
-       "api-error-unknown-error": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-unknown-warning": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 is an unknown warning.",
        "api-error-unknownerror": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - an unknown error message\n{{Identical|Unknown error}}",
-       "api-error-uploaddisabled": "API error message that can be used for client side localisation of API errors.",
-       "api-error-verification-error": "The word \"extension\" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.",
-       "api-error-was-deleted": "API error message that can be used for client side localisation of API errors.",
        "duration-seconds": "Used as duration. Parameters:\n* $1 - number of seconds\n{{Related|Duration}}\n{{Identical|Second}}",
        "duration-minutes": "Used as duration. Parameters:\n* $1 - number of minutes\n{{Related|Duration}}\n{{Identical|Minute}}",
        "duration-hours": "Used as duration. Parameters:\n* $1 - number of hours\n{{Related|Duration}}\n{{Identical|Hour}}",
        "pagelang-language": "Language selector label for Special:PageLanguage\n{{Identical|Language}}",
        "pagelang-use-default": "Radio label for selector on Special:PageLanguage for default language",
        "pagelang-select-lang": "Radio label for selector on Special:PageLanguage for language selection\n{{Identical|Select language}}",
+       "pagelang-reason": "Input label for reason on Special:PageLanguage\n\n{{Identical|Reason}}",
        "pagelang-submit": "Submit button label for Special:PageLanguage form\n{{Identical|Submit}}",
+       "pagelang-nonexistent-page": "Error message shown when the page the user is trying to change the language on does not exist.\n\nParameters:\n* $1 - the title of the nonexistent page",
+       "pagelang-unchanged-language": "Error message shown when the language the user is trying to change the page to and the current language the page is in are the same.\n\nParameters:\n* $1 - the title of the target page\n* $2 - the current language of the page",
+       "pagelang-unchanged-language-default": "Error message shown when the language the user is trying to set a page to fall back to the wiki's default content language, but the page is already set to do so.\n\nParameters:\n* $1 - the title of the target page",
+       "pagelang-db-failed": "Error message shown when the database fails to update the language of the page",
        "right-pagelang": "{{Doc-right|pagelang}}\nRight to change page language on Special:PageLanguage",
        "action-pagelang": "{{Doc-action|pagelang}}",
        "log-name-pagelang": "Display entry for log name for changes in page language in Special:Log.",
        "mediastatistics-header-audio": "Header on [[Special:MediaStatistics]] for file types that are in the audio category\n{{Identical|Audio}}",
        "mediastatistics-header-video": "Header on [[Special:MediaStatistics]] for file types that are in the video category\n{{Identical|Video}}",
        "mediastatistics-header-multimedia": "Header on [[Special:MediaStatistics]] for file types that are in the multimedia category. This does not include plain audio or video files, but more complex multimedia such as flash or vrml. This especially includes scripted multimedia. Ogg files in which MediaWiki cannot determine if it is an audio or video file (or something else) are included here.",
-       "mediastatistics-header-office": "Header on [[Special:MediaStatistics]] for file types that are in the Office category. This includes PDFs, OpenDocument files, Microsoft Word files, etc.",
+       "mediastatistics-header-office": "Header on [[Special:MediaStatistics]] for file types that are in the Office category. This includes PDFs, OpenDocument files, Microsoft Word files, etc.\n{{Identical|Office}}",
        "mediastatistics-header-text": "Header on [[Special:MediaStatistics]] for file types that are in the text category. This includes simple text formats, including plain text formats, json, csv, and xml. Source code of compiled programming languages may be included here in the future, but isn't currently.",
        "mediastatistics-header-executable": "Header on [[Special:MediaStatistics]] for file types that are in the executable category. This includes things like source files for interpreted programming language (Shell scripts, javascript, etc).",
        "mediastatistics-header-archive": "Header on [[Special:MediaStatistics]] for file types that are in the archive category. Includes things like tar, zip, gzip etc.",
        "mw-widgets-dateinput-no-date": "Label of a date input field when no date has been selected.",
        "mw-widgets-dateinput-placeholder-day": "[[File:DateInputWidget active, empty.png|frame|Screenshot]]\nPlaceholder displayed in a date input field when it's empty, representing a date format with 4 digits for year, 2 digits for month, and 2 digits for day, separated with hyphens. This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
+       "mw-widgets-mediasearch-input-placeholder": "Place holder text for media search input",
+       "mw-widgets-mediasearch-noresults": "Label notifying the user no results were found for the media search.",
        "mw-widgets-titleinput-description-new-page": "Description label for a new page in the title input widget.",
        "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",
        "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}}.",
        "sessionprovider-nocookies": "Used to inform the user that sessions may be missing due to lack of cookies.",
        "randomrootpage": "{{doc-special|RandomRootPage}}",
-       "log-action-filter-block": "{{doc-log-action-filter-type|block}}",
-       "log-action-filter-contentmodel": "{{doc-log-action-filter-type|contentmodel}}",
-       "log-action-filter-delete": "{{doc-log-action-filter-type|delete}}",
-       "log-action-filter-import": "{{doc-log-action-filter-type|import}}",
-       "log-action-filter-managetags": "{{doc-log-action-filter-type|managetags}}",
-       "log-action-filter-move": "{{doc-log-action-filter-type|move}}",
-       "log-action-filter-newusers": "{{doc-log-action-filter-type|newusers}}",
-       "log-action-filter-patrol": "{{doc-log-action-filter-type|patrol}}",
-       "log-action-filter-protect": "{{doc-log-action-filter-type|protect}}",
-       "log-action-filter-rights": "{{doc-log-action-filter-type|rights}}",
-       "log-action-filter-suppress": "{{doc-log-action-filter-type|suppress}}",
-       "log-action-filter-upload": "{{doc-log-action-filter-type|upload}}",
-       "log-action-filter-all": "{{doc-log-action-filter-type|all}}\n{{Identical|All}}",
+       "log-action-filter-block": "{{doc-log-action-filter-type|block}}\n{{related|Log-action-filter}}",
+       "log-action-filter-contentmodel": "{{doc-log-action-filter-type|contentmodel}}\n{{related|Log-action-filter}}",
+       "log-action-filter-delete": "{{doc-log-action-filter-type|delete}}\n{{related|Log-action-filter}}",
+       "log-action-filter-import": "{{doc-log-action-filter-type|import}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-managetags": "{{doc-log-action-filter-type|managetags}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-move": "{{doc-log-action-filter-type|move}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-newusers": "{{doc-log-action-filter-type|newusers}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-patrol": "{{doc-log-action-filter-type|patrol}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-protect": "{{doc-log-action-filter-type|protect}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-rights": "{{doc-log-action-filter-type|rights}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-suppress": "{{doc-log-action-filter-type|suppress}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-upload": "{{doc-log-action-filter-type|upload}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-all": "{{doc-log-action-filter-type|all}}\n{{related|Log-action-filter}}\n{{Identical|All}}",
        "log-action-filter-block-block": "{{doc-log-action-filter-action|block|block}}\n{{Identical|Block}}",
        "log-action-filter-block-reblock": "{{doc-log-action-filter-action|block|reblock}}",
        "log-action-filter-block-unblock": "{{doc-log-action-filter-action|block|unblock}}\n{{Identical|Unblock}}",
        "log-action-filter-contentmodel-change": "{{doc-log-action-filter-action|contentmodel|change}}",
        "log-action-filter-contentmodel-new": "{{doc-log-action-filter-action|contentmodel|new}}",
        "log-action-filter-delete-delete": "{{doc-log-action-filter-action|delete|delete}}",
+       "log-action-filter-delete-delete_redir": "{{doc-log-action-filter-action|delete|delete_redir}}",
        "log-action-filter-delete-restore": "{{doc-log-action-filter-action|delete|restore}}",
        "log-action-filter-delete-event": "{{doc-log-action-filter-action|delete|event}}",
        "log-action-filter-delete-revision": "{{doc-log-action-filter-action|delete|revision}}",
        "restrictionsfield-badip": "An error message shown when one entered an invalid IP address or range in a restrictions field (such as Special:BotPassword). $1 is the IP address.",
        "restrictionsfield-label": "Field label shown for restriction fields (e.g. on Special:BotPassword).",
        "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
-       "edit-error-short": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-long}}\n{{Identical|Error}}",
-       "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}"
+       "revid": "Used to format a revision ID number in text. Parameters:\n* $1 - Revision ID number.\n{{Identical|Revision}}",
+       "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number."
 }
index 86abce6..c0192d2 100644 (file)
        "passwordreset-emaildisabled": "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.",
        "passwordreset-username": "Ruraqpa sutin:",
        "passwordreset-domain": "Duminyu:",
-       "passwordreset-capture": "Llalliwaq e-chaskita qhawayta munankichu?",
-       "passwordreset-capture-help": "Kay k'itichata ñit'iywan sananchaspaykiqa, mit'alla yaykuna rimayuq e-chaskita rikunki, hinaptiyki ruraqmanmi kachasqa kanqa.",
        "passwordreset-email": "E-chaski imamayta:",
        "passwordreset-emailtitle": "{{SITENAME}}-paq rakiqunamanta willakuna",
        "passwordreset-emailtext-ip": "Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) {{SITENAME}}-paq ($4)\nrakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}\nkay e-chaski imamaytayuq kachkan:\n\n$2\n\nKay mit'alla yaykuna {{PLURAL:$3|rimaqa|rimakunaqa}} kunanmanta {{PLURAL:$5|huk p'unchawpi|$5 p'unchawpi}} mawk'ayanqam.\nYaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqaptinqa,\nicha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,\nkay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
        "saveprefs": "Allinkachinakunata waqaychay",
        "restoreprefs": "Tukuy kikinmanta allinkachinakunata kutichimuy (tukuy rakirikunapi)",
        "prefs-editing": "Llamk'apusqa",
-       "rows": "Sinrukuna:",
-       "columns": "Wachukuna:",
        "searchresultshead": "Maskay",
        "stub-threshold": "Kay hatun kaykamam <a href=\"#\" class=\"stub\">t'una qillqasqa t'inki</a> nisqa kachun (byte):",
        "stub-threshold-disabled": "Ama nisqa",
        "userrights-reason": "Kayrayku:",
        "userrights-no-interwiki": "Manam saqillasunkichu huk wikikunapi ruraqkunap hayñinkunata hukchayta.",
        "userrights-nodatabase": "$1 sutiyuq willañiqintinqa manam kanchu icha manam kayllapichu.",
-       "userrights-nologin": "Kamachiqpa rakiqunaykiwan [[Special:UserLogin|yaykunaykim]] tiyan ruraqkunap hayñinkunata rurapunaykipaq.",
-       "userrights-notallowed": "Qampa rakiqunaykiwanqa manam ruraqkunap hayñinkunata yapayta icha qichuyta atinkichu.",
        "userrights-changeable-col": "Hukchanayki huñukuna",
        "userrights-unchangeable-col": "Mana hukchanayki huñukuna",
        "userrights-conflict": "Ruraqpa hayñin hukchay tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.",
        "right-siteadmin": "Willañiqintinta hark'ay, paskaypas",
        "right-override-export-depth": "P'anqakunata hawaman quy, t'inkisqa p'anqakunatapas pichqa ñiqin t'inkipayasqakama",
        "right-sendemail": "Huk ruraqkunaman e-chaskita kachay",
-       "right-passwordreset": "Yaykuna rima kutichina e-chaskikunata qhaway",
        "newuserlogpage": "Rakiquna kamariy hallch'a",
        "newuserlogpagetext": "Kayqa ruraqkunap rakiqunankunata kamariymanta hallch'am.",
        "rightslog": "Ruraqpa hayñinkunap hukyasqankuna",
        "uploaddisabledtext": "Willañiqi churkuyqa manam saqillasqachu.",
        "php-uploaddisabledtext": "PHP-wan willañiqi churkuyqa hark'asqam. Ama hina kaspa, willañiqi churkuy allinkachinakunata llanchiy.",
        "uploadscripted": "Kay willañiqiqa wakichi icha HTML qillqayuqmi, llika wamp'unaqa pantalla unanchanmanchá.",
-       "uploadscriptednamespace": "Kay SVG willañiqiqa mana allin \"$1\" sutisuyuyuqmi.",
+       "uploadscriptednamespace": "Kay SVG willañiqiqa mana allin \"<nowiki>$1</nowiki>\" sutisuyuyuqmi.",
        "uploadinvalidxml": "Manam atinichu churkusqa willañiqipi XML-ta kuskiyta.",
        "uploadvirus": "Willañiqipiqa añawmi! Yuyay: $1",
        "uploadjava": "Kay ZIP willañiqiqa Java .class willañiqiyuqmi.\nJava churkuyqa manam saqillasqachu, qasikanapaq saywachasqa kanman karunchana tiyanman.",
        "feedback-thanks": "Añaychayki! Willapuyniykiqa \"[$2 $1]\" sutiyuq p'anqaman yapasqañam.",
        "searchsuggest-search": "Maskay",
        "searchsuggest-containing": "kaykunayuq: ...",
-       "api-error-badaccess-groups": "Kay wikipiqa willañiqikunata manam churkuyta atinkichu.",
        "api-error-badtoken": "Ukhupi pantasqa: Mana allinta sananchasqa.",
-       "api-error-copyuploaddisabled": "URL nisqawanqa kay sirwiqpi manam churkuyta atinki.",
-       "api-error-duplicate": "Kay tiyaypiqa huk {{PLURAL:$1|willañiqim|willañiqikunam}} kachkanñam kaqlla samiqniyuq kaq.",
-       "api-error-duplicate-archive": "Kay tiyaypiqa huk {{PLURAL:$1|willañiqim|willañiqikunam}} karqanñam kaqlla samiqniyuq kaq, kunantaq qullusqañam.",
-       "api-error-empty-file": "Kachasqayki willañiqiqa ch'usaqmi.",
        "api-error-emptypage": "Musuq ch'usaq p'anqakunata kamariyqa manam saqillasqachu.",
-       "api-error-fetchfileerror": "Ukhupi pantasqa: Willañiqita chaskiykachachkaptiyki ima mana allin kaqpas tukurqan.",
-       "api-error-fileexists-forbidden": "\"$1\" sutiyuq willañiqiqa kachkañam, manam huknachayta atinkichu.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" sutiyuq willañiqiqa rakinakusqa willañiqi churanapi kachkañam, manam huknachayta atinkichu.",
-       "api-error-file-too-large": "Kachasqayki willañiqiqa nisyu hatunmi.",
-       "api-error-filename-tooshort": "Kay willañiqi sutiqa nisyu pisillam.",
-       "api-error-filetype-banned": "Kay willañiqi layaqa manam saqillasqachu.",
-       "api-error-filetype-banned-type": "$1 nisqaqa manam saqillasqachu willañiqi {{PLURAL:$4|laya|layakuna}}.  Saqillasqa willañiqi {{PLURAL:$3|layaqa|layakunaqa}} kaymi: $2.",
-       "api-error-filetype-missing": "Kay willañiqi sutiqa manam k'askaqniyuqchu.",
-       "api-error-hookaborted": "Wakinchaykachasqaykitaqa mast'ari ch'iwinam puchukachirqan.",
-       "api-error-http": "Ukhupi pantasqa: Manam sirwiqwan t'inkinakuyta atinichu.",
-       "api-error-illegal-filename": "Kay willañiqi sutiqa manam saqillasqachu.",
-       "api-error-internal-error": "Ukhupi pantasqa: Wikipi churkuchkaptiyki ima mana allin kaqpas tukurqan.",
-       "api-error-invalid-file-key": "Ukhupi pantasqa: Mit'alla hallch'api willañiqiqa manam tarisqachu.",
-       "api-error-missingparam": "Ukhupi pantasqa: Mañakuypi manam kuskanachina tupukuna kanchu.",
-       "api-error-missingresult": "Ukhupi pantasqa: Manam yuqanchasqachu iskaychay aypasqachu.",
-       "api-error-mustbeloggedin": "Yaykunaykim tiyan willañiqikunata churkunaykipaq.",
-       "api-error-mustbeposted": "Ukhupi pantasqa: Mañakuypaq HTTP POST kanam tiyan.",
-       "api-error-noimageinfo": "Willañiqiqa churkusqañam, chaywanpas sirwiq manam willawanchu ima willañiqimantapas.",
-       "api-error-nomodule": "Ukhupi pantasqa: Manam kanchu churasqa churkuna wakina tupu.",
-       "api-error-ok-but-empty": "Ukhupi pantasqa: Sirwiqqa manam kutipanchu.",
-       "api-error-overwrite": "Kachkaqña willañiqita huknachayqa manam saqillasqachu.",
-       "api-error-stashfailed": "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam hallch'ayta atinchu.",
        "api-error-publishfailed": "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam uyanchayta atinchu.",
-       "api-error-timeout": "Suyakusqa mit'apiqa sirwiq manam kutiparqanchu.",
-       "api-error-unclassified": "Mana riqsisqa pantasqam tukurqan.",
-       "api-error-unknown-code": "Mana riqsisqa pantasqa: \"$1\".",
-       "api-error-unknown-error": "Ukhupi pantasqa: Churkuykachachkaptiyki ima mana allin kaqpas tukurqan.",
+       "api-error-stashfailed": "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam hallch'ayta atinchu.",
        "api-error-unknown-warning": "Mana riqsisqa yuyampay: \"$1\".",
        "api-error-unknownerror": "Mana riqsisqa pantasqa: \"$1\".",
-       "api-error-uploaddisabled": "Kay wikipiqa manam churkuyta atinkichu.",
-       "api-error-verification-error": "Kay willañiqiqa waqllisqachá, icha pantasqa k'askaqniyuqchá.",
        "duration-seconds": "$1 {{PLURAL:$1|sikundu|sikundukuna}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minutukuna}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|urakuna}}",
index 0d4a8b2..814f123 100644 (file)
        "botpasswords-label-grants": "Permisiuni aplicabile:",
        "botpasswords-label-grants-column": "Permise",
        "botpasswords-bad-appid": "Numele de robot „$1” nu este valid.",
+       "botpasswords-created-title": "Parola de robot a fost creată",
        "resetpass_forbidden": "Parolele nu pot fi schimbate.",
+       "resetpass_forbidden-reason": "Parolele nu pot fi schimbate: $1",
        "resetpass-no-info": "Trebuie să fiți autentificat pentru a accesa această pagină direct.",
        "resetpass-submit-loggedin": "Modifică parola",
        "resetpass-submit-cancel": "Revocare",
        "passwordreset-emaildisabled": "Funcțiile de e-mail au fost dezactivate de pe acest wiki.",
        "passwordreset-username": "Nume de utilizator:",
        "passwordreset-domain": "Domeniu:",
-       "passwordreset-capture": "Vizualizați e-mailul rezultat?",
-       "passwordreset-capture-help": "Dacă bifați această căsuță, e-mailul (conținând parola temperară) vă va fi afișat, dar va fi trimis și utilizatorului.",
        "passwordreset-email": "Adresă de e-mail:",
        "passwordreset-emailtitle": "Detalii despre cont pe {{SITENAME}}",
        "passwordreset-emailtext-ip": "Cineva (probabil dumneavoastră, de la adresa IP $1) a solicitat resetarea parolei \npentru {{SITENAME}} ($4). {{PLURAL:$3|Următorul cont este asociat|Următoarele conturi sunt asociate}}\ncu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să schimbați parola acum. Dacă altcineva a făcut această cerere \nsau dacă v-ați reamintit parola inițială și nu mai doriți să o schimbați,\nputeți ignora acest mesaj, continuând să utilizați vechea parolă.",
        "saveprefs": "Salvează preferințele",
        "restoreprefs": "Restaurează toate valorile implicite (în toate secțiunile)",
        "prefs-editing": "Modificare",
-       "rows": "Rânduri:",
-       "columns": "Coloane:",
        "searchresultshead": "Parametri căutare",
        "stub-threshold": "Pragul pentru formatarea legăturilor către cioturi ($1):",
        "stub-threshold-sample-link": "exemplu",
        "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-nologin": "Trebuie să te [[Special:UserLogin|autentifici]] cu un cont de administrator pentru a atribui permisiuni utilizatorilor.",
-       "userrights-notallowed": "Nu aveți permisiunea de a acorda sau elimina drepturi utilizatorilor.",
        "userrights-changeable-col": "Grupuri pe care le puteți schimba",
        "userrights-unchangeable-col": "Grupuri pe care nu le puteți schimba",
        "userrights-conflict": "Conflict al schimbării drepturilor de utilizator! Reverificați și confirmați-vă modificările.",
-       "userrights-removed-self": "V-ați eliminat propriile drepturi. Ca urmare, nu mai puteți accesa această pagină.",
        "group": "Grup:",
        "group-user": "Utilizatori",
        "group-autoconfirmed": "Utilizatori autoconfirmați",
        "right-siteadmin": "Blochează și deblochează baza de date",
        "right-override-export-depth": "Exportă inclusiv paginile legate până la o adâncime de 5",
        "right-sendemail": "Trimite e-mail altor utilizatori",
-       "right-passwordreset": "Vizualizează e-mailurile de reinițializare a parolelor",
        "right-managechangetags": "Creează și (dez)activează [[Special:Tags|etichete]]",
        "right-applychangetags": "Aplică [[Special:Tags|etichete]] asociate modificărilor unui utilizator",
        "right-changetags": "Adaugă și înlătură [[Special:Tags|etichete]] arbitrare din versiuni și intrări de jurnal individuale",
        "grant-generic": "set de permisiuni „$1”",
        "grant-group-page-interaction": "Interacționează cu paginile",
        "grant-group-file-interaction": "Interacționează cu conținut media",
+       "grant-group-email": "Trimite e-mail",
+       "grant-createaccount": "Creare conturi",
+       "grant-createeditmovepage": "Creează, editează și redenumește pagini",
        "grant-highvolume": "Volum mare de editare",
        "grant-oversight": "Ascunde utilizatori și suprimă versiuni",
        "grant-patrol": "Patrulează schimbările paginilor",
        "grant-basic": "Drepturi de bază",
+       "grant-viewmywatchlist": "Vezi lista de pagini urmărite",
        "newuserlogpage": "Jurnal utilizatori noi",
        "newuserlogpagetext": "Acesta este jurnalul creărilor conturilor de utilizator.",
        "rightslog": "Jurnal permisiuni de utilizator",
        "action-writeapi": "utilizați scrierea prin API",
        "action-delete": "ștergeți această pagină",
        "action-deleterevision": "ștergeți această versiune",
-       "action-deletedhistory": "vizualizați istoricul șters al acestei pagini",
+       "action-deletelogentry": "ștergeți înregistrări din jurnal",
+       "action-deletedhistory": "vizualizați istoricul șters a unei pagini",
        "action-browsearchive": "căutați pagini șterse",
        "action-undelete": "recuperați această pagină",
-       "action-suppressrevision": "revizuiți și să restaurați această versiune ascunsă",
+       "action-suppressrevision": "revizuiți și să restaurați versiuni ascunse",
        "action-suppressionlog": "vizualizați acest jurnal privat",
        "action-block": "blocați permisiunea de modificare a acestui utilizator",
        "action-protect": "modificați nivelurile de protecție pentru această pagină",
        "recentchangeslinked-page": "Numele paginii:",
        "recentchangeslinked-to": "Arată în schimb modificările asupra paginilor care se leagă de pagina indicată",
        "recentchanges-page-added-to-category": "[[:$1]] a fost adăugată în categorii",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă [[Special:WhatLinksHere/$1|{{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}}]] au fost adăugate în categorii",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] a fost adăugată în categorie, [[Special:WhatLinksHere/$1|această pagină este inclusă în alte pagini]]",
        "recentchanges-page-removed-from-category": "[[:$1]] eliminată din categorii",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost eliminate din categorii",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] a fost eliminată din categorie, [[Special:WhatLinksHere/$1|această pagină este inclusă în alte pagini]]",
        "autochange-username": "Modificare automată a MediaWiki",
        "upload": "Încărcare fișier",
        "uploadbtn": "Încarcă fișier",
        "uploaded-setting-handler-svg": "Sunt blocate fișierele SVG care setează atributul „handler” cu remote/data/script. S-a găsit <code>$1=„$2”</code> în fișierul SVG încărcat.",
        "uploaded-remote-url-svg": "Sunt blocate fișierele SVG care setează orice atribut de stil către adrese URL la distanță. S-a găsit <code>$1=„$2”</code> în fișierul SVG încărcat.",
        "uploaded-image-filter-svg": "S-a găsit filtru de imagine cu URL: <code>&lt;$1 $2=\"$3\"&gt;</code> în fișierul SVG încărcat.",
-       "uploadscriptednamespace": "Acest fișier SVG conține un spațiu de nume „$1” neautorizat.",
+       "uploadscriptednamespace": "Acest fișier SVG conține un spațiu de nume „<nowiki>$1</nowiki>” neautorizat.",
        "uploadinvalidxml": "Nu s-a putut analiza conținutul XML din fișierul încărcat.",
        "uploadvirus": "Fișierul conține un virus! Detalii: $1",
        "uploadjava": "Fișierul de față este o arhivă ZIP care conține un fișier de clasă Java.\nÎncărcarea fișierelor Java nu este permisă, întrucât pot evita restricțiile de securitate.",
        "apisandbox-results-fixtoken-fail": "Imposibil de recuperat jetonul „$1”.",
        "apisandbox-alert-page": "Câmpurile de pe această pagină nu sunt valide.",
        "apisandbox-alert-field": "Valoare acestui câmp nu este validă.",
+       "apisandbox-continue": "Continuă",
        "booksources": "Surse de cărți",
        "booksources-search-legend": "Căutare surse pentru cărți",
        "booksources-search": "Caută",
        "logentry-contentmodel-change-revert": "revenire",
        "protectlogpage": "Jurnal protecții",
        "protectlogtext": "Mai jos se află o listă cu schimbări în ceea ce privește protejarea paginilor.\nConsultați [[Special:ProtectedPages|indexul paginilor protejate]] pentru o listă cu protecțiile în vigoare.",
-       "protectedarticle": "a protejat \"[[$1]]\"",
+       "protectedarticle": "a protejat „[[$1]]”",
        "modifiedarticleprotection": "schimbat nivelul de protecție pentru \"[[$1]]\"",
        "unprotectedarticle": "a eliminat protecția pentru „[[$1]]”",
        "movedarticleprotection": "setările de protecție au fost mutate de la „[[$2]]” la „[[$1]]”",
+       "protectedarticle-comment": "A protejat „[[$1]]”",
+       "unprotectedarticle-comment": "A eliminat protecția pentru „[[$1]]”",
        "protect-title": "Protejare „$1”",
        "protect-title-notallowed": "Vizualizare nivel de protecție pentru „$1”",
        "prot_1movedto2": "a mutat [[$1]] la [[$2]]",
        "htmlform-user-not-exists": "<strong>$1</strong> nu există.",
        "htmlform-user-not-valid": "<strong>$1</strong> nu este un nume de utilizator valid.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a șters}} pagina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|a șters}} pagina de redirecționare $3 prin suprascriere",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restaurat}} pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} pentru $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unei versiuni|a $5 versiuni|a $5 de versiuni}} pentru pagina $3: $4",
        "feedback-useragent": "Agent utilizator:",
        "searchsuggest-search": "Căutare",
        "searchsuggest-containing": "conținând...",
-       "api-error-autoblocked": "Adresa dumnevoastră IP a fost blocată automat, pentru că a fost folosită de un utilizator blocat.",
-       "api-error-badaccess-groups": "Nu aveți dreptul să încărcați fișiere pe acest wiki.",
        "api-error-badtoken": "Eroare internă: jeton greșit.",
-       "api-error-blocked": "Vi s-a blocat accesul la modificări.",
-       "api-error-copyuploaddisabled": "Încărcarea prin URL este dezactivată pe acest server.",
-       "api-error-duplicate": "Există {{PLURAL:$1|un alt fișier deja încărcat|alte fișiere deja încărcate}} cu același conținut.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|A existat un alt fișier|Au existat alte fișiere}} cu același conținut pe site, dar {{PLURAL:$1|a fost|au fost}} șterse.",
-       "api-error-empty-file": "Fișierul încărcat de dumneavoastră este gol.",
        "api-error-emptypage": "Crearea paginilor noi, goale nu este permisă.",
-       "api-error-fetchfileerror": "Eroare internă: ceva nu a funcționat corect la prelucrarea fișierului.",
-       "api-error-fileexists-forbidden": "Un fișier cu numele „$1” există deja și nu poate fi suprascris.",
-       "api-error-fileexists-shared-forbidden": "Un fișier cu numele „$1” există deja în depozitul de fișiere partajate, și nu poate fi suprascris.",
-       "api-error-file-too-large": "Fișierul pe care l-ați trimis este prea mare.",
-       "api-error-filename-tooshort": "Numele fișierului este prea scurt.",
-       "api-error-filetype-banned": "Acest tip de fișiere este interzis.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|este un tip de fișier nepermis|sunt tipuri de fișier nepermise}}. {{PLURAL:$3|Tip de fișier permis este|Tipuri de fișier permise sunt}} $2.",
-       "api-error-filetype-missing": "Fișierului îi lipsește extensia.",
-       "api-error-hookaborted": "Modificarea pe care ați încercat să o faceți a fost oprită de sesizarea unei extensii.",
-       "api-error-http": "Eroare internă: nu s-a reușit conectarea la server.",
-       "api-error-illegal-filename": "Numele acordat fișierului nu este permis.",
-       "api-error-internal-error": "Eroare internă: ceva nu a funcționat în timpul procesării încărcării.",
-       "api-error-invalid-file-key": "Eroare internă: fișierul nu a fost găsit în depozitul temporar.",
-       "api-error-missingparam": "Eroare internă: lipsesc parametrii cererii.",
-       "api-error-missingresult": "Eroare internă: nu s-a putut determina dacă copierea a reușit.",
-       "api-error-mustbeloggedin": "Trebuie să fiți autentificat pentru a încărca fișiere.",
-       "api-error-mustbeposted": "Eroare internă: cererea necesită metoda HTTP POST.",
-       "api-error-noimageinfo": "Încărcarea a reușit, dar serverul nu a dat nicio informație despre fișier.",
-       "api-error-nomodule": "Eroare internă: niciun modul de încărcare setat.",
-       "api-error-ok-but-empty": "Eroare internă: niciun răspuns de la server.",
-       "api-error-overwrite": "Nu este permisă suprascrierea unui fișier existent.",
-       "api-error-ratelimited": "Ați încercat să încărcați într-un interval de timp scurt mai multe fișiere decât permite acest wiki.\nÎncercați din nou peste câteva minute.",
-       "api-error-stashfailed": "Eroare internă: serverul nu a putut stoca fișierul temporar.",
        "api-error-publishfailed": "Eroare internă: serverul nu a putut publica fișierul temporar.",
-       "api-error-stasherror": "A apărut o eroare la încărcarea fișierului în depozitul temporar.",
-       "api-error-stashedfilenotfound": "Fișierul din depozitul temporar nu a fost găsit când s-a încercat încărcarea sa.",
-       "api-error-stashpathinvalid": "Calea unde ar fi trebuit să fie găsit fișierul din depozitul temporar nu este validă.",
-       "api-error-stashfilestorage": "A apărut o eroare la stocarea fișierului în depozitul temporar.",
-       "api-error-stashzerolength": "Serverul nu a putut depozita temporar fișierul, deoarece are o mărime egală cu zero.",
-       "api-error-stashnotloggedin": "Trebuie să vă autentificați pentru a salva fișiere în depozitul temporar.",
-       "api-error-stashwrongowner": "Fișierul pe care încercați să-l accesați din depozitul temporar nu vă aparține.",
-       "api-error-stashnosuchfilekey": "Cheia fișierului pe care încercați să-l accesați din depozitul temporar nu există.",
-       "api-error-timeout": "Serverul nu a răspuns în timp util.",
-       "api-error-unclassified": "A apărut o eroare necunoscută.",
-       "api-error-unknown-code": "Eroare necunoscută: „$1”",
-       "api-error-unknown-error": "Eroare internă: ceva nu a funcționat atunci când ați încercat să încărcați fișierul.",
+       "api-error-stashfailed": "Eroare internă: serverul nu a putut stoca fișierul temporar.",
        "api-error-unknown-warning": "Avertisment necunoscut: $1",
        "api-error-unknownerror": "Eroare necunoscută: „$1”.",
-       "api-error-uploaddisabled": "Încărcarea este dezactivată pe acest wiki.",
-       "api-error-verification-error": "Acest fișier ar putea fi corupt sau poate avea extensia greșită.",
-       "api-error-was-deleted": "Un fișier cu același nume a fost deja încărcat în trecut și ulterior șters.",
        "duration-seconds": "$1 {{PLURAL:$1|secundă|secunde|de secunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minute|de minute}}",
        "duration-hours": "$1 {{PLURAL:$1|oră|ore|de ore}}",
index deeece5..a58a9db 100644 (file)
@@ -47,6 +47,7 @@
        "tog-watchlistreloadautomatically": "Recareche automaticamende l'eleghe de le pàggene condrollate quanne cange 'nu filtre (richieste Javascript)",
        "tog-watchlisthideanons": "Scunne le cangiaminde de l'utinde scanusciute da l'elenghe de le pàggene condrollate",
        "tog-watchlisthidepatrolled": "Scunne le cangiaminde condrollate jndr'à l'elenghe de le pàggene condrollate",
+       "tog-watchlisthidecategorization": "Scunne 'a categorizzazzione d'a vôsce",
        "tog-ccmeonemails": "Manneme 'na copie de le mail ca je manne a l'ôtre utinde",
        "tog-diffonly": "No fà vedè le pàggene cu le condenute sotte a le differenze",
        "tog-showhiddencats": "Fa vedè le categorije scunnute",
        "talk": "'Ngazzaminde",
        "views": "Visite",
        "toolbox": "Struminde",
+       "tool-link-userrights": "Cange le gruppe {{GENDER:$1|utinde}}",
+       "tool-link-userrights-readonly": "'Ndruche le gruppe {{GENDER:$1|utinde}}",
+       "tool-link-emailuser": "Manne 'na mail a stu {{GENDER:$1|utende}}",
        "userpage": "Vide a pàgene de l'utende",
        "projectpage": "Vide a pàgene de le pruggette",
        "imagepage": "Vide a pàgene de le file",
        "mypreferencesprotected": "Non ge tìne le permesse pe cangià le preferenze tune.",
        "ns-specialprotected": "Le pàgene speciale no ponne essere cangete.",
        "titleprotected": "Stu titele ha state prutette da 'a ccreazione da [[User:$1|$1]].\n'U mutive jè <em>$2</em>.",
-       "filereadonlyerror": "Non ge pozze cangià 'u file \"$1\" purcé l'archivije de le file \"$2\" ste in mode sola letture.\n\nL'amministratore ca l'ha bloccate dèje sta spiegazione: \"$3\".",
+       "filereadonlyerror": "Non ge pozze cangià 'u file \"$1\" purcé l'archivije de le file \"$2\" ste in sola letture.\n\nL'amministratore d'u sisteme ca l'ave bloccate dèje sta spiegazione: \"$3\".",
        "invalidtitle-knownnamespace": "Titole invalide cu 'u namespace \"$2\" e teste \"$3\"",
        "invalidtitle-unknownnamespace": "Titele invalide cu numere de namespace scanusciute $1 e teste \"$2\"",
        "exception-nologin": "Non ge sì collegate",
        "userlogin-remembermypassword": "Arrecuèrdeme",
        "userlogin-signwithsecure": "Ause 'na connessione secure",
        "cannotlogin-title": "Non ge puè trasé",
+       "cannotcreateaccount-title": "Non ge pué ccrejà le cunde utinde",
        "yourdomainname": "'U nome d'u dominie tue:",
        "password-change-forbidden": "Non ge puè cangià le passuord sus a sta uicchi.",
        "externaldberror": "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
        "noname": "Non gìè specifichete 'nu nome utende valide.",
        "loginsuccesstitle": "Tutte a poste, è trasute!",
        "loginsuccess": "'''Mò tu si colleghete jndr'à {{SITENAME}} cumme \"$1\".'''",
-       "nosuchuser": "Non g'esiste n'utende cu 'u nome \"$1\".\nFà attenzione ca le nome de l'utinde so senzibbele a le lettere granne e piccenne.\nVide bbuene a cumme l'è scritte, o [[Special:CreateAccount|ccreje n'utende nuève]].",
+       "nosuchuser": "Non g'esiste n'utende cu 'u nome \"$1\".\nLe nome de l'utinde so senzibbele a le lettere granne e piccenne.\nVide bbuene a cumme l'è scritte, o [[Special:CreateAccount|ccreje n'utende nuève]].",
        "nosuchusershort": "Non ge ste nisciune utende cu 'u nome \"$1\".\nCondrolle accume l'è scritte.",
        "nouserspecified": "A scrivere pe forze 'u nome de l'utende.",
        "login-userblocked": "Stu utende jè bloccate. Non ge puè trasè.",
        "noemail": "Non ge stonne email reggistrete pe l'utende \"$1\".",
        "noemailcreate": "Tu ha mèttere 'n'indirizze e-mail valide",
        "passwordsent": "'Na nova passuord ha state mannete a l'indirizze e-mail reggistrete pe \"$1\".\nPe piacere, colleghete n'otra vota quanne l'è ricevute.",
-       "blocked-mailpassword": "L'indirizze IP tue jè blocchete pe le cangiaminde e accussì tu non ge puè ausà 'a funzione de recupere d'a password pe prevenìe l'abbuse.",
+       "blocked-mailpassword": "L'indirizze IP tune jè bloccate pe le cangiaminde. Tu non ge puè ausà 'a funzione de recupere d'a password pe prevenìe l'abbuse.",
        "eauthentsent": "'N'e-mail de conferme ha state mannate a l'indirizze ca tu è ditte.\nApprime ca otre e-mail avènene mannate a 'u cunde tune, tu ha seguì le 'struzione ca stonne jndr'à l'e-mail, pe confermà ca 'u cunde jè une de le tune.",
        "throttled-mailpassword": "'Nu arrecordatore de passuord ha stete già mannate jndr'à {{PLURAL:$1|l'urtema ore|l'urteme $1 ore}}.\nPe prevenì l'abbuse, sulamende 'nu arrecordatore de passuord avene mannate ogne {{PLURAL:$1|ore|$1 ore}}.",
        "mailerror": "Errore mannanne 'a mail: $1",
-       "acct_creation_throttle_hit": "Le visitature de sta Uicchi ca stonne ausene stu indirizze IP onne ccrejete {{PLURAL:$1|'nu cunde utende|$1 cunde utinde}} jndr'à l'urteme giurne, e onne raggiunde 'u numere massime ca se pò fà jndr'à stu periode.\n'U resultete jè ca le visitature ca stonne ausene stu indirizze IP non ge ponne ccrejà otre cunde utinde nuève jndr'à stu mumende.",
+       "acct_creation_throttle_hit": "Le visitature de sta Uicchi ca stonne ausene stu indirizze IP onne ccrejate {{PLURAL:$1|'nu cunde utende|$1 cunde utinde}} jndr'à l'urteme $2, e onne raggiunde 'u numere massime ca se pò fà jndr'à stu periode.\n'U resultate éte ca le visitature ca stonne ausene stu indirizze IP non ge ponne ccrejà otre cunde utinde nuève jndr'à stu mumende.",
        "emailauthenticated": "L'indirizze e-mail ca ne date ha state confermate 'u sciurne $2 a le $3.",
        "emailnotauthenticated": "L'indirizze e-mail tune non g'a state angore confermate.\nNisciuna mail t'avène mannate pe tutte le seguende dettaglie.",
        "noemailprefs": "Specifiche 'n'indirizze e-mail pe ste dettaglie ca onne essere fatiete.",
        "createacct-another-realname-tip": "'U nome vere jè facoltative.\nCe tu scacchie de metterle, quiste avène ausate pe dà 'u giuste merite a 'a fatìe de l'utende.",
        "pt-login": "Tràse",
        "pt-login-button": "Tràse",
+       "pt-login-continue-button": "Condinue a trasé",
        "pt-createaccount": "Ccreje 'nu cunde utende",
        "pt-userlogout": "Isse",
        "php-mail-error-unknown": "Errore scanusciute jndr'à funzione PHP mail()",
        "resetpass_submit": "'Mboste 'a passuord e colleghete",
        "changepassword-success": "'A password toje ha state cangiate!",
        "changepassword-throttled": "Tu è pruvate 'nu sacche de vote a trasè.\nPe piacere aspitte $1 apprime de pruvà arrete.",
+       "botpasswords": "Password d'u bot",
+       "botpasswords-label-appid": "Nome d'u bot:",
+       "botpasswords-label-create": "Ccreje",
+       "botpasswords-label-update": "Aggiorne",
+       "botpasswords-label-cancel": "Annulle",
+       "botpasswords-label-delete": "Scangìlle",
+       "botpasswords-label-resetpassword": "Azzere 'a passuord",
        "resetpass_forbidden": "Le Password non ge ponne cangià",
        "resetpass-no-info": "Tu a essere colleghete pe accedere a sta pàgene direttamende.",
        "resetpass-submit-loggedin": "Cange 'a password",
        "resetpass-submit-cancel": "Annulle",
-       "resetpass-wrong-oldpass": "'A password temboranea o quedda corrende jè invalide.\nPò essere ca tu è già cangete 'a password toje o è richieste una temboranea nove.",
+       "resetpass-wrong-oldpass": "'A password temboranée o quedda corrende non g'è valide.\nPò essere ca tu è già cangiate 'a password toje o n'è cercate una nove temboranée.",
        "resetpass-recycled": "Pe piacere azzere 'a password toje cu 'n'otra password deverse da quedde de mò.",
        "resetpass-temp-emailed": "Tu è trasute cu 'nu codece email tembaranèe.\nPe spiccià de trasè, tu ha 'mbostà 'na password nove aqquà:",
        "resetpass-temp-password": "Password temboranea:",
        "passwordreset-emaildisabled": "Le funziune de l'email onne state disabbilitate sus a sta uicchi.",
        "passwordreset-username": "Nome utende:",
        "passwordreset-domain": "Dominie:",
-       "passwordreset-capture": "Vide 'a mail resultande?",
-       "passwordreset-capture-help": "Ce tu signe sta sckatele, 'a mail (cu 'a passuord temboranèe) t'avène fatte vedè cumme adda essere mannate a l'utende.",
        "passwordreset-email": "Indirizze e-mail:",
        "passwordreset-emailtitle": "Dettaglie d'u cunde utende sus a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quacchedune (pò essere tu, da 'u 'ndirizze IP $1) ha richieste 'na mail pe arrecurdarse de le dettaglie d'u cunde sue pe {{SITENAME}} ($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
-       "passwordreset-emailsentemail": "Ce quiste jè 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
+       "passwordreset-emailsentemail": "Ce queste éte 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
        "changeemail": "Cange o live 'u 'ndirizze e-mail",
        "changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "accmailtext": "'A passuord ccrejate a uecchije pe [[User talk:$1|$1]] ha state mannate sus a $2.\n\n'A passuord pe stu cunde utende pò essere cangiate sus a pàgene ''[[Special:ChangePassword|cange passuord]]'' 'na vote ca è trasute.",
        "newarticle": "(Nuève)",
        "newarticletext": "Tu ste segue 'nu collegamende a pàgene ca angore non g'esiste.\nPe ccrejà 'a pàgene, accuminze a scrivere jndr'à 'u scatole de sotte (vide 'a [$1 pàggene d'ajute] pe avè cchiù 'mbormaziune).\nCe tu te iacche aqquà e manghe tu 'u se purcè, allore cazze 'u buttone '''back''' d'u brauser.",
-       "anontalkpagetext": "----''Queste jè 'na pàgene de 'ngazzaminde pe 'n'utende anonime, ca non ge vò ccu ccreje angore 'nu cunde utende, o de ce non g'u use.\nNuje auseme 'n'indirizze IP (ca jè numereche) pe identificarle.\nE' normale ca essende 'n'indirizze IP pò essere ausete pure da otre utinde ca 'u pigghiene.\nCe tu non ge si 'n'utende anonime e pinze ca le commende ca so revolte a te sonde studecarije, pe piacere [[Special:CreateAccount|ccreje 'nu cunde utende]] o [[Special:UserLogin|tràse]] pe no fà confusione jndr'à 'u future cu otre utinde anoneme.''",
+       "anontalkpagetext": "----\n<em>Queste jè 'na pàgene de 'ngazzaminde pe 'n'utende anonime, ca non ge vò ccu ccreje angore 'nu cunde utende, o de ce non g'u use.</em>\nNuje ausame 'n'indirizze IP (ca éte numereche) pe identificarle.\nE' normale ca pu fatte ca 'n'indirizze IP pò essere ausate pure da otre utinde ca 'u pigghiane.\nCe tu non ge si 'n'utende anonime e pinze ca le commende ca te arrivane sonde studecarije, pe piacere [[Special:CreateAccount|ccreje 'nu cunde utende]] o [[Special:UserLogin|tràse]] pe no fà confusione jndr'à 'u future cu otre utinde anoneme.",
        "noarticletext": "Non ge stè scritte ninde jndr'à sta pàgene.\nTu puè [[Special:Search/{{PAGENAME}}|cercà pe quiste titole]] jndr'à otre pàggene, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche l'archivije sue] o [{{fullurl:{{FULLPAGENAME}}|action=edit}} ccreje sta pàgene]</span>.",
        "noarticletext-nopermission": "Pe mò non ge stè teste jndr'à sta pàgene.\nTu puè [[Special:Search/{{PAGENAME}}|cercà pe stu titole]] jndr'à otre pàggene,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche jndr'à l'archivije cullegate]</span>, ma non ge tìne le permesse pe ccrejà sta pàgene.",
        "missing-revision": "'A revisione #$1 d'a pàgene chiamate \"{{FULLPAGENAME}}\" non g'esiste.\n\nQuiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.\nLe dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
        "userpage-userdoesnotexist": "'U cunde utende \"<nowiki>$1</nowiki>\" non g'è reggistrete.\nPe piacere, condrolle ce tu vuè cu ccreje/cange sta pàgene.",
        "userpage-userdoesnotexist-view": "'U cunde utende \"$1\" non g'è reggistrate.",
        "blocked-notice-logextract": "Stu utende jè correndemende bloccate.<br />\nL'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
-       "clearyourcache": "'''Vide Bbuene''' - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.\n*'''Firefox / Safari:''' cazze 'u ''Shift'' e condemboraneamende cazze 'u buttone ''Aggiorna'', o cazze 'nzieme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sus a 'nu Mac);\n*'''Google Chrome:''' cazze ''Ctrl-Shift-R'' (''⌘-Shift-R'' sus a 'nu Mac)\n*'''Internet Explorer:''' cazze ''Ctrl'' e condemboraneamende cazze ''Aggiorna,'' o cazze ''Ctrl-F5''.\n*'''Opera:''' pulizze 'a cache da ''Tools → Preferences'' (in inglese) (Struminde - Preferenze in tarandine);",
+       "clearyourcache": "<strong>Vide Bbuene</strong> - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.\n*<strong>Firefox / Safari:</strong> cazze 'u <em>Shift</em> e condemboraneamende cazze 'u buttone <em>Aggiorne</em>, o cazze 'nzieme <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> sus a 'nu Mac);\n*<strong>Google Chrome:</strong> cazze <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> sus a 'nu Mac)\n*<strong>Internet Explorer:</strong> cazze ''Ctrl'' e condemboraneamende cazze <em>Aggiorne</em> o cazze <em>Ctrl-F5</em>.\n*<strong>Opera:</strong> pulizze 'a cache da <em>Tools → Preferences</em> (in inglese) (Struminde - Preferenze in tarandine);",
        "usercssyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u CSS nuève apprime de reggistrà.",
        "userjsyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u JavaScript nuève apprime de reggistrà.",
        "usercsspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tue.'''\n'''Non g'à state angore reggistrete ninde!'''",
        "saveprefs": "Reggistre",
        "restoreprefs": "Repristine tutte le 'mbostaziune origgenale",
        "prefs-editing": "Stoche a cange",
-       "rows": "Righe:",
-       "columns": "Culonne:",
        "searchresultshead": "Cirche",
        "stub-threshold": "Soglie pe collegamende stub de formattazione ($1):",
        "stub-threshold-sample-link": "esembie",
        "editusergroup": "Cange le gruppe utinde",
        "editinguser": "Stè cange le deritte de {{GENDER:$1|l'utende}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Cange le gruppe d'utinde",
+       "userrights-viewusergroup": "'Ndruche le gruppe d'utinde",
        "saveusergroups": "Reggistre le gruppe d'utinde",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre imblicite de:",
        "userrights-reason": "Mutive:",
        "userrights-no-interwiki": "Tu non ge tìne le permesse pe cangià le deritte utende sus a l'otre uicchi.",
        "userrights-nodatabase": "'U Database $1 non g'esiste o non g'è lochele.",
-       "userrights-nologin": "Tu à essere [[Special:UserLogin|colleghete]] cu 'nu cunde utende d'amministratore pe assignà le deritte utende.",
-       "userrights-notallowed": "Non ge tìne le permesse pe aggiungere o luà le deritte a le utinde.",
        "userrights-changeable-col": "Gruppe ca tu puè cangià",
        "userrights-unchangeable-col": "Gruppe ca tu non ge puè cangià",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflitte sus a le cangiaminde de le deritte utende! Pe piacere revide e conferme le cangiaminde tune.",
-       "userrights-removed-self": "T'è luate le deritte tune. Mò non ge puè cchiù trasè jndr'à sta pàgene.",
        "group": "Gruppe:",
        "group-user": "Utinde",
        "group-autoconfirmed": "Utinde auto confermatarije",
        "right-siteadmin": "Blocche e sblocche 'u database",
        "right-override-export-depth": "L'esportazione de pàggene inglude pàggene collegate 'mbonde a 'na profonnetà de 5",
        "right-sendemail": "Manne 'a mail a otre utinde",
-       "right-passwordreset": "Vide l'e-mail de azzeramende d'a passuord",
        "right-managechangetags": "CCreje e scangìlle [[Special:Tags|tag]] da 'u database",
        "right-applychangetags": "Appleche [[Special:Tags|tag]] sus a 'u de le cangiaminde tune",
        "right-changetags": "Aggiunge e live arbitrariamende [[Special:Tags|tag]] sus a le revisiune individuale e vôsce de l'archivije",
        "uploaded-hostile-svg": "Acchiate 'nu CSS insecure ndr'à l'elemende de stile d'u file SVG carecate.",
        "uploaded-event-handler-on-svg": "'A 'mbostazione de le attribute de gestione de l'evende <code>$1=\"$2\"</code> non ge se pò ffà cu le file SVG.",
        "uploaded-href-unsafe-target-svg": "Acchiate 'na destinazione href non secure <code>&lt;$1 $2=\"$3\"&gt;</code> jndr'à 'u file SVG carecate.",
-       "uploadscriptednamespace": "Stu file SVG tène 'nu namespace illegale '$1'",
+       "uploadscriptednamespace": "Stu file SVG tène 'nu namespace illegale '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "L'XML jndr'à 'u file carecate non ge pò essere analizzate.",
        "uploadvirus": "Alanga toje, 'u file condiene 'nu virus! Dettaglie: $1",
        "uploadjava": "'U file jè 'nu file de tipe ZIP ca condene 'nu file de classe Java.\n'U carecamende de le file Java non g'è permesse, purcé lore ponne causà l'aggiramende de le restriziune de sicurezze.",
        "apisandbox-examples": "Esembie",
        "apisandbox-results": "Resultate",
        "apisandbox-request-url-label": "URL richieste:",
-       "apisandbox-request-time": "Tiembe cercate: $1",
+       "apisandbox-request-time": "Tiembe cercate: {{PLURAL:$1|$1 ms}}",
        "booksources": "Sorgende de le libbre",
        "booksources-search-legend": "Cirche pe le fonde de le libbre",
        "booksources-isbn": "ISBN:",
        "tags-actions-header": "Aziune",
        "tags-active-yes": "Sìne",
        "tags-active-no": "None",
-       "tags-source-extension": "Definite da 'n'estenzione",
+       "tags-source-extension": "Definite da 'u softuer",
        "tags-source-manual": "Applicate a màne da l'utinde e da le bot",
        "tags-source-none": "No cchiù ausate",
        "tags-edit": "cange",
        "tags-delete-not-allowed": "Tag definite da 'n'estenzione non ge ponne essere scangellate senze ca l'estenzione specifiche 'u permette.",
        "tags-delete-not-found": "'U tag \"$1\" non g'esiste.",
        "tags-delete-too-many-uses": "'U tag \"$1\" jè applecate a cchiù de $2 {{PLURAL:$2|revisione|revisiune}}, ca signifeche ca non ge pò essere scangellate.",
-       "tags-delete-warnings-after-delete": "'U tag \"$1\" ha state scangellate, ma  {{PLURAL:$2|ha assute 'u seguende avvise|onne assute le seguende avvise}}:",
+       "tags-delete-warnings-after-delete": "'U tag \"$1\" ha state scangellate, ma {{PLURAL:$2|ha assute 'u seguende avvise|onne assute le seguende avvise}}:",
        "tags-activate-title": "Attive 'u tag",
        "tags-activate-question": "Tu ste attive 'u tag \"$1\".",
        "tags-activate-reason": "Mutive:",
        "tags-edit-revision-legend": "Aggiunge o live le tag da {{PLURAL:$1|sta revisione|tutte le $1 revisiune}}",
        "tags-edit-logentry-legend": "Aggiunge o live le tag da {{PLURAL:$1|sta vôsce de l'archivije|tutte le $1 vôsce de l'archivije}}",
        "tags-edit-existing-tags": "Tag esistende:",
-       "tags-edit-existing-tags-none": "\"Nisciune\"",
+       "tags-edit-existing-tags-none": "<em>isciune</em>",
        "tags-edit-new-tags": "Tag nuève:",
        "tags-edit-add": "Agigunge ste tag:",
        "tags-edit-remove": "Live ste tag:",
        "feedback-useragent": "Utende agente:",
        "searchsuggest-search": "Cirche {{SITENAME}}",
        "searchsuggest-containing": "tène...",
-       "api-error-badaccess-groups": "Tu non ge puè carecà file sus a sta Uicchi.",
        "api-error-badtoken": "Errore inderne: Gettone errate.",
-       "api-error-copyuploaddisabled": "'U carecamende da URL jè disabbilitate sus a stu server.",
-       "api-error-duplicate": "{{PLURAL:$1|Stè 'n'otre file|Stonne otre file}} sus a 'u site cu 'u stesse condenute.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Stave 'n'otre file|Stavane otre file}} già sus a 'u site cu 'u stesse condenute, ma {{PLURAL:$1|ha state|onne state}} scangellate.",
-       "api-error-empty-file": "'U file ca tu è confermate ere vacande.",
        "api-error-emptypage": "Quanne se ne ccreje une, le pàggene vacande non ge sò permesse.",
-       "api-error-fetchfileerror": "Errore inderne: Quacchecose ha sciute stuèrte quanne ste analizzave 'u file.",
-       "api-error-fileexists-forbidden": "'Nu file cu 'u nome \"$1\" esiste, e non ge pò essere sovrascritte.",
-       "api-error-fileexists-shared-forbidden": "'Nu file cu 'u nome \"$1\" esiste jndr'à l'archivije de le file comune, e non ge pò essere sovrascritte.",
-       "api-error-file-too-large": "'U file ca tu è confermate jè troppe granne.",
-       "api-error-filename-tooshort": "'U nome d'u file jè troppe curte.",
-       "api-error-filetype-banned": "Stu tipe de file jè vietate.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ète 'nu tipe de file ca non g'è permesse|sonde tipe de file ca no sonde permesse}}. {{PLURAL:$3|'U tipe de file permesse ète|Le tipe de file permesse sonde}} $2.",
-       "api-error-filetype-missing": "'U file jè senze 'n'estenzione.",
-       "api-error-hookaborted": "'U cangiamende ca tu stè pruève a ffà ha state inderrotte da 'n'estenzione.",
-       "api-error-http": "Errore inderne: Non ge se riesce a collegà a 'u server",
-       "api-error-illegal-filename": "'U nome d'u file non g'è permesse.",
-       "api-error-internal-error": "Errore inderne: Quaccheccose ha sciute male mendre ca ste processamme 'u carecamende tune sus 'a uicchi.",
-       "api-error-invalid-file-key": "Errore inderne: 'U file non ge se iacchie jndr'à memorie temboranèe.",
-       "api-error-missingparam": "Errore inderne: Parametre mangande sus a richieste.",
-       "api-error-missingresult": "Errore inderne: Non ge se pò determinà ce 'a copie ha state fatte.",
-       "api-error-mustbeloggedin": "Tu a essere collegate pe carecà le file.",
-       "api-error-mustbeposted": "Errore inderne: 'A richieste vole HTTP POST.",
-       "api-error-noimageinfo": "'U carecamende ha riuscite, ma 'u server non ge n'ha date nisciuna 'mbormazione sus a 'u file.",
-       "api-error-nomodule": "Errore inderne: Nisciune module de carecamende 'mbostate.",
-       "api-error-ok-but-empty": "Errore inderne: Nisciune resposte da 'u server.",
-       "api-error-overwrite": "'A sovrascritture de 'nu file ca esiste non ge se pò fà.",
-       "api-error-stashfailed": "Errore inderne: 'U server ha fallite 'a reggistrazione de le file temboranèe.",
        "api-error-publishfailed": "Errore inderne: 'U server ha fallite 'a pubblecazione d'u file temboranèe.",
-       "api-error-stasherror": "Ha assute 'n'errore mendre ca carecave 'u file jndr'à 'u majazzine.",
-       "api-error-stashedfilenotfound": "'U file stipate non g'ha state acchiate quanne ste pruvave a carecarle jndr'à 'u majazzine.",
-       "api-error-stashpathinvalid": "'U percorse 'addò 'u file s'avesse acchià non g'è valide.",
-       "api-error-stashfilestorage": "Ha assute 'n'errore memorizzanne 'u file jndr'à 'u majazzine.",
-       "api-error-stashzerolength": "'U server non ge pò pigghiarse 'u file, purcé téne 'na lunghezze zero.",
-       "api-error-stashnotloggedin": "Tu a trasè pe reggistrà file jndr'à 'u majazzine de carecamende.",
-       "api-error-stashwrongowner": "'U file ca ste pruéve a pigghià da 'u majazzine non ge ste cchiù.",
-       "api-error-stashnosuchfilekey": "'A chiave d'u file ca ste pruéve a pigghià da 'u majazzine non g'esiste cchiù.",
-       "api-error-timeout": "'U server non g'ave resposte jndr'à 'u tiembe ca 'u spettave.",
-       "api-error-unclassified": "'N'errore scanusciute s'a verificate",
-       "api-error-unknown-code": "Errore scanusciute: \"$1\"",
-       "api-error-unknown-error": "Errore inderne: Quacche cose ha sciute storte quanne ste pruvave a carecà 'u file tune.",
+       "api-error-stashfailed": "Errore inderne: 'U server ha fallite 'a reggistrazione de le file temboranèe.",
        "api-error-unknown-warning": "Avvertimende scanusciute: $1",
        "api-error-unknownerror": "Errore scanusciute: \"$1\"",
-       "api-error-uploaddisabled": "Le carecaminde sonde disabbilitate sus a sta Uicchi.",
-       "api-error-verification-error": "Stu file pò essere scuasciate, o ave 'n'estenzione sbagliate.",
        "duration-seconds": "{{PLURAL:$1|seconde|seconde}}",
        "duration-minutes": "{{PLURAL:$1|minute|minute}}",
        "duration-hours": "$1 {{PLURAL:$1|ore}}",
index b0b6f34..88de994 100644 (file)
                        "Cat1987",
                        "SergeyButkov",
                        "Irus",
-                       "Kareyac"
+                       "Kareyac",
+                       "Mailman",
+                       "Аль-Гимравий",
+                       "Gamliel Fishkin",
+                       "Ping08"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
        "tog-hidecategorization": "Скрывать категоризацию страниц",
-       "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние",
+       "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние <small>(они могут быть сгруппированы настройкой на вкладке «[[Служебная:Настройки#mw-prefsection-rc|Свежие правки]]»)</small>",
        "tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
        "tog-numberheadings": "Автоматически нумеровать заголовки",
        "tog-showtoolbar": "Показывать панель инструментов при редактировании",
        "tog-watchdeletion": "Добавлять в список наблюдения удалённые мной страницы и файлы",
        "tog-watchuploads": "Добавлять закачанные мною файлы в список наблюдения",
        "tog-watchrollback": "Добавлять страницы, где я выполнил откат, в мой список наблюдения",
-       "tog-minordefault": "Помечать по умолчанию правки как малозначимые",
+       "tog-minordefault": "По умолчанию помечать правки как малые",
        "tog-previewontop": "Помещать предпросмотр перед окном редактирования",
        "tog-previewonfirst": "Показывать предпросмотр при переходе к редактированию",
        "tog-enotifwatchlistpages": "Уведомлять по электронной почте об изменениях страниц и файлов из списка наблюдения",
        "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": "Просмотреть страницу проекта",
        "pool-errorunknown": "Неизвестная ошибка",
        "pool-servererror": "Служба счётчика пула недоступна ($1).",
        "poolcounter-usage-error": "Ошибка использования: $1",
-       "aboutsite": "Описание {{grammar:genitive|{{SITENAME}}}}",
+       "aboutsite": "Описание {{GRAMMAR:prepositional|{{SITENAME}}}}",
        "aboutpage": "Project:Описание",
        "copyright": "Содержание доступно по лицензии $1 (если не указано иное).",
        "copyrightpage": "{{ns:project}}:Авторские права",
        "nosuchuser": "Участника с именем «$1» не существует.\nИмена участников чувствительны к регистру букв.\nПроверьте правильность написания имени или [[Special:CreateAccount|создайте новую учётную запись]].",
        "nosuchusershort": "Не существует участника с именем «$1». Проверьте написание имени.",
        "nouserspecified": "Вы должны указать имя участника.",
-       "login-userblocked": "ЭÑ\82оÑ\82 Ñ\83Ñ\87аÑ\81Ñ\82ник Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ован. Ð\92Ñ\85од Ð² Ñ\81иÑ\81Ñ\82емÑ\83 Ð½Ðµ Ñ\80азÑ\80еÑ\88Ñ\91н.",
+       "login-userblocked": "УÑ\87аÑ\81Ñ\82ник Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ован. Ð\92Ñ\85од Ð² Ñ\81иÑ\81Ñ\82емÑ\83 Ð·Ð°Ð¿Ñ\80еÑ\89ен.",
        "wrongpassword": "Введённый вами пароль неверен. Попробуйте ещё раз.",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
        "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
        "changepassword-success": "Ваш пароль был изменён!",
        "changepassword-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
        "botpasswords": "Пароли ботов",
-       "botpasswords-summary": "<em>Пароли бота</em> позволяют получить доступ к учётной записи пользователя через API без использования логина и пароля главной учётной записи. Права участника при входе с паролем бота могут быть ограничены.\n\nЕсли Вы не знаете, зачем вам это, вероятно, лучше этого не делайте. Никто никогда не должен просить вас, чтобы вы создали и сообщили его.",
+       "botpasswords-summary": "<em>Пароли бота</em> позволяют получить доступ к учётной записи пользователя через API без использования логина и пароля главной учётной записи. Права участника при входе с паролем бота могут быть ограничены.\n\nЕсли Вы не знаете, зачем это нужно, воздержитесь от использования этой страницы. Никто никогда не должен просить вас, чтобы вы создали и сообщили его.",
        "botpasswords-disabled": "Пароли бота отключены.",
        "botpasswords-no-central-id": "Для использования паролей бота вы должны войти в централизованную учётную запись.",
        "botpasswords-existing": "Существующие пароли бота",
        "passwordreset-emaildisabled": "Функции электронной почты отключены в этой вики.",
        "passwordreset-username": "Имя участника:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Просмотреть получившееся письмо?",
-       "passwordreset-capture-help": "Если вы установите данную отметку, то вам будет показано письмо с временным паролем, отправляемое участнику.",
        "passwordreset-email": "Адрес электронной почты:",
        "passwordreset-emailtitle": "Сведения об учётной записи {{SITENAME}}",
        "passwordreset-emailtext-ip": "Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней|1=один день}}.\nВы должны представиться системе и выбрать новый пароль. \nЕсли вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
        "passwordreset-emailelement": "Имя участника: \n$1\n\nВременный пароль: \n$2",
        "passwordreset-emailsentemail": "Если это адрес электронной почты связан с вашей учётной записью, вам будет отправлено письмо для сброса пароля.",
        "passwordreset-emailsentusername": "Если есть адрес электронной почты, связанный с этим именем участника, то будет отправлено письмо для восстановления пароля.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Письмо|Письма}} для сброса пароля {{PLURAL:$1|было отправлено|были отправлены}}. {{PLURAL:$1|Логин и пароль показаны|Список логинов и паролей показан}} здесь.",
-       "passwordreset-emailerror-capture2": "Отправка {{GENDER:$2|участнику|участнице}} письма по электронной почте не удалась: $1\n{{PLURAL:$3|Логин и пароль показаны|Список логинов и паролей показан}} здесь.",
        "passwordreset-nocaller": "Должен быть предоставлен источник вызова",
        "passwordreset-nosuchcaller": "Источник вызова не существует: $1",
        "passwordreset-ignored": "Сброс пароля не был обработан. Может быть, не был настроен ни один провайдер?",
        "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «{{int:savearticle}}» ещё раз, перенаправление всё же будет создано.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
        "missingcommentheader": "<strong>Напоминание.</strong> Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
-       "summary-preview": "Ð\9eпиÑ\81ание Ð±Ñ\83деÑ\82:",
-       "subject-preview": "Ð\97аголовок Ð±Ñ\83деÑ\82 Ð²Ñ\8bглÑ\8fдеÑ\82Ñ\8c Ñ\82ак:",
+       "summary-preview": "Ð\9fÑ\80едпÑ\80оÑ\81моÑ\82Ñ\80 Ð¾Ð¿Ð¸Ñ\81аниÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f:",
+       "subject-preview": "Ð\9fÑ\80едпÑ\80оÑ\81моÑ\82Ñ\80 Ñ\82емÑ\8b/заголовка:",
        "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Пожалуйста, указывайте эти сведения в любых своих обращениях.",
+       "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-адрес автоматически заблокирован в связи с тем, что он ранее использовался кем-то из участников, заблокированных {{GENDER:$4|участником|участницей}} $1. \nБыла указана следующая причина блокировки:\n\n: «$2».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\n\nОбратите внимание, что не сможете использовать функцию «письмо участнику», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\n\nВаш IP-адрес — $3, идентификатор блокировки — #$5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
+       "systemblockedtext": "Ваше имя участника или IP-адрес были автоматически заблокированы MediaWiki.\nУказана следующая причина:\n\n:<em>$2</em>\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВаш текущий IP-адрес $3.\nПожалуйста, указывайте все эти сведения в любых своих обращениях.",
        "blockednoreason": "причина не указана",
        "whitelistedittext": "Вы должны $1 для изменения страниц.",
        "confirmedittext": "Вы должны подтвердить свой адрес электронной почты перед правкой страниц.\nПожалуйста, введите и подтвердите свой адрес электронной почты в своих [[Special:Preferences|персональных настройках]].",
        "editpage-cannot-use-custom-model": "Модель содержимого этой страницы не может быть изменена.",
        "longpageerror": "'''ОШИБКА: записываемый вами текст имеет размер $1 {{PLURAL:$1|килобайт|килобайта|килобайт}}, что больше, чем установленный предел в $2 {{PLURAL:$2|килобайт|килобайта|килобайт}}. Страница не может быть сохранена.'''",
        "readonlywarning": "<strong>Предупреждение: База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.</strong>\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nСистемный администратор, заблокировавший базу данных, оставил следующее объяснение: $1",
-       "protectedpagewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°Ñ\89иÑ\89ена Ð¾Ñ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ов.'''\nНиже для справки приведена последняя запись журнала:",
+       "protectedpagewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°Ñ\89иÑ\89ена Ð¾Ñ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagewarning": "'''Замечание.''' Эта страница была защищена; редактировать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
        "cascadeprotectedwarning": "<strong>Предупреждение:</strong> Данную страницу могут редактировать только участники с административными правами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
        "titleprotectedwarning": "'''Предупреждение.  Это название защищено. Создать эту страницу могут только участники с [[Special:ListGroupRights|соответствующими правами]].'''\nНиже для справки приведена последняя запись журнала:",
        "undo-nochange": "Правка, похоже, уже была отменена.",
        "undo-summary": "Отмена правки $1, сделанной [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]])",
        "undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто",
-       "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса ('''$1''') было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: ''$2''.",
-       "cantcreateaccount-range-text": "{{GENDER:$3|УÑ\87аÑ\81Ñ\82ник|УÑ\87аÑ\81Ñ\82ниÑ\86а}} [[User:$3|$3]] {{GENDER:$3|Ñ\83Ñ\81Ñ\82ановил|Ñ\83Ñ\81Ñ\82ановила}} Ð·Ð°Ð¿Ñ\80еÑ\82 Ð½Ð° Ñ\81оздание Ñ\83Ñ\87Ñ\91Ñ\82нÑ\8bÑ\85 Ð·Ð°Ð¿Ð¸Ñ\81ей Ð¸Ð· Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° IP-адÑ\80еÑ\81ов <strong>$1</strong>, Ð²ÐºÐ»Ñ\8eÑ\87аÑ\8eÑ\89его Ð²Ð°Ñ\88 IP-адÑ\80еÑ\81 (<strong>$4</strong>). \n\nÐ\91Ñ\8bла Ñ\83казана Ñ\81ледÑ\83Ñ\8eÑ\89аÑ\8f Ð¿Ñ\80иÑ\87ина: $2.",
+       "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса (<strong>$1</strong>) было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: <em>$2</em>.",
+       "cantcreateaccount-range-text": "{{GENDER:$3|УÑ\87аÑ\81Ñ\82ник|УÑ\87аÑ\81Ñ\82ниÑ\86а}} [[User:$3|$3]] {{GENDER:$3|Ñ\83Ñ\81Ñ\82ановил|Ñ\83Ñ\81Ñ\82ановила}} Ð·Ð°Ð¿Ñ\80еÑ\82 Ð½Ð° Ñ\81оздание Ñ\83Ñ\87Ñ\91Ñ\82нÑ\8bÑ\85 Ð·Ð°Ð¿Ð¸Ñ\81ей Ð´Ð»Ñ\8f Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° IP-адÑ\80еÑ\81ов <strong>$1</strong>, Ð²ÐºÐ»Ñ\8eÑ\87аÑ\8eÑ\89его Ð²Ð°Ñ\88 IP-адÑ\80еÑ\81 (<strong>$4</strong>). \n\nÐ\91Ñ\8bла Ñ\83казана Ñ\81ледÑ\83Ñ\8eÑ\89аÑ\8f Ð¿Ñ\80иÑ\87ина: <em>$2</em>.",
        "viewpagelogs": "Показать журналы для этой страницы",
        "nohistory": "Для этой страницы история изменений отсутствует.",
        "currentrev": "Текущая версия",
        "rev-deleted-user": "(имя автора стёрто)",
        "rev-deleted-event": "(детали журнала удалены)",
        "rev-deleted-user-contribs": "[имя участника или IP-адрес удалены — правка скрыта со страницы вклада]",
-       "rev-deleted-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла '''Ñ\83далена'''.\nÐ\92озможно, Ð¾Ð±Ñ\8aÑ\8fÑ\81нениÑ\8f Ð´Ð°ны в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла <strong>Ñ\81кÑ\80Ñ\8bÑ\82а</strong>.\nÐ\9eбÑ\8aÑ\8fÑ\81нениÑ\8f Ñ\83далениÑ\8f приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
-       "rev-deleted-text-unhide": "Эта версия страницы была '''удалена'''.\nОбъяснения приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть данную версию].",
-       "rev-suppressed-text-unhide": "Эта версия страницы была '''скрыта'''.\nОбъяснения приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть данную версию].",
-       "rev-deleted-text-view": "Эта версия страницы была '''удалена'''.\nВы можете просмотреть её. Объяснения удаления приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-text-view": "Эта версия страницы была '''скрыта'''.\nВы можете просмотреть её. Объяснения удаления приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
-       "rev-deleted-no-diff": "Вы не можете просмотреть эту разницу версий, так как одна из версий страницы была '''удалена'''.\nВозможно, подробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-no-diff": "Вы не можете просмотреть различия между этими версиями страницы, так как одна из них была '''удалена'''.",
-       "rev-deleted-unhide-diff": "Одна из версий страницы была '''удалена'''.\nПодробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть разницу версий].",
-       "rev-suppressed-unhide-diff": "Одна из версий этого сравнения версий была '''скрыта'''.\nПодробности можно найти в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть эту разницу версий].",
-       "rev-deleted-diff-view": "Одна из версий этого сравнения версий была '''удалена'''.\nВы можете просмотреть это сравнение. Подробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-diff-view": "Одна из версий этого сравнения версий была '''скрыта'''.\nВы можете просмотреть это сравнение. Подробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
+       "rev-deleted-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла '''Ñ\83далена'''.\nÐ\9fодÑ\80обноÑ\81Ñ\82и Ð¿Ñ\80иведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла <strong>Ñ\81кÑ\80Ñ\8bÑ\82а</strong>.\nÐ\9fодÑ\80обноÑ\81Ñ\82и приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
+       "rev-deleted-text-unhide": "Эта версия страницы была <strong>удалена</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть данную версию].",
+       "rev-suppressed-text-unhide": "Эта версия страницы была <strong>скрыта</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть данную версию].",
+       "rev-deleted-text-view": "Эта версия страницы была <strong>удалена</strong>.\nВы можете просмотреть её. Подробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-text-view": "Эта версия страницы была <strong>скрыта</strong>.\nВы можете просмотреть её. Подробности приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
+       "rev-deleted-no-diff": "Вы не можете просмотреть эту разницу версий, так как одна из версий страницы была <strong>удалена</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-no-diff": "Вы не можете просмотреть различия между этими версиями страницы, так как одна из них была <strong>удалена</strong>.",
+       "rev-deleted-unhide-diff": "Одна из версий страницы была <strong>удалена</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть разницу версий].",
+       "rev-suppressed-unhide-diff": "Одна из версий этого сравнения версий была <strong>скрыта</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть эту разницу версий].",
+       "rev-deleted-diff-view": "Одна из версий этого сравнения версий была <strong>удалена</strong>.\nВы можете просмотреть это сравнение. Подробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-diff-view": "Одна из версий этого сравнения версий была <strong>скрыта</strong>.\nВы можете просмотреть это сравнение. Подробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
        "rev-delundel": "показать/скрыть",
        "rev-showdeleted": "показать",
        "revisiondelete": "Удалить / восстановить версии страницы",
        "revdelete-selected-text": "{{PLURAL:$1|Выбранная версия|Выбранные версии}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Выбранная версия файла|Выбранные версии файла}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|1=Выбранная запись|Выбранные записи}} журнала:",
-       "revdelete-text-text": "Удалённые версии будут по-прежнему видны в истории страницы, но части их содержимого будут недоступны для участников.",
-       "revdelete-text-file": "Удалённые версии файла будут по-прежнему видны в истории страницы, но части их содержимого будут недоступны для участников.",
-       "logdelete-text": "УдалÑ\91ннÑ\8bе Ñ\81обÑ\8bÑ\82иÑ\8f Ð² Ð¶Ñ\83Ñ\80нале Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð²Ð¸Ð´Ð½Ñ\8b Ð² Ð¶Ñ\83Ñ\80налаÑ\85, Ð½Ð¾ части их содержимого будут недоступны для участников.",
+       "revdelete-text-text": "Удалённые версии будут по-прежнему видны в истории страницы, но определенные части их содержимого будут недоступны для участников.",
+       "revdelete-text-file": "Удалённые версии файла будут по-прежнему видны в истории страницы, но определенные части их содержимого будут недоступны для участников.",
+       "logdelete-text": "УдалÑ\91ннÑ\8bе Ñ\81обÑ\8bÑ\82иÑ\8f Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð²Ð¸Ð´Ð½Ñ\8b Ð² Ð¶Ñ\83Ñ\80налаÑ\85, Ð½Ð¾ Ð¾Ð¿Ñ\80еделеннÑ\8bе части их содержимого будут недоступны для участников.",
        "revdelete-text-others": "Другие администраторы по-прежнему будут иметь возможность доступа к скрытому содержимому и смогут восстановить его, если не установлены дополнительные ограничения.",
        "revdelete-confirm": "Пожалуйста, подтвердите, что вы действительно желаете совершить это действие, осознаёте последствия, делаете это в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].",
-       "revdelete-suppress-text": "Сокрытие может производиться '''только''' в следующих случаях:\n* Потенциально клеветническая информация\n* Неуместная личная информация\n*: ''домашний адрес, номера телефонов, номер паспорта и т. д.''",
+       "revdelete-suppress-text": "Сокрытие может производиться <strong>только</strong> в следующих случаях:\n* потенциально клеветническая информация\n* неуместная личная информация\n*: <em>домашний адрес, номера телефонов, номер паспорта и т. д.</em>",
        "revdelete-legend": "Установить ограничения:",
        "revdelete-hide-text": "Текст правки",
        "revdelete-hide-image": "Скрыть содержимое файла",
        "search-interwiki-caption": "Родственные проекты",
        "search-interwiki-default": "Результаты из $1:",
        "search-interwiki-more": "(ещё)",
+       "search-interwiki-more-results": "ещё результаты",
        "search-relatedarticle": "Связанный",
        "searchrelated": "связанный",
        "searchall": "все",
        "search-external": "Внешний поиск",
        "searchdisabled": "Извините, но встроенный полнотекстовый поиск выключен. Вы можете воспользоваться поиском по сайту через поисковые системы общего назначения, однако имейте в виду, что копия сайта в их кэше может быть несколько устаревшей.",
        "search-error": "Произошла ошибка при поиске: $1",
+       "search-warning": "Во время поиска выдано предупреждение: $1",
        "preferences": "Настройки",
        "mypreferences": "Настройки",
        "prefs-edits": "Количество правок:",
        "saveprefs": "Сохранить",
        "restoreprefs": "Восстановить настройки по умолчанию",
        "prefs-editing": "Редактирование",
-       "rows": "Строк:",
-       "columns": "Столбцов:",
        "searchresultshead": "Поиск",
        "stub-threshold": "Порог для определения оформления ссылок на заготовки ($1):",
        "stub-threshold-sample-link": "пример",
        "prefs-help-recentchangescount": "Включает свежие правки, истории страниц, журналы.",
        "prefs-help-watchlist-token2": "Это секретный ключ для веб-канала вашего списка наблюдений.\nЛюбой, кто знает его, сможет читать ваш список наблюдения, поэтому не сообщайте его другим. [[Special:ResetTokens|Нажмите здесь, если вам нужно сбросить его]].",
        "savedprefs": "Ваши настройки сохранены.",
-       "savedrights": "Ð\9fÑ\80ава пользователя {{GENDER:$1|$1}} были сохранены.",
+       "savedrights": "Ð\93Ñ\80Ñ\83ппÑ\8b пользователя {{GENDER:$1|$1}} были сохранены.",
        "timezonelegend": "Часовой пояс:",
        "localtime": "Местное время:",
        "timezoneuseserverdefault": "Использовать настройки сервера ($1)",
        "youremail": "Электронная почта:",
        "username": "{{GENDER:$1|Имя участника|Имя участницы}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член|Член}} {{PLURAL:$1|1=группы|групп}}:",
+       "group-membership-link-with-expiry": "$1 (до $2)",
        "prefs-registration": "Время регистрации:",
        "yourrealname": "Настоящее имя:",
        "yourlanguage": "Язык интерфейса:",
        "badsig": "Неверная подпись. Проверьте корректность HTML-тегов.",
        "badsiglength": "Слишком длинная подпись.\nПодпись не должна превышать $1 {{PLURAL:$1|символа|символа|символов}}.",
        "yourgender": "Какое описание вам более подходит?",
-       "gender-unknown": "При упоминании вас программное обеспечение, когда это возможно, будет использовать гендерно-нейтральные слова",
+       "gender-unknown": "При упоминании вас, программное обеспечение, когда это возможно, будет использовать гендерно-нейтральные слова",
        "gender-male": "Он редактирует страницы вики",
        "gender-female": "Онa редактирует страницы вики",
        "prefs-help-gender": "Этот параметр задавать необязательно.\nДвижок использует это значение, чтобы обращаться к вам и упоминать вас в правильном грамматическом роде.\nЭта информация будет общедоступной.",
        "prefswarning-warning": "Вы внесли в свои настройки изменения, которые ещё не были сохранены.\nЕсли вы покинете эту страницу, не нажав «$1», настройки не будут обновлены.",
        "prefs-tabs-navigation-hint": "Совет: Вы можете использовать клавиши стрелок влево и вправо для перехода между вкладками в списке вкладок.",
        "userrights": "Управление правами участника",
-       "userrights-lookup-user": "УпÑ\80авление Ð³Ñ\80Ñ\83ппами Ñ\83Ñ\87аÑ\81Ñ\82ников",
+       "userrights-lookup-user": "Ð\92Ñ\8bбоÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника",
        "userrights-user-editname": "Введите имя учётной записи:",
-       "editusergroup": "Ð\98змениÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ника|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86Ñ\8b}}",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b Ñ\83Ñ\87аÑ\81Ñ\82ников",
        "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-nologin": "Вы должны [[Special:UserLogin|представиться системе]] с учётной записи администратора, чтобы присваивать права участникам.",
-       "userrights-notallowed": "У вас нет разрешения добавлять и удалять права участников.",
        "userrights-changeable-col": "Группы, которые вы можете изменять",
        "userrights-unchangeable-col": "Группы, которые вы не можете изменять",
+       "userrights-expiry-current": "Истекает $1",
+       "userrights-expiry-none": "Никогда",
+       "userrights-expiry": "Права истекают:",
+       "userrights-expiry-existing": "$2, $3",
+       "userrights-expiry-othertime": "Другое время:",
+       "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-conflict": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.",
-       "userrights-removed-self": "Вы удалили собственные права. Таким образом, вы больше не сможете получить доступ к этой странице.",
        "group": "Группа:",
        "group-user": "Участники",
        "group-autoconfirmed": "Автоподтверждённые участники",
        "right-createpage": "создание страниц, не являющихся обсуждениями",
        "right-createtalk": "создание страниц обсуждений",
        "right-createaccount": "создание новых учётных записей участников",
-       "right-autocreateaccount": "Ð\90втоматический вход с помощью внешней учётной записи участника",
+       "right-autocreateaccount": "автоматический вход с помощью внешней учётной записи участника",
        "right-minoredit": "простановка отметки «малое изменение»",
        "right-move": "переименование страниц",
        "right-move-subpages": "переименование страниц с их подстраницами",
        "right-move-rootuserpages": "переименование корневых страниц участников",
        "right-move-categorypages": "переименование страниц категорий",
        "right-movefile": "переименование файлов",
-       "right-suppressredirect": "пеÑ\80еименование Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±ÐµÐ· Ñ\81озданиÑ\8f Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f Ñ\81о Ñ\81Ñ\82аÑ\80ого Ð¸Ð¼ÐµÐ½Ð¸",
+       "right-suppressredirect": "подавление Ð¿ÐµÑ\80енапÑ\80авлений Ð¿Ñ\80и Ð¿ÐµÑ\80еименовании Ñ\81Ñ\82Ñ\80аниÑ\86",
        "right-upload": "загрузка файлов",
        "right-reupload": "запись файлов поверх существующих",
        "right-reupload-own": "перезапись файлов тем же участником",
        "right-reupload-shared": "подмена файлов из общих хранилищ локальными",
        "right-upload_by_url": "загрузка файлов с адреса URL",
-       "right-purge": "очистка кэша страниц без страницы подтверждения",
-       "right-autoconfirmed": "неÑ\82 Ð¾Ð³Ñ\80аниÑ\87ений Ð¿Ð¾ скорости на IP-адрес",
-       "right-bot": "считаться автоматическим процессом",
+       "right-purge": "очистка кэша страниц без подтверждения",
+       "right-autoconfirmed": "обÑ\85од Ð¾Ð³Ñ\80аниÑ\87ений скорости на IP-адрес",
+       "right-bot": "автоматический процесс",
        "right-nominornewtalk": "отсутствие малых правок на страницах обсуждений включает режим новых сообщений",
-       "right-apihighlimits": "меньше ограничений на выполнение API-запросов",
+       "right-apihighlimits": "уменьшение ограничений на выполнение API-запросов",
        "right-writeapi": "использование API для записи",
        "right-delete": "удаление страниц",
        "right-bigdelete": "удаление страниц с длинными историями изменений",
        "right-editmyusercss": "редактирование своих пользовательских CSS-файлов",
        "right-editmyuserjs": "редактирование своих пользовательских JavaScript-файлов",
        "right-viewmywatchlist": "просмотр своего списка наблюдения",
-       "right-editmywatchlist": "редактирование своего списка наблюдения; обратите внимание, что некоторые действия будут добавлять страницы даже без такого права",
+       "right-editmywatchlist": "редактирование своего списка наблюдения",
        "right-viewmyprivateinfo": "просмотр собственных личных данных (например, адрес электронной почты, настоящее имя)",
        "right-editmyprivateinfo": "правка собственных личных данных (например, адрес электронной почты, настоящее имя)",
        "right-editmyoptions": "редактирование собственных предпочтений",
-       "right-rollback": "быстрый откат правок последнего участника на определенной странице",
+       "right-rollback": "быстрый откат правок последнего участника",
        "right-markbotedits": "отметка откатываемых правок как правок бота",
-       "right-noratelimit": "неÑ\82 Ð¾Ð³Ñ\80аниÑ\87ений Ð¿Ð¾ скорости",
+       "right-noratelimit": "обÑ\85од Ð¾Ð³Ñ\80аниÑ\87ений скорости",
        "right-import": "импорт страниц из других вики",
        "right-importupload": "импорт страниц через загрузку файлов",
-       "right-patrol": "оÑ\82меÑ\82ка Ð¿Ñ\80авок ÐºÐ°Ðº Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bÑ\85",
-       "right-autopatrol": "пÑ\80авки Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¾Ñ\82меÑ\87аÑ\8eÑ\82Ñ\81Ñ\8f ÐºÐ°Ðº Ð¿Ð°Ñ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе",
+       "right-patrol": "паÑ\82Ñ\80Ñ\83лиÑ\80ование Ð¿Ñ\80авок",
+       "right-autopatrol": "авÑ\82омаÑ\82иÑ\87еÑ\81кое Ð¿Ð°Ñ\82Ñ\80Ñ\83лиÑ\80ование Ð¿Ñ\80авок",
        "right-patrolmarks": "просмотр отметок о патрулировании в свежих правках",
        "right-unwatchedpages": "просмотр списка ненаблюдаемых страниц",
        "right-mergehistory": "объединение историй страниц",
        "right-siteadmin": "блокировка и разблокировка базы данных",
        "right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
        "right-sendemail": "отправка электронной почты другим участникам",
-       "right-passwordreset": "просмотр электронных писем с изменением пароля",
        "right-managechangetags": "создание и (де)активация [[Special:Tags|меток]]",
        "right-applychangetags": "применение [[Special:Tags|меток]] вместе со своими правками",
        "right-changetags": "добавление и удаление произвольных [[Special:Tags|меток]] на отдельных правках и записях в журнале",
        "grant-basic": "Основные права",
        "grant-viewdeleted": "Просмотр удалённых файлов и страниц",
        "grant-viewmywatchlist": "Просмотр вашего списка наблюдения",
-       "grant-viewrestrictedlogs": "СмоÑ\82Ñ\80еÑ\82Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81и Ð¶Ñ\83Ñ\80нала с ограниченным доступом",
+       "grant-viewrestrictedlogs": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\81ей Ð¶Ñ\83Ñ\80налов с ограниченным доступом",
        "newuserlogpage": "Журнал регистрации участников",
        "newuserlogpagetext": "Список недавно зарегистрировавшихся участников",
        "rightslog": "Журнал прав участника",
        "action-upload_by_url": "загрузку этого файла с адреса URL",
        "action-writeapi": "использование API для правок",
        "action-delete": "удаление этой страницы",
-       "action-deleterevision": "удаление этой версии страницы",
-       "action-deletedhistory": "просмотр удалённой истории этой страницы",
+       "action-deleterevision": "удаление версий страниц",
+       "action-deletelogentry": "удаление записей журнала",
+       "action-deletedhistory": "просмотр удалённой истории страницы",
+       "action-deletedtext": "просмотр текста удалённой версии",
        "action-browsearchive": "поиск удалённых страниц",
-       "action-undelete": "воÑ\81Ñ\81Ñ\82ановление Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b",
-       "action-suppressrevision": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð¸ Ð²Ð¾Ñ\81Ñ\81Ñ\82ановление Ñ\8dÑ\82ой Ñ\81кÑ\80Ñ\8bÑ\82ой Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b",
-       "action-suppressionlog": "пÑ\80оÑ\81моÑ\82Ñ\80 Ñ\8dÑ\82ого Ñ\87аÑ\81Ñ\82ного Ð¶Ñ\83Ñ\80нала",
-       "action-block": "огÑ\80аниÑ\87иваÑ\82Ñ\8c Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82Ñ\8c Ñ\80едакÑ\82иÑ\80ованиÑ\8f Ð´Ð»Ñ\8f Ñ\8dÑ\82ого участника",
+       "action-undelete": "воÑ\81Ñ\81Ñ\82ановление Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "action-suppressrevision": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð¸ Ð²Ð¾Ñ\81Ñ\81Ñ\82ановление Ñ\81кÑ\80Ñ\8bÑ\82Ñ\8bÑ\85 Ð²ÐµÑ\80Ñ\81ий Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "action-suppressionlog": "просмотр частного журнала",
+       "action-block": "блокиÑ\80овкÑ\83 участника",
        "action-protect": "изменение уровня защиты этой страницы",
-       "action-rollback": "быстрый откат изменений участника, который последним редактировал страницу",
+       "action-rollback": "быстрый откат изменений",
        "action-import": "импорт страниц из другой вики",
        "action-importupload": "импорт страниц из загруженного файла",
        "action-patrol": "отметка чужих правок как отпатрулированных",
        "action-autopatrol": "отметка своих правок как отпатрулированных",
        "action-unwatchedpages": "просмотр списка страниц, за которыми не следят",
        "action-mergehistory": "присоединение истории изменений этой страницы",
-       "action-userrights": "изменение Ð²Ñ\81еÑ\85 Ð¿Ñ\80ав Ñ\83Ñ\87аÑ\81Ñ\82ника",
+       "action-userrights": "изменение прав участника",
        "action-userrights-interwiki": "изменение прав участников в других вики",
-       "action-siteadmin": "блокировка и разблокировка базы данных",
+       "action-siteadmin": "блокировку и разблокировку базы данных",
        "action-sendemail": "отправка электронных писем",
+       "action-editmyoptions": "редактирование своих настроек",
        "action-editmywatchlist": "редактирование вашего списка наблюдения",
        "action-viewmywatchlist": "просмотр вашего списка наблюдения",
        "action-viewmyprivateinfo": "просмотр вашей частной информации",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (см. также [[Special:NewPages|список новых страниц]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показать",
+       "rcfilters-activefilters": "Активные фильтры",
+       "rcfilters-restore-default-filters": "Восстановить фильтры по умолчанию",
+       "rcfilters-clear-all-filters": "Очистить все фильтры",
+       "rcfilters-search-placeholder": "Последние изменения фильтров (просмотрите или начните вводить)",
+       "rcfilters-invalid-filter": "Недопустимый фильтр",
+       "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
+       "rcfilters-filterlist-title": "Фильтры",
+       "rcfilters-filterlist-noresults": "Фильтры не найдены",
+       "rcfilters-filtergroup-registration": "Регистрация участников",
+       "rcfilters-filter-registered-label": "Зарегистрированные",
+       "rcfilters-filter-registered-description": "Вошедшие редакторы.",
+       "rcfilters-filter-unregistered-label": "Незарегистрированные",
+       "rcfilters-filter-unregistered-description": "Редакторы, которые не вошли в систему.",
+       "rcfilters-filtergroup-authorship": "Редактировать авторство",
+       "rcfilters-filter-editsbyself-label": "Ваши собственные правки",
+       "rcfilters-filter-editsbyself-description": "Ваши правки.",
+       "rcfilters-filter-editsbyother-label": "Правки других участников",
+       "rcfilters-filter-editsbyother-description": "Правки, сделанные другими участниками (не вами).",
+       "rcfilters-filtergroup-userExpLevel": "Уровня опыта (только для зарегистрированных участников)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новички",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Менее 10 правок и 4 дней работы.",
+       "rcfilters-filter-userExpLevel-learner-label": "Учащиеся",
+       "rcfilters-filter-userExpLevel-learner-description": "Больше правок и дней работы, чем у «Новичков», но меньше, чем у «Опытных пользователей».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Опытные пользователи",
+       "rcfilters-filter-userExpLevel-experienced-description": "Более 30 дней активности и 500 правок.",
+       "rcfilters-filtergroup-automated": "Автоматизированные вклады",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-bots-description": "Правки, сделанные с помощью автоматизированных инструментов.",
+       "rcfilters-filter-humans-label": "Человек (не бот)",
+       "rcfilters-filter-humans-description": "Правки, внесённые редакторами.",
+       "rcfilters-filtergroup-significance": "Значение",
+       "rcfilters-filter-minor-label": "Малые правки",
+       "rcfilters-filter-minor-description": "Правки, которые автор пометил как малые.",
+       "rcfilters-filter-major-label": "Обычные правки",
+       "rcfilters-filter-major-description": "Правки, не помеченные как малые.",
+       "rcfilters-filtergroup-changetype": "Тип изменения",
+       "rcfilters-filter-pageedits-label": "Правки страницы",
+       "rcfilters-filter-pageedits-description": "Правки содержимого, обсуждений, описания категорий…",
+       "rcfilters-filter-newpages-label": "Создания страниц",
+       "rcfilters-filter-newpages-description": "Правки, приводящие к созданию новых страниц.",
+       "rcfilters-filter-categorization-label": "Изменения категорий",
+       "rcfilters-filter-categorization-description": "Записи о страницах, добавленных или удаленных из категорий.",
+       "rcfilters-filter-logactions-label": "Протоколируемые действия",
+       "rcfilters-filter-logactions-description": "Административные действия, создания учётных записей, удаления страниц, загрузки файлов…",
        "rcnotefrom": "Ниже {{PLURAL:$5|указано изменение|перечислены изменения}} с <strong>$3, $4</strong> (показано не более <strong>$1</strong>).",
        "rclistfrom": "Показать изменения с $3 $2.",
        "rcshowhideminor": "$1 малые правки",
        "upload_directory_missing": "Директория для загрузок ($1) отсутствует и не может быть создана веб-сервером.",
        "upload_directory_read_only": "Веб-сервер не имеет прав записи в папку ($1), в которой предполагается хранить загружаемые файлы.",
        "uploaderror": "Ошибка загрузки файла",
-       "upload-recreate-warning": "'''Внимание: файл с таким именем был удален или переименован.'''\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|200px|thumb|left|описание]]</nowiki></code>''' для вставки слева от текста уменьшенной до 200 пикселей по ширине версии файла с выводом под ним указанного описания;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' для вставки ссылки на файл, без отображения его содержимого на странице.",
+       "upload-recreate-warning": "<strong>Внимание: файл с таким именем был удален или переименован.</strong>\n\nНиже представлены журналы удалений и переименований этой страницы:",
+       "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|200px|thumb|left|описание]]</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.",
        "uploaded-setting-handler-svg": "SVG, который задаёт атрибут «handler» с помощью удалённого адреса/данных/скрипта, блокируется. Найдена конструкция <code>$1=\"$2\"</code> в загруженном SVG-файле.",
        "uploaded-remote-url-svg": "SVG, который задаёт любой атрибут стиля с помощью удалённого URL-адреса, блокируется. Найдена конструкция <code>$1=\"$2\"</code> в загруженном SVG-файле.",
        "uploaded-image-filter-svg": "В загруженном SVG-файле найден фильтр изображений с URL-адресом <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Этот SVG-файл содержит некорректное пространство имён '$1'",
+       "uploadscriptednamespace": "Этот SVG-файл содержит некорректное пространство имён '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML в загруженном файле не может быть проанализирован.",
        "uploadvirus": "Файл содержит вирус! См. $1",
        "uploadjava": "Файл представляет собой ZIP-архив, содержащий .class файл Java.\nЗагрузка Java-файлов не допускается из-за соображений безопасности.",
        "backend-fail-usable": "Не удалось прочитать или записать файл «$1» из-за нехватки прав или отсутствия нужных папок.",
        "filejournal-fail-dbconnect": "Не удалось подключиться к базе данных журнала для хранилища «$1».",
        "filejournal-fail-dbquery": "Не удалось обновить базу данных журнала для хранилища «$1».",
-       "lockmanager-notlocked": "Не удалось разблокировать \"$1\"; он не заблокирован.",
+       "lockmanager-notlocked": "Не удалось разблокировать «$1»; он не заблокирован.",
        "lockmanager-fail-closelock": "Не удалось закрыть файл блокировки для  «$1».",
        "lockmanager-fail-deletelock": "Не удалось удалить файл блокировки для «$1».",
        "lockmanager-fail-acquirelock": "Не удалось добиться блокировки «$1».",
        "lockmanager-fail-openlock": "Не удалось открыть файл блокировки для «$1».",
-       "lockmanager-fail-releaselock": "Не удалось разблокировать \"$1\".",
+       "lockmanager-fail-releaselock": "Не удалось разблокировать «$1».",
        "lockmanager-fail-db-bucket": "Не удалось связаться с достаточным количеством баз блокировок в сегменте $1.",
        "lockmanager-fail-db-release": "Не удалось снять блокировку базы данных  $1 .",
        "lockmanager-fail-svr-acquire": "Не удалось получить блокировку на сервере  $1.",
        "upload-curl-error6": "Невозможно обратить по указанному адресу.",
        "upload-curl-error6-text": "Невозможно обратить по указанному адресу. Пожалуйста, проверьте, что адрес верен, а сайт доступен.",
        "upload-curl-error28": "Время, отведённое на загрузку, истекло",
-       "upload-curl-error28-text": "Сайт слишком долго не отвечает. Пожалуйста, проверьте что сайт работоспособен и после небольшого перерыва попробуйте ещё раз. Возможно, операцию следует провести в другое время, когда сайт менее нагружен.",
+       "upload-curl-error28-text": "Сайт слишком долго не отвечает. \nПожалуйста, проверьте что сайт работоспособен и после небольшого перерыва попробуйте ещё раз. Возможно, операцию следует провести в другое время, когда сайт менее нагружен.",
        "license": "Лицензирование:",
        "license-header": "Лицензирование",
        "nolicense": "Ничего не выбрано",
        "uncategorizedcategories": "Некатегоризованные категории",
        "uncategorizedimages": "Некатегоризованные файлы",
        "uncategorizedtemplates": "Некатегоризованные шаблоны",
+       "uncategorized-categories-exceptionlist": "# Содержит список категорий, которые не должны упоминаться на Special:UncategorizedCategories. По одной в строке, начиная их с символа «*». Строки, начинающиеся с другого символа (включая пробелы) игнорируются. Используйте «#» для комментариев.",
        "unusedcategories": "Неиспользуемые категории",
        "unusedimages": "Неиспользуемые файлы",
        "wantedcategories": "Требуемые категории",
        "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 мс}}",
        "apisandbox-results-fixtoken": "Исправьте токен и повторите отправку",
        "apisandbox-results-fixtoken-fail": "Не удалось вызвать токен «$1».",
        "apisandbox-continue-clear": "Очистить",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries продолжит] последний запрос; {{int:apisandbox-continue-clear}} очистит связанные с продолжением параметры.",
        "apisandbox-param-limit": "Введите <kbd>максимальное</kbd> использование максимального предела.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Все пространства имён)",
+       "apisandbox-multivalue-all-values": "$1 (Все значения)",
        "booksources": "Источники книг",
        "booksources-search-legend": "Поиск информации о книге",
        "booksources-isbn": "ISBN:",
        "listusers-blocked": "(заблокирован{{GENDER:$1||а}})",
        "activeusers": "Список активных участников",
        "activeusers-intro": "Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней|1=последний день}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|пÑ\80авка|пÑ\80авки|пÑ\80авок}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
+       "activeusers-count": "$1 {{PLURAL:$1|дейÑ\81Ñ\82вие|дейÑ\81Ñ\82виÑ\8f|дейÑ\81Ñ\82вий}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
        "activeusers-from": "Показать участников, начиная с:",
-       "activeusers-groups": "Отображать пользователей, принадлежащих к группам:",
+       "activeusers-groups": "Отображать участников, принадлежащих к группам:",
+       "activeusers-excludegroups": "Исключать участников, принадлежащих к группам:",
        "activeusers-noresult": "Не найдено участников.",
        "activeusers-submit": "Показать активных участников",
        "listgrouprights": "Права групп участников",
        "emailccsubject": "Копия вашего сообщения для $1: $2",
        "emailsent": "Письмо отправлено",
        "emailsenttext": "Ваше электронное сообщение отправлено.",
-       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailuser}}» проекта {{SITENAME}}.",
+       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailuser}}» проекта {{SITENAME}}. Если {{GENDER:$2|вы}} ответите на это письмо, оно будет отослано напрямую {{GENDER:$1|отправителю}}, так что {{GENDER:$2|ваш}} адрес электронной почты станет известен {{GENDER:$1|ему|ей}}.",
        "usermessage-summary": "Оставить системное сообщение.",
        "usermessage-editor": "Системная доставка",
        "watchlist": "Список наблюдения",
        "deletecomment": "Причина:",
        "deleteotherreason": "Другая причина/дополнение:",
        "deletereasonotherlist": "Другая причина",
-       "deletereason-dropdown": "* Типовые причины удаления\n** спам\n** вандализм\n** нарушение авторских прав\n** по запросу автора\n** неработающее перенаправление",
+       "deletereason-dropdown": "* Типовые причины удаления\n** Спам\n** Вандализм\n** Нарушение авторских прав\n** По запросу автора\n** Неработающее перенаправление",
        "delete-edit-reasonlist": "Править список причин",
        "delete-toobig": "У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.\nУдаление таких страниц было запрещено во избежание нарушений в работе сайта «{{SITENAME}}».",
        "delete-warning-toobig": "У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.\nЕё удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;\nдействуйте с осторожностью.",
        "changecontentmodel-emptymodels-title": "Нет доступных моделей содержимого",
        "changecontentmodel-emptymodels-text": "Содержимое на [[:$1]] не может быть преобразовано ни к одному типу.",
        "log-name-contentmodel": "Журнал изменения моделей содержимого",
-       "log-description-contentmodel": "СобÑ\8bÑ\82иÑ\8f, Ñ\81вÑ\8fзаннÑ\8bе Ñ\81 Ð¼Ð¾Ð´ÐµÐ»Ñ\8fми Ñ\81одеÑ\80жимого Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "log-description-contentmodel": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ\81одеÑ\80жимого Ñ\81Ñ\82Ñ\80аниÑ\86, Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\8bли Ñ\81озданÑ\8b Ð¿Ð¾ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ\81одеÑ\80жимого, Ð¾Ñ\82лиÑ\87ной Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ной.",
        "logentry-contentmodel-new": "$1 создал{{GENDER:$2||а}} страницу $3 с использованием нестандартной модели содержимого «$5»",
        "logentry-contentmodel-change": "$1 изменил{{GENDER:$2||а}} модель содержимого страницы $3 с «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "откат",
        "sp-contributions-talk": "обсуждение",
        "sp-contributions-userrights": "управление правами участника",
        "sp-contributions-blocked-notice": "Этот участник в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
-       "sp-contributions-blocked-notice-anon": "Этот IP-адрес в данный момент заблокирован.\nНиже приведена последняя запись из журнала блокировок:",
+       "sp-contributions-blocked-notice-anon": "Этот IP-адрес в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
        "sp-contributions-search": "Поиск вклада",
        "sp-contributions-username": "IP-адрес или имя участника:",
        "sp-contributions-toponly": "Показывать только правки, являющиеся последними версиями",
        "whatlinkshere-hideredirs": "$1 перенаправления",
        "whatlinkshere-hidetrans": "$1 включения",
        "whatlinkshere-hidelinks": "$1 ссылки",
-       "whatlinkshere-hideimages": "$1 файловые ссылки",
+       "whatlinkshere-hideimages": "$1 файл{{PLURAL:$1|овая ссылка|овых ссылки|овых ссылок}}",
        "whatlinkshere-filters": "Фильтры",
        "whatlinkshere-submit": "Выполнить",
        "autoblockid": "Автоблокировка #$1",
        "proxyblockreason": "Ваш IP-адрес заблокирован потому, что это открытый прокси-сервер. Пожалуйста, свяжитесь со своиим интернет-провайдером или службой поддержки, и сообщите им об этой серьёзной проблеме безопасности.",
        "sorbsreason": "Ваш IP-адрес числится как открытый прокси в DNSBL.",
        "sorbs_create_account_reason": "Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.",
+       "softblockrangesreason": "Анонимные правки не разрешены с вашего IP-адреса ($1). Пожалуйста, войдите в систему.",
        "xffblockreason": "Был заблокирован IP-адрес, присутствующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо используемому вами прокси-серверу. Первоначальная причина блокировки была следующей: $1",
-       "cant-see-hidden-user": "Участник, которого вы пытаетесь заблокировать, уже заблокирован и скрыт. Поскольку у вас нет разрешения на работу по сокрытию участников, вы не можете просмотреть или изменить данную блокировку.",
+       "cant-see-hidden-user": "Участник, которого вы пытаетесь заблокировать, уже заблокирован и скрыт. Поскольку у вас недостаточно прав, вы не можете просмотреть детали.",
        "ipbblocked": "Вы не можете блокировать или разблокировать других участников, так как вы сами заблокированы",
        "ipbnounblockself": "Вы не можете разблокировать самого себя",
        "lockdb": "Сделать базу данных доступной только для чтения",
        "movepagetext": "Воспользовавшись нижеприведённой формой, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое.\nВы можете автоматически обновить перенаправления, которые вели на старое название.\nЕсли вы этого не сделаете, пожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если уже существует страница с названием, идентичным выбранному, кроме случаев, когда такая страница пуста или представляет собой перенаправление, и при этом не имеет истории правок.\nЭто означает, что сделав ошибочное переименование, вы можете переименовать страницу обратно в то название, которое у неё только что было, но не можете случайно затереть существующую страницу.\n\n<strong>Примечание:</strong>\nПереименование популярных страниц может привести к масштабным и неожиданным изменениям.\nПожалуйста, прежде чем продолжать, убедитесь, что понимаете все возможные последствия.",
        "movepagetext-noredirectfixer": "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое название.\nПожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если страница с новым названием уже существует, кроме случаев, если она пуста или представляет собой перенаправление, и при этом не имеет истории правок.\nЭто означает, что сделав ошибочное переименование, вы сможете переименовать страницу обратно в то название, которое у неё только что было, но не сможете случайно затереть существующую страницу.\n\n<strong>Примечание:</strong>\nПереименование может привести к масштабным и неожиданным изменениям для популярных страниц.\nПожалуйста, прежде чем продолжить, убедитесь, что понимаете все возможные последствия.",
        "movepagetalktext": "Если вы отметите этот пункт, связанная с ней страница обсуждения будет также автоматически переименована, если только уже не существует непустая страница обсуждения с таким же названием.\n\nВ этом случае вам нужно будет переименовать или объединить страницы вручную, если это необходимо.",
-       "moveuserpage-warning": "'''Внимание.''' Вы собираетесь переименовать страницу участника. Пожалуйста, обратите внимание, что переименована будет только страница, участник '''не''' будет переименован.",
+       "moveuserpage-warning": "<strong>Внимание:</strong> вы собираетесь переименовать страницу участника. Пожалуйста, обратите внимание, что переименована будет только страница, участник <strong>не</strong> будет переименован.",
        "movecategorypage-warning": "<strong>Предупреждение:</strong> Вы собираетесь переименовать страницу категории. Пожалуйста, обратите внимание, что будет переименована только эта страница, а все страницы старой категории <em>не</em> будут перекатегоризованы в новую.",
        "movenologintext": "Вы должны [[Special:UserLogin|представиться системе]],\nчтобы иметь возможность переименовать страницы.",
        "movenotallowed": "У вас нет разрешения переименовывать страницы.",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
        "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
        "cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
+       "cant-move-subpages": "У вас нет разрешения переименовывать подстраницы.",
+       "namespace-nosubpages": "Пространство имён «$1» не разрешает создание страниц.",
        "newtitle": "Новое название:",
        "move-watch": "Добавить в список наблюдения исходную и целевую страницы",
        "movepagebtn": "Переименовать страницу",
        "imageinvalidfilename": "Целевое имя файла ошибочно",
        "fix-double-redirects": "Исправить перенаправления, указывающие на прежнее название",
        "move-leave-redirect": "Оставить перенаправление",
-       "protectedpagemovewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð·Ð°Ñ\89иÑ\89ена; Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ов.'''\nНиже для справки приведена последняя запись журнала:",
+       "protectedpagemovewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð·Ð°Ñ\89иÑ\89ена; Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagemovewarning": "'''Замечание.''' Эта страница была защищена; переименовать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
        "move-over-sharedrepo": "В общем хранилище существует [[:$1]]. Переименование файла в это название вызовет перекрытие файла из общего хранилища.",
        "file-exists-sharedrepo": "Выбранное имя файла уже используется в общем хранилище.\nПожалуйста, выберите другое имя.",
        "pageinfo-length": "Длина страницы (в байтах)",
        "pageinfo-article-id": "Идентификатор страницы",
        "pageinfo-language": "Язык страницы",
+       "pageinfo-language-change": "изменить",
        "pageinfo-content-model": "Модель содержимого страницы",
        "pageinfo-content-model-change": "изменить",
        "pageinfo-robot-policy": "Индексация поисковыми роботами",
        "file-info-png-looped": "закольцованный",
        "file-info-png-repeat": "проигрывается $1 {{PLURAL:$1|раз|раза|раз}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|кадр|кадра|кадров}}",
-       "file-no-thumb-animation": "'''Примечание. По техническим причинам миниатюры этого файла не будет анимироваться.'''",
-       "file-no-thumb-animation-gif": "'''Примечание. По техническим причинам миниатюры подобных GIF-изображений высокого разрешения не анимируются.'''",
+       "file-no-thumb-animation": "<strong>Примечание: по техническим причинам миниатюры этого файла не будет анимироваться.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Примечание: По техническим причинам миниатюры подобных GIF-изображений высокого разрешения не анимируются.</strong>",
        "newimages": "Галерея новых файлов",
        "imagelisttext": "Ниже представлен список из '''$1''' {{PLURAL:$1|файла|файлов}}, отсортированных $2.",
        "newimages-summary": "На этой служебной странице показаны недавно загруженные файлы.",
        "exif-exposureindex": "Индекс экспозиции",
        "exif-sensingmethod": "Тип сенсора",
        "exif-filesource": "Источник файла",
-       "exif-scenetype": "Тип Ñ\81Ñ\86енÑ\8b",
+       "exif-scenetype": "СÑ\86енан ÐºÐµÐ¿",
        "exif-customrendered": "Дополнительная обработка",
        "exif-exposuremode": "Режим выбора экспозиции",
        "exif-whitebalance": "Баланс белого",
        "bitrate-gigabits": "$1 Гб/с",
        "bitrate-terabits": "$1 Тб/с",
        "lag-warn-normal": "Изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.",
-       "lag-warn-high": "Из-за большого отставания в синхронизации серверов баз данных изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.",
+       "lag-warn-high": "Из-за большого отставания в синхронизации серверов, в этом списке могут не отображаться изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад.",
        "watchlistedit-normal-title": "Изменение списка наблюдения",
        "watchlistedit-normal-legend": "Удаление записей из списка наблюдения",
        "watchlistedit-normal-explain": "Ниже перечислены страницы, находящиеся в вашем списке наблюдения.\nДля удаления записей отметьте соответствующие позиции и нажмите кнопку «{{int:Watchlistedit-normal-submit}}».\nВы также можете [[Special:EditWatchlist/raw|править список как текст]].",
        "htmlform-user-not-exists": "<strong>$1</strong> не существует.",
        "htmlform-user-not-valid": "<strong>$1</strong> — недопустимое имя учётной записи.",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
+       "logentry-delete-delete_redir": "$1 удалил{{GENDER:$2||а}} перенаправление $3 с помощью перезаписи",
        "logentry-delete-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3",
        "logentry-delete-event": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} страницы $3: $4",
        "logentry-move-move_redir": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3",
-       "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3",
+       "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} «старым патрулированием» версию $4 страницы $3",
        "logentry-newusers-newusers": "{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1",
        "logentry-newusers-create": "{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1",
        "logentry-newusers-create2": "$1 {{GENDER:$2|создал|создала}} учётную запись $3",
        "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-useragent": "Браузер:",
        "searchsuggest-search": "Искать в {{grammar:prepositional|{{SITENAME}}}}",
        "searchsuggest-containing": "содержащие…",
-       "api-error-autoblocked": "Ваш IP-адрес был автоматически заблокирован, потому что он был использован заблокированным участником.",
-       "api-error-badaccess-groups": "Вам не разрешено загружать файлы в эту вики.",
        "api-error-badtoken": "Внутренняя ошибка:  некорректный токен.",
-       "api-error-blocked": "Редактирование было для вас заблокировано.",
-       "api-error-copyuploaddisabled": "Загрузка по URL-адресу отключена на этом сервере.",
-       "api-error-duplicate": "Уже {{PLURAL:$1|существует другой файл|существуют другие файлы}} с таким же содержимым.",
-       "api-error-duplicate-archive": "Раньше на сайте {{PLURAL:$1|1=уже был файл|были файлы}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.",
-       "api-error-empty-file": "Отправленный вами файл пуст.",
        "api-error-emptypage": "Не допускается создание новых пустых страниц.",
-       "api-error-fetchfileerror": "Внутренняя ошибка: что-то пошло не так при получении файла.",
-       "api-error-fileexists-forbidden": "Файл с именем «$1» уже существует и не может быть перезаписан.",
-       "api-error-fileexists-shared-forbidden": "Файл с именем «$1» уже существует в хранилище общих файлов и не может быть перезаписан.",
-       "api-error-file-too-large": "Отправленный вами файл слишком велик.",
-       "api-error-filename-tooshort": "Слишком короткое имя файла.",
-       "api-error-filetype-banned": "Этот тип файлов запрещён.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|1=запрещённый тип файла|запрещённые типы файлов}}. {{PLURAL:$3|1=Разрешённый тип файлов —|Разрешённые типы файлов:}} $2.",
-       "api-error-filetype-missing": "У этого файла отсутствует расширение.",
-       "api-error-hookaborted": "Изменение, которые вы пытались сделать, прервано обработчиком расширения.",
-       "api-error-http": "Внутренняя ошибка: не удаётся подключиться к серверу.",
-       "api-error-illegal-filename": "Недопустимое имя файла.",
-       "api-error-internal-error": "Внутренняя ошибка: что-то пошло не так при обработке вашей загрузки в вики.",
-       "api-error-invalid-file-key": "Внутренняя ошибка: файл во временном хранилище не найден.",
-       "api-error-missingparam": "Внутренняя ошибка: отсутствуют параметры по запросу.",
-       "api-error-missingresult": "Внутренняя ошибка: не удалось определить, успешно ли завершилось копирование.",
-       "api-error-mustbeloggedin": "Вы должны представиться системе для загрузки файлов.",
-       "api-error-mustbeposted": "Внутренняя ошибка: запрос требует инструкцию HTTP POST.",
-       "api-error-noimageinfo": "Загрузка завершилась успешно, но сервер не выдал никакой информации о файле.",
-       "api-error-nomodule": "Внутренняя ошибка: не настроен модуль загрузки.",
-       "api-error-ok-but-empty": "Внутренняя ошибка: нет ответа от сервера.",
-       "api-error-overwrite": "Не допускается замена существующего файла.",
-       "api-error-ratelimited": "Вы пытаетесь загрузить несколько файлов за более короткий промежуток времени, чем это позволено.\nПожалуйста, попробуйте ещё раз через несколько минут.",
-       "api-error-stashfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
        "api-error-publishfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
-       "api-error-stasherror": "При загрузке файла во временное хранилище произошла ошибка.",
-       "api-error-stashedfilenotfound": "При попытке загрузить файл из временного хранилища исходный файл не найден.",
-       "api-error-stashpathinvalid": "Путь, по которому должен располагаться файл, загруженный во временное хранилище, некорректен.",
-       "api-error-stashfilestorage": "При загрузке файла во временное хранилище произошла ошибка.",
-       "api-error-stashzerolength": "Сервер не может сохранить файл во временное хранилище, поскольку тот имеет нулевую длину.",
-       "api-error-stashnotloggedin": "Вы должны войти в систему, чтобы иметь возможность сохранить файл во временное хранилище.",
-       "api-error-stashwrongowner": "Файл, который вы пытались открыть во временном хранилище, принадлежит не вам.",
-       "api-error-stashnosuchfilekey": "Ключ файла, к которому вы пытались получить доступ во временном хранилище, не существует.",
-       "api-error-timeout": "Сервер не отвечает в течение ожидаемого времени.",
-       "api-error-unclassified": "Произошла неизвестная ошибка",
-       "api-error-unknown-code": "Неизвестная ошибка: «$1»",
-       "api-error-unknown-error": "Внутренняя ошибка: что-то пошло не так при попытке загрузить файл.",
-       "api-error-unknown-warning": "Неизвестное предупреждение: $1",
+       "api-error-stashfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
+       "api-error-unknown-warning": "Неизвестное предупреждение: «$1».",
        "api-error-unknownerror": "Неизвестная ошибка: «$1».",
-       "api-error-uploaddisabled": "В этой вики отключена возможность загрузки файлов.",
-       "api-error-verification-error": "Возможно, этот файл повреждён или имеет неправильное расширение.",
-       "api-error-was-deleted": "Файл с таким именем был уже ранее загружен и впоследствии удалён.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минута|минуты|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|час|часа|часов}}",
        "pagelang-language": "Язык",
        "pagelang-use-default": "Использовать язык по умолчанию",
        "pagelang-select-lang": "Выберите язык",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Отправить",
+       "pagelang-nonexistent-page": "Страница $1 не существует.",
+       "pagelang-unchanged-language": "Странице $1 уже установлен язык $2.",
+       "pagelang-unchanged-language-default": "Странице $1 уже установлен язык, установленный по умолчанию для содержимого этой вики.",
+       "pagelang-db-failed": "Базе данных не удалось изменить язык страницы.",
        "right-pagelang": "изменение языка страницы",
        "action-pagelang": "изменять язык страницы",
        "log-name-pagelang": "Журнал изменения языка",
        "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": "сессий на основе куки",
        "sessionprovider-nocookies": "Могут быть отключены куки. Убедитесь, что у вас включены куки и начните заново.",
        "randomrootpage": "Случайная корневая страница",
        "log-action-filter-block": "Тип блокировки:",
-       "log-action-filter-contentmodel": "Тип Ð¼Ð¾Ð´Ð¸Ñ\84икаÑ\86ии contentmodel:",
+       "log-action-filter-contentmodel": "Тип Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ\81одеÑ\80жимого:",
        "log-action-filter-delete": "Тип удаления:",
        "log-action-filter-import": "Тип импорта:",
        "log-action-filter-managetags": "Тип тега управленческих действий:",
        "log-action-filter-block-reblock": "Изменение блокировки",
        "log-action-filter-block-unblock": "Разблокировка",
        "log-action-filter-contentmodel-change": "Изменение модели содержимого",
-       "log-action-filter-contentmodel-new": "Создание страницы с нестандартной моделью Contentmodel",
+       "log-action-filter-contentmodel-new": "Создание страницы с нестандартной моделью содержимого",
        "log-action-filter-delete-delete": "Удаления страницы",
+       "log-action-filter-delete-delete_redir": "Перезапись перенаправления",
        "log-action-filter-delete-restore": "Восстановление страницы",
        "log-action-filter-delete-event": "Удаление журнала",
        "log-action-filter-delete-revision": "Удаление версии",
        "usercssispublic": "Обратите внимание: подстраницы CSS не должны содержать конфиденциальные сведения, поскольку они доступны для просмотра другим участникам.",
        "restrictionsfield-badip": "Недопустимый IP-адрес или диапазон адресов: $1",
        "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
-       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте <br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
-       "edit-error-short": "Ошибка: $1",
-       "edit-error-long": "Ошибки: $1"
+       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "версия $1",
+       "pageid": "ID страницы $1"
 }
index d96819c..0992814 100644 (file)
        "passwordreset-emaildisabled": "अस्मिन् विकि-जालस्थाने वि-पत्रसम्बद्धाः सेवाः असमर्थिताः सन्ति ।",
        "passwordreset-username": "सदस्यनाम:",
        "passwordreset-domain": "प्रदेशः :",
-       "passwordreset-capture": "परिणामस्वरूपनिर्मितानि वि-पत्राणि द्रष्टुम् इच्छति ?",
-       "passwordreset-capture-help": "अस्यां मञ्जूषायां यदि भवता अङ्क्यते तर्हि वि-पत्रम् (अस्थायिकूटशब्देन सह) दर्श्यते प्रेष्यते च ।",
        "passwordreset-email": "वि-पत्रसङ्केतः",
        "passwordreset-emailtitle": "{{SITENAME}} इत्यत्र योजकविषये",
        "passwordreset-emailtext-ip": "कोऽपि (कदाचित् भवान्/भवती, $1 अन्तर्जालसंविदः (from IP)) {{SITENAME}}($4) जालस्थानस्य कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । अनेन वि-पत्रेण सह निम्न{{PLURAL:$3|योजकः सल्लग्नः अस्ति|योजकाः सल्लग्नाः सन्ति}} ।\n\n$2\n\n{{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} {{PLURAL:$3|एषः अल्पकालीनकूटशब्दः निरस्तः भविष्यति|एते अल्पकालीनकूटशब्दाः निरस्ताः भविष्यन्ति}} ।\n\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विनतिम् अकरोत् । \n२ पुरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छति ।",
        "saveprefs": "रक्ष्यताम्",
        "restoreprefs": "मूलव्यवस्थापनानुगुणं (default settings) सर्वे विकल्पाः भवन्तु (सर्वेषु विभागेषु)",
        "prefs-editing": "सम्पादनम्",
-       "rows": "पङ्कतयः :",
-       "columns": "स्तम्भाः :",
        "searchresultshead": "अन्वेषणम्",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> इत्यस्य प्रारूपणस्य (formatting) कृते प्रारम्भिकसोपानम् (अष्टकानि) :",
        "stub-threshold-disabled": "निष्क्रियः",
        "userrights-reason": "कारणम् :",
        "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
        "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते अथवा तु सः स्थानीयः नास्ति ।",
-       "userrights-nologin": "सदस्येभ्यः अधिकारं दातुं प्रबन्धकत्वेन प्रवेशः आवश्यकः । [[Special:UserLogin|प्रविश्यताम्]]",
-       "userrights-notallowed": "सदस्येभ्यः अधिकारं दातुं, योजकान् अपाकर्तुं च ते अनुमतिः नास्ति ।",
        "userrights-changeable-col": "परिवर्तनार्हाः समूहाः",
        "userrights-unchangeable-col": "परिवर्तयितुम् अनर्हाः समूहाः",
        "userrights-conflict": "सदस्याधिकारस्य परिवर्तनेषु अन्तर्विरोधः अस्ति ! कृपया स्वकृतानि परिवर्तनानि पुनरवलोक्य संरक्ष्यन्ताम् ।",
-       "userrights-removed-self": "भवता/भवत्या सफलतया स्वाधिकाराः अपाकृताः । अतः भवान्/भवती एतत् पृष्ठं द्रष्टुं न प्रभवति ।",
        "group": "समूहः :",
        "group-user": "सदस्याः",
        "group-autoconfirmed": "स्वदृढितयोजकाः",
        "right-siteadmin": "दत्तांशनिधिं किलतु, अकिलितं च करोतु",
        "right-override-export-depth": "यानि पुष्ठानि पञ्चस्तरपर्यन्तं संलग्नानि सन्ति, तेषां सर्वेषां निर्यातं करोतु ।",
        "right-sendemail": "अन्ययोजकेभ्यः वि-पत्रं प्रेषयतु",
-       "right-passwordreset": "निकुञ्चपुनारचितानां विद्युन्मानपत्राणाम् अवलोकनम् ।",
        "right-managechangetags": "दत्तांशात् [[Special:Tags|चिह्नानि]] निर्मीयन्ताम्, अपाक्रियन्तां च",
        "right-applychangetags": "[[Special:Tags|चिह्नानि]] एकस्य परिवर्तनेन सह प्रयुञ्जताम् ।",
        "right-changetags": "स्वतन्त्रसंस्करणे, प्रवेशावल्यां च [[Special:Tags|चिह्नानि]] ऐच्छितरीत्या स्थापयतु, निष्कासयतु च",
        "uploaddisabledtext": "उत्तारितसञ्चिकाः निष्क्रियाः ।",
        "php-uploaddisabledtext": "PHP मध्ये उत्तारितसञ्चिकाः निष्क्रियाः ।",
        "uploadscripted": "HTMLयुक्ताः अथवा लिपिसङ्केतयुक्ताः सञ्चिकाः जालदर्शिकया बाधिताः ।",
-       "uploadscriptednamespace": "\"$1\" इत्येत् अमान्यं नामावकाशं SVG सञ्चिकायां विद्यते ।",
+       "uploadscriptednamespace": "\"<nowiki>$1</nowiki>\" इत्येत् अमान्यं नामावकाशं SVG सञ्चिकायां विद्यते ।",
        "uploadinvalidxml": "उपारोहितसञ्चिकायां स्थितं XML व्याख्यायितं (parse) कर्तुं न शक्यते ।",
        "uploadvirus": "अस्यां सञ्चिकायां वैराणुः अस्ति । विवरणम् $1",
        "uploadjava": "इयं ZIP सञ्चिका अस्यां जावावर्गस्य सञ्चिकाः सन्ति । \nजावासञ्चिकाः उत्तरणं निषिद्धम् । यतः अनेन सुरक्षाबन्धाः शिथिलाः भवन्ति ।",
        "feedback-useragent": "योजकानुयोज्यः :",
        "searchsuggest-search": "अन्वेषणम्",
        "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|यह was|they आसन्}} किन्तु अपनीताः ।",
-       "api-error-empty-file": "समर्पिता सञ्चिका रिक्ता आसीत् ।",
        "api-error-emptypage": "नूतनस्य रिक्तस्य पृष्ठस्य सर्जनं निषिद्धम् ।",
-       "api-error-fetchfileerror": "आन्तरिकदोषः : सञ्चिकायाः प्राप्त्यवसरे कश्चन दोषः जातः ।",
-       "api-error-fileexists-forbidden": "\"$1\" नामिका सञ्चिका पूर्वमेव विद्यते । पुनः तदुपरि लेखनम् अशक्यम् ।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" इति नाम्नः सञ्चिका पूर्वमेव सञ्चिकाकोशे अस्ति । अधिलिखितं न स्यात् ।",
-       "api-error-file-too-large": "समर्पिता सञ्चिका सुदीर्घा अस्ति ।",
-       "api-error-filename-tooshort": "सञ्चिकानाम अतीव ह्रस्वम् अस्ति ।",
-       "api-error-filetype-banned": "ईदृशी सञ्चिका अनुरुद्धा ।",
-       "api-error-filetype-banned-type": "'''\".$1\"'''सञ्चिका {{PLURAL:$4|प्रकारस्य }} अनुमतिः नास्ति ।\nप्रकारसञ्चिकायाः{{PLURAL:$3|}} अनुमतिरस्ति  $2।",
-       "api-error-filetype-missing": "अस्याः सञ्चिकायाः विस्तारः लुप्तः अस्ति ।",
-       "api-error-hookaborted": "भवतः संस्करणप्रयत्नः विस्तारेण अपसारितः ।",
-       "api-error-http": "आन्तरिकदोषः : वितारकस्य सम्पर्के असमर्थम् ।",
-       "api-error-illegal-filename": "सञ्चिकानामलेखनं नानुमतम् ।",
-       "api-error-internal-error": "आन्तरिकदोषः : वीक्यां भवतः उत्तारणावसरे काचनदोषः संवृत्तः ।",
-       "api-error-invalid-file-key": "आन्तरिकदोषः : अनित्यसञ्चिकाकोशे सञ्चिका न दृष्टा ।",
-       "api-error-missingparam": "आन्तरिकदोषः : अभ्यर्थनानुगुणं व्याप्तिः विलुप्ता ।",
-       "api-error-missingresult": "आन्तरिकदोषः : प्रतिकृतिः सफला इति निश्चिता नाभवत् ।",
-       "api-error-mustbeloggedin": "सञ्चिकायाः उपारोपणाय अन्तः प्रवेशः अनिवार्यः ।",
-       "api-error-mustbeposted": "आन्तरिकदोषः : HTTP प्रस्तोतुम् अभ्यर्थनम् आवश्यकम् ।",
-       "api-error-noimageinfo": "उत्तारणं सफलम् । किन्तु सञ्चिकाविषये वितारकः कामपि सूचनां न अयच्छतु ।",
-       "api-error-nomodule": "आन्तरिकदोषः : उत्तारणघटकः न व्यवस्थितः ।",
-       "api-error-ok-but-empty": "आन्तरिकदोषः : वितारकतः प्रतिस्पन्दः न प्राप्तः ।",
-       "api-error-overwrite": "वर्तमानसञ्चिकायाः पुनर्लेखनं नानुमतम् ।",
-       "api-error-stashfailed": "आन्तरिकदोषः : तात्कालिकसञ्चिकायाः रक्षणे वितारकः असमर्थः जातः ।",
        "api-error-publishfailed": "आन्तरिकदोषः : तात्कालिकसञ्चिकायाः रक्षणे वितरकः असमर्थः जातः ।",
-       "api-error-stasherror": "गोपनीयस्थाने सञ्चिकायाः उपारोहणकाले दोषः समुद्भूतः ।",
-       "api-error-stashedfilenotfound": "यदा गुहितस्थाने सञ्चिकाम् उपारोहणस्य प्रयासः कृतः, तदा गुहितसञ्चिका न प्राप्ता ।",
-       "api-error-stashpathinvalid": "गुहितस्थानस्य यः मार्गः प्रदत्तः, सः अमान्यः अस्ति ।",
-       "api-error-stashfilestorage": "गोपनीयस्थाने सञ्चिकायाः उपारोहणकाले दोषः समुद्भूतः ।",
-       "api-error-stashzerolength": "वितरकः गुहितसञ्चिकां नाप्रापत्, यतो हि तस्य दीर्घ्यं नासीत् ।",
-       "api-error-stashnotloggedin": "गुहितस्थाने सञ्चिकाम् उपारोहितुं भवान्/भवती प्रविश्यताम् ।",
-       "api-error-stashwrongowner": "यां सञ्चिकां भवान्/भवती गुहिकस्थाने उपारोहितुं प्रयासं करोति, सा भवतः/भवत्याः नास्ति ।",
-       "api-error-stashnosuchfilekey": "गुहितस्थानस्य यां सञ्चिकायाः तालिकां भवान्/भवती इच्छति, सा न विद्यते ।",
-       "api-error-timeout": "अपेक्षितावधौ वितारकेण प्रतिस्पन्दः न दर्शितः ।",
-       "api-error-unclassified": "कश्चन अज्ञातः दोषः जातः ।",
-       "api-error-unknown-code": "अज्ञातः दोषः \" $1 \"",
-       "api-error-unknown-error": "आन्तरिकदोषः : सञ्चिकायाः आरोपणावसरे कश्चन दोषः जातः ।",
+       "api-error-stashfailed": "आन्तरिकदोषः : तात्कालिकसञ्चिकायाः रक्षणे वितारकः असमर्थः जातः ।",
        "api-error-unknown-warning": "अज्ञातः प्रबोधः \"$1\"",
        "api-error-unknownerror": "अज्ञातः दोषः \" $1 \"",
-       "api-error-uploaddisabled": "अस्यां वीक्याम् आरोपणं निष्क्रिया कृता अस्ति ।",
-       "api-error-verification-error": "इयं सञ्चिका सदोषा स्यात् अथवा विस्तारः दोषयुक्तः स्यात् ।",
        "duration-seconds": "$1 {{PLURAL:$1|क्षणम्|क्षणानि}}",
        "duration-minutes": "$1 {{PLURAL:$1|निमेषः|निमेषाः}}",
        "duration-hours": "$1 {{PLURAL:$1|घण्टा|घण्टाः}}",
index 2f0fbc9..8c3e93a 100644 (file)
        "searcharticle": "Көрдөр",
        "history": "Устуоруйата",
        "history_short": "Устуоруйа",
+       "history_small": "устуоруйата",
        "updatedmarker": "тиһэх киириим кэнниттэн уларыйбыт",
        "printableversion": "Бэчээттииргэ аналлаах барыл",
        "permalink": "Куруук баар сигэ",
        "views": "Көрүү",
        "toolbox": "Сэп-сэбиргэл",
        "tool-link-userrights": "{{GENDER:$1|Кыттааччы}} бөлөҕүн уларыт",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн көр",
        "tool-link-emailuser": "{{GENDER:$1|Кыттааччыга}} сурук суруйуу",
        "userpage": "Кыттааччы туһунан сирэй",
        "projectpage": "Бырайыак сирэйэ",
        "createacct-another-username-ph": "Ааккын суруй",
        "yourpassword": "Киирии тыла:",
        "userlogin-yourpassword": "Аһарык",
-       "userlogin-yourpassword-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын суруй",
-       "createacct-yourpassword-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын суруй",
-       "yourpasswordagain": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын хатылаа:",
-       "createacct-yourpasswordagain": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын бигэргэт",
-       "createacct-yourpasswordagain-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын хатылаа",
+       "userlogin-yourpassword-ph": "Ð\90һаÑ\80Ñ\8bккын суруй",
+       "createacct-yourpassword-ph": "Ð\90һаÑ\80Ñ\8bккын суруй",
+       "yourpasswordagain": "Ð\90һаÑ\80Ñ\8bккын хатылаа:",
+       "createacct-yourpasswordagain": "Ð\90һаÑ\80Ñ\8bккын бигэргэт",
+       "createacct-yourpasswordagain-ph": "Ð\90һаÑ\80Ñ\8bккын хатылаа",
        "userlogin-remembermypassword": "Тиһиликтэн тахсыма",
        "userlogin-signwithsecure": "Бигэ холбонуу",
        "cannotlogin-title": "Киирэр сатаммат",
        "gotaccount": "Бэлиэтэммитиҥ дуо? '''$1'''.",
        "gotaccountlink": "Аатыҥ",
        "userlogin-resetlink": "Киирэр тылгын умнубуккун дуо?",
-       "userlogin-resetpassword-link": "Ð\9aииÑ\80ии тылгын санаттараҕын дуо?",
+       "userlogin-resetpassword-link": "Ð\90һаÑ\80Ñ\8bк тылгын санаттараҕын дуо?",
        "userlogin-helplink2": "Киирэргэ көмө",
        "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
+       "userlogin-reauth": "Тиһиккэ хат киирэн {{GENDER:$1|$1}} буоларгын бигэргэтиэхтээххин.",
        "userlogin-createanother": "Атын аатынан бэлиэтэн",
        "createacct-emailrequired": "Email аадырыс",
        "createacct-emailoptional": "Email аадырыс (булгуччута суох)",
        "createacct-email-ph": "Эл аадырыскын суруй",
        "createacct-another-email-ph": "Эл. почтаҕын киллэр",
        "createaccountmail": "Быстах киирии тылы туһаныы уонна ону ыйыллыбыт аадырыска ыытыы",
+       "createaccountmail-help": "Атын киһиэхэ аһарыгын билбэккэ эрэ бэлиэ-ааты оҥорон биэрэргэ туттуллуон сөп.",
        "createacct-realname": "Дьиҥнээх аатыҥ (булгуччута суох)",
        "createaccountreason": "Төрүөтэ:",
        "createacct-reason": "Төрүөтэ",
        "createacct-reason-ph": "Саҥа аатынан тоҕо киирэҕиний",
+       "createacct-reason-help": "Саҥаны суруйуу сурунаалыгар тахсар сурук",
        "createacct-submit": "Бэлиэтэнии",
        "createacct-another-submit": "Бэлиэтэн",
+       "createacct-continue-submit": "Бэлиэ-ааты салгыы оҥоруу",
+       "createacct-another-continue-submit": "Салгыы бэлиэтэнии",
        "createacct-benefit-heading": "{{SITENAME}} ситим-сири эн курдук дьон оҥороллор.",
        "createacct-benefit-body1": "{{PLURAL:$1|уларытыы|уларытыы}}",
        "createacct-benefit-body2": "{{PLURAL:$1|сирэй|сирэй}}",
        "nocookiesnew": "Маннык ааттаах кыттааччы баар буолла гынан баран, систиэмэҕэ киирэ илик. {{SITENAME}} «cookies» туттар, оттон эн көмпүүтэргэр ону туһанар бобуллубут. Бука диэн «cookies» холбоо, онтон өссө киирэн көр.",
        "nocookieslogin": "{{SITENAME}} дьону билэргэ «cookies» туттар. Эн көмпүүтэргэр «cookies» бобуллубут. Ону холбоон баран өссө киирэн көр.",
        "nocookiesfornew": "Аат кыайан бэлиэтэниллибэтэ. Төрүөтүнэн атын саайка сибидиэнньэ биэрии (CSRF) бобуллубута буолуон сөп. \nКуукилар холбоно сылдьалларын көрөн баран өссө биирдэ боруобалаа.",
+       "createacct-loginerror": "Бэлиэтэнниҥ гынан баран бэлиэ-ааккынан киирэ иликкин. Бука диэн, [[Special:UserLogin|киир дуу]].",
        "noname": "Эн тиһилик билэр аатын киллэрбэтэххин.",
        "loginsuccesstitle": "Киирдиҥ",
        "loginsuccess": "'''Билигин бу аатынан үлэлиигин: \"$1\".'''",
-       "nosuchuser": "Маннык - \"$1\" - ааттаах кыттааччы суох.\nУлахан кыра буукубалар атыннаахтар.\nАатыҥ сөпкө суруллубутун көр эбэтэр [[Special:CreateAccount|саҥаттан бэлиэтэн]].",
+       "nosuchuser": "Маннык - \"$1\" - ааттаах кыттааччы суох эбит.\nУлахан кыра буукубалар атыннаахтарын умнума.\nАатыҥ сөпкө суруллубутун көр эбэтэр [[Special:CreateAccount|саҥаттан бэлиэтэн]].",
        "nosuchusershort": "Маннык - \"$1\" - ааттаах кыттааччы суох. Аатыҥ сөпкө суруллубутун көр.",
        "nouserspecified": "Кыттааччы аатын киллэриэхтээххин.",
        "login-userblocked": "Бу кыттааччы бобуллубут. Тиһиккэ киирии көҥүллэммэт.",
        "wrongpassword": "Киирии тылыҥ сыыһалаах. Өссө киллэрэн көр.",
-       "wrongpasswordempty": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йбаÑ\82аÑ\85Ñ\85Ñ\8bн. Ó¨Ñ\81Ñ\81Ó© киирэн көр.",
+       "wrongpasswordempty": "Ð\90һаÑ\80Ñ\8bккÑ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йбаÑ\82аÑ\85Ñ\85Ñ\8bн. Ð¥Ð°Ñ\82 киирэн көр.",
        "passwordtooshort": "Киирии тылыҥ наһаа кылгас.\nКырата {{PLURAL:$1|1 бэлиэлээх|$1 бэлиэлээх}} буолуохтаах.",
        "passwordtoolong": "Аһарык {{PLURAL:$1|1 бэлиэттэн|$1 бэлиэттэн}} уһун буолуо суохтаах.",
        "passwordtoopopular": "Элбэхтэ туттуллар аһарыктары туттар сатаммат. Бука диэн атын аһарыкта тал.",
        "password-name-match": "Аһарыгыҥ ааккыттан атын буолуохтаах.",
        "password-login-forbidden": "Маннык ааты уонна киирии тылы туһаныы бобуллар.",
        "mailmypassword": "Киирии тылы саҥардыы",
-       "passwordremindertitle": "{{SITENAME}} ÐºÐ¸Ð¸Ñ\80ии тылын санатыы",
-       "passwordremindertext": "Ким эрэ (бадаҕа эн бу IP-аадырыстан: $1), {{SITENAME}} ($4) аһарыгын саҥаттан ыытыҥ диэбит.\n\"$2\" кыттааччы быстах аһарыга билигин маннык: \"$3\".\nӨскө маны эн чахчы көрдөөбүт буоллаххына, систиэмэҕэ саҥаттан киирэҥҥин аһарыккын уларытыаххын сөп.\nБыстах аһарык {{PLURAL:$5|биир хонук|$5 хонук устата}} үлэлиир.\n\nӨскөтүн аһарыгы саҥаттан көрдөөбөтөх буоллаххына,\nэбэтэр урукку аһарыккн өйдөөн кэлбит буоллаххына,\nбу суругу ааххайыма уонна урукку аһарыккын салгыы туһан.",
+       "passwordremindertitle": "{{SITENAME}} Ð°Ò»Ð°Ñ\80Ñ\8bк тылын санатыы",
+       "passwordremindertext": "Ким эрэ (бадаҕа Эн бу IP-аадырыстан: $1), {{SITENAME}} ($4) аһарыгын саҥаттан ыытыҥ диэбит.\n\"$2\" кыттааччы быстах аһарыга билигин маннык: \"$3\".\nӨскө маны эн чахчы көрдөөбүт буоллаххына, систиэмэҕэ саҥаттан киирэҥҥин аһарыккын уларытыаххын сөп.\nБыстах аһарык {{PLURAL:$5|биир хонук|$5 хонук устата}} үлэлиир.\n\nӨскөтүн аһарыгы саҥаттан көрдөөбөтөх буоллаххына,\nэбэтэр урукку аһарыккын өйдөөн кэлбит буоллаххына,\nбу суругу ааххайыма уонна урукку аһарыккын салгыы туһан.",
        "noemail": "\"$1\" ааттаах киһиэхэ эл. почтата ыйыллыбатах.",
        "noemailcreate": "Электроннай почтаҥ сөптөөх аадырыһын суруйуохтааххын",
        "passwordsent": "Саҥа аһарык тыл \"$1\" эл. почтатыгар ыытылынна.\nТиһиккэ киирэргэ саҥа аһарыгы туһан.",
-       "blocked-mailpassword": "Эн IP аадырыскыттан манна тугу эмэ уларытар бобуллубут,\nонон киирии тылы өйдөтөр кыах эмиэ суох.",
+       "blocked-mailpassword": "Ð\9eмÑ\81олооÑ\85 Ð´Ñ\8cайÑ\8bÑ\8b Ð¾Ò¥Ð¾Ò»Ñ\83ллÑ\83баÑ\82Ñ\8bн Ñ\82Ñ\83Ò»Ñ\83гаÑ\80 Ð­Ð½ IP Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÑ\81кÑ\8bÑ\82Ñ\82ан Ð¼Ð°Ð½Ð½Ð° Ñ\82Ñ\83гÑ\83 Ñ\8dмÑ\8d Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ð±Ð¾Ð±Ñ\83ллÑ\83бÑ\83Ñ\82,\nонон ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b Ó©Ð¹Ð´Ó©Ñ\82Ó©Ñ\80 ÐºÑ\8bаÑ\85 Ñ\8dмиÑ\8d Ñ\81Ñ\83оÑ\85.",
        "eauthentsent": "Эл. почтаҕар сурук ыытылынна.\nБу аадырыс эйиэнэ буоларын бигэргэтэргэ өссө тугу гыныахтааҕыҥ туһунан сурукка кэпсэниллэр.",
        "throttled-mailpassword": "Киирии тылы өйдөтөр тэрил бүтэһик {{PLURAL:$1|чаас|$1 чаас}} иһигэр туттулла сылдьыбыт.\nКөмүскэнэр соруктан сылтаан киирии тылы {{PLURAL:$1|чааска|$1 чааска}} биирдэ эрэ ыйытыахха сөп.",
        "mailerror": "Сурук ыытарга алҕас таҕыста: $1",
-       "acct_creation_throttle_hit": "Эн IP-гыттан бүгүн {{PLURAL:$1|1 аат оҥоһуллубут|$1 аат бэлиэтэммит}} буолан бүгүҥҥү күннээҕи нуорма туолбут.\nБу IP-тан киирэр дьон саҥа ааты билигин бэлиэтиир кыахтара суох.",
+       "acct_creation_throttle_hit": "Эн IP-гыттан тиһэх $2 болдьоххо {{PLURAL:$1|1 аат оҥоһуллубут|$1 аат бэлиэтэммит}} буолан саҥа аат оҥоһуллар нуормата туолан хаалбыт.\nОнон бу IP-тан киирэн саҥа ааты билигин бэлиэтиир кыах суох.",
        "emailauthenticated": "Эн почтаҥ аадырыһа бигэргэтиллибит кэмэ: $2, $3.",
        "emailnotauthenticated": "Эл. почтаҥ аадырыһа бигэргэтиллэ илик эбит.\nОнон сурук манна ааттаммыт түгэннэргэ ыытыллыа суоҕа.",
        "noemailprefs": "Эл. почтаҥ ыйыллыбатах, онон вики-движок аадырыскын туһанар кыаҕа суох.",
        "accountcreated": "Саҥа аат иҥэрилиннэ",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ыр.]]) бэлиэ аат оҥоһулунна.",
        "createaccount-title": "{{SITENAME}} бырайыакка саҥа аат оҥоруу",
-       "createaccount-text": "Ð\9aим Ñ\8dÑ\80Ñ\8d {{SITENAME}} Ð±Ñ\8bÑ\80айÑ\8bакка ($4) Ñ\81аҥа $2 Ð°Ð°Ñ\82Ñ\8b Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dбиÑ\82. \"$2\" ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bла \"$3\". Ð\91илигин ÐºÐ¸Ð¸Ñ\80Ñ\8dн ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн Ð½Ð°Ð°Ð´Ð°.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
+       "createaccount-text": "Ð\9aим Ñ\8dÑ\80Ñ\8d {{SITENAME}} Ð±Ñ\8bÑ\80айÑ\8bакка ($4) Ñ\81аҥа $2 Ð°Ð°Ñ\82Ñ\8b Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dбиÑ\82. \"$2\" Ð°Ò»Ð°Ñ\80Ñ\8bга \"$3\". Ð\91илигин ÐºÐ¸Ð¸Ñ\80Ñ\8dн Ð°Ò»Ð°Ñ\80Ñ\8bк Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\82ааÑ\85 Ñ\8dбиккин.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
        "login-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
-       "login-abort-generic": "Бу аатынан сатаан киирбэтиҥ - быстан хаалла",
+       "login-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": "Тахсыы",
        "php-mail-error-unknown": "mail() PHP-функциятыгар туох эрэ алҕас тахсыбыт",
        "changepassword": "Киирии тылы уларытарга",
        "resetpass_announce": "Түмүктүүргэ саҥа киирии тылла суруй.",
        "resetpass_text": "<!-- Тиэкиһи манна эбэн суруйуҥ -->",
-       "resetpass_header": "Ð\90аÑ\82 ÐºÐ¸Ð¸Ñ\80ии тылын уларытыы",
+       "resetpass_header": "Ð\91Ñ\8dлиÑ\8d-ааÑ\82 Ð°Ò»Ð°Ñ\80Ñ\8bк тылын уларытыы",
        "oldpassword": "Эргэ аһарык:",
        "newpassword": "Саҥа аһарык:",
        "retypenew": "Саҥа киирии тылы хатылаа:",
        "resetpass_submit": "Киирии тылы уларыт уонна киир",
-       "changepassword-success": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8bÒ¥ Ñ\8dÑ\82Ñ\8dÒ¥Ò¥Ñ\8d уларыйда!",
+       "changepassword-success": "Ð\90һаÑ\80Ñ\8bгÑ\8bÒ¥ уларыйда!",
        "changepassword-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
        "botpasswords": "Оруобаттар аһарыктара",
        "botpasswords-summary": "<em>Хатыыр тыллара</em> туттааччы учуоттуур сурутуутугар API-нан   логины уонна хатыыр тылы туттубакка эрэ киирэр кыах биэрэр. Кыттааччы  бота хатыыр тыллаах киириитигэр бырааба хааччахтаныан сөп.\nЭн  ити тоҕо наадатын билбэт буоллаххына, бука, итини гымматыҥ ордук.Ким даҕаны эйигиттэн хаһан даҕаны эн оҥорбутуҥ уонна биллэрбитиҥ диэн ыйытыа суохтаах.",
        "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» диэн ааттаах оруобаты эбэр табыллыбата. Баҕар хайыы-үйэ эбиллибитэ буолаарай?",
        "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-newpassword": "\nСаҥа хатыыр тыл <strong>$1</strong> — <strong>$2</strong> аннынан киириигэ. <em> суруй аныгыскыга туттарга.</em>",
+       "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": "Ааккын билиһиннэрдэххинэ эрэ бу сирэйгэ быһа тиийиэххин сөп.",
        "resetpass-submit-loggedin": "Киирии тылы уларытыы",
        "resetpass-submit-cancel": "Салҕаама",
        "passwordreset-emaildisabled": "Бу биикигэ эл. почтаны туттуу араарыллыбыт",
        "passwordreset-username": "Кыттааччы:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Суруллубут суругу көрөҕүн дуо?",
-       "passwordreset-capture-help": "Бу бэлиэни туруордаххына кыттааччыга ыытыллар сурук (быстах кэмҥэ туһаныллар киирии тыллаах) көстүө.",
        "passwordreset-email": "Электроннай почтата:",
        "passwordreset-emailtitle": "{{SITENAME}} бырайыакка аатын туһунан",
-       "passwordreset-emailtext-ip": "Ким эрэ (баҕар эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка киирии тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
-       "passwordreset-emailtext-user": "$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ñ\8bÑ\8bппÑ\8bÑ\82.\nÐ\91Ñ\83 Ñ\8dлекÑ\82Ñ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ð±Ñ\83 {{PLURAL:$3|ааÑ\82 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85|ааÑ\82Ñ\82аÑ\80 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85Ñ\82Ñ\8dÑ\80}}\n\n$2\n\nÐ\91Ñ\83 Ð±Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÑ\8dмҥÑ\8d Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ\85 {{PLURAL:$3|кииÑ\80ии Ñ\82Ñ\8bл|киÑ\80ии Ñ\82Ñ\8bллаÑ\80}} {{PLURAL:$5|бииÑ\80 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÒ\95Ñ\8d|$5 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÑ\85Ñ\82Ñ\8dÑ\80Ñ\8d}}.\nЭн Ñ\82иһиликкÑ\8d Ð°Ð°ÐºÐºÑ\8bн Ñ\8dÑ\82Ñ\8dн Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин.\nÓ¨Ñ\81кө Ð±Ñ\83 Ñ\8bйÑ\8bÑ\82Ñ\8bгÑ\8b Ñ\8bÑ\8bппаÑ\82аÑ\85 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83Ñ\80Ñ\83ккÑ\83 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ó©Ð¹Ð´Ó©Ó©Ð½ ÐºÑ\8dлбиÑ\82 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна \nбÑ\83 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иини Ð°Ð°Ñ\85Ñ\85айÑ\8bа Ñ\81Ñ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.\nÐ\9eÑ\87Ñ\87оÒ\95о Ñ\83Ñ\80Ñ\83ккÑ\83 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлыҥ оннунан хаалыа.",
+       "passwordreset-emailtext-ip": "Ким эрэ (баҕар Эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка аһарык тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|аһарык|аһарык тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа аһарык тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку аһарык тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку аһарык тылыҥ оннунан хаалыа.",
+       "passwordreset-emailtext-user": "$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка Ð°Ò»Ð°Ñ\80Ñ\8bккÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ñ\8bÑ\8bппÑ\8bÑ\82.\nÐ\91Ñ\83 Ñ\8dлекÑ\82Ñ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ð±Ñ\83 {{PLURAL:$3|ааÑ\82 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85|ааÑ\82Ñ\82аÑ\80 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85Ñ\82Ñ\8dÑ\80}}\n\n$2\n\nÐ\91Ñ\83 Ð±Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÑ\8dмҥÑ\8d Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ\85 {{PLURAL:$3|аһаÑ\80Ñ\8bк|аһаÑ\80Ñ\8bкÑ\82аÑ\80}} {{PLURAL:$5|бииÑ\80 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÒ\95Ñ\8d|$5 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÑ\85Ñ\82Ñ\8dÑ\80Ñ\8d}}.\nЭн Ñ\82иһиликкÑ\8d Ð°Ð°ÐºÐºÑ\8bн Ñ\8dÑ\82Ñ\8dн Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин.\nÓ¨Ñ\81кө Ð±Ñ\83 Ñ\8bйÑ\8bÑ\82Ñ\8bгÑ\8b Ñ\8bÑ\8bппаÑ\82аÑ\85 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83Ñ\80Ñ\83ккÑ\83 Ð°Ò»Ð°Ñ\80Ñ\8bккÑ\8bн Ó©Ð¹Ð´Ó©Ó©Ð½ ÐºÑ\8dлбиÑ\82 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна \nбÑ\83 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иини Ð°Ð°Ñ\85Ñ\85айÑ\8bа Ñ\81Ñ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.\nÐ\9eÑ\87Ñ\87оÒ\95о Ñ\83Ñ\80Ñ\83ккÑ\83 Ð°Ò»Ð°Ñ\80Ñ\8bгыҥ оннунан хаалыа.",
        "passwordreset-emailelement": "Кыттааччы: \n$1\n\nБыстах аһарык тыл: \n$2",
        "passwordreset-emailsentemail": "Өскө бу Эн ааккар баайыллыбыт аадырыс буоллаҕына, аһарык тылы уларытар туһунан сурук барыа.",
        "passwordreset-emailsentusername": "Өскө бу аакка баайыллыбыт аадырыс баар буоллаҕына, аһарык тылы уларытар туһунан сурук онно барыа.",
+       "passwordreset-nocaller": "Ыҥырааччы көстүөхтээх",
+       "passwordreset-nosuchcaller": "Ыҥырааччы суох: $1",
+       "passwordreset-ignored": "Аһарыгы быраҕар сатаммата. Баҕар биир да провайдер холбоммокко сылдьара буолаарай?",
+       "passwordreset-invalidemail": "Аадырыс алҕастаах",
+       "passwordreset-nodata": "Кыттааччы аата да, аадырыһа да ыйыллыбатахтар",
        "changeemail": "Аадырыһы уларытыы уонна сотуу",
        "changeemail-header": "Бу форманы толорон аадырыскын уларыт. Уларытыыны бигэргэтэргэ аһарыккын киллэриэхтээххин. Почтаҥ аадырыһыттан бэлиэ-ааккыттан араарыаххын баҕарар буоллаххына аадырыһы сотон баран бигэргэтэн кэбиһээр.",
        "changeemail-no-info": "Бу сирэйгэ чопчу тиийэргэ, тиһиликкэ бэлиэтэммит ааккын этиэхтиэххин.",
        "minoredit": "Бу суолтата суох уларытыы",
        "watchthis": "Бу сирэйи кэтээн көрөргө",
        "savearticle": "Уларытыыны бигэргэтии",
+       "savechanges": "Уларытыылары бигэргэтии",
+       "publishpage": "Оҥор",
+       "publishchanges": "Бигэргэт",
        "preview": "Холоон көрүү",
        "showpreview": "Уларытыах иннинэ көрүү",
        "showdiff": "Уларытыылар",
        "blockedtitle": "Кыттааччы уларытар кыаҕа быһылынна",
        "blockedtext": "'''Эн аатыҥ эбэтэр IP-аадырыһыҥ бобулуннулар.'''\n\nБоппут киһи $1.\nТөрүөтэ: ''«$2»''.\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] суруйан быһаарсыаххын сөп.\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]] буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\nЭн IP-аадырыһыҥ — $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
        "autoblockedtext": "Эн IP-аадырыскын ханнык эрэ бу бырайыакка кыттара бобуллубут киһи туһана сылдьыбыт, онон бу IP-аадырыс бобуулаах. Боппут администраатар ($1) ол төрүөтүн маннык суруйбут:\n\n:''$2''\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] сурук суруйан быһаарсыаххын сөп.\n\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]]  буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\n\nIP-аадырыһыҥ $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
+       "systemblockedtext": "Бэлиэ-ааккын эбэтэр IP-аадырыскын MediaWiki хааччахтаабыт.\nЫйыллыбыт төрүөтэ:\n\n:<em>$2</em>\n\n* Хааччах саҕаланыыта: $8\n* Хааччах уһуллуута: $6\n* Бүөлээһин соруга: $7\n\nЭн билиҥҥи IP-аадырыһыҥ $3.\nБыһаарсар буоллаххына, бу сибидиэнньэлэри этээр дуу.",
        "blockednoreason": "биир да биричиинэ сөп түбэспэт",
        "whitelistedittext": "Улатыаххын баҕарар буоллаххына маны $1 гын.",
        "confirmedittext": "Уларытарга эл. почтаҥ аадырыһын бигэргэтиэхтээххин. Бастаан [[Special:Preferences|манна]] киирэн бэйэн ааккын уонна эл. почтаҕын суруй. Онтон эл. аадырыскын бигэргэт.",
        "accmailtext": "[[User talk:$1|$1]] кыттааччыга түбэспиччэ бэлиэлэртэн оҥоһуллубут аһарык тыл бу аадырыска $2 ыытылынна.\nТиһиккэ бэлиэтэнэн баран аһарыккын ''[[Special:ChangePassword|уларытыаххын]]'' сөп.",
        "newarticle": "(Саҥа ыстатыйа)",
        "newarticletext": "Эн суох сирэйгэ киирэ сатаатыҥ.\nМаннык ааттаах саҥа ыстатыйаны оҥорор буоллаххына, аллара баар түннүккэ суруй\n(сиһ. [$1 көмөнү] көрүөххүн сөп).\nӨскө манна сыыһа киирбит буоллаххына интэриниэтиҥ бырагыраамматын \"төнүн\" диэххин сөп.",
-       "anontalkpagetext": "----''Бу аатын эппэтэх кыттааччы ырытар сирэйэ.\nIP-аадырыһа эрэ көстөр.\nБиир IP-аадырыс хас да киһиэхэ бэриллиэн сөп. Өскө атын киһиэхэ суруллубут суругу алҕас туппут буоллаххына, бэйэҥ [[Special:CreateAccount|ааккын билиһиннэр]] эбэтэр [[Special:UserLogin|киир]], оччоҕо кэлин да булкуур тахсыа суоҕа.''",
+       "anontalkpagetext": "----\n<em>Бу аатын эппэтэх, бэлиэтэнэ илик эбэтэр бэлиэтэниэн баҕарбат кыттааччы сирэйэ.</em>\nОл иһин кинини чопчулаары IP-аадырыһын туттабыт.\nБу аадырыһы атын кыттааччылар эмиэ туһаныахтарын сөп.\nӨскөтө Эн ааккын эппэтэх кыттааччы Эйиэхэ туһуламматах суругу туттум дии саныыр буоллаххына, бука диэн, [[Special:CreateAccount|бэлиэтэн]] биитэр [[Special:UserLogin|урут бэлиэтэммит ааккынан киир]]. Оччоҕо булкуур тахсыа суоҕа.",
        "noarticletext": "Билигин бу сирэй кураанах.\nБу аат атын ыстатыйаларга туттулларын [[Special:Search/{{PAGENAME}}|булуоххун сөп]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} сурунаалларга көрдүөххүн сөп],\nэбэтэр [{{fullurl:{{FULLPAGENAME}}|action=edit}} маннык ааттаах саҥа ыстатыйаны суруйуоххун сөп]</span>.",
        "noarticletext-nopermission": "Билигин бу сирэй кураанах.\nБу [[Special:Search/{{PAGENAME}}|ааты атын сирэйдэргэ көрдөөн көрүөххүн]] сөп,\nэбэтэр <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} сурунаалларга манна сыһыаннаах суруктары булуоххун сөп].</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": "Бу кыттааччы билигин бобуллубут.\nМанна бобуу сурунаалын бүтэһик суруга көстөр:",
-       "clearyourcache": "'''Болҕой:''' Уларыппыт сирэйгин сөпкө көрөргө браузер кээһин ыраастыаххын наада буолуо.\n*'''Firefox / Safari.''' ''Shift'' кунуопканы тутан туран ''Reload'' баттаа, эбэтэр ''Ctrl-F5'', ''Ctrl-R'' дуу (Mac-ка ''⌘-R'') баттаа;\n*'''Google Chrome:''' ''Ctrl-Shift-R'' баттаа (Mac-ка ''⌘-Shift-R'')\n*'''Internet Explorer:''' ''Ctrl'' тутан туран ''Refresh'' баттаа, эбэтэр ''Ctrl-F5'' баттаа.\n*'''Opera:''' Манна ''Tools → Preferences'' киирэн кээһин ыраастаа",
+       "clearyourcache": "<strong>Болҕой:</strong> Уларыппыт сирэйгин сөпкө көрөргө браузер кээһин ыраастыаххын наада буолуо.\n*<strong>Firefox / Safari.</strong> <em>Shift</em> кунуопканы тутан туран <em>Саҥардыы</em> баттаа, эбэтэр <em>Ctrl-F5</em>, <em>Ctrl-R</em> дуу (Mac-ка <em>⌘-R</em>) баттаа;\n*<strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> баттаа (Mac-ка <em>⌘-Shift-R</em>)\n*<strong>Internet Explorer:</strong> <em>Ctrl</em> тутан туран <em>Саҥардыы</em> баттаа, эбэтэр <em>Ctrl-F5</em> баттаа.\n*<strong>Opera:</strong> Манна <em>Tools → Preferences</em> киирэн кээһин ыраастаа",
        "usercssyoucanpreview": "'''Көмө.''' CSS-билэ саҥа барылын бигэргэтиэҥ иннинэ бу тимэҕи «{{int:showpreview}}»  баттаан тургутан көр.",
        "userjsyoucanpreview": "'''Көмө.''' JS-билэ саҥа барылын бигэргэтиэҥ иннинэ бу тимэҕи «{{int:showpreview}}»  баттаан тургутан көр.",
        "usercsspreview": "'''Умнума: бу CSS тургутуута эрэ.\nБилигин оҥорбутуҥ бигэргэтиллэ илик!'''",
        "continue-editing": "Уларытар сиргэ",
        "previewconflict": "Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.",
        "session_fail_preview": "'''Сиэрбэр сессия идентификаторын сүтэрэн кэбиһэн эн уларытыыгын кыайан киллэрбэтэ.\nБаҕар, үлэ сеансын бүтэрбитиҥ буолуо. <strong>Баһаалыста, көҥүлү ааспыккын бил уонна өссө холонон көр.\n<strong>\nОлох сатамматаҕына биикиттэн [[Special:UserLogout|тахсан]] баран өссө киирэн көрөөр, ону сэргэ браузерыҥ бу саайтан cookies диэни ыларга көҥүллүүрүн бэрэбиэркэлээҥ.'''",
-       "session_fail_preview_html": "'''Сессия дааннайдарын сүтэрэн кэбиһэн сиэрбэр эн уларытыыгын киллэрбэтэ.'''\n\n''{{SITENAME}} ыраас HTML тылы көҥүллүүр буолан JavaScript туһананнар куһаҕаны оҥоруохтарын сөп, онон эрдэ көрдөрүү араарыллыбыт.''\n\n'''Өскө бу уларытыы туох да куһаҕаны аҕалыа диэбэт буоллаххына хатылаа. Ол сатамматаҕына [[Special:UserLogout|тахсан баран]] өссө киирэн көрөөр.'''",
+       "session_fail_preview_html": "Сиэссийэ дааннайдарын сүтэрэн кэбиһэн сиэрбэр эн уларытыыгын киллэрбэтэ.\n\n<em>{{SITENAME}} ыраас HTML тылы туттары көҥүллүүр буолан, JavaScript көмөтүнэн куһаҕаны оҥоруохтарын сөп, онон эрдэ көрдөрүү араарыллыбыт.</em>\n\n<strong>Өскө бу уларытыы туох да куһаҕаны аҕалыа диэбэт буоллаххына хатылаа.</strong> \nОл сатамматаҕына [[Special:UserLogout|тахсан баран]] өссө киирэн көрөөр, ону таһынан браузерыҥ cookies көҥүллүүрүн тургутуоххун сөп.",
        "token_suffix_mismatch": "'''Эн уларытыыҥ киирбэтэ, тоҕо диэтэххэ эн бырагырааммаҥ сорох сурук бэлиэлэрин сыыһа көрөр эбит.\nЫстатыйаны буорту гынымаары уларытыыҥ ылыныллыбата.\nИтинник сыыһалар үксүн прокси-сиэрбэрдэри туһаннахха тахсааччылар.'''",
        "edit_form_incomplete": "'''Уларытыы сорҕото сиэрбэргэ тиийбэтэ. Үчүгэйдик сыныйан көр, Эн уларытыыларыҥ туох да омсото суохтар дуо. Онтон өссө боруобалаа.'''",
        "editing": "Уларытыы $1",
        "invalid-content-data": "Алҕастаах дааннайдар",
        "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": "Манна көҥүллэммэт бэйэтэ сабыллар HTML-тиэктэр бааллар, холобур <code>&lt;b/></code> биитэр <code>&lt;span/></code>. Сотору кэминэн HTML5 ирдэбилигэр сөп түбэһиннэрэ, дьайыылара уларыйыа. Онон маннык эргэрбит тиэктэри туттубакка буола сатаа.",
        "duplicate-args-warning": "<strong>Болҕой:</strong> «$3» параметр бииртэн ордук эрэ буоллаҕына [[:$1]] маны [[:$2]] холбуур. Кэлиҥҥи эрэ сыыппара туһаныллыа.",
        "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>.",
        "revdelete-unsuppress": "Төннөрүллүбүт торумнартан хааччахтааһыны ылан кэбиһэргэ",
        "revdelete-log": "Төрүөтэ:",
        "revdelete-submit": "Маны талбыт {{PLURAL:$1|барылбар|барылларбар}} тутун",
-       "revdelete-success": "'''Барыл көстүүтэ сөпкө уларыйда.'''",
+       "revdelete-success": "Торум көстүүтэ саҥардылынна.",
        "revdelete-failure": "'''Барыл хайдах көстөрө кыайан уларытыллыбат:'''\n$1",
-       "logdelete-success": "'''Дьайыы көстүүтэ сөпкө уларыйда.'''",
+       "logdelete-success": "Дьайыы көстүүтэ уларыйда.",
        "logdelete-failure": "'''Сурунаал дөбөҥө быһаарыллыбата:'''\n$1",
        "revdel-restore": "Көстүүтүн уларытыы",
        "pagehist": "Устуоруйатын сирэйэ",
        "mergehistory-fail-no-change": "Устуоруйа холбоһуутугар ханнык да биэрсийэ холбоһуута буолбата. Баһаалыста сирэйи уонна быстах кэмнээх кэмнэбили өссө төгүл бэрэбиэркэлээ.",
        "mergehistory-fail-permission": "Устуоруйаны холбуурга быраап тиийбэт",
        "mergehistory-fail-self-merge": "Саҕалыыр уонна түмүктүүр сирэйдэриҥ атын буолуохтаахтар",
+       "mergehistory-fail-timestamps-overlap": "Төрүт торумнар биитэр сабырыйаллар, биитэр атын торумнар кэнниттэн кэлэллэр.",
        "mergehistory-fail-toobig": "Устуоруйаны холбуур табыллыбата, тоҕо диэтэххэ $1  барылга көҥүллэнэр лимииттэн элбэҕи көһөрөр наада эбит.",
        "mergehistory-no-source": "Бастакы $1 сирэй суох.",
        "mergehistory-no-destination": "Баар буолуохтаах $1 сирэй суох.",
        "search-external": "Тастан көрдөөһүн",
        "searchdisabled": "{{SITENAME}} көрдүүр тэрилэ араарыллыбыт. Атын көрдүүр системаларынан наадыйар сирэйдэргитин көрдөтүөххүтүн сөп. Ол гынан баран поисковик кээһигэр баар торум эргэрбит буолуон сөп.",
        "search-error": "Көрдүүр кэмҥэ алҕас таҕыста: $1",
+       "search-warning": "Көрдүүр кэмҥэ сэрэтии таҕыста: $1",
        "preferences": "Уларытыылар",
        "mypreferences": "Туруоруулар",
        "prefs-edits": "Көннөрүү ахсаана:",
        "saveprefs": "Бигэргэт",
        "restoreprefs": "Туруоруулары саҥаттан (салааларга барыларыгар)",
        "prefs-editing": "Уларытыы",
-       "rows": "Строкаалара:",
-       "columns": "Колонкалара:",
        "searchresultshead": "Көрдөөһүн түмүгэ",
        "stub-threshold": "Омооннорго ыйынньыктары оҥоруу боруога ($1):",
        "stub-threshold-sample-link": "холобур",
        "prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
        "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
        "savedprefs": "Эн туруорууларыҥ олохтоннулар.",
-       "savedrights": "{{GENDER:$1|$1}} кыттааччы бырааба бигэргэннэ.",
+       "savedrights": "{{GENDER:$1|$1}} кыттааччы бөлөҕө бигэргэннэ.",
        "timezonelegend": "Олохтоох кэм:",
        "localtime": "Олохтоох кэмим:",
        "timezoneuseserverdefault": "Сиэрбэр туруоруутунан ($1)",
        "prefs-help-gender": "Маны туруорар булгуччута суох. \nБырагыраамма сорох дьоҥҥо туһаайыллыбыт биллэриилэригэр эбэтэр кинилэргэ сыһыаннаах этиилэригэр кытааччы дьахтарыттан эбэтэр эр киһититтэн көрөн этии тутулун уларытан биэриэн сөп. \nТуора дьоҥҥо көстөр бэлиэтээһин.",
        "email": "Почта",
        "prefs-help-realname": "Сурукка киирбит аатыҥ булгуччута суох. Суруйдаххына ааптар быһыытынан ыйыллар буолуоҥ.",
-       "prefs-help-email": "ЭлекÑ\82Ñ\80оннай Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\81Ñ\83Ñ\80Ñ\83йаÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и ÐºÐ¸Ð¸Ñ\80ии тылгын умуннаххына санатарга көмөлөһүө.",
+       "prefs-help-email": "ЭлекÑ\82Ñ\80оннай Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\81Ñ\83Ñ\80Ñ\83йаÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и Ð°Ò»Ð°Ñ\80Ñ\8bк тылгын умуннаххына санатарга көмөлөһүө.",
        "prefs-help-email-others": "Эбии. Атын кыттааччылар Эйигин кытта электроннай почтаҕын билбэккэ эрэ суруйсар кыахтаныахтара.",
        "prefs-help-email-required": "E-mail баар буолуохтаах.",
        "prefs-info": "Сүрүн сибидиэнньэлэр",
        "prefswarning-warning": "Туруорууларгын уларыппыккын ол эрэн бигэргэппэтэххин.\nБу сирэйтэн «$1» баттамы баттаабакка таҕытаххына, барыта уруккутунан хаалыа.",
        "prefs-tabs-navigation-hint": "Сүбэ: Көмпүүтэриҥ клаватууратын стрелкаларын туһанан кыбытыктан кыбытыкка көһүөххүн сөп.",
        "userrights": "Кыттааччылар бырааптарын салайыы",
-       "userrights-lookup-user": "Ð\9aÑ\8bÑ\82Ñ\82ааÑ\87Ñ\8bлаÑ\80 Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ó©Ñ\80үн Ñ\81алайыы",
+       "userrights-lookup-user": "Ð\9aÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bнÑ\8b Ñ\82алыы",
        "userrights-user-editname": "Кыттааччы аата:",
-       "editusergroup": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн уларытарга",
+       "editusergroup": "Кыттааччы бөлөхтөрүн көрдөрүү",
        "editinguser": "<strong>[[User:$1|$1]]</strong> кыттааччы $2 быраабын уларытыы",
+       "viewinguserrights": "{{GENDER:$1|Кыттааччы}} быраабын көрүү <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Кыттааччы бөлөхтөрүн уларытарга",
+       "userrights-viewusergroup": "Кыттааччы бөлөхтөрүн көрүү",
        "saveusergroups": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн бигэргэт",
        "userrights-groupsmember": "Бу бөлөхтөргө киирэр:",
        "userrights-groupsmember-auto": "Көстүбэт чилиэн:",
        "userrights-reason": "Төрүөтэ:",
        "userrights-no-interwiki": "Атын биикилэргэ кыттааччылар бырааптарын уларытар быраабыҥ суох.",
        "userrights-nodatabase": "$1 билэ тиһигэ (олоҕо, база данных) суох эбэтэр локальнай буолбатах.",
-       "userrights-nologin": "Эн дьон бырааптарын уларытаргар администратор быһыытынан [[Special:UserLogin|бэлиэтэниэхтээххин]].",
-       "userrights-notallowed": "Атын кыттааччы быраабын эбэр уонна уларытар кыаҕыҥ суох эбит.",
        "userrights-changeable-col": "Эн уларытар кыахтаах бөлөхтөрүҥ",
        "userrights-unchangeable-col": "Бу бөлөхтөрү уларытар кыаҕыҥ суох",
        "userrights-conflict": "Кыттааччы быраабын быһаарарга алҕас таҕыста! Хатылаан көр.",
-       "userrights-removed-self": "Бэйэҥ кыаххын сарбынныҥ. Онон бу сирэйгэ киирэр кыаҕыҥ суох буолла.",
        "group": "Бөлөх:",
        "group-user": "Кыттааччылар",
        "group-autoconfirmed": "Аптамаатынан бигэргэтиллибит кыттааччылар",
        "right-siteadmin": "Билэ олоҕор (database) киирэри бобуу уонна көҥүллээһин",
        "right-override-export-depth": "сирэйдэри таһаарааһын (экспортааһын), ситимнээх сирэйдэри 5-с таһымҥа дылы холбоон туран",
        "right-sendemail": "Атын кыттааччыларга эл. почтаны ыытарга",
-       "right-passwordreset": "Киирии тылы почта нөҥүө уларытыыны көрүү",
-       "right-managechangetags": "[[Special:Tags|Бэлиэлэри]] билии олоҕуттан ылыы уонна сотуу",
+       "right-managechangetags": "[[Special:Tags|Тиэктэри]] оҥоруу уонна холбооһун/араарааһын",
        "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-high-volume": "Кылгас кэм иһигэр элбэҕи оҥоруу",
        "grant-group-customization": "Нарылааһын уонна туруоруулар",
        "grant-group-administration": "Дьаһайыы",
+       "grant-group-private-information": "Эн тускунан билиини көҥүллээһин",
        "grant-group-other": "Эгэлгэ тэрээһиннэр",
        "grant-blockusers": "Бэлиэ ааттары хааччахтааһын ууонна хааччаҕын устуу",
        "grant-createaccount": "Бэлиэтэнии",
        "grant-highvolume": "Түргэнник элбэҕи уларытыы",
        "grant-oversight": "Кыттааччылар уларытыыларын уонна сирэйдэр барылларын кистээһин",
        "grant-patrol": "Сирэй уларыйыытын ботурууллааһын",
+       "grant-privateinfo": "Киһи туһунан сиһилии билиигэ көҥүл",
        "grant-protect": "Көмүскээһин уонна көмүскэли суох гыныы",
        "grant-rollback": "Сирэй уларыйыытын төннөрүү",
        "grant-sendemail": "Атын кыттааччыларга эл. суругу ыытыы",
        "grant-basic": "Сүрүн быраап",
        "grant-viewdeleted": "Сотуллубут билэлэри уонна сирэйдэри көрүү",
        "grant-viewmywatchlist": "Кэтиир тиһиликкин көрүү",
+       "grant-viewrestrictedlogs": "Хааччахтаах сурунаалы көрүү",
        "newuserlogpage": "Кыттааччылары бэлиэтиир сурунаал",
        "newuserlogpagetext": "Соторутааҕыта бэлиэтэммит кыттааччылар.",
        "rightslog": "Кыттаачы бырааптарын сурунаала",
        "rightslogtext": "Бу кыттааччы бырааптарын уларыйыытын көрдөрөр сурунаал.",
        "action-read": "бу сирэйи ааҕыы",
        "action-edit": "бу сирэйи көннөрүү",
-       "action-createpage": "сирэйдэри оҥоруу",
-       "action-createtalk": "Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80ин Ð¾Ò¥Ð¾Ñ\80Ñ\83Ñ\83",
+       "action-createpage": "бу сирэйи оҥоруу",
+       "action-createtalk": "ырытыы сирэйин оҥоруу",
        "action-createaccount": "кыттааччы бу бэлиэтэнэр аатын оҥоруу",
        "action-autocreateaccount": "тас бэлиэ-аатынан аптамаатынан киирии",
        "action-history": "сирэй устуоруйатын көрүү",
        "action-upload_by_url": "бу билэни URL-аадырыстан киллэрии",
        "action-writeapi": "көннөрөргө API-ны туһаныы",
        "action-delete": "бу сирэйи сотуу",
-       "action-deleterevision": "бу торуму сотуу",
-       "action-deletedhistory": "бу сирэй сотуллубут историятын көрүү",
+       "action-deleterevision": "торумнары сотуу",
+       "action-deletelogentry": "сурунаал суруктарын сотуу",
+       "action-deletedhistory": "сирэй сотуллубут устуоруйатын көрүү",
+       "action-deletedtext": "сотуллубут торум тиэкиһин көрүү",
        "action-browsearchive": "сотуллубут сирэйдэри көрдөөһүн",
-       "action-undelete": "бу сирэйи төннөрүү",
-       "action-suppressrevision": "Ñ\81иÑ\80Ñ\8dй Ð±Ñ\83 ÐºÐ¸Ñ\81Ñ\82Ñ\8dммиÑ\82 Ñ\82оÑ\80Ñ\83мÑ\83н ÐºÓ©Ñ\80Ò¯Ò¯ Ñ\83онна Ñ\82өннөÑ\80Ò¯Ò¯",
+       "action-undelete": "сирэйи төннөрүү",
+       "action-suppressrevision": "сирэй кистэммит торумун көрүү уонна төннөрүү",
        "action-suppressionlog": "бу тус сурунаалы көрүү",
        "action-block": "кыттааччы уларытыыны оҥорорун бобуу",
        "action-protect": "бу сирэй харысхалын таһымын уларытыы",
        "action-userrights-interwiki": "атын биикигэ кыттыы бырааптарын уларытыы",
        "action-siteadmin": "билэ олоҕун хааччахтааһын уонна хааччахтааһынын устуу",
        "action-sendemail": "сурук ыытыы",
+       "action-editmyoptions": "бэйэ туруорууларын көрүү",
        "action-editmywatchlist": "кэтиир тиһиккин уларыт",
        "action-viewmywatchlist": "кэтиир тиһиккин көрүү",
        "action-viewmyprivateinfo": "бэйэҥ тускунан көрүү",
        "action-editmyprivateinfo": "бэйэҥ тускунан суруллубуту уларыт",
        "action-editcontentmodel": "сирэй ис тутулун уларытыы",
-       "action-managechangetags": "билии олоҕор бэлиэлэри оҥоруу уонна сотуу",
+       "action-managechangetags": "тиэктэри оҥоруу уонна холбооһун/араарыы",
        "action-applychangetags": "тиэктэри Эн уларытыыларгын кытта туһанары көҥүллээ",
        "action-changetags": "ханнык баҕарар тиэктэри сурунаал биирдиилээн уларытыыларыгар уонна суруктарыгар эбэри уонна сотору көҥүллээ",
+       "action-deletechangetags": "тиэктэри билии олоҕуттан сотуу",
+       "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-activefilters": "Холбоммут сиидэлэр",
+       "rcfilters-search-placeholder": "Сиидэлэри кэнники уларытыы (көр биитэр киллэр)",
+       "rcfilters-invalid-filter": "Сатаммат сиидэ",
+       "rcfilters-filterlist-title": "Сиидэ",
+       "rcfilters-filterlist-noresults": "Сиидэ көстүбэтэ",
+       "rcfilters-filtergroup-authorship": "Ааптарын уларытыы",
+       "rcfilters-filter-editsbyself-label": "Эн тус бэйэҥ уларытыыларыҥ",
+       "rcfilters-filter-editsbyself-description": "Бэйэҥ уларытыыларыҥ.",
+       "rcfilters-filter-editsbyother-label": "Атыттар уларытыылара.",
+       "rcfilters-filter-editsbyother-description": "Атыттар уларытыылара (Эйиэнэ буолбатах).",
+       "rcfilters-filtergroup-userExpLevel": "Кыттааччы уопутун таһымынан",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Саҥа киирбиттэр",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Отой саҥалар: 10 көннөрүүттэн аҕыйаҕы оҥорбуттар уонна бэлиэтэмиттэрэ 4 хоно иликтэр.",
+       "rcfilters-filter-userExpLevel-learner-label": "Үөрэнээччилэр",
        "rcnotefrom": "Манна {{PLURAL:$5|уларытыы көрдөрүлүннэ|уларытыылар көһүннүлэр}} баччаттан <strong>$3, $4</strong> (баччаттан элбэх көстүбэт <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
        "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]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияттан сотулунна",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] категорияттан сотулунна, [[Special:WhatLinksHere/$1|бу сирэй атын сирэйдэргэ киириитэ]]",
        "autochange-username": "MediaWiki аптамаатынан уларыйыыта",
        "upload": "Билэни угуу",
        "uploadbtn": "Билэни киллэрии",
        "file-thumbnail-no": "Билэ аата мантан саҕаланар <strong>$1</strong>.\nАрааһа ойуу кыра куоппуйата быһыылаах ''(миниатюра)''.\nБу ойуу толору барыйаана баар буоллаҕына ону манна суруй, эбэтэр аатын уларыт.",
        "fileexists-forbidden": "Маннык ааттаах билэ баар, хат суруллар кыаҕа суох.\n\nСин биир бу билэни киллэриэххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Маннык ааттаах ойуу уопсай ыскылаакка баар эбит.\nОл да буоллар билэни киллэриэххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Киллэриллэр билэ баар билэни кытта үүт-үкчү <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Киллэриллэр билэ баар билэ {{PLURAL:$2|урукку барылын|урукку барылларын}} кытта үүт-үкчү <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Бу билэ атын {{PLURAL:$1|билэ дубликаата|билэлэр дубликааттара}} буолар:",
        "file-deleted-duplicate": "Маннык билэ ([[:$1]]) урут сотуллубут эбит. Суруттарыаҥ иннинэ бастаан тоҕо сотуллубутун көр.",
        "file-deleted-duplicate-notitle": "Маннык билэ урут сотуллубут эбит, аата бобуллубут.\nБилэни саҥаттан киллэриэҥ иннинэ бобуллубут билэлэри көрөр кыахтаах киһиэхэ тахсан тоҕо бобуллубутун быһаарыс.",
        "uploaded-script-svg": "Хачайдаммыт SVG-билэҕэ сценарийы өйүүр куттааллаах «$1» элэмиэн көһүннэ.",
        "uploaded-hostile-svg": "Хачайдаммыт SVG-билэ истиилин элэмиэнигэр кутталлаах CSS-куод көһүннэ.",
        "uploaded-event-handler-on-svg": "SVG-билэлэргэ <code>$1=\"$2\"</code> сабыытыйаны таҥастааччы атрибууттарын туруоруу көҥүллэммэт.",
+       "uploaded-href-attribute-svg": "Манна көстүбүт <code><$1 $2=\"$3\"></code> SVG-билэ сигэҕэ аналлаах href-атрибуттарыгар, маннык эрэ көүллэнэр: http:// биитэр https://.",
        "uploaded-href-unsafe-target-svg": "Хачайдаммыт SVG-билэҕэ кутталлаах сигэ көһүннэ <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "«Animate» тиэк көһүннэ, кини «from»-атрибут көмөтүнэн  <code>&lt;$1 $2=\"$3\"&gt;</code> хачайдаммыт SVG-билэҕэ сигэни уларытыан сөп.",
        "uploaded-setting-event-handler-svg": "Дьайыы таҥастыыр тэрил атрибуутун уларытар бобуллубут, киллэриллибит SVG-билэҕэ <code>&lt;$1 $2=\"$3\"&gt;</code> куод көстүбүт.",
        "uploaded-setting-handler-svg": "«Handler» атрибууту аадырыс/дааннай/скрипт көмөтүнэн быһаарар SVG хааччахтаммыт. Угуллубут SVG-билэҕэ <code>$1=\"$2\"</code> конструкция көстүбүт.",
        "uploaded-remote-url-svg": "Тэйиччи URL-лунан атрибууттуур SVG хааччахтаммыт. Киллэриллибит SVG-билэҕэ <code>$1=\"$2\"</code> көстүбүт.",
        "uploaded-image-filter-svg": "Хачайдаммыт SVG-билэҕэ маннык URL-аадырыстаах ойуу сиидэтэ көстүбүт <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '$1'",
+       "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "Хачайдаммит билэҕэ XML анаалыстанар кыаҕа суох.",
        "uploadvirus": "Бу билэ вирустаах! Көр: $1",
        "uploadjava": "Билэ Java .class билэлээх ZIP-архыып эбит.\nКуттал суох буолбатын диэн Java-билэрэри манна угар бобуллар.",
        "upload-http-error": "HTTP алҕаһа таҕыста: $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": "Төнүн",
        "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-name-tooltip": "Билэ баһа кини аатын курдук бигэргэниэ. Ханнык баҕарар тылы уонна тыллар ыккардыларыгар арыты туһаныахха сөп. Кэтирээһинин ыйыма.",
        "upload-form-label-infoform-description": "Быһаарыыта",
        "upload-form-label-infoform-description-tooltip": "Кылгастык бу айымньы туһунан сүрүннээн этиҥ. Хаартыскаҕа сүнньүнэн туох ойууламмытый, ханна түһэриллибитий.",
        "upload-form-label-usage-title": "Туһаныы",
        "backend-fail-read": "$1 билэни ааҕар табыллыбата.",
        "backend-fail-create": "$1 билэни суруттарар табыллыбата.",
        "backend-fail-maxsize": "$1 билэни суруттарар табыллыбата, тоҕо диэтэххэ кини кээмэйэ $2 баайты куоһарар.",
-       "backend-fail-readonly": "«$1» сиэрбэр «ааҕыы эрэ» эрэсиимҥэ турар. Төрүөтэ: «$2»",
+       "backend-fail-readonly": "«$1» сиэрбэр «ааҕыы эрэ» диэн эрэсиимҥэ турар. Төрүөтэ: <em>$2</em>",
        "backend-fail-synced": "«$1» билэ сөпсөһүллүбэтэх туруктаах эбит",
        "backend-fail-connect": "Маны кытта «$1» холбонор табыллыбата.",
        "backend-fail-internal": "Манна «$1» биллибэт алҕас таҕыста.",
        "uploadstash-summary": "Бу сирэй биикигэ киллэриллибит (эбэтэр киллэриллэ турар) ол гынан баран аһаҕас көрүүгэ тахса илик билэлэри көрөргө аналлаах. Бу билэлэр ааптартан ураты кимиэхэ да көстүбэттэр.",
        "uploadstash-clear": "Кистэммит билэлэри суох оҥорорго",
        "uploadstash-nofiles": "Кистэммит билэлэриҥ суохтар.",
-       "uploadstash-badtoken": "ЫйбÑ\8bÑ\82 Ð´Ñ\8cайÑ\8bÑ\8bгÑ\8bн Ð¾Ò¥Ð¾Ñ\80оÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а. Ð\90Ñ\80ааһа Ð±Ð¾Ð»Ð´Ñ\8cоÒ\95о Ð±Ò¯Ð¿Ð¿Ò¯Ñ\82 Ð±Ñ\8bÒ»Ñ\8bÑ\8bлааÑ\85. Ó¨Ñ\81Ñ\81Ó© Ð±Ð¾Ñ\80Ñ\83обалаа.",
+       "uploadstash-badtoken": "ЫйбÑ\8bÑ\82 Ð´Ñ\8cайÑ\8bÑ\8bгÑ\8bн Ð¾Ò¥Ð¾Ñ\80оÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а. Ð\90Ñ\80ааһа ÐºÐ¸Ð¸Ñ\80биÑ\82 Ð°Ð°Ñ\82Ñ\8bÒ¥ Ð±Ð¾Ð»Ð´Ñ\8cоÒ\95о Ð±Ò¯Ð¿Ð¿Ò¯Ñ\82 Ð±Ñ\8bÒ»Ñ\8bÑ\8bлааÑ\85. Ð¥Ð°Ñ\82Ñ\8bлаан ÐºÓ©Ñ\80.",
        "uploadstash-errclear": "Билэлэри сотор табыллыбата.",
        "uploadstash-refresh": "Билэлэр тиһиктэрин саҥардан биэр",
+       "uploadstash-thumbnail": "ойуучааны көрдөр",
+       "uploadstash-exception": "Суруттараргын быстах уурар сиргэ харайар сатаммата ($1): \"$2\".",
        "invalid-chunk-offset": "Бобуллубут сыҕарыйыы",
        "img-auth-accessdenied": "Киирии бобуллубут",
        "img-auth-nopathinfo": "PATH_INFO суох.\nЭн сиэрбэриҥ маннык сибидиэнньэни ыытарга туруоруллубатах эбит.\nБаҕар кини CGI олоҕурара буолуо ол иһин img_auth өйөөбөтө буолуо.\nМаны https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization көр.",
        "filerevert-submit": "Төннөрүү",
        "filerevert-success": "'''[[Media:$1|$1]]''' бу торумҥа төннөрүлүннэ [$4 торум Filetype-missingот $3, $2].",
        "filerevert-badversion": "Бу билэ этиллибит күҥҥэ-ыйга/кэмҥэ оҥоһуллубут урукку торума суох.",
+       "filerevert-identical": "Талбыт торумуҥ билиҥҥи торуму кытта үүт үкчүлэр.",
        "filedelete": "Сот: $1",
        "filedelete-legend": "Билэни сот",
        "filedelete-intro": "Бу билэни '''[[Media:$1|$1]]''' туох баар суруллубут историятын кытта сотон эрэҕин.",
        "apisandbox": "API песочница",
        "apisandbox-jsonly": "API-песочницаны туһанарга JavaScript ирдэнэр.",
        "apisandbox-api-disabled": "Бу сайтка API араарыллыбыт.",
+       "apisandbox-intro": "Бу сирэйи <strong>MediaWiki API</strong> тургутан көрөргө туһан.\nAPI-ни туттар туһунан сиһилии манна ааҕыахха сөп [[mw:API:Main page|API туһунан]]. Холобура, [https://www.mediawiki.org/wiki/API#A_simple_example Сүрүн сирэй иһинээҕитин хайдах ылар туһунан]. Атын холобурдары көрөргө сигэни баттаа.\nБолҕой: бу тургутар сирэй эрээри, манна суруйбутуҥ биикигэ уларытыыны оҥоруон сөп.",
        "apisandbox-fullscreen": "Паныалы арыйыы.",
        "apisandbox-fullscreen-tooltip": "Браузеры толорорго песочница паныалын арыйыы.",
        "apisandbox-unfullscreen": "Сирэйи көрдөрүү",
        "apisandbox-submit": "Ыйытык оҥоруу",
        "apisandbox-reset": "Сот",
        "apisandbox-retry": "Хатылаа",
+       "apisandbox-loading": "«$1» API-модульга аналлаах хачайдана турар…",
+       "apisandbox-load-error": "«$1» API-модулга аналлаах хачайданарыгар алҕас таҕыста: $2",
+       "apisandbox-no-parameters": "Бу API-модулга туруоруута (параметра) суох.",
        "apisandbox-helpurls": "Көмө сигэлэр",
        "apisandbox-examples": "Холобурдар",
        "apisandbox-dynamic-parameters": "Дьайыы кээмэйдэрэ.",
        "apisandbox-results": "Түмүк",
        "apisandbox-sending-request": "API-көрдөбүлү ыытыы…",
        "apisandbox-loading-results": "API-түмүгүн ылыы…",
+       "apisandbox-results-error": "Көрдөбүлгэ API-хоруйу киллэрии  кэмигэр алҕас таҕыста: $1.",
+       "apisandbox-request-url-label": "Көрдөбүл URL-аадырыһа:",
+       "apisandbox-request-time": "Көрдөбүл болдьоҕо: {{PLURAL:$1|$1 мс}}",
        "apisandbox-results-fixtoken": "Токены көннөрөн баран саҥаттан ыыт.",
+       "apisandbox-results-fixtoken-fail": "«$1» токены ыҥырар табыллыбата.",
+       "apisandbox-alert-page": "Бу сирэй хонуулара алҕастаах.",
+       "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>муҥутуурдук</kbd> туттулларын туоруор.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Аат даллара барыта)",
+       "apisandbox-multivalue-all-values": "$1 (Бары суолталара)",
        "booksources": "Кинигэлэр источниктара",
        "booksources-search-legend": "Кинигэ туһунан көрдөө",
        "booksources-search": "Бул",
        "booksources-text": "Манна кинигэ туһунан атын саайтарга ыйынньыктар хомулуннулар, онно баҕар эбии информация көстүөҕэ.",
        "booksources-invalid-isbn": "ISBN, арааһа, сыыһалаах. Нүөмэр көһөрөргө алҕас тахсыбатаҕын хат көр эрэ.",
+       "magiclink-tracking-rfc": "RFC сигэлээх сирэйдэр",
+       "magiclink-tracking-rfc-desc": "Бу сирэй RFC сигэлээх. Сиһилии [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-pmid": "PMID сигэлээх сирэйдэр",
+       "magiclink-tracking-pmid-desc": "Бу сирэйгэ PMID сигэ туттуллар. Сиһилии [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "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}}:кыттааччы аата):",
        "log": "Сурунааллар",
        "activeusers-intro": "Бу кэлиҥҥи $1 {{PLURAL:$1|күҥҥэ|күннэргэ}} тугу эмэ гыммыт кыттааччылар тиһиктэрэ.",
        "activeusers-count": "Кэнники $3 күҥҥэ саҥа $1 көннөрүү киирбит",
        "activeusers-from": "Мантан саҕалаан кыттааччылары көрүү:",
+       "activeusers-groups": "Маннык бөлөххө киирэр кыттааччылары көрдөр:",
+       "activeusers-excludegroups": "Маннык бөлөххө киирэр кыттааччылары көрдөрүмэ:",
        "activeusers-noresult": "Кыттааччылар көстүбэтилэр.",
        "activeusers-submit": "Көхтөөх кыттааччылары көрдөр",
        "listgrouprights": "Кыттааччылар бөлөхтөрүн бырааптара",
        "listgrouprights-namespaceprotection-namespace": "Аат дала",
        "listgrouprights-namespaceprotection-restrictedto": "Кыттааччы көннөрөр бырааба",
        "listgrants": "Көҥүл",
+       "listgrants-summary": "Манна кыахтар тиһиликтэрэ, туох быраабы биэрэллэрэ көстөр. Кыттааччы ханнык эмит бырагыраамаҕа бэйэтин аатыттан тугу эрэ гынары көҥүллүөн сөп, ол эрээри онто быраабын таһымынан хааччахтанар. Бырагыраама кыттааччы аатыттан тугу эрэ гынар түгэнигэр ол аакка иҥэриллибит бырааптан уратыны оҥорор кыаҕа суох. \nБыраап туһунан [[{{MediaWiki:Listgrouprights-helppage}}|сиһилии манна ааҕыахха сөп]].",
        "listgrants-grant": "Көҥүл",
        "listgrants-rights": "Быраап",
        "trackingcategories": "Кэтиир категориялар",
        "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": "Сирэйгэ <nowiki>__INDEX__</nowiki> диэн «аптаах тыл» баар эбит (сирэй ону көҥүллүүр аат далыгар баар эбит), онон көрдүүр роботтар кинини болҕомтоҕо ылыа да суох түгэннэргэ көрөллөр эбит.",
        "post-expand-template-inclusion-category-desc": "Халыыптары барытын көрдөрдөххө сирэй ыйааһына маны <code>$wgMaxArticleSize</code> куоһарыан сөп, онон сорҕото эрэ көрдөрүлүннэ.",
        "emailccsubject": "Эн суругуҥ куоппуйата $1: $2",
        "emailsent": "Сурук барда",
        "emailsenttext": "Эн суругуҥ ыытылынна.",
-       "emailuserfooter": "Бу сурук $2 кыттааччыга $1 кыттааччыттан «Сурукта ыыт» диэн тэрил көмөтүнэн {{SITENAME}} ситим-сиртэн ыытыллыбыт.",
+       "emailuserfooter": "Бу сурук {{GENDER:$2|$2}} кыттааччыга {{GENDER:$1|$1}} кыттааччыттан «Сурукта ыыт» (\"{{int:emailuser}}\") диэн тэрил көмөтүнэн {{SITENAME}} ситим-сиртэн ыытыллыбыт. {{GENDER:$2|Эн}} электрон аадырыһыҥ ыыппыт {{GENDER:$1|киһигэр}} көстүөҕэ.",
        "usermessage-summary": "Тиһилик биллэриитин хааллар.",
        "usermessage-editor": "Тиһилик биллэрээччитэ",
        "watchlist": "Кэтэбилим тиһигэ",
        "watchnologin": "Бэйэҕин билиһиннэр",
        "addwatch": "Кэтэбил тиһигэр киллэр",
        "addedwatchtext": "«[[:$1]]» сирэй уонна кинини кытта ситимнээх ырытыы сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигэр]] киирдэ.",
+       "addedwatchtext-talk": "«[[:$1]]» уонна кинини кытта ситимнээх сирэй [[Special:Watchlist|кэтэбилиҥ тиһигэр]] киирдэ.",
        "addedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигэр эбилиннэ.",
        "removewatch": "Кэтэбил тиһигиттэн сот",
        "removedwatchtext": "[[:$1]]\" сирэй уонна кини ырытыытын сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулунна.",
+       "removedwatchtext-talk": "[[:$1]]\" уонна кинини кытта ситимнээх сирэй [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулуннулар.",
        "removedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигиттэн сотулунна.",
        "watch": "Кэтээ",
        "watchthispage": "Бу сирэйи кэтээ",
        "delete-toobig": "Бу сирэй уларытыыларын историята уһун, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маннык сирэйдэри сотор хааччахтанар, тоҕо диэххэ алҕас {{SITENAME}} алдьаныан сөп.",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
        "deleteprotected": "Бу сирэйи, көмүскэллээх буолан, сотор кыаҕыҥ суох эбит.",
-       "deleting-backlinks-warning": "'''Сэрэтии.''' Сотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
+       "deleting-backlinks-warning": "<strong>Сэрэтии.</strong>\nСотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
        "rollback": "Уруккутугар төннөр",
        "rollbacklink": "төннөр",
        "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\nКэнники уларытыыны [[User:$3|$3]] ([[User talk:$3|Ырытыы]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) оҥорбут.",
        "editcomment": "Уларытыыны маннык быһаарбыттар: <em>$1</em>.",
        "revertpage": "([[User talk:$2|Ырытыы]]) көннөрүүлэрэ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлэр",
        "revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ: {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "$1 көннөрүүлэр бу торумҥа төннөрүлүннүлэр: $2.",
+       "rollback-success-notify": "$1 уларытыылара сотулуннулар; \n$2 тиһэх торумугар төннөрүлүннэ. [$3 Уларытыыны көрдөр]",
        "sessionfailure-title": "Сиэссийэ алҕаһа",
        "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
        "changecontentmodel": "Сирэй ис тутулун киэбин уларытыы",
        "changecontentmodel-title-label": "Сирэй баһа",
        "changecontentmodel-model-label": "Иһинээҕитин саҥа киэбэ",
        "changecontentmodel-reason-label": "Төрүөтэ:",
+       "changecontentmodel-submit": "Уларыйыы",
        "changecontentmodel-success-title": "Иһинээҕитин киэбэ уларыйда",
        "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 $3 диэн сирэйи маны туһанан «$5» {{GENDER:$2|айбыт}}",
        "logentry-contentmodel-change": "$1 кыттааччы $3 сирэй иһинээҕитин мадьыалын мантан «$4» манна «$5» {{GENDER:$2|уларыппыт}}",
        "logentry-contentmodel-change-revertlink": "төннөрүү",
        "logentry-contentmodel-change-revert": "төннөрүү",
        "modifiedarticleprotection": "\"[[$1]]\" сирэй уларытыытын таһыма уларыйда",
        "unprotectedarticle": "[[$1]]\" көмүскэлэ суох оҥоһулунна",
        "movedarticleprotection": "көмүскэл туруоруутун мантан \"[[$2]]\" манна \"[[$1]]\" көһөрдө",
+       "protectedarticle-comment": "Маны «[[$1]]» {{GENDER:$2|көмүскээбит}}",
+       "modifiedarticleprotection-comment": "«[[$1]]» көмүскэлин таһымын {{GENDER:$2|уларыппыт}}",
+       "unprotectedarticle-comment": "«[[$1]]» көмүскэлин {{GENDER:$2|соппут}}",
        "protect-title": "\"$1\": Уларытыы таһымын туруоруу",
        "protect-title-notallowed": "Харысхал \"$1\" таһымын көрүү",
        "prot_1movedto2": "[[$1]] аата манныкка уларытылынна: [[$2]]",
        "undeletehistorynoadmin": "Ыстатыйа сотуллубут.\nСотуу төрүөтэ уонна ыстатыйаны суруйбут кыттааччылар испииһэктэрэ манна көрдөрүлүннэ.\nСотуллубут ыстатыйа ис хоһоонун дьаһабыллар эрэ көрүөхтэрин сөп.",
        "undelete-revision": "$3 суруйбут $1 ыстатыйа сотуллубут торума (суруйуу кэмэ: $4, $5):",
        "undeleterevision-missing": "Сыыһа эбэтэр суох торум.\nАрааһа ыйынньыгыҥ сыыһа суруллубут, эбэтэр бу торум архыыптан сотуллан хаалбыт.",
+       "undeleterevision-duplicate-revid": "$1 {{PLURAL:$1|торум}} сөргүтүллэр кыаҕа суох, тоҕо диэтэххэ {{PLURAL:$1|кини|кинилэр}} <code>rev_id</code>{{PLURAL:$1|-та|-лара}} хайыы-үйэ туһаныллар эбит.",
        "undelete-nodiff": "Ханнык да иннинээҕи торум көстүбэтэ.",
        "undeletebtn": "Төннөр",
        "undeletelink": "көрүү/төннөрүү",
        "undeletedrevisions": "{{PLURAL:$1|1 уларытыы|$1 уларытыы}} төннөрүлүннэ",
        "undeletedrevisions-files": "{{PLURAL:$1|1 уларытыы|$1 уларытыы}}  уонна {{PLURAL:$2|1 билэ|$2 билэ}} төннөрүлүннэ",
        "undeletedfiles": "{{PLURAL:$1|1 билэ|$1 билэ}} төннөрүлүннэ",
-       "cannotundelete": "Сөргүтүү алҕаһа:\n$1",
+       "cannotundelete": "Сөргүтүү сороҕо табыллыбата:\n$1",
        "undeletedpage": "'''$1 төннөрүлүннэ (төннөрүллүбүт)'''\n\nКэнники сотуулар уонна төннөрүүлэр испииһэктэрин [[Special:Log/delete|манна]] көрүөххүн сөп.",
        "undelete-header": "Соторутааҥы [[Special:Log/delete|сотуу испииһэгин]] көрүөххүн сөп.",
        "undelete-search-title": "Сотуллубут сирэйдэри көрдөөһүн",
        "sp-contributions-newbies-sub": "Саҥа ааттартан",
        "sp-contributions-newbies-title": "Саҥа бэйэлэрин билиһиннэрбит дьон уларытыылара",
        "sp-contributions-blocklog": "Бобуу сурунаала",
-       "sp-contributions-suppresslog": "кыттааччы сотуллубут көннөрүүлэрэ",
-       "sp-contributions-deleted": "кыттааччы сотуллубут көннөрүүлэрэ",
+       "sp-contributions-suppresslog": "{{GENDER:$1|кыттааччы}} сотуллубут көннөрүүлэрэ",
+       "sp-contributions-deleted": "{{GENDER:$1|кыттааччы}} сотуллубут көннөрүүлэрэ",
        "sp-contributions-uploads": "киллэриилэр",
        "sp-contributions-logs": "сурунааллар",
        "sp-contributions-talk": "ырытыы",
        "sp-contributions-username": "IP аадырыһа эбэтэр аата:",
        "sp-contributions-toponly": "Кэнники барыллары эрэ көрдөр",
        "sp-contributions-newonly": "Саҥаттан оҥоһуллубут сирэйдэри эрэ көрдөр",
+       "sp-contributions-hideminor": "Суолтата суох уларытыылары көрдөрүмэ",
        "sp-contributions-submit": "Көрдөө",
        "whatlinkshere": "Манна сигэнэллэр",
        "whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
        "unblock": "Кытааччы хааччаҕын устуу",
        "blockip": "{{GENDER:$1|Кыттааччыны}} хааччахтаа",
        "blockip-legend": "Кыттааччыны хааччахтааһын",
-       "blockiptext": "Ханнык эмит IP-ттан суруйары манна баар форманы туһанан боп.\nВандализмы утаран уонна [[{{MediaWiki:Policy-url}}]]\nбыраабылалрын тутуһан эрэ бобуохтааххын.\nХайаан да бобуу төрүөтүн кэпсээ (холобур, вандализм баар сирэйдэриттэн\nбыһа тардан манна көрдөр).",
+       "blockiptext": "Ханнык эмит IP-ттан биитэр бэлиэ-ааттан суруйары манна баар форманы туһанан боп.\nБандааллааһыны утаран уонна [[{{MediaWiki:Policy-url}}|быраабылалары]]\nтутуһан эрэ бобуохтааххын.\nХайаан да бобуу төрүөтүн кэпсээ (холобур, бандааллааһын баар сирэйдэриттэн\nбыһа тардан көрдөр).\nIP-аадырыс диапазонун [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] туһанан хааччахтыаххын сөп.\nХааччах муҥутуур диапазона IPv4 боротокуолга - /$1, IPv6 боротокуолга - /$2.",
        "ipaddressorusername": "IP аадырыһа эбэтэр кыттааччы аата:",
        "ipbexpiry": "Түмүктэниэ:",
        "ipbreason": "Төрүөтэ:",
        "ipb-unblock": "Кыттаачыны эбэтэр IP-ны бобуллубуттар испииһэктэриттэн таһаар",
        "ipb-blocklist": "Бобуулары көрдөр",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} суруйуута",
+       "ipb-blocklist-duration-left": "$1 хаалла",
        "unblockip": "Кыттааччыны көҥүллээ",
        "unblockiptext": "IP эбэтэр кыттааччы көннөрөр/уларытар быраабын манна баар форманы туһанан төннөр.",
        "ipusubmit": "Хааччаҕын уһул",
        "lockdbsuccesstext": "Билии олоҕун (database) уларытар бобулунна.\n<br />Үлэлээн бүттэххинэ [[Special:UnlockDB|уларытары көҥүллүүргүн]] умнума.",
        "unlockdbsuccesstext": "Билии олоҕун (database) уларытар көҥүллэннэ.",
        "lockfilenotwritable": "Бобуу билэтигэр суруйар кыаҕыҥ суох. БД уларытары көҥүллүүргэ эбэтэр боборго веб-сервер бу билэни уларытар бырааптаах буолуохтаах.",
+       "databaselocked": "Билии олоҕо хайыы-үйэ хааччахтаммыт.",
        "databasenotlocked": "БД уларытааһын бобуллубата.",
        "lockedbyandtime": "($1 $2 $3)",
        "move-page": "$1 - аатын уларытыы",
        "cant-move-to-user-page": "Эн кыттааччы аатын далыгар сирэйдэри уларытар кыаҕыҥ суох (анныкы сирэйдэриттэн ураты).",
        "cant-move-category-page": "Категория сирэйин аатын уларытар кыаҕыҥ суох эбит.",
        "cant-move-to-category-page": "Сирэй аатын уларытан категория сирэйэ гынар кыаҕыҥ суох эбит.",
+       "namespace-nosubpages": "«$1» аат далыгар сирэй оҥорор табыллыбат эбит.",
        "newtitle": "Саҥа аата:",
        "move-watch": "Кэтээн көрөргө",
        "movepagebtn": "Аатын уларыт",
        "movelogpagetext": "Манна ааттара уларытыллыбыт сирэйдэр испииһэктэрэ көстөр.",
        "movesubpage": "{{PLURAL:$1|Алын сирэй|Алын сирэйдэр}}",
        "movesubpagetext": "Бу сирэй $1 {{PLURAL:$1|алын сирэйдээх|алын сирэйдэрдээх}}.",
+       "movesubpagetalktext": "Ырытыытын сирэйэ манна көстөр $1 {{PLURAL:$1|алын сирэйдээх|алын сирэйдэрдээх}}.",
        "movenosubpage": "Бу сирэй алын сирэйэ суох.",
        "movereason": "Төрүөтэ:",
        "revertmove": "төннөрүү",
        "export-download": "Билэ быһыытынан хаалларыахха диэ",
        "export-templates": "Халыыптары киллэрии",
        "export-pagelinks": "Бачча дириҥҥэ дылы ситимнээх сирэйдэри киллэр:",
+       "export-manual": "Сирэйдэри бэйэҥ киллэр:",
        "allmessages": "Систиэмэ (тиһик) биллэриилэрэ",
        "allmessagesname": "Биллэрии",
        "allmessagesdefault": "Туспа этиллибэтэҕинэ суруллар тиэкис",
        "import-nonewrevisions": "Биир да уларытыы импортаммата (бу иннинэ таҥастаммыттар, биитэр алҕастаах буолан көтүтүллүбүттэр).",
        "xml-error-string": "$1 - $2 строка, $3 колонка ($4 байт): $5",
        "import-upload": "XML-дааннайдары киллэр",
-       "import-token-mismatch": "Арахсан хаалбыт. Өссө киирэн көр.",
+       "import-token-mismatch": "Арахсан хаалбыт. \n\nБаҕар тахсан хаалбытыҥ буолуо. <strong>Бэлиэтэммит ааккынан киирэн олороргун тургутан баран хатылаан көр.</strong>.\nӨскөтө син биир көмөлөспөтөҕүнэ [[Special:UserLogout|тахсан баран]] төттөрү киирэн көр уонна браузерыҥ куукалары ыларын тургут.",
        "import-invalid-interwiki": "Бу биикиттэн импорт оҥорор сатаммат(а).",
        "import-error-edit": "«$1» сирэй көһөрүллүбэтэ, тоҕо диэтэххэ кинини уларытарыҥ көҥүллэммэт эбит.",
        "import-error-create": "«$1» сирэй киллэриллибэтэ, тоҕо диэтэххэ кинини айарыҥ сатаммат эбит.",
        "tooltip-feed-rss": "RSS бу сирэйгэ",
        "tooltip-feed-atom": "Atom бу сирэйгэ",
        "tooltip-t-contributions": "{{GENDER:$1|Бу кыттааччы}} уларыппыт сирэйдэрин тиһилигэ",
-       "tooltip-t-emailuser": "Бу киһиэхэ сурук ыытарга",
+       "tooltip-t-emailuser": "{{GENDER:$1|Бу киһиэхэ}} сурук ыытарга",
        "tooltip-t-info": "Бу сирэй туһунан сиһилии",
        "tooltip-t-upload": "Билэлэри суруттарыы",
        "tooltip-t-specialpages": "Анал сирэйдэр испииһэктэрэ",
        "tooltip-ca-nstab-category": "Категория туһунан",
        "tooltip-minoredit": "Уларытыыны суолтата кыра курдук бэлиэтээ",
        "tooltip-save": "Уларытыыны бигэргэтии",
+       "tooltip-publish": "Уларытыыларгын бэчээттээһин",
        "tooltip-preview": "Уларытыах иннинэ көрүү; бука диэн маны туһан!",
        "tooltip-diff": "Уларытыах иннинэ баар тиэкиһи кытта тэҥнээһин.",
        "tooltip-compareselectedversions": "Икки талыллыбыт торумнар ыккардыларынааҕы уратыны көрдөр.",
        "pageinfo-length": "Сирэй устата (баайтынан)",
        "pageinfo-article-id": "Сирэй нүөмэрэ",
        "pageinfo-language": "Сирэй омугун тыла",
+       "pageinfo-language-change": "уларыт",
        "pageinfo-content-model": "Сирэй иһинээҕитин модела",
+       "pageinfo-content-model-change": "уларыт",
        "pageinfo-robot-policy": "Роботтар көрдөөһүннэрин туруга",
        "pageinfo-robot-index": "Көҥүллэммит",
        "pageinfo-robot-noindex": "Араарыллыбыт",
        "pageinfo-category-pages": "Сирэй ахсаана",
        "pageinfo-category-subcats": "Субкатегория ахсаана",
        "pageinfo-category-files": "Билэ ахсаана",
+       "pageinfo-user-id": "Кыттааччы нүөмэрэ",
        "markaspatrolleddiff": "Бэрэбиэркэлэммит курдук бэлиэтээ",
        "markaspatrolledtext": "Бу ыстатыйаны бэрэбиэркэлэммит курдук бэлиэтээ",
+       "markaspatrolledtext-file": "Билэ бу торумун ботуруулламмыт курдук бэлиэтээ",
        "markedaspatrolled": "Бэрэбиэркэлэммит курдук бэлиэтэннэ",
        "markedaspatrolledtext": "[[:$1]] ыстатыйа барыла ботуруулламмыт курдук бэлиэтэннэ.",
        "rcpatroldisabled": "Кэлиҥҥи уларытыылары бэрэбиэркэлиир бобулунна",
        "patrol-log-header": "Ботуруулламмыт торумнар сурунааллара.",
        "log-show-hide-patrol": "$1 ботурууллааһын сурунаала",
        "log-show-hide-tag": "$1 тиэк сурунаала",
+       "confirm-markpatrolled-button": "Сөп",
+       "confirm-markpatrolled-top": "$2 сирэй $3 торумун ботуруулламмыт курдук бэлиэтиигин дуо?",
        "deletedrevision": "$1 урукку торума сотулунна",
        "filedeleteerror-short": "Билэни сотор сатаммата: $1",
        "filedeleteerror-long": "Билэни сотуу кэмигэр кэккэ моһоллор таҕыстылар:\n\n$1",
        "newimages-showbots": "Руобаттар хачайдааһыннарын көрдөр",
        "newimages-hidepatrolled": "Кэтэммит хачайданыылары сабыы.",
        "noimages": "Ойуу суох.",
+       "gallery-slideshow-toggle": "Ойуучааннары уларыт",
        "ilsubmit": "Көрдөт",
        "bydate": "айыллыбыт кэминэн",
        "sp-newimages-showfrom": "Баччаттан киирбит саҥа ойуулары көрдөр: $2, $1",
        "confirmemail_body_set": "Ким эрэ (баҕар эн буолуо) маннык IP-ттан: $1\nбу аадырыһы «$2» диэн {{SITENAME}} кыттааччыта бэйэтин аадырыһын курдук эттэ.\n\nМаны бигэргэтэр буоллаххына,\nуонна {{SITENAME}} ситим-сириттэн эйиэхэ сурук кэлэрин сөбүлэһэр буоллаххына, аллара баар сигэни баттаа:\n\n$3\n\nӨскө бу аат эйиэхэ сыһыана *суох* буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат:\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
        "confirmemail_invalidated": "Электроннай почта аадырыһын бигэргэтиини суох оҥоһулунна",
        "invalidateemail": "Эл. почта бигэргэтээһинин араарга",
+       "notificationemail_subject_changed": "{{SITENAME}} эл. почтатын аадырыһа уларыйда",
+       "notificationemail_subject_removed": "{{SITENAME}} эл. почтатын аадырыһа сотулунна",
+       "notificationemail_body_changed": "Ким эрэ, $1 IP-аадрырыстан,\n{{SITENAME}} \"$2\" бэлиэ-аатын эл. почтатын аадырыһын манныкка уларытта \"$3\".\n\nӨскөтө бэйэҥ уларыппатах буоллаххына, суһаллык ситим-сир дьаһабылыгар тахса сырыт.",
+       "notificationemail_body_removed": "Ким эрэ, $1 IP-аадрырыстан,\n{{SITENAME}} \"$2\" бэлиэ-аатын эл. почтатын сотон кэбистэ.\n\nӨскөтө бэйэҥ соппотох буоллаххына, суһаллык ситим-сир дьаһабылыгар тахса сырыт.",
        "scarytranscludedisabled": "[Interwiki transcluding араҕыста]",
        "scarytranscludefailed": "[$1 халыыбы туһанар табыллыбата]",
        "scarytranscludefailed-httpstatus": "[Манна $1 анаммыт халыыбы холбуур сатаммата: HTTP $2]",
        "scarytranscludetoolong": "[URL наһаа уһун]",
        "deletedwhileediting": "'''Болҕой''': Сирэйи көннөрө олордоххуна ким эрэ сотон кэбистэ!",
-       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|ырытыыта]]) бу сирэйи эн уларыта олордоххуна сотон кэбистэ, төрүөтэ:\n: ''$2''\nБука диэн сирэйи төннөрөргүн бигэргэт.",
+       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|ырыт.]]) бу сирэйи эн уларыта олордоххуна сотон кэбиспит, төрүөтэ:\n: <em>$2</em>\nБука диэн, сирэйи хат оҥорор буоллаххына бигэргэт.",
        "confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|ырытыыта]]) бу сирэйи эн уларыта олордоххуна сотон кэбиспит. Бука диэн сирэйи кырдьык төннөрүөххүн баҕараргын бигэргэт.",
        "recreate": "Саҥаттан оҥоруу",
        "confirm_purge_button": "Сөп",
        "confirm-watch-top": "Бу сирэйи кэтээһин тиһигэр киллэрэҕин дуо?",
        "confirm-unwatch-button": "Сөп",
        "confirm-unwatch-top": "Бу сирэйи кэтээһин тиһигиттэн сотоҕун дуо?",
+       "confirm-rollback-button": "Сөп",
+       "confirm-rollback-top": "Бу сирэй уларытыыларын соттороҕун дуо?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← инники сирэй",
        "imgmultipagenext": "аныгыскы сирэй →",
        "watchlistedit-raw-done": "Саҥа испииһэк бигэргэтилиннэ.",
        "watchlistedit-raw-added": "Тиһиккэ {{PLURAL:$1|1 пуун эбилиннэ|$1 пуун эбии киирдэ}}:",
        "watchlistedit-raw-removed": "Испииһэктэн {{PLURAL:$1|1 пуун|$1 пуун}} көҕүрээтэ:",
-       "watchlistedit-clear-title": "Ð\9aÑ\8dÑ\82Ñ\8dбил Ñ\82иһигÑ\8d Ñ\8bÑ\80ааÑ\81Ñ\82анна",
+       "watchlistedit-clear-title": "Ð\9aÑ\8dÑ\82Ñ\8dбил Ñ\82иһилигин Ñ\8bÑ\80ааÑ\81Ñ\82аа",
        "watchlistedit-clear-legend": "Кэтэбил тиһигин сот",
        "watchlistedit-clear-explain": "Кэтэбилиҥ тиһигиттэн бары суруктар сотуллуохтара",
        "watchlistedit-clear-titles": "Баһа:",
        "timezone-local": "Олохтоох",
        "duplicate-defaultsort": "Болҕой: Наардааһын «$2» күлүүһэ урукку «$1» күлүүһү сабар (Ключ сортировки переопределяет прежний ключ).",
        "duplicate-displaytitle": "<strong>Болҕой:</strong> Көрдөрүллүбүт «$2» аат урут көрдөрүллүбүт «$1» ааты уларытар.",
+       "restricted-displaytitle": "<strong>Болҕой:</strong> Суруллубут «$1» диэн аат ылыныллыбатах, тоҕо диэтэххэ сирэй билиҥҥи аатыгар сөп түбэспэт.",
        "invalid-indicator-name": "<strong>Алҕас:Сирэй туругун көрдөрөр индикатор </strong> атрибута <code>name</code> кураанах буолуо суохтаах.",
        "version": "MediaWiki барыла (биэрсийэтэ)",
        "version-extensions": "Туруоруллубут расширениялар",
        "version-libraries-description": "Ойуулааһын",
        "version-libraries-authors": "Ааптар",
        "redirect": "Билэттэн, кыттааччыттан, сирэйтэн эбэтэр барыл идентификаторыттан утаарыы",
-       "redirect-summary": "Бу аналлаах сирэй билэҕэ (билэ аатыттан), сирэйгэ (барыл эбэтэр сирэй идентификааторыттан) эбэтэр кыттааччы сирэйигэр (кыттааччы идентификаторыттан) утаарар. Туһаныы: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]] эбэтэр\n[[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Бу аналлаах сирэй билэҕэ (билэ аатыттан), сирэйгэ (торум эбэтэр сирэй идентификаторыттан) эбэтэр кыттааччы сирэйигэр (кыттааччы идентификаторыттан) утаарар. Туһаныы: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]],\n[[{{#Special:Redirect}}/user/101]] эбэтэр [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Толор",
        "redirect-lookup": "Көрдөт:",
        "redirect-value": "Суолтата:",
        "tag-filter-submit": "Фильтр",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тиэк|Тиэктэр}}]]: $2)",
        "tag-mw-contentmodelchange": "Иһинээҕи киэбин уларытыы сурунаала",
+       "tag-mw-contentmodelchange-description": "Сирэй [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ис тутулун уларытар] көннөрүүлэр",
        "tags-title": "Бэлиэлэр (тиэктэр)",
        "tags-intro": "Бу сирэйгэ бырагыраамма уларытыылары бэлиэтиир анал бэлиэлэрин (тиэктэрин) тиһиктэрэ уонна ол бэлиэлэр суолталара көстөр.",
        "tags-tag": "Бэлиэ (тиэк) аата",
        "tags-actions-header": "Дьайыылар",
        "tags-active-yes": "Сөп",
        "tags-active-no": "Суох",
-       "tags-source-extension": "Ð\9aÑ\8dÒ¥Ñ\8dÑ\82ииÑ\82инÑ\8dн Ð±Ñ\8bһааÑ\80Ñ\8bллаÑ\80",
+       "tags-source-extension": "ТÑ\83һанÑ\8bллаÑ\80 Ð±Ñ\8bÑ\80агÑ\8bÑ\80аамаÑ\82Ñ\82ан Ñ\82Ñ\83Ñ\82Ñ\83лÑ\83кÑ\82ааÑ\85",
        "tags-source-manual": "Кыттааччылар уонна буоттар киллэрэллэр",
        "tags-source-none": "Аны туттуллубат",
        "tags-edit": "уларытыы",
        "tags-deactivate": "араар",
        "tags-hitcount": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "tags-manage-no-permission": "Тиэктэри уларытар кыаҕыҥ суох эбит.",
-       "tags-manage-blocked": "Хааччахтаммыт буолаҥҥын уларытыы бэлиэлэрин уларытар кыаҕыҥ суох.",
+       "tags-manage-blocked": "Хааччахтаммыт {{GENDER:$1|буолаҥҥын}} уларытыы тиэктэрин уларытар кыаҕыҥ суох.",
        "tags-create-heading": "Саҥа тиэги оҥоруу",
        "tags-create-explanation": "Саҥа оҥоһуллубут тиэктэри кыттааччылар уонна буоттар уларытар кыахтаах буолуохтара.",
        "tags-create-tag-name": "Бэлиэ аата:",
        "tags-delete-not-found": "Маннык $1 бэлиэ суох эбит.",
        "tags-delete-too-many-uses": "«$1» тиэк $2 торумтан ордукка туттуллар, ол аата сотуллар кыаҕа суох.",
        "tags-delete-warnings-after-delete": "«$1» тиэк сотулунна, ол эрээри {{PLURAL:$2|маннык сэрэтии|маннык сэрэтиилэр}} көһүннүлэр:",
+       "tags-delete-no-permission": "Тиэги уларыппыттарын көннөрөр кыаҕыҥ суох эбит.",
        "tags-activate-title": "Тиэги холбоо",
        "tags-activate-question": "\"$1\" тиэги холбоон эрэҕин.",
        "tags-activate-reason": "Төрүөтэ:",
        "tags-deactivate-not-allowed": "\"$1\" тиэги араарар табыллыбат.",
        "tags-deactivate-submit": "араар",
        "tags-apply-no-permission": "Бэйэҥ уларытыыгар уларытыы тиэгин туруорар кыаҕыҥ суох эбит.",
-       "tags-apply-blocked": "Хатана сылдьар кэмҥитигэр көннөрүүлэргитигэр уларытыы бэлиэлэрин туттаргыт табыллыбат.",
+       "tags-apply-blocked": "Хааччахтана сылдьар {{GENDER:$1|кэмҥэр}} көннөрүүлэриҥ тиэгин уларытарыҥ табыллыбат.",
        "tags-apply-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
        "tags-apply-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
        "tags-update-no-permission": "Сурунаал тус-туспа торумнарын уонна суруктарын тиэгин эбэр уонна уларытар кыаҕыҥ суох эбит.",
-       "tags-update-blocked": "Хааччахтаммыт буолаҥҥыт уларытыы бэлиэлэрин уларытар кыаҕыҥ суох.",
+       "tags-update-blocked": "Хааччахтаммыт {{GENDER:$1|буолаҥҥын}} уларытыы тиэктэрин уларытар кыаҕыҥ суох.",
        "tags-update-add-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
        "tags-update-add-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
        "tags-update-remove-not-allowed-one": "«$1» тиэги сотор табыллыбат эбит.",
        "tags-edit-revision-legend": "{{PLURAL:$1|Бу торумҥа|Бары $1 торумҥа}} тиэги угуу эбэтэр онтон сотуу",
        "tags-edit-logentry-legend": "Сурунаал {{PLURAL:$1|суругуттан|$1 бары суруктарыттан}} тиэги сот биитэр онно киллэр",
        "tags-edit-existing-tags": "Баар тиэктэр:",
-       "tags-edit-existing-tags-none": "''Суох''",
+       "tags-edit-existing-tags-none": "<em>Суох</em>",
        "tags-edit-new-tags": "Саҥа тиэктэр:",
        "tags-edit-add": "Бу тиэктэри эп:",
        "tags-edit-remove": "Бу тиэктэри сот:",
        "tags-edit-reason": "Төрүөтэ:",
        "tags-edit-revision-submit": "Уларытыылары бу {{PLURAL:$1|торумҥа|$1 торумнарга}} тарҕат",
        "tags-edit-logentry-submit": "Уларытыылары сурунаал бу {{PLURAL:$1|суругар|$1 суруктарыгар}} тарҕат",
-       "tags-edit-success": "Уларытыы сөпкө бигэргэннэ.",
+       "tags-edit-success": "Уларытыы бигэргэннэ.",
        "tags-edit-failure": "Уларытыылары туттар табыллыбата.\n$1",
        "tags-edit-nooldid-title": "Торум чопчу ыйыллыбата",
        "tags-edit-nooldid-text": "Ханнык торумҥа туттулларын талбатаххын, биитэр талбыт торумуҥ суох эбит.",
        "htmlform-cloner-create": "Өссө эп",
        "htmlform-cloner-delete": "Сот",
        "htmlform-cloner-required": "Саатар биирин толоруохтаах эбиккин.",
+       "htmlform-date-placeholder": "СССС-ЫЫ-КК",
+       "htmlform-time-placeholder": "ЧЧ:ММ:СС",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "Суруйбутуҥ күнү-дьылы бэлиэтээһиҥҥэ майгыннаабат. Маннык көрүҥү туһан: СССС-ЫЫ-КК.",
+       "htmlform-time-invalid": "Суруйбутуҥ кэми бэлиэтээһиҥҥэ майгыннаабат. Маннык көрүҥү туһан: ЧЧ-ММ-СС.",
+       "htmlform-datetime-invalid": "Суруйбутуҥ күнү-дьылы уонна кэми бэлиэтээһиҥҥэ майгыннаабат. Маннык көрүҥү туһан: СССС-ЫЫ-КК ЧЧ-ММ-СС.",
+       "htmlform-date-toolow": "Ыйбыт кэмиҥ муҥутуур кылгас кэмтэн кылгас эбит — $1.",
+       "htmlform-date-toohigh": "Ыйбыт кэмиҥ муҥутуур болдьохтон хойут эбит — $1.",
+       "htmlform-time-toolow": "Ыйбыт кэмиҥ болдьохтон кылгас — $1.",
+       "htmlform-time-toohigh": "Ыйбыт кэмиҥ болдьохтон уһун — $1.",
+       "htmlform-datetime-toolow": "Ыйбыт кэмиҥ анаммыт ыйтан-күнтэн уонна кэмтэн эрдэ буолан хаалбыт — $1.",
+       "htmlform-datetime-toohigh": "Ыйбыт кэмиҥ анаммыт күнтэн-дьылтан уонна кэмтэн хойут буолан хаалбыт — $1.",
        "htmlform-title-badnamespace": "[[:$1]] бу аат далыгар киирбэт эбит «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» оҥоһуллар сирэй аата буолбатах",
        "htmlform-title-not-exists": "$1 суох.",
        "htmlform-user-not-exists": "<strong>$1</strong> суох.",
        "htmlform-user-not-valid": "<strong>$1</strong> — маннык аат сатаммат.",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
+       "logentry-delete-delete_redir": "$1 кыттааччы $3 утаарыыны хос суруйуу көмөтүнэн {{GENDER:$2|соппут}}",
        "logentry-delete-restore": "$3 сирэйи $1 сөргүппүт",
        "logentry-delete-event": "Сурунаал $5 суругун көстүүтүн манна $3 $1 уларыппыт: $4",
        "logentry-delete-revision": "$3 сирэй $5 барылын көстүүтүн бу сирэйгэ $1 уларыппыт: $4",
        "logentry-suppress-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччаҕын суох гыммыт}}",
        "logentry-suppress-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
        "logentry-import-upload": "$1 {{GENDER:$2|киллэрбит}} $3 билэни хачайдыыр ньыманнан",
+       "logentry-import-upload-details": "$1 билэ хачайдааһынынын көмөтүнэн $3 ($4 {{PLURAL:$4|торумун}}) {{GENDER:$2|иһирдьэ киллэрдэ}}",
        "logentry-import-interwiki": "$1 {{GENDER:$2|киллэрбит}} $3 атын биикиттэн",
+       "logentry-import-interwiki-details": "$1 кыттааччы $3 $5 торумуттан ($4 {{PLURAL:$4|торумун}}) {{GENDER:$2|иһирдьэ киллэрдэ}}",
        "logentry-merge-merge": "$1 {{GENDER:$2|холбообут}} мантан $3 манна $4 ($5 диэри торумнара)",
        "logentry-move-move": "$1 $3 сирэй аатын маннык $4 уларыппыт",
        "logentry-move-move-noredirect": "$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|көмүскээбит}} $3 $4 [каскаадынан]",
        "logentry-protect-modify": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын (каскаадынан)",
-       "logentry-rights-rights": "$3 бөлөхтөргө киириитин $1 уларыппыт: манныктан $4 манныкка $5",
+       "logentry-rights-rights": "$3 бөлөхтөргө киириитин $1 {{GENDER:$2|уларыппыт}}: мантан $4 манныкка $5",
        "logentry-rights-rights-legacy": "$3 бөлөхтөргө киириитин $1 уларыппыт",
        "logentry-rights-autopromote": "$1 мантан $4 манна $5 көһөрүллүбүт",
        "logentry-upload-upload": "$1 {{GENDER:$2|укпут}} $3",
        "logentry-managetags-deactivate": "$1 \"$4\" тиэги кыттааччылар уонна буоттар туһамматтарын курдук {{GENDER:$2|гыммыт}}",
        "log-name-tag": "Тиэк сурунаала",
        "log-description-tag": "Бу сирэй кыттааччылар [[Special:Tags|тиэктэри]] хаһан эппиттэрин биитэр соппуттарын көрдөрөр. Тиэги атын уларытыы, сотуу <strong>иһинэн</strong> оҥордоххо манна көстүбэт.",
+       "logentry-tag-update-add-revision": "$6 {{PLURAL:$7|тиэги}} $3 сирэй $4 торумугар $1 {{GENDER:$2|эппит}}",
+       "logentry-tag-update-add-logentry": "$6 {{PLURAL:$7|тиэги}} $5 сурунаал $3 сирэйигэр $6  торумугар $1 {{GENDER:$2|эппит}}",
+       "logentry-tag-update-remove-revision": "$1 $3 сирэй $4 торумуттан $8 {{PLURAL:$9|тиэги}} {{GENDER:$2|соппут}}",
+       "logentry-tag-update-remove-logentry": "$1  $8 {{PLURAL:$9|тиэги}} $5 сурунаал $3 сирэйиттэн {{GENDER:$2|соппут}}",
+       "logentry-tag-update-revision": "$1 кыттааччы $4 сирэй $3 торумун {{GENDER:$2|саҥардан биэрдэ}} ($6 {{PLURAL:$7|эбилиннэ}}; $8 {{PLURAL:$9|сотулунна}})",
+       "logentry-tag-update-logentry": "$1 кыттааччы $3 сирэй $5 сурунаалын {{GENDER:$2|саҥардан биэрдэ}} ($6 {{PLURAL:$7|эбилиннэ}}; $8 {{PLURAL:$9|сотулунна}})",
        "rightsnone": "(суох)",
        "revdelete-summary": "уларытыылар туһунан",
        "feedback-adding": "Сирэй туһунан санаа этии...",
        "feedback-useragent": "Браузерым:",
        "searchsuggest-search": "{{SITENAME}} иһигэр көрдөөһүн",
        "searchsuggest-containing": "тыл баар ыстатыйалара...",
-       "api-error-badaccess-groups": "Эн бу биикигэ билэ киллэрэриҥ хааччахтаммыт.",
        "api-error-badtoken": "Ис алҕас: Омсолоох токен.",
-       "api-error-copyuploaddisabled": "URL көмөтүнэн киллэрии бу сиэрбэргэ араарыллыбыт.",
-       "api-error-duplicate": "Маннык иһинээҕилээх {{PLURAL:$1|атын билэ баар эбит}}",
-       "api-error-duplicate-archive": "Урут ситим-сиргэ маннык иһинээҕилээх {{PLURAL:$1|билэ баар|билэлэр бааллар}} этэ, ол гынан баран {{PLURAL:$1|сотуллубута|сотуллубуттара}}.",
-       "api-error-empty-file": "Ыыппыт билэҥ кураанах.",
        "api-error-emptypage": "Саҥа кураанах сирэйи оҥорор табыллыбат.",
-       "api-error-fetchfileerror": "Ис алҕас: билэни ыларга туох эрэ сатаммата.",
-       "api-error-fileexists-forbidden": "Маннык \"$1\" ааттаах билэ хайыы үйэ баар уонна хат суруллар кыаҕа суох эбит.",
-       "api-error-fileexists-shared-forbidden": "«$1» диэн ааттаах билэ уопсай харайар сиргэ баар уонна хат суруллар кыаҕа суох эбит.",
-       "api-error-file-too-large": "Ыыппыт билэҥ наһаа улахан эбит.",
-       "api-error-filename-tooshort": "Билэҥ аата наһаа кылгас.",
-       "api-error-filetype-banned": "Маннык көрүҥнээх билэлэр бобуулаахтар.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|билэ бобуллубут көрүҥэ|билэ бобуллубут көрүҥнэрэ}}. \nКөҥүллэммит билэ {{PLURAL:$3|көрүҥэ маннык|көрүҥнэрэ манныктар}}: $2.",
-       "api-error-filetype-missing": "Бу билэ тэнитиитэ (расширение) суох эбит.",
-       "api-error-hookaborted": "Эн киллэрбит уларытыыгын кэҥэтии таҥастааччыта оннугар төннөрбүт.",
-       "api-error-http": "Ис алҕас: Сиэрбэргэ холбонор табыллыбата.",
-       "api-error-illegal-filename": "Билэ маннык ааттанара сатаммат.",
-       "api-error-internal-error": "Ис алҕас: биикигэ угаары гыммыккар туох эрэ сатаммата.",
-       "api-error-invalid-file-key": "Ис алҕас: Быстах уурар сиргэ билэ көстүбэтэ.",
-       "api-error-missingparam": "Ис алҕас: Көрдөбүл туруоруулара суохтар эбит.",
-       "api-error-missingresult": "Ис алҕас: Хатылааһын сатаммыта-сатамматаҕа биллибэтэ.",
-       "api-error-mustbeloggedin": "Билэни киллэрэргэ бастаан ааккын этиэхтээххин.",
-       "api-error-mustbeposted": "Ис алҕас: HTTP POST алҕастаах.",
-       "api-error-noimageinfo": "Хачайдааһын сөпкө түмүктэннэ эрээри, сиэрбэр билэ туһунан тугу да биллэрбэтэ.",
-       "api-error-nomodule": "Ис алҕас: хачайдыыр муодул туруоруута суох.",
-       "api-error-ok-but-empty": "Ис алҕас: сиэрбэртэн хоруй кэлбэтэ.",
-       "api-error-overwrite": "Баар билэни уларытар сатаммат.",
-       "api-error-stashfailed": "Ис алҕас: сиэрбэр быстах кэмҥэ оҥоһуллубут билэни кыайан бигэргэппэтэх.",
        "api-error-publishfailed": "Ис алҕас: сиэрбэр быстах билэни кыайан бигэргэппэтэх.",
-       "api-error-stasherror": "Билэни угарга алҕас таҕыста.",
-       "api-error-stashedfilenotfound": "Хачайданыахтаах билэ быстах уурар сиргэ көстүбэтэ.",
-       "api-error-stashpathinvalid": "Билэ сытыахтаах быстах уурар сирин суола алҕастаах.",
-       "api-error-stashfilestorage": "Билэни быстах угар сиргэ угарга алҕас таҕыста.",
-       "api-error-stashzerolength": "Сиэрбэр билэни быстах угар сиргэ харайар кыаҕа суох, тоҕо диэтэххэ уһуна нуул.",
-       "api-error-stashnotloggedin": "Билэни быстах сиргэ харайарга бастаан ааккынан киириэхтээххин.",
-       "api-error-stashwrongowner": "Арыйа сатаабыт билэҥ эйиэнэ буолбатах эбит.",
-       "api-error-stashnosuchfilekey": "Быстах уурар сиргэ сытар билэҕэ киирэ сатаабыт күлүүһүҥ суох эбит.",
-       "api-error-timeout": "Сиэрбэр кэтэһэр кэмҥэ хоруйдаабата.",
-       "api-error-unclassified": "Биллибэт алҕас таҕыста",
-       "api-error-unknown-code": "Биллибэт алҕас: «$1»",
-       "api-error-unknown-error": "Ис алҕас: билэни киллэрии кэмигэр туох эрэ сатаммата.",
+       "api-error-stashfailed": "Ис алҕас: сиэрбэр быстах кэмҥэ оҥоһуллубут билэни кыайан бигэргэппэтэх.",
        "api-error-unknown-warning": "Биллибэт сэрэтии: $1",
        "api-error-unknownerror": "Биллибэт алҕас: $1",
-       "api-error-uploaddisabled": "Бу биикигэ хачайдыыр араарыллыбыт эбит.",
-       "api-error-verification-error": "Бу билэ алдьаммыт эбэтэр табыгаһа суох кэҥэтиилээх.",
        "duration-seconds": "$1 сөкүүндэ",
        "duration-minutes": "$1 мүнүүтэ",
        "duration-hours": "$1 чаас",
        "expand_templates_generate_rawhtml": "HTML-ы көрдөр",
        "expand_templates_preview": "Холоон көрүү",
        "expand_templates_preview_fail_html": "<em>raw HTML холбоно сылдьар {{SITENAME}} ситим-сир сиэссийэтин сүтэрэн кэбиспит буолан, эрдэ көрүү сатаммат, бу JavaScript-атаакаттан көмүскэнэр ньыма.</em>\n\n<strong>Эрдэ көрөрүҥ буортуну аҕалбат буоллаҕына хатылаан көр.</strong>\nСин биир сатамматаҕына [[Special:UserLogout|үлэҕин түмүктээ]] уонна хат киирэн көр.",
+       "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} ситим-сиргэ «сиикэй» HTML холбоммут буолан уонна эн ааккын эппэтэх буолаҥҥын эрдэ көрүү сатаммат, бу JavaScript-атаакаттан көмүскэнии.</em>\n\n<strong>Өскөтүн туох да куһаҕаны оҥоруоххун баҕарбат буоллаххына, [[Special:UserLogin|киир]] уонна хатылаа.",
        "expand_templates_input_missing": "Эһиги ханнык эмит тиэкиһи туруор.",
-       "pagelanguage": "СиÑ\80Ñ\8dй Ñ\82Ñ\8bлÑ\8bн Ñ\82алыы",
+       "pagelanguage": "СиÑ\80Ñ\8dй Ñ\82Ñ\8bлÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82ыы",
        "pagelang-name": "Сирэй",
        "pagelang-language": "Омугун тыла",
        "pagelang-use-default": "Сүрүн тылы тутун",
        "action-pagelang": "сирэй тылын уларытар буол",
        "log-name-pagelang": "Тылы уларытыы сурунаала",
        "log-description-pagelang": "Сирэй тылын талыы сурунаала.",
-       "logentry-pagelang-pagelang": "$1 кыттааччы $3 сирэй тылын мантан $4 манныкка $5 {{GENDER:$2|уларыппыт}}.",
+       "logentry-pagelang-pagelang": "$1 кыттааччы $3 тылы мантан $4 манныкка $5 {{GENDER:$2|уларыппыт}}.",
+       "default-skin-not-found": "Ок-сиэ! Эн биикигэр талбатахха турар тиэмэ <code>$wgDefaultSkin</code>, <code>$1</code> сатаан турбат эбит.\n\nТуруорууҥ, арааһа {{PLURAL:$4|маннык тиэмэлээх|маннык тиэмэлэрдээх}}. Маны көр [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration], итиннэ {{PLURAL:$4|кинини|кинилэри}} хайдах туруорар туһунан суруллар.\n\n$2\n\n; Өскөтө MediaWiki-ни саҥа туруоруммут буоллаххына:\n: Баҕар, Git көмөтүнэн биитэр төрүт куод көмөтүнэн туруорбут буолуоххун сөп. Оччоҕо маннык буолуон сөп. Бу түгэҥҥэ сорох тиэмэлэри мантан туруорунан көр: [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org тимэтин каталога]:\n:* хас да тиэмэлээх [https://www.mediawiki.org/wiki/Download туруорунар билэ архыыбын] хачайдаан ылан баран; бу паапканы куопуйалыахха сөп <code>skins/</code>;\n:* биирдиилээн тиэмэ архыыбын мантан хачайдыахха сөп [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins тиэмэ хачайдыыр Git туһаныаххын сөп].\n: MediaWiki-гэ быһаарсар буоллаххына эн Git репозиторийгын бу буортулуо суохтаах. Тиэмэни холбуур уонна этиллибэтэҕинэ турар тиэмэни талар туһунан манна көр [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration].\n; Өскөтө MediaWiki-ни саҥа саҥардыбыт буоллаххына:\n: MediaWiki 1.24 торума уонна онтон үөһээҥҥилэрэ аны угуллубут тиэмэлэрэ суох (көр. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nБу {{PLURAL:$5|устуруоканы|устуорукалары}} бу иһигэр <code>LocalSettings.php</code> угуоххун сөп, оччоҕо туруорбут {{PLURAL:$5|тиэмэҥ|бары тиэмэҥ}} холбонуо: \n\n<pre dir=\"ltr\">$3</pre>\n\n; Өскөтө <code>LocalSettings.php</code> саҥа улурыппыт буоллаххына:\n: Тиэмэлэр ааттарын тургутан көр, баҕар алҕастааҕа буолуо.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (холбоммут)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>арахсыбыт</strong>)",
        "mediastatistics": "Миэдьийэ ыстатыыстыката",
        "mediastatistics-summary": "Киирбит билэ көрүҥүн ыстатыыстыката. Билэ тиһэх эрэ торумун көрдөрөр. Урукку уонна сотуллубут билэлэр ааҕыллыбаттар.",
        "mediastatistics-nbytes": "$1 баайт ($2; $3%)",
+       "mediastatistics-bytespertype": "Бу салаа билэтин бүттүүнүн кээмэйэ: $1 {{PLURAL:$1|баайт}} ($2; $3%).",
+       "mediastatistics-allbytes": "Билэлэр барыларын кээмэйэ: $1 {{PLURAL:$1|баайт}} ($2).",
        "mediastatistics-table-mimetype": "MIME көрүҥэ",
        "mediastatistics-table-extensions": "Туһаныллыан сөптөөх кэҥэтиилэр",
        "mediastatistics-table-count": "Билэ ахсаана",
        "special-characters-group-ipa": "МФА (IPA)",
        "special-characters-group-symbols": "Бэлиэлэр",
        "special-characters-group-greek": "Гириэктии",
+       "special-characters-group-greekextended": "Кэҥэтиллибит гириэк",
        "special-characters-group-cyrillic": "Кириллица",
        "special-characters-group-arabic": "Араабтыы",
        "special-characters-group-arabicextended": "Араабтыы кэҥэтиллибит",
        "special-characters-title-emdash": "уһун тире",
        "special-characters-title-minus": "минус бэлиэтэ",
        "mw-widgets-dateinput-no-date": "Күнэ-дьыла ыйыллыбатах",
+       "mw-widgets-mediasearch-input-placeholder": "Миэдьийэ билэлэри көрдөөһүн",
+       "mw-widgets-mediasearch-noresults": "Туох да көстүбэтэ.",
        "mw-widgets-titleinput-description-new-page": "сирэй суох эбит",
        "mw-widgets-titleinput-description-redirect": "манна $1 утаарыы",
-       "randomrootpage": "Түбэһиэх төрүт сирэй."
+       "mw-widgets-categoryselector-add-category-placeholder": "Категория эбии...",
+       "sessionmanager-tie": "Тургутуу хас да көрүҥүн биирдэ туһанар сатаммат: $1.",
+       "sessionprovider-generic": "$1 сиэссийэ",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "куукаҕа олоҕурбут сиэссийэ",
+       "sessionprovider-nocookies": "Куука арахсыбыт буолуон сөп. оннук түгэҥҥэ холбоон баран хатылаа.",
+       "randomrootpage": "Түбэһиэх төрүт сирэй.",
+       "log-action-filter-block": "Хааччах көрүҥэ:",
+       "log-action-filter-contentmodel": "Contentmodel көрүҥэ:",
+       "log-action-filter-delete": "Сотуу көрүҥэ:",
+       "log-action-filter-import": "Киллэрии көрүҥэ:",
+       "log-action-filter-managetags": "Салайар тиэк көрүҥэ:",
+       "log-action-filter-move": "Аатын солбуйуу көрүҥэ:",
+       "log-action-filter-newusers": "Бэлиэ ааты оҥоруу көрүҥэ:",
+       "log-action-filter-patrol": "Ботуруул көрүҥэ:",
+       "log-action-filter-protect": "Көмүскэл көрүҥэ:",
+       "log-action-filter-rights": "Быраабы уларытыы көрүҥэ:",
+       "log-action-filter-suppress": "Кистээһин көрүҥэ:",
+       "log-action-filter-upload": "Хачайдааһын көрүҥэ:",
+       "log-action-filter-all": "Бары",
+       "log-action-filter-block-block": "Бобуу",
+       "log-action-filter-block-reblock": "Бобууну уларытыы",
+       "log-action-filter-block-unblock": "Бобууну суох гыныы",
+       "log-action-filter-contentmodel-change": "Иһинээҕитин мадьыалын уларытыы",
+       "log-action-filter-contentmodel-new": "Contentmodel диэн мадьыалынан сирэйи айыы",
+       "log-action-filter-delete-delete": "Сирэйи сотуу",
+       "log-action-filter-delete-delete_redir": "Утаарыыны хат суруйуу",
+       "log-action-filter-delete-restore": "Сирэйи сөргүтүү",
+       "log-action-filter-delete-event": "Сурунаалы сотуу",
+       "log-action-filter-delete-revision": "Торуму сотуу",
+       "log-action-filter-import-interwiki": "Трансвики импорт",
+       "log-action-filter-import-upload": "XML-ынан киллэрии",
+       "log-action-filter-managetags-create": "Тиэктэри оҥоруу",
+       "log-action-filter-managetags-delete": "Тиэги сотуу",
+       "log-action-filter-managetags-activate": "Тиээги холбооһун",
+       "log-action-filter-managetags-deactivate": "Тиэги араарыы",
+       "log-action-filter-move-move": "Утаарыыны хас суруйбакка салгыы барыы",
+       "log-action-filter-move-move_redir": "Утаарыыны солбуйан сыҕарытыы",
+       "log-action-filter-newusers-create": "Аатын эппэтэх кыттааччы оҥоруута",
+       "log-action-filter-newusers-create2": "Бэлиэтэммит кыттааччы оҥоруута",
+       "log-action-filter-newusers-autocreate": "Аптамаатынан оҥоруу",
+       "log-action-filter-newusers-byemail": "Почтанан кэлбит аһарыгы туһанан оҥоруу",
+       "log-action-filter-patrol-patrol": "Киһи ботурууллааһына",
+       "log-action-filter-patrol-autopatrol": "Аптамаат ботурууллааһына",
+       "log-action-filter-protect-protect": "Көмүскэл",
+       "log-action-filter-protect-modify": "Көмүскэли уларытыы",
+       "log-action-filter-protect-unprotect": "Көмүскэли суох гыныы",
+       "log-action-filter-protect-move_prot": "Көмүскэли көһөрүү",
+       "log-action-filter-rights-rights": "Киһи уларытыыта",
+       "log-action-filter-rights-autopromote": "Аптамаат уларытыыта",
+       "log-action-filter-suppress-event": "Сурунаалы кистээһин",
+       "log-action-filter-suppress-revision": "Торуму кистээһин",
+       "log-action-filter-suppress-delete": "Сирэйи кистээһин",
+       "log-action-filter-suppress-block": "Кыттааччыны бобуу көмөтүнэн кистээһин",
+       "log-action-filter-suppress-reblock": "Кыттааччыны хос бобуу көмөтүнэн кистээһин",
+       "log-action-filter-upload-upload": "Саҥа хачайдаан киллэрии",
+       "log-action-filter-upload-overwrite": "Хат ыытыы",
+       "authmanager-authn-not-in-progress": "Дьиҥнээҕин тургутуу оҥоһуллубат эбит, биитэр сиэссийэ быстан хаалбыт.\nБука диэн, саҥаттан тургутан көр.",
+       "authmanager-authn-no-primary": "Бэлиэ аат дьиҥнээҕэ тургутуллар кыаҕа суох эбит.",
+       "authmanager-authn-no-local-user": "Маннык бэлиэ аат бу биики ханнык да кыттааччытын кытта сөп түбэспэтэ.",
+       "authmanager-authn-no-local-user-link": "Эппит сибидиэнньэҥ ирдэбилгэ сөп түбэһэр гынан баран биир да кыттааччыны кытта ситимэ суох эбит. Атыннык киирэн баран урукку бэлиэ ааккын кытта ситимнээ.",
+       "authmanager-authn-autocreate-failed": "Олохтоох бэлиэ ааты аптамаат сатаан оҥорбото: $1",
+       "authmanager-change-not-supported": "Бэлиэ аат сибидиэнньэтэ уларыйар кыаҕа суох, тоҕо диэтэххэ туһаныллыбат.",
+       "authmanager-create-disabled": "Бэлиэтэнии арахсан турар.",
+       "authmanager-create-from-login": "Бэлиэтэнэргэ аллараа хонуулары толор дуу.",
+       "authmanager-create-not-in-progress": "Бэлиэтэнии сатаммата эбэтэр сиэссийэ быстан хаалла. Саҥаттан хатылаан көр.",
+       "authmanager-create-no-primary": "Эппит сибидиэнньэҕин туһанан бэлиэтэнэр сатаммат эбит.",
+       "authmanager-link-no-primary": "Эппит сибидиэнньэҕин туһанан бэлиэ ааттары холбуур сатаммат эбит.",
+       "authmanager-link-not-in-progress": "Бэлиэ ааттары холбуур сатаммата эбэтэр сиэссийэ быстан хаалла. Саҥаттан хатылаан көр.",
+       "authmanager-authplugin-setpass-failed-title": "Аһарыгы уларытар табыллыбата",
+       "authmanager-authplugin-setpass-failed-message": "Аутентификация былаҕыына аһарыгы уларытары бобор.",
+       "authmanager-authplugin-create-fail": "Аутентификация былаҕыына бэлиэтэнэри бобор.",
+       "authmanager-authplugin-setpass-denied": "Аутентификация былаҕыына аһарыгы уларытары бобор.",
+       "authmanager-authplugin-setpass-bad-domain": "Алҕастаах домен.",
+       "authmanager-autocreate-noperm": "Аптамаатынан бэлиэтэнии көҥүллэммэт.",
+       "authmanager-autocreate-exception": "Аптамаатынан бэлиэтэнии урут тахсыбыт алҕастартан сылтаан араарыллыбыт.",
+       "authmanager-userdoesnotexist": "Маннык аат «$1» суох.",
+       "authmanager-userlogin-remembermypassword-help": "Аһарык сиэссийэ түмүктэммитин кэннэ долоҕойго хаалар дуо.",
+       "authmanager-username-help": "Кыттааччы аата тургутарга.",
+       "authmanager-password-help": "Аһарык тургутарга",
+       "authmanager-domain-help": "Тастан тургутар дамыан.",
+       "authmanager-retype-help": "Аһарыгы хос суруй.",
+       "authmanager-email-label": "Э-почта",
+       "authmanager-email-help": "Эл. аадырыһа",
+       "authmanager-realname-label": "Дьиҥнээх аатыҥ",
+       "authmanager-realname-help": "Кыттааччы сурукка киирбит аата",
+       "authmanager-provider-password": "Аһарык көмөтүнэн киирии",
+       "authmanager-provider-password-domain": "Дамыан уонна аһарык көмөтүнэн киирии",
+       "authmanager-provider-temporarypassword": "Быстах аһарык",
+       "authprovider-confirmlink-message": "Урут киирэ сылдьыбыт бэлиэ-ааттаргын кытта ситимниэххэ сөп. Оччоҕо ол аатынан эмиэ киириэххин сөп буолуоҕа. Ханнык бэлиэ-ааттары ситимнииргин тал дуу.",
+       "authprovider-confirmlink-request-label": "Ситимнэнэр бэлиэ-ааттар",
+       "authprovider-confirmlink-success-line": "$1: ситимнэннэ.",
+       "authprovider-confirmlink-failed": "Сороҕун эрэ ситимниир сатанна: $1",
+       "authprovider-resetpass-skip-label": "Аһар",
+       "authprovider-resetpass-skip-help": "Аһарыгы хос ыытыыны көтүт.",
+       "authform-nosession-login": "Этэҥҥэ киирдиҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
+       "authform-nosession-signup": "Этэҥҥэ бэлиэтэнниҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
+       "specialpage-securitylevel-not-allowed-title": "Көҥүллэммэт",
+       "specialpage-securitylevel-not-allowed": "Бу сирэйи туһанар кыаҕыҥ суох эбит, тоҕо диэтэххэ бу чахчы Эн буоларгын тургутар кыахпыт суох.",
+       "authpage-cannot-login": "Киириини салгыыр кыах суох.",
+       "authpage-cannot-login-continue": "Киириини салгыыр кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
+       "authpage-cannot-create": "Бэлиэтэнэр сатаммата.",
+       "authpage-cannot-create-continue": "Бэлиэтэнэр кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
+       "authpage-cannot-link": "Бэлиэ-ааттары ситимниир сатаммата.",
+       "authpage-cannot-link-continue": "Ситимниир кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
+       "cannotauth-not-allowed-title": "Киирэр көҥүллэммэт",
+       "cannotauth-not-allowed": "Бу сирэйи туһанарыҥ сатаммат эбит",
+       "credentialsform-account": "Бэлиэ-аат:",
+       "cannotlink-no-provider-title": "Бэлиэ-ааттар суохтар",
+       "cannotlink-no-provider": "Бэлиэ-ааттар суохтар.",
+       "linkaccounts": "Бэлиэ-ааттары ситимнииргэ",
+       "linkaccounts-success-text": "Бэлиэ-аат ситимнэннэ.",
+       "linkaccounts-submit": "Ситимнииргэ",
+       "unlinkaccounts": "Ситими быһарга",
+       "unlinkaccounts-success": "Бэлиэ-аат ситимэ быһынна."
 }
index f711abd..737fc46 100644 (file)
@@ -12,7 +12,8 @@
                        "Samar88",
                        "Srabony90",
                        "아라",
-                       "Shirayuki"
+                       "Shirayuki",
+                       "MtDu"
                ]
        },
        "tog-underline": "Joṛaoko latarre dag udugoḱma:",
        "navigation-heading": "Ạcurbaṛa minu",
        "errorpagetitle": "vul",
        "returnto": "$1 te ruar-rok' me",
-       "tagline": "Oka khoć",
+       "tagline": "Oka khoć {{SITENAME}}",
        "help": "Go̠ṛo̠",
        "search": "Se̠ndra",
        "searchbutton": "Se̠ndra",
        "pool-timeout": "Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana",
        "pool-queuefull": "Pul reaḱ sakam perećena",
        "pool-errorunknown": "Bań baḍayaḱ bhul",
-       "aboutsite": "babo̠tre",
+       "aboutsite": "babo̠tre {{SITENAME}}",
        "aboutpage": "Project: Babo̠t",
        "copyright": "$1 re bhitrire ńamoḱa.",
        "copyrightpage": "{{ns:project}}: Eḱteạr",
        "passwordreset-disabled": "Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.",
        "passwordreset-username": "Beoharicaḱ ńutum:",
        "passwordreset-domain": "Ḍomen:",
-       "passwordreset-capture": "Sendra fol reaḱ e-mail ńelmẽ?",
-       "passwordreset-capture-help": "Am do judi noa jacạy baksom lin lekhan, tobe nit lạgit́te em akan uku nambar são mit́ṭen e-mail ame uduḱama ar ona sãote beoharić ṭhen ona kuluḱa.",
        "passwordreset-email": "E-mail ṭhikạna:",
        "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko",
        "passwordreset-emailelement": "Beoharićaḱ ńutum: \n$1\n\nMit́ ghạṛi lạgit uku nambar: \n$2",
index 807dbfc..d74cacf 100644 (file)
        "passwordreset-emaildisabled": "Li funziunalità di e-mail foru disattivati nta sta wiki.",
        "passwordreset-username": "Nomu utenti:",
        "passwordreset-domain": "Duminiu:",
-       "passwordreset-capture": "Ammustrari lu missaggiu e-mail chi veni cumpostu?",
-       "passwordreset-capture-help": "Si attivi sta casedda, lu missaggiu e-mail (câ password timpurània) veni ammustratu a tìa sparti chi veni mannatu a l'utenti.",
        "passwordreset-email": "Nnirizzu di posta elittrònica:",
        "passwordreset-emailtitle": "Dittagghî dû cuntu supra a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quarchidunu (prubbabbilmenti tu, dô nnirizzu IP $1) fici n'addumannata pi l'azziramentu dâ tò password pi {{SITENAME}} ($4). {{PLURAL:$3|Lu cuntu utenti siguenti è assuciatu|Li cunti utenti siguenti sù assuciati}} cu stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurània|Sti password timpurànii}} scàdinu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a tràsiri e scègghiri na password nova. Si fu quarchidun'àutru a fari st'addumannata e nun tu, o si t'arricurdasti la tò password origginali e nun la voi canciari cchiù, poi gnurari stu missaggiu e cuntinuari a adupirari la tò password vecchia.",
        "saveprefs": "Sarva",
        "restoreprefs": "Riprìstina tutti li mpustazzioni pridifinuti (nta tutti li sizzioni)",
        "prefs-editing": "Canciamentu",
-       "rows": "Righi:",
-       "columns": "Culonni:",
        "searchresultshead": "Arricerca",
        "stub-threshold": "Sogghia pi furmattari nu liami comu bozza ($1):",
        "stub-threshold-sample-link": "esempiu",
        "userrights-reason": "Mutivu:",
        "userrights-no-interwiki": "Nun hai lu pirmissu di canciari li dritti di l'utenti nta l'àutri wiki.",
        "userrights-nodatabase": "La basi di dati $1 nun esisti o nun è lucali.",
-       "userrights-nologin": "Hai a [[Special:UserLogin|tràsiri]] cûn cuntu d'amministraturi pi putiri assignari li dritti di l'utenti.",
-       "userrights-notallowed": "Nun hai lu pirmissu di agghiùnciri o livari dritti a l'utenti.",
        "userrights-changeable-col": "Gruppi chi si ponnu canciari",
        "userrights-unchangeable-col": "Gruppi chi nun si ponnu canciari",
        "userrights-conflict": "Cunflittu di canciamentu dî dritti di l'utenti! Pi favuri cuntrolla e cunferma li tò canciamenti.",
-       "userrights-removed-self": "Arriniscisti a livàriti li tò stissi dritti. Pi chistu, nun hai cchiù l'accessu a sta pàggina.",
        "group": "Gruppu:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti autu-cunfirmati",
        "right-siteadmin": "Bluccari e sbluccari la basi di dati",
        "right-override-export-depth": "Espurtari pàggini cu li pàggini culligati nfina ô quintu liveddu",
        "right-sendemail": "Mannari missaggi di posta elittrònica a l'àutri utenti",
-       "right-passwordreset": "Taliari li missaggi di posta elittrònica d'azziramentu dî password",
        "right-managechangetags": "Criari e cancillari [[Special:Tags|etichetti]] dâ basi di dati",
        "right-applychangetags": "Appizzari [[Special:Tags|etichetti]] ntê propî canciamenti",
        "right-changetags": "Agghiùnciri e livari a piaciri [[Special:Tags|etichetti]] dî virsioni e dî vuci di riggistru",
        "uploaded-setting-handler-svg": "Lu còdici SVG ca mposta l'attribbutu \"handler\" a na distinazzioni rimota/data/script veni bluccatu. Fu attruvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
        "uploaded-remote-url-svg": "Lu còdici SVG ca mposta n'attribbutu style qualegghiè versu di n'URL rimota veni bluccatu. Fu attruvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
        "uploaded-image-filter-svg": "Fu attruvatu nu filtru di mmàggini cu URL <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
-       "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunzintutu, \"$1\".",
+       "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunzintutu, \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "L'XML ntô file carricatu nun potti èssiri analizzatu sintatticamenti.",
        "uploadvirus": "Lu file cunteni un virus!\nDittagghî: $1",
        "uploadjava": "Stu file è n'archiviu ZIP chi cunteni nu file .class Java.\nCarricari file Java nun è cunzintutu pirchì pirmèttinu d'aggirari li ristrizzioni di sicurizza.",
        "feedback-useragent": "Aggenti di l'utenti:",
        "searchsuggest-search": "Arricerca",
        "searchsuggest-containing": "chi cunteni...",
-       "api-error-badaccess-groups": "Nun hai lu pirmissu di carricari file nta sta wiki.",
        "api-error-badtoken": "Erruri nternu: Token sbagghiatu",
-       "api-error-copyuploaddisabled": "Lu carricamentu a pàrtiri d'URL è disattivatu nta stu server.",
-       "api-error-duplicate": "Già {{PLURAL:$1|c'è n'àutru file]|ci sunnu àutri file]}} supra ô situ chi {{PLURAL:$1|havi|hannu}} lu stissu cuntinutu.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|C'era n'àutru file|C'èranu àutri file}} supra ô situ c'{{PLURAL:$1|avìa|avìanu}} lu stissu cuntinutu, ma {{PLURAL:$1|fu cancillatu|foru cancillati}}.",
-       "api-error-empty-file": "Lu file chi mannasti era vacanti.",
        "api-error-emptypage": "Criari pàggini novi e vacanti nun è cunzintutu.",
-       "api-error-fetchfileerror": "Erruri nternu: Quarchi cosa nun funziunau mentri chi si carricava lu file.",
-       "api-error-fileexists-forbidden": "Nu file chi si chiama \"$1\" già esisti, e nun si pò suprascrìviri.",
-       "api-error-fileexists-shared-forbidden": "Nu file chi si chiama \"$1\" già esisti ntô dipòsitu cunnivisu, e nun si pò suprascrìviri.",
-       "api-error-file-too-large": "Lu file chi mannasti era troppu grossu.",
-       "api-error-filename-tooshort": "Lu nomu dû file è troppu curtu.",
-       "api-error-filetype-banned": "Stu tipu di file è sbannutu.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun è un tipu di file cunzintutu|nun sù tipi di file cunzintuti}}. {{PLURAL:$3|Lu tipu di file cunzintutu è|Li tipi di file cunzintuti sunnu}} $2.",
-       "api-error-filetype-missing": "Ô nomu dû file ci ammanca l'estinzioni.",
-       "api-error-hookaborted": "Lu canciamentu chi stavi pruvannu a fari fu annullatu di n'estinzioni.",
-       "api-error-http": "Erruri nternu: Mpussìbbili culligàrisi ô server.",
-       "api-error-illegal-filename": "Lu nomu dû file nun è cunzintutu.",
-       "api-error-internal-error": "Erruri nternu: Quarchi cosa nun funziunau mentri chi si stava travagghiannu lu tò carricamentu supra â wiki.",
-       "api-error-invalid-file-key": "Erruri nternu: Lu file nun fu attruvatu ntâ mimurizzazzioni timpurània.",
-       "api-error-missingparam": "Erruri nternu: Ammàncanu paràmitri nta l'addumannata.",
-       "api-error-missingresult": "Erruri nternu: Nun fu pussìbbili capiri si la copia arriniscìu.",
-       "api-error-mustbeloggedin": "Hai a aviri trasutu pi carricari file.",
-       "api-error-mustbeposted": "Erruri nternu: L'addumannata havi bisognu di POST HTTP.",
-       "api-error-noimageinfo": "Lu carricamentu arriniscìu, pirò lu server nun ni desi nudda nfurmazzioni a prupòsitu dû file.",
-       "api-error-nomodule": "Erruri nternu: nun fu mpustatu lu mòdulu di carricamentu",
-       "api-error-ok-but-empty": "Erruri ntenru: nudda risposta dû server",
-       "api-error-overwrite": "Suprascriviri nu file ca nun esisti nun è cunsitutu",
-       "api-error-stashfailed": "Erruri nternu: lu server nun arrinisciu a mimurizzari lu ducumentu timpuraniu",
        "api-error-publishfailed": "Erruri nternu: Lu server nun arriniscìu a pubblicari lu file timpuràniu.",
-       "api-error-stasherror": "Ci fu n'erruri ntô carricari lu file nta l'ammucciagghia.",
-       "api-error-stashedfilenotfound": "Lu file nun fu attruvatu nta l'ammucciagghia duranti lu tintativu di carricamentu a pàrtiri di l'ammucciagghia.",
-       "api-error-stashpathinvalid": "Lu caminu unni avissi avutu a èssiri lu file nta l'ammucciagghia nun era vàlidu.",
-       "api-error-stashfilestorage": "Ci fu n'erruri ntô mimurizzari lu file nta l'ammucciagghia.",
-       "api-error-stashzerolength": "Lu server nun potti mèttiri lu file nta l'ammucciagghia, pirchì avìa lunghizza zeru.",
-       "api-error-stashnotloggedin": "Hai a aviri trasutu pi sarvari file nta l'ammucciagghia.",
-       "api-error-stashwrongowner": "Lu file nta l'ammucciagghia chi pruvasti a pigghiari nun t'apparteni.",
-       "api-error-stashnosuchfilekey": "Lu file nta l'ammucciagghia chi pruvasti a pigghiari nun esisti.",
-       "api-error-timeout": "Lu server nun arrispunniu ntô tempu privistu",
-       "api-error-unclassified": "S'avvirificau n'erruri scanusciutu",
-       "api-error-unknown-code": "Erruri scanusciuti: \"$1$\".",
-       "api-error-unknown-error": "Erruri nternu: Quarchi cosa nun funziunau ntô tintativu di carricari lu tò file.",
+       "api-error-stashfailed": "Erruri nternu: lu server nun arrinisciu a mimurizzari lu ducumentu timpuraniu",
        "api-error-unknown-warning": "Avvisu scanusciutu: \"$1\".",
        "api-error-unknownerror": "Erruri scanusciutu: \"$1\".",
-       "api-error-uploaddisabled": "Lu carricamentu è disattivatu nta sta wiki.",
-       "api-error-verification-error": "Lu file purrìa èssiri ruinatu, o puru aviri la stinzioni sbagghiata.",
        "duration-seconds": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|uri}}",
index a94b562..a6af6a9 100644 (file)
        "passwordreset-emaildisabled": "Wab-mail features hae been disabled oan this wiki.",
        "passwordreset-username": "Uisername:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "See the ootcomin e-mail?",
-       "passwordreset-capture-help": "Gif ye check this kist, the e-mail (wi the temperie passwaird) will be shawn til ye n be sent til the uiser ava.",
        "passwordreset-email": "Wab-mail address:",
        "passwordreset-emailtitle": "Accoont details oan {{SITENAME}}",
        "passwordreset-emailtext-ip": "Somebodie (likely ye, fae IP address $1) requested ae reset o yer passwaird fer {{SITENAME}} ($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}}\nassociated 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 passwaird nou. Gif some ither bodie makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae longer\nwish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
        "saveprefs": "Hain preferences",
        "restoreprefs": "Restore aw defaut settins (in aw sections)",
        "prefs-editing": "Eeditin",
-       "rows": "Raws:",
-       "columns": "Columns:",
        "searchresultshead": "Rake ootcome settins",
        "stub-threshold": "Threeshaud fer <a href=\"#\" class=\"stub\">stub airtin</a> formattin (bytes):",
        "stub-threshold-disabled": "Disablt",
        "userrights-reason": "Raison:",
        "userrights-no-interwiki": "Ye dinna hae permission tae eedit uiser richts oan ither wikis.",
        "userrights-nodatabase": "Database $1 disna exeest or isna local.",
-       "userrights-nologin": "Ye maun [[Special:UserLogin|log in]] wi aen admeenistrater accoont tae assign uiser richts.",
-       "userrights-notallowed": "Ye dinna hae permeession tae eik or remuiv uiser richts.",
        "userrights-changeable-col": "Groops that ye can chynge",
        "userrights-unchangeable-col": "Groops ye canna chynge",
        "userrights-conflict": "Conflict o uiser richts chynges! Please luikower n confirm yer chynges.",
-       "userrights-removed-self": "Ye'v successfulie remuived yer ain richts. N sae, ye'r naw langer able tae access this page.",
        "group": "Groop:",
        "group-user": "Uisers",
        "group-autoconfirmed": "Autæconfirmed uisers",
        "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-passwordreset": "See passwaird reset wab-mails",
        "newuserlogpage": "Uiser cræftin log",
        "newuserlogpagetext": "This is ae log o uiser cræftins.",
        "rightslog": "Uiser richts log",
        "uploaddisabledtext": "File uplaids ar disabled.",
        "php-uploaddisabledtext": "File uplaids ar disabled in PHP.\nPlease check the file_uploads settin.",
        "uploadscripted": "This file hauds HTML or script code that micht be wranglie interpretit bi ae wab brouser.",
-       "uploadscriptednamespace": "This SVG file contains aen illegal namespace \"$1\"",
+       "uploadscriptednamespace": "This SVG file contains aen illegal namespace \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "The XML in the uplaided file coudna be parsed.",
        "uploadvirus": "The file hauds a virus! Details: $1",
        "uploadjava": "The file is ae ZIP file that contains ae Java .class file.\nUplaidin Java files isna permitit cause thay can cause secureetie restreections tae be bypassed.",
        "feedback-thanks": "Thanks! Yer feedback haes been posted til the page \"[$2 $1]\".",
        "searchsuggest-search": "Rake",
        "searchsuggest-containing": "containin...",
-       "api-error-badaccess-groups": "Ye'r na permittit tae uplaid files til this wiki.",
        "api-error-badtoken": "Inby mistak: Bad token.",
-       "api-error-copyuploaddisabled": "Uplaidin bi URL is disabled oan this server.",
-       "api-error-duplicate": "Thaur {{PLURAL:$1|is anither file|ar some ither files}} awreadie oan the site wi the same content.",
-       "api-error-duplicate-archive": "Thaur {{PLURAL:$1|wis anither file|were some ither files}} awreadie oan the site wi the same content, but {{PLURAL:$1|it wis|thay were}} delytit.",
-       "api-error-empty-file": "The file that ye haunnit in wis tuim.",
        "api-error-emptypage": "Cræftin new, tuim pages isna permittit.",
-       "api-error-fetchfileerror": "Internal mistak: Sommit went wrang while fetchin the file.",
-       "api-error-fileexists-forbidden": "Ae file wi the name \"$1\" awreadie exeests, n canna be owerwritten.",
-       "api-error-fileexists-shared-forbidden": "Ae file wi the name \"$1\" awreadie exeests in the shaired file reposeetair, n canna be owerwritten.",
-       "api-error-file-too-large": "The file that ye haunnit in wis ower muckle.",
-       "api-error-filename-tooshort": "The filename is ower short.",
-       "api-error-filetype-banned": "This type o file is banned.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|isna ae permittit file type|arna permittit file types}}. Permittit {{PLURAL:$3|file type is|file types ar}} $2.",
-       "api-error-filetype-missing": "The filename is missin aen extension.",
-       "api-error-hookaborted": "The modeefication that ye gave makin ae gae wis abortit bi aen extension.",
-       "api-error-http": "Internal mistak: Onable tae connect til server.",
-       "api-error-illegal-filename": "The filename isna permitit.",
-       "api-error-internal-error": "Internal mistak: Sommit went wrang wi processin yer uplaid oan the wiki.",
-       "api-error-invalid-file-key": "Internal mistak: File wisna foond in temparie storage.",
-       "api-error-missingparam": "Internal mistak: Missin boonds oan request.",
-       "api-error-missingresult": "Internal mistak: Coudna determine gif the copie succeeded.",
-       "api-error-mustbeloggedin": "Ye maun be loggit in tae uplaid files.",
-       "api-error-mustbeposted": "Internal mistak: Request needs HTTP POST.",
-       "api-error-noimageinfo": "The uplaid succeeded, bit the server didna gie us onie information aneat the file.",
-       "api-error-nomodule": "Internal mistak: Naw uplaid module set.",
-       "api-error-ok-but-empty": "Internal mistak: Naw response fae server.",
-       "api-error-overwrite": "Owerwritin aen exeestin file isna permitit.",
-       "api-error-stashfailed": "Internal mistak: Server failed tae store temparie file.",
        "api-error-publishfailed": "Internal mistak: Server failed tae publeesh temparie file.",
-       "api-error-stasherror": "Thaur wis ae mistak while uplaidin the file tae stash.",
-       "api-error-stashedfilenotfound": "The stashed file wis no foond whan attemptin tae uplaid it fae the stash.",
-       "api-error-stashpathinvalid": "The path that the stashed file shid hae been foond at wis no valid.",
-       "api-error-stashfilestorage": "Thaur wis ae mistak in storin the file in the stash.",
-       "api-error-stashzerolength": "The server coudna stash the file, cause it haed zero langth.",
-       "api-error-stashnotloggedin": "Ye maun be loggit in tae hain files in the uplaid stash.",
-       "api-error-stashwrongowner": "The file that ye were attemptin tae access in the stash disna belang tae ye.",
-       "api-error-stashnosuchfilekey": "The file key that ye were attemptin tae access in the stash disna exeest.",
-       "api-error-timeout": "The server didna respond wiin the expectit time.",
-       "api-error-unclassified": "Aen onkent mistake occurred.",
-       "api-error-unknown-code": "Onknawn mistak: \"$1\".",
-       "api-error-unknown-error": "Internal mistak: Sommit went wrang whan uplaidin yer file.",
+       "api-error-stashfailed": "Internal mistak: Server failed tae store temparie file.",
        "api-error-unknown-warning": "Onknawn warnishment: \"$1\".",
        "api-error-unknownerror": "Onknawn mistak: \"$1\".",
-       "api-error-uploaddisabled": "Uplaidin is disabled oan this wiki.",
-       "api-error-verification-error": "This file micht be rotten, or hae the wrang extension.",
        "duration-seconds": "$1 {{PLURAL:$1|seicont|seiconts}}",
        "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
        "duration-hours": "$1 {{PLURAL:$1|hoor|hoors}}",
index 3787b3b..9549557 100644 (file)
        "tog-numberheadings": "سُرخين کي خودڪاراً نمبر ڏيو",
        "tog-showtoolbar": "سنوار اوزار ڏيکاريو",
        "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا سنواريو",
-       "tog-watchcreations": "منهنجا سرجيل صفحا ۽ منهنجا چاڙهيل فائيل منهنجي زيرِ نظر فهرست تي رکو",
-       "tog-watchdefault": "منهنجا ترميميل صفحا ۽ فائيل  منهنجي نظرھيٺ فھرست ۾ رکو",
-       "tog-watchmoves": "جيڪي صفحا ۽ فائيل آءُٗ چوريان، سي منهنجي نظرھيٺ فھرست ۾ شامل ڪريو.",
-       "tog-watchdeletion": "آءُٗ جيڪي صفحا ۽ فائيل  ڊاهيان، سي منهنجي نظرھيٺ فھرست تي رکو",
-       "tog-watchuploads": "منهنجا نوان چاڙهيل فائيلس ٽيٽ فهرست ۾ شامل ڪريو",
-       "tog-watchrollback": "انهن صفحن کي منهنجي نظرھيٺ فھرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي.",
+       "tog-watchcreations": "منھنجا سرجيل صفحا ۽ منھنجا چاڙھيل فائيل منھنجي نظر ۾ فھرست تي رکو",
+       "tog-watchdefault": "منھنجا ترميميل صفحا ۽ فائيل  منھنجي نظر ۾ فھرست ۾ رکو",
+       "tog-watchmoves": "جيڪي صفحا ۽ فائيل آءُٗ چوريان، سي منهنجي نظر ۾ فھرست ۾ شامل ڪريو",
+       "tog-watchdeletion": "آءُٗ جيڪي صفحا ۽ فائيل  ڊاهيان، سي منهنجي نظر ۾ فھرست تي رکو",
+       "tog-watchuploads": "منھنجا نوان چاڙهيل فائيلس نظر ۾ فھرست ۾ شامل ڪريو",
+       "tog-watchrollback": "انهن صفحن کي منهنجي نظر ۾ فھرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي",
        "tog-minordefault": "سمورين تبديلين کي بنان چئي معمولي ترميم تصور ڪريو",
        "tog-previewontop": "ترميمي دٻيءَ مٿان پيش نگاهہ ڏيکاريو",
        "tog-previewonfirst": "پهرين ترميم تي پيش نگاهہ ڏيکاريو",
-       "tog-enotifwatchlistpages": "Ù\85Ù\86Ù\87Ù\86جÙ\8a Ù½Ù\8aÙ½ Ù\81ھرست Ø§Ù\86در Ø´Ø§Ù\85Ù\84 ÚªÙ\86Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ù\8aا Ù\81ائÙ\8aÙ\84 Û¾ ØªØ¨Ø¯Ù\8aÙ\84 Ù¾Ù\8aØ´ Ø§Ú\86Ù\8a Ù\85Ù\88Ù\86 Ú©Ù\8a Ø¨Ø±Ù\82 ٽپال اماڻيو",
-       "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برق ٽپال اماڻيو",
-       "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برق ٽپال ڪريو",
-       "tog-enotifrevealaddr": "پڌراين ۾ منهنجو برق ٽپال پتو ظاهر ڪريو.",
+       "tog-enotifwatchlistpages": "Ù\85Ù\86Ù\87Ù\86جÙ\8a Ù\86ظر Û¾ Ù\81ھرست Ø§Ù\86در Ø´Ø§Ù\85Ù\84 ÚªÙ\86Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ù\8aا Ù\81ائÙ\8aÙ\84 Û¾ ØªØ¨Ø¯Ù\8aÙ\84 Ù¾Ù\8aØ´ Ø§Ú\86Ù\8a Ù\85Ù\88Ù\86 Ú©Ù\8a Ø¨Ø±Ù\82ٽپال اماڻيو",
+       "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برقٽپال اماڻيو",
+       "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برقٽپال ڪريو",
+       "tog-enotifrevealaddr": "پڌراين ۾ منهنجو برقٽپال پتو ظاهر ڪريو",
        "tog-shownumberswatching": "ڏسندڙ يوزرس جو انگ ڏيکاريو",
        "tog-oldsig": "توھان جو موجوده دستخط:",
        "tog-fancysig": "صحيح کي وڪيٽيڪسٽ سمجھو (ڪنھن خوڪار ڳنڍڻي کانسواءِ)",
        "tog-uselivepreview": "سڌي سنئين پيش نگاھہ استعمال ڪريو",
-       "tog-watchlisthideown": "زير نظر فهرست مان منهنجون ڪيل ترميمون لڪايو",
-       "tog-watchlisthidebots": "Ù½Ù\8aÙ½ Ù\81Ù\87رست تان بوٽ جون ترميمون لڪايو",
-       "tog-watchlisthideminor": "Ù½Ù\8aÙ½ Ù\81Ù\87رست تان معمولي ترميمون لڪايو",
-       "tog-watchlisthideliu": "لاگ اِن ٿيل يوزرس جون ڪيل ترميمون زيرنظر فهرست ۾ نہ ڏيکاريو",
-       "tog-watchlisthideanons": "Ù½Ù\8aÙ½ Ù\81Ù\87رست تان اڻڄاتل يوزر جون ترميمون لڪايو",
-       "tog-watchlisthidepatrolled": "Ù½Ù\8aÙ½ فھرست مان گشت ڪيل ترميمون لڪايو",
+       "tog-watchlisthideown": "نظر ۾ فھرست مان منهنجون ڪيل ترميمون لڪايو",
+       "tog-watchlisthidebots": "Ù\86ظر Û¾ Ù\81Ú¾رست تان بوٽ جون ترميمون لڪايو",
+       "tog-watchlisthideminor": "Ù\86ظر Û¾ Ù\81Ú¾رست تان معمولي ترميمون لڪايو",
+       "tog-watchlisthideliu": "داخل ٿيل يوزرس جون ڪيل ترميمون نظر ۾ فھرست ۾ نہ ڏيکاريو",
+       "tog-watchlisthideanons": "Ù\86ظر Û¾ Ù\81Ú¾رست تان اڻڄاتل يوزر جون ترميمون لڪايو",
+       "tog-watchlisthidepatrolled": "Ù\86ظر Û¾ فھرست مان گشت ڪيل ترميمون لڪايو",
        "tog-watchlisthidecategorization": "صفحن جا زمرا لڪايو",
-       "tog-ccmeonemails": "ٻين يوزرس ڏانهن منهنجي موڪليل برق ٽپال جو پرت مون کي اماڻيو",
+       "tog-ccmeonemails": "ٻين يوزرس ڏانھن منهنجي موڪليل برقٽپال جو پرت مون کي اماڻيو",
        "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نہ ڏيکاريو",
        "tog-showhiddencats": "لڪل زمرا ڏيکاريو",
        "tog-norollbackdiff": "واپس ورائڻ کان پوءِ تفاوت نہ ڏيکاريو",
@@ -74,7 +74,7 @@
        "february": "فيبروري",
        "march": "مارچ",
        "april": "اپريل",
-       "may_long": "مَي",
+       "may_long": "مَئي",
        "june": "جُونِ",
        "july": "جُولاءِ",
        "august": "آگسٽ",
@@ -98,7 +98,7 @@
        "feb": "فيبروري",
        "mar": "مارچ",
        "apr": "اپريل",
-       "may": "مَي",
+       "may": "مَئي",
        "jun": "جُونِ",
        "jul": "جُولاءِ",
        "aug": "آگسٽ",
        "category-empty": "''في‌الوقت هن زمري ۾ ڪي بہ صفحا يا ذريعات شامل ناهن.''",
        "hidden-categories": "{{PLURAL:$1|لڪيل زمرو|لڪيل زمرا}}",
        "hidden-category-category": "لڪل زمرا",
-       "category-subcat-count": "{{PLURAL:$2|هن ذمري ۾ رڳو هيٺيون ذيلي ذمرو آهي.|هن ذمري ۾ ڪل $2 مان هيٺيان {{PLURAL:$1|subcategory|$1 ذيلي ذمرا}} آهن.}}",
+       "category-subcat-count": "{{PLURAL:$2|ھن زمري ۾ رڳو ھيٺيون ذيلي زمرو آهي.|هن زمري ۾ ڪل $2 مان ھيٺيان {{PLURAL:$1|subcategory|$1 ذيلي زمرا}} آھن.}}",
        "category-subcat-count-limited": "هن زمري ۾ هيٺيان {{PLURAL:$1|ننڍا زمرا آهن|$1 subcategories}}.",
-       "category-article-count": "{{PLURAL:$2|هن زمري ۾ صرف هيٺيون صفحو آهي.|هيٺيان {{PLURAL:$1|صفحو آهي|$1 صفحا آهن}} هن زمري ۾, سمورن $2 مان.}}",
+       "category-article-count": "{{PLURAL:$2|هن زمري ۾ صرف هيٺيون صفحو آهي.|هيٺيان {{PLURAL:$1|صفحو آهي|$1 صفحا آهن}} هن زمري ۾، سمورن $2 مان.}}",
        "category-article-count-limited": "هيٺِون {{PLURAL:$1|صفحو آهي|$1 صفحا آهن}} تازي زمري ۾.",
        "category-file-count": "{{PLURAL:$2|هن زمري ۾ صرف هيٺيون فائيل آهي.|هيٺيون يا هيٺيان {{PLURAL:$1|فائيل آهي|$1 فائيل آهن}} هن زمري ۾، سمورن $2 مان.}}",
        "category-file-count-limited": "هيٺيون يا هيٺيان {{PLURAL:$1|فائيل آهي|$1 فائيل آهن}} هن تازي زمري ۾.",
        "mypage": "منهنجو صفحو",
        "mytalk": "بحث",
        "anontalk": "بحث",
-       "navigation": "رهنمائي",
+       "navigation": "رھنمائي",
        "and": "&#32؛۽",
        "qbfind": "ڳوليو",
        "qbbrowse": "جھانگيو",
        "actions": "ڪارگذاريون",
        "namespaces": "نانءُپولارَ",
        "variants": "بَدَلَ",
-       "navigation-heading": "رهنما مينيو",
+       "navigation-heading": "رھنما مينيو",
        "errorpagetitle": "چُڪَ",
-       "returnto": "$1 ڏانهن وَرو.",
+       "returnto": "$1 ڏانھن وَرو.",
        "tagline": "{{SITENAME}} طرفان",
        "help": "مدد",
        "search": "ڳولا",
        "views": "ڏيٺون",
        "toolbox": "اوزارَ",
        "tool-link-userrights": "{{GENDER:$1|يوزر}} گروھ تبديل ڪريو",
+       "tool-link-userrights-readonly": "{{GENDER:$1|يوزر}} گروھ ڏسو",
        "tool-link-emailuser": "ھن {{GENDER:$1|يوزر}} ڏانھن برقٽپال موڪليو",
        "userpage": "يوزر صفحو ڏسو",
        "projectpage": "رٿائي صفحو ڏسو",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
        "redirectto": "ڏانھن چوريو:",
-       "lastmodifiedat": "هيءُ صفحو آخري دفعو $2، $1ع تي سنواريو ويو هو.",
+       "lastmodifiedat": "ھيءُ صفحو آخري دفعو $2، $1ع تي سنواريو ويو ھو",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
        "jumpto": "ڏانھن ٽپ ڏيو:",
-       "jumptonavigation": "رهنمائي",
+       "jumptonavigation": "رھنمائي",
        "jumptosearch": "ڳولا",
        "view-pool-error": "معذرت سان سرور هاڻي تمام گھڻو سُڪ آهي.\nتمام گھڻا يوزر ھن صفحي کي ڏسڻ جي ڪوشش ڪري رھيا آھن.\nمهرباني ڪري ٿورو ترسو انکان اڳ جو توھان ھن صفحي تائين رسڻ لاءِ ٻيھر ڪوشش ڪريو.\n\n$1",
        "generic-pool-error": "معذرت سان سرور هاڻي تمام گھڻو سُڪ آهي.\nتمام گھڻا يوزر هتي موجود آهن.\nمهرباني ڪري ٿورو ترسي پوءِ ڪوشش ڪريو.",
-       "pool-errorunknown": "اڻ ڄاتل چُڪَ",
+       "pool-errorunknown": "اڻڄاتل چُڪَ",
        "poolcounter-usage-error": "استعمال جي خرابي: $1",
        "aboutsite": "{{SITENAME}} بابت",
        "aboutpage": "Project:بابت",
        "sort-descending": "لهندڙ ترتيب ڏيو",
        "sort-ascending": "چڙهندڙ ترتيب ڏيو",
        "nstab-main": "صفحو",
-       "nstab-user": "تعارفي صفحو",
+       "nstab-user": "يُوزر صفحو",
        "nstab-media": "ذريعاتي صفحو",
        "nstab-special": "خاص صفحو",
        "nstab-project": "رٿائي صفحو",
        "mycustomcssprotected": "توهان کي هيءُ CSS صفحو سنوارڻ جي اجازت نہ آهي.",
        "mycustomjsprotected": "توهان کي هيءُ جاوا اسڪرپٽ صفحو سنوارڻ جي اجازت حاصل ڪانهي.",
        "myprivateinfoprotected": "توهان کي پنهنجي ذاتي معلومات سنوارڻ جي اجازت حاصل نہ آهي.",
-       "mypreferencesprotected": "توهان جي پنهنجون ترجيحات سنوارڻ جي اجات حاصل ڪانهي.",
+       "mypreferencesprotected": "توھان کي پنھنجون ترجيحون سنوارڻ جي اجات حاصل ڪانھي.",
        "ns-specialprotected": "خاص صفحا سنواري نٿا سگھجن.",
        "titleprotected": "[[User:$1|$1]] اهڙي عنوان سان صفحو سرجڻ تي روڪ لڳائي ڇڏي آهي. سبب <em>$2</em> ڄاڻايو ويو آهي.",
        "exception-nologin": "داخل ٿيل نہ آهيو",
-       "virus-unknownscanner": "اڻ ڄاتل نِس وائرس:",
-       "cannotlogoutnow-title": "ھاڻي ٻاھر نٿو نڪري سگھجي",
-       "cannotlogoutnow-text": "$1 استعمال ڪرڻ دوران ٻاھر نڪرڻ ممڪن نہ آھي.",
+       "virus-unknownscanner": "اڻڄاتل نِس وائرس:",
+       "cannotlogoutnow-title": "ھاڻي خارج نٿو ٿي سگھجي",
+       "cannotlogoutnow-text": "$1 استعمال ڪرڻ دوران خارج ٿيڻ ممڪن نہ آھي.",
        "welcomeuser": "ڀلي ڪري آيا، $1!",
        "yourname": "يُوزرنانءُ:",
        "userlogin-yourname": "يوزرنانءُ",
-       "userlogin-yourname-ph": "پنهنجو يوزرنانءُ ڄاڻايو",
+       "userlogin-yourname-ph": "پنھنجو يوزرنانءُ ڄاڻايو",
        "createacct-another-username-ph": "يُوزرنانءُ ڄاڻايو",
        "yourpassword": "ڳجھولفظ:",
        "userlogin-yourpassword": "ڳجھولفظ",
        "userlogin-yourpassword-ph": "پنهنجو ڳجھولفظ ڄاڻايو",
-       "createacct-yourpassword-ph": "ڳجھولفظ ڄاڻايو",
+       "createacct-yourpassword-ph": "ÚªÙ\88 Ú³Ø¬Ú¾Ù\88Ù\84Ù\81ظ Ú\84اڻاÙ\8aÙ\88",
        "yourpasswordagain": "يُوزرنان ٻيهر ٽائيپ ڪريو:",
-       "createacct-yourpasswordagain": "ڳجھي لفظ جي خاطري ڪريو",
+       "createacct-yourpasswordagain": "ڳجھي لفظ جي پڪ ڪريو",
        "createacct-yourpasswordagain-ph": "ٻيھر ڳجھولفظ داخل ڪريو",
        "userlogin-remembermypassword": "مون کي داخل ٿيل رکو",
        "userlogin-signwithsecure": "محفوظ ڳانڍاپو استعمال ڪريو",
        "nav-login-createaccount": "داخل ٿيو / کاتو کوليو",
        "userlogin": "داخل ٿيو / کاتو کوليو",
        "userloginnocreate": "داخل ٿيو",
-       "logout": "ٻاھر نڪرو",
-       "userlogout": "ٻاھر نڪرو",
+       "logout": "خارج ٿيو",
+       "userlogout": "خارج ٿيو",
        "notloggedin": "داخل ٿيل نہ آهيو",
        "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
        "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
        "userlogin-reauth": "اھو پڪ ڪرڻ لاءِ ته توھان {{GENDER:$1|$1}} آھيو توھان کي ٻيھر داخل ٿيڻو پوندو.",
        "userlogin-createanother": "ٻيو کاتو کوليو",
        "createacct-emailrequired": "برق ٽپال پتو",
-       "createacct-emailoptional": "برق ٽپال پتو (مرضيءَ موجب)",
-       "createacct-email-ph": "پنهنجو برق ٽپال پتو ڄاڻايو",
+       "createacct-emailoptional": "برقٽپال پتو (مرضيءَ موجب)",
+       "createacct-email-ph": "پنھنجو برقٽپال پتو ڄاڻايو",
        "createacct-another-email-ph": "برق ٽپال پتو ڄاڻايو",
-       "createaccountmail": "ڪو بہ عارضي ڳجھو لفظ استعمال ڪريو ۽ ڄاڻايل برق ٽپال پتي تي اماڻيو",
+       "createaccountmail": "ڪو بہ عارضي ڳجھولفظ استعمال ڪريو ۽ ڄاڻايل برقٽپال پتي تي اماڻيو",
        "createacct-realname": "اصل نالو (مرضيءَ موجب)",
        "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
-       "createacct-submit": "پنهنجو کاتو کوليو",
+       "createacct-submit": "پنھنجو کاتو کوليو",
        "createacct-another-submit": "کاتو کوليو",
        "createacct-continue-submit": "کاتو کولڻ جاري رکو",
        "createacct-another-continue-submit": "کاتو کولڻ جاري رکو",
-       "createacct-benefit-heading": "{{SITENAME}} توهان جهڙن سڄڻن ٺاهيو آهي.",
+       "createacct-benefit-heading": "{{SITENAME}} توھان جھڙن سڄڻن ٺاھيو آھي.",
        "createacct-benefit-body1": "{{PLURAL:$1|ترميم|ترميمون}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحو|صفحا}}",
        "createacct-benefit-body3": "ھاڻوڪا {{PLURAL:$1|ڀاڱيدار}}",
        "usernameinprogress": "ان يُوزرنانءُ لاءِ کاتو اڳ ۾ ئي تياريءَ هيٺ آهي. مهرباني ڪري انتظار فرمايو.",
        "userexists": "ڄاڻايل يوزرنانءُ اڳ ۾ ئي استعمال هيٺ آهي. مهرباني ڪري ڪو ٻيو يُوزرنانءُ چونڊيو.",
        "loginerror": "داخل ٿيڻ ۾ چُڪَ",
-       "createacct-error": "کاٿو کولڻ ۾ چُڪَ",
+       "createacct-error": "کاتو کولڻ ۾ چُڪَ",
        "createaccounterror": "کاتو کُلي نہ سگھيو: $1",
        "nocookiesnew": "يُوزر کاتو کلي چڪو، پر توهان داخل نہ ٿيا آهيو. يُوزرس کي داخل ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. داخل ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
-       "nocookieslogin": "يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
+       "nocookieslogin": "يُوزرس کي داخل ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي.\nتوھان ڪوڪيز کي ناڪاره بڻائي رکيو آھي.\nداخل ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
        "noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
        "loginsuccesstitle": "داخل ٿيل",
        "loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" داخل ٿيل آهيو.'''",
        "password-name-match": "توهان جو ڳجھولفظ توهان جي يوزرنانءُ کان مختلف هجڻ گھرجي.",
        "mailmypassword": "ڳجھولفظ ٻيھر مقرر ڪريو",
        "passwordremindertitle": "{{SITENAME}} لاءِ نئون عارضي ڳجھولفظ",
-       "passwordremindertext": "ڪنهن (شايد توهان آءِ پي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھو لفظ اماڻڻ جي گھُرَ ڪئي.\"$2\" يوزر لاءِ هڪ ڳجھُ لفظ تخليق ڪيو ويو آهي \"$3\" تي ترتيب ڏنو ويو هو. جيڪڏهن اهو توهان جي ارادو هيو، ته هاڻي توهان کي هينئر ئي لاگ اِن ٿي پنهنجو ڳجھو لفظ تبديل ڪرڻ گھرجي.\nتوهان جو عارضي ڳجھو لفظ {{PLURAL:$5|هڪ ڏينهُن|$5 ڏينهَن}} ۾ ختم ٿيندو.\n\nجيڪڏهن اها گھُرَ اوهان نه ڪئي هئي، يا هاڻي اوهان کي پنهنجو ڳجھو لفظ ياد اچي ويو آهي ۽ توهان ان کي تبديل ڪرڻ نه ٿا چاهيو، ته توهان هن نياپي کي نظر انداز ڪندي پنهنجو پراڻو ڳجھو لفظ ئي استعمال ڪري سگھو ٿا.",
-       "noemail": "يُوزر \"$1\" جي ڪو بہ برق ٽپال پتو درج ٿيل ناهي.",
-       "noemailcreate": "توهان کي قابل ڪار برق ٽپال پتو مهيا ڪرڻو پوندو.",
-       "passwordsent": "يوزر \"$1\" لاءِ هڪ نئون ڳجھو لفظ برق ٽپال ذريعي اماڻيو ويو آهي.  مهرباني ڪري اهو حاصل ڪرڻ بعد لاگ اِن ٿيندا.",
+       "passwordremindertext": "ڪنھن (شايد توھان آءِپي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھولفظ اماڻڻ جي گُھرَ ڪئي.\"$2\" يوزر لاءِ ھڪ ڳجھولفظ تخليق ڪيو ويو آهي \"$3\" تي ترتيب ڏنو ويو ھو. جيڪڏھن اھو توھان جو ارادو ھيو، تہ ھاڻي توھان کي ھينئر ئي داخل ٿي پنھنجو ڳجھولفظ تبديل ڪرڻ گھرجي.\nتوھان جو عارضي ڳجھولفظ {{PLURAL:$5|هڪ ڏينھُن|$5 ڏينھَن}} ۾ ختم ٿيندو.\n\nجيڪڏھن اھا گُھرَ اوھان نہ ڪئي ھئي، يا ھاڻي اوھان کي پنھنجو ڳجھولفظ ياد اچي ويو آھي ۽ توھان ان کي تبديل ڪرڻ نٿا چاھيو، تہ توھان ھن نياپي کي نظر انداز ڪندي پنھنجو پراڻو ڳجھولفظ ئي استعمال ڪري سگھو ٿا.",
+       "noemail": "يُوزر \"$1\" جي ڪو بہ برقٽپال پتو درج ٿيل ناهي.",
+       "noemailcreate": "توھان کي قابلڪار برقٽپال پتو مھيا ڪرڻو پوندو.",
+       "passwordsent": "يوزر \"$1\" لاءِ ھڪ نئون ڳجھولفظ برقٽپال ذريعي اماڻيو ويو آهي.  مھرباني ڪري اھو حاصل ڪرڻ بعد داخل ٿيندا.",
        "mailerror": "ٽپال اماڻڻ ۾ چُڪَ: $1",
-       "acct_creation_throttle_hit": "توهان جي آءِ پي پتي تان هن وڪيءَ تي پوئين ڏينهن {{PLURAL:$1|1 کاتو|$1 کاتا}} کلي چڪا آهن، جيڪو وڌ ۾ وڌ اجازت ڏنل وقت آهي. \nنتيجتاً ساڳي آءِ پي پتي تان في‌الوقت وڌيڪ کاتا کولي نٿا سگھجن.",
-       "emailauthenticated": "توهان جي برق ٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
-       "emailnotauthenticated": "توهان جو برق ٽپال پتي جي تصديق اڃا ٿي نہ سگھي آهي.",
-       "noemailprefs": "انهن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحات ۾ برق ٽپال پتو ڄاڻايو.",
-       "emailconfirmlink": "پنهنجي برق ٽپال پتي جي پَڪَ ڪندا",
-       "invalidemailaddress": "Ù\87Ù\8a Ø§Ù\8aÙ\85Ù\8aÙ\84 Ù¾ØªÙ\88 Ù\82بÙ\88Ù\84 Ù\86Ù¿Ù\88 ÚªÚªØ±Ù\8a Ø³Ú¯Ú¾Ø¬Ù\8a Ø§Ù\8aئÙ\86 Ù¿Ù\88 Ù\84Ú³Ù\8a ØªÙ\87 Ø§Ù\86جÙ\88 Ù\81ارÙ\85Ù\8aÙ½ Ù\82ابÙ\84 Ù\82بÙ\88Ù\84 Ù\86Ù\87 Ø¢Ù\87Ù\8a.\nبراءÙ\90 Ù\85Ù\87رباني هڪ قابل قبول فارميٽ وارو پتو موڪليو يا ان جڳھ کي کالي ڇڏيو.",
-       "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برق ٽپال پتو بدلائي نہ ٿو سگھجي.",
-       "emaildisabled": "هيءَ سرزمين برق ٽپال اماڻي نہ ٿي سگھي.",
+       "acct_creation_throttle_hit": "توهان جي آءِپي پتي تان هن وڪيءَ تي پوئين $2، کان {{PLURAL:$1|1 کاتو|$1 کاتا}} کلي چڪا آهن، جيڪو وڌ ۾ وڌ اجازت ڏنل وقت آهي. \nنتيجتاً ساڳي آءِپي پتي تان في‌الوقت وڌيڪ کاتا کولي نٿا سگھجن.",
+       "emailauthenticated": "توھان جي برقٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
+       "emailnotauthenticated": "توھان جو برقٽپال پتي جي تصديق اڃا ٿي نہ سگھي آھي.",
+       "noemailprefs": "انھن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحن ۾ برقٽپال پتو ڄاڻايو.",
+       "emailconfirmlink": "پنھنجي برقٽپال پتي جي پَڪَ ڪندا",
+       "invalidemailaddress": "Ù\87Ù\8a Ø¨Ø±Ù\82ٽپاÙ\84 Ù¾ØªÙ\88 Ù\82بÙ\88Ù\84 Ù\86Ù¿Ù\88 ÚªØ±Ù\8a Ø³Ú¯Ú¾Ø¬Ù\8a Ø§Ù\8aئÙ\86 Ù¿Ù\88 Ù\84Ú³Ù\8a ØªÛ\81 Ø§Ù\86جÙ\88 Ù\81ارÙ\85Ù\8aÙ½ Ù\82ابÙ\84 Ù\82بÙ\88Ù\84 Ù\86Û\81 Ø¢Ù\87Ù\8a.\nبراءÙ\90 Ù\85Ú¾رباني هڪ قابل قبول فارميٽ وارو پتو موڪليو يا ان جڳھ کي کالي ڇڏيو.",
+       "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برقٽپال پتو بدلائي نہ ٿو سگھجي.",
+       "emaildisabled": "هيءَ سرزمين برقٽپال اماڻي نہ ٿي سگھي.",
        "accountcreated": "کاتو کلي چڪو",
        "accountcreatedtext": "يوزر کاتو [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) جي لاءِ تخليق ٿي چڪو آهي.",
        "createaccount-title": "{{SITENAME}} تي کاتو کولڻ",
        "pt-login-button": "داخل ٿيو",
        "pt-login-continue-button": "داخل ٿيڻ جاري رکو",
        "pt-createaccount": "کاتو کوليو",
-       "pt-userlogout": "ٻاھر نڪرو",
+       "pt-userlogout": "خارج ٿيو",
        "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
-       "user-mail-no-addy": "برق ٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
+       "user-mail-no-addy": "برقٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھولفظ تبديل ڪريو",
        "resetpass_announce": "داخل ٿيڻ جو عمل پورو ڪرڻ لاءِ، توهان کي نئون ڳجھولفظ اختيار مقرر ڪرڻو پوندو.",
        "resetpass_header": "کاتي جو ڳجھولفظ بدلايو",
        "resetpass_submit": "ڳجھولفظ طَي ڪريو ۽ داخل ٿيو",
        "changepassword-success": "توهان جو ڳجھولفظ بدلايو ويو آھي!",
        "changepassword-throttled": "توهان تازو ئي داخل ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "botpasswords": "بوٽ جو ڳجھولفظ",
+       "botpasswords-disabled": "بوٽ ڳجھالفظ ناقابلِڪار ڪيل آھن.",
        "botpasswords-label-create": "سرجيو",
        "botpasswords-label-update": "تجديد",
        "botpasswords-label-cancel": "رد",
        "resetpass-submit-cancel": "رد",
        "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھولفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
        "resetpass-recycled": "مهرباني ڪري پنهنجي هاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھو لفظ چونڊيو.",
-       "resetpass-temp-emailed": "توهان برق ٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان لاگ اِن ٿيا آهيو. لاگ اِن کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھو لفظ طَي ڪرڻو ئي پوندو:",
+       "resetpass-temp-emailed": "توهان برقٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان داخل ٿيا آهيو. داخل ٿيڻ کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھولفظ طَي ڪرڻو ئي پوندو:",
        "resetpass-temp-password": "عارضي ڳجھولفظ:",
        "resetpass-expired": "توهان جو ڳجھولفظ مدي خارج ٿي چڪو آهي. نئون ڳجھولفظ مقرر ڪريو ۽ داخل ٿيو.",
        "resetpass-expired-soft": "توهان جو ڳجھو لفظ مدي خارج ٿي چڪو آهي. مهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:authprovider-resetpass-skip-label}}\" تي ڪلڪ ڪريو.",
        "resetpass-validity-soft": "توهان جو ڳجھولفظ ناقابل ڪار آهي: $1\nمهرباني ڪري نئون ڳجھولفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:authprovider-resetpass-skip-label}}\" تي ڪلڪ ڪريو.",
        "passwordreset": "ڳجھولفظ مَٽايو",
-       "passwordreset-text-one": "برق ٽپال ذريعي عارضي ڳجھولفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
+       "passwordreset-text-one": "برقٽپال ذريعي عارضي ڳجھولفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
        "passwordreset-disabled": "هن وڪيءَ تي ڳجھولفظ ٻيھر مقرر ڪرڻ وارو چارو غير فعال بڻايو ويو آهي.",
        "passwordreset-emaildisabled": "هن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
        "passwordreset-username": "يُوزرنانءُ:",
        "passwordreset-domain": "ميدان:",
-       "passwordreset-capture": "برق ٽپال ڏسڻ چاهيندا؟",
        "passwordreset-email": "برق ٽپال پتو:",
        "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
        "passwordreset-emailelement": "يُوزر نانءُ: \n$1\n\nعارضي ڳجھو لفظ:\n$2",
-       "passwordreset-invalidemail": "ناقابل ڪار برق ٽپال پتو",
-       "changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
-       "changeemail-oldemail": "هاڻوڪو برق ٽپال پتو:",
-       "changeemail-newemail": "نئون برق ٽپال پتو:",
+       "passwordreset-invalidemail": "ناقابلڪار برقٽپال پتو",
+       "changeemail": "برقٽپال پتو مِٽايو يا بدلايو",
+       "changeemail-oldemail": "هاڻوڪو برقٽپال پتو:",
+       "changeemail-newemail": "نئون برقٽپال پتو:",
        "changeemail-none": "(ڪو بہ نہ)",
        "changeemail-password": "توهان جو {{SITENAME}} ڳجھو لفظ:",
-       "changeemail-submit": "برق ٽپال پتو بدلايو",
-       "changeemail-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
-       "changeemail-nochange": "مهرباني ڪري مختلف نئون برق ٽپال پتو ڄاڻايو.",
-       "resettokens": "ٻيهر ترتيب ڪرڻ جا ٽوڪن",
-       "resettokens-no-tokens": "ٻيهر ترتيب ڪرڻ لاءِ ڪي بہ ٽوڪن نہ آهن.",
+       "changeemail-submit": "برقٽپال پتو بدلايو",
+       "changeemail-throttled": "توھان تازو ئي داخل ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مھرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "changeemail-nochange": "مھرباني ڪري مختلف نئون برقٽپال پتو ڄاڻايو.",
+       "resettokens": "ٻيھر ترتيب ڪرڻ جا ٽوڪن",
+       "resettokens-no-tokens": "ٻيھر ترتيب ڪرڻ لاءِ ڪي بہ ٽوڪن نہ آھن.",
        "resettokens-tokens": "ٽوڪنس:",
        "resettokens-token-label": "$1 (حاليہ قدر: $2)",
-       "resettokens-resetbutton": "چونڊيل ٽوڪن ٻيهر ترتيب ڪريو",
+       "resettokens-resetbutton": "چونڊيل ٽوڪن ٻيھر ترتيب ڪريو",
        "bold_sample": "گھري لکت",
        "bold_tip": "گھري لکت",
        "italic_sample": "ترڇي لکت",
        "extlink_tip": "خارجي ڳنڍڻو (اڳياڙي http://  نہ وساريندا)",
        "headline_sample": "سرخي جي لکت",
        "headline_tip": "سطح 2 جي سرخي",
+       "nowiki_sample": "غير-فارميٽڊ لکت شامل ڪريو",
        "nowiki_tip": "وڪي فارميٽڱ کي نظرانداز ڪريو",
        "image_tip": "جَڙيل فائيل",
        "media_tip": "فائيل جو ڳنڍڻو",
-       "sig_tip": "توهان جي صحيح بمع اوقاتي مهر",
-       "hr_tip": "افقي لڪير (غيرضروري استعمال کان پاسو ڪندا)",
+       "sig_tip": "توھان جي صحيح بمع اوقاتي مھر",
+       "hr_tip": "افقي لڪير (ڪفايت سان استعمال ڪريو)",
        "summary": "تَتُ:",
        "subject": "موضوع:",
-       "minoredit": "هيءَ هڪ معمولي ترميم آهي",
-       "watchthis": "هيءُ صفحو سانڍيو",
+       "minoredit": "ھيءَ ھڪ معمولي ترميم آھي",
+       "watchthis": "هيءُ صفحو نظر ۾ رکو",
        "savearticle": "صفحو سانڍيو",
        "savechanges": "تبديليون سانڍيو",
        "publishpage": "صفحو ڇاپيو",
        "preview": "پيش نگاھ",
        "showpreview": "پيش نگاھ",
        "showdiff": "تبديليون ڏيکاريو",
-       "anoneditwarning": "<strong>خبردار:</strong> توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 داخل]</strong> ٿيو ٿا < يا strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سان منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
+       "anoneditwarning": "<strong>چتاءُ:</strong> توھان داخل ٿيل نہ آھيو. توھان جو آءِپي پتو عوامي طور ظاھر ٿيندو جي توھان ڪي ترميمون ڪريو ٿا. جيڪڏھن توھان <strong>[$1 داخل ٿيو]</strong> ٿا يا <strong>[$2 کاتو کوليو]</strong> ٿا، تہ ٻين فائدن سان گڏ توھان جون ترميمون توھان جي يوزرنانءَ سان منسوب ڪيون وينديون.",
        "anonpreviewwarning": "توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِپي پتو درج ڪيو ويندو.",
-       "missingcommenttext": "براءِ مهرباني هيٺ پنهنجا تاثرات درج ڪندا.",
+       "missingcommenttext": "براءِ مھرباني هيٺ پنهنجو تاثر درج ڪندا.",
        "summary-preview": "تت تي پيش نگاھ:",
        "subject-preview": "موضوع پيش نگاھ:",
        "blockedtitle": "يُوزر بندشيل آهي.",
-       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نہ ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن بہ پڇا ڳاڇا يا لهوچڙ لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
+       "blockedtext": "'''توھان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آھي.'''\n\nبندش $1 ھني. جڏھن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاھڙي روڪ تي بحث ڪرڻ لاءِ توھان $1 يا ڪنھن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توھان جو درست [[Special:ترجيحون|کاتو ترجيحون]] ۾ درست برقٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برقٽپال ڪريو' وارو فيچر نہ ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توھان جو ھاڻوڪو آءِپي پتو $3 آھي، ۽ بندش سڃاڻپ $5 آهي. مھرباني ڪري ڪنھن بہ پڇا ڳاڇا يا لھوچڙ لاءِ انھن مان ڪنھن ھڪ يا ٻنھي جو حوالو ڏيندا.",
        "blockednoreason": "سبب اڻڄاڻايل",
-       "whitelistedittext": "صفحا سنوارڻ لاءِ مهرباني ڪري $1.",
-       "confirmedittext": "صفحا سنوارڻ کان اڳ توهان کي پنهنجي ايميل پتي جي تصديق ڪرڻي پوندي. مهرباني ڪري [[Special:Preferences|use preferences]] ذريعي پنهنجو ايميل پتو ڄاڻايو ۽ تصديقيو.",
-       "nosuchsectiontitle": "سيڪشن نٿو لهي سگهي",
+       "whitelistedittext": "صفحا سنوارڻ لاءِ مھرباني ڪري $1.",
+       "confirmedittext": "صفحا سنوارڻ کان اڳ توھان کي پنھنجي برقٽپال پتي جي تصديق ڪرڻي پوندي. مھرباني ڪري [[Special:Preferences|يوزر ترجيحن]] ذريعي پنھنجو برقٽپال پتو ڄاڻايو ۽ تصديقيو.",
+       "nosuchsectiontitle": "سيڪشن نٿو لھي سگھي",
        "loginreqtitle": "داخل ٿيڻ گھربل آهي",
        "loginreqlink": "داخل ٿيو",
        "loginreqpagetext": "ٻيا صفحا ڏسڻ لاءِ مهرباني ڪري $1",
        "accmailtitle": "ڳجھولفظ اماڻجي چڪو",
        "newarticle": "(نئون)",
-       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نٿو رکي.\nاهڙو صفحو جوڙڻ لاءِ، هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا).\nجي توهان هتي غلطيءَ ۾ اچي ويا آهيو، تہ رڳو پنهنجي جهانگُوءَ جو <strong>back</strong> تي ٽڙڪ ڪريو.",
-       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي.\nتوهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا،  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
+       "newarticletext": "توھان اھڙي صفحي جو ڳنڍڻو وٺي ھتي پھتا آھيو، جيڪو اڃا وجود نٿو رکي.\nاھڙو صفحو جوڙڻ لاءِ، ھيٺين دٻي ۾ لکڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا).\nجي توھان ھتي غلطيءَ ۾ اچي ويا آهيو، تہ رڳو پنھنجي جھانگُوءَ جي <strong>back</strong> بٽڻ تي ٽڙڪ ڪريو.",
+       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي.\nتوهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا،  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nيا [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
+       "noarticletext-nopermission": "ھن وقت ھن صفحي ۾  ڪا بہ لکت نہ آھي.\nتوھان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|ھن صفحي جي عنوان سان ڳولا ڪري سگھو ٿا]]، يا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ڳوليو]</span>، پر توھان کي ان جي تخليق ڪرڻ جي اجازت نہ آھي.",
        "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
        "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
        "updated": "(تجديديل)",
        "note": "<strong>نوٽ:</strong>",
        "previewnote": "<strong>هيءَ فقط پيش نگاھ آهي.</strong>\nتوھان جون ترميمون اڃان نہ سانڍيون ويون آھن!",
-       "continue-editing": "ترميم گاھ ڏانهن وڃو",
+       "continue-editing": "ترميم گاھ ڏانھن وڃو",
        "editing": "$1 سنواريندي",
        "creating": "$1 سرجيندي",
        "editingsection": "زير ترميم $1 (سيڪشن)",
        "template-protected": "(تحفظيل)",
        "template-semiprotected": "(نيم-تحفظيل)",
        "hiddencategories": "هيءُ صفحو  {{PLURAL:$1|1 لڪل زمري|$1 لڪل زمرن}}: جو رڪن آهي:",
-       "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آهي.\nتوهان اڳي ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|لاگ اِن ٿي يا نئون کاتو کولي سگھو ٿا]].",
+       "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آھي.\nتوھان اڳ ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|داخل ٿي يا نئون کاتو کولي سگھو ٿا]].",
        "nocreate-loggedin": "توهان کي نوان صفحا سرجڻ جي اجازت حاصل ڪانهي.",
        "sectioneditnotsupported-title": "سيڪشن جي سنوار ممڪن نہ آهي",
        "sectioneditnotsupported-text": "هن صفحي تي سيڪشن کي سنوارڻ ممڪن نہ آهي.",
        "permissionserrors": "اجازتنامي جي چُڪَ",
        "permissionserrorstext": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي اهو ڪرڻ جي اجازت حاصل ڪانهي.",
-       "permissionserrorstext-withaction": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي $2 جي اجازت ڪانهي.",
-       "recreate-moveddeleted-warn": "'''خبردار: توهان اهڙو صفحو نئين سِر سرجي رهيا آهيو جيڪو اڳي ڊاٺو ويو آهي.'''\n\nبهتر ٿيندو تہ توهان سوچي وٺو تہ ڇا ان صفحي کي سنوارڻ چڱو ٿيندو.\nتوهآن جي سهوليت خاطر هتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
-       "moveddeleted-notice": "هيءُ صفحو ڊهي چڪو آهي. \nحوالي طور ڊاٺ ۽ چور لاگ هيٺ ڏجي ٿو.",
+       "permissionserrorstext-withaction": "ھيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توھان کي $2 جي اجازت ڪانھي.",
+       "recreate-moveddeleted-warn": "'''خبردار: توھان اھڙو صفحو نئين سِر سرجي رھيا آھيو جيڪو اڳ ڊاٺو ويو آھي.'''\n\nبھتر ٿيندو تہ توھان سوچي وٺو تہ ڇا ان صفحي کي سنوارڻ چڱو ٿيندو.\nتوهان جي سھولت خاطر ھتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
+       "moveddeleted-notice": "ھيءُ صفحو ڊھي چڪو آهي. \nحوالي طور ڊاٺ ۽ چور لاگ ھيٺ ڏجن ٿا.",
        "moveddeleted-notice-recent": "معاف ڪندا، هيءُ صفحو تازو ئي ڊاٺو ويو آهي (پوين 24 ڪلاڪن اندر). حوالي طور ڊاٺ ۽ چور لاگ هيٺ پيش ڪجي ٿو:",
        "log-fulllog": "پُورو لاگ ڏسو",
        "edit-conflict": "سنوار تڪرار",
        "lineno": "سِٽَ $1:",
        "compareselectedversions": "چونڊيل پرت ڀيٽيو",
        "editundo": "اڻڪريو",
-       "diff-empty": "(ڪو بہ تفاوت ڪونهي)",
+       "diff-empty": "(ڪو بہ تفاوت ڪونھي)",
        "searchresults": "ڳولا نتيجا",
        "searchresults-title": "”$1“ لاءِ ڳولا نتيجا",
-       "titlematches": "صفحي جو عنوان مشابهت رکي ٿو",
-       "textmatches": "صفحي جو متن مشابهت رکي ٿو",
+       "titlematches": "صفحي جو عنوان مشابھت رکي ٿو",
+       "textmatches": "صفحي جو متن مشابھت رکي ٿو",
        "notextmatches": "ڪنهن به صفحي جو متن مشابهت نٿو رکي",
        "prevn": "پويان {{PLURAL:$1|$1}}",
        "nextn": "اڳيان {{PLURAL:$1|$1}}",
        "nextn-title": "{{PLURAL:$1|ٻيو|ٻيا}} $1 {{PLURAL:$1|نتيجو|نتيجا}}",
        "shown-title": "$1 {{PLURAL:$1|نتيجو|نتيجا}} في صفحو ڏيکاريو",
        "viewprevnext": "ڏسو ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>ھن وڪيءَ تي صفحو تخليق ڪريو \"[[:$1]]\"!</strong> {{PLURAL:$2|0=|توھان جي ڳولا سان لڌل صفحو ڏسو.|لڌل ڳولا نتيجا پڻ ڏسو.}}",
        "searchprofile-articles": "موادي صفحا",
        "searchprofile-images": "گھڻذريعات",
-       "searchprofile-everything": "هر شَي",
+       "searchprofile-everything": "ھر شَيءِ",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "$1 ۾ ڳوليو",
        "searchprofile-images-tooltip": "فائيلن جي ڳولا",
-       "searchprofile-everything-tooltip": "سموري مواد ۾ ڳوليو",
+       "searchprofile-everything-tooltip": "سموري مواد ۾ ڳوليو (بحث صفحن سميت)",
        "searchprofile-advanced-tooltip": "مرضيءَ جي نانءُپولارن ۾ ڳوليو",
        "search-result-size": "$1 ({{PLURAL:$2|لفظُ|$2 لفظَ}})",
        "search-redirect": "($1 کان چوريو)",
        "searchrelated": "لاڳاپيل",
        "searchall": "سڀ",
        "search-showingresults": "{{PLURAL:$4|نتيجو <strong>$1</strong> of <strong>$3</strong>|نتيجا <strong>$1 - $2</strong> of <strong>$3</strong>}}",
-       "search-nonefound": "توهان جي ڳولا جي نتيجي ۾ ڪجھہ بہ ڪو نہ لڌو.",
+       "search-nonefound": "توھان جي ڳولا جي نتيجي ۾ ڪجھہ بہ نہ لڌو.",
        "powersearch-legend": "اعليٰ ڳولا",
        "powersearch-togglelabel": "چڪاسيو:",
        "powersearch-toggleall": "سڀ",
        "powersearch-togglenone": "ڪو بہ نہ",
        "search-external": "خارجي ڳولا",
        "search-error": "$1 ۾ ڳولا ڪندي چُڪَ ٿي.",
-       "preferences": "ترجيحات",
-       "mypreferences": "ترجيحات",
+       "preferences": "ترجيحون",
+       "mypreferences": "ترجيحون",
        "prefs-edits": "ترميمن جو تعداد:",
-       "prefsnologintext2": "پنهنجون ترجيحات بدلائڻ لاءِ داخل ٿيو.",
+       "prefsnologintext2": "پنھنجون ترجيحون بدلائڻ لاءِ داخل ٿيو.",
        "prefs-skin": "چَمَ",
        "skin-preview": "پيش نگاهہ",
-       "datedefault": "بلا ترجيحا",
+       "datedefault": "بلا ترجيح",
        "prefs-user-pages": "يُوزر صفحو",
        "prefs-personal": "يُوزر جو خدوخال",
        "prefs-rc": "تازيون تبديليون",
-       "prefs-watchlist": "نظرھيٺ فھرست",
-       "prefs-editwatchlist": "نظرھيٺ فھرست کي سنواريو",
-       "prefs-editwatchlist-label": "پنهنجي نظرھيٺ فھرست ۾ درج ٿيل شين کي سنواريو:",
-       "prefs-editwatchlist-edit": "پنھنجي نظرھيٺ فھرست ۾ موجود عنوان ڏسو ۽ مٽايو",
-       "prefs-editwatchlist-raw": "ڪچي نظرھيٺ فھرست سنواريو",
-       "prefs-editwatchlist-clear": "پنهنجي نظرھيٺ فھرست ڊاهيو",
-       "prefs-watchlist-days": "نظرھيٺ فھرست ۾ ڏيکارڻ لاءِ ڏينهن:",
-       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
+       "prefs-watchlist": "نظر ۾ فھرست",
+       "prefs-editwatchlist": "نظر ۾ فھرست کي سنواريو",
+       "prefs-editwatchlist-label": "پنهنجي نظر ۾ فھرست ۾ درج ٿيل شين کي سنواريو:",
+       "prefs-editwatchlist-edit": "پنھنجي نظر ۾ فھرست ۾ موجود عنوان ڏسو ۽ مٽايو",
+       "prefs-editwatchlist-raw": "ڪچي نظر ۾ فھرست سنواريو",
+       "prefs-editwatchlist-clear": "پنهنجي نظر ۾ فھرست ڊاهيو",
+       "prefs-watchlist-days": "نظر ۾ فھرست ۾ ڏيکارڻ لاءِ ڏينهن:",
+       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينھن}}",
        "prefs-watchlist-edits-max": "وڌ ۾ وڌ تعداد: 1000",
-       "prefs-watchlist-token": "نظرھيٺ فھرست جو ٽوڪن:",
+       "prefs-watchlist-token": "نظر ۾ فھرست جو ٽوڪن:",
        "prefs-misc": "متفرق",
        "prefs-resetpass": "ڳجھولفظ بدلايو",
-       "prefs-changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
-       "prefs-setemail": "ڪو برق ٽپال پتو ڄاڻايو",
-       "prefs-email": "برق ٽپال چارا",
+       "prefs-changeemail": "برقٽپال پتو مِٽايو يا بدلايو",
+       "prefs-setemail": "ڪو برقٽپال پتو ڄاڻايو",
+       "prefs-email": "برقٽپال چارا",
        "prefs-rendering": "حليو",
        "saveprefs": "سانڍيو",
        "prefs-editing": "سنوارڻ",
-       "rows": "قطارون:",
-       "columns": "ڪالمَ:",
        "searchresultshead": "ڳولا",
        "stub-threshold-sample-link": "نمونو",
        "stub-threshold-disabled": "غيرفعال",
        "recentchangesdays-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
        "recentchangescount": "عدم پيروي جي صورت ۾ ڏيکارڻ جي لاءِ ترميمون:",
        "prefs-help-recentchangescount": "ان ۾ تازيون تبديليون، صفحن جي سوانح، ۽ لاگ شامل آهن.",
-       "savedprefs": "توهان جون ترجيحات سانڍجي چڪيون آهن.",
-       "savedrights": "{{GENDER:$1|$1}} نالي يوزر جا حق سانڇجي چڪا آهن.",
+       "savedprefs": "توھان جون ترجيحون سانڍجي چڪيون آھن.",
+       "savedrights": "{{GENDER:$1|$1}} جا يوزر گروھ سانڍجي چڪا آھن.",
        "timezonelegend": "اوقاتي زون:",
        "localtime": "مقامي وقت:",
        "timezoneuseserverdefault": "وڪي عدم پيروي استعمال ڪريو ($1)",
        "timezoneregion-europe": "يُورپ",
        "timezoneregion-indian": "سنڌي ساگر",
        "timezoneregion-pacific": "ماٺو ساگر",
-       "allowemail": "ٻين يُوزرس کان ايندڙ برق ٽپال بحال ڪريو",
+       "allowemail": "ٻين يُوزرس کان ايندڙ ٽپال بحال ڪريو",
        "prefs-searchoptions": "ڳولا",
        "prefs-namespaces": "نانءُپولار",
        "default": "ڏنل",
        "prefs-files": "فائيلس",
-       "prefs-emailconfirm-label": "برق ٽپال جي خاطري:",
-       "youremail": "برق ٽپال:",
+       "prefs-emailconfirm-label": "برقٽپال خاطري:",
+       "youremail": "برقٽپال:",
        "username": "{{GENDER:$1|يُوزرنانءُ}}",
        "prefs-registration": "رجسٽريشن جو وقت:",
        "yourrealname": "اصل نالو:",
        "gender-unknown": "توهان جو ذڪر ڪندي، جيترو ٿي سگھيو، منطقگري بي جنس لفظن جو استعمال ڪندي.",
        "gender-male": "هيءُ وڪي صفحا سنواريندو آهي",
        "gender-female": "هيءَ وڪي صفحا سنواريندي آهي",
-       "email": "برق ٽپال",
+       "email": "برقٽپال",
        "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
-       "prefs-help-email": "برق ٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھو لفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھو لفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
-       "prefs-help-email-required": "برق ٽپال پتو گھربل آهي.",
+       "prefs-help-email": "برقٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھولفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھولفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
+       "prefs-help-email-required": "برقٽپال پتو گھربل آهي.",
        "prefs-info": "بنيادي ڄاڻ",
        "prefs-i18n": "بين‌الاقوامڪاري",
        "prefs-signature": "صحيح",
        "prefs-diffs": "تفاوت",
        "prefs-help-prefershttps": "هيءَ ترجيح توهان جي ايند داخل ٿيڻ تي عمل ۾ ايندي.",
        "userrights": "يُوزر حقن جو بندوبست",
-       "userrights-lookup-user": "يوزر گروپَ سنڀاليو",
+       "userrights-lookup-user": "ڪو يوزر چونڊيو",
        "userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
-       "editusergroup": "{{GENDER:$1|يوزر}} گروھ ترميميو",
+       "editusergroup": "يوزر گروھ اتاريو",
        "userrights-editusergroup": "يوزر گروپَ سنواريو",
        "saveusergroups": "{{GENDER:$1|يوزر}} گروھ سانڍيو",
        "userrights-groupsmember": "برڪن:",
        "userrights-reason": "سبب:",
        "userrights-no-interwiki": "توهان کي ٻين وڪيز تي يُوزر حقن ۾ ترميم ڪرڻ جو حق حاصل نہ آهي.",
        "userrights-nodatabase": "اعداخانو $1 يا تہ وجود نہ ٿو رکي يا تہ اهو مقامي اعدادخانو نہ آهي.",
-       "userrights-notallowed": "توهان کي يوزر جا حق شامل يا هٽائڻ جي اجازت نه آهي.",
        "userrights-changeable-col": "گروپَ جيڪي توهان تبديل ڪري سگھو ٿا",
        "userrights-unchangeable-col": "گروپَ جيڪي توهان تبديل نٿا ڪري سگھو",
        "group": "گروپ:",
        "right-undelete": "ڪو صفحو اڻڊاهيو",
        "right-unblockself": "ڪنهن تان بندش ختم ڪريو",
        "right-editinterface": "يُوزر باهمرُو کي سنواريو",
-       "right-viewmywatchlist": "پنهنجي نظرھيٺ فھرست ڏسو",
-       "right-editmyoptions": "پنهنجون ترجيحات سنواريو",
+       "right-viewmywatchlist": "پنهنجي نظر ۾ فھرست ڏسو",
+       "right-editmyoptions": "پنهنجون ترجيحون سنواريو",
        "right-import": "ٻين وڪيز کان صفحا درآمديو",
        "right-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
        "right-mergehistory": "صفحن جي سوانح سنواريو",
        "right-siteadmin": "اعدادخانو بنديو ۽ کوليو",
        "right-override-export-depth": "5ئين اونهائيءَ تائين ڳنڍيل صفحن سميت صفحا برآمديو",
        "right-sendemail": "ٻين يوزرس ڏانهن ايميل موڪليو",
-       "right-passwordreset": "ڳجھو لفظ مقرري برق ٽپالون ڏسو",
        "right-managechangetags": "[[Special:Tags|ٽيگس]] سرجيو ۽ ڊاهيو.",
-       "grant-group-email": "برق ٽپال اماڻيو",
+       "grant-group-email": "برقٽپال اماڻيو",
        "grant-blockusers": "يُوزرس کي بندشيو ۽ اڻبندشيو",
        "grant-createaccount": "نئون کاتو کوليو",
-       "grant-editmywatchlist": "پنھنجي نظرھيٺ فھرست سنواريو",
+       "grant-editmywatchlist": "پنھنجي نظر ۾ فھرست سنواريو",
        "grant-editprotected": "تحفظيل صفحا سنواريو",
        "grant-rollback": "صفحن ۾ ڪيل تبديليون واپس ورايو",
-       "grant-sendemail": "Ù»Ù\8aÙ\86 Ù\8aÙ\88زرس Ú\8fاÙ\86Ù\87Ù\86 Ø§Ù\8aÙ\85Ù\8aل موڪليو",
+       "grant-sendemail": "Ù»Ù\8aÙ\86 Ù\8aÙ\88زرس Ú\8fاÙ\86Ù\87Ù\86 Ø¨Ø±Ù\82ٽپال موڪليو",
        "grant-uploadeditmovefile": "فائيل چاڙهيو، مَٽايو، ۽ ڊاهيو",
        "grant-uploadfile": "نئون فائيل چاڙهيو",
        "grant-basic": "بنيادي حقَ",
        "grant-viewdeleted": "ڊَٺَلَ فائيلَ ۽ صفحا ڏسو",
        "grant-viewmywatchlist": "پنهنجي نظرھيٺ فھرست ڏسو",
-       "newuserlogpage": "يوزر کاتن جو لاگ",
+       "newuserlogpage": "يوزر تخليق لاگ",
        "rightslog": "يُوزر حق لاگ",
        "action-read": "هي صفحو پڙهو",
        "action-edit": "هن صفحي کي سسنواريو",
        "action-movefile": "هيءُ فائيل چوريو",
        "action-upload": "هيءُ فائيل چاڙهيو",
        "action-delete": "هيءُ صفحو ڊاهيو",
-       "action-deleterevision": "هيءُ ڀيرو ڊاهيو",
-       "action-deletedhistory": "هن صفحي جي ڊاٺ سوانح ڏسو",
+       "action-deleterevision": "ڀيرا ڊاھيو",
+       "action-deletedhistory": "ڪنھن صفحي جي ڊاھ سوانح ڏسو",
        "action-browsearchive": "ڊاٺل صفحن ۾ ڳوليو",
-       "action-undelete": "هيءُ صفحو اڻڊاهيو",
-       "action-suppressrevision": "Ù\87Ù\86 Ù\84ÚªÙ\8aÙ\84 Ú\80Ù\8aرÙ\8a تي نظرثاني ڪريو ۽ بحاليو",
+       "action-undelete": "صفحا اڻڊاھيو",
+       "action-suppressrevision": "Ù\84ÚªÙ\8aÙ\84 Ú\80Ù\8aرÙ\86 تي نظرثاني ڪريو ۽ بحاليو",
        "action-suppressionlog": "هيءُ ذاتي لاگ ڏسو",
        "action-block": "هن يُوزر کي سنوارڻ کان روڪيو",
        "action-protect": "هن صفحي جي تحفظاتي سطح بدلايو",
        "action-userrights": "سڀ يوزر حق ترميم ڪريو",
        "action-userrights-interwiki": "ٻين وڪيز جي يوزرس جا حق ترميم ڪريو",
        "action-siteadmin": "اعدادخاني کي بند ڪريو يا کوليو",
-       "action-sendemail": "برق ٽپال اماڻيو",
-       "action-editmywatchlist": "پنھنجي نظرھيٺ فھرست سنواريو",
-       "action-viewmywatchlist": "پنهنجي نظرھيٺ فھرست ڏسو",
+       "action-sendemail": "برقٽپال اماڻيو",
+       "action-editmywatchlist": "پنھنجي نظر ۾ فھرست سنواريو",
+       "action-viewmywatchlist": "پنهنجي نظر ۾ فھرست ڏسو",
        "action-viewmyprivateinfo": "پنهنجي ذاتي معلومات ڏسو",
        "action-editmyprivateinfo": "پنهنجي ذاتي معلومات سنواريو",
        "nchanges": "$1 {{PLURAL:$1|تبديلي|تبديليون}}",
        "enhancedrc-history": "سوانح",
        "recentchanges": "تازيون تبديليون",
        "recentchanges-legend": "تازين تبديلين جا چارا",
-       "recentchanges-summary": "هن صفحي تي وڪيءَ ۾ ڪيل تازيون ترين ترميمون ڏيکاريو.",
+       "recentchanges-summary": "ھن صفحي تي وڪيءَ ۾ ڪيل تازيون ترين ترميمون ڏيکاريو.",
        "recentchanges-feed-description": "ۡهن روان رسد ۾ آيل تازيون تبديليون لهو",
        "recentchanges-label-newpage": "هن ترميم سان نئون صفحو جڙيو",
-       "recentchanges-label-minor": "هيء هڪ معمولي ترميم آهي",
-       "recentchanges-label-bot": "هيءُ ترميم بوٽ عمل ۾ آندي.",
+       "recentchanges-label-minor": "ھيءَ ھڪ معمولي ترميم آھي",
+       "recentchanges-label-bot": "ھيءَ ترميم بوٽ عمل ۾ آندي",
        "recentchanges-label-unpatrolled": "ھن ترميم جو اڃان گشت نہ ڪيو ويو آھي",
-       "recentchanges-label-plusminus": "هن صفحي جي ماپ ۾ هيترين بائيٽس جو ڦير آيو آهي",
+       "recentchanges-label-plusminus": "ھن صفحي جي ماپ ۾ ھيترين بائيٽس جو ڦير آيو آھي",
        "recentchanges-legend-heading": "<strong>ڪنجي:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فهرست]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فھرست]])",
        "recentchanges-submit": "ڏيکاريو",
        "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
        "rclistfrom": "$2، $3 کان شروع ٿيندڙ نيون تبديليون ڏيکاريو",
        "rcshowhidecategorization": "$1 صفحاتي زمراڪاري",
        "rcshowhidecategorization-show": "ڏيکاريو",
        "rcshowhidecategorization-hide": "لڪايو",
-       "rclinks": "پوين $2 ڏينهن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
+       "rclinks": "پوين $2 ڏينھن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
        "diff": "تفاوت",
        "hist": "سوانح",
        "hide": "لڪايو",
        "boteditletter": "گ",
        "number_of_watching_users_pageview": "[$1، {{PLURAL:$1|يُوزر|يُوزرس}} کي ٽيٽيندي]",
        "rc_categories_any": "چونڊيلن مان ڪو بہ",
-       "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کان پوءِ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کانپوءِ",
        "newsectionsummary": "/* $1 */ نئون سيڪشن",
        "rc-enhanced-expand": "تفصيل ڏيکاريو",
        "rc-enhanced-hide": "تفصيل لڪايو",
        "recentchangeslinked-title": "\"$1\" سان لاڳاپيل تبديليون",
        "recentchangeslinked-page": "صفحي جو نالو:",
        "recentchangeslinked-to": "رڳو ڄاڻايل صفحي سان ڳانڍيل صفحن ۾ ٿيل تبديليون نمايو",
-       "upload": "فائيل چاڙهيو",
+       "upload": "فائيل چاڙھيو",
        "uploadbtn": "فائيل چاڙهيو",
        "uploadnologin": "داخل ٿيل ناھيو",
        "uploadnologintext": "فائيل چاڙهڻ لاءِ $1.",
        "uploaderror": "چاڙھ چُڪَ",
        "uploadlogpage": "چاڙھ لاگ",
        "filename": "فائيل نانءُ",
-       "filedesc": "Ø®Ù\84اصÙ\88",
+       "filedesc": "تÙ\8eتÙ\8f",
        "fileuploadsummary": "خلاصو:",
        "filereuploadsummary": "فائيل تبديليون:",
        "filesource": "ذريعو:",
-       "ignorewarnings": "وارنڱس کي نظرانداز ڪريو",
+       "ignorewarnings": "چتائن کي نظرانداز ڪريو",
        "badfilename": "فائيل‌نانءُ بدلائي \"$1\" رکيو ويو آهي.",
        "empty-file": "توهان جو جمع ڪرايل فائيل خالي آهي.",
        "filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
        "uploaded-script-svg": "اسڪرپٽ جوڳو ايليمينٽ ”$1” مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾.",
        "uploaded-hostile-svg": "اپلوڊ ٿيل ايس وي جي فائيل جو غير محفوظ سي ايس ايس ۾ اسٽائيل ايلمينٽ مليو",
        "uploaded-event-handler-on-svg": "ايس وي جي فائيل ۾ ايوينٽ هينڊلر خصوصيتون <code>$1=\"$2\"</code> مقرر ڪرڻ جي اجازت نہ آهي.",
-       "uploaded-href-unsafe-target-svg": "href جو غير محفوظ نشانو مليو آهي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
+       "uploaded-href-unsafe-target-svg": "href جو غير محفوظ ڊيٽا: يوآرآءِ نشانو مليو آهي <code>&lt;$1 $2=\"$3\"&gt;</code> چاڙھيل اَيسوِيجِي فائيل ۾",
        "uploaded-animate-svg": "”اينيميٽ“ ٽيگ ڳوليو  جيڪا ٿي سگهي ٿو href کي تبديل ڪري رهي هجي. \"form\" وصف استعمال ڪندي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
        "uploaded-setting-event-handler-svg": "واقعي کي هينڊل ڪندڙ جي سيٽنگ جون وصفون بلاڪ ٿيل آهن. \n<code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
        "uploaded-setting-href-svg": "\"set\"  ٽيگ کي \"href\" وصف استعمال ڪندي بنيادي عنصر کي بلاڪ ڪيو ويو آهي",
        "filehist-revert": "واپس ورايو",
        "filehist-current": "حاليہ",
        "filehist-datetime": "تاريخ/وقت",
-       "filehist-thumb": "آڱوٺي ننهن",
+       "filehist-thumb": "آڱوٺي ننھن",
        "filehist-thumbtext": "$1 جي نظرثاني لاءِ تصويري نشان",
        "filehist-nothumb": "ٽِڪِلِي اڻموجود",
        "filehist-user": "يُوزر",
        "filehist-dimensions": "ماپَ",
        "filehist-filesize": "فائيل سائيز",
-       "filehist-comment": "تاثرات",
+       "filehist-comment": "تاثر",
        "imagelinks": "فائيل جو استعمال",
-       "linkstoimage": "هن فائيل سان {{PLURAL:$1|هيٺيون صفحو ڳنڍيل آهي |$1 هيٺيان صفحا ڳنڍيل آهن}}:",
+       "linkstoimage": "ھن فائيل سان {{PLURAL:$1|ھيٺيون صفحو ڳنڍيل آھي |$1 ھيٺيان صفحا ڳنڍيل آھن}}:",
        "nolinkstoimage": "هن فائيل سان ڪي بہ صفحا ڳنڍيل ناهن.",
        "sharedupload": "هيءَ فائيل $1 کان آهي ۽ ان کي ٻيون رٿائون به استعمال ڪري سگھن ٿيون.",
-       "sharedupload-desc-here": "هي فائيل $1 مان آهي ۽ ٻين رٿائن پاران پڻ استعمال ٿي سگهي ٿو. تشريح انجي [[$2 جو تشريحي صفحو]] هيٺان ڏنل آهي.",
+       "sharedupload-desc-here": "ھي فائيل $1 مان آھي ۽ ٻين رٿائن پاران پڻ استعمال ٿي سگھي ٿو. تشريح انجي [[$2 جو تشريحي صفحو]] ھيٺان ڏنل آھي.",
        "uploadnewversion-linktext": "هن فائيل جو نئون پرت چاڙهيو",
        "shared-repo-from": "$1 کان",
-       "upload-disallowed-here": "توهان هن فائيل مٿان لکي نہ ٿا سگھو.",
+       "shared-repo-name-wikimediacommons": "وڪيميڊيا ڪامنز",
+       "upload-disallowed-here": "توھان ھن فائيل مٿان لکي نہ ٿا سگھو.",
        "filerevert-comment": "سبب:",
        "filerevert-submit": "واپس ورايو",
        "filedelete": "$1 کي ڊاهيو",
        "statistics-articles": "موادي صفحا",
        "statistics-pages": "صفحا",
        "statistics-files": "چاڙهيل فائيل",
+       "statistics-edits": "{{SITENAME}} جي ٺھڻ کان صفحن ۾ ڪيل سموريون ترميمون",
        "statistics-edits-average": "سراسري ترميمون في صفحو",
        "statistics-users": "کاتيدار [[Special:ListUsers|يُوزرس]]",
        "statistics-users-active": "سرگرم يُوزرس",
        "sp-deletedcontributions-contribs": "ڀاڱيداريون",
        "linksearch-ns": "نانءُپولار",
        "linksearch-ok": "ڳوليو",
+       "listusersfrom": "تي شروع ڪندڙ يوزر ڏيکاريو:",
        "listusers-submit": "ڏيکاريو",
        "listusers-noresult": "ڪو بہ يُوزر نہ لڌو",
        "listusers-blocked": "(بندشيل)",
        "activeusers": "سرگرم يُوزرس جي فهرست",
+       "activeusers-groups": "گروھن سان تعلق رکندڙ يوزرس ڏيکاريو:",
+       "activeusers-excludegroups": "گروھن سان تعلق رکندڙ گروھ ڇڏيو:",
        "activeusers-noresult": "ڪي بہ يُوزرس نہ لڌا.",
        "activeusers-submit": "سرگرم يُوزرس ڏيکاريو",
        "listgrouprights": "يوزر گروپ جا حق",
        "listgrouprights-group": "گروهہ:",
        "listgrouprights-rights": "حق",
-       "listgrouprights-members": "(رڪÙ\86Ù\86 Ø¬Ù\8a Ù\84سٽ)",
+       "listgrouprights-members": "(رڪÙ\86Ù\86 Ø¬Ù\8a Ù\81ھرست)",
        "listgrouprights-addgroup-all": "سڀ گروپَ شامل ڪريو",
        "listgrouprights-removegroup-all": "سڀ گروپ هٽايو",
        "listgrouprights-namespaceprotection-namespace": "نانءُ پولار:",
        "emailsubject": "موضوع:",
        "emailmessage": "نياپو:",
        "emailsend": "اماڻيو",
-       "emailccme": "نياپي جو پرت مون کي برق ٽپال ڪريو.",
-       "emailsent": "برق ٽپال اماڻجي چڪي",
-       "emailsenttext": "توهان جو برق ٽپال نياپو اماڻجي چڪو آهي.",
-       "watchlist": "نظرھيٺ فھرست",
-       "mywatchlist": "نظرھيٺ فھرست",
-       "addwatch": "نظرھيٺ فھرست ۾ شامل ڪريو",
-       "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|نظرھيٺ فھرست]] ۾ شامل ڪيو ويو آهي.",
-       "removewatch": "نظرھيٺ فھرست مان ھٽايو",
-       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|نظرھيٺ فھرست]] مان هٽي چڪو آهي.",
-       "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي نظرھيٺ فھرست مان هٽي چڪو آهي.\"",
-       "watch": "نظرھيٺ رکو",
-       "watchthispage": "هيءُ صفحو نظرھيٺ رکو",
-       "unwatch": "نظرھيٺ نہ رکو",
-       "unwatchthispage": "نظرھيٺ رکڻ ڇڏيو",
+       "emailccme": "نياپي جو پرت مون کي برقٽپال ڪريو.",
+       "emailsent": "برقٽپال اماڻجي چڪي",
+       "emailsenttext": "توهان جو برقٽپال نياپو اماڻجي چڪو آهي.",
+       "watchlist": "نظر ۾ فھرست",
+       "mywatchlist": "نظر ۾ فھرست",
+       "addwatch": "نظر ۾ فھرست ۾ شامل ڪريو",
+       "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|نظر ۾ فھرست]] ۾ شامل ڪيو ويو آهي.",
+       "removewatch": "نظر ۾ فھرست مان ھٽايو",
+       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|نظر ۾ فھرست]] مان هٽي چڪو آهي.",
+       "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي نظر ۾ فھرست مان هٽي چڪو آهي.\"",
+       "watch": "نظر ۾ رکو",
+       "watchthispage": "هيءُ صفحو نظر ۾ رکو",
+       "unwatch": "نظر ۾ نہ رکو",
+       "unwatchthispage": "نظر ۾ رکڻ ڇڏيو",
        "notanarticle": "غير موادي صفحو",
        "watchlist-details": "{{PLURAL:$1|$1 صفحو|$1 صفحا}} توهان جي ٽيٽ فهرست، ڳالھ ٻولھ جا صفحا الڳ شمار نٿا ٿين.",
        "wlshowlast": "گذريل $1 ڪلاڪ $2 ڏينهن ڏيکاريو",
        "wlshowhideliu": "کاتيدار يُوزرس",
        "wlshowhideanons": "گمنام يُوزرس",
        "wlshowhidemine": "منهنجون ترميمون",
-       "watchlist-options": "نظرھيٺ فھرست جا چارا",
-       "watching": "نظرھيٺ رکندي...",
-       "unwatching": "نظرھيٺان ڪڍندي...",
+       "watchlist-options": "نظر ۾ فھرست جا چارا",
+       "watching": "نظر ۾ رکندي...",
+       "unwatching": "نظر مان ڪڍندي...",
        "enotif_reset": "سڀ گھميل صفحن تي نشان لڳايو",
        "enotif_impersonal_salutation": "{{SITENAME}} يُوزر",
        "enotif_lastdiff": "هي تبديلي ڏسڻ لاءِ $1 ڏسو",
        "delete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
        "rollback": "ترميمن کي واپس ورايو",
        "rollbacklink": "واپس ورايو",
-       "rollbacklinkcount": "اڻ ڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
+       "rollbacklinkcount": "اڻڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
        "changecontentmodel-title-label": "صفحي جو عنوان",
        "changecontentmodel-reason-label": "سبب:",
        "logentry-contentmodel-change-revertlink": "واپس ورايو",
        "undelete-search-submit": "ڳوليو",
        "undelete-error-short": "هيءُ فائيل اڻڊاهيندي چُڪَ ٿي آهي: $1",
        "undelete-show-file-submit": "ها",
-       "namespace": "نانءُ پولار:",
+       "namespace": "نانءُپولار:",
        "invert": "چونڊ ابتيو",
-       "tooltip-invert": "هن دٻي تي نشان لڳايو صحفن ۾ تبديليون لڪائڻ لاءِ چونڊيل نيم اسپيس مان (۽ لاڳاپيل نيم اسپيس جيڪڏهن نشان لڳل)",
+       "tooltip-invert": "هن دٻي تي نشان لڳايو صحفن ۾ تبديليون لڪائڻ لاءِ چونڊيل نانءَپولار مان (۽ لاڳاپيل نانءُپولار جيڪڏهن نشان لڳل)",
        "namespace_association": "منسلڪ نانءُپولار",
        "blanknamespace": "(مُک)",
        "contributions": "{{GENDER:$1|يوزر}} جون ڀاڱيداريون",
        "contribsub2": "{{GENDER:$3|$1}} ($2) لاءِ",
        "contributions-userdoesnotexist": "يُوزر کاتو \"$1\" درج ٿيل نہ آهي.",
        "uctop": "(هاڻوڪو)",
-       "month": "مهيني کان (۽ اڳوڻيون):",
+       "month": "مھيني کان (۽ اڳوڻيون):",
        "year": "سال کان (۽ اڳوڻيون):",
        "sp-contributions-newbies": "صرف نون کاتن جون ڀاڱيداريون ڏيکاريو",
        "sp-contributions-newbies-sub": "نون کاتن لاءِ",
        "sp-contributions-username": "آءِپي پتو يا يوزرنانءُ:",
        "sp-contributions-submit": "ڳوليو",
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
-       "whatlinkshere-title": "$1 سان ڳنڍيل صفحا",
+       "whatlinkshere-title": "\"$1\" سان ڳنڍيندڙ صفحا",
        "whatlinkshere-page": "صفحو:",
        "linkshere": "هيٺيان صفحا <strong>[[:$1]]</strong> سان ڳنڍيل آهن:",
        "nolinkshere": "'''[[:$1]]''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
        "blocklink": "بندشيو",
        "unblocklink": "اڻبندشيو",
        "contribslink": "ڀاڱيداريون",
-       "emaillink": "برق ٽپال اماڻيو",
+       "emaillink": "برقٽپال اماڻيو",
        "blocklogpage": "بندش لاگ",
        "blocklogentry": "\"[[$1]]\" کي بندشيو ويو $2 $3 جي عرصي لاء",
        "unblocklogentry": "$1 تان بندش هٽائي وئي",
        "block-log-flags-anononly": "فقط نامعلوم يوزرس",
-       "block-log-flags-noemail": "برق ٽپال غير فعال",
+       "block-log-flags-noemail": "برقٽپال غير فعال",
        "block-log-flags-hiddenname": "لڪل يُوزرنانءُ",
        "ipb_already_blocked": "\"$1\" اڳ ۾ ئي بندشيل آهي.",
        "ipbnounblockself": "توهان پنهنجو پاڻ تان بندش هٽائي نہ ٿا سگھو.",
        "importlogpage": "درآمد لاگ",
        "tooltip-pt-userpage": "{{GENDER:|توھانجو يوزر}} صفحو",
        "tooltip-pt-mytalk": "{{GENDER:|توھانجو}} يوزر صفحو",
-       "tooltip-pt-preferences": "{{GENDER:|توھانجون}} ترجيحات",
-       "tooltip-pt-watchlist": "تÙ\88ھاÙ\86 Ø¬Ù\8a ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\86 Ø¬Ù\8a Ù\86ظرھÙ\8aÙº ØµÙ\81Ø­Ù\86 Ø¬Ù\8a Ù\81ھرست",
+       "tooltip-pt-preferences": "{{GENDER:|توھانجون}} ترجيحون",
+       "tooltip-pt-watchlist": "صÙ\81Ø­Ù\86 Ø¬Ù\8a Ù\81ھرست Ø¬Ù\8aÚªÙ\8a ØªÙ\88ھاÙ\86 ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\86 Ù\84اءÙ\90 Ù\86ظر Û¾ Ø±Ú©Ù\8aا Ø¢Ú¾Ù\86",
        "tooltip-pt-mycontris": "{{GENDER:|توھانجي}} ڀاڱيدارين جي فھرست",
        "tooltip-pt-login": "توھان کي ھمٿائجي ٿو تہ توهان داخل ٿيو؛ بھرحال، اھو لازمي ناھي",
-       "tooltip-pt-logout": "ٻاھر نڪرو",
+       "tooltip-pt-logout": "خارج ٿيو",
        "tooltip-pt-createaccount": "کاتو کولڻ ۽ داخل ٿيڻ تي توھان کي ھمٿايو وڃي ٿو؛  جيتوڻيڪ، اهو ضروري ناھي",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
        "tooltip-ca-edit": "هيءُ صفحو سنواريو",
        "tooltip-ca-addsection": "نئون سيڪشن شروع ڪريو",
-       "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي.\nتوهان ان جو ذريعو ڏسي سگھو ٿا",
-       "tooltip-ca-history": "هن صفحي جا اڳوڻا ڀيرا",
+       "tooltip-ca-viewsource": "ھيءُ صفحو تحفظيل آھي.\nتوھان ان جو ذريعو ڏسي سگھو ٿا",
+       "tooltip-ca-history": "ھن صفحي جا اڳوڻا ڀيرا",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-delete": "هيءُ صفحو ڊاهيو",
-       "tooltip-ca-move": "هيءُ صفحو چوريو",
-       "tooltip-ca-watch": "هيءُ صفحو پنهنجي نظرھيٺ فھرست ۾ شامل ڪريو",
-       "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي نظرھيٺ فھرست تان هٽايو",
+       "tooltip-ca-move": "ھيءُ صفحو چوريو",
+       "tooltip-ca-watch": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪريو",
+       "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي نظر ۾ فھرست تان هٽايو",
        "tooltip-search": "{{SITENAME}} ۾ ڳوليو",
-       "tooltip-search-go": "تز ان ئي نالي سان ڪو صفحو موجود آهي تہ کوليو",
-       "tooltip-search-fulltext": "هن متن لاءِ صفحا ڳوليو",
+       "tooltip-search-go": "تز ان ئي نالي سان ڪو صفحو موجود آھي تہ کوليو",
+       "tooltip-search-fulltext": "ھن متن لاءِ صفحا ڳوليو",
        "tooltip-p-logo": "مک صفحو گھمو",
        "tooltip-n-mainpage": "مک صفحو گھمو",
        "tooltip-n-mainpage-description": "مک صفحو گھمو",
        "tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
        "tooltip-feed-atom": "هن صفحي لاءِ ايٽم فيڊ",
        "tooltip-t-contributions": "{{GENDER:$1|ھن يوزر}} جي ڀاڱيدارين جي فھرست",
-       "tooltip-t-emailuser": "{{GENDER:$1|Ú¾Ù\86 Ù\8aÙ\88زر}} Ú\8fاÙ\86Ú¾Ù\86 Ø§Ù\8aÙ\85Ù\8aل موڪليو",
+       "tooltip-t-emailuser": "{{GENDER:$1|Ú¾Ù\86 Ù\8aÙ\88زر}} Ú\8fاÙ\86Ú¾Ù\86 Ø¨Ø±Ù\82ٽپال موڪليو",
        "tooltip-t-upload": "فائيل چاڙهيو",
-       "tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
+       "tooltip-t-specialpages": "سڀني خاص صفحن جي فھرست",
        "tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
-       "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانهن مستقل ڳنڍڻو",
+       "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانھن مستقل ڳنڍڻو",
        "tooltip-ca-nstab-main": "مواد جي صفحي کي ڏسو",
-       "tooltip-ca-nstab-user": "هن جو يُوزر صفحو ڏسو",
-       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم ڪري نٿي سگھجي",
+       "tooltip-ca-nstab-user": "ھن جو يُوزر صفحو ڏسو",
+       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم نٿي ڪري سگھجي",
        "tooltip-ca-nstab-project": "رٿائي صفحو ڏسو",
-       "tooltip-ca-nstab-image": "هن فائيل جو صفحو ڏسو",
+       "tooltip-ca-nstab-image": "ھن فائيل جو صفحو ڏسو",
        "tooltip-ca-nstab-template": "سانچو ڏسو",
        "tooltip-ca-nstab-help": "امدادي صفحو ڏسو",
        "tooltip-ca-nstab-category": "هن زمري جو صفحو ڏسو",
        "tooltip-minoredit": "ان کي هڪ معمولي ترميم ڄاڻايو",
-       "tooltip-save": "پنهنجون تبديليون سانڍيو",
+       "tooltip-save": "پنھنجون تبديليون سانڍيو",
        "tooltip-preview": "پنھنجي تبديلين تي نگاھ وجھو. براءِ مھرباني اھو سانڍڻ کان اڳ ڪندا.",
-       "tooltip-diff": "لکت ۾ ڪيل پنهنجون تبديليون ڏسو",
+       "tooltip-diff": "لکت ۾ ڪيل پنھنجون تبديليون ڏسو",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
-       "tooltip-watch": "هيءُ صفحو پنهنجي نظرھيٺ فھرست ۾ شامل ڪريو",
-       "tooltip-rollback": "\"Ù\88اپس Ù¾Ø±Ø§Ù\8aÙ\88\" Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Û¾ Ù¾Ù\88ئÙ\8aÙ\86 Ú\80اڱÙ\8aدار Ø¬Ù\8a ÚªÙ\8aÙ\84 ØªØ±Ù\85Ù\8aÙ\85 (ترÙ\85Ù\8aÙ\85Ù\86) Ú©Ù\8a Ù\87Úª ÚªÙ\84Úª Ø³Ø§Ù\86 Ø§Ú»ÚªØ±Ù\8a Ù¿Ù\88.",
+       "tooltip-watch": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪريو",
+       "tooltip-rollback": "\"Ù\88اپس Ù\88راÙ\8aÙ\88\" Ú¾Ù\86 ØµÙ\81Ø­Ù\8a Û¾ Ù¾Ù\88ئÙ\8aÙ\86 Ú\80اڱÙ\8aدار Ø¬Ù\8a ÚªÙ\8aÙ\84 ØªØ±Ù\85Ù\8aÙ\85\86) Ú©Ù\8a Ú¾Úª Ù½Ú\99Úª Ø³Ø§Ù\86 Ø§Ú»ÚªØ±Ù\8a Ù¿Ù\88",
        "tooltip-summary": "ننڍو خلاصو ڏيو",
        "anonymous": "گمنام {{PLURAL:$1|يوزر|يوزرس}} جو {{SITENAME}}",
+       "simpleantispam-label": "اينٽي-اسپام روڪ.\nھن کي <strong>نہ</strong> ڀريو!",
        "pageinfo-toolboxlink": "صفحي جي معلومات",
        "pageinfo-contentpage-yes": "ها",
        "pageinfo-protect-cascading-yes": "ها",
        "pageinfo-category-subcats": "ذيلي زمرن جو تعداد",
        "pageinfo-category-files": "صفحن جو تعداد",
        "previousdiff": "← اڳوڻي ترميم",
-       "nextdiff": "نئين ترميم-->",
+       "nextdiff": "نئين تر ترميم →",
        "file-info-size": "$1 × $2 عڪسلون، فائيل سائيز: $3، MIME ٽائيپ: $4",
-       "file-nohires": "اڃا سنهو تحلل ميسر ناهي.",
-       "svg-long-desc": "ايس وي جي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
+       "file-nohires": "اڃان سنھو تحلل ميسر ناھي.",
+       "svg-long-desc": "ايسويجي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
        "show-big-image": "اصلوڪو فائيل",
        "show-big-image-preview": "هن پيش نگاھ جي ماپ: $1",
        "show-big-image-other": "ٻيا {{PLURAL:$2|تحلل}}:$1",
        "metadata": "اعدادِ اعداد",
        "metadata-expand": "توسيعي تفصيل ڏيکاريو",
        "metadata-collapse": "توسيعي تفصيل لڪايو",
-       "metadata-fields": "اÙ\85Ù\8aج Ø¬Ù\8a Ù\85Ù\8aٽا Ú\8aÙ\8aٽا Ù\81Ù\8aÙ\84Ú\8a Ù\84سٽ ÚªÙ\8aÙ\84 Ø¢Ù\87Ù\8a Ù\87Ù\86 Ù¾Ù\8aغاÙ\85 Û¾ Ø¬Ù\8aÚªÙ\88 Ø´Ø§Ù\85Ù\84 ÚªÙ\8aÙ\88 Ù\88Ù\8aÙ\86دÙ\88 Ø§Ù\85Ù\8aج جي صفحي جي ڊسپلي تي، جڏهن ميٽا ڊيٽا جي ٽيبل ختم ٿيندي، ٻيا طئي ٿيل طريقي سان لڪل هوندا. \n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "عڪس Ø¬Ù\8a Ù\85Ù\8aٽا Ú\8aÙ\8aٽا Ù\81Ù\8aÙ\84Ú\8a Ù\84سٽ ÚªÙ\8aÙ\84 Ø¢Ù\87Ù\8a Ù\87Ù\86 Ù¾Ù\8aغاÙ\85 Û¾ Ø¬Ù\8aÚªÙ\88 Ø´Ø§Ù\85Ù\84 ÚªÙ\8aÙ\88 Ù\88Ù\8aÙ\86دÙ\88 Ø¹ÚªØ³ جي صفحي جي ڊسپلي تي، جڏهن ميٽا ڊيٽا جي ٽيبل ختم ٿيندي، ٻيا طئي ٿيل طريقي سان لڪل هوندا. \n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "ويڪر",
        "exif-imagelength": "اوچائي",
        "exif-bitspersample": "ٻٽڻيون في جُز",
        "exif-disclaimer": "غيرجوابدارينامو",
        "exif-copyrighted-true": "حق ۽ واسطا محفوظيل",
        "exif-unknowndate": "نامعلوم تاريخ",
-       "exif-orientation-1": "نارمل",
+       "exif-orientation-1": "رواجي",
        "exif-orientation-3": "180° موڙيل",
        "exif-componentsconfiguration-0": "وجود نہ ٿو رکي",
        "exif-exposureprogram-1": "دستينامو",
        "exif-saturation-0": "نارمل",
        "exif-saturation-1": "ننڍ رچاءُ",
        "exif-saturation-2": "وَڏ رچاءُ",
-       "exif-sharpness-0": "نارمل",
+       "exif-sharpness-0": "رواجي",
        "exif-subjectdistancerange-0": "نامعلوم",
        "exif-subjectdistancerange-3": "ڏورانهين نگاهہ",
        "exif-gpslatitude-s": "ڏاکڻي ويڪرائي ڦاڪَ",
        "exif-iimcategory-wea": "موسم",
        "namespacesall": "سڀ",
        "monthsall": "سڀ",
-       "confirmemail": "برق ٽپال پتي جي پَڪَ ڪندا",
+       "confirmemail": "برقٽپال پتي جي پَڪَ ڪندا",
        "confirmemail_send": "خاطري ڪوڊ اماڻيو",
-       "confirmemail_sent": "خاطري برق ٽپال اماڻي وئي.",
-       "confirmemail_success": "توهان جي برق ٽپال پتي جي تصديق ڪئي وئي آهي.\nهاڻ توهان [[Special:UserLogin|لاگ اِن]] ٿي ۽ وڪي جو مزو وٺي سگھو ٿا.",
-       "confirmemail_loggedin": "توهان جي برق ٽپال پتي جي تصديق هاڻي ٿي چڪي آهي.",
-       "confirmemail_subject": "{{SITENAME}} برق ٽپال پتي جي تصديق",
+       "confirmemail_sent": "خاطري برقٽپال اماڻي وئي.",
+       "confirmemail_success": "توهان جي برقٽپال پتي جي تصديق ڪئي وئي آهي.\nهاڻ توهان [[Special:UserLogin|داخل ٿي]] ۽ وڪي جو مزو وٺي سگھو ٿا.",
+       "confirmemail_loggedin": "توهان جي برقٽپال پتي جي تصديق هاڻي ٿي چڪي آهي.",
+       "confirmemail_subject": "{{SITENAME}} برقٽپال پتي جي تصديق",
        "recreate": "ورسرجيو",
        "confirm-watch-button": "ٺيڪ",
-       "confirm-watch-top": "هيءُ صفحو پنهنجي نظرھيٺ فھرست ۾ شامل ڪندا؟",
+       "confirm-watch-top": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪندا؟",
        "confirm-unwatch-button": "ٺيڪ",
-       "confirm-unwatch-top": "Ù\87Ù\8aØ¡Ù\8f ØµÙ\81Ø­Ù\88 Ù¾Ù\86Ù\87Ù\86جÙ\8a Ù½Ù\8aÙ½ فهرست مان هٽائيندا؟",
+       "confirm-unwatch-top": "Ù\87Ù\8aØ¡Ù\8f ØµÙ\81Ø­Ù\88 Ù¾Ù\86Ù\87Ù\86جÙ\8a Ù\86ظر Û¾ فهرست مان هٽائيندا؟",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← اڳوڻو صفحو",
        "imgmultipagenext": "ايندڙ صفحو →",
        "table_pager_limit_label": "وَٿُون في صفحو:",
        "table_pager_limit_submit": "ھلو",
        "table_pager_empty": "ڪو بہ نتيجو نہ مليو",
-       "watchlistedit-normal-title": "نظرھيٺ فھرست کي سنواريو",
+       "watchlistedit-normal-title": "نظر ۾ فھرست کي سنواريو",
        "watchlistedit-raw-titles": "عنوانَ:",
        "watchlistedit-clear-titles": "عنوانَ:",
        "watchlisttools-view": "لاڳاپيل تبديليون ڏسو",
-       "watchlisttools-edit": "Ù½Ù\8aÙ½ فهرست ڏسو ۽ سنواريو",
-       "watchlisttools-raw": "ÚªÚ\86Ù\8a Ù½Ù\8aÙ½ Ù\81Ù\87رست سنواريو",
+       "watchlisttools-edit": "Ù\86ظر Û¾ فهرست ڏسو ۽ سنواريو",
+       "watchlisttools-raw": "ÚªÚ\86Ù\8a Ù\86ظر Û¾ Ù\81Ú¾رست سنواريو",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالھ]])",
        "version": "ڀيرو",
        "version-extensions": "تنصيب شده توسيعات",
        "fileduplicatesearch-submit": "ڳوليو",
        "specialpages": "خاص صفحا",
        "specialpages-note-top": "ڪُنجي",
-       "specialpages-group-login": "لاگ اِن ٿيو / کاتو کوليو",
+       "specialpages-group-login": "داخل ٿيو / کاتو کوليو",
        "specialpages-group-users": "يوزرس ۽ حق",
        "blankpage": "خالي صفحو",
        "intentionallyblankpage": "هيءُ صفحو ڄاڻي خالي ڇڏيو ويو آهي.",
        "htmlform-cloner-create": "ٻيا بہ شامل ڪريو",
        "htmlform-cloner-delete": "هٽايو",
        "htmlform-title-not-exists": "$1 وجود نٿو رکي.",
-       "logentry-delete-delete": "$1 {{GENDER:$2|Ú\8aاٺو}} صفحو $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|Ú\8aاٿو}} صفحو $3",
        "revdelete-uname-hid": "يُوزرنانءُ لڪل",
        "logentry-move-move": "$1 {{GENDER:$2|چوريو}} صفحو $3 ڏانهن $4",
        "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "feedback-submit": "جمع ڪرايو",
        "feedback-thanks-title": "توهان جي مهرباني!",
        "searchsuggest-search": "ڳوليو {{SITENAME}}",
-       "api-error-filename-tooshort": "فائيل‌نانءَُ هيڪاندو ننڍو آهي.",
-       "api-error-unclassified": "ڪا اڻجاتل چُڪَ واقع ٿي.",
-       "api-error-unknown-code": "اڻڄاتل چُڪَ: \"$1\".",
        "api-error-unknown-warning": "اڻڄاتل چتاءُ: \"$1\".",
        "api-error-unknownerror": "اڻڄاتل چُڪَ: \"$1\".",
        "expand_templates_output": "نتيجو",
index 86d1f66..5676eee 100644 (file)
@@ -81,6 +81,7 @@
        "mypage": "پەڕە",
        "mytalk": "وەتوویش",
        "navigation": "ڕێدەرکردن",
+       "and": "&#32;و",
        "qbfind": "پیا بکە",
        "qbbrowse": "بگەرد",
        "qbedit": "وێراشتە",
        "actions": "کردارەگان",
        "namespaces": "شوونناوەگان",
        "variants": "شێوەزارەگان",
+       "navigation-heading": "منۆێ ڕێدەرکردن",
        "errorpagetitle": "غەڵەت",
        "returnto": "بەورەو ئڕاێ $1.",
+       "tagline": "لە {{SITENAME}}",
        "help": "یارمەتی",
        "search": "مینە",
        "searchbutton": "مینە",
        "jumptonavigation": "ڕێدەرکردن",
        "jumptosearch": "مینە",
        "aboutsite": "سەبارەت وە {{SITENAME}}",
+       "aboutpage": "Project:لەوارەی",
        "copyrightpage": "{{ns:project}}:مافەیل لەوەرگرتن",
        "currentevents": "ڕووداوەیل ئێرەنگەیی",
        "currentevents-url": "Project:ڕووداوەیل ئێرەنگەیی",
        "nstab-mediawiki": "پەیام",
        "nstab-help": "پەڕەێ کۆمەک",
        "nstab-category": "پول",
+       "mainpage-nstab": "دەسپێک",
        "missing-article": "دەیتابەیسەگە نەتۊەنست دەق پەڕەێگ وە ناو «$1» $2 پێیابکەێد ک ئەشێ پێیابکردیاتاد.\n\nئیە فرەتر لە مدووێ وەدۊاچین بەستیارێگ جیاواز یادیرۆک کۆنەێ پەڕەێگ سڕیاێ ڕوو دەێد.\n\nئەگەر لەێوا نیە، ئەوە گەھا گرفتێگ لەێ نەرمامێرە پێیاکردیەسە.\nتکایە ئیە وە ئاماژەدان وە ناونیشان URLـەگەیەو وە [[Special:ListUsers/sysop|وەڕێوەوەرێگ]] ڕاپۆرت بدە.",
        "missingarticle-rev": "(نسخە#: $1)",
        "badtitle": "ناونیشان خراو",
        "loginlanguagelabel": "زوان: $1",
        "pt-login": "بچووە ناو",
        "pt-login-button": "بچووە ناو",
+       "pt-createaccount": "ھەژمار درس بکە",
        "oldpassword": "تێپەڕوشەێ قەدیمی:",
        "newpassword": "تێپەڕوشەێ نوو:",
        "retypenew": "تێپەڕوشەێ نوو دوبارە بنۊسەو:",
        "searchprofile-images-tooltip": "مینە ئڕاێ پەڕگەگان",
        "searchprofile-everything-tooltip": "لە گشت ناوەرۆکێگ مینە بکە (تەنانەت پەڕەگان وتوویشیش)",
        "searchprofile-advanced-tooltip": "مینە لەناو شوونناوە دڵخوازەگان",
+       "search-result-size": "$1 ({{PLURAL:$2|یەک وشە|$2 وشە}})",
        "search-redirect": "(ڕەوانەکەر $1)",
        "search-section": "(بەش $1)",
        "search-suggest": "ئایا مەبەستت ئیە بۊ: $1",
        "group-all": "(گشت)",
        "right-read": "خوەنین پەڕەگان",
        "right-edit": "وێراشتەکردن پەڕەگان",
+       "right-writeapi": "ئەوکاربردن API ئەڕاێ نۊساین",
        "newuserlogpage": "پێرست درسکردن ئەوکاربەر",
        "action-edit": "ئەی پەڕە وێراشتە بکە",
        "nchanges": "$1 {{PLURAL:$1|گووڕانکاری}}",
        "rcshowhidepatr": "وێراشتە نەگەردیاێەگان $1",
        "rcshowhidemine": "وێراشتەگانم $1",
        "rclinks": "دۊایین $1 گووڕانکاری $2 ڕووژ ویەردە نیشان بدە<br />$3",
+       "diff": "جیاوازی",
        "hist": "دیرۆک",
        "hide": "بشارەو",
        "minoreditletter": "بێجگە",
+       "newpageletter": "ن",
+       "boteditletter": "بۆت",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گووڕانکاری",
        "rc-enhanced-expand": "وردەکاریەگان نیشان بدە",
        "rc-enhanced-hide": "وردەکاریەگان بشارەو",
        "recentchangeslinked": "گووڕانکاریە پەیوەندیدارەگان",
        "statistics-pages": "پەڕەیل",
        "pageswithprop-submit": "بچوو",
        "brokenredirects-edit": "وێراشتە",
+       "nbytes": "$1 {{PLURAL:$1|بایت|بایت}}",
        "prefixindex": "گشت پەڕەگان وە پێشگرەو",
        "protectedpages-page": "پەڕە",
        "protectedpages-unknown-timestamp": "نەناسریاێ",
        "undelete-show-file-submit": "بەڵێ",
        "namespace": "شوونناوەگان",
        "invert": "ھەڵوژیاێەگان وەزێزەو بکە",
+       "blanknamespace": "(سەرەکی)",
        "contributions": "بەشدارییەگان {{GENDER:$1|ئەوکاربەر}}",
        "contributions-title": "بەشداریەگان ئەوکاربەر $1",
        "mycontris": "بەشداریەیل",
        "tooltip-pt-mycontris": "پێرست بەشداریەیلت",
        "tooltip-pt-login": "پێشنیار ئەوپیت کریەێد بچیدە ناو؛ ھەرچەن زووری نیە",
        "tooltip-pt-logout": "دەرچین",
+       "tooltip-pt-createaccount": "داوەت لەلیت بووت ک ھەژمارێگ درس بکەیت و بچیتە ناو، هەرچەن ئیە وە مەیل خوەتە",
        "tooltip-ca-talk": "وەتوویش سەبارەت وە ناوەڕۆک پەڕە",
        "tooltip-ca-edit": "تۊەنی وێراشتەێ ئەی پەڕەیە بکەید. تکایە وەر لە پاشدەسکردن دوگمەێ پێشدۊنن ئەوکاربوەێن.",
        "tooltip-ca-addsection": "بەشێگ نوو دەس پی بکە",
        "tooltip-feed-atom": "خواردەمەنی ئەتۆم ئڕاێ ئەی پەڕە",
        "tooltip-t-contributions": "پێرست بەشداریەگان ئەی ئەوکاربەر",
        "tooltip-t-emailuser": "ئیمەیلێگ بنارە ئڕاێ ئەی ئەوکاربەرە",
+       "tooltip-t-upload": "پەڕگەێگ بار بکە",
        "tooltip-t-specialpages": "پێرست گشت پەڕە تایوەتەگان",
        "tooltip-t-print": "نسخەێ چاپی ئەی پەڕە",
        "tooltip-t-permalink": "بەسیار ھەمیشەیی وە ئەی وەشان لە ئەی پەڕە",
        "tooltip-ca-nstab-main": "دۊنن پەڕەێ ناوەڕۆک",
        "tooltip-ca-nstab-user": "پەڕەێ ئەوکاربەر تەماشا بکە",
-       "tooltip-ca-nstab-special": "ئیە پەڕەێگ تایبەتە، نیەتۊەنی خوەێ ئەی پەڕە وێراشتە بکەید",
+       "tooltip-ca-nstab-special": "ئیە پەڕەێگ تایبەتە و وێراشتە نیەکریەێت",
        "tooltip-ca-nstab-project": "دۊنن پەڕەێ پرۆژە",
        "tooltip-ca-nstab-image": "دۊنن پەڕەێ پەڕگە",
        "tooltip-ca-nstab-template": "دۊنن قاڵبەگە",
        "tooltip-rollback": "«گەڕانن» گووڕانکاری/گووڕانکاریەگان ئەی پەڕە وە یەک کرتە گەڕانێدەو ئڕاێ دۊایین بەشداریکەر",
        "tooltip-undo": "«بەتاڵکردن» ئەی گووڕانکاریە گووڕنێدەو و فۆرم وێراشتەکردن لە شێوەی پێشدۊنن وازەو کەێد. ئەی جوورە پووڕێد مدووێگ لە کورتەێ وێراشتە بنۊسریەێد.",
        "tooltip-summary": "کۆرتەێگ لە لی بنۊسە",
+       "pageinfo-toolboxlink": "زانیاری پەڕە",
        "pageinfo-redirectsto-info": "زانیاری",
        "pageinfo-contentpage-yes": "بەڵێ",
        "pageinfo-protect-cascading-yes": "بەڵێ",
        "file-nohires": "رەزۆلوشن سەرتر لەیە لە وەردەستەو نیە.",
        "svg-long-desc": "پەڕگەێ SVG، وە ناو $1 × $2 پیکسڵ، قەوارەێ پەڕگە: $3",
        "show-big-image": "پەڕگەێ رەسەن",
+       "show-big-image-preview": "قەوارەێ ئەی پێشدۊنینە: $1.",
+       "show-big-image-other": "{{PLURAL:$2|ڕزێلووشن|ڕزێلووشنەیل}} تر: $1.",
+       "show-big-image-size": "$1 لە $2 پیکسەڵ",
        "ilsubmit": "مینە",
        "bad_image_list": "فۆرمەت وە شێوەێ خوارەسە:\n\nتەنیا ئەو باوەتەیلە ک پێرست کریانە (واتە ئەو ھێڵەیلە ک وە * دەس پێ کەن) لە وەر چاون.\nیەکەم بەسیار لە سەر ھەر ھێڵێگ، ئەشێ بەسیار فایلێگ خراو بوود.\nگشت بەسیارەگان دۊاێ ئەوە لە ئەو ھێڵە، چۊ نائاسایی(ئستسنا) تیەنە ئەژمار.",
        "metadata": "متادەیتا",
        "specialpages": "پەڕە تایوەتەگان",
        "external_image_whitelist": " #ئەی ھێڵە ھەر وە ئەی جوورە ک ھەس، وەر بدەین<pre>\n#رستە وەنەزمەگان (regular expression) (تەنیا ئەو بەشە کە لە نێوان // جێ گرێد) لە خوارەو بنەین\n#ئیانە وەرد نیشانی ئینترنتی وێنەیل دەرەکی بەسیار دریای (hotlinked) چەترگیەن (تەتبیق دریەن).\n#ئەوانە ک چەترگیانە، چۊ وێنە نیشان دریەن؛ وەگەرنە تەنیا بەسیارێگ وە وێنە نیشان دەریەێد.\n#ئەو ھێڵەیلە وە # دەس پێ کەن، جوور شرۆڤە (comments) گیریەنە وەر چەو\n#ئەی ھێڵەیلە وە گەورە و بۊچگی پیتەگان ھەستیارە (case-insensitive)\n\n#گشت رستە وەنەزمەگان (regex) لە ژۊەر ئەی ھێڵە بنەین. ئەی ھێڵ ھەر وە ئەی جوورە کە ھەس، وەر بدەین</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-newusers-create": "ھەژمار ئەوکاربەری $1 {{GENDER:$2|درس کریا}}",
        "feedback-message": "پەیام:",
-       "searchsuggest-search": "Ù\85Û\8cÙ\86ە",
+       "searchsuggest-search": "Ù\84Û\95 {{SITENAME}} Ù\85Û\8cÙ\86Û\95 Ø¨Ú©ە",
        "expand_templates_ok": "باشە",
        "pagelang-name": "پەڕە",
        "pagelang-language": "زوان",
index c3817d5..687d41f 100644 (file)
        "passwordreset-emaildisabled": "Bataga alhaaley n' ka kaŋ wikiyoo ga.",
        "passwordreset-username": "Goykaw maa:",
        "passwordreset-domain": "Zunbudoo:",
-       "passwordreset-capture": "Cebe batagaa kaŋ hun woo ra?",
-       "passwordreset-capture-help": "Nda war na bataa woo šilbay, batagaa (nda šiiyan šennikufal) ga cebe war se nd'a ga sanbandi goykaa do.",
        "passwordreset-email": "Bataga aderesu:",
        "passwordreset-emailtitle": "Kontu šilbawey {{SITENAME}} ga",
        "passwordreset-emailtext-ip": "Boro foo (sanda war da, nda IP aderesu $1) ceeci ka war\n šenniufaloo barmay {{SITENAME}} ($4) se. Goykaa woo {{PLURAL:$3|kontoo ti}\n kaŋ ga hanga bataga aderesoo woo:\n\n $2\n\n{{PLURAL:$3|Šiiyan šennikufaloo woo|Šiiyan šennikufaley wey}}  ga buu {{PLURAL:$5|zaari foo|zaari}} ra.\nWar ga hima ka huru nda šennifulal taaga dam sohõ. Nda boro waani ka ceeci ka woo tee\n nda war honga war šennikufal žeenaa, nda war ši boona koyne\n ka šennikufal barmay,\n war ga hin ka šaawaroo woo murayy nda soobay ka goy nda war\n šennikufal žeenaa. \\",
        "saveprefs": "Gaabu",
        "restoreprefs": "Tilasu kayandiyaney kul yeeti (dunbey kul ra)",
        "prefs-editing": "Goo ma fasal",
-       "rows": "Sorrawey:",
-       "columns": "Soofey:",
        "searchresultshead": "Ceeci",
        "stub-threshold": "Šiifa <a href=\"#\" class=\"stub\">zaa dobu</a> takari kayandiyan (cebsi hinna) se:",
        "stub-threshold-disabled": "Ga kay",
        "userrights-reason": "Dalil:",
        "userrights-no-interwiki": "War ši nda fonda ka goykaw alhakey fasal wiki tanayaŋ ga.",
        "userrights-nodatabase": "Bayhayhugu $1 ši bara wal'a šii gandaa ra. \\",
-       "userrights-nologin": "War ga hima ka [[Special:UserLogin|huru]] nda juwalkaw kontu ka goykaw alhakey noo.",
-       "userrights-notallowed": "War ši nda fondo ka goykey alhakey dam wala k'i kaa.",
        "userrights-changeable-col": "Kondawey kaŋ war ga hin k'i barmay",
        "userrights-unchangeable-col": "Kondawey kaŋ war ga hin k'i barmay",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Cerehooyan goykaw alhadey barmawey ra! Taare war barmawey guna boryo nd'a tabatandi.",
-       "userrights-removed-self": "War na war alhakey kaa ka timme. Adiši, war ši hin ka duu moɲoo woo koyne.",
        "group": "Konday:",
        "group-user": "Goykey",
        "group-autoconfirmed": "Goykaw boŋtabatantey",
        "right-siteadmin": "Bayrahugoo kufal nd'a feeri",
        "right-override-export-depth": "Moɲey kaataray kaŋ ra moo dobantey hala guusu 5 alkadar ga",
        "right-sendemail": "Bataga sanba goykaw taney do",
-       "right-passwordreset": "Šennikufal yeetiyan batagawey guna",
        "newuserlogpage": "Goykaw teeyan ceebandu tiira",
        "newuserlogpagetext": "Goykaw teeyaney ceebandu tiira ti woo.",
        "rightslog": "Goykaw alhakey ceebandu tiira",
        "uploaddisabledtext": "Tuku zijandiyaney n' ka kay.",
        "php-uploaddisabledtext": "Tuku zijandiyaney n' ka kay PHP ra.\nTaare file_uploads kayandiyanoo koroši.",
        "uploadscripted": "Tukoo woo goo nda HTML wala šigira ašariya kaŋ ga hima kaŋ maanaa dere interneti ceecikaw se.",
-       "uploadscriptednamespace": "SVC tukoo woo goo nda maafarru \"$1\" kaŋ ši alhukum ra.",
+       "uploadscriptednamespace": "SVC tukoo woo goo nda maafarru \"<nowiki>$1</nowiki>\" kaŋ ši alhukum ra.",
        "uploadinvalidxml": "XML kaŋ goo tuku zijantaa ra mana hin ka fesu-fesandi.",
        "uploadvirus": "Tukoo goo nda wirisi!\nŠilbayhayey: $1",
        "uploadjava": "Tukoo ti ZIP tuku kaŋ goo nda Java .class tuku.\nJava tukey zijandiyan ši duu fondo zama i ga hin ka saajaw-sahãnte jejebuhayey hoo.",
        "feedback-thanks": "Foo nda goy! War willandoo n' ka wallafandi \"[$2 $1]\" moɲoo ga.",
        "searchsuggest-search": "Ceeci",
        "searchsuggest-containing": "goo nda…",
-       "api-error-badaccess-groups": "War ši nda fondo ka tukey zijandi wikiyoo woo ga.",
        "api-error-badtoken": "Kunahere firka: Tokore laala.",
-       "api-error-copyuploaddisabled": "URL zijandiyan n' ka kay feršikaa woo ga.",
-       "api-error-duplicate": "{{PLURAL:$1|ti ti tuku tana $2}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|ti ti tuku tana}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da, amma {{PLURAL:$1|an' ka|in' ka}} tuusandi.",
-       "api-error-empty-file": "Tukoo kaŋ war n'a sanba mma koonu.",
        "api-error-emptypage": "Boro ši hin ka moo taaga, koonuyaŋ tee.",
-       "api-error-fetchfileerror": "Kunahere firka: Haya foo mana boori tuku zaayan waate.",
-       "api-error-fileexists-forbidden": "Tuku nda \"$1\" maa ga bara ka ben, nda haya ši hin ka hantumandi a boŋ.",
-       "api-error-fileexists-shared-forbidden": "Tuku nda \"$1\" maa ga bara ka ben tuku jišidoo žemnate ra, nda haya ši hin ka hantumandi a boŋ.",
-       "api-error-file-too-large": "Tukoo kaŋ war n'a sanba mma hansa ka beeri.",
-       "api-error-filename-tooshort": "Tukumaaɲoo ga hansa ka duura.",
-       "api-error-filetype-banned": "Tuku dumoo woo n' ka barrandi.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|manti tuku dumi duɲante|manti tuku dumi duɲanteyaŋ}}. {{PLURAL:$3|Tuku dumi ti|Tuku dumi ti}} $2 ka duɲe.",
-       "api-error-filetype-missing": "Dobuyan foo ga kuma tukumaaɲoo ra.",
-       "api-error-hookaborted": "Dobuyan foo na barmayyanoo kaŋ war ceeci k'a tee say.",
-       "api-error-http": "Kunahere firka: Ši hin ka dobu feršikaa ga.",
-       "api-error-illegal-filename": "Tukumaaɲoo ši nda fondo.",
-       "api-error-internal-error": "Kunahere firka: Haya foo mana boori kaŋ war ga soobay ka haya zijandi wikiyoo ga.",
-       "api-error-invalid-file-key": "Kunahere firka: Tukoo mana duwandi waati-duura jišidoo ra.",
-       "api-error-missingparam": "Kunahere firka: Kayandiyan hãantey ga kuma.",
-       "api-error-missingresult": "Kunahere firka: Mana hin ka tabatandi wala bereyanoo tee ka boori.",
-       "api-error-mustbeloggedin": "War ga hima ka huru to tukey zijandey.  \\",
-       "api-error-mustbeposted": "Kunahere firka: Hãayan ga HTTP WALLAFIYAN waažibandi. \\",
-       "api-error-noimageinfo": "Zijandiyanoo boori, amma feršikaa man'ir noo alhabar kul tukoo ga.",
-       "api-error-nomodule": "Kunahere firka: Zijandiyan dunbu kul mana kayandi.",
-       "api-error-ok-but-empty": "Kunahere firka: Zaabi kul ši hun feršikaa do.",
-       "api-error-overwrite": "Boro ši hin ka hantum tuku barante boŋ.",
-       "api-error-stashfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku yeeti.",
        "api-error-publishfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku wallafi.",
-       "api-error-stasherror": "Firka bangay kaŋ tuku ga zijandi titilaa boŋ.",
-       "api-error-stashedfilenotfound": "Tuku titilantaa mana duwandi waatoo kaŋ boro ceeci k'a zijandi ka hun titilaa ga.",
-       "api-error-stashpathinvalid": "Fondaa kaŋ ga tuku titilantaa hima ka duwandi ši boori.",
-       "api-error-stashfilestorage": "Firka bangay waatoo kaŋ tukoo ga jisandi titilaa ra.",
-       "api-error-stashzerolength": "Feršikaa mana hin ka tukoo deke, zama nga kuuyanoo ti yaada.",
-       "api-error-stashnotloggedin": "War ga hima ka tukey gaabu zijandi titilaa ra.",
-       "api-error-stashwrongowner": "War ši tukoo din may kaŋ war cindi k'a ceeci titilaa ra.",
-       "api-error-stashnosuchfilekey": "Tukoo kaŋ war cindi k'a ceeci titilaa ra ši bara.",
-       "api-error-timeout": "Feršikaa mana tuuru waatoo kaŋ ga hima ra.",
-       "api-error-unclassified": "Firka šibayante bangay.",
-       "api-error-unknown-code": "Firka šibayante: \"$1\".",
-       "api-error-unknown-error": "Kunahere firka: Haya foo mana boori kaŋ war ceeci ka war tukoo zijandi.",
+       "api-error-stashfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku yeeti.",
        "api-error-unknown-warning": "Yaamar šibayante: \"$1\".",
        "api-error-unknownerror": "Firka šibayante: \"$1\".",
-       "api-error-uploaddisabled": "Zijandiyan n' ka kay wikiyoo woo ga. \\",
-       "api-error-verification-error": "A ga hin ka tee tukoo woo laybu, wal'a goo nda dobuyan laala.",
        "duration-seconds": "{{PLURAL:$1|Segondu}} $1",
        "duration-minutes": "{{PLURAL:$1|Miniti}} $1",
        "duration-hours": "{{PLURAL:$1|Guuru}} $1",
index 8b905f2..12051ab 100644 (file)
@@ -49,7 +49,7 @@
        "tog-diffonly": "Neruodītė poslapė torėnė puo skėrtomās",
        "tog-showhiddencats": "Ruodītė pakavuotas kateguorėjės",
        "tog-norollbackdiff": "Nekrēptė diemesė i skėrtoma atlėkus atmetėma",
-       "tog-useeditwarning": "Monėi dout žėnuot, kāp ėšēno ėš poslapė anon naėšsauguojis",
+       "tog-useeditwarning": "Monėi doutė žėnuotė, kap ėšēno ėš poslapė anon naėšsauguojė̄s",
        "tog-prefershttps": "Vėsūmet nauduotė saugu rīši kap būno prisijongė̄s",
        "underline-always": "Vėsūmet",
        "underline-never": "Nikūmet",
        "yourpasswordagain": "Pakartuoket slaptažuodė:",
        "createacct-yourpasswordagain": "Čīstā tuokis slaptažuodis?",
        "createacct-yourpasswordagain-ph": "Apent ožrašīkat slaptažuodi",
-       "userlogin-remembermypassword": "Ka liktō prisėjongis",
+       "userlogin-remembermypassword": "Ka liktō prisijongė̄s",
        "userlogin-signwithsecure": "Apsauguots rīšīs",
        "cannotlogin-title": "Nēn prisijongtė",
        "cannotlogin-text": "Nie galam prisijongtė.",
        "saveprefs": "Ėšsauguotė",
        "restoreprefs": "Grōžintė vėsus nustatīmus kāp bova pradiuo",
        "prefs-editing": "Redagavėms",
-       "rows": "Eilotės:",
-       "columns": "Štolpalē:",
        "searchresultshead": "Paėiškuos nustatīmā",
        "stub-threshold": "Minimums <a href=\"#\" class=\"stub\">nabėngta poslapė</a> fuormatavėmō:",
        "stub-threshold-sample-link": "pavīzdīs",
index 6e3d91c..233839f 100644 (file)
        "passwordreset-emaildisabled": "Postavke E-maila su deaktivirane na ovoj wiki.",
        "passwordreset-username": "Korisničko ime:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Pogledati krajnji e-mail?",
-       "passwordreset-capture-help": "Ako označite ovu kućicu, e-mail s privremenom lozinkom će biti prikazana i poslata korisniku.",
        "passwordreset-email": "E-mail adresa:",
        "passwordreset-emailtitle": "Detalji računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Netko (vjerovatno Vi, s IP adrese $1) je zatražio resetiranje vaše lozinke/zaporke {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše početne lozinke, a ne želite je promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "minoredit": "Ovo je manje uređenje",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Spremi stranicu",
+       "savechanges": "Sačuvaj - Сачувај",
        "publishpage": "Objavi stranicu",
        "publishchanges": "Objavi izmjene",
        "preview": "Pregled",
        "saveprefs": "Snimi postavke",
        "restoreprefs": "Vrati sve na podrazumijevano (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
-       "rows": "Redova:",
-       "columns": "Kolona:",
        "searchresultshead": "Postavke rezultata pretrage",
        "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
        "stub-threshold-sample-link": "uzorak",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
+       "gender-unknown": "Kad Vas spominje, softver će pokušati izbjegavati rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Postavljanje ove preferencije nije obavezno.\nSoftver koristi ovu vrijednost kako bi vam se obratio i spomenuo vas drugima koristeći vaš gramatički rod.\nOva informacija će biti javna.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
-       "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] sa administratorskim računom da bi ste mogli postavljati korisnička prava.",
-       "userrights-notallowed": "Vaš račun nema privilegije da dodaje ili oduzima prava korisnika.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
        "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
-       "userrights-removed-self": "Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "group-autoconfirmed": "Potvrđeni korisnici",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvoz stranica uključujući povezane stranice do dubine od 5 linkova",
        "right-sendemail": "Slanje e-maila drugim korisnicima",
-       "right-passwordreset": "Pregled e-maila za obnavljanje lozinke",
        "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
        "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
        "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
        "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
-       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "XML u postavljenoj datoteci nije mogao biti parsiran.",
        "uploadvirus": "Fajl sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati zaobilaženje sigurnosnih ograničenja.",
        "feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.",
        "searchsuggest-search": "Traži",
        "searchsuggest-containing": "sadrži...",
-       "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
-       "api-error-copyuploaddisabled": "Postavljanja putem URL-a su onemogućena na ovom serveru.",
-       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici sa istim sadržajem",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Datoteka koju ste poslali je bila prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
-       "api-error-fetchfileerror": "Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.",
-       "api-error-fileexists-forbidden": "Već postoji datoteka s imenom „$1“ i ne može da se zamijeni.",
-       "api-error-fileexists-shared-forbidden": "Već postoji datoteka s imenom „$1“ u zajedničkoj riznici i ne može da se zamijeni.",
-       "api-error-file-too-large": "Datoteka koju ste poslali je bila prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|Dozvoljena je|Dozvoljene su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmjena koji ste pokušali načiniti je otkazana preko \"kuke\" proširenja mediawiki softvera.",
-       "api-error-http": "Unutrašnja greška: ne može se spojiti na server.",
-       "api-error-illegal-filename": "Ime datoteke nije dopušteno.",
-       "api-error-internal-error": "Unutrašnja greška: pojavio se neki problem sa obradom vašeg postavljanja na wiki.",
-       "api-error-invalid-file-key": "Unutrašnja greška: datoteka nije pronađena u privremenom skladištu.",
-       "api-error-missingparam": "Unutrašnja greška: nedostaju parametri u zahtjevu.",
-       "api-error-missingresult": "Unutrašnja greška: ne može se otkriti da li je kopiranje uspjelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da biste postavljali datoteke.",
-       "api-error-mustbeposted": "Unutrašnja greška: ne koristi se ispravan HTTP metod.",
-       "api-error-noimageinfo": "Postavljanje je uspjelo, ali server nam nije dao nikakvu informaciju o datoteci.",
-       "api-error-nomodule": "Unutrašnja greška: nije postavljen modul za postavljanje.",
-       "api-error-ok-but-empty": "Unutrašnja greška: nema odgovora od servera.",
-       "api-error-overwrite": "Pisanje preko postojeće datoteke nije dopušteno.",
-       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
-       "api-error-timeout": "Server nije odgovorio unutar očekivanog vremena.",
-       "api-error-unclassified": "Desila se nepoznata greška",
-       "api-error-unknown-code": "Nepoznata greška: \"$1\"",
-       "api-error-unknown-error": "Unutrašnja greška: desila se neka greška pri pokušaju postavljanja vaše datoteke.",
+       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata greška: \"$1\"",
-       "api-error-uploaddisabled": "Postavljanje je onemogućeno na ovoj wiki.",
-       "api-error-verification-error": "Ova datoteka je možda oštećenja ili ima pogrešan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sati}}",
index eafaea6..fd6462a 100644 (file)
        "category_header": "ၼႃႈလိၵ်ႈၼႂ်းလိူင်ႈ \"$1\"",
        "subcategories": "ၵိင်ႇၽႄလိူင်ႈ",
        "category-media-header": "သိုဝ်ႇၼႂ်းလိူင်ႈ \"$1\"",
-       "category-empty": "<em> á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\81¸á\80\84á\80ºá\82\87á\81¼á\82\86á\82\89 á\80¢á\80\99á\80ºá\82\87á\80\99á\80®á\80¸á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80º á\80\9eá\80­á\80¯á\80\9dá\80ºá\82\88á\80¢á\80®á\82\88သင်ဝႆႉ</em>",
+       "category-empty": "<em> á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\9aá\81¢á\80\99á\80ºá\80¸á\80\9cá\80µá\80\9dá\80º á\80¢á\80\99á\80ºá\82\87á\80\95á\82\86á\82\87á\80\99á\80®á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80º á\80\9eá\80­á\80¯á\80\9dá\80ºá\82\87သင်ဝႆႉ</em>",
        "hidden-categories": "{{PLURAL:$1|လိူင်ႈဢၼ်လပ်ႉဝႆႉ |လိူင်ႈၸိူဝ်း ဢၼ်လပ်ႉဝႆႉ}}",
        "hidden-category-category": "လိူင်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
        "category-subcat-count": "{{PLURAL:$2|ၼႂ်းလိူင်ႈဢၼ်ၼႆႉ မီးၵိင်ႇၽႄလိူင်ႈၼႆႉ ၸိူင်ႉၼႆၵွၺ်း|ၼႂ်းလိူင်ႈၼႆႉ မီး This category has the following {{PLURAL:$1|ၵိင်ႇၽႄလိူင်ႈ|$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "searcharticle": "သိုပ်ႇၵႂႃႇ",
        "history": "ပိုၼ်းၼႃႈလိၵ်ႈ",
        "history_short": "ပိုၼ်း",
+       "history_small": "ပိုၼ်း",
        "updatedmarker": "ပဵၼ်ဢၢပ်ႉတိတ်ႉဝႆႉ ၸဵမ်မိူဝ်ႈၶႃႈၵႂႃႇဢႅဝ်ႇၵမ်းလိုၼ်းသုတ်း",
        "printableversion": "တွၼ်ႈတႃႇဢိတ်ႇဢွၵ်ႇ",
        "permalink": "ႁဵင်းၵွင်ႉ မၼ်ႈၵိုမ်း",
        "unprotectthispage": "လႅၵ်ႈလၢႆႊ ၵၢၼ်ႁေႉၵင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
        "newpage": "ၼႃႈလိၵ်ႈမႂ်ႇ",
        "talkpage": "ဢုပ်ႇလိူၺ်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
-       "talkpagelinktext": "á\80\90á\80½á\81¼á\80ºá\82\8aဢုပ်ႇ",
+       "talkpagelinktext": "á\80\90á\80½á\81¼á\80ºá\82\88ဢုပ်ႇ",
        "specialpage": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
        "personaltools": "ၶိူင်ႈ​သုၼ်ႇ​လဵ​ဝ်",
        "articlepage": "တူၺ်း ၼႃႈလိၵ်ႈ ၼမ်းၼႂ်း",
        "views": "လူတူၺ်း",
        "toolbox": "ၶိူင်ႈၵမ်ႉၵႅမ်",
        "tool-link-userrights": "လႅၵ်ႈလၢႆႈ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ၸုမ်း",
+       "tool-link-userrights-readonly": "တူၺ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ၸုမ်း",
        "tool-link-emailuser": "သူင်ႇဢီးမေးလ်ဢၼ်ၼႆႉ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
        "userpage": "တူၺ်းၼႃႈလိၵ်ႈၽူႈၸႂ်ႉတိုဝ်း",
        "projectpage": "တူၺ်းၼႃႈလိၵ်ႈ ပရေႃးၵျႅၵ်ႉ",
        "viewsourceold": "တူၺ်း ငဝ်ႈငႃႇ",
        "editlink": "မႄးထတ်း",
        "viewsourcelink": "တူၺ်း ငဝ်ႈငႃႇ",
-       "editsectionhint": "á\80\99á\80°á\81¼á\80ºá\82\89á\80\99á\82\84á\80¸ á\80\90á\80½á\81¼á\80ºá\82\8a :$1",
+       "editsectionhint": "á\80\99á\80°á\81¼á\80ºá\82\89á\80\99á\82\84á\80¸ á\80\90á\80½á\81¼á\80ºá\82\88 :$1",
        "toc": "ၼမ်းၼႂ်း",
        "showtoc": "ၼႄ",
        "hidetoc": "သိူင်ႇ",
        "enterlockreason": "ပေႃႉသႂ်ႇပၼ် လွင်ႈတၢင်းတႃႇ တေၶတ်းဝႆႉ၊ ႁႂ်ႈပႃးပၼ် ၸဵမ်ၶၢဝ်းယၢမ်း လၢမ်းဢၼ်ဝႃႈ လွင်ႈၶတ်းဝႆႉၼႆႉ တေဢၢပ်ႈၶိုၼ်းပိုတ်ႇပၼ် မိူဝ်ႈလႂ် ဢၼ်ဝႃႈၼၼ်ႉ။",
        "readonlytext": "ယွင်ၶေႃႈမုၼ်းၼႆႉ ယၢမ်းလဵဝ် ထုၵ်ႇၶတ်းဝႆႉတႃႇ တေထႅမ်သႂ်ႇဢၼ်မႂ်ႇ လႄႈ တႃႇမူၼ်ႉမႄး တၢင်ႇလွင်ႈတၢင်ႇၸိူဝ်း၊ မၼ်းတေဢၢပ်ႈပဵၼ်လူၺ်ႈ လွင်ႈဝႃႈ တိုၵ်ႉမူၼ်ႉမႄး ယွင်ၶေႃႈမုၼ်း ၼင်ႇၵႆႉႁဵတ်း။ ဝၢႆးသေၼၼ်ႉတႄႉ တေၶိုၼ်းႁဵတ်းၵၢၼ် မိူၼ်ၵဝ်ႇယူႇ။\n\nဢၼ်ပဵၼ် ၽူႈၵုမ်းၵမ်ပိူင်ႈသၢင်ႈ ၵေႃႉဢၼ်လႆႈ ၶတ်းၼႆႉဝႆႉၼၼ်ႉ မၼ်းပၼ်လွင်ႈသပ်းလႅင်းဝႆႉဝႃႈ : $1",
        "missing-article": "ယွင်ၶေႃႈမုၼ်း ဢမ်ႇသွၵ်ႈႁႃႁၼ်လႆႈ ၽိုၼ်ၼႃႈလိၵ်ႈ ဢၼ်ထုၵ်ႇလီသွၵ်ႈထူပ်းႁၼ် ဢၼ်မီးၸိုဝ်ႈဝႃႈ \"$1\" $2 ။\n\nၼႆႉမၼ်းဢၢပ်ႈပဵၼ်ဝႆႉ ဢၼ်ၸိူဝ်းၼၼ်ႉ မၼ်းၵဝ်ႇၵႄႇၼႃႇလႄႈသင် ဢၼ်ပဵၼ် ပိုၼ်းႁဵင်းၵွင်ႉ ၸူးၼႃႈလိၵ်ႈၼၼ်ႉ ထုၵ်ႇမွတ်ႇပႅတ်ႈယဝ်ႉလႄႈသင် ​ၼႆဢေႃႈ။\n\nပေႃးဢမ်ႇၸႂ်ၸိူင်ႉၼၼ်တႄႉ ၸဝ်ႈၵဝ်ႇ တေလႆႈႁၼ် လွင်ႈယုင်ႈယၢင်ႈၼႆႉ တေၼႄဝႆႉ တီႈၼႂ်း သွပ်ႉၾ်ဝႄး ယူႇ။\nၶႅၼ်းတေႃႈ လဝ်ႈထိုင်ၼႆႉၸူး ၵႃႈတီႈ  [[Special:ListUsers/sysop|administrator]] သေ မၢႆတွင်းဝႆႉပႃး ႁဵင်းလိၵ်ႈ URL မၼ်းသေၶႃႈလႄႈ။",
-       "missingarticle-rev": "(á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\80­á\80¯á\81¼á\80ºá\80¸#: $1)",
+       "missingarticle-rev": "(á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88#: $1)",
        "missingarticle-diff": "(ၼိူင်း: $1, $2)",
        "readonly_lag": "ယွင်ၶေႃႈမုၼ်းၼႆႉ မၼ်းထုၵ်ႇၶတ်းၵႂႃႇ ႁင်းမၼ်း ၽွင်းမိူဝ်ႈ သႃႇပိူဝ်ႇယွင်ၶေႃႈမုၼ်း ဢၼ်ၵႅမ်မၼ်း ထုၵ်ႇတီႉၸပ်းၸူး သႃႇပိူဝ်ႇ​ယွင်ၶေႃႈမုၼ်း ငဝ်ႈမၼ်း။",
        "nonwrite-api-promise-error": "ဢၼ်ပဵၼ်​ႁူဝ်ၶေႃႈ HTTP ၼင်ႇ 'Promise-Non-Write-API-Action' ၼၼ်ႉထုၵ်ႇ သူင်ႇၸူးယဝ်ႉသေတႃႉ လွင်ႈတုၵ်းယွၼ်း မၼ်းတႄႉ တိုၵ်ႉမီးယူႇတီႈ API write module ။",
        "cannotdelete": "ၼႃႈလိၵ်ႈ ဢမ်ႇၼၼ် ၾၢႆႇ \"$1\" ၼႆႉ ဢမ်ႇၸၢင်ႈ မွတ်ႇပႅတ်ႈလႆႈ။\nမၼ်းဢၢပ်ႈပဵၼ် ၵူၼ်းသေၵေႃႉၵေႃႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။",
        "cannotdelete-title": "ဢမ်ႇၸၢင်ႈ မွတ်ႇပႅတ်ႈ ၼႃႈ လိၵ်ႈ \"$1\"",
        "delete-hook-aborted": "လွင်ႈမွတ်ႇပႅတ်ႈ ထုၵ်ႇ ၵိုတ်းပႅတ်ႈ။\nမၼ်းဢမ်ႇမီး လွင်ႈ သပ်းလႅင်းၼႄသင်ဝႆႉ။",
-       "no-null-revision": "á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\81µá\80±á\82\83á\82\87á\80\9eá\81¢á\80\84á\80ºá\82\88 á\80\90á\80°á\80\9dá\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ပဝ်ႇမႂ်ႇ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈ \"$1\"",
+       "no-null-revision": "á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\81µá\80±á\82\83á\82\87á\80\9eá\81¢á\80\84á\80ºá\82\88 á\80\90á\80°á\80\9dá\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ပဝ်ႇမႂ်ႇ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈ \"$1\"",
        "badtitle": "ႁူဝ်ၶေႃႈႁၢႆႉၸႃႉ",
        "badtitletext": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈဢၼ် တုၵ်းယွၼ်းဝႆႉၼႆႉ မၼ်းဢမ်ႇၸႂ်ႉလႆႈ၊ ပဝ်ႇဝႆ့ ဢမ်ႇၼၼ် မၼ်းၵွင်ႉၽိတ်းပိူင်ႈဝႆႉတင်း ၽႃႇသႃႇၵႂၢမ်းတၢင်ႇဢၼ် ဢမ်ႇၼၼ် ႁူဝ်ၶေႃႈၼႂ်းၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆ့။",
        "title-invalid-empty": "ၼႃႈလိၵ်ႈဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းဢမ်ႇပႃးဝႆႉႁူဝ်ၶေႃႈမၼ်း ဢမ်ႇၼၼ် မၼ်းတေပႃးဝႃႈ ၸိုဝ်ႈဢၼ်ပဵၼ် လွၵ်းပဝ်ႇဝႆႉၼၼ်ႉၵူၺ်း။",
        "invalidtitle-knownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ လွၵ်းၸိုဝ်ႈ \"$2\" လႄႈ တူဝ်လိၵ်ႈ \"$3\"",
        "invalidtitle-unknownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ ဢမ်ႇလႆႈႁူႉ တၢင်းၼမ်လွၵ်းၸိုဝ်ႈ $1 လႄႈ တူဝ်လိၵ်ႈ \"$2\"",
        "exception-nologin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
+       "virus-unknownscanner": "ဢမ်ႇႁူႉၸၵ်း တူဝ်ၶႃႈမႅင်း:",
        "cannotlogoutnow-title": "ဢမ်ႇၸၢင်ႈ လွၵ်ႉဢွၵ်ႇ ယၢမ်းလဵဝ်",
        "cannotlogoutnow-text": "တေဢမ်ႇၸၢင်ႈ လွၵ်ႉၶဝ်ႈ ၽွင်းမိူဝ်ႈၸႂ်ႉ $1",
        "welcomeuser": "ႁပ်ႉတွၼ်ႈယူႇ, $1!",
        "nav-login-createaccount": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
        "userlogin": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
        "userloginnocreate": "လွၵ်ႉဢိၼ်ႇ",
-       "logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
-       "userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
+       "logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
+       "userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
        "notloggedin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
        "userlogin-noaccount": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ?",
        "userlogin-joinproject": "ႁူမ်ႈ {{SITENAME}}",
        "pt-login-button": "လွၵ်ႉဢိၼ်ႇ",
        "pt-login-continue-button": "သိုပ်ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
        "pt-createaccount": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
-       "pt-userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
+       "pt-userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
        "php-mail-error-unknown": "ဢမ်ႇႁူႉ လွင်ႈၽိတ်းပိူင်ႈ ၵႃႈတီႈ PHP's mail() function ၼၼ်ႉ။",
        "user-mail-no-addy": "ဢမ်ႇပႃး ႁဵင်းလိၵ်ႈဢီးမေးလ်သေ ၶတ်းၸႂ်သူင်ႇ ဢီးမေးလ်",
        "user-mail-no-body": "ၶတ်းၸႂ်သူင်ႇဢီးမေးလ် လူၺ်ႈ လွင်ႈတၢင်းပဝ်ႇ ဢမ်ႇၼၼ် ပွင်ႈလိၵ်ႈ ဢၼ်ဢမ်ႇမီး တီႈပွင်ႇ",
        "botpasswords-updated-body": "ၶေႃႈလပ်ႉပွတ်ႉ တွၼ်ႈတႃႇ ၸိုဝ်ႈပွတ်ႉ \"$1\" ဢၼ်ပဵၼ်ၶွင် ၽူႈၸႂ်ႉတိုဝ်း \"$2\" ၼၼ်ႉ ပဵၼ် ဢၢပ်ႉတိတ်ႉယဝ်ႈ။",
        "botpasswords-deleted-title": "ၶေႃႈလပ်ႉပွတ်ႉၼၼ်ႉ မွတ်ႇပႅတ်ႈယဝ်ႉယဝ်ႈ။",
        "botpasswords-deleted-body": "ၶေႃႈလပ်ႉပွတ်ႉ တွၼ်ႈတႃႇ ၸိုဝ်ႈပွတ်ႉ \"$1\" ဢၼ်ပဵၼ်ၶွင် ၽူႈၸႂ်ႉတိုဝ်း \"$2\" ၼၼ်ႉ မွတ်ႇပႅတ်ႈယဝ်ႉယဝ်ႈ။",
-       "botpasswords-newpassword": "ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ တႃႇတေၶဝ်ႈ လွၵ်ႉဢိၼ်ႇၸွမ်း  <strong>$1</strong> ပဵၼ် <strong>$2</strong>. <em>ၶႅၼ်းတေႃႈ မၢႆတွင်းၼႆႉဝႆႉ တွၼ်ႈတႃႇ ပဵၼ် ၽိုၼ်ဢိင်မိူဝ်းၼႃႈ</em>",
+       "botpasswords-newpassword": "ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ တႃႇတေၶဝ်ႈ လွၵ်ႉဢိၼ်ႇၸွမ်း  <strong>$1</strong> ပဵၼ် <strong>$2</strong>. <em>ၶႅၼ်းတေႃႈ မၢႆတွင်းၼႆႉဝႆႉ တွၼ်ႈတႃႇ ပဵၼ် ၽိုၼ်ဢိင်မိူဝ်းၼႃႈ</em><br>(တွၼ်ႈတႃႇ ပွတ်ႉၸိူဝ်းဢၼ်ၵဝ်ႇ ဢၼ်လူဝ်ႇ ၸိုဝ်ႈလွၵ်ႉဢိၼ်ႇ ဢၼ်တေလႆႈမိူၼ်ၵၼ်တင်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း၊ ၸဝ်ႈၵဝ်ႇၸၢင်ႈၸႂ်ႉ <strong>$3</strong> ၼင်ႇ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း လႄႈ <strong>$4</strong>ၼင်ႇ ၶေႃႈလပ်ႉ)",
        "botpasswords-no-provider": "ၵၼ်တူဝ်ၵမ်ႉထႅမ်ၶေႃႈလပ်ႉပွတ်ႉၼႆ မၼ်းဢမ်ႇၸႂ်ႉလႆႈ။",
        "botpasswords-restriction-failed": "ၵၼ်ၵႅတ်ႇၶေႃႈလပ်ႉပွတ်ႉ ၼႆႉ ႁႄႉၵင်ႈလွင်ႈ လွၵ်ႉဢိၼ်ႇဢၼ်ၼႆႉ။",
        "botpasswords-invalid-name": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်ႈ ဢၼ်မၵ်းမၼ်ႈဝႆႉၼႆႉ မၼ်းဢမ်ႇၶဝ်ႈပႃးဝႆႉ တူဝ်ၸႅၵ်ႇၶေႃႈလပ်ႉ ပွတ်ႉ (\"$1\") ။",
        "passwordreset-emaildisabled": "ၽၢင်ႁဵတ်းၵၢၼ် ဢီးမေးလ် ထုၵ်ႇဢိုတ်းဝႆႉ ၵႃႈတီႈ ဝီႇၶီႇၼႆႉ။",
        "passwordreset-username": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း",
        "passwordreset-domain": "တူဝ်ႇမဵင်း :",
-       "passwordreset-capture": "တေတူၺ်း ဢီးမေးလ်ၽွၼ်းလႆႈ?",
-       "passwordreset-capture-help": "ပေႃးၸဝ်ႈၵဝ်ႇ ၶိုၼ်ႇလွၵ်ႈၼႆႉၼႆ ဢီးမေးလ် (ဢၼ်ၸႂ်ႉၶေႃႈလပ်ႉၸူဝ်ႈၵႅပ်ႉ) တေၼႄဝႆႉဝႃႈ  မၼ်းသူင်ႇၸူး ၽူႈၸႂ်ႉတိုဝ်း ဝႆႉယဝ်ႉ ၼႆဢေႃႈ.",
        "passwordreset-email": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ် :",
        "passwordreset-emailtitle": "လွင်ႈႁူဝ်ယွႆႈ ဢၶွင်ႉ ၵႃႈတီႈ {{SITENAME}}",
        "passwordreset-emailelement": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း:\n$1\n\nၶေႃႈလပ်ႉ ၸူဝ်ႈၵႅပ်ႉ:\n$2",
        "passwordreset-emailsentemail": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ဢၶွင်ႉၸဝ်ႈၵဝ်ႇ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
        "passwordreset-emailsentusername": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႆႉ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
+       "passwordreset-nosuchcaller": "ၽူႈႁွင်ႉမႃး ဢမ်ႇမီးဝႆႉ:$1",
        "passwordreset-invalidemail": "ႁဵင်းလိၵ်ႈ ဢီႈမေးလ် ၽိတ်းဝႆႉ။",
        "passwordreset-nodata": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းလႄႈ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢမ်ႇလႆႈၵမ်ႉထႅမ်ဝႆႉ သေဢၼ်။",
        "changeemail": "လႅၵ်ႈလၢႆႈ ဢမ်ႇၼၼ် ထွၼ်ပႅတ်ႈ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
        "editingsection": "မႄးထတ်း $1 (ၵၼ်)",
        "editconflict": "မႄးထတ်း လွင်ႈယုင်ႈယၢင်ႈ : $1",
        "yourtext": "လိၵ်ႈၸဝ်ႈၵဝ်ႇ",
-       "storedversion": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်ဢဝ်ၶိုၼ်း",
+       "storedversion": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ဢဝ်ၶိုၼ်း",
        "yourdiff": "ၸိူဝ်းပႅၵ်ႇပိူင်ႈ",
        "longpageerror": "<strong>လွင်ႈၽိတ်းပိူင်ႈ : လိၵ်ႈၸိူဝ်းဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈသႂ်ႇပၼ်မႃးၼၼ်ႉ တၢင်းယၢဝ်းမၼ်း မီး {{PLURAL:$1|ၼိုင်ႈ kilobyte|$1 kilobytes}}, မၼ်းတိူဝ်းယၢဝ်ၢးလိူဝ်သေ  {{PLURAL:$2|ၼိုင်ႈ kilobyte|$2 kilobytes}}.</strong>\nမၼ်းတေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉပၼ်လႆႈ။",
        "readonlywarning": "<strong>ၽၢင်ႉ : ယွင်ၶေႃႈမုၼ်းၼႆႉ ထုၵ်ႇၶတ်းဝႆႉ တွၼ်ႈတႃႇ ၵၢၼ်မူၼ်ႉ​​မေး၊ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉ ၵၢၼ်လႅၵ်ႈလၢႆႈ ၸဝ်ႈၵဝ်ႇ ယၢမ်းလဵဝ်</strong>\nၸဝ်ႈဝ်ႇ တေလူဝ်ႇ ထုတ်ႇ ၵေႃႇပီႇ သေ ပႃႉသႂ်ႇ ၽဵတ်ႉသႂ်ႇဝႆႉ တီႈၼႂ်း ၾၢႆႇလိၵ်ႈ သေ သိမ်းဝႆႉ တွၼ်ႈတႃႇၶိုၼ်းၸႂ်ႉဝၢႆးလင်။\nၵေႃႉၵုမ်းထိင်ပိူင်သၢင်ႈ ၵေႃႉဢၼ်ၶတ်းဝႆႉၼႆႉ မၼ်းပၼ်လွင်ႈတၢင်းမၼ်းဝႆႉဝႃႈ : $1",
        "permissionserrors": "ၵၢၼ်လူတ်းပွႆႇ ၽိတ်းပိူင်ႈ",
        "permissionserrorstext": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇႁဵတ်းဢၼ်ၼၼ်ႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ {{PLURAL:$1|လွင်ႈတၢင်း|လွင်ႈတၢင်းၸိူဝ်း}} ၼႆႉ:",
        "permissionserrorstext-withaction": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇ $2, တွၼ်ႈတႃႇ ၸိူဝ်း ဢၼ်ပဵၼ် {{PLURAL:$1|reason|လွင်ႈတၢင်း}}:",
-       "contentmodelediterror": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\80¢á\81¼á\80ºၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
+       "contentmodelediterror": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
        "recreate-moveddeleted-warn": "<strong>ၶေႃႈၽၢင်ႉပၼ် : ၸဝ်ႈၵဝ်ႇ ၶိုၼ်းၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ ဢၼ်လႆႈ မွတ်ႇပႅတ်ႈၵႂႃႇဝႆႉၼၼ်ႉ။</strong>\n\nၸဝ်ႈၵဝ်ႇ ထုၵ်ႇလီဝူၼ်ႉတူၺ်းဝႃႈ ၸွင်ႇမၼ်းသၢင်ႇထုၵ်ႇ တွၼ်ႈတႃႇတေသိုပ်ႇ မႄးထတ်း ၼႃႈလိၵ်ႈၼႆႉဢၼ်ဝႃႈၼၼ်ႉ။\nသဵၼ်ႈလၢႆ မွတ်ႇပႅတ်ႈလႄႈ ၶၢႆႉဢွင်ႈ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၵႃႈတီႈၼႆႈ တွၼ်ႈတႃႇ ႁႂ်းငၢႆႈလူမ်ၸႂ် :",
        "moveddeleted-notice": "ၼႃႈလိၵ်ႈၼႆႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။ လွင်ႈမွတ်ႇပႅတ်ႈလႄႈ လွင်ႈၶၢႆႉသၢႆမၢႆ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၼင်ႇပႃႈတႂ်ႈၼႆႉယူႇ။ မၼ်းပဵၼ် တွၼ်ႈတႃႇ ႁဵတ်းၽိုၼ်ဢိင်ယဝ်ႉ။",
        "moveddeleted-notice-recent": "ယိၼ်းၶီၸွမ်ႈယူႇ၊ ၼႃႈလိၵ်ႈၼႆႉ တိုၵ်ႉႁႃထုၵ်ႇမွတ်ႇပႅတ်ႈ (ၼႂ်းၶၢဝ်းတၢင်း မိူဝ်ႈပူၼ်ႉမႃး 24 ၸူဝ်ႈမူင်း) ၼႆႉၵူၺ်း။ သဵၼ်ႈမၢႆ မွတ်ႇပႅတ်ႈ လႄႈ ၶၢႆႉဢွင်ႈတီႈ ၸိူဝ်းၼၼ်ႉ လႆႈၵမ်ႉထႅမ်ဝႆႉပၼ်ၼင်ႇၽၢႆႇတႂ်ႈ ႁႂ်ႈၸၢင်ႈပဵၼ် ၵၢၼ်ၽိုၼ်ဢိင်။",
        "defaultmessagetext": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ပိူင်ႇၵႅဝ်ႈ",
        "invalid-content-data": "ၶေႃႈမုၼ်းၶဝ်ႈပႃး ၽိတ်းပိူင်ႈဝႆႉ",
        "content-not-allowed-here": "\"$1\" ၶေႃႈၶဝ်ႈပႃးၼႆႉ ဢမ်ႇၶႂၢင်းပၼ်ဝႆႉ တီႈၼႃႈ လိၵ်ႈ [[$2]]",
+       "editpage-invalidcontentmodel-title": "ပိူင်ႈၵေႃႇသၢင်ႈ လမ်းၼႂ်း ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉ",
+       "editpage-invalidcontentmodel-text": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း \"$1\" ဢမ်ႇလႆႈၵမ်ႉထႅမ်ဝႆႉ",
        "editpage-notsupportedcontentformat-title": "ပိူင်ၶေႃႈၶဝ်ႈပႃး ၼႆႉ ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉပၼ်။",
        "editpage-notsupportedcontentformat-text": "ပိူင်ၶေႃႈၶဝ်ႈပႃး $1 ၼႆႉ မၼ်းဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ် တင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး $2",
        "content-model-wikitext": "လိၵ်ႈဝီႇၶီႇ",
        "post-expand-template-inclusion-warning": "<strong>ၶေႃႈၽၢင်ႉ</strong> - ပိူင်ဢဝ်မႃးႁူမ်ႈၼၼ်ႉယႂ်ႇပူၼ်ႉၼႃႇ။\nပိူင်မၢင်ၼႃႈတေဢမ်ႇႁူမ်ႈပႃးၸွမ်း။",
        "viewpagelogs": "တူၺ်းသၢႆမၢႆ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ",
        "nohistory": "တီႈၼႆႈ ဢမ်ႇမီး ပိုၼ်းထတ်းသၢင်ႈ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ",
-       "currentrev": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၵမ်းလိုၼ်းသုတ်း",
-       "currentrev-asof": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° á\81µá\80\99á\80ºá\80¸á\80\9cá\80­á\80¯á\81¼á\80ºá\80¸á\80\9eá\80¯á\80\90á\80ºá\80¸á\81¼á\80\84á\80ºá\82\87  $1",
-       "revisionasof": "á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼင်ႇ $1",
-       "revision-info": "ၶူၼ်ႉလူၼင်ႇ  $1 ၼင်ႇ {{GENDER:$6|$2}}$7",
-       "previousrevision": "â\86\90 á\81¸á\80­á\80°á\80\9dá\80ºá\80¸ဢၼ်ၵဝ်ႇ",
+       "currentrev": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၵမ်းလိုၼ်းသုတ်း",
+       "currentrev-asof": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\81µá\80\99á\80ºá\80¸á\80\9cá\80­á\80¯á\81¼á\80ºá\80¸á\80\9eá\80¯á\80\90á\80ºá\80¸ á\80\99á\80­á\80°á\80\9dá\80ºá\82\88  $1",
+       "revisionasof": "á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼင်ႇ $1",
+       "revision-info": "{{GENDER:$6|$2}}$7 ၵေႃႉ ၶူၼ်ႉၶႆႈမိူဝ်ႈ  $1",
+       "previousrevision": "â\86\90 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ၵဝ်ႇ",
        "nextrevision": "ၵၢၼ်ၶူၼ်ႉလူဢၼ်မႂ်ႇ",
-       "currentrevisionlink": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၵမ်းလိုၼ်းသုတ်း",
+       "currentrevisionlink": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၵမ်းလိုၼ်းသုတ်း",
        "cur": "ယၢမ်းလဵဝ်",
        "next": "ၵႂႃႇၼႃႈ",
        "last": "ဢွၼ်တၢင်း",
        "histlast": "မႂ်ႇသုတ်း",
        "historysize": "({{PLURAL:$1|1 ပၢႆႉ|$1 ပၢႆႉ}})",
        "historyempty": "(ပဝ်ႇ)",
-       "history-feed-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "history-feed-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "history-feed-description": "ပိုၼ်းၶူၼ်ႉလူ တႃႇၼႃႈလိၵ်ႈၼႆႉ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇ",
        "history-feed-item-nocomment": "$1 တီႈ $2",
-       "history-edit-tags": "á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81¶á\82\85á\80\95á\80ºá\80¸á\80\90á\80­á\80\84á\80º á\81¶á\80½á\80\84á\80º á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၸိူဝ်းလိူၵ်ႈဝႆႉၼၼ်ႉ။",
+       "history-edit-tags": "á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81¶á\82\85á\80\95á\80ºá\80¸á\80\90á\80­á\80\84á\80º á\81¶á\80½á\80\84á\80º á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၸိူဝ်းလိူၵ်ႈဝႆႉၼၼ်ႉ။",
        "rev-deleted-comment": "(ႁူဝ်ႁုပ်ႈၵၢၼ်ထတ်းသၢင် ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
        "rev-deleted-user": "(ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
        "rev-deleted-event": "(သဵၼ်ႈမၢႆ ႁူဝ်ယွႆႈ ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
        "rev-deleted-user-contribs": "[ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢမ်ႇၼၼ် မၢႆဢၢႆႇပီႇ ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ  - ၵၢၼ်မႄးထတ်း ၸိူဝ်းၼၼ်ႉ ထုၵ်ႇလပ်ႉဝႆႉ ၵႃႈတီႈ ၵၢၼ်ႁူမ်ႈသၢင်ႈ]",
-       "rev-deleted-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။",
-       "rev-suppressed-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
-       "rev-deleted-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။\nပေႃးဝႃႈ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမီးၵၢင်ၸႂ် ၶႂ်ႈသိုပ်ႇ ႁဵတ်းၵႂႃႇၼႆ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉ  [$1 တူၺ်း လွင်ႈၶူၼ်ႉလူၼႆႉ] ။",
-       "rev-suppressed-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\91á\80¯á\81µá\80ºá\82\87 <strong>á\80\90á\80µá\81µá\80ºá\80¸á\81µá\80­á\80¯á\80\90á\80ºá\80¸</strong> á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9aá\80\9dá\80ºá\82\89á\81\8b\ná\80\9cá\80½á\80\84á\80ºá\82\88á\82\81á\80°á\80\9dá\80ºá\80\9aá\80½á\82\86á\82\88á\80\99á\81¼á\80ºá\80¸ á\80\90á\80±á\81¸á\81¢á\80\84á\80ºá\82\88á\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81µá\82\83á\82\88á\80\90á\80®á\82\88 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] á\81¼á\82\86á\82\88á\80\9aá\80°á\82\87á\81\8b\ná\80\95á\80±á\82\83á\80¸á\80\9dá\82\83á\82\88 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89á\80\99á\80®á\80¸á\81µá\81¢á\80\84á\80ºá\81¸á\82\82á\80º á\81¶á\82\82á\80ºá\82\88á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87 á\82\81á\80µá\80\90á\80ºá\80¸á\81µá\82\82á\82\83á\82\87á\81¼á\82\86 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89  [$1 á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼႆႉ] ။",
-       "rev-deleted-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်ႈမၼ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
-       "rev-suppressed-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
-       "rev-deleted-no-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-deleted-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။",
+       "rev-suppressed-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\89ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
+       "rev-deleted-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။\nပေႃးဝႃႈ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမီးၵၢင်ၸႂ် ၶႂ်ႈသိုပ်ႇ ႁဵတ်းၵႂႃႇၼႆ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉ  [$1 တူၺ်း လွင်ႈၶူၼ်ႉလူၼႆႉ] ။",
+       "rev-suppressed-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\91á\80¯á\81µá\80ºá\82\87 <strong>á\80\90á\80µá\81µá\80ºá\80¸á\81µá\80­á\80¯á\80\90á\80ºá\80¸</strong> á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9aá\80\9dá\80ºá\82\89á\81\8b\ná\80\9cá\80½á\80\84á\80ºá\82\88á\82\81á\80°á\80\9dá\80ºá\80\9aá\80½á\82\86á\82\88á\80\99á\81¼á\80ºá\80¸ á\80\90á\80±á\81¸á\81¢á\80\84á\80ºá\82\88á\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81µá\82\83á\82\88á\80\90á\80®á\82\88 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] á\81¼á\82\86á\82\88á\80\9aá\80°á\82\87á\81\8b\ná\80\95á\80±á\82\83á\80¸á\80\9dá\82\83á\82\88 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89á\80\99á\80®á\80¸á\81µá\81¢á\80\84á\80ºá\81¸á\82\82á\80º á\81¶á\82\82á\80ºá\82\88á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87 á\82\81á\80µá\80\90á\80ºá\80¸á\81µá\82\82á\82\83á\82\87á\81¼á\82\86 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89  [$1 á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ] ။",
+       "rev-deleted-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်ႈမၼ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-suppressed-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
+       "rev-deleted-no-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
        "rev-suppressed-no-diff": "ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၼႂ်ႈၵႃႈ ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။",
-       "rev-deleted-unhide-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
+       "rev-deleted-unhide-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
        "rev-suppressed-unhide-diff": "ၼႂ်းၵႃႈ ၵၢၼ်ၶူၼ်ႉလူ လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ၵႂႃႇယဝ်ႉ။\nႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
-       "rev-deleted-diff-view": "á\81¼á\82\82á\80ºá\80¸á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇၸၢင်ႈတူၺ်းလႆႈ လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-deleted-diff-view": "á\81¼á\82\82á\80ºá\80¸á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇၸၢင်ႈတူၺ်းလႆႈ လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
        "rev-suppressed-diff-view": "ၼႂ်းၵႃႈ ၵၢၼ်ၶူၼ်ႉလူ လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇ ၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
        "rev-delundel": "ၼႄ/သိူင်ႇ",
        "rev-showdeleted": "ၼႄ",
-       "revisiondelete": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88/ á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "revisiondelete": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88/ á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "revdelete-nooldid-title": "ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်ယိူင်းၸူးၼၼ်ႉ ၽိတ်းဝႆႉ",
        "revdelete-no-file": "ၾၢႆႇဢၼ်မၵ်းမၼ်ႈဝႆႉၼၼ်ႉ မၼ်းဢမ်ႇလႆႈမီးဝႆႉ",
-       "revdelete-show-file-confirm": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\9cá\80\95á\80ºá\82\89á\80\9cá\80½á\80\84á\80ºá\80¸á\80\9aá\80\9dá\80ºá\82\89á\82\81á\82\83á\82\88á\80\9dá\82\83á\82\88 á\80\90á\80±á\81¶á\82\82á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၶွင်ၾၢႆႇ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ။ \"<nowiki>$1</nowiki>\" ၵႃႇတီႈ $2 တေႃႇ $3?",
+       "revdelete-show-file-confirm": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\9cá\80\95á\80ºá\82\89á\80\9cá\80½á\80\84á\80ºá\80¸á\80\9aá\80\9dá\80ºá\82\89á\82\81á\82\83á\82\88á\80\9dá\82\83á\82\88 á\80\90á\80±á\81¶á\82\82á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၶွင်ၾၢႆႇ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ။ \"<nowiki>$1</nowiki>\" ၵႃႇတီႈ $2 တေႃႇ $3?",
        "revdelete-show-file-submit": "ၸႂ်ႈယဝ်ႉ",
-       "revdelete-selected-text": "{{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° á\80¢á\81¼á\80ºá\80\9cá\80­á\80°á\81µá\80ºá\82\88á\80\9dá\82\86á\82\89\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\80¢á\81¼á\80ºá\80\9cá\80­á\80°á\81µá\80ºá\82\88á\80\9dá\82\86á\82\89\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|ၾၢႆပိူဝ်းသျိၼ်း ဢၼ်လိူၵ်ႈဝႆႉ|ၾၢႆႇပိူဝ်းသျိၼ်း ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်လိူၵ်ႈဝႆႉ|သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ၸိူဝ်းလိူၵ်ႈဝႆႉ}}:",
-       "revdelete-text-text": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၼႃႈလိၵ်ႈ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
+       "revdelete-text-text": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၼႃႈလိၵ်ႈ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
        "revdelete-text-file": "ၾၢႆႇပိူဝ်းသျိၼ်း ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၾၢႆႇ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
        "logdelete-text": "သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ သဵၼ်ႈမၢႆ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
        "revdelete-text-others": "သင်ၸိူဝ်ႉဝႃႈ ဢမ်ႇလႆႈ မၵ်ႈသႂ်ႇဝႆႉ လွင်ႈႁႄႉတၢပ်ႈသင်ၼႆတႄႉ ၽူႈၵုမ်းထိင်း မၢင်ၸိူဝ်းၼႆႉ တိုၵ်ႉတေဢဝ်ၸႂ်ႉလႆႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်လပ်ႉဝႆႉသေ တႃႇတေၶိုၼ်းဢမ်ႇမွတ်ႇ ဢၼ်ၼၼ်ႉ။",
        "revdelete-confirm": "ၶႅၼ်းတေႃႈ ၼႄႉၼွၼ်းပၼ်ဝႃႈ ၸဝ်ႈၵဝ်ႇ ယိူင်းဢၢၼ်း ၶႂ်ႈႁဵတ်းဢၼ်ၼႆႉယူႇတႄႉ ဢၼ်ဝႃႈၼၼ်ႉ၊ ယဝ်ႉၵေႃႈ ၸဝ်ႈၵဝ်ႇႁူႉပွင်ႇပႃးဝႃႈ လွင်ႈတေသိုပ်ႇပဵၼ်ၸွမ်းၽၢႆႇလင်လႄႈ လွင်ႈဝႃႈၸဝ်ႈၵဝ်ႇ ႁဵတ်းဢၼ်ၼႆႉၸွမ်းၼင်ႇ လွင်ႈလႆႈၸႂ်ၵၼ်တင်း \n [[{{MediaWiki:Policy-url}}|the policy]].",
        "revdelete-suppress-text": "လွင်ႈတဵၵ်းၵိုတ်း ၼႆႉ  <strong>ထုၵ်ႇလီ ၸႂ်ႉ</strong>  တွၼ်ႈတႃႇ လွင်ႈတၢင်း ၸိူင်ႉၼင်ႇ ပႃႈတႂ်ႈၼႆႉၵူၺ်း။\n* ၶေႃႈပူင်လွၼ်ႉၶၢဝ်ႇ ဢၼ်ဢၢပ်ႈပဵၼ်လႆႈ\n* လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ဢၼ်ဢမ်ႇဢၢပ်ႈ သၢင်ႇတေႃႇ\n*: <em>ႁဵင်းလိၵ်ႈႁိူၼ်း လႄႈ မၢႆၾူင်း၊ မၢႆၶႅပ်းၽၢင်တူဝ် ၸၵႂႃႇၸိူဝ်းၼႆႉ</em>",
        "revdelete-legend": "မၵ်းသႂ်ႇပၼ် လွင်ႈႁႄႉၵင်ႈ တႃႇႁၼ်လႆႈ",
-       "revdelete-hide-text": "á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "revdelete-hide-text": "á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "revdelete-hide-image": "လပ်ႉ ၶေႃႈပႃးၼႂ်း ၾၢႆႇ",
        "revdelete-hide-name": "လပ်ႉ ၶေႃႈယိူင်း လႄႈ ၽၢင်ၵိုၵ်း",
        "revdelete-hide-comment": "မႄးထတ်း ႁုဝ်ႁုပ်ႈ",
        "revdelete-radio-set": "လပ်ႉဝႆႉ",
        "revdelete-radio-unset": "ႁၼ်လႆႈ",
        "revdelete-suppress": "တဵၵ်းၵိုတ်းၶေႃႈမုၼ်း ၸိူဝ်းလုၵ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်ၶဝ် လႄႈ တၢင်ႇၸိူဝ်း",
-       "revdelete-unsuppress": "á\80\91á\80½á\81¼á\80ºá\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81µá\82\85á\80\90á\80ºá\82\87á\82\81á\82\84á\82\89 á\80¢á\81¼á\80ºá\80\99á\80®á\80¸á\80\90á\80®á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်ဢဝ်ဝႆႉၶိုၼ်းၼၼ်ႉ။",
+       "revdelete-unsuppress": "á\80\91á\80½á\81¼á\80ºá\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81µá\82\85á\80\90á\80ºá\82\87á\82\81á\82\84á\82\89 á\80¢á\81¼á\80ºá\80\99á\80®á\80¸á\80\90á\80®á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ဢဝ်ဝႆႉၶိုၼ်းၼၼ်ႉ။",
        "revdelete-log": "လွင်ႈတၢင်း :",
-       "revdelete-submit": "á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87á\82\81á\80µá\80\90á\80ºá\80¸ á\80\90á\80½á\81¼á\80ºá\82\88á\80\90á\82\83á\82\87 {{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\81¸á\80­á\80°á\80\9dá\80ºá\80¸}}ဢၼ်လိူၵ်ႈဝႆႉ",
+       "revdelete-submit": "á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87á\82\81á\80µá\80\90á\80ºá\80¸ á\80\90á\80½á\81¼á\80ºá\82\88á\80\90á\82\83á\82\87 {{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88.}}ဢၼ်လိူၵ်ႈဝႆႉ",
        "revdelete-success": "လွင်ႈႁၼ်လႆႈ ၵၢၼ်ၶူၼ်ႉလူၼႆႉ ပဵၼ် ဢၢပ်ႉတိတ်ႉၵႂႃႇယဝ်ႉ။",
        "revdelete-failure": "လွင်ႈႁၼ်လႆႈ ၵၢၼ်ၶူၼ်ႉလူၼႆႉ ဢမ်ႇပႆႇပဵၼ် ဢၢပ်ႉတိတ်ႉလႆႈ။\n$1",
        "logdelete-success": "မၵ်းသႂ်ႇ လွင်ႈႁၼ်လႆႈ သဵၼ်ႈမၢႆ",
        "revdelete-otherreason": "တၢင်ႇၸိူဝ်း / လွင်ႈတၢင်း ထႅမ်သႂ်ႇထႅင်ႈ",
        "revdelete-reasonotherlist": "လွင်ႈတၢင်းတၢင်ႇၸိူဝ်း",
        "revdelete-edit-reasonlist": "မႄးထတ်း လွင်ႈတၢင်း တႃႇမွတ်ႇ",
-       "revdelete-offender": "á\81½á\80°á\82\88á\80\90á\82\85á\80\99á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 :",
+       "revdelete-offender": "á\81½á\80°á\82\88á\80\90á\82\85á\80\99á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 :",
        "suppressionlog": "သဵၼ်ႈမၢႆ တဵၵ်းၵိုတ်း",
        "mergehistory": "ပိုၼ်းၸိူဝ်း ႁူမ်ႈၼႃႈလိၵ်ႈ",
-       "mergehistory-box": "á\80¢á\80\9dá\80ºá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87á\81¶á\80½á\80\84á\80º သွင်ၼႃႈလိၵ်ႈၼႆႉ ႁူမ်ႈၵၼ်",
+       "mergehistory-box": "á\80¢á\80\9dá\80ºá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88á\80\90á\80®á\82\88 သွင်ၼႃႈလိၵ်ႈၼႆႉ ႁူမ်ႈၵၼ်",
        "mergehistory-from": "ၼႃႈလိၵ်ႈ ငဝ်ႈငႃႇ :",
        "mergehistory-into": "ၼႃႈလိၵ်ႈ ယိူင်းၸူး :",
        "mergehistory-list": "ပိုၼ်းမႄးထတ်း ဢၼ်ၸၢင်ႈႁူမ်ႈလႆႈ",
        "mergehistory-go": "ၼႄပၼ် ၵၢၼ်မႄးထတ်း ဢၼ်ၸၢင်ႈႁူမ်ႈၵၼ်လႆႈ",
-       "mergehistory-submit": "á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 ႁူမ်ႈၵၼ်",
+       "mergehistory-submit": "á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ႁူမ်ႈၵၼ်",
        "mergehistory-empty": "ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ ဢၼ်တေၸၢင်ႈႁူမ်ႈၵၼ်လႆႈၼၼ်ႉ ဢမ်ႇမီး",
        "mergehistory-fail-bad-timestamp": "မိၵ်ႈၶၢဝ်းယၢမ်း ၼႆႉဢမ်ႇၸႂ်ႉလႆႈ",
        "mergehistory-fail-invalid-source": "ၼႃးလိၵ်ႈငဝ်ႈငႃႇ ၼႆႉ ဢမ်ႇၸႂ်ႉလႆႈ။",
        "mergelog": "သဵၼ်ႈမၢႆ ႁူမ်ႈၵၼ်",
        "revertmerge": "ၶိုၼ်းၸႅၵ်ႇဢွၵ်ႇ",
        "mergelogpagetext": "သဵၼ်ႈမၢႆ ၸိူဝ်းမီးတႂ်ႈၼႆႉ မၼ်းပဵၼ် သဵၼ်ႈမၢႆ ဢၼ်တိုၵ်ႉဢဝ်ပိုၼ်း ၼႃႈလိၵ်ႈဢၼ်ၼိုင်ႈ ၵႂႃႇလေႃႈၵၼ် ထႅင်ႈတၢင်ႇဢၼ်။",
-       "history-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°တွၼ်ႈတႃႇ \"$1\"",
-       "difference-title": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88 á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° á\80\90á\80\84á\80ºá\80¸ \"$1\"",
+       "history-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88တွၼ်ႈတႃႇ \"$1\"",
+       "difference-title": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88 á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\80\90á\80®á\82\88 \"$1\"",
        "difference-title-multipage": "လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ ၼႃႈလိၵ်ႈ \"$1\" လႄႈ \"$2\"",
        "difference-multipage": "(လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ ၼႃႈလိၵ်ႈ)",
        "lineno": "ထႅဝ် $1:",
-       "compareselectedversions": "á\81¼á\80­á\80°á\80\84á\80ºá\80¸á\81µá\81¼á\80ºá\80\90á\80°á\81ºá\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
-       "showhideselectedversions": "á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88 á\81µá\81¢á\81¼á\80ºá\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81¶á\80½á\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
+       "compareselectedversions": "á\81¼á\80­á\80°á\80\84á\80ºá\80¸á\81µá\81¼á\80ºá\80\90á\80°á\81ºá\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
+       "showhideselectedversions": "á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88 á\81µá\81¢á\81¼á\80ºá\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81¶á\80½á\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
        "editundo": "ၶိုၼ်ၶိုၼ်း",
        "diff-empty": "(ဢမ်ႇမီးလွင်ႈပႅၵ်ႇပိူင်ႈ)",
-       "diff-multi-sameuser": "({{PLURAL:$1|á\80\9cá\80½á\80\84á\80ºá\82\88á\80\99á\82\84á\80¸ á\80\95á\81¢á\81¼á\80ºá\81µá\81¢á\80\84á\80º |$1 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\82\84á\80¸ ပၢၼ်ၵၢင်}} ​ပေႃးတႃႇ ၽူႈၸႂ်တိုဝ်းမိူၼ်ၵၼ် တေဢမ်ႇၼႄပၼ်)",
+       "diff-multi-sameuser": "({{PLURAL:$1|á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\80\95á\81¢á\81¼á\80ºá\81µá\81¢á\80\84á\80º |$1 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ပၢၼ်ၵၢင်}} ​ပေႃးတႃႇ ၽူႈၸႂ်တိုဝ်းမိူၼ်ၵၼ် တေဢမ်ႇၼႄပၼ်)",
        "searchresults": "ၶူၼ်ႉႁႃၺႃး",
        "searchresults-title": "ၶူၼ်ႉႁႃၺႃးတွၼ်ႈတႃႇ \"$1\"",
        "titlematches": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ၶူပ်းၵၼ်ယူႇ",
        "searchprofile-everything-tooltip": "သွၵ်ႈႁႃလမ်းၼႂ်းတင်းမူတ်း (ဢိၵ်ႇပႃးၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်း)",
        "searchprofile-advanced-tooltip": "သွၵ်ႈႁႃတီႈၼႂ်း ဢွင်ႈတီႈၸိုဝ်ႈႁင်းတူဝ်",
        "search-result-size": "$1 ({{PLURAL:$2|1 ၶေႃႈ|$2 ၶေႃႈ}})",
-       "search-redirect": "(á\80\95á\80­á\81¼á\80ºá\82\87á\80\9eá\80µá\81¼á\80ºá\82\88á\80\90á\81¢á\80\84á\80ºá\80¸á\81¸á\80°á\80¸ $1)",
+       "search-redirect": "(á\80\95á\80­á\81¼á\80ºá\82\87á\80\9dá\81¢á\82\86á\82\87á\80\99á\82\83á\80¸á\80\90á\80®á\82\88 $1)",
        "search-section": "(တွၼ်ႈၵၼ် $1)",
        "search-category": "(တွၼ်ႈၵၼ် $1)",
        "search-suggest": "ၶႂ်ႈဝႃႈ $1 - ၼႆႁႃႉ",
        "search-interwiki-caption": "ၼႃႈၵၢၼ် ပီႈၼွင်ႉၵၼ်",
        "search-interwiki-default": "ၽွၼ်းလႆႈ ၵႃႈတီႈ $1 :",
        "search-interwiki-more": "(လိူဝ်)",
+       "search-interwiki-more-results": "ၽွၼ်းလႆႈ ဢၼ်ၼမ်လိူဝ်",
        "search-relatedarticle": "ၸိူဝ်းၵပ်းၵၢႆႇ",
        "searchrelated": "ၸိူဝ်းၵပ်းၵၢႆႇ",
        "searchall": "တင်းမူတ်း",
        "saveprefs": "ၵဵပ်းသိမ်း",
        "restoreprefs": "ၶိုၼ်းတမ်း ၵၢၼ်တင်ႈတင်းမူတ်း ႁႂ်ႈမိူၼ်ၵဝ်ႇၶိုၼ်း (ၵႃႈတီႈ တွၼ်ႈၵၼ်ၵူႈဢၼ်)",
        "prefs-editing": "တိုၵ်ႉမႄးထတ်းယူႇ",
-       "rows": "သၢႆတမ်း :",
-       "columns": "သၢႆၸုၵ်း :",
        "searchresultshead": "ၶူၼ်ႉႁႃ",
        "stub-threshold-sample-link": "တူဝ်ယၢင်ႇ",
        "stub-threshold-disabled": "ဢိုတ်းဝႆႉ",
        "recentchangescount": "တၢင်းၼမ်ၵၢၼ်မႄးထတ်း ဢၼ်တေၼႄဝႆႉၼင်ႇ ပိူင်ၵႅဝ်ႈ :",
        "prefs-help-recentchangescount": "ၼႆ့မၼ်းၶဝ်ႈပႃးဝႆႉ လွင်ႈလႅၵ်ႈလၢႆႈ မႂ်ႇမႂ်ႇ၊ ပိုၼ်းၼႃႈလိၵ်ႈ လႄႈ သဵၼ်ႈမၢႆ။",
        "savedprefs": "လွင်ႈလႆႈၸႂ်ၸဝ်ႈၵဝ်ႇၸိူဝ်းၼၼ်ႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
-       "savedrights": "á\80\9eá\80¯á\81¼á\80ºá\82\87á\80\9cá\82\86á\82\88ၽူႈၸႂ်ႉတိုဝ်း {{GENDER:$1|$1}} ၼႆႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
+       "savedrights": "á\81¸á\80¯á\80\99á\80ºá\80¸ၽူႈၸႂ်ႉတိုဝ်း {{GENDER:$1|$1}} ၼႆႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
        "timezonelegend": "ၼႃႈလိၼ် ၶၢဝ်းယၢမ်း :",
        "localtime": "ၶၢဝ်းယၢဝ်း ၼႂ်းမိူင်း :",
        "timezoneuseserverdefault": "ၸႂ်ႉပိူင်ၵႅဝ်ႈ ဝီႇၶီႇ ($1)",
        "prefs-diffs": "လွင်ႈပႅၵ်ႇပိူင်ႈ",
        "prefs-help-prefershttps": "ငဝ်ႈၵုမ်းၵၢၼ်ၼႆႉ ပေႃးဝႃႈ ၶိုၼ်းၶဝ်ႈလွၵ်ႉဢိၼ်ႇထႅင်ႈၵမ်းၼင်ႇ ၸင်ႇတေလႅၵ်ႈလၢႆႈ။",
        "userrights": "လွင်ႈၸတ်းၵၢၼ်သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုတ်း",
-       "userrights-lookup-user": "á\81¸á\80\90á\80ºá\80¸á\81µá\81¢á\81¼á\80º á\81¸á\80¯á\80\99á\80ºá\80¸ၽူႈၸႂ်ႉတိုဝ်း",
+       "userrights-lookup-user": "á\80\9cá\80­á\80°á\81µá\80ºá\82\88 ၽူႈၸႂ်ႉတိုဝ်း",
        "userrights-user-editname": "ပေႃႇသႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
-       "editusergroup": "á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ {{GENDER:$1|á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9dá\80ºá\80¸}} á\81¸á\80¯á\80\99်း",
+       "editusergroup": "á\80\95á\80­á\80¯á\80\90á\80ºá\82\87á\81¸á\80¯á\80\99á\80ºá\80¸ á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9d်း",
        "editinguser": "လႅၵ်ႈလၢႆႈသုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၶွင် {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "မႄးထတ်းၸိူဝ်းၸုမ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "userrights-editusergroup": "မႄးထတ်း ၸုမ်း{{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "userrights-viewusergroup": "တူၺ်း ၸုမ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
        "saveusergroups": "သိမ်း  ၸိူဝ်းၸုမ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
-       "userrights-groupsmember": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸ á\81¶á\80½á\80\84á\80º :",
-       "userrights-groupsmember-auto": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89 á\81¶á\80½á\80\84á\80º :",
+       "userrights-groupsmember": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸ á\80\90á\80®á\82\88 :",
+       "userrights-groupsmember-auto": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89 á\80\90á\80®á\82\88 :",
        "userrights-reason": "လွင်ႈတၢင်း :",
        "userrights-no-interwiki": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇ မႄးထတ်း သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်းၵႃႈတီႈဝီႇၶီႇ တၢင်ႇဢၼ်။",
        "userrights-nodatabase": "ယွင်ၶေႃႈမုၼ်း $1 ၼႆႉဢမ်ႇမီး ဢမ်ႇၼၼ် မၼ်းဢမ်ႇၸႂ်ႈ လူဝ်ႇၵႄႇ။",
-       "userrights-notallowed": "ၸဝ်ႈၵဝ်ႇဢမ်ႇလႆႈမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇ တေထႅမ်သႂ်ႇ ဢမ်ႇၼၼ် ထွၼ်ပႅတ်ႈ သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း",
        "userrights-changeable-col": "ၸုမ်း ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ၸၢင်ႈလႅၵ်ႈလၢႆႈ",
        "userrights-unchangeable-col": "ၸုမ်း ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ဢမ်ႇၸၢင်ႈလႅၵ်ႈလၢႆႈ",
        "userrights-conflict": "လွင်ႈလႅၵ်ႈလၢႆႈ သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်းၼၼ်ႉ မီးလွင်ႈယုင်ႈယၢင်ႈဝႆႉ။ ၶႅၼ်းတေႃႈ ၶိုၼ်းထတ်းတူၺ်းပၼ် သေ ၶိုၼ်းၼႄႉၼွၼ်းပၼ် လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇလႄႈ။",
-       "userrights-removed-self": "ၸဝ်ႈၵဝ်ႇထွၼ်ပႅတ်ႇ သုၼ်ႇလႆႈတူဝ်ၸဝ်ႈၵဝ်ႇ။ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈၶဝ်ႈၸႂ်ႉ ၼႃႈလိၵ်ႈၼႆႉလႆႈယဝ်ႉ။",
        "group": "ၸုမ်း :",
        "group-user": "ၽူႈၸႂ်ႉတိုဝ်း",
        "group-autoconfirmed": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၼႄႉၼွၼ်းတူဝ်ႁင်းၵူၺ်း",
        "right-delete": "မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
        "right-bigdelete": "မွတ်ႇပႅတ်ႈၼႃႈ ဢၼ်ၸိူၵ်းမီးဝႆႉ ပိုၼ်းယႂ်ႇၵႂၢင်ႈ",
        "right-deletelogentry": "မွတ်ႇပႅတ်ႈ လႄႈ ဢမ်ႇမွတ်ႇပႅတ်ႈ သဵၼ်ႈမၢႆသႂ်ႇသေ မၵ်းမၼ်ႈဝႆႉ",
-       "right-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\82\84á\82\88 á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\80\95á\80­á\80°á\80\9dá\80ºá\80¸á\80\9eá\80»á\80­á\81¼á\80ºá\80¸ၼႃႈလိၵ်ႈ ၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ",
+       "right-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\82\84á\82\88 á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႃႈလိၵ်ႈ ၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ",
        "right-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းသႂ်ႇဝႆႉ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇ၊ ဢမ်ႇတၢပ်ႈလူဝ်ႇ လိၵ်ႈဢၼ်ၵွင်ႉၵၢႆႇ ၶဝ်ဝႆႉ။",
-       "right-deletedtext": "á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9dá\82\86á\82\89â\80\8bá\80\9cá\82\84á\82\88 á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80\95á\81¼á\80º á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\80\95á\80­á\80°á\80\9dá\80ºá\80¸á\80\9eá\80»á\80­á\81¼á\80ºá\80¸ ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
+       "right-deletedtext": "á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9dá\82\86á\82\89â\80\8bá\80\9cá\82\84á\82\88 á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80\95á\81¼á\80º á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
        "right-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
        "right-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈ",
-       "right-suppressrevision": "á\80\90á\80°á\81ºá\80ºá\80¸á\81\8a á\80\9eá\80­á\80°á\80\84á\80ºá\82\87á\80\9cá\80\95á\80ºá\82\89 á\80\9cá\82\84á\82\88 á\81¼á\82\84á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၼႃႈလိၵ်ႈၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
+       "right-suppressrevision": "á\80\90á\80°á\81ºá\80ºá\80¸á\81\8a á\80\9eá\80­á\80°á\80\84á\80ºá\82\87á\80\9cá\80\95á\80ºá\82\89 á\80\9cá\82\84á\82\88 á\81¼á\82\84á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၼႃႈလိၵ်ႈၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
        "right-viewsuppressed": "တူၺ်း ၶေႃႈၶူၼ်ႉလူ ဢၼ်သိူင်ႇဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
        "right-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆႇ သုၼ်ႇတူဝ်",
        "right-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
        "right-userrights-interwiki": "မႄးထတ်း သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မီးဝႆႉယူႇ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇတၢင်ႇၸိူဝ်း",
        "right-siteadmin": "ၶတ်းသေႃး လႄႈ ဢမ်ႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း",
        "right-sendemail": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
-       "right-passwordreset": "တူၺ်း ဢီးမေး တင်ႈၶိုၼ်း ၶေႃႈလပ်ႉ",
        "right-managechangetags": "ၵေႃႇသၢင်ႈ လႄႈ (ဢမ်ႇ) တူင်ႉတိုၼ်ႇ  [[Special:Tags|tags]]",
        "right-deletechangetags": "မွတ်ႇပႅတ်ႈ  [[Special:Tags|tags]] ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း",
        "grant-generic": "\"$1\" ထုပ်ႉႁေႃႇ သုၼ်ႇလႆႈ",
        "grant-blockusers": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်း လႄႈ ဢမ်ႇႁႄႉတတ်း",
        "grant-createaccount": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
        "grant-createeditmovepage": "ၵေႃႇသၢင်ႈ၊ မႄးထတ်း လႄႈ ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈ",
-       "grant-delete": "á\80\99á\80½á\80\90á\80ºá\82\87 á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81\8a á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° လႄ သဵၼ်ႈမၢႆ သႂ်ႇၶဝ်ႈ",
+       "grant-delete": "á\80\99á\80½á\80\90á\80ºá\82\87 á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81\8a á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 လႄ သဵၼ်ႈမၢႆ သႂ်ႇၶဝ်ႈ",
        "grant-editinterface": "မႄးထတ်း လွၵ်းၸိုဝ်ႈ သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ လႄႈ ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript",
        "grant-editmycssjs": "မႄးထတ်း ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript ၸဝ်ႈၵဝ်ႇ",
        "grant-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၽူႈၸႂ်ႉတိုဝ်း ၶွင်ၸဝ်ႈၵဝ်ႇ",
        "grant-editpage": "မႄးထတ်း ၼႃႈလိၵ်ႈ မီးယူႇ ယၢမ်းလဵဝ်ၼႆႉ",
        "grant-editprotected": "မႄးထတ်း ၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉ",
        "grant-highvolume": "ၵၢၼ်မႄးထတ်း ဢၼ်ယႂ်ႇၵႂၢင်ႈ",
-       "grant-oversight": "á\80\9cá\80\95á\80ºá\82\89á\80\9dá\82\86á\82\89 á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9dá\80ºá\80¸ á\80\9cá\82\84á\82\88 á\80\90á\80µá\81µá\80ºá\80¸á\80\90á\80µá\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "grant-oversight": "á\80\9cá\80\95á\80ºá\82\89á\80\9dá\82\86á\82\89 á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9dá\80ºá\80¸ á\80\9cá\82\84á\82\88 á\80\90á\80µá\81µá\80ºá\80¸á\80\90á\80µá\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "grant-sendemail": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
        "grant-uploadeditmovefile": "လူတ်ႇၶိုၼ်ႈ၊  တၢင်တီႈ လႄႈ ၶၢႆႉၾၢႆႇ",
        "grant-uploadfile": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်မႂ်ႇ",
        "action-upload_by_url": "လုၵ်ႉၵႃႈတီႈ URL သေ လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
        "action-writeapi": "ၸႂ်ႉတိုဝ်း လွင်ႈတႅမ်ႈ API",
        "action-delete": "မွတ်ႇပႅတ်ႈၼႃႈလိၵ်ႈၼႆႉ",
-       "action-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89",
-       "action-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းမွတ်ႇပႅတ်ႈ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
+       "action-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
        "action-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
-       "action-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈၼႆ့",
-       "action-suppressrevision": "á\80\90á\80°á\81ºá\80ºá\80¸á\80\91á\80\90á\80ºá\80¸á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\80\9cá\82\84á\82\88 á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\80¢á\80\9dá\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\82\81á\82\83ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
+       "action-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈ",
+       "action-suppressrevision": "á\80\91á\80\90á\80ºá\80¸á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\80\9cá\82\84á\82\88 á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\80¢á\80\9dá\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
        "action-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆ သုၼ်ႇတူဝ်",
        "action-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
        "action-protect": "လႅၵ်ႈလၢႆႈၸၼ်ႉထၢၼ်ႈ ၵၢၼ်ႁႄႉၵင်ႈ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ",
        "action-import": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
        "action-importupload": "ဢဝ်ၼႃႈလိၵ်ႈၸိူဝ်း ၵႃႈတီႈၾၢႆႇလူတ်ႇၶိုၼ်ႈၼၼ်ႉ သႂ်ႇၶဝ်ႈ",
+       "action-patrol": "မၢႆ လွင်ႈမႄးထတ်း တၢင်ႇၸိူဝ်း ၼင်ႇ ထုၵ်ႇပႂ်ႉတူၺ်း",
+       "action-autopatrol": "လွင်ႈမႄးထတ်းၸဝ်ႈၵဝ်ႇ မၢႆဝႆႉယဝ်ႉၼင်ႇ ထုၵ်ႇပႂ်ႉတူၺ်း",
        "action-unwatchedpages": "တူၺ်းသဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈတူၺ်း ဢမ်ႇပႆႇလႆႈတူၺ်းဝႆႉၼၼ်ႉ",
        "action-mergehistory": "ဢဝ်ပိုၼ်းၶွင်ၼႃႈလိၵ်ႈ ႁူမ်ႈၵၼ်",
        "action-userrights": "မႄးထတ်းသုၼ်ႇလႆႈ တႃႇၽူႈၸႂ်ႉတိုဝ်း တင်းသဵင်ႈ",
        "action-userrights-interwiki": "မႄးထတ်း သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မီးဝႆႉယူႇ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇတၢင်ႇၸိူဝ်း",
        "action-siteadmin": "ၶတ်းသေႃး လႄႈ ဢမ်ႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း",
        "action-sendemail": "သူင်ႇ ဢီးမေးလ်",
+       "action-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၸဝ်ႈၵဝ်ႇ",
        "action-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
        "action-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
        "action-viewmyprivateinfo": "တူၺ်း လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ",
        "action-editcontentmodel": "မႄးထတ်း ၽၢင်ႁၢင်ႈတူဝ်ၶဝ်ႈပႃး ၶွင်ၼႃႈလိၵ်ႈ",
        "action-managechangetags": "ၵေႃႇသၢင်ႈ လႄႈ (ဢမ်ႇ)တူင်ႉတိုၼ်ႇ တူဝ်တိင်",
        "action-applychangetags": "တိင်ၸပ်းၸွမ်းၼင်ႇ လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ",
+       "action-changetags": "ထႅမ်သႂ်ႇ လႄႈ ထွၼ်ပႅတ်ႈတိင်ၸိူဝ်းလႃႈလီႈ ၸပ်းသႂ်ႇဝႆႉ တီႈ ၵၢၼ်ၶူၼ်ႉၶႆႈ ဢၼ်လႂ် ဢၼ်ၼၼ်ႉလႄႈ သဵၼ်ႈမၢႆတင်းသဵင်ႈ။",
        "action-deletechangetags": "မွတ်ႇပႅတ်ႈ တိင်ႇၸိူဝ်းမီးယူႇ ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း",
+       "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-activefilters": "တူဝ်ထွင် ဢၼ်တူင်ႉၼိုင်",
+       "rcfilters-restore-default-filters": "ဝႆႉၶိုၼ်း တူဝ်ထွင် ပိူင်ၵႅဝ်ႈ",
+       "rcfilters-clear-all-filters": "ၽဵဝ်ႈလၢင်ႉ တူဝ်ထွင်တင်းမူတ်း",
+       "rcfilters-search-placeholder": "ထွင်ဢဝ် လွင်ႈလႅၵ်ႈလၢႆႈ ၸိူဝ်းႁဵတ်းၵႂႃႇ (ပိုတ်ႇႁႃ ဢမ်ႇၼၼ် တႄႇပေႃႉ)",
+       "rcfilters-invalid-filter": "ထွင်ႁႃ ၽိတ်းပိူင်ႈ",
+       "rcfilters-empty-filter": "ဢမ်ႇမီးတူဝ်ထွင် ဢၼ်တူင်ႉၼိုင်။ ၵၢၼ်ၶဝ်ႈႁူမ်ႈတၢင်းသဵင်ႈၵေႃႈၼႄဝႆႉယူႇ။",
+       "rcfilters-filterlist-title": "တူဝ်ထွင်",
+       "rcfilters-filterlist-noresults": "ဢမ်ႇႁၼ်မီးတူဝ်ထွင်",
+       "rcfilters-filtergroup-registration": "လွင်ႈတၢင်ႇမၢႆၽၢင် ၽူႈၸႂ်ႉတိုဝ်း",
+       "rcfilters-filter-registered-label": "တၢင်ႇမၢႆၾၢင်ဝႆႉယဝ်ႉ",
+       "rcfilters-filter-registered-description": "ၽူႈမႄးထတ်းၶဝ် ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ",
+       "rcfilters-filter-unregistered-label": "ဢမ်ႇလႆႈတၢင်ႇမၢႆႇၽၢင်ဝႆႉ",
+       "rcfilters-filter-unregistered-description": "ၽူႈမႄးထတ်း ၸိူဝ်းဢမ်ႇလႆႈၶဝ်ႈ လွၵ်ႉဢိၼ်ႇဝႆႉ",
+       "rcfilters-filtergroup-authorship": "မႄးထတ်း ၸဝ်ႈပၢႆၵမ်",
+       "rcfilters-filter-editsbyself-label": "လွင်ႈမႄးထတ်း ၸဝ်ႈၵဝ်ႇ",
+       "rcfilters-filter-editsbyself-description": "ဢၼ်ၸဝ်ႈၵဝ်ႇ ၵေႃႉထတ်း",
+       "rcfilters-filter-editsbyother-label": "ဢၼ်တၢင်ႇၵေႃႉ ၵေႃႉထတ်း",
+       "rcfilters-filter-editsbyother-description": "ၵၢၼ်မႄးထတ်း ဢၼ်ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း ၵေႃသၢင်ႈဝႆႉ (ဢၼ်ဢမ်ႇၸႂ်ႈ ၸဝ်ႈၵဝ်ႇ)",
+       "rcfilters-filtergroup-userExpLevel": "ၸၼ်ႉထၢၼ်ႈ တူဝ်ထူပ်း (တွၼ်ႈတႃႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတၢင်ႇဝႆႉ မႆၽၢင်ၵူၺ်း)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "ၵူၼ်းၼႃႈမႂ်ႇ",
+       "rcfilters-filter-userExpLevel-newcomer-description": "ဢေႇလိူဝ် ၵၢၼ်မႄးထတ်း ႑႐ ဢၼ် လႄႈ လွင်ႈတူင်ႉၼိုင် တႃႇသီႇဝၼ်း",
+       "rcfilters-filter-userExpLevel-learner-label": "ၽူႈလဵပ်ႈႁဵၼ်း",
+       "rcfilters-filter-userExpLevel-learner-description": "ၵၢၼ်တူင်ႉၼိုင်လႄႈ ၵၢၼ်မႄးထတ်း ဝၼ်းမၼ်း ၼမ်လိူဝ်သေ \"ၵူၼ်းၼႃႈမႂ်ႇ\"သေတႃႉ ဝၼ်းမၼ်းတိုၵ်ႉဢေႇလိူဝ်သေ \"ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း\"။",
+       "rcfilters-filter-userExpLevel-experienced-label": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း",
+       "rcfilters-filter-userExpLevel-experienced-description": "လွင်ႈတူင်ႉၼိုင် ၼမ်လိူဝ် ႓႐ ဝၼ်း လႄႈ လွင်ႈမႄးထတ်း ႕႐႐ ။",
+       "rcfilters-filtergroup-automated": "ၶဝ်ႈႁူမ်ႈႁင်းၵႂႃႇႁင်းမၼ်း",
+       "rcfilters-filter-bots-label": "ပွတ်ႉ",
+       "rcfilters-filter-bots-description": "ၶိူင်ႈႁဵတ်းႁင်းၶေႃ ၵေႃႉႁဵတ်းသၢင်ႈဝႆႉ လွင်ႈမႄးထတ်း",
+       "rcfilters-filter-humans-label": "ၵူၼ်း (ဢမ်ႇၸႂ်ႈပွတ်ႉ)",
+       "rcfilters-filter-humans-description": "ၽူႈမႄးထတ်း ပဵၼ်ၵူၼ်း ၵေႃႉ ႁဵတ်း ၵၢၼ်မႄးထတ်း။",
+       "rcfilters-filtergroup-significance": "လွင်ႈယိူင်းဢၢၼ်း",
+       "rcfilters-filter-minor-label": "လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
+       "rcfilters-filter-minor-description": "မႄးထတ်း ၽူႈတႅမ်ႈလိၵ်ႈ ဢၼ်မၢႆၸပ်းဝႆႉၼင်ႇ တွၼ်ႈဢွၼ်ႇ။",
+       "rcfilters-filter-major-label": "ဢမ်ႇမီး ၵၢၼ်မႄးထွၼ်း တွၼ်ႈဢွၼ်ႇ",
+       "rcfilters-filter-major-description": "မႄးထတ်း ဢၼ်ဢမ်ႇမၢႆၸပ်းဝႆႉၼင်ႇ တွၼ်ႈဢွၼ်ႇ။",
+       "rcfilters-filtergroup-changetype": "လိူင်ႈ လွင်ႈလႅၵ်ႈလၢႆႈ",
+       "rcfilters-filter-pageedits-label": "မႄးထတ်းၼႃႈလိၵ်ႈ",
+       "rcfilters-filter-pageedits-description": "မႄးထတ်းၸူး လမ်းၼႂ်းဝီႇၶီႇ၊ လွင်ႈဢုပ်ႇဢူဝ်း၊ ၶေႃႈသပ်းလႅင်း တွၼ်ႈၵၼ်...",
+       "rcfilters-filter-newpages-label": "လွင်ႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "rcfilters-filter-newpages-description": "မႄးထတ်း ဢၼ်ႁဵတ်းပဵၼ် ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ",
+       "rcfilters-filter-categorization-label": "လႅၵ်ႈလၢႆႈ တွၼ်ႈၵၼ်",
        "rclistfrom": "ၼႄ လွင်ႈ​လႅၵ်ႈလၢႆႈဢၼ်မႂ်ႇ တႄႇတီႈ $2, $3",
        "rcshowhideminor": "$1 လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
        "rcshowhideminor-show": "ၼႄ",
        "watchthisupload": "ပႂ်ႉတူၺ်းၾၢႆႇဢၼ်ၼႆႉ",
        "upload-dialog-title": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
        "upload-dialog-button-cancel": "ဢမ်ႇႁဵတ်း",
+       "upload-dialog-button-back": "ႁူၼ်လင်",
        "upload-dialog-button-done": "ယဝ်ႉ",
        "upload-dialog-button-save": "ၵဵပ်းသိမ်း",
        "upload-dialog-button-upload": "လူတ်ႇၶိုၼ်ႈ",
        "backend-fail-connect": "ဢမ်ႇၸၢင်ႈၵွင်ႉသိုပ်ႇၸူး ဢွင်ႈသိမ်းသုတ်းလင် \"$1\" ။",
        "backend-fail-internal": "လွင်ႈၽိတ်းပိူင်ႈ ဢၼ်ဢမ်ႇႁူႉလွင်ႈမၼ်း လႆႈပဵၼ်ဝႆႉ ၵႃႈတီႈၼႂ်း ဢွင်ႈသိမ်းသုတ်းလင် \"$1\" ။",
        "backend-fail-contenttype": "ဢမ်ႇၸၢင်ႈတႅပ်းတတ်းလိူင်ႈၾၢႆႇ ဢၼ်တႃႇတေသိမ်းၵႃႈတီႈ \"$1\" ။",
-       "backend-fail-batchsize": "ဢွင်ႈတီႈသိမ်းသုတ်းလင် ထုၵ်ႇပၼ်ဝႆႉ ၸုမ်းၾၢႆႇ $1 ၾၢႆႇ\n{{PLURAL:$1|ၵၢၼ်ႁဵတ်း|ၵၢၼ်ႁဵတ်း}}; တီႈမၵ်းၶၢၼ်းမၼ်းပဵၼ် $2\n{{PLURAL:$2|ၵၢၼ်ႁဵတ်း|ၵၢၼ်ႁဵတ်း}}.",
+       "backend-fail-batchsize": "ဢွင်ႈတီႈသိမ်းသုတ်းလင် ထုၵ်ႇပၼ်ဝႆႉ ၸုမ်းၾၢႆႇ $1 ၾၢႆႇ\n{{PLURAL:$1|ၵၢၼ်ႁဵတ်း}}; တီႈမၵ်းၶၢၼ်းမၼ်းပဵၼ် $2\n{{PLURAL:$2|ၵၢၼ်ႁဵတ်း}}။",
        "backend-fail-usable": "ဢမ်ႇၸၢင်ႈလူ ဢမ်ႇၼၼ် ဢမ်ႇၸၢင်ႈတႅမ်ႈ ၾၢႆႇ \"$1\" ယွၼ်ႉပိူဝ်ႈဝႃႈ ၵၢၼ်လူတ်းပွႆႇ ဢမ်ႇတဵမ်ထူၼ်ႈ ဢမ်ႇၼၼ် ႁၢမ်းဝႆႉ ဢွင်ႈတီႈသိမ်း။",
        "filejournal-fail-dbconnect": "ဢမ်ႇၸၢင်ႈၵွင်ႉသိုပ်ႇၸူး ယေးၶေႃႈမုၼ်း ၵျႃႇၼႄႇ တွၼ်ႈတႃႇ ဢွင်ႈတီႈသိမ်းသုတ်းလင် \"$1\" ။",
        "filejournal-fail-dbquery": "ဢမ်ႇၸၢင်ႈဢၢပ်ႉတိတ်ႉ ယေးၶေႃႈမုၼ်း ၵျႃႇၼႄႇ တွၼ်ႈတႃႇ ဢွင်ႈတီႈသိမ်းသုတ်းလင် \"$1\" ။",
        "filehist-help": "တဵၵ်းၼိူဝ် ဝၼ်းထိ/ၶၢဝ်းယၢမ်း တႃႇႁၼ်ၾၢႆႇ ၼႂ်းဝၼ်းၼၼ်ႉ",
        "filehist-deleteall": "မွတ်ႇပႅတ်ႈမူတ်း",
        "filehist-deleteone": "မွတ်ႇပႅတ်ႈ",
-       "filehist-revert": "á\80\95á\80­á\81¼á\80ºá\82\87á\80\95á\80½á\81µá\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸",
+       "filehist-revert": "ပိၼ်ႈၶိုၼ်း",
        "filehist-current": "ယၢမ်းလဵဝ်",
        "filehist-datetime": "ဝၼ်းထီႉ/ၶၢဝ်းယၢမ်း",
        "filehist-thumb": "ႁၢင်ႈလဵၵ်ႉ",
        "shared-repo-from": "လုၵ်ႉတီႈ $1",
        "shared-repo": "ယွင်ဢၼ်ၽႄႈၸႂ်ႉဝႆႉ",
        "upload-disallowed-here": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ တႅမ်တၢင်သႂ်ႇၼိူဝ် ၾၢႆႇဢၼ်ၼႆႉ",
-       "filerevert": "á\81¶á\80°á\81¼á\80ºá\82\89á\80\95á\80­á\81¼á\80ºၸူး $1",
+       "filerevert": "á\80\95á\80­á\81¼á\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ၸူး $1",
        "filerevert-legend": "ၶူၼ်ႉပိၼ်ႇၾၢႆႇ",
-       "filerevert-intro": "ၸဝ်ႈၵဝ်ႇ ၶူၼ်ႉပိၼ်ႇတေၶူၼ်ႉပိၼ်ႇ ၾၢႆႇ <strong>[[Media:$1|$1]]</strong> ၸူး  [$4 မၢႆဢွၵ်ႇ ၼင်ႇ $3, $2].",
+       "filerevert-intro": "ၸဝ်ႈၵဝ်ႇတေပိၼ်ႈၶိုၼ်း ၾၢႆႇ <strong>[[Media:$1|$1]]</strong> ၸူး  [$4 မၢႆဢွၵ်ႇ ၼင်ႇ $3, $2].",
        "filerevert-comment": "လွင်ႈတၢင်း :",
-       "filerevert-defaultcomment": "á\81¶á\80°á\81¼á\80ºá\82\89á\80\95á\80­á\81¼á\80ºá\82\87 ၸူး မၢႆဢွၵ်ႇ ၼင်ႇ $2, $1 ($3)",
+       "filerevert-defaultcomment": "á\80\95á\80­á\81¼á\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ ၸူး မၢႆဢွၵ်ႇ ၼင်ႇ $2, $1 ($3)",
        "filerevert-submit": "ၶူၼ်ႉပိၼ်ႇ",
-       "filerevert-success": "<strong>[[Media:$1|$1]]</strong>á\81¼á\82\86á\82\89á\80\91á\80¯á\81µá\80ºá\82\87á\81¶á\80°á\81¼á\80ºá\82\89á\80\95á\80­á\81¼á\80ºá\82\87ၸူး [$4 မၢႆဢွၵ်ႇၼင်ႇ ၶွင် $3, $2].",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong>á\81¼á\82\86á\82\89á\80\91á\80¯á\81µá\80ºá\82\87á\80\95á\80­á\81¼á\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ၸူး [$4 မၢႆဢွၵ်ႇၼင်ႇ ၶွင် $3, $2].",
        "filedelete": "မွတ်ႇပႅတ်ႈ $1",
        "filedelete-legend": "မွတ်ႇပႅတ်ႈ ၾၢႆႇ",
        "filedelete-intro": "ၸဝ်ႈၵဝ်ႇ တေမွတ်ႇပႅတ်ႈၾၢႆႇ  <strong>[[Media:$1|$1]]</strong> ဢၼ်ၵိုၵ်းဝႆႉ ပိုၼ်းမၼ်းတင်းသဵင်ႈတင်းမူတ်း။",
        "unusedtemplates": "လွၵ်းပိူင် ဢၼ်ဢမ်ႇၸႂ်ႉဝႆႉ",
        "unusedtemplateswlh": "ႁဵင်းၵွင်ႉ တၢင်ႇၸိူဝ်း",
        "randompage": "ဢဝ်ၼႃႈလိၵ်ႈသၢင်ႇထုၵ်ႇဝႃႈ",
-       "randompage-nopages": "တၢင်းၽၢႆႇတႂ်ႈၼၼ်ႉ ဢမ်ႇမီးဝႆႉ ၼႃႈလိၵ်ႈသင်\n{{PLURAL:$2|လွၵ်းၸိုဝ်ႈ|လွၵ်းၸိုဝ်ႈ}}: $1.",
+       "randompage-nopages": "တၢင်းၽၢႆႇတႂ်ႈၼၼ်ႉ ဢမ်ႇမီးဝႆႉ ၼႃႈလိၵ်ႈသင်\n{{PLURAL:$2|လွၵ်းၸိုဝ်ႈ}}: $1 ။",
        "randomincategory": "ၼႃႈလိၵ်ႈၵမ်ႉသၢင်ႇတေႃႇ ၵႃႈတီႈၼႂ်း လိူင်ႈ",
        "randomincategory-invalidcategory": "\"$1\" ၼႆႉ ပဵၼ်ၸိုဝ်ႈလိူင်ႈ ဢၼ်ဢမ်ႇပဵၼ်လႆႈ။",
        "randomincategory-nopages": "မၼ်းဢမ်ႇမီးဝႆ ၼႃႈလိၵ်ႈသင် ၵႃႈတီႈၼႂ်း [[:Category:$1|$1]] လိူင်ႈ။",
        "withoutinterwiki-summary": "ၼႃႈလိၵ်ႈၸိူဝ်းပႃႈတႂ်ႈၼႆႉ မၼ်းဢမ်ႇၵွင်ႉဝႆႉၸူး မၢႆဢွၵ်ႇၽႃႇသႃႇၵႂၢမ်း တၢင်ႇၸိူဝ်း",
        "withoutinterwiki-legend": "တူဝ်ၼမ်းၼႃႈ",
        "withoutinterwiki-submit": "ၼႄ",
-       "fewestrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\82\81á\82\83 ဢၼ်ဢေႇသေပိူၼ်ႈ",
+       "fewestrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ဢေႇသေပိူၼ်ႈ",
        "nbytes": "$1 {{PLURAL:$1|ၿႆႉ|ၿႆႉ}}",
        "ncategories": "{{PLURAL:$1|လိူင်ႈ|လိူင်ႈတင်းလၢႆ}}",
        "ninterwikis": "$1 {{PLURAL:$1|ဝီႇၶီႇၽၢႆႇၼႂ်း|ဝီႇၶီႇၸိူဝ်းၽၢႆႇၼႂ်း}}",
        "nlinks": "$1 {{PLURAL:$1|ႁဵင်းၵွင်ႉ|ႁဵင်းၵွင်ႉၼမ်}}",
        "nmembers": "$1 {{PLURAL:$1|member|ၽူႈၶဝ်ႈၸုမ်း}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$1|member|ၽူႈၶဝ်ႈၸုမ်း}}",
-       "nrevisions": "$1 {{PLURAL:$1|â\80\8bá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°|á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°}}",
+       "nrevisions": "$1 {{PLURAL:$1|â\80\8bá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88}}",
        "nimagelinks": "ၸႂ်ႈဝႆႉ တီႈ $1 {{PLURAL:$1|page|ၼႃႈလိၵ်ႈ}}",
        "ntransclusions": "ၸႂ်ႉဝႆႉၵႃႈတီႈၼိူဝ် $1 {{PLURAL:$|page|ၼႃႈလိၵ်ႈ}}",
        "specialpage-empty": "တွၼ်ႈတႃႇ ၶေႃႈပွင်ႇၼႄ ဢၼ်ၼႆႉၼႆႉ မၼ်းဢမ်ႇမီး ၽွၼ်းလႆႈ။",
        "mostcategories": "ၼႃႈလိၵ်ႈၸိူဝ်း မီးလိူင်ႈၼမ်သေပိူၼ်ႈ",
        "mostimages": "ၾၢႆႇ ၸိူဝ်းမီး ႁဵင်းၵွင်ႉၸူး ၼမ်သေပိူၼ်ႈ",
        "mostinterwikis": "ၼႃႈလိၵ်ႈ ၸိူဝ်းမီး ဝီႇၶီႇၼႂ်ႈ ၼမ်သေပိူၼ်ႈ",
-       "mostrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်ၼမ်သေပိူၼ်ႈ",
+       "mostrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ၼမ်သေပိူၼ်ႈ",
        "prefixindex": "ၼႃႈလိၵ်ႈတင်းသဵင်ႈ ၸိူဝ်းဢၼ်ပႃး တူဝ်ၼမ်းၼႃႈ",
        "prefixindex-namespace": "ၼႃႈလိၵ်ႈတင်းသဵင်ႈ ဢၼ်ပႃး တူဝ်ၼမ်းၼႃႈ ($1 လွၵ်းၸိုဝ်ႈ)",
        "prefixindex-submit": "ၼႄ",
        "allpagessubmit": "ၶူၼ်ႉႁႃ",
        "allpagesprefix": "ၼႃးလိၵ်ႈဢၼ်ၼႄ ဢိၵ်ႇတင်း ၶေႃႈလူင်ႈၼႃႈ",
        "categories": "လိူင်ႈ",
+       "sp-deletedcontributions-contribs": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
+       "linksearch": "သွၵ်ႈႁႃ ႁဵင်းၵွင်ႉၽၢႆႇၼွၵ်ႈ",
+       "linksearch-pat": "လၢႆးသွၵ်ႈႁႃႈ :",
+       "linksearch-ns": "ဢွင်ႈတီႈၸိုဝ်ႈ",
+       "linksearch-ok": "ၶူၼ်ႉႁႃ",
+       "linksearch-line": "$1 ၼႆႉ ၵွင်ႉဝႆႉၵႃႈတီႈ $2",
+       "listusersfrom": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတႄႇမႃးတီႈ :",
+       "listusers-submit": "ၼႄ",
+       "listusers-noresult": "ဢမ်ႇႁၼ် ၽူႈၸႂ်ႉတိုဝ်း",
+       "listusers-blocked": "(ႁႄႉတတ်းဝႆႉ)",
+       "activeusers": "သဵၼ်ႈမၢႆ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတူင်ႉၼိုင်",
+       "activeusers-intro": "ၼႆႉတႄႉပဵၼ် သဵၼ်ႈမၢႆၽူႈၸႂ်ႉတိုဝ်း ၵေႃႉၸိူဝ်းဢၼ်မီး လွင်ႈတူင်ႉၼိုင် ၼႂ်းၵႄႈ ၵမ်းလိုၼ်းသုတ်း $1 {{PLURAL:$1|ဝၼ်း|ဝၼ်းလိူဝ်}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|တူင်ႉၼိုင်|တူင်ႉၼိုင််}} in the last {{PLURAL:$3|ဝၼ်း|$3 ဝၼ်း}}",
+       "activeusers-from": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတႄႇမႃးတီႈ :",
+       "activeusers-groups": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပိူင်ႇၸူးၸုမ်း:",
+       "activeusers-excludegroups": "ပၢၵ်ႈဝႆႉ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပိူင်ႇၸူးၸုမ်း:",
+       "activeusers-noresult": "ဢမ်ႇႁၼ် ၽူႈၸႂ်ႉတိုဝ်း",
+       "activeusers-submit": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးလွင်ႈတူင်ႉၼိုင်",
+       "listgrouprights": "သုၼ်ႇၸုမ်းၽူႈၸႂ်ႉတိုဝ်း",
+       "listgrouprights-summary": "ၸိူဝ်းၽၢႆႇတႂ်ႈၼႆႉ ပဵၼ်သဵၼ်ႈမၢႆၸုမ်းၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းဢၼ်မၵ်းမၢႆဝႆႉတီႈ ဝီႇၶီႇဢၼ်ၼႆႉ၊ မၵ်းမၼ်ႈဝႆႉပၼ်ၸွမ်း သုၼ်ႇႁဵတ်းတွၼ်ႈတႃႇၶဝ်။ ၸိူဝ်းၼၼ်ႉတႄႉ တေၸၢင်ႈပဵၼ်လႆႈ [[{{MediaWiki:Listgrouprights-helppage}}|လွၼ်ႉၶၢဝ်ႇ ၸိူဝ်းထႅမ်သႂ်ႇဝႆႉ​ထႅင်ႈ]]",
+       "listgrouprights-key": "ၶေႃႈၶႆႈလၢတ်ႈ:\n* <span class=\"listgrouprights-granted\">သုၼ်ႇ ဢၼ်ၶႂၢင်းပၼ်ဝႆႉ</span>\n* <span class=\"listgrouprights-revoked\">သုၼ် ဢၼ်ယႃႉပႅတ်ႈဝႆႉ</span>",
+       "listgrouprights-group": "ၸုမ်း :",
+       "listgrouprights-rights": "သုၼ်ႇ",
+       "listgrouprights-helppage": "ၸွႆႈထႅမ်:သုၼ်ႇၸုမ်း",
+       "listgrouprights-members": "(သဵၼ်ႈမၢႆ ၽူႈၸႂ်ႉတိုဝ်း)",
+       "listgrouprights-addgroup": "ထႅမ်သႂ်ႇ {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}}: $1",
+       "listgrouprights-removegroup": "ထွၼ်ပႅတ်ႈ {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}}: $1",
+       "listgrouprights-addgroup-all": "ထႅမ်သႂ်ႇ ၸုမ်းတင်းသဵင်ႈ",
+       "listgrouprights-removegroup-all": "ထွၼ်ပႅတ်ႈ ၸုမ်းတင်းသဵင်ႈ",
+       "listgrouprights-addgroup-self": "ထႅမ် {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}} သႂ်ႇၸူး ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ: $1",
+       "listgrouprights-removegroup-self": "ထွၼ်ပႅတ်ႈ {{PLURAL:$2|ၸုမ်း}} ၵႃႈတီႈ ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ: $1",
+       "listgrouprights-addgroup-self-all": "ထႅမ်ၸုမ်းတင်းသဵင်ႈ သႂ်ႇတီႈ ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ",
+       "listgrouprights-removegroup-self-all": "ထွၼ်ၸုမ်းတင်းသဵင်ႈပႅတ်ႈ ၵႃႈတီႈ ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ",
+       "listgrouprights-namespaceprotection-header": "လွင်ႈမၵ်းၶၢၼ်း ဢွင်ႈၸိုဝ်ႈ",
+       "listgrouprights-namespaceprotection-namespace": "ဢွင်ႈတီႈၸိုဝ်ႈ",
+       "listgrouprights-namespaceprotection-restrictedto": "သုၼ်ႇ ၸိူဝ်းပၼ်သုၼ်ႇ ၽူႈၸႂ်ႉတိုဝ်း တွၼ်ႈတႃႇမႄးထတ်း",
+       "listgrants": "ပၼ်သုၼ်ႇ",
+       "listgrants-summary": "ၸိူဝ်းၽၢႆႇတႂ်ႈၼႆႉ ပဵၼ်သဵၼ်ႈမၢႆ ၸိူဝ်းပၼ်သုၼ်ႇ ဢၼ်ဢိၵ်ႇတင်း သုၼ်ႇႁဵတ်းလႆႈ တႃႇ ၽူႈၸႂ်ႉတိုဝ်း။ ၽူႈၸႂ်ႉတိုဝ်းၶဝ် ၸၢင်ႈၼႄႉၼွၼ်းပၼ်ဢႅပ်ႉ တွၼ်ႈတႃႇၸႂ်ႉတိုဝ်း ဢၶွင်ႉၶွင်ၶဝ်၊ ၵူၺ်းၵႃႈဝႃႈ ဢိင်ၼိူဝ် ၽူႈၸႂ်ႉတိုဝ်း ပၼ်သုၼ်ႇဢႅပ်ႉၵႃႈႁိုဝ်ၵေႃႈ တေမီး လွင်ႈမၵ်းၶၢၼ်းမွၵ်ႈၼၼ်ႉ။ ဢႅပ်ႉၼိုင်ႈဢၼ်ၼႆႉ မၼ်းတေၸၢင်ႈ ႁဵတ်းသၢင်ႇၼင်ႇ တူဝ်ၽူႈၸႂ်ႉတိုဝ်းသေတႃႉ မၼ်းတေဢမ်ႇမီးသုၼ်ႇၸႂ်ႉၼင်ႇ တူဝ်ၽူႈၸႂ်ႉတိုဝ်း ၸၢင်ႈၸႂ်ႉၼၼ်ႉ။\nၼၼ်ႉတႄႉ တေၸၢင်ႈပဵၼ်လႆႈ  [[{{MediaWiki:Listgrouprights-helppage}}|လွၼ်ႉၶၢဝ်ႇ ဢၼ်ထႅမ်သႂ်ႇဝႆႉထႅင်ႈ]] ဢၼ်ၵပ်းၵၢႆႇလူၺ်ႈ သုၼ်ႇဢၼ်လႂ်ဢၼ်ၼၼ်ႉ။",
+       "listgrants-grant": "ပၼ်သုၼ်ႇ",
+       "listgrants-rights": "သုၼ်ႇ",
+       "trackingcategories": "တွၼ်ႈၵၼ် ၸွမ်းႁွႆး",
+       "trackingcategories-msg": "တွၼ်ႈၵၼ် ၸွမ်းႁွႆး",
+       "trackingcategories-name": "ၸိုဝ်ႈ လိၵ်ႈပွင်ႇၶၢဝ်ႇ",
+       "restricted-displaytitle-ignored": "ၼႃႈလိၵ်ႈ ၸိူဝ်းၶၢမ်ႈဝႆႉ တႃႇၼႄႁူဝ်ၶေႃႈ",
+       "restricted-displaytitle-ignored-desc": "ၼႃႈလိၵ်ႈ ဢၼ်ၶၢမ်ႈဝႆႉ  <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းဢမ်ႇမီး လွင်ႈငမ်ႇမႅၼ်ႈၵၼ်တင်း ႁူဝ်ၶေႃႈတႄႉတႄႉ ၶွင်ၼႃႈလိၵ်ႈ။",
+       "trackingcategories-nodesc": "​ၶေႃႈသပ်းလႅင်း ဢမ်ႇၶဝ်ႈပႃးဝႆႉ။",
+       "trackingcategories-disabled": "တွၼ်ႈၵၼ်ၼႆ့ ဢိုတ်းၸႂ်ႉဝႆႉ",
+       "mailnologin": "ဢမ်ႇသူင်ႇ ႁဵင်းလိၵ်ႈ",
+       "mailnologintext": "ၸဝ်ႈၵဝ်ႇ တေလႆႈ [[Special:UserLogin|လွၵ်ႉဢိၼ်ႇ]]ဝႆႉ သေ တီႈၼႂ်း [[Special:Preferences|preferences]]ၼၼ်ႉ တေလႆႈမီး ႁဵင်းလိၵ်ႈ ဢီးမေးလ် ၸဝ်ႈၵဝ်ႇ ဢၼ်ၸႂ်ႉလႆႈ တွၼ်ႈတႃႇသူင်ႇ ဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ။",
+       "emailuser": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ",
+       "emailuser-title-target": "သူင်ႇဢီးမေးလ်ဢၼ်ၼႆႉ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "emailuser-title-notarget": "ၽူႈၸႂ်ႉတိုဝ်း ဢီးမေးလ်",
+       "defemailsubject": "{{SITENAME}} ဢီးမေးလ်ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း \"$1\"",
+       "usermaildisabled": "ဢီးမေးလ် ၽူႈၸႂ်ႉတိုဝ်း ဢိုတ်းၸႂ်ႉဝႆႉ",
+       "usermaildisabledtext": "ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈသူင်ႇ ဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ ၸိူဝ်းမီးဝႆႉ တီႈၼိူဝ် ဝီႇၶီႇၼႆႉ",
+       "noemailtitle": "ဢမ်ႇမီး ႁဵင်းလိၵ်ႈဢီးမေးလ်",
+       "noemailtext": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ဢမ်ႇလႆႈမၵ်းမၼ်ႈဝႆႉ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်ၸႂ်ႉလႆႈ။",
+       "nowikiemailtext": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇလိူၵ်ႈဝႆႉ တွၼ်ႈတႃႇ ဢမ်ႇႁၢပ်ႉဢဝ် ဢီးမေးလ် ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း။",
+       "emailnotarget": "ဢမ်ႇမီးဝႆႉ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ၽိတ်းပိူင်ႈဝႆႉတွၼ်ႈတႃႇ ၽူႈႁပ်ႉဢဝ်။",
+       "emailtarget": "ထႅမ်သႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း တႃႇ ၽူႈႁပ်ႉဢဝ်",
+       "emailusername": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "emailusernamesubmit": "တၢင်ႇၼႄ",
+       "email-legend": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း  {{SITENAME}} တၢင်ႇၸိူဝ်း",
+       "emailfrom": "မႃးတီႈ :",
+       "emailto": "ထိုင်:",
+       "emailsubject": "လွင်ႈတၢင်း :",
+       "emailmessage": "ၶေႃႈၽၢၵ်ႇ",
+       "emailsend": "သူင်ႇ",
+       "emailccme": "ဢဝ်ၶေႃႈၽၢၵ်ႇၵဝ်ၶႃႈ ၶိုၼ်းထုတ်ႇသူင်ႇဢီးမေးလ်ပၼ် ၵဝ်ၶႃႈ",
+       "emailccsubject": "ထုတ်ႇဢဝ် ၶေႃႈၽၢၵ်ႇၸဝ်ႈၵဝ်ႇၸူး $1: $2",
+       "emailsent": "ဢီးမေးလ် သူင်ႇယဝ်ႉယဝ်ႈ",
+       "emailsenttext": "ဢီးမေးလ်ၸဝ်ႈၵဝ်ႇ ထုၵ်ႇသူင်ႇပၼ်ၵႂႃႇယဝ်ႉ။",
+       "emailuserfooter": "ဢီးမေးလ်ၼႆႉ  \"{{int:emailuser}}\" ၵၢၼ်တီႈ  {{SITENAME}} ၵေႃႉ {{GENDER:$1|သူင်ႇ}} $1 ၸူး  {{GENDER:$2|$2}}။ သင်ၸိူဝ်ႉဝႃႈ  {{GENDER:$2|ၸဝ်ႈၵဝ်ႇ}} ၶႂ်ႈတွပ်ႇပၼ်ၶိုၼ်း ဢီးမေးလ်ဢၼ်ၼႆႉၼႆ ဢီးမေးလ် {{GENDER:$2|ၸဝ်ႈၵဝ်ႇ}} တေထုၵ်ႇ သူင်ႇပၼ်ၵႂႃႇၸူး {{GENDER:$1|ၽူႈသူင်ႇ ၵေႃႉငဝ်ႈတိုၼ်း}}၊ ႁဵင်းလိၵ်ႈဢီးမေးလ် {{GENDER:$2|ၸဝ်ႈၵဝ်ႇ}} တေၵႂႃႇ ဢွၵ်ႇၼႄတီႈ  {{GENDER:$1|ၶဝ်}}ယဝ်ႈ။",
+       "usermessage-editor": "တူဝ်သူင်ႇၶေႃႈၶၢဝ်ႇ ပိူင်သၢင်ႈ",
+       "watchlist": "�သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
        "mywatchlist": "သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistfor2": "တွၼ်ႈတႃႇ $1 $2",
+       "nowatchlist": "တီႈၼႂ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇၼၼ်ႉ ဢမ်ႇမီးဝႆႉသင်။",
+       "watchlistanontext": "ၶႅၼ်းတေႃႈ လွၵ်ႉဢိၼ်ႇ တွၼ်ႈတႃႇတူၺ်း ဢမ်ႇၼၼ် မႄးထတ်း လွင်ႈတၢင်း ၸိူဝ်းမီး တီႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ၸဝ်ႈၵဝ်ႇ။",
+       "watchnologin": "ဢမ်ႇလႆႈၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆ့",
+       "addwatch": "ထႅမ်သႂ်ႇၸူး သဵၼ်ႈမၢႆ ပႂ်ႉတူၺ်း",
        "watch": "ပႂ်ႉတူၺ်း",
+       "watchlist-hide": "သိူင်ႇ",
+       "watchlist-submit": "ၼႄ",
+       "wlshowtime": "ပွင်ႈၶၢဝ်းယၢမ်း တွၼ်ႈတႃႇ ဢွၵ်ႇၼႄ:",
+       "wlshowhideminor": "လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
+       "wlshowhidebots": "ပွတ်ႉ",
+       "wlshowhideliu": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတၢင်ႇမၢႆၽၢင်ဝႆႉ",
+       "wlshowhideanons": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းဢမ်ႇသႂ်ႇၸိုဝ်ႈ",
+       "wlshowhidepatr": "ၵၢၼ်မႄးထတ်း ဢၼ်ထုၵ်ႇပႂ်ႉတူၺ်း",
+       "wlshowhidemine": "ၵၢၼ်မႄးထတ်း ၵဝ်ၶႃႈ",
+       "wlshowhidecategorization": "ပၢႆးၼႃႈလိၵ်ႈ",
+       "watchlist-options": "ၵၼ်လိူၵ်ႈသၢင်ႈ တူဝ်ပႂ်ႉတူၺ်း",
+       "watching": "တိုၵ်ႉတူၺ်းယူႇ...",
+       "unwatching": "ဢမ်ႇတူၺ်းဝႆႉ...",
+       "enotif_impersonal_salutation": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း",
+       "enotif_subject_deleted": "ၼႃႈလိၵ်ႈ {{SITENAME}}  $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|မူတ်ႇပႅတ်ႈ}} ဢေႃႈ။",
+       "enotif_subject_created": "ၼႃႈလိၵ်ႈ {{SITENAME}}  $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၵေႃႇသၢင်ႈဝႆႉ}} ဢေႃႈ",
+       "enotif_subject_moved": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၶၢႆႉဝႆႉ}} ဢေႃႈ",
+       "enotif_subject_restored": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႇ {{GENDER:$2|ဝႆႉတမ်းၶိုၼ်း}} ဢေႃႈ",
+       "enotif_subject_changed": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|လႅၵ်ႈလၢႆႈဝႆႉ}} ဢေႃႈ",
+       "enotif_body_intro_deleted": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ  ထုၵ်ႇ $2 ၵေႃႇ {{GENDER:$2|မွတ်ႇပႅတ်ႈဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATE ၼၼ်ႉ၊ တူၺ်း တီႈ $3.",
+       "enotif_body_intro_created": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၵေႃႇသၢင်ႈဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATEၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၢၼ်ၶူၼ်ႉၶႆႈ ယၢမ်းလဵဝ်ၼႆႉၼႆ တူၺ်းတီႈ $3 ၼၼ်ႉၶႃႈလႄႈ။",
+       "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": "ၸဵမ်မိူဝ်ႈ ဝၢႆးသေ ၸဝ်ႈၵဝ်ႇ မႃးဢႅဝ်ႇ ပွၵ်ႇလိုၼ်းသုတ်းၼၼ်ႉ မီးလွင်ႈလႅၵ်ႈလၢႆႈသင်ၼႆ တူၺ်းတီႈ $1 ၼႆႈၶႃႈလႄႈ။",
+       "enotif_lastdiff": "တွၼ်ႈတႃႇတူၺ်း လွင်ႈလႅၵ်ႈလၢႆႈဢၼ်ၼႆႉ တူၺ်း တီႈ $1 ၼႆႈၶႃႈလႄႈ။",
+       "enotif_anon_editor": "ၽူႈၸႂ်ႉတိုဝ်း ဢမ်ႇသႂ်ႇၸိုဝ်ႈ $1",
+       "deletepage": "မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
+       "confirm": "ၼႄႉၼွၼ်း",
+       "excontent": "လမ်းၼႂ်း ပဵၼ်: \"$1\"",
+       "excontentauthor": "လမ်းၼႂ်း ပဵၼ်: \"$1\", လႄႈ ၽူႈၶဝ်ႈႁူမ်ႈၼႆႉသမ်ႉပဵၼ်  \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|တွၼ်ႈဢုပ်ႇ]])",
+       "exbeforeblank": "လမ်းၼႂ်း မိူဝ်ႈပႆႇပဝ်ႇဝႆႉၼၼ်ႉပဵၼ် : \"$1\"",
+       "delete-confirm": "မွတ်ႇပႅတ်ႈ $1",
+       "delete-legend": "မွတ်ႇပႅတ်ႈ",
+       "historywarning": "<strong>ၶေႃႈၽၢင်ႉ:</strong> ၼႃႈလိၵ်ႈ ဢၼ်ၸဝ်ႈၵဝ်ႇဝႃႈ တေမွတ်ႇပႅတ်ႈၼၼ်ႉ မၼ်းမီးဝႆႉပိုၼ်း  $1 {{PLURAL:$1|ၶူၼ်ႉၶႆႈ|ၶူၼ်ႉၶႆႈ.}}:",
+       "historyaction-submit": "ၼႄ",
        "dellogpage": "မွတ်ႇပႅတ်ႈ သၢႆမၢႆ",
+       "reverted": "ပိၼ်ႈၶိုၼ်းၸူး မၢႆဢွၵ်ႇ ၸိူဝ်းဢွၵ်ႇၸဝ်ႉ",
        "rollbacklink": "ထွႆပွၵ်ႈၶိုၼ်း",
        "rollbacklinkcount": "ၵိင်ႈၶိုၼ်းလင် $1 {{PLURAL:$1|edit|မႄးထတ်း}}",
+       "cantrollback": "ဢမ်ႇၸၢင်ႈ ပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း;\nၽူႈၶဝ်ႈႁူမ်ႈ ​ၵမ်းလိုၼ်းသုတ်းၼႆႉ မၼ်းၵူၺ်းပဵၼ် ၽူႈတႅမ်ႈလိၵ်ႈ တႃႇ ၼႃႈလိၵ်ႈၼႆႉ။",
+       "revertpage": " [[Special:Contributions/$2|$2]] ([[User talk:$2|တွၼ်ႈဢုပ်ႇ]]) ၵေႃႉပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ၸူး မၢႆဢွၵ်ႇ ၵမ်းလိုၼ်းသုတ်း ဢၼ် [[User:$1|$1]] ၵေႃႉႁဵတ်းဝႆႉ",
+       "rollback-success": "$1 ၵေႃႉ ပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ;\n$2 လႅၵ်ႈလၢႆႈဝႆႉၸူး လွင်ႈၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်း။",
+       "changecontentmodel": "လႅၵ်ႈလၢႆႈ ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၶွင်ၼႃႈလိၵ်ႈ",
+       "changecontentmodel-legend": "လႅၵ်ႈလၢႆႈ ပိူင်ႈၵေႃႇသၢင်ႈ လမ်းၼႂ်း",
+       "changecontentmodel-title-label": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ",
+       "changecontentmodel-model-label": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ဢၼ်မႂ်ႇ",
+       "changecontentmodel-reason-label": "လွင်ႈတၢင်း :",
+       "changecontentmodel-submit": "လႅၵ်ႈလၢႆႈ",
+       "changecontentmodel-success-title": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ထုၵ်ႇလႅၵ်ႈလၢႆႈဝႆႉယဝ်ႉ",
+       "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 {{GENDER:$2|ၵေႃႇသၢင်ႈဝႆႉ}} ၼႃႈလိၵ်ႈ $3 ဢၼ်ၸႂ်ႉတိုဝ်းဝႆႉ ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း \"$5\" ဢၼ်ဢမ်ႇၸႂ်ႈ ပိူင်ၵႅဝ်ႈ",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|လႅၵ်ႈလၢႆႈဝႆႉ}} ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၶွင်ႈၼႃႈလိၵ်ႈ $3 တႄႇ \"$4\" တေႃႇ \"$5\"",
+       "logentry-contentmodel-change-revertlink": "ပိၼ်ႈၶိုၼ်း",
+       "logentry-contentmodel-change-revert": "ပိၼ်ႈၶိုၼ်း",
        "protectlogpage": "မၢႆတမ်း ၵၢၼ်ႁေႉၵင်ႈ",
-       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} မွတ်ႇပႅတ်ႈယဝ်ႉ",
+       "protect-default": "ၶႂၢင်းပၼ် ၽူႈၸႂ်ႉတိုဝ်း တၢင်းသဵင်ႈ",
+       "protect-fallback": "ၶႂၢင်းပၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တင်း လွင်ႈၶႂၢင်းပၼ် \"$1\" ၼၼ်ႉၵူၺ်း",
+       "protect-level-autoconfirmed": "ၶႂၢင်းပၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႄႉၼွၼ်းႁင်းၵူၺ်းၼၼ်ႉ ၵူၺ်း",
+       "protect-level-sysop": "ၶႂၢင်းပၼ် ၽူႈၵုမ်းၵၢၼ်ၵူၺ်း",
+       "protect-othertime": "တၢင်ႇၶၢဝ်း :",
+       "protect-othertime-op": "တၢင်ႇၶၢဝ်း",
+       "restriction-edit": "မႄးထတ်း",
+       "restriction-move": "ၶၢႆႉ",
+       "restriction-create": "ၵေႃႇသၢင်ႈ",
+       "restriction-upload": "လူတ်ႇၶိုၼ်ႈ",
+       "restriction-level-sysop": "ႁႄႉၵၼ်ဝႆႉ တဵမ်ထူၼ်ႈ",
+       "restriction-level-autoconfirmed": "ႁႄႉၵင်ႈဝႆႉ ၵမ်ႈၽွင်ႈ",
+       "restriction-level-all": "ၵူႈၸၼ်ႉထၢၼ်ႈ",
+       "undelete": "တူၺ်းၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undeletepage": "တူၺ်း လႄႈ ဝႆႉၶိုၼ်း ၼႃႈလိၵ်ႈၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undeletepagetitle": "<strong>ၽၢႆႇတႂ်ႈၼႆႉ ၶဝ်ႈပႃးဝႆႉ လွင်ႈၶူၼ်ႉၶႆႈ ၸိူဝ်းမွတ်ႇဝႆႉ [[:$1|$1]]</strong>.",
+       "viewdeletedpage": "တူၺ်းၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undelete-fieldset-title": "ၶိုၼ်းဝႆႉ လွင်ႈၶူၼ်ႉၶႆႈ",
+       "undeleterevisions": "$1 {{PLURAL:$1|ၶူၼ်ႉၶႆႈ|ၶူၼ်ႉၶႆႈ.}} မွတ်ႇပႅတ်ႈယဝ်ႉ",
+       "undelete-revision": "လွင်ႈၶူၼ်ႉၶႆႈ ၸိူဝ်းဢၼ် $3 ၵေႃႉမွတ်ႇဝႆႉ ၶွင်ႇ $1 (ၼင်ႇ $4, တီႈ $5)",
+       "undelete-nodiff": "ဢမ်ႇႁၼ် လွင်ႈၶူၼ်ႉၶႆႈ ဢၼ်ပူၼ်ႉမႃး။",
+       "undeletebtn": "ဝႆႉၶိုၼ်း",
        "undeletelink": "တူၺ်း/ၶိုၼ်းမိူၼ်ၵဝ်ႇ",
        "undeleteviewlink": "တူၺ်း",
+       "undeleteinvert": "လွင်ႈလိူၵ်ႈသၢင်ႈ ပိၼ်ႈၽူၼ်",
+       "undeletecomment": "လွင်ႈတၢင်း :",
+       "undeletedrevisions": "{{PLURAL:$1|1 ၶူၼ်ႉၶႆႈ|$1 ၸိူဝ်းၶူၼ်ႉၶႆႉ}} ဢဝ်ဝႆႉၶိုၼ်းယဝ်ႉ",
+       "undeletedfiles": "ဝႆႉၶိုၼ်း {{PLURAL:$1|1 ၾၢႆႇ}} ယဝ်ႉ",
+       "undelete-search-title": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undelete-search-box": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undelete-search-prefix": "ၼႄ ၼႃႈလိၵ်ႈ ၸိူဝ်းတႄႇဝႆႉတင်း :",
+       "undelete-search-submit": "ၶူၼ်ႉႁႃ",
        "namespace": "ဢွင်ႈတီႈၸိုဝ်ႈ",
        "invert": "ပဵၼ်ႇၽၢႆႇ လွင်ႈလိူၵ်ႈသၢင်ႈ",
        "tooltip-invert": "လိူၵ်ႈပၼ် လွၵ်းၼႆႉဝႃႈ တႃႇတေလပ်ႉဝႆႉ လွင်ႈလႅၵ်ႈလၢႆႈ ဢၼ်ႁဵတ်းၸူး ၼႃႈလိၵ်ႈၸိူဝ်းၼႆႉ ၸွမ်းၼင်ႇ ၸိုဝ်ႈ ၸိူဝ်းလိူၵ်ႈဝႆႉ (လႄႈ ၸွမ်းၼင်ႇၸိုဝ်ႈ ၸိူဝ်းဢၼ်လိူၵ်ႈဝႆႉယဝ်ႉၼၼ်ႉ)",
        "anoncontribs": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
        "month": "တႄႇဢဝ်လိူၼ် (လႄႈ ဢၼ်ပူၼ်ႉမႃး):",
        "year": "တႄႇဢဝ်ပီ (လႄႈ ဢၼ်ပူၼ်ႉမႃး):",
+       "sp-contributions-newbies-sub": "တွၼ်ႈတႃႇဢၶွင်ႉ ဢၼ်မႂ်ႇ",
+       "sp-contributions-blocklog": "မၢႆတမ်းၵၢၼ်​ႁေႉတတ်း",
+       "sp-contributions-suppresslog": "လွင်ႈၶဝ်ႈႁူမ်ႈ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ဢၼ်ႁူမ်ႇလပ်ႉဝႆႉ",
+       "sp-contributions-deleted": "လွင်ႈၶဝ်ႈႁူမ်ႈ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ဢၼ်မွတ်ႇဝႆႉ",
+       "sp-contributions-uploads": "လူတ်ႇၶိုၼ်ႈ",
+       "sp-contributions-logs": "မၢႆတမ်း",
+       "sp-contributions-talk": "တွၼ်ႈဢုပ်ႇ",
+       "sp-contributions-userrights": "လွင်ႈၸတ်းၵၢၼ်သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုတ်း",
+       "sp-contributions-blocked-notice": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆႉဢေႃႈ ယၢမ်းလဵဝ်။\nသဵၼ်ႈမၢႆတတ်းၶၢတ်ႇ ၵမ်းလိုၼ်းသုတ်းၼႆႉ ၼႄဝႆႉယူႇၵႃႈတီႈ သဵၼ်ႈမၢႆၽိုၼ်ဢိင် ပႃႈတႂ်ႈၼႆႉ။",
+       "sp-contributions-blocked-notice-anon": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆႉဢေႃႈ ယၢမ်းလဵဝ်။\nသဵၼ်ႈမၢႆတတ်းၶၢတ်ႇ ၵမ်းလိုၼ်းသုတ်းၼႆႉ ၼႄဝႆႉယူႇၵႃႈတီႈ သဵၼ်ႈမၢႆၽိုၼ်ဢိင် ပႃႈတႂ်ႈၼႆႉ။",
+       "sp-contributions-search": "ၶူၼ်ႉႁႃ တႃႇ လွင်ႈၶဝ်ႈႁူမ်ႈ",
+       "sp-contributions-username": "ႁဵၼ်းလိၵ်ႈ ဢၢႆႇၽီ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "sp-contributions-toponly": "ၵူၺ်းၼႄပၼ် ၵၢၼ်မႄးထတ်း ၸိူဝ်းၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်း",
+       "sp-contributions-newonly": "ၵူၺ်းၼႄပၼ် ၵၢၼ်မႄးထတ်း ၸိူဝ်းပဵၼ် လွင်ႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "sp-contributions-hideminor": "သိူင်ႇဝႆႉ လွင်ႈမႄးထတ်း ဢိတ်းဢီႈ",
+       "sp-contributions-submit": "ၶူၼ်ႉႁႃ",
        "whatlinkshere": "ႁဵင်းၵွင်ႉ ဢၼ်မီးတီႈၼႆႉ ပဵၼ်သင်",
        "whatlinkshere-title": "ၼႃႈလိၵ်ႈၸိူဝ်းလိင်ႉၸူး \"$1\"",
        "whatlinkshere-page": "ၼႃႈလိၵ်ႈ",
        "linkshere": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>[[:$1]]</strong>:",
+       "nolinkshere": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>[[:$1]]</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
        "isredirect": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
        "istemplate": "တူဝ်ၶဝ်ႈပႃး",
        "isimage": "ၾၢႆႇၵွင်ႉ",
        "whatlinkshere-hideredirs": "$1 လၢႆႈၽၢႆႇ",
        "whatlinkshere-hidetrans": "သိူင်ႇတူဝ်ၶဝ်ႈပႃး",
        "whatlinkshere-hidelinks": "$1 လိင်ႉၵွင်ႉ",
+       "whatlinkshere-hideimages": "$1 ၾၢႆႇၵွင်ႉ",
        "whatlinkshere-filters": "တူဝ်ထွင်",
+       "whatlinkshere-submit": "သိုပ်ႇၵႂႃႇ",
+       "autoblockid": "ႁႄႉတတ်းႁင်းမႂ်း #$1",
+       "block": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "unblock": "ပိုတ်ႇႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "blockip": "ႁႄႉတတ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "blockip-legend": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "ipaddressorusername": "ႁဵၼ်းလိၵ်ႈ ဢၢႆႇၽီ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "ipbexpiry": "ၶၢဝ်းယၢမ်းသုတ်းသဵင်ႈ:",
+       "ipbreason": "လွင်ႈတၢင်း :",
+       "ipbreason-dropdown": "*လွင်ႈတၢင်းႁႄႉတတ်း ဢၼ်ၵဵဝ်ႈလူၺ်ႈတင်းၼမ်\n** ထႅမ်သႂ်ႇ လွၼ်ႉၶၢဝ်ႇ ဢၼ်ၽိတ်းပိူင်ႈ\n** ထွၼ်ပႅတ်ႈ ၸိူဝ်းၶဝ်ႈပႃး ၼႂ်းၼႃႈလိၵ်ႈ\n** ႁဵတ်းႁဵင်းၵွင်ႉဢၼ်မီးမႅင်း တီႈၽၢႆႇၼွၵ်ႈ\n** ထႅမ်သႂ်ႇ ဢၼ်ဢမ်ႇမီးလွင်ႈမီးတၢင်း/လွင်ႈဢူၼ်ဢၢၼ် တီႈၼႂ်းၼႃႈလိၵ်ႈ\n** လွင်ႈႁဵတ်းသၢင်ႈ တၢင်းလွၵ်ႇငိူတ်ႈ/ပၼ်လွင်ႈတၢင်းသုၵ်ႉယုင်ႈၸႂ်\n** လူလၢႆ ဢၶွင်ႉလၢႆဢၼ်\n** ၸႂ်ႉဝႆႉၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း မဵဝ်းဢမ်ႇႁပ်ႉၶၢမ်ႇလႆႈ",
+       "ipb-hardblock": "ႁႄႉၵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းလွၵ်ႉဢိၼ်ႇဝႆႉ ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း ၵႃႈတီႈ ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇဢၼ်ၼႆႉ",
+       "ipbcreateaccount": "ႁႄႉၵင်ႈ လွင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "ipbemailban": "ႁႄႉၵင်ႈ လွင်ႈၽူႈၸႂ်ႉတိုဝ်း သူင်ႇဢီးမေးလ်",
+       "ipbenableautoblock": "ႁႄႉတတ်း ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇ ဢၼ်ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ၸႂ်ႉၵႂႃႇၵမ်းလိုၼ်းသုတ်း လႄႈ ၸိူဝ်းၵပ်းၵၢႆႇ ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇ ဢၼ်ၶဝ် ၶတ်းၸႂ်တႃႇတေ မႄးထတ်း ၵႃႈတီႈ",
+       "ipbsubmit": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ",
+       "ipbother": "တၢင်ႇၶၢဝ်း :",
+       "ipboptions": "2 မူင်း:2 hours,1 ဝၼ်း:1 day,3 ဝၼ်း:3 days,1 ဝူင်ႈ:1 week,2 ဝူင်ႈ:2 weeks,1 လိူၼ်:1 month,3 လိူၼ်:3 months,6 လိူၼ်:6 months,1 ပီ:1 year,ဢမ်ႇၼႄႉၼွၼ်း:infinite",
+       "ipbhidename": "သိူင်ႇ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်ႈ ၵႃႈတီႈ ၵၢၼ်မႄးထတ်းလႄႈ သဵၼ်ႈမၢႆ",
+       "ipbwatchuser": "တူၺ်းၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်းလႄႈ ၼႃႈလိၵ်ႈဢုပ်ႇဢူဝ်းၵၼ် တွၼ်ႈတႃႇ ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ",
+       "ipb-disableusertalk": "ႁႄႉၵၼ် ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ၽွင်းမိူဝ်ႈ မၼ်းထုၵ်ႇႁႄႉတတ်းဝႆႉ ယႃႇႁႂ်ႈ မၼ်းမႄးထတ်းလႆႈ ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်း ႁင်းၶဝ်",
+       "ipb-change-block": "ၶိုၼ်းႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၸႂ်ႉ ၵၢၼ်ႈတင်ႈၸိူဝ်းၼႆႉ",
+       "ipb-confirm": "ၼႄႉၼွၼ်း လွင်ႈႁႄႉတတ်း",
+       "badipaddress": "ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇ ၽိတ်းပိူင်ႈဝႆႉ",
+       "blockipsuccesssub": "လွင်ႈႁႄႉတတ်း ၶႅမ်ႉလႅပ်ႈယဝ်ႉ",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ထုၵ်ႇႁႄႉတတ်းဝႆႉယဝ်ႉ။<br />\nတူၺ်း  [[Special:BlockList|သဵၼ်ႈမၢႆႁႄႉတတ်း]] တွၼ်ႈတႃႇ ၶိုၼ်းလိုမ်ႉတူၺ်း လွင်ႈႁႄႉတတ်း။",
+       "ipb-blockingself": "ၸဝ်ႈၵဝ်ႇ တေႁႄႉတတ်းတူဝ်ၸဝ်ႈၵဝ်ႇ! လွင်ႈဝႃႈ တေႁဵၼ်းၼၼ်ၼၼ်ႉ ​ၸဝ်ႈၵဝ်ႇ ၼႄႉၼွၼ်းယဝ်ႉႁႃႉ?",
+       "ipb-confirmhideuser": "ၸဝ်ႈၵဝ်ႇ တေႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ပိုတ်ႇၸႂ်ႉဝႆႉ \"သိူင်ႇၽူႈၸႂ်ႉတိုဝ်း\"။ ဢၼ်ၼႆႉ မၼ်းတေႁူမ်ႇ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းၼႆႉဝႆႉ ၵႃႈတီႈသဵၼ်ႈမၢႆတင်းသဵင်ႈလႄႈ တီႈသဵၼ်ႈၶပ်ႉ။ ၸဝ်ႈၵဝ်ႇ လပ်ႉလွင်းဝႃႈ တေႁဵတ်းၼၼ်ယူႇႁႃႉ?",
+       "ipb-confirmaction": "သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ လပ်ႉလွင်း​လီဝႃႈ ၶႂ်ႈႁဵတ်းၼၼ်ယူႇၼႆၸိုင် ၶႅၼ်းတေႃႈၵႂႃႇ ပၼ်မၢႆၶၼ် တီႈ လွၵ်း \"{{int:ipb-confirm}}\"  ဢၼ်မီးၽၢႆႇတႂ်ႈၼၼ်ႉလႄႈ။",
+       "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": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်းဝႆႉ�",
+       "ipblocklist": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်းဝႆႉ�",
+       "ipblocklist-legend": "သွၵ်ႈႁႃ ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ထုၵ်ႇႁႄႉတတ်းဝႆႉ�",
+       "blocklist-userblocks": "သိူင်ႇဢၶွင်ႉ ႁႄႉတတ်း�",
+       "blocklist-tempblocks": "သိူင်ႇ လွင်ႈႁႄႉတတ်းၸူဝ်ႈၵႅပ်ႉ",
+       "blocklist-addressblocks": "သိူင်ႇ လွင်ႈႁႄႉတတ်း ဢၢႆႇၽီႇဢၼ်လဵဝ်",
+       "blocklist-rangeblocks": "သိူင်ႇလွင်ႈႁႄႉတတ်း ၶပ်ႉယႆ�",
+       "blocklist-timestamp": "ၸုမ်ႈၶၢဝ်းယၢမ်း",
+       "blocklist-target": "တီႈယိူင်း",
+       "blocklist-expiry": "ဢႃႇယုသဵင်ႈ",
+       "blocklist-by": "လွင်ႈႁႄႉတတ်း ၽူႈၵုမ်းၵၢၼ်",
+       "blocklist-params": "ႁႄႉတတ်း ပိူင်မၵ်းမၼ်ႈ�",
+       "blocklist-reason": "လွင်ႈတၢင်း",
+       "ipblocklist-submit": "ၶူၼ်ႉႁႃ",
+       "ipblocklist-localblock": "လွင်ႈႁႄႉတတ်း ၼႂ်းလူဝ်ႇၵႄႇ�",
+       "ipblocklist-otherblocks": " {{PLURAL:$1|block|လွင်ႈႁႄႉတတ်း}} တၢင်ႇၸိူဝ်း",
+       "infiniteblock": "ဢမ်ႇမီးတီႈသုတ်း�",
+       "expiringblock": "ဢႃႇယုတေသဵင်ႈ ပေႃး $1 ၶၢဝ်းယၢမ်း $2�",
+       "anononlyblock": "တႃႇဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ ၵူၺ်း�",
+       "noautoblockblock": "ဢိုတ်းၸႂ်ႉ လွင်ႈႁႄႉတတ်းႁင်းၵူၺ်း",
+       "createaccountblock": "ဢိုတ်းၸႂ်ႉ ​လွင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "emailblock": "ဢိုတ်းၸႂ်ႉ ဢီးမေးလ်",
+       "blocklist-nousertalk": "ဢမ်ႇၸၢင်ႈမႄးထတ်း ၼႃႈလိၵ်ႈဢုပ်ႇၵုမ် ၸဝ်ႈၵဝ်ႇ",
+       "ipblocklist-empty": "သဵၼ်ႈမၢႆ ႁႄႉတတ်း ပဝ်ႇဝႆႉ။",
+       "ipblocklist-no-results": "ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တုၵ်းယွၼ်းဝႆႉၼၼ်ႉ ဢမ်ႇလႆႈ ႁႄႉတႄးဝႆႉ။�",
        "blocklink": "ႁႄႉတတ်း",
        "unblocklink": "ဢမ်ႇႁႄႉႁၢမ်ႈ",
+       "change-blocklink": "လႅၵ်ႈလၢႆႈလွင်ႈႁႄႉတတ်း�",
        "contribslink": "ၶဝ်ႈႁူမ်ႈ",
+       "emaillink": "�သူင်ႇ ဢီးမေးလ်",
+       "autoblocker": "ယွၼ်ႉပိူဝ်ႈဝႃႈ ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇၸဝ်ႈၵဝ်ႇၼႆႉ ထုၵ်ႇၸႂ်ႉဝႆႉ ၼင်ႇ \"[[User:$1|$1]]\" လႄႈ ထုၵ်ႉႁႄးတတ်းၵႂႃႇ ႁင်းမၼ်း။\nလွင်ႈတၢင်း ဢၼ်ပၼ်ဝႆႉ တွၼ်ႈတႃႇ ႁႄႉတတ်း  $1 ၼႆႉတႄႉ ပဵၼ် \"$2\"�",
+       "blocklogpage": "�မၢႆတမ်းၵၢၼ်ႁႄႉတတ်း",
+       "blocklog-showlog": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ မိူဝ်ႈပူၼ်ႉမႃး ယၢမ်ႈထုၵ်ႇႁႄႉတတ်းဝႆႉယဝ်ႉ။\nမၢႆတမ်းၵၢၼ်ႁႄႉတတ်း တွၼ်ႈတႃႇဢိင်ပိုင်ႈၼၼ်ႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၽၢႆႇတႂ်ႈၼႆႉယူႇ :�",
+       "blocklog-showsuppresslog": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ မိူဝ်ႈပူၼ်ႉမႃး ယၢမ်ႈထုၵ်ႁႄႉတတ်းလႄႈ ထုၵ်ႇသိူင်ႇဝႆႉ။\nမၢႆတမ်းႁူမ်ႇဝႆႉ တွၼ်ႈတႃႇပိုင်ႈဢိင်ၼၼ်ႉ ၼႄဝႆႉပၼ် ၼင်ႇၽၢႆႇတႂ်ႈၼႆႉ :�",
+       "blocklogentry": "[[$1]] ၵေႃႉထုၵ်ႇႁႄႉတတ်းဝႆႉ တႃႇၶၢဝ်းယၢမ်းတေသုတ်းသဵင်ႈ $2 $3",
+       "reblock-logentry": "ၵၢၼ်တင်ႈ လွင်ႈႁႄႉတတ်း ဢၼ်လႅၵ်ႈလၢႆႈဝႆႉ တွၼ်ႈတႃႇ [[$1]] တင်း လွင်ႈၶၢဝ်းယၢမ်း သုတ်းသဵင်ႈ ၶွင် $2 $3",
+       "unblocklogentry": "ဢမ်ႇႁႄႉတတ်း $1",
+       "block-log-flags-anononly": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းဢမ်ႇသႂ်ႇၸိုဝ်ႈၼၼ်ႉၵူၺ်း",
+       "block-log-flags-nocreate": "ဢိုတ်းၸႂ်ႉ ​လွင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "block-log-flags-noautoblock": "ဢိုတ်းၸႂ်ႉ လွင်ႈႁႄႉတတ်းႁင်းၵူၺ်း",
+       "block-log-flags-noemail": "ဢိုတ်းၸႂ်ႉ ဢီးမေးလ်",
+       "block-log-flags-nousertalk": "ဢမ်ႇၸၢင်ႈမႄးထတ်း ၼႃႈလိၵ်ႈဢုပ်ႇၵုမ် ၸဝ်ႈၵဝ်ႇ",
+       "block-log-flags-angry-autoblock": "ပိုတ်ႇၸႂ်ႉ လွင်ႈႁႄႉတတ်းႁင်းၵူၺ်း ဢၼ်ယုၵ်ႉသုင်ဝႆႉ",
+       "block-log-flags-hiddenname": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း သိူင်ႇဝႆႉ",
+       "range_block_disabled": "လွင်ႈ ၽူႈၵုမ်းၵၢၼ် ႁဵတ်းလႆႈ တႃႇၵေႃႇသၢင်ႈ ၶွပ်ႇဝိူင်းႁႄႉတတ်းၼၼ်ႉ ထုၵ်ႇဢိုတ်းၸႂ်ႉဝႆႉ။",
+       "ipb_expiry_invalid": "ၶၢဝ်းယၢမ်းသုတ်းသဵင်ႈ ၽိတ်းပိူင်ႈဝႆႉ။",
+       "ipb_expiry_old": "ၶၢဝ်းယၢမ်းသုတ်းသဵင်ႈၼႆႉ မီးဝႆႉ တီႈၶၢဝ်းပူၼ်ႉမႃး။",
+       "ipb_expiry_temp": "လွင်ႈႁႄႉတတ်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်သိူင်ႇဝႆႉၼၼ်ႉ တေလႆႈပဵၼ် ဢၼ်မၼ်ႈၵိုမ်း။",
+       "ipb_hide_invalid": "ဢမ်ႇၸၢင်ႈႁူမ်ႇလပ်ႉဝႆႉ ဢၶွင်ႉဢၼ်ၼႆႉ; မၼ်းမီးလိူဝ်ဝႆႉ {{PLURAL:$1|လွင်ႈမႄးထတ်း ဢၼ်ၼိုင်ႈ|$1 လွင်ႈမႄးထတ်းတင်းၼမ်}}။",
+       "ipb_already_blocked": "\"$1\" ၼႆႉ ထုၵ်ႇ ႁႄႉတတ်းဝႆႉယဝ်ႉ။",
+       "ipb-needreblock": "$1 ၼႆႉ ထုၵ်ႇႁႄႉတတ်းဝႆႉယဝ်ႉ။ ၸွင်ႇၸဝ်ႈၵဝ်ႇ ၶႂ်ႈလႅၵ်ႈလၢႆႈ ၵၼ်တင်ႈႁိုဝ်?",
+       "ipbnounblockself": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇ ပိုတ်ႇသေႃးၶိုၼ်းတႃႇၸဝ်ႈၵဝ်ႇ။",
+       "lockdb": "ၶတ်းယွင်ၶေႃႈမုၼ်း",
+       "unlockdb": "ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "lockdbtext": "လွင်ႈၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်းၼႆႉ မၼ်းတေယင်ႉၵိုတ်းဝႆႉၸူဝ်ႈၵႅပ်ႉ ၵပ်းၵၢႆႇလူၺ်ႈ လွင်ႈၽူႈၸႂ်ႉတိုဝ်းတင်းသဵင်ႈ မႄးထတ်းၼႃႈလိၵ်ႈ၊ လႅၵ်ႈလၢႆႈ ငဝ်ႈၵုမ်းပိူင်ၶဝ်၊ မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၶဝ် လႄႈ ၸိူဝ်းဢၼ်တေလူဝ်ႇ လႅၵ်ႈလၢႆႈ တီႈၼႂ်း ယွင်ၶေႃႈမုၼ်းၼၼ်ႉ။ ၶႅၼ်းတေႃႈ ၸဝ်ႈၵဝ်ႇ ၼႄ့ၼွၼ်းဝႃႈ ၸဝ်ႈၵဝ်ႇယိူင်းဢၢၼ်းဝႃႈ ၶႂ်ႈႁဵတ်းသင် ၼႆသေ သင်ၸိူဝ်ႉဝႃႈ လွင်ႈမႄးၶိုၼ်းၸဝ်ႈၵဝ်ႇ ယဝ်ႉတူဝ်ႈယဝ်ႉၼႆ ၸဝ်ႈၵဝ်ႇ တေၸၢင်ႈၶိုၼ်း ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်းလႆႈယူႇ။",
+       "unlockdbtext": "လွင်ႈပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်းၼႆႉ မၼ်းတေဝႆႉၶိုၼ်း လွင်ႈႁဵတ်းသၢင်ႈလႆႈ ၵပ်းၵၢႆႇလူၺ်ႈ ၽူႈၸႂ်ႉတိုဝ်းၶဝ် မႄးထတ်းၼႃႈလိၵ်ႈ၊ လႅၵ်ႈလၢႆႈ ငဝ်ႈၵုမ်းပိူင်ၶဝ်၊ မႄးထတ်း သဵၼ်ႈမၢႆ ပႂ်ႉတူၺ်းၶဝ် လႄႈ ၸိူဝ်းဢၼ်တေလူဝ်ႇ လႅၵ်ႈလၢႆႈ တီႈၼႂ်း ယွင်ၶေႃႈမုၼ်းၼၼ်ႉ။  ၶႅၼ်းတေႃႈ ၸဝ်ႈၵဝ်ႇ ၼႄ့ၼွၼ်းဝႃႈ ၸဝ်ႈၵဝ်ႇယိူင်းဢၢၼ်းဝႃႈ ၶႂ်ႈႁဵတ်းသင် ဢၼ်ဝႃႈၼၼ်ႉ။",
+       "lockconfirm": "ၸႂ်ႈယဝ်ႉ။ ၵဝ်ၶႃႈ ၶႂ်ႈၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း တႄႉတႄႉဢေႃႈ။",
+       "unlockconfirm": "ၸႂ်ႈယဝ်ႉ၊ ၵဝ်ၶႃႈ ၶႂ်ႈပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း တႄႉတႄႉဢေႃႈ။",
+       "lockbtn": "ၶတ်းယွင်ၶေႃႈမုၼ်း",
+       "unlockbtn": "ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "locknoconfirm": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇလႆႈပၼ်မၢႆမႅၼ်ႈ တီႈတိူၵ်ႈၼႄႉၼွၼ်း။",
+       "lockdbsuccesssub": "ၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း ၶႅမ်ႉလႅပ်ႈယဝ်ႉ။",
+       "unlockdbsuccesssub": "လွင်ႈၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း ထွၼ်ပႅတ်ႈယဝ်ႉယဝ်ႈ",
+       "lockdbsuccesstext": "ၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း ဝႆႉယဝ်ႉယဝ်ႈ<br />\nဝၢႆးသေ လွင်ႈမႄးၶိုၼ်း ၸဝ်ႈၵဝ်ႇၼၼ်ႉ ယဝ်ႉတူဝ်ႈယဝ်ႈၼႆ ယႃႇပေလိုမ်း တႃႇ  [[Special:UnlockDB|ထွၼ်ပႅတ်ႈ သေႃး]] ။",
+       "unlockdbsuccesstext": "ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း ဝႆႉယဝ်ႉယဝ်ႈ။",
+       "lockfilenotwritable": "ၾၢႆႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်းၼၼ်ႉ ဢမ်ႇၸၢင်ႈၶဝ်ႈတႅမ်ႈလႆႈ။\nလုၵ်ႉတီႈ သႃႇပိူဝ်ႇဝႅမ်ႉ သေ ဢၼ်ၼႆႉ မၼ်းလူဝ်ႇၶဝ်ႈတႅမ်ႈလႆႈတီႈ ၶတ်းသေႃး ဢမ်ႇၼၼ် ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်းဢေႃႈ။",
+       "databaselocked": "ယွင်ၶေႃႈမုၼ်းၼႆႉ ပေႃးၶတ်းသေႃးဝႆႉယဝ်ႉ။",
+       "databasenotlocked": "ယွင်ၶေႃႈမုၼ်းၼႆႉ ဢမ်ႇလႆႈၶတ်းသေႃးဝႆႉ။",
+       "lockedbyandtime": "( {{GENDER:$1|$1}} ၵေႃႉ မိူဝ်ႈ $2 ၶၢဝ်းယၢမ်း $3)",
+       "move-page": "ၶၢႆႉ $1",
+       "move-page-legend": "ၶၢႆႉၼႃႈလိၵ်ႈ",
+       "movenologintext": "တွၼ်ႈတႃႇၶၢႆႉၼႃႈလိၵ်ႈၼႆႉ ၸဝ်ႈၵဝ်ႇ တေလႆႈပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တၢင်ႇ မၢႆၽၢင်ယဝ်ႉလႄႈ တေလႆႈ  [[Special:UserLogin|ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ]]။",
+       "movenotallowed": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈ။",
+       "movenotallowedfile": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇ ၶၢႆႉၾၢႆႇ။",
+       "cant-move-user-page": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း (ယၢၼ်ဢဝ်တီႈ ၼႃႈလိၵ်ႈၽႄ)။",
+       "cant-move-to-user-page": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈၸူး ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း (လိူဝ်သေ ၸူး ၼႃႈလိၵ်ႈၽႄ ၽူႈၸႂ်ႉတိုဝ်း)။",
+       "cant-move-category-page": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈလိူင်ႈ။",
+       "cant-move-to-category-page": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈၸူး ၼႃႈလိၵ်ႈလိူင်ႈ။",
+       "cant-move-subpages": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တႃႇၶၢႆႉ ၼႃႈလိၵ်ႈၽႄ။",
+       "namespace-nosubpages": "ဢွင်ႈၸိုဝ်ႈ \"$1\" ဢမ်ႇၶႂၢင်းပၼ် ၼႃႈလိၵ်ႈၽႄ။",
+       "newtitle": "ႁူဝ်ၶေႃႈ ဢၼ်မႂ်ႇ :",
+       "move-watch": "တူၺ်း ၼႃႈလိၵ်ႈငဝ်ႈငႃႇ လႄႈ ၼႃႈလိၵ်ႈယိူင်းၸူး",
+       "movepagebtn": "ၶၢႆႉၼႃႈလိၵ်ႈ",
+       "pagemovedsub": "ၶၢႆႉၶႅမ်ႉလႅပ်ႈၵႂႃႇယဝ်ႉ",
+       "movepage-moved": "<strong>\"$1\" ၶၢႆႉၸူး \"$2\"</strong> ယဝ်ႉယဝ်ႈ",
        "movelogpage": "ၶၢႆႉသၢႆမၢႆ",
-       "revertmove": "ပိၼ်ႇပွၵ်ႈၶိုၼ်း",
+       "movenosubpage": "ၼႃးလိၵ်ႈဢၼ်ၼႆ့ ဢမ်ႇမီးဝႆႉ ၼႃႈလိၵ်ႈၽႄ။",
+       "movereason": "လွင်ႈတၢင်း :",
+       "revertmove": "ပိၼ်ႈၶိုၼ်း",
+       "delete_and_move_confirm": "ၸႂ်ႈယဝ်ႉ၊ မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
+       "delete_and_move_reason": "မွတ်ႇပႅတ်ႈၼႆႉ တွၼ်ႈတႃႇႁဵတ်း သၢႆတၢင်း တႃႇၶၢႆႉမႃးတီႈ \"[[$1]]\"",
+       "immobile-source-namespace": "ဢမ်ႇၸၢင်ႈၶၢႆႉ ၼႃႈလိၵ်ႈၸိူဝ်း မီႈတီႈၼႂ်း လွၵ်းၸိုဝ်ႈ \"$1\"။",
+       "immobile-target-namespace": "ဢမ်ႇၸၢင်ႈၶၢႆႉ ၼႃႈလိၵ်ႈ ၶဝ်ႈၸူးတီႈၼႂ်း ဢွင်ႈၸိုဝ်ႈ \"$1\"။",
+       "immobile-target-namespace-iw": "ႁဵင်းၵွင်ႉဝီႇၶီႇၸူမ် ၼႆႉ မၼ်းပဵၼ် တီႈယိူင်းၽိတ်းပိူင်ႈ တွၼ်ႈတႃႇ ၶၢႆႉၼႃႈလိၵ်ႈ။",
+       "immobile-source-page": "ၼႃႈလိၵ်ႈၼႆႉ မၼ်းပဵၼ် ဢၼ်ဢမ်ႇၶၢႆႉလႆႈ။",
+       "immobile-target-page": "ဢမ်ႇၸၢင်ႈၶၢႆႉၸူး ႁူဝ်ၶေႃႈ ဢွင်ႈတီႈဝႆႉဢၼ်ၼၼ်ႉ။",
+       "imagenocrossnamespace": "ဢမ်ႇၸၢင်ႈၶၢႆႉၾၢႆႇၸူး ဢွင်ႈၸိုဝ်း ဢမ်ႇမီးၾၢႆႇ။",
+       "nonfile-cannot-move-to-file": "ဢမ်ႇၸၢင်ႈၶၢႆႉ ဢၼ်ဢမ်ႇမီးၾၢႆႇ ၸူး လွၵ်းၸိုဝ်ႈၾၢႆႇ။",
+       "imagetypemismatch": "သၢႆလင်ၾၢႆႇဢၼ်မႂ်ႇၼႆႉ မၼ်းဢမ်ႇၶူပ်းၵၼ်တတ်း လိူင်ႈသႅၼ်းမၼ်း။",
+       "imageinvalidfilename": "ၸိုဝ်ႈၾၢႆႇဢၼ်ယိူင်းၸူးၼၼ်ႉ မၼ်းၽိတ်းပိူင်ႈ။",
        "export": "သူင်ႇၼႃႈလိၵ်ႈဢွၵ်ႇ",
+       "exportall": "သူင်ႇဢွၵ်ႇ ၼႃႈလိၵ်ႈတင်းမူတ်း",
+       "export-submit": "သူင်ႇဢွၵ်ႇ",
+       "export-addcattext": "ထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈ ၵႃႈတီႈ တွၼ်ႈၵၼ်:",
+       "export-addcat": "ထႅမ်သႂ်ႇ",
+       "export-addnstext": "ထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈ ၵႃႈတီႈ ဢွင်ႈၸိုဝ်ႈ:",
+       "export-addns": "ထႅမ်သႂ်ႇ",
+       "export-download": "သိမ်းၼင်ႇၾၢႆႇ",
+       "export-templates": "ၶဝ်ႈပႃး လွၵ်းပိူင်",
+       "export-pagelinks": "ၶဝ်ႈပႃး ၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူးဝႆႉ လွင်ႈလိုၵ်ႉလမ်ႇၶွင် :",
+       "export-manual": "ထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈ ႁင်းၸဝ်ႈၵဝ်ႇ:",
+       "allmessages": "ၶေႃႈၶၢဝ်ႇ ပိူင်သၢင်ႈ",
+       "allmessagesname": "ၸိုဝ်ႈ",
+       "allmessagesdefault": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ပိူင်ႇၵႅဝ်ႈ",
+       "allmessagescurrent": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ယၢမ်းလဵဝ်",
+       "allmessagestext": "ဢၼ်ၼႆႉၼႆႉ ပဵၼ် သဵၼ်ႈမၢႆၶွင် ၶေႃႈၶၢဝ်ႇပိူင်သၢင်ႈ ဢၼ်ၸႂ်ႉလႆႈ တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဝီႇၶီႇမီႇတီႇယႃႇ။ ၶႅၼ်းတေႃႈ ဢႅဝ်ႇလႄႇတူၺ်း [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] လႄႈ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ မီးၵၢင်ၸႂ် တွၼ်ႈတႃႇ ၶဝ်ႈႁူမ်ႈ  ဢၼ်ၵဵဝ်ႇလူၺ်ႈ လွင်ႈပိၼ်ႇၽႃႇသႃႇ ဝီႇၶီႇမီႇတီႇယႃႇ [https://translatewiki.net translatewiki.net] ။",
+       "allmessagesnotsupportedDB": "ၼႃႈလိၵ်ႈၼႆႉ တေဢမ်ႇၸၢင်ႈၸႂ်ႉ ယွၼ်ႉပိူဝ်ႈဝႃႈ <strong>$wgUseDatabaseMessages</strong>ၼႆႉ ထုၵ်ႇဢိုတ်းၸႂ်ႉဝႆႉ။",
+       "allmessages-filter-legend": "တူဝ်ထွင်",
+       "allmessages-filter": "ထွင်ၼင်ႇ သၢႆငၢႆ လွင်ႈမႄးၵမ်ႉၸႂ်:",
+       "allmessages-filter-unmodified": "ဢၼ်ဢမ်ႇမူၼ်ႉမႄးဝႆႉ",
+       "allmessages-filter-all": "တင်းမူတ်း",
+       "allmessages-filter-modified": "မူၼ်ႉမႄးဝႆႉ",
+       "allmessages-prefix": "ထွင်တူၺ်းၼင်ႇ ၶေႃႈလူင်ႈၼႃႈ:",
+       "allmessages-language": "ၽႃႇသႃႇၵႂၢမ်း :",
+       "allmessages-filter-submit": "သိုပ်ႇၵႂႃႇ",
+       "allmessages-filter-translate": "ပိၼ်ႇၽႃႇသႃႇ",
        "thumbnail-more": "ႁၢင်ႈယႂ်ႇ",
+       "filemissing": "ၾၢႆႇႁၢႆဝႆႉ",
+       "thumbnail_error": "လွင်ႈၵေႃႇသၢင်ႈ ၵၢၼ်ၽိတ်းပိူင်ႈ ၽိုၼ်လိၵ်ႈ : $1",
+       "thumbnail_error_remote": "ၶေႃႈၶၢဝ်ႇ လွင်ႈၽိတ်းပိူင်ႈ ၵႃႈတီႈ $1: $2",
+       "djvu_page_error": "ၼႃႈလိၵ်ႈ DjVu ပူၼ်ႉဢွၵ်ႇၶွပ်ႇ",
+       "djvu_no_xml": "ဢမ်ႇၸၢင်ႈ ႁွင်ႉဢဝ် XML တွၼ်ႈတႃႇ ၾၢႆႇ DjVu",
+       "thumbnail-temp-create": "ဢမ်ႇၸၢင်ႈၵေႃႇသၢင်ႈ ၾၢႆႇၽိုၼ်လိၵ်ႈ ၸူဝ်ႈၵႅပ်ႉ",
+       "thumbnail-dest-create": "ဢမ်ႇၸၢင်ႈသိမ်း ၽိုၼ်လိၵ်ႈ ၸူး ဢွင်ႈတီႈဝႆႉ",
+       "thumbnail_invalid_params": "ၶေႃႈၵိုၵ်း ၽိုၼ်လိၵ်ႈ ၽိတ်းပိူင်ႈဝႆႉ",
+       "thumbnail_toobigimagearea": "ၾၢႆႇ ဢၼ်သႅၼ်းမႂ်း ယႂ်ႇလိူဝ်သေ $1",
+       "thumbnail_dest_directory": "တႃႇၵေႃႇသၢင်ႈ ၾူဝ်ႇတႃႇ ဢွင်ႈတီႈဝႆႉၼၼ်ႉ ၽိတ်းပိူင်ႈဝႆႉ",
+       "thumbnail_image-type": "ပိူၼ်သႅၼ်း ၶႅပ်းႁၢင်ႈ ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉ",
+       "thumbnail_gd-library": "လွင်ႈႁၢင်ႈပွင် ႁူင်းႁွမ်တွမ် GD ဢမ်ႇယဝ်ႉတူဝ်ႈ: ၵၢၼ်သၢင်ႈ $1 ႁၢမ်းဝႆႉ",
+       "thumbnail_image-missing": "ၾၢႆႇဢၢပ်ႈလႅပ်ႈႁၢႆဝႆႉ : $1",
+       "thumbnail_image-failure-limit": "တွၼ်ႈတႃႇၶိုၼ်းတုမ်ႉတွပ်ႇပၼ် ၽိုၼ်လိၵ်ႈ ၼၼ်ႉ လွင်ႈၶတ်းၸႂ်မၼ်း လူႉလႅဝ်ၵႂႃႇ ၼမ်ၼႃႇဢႃးလႃး ($1 ဢမ်ႇၼၼ် ၼမ်လိူဝ်)။ ဝၢႆးလင်မႃး ၶႅၼ်းတေႃႈ ၶိုၼ်းၶတ်းၸႂ်တူၺ်းထႅင်ႈ လႄႈ။",
+       "import": "သႂ်ႇၶဝ်ႈ ၼႃႈလိၵ်ႈ",
+       "importinterwiki": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
+       "import-interwiki-text": "လိူၵ်ႈပၼ် ဝီႇၶီႇလႄႈ ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ တွၼ်ႈတႃႇ သႂ်ႇၶဝ်ႈ။\nဝၼ်းထီႉ ၶူၼ်ႉၶႆႉလႄႈ ၸိုဝ်ႈ ၽူႈမႄးထတ်း ၼၼ်ႉ တေဢဝ်သိမ်းဝႆႉ။\nၸိူဝ်းဢၼ်ဢဝ်တီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း မႃးသႂ်ႇၼၼ်ႉ တေမၢႆတမ်းဝႆႉ ၵႃႈတီႈ [[Special:Log/import|import log]] ။",
+       "import-interwiki-sourcewiki": "ငဝ်ႈငႃႇ ဝီႇၶီႇ:",
+       "import-interwiki-sourcepage": "ငဝ်ႈငႃႇ ၼႃႈလိၵ်ႈ:",
+       "import-interwiki-history": "ထုတ်ႇဢဝ် ပိုၼ်းၶူၼ်ႉၶႆႈတင်းသဵင်ႈ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ",
+       "import-interwiki-templates": "ၶဝ်ႈပႃး လွၵ်းပိူင်တင်းသဵင်ႈ",
+       "import-interwiki-submit": "သႂ်ႇၶဝ်ႈ",
+       "import-mapping-default": "သႂ်ႇၶဝ်ႈၸူး ဢွင်ႈဝႆႉ ပိူင်ၵႅဝ်ႈ",
+       "import-mapping-namespace": "သႂ်ႇၶဝ်ႈၸူး ဢွင်ႈၸိုဝ်ႈ:",
+       "import-mapping-subpage": "သႂ်ႇၶဝ်ႈၼင်ႇ ၼႃႈလိၵ်ႈၽႄ ၶွင် ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ:",
+       "import-upload-filename": "ၸိုဝ်ႈၾၢႆႇ:",
+       "import-comment": "ၶေႃႈႁၼ်ထိုင်:",
+       "importtext": "ၶႅၼ်းတေႃႈ ၸႂ်ႉတိုဝ်း  [[Special:Export|export utility]] သေ လုၵ်ႉတီႈ ငဝ်ႈငႃႇ ဝီႇၶီႇ​ သူင်ႇၾၢႆႇဢွၵ်ႇ။\nသိမ်းဢၼ်ၼႆႉ ၸူးတီႈ ၶွမ်ႇပိဝ်ႇတႃႇၸဝ်ႈၵဝ်ႇလႄႈ လူတ်ႇၶိုၼ်ႈဢၼ်ၼႆႉ တီႈၼႆႈ။",
+       "importstart": "တိုၵ်ႉဢဝ် ၼႃႈလိၵ်ႈသႂ်ႇယူႇ...",
+       "import-revision-count": "$1 {{PLURAL:$1|ၶူၼ်ႉၶႆႈ}}",
+       "importnopages": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းတႃႇသႂ်ႇၶဝ်ႈ",
+       "imported-log-entries": "သႂ်ႇၶဝ်ႈယဝ်ႉ $1 {{PLURAL:$1|မၢႆတမ်း ၶေႃႈသႂ်ႇၶဝ်ႈ}}.",
+       "importfailed": "လွင်ႈသႂ်ႇၶဝ်ႈ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ: <nowiki>$1</nowiki>",
+       "importunknownsource": "ဢမ်ႇႁူႉပိူင်သႅၼ်း ငဝ်ႈငႃႇ သႂ်ႇၶဝ်ႈ",
+       "importcantopen": "ဢမ်ႇၸၢင်ႈပိုတ်ႇ ၾၢႆႇသႂ်ႇၶဝ်ႈ",
+       "importbadinterwiki": "ႁဵင်းၵွင်ႉ ဝီႇၶီႇၸူမ် ဢၼ်ဢမ်ႇလီ",
+       "importsuccess": "သႂ်ႇၶဝ်ႈ ယဝ်ႉတူဝ်ႈယဝ်ႈ!",
+       "importnosources": "တီႈဢၼ်မၵ်းမၼ်ႈဝႆႉ တႃႇသႂ်ႇၶဝ်ႈၼၼ်ႉ မၼ်းဢမ်ႇမီး ဝီႇၶီႇ လႄႈ လွင်ႈလူတ်ႇၶိုၼ်ႈ ပိုၼ်းၵမ်းသိုဝ်ႈၼၼ်ႉ ထုၵ်ႇဢိုတ်းၸႂ်ႉဝႆႉ။",
+       "importnofile": "ၾၢႆႇသႂ်ႇၶဝ်ႈ ဢမ်ႇလႆႈလူတ်ႇၶိုၼ်ႈဝႆႉ။",
+       "importuploaderrorsize": "လွင်ႈလူတ်ႇၶိုၼ်ႈ ၾၢႆႇသႂ်ႇၶဝ်ႈ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ။\nၾၢႆႇၼၼ်ႉ ယႂ်ႇပူၼ်ႉလိူဝ် သႅၼ်းလူတ်ႇၶိုၼ်ႈ ဢၼ်ၶႂၢင်းပၼ်ဝႆႉ။",
+       "importuploaderrortemp": "လွင်ႈလူတ်ႇၶိုၼ်ႈ ၾၢႆႇသႂ်ႇၶဝ်ႈ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ။\nၾူဝ်ႈတႃႇၸႂ်ႉတူဝ်ႈၵႅမ်ႉၼၼ်ႉ ႁၢႆဝႆႉ။",
+       "import-parse-failure": "ပွင်ႈသႂ်ႇၶဝ်ႈ XML ဢမ်ႇၶႅမ်ႉလႅပ်ႈ",
+       "import-noarticle": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းတႃႇသႂ်ႇၶဝ်ႈ!",
+       "import-nonewrevisions": "ဢမ်ႇမီးၶေႃႈၶူၼ်ႉၶႆႈ ဢၼ်သႂ်ႇၶဝ်ႈဝႆႉ (ၶဝ်ႈၸိူဝ်းၼၼ်ႉ ပၼ်ဝႆႉယဝ်ႉ ႁိုဝ်ဢမ်ႇၼၼ် ထုၵ်ႇၶၢမ်ႈပႅတ်ႈ ယွၼ်ႉမီးလွင်ႈၽိတ်းပိူင်ႈ)။",
+       "xml-error-string": "$1 တီႈ ထႅဝ် $2, ယွင်း $3 (byte $4): $5",
+       "import-upload": "လူတ်ႇၶိုၼ်ႈ ၶေႃႈမုၼ်း XML",
+       "importlogpage": "သႂ်ႇၶဝ်ႈ မၢႆတမ်း",
+       "javascripttest": "လွင်ႈၵူတ်ႇထတ်း JavaScript",
+       "javascripttest-pagetext-unknownaction": "\"$1\" လွင်ႈတူင်ႉၼိုင် ဢၼ်ဢမ်ႇႁူႉၸၵ်း။",
+       "javascripttest-qunit-intro": "တူၺ်း [$1 ၽိုၼ်လိၵ်ႈ လွင်ႈၵူတ်ႇထတ်း] တီႈ mediawiki.org ။",
        "tooltip-pt-userpage": "ၼႃႈလိၵ်ႈသုၼ်ႇတူဝ်ၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-anonuserpage": "ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း တွၼ်ႈတႃႇ ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇ ဢၼ်ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမႄးထတ်း ၼင်ႇ",
        "tooltip-pt-mytalk": "ၼႃႈလိၵ်ႈသပ်းလႅင်းၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-anontalk": "လွင်ႈဢုပ်ႇဢူဝ်း ၵပ်းၵၢႆႇလွင်ႈမႄးထတ်း ၵႃႈတီႈ ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇဢၼ်ၼႆႉ",
        "tooltip-pt-preferences": "{{GENDER:|ၸဝ်ႈၵဝ်ႇ}} ငဝ်ႈၵုမ်းပိူင်",
        "tooltip-pt-watchlist": "သဵၼ်ႈမၢႆၼႃႈလိၵ်ႈ ဢၼ်ပႂ်ႉတူၺ်း တႃႇလႅၵ်ႈလၢႆႈ",
        "tooltip-pt-mycontris": "သဵၼ်ႈမၢႆ ၶေႃႈလိၵ်ႈၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-anoncontribs": "သဵၼ်ႈမၢႆ လွင်ႈမႄးထတ်း ၸိူဝ်းႁဵတ်းဝႆႉ ၵႃႈတီႈ ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇဢၼ်ၼႆႉ",
        "tooltip-pt-login": "ဢမ်ႇလွၵ်ႉဢိၼ်ႇၵေႃႈမူၼ်ႉမႄးလႆႈ ၵူၺ်း တိုၵ်းသူၼ်းႁႂ်ႈလွၵ်ႉဢိၼ်ႇ",
-       "tooltip-pt-logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
+       "tooltip-pt-logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
        "tooltip-pt-createaccount": "ၸဝ်ႈၵဝ်ႇထုၵ်ႇပၼ်ႁႅင်း တွၼ်ႈတႃႇၵေႃႇသၢင်ႈ ဢၶွင်ႉလႄႈ လွၵ်ႉဢိၼ်ႇ။ ႁူမ်ႈဝႃႈၼၼ်သေတႃႉ ဢမ်ႇၸႂ်ႈဝႃႈ ဢမ်ႇႁဵတ်းဢမ်ႇလႆႈၼင်ႇၵဝ်ႇ။",
        "tooltip-ca-talk": "ဢုပ်ႇဢူဝ်းလွင်ႈပႃးဝႆႉၼႂ်းၼႃႈလိၵ်ႈ",
        "tooltip-ca-edit": "မႄးထတ်း ၼႃးလိၵ်ႈၼႆႉ",
        "tooltip-ca-addsection": "တႄႇပွတ်းတွၼ်ႈမႂ်ႇ",
        "tooltip-ca-viewsource": "ၼႃႈ​လိၵ်ႈ​ၼႆႉ ထုၵ်ႇ​ႁေႉ​ၵင်ႈ​ဝႆႉ။ သူ​ၸၢင်ႊ​တူၺ်း​ င​ဝ်ႈငႃႇမၼ်းလႆႈ",
-       "tooltip-ca-history": "á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ပူၼ်ႉမႃး တႃႇၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-history": "á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ပူၼ်ႉမႃး တႃႇၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-ca-protect": "ႁေႉၵင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-unprotect": "လႅၵ်ႈလၢႆႈ လွင်ႈႁႄႉၵင်ႈ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-ca-delete": "ယႃႉ ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-undelete": "ဢဝ်လွင်ႈမႄးထတ်း ဢၼ်ယဝ်ႉၼၼ်ႉ ဝႆႉၶိုၼ်းၸူး ၼႃႈလိၵ်ႈၼႆႉ၊ မိူဝ်ႈၼႃႈလိၵ်ႈၼၼ်ႉ ပႆႇတၼ်းထုၵ်ႇမွတ်ႇပႅတ်ႈၼၼ်ႉ။",
        "tooltip-ca-move": "ၶၢႆႉ ၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-ca-watch": "ဢဝ်ၼႃႈလိၵ်ႈၼႆႉ သႂ်ႇၼႂ်းသဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "tooltip-ca-unwatch": "ထွၼ်ပႅတ်ႈ ၼႃႈလိၵ်ႈၼႆႉ ၵႃႈတီႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ၸဝ်ႈၵဝ်ႇ",
        "tooltip-search": "ၶူၼ်ႉႁႃ {{SITENAME}}",
        "tooltip-search-go": "သင်ဝႃႈ မီးဝႆႉၸိုဝ်ႈ ၵႂႃႇၸူးၼႃႈလိၵ်ႈၸွမ်းၼင်ႇၸိုဝ်ႈၼႆႉ",
        "tooltip-search-fulltext": "​ႁႃ​ပၼ် ၼႃႈ​လိၵ်ႈ ဢၼ်​ပႃး​တူဝ်​လိၵ်ႈ ၸိူ​ဝ်းၼႆႉလႄႈ",
        "tooltip-t-recentchangeslinked": "ၵၢၼ်လႅၵ်ႈလၢႆႈၼႂ်းၼႃႈလိၵ်ႈ ဢၼ်လုၵ်ႉတီႈၼႃႈလိၵ်ႈၼႆႉသေ လိင်ႉဝႆႉ",
        "tooltip-feed-atom": "ၾိတ်ႉဢတွမ်ႊ(Atom) ၶွင်ႈၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-t-contributions": "သဵၼ်ႈမၢႆလွင်ႈၶဝ်ႈႁူမ်ႈ တွၼ်ႈတႃႇ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်းၼႆ့}}",
+       "tooltip-t-emailuser": "သူင်ႇ ဢီးမေးလ်ၸူး {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း ၵေႃႉၼႆႉ}}",
+       "tooltip-t-info": "လွၼ်ႉၶၢဝ်ႇတၢင်ႇၸိူဝ်း ဢၼ်ၵပ်းၵၢႆႇလူၺ်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-t-upload": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇ",
        "tooltip-t-specialpages": "ပိုတ်ႇၼႄသဵၼ်ႈ ၼႃႈ​လိၵ်ႈ ၶိုၵ်ႉ​တွၼ်း",
        "tooltip-t-print": "ၼႃႈလိၵ်ႈၼႆႉ မၼ်းပဵၼ်ပိူဝ်းသျိၼ်း ဢၼ်ဢိတ်ႇဢွၵ်ႇလႆႈ",
-       "tooltip-t-permalink": "á\82\81á\80µá\80\84á\80ºá\80¸á\81µá\80½á\80\84á\80ºá\82\89á\80\99á\81¼á\80ºá\82\88á\81µá\80­á\80¯á\80\99á\80ºá\80¸á\80\90á\82\83á\82\87á\81¸á\80°á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ",
+       "tooltip-t-permalink": "á\82\81á\80µá\80\84á\80ºá\80¸á\81µá\80½á\80\84á\80ºá\82\89á\80\99á\81¼á\80ºá\82\88á\81µá\80­á\80¯á\80\99á\80ºá\80¸á\80\90á\82\83á\82\87á\81¸á\80°á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼႆႉ",
        "tooltip-ca-nstab-main": "တူၺ်းၼႃႈလိၵ်ႈလမ်းၼႂ်း",
        "tooltip-ca-nstab-user": "တူၺ်းၼႃႈလိၵ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "tooltip-ca-nstab-media": "တူၺ်း ၼႃႈလိၵ်ႈသိုဝ်ႇ",
        "tooltip-ca-nstab-special": "ၼႃႈလိၵ်ႈၼႆႉပဵၼ် ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်း၊ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈ မႄး​ထတ်းႁင်း ၸဝ်ႈၵဝ်ႇ ၶေႃၶေႃ။",
        "tooltip-ca-nstab-project": "တူၺ်းၼႃႈလိၵ်ႈ ပရေႃးၵျႅၵ်ႉ",
        "tooltip-ca-nstab-image": "တူၺ်းၼႃႈလိၵ်ႈၾၢႆႇ",
+       "tooltip-ca-nstab-mediawiki": "တူၺ်း ၶေႃႈၶၢဝ်ႇ ပိူင်သၢင်ႈ",
        "tooltip-ca-nstab-template": "တူၺ်း ပိူင်တမ်း",
+       "tooltip-ca-nstab-help": "တူၺ်းၼႃႈလိၵ်ႈ ၸွႆႈထႅမ်",
        "tooltip-ca-nstab-category": "တူၺ်းလိူင်ႈမၼ်း",
+       "tooltip-minoredit": "မၢႆဢၼ်ၼႆႉၼင်ႇ လွင်ႈမႄးထတ်း ဢိတ်းဢီႈ",
        "tooltip-save": "ၵဵပ်းသိမ်း လွင်ႈလႅၵ်ႈလၢႆႈ",
+       "tooltip-publish": "ပိုတ်ႇဢွၵ်ႇ လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ",
        "tooltip-preview": "လူင်ႈၼႃႈတူၺ်း လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ၊ ၶႅၼ်းတေႃႈၸႂ်ႉပၼ် မိူဝ်ႈပႆႇသိမ်း",
        "tooltip-diff": "ၼႄပၼ် လွင်ႈလႅၵ်ႈလၢႆႈ ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းၵႂႃႇတီႈ တူဝ်လိၵ်ႈ",
-       "tooltip-rollback": "\"ႁူၼ်လင်ၶိုၼ်း\" ၼႆႉ မၼ်းတေဢဝ် ၼႃႈလိၵ်ႈၼႆႉ ၶိုၼ်းပိၼ်ႇဝၢႆႇၸူး ၸွမ်းၼင်ႇ ၽူႈႁူမ်ႈသၢင်ႈ ၵေႃႉလိုၼ်းသုတ်းၼၼ်ႉ ထတ်းသၢင်မႃး။",
+       "tooltip-compareselectedversions": "တူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ လွင်ႈၶူၼ်ႉဢၢၼ်ႇသွင်ဢၼ် ဢၼ်လိူၵ်ႈဝႆႉ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-watch": "ဢဝ်ၼႃႈလိၵ်ႈၼႆႉ သႂ်ႇၼႂ်းသဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "tooltip-watchlistedit-normal-submit": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ",
+       "tooltip-watchlistedit-raw-submit": "ဢၢပ်ႉတိတ်ႉ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "tooltip-recreate": "ႁူမ်ႈဝႃႈ မၼ်းထုၵ်ႇမွတ်ႇပႅတ်ႈယဝ်ႉၵေႃႈ ၶိုၼ်းၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "tooltip-upload": "တႄႇလူတ်ႇၶိုၼ်ႈ",
+       "tooltip-rollback": "\"ႁူၼ်လင်ၶိုၼ်း\" ၼႆႉ မၼ်းတေဢဝ် ၼႃႈလိၵ်ႈၼႆႉ ပိၼ်ႈၶိုၼ်းၸူး ၸွမ်းၼင်ႇ ၽူႈႁူမ်ႈသၢင်ႈ ၵေႃႉလိုၼ်းသုတ်းၼၼ်ႉ မႄးထတ်းမႃး။",
        "tooltip-undo": "\"Undo\" ၼႆ့ မၼ်းတေဢဝ် ၵၢၼ်ထတ်းသၢင်ဢၼ်ၼႆႉ ၶိုၼ်းပိၼ်ႇၸူးသေ ၶိုၼ်းပၼ် ပၼ် လၢႆးတူၺ်းလူင်ႈၼႃႈ တႃႇၵၢၼ်ထတ်းသၢင်ႈဢၼ်ၼႆႉ။ မၼ်းတေႁဵတ်းႁႂ်ႈၸဝ်ႈၵဝ်ႇ ထႅမ်သႂ်ႇ လွင်ႈတၢင်းမၼ်း ၵႃႈတီႈ လွၵ်းႁူဝ်ႁုပ်ႇမၼ်းၼၼ်ႉယူႇ။",
+       "tooltip-preferences-save": "သိမ်း ငဝ်ႈၵုမ်းပိူင်",
        "tooltip-summary": "ထႅမ်သႂ်ႇ ၶေႃႈသပ်းလႅင်း ဢၼ်ၵႅပ်ႈ",
+       "anonymous": "{{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ ၶွင် {{SITENAME}}",
+       "siteuser": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း $1",
+       "anonuser": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ $1",
+       "lastmodifiedatby": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇ $3 ၵေႃႉမူၼ်ႉမႄးဝႆႉမိူဝ်ႈ $2, $1။",
+       "spam_reverting": "လွင်ႈပိၼ်ႈၶိုၼ်း လွင်ႈၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်းၼၼ်ႉ မၼ်းဢမ်ႇၶဝ်ႈပႃးဝႆႉ ႁဵင်းၵွင်ႉ ဢၼ်ၵွင်ႉၸူး $1",
        "simpleantispam-label": "ၵူတ်ႇထတ်း Anti-spam.\n<strong>ယႃႇပေ</strong>ထႅမ်ဢၼ်ၼႆႉသႂ်ႇ!",
+       "pageinfo-header-basic": "�လွၼ်ႉၶၢဝ်ႈ ပိုၼ်ႉထၢၼ်",
+       "pageinfo-header-edits": "ပိုၼ်းမႄးထတ်း",
+       "pageinfo-header-restrictions": "လွင်ႈႁႄႉၵင်ႈၼႃႈလိၵ်ႈ",
+       "pageinfo-header-properties": "ၼမ်ႉၸႂ်ႉ ၼႃႈလိၵ်ႈ",
+       "pageinfo-display-title": "ဢွၵ်ႇၼႄ ႁူဝ်ၶေႃႈ",
+       "pageinfo-default-sort": "​သေႃးၸႅၼ်ႇ ပိူင်ၵႅဝ်ႈ",
+       "pageinfo-length": "တၢင်းယၢဝ်း ၼႃႈလိၵ်ႈ (ၼင်ႇ bytes)",
+       "pageinfo-article-id": "မၢႆၽၢင် ၼႃႈလိၵ်ႈ",
+       "pageinfo-language": "ၽႃႇသႃႇ လမ်းၼႂ်း ၼႃႈလိၵ်ႈ",
+       "pageinfo-language-change": "လႅၵ်ႈလၢႆႈ",
+       "pageinfo-content-model": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၼႃႈလိၵ်ႈ",
+       "pageinfo-content-model-change": "လႅၵ်ႈလၢႆႈ",
+       "pageinfo-robot-index": "ၶႂၢင်းပၼ်ဝႆႉ",
+       "pageinfo-robot-noindex": "ဢမ်ႇၶႂၢင်းပၼ်ဝႆႉ",
+       "pageinfo-watchers": "တၢင်းၼမ် ၽူႈတူၺ်းၼႃႈလိၵ်ႈ",
+       "pageinfo-visiting-watchers": "တၢင်းၼမ်ၽူႈၶဝ်ႈတူၺ်း ၼႃႈလိၵ်ႈ ၵေႃႉဢၼ် တိုၵ်ႉႁႃၶဝ်ႈဢႅဝ်တီႈ လွင်ႈမႄးထတ်း ၸိူဝ်းပႆႇပေႃးႁိုင်",
+       "pageinfo-few-watchers": "ဢေႇလိူဝ်သေ $1 {{PLURAL:$1|ၽူႈၶဝ်ႈတူၺ်း}}",
+       "pageinfo-firstuser": "ၽူႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "pageinfo-firsttime": "ဝၼ်းထီႉ လွင်ႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "pageinfo-lastuser": "ၽူႈမႄးထတ်း ၵေႃႉလိုၼ်းသုတ်း",
+       "pageinfo-lasttime": "ဝၼ်းထီႉ လွင်ႈမႄးထတ်း လိုၼ်းသုတ်း",
+       "pageinfo-edits": "ႁူဝ်ႁုပ်ႈတၢင်းၼမ် လွင်ႈမႄးထတ်း",
+       "pageinfo-authors": "ႁူဝ်ႁုပ်ႈတၢင်းၼမ် ၽူႈတႅမ်ႈလိၵ်ႈ ပႅၵ်ႇပိူင်ႈ",
+       "pageinfo-recent-edits": "တၢင်းၼမ်လွင်ႈမႄးထတ်း ၸိူဝ်းပႆႇပေႃးႁိုင် (တီႈၼႂ်း ၶၢဝ်းပူၼ်ႉမႃး $1)",
+       "pageinfo-recent-authors": "တၢင်းၼမ် ၽူႈတႅမ်ႈလိၵ်ႈ ပႅၵ်ႇပိူင်ႈ ၸိူဝ်းဢၼ်ပႆႇပေႃးႁိုင်",
        "pageinfo-toolboxlink": "လွၼ်ႉၶၢဝ်ႇၼႃႈလိၵ်ႈ",
+       "pageinfo-redirectsto": "ဝိၼ်ႇၵႂႃႇၸူး",
+       "pageinfo-redirectsto-info": "လွၼ်ႉၶၢဝ်ႇ",
+       "pageinfo-contentpage": "ၼပ်ႉဢၢၼ်ႇဝႆႉၼင်ႇ ၼႃႈလိၵ်ႈလမ်းၼႂ်း",
+       "pageinfo-contentpage-yes": "ၸႂ်ႈယဝ်ႉ",
+       "pageinfo-protect-cascading": "လွင်ႈႁႄႉၵင်ႈၼႆႉ လႆႈလူင်းယူႇတီႈၼႆ",
+       "pageinfo-protect-cascading-yes": "ၸႂ်ႈယဝ်ႉ",
+       "pageinfo-protect-cascading-from": "လွင်ႈႁႄႉၵင်ႈၼႆႉ လႆလူင်းယူႇတီႈၼႆႈ",
+       "pageinfo-category-info": "လွၼ်ႉၶၢဝ်ႇ ထၢၼ်ႈၵၼ်",
+       "pageinfo-category-total": "တၢင်းၼမ် ၽူႈၶဝ်ႈၸုမ်း",
+       "pageinfo-category-pages": "တၢင်းၼမ်ၼႃႈလိၵ်ႈ",
+       "pageinfo-category-subcats": "တၢင်းၼမ် ထၢၼ်ႈၵၼ်ၽႄ",
+       "pageinfo-category-files": "တၢင်းၼမ်ၾၢႆႇ",
+       "pageinfo-user-id": "မၢႆတူဝ် ၽူႈၸႂ်ႉတိုဝ်း",
+       "markaspatrolleddiff": "မၢႆဝႆႉၼင်ႇ ပႂ်ႉယၢမ်း",
+       "markaspatrolledtext": "မၢႆဝႆႉၼႃႈလိၵ်ႈၼင်ႇ ပႂ်ႉယၢမ်း",
+       "markedaspatrolled": "မၢႆဝႆႉၼင်ႇ ပႂ်ႉယၢမ်း",
        "previousdiff": "ၵၢၼ်မႄးထတ်း ဢၼ်ၵဝ်ႇ",
        "nextdiff": "ထတ်းသၢင်ႈဢၼ်မႂ်ႇမႂ်ႇ",
        "file-info-size": "$1 × $2 pixels, တၢင်းလဵၵ်ႉတၢင်းယႂ်ႇ ၾၢႆႇ: $3, ယိူင်ႈ MIME: $4",
        "show-big-image-preview": "သႅၼ်းတႃႇတူၺ်းလူင်ႈၼႃႈ: $1.",
        "show-big-image-other": " {{PLURAL:$2|resolution|resolutions}}: $1 တၢင်ႇဢၼ်",
        "show-big-image-size": "$1 × $2 ၽိၵ်ႉသိူဝ်ႇ",
+       "ilsubmit": "ၶူၼ်ႉႁႃ",
+       "bydate": "ၼင်ႇ ဝၼ်းထီႉ",
+       "sp-newimages-showfrom": "ၼႄ ၾၢႆႇဢၼ်မႂ်ႇ ၸိူဝ်းတႄႇ မႃးမိူဝ်ႈ $2, $1",
+       "seconds": "{{PLURAL:$1|$1 ၶိတ်ႇ}}",
+       "minutes": "{{PLURAL:$1|$1 မဵတ်ႉ}}",
+       "hours": "{{PLURAL:$1|$1 မူင်း}}",
+       "days": "{{PLURAL:$1|$1 ဝၼ်း}}",
+       "weeks": "{{PLURAL:$1|$1 ဝူင်ႈ}}",
+       "months": "{{PLURAL:$1|$1 လိူၼ်}}",
+       "years": "{{PLURAL:$1|$1 ပီ}}",
+       "ago": "ပူၼ်ႉမႃး $1",
+       "just-now": "တိုၵ်ႉႁႃယၢမ်းလဵဝ်",
+       "hours-ago": "မိူဝ်ႈပူၼ်ႉမႃႈ $1 {{PLURAL:$1|မူင်း}}",
+       "minutes-ago": "မိူဝ်ႈပူၼ်ႉမႃး $1 {{PLURAL:$1|မဵတ်ႉ}}",
+       "seconds-ago": "မိူဝ်ႈပူၼ်ႉမႃး $1 {{PLURAL:$1|ၶိတ်ႇ}}",
+       "monday-at": "ဝၼ်းၸၼ် မိူဝ်ႈ $1",
+       "tuesday-at": "ဢၢင်းၵၢင်း မိူဝ်ႈ $1",
+       "wednesday-at": "ဝၼ်းပုတ်ႉ မိူဝ်ႈ $1",
+       "thursday-at": "ဝၼ်းၽတ်း မိူဝ်ႈ $1",
+       "friday-at": "ဝၼ်းသုၵ်း မိူဝ်ႈ $1",
+       "saturday-at": "ဝၼ်းသဝ် မိူဝ်ႈ $1",
+       "sunday-at": "ဝၼ်းဢႃးတိတ်ႉ မိူဝ်ႈ $1",
+       "yesterday-at": "မိူဝ်ႈဝႃး မိူဝ်ႈ $1",
        "metadata": "ၶေႃႈမုၼ်းၼႅပ်ႇ",
        "metadata-help": "ၾၢႆႇဢၼ်ၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉလွၼ်ႉၶၢဝ်ႇ ထႅမ်သႂ်ႇမႂ်ႇ၊ ဢၼ်ဢၢပ်ႈထုၵ်ႉတီႈ ၵွင်ႈထႆႇ digital ဢမ်ႇၼၼ် တူဝ်ၵူတ်ႇ 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-datetimeoriginal": "ဝၼ်းလႄႈၶၢဝ်းယၢမ်း တမ်ႈတီႈ ၶေႃႈမုၼ်းမႂ်ႇ",
        "exif-datetimedigitized": "ဝၼ်းထီႉလႄႈ ၶၢဝ်းယၢမ်းတႃႇ digitizing",
        "exif-orientation-1": "သႃမၺ်း",
+       "exif-exposureprogram-1": "မိုဝ်းႁဵတ်း",
+       "exif-dc-contributor": "ၽူႈၶဝ်ႈႁူမ်ႈ",
        "namespacesall": "တင်းမူတ်း",
        "monthsall": "တင်းမူတ်း",
+       "confirm-rollback-top": "တေပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ၼႃႈလိၵ်ႈဢၼ်ၼႆႉၼႄႇ?",
+       "watchlistedit-normal-title": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistedit-normal-legend": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ တမ်ႈတီႈ သဵၼ်ႈမၢႆမႂ်ႉတူၺ်း",
+       "watchlistedit-normal-submit": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ",
        "watchlistedit-normal-done": "{{PLURAL:$1|A single title was|$1 titles were}} ဢဝ်ဢွၵ်ႇ တမ်ႈတီႈ သဵၼ်ႈဢၼ်ၸဝ်ႈၵဝ်ႇ ပႂ်ႉတူၺ်း",
+       "watchlistedit-raw-title": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းပိူင်လိူင်း",
+       "watchlistedit-raw-legend": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းပိူင်လိူင်း",
+       "watchlistedit-raw-titles": "ႁူဝ်ၶေႃႈ :",
+       "watchlistedit-raw-submit": "ဢၢပ်ႉတိတ်ႉ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistedit-raw-done": "သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းဢၢပ်ႉတိတ်ႉယဝ်ႉယဝ်ႈ",
+       "watchlistedit-raw-added": "{{PLURAL:$1|1 ႁူဝ်ၶေႃႈ ထုၵ်ႇ}} ထႅမ်သႂ်ႇဝႆႉ:",
+       "watchlistedit-raw-removed": "{{PLURAL:$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 ႁူဝ်ၶေႃႈ ထုၵ်ႇ}} ထွၼ်ပႅတ်ႈယဝ်ႉ:",
+       "watchlistedit-too-many": "တီႈၼႆႈၼႆႉ မီးၼႃႈလိၵ်ႈၼမ်ၼႃ တွၼ်ႈတႃႇတေဢွၵ်ႇၼႄ။",
+       "watchlisttools-clear": "လၢင်ႉပႅတ်ႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlisttools-view": "တူၺ်း ၸိူဝ်းလႅၵ်ႈလၢႆႈ ဢၼ်သၢင်ႇထုၵ်ႇ",
+       "watchlisttools-edit": "တူၺ်း လႄႈ မႄးထတ်း သဵၼ်ႈမၢႆတူၺ်း",
+       "watchlisttools-raw": "မႄးထတ်း သဵၼ်ႈမၢႆတူၺ်း ပိူင်လိူင်း",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "timezone-local": "လူဝ်ၵႂ်ႇ",
+       "version": "မၢႆဢွၵ်ႇ",
+       "version-extensions": "သၢႆလင် ၸိူဝ်းဢူၼ်းသႂ်ႇဝႆႉ�",
+       "version-skins": "ၽိဝ်ၼင် ၸိူဝ်းဢူၼ်းသႂ်ႇဝႆႉ�",
+       "version-specialpages": "�ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
        "specialpages": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
        "tag-filter": "ၶတ်းလိူၵ်ႈဢဝ်[[Special:Tags|Tag]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
        "logentry-move-move": "$1 {{GENDER:$2|ၶၢႆႉယဝ်ႉ}} ၼႃႈလိၵ်ႈ $3 တေႃႇ $4",
        "logentry-newusers-create": "ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း $1 ၼႆႉ လႆႈ  {{GENDER:$2|ၵေႃႇသၢင်ႈယဝ်ႉ}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|လူတ်ႇၶိုၼ်ႈၵႂႃႇယဝ်ႉ}} $3",
-       "searchsuggest-search": "ၶူၼ်ႉႁႃ",
-       "mw-widgets-dateinput-no-date": "ပႆႇလိူၵ်ႈဝၼ်းယၢမ်း"
+       "searchsuggest-search": "ၶူၼ်ႉႁႃ {{SITENAME}}",
+       "mw-widgets-dateinput-no-date": "ပႆႇလိူၵ်ႈဝၼ်းယၢမ်း",
+       "revid": "ၶူၼ်ႉၶႆႈ $1",
+       "pageid": "မၢႆၽၢင် ၽိုၼ်လိၵ်ႈ $1"
 }
index 59a3ba6..c54d38e 100644 (file)
        "passwordreset-emaildisabled": "විද්‍යුත්  තැපැල් පහසුකම මෙම විකි ය සඳහා අවලංගු කොට ඇත.",
        "passwordreset-username": "පරිශීලක නාමය:",
        "passwordreset-domain": "වසම:",
-       "passwordreset-capture": "ප්‍රතිපලදායක විද්‍යුත් තැපෑල නරඹනවාද?",
-       "passwordreset-capture-help": "ඔබ මෙම කොටුව සලකුණු කලොත්, විද්‍යුත් තැපෑලක් (තාවකාලික මුරපදය සමඟ) ඔබට සහ යවන පුද්ගලයට දිස්වනු ඇත.",
        "passwordreset-email": "විද්‍යුත්-තැපැල් ලිපිනය:",
        "passwordreset-emailtitle": "{{SITENAME}}යෙහි ගිණුම් තොරතුරු",
        "passwordreset-emailtext-ip": "කවුරුන්හෝ (බොහෝවිට ඔබ, $1 අන්තර්ජාල ලිපිනය භාවිතයෙන්) {{SITENAME}} ($4) සඳහා ඔබගේ ගිණුම් විස්තර සිහිකැඳවීමක් ඉල්ලා ඇත.  පහත පරිශීලක {{PLURAL:$3|ගිණුම|ගිණුම්}}\nමෙම විද්‍යුත් තැපැල් ලිපිනය හා සමගින් ආශ්‍රය වෙයි.\n\n$2\n\n{{PLURAL:$3|මෙම තාවකාලික මුරපදය|මෙම තාවකාලික මුරපද}} {{PLURAL:$5|එක් දිනයක්|දින $5 ක්}} ගෙවුනු විට ඉකුත් වනු ඇත.\nඔබ දැන් ප්‍රවිෂ්ට වී නව මුරපදයක් තෝරාගත යුතුයි. වෙන යම් අයෙක් මෙම ඉල්ලීම කර ඇත්නම් හෝ, ඔබගේ මුල් මුරපදය ඔබගේ මතකයට පැමිණ ඇති නම් හා, එය වෙනස් කිරීමට ඔබ හට තවදුරටත් අවශ්‍ය නොවේ නම්, ඔබ විසින් මෙම පණිවුඩය නොසලකා හැර පැරණි මුරපදය තවදුරටත් පාවිච්චි කළ හැක.",
        "saveprefs": "සුරැකුම",
        "restoreprefs": "පෙරනිමි සැකසුම් සියල්ලම යළි-පිහිටුවන්න",
        "prefs-editing": "සංස්කරණය කිරීම්",
-       "rows": "පේළි:",
-       "columns": "තීරු:",
        "searchresultshead": "ගවේෂණය",
        "stub-threshold": "<a href=\"#\" class=\"stub\">කොට සබැඳි</a> ආකෘතිකරණය සඳහා සීමකය (බයිට්):",
        "stub-threshold-sample-link": "නියැදිය",
        "userrights-reason": "හේතුව:",
        "userrights-no-interwiki": "අනෙකුත් විකියන්හි පරිශීලක හිමිකම් සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
        "userrights-nodatabase": "$1 දත්ත-ගබඩාව නොපවතියි හෝ ස්ථානීක නොවෙයි.",
-       "userrights-nologin": "පරිශීලක හිමිකම් ප්‍රදානය කරනු වස්, ඔබ පරිපාලක ගිණුමකින්  [[Special:UserLogin|පුවිෂ්ට විය]] යුතුය.",
-       "userrights-notallowed": "පරිශීලක හිමිකම් එක් කිරීමට හෝ ඉවත් කිරීමට ඔබට අවසර නැත.",
        "userrights-changeable-col": "ඔබට වෙනස් කල හැකි කණ්ඩායම්",
        "userrights-unchangeable-col": "ඔබට වෙනස් කල නොහැකි කණ්ඩායම්",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "පරිශීලක හිමිකම් වෙනස්කම් ගැටුම්! සමාලෝචනය සහ ඔබේ වෙනස්කම් සනාථ කරන්න.",
-       "userrights-removed-self": "ඔබ සාර්ථකව ඔබේ ම හිමිකම් ඉවත් කර ඇත. ඒ නිසා, ඔබ තවදුරටත් මෙම පිටුව වෙත පිවිසිය හැකි ය.",
        "group": "කණ්ඩායම:",
        "group-user": "පරිශීලකයෝ",
        "group-autoconfirmed": "ස්වයංක්‍රීයව-චිරස්ථිතවූ පරිශීලකයෝ",
        "right-siteadmin": "දත්ත-ගබඩාව අවුරන්න හා ඇවුරුම ඉවත් කරන්න",
        "right-override-export-depth": "5වන මට්ටම දක්වා සබැඳි පිටු ද සහිතව පිටු නිර්යාත කරන්න",
        "right-sendemail": "අනෙක් පරිශීලකයන්ට ඊ-ලිපි යවන්න",
-       "right-passwordreset": "මුරපද යලි සැකසීම් විද්‍යුත් තැපෑලයන් නරඹන්න",
        "right-managechangetags": "දත්ත සමුදාය සිට [[Special:Tags|ඇමුණුම්]] නිර්මාණය කර මකා",
        "right-applychangetags": "ඉල්ලුම් කරන්න කෙනෙකුගේ වෙනස්කම් සමග, [[Special:Tags|ඇමිණුම්]]",
        "right-changetags": "තනි තනි අනුවාදයන් සහ ලඝු සටහන් ඇතුළත් කිරීම් මත අත්තනෝමතික [[Special:Tags|ඇමිණුම්]] එකතු හෝ ඉවත්",
        "uploaddisabledtext": " {{SITENAME}} හි ගොනු උඩුගත කිරීම් අක්‍රීය කර ඇත.",
        "php-uploaddisabledtext": "PHP හි ගොනු උඩුගතකිරීම් අක්‍රීය කොට ඇත.\nකරුණාකර  ගොනු_උඩුගතකිරීම් පරිස්ථිතිය පරික්ෂා කර බලන්න.",
        "uploadscripted": "වෙබ් බ්‍රවුසරයක් මගින් සාවද්‍ය ලෙස අර්ථ පැහැදිය හැකි HTML හෝ ලේඛන ක්‍රම තේතයක් මෙම ගොනුවේ අඩංගු වේ.",
-       "uploadscriptednamespace": "මෙම SVG ගොනුව නීති විරෝධී නාම අවකාශය ටැග පෙරහන: \"$1\" අඩංගු වේ.",
+       "uploadscriptednamespace": "මෙම SVG ගොනුව නීති විරෝධී නාම අවකාශය ටැග පෙරහන: \"<nowiki>$1</nowiki>\" අඩංගු වේ.",
        "uploadinvalidxml": "උඩුගත දී මෙම XML කියවූ කළ නොහැකි විය.",
        "uploadvirus": "මෙම ගොනුවෙහි වයිරසයක් අඩංගුය! විස්තර: $1",
        "uploadjava": "මෙය ZIP ගොනුවක් වන අතර ජාවා .class ගොනු අඩංගු වෙයි.\nජාවා ගොනු උඩුගත කිරීම සදහා අවසර ලබා නොදේ, මන්ද ඒවා ආරක්ෂිත අවහිරතා මගහැර යාමට හේතු විය හැක.",
        "feedback-useragent": "පරිශීලක නියෝජිත:",
        "searchsuggest-search": "ගවේශණය කරන්න",
        "searchsuggest-containing": "ඇතුළත් වෙමින් පවතී...",
-       "api-error-badaccess-groups": "මෙම විකියට ගොනු උඩුගතකිරීම සඳහා ඔබට අවසර නැත.",
        "api-error-badtoken": "අභ්‍යන්තර දෝෂය: නොසුදුසු ටෝකනය.",
-       "api-error-copyuploaddisabled": "URL මඟින් උඩුගතකිරීම මෙම සර්වරයේදී අක්‍රීය කොට තිබේ.",
-       "api-error-duplicate": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|වෙනත් ගොනු $2 ක්|වෙනත් ගොනු $2 ක්}} අඩවිය තුල දැනටමත් පවතියි.",
-       "api-error-duplicate-archive": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|වෙනත් ගොනු ක්|වෙනත් ගොනු ක්}} අඩවිය තුල දැනටමත් තිබුනා, නමුත්  {{PLURAL:$1|ඒක|ඒවා}} මකා දමා ඇත.",
-       "api-error-empty-file": "ඔබ ඉදිරිපත්කල ගොනුව හිස් එකකි.",
        "api-error-emptypage": "නවතම එකක් තනමින්, හිස් පිටුවලට ඉඩ නොදේ.",
-       "api-error-fetchfileerror": "අභ්‍යන්තර දෝෂය: ගොනුව පැමිණවීම අතරතුරදී කුමක්දෝ වැරදුණා.",
-       "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-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": "මෙම ගොනුව පළුදුවී හෝ එයට වැරදි විස්තිර්ණයක් (extension) ඇතුවා වියහැක.",
        "duration-seconds": "{{PLURAL:$1|තත්පර|තත්පර}} $1 ක්",
        "duration-minutes": "{{PLURAL:$1|මිනිත්තු|මිනිත්තු}} $1 ක්",
        "duration-hours": "{{PLURAL:$1|පැය|පැය}} $1 ක්",
index 1998c28..c8103b6 100644 (file)
        "passwordreset-emaildisabled": "E-mailové funkcie boli na tejto wiki vypnuté.",
        "passwordreset-username": "Používateľské meno:",
        "passwordreset-domain": "Doména:",
-       "passwordreset-capture": "Zobraziť výsledný e-mail?",
-       "passwordreset-capture-help": "Ak označíte toto políčko, bude e-mail (s dočasným heslom) okrem zaslania používateľovi zobrazený aj vám.",
        "passwordreset-email": "Emailová 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-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-emailsent-capture2": "{{PLURAL:$1|Email|Emaily}} na obnovenie hesla {{PLURAL:$1|bol odoslaný|boli odoslané}}. {{PLURAL:$1|Používateľské meno a heslo|Zoznam používateľských mien a hesiel}} je uvedený nižšie.",
        "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-no-info": "Na prístup k tejto stránke musíte byť prihlásený.",
        "userrights-reason": "Dôvod:",
        "userrights-no-interwiki": "Nemáte oprávnenie upravovať práva používateľov na iných wiki.",
        "userrights-nodatabase": "Databáza $1 neexistuje alebo nie je lokálna.",
-       "userrights-nologin": "Aby ste mohli prideľovať používateľom oprávnenia, musíte sa [[Special:UserLogin|prihlásiť]] s účtom správcu.",
-       "userrights-notallowed": "Nemáte oprávnenie prideľovať alebo odoberať používateľom oprávnenia.",
        "userrights-changeable-col": "Skupiny, ktoré môžete zmeniť",
        "userrights-unchangeable-col": "Skupiny, ktoré nemôžete zmeniť",
        "userrights-conflict": "Konflikt zmien práv používateľov! Prosím, skontrolujte ho a potvrďte svoje zmeny.",
-       "userrights-removed-self": "Úspešne ste odstránili svoje vlastné práva. Z toho dôvodu už nebudete mať prístup k tejto stránke.",
        "group": "Skupina:",
        "group-user": "Používatelia",
        "group-autoconfirmed": "zaregistrovaní používatelia",
        "right-siteadmin": "Zamykať a odomykať databázu",
        "right-override-export-depth": "Exportovať stránky vrátane okdazovaných stránok do hĺbky 5 odkazov",
        "right-sendemail": "Posielať e-mail ostatným používateľom",
-       "right-passwordreset": "Prezeranie e-mailov pre znovunastavovanie hesla",
        "right-managechangetags": "Vytvárenie a (de)aktivácia [[Special:Tags|značiek]]",
        "right-applychangetags": "Pridávanie [[Special:Tags|značiek]] k vlastným úpravám",
        "right-changetags": "Pridávanie ľubovoľných [[Special:Tags|značiek]] na jednotlivé revízie a záznamy a ich odoberanie",
        "recentchangeslinked-page": "Názov stránky:",
        "recentchangeslinked-to": "Zobraziť zmeny na stránkach, ''ktoré odkazujú na'' zadanú stránku",
        "recentchanges-page-added-to-category": "[[:$1]] zaradená do kategórie",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] zaradená do kategórie. [[Special:WhatLinksHere/$1|Táto stránka je vložená do iných stránok.]",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] zaradená do kategórie, [[Special:WhatLinksHere/$1|táto stránka je vložená do iných stránok]]",
        "recentchanges-page-removed-from-category": "[[:$1]] vyradená z kategórie",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] odstránená z kategórie. [[Special:WhatLinksHere/$1|Táto stránka je vložená do iných stránok.]",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] odstránená z kategórie, [[Special:WhatLinksHere/$1|táto stránka je vložená do iných stránok]]",
        "autochange-username": "Automatická úprava MediaWiki",
        "upload": "Nahrať súbor",
        "uploadbtn": "Nahrať súbor",
index bf870cb..e1f6f78 100644 (file)
@@ -12,7 +12,8 @@
                        "MaGa",
                        "Skalcaa",
                        "Janezdrilc",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "NegativeTwelveDollars"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "searcharticle": "Pojdi na",
        "history": "Zgodovina strani",
        "history_short": "Zgodovina",
+       "history_small": "zgodovina",
        "updatedmarker": "Posodobljeno od mojega zadnjega obiska",
        "printableversion": "Različica za tisk",
        "permalink": "Trajna povezava",
        "views": "Pogled",
        "toolbox": "Orodja",
        "tool-link-userrights": "Spremeni {{GENDER:$1|uporabnikove|uporabničine}} skupine",
+       "tool-link-userrights-readonly": "Ogled {{GENDER:$1|uporabnikovih|uporabničinih}} skupin",
        "tool-link-emailuser": "Pošlji e-pošto {{GENDER:$1|uporabniku|uporabnici}}",
        "userpage": "Prikaži uporabnikovo stran",
        "projectpage": "Prikaži projektno stran",
        "passwordreset-emaildisabled": "Na tem wikiju so možnosti e-pošte onemogočene.",
        "passwordreset-username": "Uporabniško ime:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Ogled nastale e-pošte?",
-       "passwordreset-capture-help": "Če potrdite to polje, vam bodo e-pošte (z začasnim geslom) pokazane in poslane uporabniku.",
        "passwordreset-email": "E-poštni naslov:",
        "passwordreset-emailtitle": "Podrobnosti računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nekdo (verjetno vi, z IP-naslova $1) je zahteval ponastavitev vašega\ngesla na {{SITENAME}} ($4). S tem e-poštnim naslovom\n{{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
        "passwordreset-emailelement": "Uporabniško ime: \n$1\n\nZačasno geslo: \n$2",
        "passwordreset-emailsentemail": "Če je e-poštni naslov povezan z vašim računom, vam bomo poslali e-pošto za postavitev gesla.",
        "passwordreset-emailsentusername": "Če obstaja e-poštni naslov, povezan s tem uporabniškim imenom, vam bomo poslali e-pošto za postavitev gesla.",
-       "passwordreset-emailsent-capture2": "Poslali smo {{PLURAL:$1|e-pošto|e-pošti|e-pošte}} za ponastavitev gesla. {{PLURAL:$1|Uporabniško ime in geslo sta navedena tukaj.|Seznam uporabniških imen in gesel je naveden tukaj.}}",
-       "passwordreset-emailerror-capture2": "Pošiljanje e-pošte {{GENDER:$2|uporabniku|uporabnici}} je spodletelo: $1 {{PLURAL:$3|Uporabniško ime in geslo sta navedena tukaj.|Seznam uporabniških imen in gesel je naveden tukaj.}}",
        "passwordreset-nocaller": "Podati morate klicatelja",
        "passwordreset-nosuchcaller": "Klicatelj ne obstaja: $1",
        "passwordreset-ignored": "Ponastavitve gesla nismo izvedli. Morda ni nastavljen noben ponudnik?",
        "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.",
        "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.",
-       "summary-preview": "Predogled povzetka",
+       "summary-preview": "Predogled povzetka urejanja:",
        "subject-preview": "Predogled zadeve:",
        "previewerrortext": "Med poskusom prikaza predogleda vaših sprememb je prišlo do napake.",
        "blockedtitle": "Uporabnik je blokiran",
        "blockedtext": "'''Urejanje z vašim uporabniškim imenom oziroma IP-naslovom je onemogočeno.'''\n\nBlokiral vas je $1.\nPodani razlog je ''$2''.\n\n* začetek blokade: $8\n* potek blokade: $6\n* blokirani uporabnik: $7\n\nO blokiranju se lahko pogovorite z uporabnikom/-co $1 ali katerim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorjem]].\nVedite, da lahko ukaz »Pošlji uporabniku e-pismo« uporabite le, če ste v [[Special:Preferences|nastavitvah]] vpisali in potrdili svoj elektronski naslov in ta ni blokiran.\nVaš IP-naslov je $3, številka blokade pa #$5.\nProsimo, vključite ju v vse morebitne poizvedbe.",
        "autoblockedtext": "Vaš IP-naslov je bil samodejno blokiran, saj je bil uporabljen s strani drugega uporabnika, ki ga je blokiral $1.\nRazlog za to je bil naslednji:\n\n:''$2''\n\n* Začetek blokade: $8\n* Konec blokade: $6\n* Blokirani uporabnik: $7\n\nKontaktirate lahko $1 ali katerega od drugih [[{{MediaWiki:Grouppage-sysop}}|administratorjev]], da razpravljate o blokadi.\n\nVedite, da lahko funkcijo »{{:MediaWiki:Emailuser/sl}}« uporabljate le, če ste v svoje [[Special:Preferences|uporabniške nastavitve]] vnesli veljaven e-poštni naslov, in vam njena uporaba ni bila preprečena.\n\nVaš trenutni IP-naslov je $3, ID blokiranja pa #$5. Prosimo, vključite ta ID v vsako zastavljeno vprašanje.",
+       "systemblockedtext": "Vaše uporabniško ime ali IP-naslov je MediaWiki samodejn blokiral.\nPodani razlog je:\n\n:<em>$2</em>\n\n* Začetek blokade: $8\n* Potek blokade: $6\n* Blokirani uporabnik: $7\n\nVaš trenutni IP-naslov je $3.\nProsimo, da v svoje poizvedbe vključite vse zgornje podatke.",
        "blockednoreason": "razlog ni podan",
        "whitelistedittext": "Za urejanje strani se morate $1.",
        "confirmedittext": "Pred urejanjem strani morate potrditi svoj e-poštni naslov.\nProsimo, da ga z uporabo [[Special:Preferences|uporabniških nastavitev]] vpišete in potrdite.",
        "search-interwiki-caption": "Sorodni projekti",
        "search-interwiki-default": "Rezultati s strani $1:",
        "search-interwiki-more": "(več)",
+       "search-interwiki-more-results": "več zadetkov",
        "search-relatedarticle": "Podobno",
        "searchrelated": "povezano",
        "searchall": "vse",
        "search-external": "Zunanji iskalnik",
        "searchdisabled": "Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}} je onemogoočeno.\nMedtem lahko iščete preko Googla.\nUpoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} morda zastareli.",
        "search-error": "Med iskanjem je prišlo do napake: $1",
+       "search-warning": "Med iskanjem je prišlo do napake: $1",
        "preferences": "Nastavitve",
        "mypreferences": "Nastavitve",
        "prefs-edits": "Število urejanj:",
        "saveprefs": "Shrani",
        "restoreprefs": "obnova vseh privzetih nastavitev (v vseh razdelkih)",
        "prefs-editing": "Urejanje",
-       "rows": "Vrstic:",
-       "columns": "Stolpcev:",
        "searchresultshead": "Nastavitve poizvedovanja",
        "stub-threshold": "Prag označevanja škrbin ($1):",
        "stub-threshold-sample-link": "primer",
        "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.",
        "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].",
        "savedprefs": "Spremembe smo uspešno shranili.",
-       "savedrights": "Uporabniške pravice {{GENDER:$1|$1}} smo shranili.",
+       "savedrights": "Uporabniške skupine {{GENDER:$1|$1}} smo shranili.",
        "timezonelegend": "Časovni pas",
        "localtime": "Krajevni čas:",
        "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)",
        "username": "{{GENDER:$1|Uporabniško|Uporabničino}} ime:",
        "prefs-memberingroups": "{{GENDER:$2|Član|Članica}} {{PLURAL:$1|naslednje skupine|naslednjih skupin}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Registriran od:",
        "yourrealname": "Pravo ime:",
        "yourlanguage": "Jezik:",
        "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-lookup-user": "Upravljanje z uporabniškimi skupinami",
+       "userrights-lookup-user": "Izberite uporabnika",
        "userrights-user-editname": "Vpišite uporabniško ime:",
-       "editusergroup": "Uredi {{GENDER:$1|uporabnikove|uporabničine}} skupine",
+       "editusergroup": "Naloži uporabniške skupine",
        "editinguser": "Urejanje pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Urejanje uporabniških skupin",
+       "viewinguserrights": "Ogledovanje uporabniških pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Urejanje {{GENDER:$1|uporabnikovih|uporabničinih}} skupin",
+       "userrights-viewusergroup": "Ogled {{GENDER:$1|uporabnikovih|uporabničinih}} skupin",
        "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.",
+       "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-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-nologin": "Za dodeljevanje uporabniških pravic se morate [[Special:UserLogin|prijaviti]] s skrbniškim računom.",
-       "userrights-notallowed": "Za dodajanje ali odstranjevanje uporabniških pravic nimate dovoljenja.",
        "userrights-changeable-col": "Skupine, ki jih lahko spremenite",
        "userrights-unchangeable-col": "Skupine, ki jih ne morete spremeniti",
+       "userrights-expiry-current": "Poteče $1",
+       "userrights-expiry-none": "Ne poteče",
+       "userrights-expiry": "Poteče:",
+       "userrights-expiry-existing": "Obstoječ čas poteka: $3, $2",
+       "userrights-expiry-othertime": "Drug čas:",
+       "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-conflict": "Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.",
-       "userrights-removed-self": "Odstranili ste svoje pravice. Tako sedaj ne morete več dostopati do te strani.",
        "group": "Skupina:",
        "group-user": "Uporabniki",
        "group-autoconfirmed": "Samodejno potrjeni uporabniki",
        "right-siteadmin": "Zaklepanje in odklepanje baze podatkov",
        "right-override-export-depth": "Izvoz strani, vključno s povezaimi straneh do globine 5",
        "right-sendemail": "Pošiljanje e-pošte drugim uporabnikom",
-       "right-passwordreset": "Ogled e-pošt ponastavitve gesel",
        "right-managechangetags": "Ustvarjanje in (dez)aktivacijo [[Special:Tags|oznak]]",
        "right-applychangetags": "Uveljavitev [[Special:Tags|oznak]] skupaj s spremembami",
        "right-changetags": "Dodajanje in odstranjevanje poljubnih [[Special:Tags|oznak]] na posameznih redakcijah in dnevniških vnosih",
        "action-upload_by_url": "nalaganje te datoteke iz URL-naslova",
        "action-writeapi": "uporabo API-ja za pisanje",
        "action-delete": "brisanje te strani",
-       "action-deleterevision": "brisanje te redakcije",
-       "action-deletedhistory": "pregled zgodovine izbrisanih redakcij te strani",
+       "action-deleterevision": "brisanje redakcij",
+       "action-deletelogentry": "brisanje dnevniških vnosov",
+       "action-deletedhistory": "ogled zgodovine izbrisanih redakcij strani",
+       "action-deletedtext": "ogled besedila izbrisanih redakcij",
        "action-browsearchive": "iskanje izbrisanih strani",
-       "action-undelete": "obnavljanje te strani",
-       "action-suppressrevision": "vpogled in obnavljanje te skrite redakcije",
+       "action-undelete": "Obnovi strani",
+       "action-suppressrevision": "vpogled in obnavljanje skritih redakcij",
        "action-suppressionlog": "vpogled tega zasebnega dnevnika",
        "action-block": "blokiranje urejanja s tega uporabniškega računa",
        "action-protect": "spremembo stopnje zaščite te strani",
        "action-userrights-interwiki": "upravljanje uporabniških pravic za uporabnike drugih wikijev",
        "action-siteadmin": "zaklenitev ali odklepanje podatkovne baze",
        "action-sendemail": "pošiljanje e-sporočil",
+       "action-editmyoptions": "urejanje svojih nastavitev",
        "action-editmywatchlist": "urejanje svojega spiska nadzorov",
        "action-viewmywatchlist": "ogleda svojega spiska nadzorov",
        "action-viewmyprivateinfo": "ogled svojih zasebnih informacij",
        "recentchanges-summary": "Na tej strani lahko spremljate najnovejše spremembe wikija.",
        "recentchanges-noresult": "V podanem obdobju nobena sprememba ne ustreza tem merilom.",
        "recentchanges-feed-description": "Spremljajte zadnje spremembe wikija prek tega vira.",
-       "recentchanges-label-newpage": "s tem urejanjem je uporabnik ustvaril novo stran",
-       "recentchanges-label-minor": "manjše urejanje",
-       "recentchanges-label-bot": "urejanje je izvedel bot",
+       "recentchanges-label-newpage": "To urejanje je ustvarilo novo stran",
+       "recentchanges-label-minor": "To je manjše urejanje",
+       "recentchanges-label-bot": "Urejanje je izvedel bot",
        "recentchanges-label-unpatrolled": "Urejanje še ni bilo pregledano",
-       "recentchanges-label-plusminus": "uporabnik je velikost strani spremenil za tolikšno število bajtov",
+       "recentchanges-label-plusminus": "Uporabnik je velikost strani spremenil za tolikšno število bajtov",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-activefilters": "Dejavni filtri",
+       "rcfilters-restore-default-filters": "Obnovi privzete filtre",
+       "rcfilters-clear-all-filters": "Počisti vse filtre",
+       "rcfilters-search-placeholder": "Zadnje spremembe filtrov (prebrskajte ali začnite vnašati)",
+       "rcfilters-invalid-filter": "Neveljaven filter",
+       "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
+       "rcfilters-filtergroup-registration": "Registracija uporabnika",
+       "rcfilters-filter-registered-label": "Registriran",
+       "rcfilters-filter-registered-description": "Prijavljeni uredniki.",
+       "rcfilters-filter-unregistered-label": "Neregistriran",
+       "rcfilters-filter-unregistered-description": "Uredniki, ki niso prijavljeni.",
+       "rcfilters-filtergroup-authorship": "Uredi avtorstvo",
+       "rcfilters-filter-editsbyself-label": "Vaša lastna urejanja",
+       "rcfilters-filter-editsbyself-description": "Vaša urejanja.",
+       "rcfilters-filter-editsbyother-label": "Urejanja drugih",
+       "rcfilters-filter-editsbyother-description": "Urejanja, ki so jih naredili drugi uporabniki (ne vi).",
+       "rcfilters-filtergroup-userExpLevel": "Stopnja izkušenosti (samo za registrirane uporabnike)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novinci",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Manj kot 10 urejanj in 4 dni dejavnosti.",
+       "rcfilters-filter-userExpLevel-learner-label": "Učenci",
+       "rcfilters-filter-userExpLevel-learner-description": "Več dni dejavnosti in urejanj kot »Novinci«, vendar manj kot »Izkušeni uporabniki«.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Izkušeni uporabniki",
+       "rcfilters-filter-userExpLevel-experienced-description": "Več kot 30 dni dejavnosti in 500 urejanj.",
+       "rcfilters-filtergroup-automated": "Samodejni prispevki",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Urejanja, narejena s samodejnimi orodji.",
+       "rcfilters-filter-humans-label": "Človek (ne bot)",
+       "rcfilters-filter-humans-description": "Urejanja, ki so jih izvedli uredniki ljudje.",
+       "rcfilters-filtergroup-significance": "Pomembnost",
+       "rcfilters-filter-minor-label": "Manjše urejanje",
+       "rcfilters-filter-minor-description": "Urejanja, ki jih je avtor označil kot manjša.",
+       "rcfilters-filter-major-label": "Nemanjša urejanja",
+       "rcfilters-filter-major-description": "Urejanja, ki niso označena kot manjša.",
+       "rcfilters-filtergroup-changetype": "Vrsta spremembe",
+       "rcfilters-filter-pageedits-label": "Urejanja strani",
+       "rcfilters-filter-pageedits-description": "Urejanja vsebine wikija, razprave, opisi kategorij ...",
+       "rcfilters-filter-newpages-label": "Ustvarjanja strani",
+       "rcfilters-filter-newpages-description": "Urejanja, ki ustvarijo nove strani.",
+       "rcfilters-filter-categorization-label": "Spremembe kategorij",
+       "rcfilters-filter-categorization-description": "Zapisi o straneh, ki so bila dodana ali odstranjena iz kategorij.",
+       "rcfilters-filter-logactions-label": "Zabeležena dejanja",
+       "rcfilters-filter-logactions-description": "Administrativna dejanja, ustvarjanja računov, izbrisi strani, nalaganja ...",
        "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "uploaded-setting-handler-svg": "SVG, ki nastavi atribut »handler« z oddaljenim/podatkovnim/skriptom ciljem, je blokiran. V naloženi datoteki SVG smo našli <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, ki določi katerikoli slogovni atribut z oddaljenim URL-jem, je blokiran. V naloženi datoteki SVG smo našli <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "V naloženi datoteki SVG smo našli slikovni filter z URL-jem: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Datoteka SVG vsebuje nedovoljen imenski prostor »$1«",
+       "uploadscriptednamespace": "Datoteka SVG vsebuje nedovoljen imenski prostor »<nowiki>$1</nowiki>«",
        "uploadinvalidxml": "XML v naloženi datoteki ne moremo razčleniti.",
        "uploadvirus": "Datoteka vsebuje virus!\nPodrobnosti: $1",
        "uploadjava": "Datoteka je datoteka ZIP, ki vsebuje javansko datoteko .class.\nNalaganje javanskih datotek ni dovoljeno, ker je z njimi mogoče obiti varnostne omejitve.",
        "uncategorizedcategories": "Nekategorizirane kategorije",
        "uncategorizedimages": "Nekategorizirane datoteke",
        "uncategorizedtemplates": "Nekategorizirane predloge",
+       "uncategorized-categories-exceptionlist": " # Contains a list of catgeories, which shouldn't be mentioned on Special:UncategorizedCategories. One per line, starting with \"*\". Lines starting with another character (including whitespaces) are ignored. Use \"#\" for comments.",
        "unusedcategories": "Osirotele kategorije",
        "unusedimages": "Osirotele datoteke",
        "wantedcategories": "Želene kategorije",
        "apisandbox-sending-request": "Pošiljanje zahteve API ...",
        "apisandbox-loading-results": "Prejemanje zahteve API ...",
        "apisandbox-results-error": "Med nalaganjem odgovora poizvedbe API je prišlo do napake: $1.",
+       "apisandbox-request-selectformat-label": "Prikaži zahtevane podatke kot:",
+       "apisandbox-request-format-url-label": "Niz poizvedbe URL",
        "apisandbox-request-url-label": "URL zahteve:",
+       "apisandbox-request-json-label": "Zahteva JSON:",
        "apisandbox-request-time": "Trajanje zahteve: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Popravite žeton in ponovno pošljite",
        "apisandbox-results-fixtoken-fail": "Pridobivanje žetona »$1« je spodletelo.",
        "apisandbox-continue-clear": "Počisti",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} bo [https://www.mediawiki.org/wiki/API:Query#Continuing_queries nadaljevalo] zadnjo zahtevo; {{int:apisandbox-continue-clear}} bo počistilo parametre, povezane z nadaljevanjem.",
        "apisandbox-param-limit": "Vnesite <kbd>max</kbd>, da uporabite največjo omejitev.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Vsi imenski prostori)",
+       "apisandbox-multivalue-all-values": "$1 (Vse vrednosti)",
        "booksources": "Viri knjig",
        "booksources-search-legend": "Išči knjižne vire",
        "booksources-search": "Išči",
        "activeusers-count": "$1 {{PLURAL:$1|dejanje|dejanji|dejanja|dejanj}} v {{PLURAL:$3|preteklem dnevu|preteklih $3 dneh}}",
        "activeusers-from": "Prikaži uporabnike začenši z:",
        "activeusers-groups": "Prikaži uporabnike, ki pripadajo skupinam:",
+       "activeusers-excludegroups": "Izključi uporabnike, ki pripadajo skupinam:",
        "activeusers-noresult": "Noben uporabnik ni bil najden.",
        "activeusers-submit": "Prikaži dejavne uporabnike",
        "listgrouprights": "Pravice uporabniških skupin",
        "emailccsubject": "Kopija tvojega sporočila iz $1: $2",
        "emailsent": "E-pismo je poslano!",
        "emailsenttext": "E-pismo je poslano.",
-       "emailuserfooter": "To e-poštno sporočilo je {{GENDER:$1|poslal|poslala|poslal(-a)}} $1 uporabniku {{GENDER:$2|$2}} s funkcijo »{{int:emailuser}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
+       "emailuserfooter": "To e-poštno sporočilo je {{GENDER:$1|poslal|poslala|poslal(-a)}} $1 uporabniku {{GENDER:$2|$2}} s funkcijo »{{int:emailuser}}« na {{GRAMMAR:dative|{{SITENAME}}}}. Če odgovorite na to sporočilo, bo {{GENDER:$2|vaše}} e-poštno sporočilo poslano neposredno {{GENDER:$1|izvornemu pošiljatelju|izvorni pošiljateljici}}, kar {{GENDER:$1|mu|ji}} bo razkrilo {{GENDER:$2|vaš}} e-poštni naslov.",
        "usermessage-summary": "Pusti sistemsko sporočilo.",
        "usermessage-editor": "Sistemski sporočevalec",
        "watchlist": "Spisek nadzorov",
        "changecontentmodel-emptymodels-title": "Na voljo ni noben model vsebine",
        "changecontentmodel-emptymodels-text": "Vsebine na [[:$1]] ni mogoče pretvoriti v katero koli vrsto.",
        "log-name-contentmodel": "Dnevnik sprememb modela vsebine",
-       "log-description-contentmodel": "Dogodki, povezani z modeli vsebin strani",
+       "log-description-contentmodel": "Stran navaja spremembe modela vsebine strani in strani, ki so bile ustvarjene z neprivzetim modelom vsebine.",
        "logentry-contentmodel-new": "$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} stran $3 z neprivzetim modelom vsebine »$5«",
        "logentry-contentmodel-change": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} model vsebine strani $3 z »$4« na »$5«",
        "logentry-contentmodel-change-revertlink": "vrni",
        "proxyblockreason": "Ker uporabljate odprti posredniški strežnik, je urejanje z vašega IP-naslova preprečeno.\nGre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnika ali tehnično podporo.",
        "sorbsreason": "Vaš IP-naslov je v DNSBL uvrščen med odprte posredniške strežnike.",
        "sorbs_create_account_reason": "Vaš IP-naslov je v DNSBL, ki ga uporablja {{GRAMMAR:tožilnik|{{SITENAME}}}}, naveden kot odprti posredniški strežnik (proxy).\nRačuna žal ne morete ustvariti.",
+       "softblockrangesreason": "Brezimni prispevki z vašega IP-naslova ($1) niso dovoljeni. Prosimo, prijavite se.",
        "xffblockreason": "IP-naslov, prisoten v glavi X-Forwarded-For, ali vaš ali od strežnika proxy, ki ga uporabljate, je blokiran. Izvirni razlog za blokado: $1",
        "cant-see-hidden-user": "Uporabnik, ki ga poskušate blokirate, je že blokiran in skrit.\nKer nimate pravice hideuser, si ne morete ogledati ali urejati uporabnikove blokade.",
        "ipbblocked": "Ne morete blokirati ali deblokirati drugih uporabnikov, saj ste sami blokirani",
        "cant-move-to-user-page": "Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).",
        "cant-move-category-page": "Nimate pravic za prestavljanje strani kategorij.",
        "cant-move-to-category-page": "Nimate pravic za prestavljanje strani na stran kategorije.",
+       "cant-move-subpages": "Za prestavljanje podstrani nimate dovoljenja.",
+       "namespace-nosubpages": "Imenski prostor »$1« ne dovoljuje podstrani.",
        "newtitle": "Nov naslov:",
        "move-watch": "Opazuj to stran",
        "movepagebtn": "Prestavi stran",
        "tooltip-pt-mytalk": "{{GENDER:|Tvoja}} pogovorna stran",
        "tooltip-pt-anontalk": "Pogovor o urejanjih s tega IP-naslova",
        "tooltip-pt-preferences": "{{GENDER:|Tvoje}} nastavitve",
-       "tooltip-pt-watchlist": "Seznam strani, katerih spremembe spremljate",
+       "tooltip-pt-watchlist": "Seznam strani, katerih spremembe spremljaš",
        "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",
        "pageinfo-length": "Dolžina strani (v bajtih)",
        "pageinfo-article-id": "ID strani",
        "pageinfo-language": "Jezik vsebine strani",
+       "pageinfo-language-change": "spremeni",
        "pageinfo-content-model": "Model vsebine strani",
        "pageinfo-content-model-change": "spremeni",
        "pageinfo-robot-policy": "Robotsko indeksiranje",
        "htmlform-float-invalid": "Vrednost, ki ste jo vnesli, ni število.",
        "htmlform-int-toolow": "Vrednost, ki ste jo vnesli, je manjša od najmanjše dovoljene vrednosti $1",
        "htmlform-int-toohigh": "Vrednost, ki ste jo vnesli, je večja od največje dovoljene vrednosti $1",
-       "htmlform-required": "Ta vrednost je zahtevana",
+       "htmlform-required": "To je zahtevana vrednost.",
        "htmlform-submit": "Pošlji",
        "htmlform-reset": "Razveljavi spremembe",
        "htmlform-selectorother-other": "Drugo",
        "htmlform-user-not-exists": "<strong>$1</strong> ne obstaja.",
        "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-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-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",
        "feedback-bugcheck": "Izvrstno! Samo preverite, da ne gre za enega od [$1 že znanih hroščev].",
        "feedback-useragent": "Uporabniški agent:",
        "searchsuggest-search": "Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}}",
        "searchsuggest-containing": "vsebujoč ...",
-       "api-error-autoblocked": "Vaš IP-naslov smo samodejno blokirali, saj ga je uporabljal blokiran uporabnik.",
-       "api-error-badaccess-groups": "Nalaganje datotek na ta wiki vam ni dovoljeno.",
        "api-error-badtoken": "Notranja napaka: slab žeton.",
-       "api-error-blocked": "Urejanje vam je preprečeno.",
-       "api-error-copyuploaddisabled": "Nalaganje preko URL je na tem strežniku onemogočeno.",
-       "api-error-duplicate": "Na strani že {{PLURAL:$1|obstaja druga datoteka|obstajata drugi datoteki|obstajajo druge datoteke}} z enako vsebino.",
-       "api-error-duplicate-archive": "Na strani {{PLURAL:$1|je že bila druga datoteka|sta že bili drugi datoteki|so že bile nekatere druge datoteke}} z enako vsebino, vendar {{PLURAL:$1|je bila izbrisana|sta bili izbrisani|so bile izbrisane}}.",
-       "api-error-empty-file": "Poslana datoteka je prazna.",
        "api-error-emptypage": "Ustvarjanje novih, praznih strani ni dovoljeno.",
-       "api-error-fetchfileerror": "Notranja napaka: pri pridobivanju datoteke je nekaj šlo narobe.",
-       "api-error-fileexists-forbidden": "Datoteka »$1« že obstaja in je ni mogoče prepisati.",
-       "api-error-fileexists-shared-forbidden": "Datoteka »$1« že obstaja v skupnem skladišču datotek in je ni mogoče prepisati.",
-       "api-error-file-too-large": "Poslana datoteka je prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ta vrsta datoteke je prepovedana.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ni dovoljena datotečna vrsta|nista dovoljeni datotečni vrsti|niso dovoljene datotečne vrste}}. {{PLURAL:$3|Dovoljena datotečna vrsta je|Dovoljeni datotečni vrsti sta|Dovoljene datotečne vrste so}} $2.",
-       "api-error-filetype-missing": "Datoteki manjka končnica.",
-       "api-error-hookaborted": "Spremembo, ki ste jo poskušali narediti, je prekinila razširitev.",
-       "api-error-http": "Notranja napaka: ni mogoče vzpostaviti povezave s strežnikom.",
-       "api-error-illegal-filename": "Ime datoteke ni dovoljeno.",
-       "api-error-internal-error": "Notranja napaka: pri obdelovanju vaše datoteke, naložene na wiki, je nekaj šlo narobe.",
-       "api-error-invalid-file-key": "Notranja napaka: datoteke ni bilo mogoče najti v začasni hrambi.",
-       "api-error-missingparam": "Notranja napaka: manjkajoči parametri ob zahtevi.",
-       "api-error-missingresult": "Notranja napaka: ni bilo mogoče določiti, če je kopiranje uspelo.",
-       "api-error-mustbeloggedin": "Za nalaganje datotek morate biti prijavljeni.",
-       "api-error-mustbeposted": "V tem programju je hrošč; ne uporablja pravilne metode HTTP.",
-       "api-error-noimageinfo": "Nalaganje je uspelo, vendar nam strežnik ni dal nobenih informacij o datoteki.",
-       "api-error-nomodule": "Notranja napaka: modul nalaganja ni izbran.",
-       "api-error-ok-but-empty": "Notranja napaka: strežnik se ne odziva.",
-       "api-error-overwrite": "Prepisovanje obstoječe datoteke ni dovoljeno.",
-       "api-error-ratelimited": "Poskušate naložiti več datotek v kratkem časovnem obdobju kot to dovoljuje ta wiki. Prosimo, poskusite znova čez nekaj minut.",
-       "api-error-stashfailed": "Notranja napaka: strežnik ni uspel shraniti začasne datoteke.",
        "api-error-publishfailed": "Notranja napaka: strežnik ni uspel objaviti začasne datoteke.",
-       "api-error-stasherror": "Pri nalaganju datoteke v hrambo je prišlo do napake.",
-       "api-error-stashedfilenotfound": "Datoteke iz skrite shrambe med poskusom nalaganja iz skrite shrambe nismo našli.",
-       "api-error-stashpathinvalid": "Pot, na kateri naj bi bila datoteka iz skrite shrambe, ni veljavna.",
-       "api-error-stashfilestorage": "Pri shranjevanju datoteke v skrito shrambo je prišlo do napake.",
-       "api-error-stashzerolength": "Strežnik ni mogel dati datoteke v skrito shrambo, ker ima ničelno dolžino.",
-       "api-error-stashnotloggedin": "Da lahko shranite datoteke v skrito shrambo nalaganja, morate biti prijavljeni.",
-       "api-error-stashwrongowner": "Datoteka, do katere ste poskušali dostopati v skriti shrambi, ne pripada vam.",
-       "api-error-stashnosuchfilekey": "Datoteka, do katere ste poskušali dostopati v skriti shrambi, ne obstaja.",
-       "api-error-timeout": "Strežnik se ni odzval v pričakovanem času.",
-       "api-error-unclassified": "Prišlo je do neznane napake",
-       "api-error-unknown-code": "Neznana napaka: »$1«",
-       "api-error-unknown-error": "Notranja napaka: pri poskusu nalaganja vaše datoteke je nekaj šlo narobe.",
-       "api-error-unknown-warning": "Neznano opozorilo: $1",
+       "api-error-stashfailed": "Notranja napaka: strežnik ni uspel shraniti začasne datoteke.",
+       "api-error-unknown-warning": "Neznano opozorilo: »$1«.",
        "api-error-unknownerror": "Neznana napaka: »$1«.",
-       "api-error-uploaddisabled": "Nalaganje je onemogočeno na tem wikiju.",
-       "api-error-verification-error": "Ta datoteka je morda poškodovana ali ima napačno končnico.",
-       "api-error-was-deleted": "Datoteko s tem imenom je v preteklosti nekdo že naložil, ampak je bila nato izbrisana.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuti|minute|minut}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|uri|ure|ur}}",
        "pagelang-language": "Jezik",
        "pagelang-use-default": "Uporabi privzeti jezik",
        "pagelang-select-lang": "Izberite jezik",
+       "pagelang-reason": "Razlog",
        "pagelang-submit": "Potrdi",
+       "pagelang-nonexistent-page": "Stran $1 ne obstaja.",
+       "pagelang-unchanged-language": "Stran $1 že ima nastavljen jezik $2.",
+       "pagelang-unchanged-language-default": "Stran $1 že ima nastavljen wikijev privzeti jezik vsebine.",
+       "pagelang-db-failed": "Zbirka podatkov ni uspela spremeniti jezika strani.",
        "right-pagelang": "Spreminjanje jezika strani",
        "action-pagelang": "spreminjanje jezika strani",
        "log-name-pagelang": "Dnevnik sprememb jezika",
        "mw-widgets-dateinput-no-date": "Datum ni izbran",
        "mw-widgets-dateinput-placeholder-day": "LLLL-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "LLLL-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Iskanje predstavnosti",
+       "mw-widgets-mediasearch-noresults": "Ni zadetkov.",
        "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
        "mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorijo ...",
+       "mw-widgets-usersmultiselect-placeholder": "Dodaj več ...",
        "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",
        "sessionprovider-nocookies": "Piškotki so morda onemogočeni. Prepričaje se, da imate piškotke omogočene, in začnite znova.",
        "randomrootpage": "Naključna korenska stran",
        "log-action-filter-block": "Vrsta blokade:",
-       "log-action-filter-contentmodel": "Vrsta spremembe modelastrani:",
+       "log-action-filter-contentmodel": "Vrsta spremembe modela vsebine:",
        "log-action-filter-delete": "Vrsta izbrisa:",
        "log-action-filter-import": "Vrsta uvoza:",
        "log-action-filter-managetags": "Vrsta dejanja upravljanja oznak:",
        "log-action-filter-block-block": "Blokada",
        "log-action-filter-block-reblock": "Sprememba blokade",
        "log-action-filter-block-unblock": "Odstranitev blokade",
-       "log-action-filter-contentmodel-change": "Sprememba Modelastrani",
-       "log-action-filter-contentmodel-new": "Ustvarjanje strani z nestandardnim Modelomstrani",
+       "log-action-filter-contentmodel-change": "Sprememba modela vsebine",
+       "log-action-filter-contentmodel-new": "Ustvarjanje strani z neprivzetim modelom vsebine",
        "log-action-filter-delete-delete": "Izbris strani",
+       "log-action-filter-delete-delete_redir": "Prepis preusmeritve",
        "log-action-filter-delete-restore": "Obnovitev strani",
        "log-action-filter-delete-event": "Dnevnik brisanja",
        "log-action-filter-delete-revision": "Izbris redakcije",
        "usercssispublic": "Pomnite: Podstrani CSS naj ne vsebujejo zaupnih podatkov, saj so vidne tudi drugim uporabnikom.",
        "restrictionsfield-badip": "Neveljaven IP-naslov ali obseg: $1",
        "restrictionsfield-label": "Dovoljeni IP-obsegi:",
-       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Napaka: $1",
-       "edit-error-long": "Napake:\n\n$1"
+       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "redakcija $1",
+       "pageid": "ID strani $1"
 }
index f3f52f1..bc98608 100644 (file)
        "tog-showtoolbar": "Shfaq shiritin e veglave të redaktorit",
        "tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
        "tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
-       "tog-watchcreations": "Shtoi faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
+       "tog-watchcreations": "Shto faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchdefault": "Shto faqet dhe skedat e redaktuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchmoves": "Shto faqet dhe skedat e zhvendosura prej meje tek lista e faqeve nën mbikqyrje",
-       "tog-watchdeletion": "Shto faqet dhe skedat e grisura prej meje tek lista e faqeve  nën mbikqyrje",
+       "tog-watchdeletion": "Shto faqet dhe skedat e grisura prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchuploads": "Shtoni fotografitë e rreja që ngarkoj në listën mbikëqyrëse",
        "tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim tek lista ime mbikqyrëse",
        "tog-minordefault": "Shëno të gjitha redaktimet si të vogla automatikisht",
-       "tog-previewontop": "Trego se si do të duket faqja mbi kutinë redaktimit",
-       "tog-previewonfirst": "Trego se si do të duket faqja posa ta filloj redaktimin",
-       "tog-enotifwatchlistpages": "Më njofto me email kur ndryshohet një faqe apo skedë nga lista ime e faqeve nën vëzhgim",
+       "tog-previewontop": "Trego parapamjen para kutisë së redaktimit",
+       "tog-previewonfirst": "Trego parapamjen në redaktimin e parë",
+       "tog-enotifwatchlistpages": "Më njofto me email kur ndryshohet një faqe apo skedë nga lista ime mbikëqyrëse",
        "tog-enotifusertalkpages": "Më dërgo email kur ndryshohet faqja ime e diskutimeve",
        "tog-enotifminoredits": "Më njofto me email edhe kur ka redaktime të vogla të faqeve dhe skedave",
        "tog-enotifrevealaddr": "Trego adresën time të emailit në emailet njoftuese",
        "tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
        "tog-oldsig": "Nënshkrimi juaj ekzistues:",
        "tog-fancysig": "Mbaje nënshkrimin si wikitekst (pa lidhje automatike)",
-       "tog-uselivepreview": "Trego parapamjen drejtpërdrejt",
+       "tog-uselivepreview": "Përdor parapamjen e drejtpërdrejtë",
        "tog-forceeditsummary": "Më njofto kur përmbledhjen e redaktimit e lë bosh",
        "tog-watchlisthideown": "Fshih redaktimet e mia nga lista e faqeve të vëzhguara",
        "tog-watchlisthidebots": "Fshih redaktimet e robotëve nga lista e faqeve të vëzhguara",
        "talk": "Diskutimet",
        "views": "Shikime",
        "toolbox": "Mjete",
+       "tool-link-emailuser": "Dërgo email {{GENDER:$1|user}}",
        "userpage": "Shfaq faqen e përdoruesit",
        "projectpage": "Shfaq faqen e projektit",
        "imagepage": "Shfaq faqen e skedës",
        "passwordreset-emaildisabled": "Karakteristikat e  Email janë të paaftë në këtë wiki.",
        "passwordreset-username": "Nofka:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Dëshiron të shikosh e-mail-in që rezulton?",
-       "passwordreset-capture-help": "Nëse shënoni këtë kuti, e-mail-i (dhe fjalekalimi i përkohshëm) që do t'i dërgohen përdoruesit, do të të tregohen edhe ty.",
        "passwordreset-email": "Posta elektronike",
        "passwordreset-emailtitle": "Detajet e llogarisë në {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dikush (ndoshta ju, nga IP adresa $1) kërkoi një kujtesë për \ndetajet e llogarisë suaj {{SITENAME}} ($4).Përdoruesi në vijim {{PLURAL:$3|llogari është|llogaritë janë}} të lidhur me këtë postë elektronike:\n\n$2\n\n{{PLURAL:$3|Ky fjalëkalim i përkohshëm|Këto fjalëkalime të përkohshme}} do të përfundojë për {{PLURAL:$5|një ditë|$5 ditë}}.\n\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "blockedtitle": "Përdoruesi është bllokuar",
        "blockedtext": "'''Llogaria juaj ose adresa e IP është bllokuar'''\n\nBllokimi u bë nga $1 dhe arsyeja e dhënë ishte '''$2'''.\n\n*Fillimi i bllokimit: $8\n*Skadimi i bllokimit: $6\n*I bllokuari i shënjestruar: $7\n\nMund të kontaktoni $1 ose një nga [[{{MediaWiki:Grouppage-sysop}}|administruesit]] e tjerë për të diskutuar bllokimin.\n\nVini re se nuk mund t'i dërgoni email përdoruesit nëse nuk keni një adresë të saktë të dhënë tek [[Special:Preferences|parapëlqimet e përdoruesit]] ose nëse kjo është një nga mundësitë që ju është bllokuar.\n\nAdresa e IP-së që keni është $3 dhe numri i identifikimit të bllokimit është #$5. Përfshini këto dy të dhëna në çdo ankesë.",
        "autoblockedtext": "IP adresa juaj është bllokuar automatikisht sepse ishte përdorur nga një përdorues tjetër i cili ishte bllokuar nga $1.\nArsyeja e dhënë për këtë është:\n\n:''$2''\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nJu mund të kontaktoni $1 ose një tjetër [[{{MediaWiki:Grouppage-sysop}}|administrues]] për ta diskutuar bllokimin.\n\nVini re : që nuk mund ta përdorni mundësinë \"dërgo porosi elektronike\" përveç nëse keni një postë elektronike të vlefshme të regjistruar në [[Special:Preferences|preferencat tuaja]] dhe nuk jeni bllokuar nga përdorimi i saj.\n\nIP adresa juaj e tanishme është $3 dhe ID e bllokimit është #$5.\nJu lutemi përfshini këto detaje në të gjitha kërkesat që i bëni.",
-       "blockednoreason": "nuk është dhënë ësnje arsye",
+       "blockednoreason": "nuk është dhënë asnjë arsye",
        "whitelistedittext": "Ju duhet të $1 për të redaktuar faqet.",
        "confirmedittext": "Ju duhet së pari ta vërtetoni e-mail adresen para se të redaktoni. Ju lutem plotësoni dhe vërtetoni e-mailin tuaj  te [[Special:Preferences|parapëlqimet]] e juaja.",
        "nosuchsectiontitle": "Paragrafi nuk mund të gjendet",
        "userrights-reason": "Arsyeja:",
        "userrights-no-interwiki": "Nuk keni leje për të ndryshuar privilegjet e përdoruesve në wiki të tjera.",
        "userrights-nodatabase": "Regjistri $1 nuk ekziston ose nuk është vendor.",
-       "userrights-nologin": "Duhet të [[Special:UserLogin|hyni brenda]] me një llogari administrative për të ndryshuar privilegjet e përdoruesve.",
-       "userrights-notallowed": "Ju nuk keni leje për të shtuar ose hequr privilegjet e përdoruesve.",
        "userrights-changeable-col": "Grupe që mund të ndryshoni",
        "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni",
        "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Të lutem të rishiko dhe konfirmo ndryshimet e tua.",
        "right-siteadmin": "Mbyll ose hap bazën e të dhënave",
        "right-override-export-depth": "Eksoprto faqet duke përfshirë e lidhura deri në një thellësi prej 5",
        "right-sendemail": "Dërgo e-mail tek përdoruesit e tjerë",
-       "right-passwordreset": "Shiko e-mail-et e rivendosjes së fjalëkalimit",
        "right-managechangetags": "Krijoni dhe fshini [[Special:Tags|tags]] nga baza e të dhënave",
        "right-applychangetags": "Aplikoni [[Special:Tags|tags]] së bashku me ndryshimet",
        "right-changetags": "Shtoni dhe të largoni në mënyrë arbitrare [[Special:Tags|tags]] në rishikimet individuale dhe regjistrimet e historikut",
index 2cd4d4c..4737609 100644 (file)
@@ -31,7 +31,8 @@
                        "Macofe",
                        "Сербијана",
                        "Xð",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Zoranzoki21"
                ]
        },
        "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": "Погледај страницу пројекта",
        "password-change-forbidden": "Не можете да промените лозинку на овом викију.",
        "externaldberror": "Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.",
        "login": "Пријави ме",
+       "login-security": "Верификација вашег индентитета",
        "nav-login-createaccount": "Пријава/регистрација",
        "userlogin": "Пријава/регистрација",
        "userloginnocreate": "Пријава",
        "userlogin-resetpassword-link": "Заборавили сте лозинку?",
        "userlogin-helplink2": "Помоћ при пријављивању",
        "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
+       "userlogin-reauth": "Морате се поново пријавити да би верификовали да сте {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Отвори још један налог",
        "createacct-emailrequired": "Имејл адреса",
        "createacct-emailoptional": "Имејл адреса (опционо)",
        "createacct-another-realname-tip": "Право име није обавезно.\nАко изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.",
        "pt-login": "Пријави ме",
        "pt-login-button": "Пријави ме",
+       "pt-login-continue-button": "Настави пријављивање",
        "pt-createaccount": "Отвори налог",
        "pt-userlogout": "Одјави ме",
        "php-mail-error-unknown": "Непозната грешка у функцији PHP mail().",
        "passwordreset-emaildisabled": "Имејл је онемогућен на овом викију.",
        "passwordreset-username": "Корисничко име:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Погледати крајњи имејл?",
-       "passwordreset-capture-help": "Ако означите ову кућицу, имејл (с привременом лозинком) ће бити приказан и послат кориснику.",
        "passwordreset-email": "Имејл адреса:",
        "passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
        "passwordreset-emailtext-ip": "Неко (вероватно Ви, са ИП адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
        "selfredirect": "<strong>Упозорење:</strong> преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница погрешна или уређујете погрешну страницу.\nАко још једном притиснете „{{int:savearticle}}“ преусмерење ће свеједно бити направљено.",
        "missingcommenttext": "Унесите коментар испод.",
        "missingcommentheader": "<strong>Напомена:</strong> нисте унели наслов овог коментара.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без наслова.",
-       "summary-preview": "Преглед описа:",
+       "summary-preview": "Преглед описа измене:",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
        "saveprefs": "Сачувај",
        "restoreprefs": "Врати све на подразумевано (у свим одељцима)",
        "prefs-editing": "Уређивање",
-       "rows": "Редова:",
-       "columns": "Колона",
        "searchresultshead": "Претрага",
        "stub-threshold": "Праг за обликовање везе као клице ($1):",
        "stub-threshold-sample-link": "пример",
        "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
        "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваша надгледања; стога, кључ немојте одавати никоме. \nАко је потребно, кључ можете [[Special:ResetTokens|ресетовати]].",
        "savedprefs": "Ваша подешавања су сачувана.",
-       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87ка Ð¿Ñ\80ава Ð·Ð° {{GENDER:$1|$1}} Ñ\81Ñ\83 Ñ\81аÑ\87Ñ\83вана.",
+       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87ке Ð³Ñ\80Ñ\83пе Ð·Ð° {{GENDER:$1|$1}} Ñ\81Ñ\83 Ñ\81аÑ\87Ñ\83ване.",
        "timezonelegend": "Временска зона:",
        "localtime": "Локално време:",
        "timezoneuseserverdefault": "подразумеване вредности ($1)",
        "userrights": "Управљање корисничким правима",
        "userrights-lookup-user": "Управљање корисничким групама",
        "userrights-user-editname": "Корисничко име:",
-       "editusergroup": "УÑ\80еди {{GENDER:$1|коÑ\80иÑ\81ниÑ\87ке}} групе",
+       "editusergroup": "УÑ\87иÑ\82аÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\87ке групе",
        "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-reason": "Разлог:",
        "userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
-       "userrights-nologin": "Морате се [[Special:UserLogin|пријавити]] с администраторским налогом да бисте мењали корисничка права.",
-       "userrights-notallowed": "Немате овлашћења да додајете или уклањате корисничка права.",
        "userrights-changeable-col": "Групе које можете да промените",
        "userrights-unchangeable-col": "Групе које не можете да промените",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Сукоб промена корисничких права! Молимо проверите ваше измене.",
-       "userrights-removed-self": "Скинули сте себи права. Због тога Вам није дозвољен приступ овој страници.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Аутоматски потврђени корисници",
        "right-siteadmin": "закључавање и откључавање базе података",
        "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
        "right-sendemail": "Пошаљи имејл другим корисницима",
-       "right-passwordreset": "прегледање порука за обнављање лозинке",
        "right-managechangetags": "прављење и (де)активирање [[Special:Tags|ознака]]",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
+       "right-deletechangetags": "брисање [[Special:Tags|ознака]] из базе података",
        "grant-group-page-interaction": "Уређивање страница",
        "grant-group-file-interaction": "Уређивање датотека",
        "grant-group-watchlist-interaction": "Уређивање вашег списка надгледања",
        "grant-editmywatchlist": "Уређивање вашег списка надгледања",
        "grant-editpage": "Уређивање постојећих страница",
        "grant-editprotected": "Уређивање заштићених страница",
+       "grant-highvolume": "Масовно уређивање",
        "grant-patrol": "Патролирање измена",
        "grant-protect": "Закључавање и откључавање страница",
        "grant-rollback": "Враћање измена",
        "action-upload_by_url": "отпремање ове датотеке преко веб-адресе",
        "action-writeapi": "писање АПИ-ја",
        "action-delete": "брисање ове странице",
-       "action-deleterevision": "бÑ\80иÑ\81аÑ\9aе Ð¾Ð²Ðµ Ð¸Ð·Ð¼ÐµÐ½Ðµ",
+       "action-deleterevision": "бÑ\80иÑ\81аÑ\9aе Ð¸Ð·Ð¼ÐµÐ½Ð°",
        "action-deletedhistory": "прегледање обрисане историје ове странице",
        "action-browsearchive": "претраживање обрисаних страница",
-       "action-undelete": "враћање ове странице",
+       "action-undelete": "враћање страница",
        "action-suppressrevision": "прегледање и враћање ове сакривене измене",
        "action-suppressionlog": "прегледање ове приватне историје",
        "action-block": "блокирање даљих измена овог корисника",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
        "recentchanges-submit": "Прикажи",
+       "rcfilters-restore-default-filters": "Враћање подразумеваних филтера",
+       "rcfilters-clear-all-filters": "Уклони све филтере",
+       "rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новајлије",
+       "rcfilters-filter-userExpLevel-experienced-label": "Искусни корисници",
        "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "hist": "ист",
        "hide": "Сакриј",
        "show": "Прикажи",
-       "minoreditletter": " м",
+       "minoreditletter": "м",
        "newpageletter": "Н",
        "boteditletter": "б",
        "unpatrolledletter": "!",
        "reuploaddesc": "Назад на образац за отпремање",
        "upload-tryagain": "Пошаљи измењени опис датотеке",
        "uploadnologin": "Нисте пријављени",
-       "uploadnologintext": "$1 да бисте отпремали датотеке.",
+       "uploadnologintext": "Морате бити $1 да бисте отпремали датотеке.",
        "upload_directory_missing": "Фасцикла за слање ($1) недостаје и сервер је не може направити.",
        "upload_directory_read_only": "Сервер не може да пише по фасцикли за слање ($1).",
        "uploaderror": "Грешка при отпремању",
        "uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје <code>$1=\"$2\"</code> у SVG датотекама.",
        "uploaded-href-unsafe-target-svg": "Пронађен href са несигурном метом <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
-       "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „$1“",
+       "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „<nowiki>$1</nowiki>“",
        "uploadvirus": "Датотека садржи вирус!\nДетаљи: $1",
        "uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.",
        "upload-source": "Изворна датотека",
        "backend-fail-hashes": "Не могу да добијем дисперзије датотеке за упоређивање.",
        "backend-fail-notsame": "Већ постоји неистоветна датотека – $1.",
        "backend-fail-invalidpath": "$1 није исправна путања за складиштење.",
-       "backend-fail-delete": "Не могу да обришем датотеку $1.",
+       "backend-fail-delete": "Не могу да обришем датотеку „$1”.",
        "backend-fail-describe": "Не могу да променим метаподатке за датотеку „$1“.",
        "backend-fail-alreadyexists": "Датотека $1 већ постоји.",
        "backend-fail-store": "Не могу да сместим датотеку $1 у $2.",
        "all-logs-page": "Сви јавни дневници",
        "alllogstext": "Скупни приказ свих доступних историја овог викија.\nМожете сузити приказ одабирући врсту историје, корисничког имена или тражене странице.",
        "logempty": "Нема пронађених уноса у дневнику.",
-       "log-title-wildcard": "ТÑ\80ажи Ð½Ð°Ñ\81лове ÐºÐ¾Ñ\98и Ð¿Ð¾Ñ\87иÑ\9aÑ\83 Ñ\81 овим текстом",
+       "log-title-wildcard": "Ð\9fÑ\80еÑ\82Ñ\80ажи Ð½Ð°Ñ\81лове ÐºÐ¾Ñ\98и Ð¿Ð¾Ñ\87иÑ\9aÑ\83 Ñ\81а овим текстом",
        "showhideselectedlogentries": "Прикажи/сакриј изабране догађаје",
        "log-edit-tags": "Уреди ознаке изабраних уноса у дневницима",
        "checkbox-select": "Изабери: $1",
        "confirmemail_invalidated": "Потврда имејл адресе је отказана",
        "invalidateemail": "Отказивање потврде имејла",
        "notificationemail_body_changed": "Неко, вероватно Ви је променио имејл адресу налога из $2“ у „$3“ са IP адресе $1 на сајту {{SITENAME}}.\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.",
+       "notificationemail_body_removed": "Неко, вероватно Ви са ИП адресе $1 је уклонио имејл адресу за налог „$2“ на {{SITENAME}}.\n\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.",
        "scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]",
        "scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "confirm-watch-top": "Додати ову страницу у списак надгледања?",
        "confirm-unwatch-button": "У реду",
        "confirm-unwatch-top": "Уклонити ову страницу са списка надгледања?",
+       "confirm-rollback-button": "У реду",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "autoredircomment": "Преусмерење на [[$1]]",
        "autosumm-new": "Нова страница: $1",
        "autosumm-newblank": "Направљена празна страница",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|бајт|бајта|бајтова}}",
        "size-kilobytes": "$1 kB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
        "htmlform-user-not-valid": "<strong>$1</strong> није исправно корисничко име.",
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
+       "logentry-delete-delete_redir": "$1 је {{GENDER:$2|обрисао|обрисала}} преусмерење $3 преснимавањем",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
        "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја}} у дневнику $3: $4",
        "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=једне измене|$5 измене|$5 измена}} на страници $3: $4",
        "feedback-thanks-title": "Хвала вам!",
        "searchsuggest-search": "Претрага",
        "searchsuggest-containing": "садржи...",
-       "api-error-badaccess-groups": "Није вам дозвољено да отпремате датотеке на овај вики.",
        "api-error-badtoken": "Унутрашња грешка: неисправан жетон.",
-       "api-error-copyuploaddisabled": "Отпремање путем адресе је онемогућено на овом серверу.",
-       "api-error-duplicate": "Већ {{PLURAL:$1|1=постоји друга датотека|постоје друге датотеке}} с истим садржајем.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Постојала је друга датотека|Постојале су друге датотеке}} с истим садржајем, али {{PLURAL:$1|је обрисана|су обрисане}}.",
-       "api-error-empty-file": "Послата датотека је празна.",
        "api-error-emptypage": "Стварање нових празних страница није дозвољено.",
-       "api-error-fetchfileerror": "Унутрашња грешка: дошло је до грешке при добављању датотеке.",
-       "api-error-fileexists-forbidden": "Већ постоји датотека с именом „$1“ и не може да се замени.",
-       "api-error-fileexists-shared-forbidden": "Већ постоји датотека с именом „$1“ у заједничкој ризници и не може да се замени.",
-       "api-error-file-too-large": "Послата датотека је превелика.",
-       "api-error-filename-tooshort": "Назив датотеке је прекратак.",
-       "api-error-filetype-banned": "Ова врста датотеке је забрањена.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}. {{PLURAL:$3|Дозвољена је|Дозвољене су}} $2.",
-       "api-error-filetype-missing": "Датотеци недостаје наставак.",
-       "api-error-hookaborted": "Измена је одбачена од куке за проширења.",
-       "api-error-http": "Унутрашња грешка: не могу да се повежем са сервером.",
-       "api-error-illegal-filename": "Назив датотеке је забрањен.",
-       "api-error-internal-error": "Унутрашња грешка: дошло је до грешке при обрађивању датотеке на викију.",
-       "api-error-invalid-file-key": "Унутрашња грешка: не могу да пронађем датотеку у привременом складишту.",
-       "api-error-missingparam": "Унутрашња грешка: недостају параметри у захтеву.",
-       "api-error-missingresult": "Унутрашња грешка: не могу да утврдим да ли је умножавање успело.",
-       "api-error-mustbeloggedin": "Морате бити пријављени да бисте отпремали датотеке.",
-       "api-error-mustbeposted": "Унутрашња грешка: не користи се исправан HTTP метод.",
-       "api-error-noimageinfo": "Отпремање је успело, али сервер није дао никакав податак о датотеци.",
-       "api-error-nomodule": "Унутрашња грешка: није постављен модул за отпремање.",
-       "api-error-ok-but-empty": "Унутрашња грешка: сервер не одговара.",
-       "api-error-overwrite": "Замењивање постојеће датотеке је забрањено.",
-       "api-error-stashfailed": "Унутрашња грешка: сервер не може да сачува привремену датотеку.",
        "api-error-publishfailed": "Унутрашња грешка: сервер није успео да објави привремену датотеку.",
-       "api-error-timeout": "Сервер није одговорио у очекивано време.",
-       "api-error-unclassified": "Дошло је до непознате грешке",
-       "api-error-unknown-code": "Непозната грешка: „$1“",
-       "api-error-unknown-error": "Унутрашња грешка: дошло је до грешке при отпремању датотеке.",
-       "api-error-unknown-warning": "Непознато упозорење: $1",
+       "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|сат|сата|сати}}",
        "expand_templates_remove_nowiki": "Поништава ефекат <nowiki> тагова у приказу чланака",
        "expand_templates_generate_xml": "Прикажи XML стабло",
        "expand_templates_generate_rawhtml": "Прикажи сиров HTML",
-       "expand_templates_preview": "Ð\9fÑ\80иказ",
+       "expand_templates_preview": "Ð\9fÑ\80еÑ\82пÑ\80еглед",
        "pagelang-name": "Страница",
        "pagelang-language": "Језик",
        "pagelang-select-lang": "Изабери језик",
+       "pagelang-reason": "Разлог",
        "pagelang-submit": "Пошаљи",
+       "pagelang-nonexistent-page": "Страница $1 не постоји.",
        "right-pagelang": "мењање језика странице",
        "action-pagelang": "промену језика странице",
        "logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.",
        "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",
        "randomrootpage": "Случајна коренска страница",
        "log-action-filter-block-reblock": "измена блокирања",
        "log-action-filter-block-unblock": "деблокирање",
        "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-upload-overwrite": "промена постојећег",
        "authmanager-email-label": "Имејл",
        "authmanager-email-help": "Имејл адреса",
-       "changecredentials": "Промјена акредитива"
+       "authprovider-resetpass-skip-label": "Прескочи",
+       "changecredentials": "Промјена акредитива",
+       "changecredentials-submit": "Промени",
+       "credentialsform-provider": "Врста акредитива:",
+       "credentialsform-account": "Назив налога:"
 }
index 6bdd3b5..6d22e0b 100644 (file)
        "passwordreset-emaildisabled": "Imejl je onemogućen na ovom vikiju.",
        "passwordreset-username": "Korisničko ime:",
        "passwordreset-domain": "Domen:",
-       "passwordreset-capture": "Pogledati krajnji imejl?",
-       "passwordreset-capture-help": "Ako označite ovo polje, imejl (s privremenom lozinkom) će biti prikazana i poslata korisniku.",
        "passwordreset-email": "Imejl adresa:",
        "passwordreset-emailtitle": "Detalji naloga na vikiju {{SITENAME}}",
        "passwordreset-emailtext-ip": "Neko (verovatno Vi, sa IP adrese $1) je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom imejl adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku i nastavite koristiti staru lozinku.",
        "saveprefs": "Sačuvaj",
        "restoreprefs": "Vrati sve na podrazumevano (u svim odeljcima)",
        "prefs-editing": "Uređivanje",
-       "rows": "Redova:",
-       "columns": "Kolona",
        "searchresultshead": "Pretraga",
        "stub-threshold": "Prag za oblikovanje veze kao klice ($1):",
        "stub-threshold-sample-link": "primer",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate ovlašćenja da menjate korisnička prava na drugim vikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna.",
-       "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] s administratorskim nalogom da biste menjali korisnička prava.",
-       "userrights-notallowed": "Nemate ovlašćenja da dodajete ili uklanjate korisnička prava.",
        "userrights-changeable-col": "Grupe koje možete da promenite",
        "userrights-unchangeable-col": "Grupe koje ne možete da promenite",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Sukob promena korisničkih prava! Molimo proverite vaše izmene.",
-       "userrights-removed-self": "Uspešno ste sebi skinuli prava. Zbog toga nije vam dozvoljen pristup ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "group-autoconfirmed": "Automatski potvrđeni korisnici",
        "right-siteadmin": "zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "izvoz stranica uključujući i povazene stranice do dubine od pet veza",
        "right-sendemail": "Pošalji imejl drugim korisnicima",
-       "right-passwordreset": "pregledanje poruka za obnavljanje lozinke",
        "right-managechangetags": "pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
        "grant-group-page-interaction": "Uređivanje stranica",
        "grant-group-file-interaction": "Uređivanje datoteka",
        "hist": "ist",
        "hide": "Sakrij",
        "show": "Prikaži",
-       "minoreditletter": " m",
+       "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "reuploaddesc": "Nazad na obrazac za otpremanje",
        "upload-tryagain": "Pošalji izmenjeni opis datoteke",
        "uploadnologin": "Niste prijavljeni",
-       "uploadnologintext": "$1 da biste otpremali datoteke.",
+       "uploadnologintext": "Morate biti $1 da biste otpremali datoteke.",
        "upload_directory_missing": "Fascikla za slanje ($1) nedostaje i server je ne može napraviti.",
        "upload_directory_read_only": "Server ne može da piše po fascikli za slanje ($1).",
        "uploaderror": "Greška pri otpremanju",
        "uploaddisabledtext": "Otpremanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Otpremanje datoteka je onemogućeno u PHP-u.\nProverite podešavanja file_uploads.",
        "uploadscripted": "Datoteka sadrži HTML ili skriptni kod koji može biti pogrešno protumačen od strane pregledača.",
-       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „<nowiki>$1</nowiki>“",
        "uploadvirus": "Datoteka sadrži virus!\nDetalji: $1",
        "uploadjava": "Datoteka je formata ZIP koji sadrži java .class element.\nSlanje java datoteka nije dozvoljeno jer one mogu izazvati zaobilaženje sigurnosnih ograničenja.",
        "upload-source": "Izvorna datoteka",
        "backend-fail-hashes": "Ne mogu da dobijem disperzije datoteke za upoređivanje.",
        "backend-fail-notsame": "Već postoji neistovetna datoteka – $1.",
        "backend-fail-invalidpath": "$1 nije ispravna putanja za skladištenje.",
-       "backend-fail-delete": "Ne mogu da obrišem datoteku $1.",
+       "backend-fail-delete": "Ne mogu da obrišem datoteku „$1”.",
        "backend-fail-describe": "Ne mogu da promenim metapodatke za datoteku „$1“.",
        "backend-fail-alreadyexists": "Datoteka $1 već postoji.",
        "backend-fail-store": "Ne mogu da smestim datoteku $1 u $2.",
        "all-logs-page": "Svi javni dnevnici",
        "alllogstext": "Skupni prikaz svih dostupnih istorija ovog vikija.\nMožete suziti prikaz odabirući vrstu istorije, korisničkog imena ili tražene stranice.",
        "logempty": "Nema pronađenih unosa u dnevniku.",
-       "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
+       "log-title-wildcard": "Pretraži naslove koji počinju sa ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane događaje",
        "log-edit-tags": "Uredi oznake izabranih unosa u dnevnicima",
        "checkbox-select": "Izaberi: $1",
        "autoredircomment": "Preusmerenje na [[$1]]",
        "autosumm-new": "Nova stranica: $1",
        "autosumm-newblank": "Napravljena prazna stranica",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "size-kilobytes": "$1 kB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "feedback-thanks-title": "Hvala vam!",
        "searchsuggest-search": "Pretraga",
        "searchsuggest-containing": "sadrži...",
-       "api-error-badaccess-groups": "Nije vam dozvoljeno da otpremate datoteke na ovaj viki.",
        "api-error-badtoken": "Unutrašnja greška: neispravan žeton.",
-       "api-error-copyuploaddisabled": "Otpremanje putem adrese je onemogućeno na ovom serveru.",
-       "api-error-duplicate": "Već {{PLURAL:$1|1=postoji druga datoteka|postoje druge datoteke}} s istim sadržajem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su druge datoteke}} s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Poslata datoteka je prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
-       "api-error-fetchfileerror": "Unutrašnja greška: došlo je do greške pri dobavljanju datoteke.",
-       "api-error-fileexists-forbidden": "Već postoji datoteka s imenom „$1“ i ne može da se zameni.",
-       "api-error-fileexists-shared-forbidden": "Već postoji datoteka s imenom „$1“ u zajedničkoj riznici i ne može da se zameni.",
-       "api-error-file-too-large": "Poslata datoteka je prevelika.",
-       "api-error-filename-tooshort": "Naziv datoteke je prekratak.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|Dozvoljena je|Dozvoljene su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmena je odbačena od kuke za proširenja.",
-       "api-error-http": "Unutrašnja greška: ne mogu da se povežem sa serverom.",
-       "api-error-illegal-filename": "Naziv datoteke je zabranjen.",
-       "api-error-internal-error": "Unutrašnja greška: došlo je do greške pri obrađivanju datoteke na vikiju.",
-       "api-error-invalid-file-key": "Unutrašnja greška: ne mogu da pronađem datoteku u privremenom skladištu.",
-       "api-error-missingparam": "Unutrašnja greška: nedostaju parametri u zahtevu.",
-       "api-error-missingresult": "Unutrašnja greška: ne mogu da utvrdim da li je umnožavanje uspelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da biste otpremali datoteke.",
-       "api-error-mustbeposted": "Unutrašnja greška: ne koristi se ispravan HTTP metod.",
-       "api-error-noimageinfo": "Otpremanje je uspelo, ali server nije dao nikakav podatak o datoteci.",
-       "api-error-nomodule": "Unutrašnja greška: nije postavljen modul za otpremanje.",
-       "api-error-ok-but-empty": "Unutrašnja greška: server ne odgovara.",
-       "api-error-overwrite": "Zamenjivanje postojeće datoteke je zabranjeno.",
-       "api-error-stashfailed": "Unutrašnja greška: server ne može da sačuva privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: server nije uspeo da objavi privremenu datoteku.",
-       "api-error-timeout": "Server nije odgovorio u očekivano vreme.",
-       "api-error-unclassified": "Došlo je do nepoznate greške",
-       "api-error-unknown-code": "Nepoznata greška: „$1“",
-       "api-error-unknown-error": "Unutrašnja greška: došlo je do greške pri otpremanju datoteke.",
+       "api-error-stashfailed": "Unutrašnja greška: server ne može da sačuva privremenu datoteku.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata greška: „$1“.",
-       "api-error-uploaddisabled": "Otpremanje je onemogućeno na ovom vikiju.",
-       "api-error-verification-error": "Datoteka je oštećena ili ima neispravan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunde|sekundi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuta|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
        "expand_templates_remove_nowiki": "Poništava efekat <nowiki> tagova u prikazu članaka",
        "expand_templates_generate_xml": "Prikaži XML stablo",
        "expand_templates_generate_rawhtml": "Prikaži sirov HTML",
-       "expand_templates_preview": "Prikaz",
+       "expand_templates_preview": "Pretpregled",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
        "pagelang-select-lang": "Izaberi jezik",
index 0cd1578..380310b 100644 (file)
        "searcharticle": "Gå till",
        "history": "Sidhistorik",
        "history_short": "Historik",
+       "history_small": "historik",
        "updatedmarker": "uppdaterad sedan senaste besöket",
        "printableversion": "Utskriftsvänlig version",
        "permalink": "Permanent länk",
        "views": "Visningar",
        "toolbox": "Verktyg",
        "tool-link-userrights": "Ändra {{GENDER:$1|användargrupper}}",
+       "tool-link-userrights-readonly": "Visa {{GENDER:$1|användargrupper}}",
        "tool-link-emailuser": "Skicka e-post till denna {{GENDER:$1|användare}}",
        "userpage": "Visa användarsida",
        "projectpage": "Visa projektsida",
        "passwordreset-emaildisabled": "E-postfunktioner har inaktiverats på denna wiki.",
        "passwordreset-username": "Användarnamn:",
        "passwordreset-domain": "Domän:",
-       "passwordreset-capture": "Visa resulterande e-post?",
-       "passwordreset-capture-help": "Om du markerar den här rutan kommer e-postmeddelandet (med det tillfälliga lösenordet) visas för dig och skickas till användaren.",
        "passwordreset-email": "E-postadress:",
        "passwordreset-emailtitle": "Kontouppgifter på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Någon (förmodligen du, från IP-adressen $1) begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
        "passwordreset-emailelement": "Användarnamn: \n$1\n\nTillfälligt lösenord: \n$2",
        "passwordreset-emailsentemail": "Om denna e-postadress är associerad med ditt konto kommer en lösenordsåterställning skickas via e-post.",
        "passwordreset-emailsentusername": "Om det finns en e-postadress som associeras med detta användarnamn kommer en lösenordsåterställning skickas via e-post.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|E-postmeddelande|E-postmeddelanden}} för återställning av lösenord har skickats. {{PLURAL:$1|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} visas här.",
-       "passwordreset-emailerror-capture2": "Kunde inte skicka e-post till {{GENDER:$2|användaren}}: $1 {{PLURAL:$3|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} listas här.",
        "passwordreset-nocaller": "En användare måste anges",
        "passwordreset-nosuchcaller": "Användare finns inte: $1",
        "passwordreset-ignored": "Lösenordsåterställningen hanterades inte. Kanske ingen leverantör har konfigurerats?",
        "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.",
        "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.",
-       "summary-preview": "Förhandsgranskning av sammanfattning:",
-       "subject-preview": "Rubrikförhandsgranskning:",
+       "summary-preview": "Förhandsgranskning av redigeringssammanfattning:",
+       "subject-preview": "Förhandsgranskning av ämne:",
        "previewerrortext": "Ett fel uppstod när dina ändringar skulle förhandsgranskas.",
        "blockedtitle": "Användaren är blockerad",
        "blockedtext": "'''Din IP-adress eller ditt användarnamn är blockerat.'''\n\nBlockeringen utfördes av $1 med motiveringen: ''$2''.\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6.\n* Blockeringen var avsedd för: $7.\n\nDu kan kontakta $1 eller någon annan av [[{{MediaWiki:Grouppage-sysop}}|administratörerna]] för att diskutera blockeringen.\nOm du är inloggad och har uppgivit en e-postadress i dina [[Special:Preferences|inställningar]] så kan du använda funktionen 'Skicka e-post till den här användaren', såvida du inte blivit blockerad från funktionen.\n\nDin IP-adress är $3 och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "autoblockedtext": "Din IP-adress har blockerats automatiskt eftersom den har använts av en annan användare som blockerats av $1.\nMotiveringen av blockeringen var:\n\n:''$2''\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDu kan kontakta $1 eller någon annan [[{{MediaWiki:Grouppage-sysop}}|administratör]] för att diskutera blockeringen.\n\nObservera att du inte kan använda dig av funktionen \"skicka e-post till användare\" om du inte har registrerat en giltig e-postadress i [[Special:Preferences|dina inställningar]] eller om du har blivit blockerad från att skicka e-post.\n\nDin nuvarande IP-adress är $3, och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
+       "systemblockedtext": "Ditt användarnamn eller IP-adress h    ar blockerats automatiskt av MediaWiki.\n\nMotiveringen av blockeringen var:\n\n:<em>$2</em>\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDin nuvarande IP-adress är $3.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "blockednoreason": "ingen motivering angavs",
        "whitelistedittext": "Vänligen $1 för att redigera sidor.",
        "confirmedittext": "Du måste bekräfta din e-postadress innan du kan redigera sidor. Var vänlig ställ in och validera din e-postadress genom dina [[Special:Preferences|användarinställningar]].",
        "search-interwiki-caption": "Systerprojekt",
        "search-interwiki-default": "Resultat från $1:",
        "search-interwiki-more": "(mer)",
+       "search-interwiki-more-results": "fler resultat",
        "search-relatedarticle": "Relaterad",
        "searchrelated": "relaterad",
        "searchall": "alla",
        "search-external": "Extern sökning",
        "searchdisabled": "Sökfunktionen på {{SITENAME}} är avstängd.\nDu kan istället göra sökningar med hjälp av Google.\nNotera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.",
        "search-error": "Ett fel uppstod under sökningen: $1",
+       "search-warning": "En varning uppstod under sökning: $1",
        "preferences": "Inställningar",
        "mypreferences": "Inställningar",
        "prefs-edits": "Antal redigeringar:",
        "saveprefs": "Spara",
        "restoreprefs": "Återgå till standardinställningar (i alla delar)",
        "prefs-editing": "Redigering",
-       "rows": "Rader:",
-       "columns": "Kolumner:",
        "searchresultshead": "Sökning",
        "stub-threshold": "Gräns för formatering av stubblänk ($1):",
        "stub-threshold-sample-link": "exempel",
        "prefs-help-recentchangescount": "Detta inkluderar senaste ändringarna, sidhistorik och loggar.",
        "prefs-help-watchlist-token2": "Detta är den hemliga nyckeln till webbflödet i din bevakningslista.\nNågon som vet den kommer att kunna läsa din bevakningslista, så dela inte ut den.\n[[Special:ResetTokens|Klicka här om du behöver återställa den]].",
        "savedprefs": "Dina inställningar har sparats",
-       "savedrights": "Användarrättigheterna för {{GENDER:$1|$1}} har sparats.",
+       "savedrights": "Användargrupperna för {{GENDER:$1|$1}} har sparats.",
        "timezonelegend": "Tidszon:",
        "localtime": "Lokal tid:",
        "timezoneuseserverdefault": "Använd wikins standard ($1)",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Användarnamn}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} av {{PLURAL:$1|gruppen|grupperna}}:",
+       "group-membership-link-with-expiry": "$1 (tills $2)",
        "prefs-registration": "Registreringstid:",
        "yourrealname": "Riktigt namn:",
        "yourlanguage": "Språk:",
        "prefswarning-warning": "Du har gjort ändringar i dina inställningarna som inte har sparats ännu.\nOm du lämnar denna sida utan att klicka på \"$1\" kommer dina inställningar inte att uppdateras.",
        "prefs-tabs-navigation-hint": "Tips: Du kan använda vänster och höger piltangenterna för att navigera mellan flikarna i listan flikar.",
        "userrights": "Hantering av användarrättigheter",
-       "userrights-lookup-user": "Hantera användargrupper",
+       "userrights-lookup-user": "Välj en användare",
        "userrights-user-editname": "Skriv in ett användarnamn:",
-       "editusergroup": "Ändra {{GENDER:$1|användargrupper}}",
+       "editusergroup": "Läs in användargrupper",
        "editinguser": "Ändrar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Ändra användargrupper",
+       "viewinguserrights": "Visar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Ändra {{GENDER:$1|användargrupper}}",
+       "userrights-viewusergroup": "Visa {{GENDER:$1|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 (*) markerar att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.",
+       "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-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-nologin": "Du måste [[Special:UserLogin|logga in]] med ett administratörskonto för att ändra användarrättigheter.",
-       "userrights-notallowed": "Du har inte behörighet till att lägga till eller ta bort användarrättigheter.",
        "userrights-changeable-col": "Grupper du kan ändra",
        "userrights-unchangeable-col": "Grupper du inte kan ändra",
+       "userrights-expiry-current": "Förfaller $1",
+       "userrights-expiry-none": "Förfaller inte",
+       "userrights-expiry": "Förfaller:",
+       "userrights-expiry-existing": "Befintlig förfallotid: $3, $2",
+       "userrights-expiry-othertime": "Annan tid:",
+       "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-conflict": "Konflikt vid ändringar av användarrättigheter! Var god granska och bekräfta dina ändringar.",
-       "userrights-removed-self": "Du tog bort dina egna rättigheter. Du kan därför inte längre komma åt denna sida.",
        "group": "Grupp:",
        "group-user": "Användare",
        "group-autoconfirmed": "Automatiskt bekräftade användare",
        "right-siteadmin": "Lås och öppna databasen",
        "right-override-export-depth": "Exportera sidor inklusive länkade sidor till ett djup på 5",
        "right-sendemail": "Skicka e-post till andra användare",
-       "right-passwordreset": "Visa e-postmeddelanden med lösenordsåterställning",
        "right-managechangetags": "Skapa och (in)aktivera [[Special:Tags|märken]]",
        "right-applychangetags": "Tillämpa [[Special:Tags|märken]] tillsammans med ens ändringar",
        "right-changetags": "Lägg till och ta bort godtyckliga [[Special:Tags|märken]] på individuella sidversioner och loggposter.",
        "action-upload_by_url": "ladda upp denna fil från en URL-adress",
        "action-writeapi": "använda skriv-API:t",
        "action-delete": "radera denna sida",
-       "action-deleterevision": "radera denna version",
-       "action-deletedhistory": "se denna sidas raderade historik",
+       "action-deleterevision": "radera sidversioner",
+       "action-deletelogentry": "radera loggposter",
+       "action-deletedhistory": "se en sidas raderade historik",
+       "action-deletedtext": "visa raderad sidversionstext",
        "action-browsearchive": "söka raderade sidor",
-       "action-undelete": "avradera denna sida",
-       "action-suppressrevision": "granska och återställa denna dolda version",
+       "action-undelete": "återställ sidor",
+       "action-suppressrevision": "granska och återställ dolda sidversioner",
        "action-suppressionlog": "se denna privata logg",
        "action-block": "blockera denna användare från redigering",
        "action-protect": "ändra skyddsnivå för denna sida",
        "action-userrights-interwiki": "ändra rättigheter för användare på andra wikier",
        "action-siteadmin": "låsa eller låsa upp databasen",
        "action-sendemail": "skicka e-post",
+       "action-editmyoptions": "redigera dina inställningar",
        "action-editmywatchlist": "redigera din bevakningslista",
        "action-viewmywatchlist": "visa din bevakningslista",
        "action-viewmyprivateinfo": "visa din privata information",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Visa",
+       "rcfilters-activefilters": "Aktiva filter",
+       "rcfilters-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-noresults": "Inga filter hittades",
+       "rcfilters-filtergroup-registration": "Användarregistrering",
+       "rcfilters-filter-registered-label": "Registrerade",
+       "rcfilters-filter-registered-description": "Inloggade redigerare.",
+       "rcfilters-filter-unregistered-label": "Oregistrerade",
+       "rcfilters-filter-unregistered-description": "Redigerare som inte är inloggade.",
+       "rcfilters-filtergroup-authorship": "Redigera författarskap",
+       "rcfilters-filter-editsbyself-label": "Dina egna redigeringar",
+       "rcfilters-filter-editsbyself-description": "Redigeringar av dig.",
+       "rcfilters-filter-editsbyother-label": "Redigeringar av andra",
+       "rcfilters-filter-editsbyother-description": "Redigeringar som har skapats av andra användare (inte dig).",
+       "rcfilters-filtergroup-userExpLevel": "Erfarenhetsnivå (endast för registrerade användare)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nykomlingar",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Färre än 10 redigeringar och 4 dagars aktivitet.",
+       "rcfilters-filter-userExpLevel-learner-label": "Nybörjare",
+       "rcfilters-filter-userExpLevel-learner-description": "Fler dagars aktivitet och redigeringar än \"Nybörjare\" men färre än \"Erfarna användare\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfarna användare",
+       "rcfilters-filter-userExpLevel-experienced-description": "Fler än 30 dagars aktivitet och 500 redigeringar.",
+       "rcfilters-filtergroup-automated": "Automatiserade bidrag",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Redigeringar gjorda av automatiserade verktyg.",
+       "rcfilters-filter-humans-label": "Människa (inte bot)",
+       "rcfilters-filter-humans-description": "Redigeringar gjorda av mänskliga redigerare.",
+       "rcfilters-filtergroup-significance": "Betydelse",
+       "rcfilters-filter-minor-label": "Mindre redigeringar",
+       "rcfilters-filter-minor-description": "Redigeringar som är märkta som mindre.",
+       "rcfilters-filter-major-label": "Icke-mindre redigeringar",
+       "rcfilters-filter-major-description": "Redigeringar som inte är märkta som mindre.",
+       "rcfilters-filtergroup-changetype": "Typ av ändring",
+       "rcfilters-filter-pageedits-label": "Sidredigeringar",
+       "rcfilters-filter-pageedits-description": "Redigeringar till wikiinnehåll, diskussioner, kategoribeskrivningar...",
+       "rcfilters-filter-newpages-label": "Sidskapande",
+       "rcfilters-filter-newpages-description": "Redigeringar som skapade nya sidor.",
+       "rcfilters-filter-categorization-label": "Kategoriändringar",
+       "rcfilters-filter-categorization-description": "Poster av sidor som läggs till eller tas bort från kategorier.",
+       "rcfilters-filter-logactions-label": "Loggade åtgärder",
+       "rcfilters-filter-logactions-description": "Administrativa åtgärder, kontoskapande, sidraderingar, uppladdningar....",
        "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfrom": "Visa nya ändringar från och med $2 $3",
        "rcshowhideminor": "$1 mindre ändringar",
        "uploaded-setting-handler-svg": "SVG som anger \"handler\"-attributet med remote/data/skript är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
        "uploaded-remote-url-svg": "SVG som anger style-attributet med en fjärr-URL är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
        "uploaded-image-filter-svg": "Hittade bildfilter med URL: <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
-       "uploadscriptednamespace": "Denna SVG-fil innehåller den ogiltiga namnrymden \"$1\".",
+       "uploadscriptednamespace": "Denna SVG-fil innehåller den ogiltiga namnrymden \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML-koden i den uppladdade filen kunde inte tolkas.",
        "uploadvirus": "Filen innehåller virus! Detaljer: $1",
        "uploadjava": "Filen är en ZIP-fil som innehåller en Java .class-fil.\nUppladdning av Java filer tillåts inte eftersom de kan orsaka att säkerhetsbegränsningar kan kringgås.",
        "uncategorizedcategories": "Ej kategoriserade kategorier",
        "uncategorizedimages": "Ej kategoriserade filer",
        "uncategorizedtemplates": "Ej kategoriserade mallar",
+       "uncategorized-categories-exceptionlist": " # Innehåller en lista över kategorier, som inte bör nämnas på Special:UncategorizedCategories. En per rad, börjar med \"*\". Rader som börjar med ett annat tecken (inklusive mellanslag) ignoreras. Använd \"#\" för kommentarer.",
        "unusedcategories": "Oanvända kategorier",
        "unusedimages": "Oanvända filer",
        "wantedcategories": "Önskade kategorier",
        "apisandbox-sending-request": "Skickar API-begäran...",
        "apisandbox-loading-results": "Hämtar API-resultat...",
        "apisandbox-results-error": "Ett fel uppstod när API-förfrågans svar lästes in: $1.",
+       "apisandbox-request-selectformat-label": "Visa begärd data som:",
+       "apisandbox-request-format-url-label": "URL-frågesträng",
        "apisandbox-request-url-label": "Begärd URL:",
+       "apisandbox-request-json-label": "Begär JSON:",
        "apisandbox-request-time": "Tid för begäran: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Korrigera nyckeln och skicka igen",
        "apisandbox-results-fixtoken-fail": "Misslyckades att hämta nyckeln \"$1\".",
        "apisandbox-continue-clear": "Rensa",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} kommer att [https://www.mediawiki.org/wiki/API:Query#Continuing_queries fortsätta] den sista begäran; {{int:apisandbox-continue-clear}} kommer att rensa fortsättningsrelaterade parametrar.",
        "apisandbox-param-limit": "Ange <kbd>max</kbd> för att använda den maximala gränsen.",
+       "apisandbox-multivalue-all-namespaces": "$1 (alla namnrymder)",
+       "apisandbox-multivalue-all-values": "$1 (alla värden)",
        "booksources": "Bokkällor",
        "booksources-search-legend": "Sök efter bokkällor",
        "booksources-search": "Sök",
        "activeusers-count": "$1 {{PLURAL:$1|handling|handlingar}} {{PLURAL:$3|det senaste dygnet|de senaste $3 dygnen}}",
        "activeusers-from": "Visa användare från och med:",
        "activeusers-groups": "Visa användare som tillhör grupper:",
+       "activeusers-excludegroups": "Exkludera användare som tillhör grupper:",
        "activeusers-noresult": "Inga användare funna.",
        "activeusers-submit": "Visa aktiva användare",
        "listgrouprights": "Behörigheter för användargrupper",
        "emailccsubject": "Kopia av ditt meddelande till $1: $2",
        "emailsent": "E-post har nu skickats",
        "emailsenttext": "Ditt e-postmeddelande har skickats",
-       "emailuserfooter": "Detta e-postmeddelande {{GENDER:$1|skickades}} av $1 till {{GENDER:$2|$2}} med funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
+       "emailuserfooter": "Detta e-postmeddelande {{GENDER:$1|skickades}} av $1 till {{GENDER:$2|$2}} med funktionen \"{{int:emailuser}}\" på {{SITENAME}}. Om {{GENDER:$2|du}} svarar på detta e-postmeddelande kommer {{GENDER:$2|ditt}} e-postmeddelande att skickas direkt till {{GENDER:$1|den ursprungliga avsändaren}}, vilket kommer avslöja {{GENDER:$2|din}} e-postadress för {{GENDER:$1|honom|henne|hen}}.",
        "usermessage-summary": "Lämnar systemmeddelande.",
        "usermessage-editor": "Systemmeddelare",
        "watchlist": "Bevakningslista",
        "changecontentmodel-emptymodels-title": "Inget innehållsmodeller finns tillgängliga",
        "changecontentmodel-emptymodels-text": "Innehållet på [[:$1]] kan inte konverteras till någon typ.",
        "log-name-contentmodel": "Ändringslogg för innehållsmodellen",
-       "log-description-contentmodel": "Händelser som är relaterade till en sidas innehållsmodeller",
+       "log-description-contentmodel": "Denna sida listar ändringar i innehållsmodellen för sidor och sidor som skapades med en annan innehållsmodell än den som är standard.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|skapade}} sidan $3 med den icke-standardiserade innehållsmodellen \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ändrade}} innehållsmodellen för sidan $3 från \"$4\" till \"$5\"",
        "logentry-contentmodel-change-revertlink": "återställ",
        "proxyblockreason": "Din IP-adress har blivit blockerad eftersom den tillhör en öppen proxy. Kontakta din internetleverantör eller din organisations eller företags tekniska support, och informera dem om denna allvarliga säkerhetsrisk.",
        "sorbsreason": "Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.",
        "sorbs_create_account_reason": "Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}.\nDu får inte skapa ett användarkonto",
+       "softblockrangesreason": "Anonyma bidrag tillåts inte från din IP-adress ($1). Var god logga in.",
        "xffblockreason": "En IP-adress i sidhuvudet X-Forwarded-For, antingen din adress eller en proxyserver som du använder, har blockerats. Den ursprungliga anledningen till blockeringen var: $1",
        "cant-see-hidden-user": "Användaren du försöker blockera är redan blockerad och dold. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.",
        "ipbblocked": "Du kan inte blockera eller avblockera andra användare, eftersom du själv är blockerad",
        "cant-move-to-user-page": "Du har inte behörighet att flytta en sida till en användarsida (förutom till en användarundersida).",
        "cant-move-category-page": "Du har inte behörighet att flytta kategorisidor.",
        "cant-move-to-category-page": "Du har inte behörighet att flytta en sida till en kategorisida.",
+       "cant-move-subpages": "Du har inte behörighet att flytta undersidor.",
+       "namespace-nosubpages": "Namnrymden \"$1\" tillåter inte undersidor.",
        "newtitle": "Ny titel:",
        "move-watch": "Bevaka denna sida",
        "movepagebtn": "Flytta sidan",
        "pageinfo-length": "Sidlängd (i byte)",
        "pageinfo-article-id": "Sid-ID",
        "pageinfo-language": "Språk för sidinnehåll",
+       "pageinfo-language-change": "ändra",
        "pageinfo-content-model": "Sidinnehållsmodell",
        "pageinfo-content-model-change": "ändra",
        "pageinfo-robot-policy": "Indexering av robotar",
        "htmlform-user-not-exists": "<strong>$1</strong> finns inte.",
        "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-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-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",
        "feedback-bugcheck": "Jättebra! Bara kontrollera att det inte är en av de [$1 kända buggarna].",
        "feedback-useragent": "Användaragent:",
        "searchsuggest-search": "Sök på {{SITENAME}}",
        "searchsuggest-containing": "innehåller...",
-       "api-error-autoblocked": "Din IP-adress har blockerats automatiskt eftersom den har använts av en blockerad användare.",
-       "api-error-badaccess-groups": "Du får inte ladda upp filer till denna wiki.",
        "api-error-badtoken": "Internt fel: felaktig nyckel.",
-       "api-error-blocked": "Du har blockerats från att redigera.",
-       "api-error-copyuploaddisabled": "Uppladdning via URL är inaktiverat på den här servern.",
-       "api-error-duplicate": "Det finns redan {{PLURAL:$1|en annan fil|andra filer}} på webbplatsen med samma innehåll.",
-       "api-error-duplicate-archive": "Det fanns redan {{PLURAL:$1|en annan fil|några andra filer}} på webbplatsen med samma innehåll, men {{PLURAL:$1|den har|de har}} raderats.",
-       "api-error-empty-file": "Filen du skickade var tom.",
        "api-error-emptypage": "Det är inte tillåtet att skapa nya, tomma sidor.",
-       "api-error-fetchfileerror": "Internt fel: något gick fel vid hämtningen av filen.",
-       "api-error-fileexists-forbidden": "En fil med namnet \"$1\" finns redan och kan inte skrivas över.",
-       "api-error-fileexists-shared-forbidden": "En fil med namnet \"$1\" finns redan i det delade filarkivet och kan inte skrivas över.",
-       "api-error-file-too-large": "Filen du skickade var för stor.",
-       "api-error-filename-tooshort": "Filnamnet är för kort.",
-       "api-error-filetype-banned": "Denna typ av fil är förbjuden.",
-       "api-error-filetype-banned-type": "$1 är inte {{PLURAL:$4|en tillåten filtyp|tillåtna filtyper}}. {{PLURAL:$3|Tillåten filtyp|Tillåtna filtyper}} är $2.",
-       "api-error-filetype-missing": "Filnamnet saknar en filändelse.",
-       "api-error-hookaborted": "Ändringen du försökte göra avbröts av en extension hook.",
-       "api-error-http": "Internt fel: Det gick inte att ansluta till servern.",
-       "api-error-illegal-filename": "Filnamnet är inte tillåtet.",
-       "api-error-internal-error": "Internt fel: Något gick fel med bearbetningen av din uppladdning på wikin.",
-       "api-error-invalid-file-key": "Internt fel: filen hittades inte i tillfällig lagring.",
-       "api-error-missingparam": "Internt fel: Det saknas parametrar i begäran.",
-       "api-error-missingresult": "Internt fel: Kunde inte avgöra om kopieringen lyckades.",
-       "api-error-mustbeloggedin": "Du måste vara inloggad för att kunna ladda upp filer.",
-       "api-error-mustbeposted": "Det finns en bugg i detta program, det använder inte rätt HTTP-metod.",
-       "api-error-noimageinfo": "Uppladdningen lyckades, men servern gav oss inte någon information om filen.",
-       "api-error-nomodule": "Internt fel: Ingen uppladdningsmodul uppsatt.",
-       "api-error-ok-but-empty": "Internt fel: Inget svar från servern.",
-       "api-error-overwrite": "Det är inte tillåtet att skriva över en befintlig fil.",
-       "api-error-ratelimited": "Du försöker ladda upp fler filer inom en kortare tidsrymd än denna wiki tillåter.\nFörsök igen om några minuter.",
-       "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-publishfailed": "Internt fel: Servern kunde inte publicera temporär fil.",
-       "api-error-stasherror": "Ett fel uppstod under uppladdningen av filen till mellanlagringsfilen.",
-       "api-error-stashedfilenotfound": "Den temporära filen kunde inte hittas när den skulle laddas upp från den temporära lagringsytan.",
-       "api-error-stashpathinvalid": "Den sökväg där den temporära filen skulle ha hittats var ogiltig.",
-       "api-error-stashfilestorage": "Ett fel uppstod under lagringen av filen i den temporära lagringsytan.",
-       "api-error-stashzerolength": "Servern kunde inte lagra filen temporärt eftersom den har noll längd.",
-       "api-error-stashnotloggedin": "Du måste vara inloggad för att spara filer till den temporära ytan för uppladdningar.",
-       "api-error-stashwrongowner": "Filen du försöker komma åt i det temporära lagringsutrymmet tillhör inte dig.",
-       "api-error-stashnosuchfilekey": "Filnyckeln som du försökte komma åt i den temporära lagringsytan existerar inte.",
-       "api-error-timeout": "Servern svarade inte inom förväntad tid.",
-       "api-error-unclassified": "Ett okänt fel uppstod.",
-       "api-error-unknown-code": "Okänt fel: \"$1\".",
-       "api-error-unknown-error": "Internt fel: något gick fel när vi försökte ladda upp din fil.",
+       "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-unknown-warning": "Okänd varning: \"$1\".",
        "api-error-unknownerror": "Okänt fel: \"$1\".",
-       "api-error-uploaddisabled": "Uppladdning är inaktiverad på denna wiki.",
-       "api-error-verification-error": "Denna fil kan vara skadad eller har fel filändelse.",
-       "api-error-was-deleted": "En fil med detta namn har tidigare laddats upp och sedan raderats.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunder}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuter}}",
        "duration-hours": "$1 {{PLURAL:$1|timme|timmar}}",
        "pagelang-language": "Språk",
        "pagelang-use-default": "Använd standardspråk",
        "pagelang-select-lang": "Välj språk",
+       "pagelang-reason": "Orsak",
        "pagelang-submit": "Skicka",
+       "pagelang-nonexistent-page": "Sidan $1 finns inte.",
+       "pagelang-unchanged-language": "Sidan $1 har redan språket $2.",
+       "pagelang-unchanged-language-default": "Sidan $1 har redan wikins standardinnehållsspråk.",
+       "pagelang-db-failed": "Databasen misslyckades med att ändra sidans språk.",
        "right-pagelang": "Ändra sidspråk",
        "action-pagelang": "ändra sidspråket",
        "log-name-pagelang": "Språkändringslogg",
        "mw-widgets-dateinput-no-date": "Inget valt datum",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Sök efter media",
+       "mw-widgets-mediasearch-noresults": "Inga resultat hittades.",
        "mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
        "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Lägg till en kategori...",
+       "mw-widgets-usersmultiselect-placeholder": "Lägg till fler...",
        "sessionmanager-tie": "Kan inte kombinera flera begäransautentiseringstyper: $1.",
        "sessionprovider-generic": "$1-sessioner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebaserade sessioner",
        "log-action-filter-contentmodel-change": "Ändring av innehållsmodell",
        "log-action-filter-contentmodel-new": "Skapande av sida med icke-standardiserad innehållsmodell",
        "log-action-filter-delete-delete": "Radering av sida",
+       "log-action-filter-delete-delete_redir": "Överskrivning av omdirigering",
        "log-action-filter-delete-restore": "Återställning av sida",
        "log-action-filter-delete-event": "Radering av logg",
        "log-action-filter-delete-revision": "Radering av sidversion",
        "usercssispublic": "Observera: CSS-undersidor bör inte innehålla konfidentiella uppgifter eftersom de kan ses av andra användare.",
        "restrictionsfield-badip": "Ogiltig IP-adress eller intervall: $1",
        "restrictionsfield-label": "Tillåtna IP-intervall:",
-       "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Fel: $1",
-       "edit-error-long": "Fel:\n\n$1"
+       "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "revid": "sidversion $1",
+       "pageid": "sid-ID $1"
 }
index 44b15e8..c4148df 100644 (file)
        "passwordreset-emaildisabled": "Vipengee vya barua pepe vimelemazwa katika wiki hii.",
        "passwordreset-username": "Jina la mtumiaji:",
        "passwordreset-domain": "Miliki",
-       "passwordreset-capture": "Ioneshe barua-pepe itakayotumwa?",
-       "passwordreset-capture-help": "Iwapo utatia alama kisanduku hiki, barua-pepe (pamoja na nenosiri la muda) litaoneshwa kwako na vilevile litatumwa kwa mtumiaji.",
        "passwordreset-email": "Anwani ya barua pepe:",
        "passwordreset-emailtitle": "Maelezo ya akaunti kwenye {{SITENAME}}",
        "passwordreset-emailtext-ip": "Kuna mtu (huenda ikawa ni wewe, kutoka anwani ya IP $1) aliyeomba neno la siri la akaunti yako liwekwe upya katika {{SITENAME}} ($4). {{PLURAL:$3|Akaunti inayofuata imeunganishwa|Akaunti zinazofuata zimeunganishwa}} na anwani ya barua pepe hii:\n\n$2\n\n{{PLURAL:$3|Neno la siri hili litakwisha|Maneno ya siri haya yatakwisha}} baada ya siku {{PLURAL:$5|$5}}.\nUnafaa kuingia sasa na uchague neno jipya la siri. Kama mtu mwingine ameomba hili, au ikiwa umekumbuka neno lako la siri na hutaki kulibadilisha tena, basi usijali ujumbe huu, na uendelee kutumia neno la siri lako la zamani.",
        "saveprefs": "Hifadhi",
        "restoreprefs": "Rudisha mapendekezo ya msingi(katika sehemu zote)",
        "prefs-editing": "Kuhariri",
-       "rows": "Mistari:",
-       "columns": "Safu:",
        "searchresultshead": "Kutafuta",
        "stub-threshold": "Kiwango cha juu cha kuonyesha kiungo kama <a href=\"#\" class=\"stub\">kiungo kinachoelekea mbegu</a> (baiti):",
        "stub-threshold-disabled": "Imelemazwa",
        "userrights-reason": "Sababu:",
        "userrights-no-interwiki": "Huna ruhusa ya kuhariri haki za mtumiaji kwenye wiki zingine.",
        "userrights-nodatabase": "Hakuna hifadhidata inayoitwa $1 au haimo katiko jumuia hii ya wiki.",
-       "userrights-nologin": "Lazima [[Special:UserLogin|uingie ndani]] ya akaunti ya mkabidhi ili kupanga haki za mtumiaji.",
-       "userrights-notallowed": "Hauna ruhusa ya kupea au kunyimana haki za mtumiaji.",
        "userrights-changeable-col": "Makundi unayoweza kuyabadilisha",
        "userrights-unchangeable-col": "Makundi usiyoweza kuyabadilisha",
        "userrights-conflict": "Mgongano wa haki za mtumiaji! Tafadhali pitia na uthibitishe mabadiliko yako.",
-       "userrights-removed-self": "Umefanikiwa kundoa haki zako mwenyewe. Kwa hivo, hauna uwezo wa kupata ukurasa huu.",
        "group": "Kundi:",
        "group-user": "Watumiaji",
        "group-autoconfirmed": "Watumiaji waliothibitishwa na tarakilishi",
        "right-siteadmin": "Kufunga na kufungua hifadhidata",
        "right-override-export-depth": "Kuuza nje kurasa ikiwa ni pamoja na kurasa zilizounganishwa hadi kina cha 5",
        "right-sendemail": "Kutuma barua-pepe kwa watumiaji wengine",
-       "right-passwordreset": "Onesha barua pepe zinazoweka neno la siri upya",
        "right-managechangetags": "Unda na ufute [[Special:Tags|tags]] kutoka kwa hifadhidata",
        "right-applychangetags": "Weka [[Special:Tags|tags]] pamoja na mabadiliko yangu",
        "newuserlogpage": "Kumbukumbu za kuanzisha akaunti za watumiaji",
        "uploaddisabledtext": "Upakiaji wa mafaili umelemazwa.",
        "php-uploaddisabledtext": "Upakiaji wa mafaili umelemazwa katika PHP.\nTafadhali utazame kipimo cha file_uploads.",
        "uploadscripted": "Faili hili lina HTML au misimbo ambazo labda itaeleweka vibaya na kivinjari.",
-       "uploadscriptednamespace": "Faili ya SVG iko na jina batili \"$1\".",
+       "uploadscriptednamespace": "Faili ya SVG iko na jina batili \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML katika faili iliyopakiwa haikuchanganuliwa.",
        "uploadvirus": "Faili lina kirusi!\nMaelezo mengine: $1",
        "uploadjava": "Faili ZIP hili lina faili Java .class humo ndani.\nHairuhusiki kupakia mafaili ya Java, kwa sababu yanawezesha kusababisha vizuio vya usalama kuzungukwa.",
        "feedback-thanks-title": "Asante!",
        "searchsuggest-search": "Kutafuta",
        "searchsuggest-containing": "ya maneno...",
-       "api-error-empty-file": "Faili ulilowasilisha ni tupu.",
        "api-error-emptypage": "Kutengeneza mpya, kurasa tupu hazikubaliwi",
-       "api-error-filename-tooshort": "Jina la faili ni fupi mno.",
-       "api-error-filetype-banned": "Aina hili la faili hairuhusiwi.",
-       "api-error-illegal-filename": "Jina hilo la faili haliruhusiwi.",
-       "api-error-unclassified": "Ilitokea hitilafu isiyojulikana.",
-       "api-error-unknown-code": "Hitilafu isiyojulikana: \"$1\".",
        "api-error-unknown-warning": "Ilani isiojulikana: \"$1\".",
        "api-error-unknownerror": "Hitlafu isiyojulikana: \"$1\".",
-       "api-error-uploaddisabled": "Kupakia kumelemazwa katika wiki hii.",
        "duration-seconds": "{{PLURAL:$1|sekunde}} $1",
        "duration-minutes": "{{PLURAL:$1|dakika}} $1",
        "duration-hours": "{{PLURAL:$1|saa|masaa}} $1",
index 7fd903d..f244230 100644 (file)
@@ -50,7 +50,8 @@
                        "Nemo bis",
                        "JAaron95",
                        "Info-farmer",
-                       "Rakeshonwiki"
+                       "Rakeshonwiki",
+                       "Kaartic"
                ]
        },
        "tog-underline": "அடிக்கோடிட்டத்தை இணை:",
        "searcharticle": "செல்",
        "history": "பக்க வரலாறு",
        "history_short": "வரலாறு",
+       "history_small": "வரலாறு",
        "updatedmarker": "எனது கடைசி வருகைக்குப் பின் இற்றைப்படுத்தப்பட்டது",
        "printableversion": "அச்சுக்குகந்த பதிப்பு",
        "permalink": "நிலையான இணைப்பு",
        "passwordreset-emaildisabled": "மின்னஞ்சல் வசதி இந்த விக்கியில் முடக்கப்பட்டுள்ளது.",
        "passwordreset-username": "பயனர் பெயர்:",
        "passwordreset-domain": "இணையதள முகவரி:",
-       "passwordreset-capture": "விளைவு மின்னஞ்சலை காண்",
-       "passwordreset-capture-help": "நீங்கள் இந்த பெட்டியை தெரிவு செய்தால் ,இந்த மின்னஞ்சல் (தற்காலிக கடவுச்சொல்லுடன்) உங்களுக்கு தெரியும் . அதேபோல இது பயனருக்கும் அனுப்பப்படும்.",
        "passwordreset-email": "மின்னஞ்சல் முகவரி:",
        "passwordreset-emailtitle": "{{SITENAME}} ல் கணக்கு விவரங்கள்",
        "passwordreset-emailtext-ip": "யாராவது (அநேகமாக நீங்கள், IP முகவரி   $1 ல் இருந்து ), நினைவுபடுத்தி கோரிய உங்கள் கணக்கு\n விவரங்கள் நினைவுபடுத்தி {{SITENAME}} ( $4 ).பின்வரும் பயனர்  {{PLURAL:$3|account is|accounts are}}\n இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.\n$2\n{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.\nநீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்து வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ\nஅல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.",
        "saveprefs": "சேமி",
        "restoreprefs": "எல்லோருக்கும் பொதுவான வடிவமைப்பைத் திரும்பக்கொண்டுவரவும் (எல்லா பிரிவுகளிலும்).",
        "prefs-editing": "தொகுத்தல்",
-       "rows": "நிரைகள் (கிடை வரிசைகள்):",
-       "columns": "நிரல்கள்",
        "searchresultshead": "தேடுக",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> சீர்படுத்தலுக்கான எல்லை (பைட்டுகள்):",
        "stub-threshold-sample-link": "மாதிரி",
        "editusergroup": "{{GENDER:$1|பயனர்}} குழுக்களை தொகு",
        "editinguser": "பயனர் {{GENDER:$1|பயனர்}} <strong>[[User:$1|$1]]</strong> $2  பயனருக்கான அனுமதிகளை மாற்றல்",
        "userrights-editusergroup": "பயனர் குழுக்களை தொகு",
+       "userrights-viewusergroup": "பயனர் குழுக்களைப் பார்வையிடுக",
        "saveusergroups": "{{GENDER:$1|பயனர்}} குழுக்களை சேமி",
        "userrights-groupsmember": "உறுப்பினர்:",
        "userrights-groupsmember-auto": "தானகவே உடன்வரும் உறுப்பினர்:\n\nகூடவே வரும் உறுப்பினர்:",
        "userrights-reason": "காரணம்:",
        "userrights-no-interwiki": "ஏனைய விக்கிகளில் பயனர் உரிமைகளை மாற்றும் அனுமதி உங்களுக்குக் கிடையாது.",
        "userrights-nodatabase": "$1 தரவுத்தளம் கிடையாது அல்லது உள்ளக விக்கியில் கிடையாது.",
-       "userrights-nologin": "பயனர் உரிமைகளை வழங்குவதற்கு நீங்கள் நிர்வாகி கணக்கில் [[Special:UserLogin|புகுபதிகை]] செய்ய வேண்டும்.",
-       "userrights-notallowed": "பயனர் உரிமைகளை மாற்றும் அனுமதி உங்களுக்கு கிடையாது.",
        "userrights-changeable-col": "நீங்கள் மாற்றக்கூடிய குழுக்கள்",
        "userrights-unchangeable-col": "நீங்கள் மாற்ற முடியாத குழுக்கள்",
        "userrights-conflict": "பயனர் உரிமைகளின் மாற்றங்களில் முரண்பாடு உள்ளது! மறு ஆய்வு செய்து, உங்கள் மாற்றங்களை உறுதி செய்க.",
-       "userrights-removed-self": "நீங்கள் உங்களது சொந்த உரிமைகளை வெற்றிகரமாக நீக்கியுள்ளீர்கள். இதனால் நீங்கள் இனி இந்தப்பக்கத்தினை பார்க்க இயலாது.",
        "group": "குழு:",
        "group-user": "பயனர்கள்",
        "group-autoconfirmed": "தானாக உறுதியளிக்கப்பட்ட பயனர்கள்",
        "right-siteadmin": "தரவுத்தளத்தை பூட்டல் திறத்தல்",
        "right-override-export-depth": "பக்கங்களை ஏற்றுமதி செய் அத்துடன் இணைத்த பக்கங்கள் ஆழம் 5 வரை சேர்த்து ஏற்றுமதி செய்",
        "right-sendemail": "மற்ற பயனர்களுக்கு மின்னஞ்சல் அனுப்பு",
-       "right-passwordreset": "கடவுச்சொல் மீட்டமை மின்னஞ்சல்களை காண்.",
        "right-managechangetags": "தரவுதளத்திலிருந்து [[Special:Tags|அடையாளங்களை]] உருவாக்கு மற்றும் நீக்கு",
        "right-applychangetags": "ஒருவரின் மாற்றத்துடன் [[Special:Tags|அடையாளங்களை]] செயற்படுத்து",
        "right-changetags": "தனியொருவரின் திருத்தம் மற்றும் செயற்பாட்டு பதிவுகளில்  [[Special:Tags|அடையாளங்களை]] சேர் அல்லது நீக்கு",
        "action-upload_by_url": "இக்கோப்பை ஓர் உரலியிலிருந்துப் பதிவேற்றவும்",
        "action-writeapi": "எழுது API பயன்படுத்தவும்",
        "action-delete": "இந்தப் பக்கத்தை நீக்கவும்",
-       "action-deleterevision": "à®\87நà¯\8dத à®®à®¾à®±à¯\8dறதà¯\8dதை நீக்கவும்",
-       "action-deletedhistory": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\95à®\9fà¯\88à®\9aியாà®\95 à®¨à¯\80à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®µà®°à®²à®¾à®±à¯\81 à®\95ாணà¯\8d",
+       "action-deleterevision": "மாறà¯\8dà®±à®\99à¯\8dà®\95ளை நீக்கவும்",
+       "action-deletedhistory": "à®\92à®°à¯\81 à®ªà®\95à¯\8dà®\95தà¯\8dதினà¯\8d à®¨à¯\80à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®µà®°à®²à®¾à®±à¯\81 à®\95ாணà¯\8dà®\95",
        "action-browsearchive": "அழிக்கப்பட்ட பக்கங்களைத் தேடு",
        "action-undelete": "அழித்த பக்கத்தை மறுபடியும் கொண்டு வா",
-       "action-suppressrevision": "à®\87நà¯\8dத à®®à®±à¯\88à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®ªà®°à®¿à®\9aà¯\80லனà¯\88யà¯\88 à®\86யà¯\8dவà¯\81à®\9aà¯\86யà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d  மீட்டெடு",
+       "action-suppressrevision": "மறà¯\88à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®®à¯\80ளாயà¯\8dவà¯\81à®\95ளà¯\88 à®\86யà¯\8dவà¯\81à®\9aà¯\86யà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d மீட்டெடு",
        "action-suppressionlog": "இத்தனிப் பதிகையைக் காணவும்",
        "action-block": "இப்பயனரை மேலும் தொகுக்க அனுமதிக்க வேண்டாம்",
        "action-protect": "இந்த பக்கத்திற்கான பாதுகாப்பு நிலைகளை மாற்றவும்",
        "recentchanges-legend-heading": "<strong>குறியீட்டு விளக்கம்:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
        "recentchanges-submit": "காட்டு",
+       "rcfilters-filterlist-title": "வடிப்பான்கள்",
+       "rcfilters-filtergroup-registration": "பயனர் பதிகை",
+       "rcfilters-filter-registered-label": "பதிவுசெய்யப்பட்டது",
+       "rcfilters-filter-unregistered-label": "பதிவு நீக்கம் செய்யப்பட்டது",
+       "rcfilters-filter-editsbyself-label": "தங்களின் சொந்த தொகுப்புகள்",
+       "rcfilters-filter-userExpLevel-newcomer-label": "புது வரவுகள்",
+       "rcfilters-filter-userExpLevel-learner-label": "கற்போர்",
+       "rcfilters-filter-bots-label": "தானியங்கி",
+       "rcfilters-filter-humans-label": "மனிதன் (தானியங்கி அல்ல)",
+       "rcfilters-filtergroup-changetype": "மாற்ற வகை",
+       "rcfilters-filter-newpages-label": "பக்க உருவாக்கங்கள்",
        "rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
        "rclistfrom": "$2, $3 முதல் இன்று வரை செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
        "rcshowhideminor": "சிறிய தொகுப்புகளை $1",
        "uploaddisabledtext": "கோப்பு பதிவேற்றங்கள் செயலிழக்கச் செய்யப்பட்டுள்ளன.",
        "php-uploaddisabledtext": "கோப்பு தரவேற்றம் PHP இல் முடக்கப்பட்டுள்ளது.தயவுகூர்ந்து file_uploads அமைப்பை சரிபார்க்கவும்.",
        "uploadscripted": "இந்தக் கோப்பு உலாவியால் பிழையாக விளங்கிக் கொள்ளக்கூடிய எச்.டி.எம்.எல். அல்லது வேறு நிரல்களைக் கொண்டுள்ளது.",
-       "uploadscriptednamespace": "இந்த SVG கோப்பு ஒரு சரியில்லாத பெயரிடைவெளியை \"$1\" கொண்டுள்ளது.",
+       "uploadscriptednamespace": "இந்த SVG கோப்பு ஒரு சரியில்லாத பெயரிடைவெளியை கொண்டுள்ளது \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "ஏற்றபட்ட கோப்பில் உள்ள XML ஆராய முடியாது.",
        "uploadvirus": "கோப்பு நச்சுநிரலைக் (வைரஸ்) கொண்டுள்ளது! விபரங்கள்:$1",
        "uploadjava": "இது ஒரு zip கோப்பு.இதில் java.class என்ற கோப்பு உள்ளது.\nஜாவா கோப்புகளை தகவலேற்றுவது தடைசெய்யப்பட்டுள்ளது.ஏனெனில் அது பாதுகாப்பு தடைகளை மீற வழிவகுக்கும்.",
        "tooltip-ca-delete": "இப்பக்கத்தை நீக்கு",
        "tooltip-ca-undelete": "இப்பக்கம் நீக்கப்பட்டதற்கு முன்னர் செய்யப்பட்டத் தொகுப்புகளை மீட்டெடு",
        "tooltip-ca-move": "இப்பக்கத்தை நகர்த்துக",
-       "tooltip-ca-watch": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89ன் கவனிப்புப் பட்டியலில் சேர்",
+       "tooltip-ca-watch": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89à®\99à¯\8dà®\95ள் கவனிப்புப் பட்டியலில் சேர்",
        "tooltip-ca-unwatch": "இப்பக்கத்தை என் கவனிப்புப் பட்டியலிருந்து நீக்கு",
        "tooltip-search": "{{SITENAME}}-இல் தேடுக",
        "tooltip-search-go": "இப்பெயரைக் கொண்டப் பக்கம் இருப்பின் அதற்கு நேரடியாகச் செல்க",
        "pageinfo-length": "பக்க நீளம் (எண்ணுண்மிகளில்)",
        "pageinfo-article-id": "பக்க அடையாள இலக்கம்",
        "pageinfo-language": "பக்க உள்ளடக்க மொழி",
+       "pageinfo-language-change": "மாற்று",
        "pageinfo-content-model": "பக்கள உள்ளடக்க மாதிரி",
        "pageinfo-content-model-change": "மாற்று",
        "pageinfo-robot-policy": "தானியங்கி மூலம் அட்டவணைப்படுத்தல்",
        "confirm-purge-top": "இப்பக்கத்தின் இடைமாற்றை நீக்கவா?",
        "confirm-purge-bottom": "ஒரு பக்கத்தை நீக்குதல், அதன் இடைமாற்றை நீக்கி மிக அண்மையப் பதிப்பை தோன்ற செய்யும்.",
        "confirm-watch-button": "சரி",
-       "confirm-watch-top": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89ன் கவனிப்புப் பட்டியலில் சேர்க்க வேண்டுமா?",
+       "confirm-watch-top": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89à®\99à¯\8dà®\95ள் கவனிப்புப் பட்டியலில் சேர்க்க வேண்டுமா?",
        "confirm-unwatch-button": "சரி",
        "confirm-unwatch-top": "இப்பக்கத்தை உங்கள்  கவனிப்புப் பட்டியலிருந்து நீக்கா வேண்டுமா?",
        "quotation-marks": "\"$1\"",
        "logentry-newusers-autocreate": "பயனர் கணக்கு $1 தானாக உருவாக்கப்பட்டது",
        "logentry-protect-move_prot": "$1 காப்பு அமைப்பை $4-இலிருந்து $3-இற்கு {{GENDER:$2|நகர்த்தினார்}}",
        "logentry-protect-unprotect": "$1 $3-இலிருந்து காப்பை {{GENDER:$2|நீக்கினார்}}",
-       "logentry-protect-protect": "$1 $3 என்பதனை $4 என்பதற்கு {{GENDER:$2|காப்பச் செய்தார்}}",
-       "logentry-protect-protect-cascade": "$1 $3 என்பதனை $4 என்பதற்கு {{GENDER:$2|காப்பச் செய்தார்}} [விழுத்தொடர்]",
+       "logentry-protect-protect": "$1 $3 à®\8eனà¯\8dபதனà¯\88 $4 à®\8eனà¯\8dபதறà¯\8dà®\95à¯\81 {{GENDER:$2|à®\95ாபà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dதாரà¯\8d}}",
+       "logentry-protect-protect-cascade": "$1 $3 à®\8eனà¯\8dபதனà¯\88 $4 à®\8eனà¯\8dபதறà¯\8dà®\95à¯\81 {{GENDER:$2|à®\95ாபà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dதாரà¯\8d}} [விழà¯\81தà¯\8dதà¯\8aà®\9fà®°à¯\8d]",
        "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|மாற்றினார்}}",
        "feedback-useragent": "பயனர் முகவர்:",
        "searchsuggest-search": "தேடு",
        "searchsuggest-containing": "கொண்டுள்ளது...",
-       "api-error-badaccess-groups": "இந்த விக்கிக்குக் கோப்புகளைப் பதிவேற்றுவதற்கு நீங்கள் அனுமதிக்கப்படவில்லை.",
        "api-error-badtoken": "உள்ளகப் பிழை: தவறான அடையாளம்.",
-       "api-error-copyuploaddisabled": "உரலி மூலம் பதிவேற்றுவது இந்த வழங்கியில் செயலிழக்கச் செய்யப்பட்டுள்ளது.",
-       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
-       "api-error-duplicate-archive": "ஏற்கனவே இத்தளத்தில் இதே உள்ளடக்கத்தைக் கொண்ட {{PLURAL:$1|கோப்பு இருந்தது|கோப்புகள் இருந்தன}}, ஆனால் {{PLURAL:$1|அது நீக்கப்பட்டுவிட்டது|அவை நீக்கப்பட்டுவிட்டன.}}",
-       "api-error-empty-file": "நீங்கள் அளித்த கோப்பு காலியாக உள்ளது.",
        "api-error-emptypage": "புதிய, காலி பக்கங்கள் உருவாக்கல் அனுமதிக்கப்படவில்லை.",
-       "api-error-fetchfileerror": "உள்ளகப் பிழை: கோப்பைப் பெறுகையில் ஏதோ தவறு நேர்ந்துவிட்டது.",
-       "api-error-fileexists-forbidden": "\"$1\" என்ற பெயருள்ள கோப்பு ஏற்கனவே உள்ளது.  மேலெழுத முடியாது.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" என்ற பெயருள்ள கோப்பு ஏற்கனவே கோப்பு பகிர்மானப் பெட்டகத்தில்  உள்ளது. மேலெழுத முடியாது.",
-       "api-error-file-too-large": "நீங்கள் அளித்த கோப்பு மிகவும் பெரியதாக உள்ளது.",
-       "api-error-filename-tooshort": "கோப்புப் பெயர் மிகவும் சிறியதாக உள்ளது.",
-       "api-error-filetype-banned": "இக்கோப்பு வகை தடைசெய்யப்பட்டுள்ளது.",
-       "api-error-filetype-banned-type": "$1  {{PLURAL:$4|அனுமதிக்கப்படாத கோப்பு வகையாகும் | அனுமதிக்கப்படாத கோப்பு வகைகளாகும்}}.. அனுமதிக்கப்பட்ட {{PLURAL:$3|கோப்புவகை|கோப்புவகைகள்}} $2 என்பது(வை) ஆகும்.",
-       "api-error-filetype-missing": "கோப்பில் ஒரு விரிவு விடுபடுகிறது.",
-       "api-error-hookaborted": "நீங்கள் செய்ய முயன்ற மாற்றம் ஒரு விரிவாக்கத்தால் புறக்கணிக்கப்பட்டது.",
-       "api-error-http": "உள்ளகப் பிழை: வழங்கியுடன் இணைக்க முடியவில்லை",
-       "api-error-illegal-filename": "இக்கோப்புப் பெயர் அனுமதிக்கப்படமாட்டாது.",
-       "api-error-internal-error": "உள்ளகப் பிழை: உங்கள் பதிவேற்றத்தை விக்கியில் செயல்படுத்தும்போது ஏதோ தவறு நேர்ந்துவிட்டது.",
-       "api-error-invalid-file-key": "உள்ளகப் பிழை: தற்காலிகச் சேமிப்பில் கோப்பு காணப்படவில்லை.",
-       "api-error-missingparam": "உள்ளகப் பிழை: கோரிக்கையில் அளபுருக்கள் விடுபடுகின்றன.",
-       "api-error-missingresult": "உள்ளகப் பிழை: நகல் வெற்றியடைந்ததா என்று தீர்மாணிக்க முடியவில்லை.",
-       "api-error-mustbeloggedin": "கோப்புகளைப் பதிவேற்ற நீங்கள் கண்டிப்பாகப் புகுபதிகை செய்திருக்க வேண்டும்.",
-       "api-error-mustbeposted": "உள்ளகப் பிழை: கோரிக்கைக்கு HTTP POST தேவை.",
-       "api-error-noimageinfo": "பதிவேற்றம் வெற்றியடைந்தது, ஆனால் வழங்கி கோப்பைப் பற்றிய எந்த ஒரு தகவலையும் எங்களுக்குத் தரவில்லை.",
-       "api-error-nomodule": "உள்ளகப் பிழை: பதிவேற்றப் பகுதி அமைக்கப்படவில்லை.",
-       "api-error-ok-but-empty": "உள்ளகப் பிழை: வழங்கியிலிருந்து பதில் வரவில்லை",
-       "api-error-overwrite": "ஏற்கனவே உள்ள கோப்பின் மேலெழுதுவது அனுமதிக்கப்படமாட்டாது.",
-       "api-error-stashfailed": "உள்ளகப் பிழை: வழங்கி தற்காலிகக் கோப்பைத் தேக்கத் தவறிவிட்டது.",
        "api-error-publishfailed": "உள்ளகப் பிழை: வழங்கி தற்காலிகக் கோப்பைத் பதிப்பிக்க தவறிவிட்டது.",
-       "api-error-stasherror": "பரணில் ஒரு கோப்பை ஏற்றும் போது பிழை ஏற்பட்டது.",
-       "api-error-stashedfilenotfound": "பரணிலிருந்து கோப்பே ஏற்றும் போது பரணேற்றப்பட்ட கோப்பை காணவில்லை.",
-       "api-error-stashpathinvalid": "பரணேற்றபட்ட கோப்பு காணப்பட வேண்டிய பாதை செல்லாதது.",
-       "api-error-stashfilestorage": "பரணில் ஒரு கோப்பை சேமிக்கும் போது பிழை ஏற்பட்டது.",
-       "api-error-stashzerolength": "வழங்கி கோப்பை பரணேற்ற இயலாது, ஏனெனில் அது சுழி நீளம் கொண்டது.",
-       "api-error-stashnotloggedin": "ஏற்று பரணில் கோப்பை சேமிக்க நீங்கள் புகுபதிய வேண்டும்.",
-       "api-error-stashwrongowner": "நீங்கள் பரணில் அணுக முயற்சிக்கும் கோப்பு உங்களுக்கு உரியதல்ல.",
-       "api-error-stashnosuchfilekey": "நீங்கள் பரணில் அணுக முயற்சிக்கும் கோப்புக் குறி காணக்கிடைக்கவில்லை.",
-       "api-error-timeout": "எதிர்பார்க்கப்பட்ட நேரத்தில் வழங்கி பதிலளிக்கவில்லை.",
-       "api-error-unclassified": "அறியாப் பிழை ஏற்பட்டது",
-       "api-error-unknown-code": "அறியாப் பிழை: \"$1\"",
-       "api-error-unknown-error": "உள்ளகப் பிழை: உங்கள் கோப்பைப் பதிவேற்ற முயல்கையில் ஏதோ தவறு நேர்ந்துவிட்டது.",
+       "api-error-stashfailed": "உள்ளகப் பிழை: வழங்கி தற்காலிகக் கோப்பைத் தேக்கத் தவறிவிட்டது.",
        "api-error-unknown-warning": "அறியப்படா எச்சரிக்கை: \"$1\".",
        "api-error-unknownerror": "அறியப்படாத பிழை: \"$1\".",
-       "api-error-uploaddisabled": "இந்த விக்கியில் பதிவேற்றல் செயலிழக்கச் செய்யப்பட்டுள்ளது.",
-       "api-error-verification-error": "இக்கோப்பு பிழையுடனோ தவறான விரிவுடனோ இருக்கலாம்.",
        "duration-seconds": "$1 {{PLURAL:$1|நொடி|நொடிகள்}}",
        "duration-minutes": "{{PLURAL:$1|நிமிடம்|நிமிடங்கள்}}",
        "duration-hours": "$1 {{PLURAL:$1|மணி|மணிகள்}} முன்பு",
        "pagelang-language": "மொழி",
        "pagelang-use-default": "இயல்பு நிலை மொழி",
        "pagelang-select-lang": "மொழியைத் தேர்ந்தெடு",
+       "pagelang-reason": "காரணம்",
        "pagelang-submit": "சமர்ப்பி",
        "right-pagelang": "பக்க மொழியை மாற்றுக",
        "action-pagelang": "பக்க மொழியை மாற்றுக",
index 9277032..a4911dc 100644 (file)
        "searcharticle": "ಪೋಲೆ",
        "history": "ಪುಟೊತ ಚರಿತ್ರೆ",
        "history_short": "ಇತಿಹಾಸೊ",
+       "history_small": "ಇತಿಹಾಸೊ",
        "updatedmarker": "ಎನ್ನ ಅಕೇರಿದ ವೀಕ್ಷಣೆ ಡ್ದ್ ಬುಕ್ಕ ಆಯಿನ ಬದಲಾವಣೆಲು",
        "printableversion": "ಪ್ರಿಂಟ್ ಆವೃತ್ತಿ",
        "permalink": "ಸ್ತಿರೊ ಕೊಂಡಿ",
        "prefs-rendering": "ಗೋಚರೊ",
        "saveprefs": "ಒರಿಪಾಲೆ",
        "prefs-editing": "ಸಂಪೊಲಿಪು",
-       "rows": "ಸಾಲ್‘ಲು",
-       "columns": "ಸಾಲ್‍ಕುಲು:",
        "searchresultshead": " \nನಾಡ್’ಲೆ",
        "stub-threshold-sample-link": "ಸಾಂಪಲ್",
        "stub-threshold-disabled": "ಕ್ರಿಯೆ ಉಂತ್‍ದ್ಂಡ್",
        "recentchanges-legend-heading": "<strong>ಲೆಜೆಂಡ್:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
        "recentchanges-submit": "ತೋಜಾಲೆ",
+       "rcfilters-filter-userExpLevel-learner-label": "ಕಲ್ಪುನರ್",
        "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
        "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
        "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
-       "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ"
+       "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ",
+       "pagelang-reason": "ಕಾರಣೊ",
+       "mw-widgets-usersmultiselect-placeholder": "ನನಾತ್ ಸೇರಲೇ..."
 }
index d33657c..9fcaacf 100644 (file)
        "may_long": "మే",
        "june": "జూన్",
        "july": "జూలై",
-       "august": "à°\86à°\97à°·్టు",
+       "august": "à°\86à°\97à°¸్టు",
        "september": "సెప్టెంబరు",
        "october": "అక్టోబరు",
        "november": "నవంబరు",
        "broken-file-category": "తెగిపోయిన ఫైలులింకులు గల పేజీలు",
        "about": "గురించి",
        "article": "విషయపు పేజీ",
-       "newwindow": "(à°\95à±\8aà°¤à±\8dà°¤ à°\95à°¿à°\9fà°¿à°\95à±\80లో వస్తుంది)",
+       "newwindow": "(à°\95à±\8aà°¤à±\8dà°¤ à°µà°¿à°\82à°¡à±\8bలో వస్తుంది)",
        "cancel": "రద్దుచేయి",
        "moredotdotdot": "ఇంకా...",
        "morenotlisted": "బహుశా ఈ జాబితా అసంపూర్ణం.",
        "searcharticle": "వెళ్లు",
        "history": "పేజీ చరిత్ర",
        "history_short": "చరిత్ర",
+       "history_small": "చరిత్ర",
        "updatedmarker": "నేను కిందటిసారి వచ్చిన తరువాత జరిగిన మార్పులు",
        "printableversion": "అచ్చుతీయదగ్గ కూర్పు",
        "permalink": "శాశ్వత లంకె",
        "view": "చూపు",
        "view-foreign": "$1 లో చూడండి",
        "edit": "సవరించు",
-       "edit-local": "à°ªà±\8dà°°à°¾à°\82à°¤à±\80à°¯ వివరణని మార్చు",
+       "edit-local": "à°¸à±\8dథానిà°\95 వివరణని మార్చు",
        "create": "సృష్టించు",
-       "create-local": "à°ªà±\8dà°°à°¾à°\82à°¤à±\80à°¯ à°µà°¿à°µà°°à°£à°¨à°¿ చేర్చు",
+       "create-local": "à°¸à±\8dథానిà°\95 à°µà°¿à°µà°°à°£à°¨à±\81 చేర్చు",
        "editthispage": "ఈ పేజీని సవరించండి",
        "create-this-page": "ఈ పేజీని సృష్టించండి",
        "delete": "తొలగించు",
        "deletethispage": "ఈ పేజీని తొలగించండి",
        "undeletethispage": "ఈ పేజీ తొలగింపును ఆపు",
-       "undelete_short": "{{PLURAL:$1|ఒక్క రచన|$1 రచనల}} తొలగింపును రద్దుచెయ్యి",
+       "undelete_short": "{{PLURAL:$1|ఒక మార్పు|$1 మార్పుల}} తొలగింపును రద్దుచెయ్యి",
        "viewdeleted_short": "{{PLURAL:$1|తొలగించిన ఒక మార్పు|$1 తొలగించిన మార్పుల}}ను చూడండి",
        "protect": "సంరక్షించు",
        "protect_change": "మార్చు",
        "views": "చూపులు",
        "toolbox": "పనిముట్లు",
        "tool-link-userrights": "{{GENDER:$1|వాడుకరి}} గుంపులను మార్చు",
+       "tool-link-userrights-readonly": "{{GENDER:$1|వాడుకరి}} గుంపులను చూడండి",
        "tool-link-emailuser": "ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు పంపు",
        "userpage": "వాడుకరి పేజీని చూడండి",
-       "projectpage": "à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81 à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à±\81",
+       "projectpage": "à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81 à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à°\82à°¡à°¿",
        "imagepage": "ఫైలు పేజీని చూడండి",
-       "mediawikipage": "à°¸à°\82à°¦à±\87à°¶à°\82 à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à±\81",
-       "templatepage": "à°®à±\82à°¸ à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à±\81",
-       "viewhelppage": "సహాయà°\82 à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à±\81",
-       "categorypage": "వరà±\8dà°\97à°\82 à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à±\81",
-       "viewtalkpage": "à°\9aà°°à±\8dà°\9aà°¨à±\81 à°\9aà±\82à°¡à±\81",
+       "mediawikipage": "à°¸à°\82à°¦à±\87à°¶à°\82 à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à°\82à°¡à°¿",
+       "templatepage": "à°®à±\82à°¸ à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à°\82à°¡à°¿",
+       "viewhelppage": "సహాయà°\82 à°ªà±\87à°\9cà±\80ని à°\9aà±\82à°¡à°\82à°¡à°¿",
+       "categorypage": "వరà±\8dà°\97à°ªà±\81 à°ªà±\87à°\9cà±\80 à°\9aà±\82à°¡à°\82à°¡à°¿",
+       "viewtalkpage": "à°\9aà°°à±\8dà°\9aà°¨à±\81 à°\9aà±\82à°¡à°\82à°¡à°¿",
        "otherlanguages": "ఇతర భాషలలో",
        "redirectedfrom": "($1 నుండి మళ్ళించబడింది)",
        "redirectpagesub": "దారిమార్పు పేజీ",
-       "redirectto": "దారి à°®à°³à±\8dళిà°\82పు:",
+       "redirectto": "దారి à°®à°¾à°°à±\8dపు:",
        "lastmodifiedat": "ఈ పేజీలో చివరి మార్పు $1 న $2 కు జరిగింది.",
        "viewcount": "ఈ పేజీ {{PLURAL:$1|ఒక్క సారి|$1 సార్లు}} దర్శించబడింది.",
        "protectedpage": "సంరక్షణలోని పేజీ",
        "privacy": "గోప్యతా విధానం",
        "privacypage": "Project:గోప్యతా విధానం",
        "badaccess": "అనుమతి లోపం",
-       "badaccess-group0": "à°®à±\80à°°à±\81 à°\9aà±\87యతలపà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°ªà°¨à°¿à°\95à°¿ à°®à±\80à°\95à±\81 à°¹à°\95à±\8dà°\95à±\81à°²à±\81 à°²à±\87à°µు.",
+       "badaccess-group0": "à°®à±\80à°°à°¡à°¿à°\97à°¿à°¨ à°ªà°¨à°¿ à°\9aà±\87à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°®à±\80à°\95à±\81 à°\85à°¨à±\81మతి à°²à±\87à°¦ు.",
        "badaccess-groups": "మీరు చేయతలపెట్టిన పని ఈ {{PLURAL:$2|గుంపు|గుంపులలో ఒకదాని}} లోని వాడుకర్లకు మాత్రమే పరిమితం: $1.",
        "versionrequired": "మీడియావికీ సాఫ్టువేరు వెర్షను $1 కావాలి",
        "versionrequiredtext": "ఈ పేజీని వాడటానికి మీకు మీడియావికీ సాఫ్టువేరు వెర్షను $1 కావాలి. [[Special:Version|వెర్షను పేజీ]]ని చూడండి.",
        "title-invalid-interwiki": "మీరడిగిన పేజీ శీర్షికలో అంతర వికీ లంకె ఉంది, కానీ అది నిషిద్ధం.",
        "title-invalid-talk-namespace": "మీరడిగిన పేజీ శీర్షిక అసలు సృష్టించే వీలే లేని చర్చా పేజీకి చెందినది.",
        "title-invalid-characters": "కోరబడిన పేజీ శీర్షికలో చెల్లని అక్షరాలున్నాయి : \"$1\".",
-       "title-invalid-relative": "à°¶à±\80à°°à±\8dà°·à°¿à°\95à°²à±\8b à°²à°\82à°\95à±\86 à°ªà°¾à° à±\8dà°¯à°\82 à°¸à°¾à°ªà±\87à°\95à±\8dà°·à°\82à°\97à°¾ à°\89à°\82ది - à°ªà±\82à°°à±\8dతిà°\97à°¾ à°²à±\87à°¦à±\81. à°¸à°¾à°ªà±\87à°\95à±\8dà°· à°ªà±\87à°\9cà±\80 à°\9aà°¿à°°à±\81నామాలà±\81 (./, ../) à°\97à°² à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95à°²à±\81 à°\8eà°\95à±\8dà°\95à±\81వశాతà°\82 à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8b à°\89à°\82à°¡à°µà±\81 à°\95à°¨à±\81à°\95 అవి చెల్లవు.",
-       "title-invalid-magic-tilde": "కోరబడిన పేజీ శీర్షిక పాఠ్యం లో చెల్లని మ్యాజిక్ టిల్డా పదాలున్నాయి (<nowiki>~~~</nowiki>).",
+       "title-invalid-relative": "à°¶à±\80à°°à±\8dà°·à°¿à°\95à°\95à±\81 à°¸à°¾à°ªà±\87à°\95à±\8dà°· à°ªà°¾à°¤à±\8d à°\89à°\82ది. à°¸à°¾à°ªà±\87à°\95à±\8dà°· à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95à°²à±\81 (./, ../) à°µà°¾à°¡à±\81à°\95à°°à°¿ à°¬à±\8dà°°à±\8cà°\9cà°°à±\81à°\95à±\81 à°\8eà°\95à±\8dà°\95à±\81à°µà°\97à°¾ à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8b à°\89à°\82à°¡à°µà±\81 à°\95ాబà°\9fà±\8dà°\9fà°¿, అవి చెల్లవు.",
+       "title-invalid-magic-tilde": "కోరబడిన పేజీ శీర్షిక పాఠ్యంలో చెల్లని మ్యాజిక్ టిల్డె క్రమం ఉంది (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "మీరడిగిన పేజీ శీర్షిక మరీ పొడవుగా ఉంది. ఇది UTF-8 పద్ధతిలో $1 {{PLURAL:$1|బైట్‌|బైట్ల}}కు మించి ఉండరాదు.",
        "title-invalid-leading-colon": "కోరబడిన పేజీ శీర్షిక పాఠ్యం మొదట్లో చెల్లని కొలొన్ చిహ్నం (:) ఉంది.",
        "perfcached": "కింది డేటా ముందే సేకరించి పెట్టుకున్నది. కాబట్టి తాజా డేటాతో పోలిస్తే తేడాలుండవచ్చు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$1|ఒక్క ఫలితం ఉంది|$1 ఫలితాలు ఉన్నాయి}}.",
        "viewsourcetext": "మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు.",
        "viewyourtext": "ఈ పేజీలో <strong>మీరు చేసిన మార్పుల</strong> యొక్క మూలాన్ని చూడవచ్చు, కాపీచేసుకోవచ్చు.",
        "protectedinterface": "ఈ పేజీ, ఈ వికీ యొక్క సాఫ్టువేరు ఇంటరుఫేసుకు చెందిన టెక్స్టును అందిస్తుంది. దుశ్చర్యల నివారణ కోసమై దీన్ని సంరక్షించాం. వికీలన్నిటిలోను అనువాదాలను చేర్చాలన్నా, మార్చాలన్నా మీడియావికీ స్థానికీకరణ ప్రాజెక్టైన [https://translatewiki.net/ translatewiki.net] ను వాడండి.",
-       "editinginterface": "<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95:</strong> à°¸à°¾à°«à±\8dà°\9fà±\81à°µà±\87à°°à±\81à°\95à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°\9fà±\86à°\95à±\8dà°¸à±\8dà°\9fà±\81à°¨à±\81 à°\85à°\82దిà°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°ªà°¨à°¿à°\95à±\8aà°\9aà±\8dà°\9aà±\87 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dà°¦à±\81à°¤à±\81à°¨à±\8dనారà±\81.\nà°\88 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aà±\87à°¸à±\87 à°®à°¾à°°à±\8dà°ªà±\81à°² à°µà°²à±\8dà°² à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°²à°\95à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°\95నబడà±\87 à°µà°¿à°§à°¾à°¨à°\82à°²à±\8b à°¤à±\87డావసà±\8dతుంది.",
+       "editinginterface": "<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95:</strong> à°¸à°¾à°«à±\8dà°\9fà±\81à°µà±\87à°°à±\81à°\95à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°\9fà±\86à°\95à±\8dà°¸à±\8dà°\9fà±\81à°¨à±\81 à°\85à°\82దిà°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°ªà°¨à°¿à°\95à±\8aà°\9aà±\8dà°\9aà±\87 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dà°¦à±\81à°¤à±\81à°¨à±\8dనారà±\81.\nà°\88 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aà±\87à°¸à±\87 à°®à°¾à°°à±\8dà°ªà±\81à°² à°µà°²à±\8dà°² à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°²à°\95à±\81 à°\95నబడà±\87 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°ªà±\8dరభావితమà±\8cతుంది.",
        "translateinterface": "అన్ని వికీలలో కనిపించేలా అనువాదాలు చేర్చాలన్నా, మార్చాలన్నా, దయచేసి [https://translatewiki.net/ translatewiki.net] ను వాడండి. ఇది మీడియావికీ స్థానికీకరణ ప్రాజెక్టు.",
        "cascadeprotected": "కింది {{PLURAL:$1|పేజీని|పేజీలను}} కాస్కేడింగు ఆప్షనుతో సంరక్షించబడింది. ప్రస్తుత పేజీ, ఈ పేజీల్లో ట్రాన్స్‌క్లూడు అయి ఉంది కాబట్టి, దిద్దుబాటు చేసే వీలు లేకుండా ఇది కూడా రక్షణలో ఉంది:\n$2",
        "namespaceprotected": "'''$1''' నేంస్పేసులో మార్పులు చేయటానికి మీకు అనుమతి లేదు.",
        "myprivateinfoprotected": "మీ అంతరంగిక సమాచారాన్ని సవరించేందుకు మీకు అనుమతి లేదు.",
        "mypreferencesprotected": "మీ అభీష్టాలను సవరించేందుకు మీకు అనుమతి లేదు.",
        "ns-specialprotected": "ప్రత్యేక పేజీలపై దిద్దుబాట్లు చేయలేరు.",
-       "titleprotected": "[[User:$1|$1]] ఈ శీర్షికని సృష్టించకుండా ఇది సంరక్షించబడింది.\nఅందుకు ఇచ్చిన కారణం: <em>$2</em>.",
+       "titleprotected": "ఈ శీర్షికను [[User:$1|$1]] సృష్టించకుండా సంరక్షించబడింది.\nఅందుకు ఇచ్చిన కారణం: <em>$2</em>.",
        "filereadonlyerror": "ఫైలు ఖజానా \"$2\" రీడ్-ఓన్లీ స్థితిలో ఉండటం చేత \"$1\" ఫైలులో మార్పులు చెయ్యలేకపోయాం.\n\nదానికి తాళం వేసిన సిస్టము నిర్వాహకుడు ఇచ్చిన వివరణ ఇది: \"$3\".",
        "invalidtitle-knownnamespace": "పేరుబరి \"$2\", పాఠ్యము \"$3\" తో కూడిన ఈ శీర్షిక చెల్లనిది",
        "invalidtitle-unknownnamespace": "అపరిచితమైన పేరుబరి సంఖ్య \"$1\", పాఠ్యము \"$2\" తో కూడిన ఈ శీర్షిక చెల్లనిది",
        "createacct-email-ph": "మీ ఈమెయిలు చిరునామాను ఇవ్వండి",
        "createacct-another-email-ph": "ఈమెయిలు చిరునామాను ఇవ్వండి",
        "createaccountmail": "ఏదో ఒక తాత్కాలిక సంకేతపదాన్ని వాడి దాన్ని పేర్కొన్న ఈమెయిలు చిరునామాకు పంపించు",
+       "createaccountmail-help": "సంకేతపదం తెలుసుకోనవసరం లేకుండా వేరొకరి కోసం ఖాతా సృష్టించేందుకు వాడవచ్చు.",
        "createacct-realname": "అసలు పేరు (ఐచ్చికం)",
        "createaccountreason": "కారణం:",
        "createacct-reason": "కారణం",
        "wrongpassword": "ఈ సంకేతపదం సరైనది కాదు. దయచేసి మళ్లీ ప్రయత్నించండి.",
        "wrongpasswordempty": "ఖాళీ సంకేతపదం ఇచ్చారు. మళ్ళీ ప్రయత్నించండి.",
        "passwordtooshort": "సంకేతపదం కనీసం {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} నిడివి ఉండాలి.",
-       "passwordtoolong": "సంకేతపదంలో {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} కన్నా ఎక్కువ ఉండకూడదు.",
+       "passwordtoolong": "సంకేతపదం పొడవు {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} కన్నా ఎక్కువ ఉండకూడదు.",
        "passwordtoopopular": "మామూలుగా వాడే సంకేతపదాలను వాడే వీల్లేదు. మరింత విశిష్టమైన సంకేతపదాన్ని ఎంచుకోండి.",
        "password-name-match": "మీ సంకేతపదం మీ వాడుకరిపేరుకి భిన్నంగా ఉండాలి.",
        "password-login-forbidden": "ఈ వాడుకరిపేరు మరియు సంకేతపదాలను ఉపయోగించడం నిషిద్ధం.",
        "resetpass_submit": "సంకేతపదాన్ని మార్చి లాగినవండి",
        "changepassword-success": "మీ సంకేతపదం మార్చబడింది!",
        "changepassword-throttled": "కొద్దిసేపటిగా మీరు చాలా లాగిన్ ప్రయత్నాలు చేసారు.\nమళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.",
+       "botpasswords": "బాట్ సంకేతపదాలు",
        "botpasswords-label-appid": "బాట్ పేరు:",
        "botpasswords-label-create": "సృష్టించు",
        "botpasswords-label-update": "తాజాకరించు",
        "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-not-exist": "వాడుకరి \"$1\" కి \"$2\" అనే బాట్ సంకేతపదం లేదు.",
        "resetpass_forbidden": "సంకేతపదాలను మార్చటం కుదరదు",
        "resetpass_forbidden-reason": "సంకేతపదాలు మార్చజాలరు: $1",
        "resetpass-abort-generic": "ఓ పొడిగింత (ఎక్స్టెన్‍షన్) సంకేతపదం మార్పిడిని ఆపేసింది.",
        "resetpass-expired": "మీ సంకేతపదానికి కాలం చెల్లింది. కొత్త సంకేతపదం ఇచ్చి లాగినవండి.",
        "resetpass-expired-soft": "మీ సంకేతపదానికి కాలం చెల్లింది, కాబట్టి కొత్తది ఇవ్వాలి. కొత్తది ఇప్పుడే ఇవ్వండి లేదా \"{{int:authprovider-resetpass-skip-label}}\" నొక్కి, తరువాత మార్చుకోండి.",
-       "resetpass-validity-soft": "à°®à±\80 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿ à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలిà°\82ది:$1\nà°\95à±\8aà°¤à±\8dతది à°\87à°ªà±\8dà°ªà±\81à°¡à±\87 à°\87à°µà±\8dà°µà°\82à°¡à°¿ లేదా \"{{int:authprovider-resetpass-skip-label}}\" నొక్కి, తరువాత మార్చుకోండి.",
+       "resetpass-validity-soft": "à°®à±\80 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿ à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలిà°\82ది:$1\nà°\95à±\8aà°¤à±\8dతది à°\87à°ªà±\8dà°ªà±\81à°¡à±\87 à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿, లేదా \"{{int:authprovider-resetpass-skip-label}}\" నొక్కి, తరువాత మార్చుకోండి.",
        "passwordreset": "సంకేతపదాన్ని మార్చుకోండి",
        "passwordreset-text-one": "ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఈ ఫారమును నింపండి.",
        "passwordreset-text-many": "{{PLURAL:$1|ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఏదో ఒక ఫీల్డును నింపండి.Fill in one of the fields to receive a temporary password via email.}}",
        "passwordreset-emaildisabled": "ఈ వికీలో ఈమెయిలు విశేషాలను అశక్తం చేసాం.",
        "passwordreset-username": "వాడుకరి పేరు:",
        "passwordreset-domain": "డొమైన్:",
-       "passwordreset-capture": "ఈమెయిలు ఎలా ఉంటుందో చూస్తారా?",
-       "passwordreset-capture-help": "ఈ పెట్టెను చెక్ చేస్తే, ఈమెయిలును (తాత్కాలిక సంకేతపదంతో) వాడుకరికి పంపిస్తూనే, మీకూ చూపిస్తాం.",
        "passwordreset-email": "ఈ-మెయిలు చిరునామా:",
        "passwordreset-emailtitle": "{{SITENAME}}లో ఖాతా వివరాలు",
        "passwordreset-emailtext-ip": "ఎవరో (బహుశా మీరే, ఐపీ అడ్రసు $1 నుంచి)  {{SITENAME}} ($4) లో మీ సంకేతపదాన్ని మార్చమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}\nఈ ఈమెయిలు చిరునామాతో అనుసంధింపబడి ఉన్నాయి:\n\n$2\n\n{{PLURAL:$3|ఈ సంకేతపదానికి|ఈ సంకేతపదాలకు}} {{PLURAL:$5|ఒక్కరోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.\nఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.",
        "passwordreset-emailelement": "వాడుకరిపేరు: \n$1\n\nతాత్కాలిక సంకేతపదం: \n$2",
        "passwordreset-emailsentemail": "ఈ ఈమెయిలు చిరునామా మీ ఖాతాకు అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
        "passwordreset-emailsentusername": "ఈ వాడుకరిపేరుకు ఏదైనా ఈమెయిలు చిరునామా అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
-       "passwordreset-emailsent-capture2": "సంకేతపదం మార్పు {{PLURAL:$1|ఈమెయిలును|ఈమెయిళ్ళను}} పంపించాం. {{PLURAL:$1|వాడుకరిపేరు, సంకేతపదాన్ని|వాడుకరిపేర్లు, సంకేతపదాల జాబితాను}} ఇక్కడ చూపించాం.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|వాడుకరికి}} ఈమెయిలు పంపడం విఫలమైంది: $1 {{PLURAL:$3|వాడుకరిపేరు, సంకేతపదాన్ని|వాడుకరిపేర్లు, సంకేతపదాల జాబితాను}} ఇక్కడ చూపించాం.",
        "passwordreset-invalidemail": "తప్పు ఈ-మెయిలు చిరునామా",
        "passwordreset-nodata": "వాడుకరిపేరుగానీ, ఈ-మెయిలు చిరునామా గానీ ఇవ్వలేదు",
        "changeemail": "ఈ-మెయిలు చిరునామా మార్పు లేదా తొలగింపు",
        "bold_tip": "బొద్దు అక్షరాలు",
        "italic_sample": "వాలు పాఠ్యం",
        "italic_tip": "వాలు పాఠ్యం",
-       "link_sample": "లిà°\82à°\95à±\81 పేరు",
-       "link_tip": "à°\85à°\82తరà±\8dà°\97à°¤ à°²à°¿à°\82à°\95à±\81",
+       "link_sample": "à°²à°\82à°\95à±\86 పేరు",
+       "link_tip": "à°\85à°\82తరà±\8dà°\97à°¤ à°²à°\82à°\95à±\86",
        "extlink_sample": "http://www.example.com లింకు పేరు",
        "extlink_tip": "బయటి లింకు (దీనికి ముందు http:// ఇవ్వటం మరువకండి)",
        "headline_sample": "శీర్షిక పాఠ్యం",
        "selfredirect": "<strong>హెచ్చరిక:</strong> మీరు ఈ పేజీని దానికే దారిమార్పు చేస్తున్నారు. బహుశా మీరు తప్పు దారిమార్పును సూచించి ఉండవచ్చు, లేదా మీరు తప్పుడు పేజీని మారుస్తున్నారు. \nమీరు \"{{int:savearticle}}\" ను నొక్కితే దారిమార్పు పేజీ ఖచ్చితంగా సృష్టించబడుతుంది.",
        "missingcommenttext": "కింద ఓ వ్యాఖ్య రాయండి.",
        "missingcommentheader": "<strong>గుర్తు చేస్తున్నాం:</strong> ఈ వ్యాఖ్యకు మీరు విషయం పెట్టలేదు.\n\"{{int:savearticle}}\"ని మళ్ళీ నొక్కితే, అది లేకుండానే మీ మార్పును భద్రపరుస్తాం.",
-       "summary-preview": "సారాంశం మునుజూపు:",
+       "summary-preview": "దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°¸à°¾à°°à°¾à°\82à°¶à°\82 à°®à±\81à°¨à±\81à°\9cà±\82à°ªà±\81:",
        "subject-preview": "విషయపు మునుజూపు:",
        "previewerrortext": "మీ మార్పులు మునుజూపు చూడటంలో తప్పిదమయింది.",
        "blockedtitle": "వాడుకరి నిరోధించబడ్డారు",
        "edit-conflict": "దిద్దుబాటు ఘర్షణ.",
        "edit-no-change": "పాఠ్యంలో మార్పులేమీ చెయ్యలేదు కాబట్టి, మీ మార్పును పట్టించుకోవట్లేదు.",
        "postedit-confirmation-created": "పేజీ సృష్టించబడినది.",
-       "postedit-confirmation-restored": "పేజీ పునసృష్టించబడినది.",
+       "postedit-confirmation-restored": "పేజీని పునస్థాపించాం.",
        "postedit-confirmation-saved": "మీ మార్పు భద్రమయ్యింది.",
        "edit-already-exists": "కొత్త పేజీని సృష్టించలేకపోయాం.\nఅది ఇప్పటికే ఉంది.",
        "defaultmessagetext": "అప్రమేయ సందేశపు పాఠ్యం",
        "revdelete-legend": "సందర్శక నిబంధనలు అమర్చు",
        "revdelete-hide-text": "కూర్పు పాఠ్యం",
        "revdelete-hide-image": "ఫైలులోని విషయాన్ని దాచు",
-       "revdelete-hide-name": "పారామితà±\81లనà±\81, à°²à°\95à±\8dà°·à±\8dయానà±\8dà°¨à±\80 à°¦à°¾à°¯à°¿",
+       "revdelete-hide-name": "పారామితà±\81లనà±\81, à°²à°\95à±\8dà°·à±\8dయానà±\8dà°¨à±\80 à°¦à°¾à°\9aà±\81",
        "revdelete-hide-comment": "దిద్దుబాటు సారాంశం",
        "revdelete-hide-user": "దిద్దుబాటు చేసిన వాడుకరి పేరు/ఐపీ చిరునామా",
        "revdelete-hide-restricted": "డేటాను అందరిలాగే నిర్వాహకులకు కూడా కనబడనివ్వకు",
        "search-interwiki-caption": "సోదర ప్రాజెక్టులు",
        "search-interwiki-default": "$1 నుండి ఫలితాలు:",
        "search-interwiki-more": "(మరిన్ని)",
+       "search-interwiki-more-results": "మరిన్ని ఫలితాలు",
        "search-relatedarticle": "సంబంధించినవి",
        "searchrelated": "సంబంధించినవి",
        "searchall": "అన్నీ",
        "preferences": "అభిరుచులు",
        "mypreferences": "అభిరుచులు",
        "prefs-edits": "దిద్దుబాట్ల సంఖ్య:",
-       "prefsnologintext2": "à°®à±\80 à°\85à°­à°¿à°°à±\81à°\9aà±\81లనà±\81 à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\81à°¨à±\87à°\82à°¦à±\81à°\95à±\81 à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి.",
+       "prefsnologintext2": "à°®à±\80 à°\85à°­à°¿à°°à±\81à°\9aà±\81లనà±\81 à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\81à°¨à±\87à°\82à°¦à±\81à°\95à±\81 à°²à°¾à°\97ినవండి.",
        "prefs-skin": "రూపు",
        "skin-preview": "మునుజూడు",
        "datedefault": "ఏదైనా పరవాలేదు",
        "saveprefs": "భద్రపరచు",
        "restoreprefs": "అప్రమేయ అమరికలను పునఃస్థాపించు (అన్ని విభాగాల్లోనూ)",
        "prefs-editing": "దిద్దుబాట్లు",
-       "rows": "అడ్డు వరుసలు:",
-       "columns": "నిలువు వరుసలు:",
        "searchresultshead": "వెతుకు",
        "stub-threshold": "మొలక లింకు ఫార్మాటింగు కొరకు హద్దు ($1):",
        "stub-threshold-sample-link": "నమూనా",
        "prefs-help-recentchangescount": "ఇది ఇటీవలి మార్పులు, పేజీ చరిత్రలు, మరియు చిట్టాలకు వర్తిస్తుంది.",
        "prefs-help-watchlist-token2": "మీ వీక్షణజాబితా యొక్క జాలవడ్డింపుకు చెందిన రహస్య తాళమిది.\nఈ తాళం తెలిసిన ఎవరైనా మీ వీక్షణజాబితాను చదవగలుగుతారు. అందుచేత దీన్ని ఎవరికీ ఇవ్వకండి.\n[[Special:ResetTokens|దాన్ని మార్చాలంటే ఇక్కడ నొక్కండి]].",
        "savedprefs": "మీ అభిరుచులను భద్రపరిచాం.",
-       "savedrights": "{{GENDER:$1|$1}} à°µà°¾à°¡à±\81à°\95à°°à°¿ à°¹à°\95à±\8dà°\95à±\81లనà±\81 à°­à°¦à±\8dరపరà°\9aà°¾à°\82.",
+       "savedrights": "{{GENDER:$1|$1}} à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\97à±\81à°\82à°ªà±\81à°²à±\81 à°­à°¦à±\8dరమయà±\8dయాయి.",
        "timezonelegend": "కాల మండలం:",
        "localtime": "స్థానిక సమయం:",
        "timezoneuseserverdefault": "వికీ అప్రమేయాన్ని ఉపయోగించు ($1)",
        "youremail": "ఈమెయిలు:",
        "username": "{{GENDER:$1|వాడుకరి పేరు}}:",
        "prefs-memberingroups": "ఈ {{PLURAL:$1|గుంపులో|గుంపులలో}} {{GENDER:$2|సభ్యుడు|సభ్యురాలు}}:",
+       "group-membership-link-with-expiry": "$1 ($2 వరకు)",
        "prefs-registration": "నమోదైన సమయం:",
        "yourrealname": "అసలు పేరు:",
        "yourlanguage": "భాష:",
        "badsig": "సంతకం చెల్లనిది.\nHTML ట్యాగులను ఒకసారి సరిచూసుకోండి.",
        "badsiglength": "మీ సంతకం చాలా పెద్దగా ఉంది.\nఇది తప్పనిసరిగా $1 {{PLURAL:$1|అక్షరం|అక్షరాల}} లోపులోనే ఉండాలి.",
        "yourgender": "మిమ్మల్ని మీరు ఎలా వర్ణించుకుంటారు?",
-       "gender-unknown": "సాఫà±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°®à°¿à°®à±\8dమలà±\8dని à°¸à°\82à°¬à±\8bధిà°\82à°\9aà±\87à°\9fà°ªà±\8dపుడు, వీలైనంతవరకు లింగ తటస్థతను పాటిస్తుంది",
+       "gender-unknown": "సాఫà±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°®à°¿à°®à±\8dమలà±\8dని à°\89దహరిà°\82à°\9aà±\87à°\9fపుడు, వీలైనంతవరకు లింగ తటస్థతను పాటిస్తుంది",
        "gender-male": "అతను వికీ పేజీలను సరిదిద్దుతాడు",
        "gender-female": "ఆమె వికీ పేజీలను సరిదిద్దుతుంది",
        "prefs-help-gender": "ఈ అభిరుచిని అమర్చుకోవడం ఐచ్చికం.\nమిమ్మల్ని సంబోధించేప్పుడూ మిమ్మల్ని పేర్కొనేప్పుడూ వ్యాకరణపరంగా సరైన లింగాన్ని  వాడటానికి ఈ విలువ ఉపయోగపడుతుంది.\nఈ సమాచారం బహిరంగం.",
        "prefswarning-warning": "మీ అభిరుచులలో మీరు చేసిన మార్పులను ఇంకా భద్రపరచలేదు. మీరు \"$1\" ను నొక్కకుండా ఈ పేజీని వదలి వెళ్తే, మీ అభిరుచులు భద్రం కావు.",
        "prefs-tabs-navigation-hint": "చిట్కా: ట్యాబుల జాబితాలో ఓ ట్యాబు నుండి మరోదానికి వెళ్ళేందుకు కుడి ఎడమ బాణాల కీలను వాడవచ్చు.",
        "userrights": "వాడుకరి హక్కుల నిర్వహణ",
-       "userrights-lookup-user": "వాడుకరి సమూహాలను నిర్వహించండి",
+       "userrights-lookup-user": "వాడుకరిని ఎంచుకోండి",
        "userrights-user-editname": "వాడుకరిపేరును ఇవ్వండి:",
-       "editusergroup": "{{GENDER:$1|వాడుకరి}} గుంపులను మార్చు",
-       "editinguser": "{{GENDER:$1|వాడుకరి}} <strong>[[వాడుకరి:$1|$1]]</strong> $2 యొక్క వాడుకరి హక్కులను మారుస్తున్నారు",
-       "userrights-editusergroup": "వాడుకరి సమూహాలను మార్చండి",
+       "editusergroup": "వాడుకరి గుంపులను చూపించు",
+       "editinguser": "{{GENDER:$1|user}} వాడుకరి హక్కులను మారుస్తున్నారు <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-nologin": "వాడుకరి హక్కులను ఇవ్వడానికి మీరు తప్పనిసరిగా ఓ నిర్వాహక ఖాతాతో [[Special:UserLogin|లాగినవ్వాలి]].",
-       "userrights-notallowed": "వాడుకరి హక్కులను చేర్చే మరియు తొలగించే అనుమతి మీకు లేదు.",
        "userrights-changeable-col": "మీరు మార్చదగిన గుంపులు",
        "userrights-unchangeable-col": "మీరు మార్చలేని గుంపులు",
+       "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-conflict": "వాడుకరి హక్కుల మార్పులలో ఘర్షణ! మీ మార్పులను సమీక్షించి, నిర్ధారించండి.",
-       "userrights-removed-self": "మీ హక్కులను మీరు తొలగించుకున్నారు. ఇక, మీరీ పేజీని చూడలేరు.",
        "group": "గుంపు:",
        "group-user": "వాడుకరులు",
        "group-autoconfirmed": "ఆటోమాటిగ్గా నిర్ధారించబడిన వాడుకరులు",
        "right-siteadmin": "డేటాబేసును లాక్, అన్‌లాక్ చెయ్యి",
        "right-override-export-depth": "5 లింకుల లోతు వరకు ఉన్న పేజీలతో సహా, పేజీలను ఎగుమతి చెయ్యి",
        "right-sendemail": "ఇతర వాడుకరులకు ఈ-మెయిలు పంపించడం",
-       "right-passwordreset": "సంకేతపదం మార్పు ఈమెయిళ్ళను చూడడం",
        "right-managechangetags": "డేటాబేసులో [[Special:Tags|ట్యాగుల]]ను సృష్టించడం, తొలగించడం",
        "right-applychangetags": "తన మార్పులతో [[Special:Tags|ట్యాగుల]]ను ఆపాదించడం",
        "right-changetags": "విడి కూర్పులకు, చిట్టా పద్దులకు ఏవైనా [[Special:Tags|ట్యాగుల]]ను చేర్చడం, తొలగించడం",
        "action-upload_by_url": "ఈ ఫైలుని URL చిరునామా నుండి ఎగుమతి చేసే",
        "action-writeapi": "వ్రాసే APIని ఉపయోగించే",
        "action-delete": "ఈ పేజీని తొలగించే",
-       "action-deleterevision": "ఈ కూర్పుని తొలగించే",
-       "action-deletedhistory": "ఈ పేజీ యొక్క తొలగించిన చరిత్రని చూసే",
+       "action-deleterevision": "కూర్పులను తొలగించే",
+       "action-deletelogentry": "చిట్టా పద్దులను తొలగించే",
+       "action-deletedhistory": "పేజీల తొలగించిన చరిత్రని చూసే",
+       "action-deletedtext": "తొలగించిన కూర్పుల పాఠ్యాన్ని చూసే",
        "action-browsearchive": "తొలగించిన పేజీలలో వెతికే",
-       "action-undelete": "à°\88 à°ªà±\87à°\9cà±\80ని పునఃస్థాపించే",
-       "action-suppressrevision": "à°\88 à°¦à°¾à°\9aà°¿à°¨ à°\95à±\82à°°à±\8dà°ªà±\81ని à°¸à°®à±\80à°\95à±\8dà°·à°¿à°\82à°\9aà°¿ పునఃస్థాపించే",
+       "action-undelete": "à°ªà±\87à°\9cà±\80లనà±\81 పునఃస్థాపించే",
+       "action-suppressrevision": "దాà°\9aà°¿à°¨ à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81 à°¸à°®à±\80à°\95à±\8dà°·à°¿à°\82à°\9aà°¿, పునఃస్థాపించే",
        "action-suppressionlog": "ఈ అంతరంగిక చిట్టాను చూసే",
        "action-block": "ఈ వాడుకరిని మార్పులు చేయడం నుండి నిరోధించే",
        "action-protect": "ఈ పేజీకి సంరక్షణా స్థాయిని మార్చే",
        "action-userrights-interwiki": "ఇతర వికీలలో వాడుకరుల యొక్క హక్కులను మార్చే",
        "action-siteadmin": "డాటాబేసుకి తాళం వేసే లేదా తీసే",
        "action-sendemail": "ఈమెయిళ్ళు పంపించే",
+       "action-editmyoptions": "మీ అభిరుచులను మార్చుకునే",
        "action-editmywatchlist": "మీ వీక్షణ జాబితాను సరిదిద్దండి",
        "action-viewmywatchlist": "మీ వీక్షణ జాబితాను చూడండి",
        "action-viewmyprivateinfo": "మీ గోపనీయ సమాచారాన్ని చూడండి",
        "recentchanges-legend-heading": "<strong>సూచిక :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
        "recentchanges-submit": "చూపించు",
+       "rcfilters-filterlist-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-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-newpages-label": "పేజీల సృష్టి",
+       "rcfilters-filter-newpages-description": "కొత్త పేజీలను సృష్టించే దిద్దుబాట్లు.",
+       "rcfilters-filter-categorization-label": "వర్గాల దిద్దుబాట్లు",
+       "rcfilters-filter-logactions-description": "నిర్వాహక పనులు, ఖాతా పనులు, పేజీ తొలగింపులు, ఎక్కింపులు....",
        "rcnotefrom": "<strong>$3, $4</strong> తరువాత జరిగిన {{PLURAL:$5|మార్పు|మార్పులు}} కింద ఇచ్చాం (<strong>$1</strong> దాకా చూపించాం).",
        "rclistfrom": "$3, $2 కు ముందు  జరిగిన మార్పులను చూపించు",
        "rcshowhideminor": "చిన్న మార్పులను $1",
        "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* ఎడమ వైపు మార్జినులో 200 పిక్సెళ్ళ వెడల్పుగల బొమ్మ  మరియు 'ప్రత్యామ్నాయ పాఠ్యం' అన్న వివరణతో గల పెట్టె కోసం  '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ప్రత్యామ్నాయ పాఠ్యం]]</nowiki></code>'''\n* దస్త్రాన్ని చూపించకుండా నేరుగా లింకు ఇవ్వడానికి '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
        "upload-permitted": "అనుమతించబడిన ఫైలు {{PLURAL:$2|రకం|రకాలు}}: $1.",
-       "upload-preferred": "అనుమతించే ఫైలు రకాలు: $1.",
+       "upload-preferred": "అనుమతించే ఫైలు {{PLURAL:$2|రకం|రకాలు}}: $1.",
        "upload-prohibited": "నిషేధించబడిన ఫైలు {{PLURAL:$2|రకం|రకాలు}}: $1.",
        "uploadlogpage": "ఎక్కింపుల చిట్టా",
        "uploadlogpagetext": "ఇటీవల జరిగిన ఫైలు అప్‌లోడుల జాబితా ఇది.\nమరింత దృశ్యాత్మకంగా చూడటం కోసం [[Special:NewFiles|కొత్త ఫైళ్ళ కొలువు]]కు వెళ్ళండి.",
        "file-thumbnail-no": "ఫైలు పేరు <strong>$1</strong> తో మొదలవుతోంది.\nఅది పరిమాణం తగ్గించిన ''(నఖచిత్రం)'' లాగా అనిపిస్తోంది.\nఈ బొమ్మ యొక్క పూర్తి స్పష్టత కూర్పు ఉంటే, దాన్ని ఎగుమతి చెయ్యండి. లేదా ఫైలు పేరును మార్చండి.",
        "fileexists-forbidden": "ఈ పేరుతో ఇప్పటికే ఒక ఫైలు ఉంది, దాన్ని తిరగరాయలేరు.\nమీరు ఇప్పటికీ ఈ ఫైలుని ఎగుమతి చేయాలనుకుంటే, వెనక్కి వెళ్ళి మరో పేరుతో ఎగుమతి చేయండి. [[File:$1|thumb|center|$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-deleted-duplicate": "గతంలో ఈ ఫైలు లాంటిదే ఒక ఫైలుని ([[:$1]]) తొలగించివున్నారు. మీరు దీన్ని తిరిగి ఎక్కించే ముందు ఆ ఫైలు యొక్క తొలగింపు చరిత్రను చూడండి.",
        "file-deleted-duplicate-notitle": "సరిగ్గా ఈ ఫైలునే పోలిన మరో ఫైలును గతంలో తొలగించాం. దాని పేరును అణచిపెట్టాం.\nదాన్ని తిరిగి ఎక్కించే ముందు, పరిస్థితిని సమీక్షించేందుకు గాను, అణచబడిన ఫైళ్ళ డేటాను చూడగలిగే వారిని అడగండి.",
        "uploaddisabledtext": "ఫైళ్ళ ఎక్కింపులను అచేతనం చేసారు.",
        "php-uploaddisabledtext": "PHPలో ఫైలు ఎక్కింపులు అచేతనమై ఉన్నాయి.\nదయచేసి file_uploads అమరికని చూడండి.",
        "uploadscripted": "ఈ ఫైల్లో HTML కోడు గానీ స్క్రిప్టు కోడు గానీ ఉంది. వెబ్ బ్రౌజరు దాన్ని పొరపాటుగా అనువదించే అవకాశం ఉంది.",
-       "uploadscriptednamespace": "ఈ SVG ఫైలులోని పేరుబరి \"$1\" చెల్లనిది",
+       "uploadscriptednamespace": "ఈ SVG ఫైలులోని పేరుబరి \"<nowiki>$1</nowiki>\" చెల్లనిది",
        "uploadinvalidxml": "ఎక్కించిన ఫైలులోని XML ను పార్సు చెయ్యలేకపోయాం.",
        "uploadvirus": "ఈ ఫైలులో వైరస్‌ ఉంది! వివరాలు: $1",
        "uploadjava": "ఇదొక ZIP ఫైలు, ఇందులో ఒక Java .class ఫైలు ఉంది.\nJava ఫైళ్ళ వలన భద్రతకు తూట్లు పడే అవకాశం ఉంది కాబట్టి, వాటిని ఎక్కించడానికి అనుమతి లేదు.",
        "upload-http-error": "ఒక HTTP పొరపాటు జరిగింది: $1",
        "upload-copy-upload-invalid-domain": "ఈ డొమెయిన్ నుంచి కాపీ ఎక్కింపులు కుదరదు.",
        "upload-dialog-button-cancel": "రద్దుచేయి",
+       "upload-dialog-button-back": "వెనుకకు",
        "upload-dialog-button-done": "పూర్తయ్యింది",
        "upload-dialog-button-save": "భద్రపరచు",
        "upload-dialog-button-upload": "ఎక్కించు",
        "backend-fail-read": "దస్త్రము \"$1\" ని చదువలేకపోయాం.",
        "backend-fail-create": "ఫైలు \"$1\" లో రాయలేకపోయాం.",
        "backend-fail-maxsize": "\"$1\" ఫైలు {{PLURAL:$2|ఒక బైట్|$2 బైట్ల}} కంటే పెద్దది కావడం చేత దాన్ని రాయలేకపోయాం.",
-       "backend-fail-readonly": "స్టోరేజి బ్యాక్‍ఎండ్ \"$1\" ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది. దానికి కారణం: \"<em>$2</em>\"",
+       "backend-fail-readonly": "స్టోరేజి బ్యాక్‍ఎండ్ \"$1\" ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది. దానికి కారణం: <em>$2</em>",
        "backend-fail-synced": "ఫైలు \"$1\" అంతర్గత స్టోరేజి బ్యాక్‍ఎండ్లలో అసమ స్థితిలో ఉంది",
        "backend-fail-connect": "స్టోరేజీ బ్యాక్‍ఎండ్ \"$1\" కి కనెక్టు కాలేక పోయాం.",
        "backend-fail-internal": "స్టోరేజీ బ్యాక్‍ఎండ్ \"$1\" లో ఏదో తెలియని లోపం దొర్లింది.",
        "nolicense": "దేన్నీ ఎంచుకోలేదు",
        "licenses-edit": "లైసెన్సు ఎంపికలను సవరించు",
        "license-nopreview": "(మునుజూపు అందుబాటులో లేదు)",
-       "upload_source_url": " (సార్వజనికంగా అందుబాటులో ఉన్న, సరైన URL)",
+       "upload_source_url": "(సరైన, సార్వజనికంగా అందుబాటులో ఉన్న URL నుండి మీరు ఎంచుకున్న ఫైలు)",
        "upload_source_file": "(మీ కంప్యూటరు నుండి ఎంచుకోబడిన దస్త్రం)",
        "listfiles-delete": "తొలగించు",
        "listfiles-summary": "ఈ ప్రత్యేక పేజీ, ఎక్కించిన ఫైళ్ళన్నిటినీ చూపిస్తుంది.",
        "filerevert-legend": "ఫైలును వెనక్కు తీసుకుపో",
        "filerevert-intro": "మీరు '''[[Media:$1|$1]]''' ను [$3, $2 నాటి $4 కూర్పు]కు తీసుకు వెళ్తున్నారు.",
        "filerevert-comment": "కారణం:",
-       "filerevert-defaultcomment": "$2, $1 నాటి కూర్పుకు తీసుకువెళ్ళాం",
+       "filerevert-defaultcomment": "$2, $1 ($3) నాటి కూర్పుకు తీసుకువెళ్ళాం",
        "filerevert-submit": "వెనక్కు తీసుకువెళ్ళు",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> ను  [$4 $2 $3 నాటి కూర్పు]కు తీసుకువెళ్ళాం.",
        "filerevert-badversion": "మీరిచ్చిన టైముస్టాంపుతో ఈ ఫైలుకు స్థానిక కూర్పేమీ లేదు.",
        "apisandbox-dynamic-error-exists": "\"$1\" అనే పరామితి ఇప్పటికే ఉంది.",
        "apisandbox-results": "ఫలితాలు",
        "apisandbox-request-url-label": "అభ్యర్థన URL:",
-       "apisandbox-request-time": "అభ్యర్ధన సమయం: $1",
+       "apisandbox-request-time": "అభ్యర్ధన సమయం: {{PLURAL:$1|$1 మి.సె.}}",
+       "apisandbox-continue": "కొనసాగించు",
+       "apisandbox-continue-clear": "తుడిచివేయి",
+       "apisandbox-multivalue-all-namespaces": "$1 (అన్ని పేరుబరులు)",
+       "apisandbox-multivalue-all-values": "$1 (అన్ని విలువలు)",
        "booksources": "పుస్తక మూలాలు",
        "booksources-search-legend": "పుస్తక మూలాల కోసం వెతుకు",
        "booksources-search": "వెతుకు",
        "log-title-wildcard": "ఈ పాఠ్యంతో మొదలయ్యే పుస్తకాల కొరకు వెతుకు",
        "showhideselectedlogentries": "ఎంచుకున్న చిట్టా పద్దులను చూపించు/దాచు",
        "log-edit-tags": "ఎంచుకున్న చిట్టా ప్రవేశాల ట్యాగులను సవరించు",
+       "checkbox-select": "ఎంచుకోండి: $1",
        "checkbox-all": "అన్నీ",
        "checkbox-none": "దేన్నీ వద్దు",
        "checkbox-invert": "తిరగవెయ్యి",
        "emailccsubject": "$1 కు మీరు పంపిన సందేశపు ప్రతి: $2",
        "emailsent": "ఈ-మెయిలు పంపించాం",
        "emailsenttext": "మీ ఈ-మెయిలు సందేశం పంపబడింది.",
-       "emailuserfooter": "ఈ ఈ-మెయిలుని $2 కి {{SITENAME}} లోని \"వాడుకరికి ఈమెయిలు\" అనే సౌలభ్యం ద్వారా $1 పంపించారు.",
+       "emailuserfooter": "ఈ ఈమెయిలును  $1, {{GENDER:$2|$2}} కు {{SITENAME}} లోని \"{{int:emailuser}}\" ఫంక్షను ద్వారా {{GENDER:$1|పంపించారు}}. {{GENDER:$2|మీరు}} ఈ ఈమెయిలుకు జవాబు పంపిస్తే, {{GENDER:$2|మీ}} మెయిలును నేరుగా {{GENDER:$1|ఒరిజినల్ సెండరుకు}} పంపిస్తాం. దీనితో, {{GENDER:$2|మీ}} ఈమెయిలు అడ్రసు {{GENDER:$1|వారికి}} తెలిసిపోతుంది.",
        "usermessage-summary": "వ్యవస్థ సందేశాన్ని వదిలివేస్తున్నాం.",
        "usermessage-editor": "వ్యవస్థ సందేశకులు",
        "watchlist": "వీక్షణ జాబితా",
        "mywatchlist": "వీక్షణ జాబితా",
        "watchlistfor2": "$1 కొరకు $2",
        "nowatchlist": "మీ వీక్షణ జాబితా ఖాళీగా ఉంది.",
-       "watchlistanontext": "à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా à°²à±\8bని à°\85à°\82శాలనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°²à±\87దా à°®à°¾à°°à±\8dà°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°®à±\80à°°à±\81 $1.",
+       "watchlistanontext": "à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా à°²à±\8bని à°\85à°\82శాలనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°²à±\87దా à°®à°¾à°°à±\8dà°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°²à°¾à°\97ినవà°\82à°¡à°¿.",
        "watchnologin": "లాగిన్‌ అయిలేరు",
        "addwatch": "వీక్షణ జాబితాలో చేర్చు",
-       "addedwatchtext": "\"[[:$1]]\" అనే పుట మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేరింది.\nభవిష్యత్తులో ఈ పుటకి మరియు సంబంధిత చర్చాపుటకి జరిగే మార్పులు అక్కడ కనిపిస్తాయి.",
+       "addedwatchtext": "\"[[:$1]]\" అనే పేజీని, దాని చర్చ పేజీనీ మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేర్చాం.",
+       "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": "ఈ పుట మీద కన్నేసి ఉంచు",
        "watchlist-details": "మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}, చర్చా పేజీలని వదిలేసి.",
        "wlheader-enotif": "ఈ-మెయిలు గమనికలు పంపబడతాయి.",
        "wlheader-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.",
-       "wlnote": "$3 నాడు $4 సమయానికి, గడచిన {{PLURAL:$2|గంటలో|'''$2''' గంటలలో}} జరిగిన {{PLURAL:$1|ఒక్క మార్పు కింద ఉంది|'''$1''' మార్పులు కింద ఉన్నాయి}}.",
+       "wlnote": "$3, $4 ల సమయానికి, అంతకు ముందరి {{PLURAL:$2|గంటలో|<strong>$2</strong> గంటల్లో}} జరిగిన {{PLURAL:$1|మార్పును|<strong>$1</strong> మార్పులను}} కింద ఇచ్చాం.",
        "wlshowlast": "గత $1 గంటల $2 రోజులకు చూపించు",
        "watchlist-hide": "దాచు",
        "watchlist-submit": "చూపించు",
        "wlshowhidebots": "బాట్‌లు",
        "wlshowhideliu": "నమోదైన వాడుకరులు",
        "wlshowhideanons": "అజ్ఞాత వాడుకరులు",
+       "wlshowhidepatr": "నిఘాలో ఉన్న మార్పులు",
        "wlshowhidemine": "నా మార్పులు",
        "wlshowhidecategorization": "పేజీ వర్గీకరణ",
        "watchlist-options": "వీక్షణ జాబితా ఎంపికలు",
        "deletepage": "పేజీని తొలగించు",
        "confirm": "ధృవీకరించు",
        "excontent": "ఉన్న విషయ సంగ్రహం: '$1'",
-       "excontentauthor": "à°\89à°¨à±\8dà°¨ à°µà°¿à°·à°¯ à°¸à°\82à°\97à±\8dà°°à°¹à°\82: \"$1\" (మరియà±\81 à°¦à±\80ని à°\92à°\95à±\87 à°\92à°\95à±\8dà°\95 à°°à°\9aయిత \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "à°\89à°¨à±\8dà°¨ à°ªà°¾à° à±\8dà°¯à°\82: \"$1\", à°\89à°¨à±\8dà°¨ à°\92à°\95à±\87 à°\92à°\95à±\8dà°\95 à°°à°\9aయిత: \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|à°\9aà°°à±\8dà°\9a]])",
        "exbeforeblank": "ఖాళీ చెయ్యకముందు పేజీలో ఉన్న విషయ సంగ్రహం: '$1'",
        "delete-confirm": "\"$1\"ని తొలగించు",
        "delete-legend": "తొలగించు",
        "rollback-success": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం.",
        "sessionfailure-title": "సెషను వైఫల్యం",
        "sessionfailure": "మీ ప్రవేశపు సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\n\"back\" కొట్టి, ఎక్కడి నుండి వచ్చారో ఆ పేజీని మళ్ళీ లోడు చేసి, తిరిగి ప్రయత్నించండి.",
+       "changecontentmodel-legend": "కంటెంటు మోడల్‌ మార్పు",
+       "changecontentmodel-title-label": "పేజీ శీర్షిక",
+       "changecontentmodel-model-label": "కొత్త కంటెంటు మోడల్",
        "changecontentmodel-reason-label": "కారణం:",
        "changecontentmodel-submit": "మార్చు",
+       "changecontentmodel-success-title": "కంటెంటు మోడల్‌ను మార్చాం",
+       "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, పేజీ $3 ను డిఫాల్టు కాని కంటెంటు మోడలు \"$5\" తో {{GENDER:$2|సృష్టించారు}}",
+       "logentry-contentmodel-change": "$1 పేజీ $3 యొక్క కంటెంటు మోడలును \"$4\" నుండి \"$5\" కు {{GENDER:$2|మార్చారు}}",
+       "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": "\"[[$1]]\" యొక్క {{GENDER:$2|సంరక్షణ స్థాయిని మార్చారు}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షణ నుండి తీసివేసారు}}",
        "protect-title": "\"$1\" యొక్క సంరక్షణ స్థాయి అమర్పు",
        "protect-title-notallowed": "\"$1\" యొక్క సంరక్షణ స్థాయి",
        "prot_1movedto2": "$1, $2కు తరలించబడింది",
        "protect-locked-blocked": "నిరోధించబడి ఉండగా మీరు సంరక్షణ స్థాయిని మార్చలేరు. ప్రస్తుతం '''$1''' పేజీకి ఉన్న సెట్టింగులివి:",
        "protect-locked-dblock": "ప్రస్తుతం అమల్లో ఉన్న డేటాబేసు లాకు కారణంగా సంరక్షణ స్థాయిని సెట్ చెయ్యడం కుదరదు. ప్రస్తుతం '''$1''' పేజీకి ఉన్న సెట్టింగులివి:",
        "protect-locked-access": "మీ ఖాతకు పేజీ రక్షన స్థాయిని మార్చే హక్కులు లేవు.\n'''$1''' అనే పేరున్న ఈ పేజీకి ప్రస్తుతం ఈ రక్షణ ఉంది:",
-       "protect-cascadeon": "ఈ పేజీ కాస్కేడింగు రక్షణలో ఉన్న ఈ కింది {{PLURAL:$1|పేజీకి|పేజీలకు}} జతచేయటం వలన, ప్రస్తుతం రక్షణలో ఉంది.  మీరు ఈ పేజీ యొక్క రక్షణ స్థాయిన మార్చవచ్చు, దాని వలన కాస్కేడింగు రక్షణకు ఎటువంటి సమస్య ఉండదు.",
+       "protect-cascadeon": "ఈ పేజీ, కాస్కేడింగు రక్షణలో ఉన్న {{PLURAL:$1|పేజీలో|పేజీల్లో}} ట్రాన్స్‌క్లూడు అయి ఉంది కాబట్టి, ప్రస్తుతం ఇది కూడా సంరక్షణలో ఉంది.\nఈ పేజీ సంరక్షణ స్థాయిలో చేసే మార్పులు కాస్కేడింగు సంరక్షణను ప్రభావితం చెయ్యవు.",
        "protect-default": "అందరు వాడుకరులను అనుమతించు",
        "protect-fallback": "\"$1\" అనుమతి ఉన్న వాడుకరులను మాత్రమే అనుమతించు",
        "protect-level-autoconfirmed": "స్వయన్నిర్ధారిత వాడుకరులను మాత్రమే అనుమతించు",
        "undeletepagetext": "క్రింది {{PLURAL:$1|పేజీని|$1 పేజీలను}} తొలగించారు, కానీ పునఃస్థాపనకు వీలుగా భండాగారంలో ఉన్నాయి.\nభండాగారం నిర్ణీత వ్యవధులలో పూర్తిగా ఖాళీ చేయబడుతుంటుంది.",
        "undelete-fieldset-title": "కూర్పులను పునఃస్థాపించండి",
        "undeleteextrahelp": "పేజీ యొక్క మొత్తం చరిత్రను పునస్థాపించేందుకు, చెక్ బాక్సులన్నిటినీ ఖాళీగా ఉంచి, '''''{{int:undeletebtn}}''''' నొక్కండి.\nకొన్ని కూర్పులను మాత్రమే పుసస్థాపించదలిస్తే, సదరు కూర్పులకు ఎదురుగా ఉన్న చెక్ బాక్సులలో టిక్కు పెట్టి, '''''{{int:undeletebtn}}''''' నొక్కండి.",
-       "undeleterevisions": "$1 {{PLURAL:$1|కూర్పును|కూర్పులను}} భాండారానికి చేర్చాం",
+       "undeleterevisions": "$1, {{PLURAL:$1|కూర్పును|కూర్పులను}} తొలగించారు",
        "undeletehistory": "పేజీని పునఃస్థాపిస్తే, అన్ని సంచికలూ పేజీచరిత్ర దినచర్యలోకి పునఃస్థాపించబడతాయి.\nతుడిచివేయబడిన తరువాత, అదే పేరుతో వేరే పేజీ సృష్టించబడి ఉంటే, పునఃస్థాపించిన సంచికలు ముందరి చరిత్రలోకి వెళ్తాయి.",
        "undeleterevdel": "తొలగింపును రద్దు చేస్తున్నప్పుడు, అన్నిటికంటే పైనున్న కూర్పు పాక్షికంగా తొలగింపబడే పక్షంలో తొలగింపు-రద్దు జరగదు. అటువంటి సందర్భాల్లో, తొలగించిన కూర్పులలో కొత్తవాటిని ఎంచుకోకుండా ఉండాలి, లేదా దాపు నుండి తీసెయ్యాలి.",
        "undeletehistorynoadmin": "ఈ పుటని తొలగించివున్నారు.\nతొలగింపునకు కారణం, తొలగింపునకు క్రితం ఈ పుటకి మార్పులు చేసిన వాడుకరుల వివరాలతో సహా, ఈ కింద సారాంశంలో చూపబడింది.\nతొలగించిన కూర్పులలోని వాస్తవ పాఠ్యం నిర్వాహకులకు మాత్రమే అందుబాటులో ఉంటుంది.",
        "contributions": "{{GENDER:$1|వాడుకరి}} రచనలు",
        "contributions-title": "$1 యొక్క మార్పులు-చేర్పులు",
        "mycontris": "నా మార్పులు",
-       "anoncontribs": "à°¯à±\8bà°\97దానములు",
+       "anoncontribs": "మారà±\8dà°ªà±\81à°\9aà±\87à°°à±\8dà°ªులు",
        "contribsub2": "{{GENDER:$3|$1}} ($2) కొరకు",
        "contributions-userdoesnotexist": "వాడుకరి ఖాతా \"$1\" నమోదుకాలేదు.",
        "nocontribs": "ఈ విధమైన మార్పులేమీ దొరకలేదు.",
        "sp-contributions-username": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
        "sp-contributions-toponly": "చిట్టచివరి కూర్పులను మాత్రమే చూపించు",
        "sp-contributions-newonly": "పేజీని సృష్టించిన మార్పులను మాత్రమే చూపించు",
+       "sp-contributions-hideminor": "చిన్న మార్పులను దాచు",
        "sp-contributions-submit": "వెతుకు",
        "whatlinkshere": "ఇక్కడికి లింకైనవి",
        "whatlinkshere-title": "\"$1\"కి లింకున్న పుటలు",
        "whatlinkshere-hideredirs": "$1 దారిమార్పులు",
        "whatlinkshere-hidetrans": "$1 ట్రాన్స్‌క్లూజన్లు",
        "whatlinkshere-hidelinks": "$1 లింకులు",
-       "whatlinkshere-hideimages": "$1 à°¦à°¸à±\8dà°¤à±\8dరాల లంకెలు",
+       "whatlinkshere-hideimages": "$1 à°¦à°¸à±\8dà°¤à±\8dà°°à°ªà±\81 లంకెలు",
        "whatlinkshere-filters": "వడపోతలు",
        "whatlinkshere-submit": "వెళ్ళు",
        "autoblockid": "tanaDDu #$1",
        "unblock": "వాడుకరిపై నిరోధాన్ని తీసెయ్యండి",
        "blockip": "{{GENDER:$1|వాడుకరిని}} నిరోధించు",
        "blockip-legend": "వాడుకరి నిరోధం",
-       "blockiptext": "ఏదైనా ప్రత్యేక ఐపీ చిరునామానో లేదా వాడుకరిపేరునో రచనలు చెయ్యకుండా నిరోధించాలంటే కింది ఫారాన్ని వాడండి.\nకేవలం దుశ్చర్యల నివారణ కోసం మాత్రమే దీన్ని వాడాలి, అదికూడా [[{{MediaWiki:Policy-url}}|విధానాన్ని]] అనుసరించి మాత్రమే.\nస్పష్టమైన కారణాన్ని కింద రాయండి (ఉదాహరణకు, దుశ్చర్యలకు పాల్పడిన పేజీలను ఉదహరించండి).",
+       "blockiptext": "ఏదైనా ప్రత్యేక ఐపీ చిరునామానో లేదా వాడుకరిపేరునో రచనలు చెయ్యకుండా నిరోధించాలంటే కింది ఫారాన్ని వాడండి.\nకేవలం దుశ్చర్యల నివారణ కోసం మాత్రమే దీన్ని వాడాలి, అదికూడా [[{{MediaWiki:Policy-url}}|విధానాన్ని]] అనుసరించి మాత్రమే.\nస్పష్టమైన కారణాన్ని కింద రాయండి (ఉదాహరణకు, దుశ్చర్యలకు పాల్పడిన పేజీలను ఉదహరించండి).\n[https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] సిన్‌టాక్సును వాడి ఐపీ అడ్రసు శ్రేణిని నిరోధించవచ్చు; అనుమతించబడ్డ అతిపెద్ద శ్రేణి: IPv4 కు /$1, IPv6 కు /$2.",
        "ipaddressorusername": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
        "ipbexpiry": "అంతమయ్యే గడువు",
        "ipbreason": "కారణం:",
        "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": "నిరోధిత వాడుకరులు",
        "ipblocklist": "నిరోధించబడిన వాడుకరులు",
        "ipblocklist-legend": "నిరోధించబడిన వాడుకరిని వెతకండి",
        "reblock-logentry": "[[$1]] కై నిరోధపు అమరికలను $2 $3 గడువుతో మార్చారు",
        "blocklogtext": "వాడుకరుల నిరోధాలు, పునస్థాపనల చిట్టా ఇది. \nఆటోమాటిక్‌గా నిరోధానికి గురైన ఐ.పి. చిరునామాలు ఈ జాబితాలో ఉండవు. \nప్రస్తుతం అమల్లో ఉన్న నిరోధాలు, నిషేధాల కొరకు [[Special:BlockList|నిరోధాల జాబితా]]ను చూడండి.",
        "unblocklogentry": "$1పై నిరోధం తొలగించబడింది",
-       "block-log-flags-anononly": "à°\85à°\9cà±\8dà°\9eాత à°µà°¾à°¡à±\81à°\95à°°à±\8dలు మాత్రమే",
+       "block-log-flags-anononly": "à°\85à°\9cà±\8dà°\9eాత à°µà°¾à°¡à±\81à°\95à°°à±\81లు మాత్రమే",
        "block-log-flags-nocreate": "ఖాతా సృష్టించడాన్ని అశక్తం చేసాం",
        "block-log-flags-noautoblock": "ఆటోమాటిక్ నిరోధాన్ని అశక్తం చేసాం",
        "block-log-flags-noemail": "ఈ-మెయిలుని నిరోధించాం",
        "lockedbyandtime": "($2 న $3 వద్ద {{GENDER:$1|$1}} ద్వారా)",
        "move-page": "$1 తరలింపు",
        "move-page-legend": "పేజీని తరలించు",
-       "movepagetext": "à°\95à°¿à°\82ది à°«à°¾à°°à°\82 à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿, à°\93 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°µà°\9aà±\8dà°\9aà±\81. à°¦à°¾à°\82à°¤à±\8b à°ªà°¾à°\9fà±\81 à°¦à°¾à°¨à°¿ à°\9aà°°à°¿à°¤à±\8dà°° à°\85à°\82తా à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°\9cà±\80 à°\9aà°°à°¿à°¤à±\8dà°°à°\97à°¾ à°®à°¾à°°à±\81à°¤à±\81à°\82ది.\nపాత à°ªà±\87à°\9cà±\80 à°\95à±\8aà°¤à±\8dà°¤ à°¦à°¾à°¨à°¿à°\95à°¿ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80 à°\85à°µà±\81à°¤à±\81à°\82ది.\nపాత à°ªà±\87à°\9cà±\80à°\95à°¿ à°\89à°¨à±\8dà°¨ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80లనà±\81 à°\86à°\9fà±\8bà°®à±\86à°\9fà°¿à°\97à±\8dà°\97à°¾ à°¸à°°à°¿à°\9aà±\87యవà°\9aà±\8dà°\9aà±\81.\nà°\86లా à°\9aà±\87యవదà±\8dదనà±\81à°\95à±\81à°\82à°\9fà±\87, [[Special:DoubleRedirects|à°\9cమిలి]] à°²à±\87దా [[Special:BrokenRedirects|పనిà°\9aà±\87యని à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81]] à°\89à°¨à±\8dనాయà±\87à°®à±\8b à°¸à°°à°¿à°\9aà±\82à°¸à±\81à°\95à±\8bà°\82à°¡à°¿.\nలిà°\82à°\95à±\81లనà±\8dà°¨à±\80 à°\85à°¨à±\81à°\95à±\81à°¨à±\8dà°¨à°\9fà±\8dà°²à±\81à°\97à°¾ à°\9aà±\87రవలసిన à°\9aà±\8bà°\9fà°¿à°\95à±\87 à°\9aà±\87à°°à±\81à°¤à±\81à°¨à±\8dనాయని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\8bవలసిన à°¬à°¾à°§à±\8dయత à°®à±\80à°¦à±\87.\n\nà°\92à°\95à°µà±\87à°³ à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¤à±\8b à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\92à°\95 à°ªà±\87à°\9cà±\80 à°\89à°\82à°¡à°¿ à°\89à°\82à°\9fà±\87 (à°\85ది à°\97à°¤ à°®à°¾à°°à±\8dà°ªà±\81à°² à°\9aà°°à°¿à°¤à±\8dà°° à°²à±\87ని à°\96ాళà±\80 à°ªà±\87à°\9cà±\80à°¨à±\8b à°²à±\87దా à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80à°¨à±\8b à°\95à°¾à°\95à°ªà±\8bà°¤à±\87) à°¤à°°à°²à°¿à°\82à°ªà±\81 '''à°\9cà°°à°\97à°¦à±\81'''.\nà°\85à°\82à°\9fà±\87 à°®à±\80à°°à±\81 à°ªà±\8aరపాà°\9fà±\81 à°\9aà±\87à°¸à±\8dà°¤à±\87 à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¨à±\81 à°®à°¾à°°à±\8dà°\9aà°¿ à°¤à°¿à°°à°¿à°\97à°¿ à°ªà°¾à°¤ à°ªà±\87à°°à±\81à°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\81à°°à°¾à°\97లరà±\81 à°\95ానà±\80 à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°µà±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80ని à°¤à±\81à°¡à°¿à°\9aà°¿à°µà±\87యలà±\87à°°à±\81.\n\n<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95!</strong>\nà°\87ది à°\9cనరà°\82à°\9cà°\95à°®à±\88à°¨ à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°\85à°¨à±\81à°\95à±\8bని, à°¤à±\80à°µà±\8dà°°à°®à±\88à°¨ à°®à°¾à°°à±\8dà°ªà±\81 à°\95ావà°\9aà±\8dà°\9aà±\81;\nదాని à°ªà°°à°¿à°£à°¾à°®à°¾à°²à°¨à±\81 à°\85à°°à±\8dà°§à°\82 à°\9aà±\87à°¸à±\81à°\95à±\81ని à°®à±\81à°\82à°¦à±\81à°\95à±\81సాగండి.",
-       "movepagetext-noredirectfixer": "కింది ఫారాన్ని వాడి, ఓ పేజీ పేరు మార్చవచ్చు. దాని చరిత్ర పూర్తిగా కొత్త పేరుకు తరలిపోతుంది. \nపాత శీర్షిక కొత్తదానికి దారిమార్పు పేజీగా మారిపోతుంది.\n[[Special:DoubleRedirects|double]] లేదా [[Special:BrokenRedirects|broken redirects]] లను చూడటం మరువకండి.\nలింకులు వెళ్ళాల్సిన చోటికి వెళ్తున్నాయని నిర్ధారించుకోవాల్సిన బాధ్యత మీదే.\nకొత్త పేరుతో ఈసరికే ఏదైనా పేజీ ఉంటే - అది ఖాళీగా ఉన్నా లేక మార్పుచేర్పుల చరిత్ర ఏమీ లేని దారిమార్పు పేజీ అయినా తప్ప- తరలింపు ’’’జరుగదు’’’ అని గమనించండి.\nఅంటే, ఏదైనా పొరపాటు జరిగితే పేరును తిరిగి పాత పేరుకే మార్చగలరు తప్ప, ఈపాటికే ఉన్న పేజీపై ఓవరరైటు చెయ్యలేరు.\n\n'''హెచ్చరిక!'''\nబహుళ వ్యాప్తి పొందిన ఓ పేజీలో ఈ మార్పు చాలా తీవ్రమైనది, ఊహించనిదీ అవుతుంది.\nదాని పర్యవసానాలు అర్థం చేసుకున్నాకే ముందుకు వెళ్ళండి.",
-       "movepagetalktext": "దానితà±\8b à°ªà°¾à°\9fà±\81 à°¸à°\82à°¬à°\82ధిత à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80 à°\95à±\82à°¡à°¾ à°\86à°\9fà±\8bమాà°\9fà°¿à°\95à±\8dâ\80\8câ\80\8cà°\97à°¾ à°¤à°°à°²à°¿à°\82à°\9aబడà±\81à°¤à±\81à°\82ది, '''à°\95à°¿à°\82ది à°¸à°\82దరà±\8dభాలలà±\8b à°¤à°ªà±\8dà°ª:'''\n*à°\92à°\95 à°¨à±\87à°\82à°¸à±\8dà°ªà±\87à°¸à±\81 à°¨à±\81à°\82à°¡à°¿ à°\87à°\82à°\95à±\8bదానిà°\95à°¿ à°¤à°°à°²à°¿à°\82à°\9aà±\87à°\9fà°ªà±\81à°¡à±\81,\n*à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¤à±\8b à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\92à°\95 à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80 à°\89à°\82à°\9fà±\87,\n*à°\95à°¿à°\82ది à°\9aà±\86à°\95à±\8dâ\80\8cబాà°\95à±\8dà°¸à±\81à°²à±\8b à°\9fà°¿à°\95à±\8dà°\95à±\81 à°ªà±\86à°\9fà±\8dà°\9fà°\95à°ªà±\8bà°¤à±\87.\n\nà°\86 à°¸à°\82దరà±\8dభాలలà±\8b, à°®à±\80à°°à±\81 à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80ని à°\95à±\82à°¡à°¾ à°ªà°¨à°¿à°\97à°\9fà±\8dà°\9fà±\81à°\95à±\81ని à°¤à°°à°²à°¿à°\82à°\9aవలసి à°\89à°\82à°\9fà±\81à°\82ది, à°²à±\87దా à°\8fà°\95à±\80à°\95à±\83à°¤ à°ªà°°à°\9aవలసి ఉంటుంది.",
+       "movepagetext": "à°\95à°¿à°\82ది à°«à°¾à°°à°¾à°¨à±\8dని à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿, à°\93 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°µà°\9aà±\8dà°\9aà±\81. à°¦à°¾à°¨à°¿ à°\9aà°°à°¿à°¤à±\8dà°° à°ªà±\82à°°à±\8dతిà°\97à°¾ à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°\95à±\81 à°¤à°°à°²à°¿à°ªà±\8bà°¤à±\81à°\82ది. \nపాత à°¶à±\80à°°à±\8dà°·à°¿à°\95, à°\95à±\8aà°¤à±\8dతదానిà°\95à°¿ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80à°\97à°¾ à°®à°¾à°°à°¿à°ªà±\8bà°¤à±\81à°\82ది.\nపాత à°ªà±\87à°\9cà±\80à°\95à°¿ à°\89à°¨à±\8dà°¨ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80లనà±\81 à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¸à°°à°¿à°\9aà±\87యవà°\9aà±\8dà°\9aà±\81.\nà°\86లా à°\9aà±\87యవదà±\8dదనà±\81à°\95à±\81à°\82à°\9fà±\87, [[Special:DoubleRedirects|à°\9cమిలి]] à°²à±\87దా [[Special:BrokenRedirects|పనిà°\9aà±\87యని à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81]] à°\89à°¨à±\8dనాయà±\87à°®à±\8b à°¸à°°à°¿à°\9aà±\82à°¸à±\81à°\95à±\8bà°\82à°¡à°¿.\nలిà°\82à°\95à±\81à°²à±\81 à°µà±\86à°³à±\8dళాలà±\8dసిన à°\9aà±\8bà°\9fà°¿à°\95à°¿ à°µà±\86à°³à±\8dà°¤à±\81à°¨à±\8dనాయని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\8bవాలà±\8dసిన à°¬à°¾à°§à±\8dయత à°®à±\80à°¦à±\87.\n\nà°\92à°\95à°µà±\87à°³ à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¤à±\8b à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\92à°\95 à°ªà±\87à°\9cà±\80 à°\89à°\82à°¡à°¿ à°\89à°\82à°\9fà±\87 (à°\85ది à°\97à°¤ à°®à°¾à°°à±\8dà°ªà±\81à°² à°\9aà°°à°¿à°¤à±\8dà°° à°²à±\87ని à°\96ాళà±\80 à°ªà±\87à°\9cà±\80à°¨à±\8b à°²à±\87దా à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80à°¨à±\8b à°\95à°¾à°\95à°ªà±\8bà°¤à±\87) à°¤à°°à°²à°¿à°\82à°ªà±\81 '''à°\9cà°°à°\97à°¦à±\81'''.\nà°\85à°\82à°\9fà±\87 à°®à±\80à°°à±\81 à°ªà±\8aరపాà°\9fà±\81 à°\9aà±\87à°¸à±\8dà°¤à±\87 à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¨à±\81 à°®à°¾à°°à±\8dà°\9aà°¿ à°¤à°¿à°°à°¿à°\97à°¿ à°ªà°¾à°¤ à°ªà±\87à°°à±\81à°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\81à°°à°¾à°\97లరà±\81 à°\97ానà±\80, à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°µà±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80ని à°¤à±\81à°¡à°¿à°\9aà°¿à°µà±\87యలà±\87à°°à±\81.\n\n<strong>à°\97మనిà°\95!</strong>\nà°\9cనరà°\82à°\9cà°\95à°®à±\88à°¨ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\87ది à°\85à°¨à±\81à°\95à±\8bని, à°¤à±\80à°µà±\8dà°°à°®à±\88à°¨ à°®à°¾à°°à±\8dà°ªà±\81 à°\95ావà°\9aà±\8dà°\9aà±\81;\nదాని à°ªà°°à°¿à°£à°¾à°®à°¾à°²à°¨à±\81 à°\85à°°à±\8dà°¥à°\82 à°\9aà±\87à°¸à±\81à°\95à±\81ని à°®à±\81à°\82à°¦à±\81à°\95à±\81 సాగండి.",
+       "movepagetext-noredirectfixer": "కింది ఫారాన్ని వాడి, ఓ పేజీ పేరు మార్చవచ్చు. దాని చరిత్ర పూర్తిగా కొత్త పేరుకు తరలిపోతుంది. \nపాత శీర్షిక కొత్తదానికి దారిమార్పు పేజీగా మారిపోతుంది.\n[[Special:DoubleRedirects|జమిలి]] లేదా [[Special:BrokenRedirects|పనిచేయని దారిమార్పులు]] లను చూడటం మరువకండి.\nలింకులు వెళ్ళాల్సిన చోటికి వెళ్తున్నాయని నిర్ధారించుకోవాల్సిన బాధ్యత మీదే.\nకొత్త పేరుతో ఈసరికే ఏదైనా పేజీ ఉంటే - అది మార్పుచేర్పుల చరిత్ర ఏమీ లేని దారిమార్పు పేజీ అయినా తప్ప- తరలింపు <strong>జరుగదు</strong> అని గమనించండి.\nఅంటే, ఏదైనా పొరపాటు జరిగితే పేరును తిరిగి పాత పేరుకే మార్చగలరు తప్ప, ఈపాటికే ఉన్న పేజీని తుడిచివేయలేరు.\n\n<strong>గమనిక:</strong>\nబహుళ వ్యాప్తి పొందిన ఓ పేజీలో ఈ మార్పు చాలా తీవ్రమైనది, ఊహించనిదీ అవుతుంది.\nదాని పర్యవసానాలు అర్థం చేసుకున్నాకే ముందుకు వెళ్ళండి.",
+       "movepagetalktext": "à°\88 à°ªà±\86à°\9fà±\8dà°\9fà±\86à°¨à±\81 à°\9aà±\86à°\95à±\8d à°\9aà±\87à°¸à±\8dà°¤à±\87, à°¸à°\82à°¬à°\82ధిత à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80 à°\95à±\82à°¡à°¾ à°\86à°\9fà±\8bమాà°\9fà°¿à°\95à±\8dâ\80\8câ\80\8cà°\97à°¾ à°¤à°°à°²à°¿à°\82à°\9aబడà±\81à°¤à±\81à°\82ది, à°\97à°®à±\8dà°¯à°\82à°²à±\8b à°\88 à°¸à°°à°¿à°\95à±\87 à°\9aà°°à±\8dà°\9a à°ªà±\87à°\9cà±\80 à°\89à°\82à°\9fà±\87 à°¤à°ªà±\8dà°ª.\nà°\86 à°¸à°\82దరà±\8dà°­à°\82à°²à±\8b, à°®à±\80à°°à±\81 à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80ని à°\95à±\82à°¡à°¾ à°ªà°¨à°¿à°\97à°\9fà±\8dà°\9fà±\81à°\95à±\81ని à°¤à°°à°²à°¿à°\82à°\9aà°¡à°®à±\8b, à°µà°¿à°²à±\80à°¨à°\82 à°\9aà±\86à°¯à±\8dయడమà±\8b à°\9aà±\86à°¯à±\8dయాలà±\8dసి ఉంటుంది.",
        "moveuserpage-warning": "'''హెచ్చరిక:''' మీరు ఒక వాడుకరి పేజీని తరలించబోతున్నారు. పేజీ మాత్రమే తరలించబడుతుందనీ, వాడుకరి పేరుమార్పు జరగదనీ గమనించండి.",
        "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": "ఈ పేజీని గమనించు",
        "movepagebtn": "పేజీని తరలించు",
        "movelogpagetext": "కింద తరలించిన పేజీల జాబితా ఉన్నది.",
        "movesubpage": "{{PLURAL:$1|ఉపపేజీ|ఉపపేజీలు}}",
        "movesubpagetext": "ఈ పేజీకి క్రింద చూపించిన $1 {{PLURAL:$1|ఉపపేజీ ఉంది|ఉపపేజీలు ఉన్నాయి}}.",
+       "movesubpagetalktext": "సంబంధిత చర్చా పేజీకి కింద చూపిన $1 {{PLURAL:$1|ఉపపేజీ ఉంది|ఉపపేజీలున్నాయి}}.",
        "movenosubpage": "ఈ పేజీకి ఉపపేజీలు ఏమీ లేవు.",
        "movereason": "కారణం:",
        "revertmove": "వెనక్కు తిప్పు",
-       "delete_and_move_text": "==తొలగింపు అవసరం==\n\nఉద్దేశించిన వ్యాసం \"[[:$1]]\" ఇప్పటికే ఉనికిలో ఉంది. ప్రస్తుత తరలింపుకు వీలుగా దాన్ని తొలగించేయమంటారా?",
+       "delete_and_move_text": "గమ్యపు పేజీ \"[[:$1]]\" ఇప్పటికే ఉనికిలో ఉంది. \nప్రస్తుత తరలింపుకు వీలుగా దాన్ని తొలగించేయమంటారా?",
        "delete_and_move_confirm": "అవును, పేజీని తొలగించు",
        "delete_and_move_reason": "\"[[$1]]\"ను తరలించడానికి వీలుగా తొలగించారు",
        "selfmove": "మూలం, గమ్యం పేర్లు ఒకటే; పేజీని దాని పైకే తరలించడం కుదరదు.",
        "move-leave-redirect": "పాత పేజీని దారిమార్పుగా ఉంచు",
        "protectedpagemovewarning": "'''హెచ్చరిక:''' ఈ పేజీని సంరక్షించారు కనుక నిర్వాహక హక్కులు కలిగిన వాడుకరులు మాత్రమే దీన్ని తరలించగలరు.\nమీ సమాచారం కోసం చివరి చిట్టా పద్దుని ఇక్కడ ఇస్తున్నాం:",
        "semiprotectedpagemovewarning": "'''గమనిక:''' ఈ పేజీని సంరక్షించారు కనుక నమోదైన వాడుకరులు మాత్రమే దీన్ని తరలించగలరు.\nమీ సమాచారం కోసం చివరి చిట్టా పద్దుని ఇక్కడ ఇస్తున్నాం:",
-       "move-over-sharedrepo": "== ఫైలు ఉంది ==\n[[:$1]] సామూహిక నిక్షేపంలో ఉంది. ఈ పేరుతో మరొక ఫైలును తరలిస్తే అది ఆ సామూహిక ఫైలును ఓవర్‌రైడు చేస్తుంది.",
+       "move-over-sharedrepo": "[[:$1]] సామూహిక నిక్షేపంలో ఉంది. ఈ పేరుకు మరొక ఫైలును తరలిస్తే అది ఆ సామూహిక ఫైలును ఓవర్‌రైడు చేస్తుంది.",
        "file-exists-sharedrepo": "ఎంచుకున్న ఫైలు పేరు ఇప్పటికే సామాన్య భాండాగారంలో వాడుకలో ఉంది.\nదయచేసి మరొక పేరుని ఎంచుకోండి.",
        "export": "పేజీల ఎగుమతి",
        "exporttext": "ఎంచుకున్న పేజీ లేదా పేజీలలోని వ్యాసం మరియు పేజీ చరితం లను XML లో ఎగుమతి చేసుకోవచ్చు. MediaWiki ని ఉపయోగించి Special:Import page ద్వారా దీన్ని వేరే వికీ లోకి దిగుమతి చేసుకోవచ్చు.\n\nపేజీలను ఎగుమతి చేసందుకు, కింద ఇచ్చిన టెక్స్టు బాక్సులో పేజీ పేర్లను లైనుకో పేరు చొప్పున ఇవ్వండి. ప్రస్తుత కూర్పుతో పాటు పాత కూర్పులు కూడా కావాలా, లేక ప్రస్తుత కూర్పు మాత్రమే చాలా అనే విషయం కూడా ఇవ్వవచ్చు.\n\nరెండో పద్ధతిలో అయితే, పేజీ యొక్క లింకును కూడా వాడవచ్చు. ఉదాహరణకు, \"[[{{MediaWiki:Mainpage}}]]\" కోసమైతే [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] అని ఇవ్వవచ్చు.",
        "export-download": "ఫైలుగా భద్రపరచు",
        "export-templates": "మూసలను కలుపు",
        "export-pagelinks": "ఈ లోతు వరకు లింకై ఉన్న పేజీలను చేర్చు:",
+       "export-manual": "పేజీలను మానవికంగా చేర్చండి:",
        "allmessages": "అన్ని సిస్టం సందేశాలు",
        "allmessagesname": "పేరు",
        "allmessagesdefault": "అప్రమేయ సందేశపు పాఠ్యం",
        "thumbnail-temp-create": "తాత్కాలిక థంబ్‍నెయిల్ ఫైలును సృష్టించలేకపోయాం",
        "thumbnail-dest-create": "థంబ్‍నెయిలును గమ్యస్థానంలో భద్రపరచలేకపోయాం",
        "thumbnail_invalid_params": "నఖచిత్రాలకు సరయిన పారామీటర్లు లేవు",
+       "thumbnail_toobigimagearea": "$1 కంటే పెద్ద కొలతలు గల దస్త్రం",
        "thumbnail_dest_directory": "గమ్యస్థానంలో డైరెక్టరీని సృష్టించలేకపోయాం",
        "thumbnail_image-type": "ఈ బొమ్మ రకానికి మద్దతు లేదు",
        "thumbnail_gd-library": "అసంపూర్ణ GD సంచయపు ఏర్పాటు: $1 ఫంక్షను లేదు.",
        "thumbnail_image-failure-limit": "ఈ థంబ్‍నెయిల్‍ను రెండరు చెయ్యడానికి చాలా ఎక్కువ విఫలయత్నాలు ($1 లేదా అంతకంటే ఎక్కువ) జరిగాయి. కాస్తాగి మళ్ళీ ప్రయత్నించండి.",
        "import": "పేజీలను దిగుమతి చేసుకోండి",
        "importinterwiki": "మరొక వికీ నుండి దిగుమతి",
-       "import-interwiki-text": "దిà°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8bవడానిà°\95à°¿ à°\92à°\95 à°µà°¿à°\95à±\80ని à°®à°°à°¿à°¯à±\81 à°\85à°\82à°¦à±\81à°²à±\8bని à°ªà±\87à°\9cà±\80ని à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿.\nà°\95à±\82à°°à±\8dà°ªà±\81à°² à°¤à±\87à°¦à±\80à°²à±\81 à°®à°°à°¿à°¯à±\81 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\87సిన à°µà°¾à°°à°¿ à°ªà±\87à°°à±\8dà°²à±\81 à°­à°¦à±\8dరపరà°\9aబడతాయి.\nà°\87తర à°µà°¿à°\95à±\80లనà±\81à°\82à°¡à°¿ à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dà°¨ à°¦à°¿à°\97à±\81మతà±\81à°² à°\9aà°°à±\8dà°¯లన్నీ [[Special:Log/import|దిగుమతుల చిట్టా]]లో నమోదవుతాయి.",
+       "import-interwiki-text": "దిà°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8bవడానిà°\95à°¿ à°\93 à°µà°¿à°\95à±\80ని, à°\93 à°ªà±\87à°\9cà±\80à°¨à±\80 à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿.\nà°\95à±\82à°°à±\8dà°ªà±\81à°² à°¤à±\87à°¦à±\80లనà±\81, à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\87సిన à°µà°¾à°°à°¿ à°ªà±\87à°°à±\8dలనà±\82 à°­à°¦à±\8dరపరà±\81à°¸à±\8dతాà°\82.\nà°\87తర à°µà°¿à°\95à±\80లనà±\81à°\82à°¡à°¿ à°\9aà±\87సిన à°¦à°¿à°\97à±\81మతà±\81లన్నీ [[Special:Log/import|దిగుమతుల చిట్టా]]లో నమోదవుతాయి.",
        "import-interwiki-sourcewiki": "మూల వికీ:",
        "import-interwiki-sourcepage": "మూల పేజీ:",
        "import-interwiki-history": "ఈ పేజీ యొక్క అన్ని చారిత్రక కూర్పులను కాపీ చెయ్యి",
        "importcantopen": "దిగుమతి చేయబోతున్న ఫైలును తెరవలేకపోతున్నాను",
        "importbadinterwiki": "చెడు అంతర్వికీ లింకు",
        "importsuccess": "దిగుమతి పూర్తయ్యింది!",
-       "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.\nఎటువంటి అంతర్వికీ దిగుమతి మూలాలను పేర్కొనకపోవటం వలన, ప్రత్యక్ష చరిత్ర అప్లోడులను నిలిపివేశాం.",
+       "importnosources": "ఏ వికీనుండి దిగుమతి చేసుకోవాలో సూచించలేదు. సూటి చరిత్ర ఎక్కింపులను అచేతనం చేసాం.",
        "importnofile": "ఎటువంటి దిగుమతి ఫైలునూ అప్లోడుచేయలేదు.",
        "importuploaderrorsize": "దిగుమతి ఫైలు అప్లోడు ఫలించలేదు. ఈ ఫైలు అప్లోడు ఫైలుకు నిర్దేశించిన పరిమాణం కంటే పెద్దా ఉంది.",
        "importuploaderrorpartial": "దిగుమతి ఫైలు అప్లోడు ఫలించలేదు. ఈ ఫైలులో కొంత భాగాన్ని మాత్రమే అప్లోడు చేయగలిగం.",
        "import-nonewrevisions": "కూర్పులేవీ దిగుమతి కాలేదు (అవన్నీ ఈసరికే ఉండి ఉండాలి, లేదా లోపాల కారణంగా వదిలెయ్యబడ్డాయి).",
        "xml-error-string": "$1 $2వ లైనులో, వరుస $3 ($4వ బైటు): $5",
        "import-upload": "XML డేటాను అప్‌లోడు చెయ్యి",
-       "import-token-mismatch": "à°¸à±\86à°·à°¨à±\81 à°­à±\8bà°\97à°\9fà±\8dà°\9fà°¾ à°ªà±\8bయిà°\82ది. à°¦à°¯à°\9aà±\87సి à°®à°³à±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aండి.",
+       "import-token-mismatch": "à°¸à±\86à°·à°¨à±\81 à°¡à±\87à°\9fà°¾ à°ªà±\8bయిà°\82ది.\n\nà°®à±\80à°°à±\81 à°²à°¾à°\97à±\8cà°\9fà±\88 à°ªà±\8bయి à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81. <strong>లాà°\97à°¿à°¨à±\88 à°\89à°¨à±\8dనారà±\8b à°²à±\87à°¦à±\8b à°\9aà±\82à°¸à±\81à°\95à±\81ని, à°®à°³à±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿</strong>.\nà°\85ది à°\95à±\82à°¡à°¾ à°ªà°¨à°¿à°\9aà±\86à°¯à±\8dà°¯à°\95à°ªà±\8bà°¤à±\87, à°\93సారి [[Special:UserLogout|లాà°\97à±\8cà°\9fà±\88]] à°®à°³à±\8dà°³à±\80 à°²à°¾à°\97ినవà°\82à°¡à°¿. à°®à±\80 à°¬à±\8dà°°à±\8cà°\9cà°°à±\81 à°\88 à°¸à±\88à°\9fà±\81 à°¯à±\8aà°\95à±\8dà°\95 à°\95à±\82à°\95à±\80లనà±\81 à°\85à°¨à±\81మతిసà±\8dà°¤à±\81à°\82దని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\8bండి.",
        "import-invalid-interwiki": "మీరు చెప్పిన వికీనుండి దిగుమతి చేయలేము.",
-       "import-error-edit": "పేజీ \"$1\" లో మార్పుచేర్పులు చేసే అనుమతి మీకు లేదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
-       "import-error-create": "పేజీ \"$1\" ను సృష్టించే అనుమతి మీకు లేదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
-       "import-error-interwiki": "పేజీ \"$1\" యొక్క పేరు బయటి లింకుల (అంతరవికీ) కోసం అట్టేపెట్టబడింది కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
+       "import-error-edit": "\"$1\" పేజీలో మార్పుచేర్పులు చేసే అనుమతి మీకు లేదు కాబట్టి, దాన్ని దిగుమతి చెయ్యలేదు.",
+       "import-error-create": "\"$1\" పేజీని సృష్టించే అనుమతి మీకు లేదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
+       "import-error-interwiki": "à°ªà±\87à°\9cà±\80 \"$1\" à°¯à±\8aà°\95à±\8dà°\95 à°ªà±\87à°°à±\81 à°¬à°¯à°\9fà°¿ à°²à°¿à°\82à°\95à±\81à°² (à°\85à°\82తరà±\8dవిà°\95à±\80) à°\95à±\8bà°¸à°\82 à°\85à°\9fà±\8dà°\9fà±\87à°ªà±\86à°\9fà±\8dà°\9fబడిà°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿ à°¦à°¾à°¨à±\8dని à°¦à°¿à°\97à±\81మతి à°\9aà±\86à°¯à±\8dయలà±\87à°¦à±\81.",
        "import-error-special": "పేజీ \"$1\" ప్రత్యేక పేరుబరికి చెందినది. ఈ పేరుబరిలో పేజీలు సృష్టించే అనుమతి లేదు. అందుచేత దాన్ని దిగుమతి చెయ్యలేదు.",
-       "import-error-invalid": "à°ªà±\87à°\9cà±\80 \"$1\" à°ªà±\87à°°à±\81 సరైనది కాదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
+       "import-error-invalid": "à°ªà±\87à°\9cà±\80 \"$1\" à°¨à±\81 à°¦à°¿à°\97à±\81మతి à°\9aà±\87à°¸à±\87 à°\97à°®à±\8dà°¯à°\82 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°\88 à°µà°¿à°\95à±\80à°²à±\8b సరైనది కాదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
        "import-error-unserialize": "పేజీ \"$1\" యొక్క కూర్పు $2ను సీరియలించలేకపోయాం. ఈ కూర్పు వాడుతున్న కంటెంటు మోడల్ $3 అని తెలియవచ్చింది. ఈ మోడల్ $4 లాగా సీరియలించబడుతుంది.",
        "import-options-wrong": "తప్పు {{PLURAL:$2|ఐచ్ఛికం|ఐచ్ఛికాలు}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "ఇచ్చిన మూలపు పేజీ సరైన శీర్షిక కాదు.",
        "import-rootpage-nosubpage": "మూలపేజీ యొక్క పేరుబరి \"$1\" ఉపపేజీలను అనుమతించదు.",
        "importlogpage": "దిగుమతుల చిట్టా",
        "importlogpagetext": "ఇతర వికీల నుండీ మార్పుల చరిత్రతోసహా తెచ్చిన నిర్వహణా దిగుమతులు.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|కూర్పు|కూర్పులు}}",
-       "import-logentry-interwiki-detail": "$2 à°¨à±\81à°\82à°¡à°¿ {{PLURAL:$1|à°\92à°\95 à°\95à±\82à°°à±\8dà°ªà±\81|$1 à°\95à±\82à°°à±\8dà°ªà±\81à°²à±\81}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|కూర్పును|కూర్పులను}} దిగుమతి చేసాం",
+       "import-logentry-interwiki-detail": "$2 à°¨à±\81à°\82à°¡à°¿ {{PLURAL:$1|à°\95à±\82à°°à±\8dà°ªà±\81à°¨à±\81|à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81}} à°¦à°¿à°\97à±\81మతి à°\9aà±\87సాà°\82",
        "javascripttest": "జావాస్క్రిప్ట్ పరీక్ష",
        "javascripttest-pagetext-unknownaction": "తెలియని చర్య \"$1\".",
        "javascripttest-qunit-intro": "mediawiki.org లోని [$1 పరీక్షా డాక్యుమెంటేషన్] చూడండి.",
        "tooltip-pt-anontalk": "ఈ ఐపీ చిరునామా నుండి చేసిన మార్పుల గురించి చర్చ",
        "tooltip-pt-preferences": "{{GENDER:|మీ}} అభిరుచులు",
        "tooltip-pt-watchlist": "మీరు మార్పుల కొరకు గమనిస్తున్న పేజీల జాబితా",
-       "tooltip-pt-mycontris": "{{GENDER:|మీ}} యోగదానములు",
+       "tooltip-pt-mycontris": "{{GENDER:|మీ}} మార్పుచేర్పుల జాబితా",
+       "tooltip-pt-anoncontribs": "ఈ IP అడ్రసు నుండి చేసిన దిద్దుబాట్ల జాబితా",
        "tooltip-pt-login": "మిమ్మల్ని లాగినవమని ప్రోత్సహిస్తున్నాం; కానీ అది తప్పనిసరేమీ కాదు.",
        "tooltip-pt-logout": "లాగౌటవండి",
        "tooltip-pt-createaccount": "మీరొక ఖాతాని సృష్టించుకొని ప్రవేశించటాన్ని సమర్ధిస్తున్నాము; కానీ, అది అవసరం కాదు, ఐచ్ఛికం మాత్రమే.",
        "tooltip-t-recentchangeslinked": "ఈ పేజీకి లింకై ఉన్న పేజీల్లో జరిగిన ఇటీవలి మార్పులు",
        "tooltip-feed-rss": "ఈ పేజీకి RSS ఫీడు",
        "tooltip-feed-atom": "ఈ పేజీకి Atom ఫీడు",
-       "tooltip-t-contributions": "యోగదానములు జాబితా‌ {{GENDER:$1|ఈ వాడుకరి}}",
-       "tooltip-t-emailuser": "ఈ వాడుకరికి ఓ ఈమెయిలు పంపండి",
+       "tooltip-t-contributions": "{{GENDER:$1|ఈ వాడుకరి}} మార్పుచేర్పుల జాబితా‌",
+       "tooltip-t-emailuser": "ఈ {{GENDER:$1|వాడుకరికి}} ఓ ఈమెయిలు పంపండి",
        "tooltip-t-info": "ఈ పేజీ గురించి మరింత సమాచారం",
        "tooltip-t-upload": "దస్త్రాలను ఎక్కించండి",
        "tooltip-t-specialpages": "అన్ని ప్రత్యేక పుటల జాబితా",
        "tooltip-ca-nstab-category": "వర్గపు పేజీ చూడండి",
        "tooltip-minoredit": "దీన్ని చిన్న మార్పుగా గుర్తించు",
        "tooltip-save": "మీ మార్పులను భద్రపరచండి",
+       "tooltip-publish": "మీ మార్పులను ప్రచురించండి",
        "tooltip-preview": "మీ మార్పులను మునుజూడండి, భద్రపరిచేముందు ఇది వాడండి!",
        "tooltip-diff": "పాఠానికి మీరు ఏ మార్పులు చేసారో చూపిస్తుంది",
        "tooltip-compareselectedversions": "ఈ పేజీలో ఎంచుకున్న రెండు కూర్పులకు మధ్య తేడాలను చూడండి",
        "lastmodifiedatby": "ఈ పేజీకి $3 $2, $1న చివరి మార్పు చేసారు.",
        "othercontribs": "$1 యొక్క కృతిపై ఆధారితం.",
        "others": "ఇతరాలు",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|వాడుకరి|వాడుకరులు}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|వాడుకరి}}|వాడుకరులు}} $1",
        "anonusers": "{{SITENAME}} అజ్ఞాత {{PLURAL:$2|వాడుకరి|వాడుకరులు}} $1",
        "creditspage": "పేజీ క్రెడిట్లు",
        "nocredits": "ఈ పేజీకి క్రెడిట్ల సమాచారం అందుబాటులో లేదు.",
        "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": "అనుమతించబడలేదు",
        "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",
        "exif-xresolution": "క్షితిజసమాంతర స్పష్టత",
        "exif-yresolution": "లంబ స్పష్టత",
        "exif-stripoffsets": "బొమ్మ డేటా ఉన్న స్థలం",
-       "exif-rowsperstrip": "à°\92à°\95à±\8dà°\95à±\8b à°ªà°\9fà±\8dà°\9fà°¿కి ఉన్న అడ్డువరుసలు",
+       "exif-rowsperstrip": "à°\92à°\95à±\8dà°\95à±\8b à°ªà°\9fà±\8dà°\9fà±\80కి ఉన్న అడ్డువరుసలు",
        "exif-stripbytecounts": "ఒక్కో కుదించిన పట్టీలో ఉన్న బైట్లు",
        "exif-jpeginterchangeformat": "JPEG SOI కి ఆఫ్‌సెట్",
        "exif-jpeginterchangeformatlength": "JPEG డాటా యొక్క బైట్లు",
        "confirmemail_body_changed": "$1 ఐపీ చిరునామా నుండి ఎవరో, బహుశా మీరే,\n{{SITENAME}}లో \"$2\" అనే ఖాతా యొక్క ఈ-మెయిలు చిరునామాని ఈ చిరునామాకి మార్చారు.\n\nఆ ఖాతా నిజంగా మీదే అని నిర్ధారించేందుకు మరియు {{SITENAME}}లో\nఈ-మెయిలు సౌలభ్యాలని పునఃచేతనం చేసుకునేందుకు, ఈ లంకెని మీ విహారిణిలో తెరవండి:\n\n$3\n\nఒకవేళ ఆ ఖాతా మీది *కాకపోతే*, ఈ-మెయిలు చిరునామా నిర్ధారణని రద్దుచేసేందుకు\nఈ లంకెని అనుసరించండి:\n\n$5\n\nఈ నిర్ధారణా సంకేతం $4కి కాలంచెల్లుతుంది.",
        "confirmemail_invalidated": "ఈ-మెయిలు చిరునామా నిర్ధారణని రద్దుచేసాం",
        "invalidateemail": "ఈ-మెయిలు నిర్ధారణని రద్దుచేయండి",
+       "notificationemail_subject_changed": "{{SITENAME}} నమోదైన ఈమెయిలు అడ్రసును మార్చాం",
+       "notificationemail_subject_removed": "{{SITENAME}} నమోదైన ఈమెయిలు అడ్రసును తీసివేసాం",
+       "notificationemail_body_changed": "ఐపీ అడ్రసు $1 నుండి ఎవరో - బహుశా మీరే కావచ్చు -\n{{SITENAME}} లోని ఖాతా ఈమెయిలు అడ్రసు, \"$2\" ను \"$3\" కు మార్చారు.\n\nఅది మీరు కాకపోతే, వెంటనే ఓ సైటు నిర్వాహకుణ్ణి సంప్రదించండి.",
+       "notificationemail_body_removed": "ఐపీ అడ్రసు $1 నుండి ఎవరో - బహుశా మీరే కావచ్చు -\n{{SITENAME}} లోని ఖాతా ఈమెయిలు అడ్రసు, \"$2\" ను తొలగించారు.\n\nఅది మీరు కాకపోతే, వెంటనే ఓ సైటు నిర్వాహకుణ్ణి సంప్రదించండి.",
        "scarytranscludedisabled": "[ఇతరవికీల మూసలను ఇక్కడ వాడటాన్ని అనుమతించటం లేదు]",
        "scarytranscludefailed": "[$1 కొరకు మూసను తీసుకురావటం విఫలమైంది]",
        "scarytranscludetoolong": "[URL మరీ పొడుగ్గా ఉంది]",
        "deletedwhileediting": "'''హెచ్చరిక''': మీరు మార్పులు చేయటం మొదలుపెట్టాక ఈ పేజీ తొలగించబడింది!",
-       "confirmrecreate": "à°®à±\80à°°à±\81 à°ªà±\87à°\9cà±\80 à°°à°¾à°¯à°\9fà°\82 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\81వాత [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°¦à°¾à°¨à°¿à°¨à°¿ à°¤à±\80సివà±\87సారà±\81. à°¦à°¾à°¨à°¿à°\95à°¿ à°\88 à°\95ారణà°\82 à°\87à°\9aà±\8dà°\9aారà±\81: ''$2''\nà°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80ని à°®à°³à±\8dà°³à±\80 à°¤à°¯à°¾à°°à±\81 à°\9aà±\87à°¯ాలనుకుంటున్నారని ధృవీకరించండి.",
-       "confirmrecreate-noreason": "à°®à±\80à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°¡à°\82 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\8dవాత à°\88 à°ªà±\81à°\9fà°¨à±\81 à°µà°¾à°¡à±\81à°\95à°°à°¿ [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81. à°\88 à°ªà±\81à°\9fà°¨à±\81 à°®à±\80à°°à±\81 à°¨à°¿à°\9cà°\82à°\97ానà±\87 à°ªà±\81à°¨à°\83à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aాలనà±\81à°\95à±\81à°\82à°\9fà±\81à°¨à±\8dనారని à°¨à°¿à°°à±\8dధారించండి.",
+       "confirmrecreate": "à°®à±\80à°°à±\81 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\81వాత [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°\88 à°ªà±\87à°\9cà±\80ని {{GENDER:$1|à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81}}. à°¦à°¾à°¨à°¿à°\95à°¿ à°\88 à°\95ారణà°\82 à°\87à°\9aà±\8dà°\9aారà±\81: <em>$2</em>\nà°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80ని à°®à°³à±\8dà°³à±\80 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aాలనుకుంటున్నారని ధృవీకరించండి.",
+       "confirmrecreate-noreason": "à°®à±\80à°°à±\81 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\81వాత [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°\88 à°ªà±\87à°\9cà±\80ని {{GENDER:$1|à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81}}. à°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80ని à°®à°³à±\8dà°³à±\80 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aాలనà±\81à°\95à±\81à°\82à°\9fà±\81à°¨à±\8dనారని à°§à±\83à°µà±\80à°\95రించండి.",
        "recreate": "మళ్లీ సృష్టించు",
        "confirm_purge_button": "సరే",
        "confirm-purge-top": "ఈ పేజీ యొక్క పాత కాపీని తొలగించమంటారా?",
        "watchlistedit-raw-done": "మీ వీక్షణ జాబితాను తాజాకరించాం.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} చేర్చాం:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:",
-       "watchlistedit-clear-title": "à°µà±\80à°\95à±\8dà°·à°£à°\9cాబితా à°\9aà±\86రిపివà±\87యబడిà°\82ది",
+       "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": "వీక్షణ జాబితాను చూడండి లేదా మార్చండి",
        "version-libraries-license": "లైసెన్సు",
        "version-libraries-description": "వివరణ",
        "version-libraries-authors": "రచయితలు",
-       "redirect": "ఫైలు, వాడుకరి, పేజీ లేదా కూర్పు ఐడీ ప్రకారం దారిమార్పు",
+       "redirect": "ఫైలు పేరు, వాడుకరి ఐడీ, పేజీ ఐడీ, కూర్పు ఐడీ లేదా లాగ్ ఐడీ పేరిట దారిమార్పు చెయ్యండి",
        "redirect-submit": "వెళ్ళు",
        "redirect-lookup": "చూడు:",
        "redirect-value": "విలువ:",
        "specialpages-group-login": "ప్రవేశించండి / ఖాతాను సృష్టించుకోండి",
        "specialpages-group-changes": "ఇటీవలి మార్పులు మరియు దినచర్యలు",
        "specialpages-group-media": "మాధ్యమ నివేదికలు మరియు ఎగుమతులు",
-       "specialpages-group-users": "వాడà±\81à°\95à°°à±\8dà°²à±\81 à°®à°°à°¿à°¯à±\81 హక్కులు",
+       "specialpages-group-users": "వాడà±\81à°\95à°°à±\81à°²à±\81, హక్కులు",
        "specialpages-group-highuse": "అధిక వాడుక పేజీలు",
        "specialpages-group-pages": "పేజీల యొక్క జాబితాలు",
        "specialpages-group-pagetools": "పేజీ పనిముట్లు",
        "tags-edit-add": "ఈ ట్యాగులను చేర్చు:",
        "tags-edit-remove": "ఈ ట్యాగులను తొలగించు:",
        "tags-edit-reason": "కారణం:",
-       "tags-edit-success": "మారà±\8dà°ªà±\81à°²à±\81 à°µà°¿à°\9cయవà°\82à°¤à°\82à°\97à°¾ à°\86పాదిà°\82à°\9aబడà±\8dడాయి.",
+       "tags-edit-success": "మార్పులు ఆపాదించబడ్డాయి.",
        "comparepages": "పుటల పోలిక",
        "compare-page1": "పుట 1",
        "compare-page2": "పుట 2",
        "compare-revision-not-exists": "మీరు పేర్కొన్న కూర్పు లేనే లేదు.",
        "dberr-problems": "క్షమించండి! ఈ సైటు సాంకేతిక సమస్యలని ఎదుర్కొంటుంది.",
        "dberr-again": "కొన్ని నిమిషాలాగి మళ్ళీ ప్రయత్నించండి.",
-       "dberr-info": "(à°¡à°¾à°\9fాబà±\87à°¸à±\81 à°¸à°°à±\8dవరà±\81ని à°¸à°\82ధానిà°\82à°\9aలేకున్నాం: $1)",
-       "dberr-info-hidden": "(డేటాబేసు సర్వరును కాంటాక్టు చెయ్యలేకున్నాం)",
+       "dberr-info": "(à°¡à±\87à°\9fాబà±\87à°¸à±\81à°¨à±\81 à°\9aà±\87à°°లేకున్నాం: $1)",
+       "dberr-info-hidden": "(డేటాబేసును చేరలేకున్నాం)",
        "dberr-usegoogle": "ఈలోపు మీరు గూగుల్ ద్వారా వెతకడానికి ప్రయత్నించండి.",
        "dberr-outofdate": "మా విషయం యొక్క వారి సూచీలు అంత తాజావి కావపోవచ్చని గమనించండి.",
        "dberr-cachederror": "అభ్యర్థించిన పేజీ యొక్క కోశం లోని కాపీ ఇది, అంత తాజాది కాకపోవచ్చు.",
        "htmlform-cloner-create": "ఇంకా చేర్చు",
        "htmlform-cloner-delete": "తొలగించు",
        "htmlform-cloner-required": "కనీసం ఒక విలువు అయినా ఇవ్వాలి.",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "మీరిచ్చిన విలువ ఆమోదిత తేదీ రూపంలో లేదు. YYYY-MM-DD ఆకృతిని వాడి చూడండి.",
+       "htmlform-time-invalid": "మీరిచ్చిన విలువ ఆమోదిత సమయం రూపంలో లేదు. HH:MM:SS ఆకృతిని వాడి చూడండి.",
+       "htmlform-datetime-invalid": "మీరిచ్చిన విలువ ఆమోదిత తేదీ, సమయం రూపంలో లేదు. YYYY-MM-DD HH:MM:SS ఆకృతిని వాడి చూడండి.",
+       "htmlform-title-badnamespace": "[[:$1]], \"{{ns:$2}}\" పేరుబరిలో లేదు.",
+       "htmlform-title-not-creatable": "\"$1\" అనే పేజీ పేరు సృష్టించదగ్గది కాదు",
+       "htmlform-title-not-exists": "$1 ఉనికిలో లేదు.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ఉనికిలో లేదు.",
+       "htmlform-user-not-valid": "<strong>$1</strong> సరైన వాడుకరిపేరు కాదు.",
        "logentry-delete-delete": "$1 $3 పేజీని {{GENDER:$2|తొలగించారు}}",
+       "logentry-delete-delete_redir": "$1, దారిమార్పు $3 ను ఓవర్‌రైటింగు పద్ధతిలో {{GENDER:$2|తొలగించారు}}",
        "logentry-delete-restore": "పేజీ $3 ని $1 {{GENDER:$2|పునస్థాపించారు}}",
        "logentry-delete-event": "$3 లో {{PLURAL:$5|ఒక లాగ్ ఘటన|$5 లాగ్ ఘటనల}} యొక్క కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}: $4",
        "logentry-delete-revision": "పేజీ $3 లో {{PLURAL:$5|ఒక కూర్పు|$5 కూర్పుల}} యొక్క కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}: $4",
        "revdelete-uname-unhid": "వాడుకరిపేరు బయటపెట్టబడింది",
        "revdelete-restricted": "నిర్వాహకులకు ఆంక్షలు విధించాను",
        "revdelete-unrestricted": "నిర్వాహకులకున్న ఆంక్షలను ఎత్తేశాను",
+       "logentry-block-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$4|$3}} పై ఉన్న {{GENDER:$2|నిరోధాన్ని ఎత్తివేసారు}}",
+       "logentry-block-reblock": "$1 {{GENDER:$4|$3}} యొక్క నిరోధపు కాలం తీరిపోయే వ్యవధిని $5 $6 గా సెట్టింగులను {{GENDER:$2|మార్చారు}}",
+       "logentry-suppress-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
+       "logentry-suppress-reblock": "$1, {{GENDER:$4|$3}} యొక్క నిరోధాల సెట్టింగులను {{GENDER:$2|మార్చారు}}. నిరోధ కాలం: $5 $6",
+       "logentry-import-upload": "$1, $3 ను దస్త్రం ఎక్కింపు ద్వారా {{GENDER:$2|దిగుమతి చేసారు}}",
+       "logentry-import-upload-details": "$1, $3 ను దస్త్రం ఎక్కింపు ద్వారా {{GENDER:$2|దిగుమతి చేసారు}} ($4 {{PLURAL:$4|కూర్పు|కూర్పులు}})",
+       "logentry-import-interwiki": "$1, $3 ను వేరే వికీ నుండి {{GENDER:$2|దిగుమతి చేసారు}}",
+       "logentry-import-interwiki-details": "$1, $3 ను $5 నుండి {{GENDER:$2|దిగుమతి చేసారు}} ($4 {{PLURAL:$4|కూర్పు|కూర్పులు}})",
+       "logentry-merge-merge": "$1, $3 ను $4 లో {{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-newusers-create2": "$1 వాడుకరి ఖాతా $3 ను {{GENDER:$2|సృష్టించారు}}",
        "logentry-newusers-byemail": "$1 వాడుకరి ఖాతా $3 ను {{GENDER:$2|సృష్టించారు}}. సంకేతపదాన్ని ఈమెయిలులో పంపించాం",
        "logentry-newusers-autocreate": "వాడుకరి ఖాతా $1 ను ఆటోమేటిగ్గా {{GENDER:$2|సృష్టించారు}}",
-       "logentry-rights-rights": "$1, $3 యొక్క గుంపు సభ్యత్వాన్ని $4 నుండి $5 కు {{GENDER:$2|మార్చారు}}",
+       "logentry-protect-move_prot": "$1, సంరక్షణ సెట్టింగులను $4 నుండి $3 కు {{GENDER:$2|తరలించారు}}",
+       "logentry-protect-unprotect": "$1, $3 నుండి సంరక్షణను {{GENDER:$2|తీసివేసారు}}",
+       "logentry-protect-protect": "$1, $3 ను {{GENDER:$2|సంరక్షించారు}} $4",
+       "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-legacy": "$1, $3 యొక్క గుంపు సభ్యత్వాన్ని {{GENDER:$2|మార్చారు}}",
        "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": "$3ను $1 {{GENDER:$2|ఎక్కించారు}}",
        "log-name-managetags": "ట్యాగు నిర్వహణ చిట్టా",
        "logentry-managetags-create": "\"$4\" ట్యాగును $1 {{GENDER:$2|సృష్టించారు}}",
        "log-name-tag": "ట్యాగుల చిట్టా",
        "rightsnone": "(ఏమీలేవు)",
        "revdelete-summary": "మార్పు సంగ్రహం",
+       "rightslogentry-temporary-group": "$1 (తాత్కాలికం, $2 వరకు)",
        "feedback-adding": "ఫీడ్‍బ్యాకును పేజీలోకి చేరుస్తున్నాం...",
        "feedback-back": "వెనుకకు",
        "feedback-bugcheck": "అద్భుతం! ఇది ఇప్పటికే [$1 తెలిసిన బగ్గుల]లో లేదని సరిచూసుకోండి.",
        "feedback-useragent": "వాడుకరి ఏజెంటు:",
        "searchsuggest-search": "{{SITENAME}}‌లో వెతకండి",
        "searchsuggest-containing": "కలిగియున్న...",
-       "api-error-badaccess-groups": "ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.",
        "api-error-badtoken": "అంతర్గత లోపం: చెడు టోకెన్.",
-       "api-error-copyuploaddisabled": "URL ద్వారా ఎక్కించడం ఈ సర్వరులో అశక్తం చెయ్యబడింది.",
-       "api-error-duplicate": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|మరో ఫైలు ఉంది|ఇతర ఫైళ్ళు ఉన్నాయి}}.",
-       "api-error-duplicate-archive": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|మరో ఫైలు ఉండేది|ఇతర ఫైళ్ళు ఉండేవి}}. అయితే {{PLURAL:$1|అది తొలగించబడింది|అవి తొలగించబడ్డాయి}}.",
-       "api-error-empty-file": "మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.",
        "api-error-emptypage": "కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.",
-       "api-error-fetchfileerror": "అంతర్గత లోపం: ఈ ఫైలును తేవడంలో ఏదో తప్పు జరిగింది.",
-       "api-error-fileexists-forbidden": "\"$1\" పేరుతో ఓ ఫైలు ఈసరికే ఉంది. దాన్ని తిరగరాయడం కుదరదు.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" పేరుతో ఓ ఫైలు ఈసరికే ఈ సహ ఫైలు ఖజానా (షేర్‍డ్ ఫైల్ రిపాజిటరీ)లో ఉంది. దాన్ని తిరగరాయడం కుదరదు.",
-       "api-error-file-too-large": "మీరు సమర్పించిన దస్త్రం చాలా పెద్దగా ఉంది.",
-       "api-error-filename-tooshort": "దస్త్రపు పేరు మరీ చిన్నగా ఉంది.",
-       "api-error-filetype-banned": "ఈ రకపు దస్త్రాలని నిషేధించారు.",
-       "api-error-filetype-banned-type": "$1, అనుమతించబడిన {{PLURAL:$4|ఫైలు రకం కాదు|ఫైలు రకాలు కాదు}}. అనుమతించబడిన {{PLURAL:$3|ఫైలు రకం|ఫైలు రకాలు}}: $2.",
-       "api-error-filetype-missing": "ఫైలుపేరులో ఓ ఎక్స్టెన్షను లేదు.",
-       "api-error-hookaborted": "మీరు చేయ ప్రయత్నించిన మార్పును ఓ పొడిగింత అడ్డుకుంది.",
-       "api-error-http": "అంతర్గత దోషము: సేవకానికి అనుసంధానమవలేకపోతున్నది.",
-       "api-error-illegal-filename": "ఆ పైల్ పేరు అనుమతించబడదు.",
-       "api-error-internal-error": "అంతర్గత లోపం: ఈ వికీలో మీ ఎక్కింపును ప్రాసెసు చెయ్యడంలో ఎదో తప్పు జరిగింది.",
-       "api-error-invalid-file-key": "అంతర్గత దోషము: తాత్కాలిక నిల్వలో ఫైల్ కనపడలేదు.",
-       "api-error-missingparam": "అంతర్గత దోషం: అభ్యర్ధనలో పరామితులు అన్నీ లేవు.",
-       "api-error-missingresult": "అంతర్గత లోపం: నకలు తీయడం సఫలమైందో లేదో తెలియడం లేదు.",
-       "api-error-mustbeloggedin": "దస్త్రాలను ఎక్కించడానికి మీరు ప్రవేశించివుండాలి.",
-       "api-error-mustbeposted": "అంతర్గత లోపం: అభ్యర్థనకు HTTP POST అవసరం.",
-       "api-error-noimageinfo": "ఎక్కింపు జయప్రదమైంది. కానీ సర్వరు, ఆ ఫైలు గురించిన సమాచారమేమీ ఇవ్వలేదు.",
-       "api-error-nomodule": "అంతర్గత దోషము: ఎక్కింపు పర్వికము అమర్చబడలేదు.",
-       "api-error-ok-but-empty": "అంతర్గత దోషము: సేవకము నుండి ఎటువంటి స్పందనా లేదు.",
-       "api-error-overwrite": "ఈసరికే ఉన్న ఫైలును తిరగరాయడానికి అనుమతి లేదు.",
-       "api-error-stashfailed": "అంతర్గత లోపం: తాత్కాలిక దస్త్రాన్ని భద్రపరచడంలో సేవకి విఫలమైంది.",
        "api-error-publishfailed": "అంతర్గత లోపం: తాత్కాలిక ఫైలును ప్రచురించడంలో సర్వరు విఫలమైంది.",
-       "api-error-stasherror": "ఫైలును ఖాజానాకు ఎక్కించడంలో లోపం దొర్లింది.",
-       "api-error-timeout": "సర్వరు ఆశించిన సమయం లోపు స్పందించలేదు.",
-       "api-error-unclassified": "ఒక తెలియని దోషము సంభవించినది",
-       "api-error-unknown-code": "తెలియని పొరపాటు: \"$1\".",
-       "api-error-unknown-error": "అంతర్గత పొరపాటు: మీ దస్త్రాన్ని ఎక్కించేప్పుడు ఏదో పొరపాటు జరిగింది.",
-       "api-error-unknown-warning": "తెలియని హెచ్చరిక: $1",
+       "api-error-stashfailed": "అంతర్గత లోపం: తాత్కాలిక దస్త్రాన్ని భద్రపరచడంలో సేవకి విఫలమైంది.",
+       "api-error-unknown-warning": "తెలియని హెచ్చరిక: \"$1\".",
        "api-error-unknownerror": "తెలియని పొరపాటు: \"$1\".",
-       "api-error-uploaddisabled": "ఈ వికీలో ఎక్కింపులని అచేతనం చేసారు.",
-       "api-error-verification-error": "ఈ ఫైల్ పాడైవుండవచ్చు, లేదా తప్పుడు పొడిగింతను కలిగివుండవచ్చు.",
        "duration-seconds": "$1 {{PLURAL:$1|క్షణం|క్షణాలు}}",
        "duration-minutes": "$1 {{PLURAL:$1|నిమిషం|నిమిషాలు}}",
        "duration-hours": "$1 {{PLURAL:$1|గంట|గంటలు}}",
        "expand_templates_generate_xml": "XML పార్స్ ట్రీని చూపించు",
        "expand_templates_generate_rawhtml": "ముడి HTML ను చూపించు",
        "expand_templates_preview": "మునుజూపు",
-       "pagelanguage": "పేజీ భాష ఎంపిక",
+       "pagelanguage": "పేజీ భాషను మార్చు",
        "pagelang-name": "పేజీ",
        "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": "భాష మార్పుల చిట్టా",
        "log-description-pagelang": "ఇది పేజీ భాష మార్పుల చిట్టా.",
-       "logentry-pagelang-pagelang": "$3 à°ªà±\87à°\9cà±\80 à°­à°¾à°·à°¨à±\81 $4 à°¨à±\81à°\82à°¡à°¿ $5 à°\95à°¿ $1 {{GENDER:$2|మారà±\8dà°\9aారà±\81}}.",
+       "logentry-pagelang-pagelang": "$3 భాషను $4 నుండి $5 కి $1 {{GENDER:$2|మార్చారు}}.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (చేతనం)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>అచేతనం</strong>)",
        "mediastatistics": "మాధ్యమ గణాంకాలు",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME రకం",
+       "mediastatistics-table-extensions": "సంభావ్యత గల పొడిగింతలు",
        "mediastatistics-table-count": "దస్త్రాల సంఖ్య",
+       "mediastatistics-table-totalbytes": "మొత్తం పరిమాణం",
        "mediastatistics-header-unknown": "తెలియని",
+       "mediastatistics-header-bitmap": "Bitmap బొమ్మలు",
        "mediastatistics-header-drawing": "రేఖాచిత్రాలు (వెక్టర్ చిత్రాలు)",
        "mediastatistics-header-audio": "ఆడియో",
        "mediastatistics-header-video": "వీడియోలు",
+       "mediastatistics-header-multimedia": "రిచ్ మీడియా",
        "mediastatistics-header-office": "కార్యాలయం",
        "mediastatistics-header-text": "పాఠ్య",
+       "mediastatistics-header-executable": "ఎక్జిక్యూటబుల్స్",
+       "mediastatistics-header-archive": "కంప్రెస్‌డ్ ఆకృతులు",
        "mediastatistics-header-total": "అన్ని ఫైళ్ళు",
+       "json-warn-trailing-comma": "JSON నుండి $1 అంత్య {{PLURAL:$1|కామాను|కామాలను}} తీసివేసాం",
+       "json-error-unknown": "JSON తో ఏదో సమస్య ఉంది. లోపం: $1",
        "json-error-state-mismatch": "చెల్లని లేదా సరికాని JSON",
        "json-error-syntax": "వ్యాకరణ దోషం",
        "headline-anchor-title": "ఈ విభాగానికి లంకె",
        "special-characters-title-emdash": "ఎమ్ డాష్",
        "special-characters-title-minus": "మైనస్ గుర్తు",
        "mw-widgets-dateinput-no-date": "ఏ తేదీనీ ఎంచుకోలేదు",
+       "mw-widgets-mediasearch-input-placeholder": "మీడియా కోసం వెతకండి",
+       "mw-widgets-mediasearch-noresults": "ఫలితాలేమీ దొరకలేదు.",
        "mw-widgets-titleinput-description-new-page": "పేజీ ఇంకా లేదు",
+       "mw-widgets-titleinput-description-redirect": "$1 కు దారిమార్పు",
+       "mw-widgets-categoryselector-add-category-placeholder": "ఓ వర్గాన్ని చేర్చండి...",
+       "mw-widgets-usersmultiselect-placeholder": "మరిన్ని చేర్చండి...",
+       "sessionprovider-generic": "$1 సెషన్లు",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "కూకీ-ఆధారిత సెషన్లు",
+       "log-action-filter-block": "నిరోధపు రకం:",
        "log-action-filter-all": "అన్నీ",
+       "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-temporarypassword": "తాత్కాలిక సంకేతపదం",
-       "credentialsform-account": "ఖాతా పేరు:"
+       "authprovider-confirmlink-message": "ఇటీవలి మీ లాగిన్ ప్రయత్నాల ననుసరించి, కింది ఖాతాలను మీ వికీ ఖాతాకు అనుసంధించవచ్చు. వాటిని లింకు చెయ్యడంతో, ఆ ఖాతాల ద్వారా లాగిన్ కావడం చేతనమౌతుంది. ఏయే ఖాతాలను లింకు చెయ్యాలో ఎంచుకోండి.",
+       "authprovider-confirmlink-request-label": "లింకు చెయ్యాల్సిన ఖాతాలు",
+       "authprovider-confirmlink-success-line": "$1: జయప్రదంగా లింకు చేసాం.",
+       "authprovider-confirmlink-failed": "ఖాతాల అనుసంధానం పూర్తిగా జయప్రదం కాలేదు: $1",
+       "authprovider-resetpass-skip-label": "దాటవేయి",
+       "cannotauth-not-allowed-title": "అనుమతి నిరాకరించబడింది",
+       "cannotauth-not-allowed": "ఈ పేజీ వాడుకునే అనుమతి మీకు లేదు",
+       "changecredentials-invalidsubpage": "$1 సరైన అర్హత కాదు",
+       "changecredentials-success": "మీ అర్హతలను మార్చాం.",
+       "removecredentials": "అర్హతలను తీసివెయ్యి",
+       "removecredentials-submit": "అర్హతలను తీసివెయ్యి",
+       "removecredentials-invalidsubpage": "$1 సరైన అర్హత రకం కాదు",
+       "removecredentials-success": "మీ అర్హతలను తీసివేసాం.",
+       "credentialsform-provider": "అర్హతల రకం:",
+       "credentialsform-account": "ఖాతా పేరు:",
+       "cannotlink-no-provider-title": "లింకు చెయ్యదగ్గ ఖాతాలేమీ లేవు",
+       "cannotlink-no-provider": "లింకు చెయ్యదగ్గ ఖాతాలేమీ లేవు.",
+       "linkaccounts": "ఖాతాలను లింకు చెయ్య్యి",
+       "linkaccounts-success-text": "ఖాతాను లింకు చేసాం.",
+       "linkaccounts-submit": "ఖాతాలను లింకు చెయ్యి",
+       "unlinkaccounts": "ఖాతాల లింకు తీసివెయ్యి",
+       "unlinkaccounts-success": "ఖాతా లింకును తీసివేసాం.",
+       "authenticationdatachange-ignored": "ధ్రువీకరణ డేటా మార్పును సాధించలేకపోయాం. ప్రొవైడరును కాన్ఫిగరు చెయ్యలేదేమో?",
+       "userjsispublic": "గమనించండి: JavaScript ఉపపేజీల్లో గోపనీయమైన డేటా ఏమీ ఉండకూడదు. ఇతర వాడుకరులు దాన్ని చూసే అవకాశం ఉంది.",
+       "usercssispublic": "గమనించండి: CSS ఉపపేజీల్లో గోపనీయమైన డేటా ఏమీ ఉండకూడదు. ఇతర వాడుకరులు దాన్ని చూసే అవకాశం ఉంది.",
+       "restrictionsfield-badip": "అసంబద్ధమైన ఐపీ అడ్రసు లేదా శ్రేణి: $1",
+       "restrictionsfield-label": "అనుమతించబడ్డ ఐపీ శ్రేణులు:",
+       "restrictionsfield-help": "వరుసకొక్క ఐపీ అడ్రసు లేదా CIDR శ్రేణి. ప్రతీ ఒక్కదాన్నీ చేతనం చేసేందుకు, వాడండి:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "కూర్పు $1",
+       "pageid": "పేజీ ఐడీ $1"
 }
index 15341c8..fb73ae7 100644 (file)
        "nstab-mediawiki": "Mensajen",
        "nstab-help": "Pájina ajuda",
        "nstab-category": "Kategoria",
+       "mainpage-nstab": "Pájina Mahuluk",
        "nosuchspecialpage": "Pájina espesiál ne'e la iha",
        "nospecialpagetext": "<strong>Pájina espesiál ne'e la iha.</strong>\n\nLista ida pájina espesiál nian [[Special:SpecialPages|iha ne'e]].",
        "error": "Sala",
        "watchthis": "Hateke pájina ne'e",
        "savearticle": "Muda pájina",
        "showdiff": "Hatudu diferensa sira",
-       "anoneditwarning": "Ó lá'os \"log-in\" iha momentu.",
+       "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.",
        "blockedtitle": "Uza-na'in la bele edita (blokeiu)",
        "blockednoreason": "laiha motivu",
        "whitelistedittext": "Ó tenke $1 ba edita pájina sira.",
        "loginreqpagetext": "Ó tenke $1 ba haree pájina seluk.",
        "newarticle": "(Foun)",
-       "noarticletext": "Iha momentu lá'os testu iha pájina ne'e, bele [[Special:Search/{{PAGENAME}}|buka naran pájina nian]] iha pájina seluk, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], ka [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita pájina ne'e]</span>.",
+       "noarticletext": "Iha momentu lá'os testu iha pájina ne'e, bele [[Special:Search/{{PAGENAME}}|buka naran pájina nian]] iha pájina seluk, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], ka [{{fullurl:{{FULLPAGENAME}}|action=edit}} kria pájina ne'e]</span>.",
        "previewnote": "'''Ne'e de'it pájina ba kontrola.'''\nIta-nia mudansa la armazenadu seidauk!",
        "editing": "Edita $1",
        "editingsection": "Edita $1 (seksaun)",
        "permissionserrorstext": "Ó la bele halo ne'e; {{PLURAL:$1|motivu|motivu sira}}:",
        "permissionserrorstext-withaction": "Ita la bele $2. {{PLURAL:$1|Razaun|Razaun sira}}:",
        "currentrev": "Versaun atuál",
+       "currentrev-asof": "Versaun atuál $1 nian",
        "revisionasof": "Versaun $1 nian",
-       "revision-info": "Revisaun loron $4, tempu $5, husi $2",
+       "revision-info": "Revisaun loron $4, tempu $5, husi {{GENDER:$6|$2}}$7",
        "previousrevision": "←Versaun tuan liu",
        "nextrevision": "Versaun foun liu→",
        "currentrevisionlink": "Versaun atuál",
        "import-comment": "Komentáriu:",
        "import-revision-count": "{{PLURAL:$1|versaun ida|versaun $1}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versaun|versaun}} husi $2",
-       "tooltip-pt-userpage": "Ó-nia pájina uza-na'in",
-       "tooltip-pt-mytalk": "Ó-nia pájina diskusaun",
-       "tooltip-pt-preferences": "Ha'u-nia preferénsia",
-       "tooltip-pt-mycontris": "Ó-nia kontribuisaun (lista)",
+       "tooltip-pt-userpage": "{{GENDER:|Ó-nia}} pájina uza-na'in",
+       "tooltip-pt-mytalk": "{{GENDER:|Ó-nia}} pájina diskusaun",
+       "tooltip-pt-preferences": "{{GENDER:|Ó}}-nia preferénsia",
+       "tooltip-pt-mycontris": "{{GENDER:|Ó-nia}} kontribuisaun (lista)",
        "tooltip-pt-login": "Ami rekomenda identifikasaun (\"log in\"), maibé Ita-Boot la presiza halo ne'e",
        "tooltip-pt-logout": "Husik",
        "tooltip-ca-talk": "Diskusaun kona-ba konteúdu pájina nian",
-       "tooltip-ca-edit": "Ita bele edita pájina ne'e. Please use the preview button before saving.",
+       "tooltip-ca-edit": "Edita pájina ne'e",
        "tooltip-ca-addsection": "Tau tan seksaun foun ida.",
        "tooltip-ca-viewsource": "Ema ruma proteje tiha pájina ne'e.\nÓ bele lee testu.",
        "tooltip-ca-history": "Versaun tuan pájina nian",
        "tooltip-n-randompage": "Hola pájina ruma",
        "tooltip-n-help": "Hatudu pájina ajuda.",
        "tooltip-t-whatlinkshere": "Lista pájina nian ne'ebé bá iha ne'e",
-       "tooltip-t-contributions": "Haree lista kontribuisaun uza-na'in ne'e nian",
+       "tooltip-t-contributions": "Haree lista kontribuisaun {{GENDER:$1|uza-na'in ne'e nian}}",
        "tooltip-t-emailuser": "Haruka korreiu eletróniku",
        "tooltip-t-upload": "Tau iha arkivu laran",
        "tooltip-t-specialpages": "Lista pájina espesiál hotu nian",
        "siteusers": "{{PLURAL:$2|uza-na'in|uza-na'in}} {{SITENAME}} nian $1",
        "previousdiff": "←Versaun molok",
        "nextdiff": "Versaun oinmai→",
-       "show-big-image": "Boot liu",
+       "show-big-image": "Fixeiru original",
        "ilsubmit": "Buka",
        "bad_image_list": "Formatu:\n\nLiña hotu tenke komesa ho *\nLigasaun uluk iha liña tenke ligasaun bá imajen aat.\nLigasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.",
        "exif-make": "Fabrikante kámara nian",
        "compare-rev2": "Versaun 2",
        "compare-submit": "Halo komparasaun",
        "rightsnone": "(mamuk)",
-       "searchsuggest-search": "Buka",
+       "searchsuggest-search": "Buka iha {{SITENAME}}",
        "expand_templates_ok": "OK"
 }
index 77ac744..f4ddfcc 100644 (file)
        "prefs-rendering": "Намуд",
        "saveprefs": "Захираи тарҷиҳот",
        "prefs-editing": "Дар ҳоли вироиш",
-       "rows": "Теъдоди сатрҳо:",
-       "columns": "Теъдоди сутунҳо:",
        "searchresultshead": "Ҷустуҷӯ",
        "stub-threshold": "Остонаи вироиши пайвандҳои <a href=\"#\" class=\"stub\">ноқис</a>:",
        "stub-threshold-disabled": "Ғайрифаъолшуда",
        "userrights-reason": "Сабаб:",
        "userrights-no-interwiki": "Шумо иҷозати тағйири ихтиёроти корбарони дигар викиҳоро надоред.",
        "userrights-nodatabase": "Пойгоҳи дода $1 вуҷуд надорад ё маҳаллӣ нест.",
-       "userrights-nologin": "Шумо бояд бо як ҳисоби корбарӣ дорои ихтиёроти мудириятӣ [[Special:UserLogin|ба систем вуруд кунед]], то битавонед ихтиёроти корбаронро таъйид кунед.",
-       "userrights-notallowed": "Ҳисоби корбарии шумо иҷозати тағйири ихтиёроти корбариро надорад.",
        "userrights-changeable-col": "Гурӯҳҳое, ки шумо метавонед тағйир диҳед",
        "userrights-unchangeable-col": "Гурӯҳҳое, ки шумо наметавонед тағйир диҳед",
        "group": "Гурӯҳ:",
index 7e7bc85..7cc72db 100644 (file)
@@ -39,7 +39,7 @@
        "tog-usenewrc": "จัดกลุ่มการเปลี่ยนแปลงแบ่งตามหน้าในรายการปรับปรุงล่าสุดและรายการเฝ้าดู",
        "tog-numberheadings": "กำหนดเลขหัวเรื่องอัตโนมัติ",
        "tog-showtoolbar": "แสดงแถบเครื่องมือแก้ไข",
-       "tog-editondblclick": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\80มืà¹\88อà¸\94ัà¸\9aà¹\80à¸\9aิลà¸\84ลิà¸\81",
+       "tog-editondblclick": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\80มืà¹\88อà¸\84ลิà¸\81สอà¸\87à¸\84รัà¹\89à¸\87",
        "tog-editsectiononrightclick": "เปิดใช้งานการแก้ไขส่วนโดยคลิกขวาที่ชื่อเรื่องของส่วนนั้น",
        "tog-watchcreations": "เพิ่มหน้าที่ฉันสร้างและไฟล์ที่ฉันอัปโหลดเข้ารายการเฝ้าดู",
        "tog-watchdefault": "เพิ่มหน้าและไฟล์ที่ฉันแก้ไขเข้ารายการเฝ้าดู",
        "tog-minordefault": "กำหนดการแก้ไขทุกครั้งเป็นการแก้ไขเล็กน้อยโดยปริยาย",
        "tog-previewontop": "แสดงตัวอย่างก่อนกล่องแก้ไข",
        "tog-previewonfirst": "แสดงตัวอย่างในการแก้ไขครั้งแรก",
-       "tog-enotifwatchlistpages": "อีà¹\80มลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูเปลี่ยนแปลง",
-       "tog-enotifusertalkpages": "อีà¹\80มลหาเมื่อมีการเปลี่ยนแปลงหน้าคุยกับผู้ใช้ของฉัน",
-       "tog-enotifminoredits": "อีà¹\80มลหาเช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย",
+       "tog-enotifwatchlistpages": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เมื่อหน้าหรือไฟล์ในรายการเฝ้าดูเปลี่ยนแปลง",
+       "tog-enotifusertalkpages": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เมื่อมีการเปลี่ยนแปลงหน้าคุยกับผู้ใช้ของฉัน",
+       "tog-enotifminoredits": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย",
        "tog-enotifrevealaddr": "เปิดเผยที่อยู่อีเมลของฉันในอีเมลแจ้งเตือน",
        "tog-shownumberswatching": "แสดงจำนวนผู้ใช้ที่เฝ้าดู",
-       "tog-oldsig": "ลายà¹\80à¸\8bà¹\87à¸\99à¸\97ีà¹\88à¹\83à¸\8aà¹\89อยู่:",
+       "tog-oldsig": "ลายà¹\80à¸\8bà¹\87à¸\99à¸\97ีà¹\88à¸\84ุà¸\93มีอยู่:",
        "tog-fancysig": "ถือลายเซ็นเป็นข้อความวิกิ (โดยไม่มีลิงก์อัตโนมัติ)",
        "tog-uselivepreview": "ใช้การแสดงตัวอย่างแบบสด",
        "tog-forceeditsummary": "เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง",
        "tog-showhiddencats": "แสดงหมวดหมู่ที่ซ่อนอยู่",
        "tog-norollbackdiff": "ไม่แสดงผลต่างหลังดำเนินการย้อนกลับฉุกเฉิน",
        "tog-useeditwarning": "เตือนฉันเมื่อออกหน้าแก้ไขโดยมีการเปลี่ยนแปลงที่ยังไม่บันทึก",
-       "tog-prefershttps": "à¹\83à¸\8aà¹\89à¸\81ารà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อà¸\9bลอà¸\94ภัยà¸\97ุà¸\81à¸\84รัà¹\89à¸\87à¹\80มืà¹\88อลà¹\87อà¸\81อิà¸\99",
+       "tog-prefershttps": "à¹\83à¸\8aà¹\89à¸\81ารà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อà¸\9bลอà¸\94ภัยà¸\97ุà¸\81à¸\84รัà¹\89à¸\87à¹\80มืà¹\88อà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\81ลà¹\89ว",
        "underline-always": "ทุกครั้ง",
        "underline-never": "ไม่",
-       "underline-default": "à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายของหน้าตาหรือเบราว์เซอร์",
+       "underline-default": "à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99ของหน้าตาหรือเบราว์เซอร์",
        "editfont-style": "รูปแบบชุดแบบอักษรในพื้นที่แก้ไข:",
-       "editfont-default": "à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายของเบราว์เซอร์",
+       "editfont-default": "à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99ของเบราว์เซอร์",
        "editfont-monospace": "ชุดอักษรแบบความกว้างคงที่",
        "editfont-sansserif": "ชุดอักษรแบบไม่มีเชิง",
        "editfont-serif": "ชุดอักษรแบบมีเชิง",
        "october-date": "$1 ตุลาคม",
        "november-date": "$1 พฤศจิกายน",
        "december-date": "$1 ธันวาคม",
+       "period-am": "ก่อนเที่ยง",
+       "period-pm": "หลังเที่ยง",
        "pagecategories": "{{PLURAL:$1|หมวดหมู่|หมวดหมู่}}",
        "category_header": "หน้าในหมวดหมู่ \"$1\"",
        "subcategories": "หมวดหมู่ย่อย",
        "newwindow": "(เปิดหน้าต่างใหม่)",
        "cancel": "ยกเลิก",
        "moredotdotdot": "ดูเพิ่ม...",
-       "morenotlisted": "รายการนี้ไม่สมบูรณ์",
+       "morenotlisted": "รายà¸\81ารà¸\99ีà¹\89อาà¸\88à¹\84มà¹\88สมà¸\9aูรà¸\93à¹\8c",
        "mypage": "หน้า",
        "mytalk": "พูดคุย",
        "anontalk": "พูดคุย",
        "qbedit": "แก้ไข",
        "qbpageoptions": "หน้านี้",
        "qbmyoptions": "หน้าของฉัน",
-       "faq": "คำถามพบบ่อย",
-       "faqpage": "Project:คำถามพบบ่อย",
+       "faq": "à¸\84ำà¸\96ามà¸\97ีà¹\88à¸\9eà¸\9aà¸\9aà¹\88อย",
+       "faqpage": "Project:à¸\84ำà¸\96ามà¸\97ีà¹\88à¸\9eà¸\9aà¸\9aà¹\88อย",
        "actions": "ปฏิบัติการ",
        "namespaces": "เนมสเปซ",
        "variants": "สิ่งที่แตกต่าง",
        "searcharticle": "ไป",
        "history": "ประวัติหน้า",
        "history_short": "ประวัติ",
+       "history_small": "ประวัติ",
        "updatedmarker": "ถูกปรับตั้งแต่การเยี่ยมชมครั้งสุดท้ายของฉัน",
        "printableversion": "รุ่นพร้อมพิมพ์",
        "permalink": "ลิงก์ถาวร",
        "delete": "ลบ",
        "deletethispage": "ลบหน้านี้",
        "undeletethispage": "กู้คืนหน้านี้",
-       "undelete_short": "กู้คืน $1 การแก้ไข",
+       "undelete_short": "กู้คืนการแก้ไข $1 ครั้ง",
        "viewdeleted_short": "ดู $1 การแก้ไขที่ถูกลบ",
        "protect": "ล็อก",
        "protect_change": "เปลี่ยน",
        "talk": "อภิปราย",
        "views": "ดู",
        "toolbox": "เครื่องมือ",
+       "tool-link-userrights": "เปลี่ยนกลุ่ม{{GENDER:$1|ผู้ใช้}}",
+       "tool-link-userrights-readonly": "ดูกลุ่ม{{GENDER:$1|ผู้ใช้}}",
+       "tool-link-emailuser": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้",
        "userpage": "ดูหน้าผู้ใช้",
        "projectpage": "ดูหน้าโครงการ",
        "imagepage": "ดูหน้าไฟล์",
        "mediawikipage": "ดูหน้าข้อความ",
        "templatepage": "ดูหน้าแม่แบบ",
-       "viewhelppage": "à¸\94ูหà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย",
+       "viewhelppage": "à¸\94ูหà¸\99à¹\89าวิà¸\98ีà¹\83à¸\8aà¹\89",
        "categorypage": "ดูหน้าหมวดหมู่",
        "viewtalkpage": "ดูการพูดคุย",
        "otherlanguages": "ในภาษาอื่น",
        "redirectto": "เปลี่ยนทางไป:",
        "lastmodifiedat": "ดัดแปรหน้านี้ล่าสุดเมื่อวันที่ $1 เวลา $2",
        "viewcount": "มีการเข้าถึงหน้านี้ $1 ครั้ง",
-       "protectedpage": "หà¸\99à¹\89าà¸\96ูà¸\81ลà¹\87อà¸\81",
+       "protectedpage": "หà¸\99à¹\89าà¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
        "jumpto": "ข้ามไป:",
        "jumptonavigation": "การนำทาง",
        "jumptosearch": "ค้นหา",
        "pool-timeout": "หมดเวลารอกำลังรอล็อก",
        "pool-queuefull": "พื้นที่รองรับคิวเต็ม",
        "pool-errorunknown": "เกิดข้อผิดพลาดไม่ทราบสาเหตุ",
+       "pool-servererror": "บริการพูลเคาน์เตอร์ไม่พร้อมใช้งาน ($1)",
+       "poolcounter-usage-error": "เกิดข้อผิดพลาดในการใช้งาน: $1",
        "aboutsite": "เกี่ยวกับ{{SITENAME}}",
        "aboutpage": "Project:เกี่ยวกับ",
        "copyright": "เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1 เว้นแต่ระบุไว้เป็นอย่างอื่น",
        "databaseerror-query": "คำสั่ง: $1",
        "databaseerror-function": "ฟังก์ชัน: $1",
        "databaseerror-error": "ข้อผิดพลาด: $1",
-       "laggedslavemode": "<strong>คำเตือน:</strong> หน้านี้อาจไม่มีการปรับล่าสุด",
+       "laggedslavemode": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸«à¸\99à¹\89าà¸\99ีà¹\89อาà¸\88à¹\84มà¹\88มีà¸\81ารà¸\9bรัà¸\9aà¸\82à¹\89อมูลลà¹\88าสุà¸\94",
        "readonly": "ฐานข้อมูลถูกล็อก",
        "enterlockreason": "ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก",
        "readonlytext": "ขณะนี้ฐานข้อมูลถูกล็อกรายการใหม่และการแก้ไขเพิ่มเติมอื่น อาจเป็นเพราะการบำรุงรักษาฐานข้อมูลรูทีน หลังแล้วเสร็จจะกลับมาใช้งานได้ตามปกติ\n\nผู้ดูแลระบบที่ล็อกได้ให้คำอธิบายดังนี้: $1",
        "readonly_lag": "ฐานข้อมูลถูกล็อกอัตโนมัติขณะที่เซิร์ฟเวอร์ฐานข้อมูลรองกำลังปรับปรุงตามฐานข้อมูลหลัก",
        "internalerror": "ข้อผิดพลาดภายใน",
        "internalerror_info": "เกิดข้อผิดพลาดภายใน: $1",
-       "filecopyerror": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไป \"$2\"",
+       "internalerror-fatal-exception": "การยกเว้นข้อผิดพลาดร้ายแรงของประเภท \"$1\"",
+       "filecopyerror": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไปยัง \"$2\" ได้",
        "filerenameerror": "ไม่สามารถเปลี่ยนชื่อไฟล์ \"$1\" เป็น \"$2\"",
        "filedeleteerror": "ไม่สามารถลบไฟล์ \"$1\"",
        "directorycreateerror": "ไม่สามารถสร้างสารบบ \"$1\"",
+       "directoryreadonlyerror": "ไดเรกทอรี \"$1\" อ่านได้อย่างเดียว",
+       "directorynotreadableerror": "ไดเรกทอรี \"$1\" ไม่สามารถอ่านได้",
        "filenotfound": "ไม่พบไฟล์ \"$1\"",
        "unexpected": "ค่าไม่คาดหมาย: \"$1\"=\"$2\"",
        "formerror": "มีข้อผิดพลาด: ส่งแบบไม่ได้",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เพราะหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
-       "mycustomcssprotected": "คุณไม่มีสิทธิแก้ไขหน้าซีเอสเอสนี้",
+       "mycustomcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้",
        "mycustomjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้",
        "myprivateinfoprotected": "คุณไม่มีสิทธิแก้ไขข้อมูลส่วนตัวของคุณ",
        "mypreferencesprotected": "คุณไม่มีสิทธิแก้ไขการตั้งค่าของคุณ",
-       "ns-specialprotected": "ไม่สามารถแก้ไขหน้าพิเศษ",
+       "ns-specialprotected": "ไม่สามารถแก้ไขหน้าพิเศษได้",
        "titleprotected": "ชื่อเรื่องนี้ถูก [[User:$1|$1]] ป้องกันมิให้สร้าง\nเหตุผลที่ให้ไว้คือ <em>$2</em>",
        "filereadonlyerror": "ไม่สามารถแก้ไขไฟล์ \"$1\" เพราะที่เก็บไฟล์ \"$2\" อยู่ในภาวะอ่านอย่างเดียว\n\nผู้ดูแลระบบที่ล็อกให้คำอธิบายว่า: \"$3\"",
        "invalidtitle-knownnamespace": "ชื่อเรื่องที่มีเนมสเปซ \"$2\" กับข้อความ \"$3\" ไม่ถูกต้อง",
        "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": "ล็อกอิน",
        "userlogin-resetpassword-link": "ลืมรหัสผ่านหรือ",
        "userlogin-helplink2": "วิธีใช้เรื่องการล็อกอิน",
        "userlogin-loggedin": "คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว\nใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง",
+       "userlogin-reauth": "คุณต้องเข้าสู่ระบบอีกครั้งเพื่อยืนยันว่าคุณคือ{{GENDER:$1|$1}}",
        "userlogin-createanother": "สร้างอีกบัญชี",
        "createacct-emailrequired": "ที่อยู่อีเมล",
        "createacct-emailoptional": "ที่อยู่อีเมล (เลือกไม่ใส่ก็ได้)",
        "createacct-email-ph": "กรอกที่อยู่อีเมลของคุณ",
        "createacct-another-email-ph": "กรอกที่อยู่อีเมล",
        "createaccountmail": "ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ",
+       "createaccountmail-help": "สามารถใช้สร้างบัญชีสำหรับบุคคลอื่นๆ โดยที่ไม่ต้องเรียนรู้รหัสผ่านก็ได้",
        "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)",
        "createaccountreason": "เหตุผล:",
        "createacct-reason": "เหตุผล",
        "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี",
+       "createacct-reason-help": "ข้อความที่แสดงในล็อกการสร้างบัญชี",
        "createacct-submit": "สร้างบัญชีของคุณ",
        "createacct-another-submit": "สร้างบัญชี",
+       "createacct-continue-submit": "ทำการสร้างบัญชีต่อไป",
+       "createacct-another-continue-submit": "ทำการสร้างบัญชีต่อไป",
        "createacct-benefit-heading": "{{SITENAME}}สร้างจากคนเช่นคุณ",
        "createacct-benefit-body1": "$1 การแก้ไข",
        "createacct-benefit-body2": "$1 หน้า",
        "nocookiesnew": "สร้างบัญชีผู้ใช้แล้ว แต่ยังไม่ได้ล็อกอิน \n{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nโปรดเปิดใช้งาน แล้วล็อกอินพร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ",
        "nocookieslogin": "{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nกรุณาเปิดใช้งานและลองอีกครั้ง",
        "nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง",
+       "createacct-loginerror": "บัญชีผู้ใช้ถูกสร้างสำเร็จแล้ว แต่คุณไม่สามารถเข้าสู่ระบบได้โดยอัตโนมัติ โปรด[[Special:UserLogin|เข้าสู่ระบบด้วยตนเอง]]",
        "noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง",
        "loginsuccesstitle": "ล็อกอินสำเร็จ",
        "loginsuccess": "<strong>ขณะนี้คุณล็อกอินสู่ {{SITENAME}} ในชื่อ \"$1\"</strong>",
        "eauthentsent": "อีเมลยืนยันถูกส่งไปยังที่อยู่อีเมลที่ระบุไว้แล้ว \nก่อนที่อีเมลอื่นจะถูกส่งไปยังบัญชีนั้น คุณต้องปฏิบัติตามคำสั่งในอีเมลเพื่อยืนยันว่าบัญชีนั้นเป็นของคุณจริง ๆ",
        "throttled-mailpassword": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา \nอีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำผิด",
        "mailerror": "ข้อผิดพลาดในการส่งเมล: $1",
-       "acct_creation_throttle_hit": "ผู้เข้าชมวิกินี้ที่ใช้เลขที่อยู่ไอพีของคุณ ได้สร้าง $1 บัญชีแล้วในวันที่ผ่านมา ซึ่งเป็นจำนวนสูงสุดที่อนุญาตในช่วงเวลาดังกล่าว\nจึงส่งผลให้ผู้เข้าชมที่ใช้เลขที่อยู่ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้",
+       "acct_creation_throttle_hit": "ผู้เข้าชมวิกินี้ที่ใช้เลขที่อยู่ไอพีของคุณ ได้สร้าง {{PLURAL:$1|1 บัญชี|$1 บัญชี}}แล้วเมื่อ $2 ผ่านมา ซึ่งเป็นจำนวนสูงสุดที่อนุญาตในช่วงเวลาดังกล่าว\nจึงส่งผลให้ผู้เข้าชมที่ใช้เลขที่อยู่ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้",
        "emailauthenticated": "ยืนยันที่อยู่อีเมลของคุณเมื่อวันที่ $2 เวลา $3",
        "emailnotauthenticated": "ที่อยู่อีเมลของคุณยังไม่ได้รับการยืนยัน \nจะไม่มีการส่งอีเมลสำหรับคุณลักษณะใด ๆ ต่อไปนี้",
        "noemailprefs": "ระบุที่อยู่อีเมลในการตั้งค่าของคุณเพื่อให้คุณลักษณะเหล่านี้ทำงานได้",
        "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
        "pt-login": "ล็อกอิน",
        "pt-login-button": "ล็อกอิน",
+       "pt-login-continue-button": "ทำการเข้าสู่ระบบต่อไป",
        "pt-createaccount": "สร้างบัญชี",
        "pt-userlogout": "ล็อกเอาต์",
        "php-mail-error-unknown": "เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี",
        "changepassword-success": "เปลี่ยนรหัสผ่านของคุณสำเร็จ!",
        "changepassword-throttled": "ล่าสุดคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "botpasswords": "รหัสผ่านบอต",
+       "botpasswords-summary": "<em>รหัสผ่านบอต</em>อนุญาตการเข้าถึงให้กับบัญชีผู้ใช้ผ่านทาง API โดยไม่ต้องใช้ใบรับรองการล็อกอินหลักของบัญชีนี้ สิทธิผู้ใช้เมื่อล็อกอินด้วยรหัสผ่านบอตอาจถูกจำกัด\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-grants-column": "อนุญาตแล้ว",
+       "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": "ลบรหัสผ่านบอตแล้ว",
+       "botpasswords-deleted-body": "รหัสผ่านบอตสำหรับชื่อบอต \"$1\" ของผู้ใช้ชื่อ \"$2\" ถูกลบออกแล้ว",
+       "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-submit-cancel": "ยกเลิก",
        "passwordreset-emaildisabled": "วิกินี้ปิดใช้งานคุณลักษณะอีเมล",
        "passwordreset-username": "ชื่อผู้ใช้:",
        "passwordreset-domain": "โดเมน:",
-       "passwordreset-capture": "ดูอีเมลที่ได้หรือไม่",
-       "passwordreset-capture-help": "หากคุณเลือกกล่องนี้ จะแสดงอีเมลดังกล่าว (พร้อมรหัสผ่านชั่วคราว) แก่คุณ เช่นเดียวกับส่งไปยังผู้ใช้",
        "passwordreset-email": "ที่อยู่อีเมล:",
        "passwordreset-emailtitle": "รายละเอียดบัญชีบน {{SITENAME}}",
        "passwordreset-emailtext-ip": "บางคน (ซึ่งอาจเป็นคุณ จากเลขที่อยู่ไอพี $1) ขอตั้งรหัสผ่านของคุณใหม่บน{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "passwordreset-emailelement": "ชื่อผู้ใช้: \n$1\n\nรหัสผ่านชั่วคราว: \n$2",
        "passwordreset-emailsentemail": "หากที่อยู่อีเมลนี้สัมพันธ์กับบัญชีของคุณ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่",
        "passwordreset-emailsentusername": "หากมีที่อยู่อีเมลที่ลงทะเบียนไว้ด้วยกับชื่อผู้ใช้นี้ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่",
+       "passwordreset-invalidemail": "ที่อยู่อีเมลไม่ถูกต้อง",
+       "passwordreset-nodata": "ไม่ได้ระบุชื่อผู้ใช้และรหัสผ่านไว้",
        "changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล",
        "changeemail-header": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ หากคุณต้องการลบการเชื่อมโยงของที่อยู่อีเมลใด ๆ จากบัญชีของคุณ ให้เว้นที่อยู่อีเมลใหม่ว่างเมื่อส่งแบบ",
        "changeemail-no-info": "คุณจำต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
        "minoredit": "เป็นการแก้ไขเล็กน้อย",
        "watchthis": "เฝ้าดูหน้านี้",
        "savearticle": "บันทึกหน้า",
+       "savechanges": "บันทึกการเปลี่ยนแปลง",
        "publishpage": "เผยแพร่หน้า",
+       "publishchanges": "เผยแพร่การเปลี่ยนแปลง",
        "preview": "ตัวอย่าง",
        "showpreview": "แสดงตัวอย่าง",
        "showdiff": "แสดงการเปลี่ยนแปลง",
        "blockedtitle": "ผู้ใช้ถูกบล็อก",
        "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "autoblockedtext": "เลขที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติ เพราะเคยมีผู้ใช้อื่นใช้ ซึ่งถูกบล็อกโดย $1\nโดยให้เหตุผลว่า\n\n:<em>$2</em>\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": "คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า \nโปรดตั้งและตรวจสอบความสมเหตุสมผลของที่อยู่อีเมลของคุผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]",
        "previewnote": "<strong>พึงระลึกว่านี่เป็นเพียงการแสดงตัวอย่าง</strong>\nยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณ!",
        "continue-editing": "ไปพื้นที่แก้ไข",
        "previewconflict": "ตัวอย่างนี้สะท้อนข้อความในพื้นที่แก้ไขข้อความส่วนบนซึ่งจะปรากฏหากคุณเลือกบันทึก",
-       "session_fail_preview": "<strong>ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย</strong>\nโปรดลองอีกครั้ง \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
-       "session_fail_preview_html": "<strong>ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย</strong>\n\n<em>เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์</em>\n\n<strong>หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
+       "session_fail_preview": "ขออภัย! เราไม่สามารถดำเนินการแก้ไขของคุณได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย\n\nคุณอาจล็อกเอาต์ไปแล้ว <strong>โปรดตรวจดูให้แน่ใจว่าคุณล็อกอินอยู่ แล้วลองอีกครั้ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา แล้วตรวจดูว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
+       "session_fail_preview_html": "ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย\n\n<em>เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์</em>\n\n<strong>หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา และตรวจดูให้แน่ใจว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
        "token_suffix_mismatch": "<strong>การแก้ไขของคุณถูกปฏิเสธ เนื่องจากเครื่องลูกข่ายของคุณทำให้อักขระเครื่องหมายวรรคตอนในโทเค็นการแก้ไขเสีย</strong>\nการแก้ไขนี้ถูกปฏิเสธเพื่อป้องกันการวิบัติของข้อความหน้า\nบางครั้งเกิดปัญหานี้ขึ้นเมื่อคุณใช้บริการเว็บพร็อกซีนิรนามที่มีจุดบกพร่อง",
        "edit_form_incomplete": "<strong>แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง</strong>",
        "editing": "กำลังแก้ไข $1",
        "content-model-text": "ข้อความธรรมดา",
        "content-model-javascript": "จาวาสคริปต์",
        "content-model-css": "CSS",
+       "content-json-empty-object": "วัตถุเปล่า",
+       "content-json-empty-array": "แถวเปล่า",
        "duplicate-args-category": "หน้าที่ใช้อาร์กิวเมนต์ซ้ำในการเรียกแม่แบบ",
        "expensive-parserfunction-warning": "<strong>คำเตือน:</strong> หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
        "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป",
        "mergehistory-empty": "ไม่มีรุ่นปรับปรุงที่รวมได้",
        "mergehistory-done": "รวม $3 รุ่นปรับปรุงของ $1 เข้ากับ [[:$2]] แล้ว",
        "mergehistory-fail": "ไม่สามารถรวมประวัติได้ โปรดตรวจสอบตัวแปรเสริมหน้าและเวลาอีกครั้ง",
+       "mergehistory-fail-bad-timestamp": "สแตมป์เวลาไม่ถูกต้อง",
+       "mergehistory-fail-invalid-source": "หน้าต้นทางไม่ถูกต้อง",
+       "mergehistory-fail-invalid-dest": "หน้าปลายทางไม่ถูกต้อง",
+       "mergehistory-fail-permission": "มีสิทธิไม่เพียงพอที่จะผสานประวัติ",
+       "mergehistory-fail-self-merge": "หน้าต้นทางและปลายทางเป็นหน้าเดียวกัน",
+       "mergehistory-fail-toobig": "ไม่สามารถผสานประวัติได้ เนื่องจาก $1 รุ่นแก้ไขเก่าที่เกินขีดจำกัดสูงสุดจะต้องถูกย้ายไปก่อน",
        "mergehistory-no-source": "ไม่มีหน้าต้นทาง $1",
        "mergehistory-no-destination": "ไม่มีหน้าปลายทาง $1",
        "mergehistory-invalid-source": "ชื่อเรื่องหน้าต้นทางต้องสมเหตุสมผล",
        "search-external": "ค้นหาภายนอก",
        "searchdisabled": "การค้นหา {{SITENAME}} ถูกปิดใช้งาน \nคุณสามารถค้นหาโดยทางกูเกิลในระหว่างนั้น\nโปรดทราบว่าดัชนีเนื้อหา {{SITENAME} อาจล้าสมัย",
        "search-error": "มีข้อผิดพลาดขณะค้นหา: $1",
+       "search-warning": "มีคำเตือนขณะค้นหา: $1",
        "preferences": "การตั้งค่า",
        "mypreferences": "การตั้งค่า",
        "prefs-edits": "จำนวนการแก้ไข:",
        "saveprefs": "บันทึก",
        "restoreprefs": "คืนการตั้งค่าโดยปริยายทั้งหมด (ในทุกส่วน)",
        "prefs-editing": "การแก้ไข",
-       "rows": "แถว:",
-       "columns": "คอลัมน์:",
        "searchresultshead": "ค้นหา",
        "stub-threshold": "ขีดแบ่งสำหรับการจัดรูปแบบลิงก์โครง ($1):",
        "stub-threshold-sample-link": "ตัวอย่าง",
        "prefs-help-recentchangescount": "นี่รวมถึงการปรับปรุงล่าสุด ประวิติหน้า และปูม",
        "prefs-help-watchlist-token2": "นี่คือแป้นลับสำหรับเข้าการป้อนเว็บรายการเฝ้าดูของคุณ\nใครก็ตามที่ทราบจะสามารถอ่านรายการเฝ้าดูของคุณได้ ฉะนั้นอย่าบอกผู้อื่น\n[[Special:ResetTokens|คลิกที่นี่หากคุณต้องการตั้งใหม่]]",
        "savedprefs": "บันทึกการตั้งค่าของคุณแล้ว",
-       "savedrights": "à¸\9aัà¸\99à¸\97ึà¸\81สิà¸\97à¸\98ิผู้ใช้ของ {{GENDER:$1|$1}} แล้ว",
+       "savedrights": "à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ลุà¹\88มผู้ใช้ของ {{GENDER:$1|$1}} แล้ว",
        "timezonelegend": "เขตเวลา:",
        "localtime": "เวลาท้องถิ่น:",
        "timezoneuseserverdefault": "ใช้ค่าโดยปริยายของวิกิ ($1)",
        "prefswarning-warning": "คุณเปลี่ยนแปลงการตั้งค่าของคุณที่ยังไม่ได้บันทึก\nหากคุณออกจากหน้านี้โดยไม่คลิก \"$1\" จะไม่ปรับการตั้งค่าของคุณ",
        "prefs-tabs-navigation-hint": "แนะนำ: คุณสามารถใช้แป้นลูกศรซ้ายและขวาเพื่อนำทางระหว่างแถบในรายการแถบได้",
        "userrights": "การบริหารสิทธิผู้ใช้",
-       "userrights-lookup-user": "à¸\9aริหารà¸\81ลุà¹\88มผู้ใช้",
+       "userrights-lookup-user": "à¹\80ลือà¸\81ผู้ใช้",
        "userrights-user-editname": "ใส่ชื่อผู้ใช้:",
-       "editusergroup": "à¹\81à¸\81à¹\89à¹\84à¸\82à¸\81ลุà¹\88ม{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}",
+       "editusergroup": "à¹\82หลà¸\94à¸\81ลุà¹\88มà¸\9cูà¹\89à¹\83à¸\8aà¹\89",
        "editinguser": "กำลังเปลี่ยนสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "กำลังดูสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "แก้ไขกลุ่มผู้ใช้",
+       "userrights-viewusergroup": "ดูกลุ่มผู้ใช้",
        "saveusergroups": "บันทึกกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "userrights-groupsmember": "สมาชิกของ:",
        "userrights-groupsmember-auto": "สมาชิกโดยปริยายของ:",
        "userrights-reason": "เหตุผล:",
        "userrights-no-interwiki": "คุณไม่มีสิทธิแก้ไขสิทธิผู้ใช้บนวิกิอื่น",
        "userrights-nodatabase": "ไม่มีฐานข้อมูล $1 หรือฐานข้อมูลอยู่บนเครื่องอื่น",
-       "userrights-nologin": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ดูแลระบบก่อน จึงจะกำหนดสิทธิผู้ใช้ได้",
-       "userrights-notallowed": "บัญชีของคุณไม่มีสิทธิเพิ่มหรือเพิกถอนสิทธิผู้ใช้",
        "userrights-changeable-col": "กลุ่มที่คุณสามารถเปลี่ยนได้",
        "userrights-unchangeable-col": "กลุ่มที่คุณไม่สามารถเปลี่ยนได้",
        "userrights-conflict": "พบการเปลี่ยนแปลงสิทธิผู้ใช้ขัดกัน! โปรดทบทวนและยืนยันการเปลี่ยนแปลงของคุณ",
-       "userrights-removed-self": "คุณเพิกถอนสิทธิของคุณสำเร็จแล้ว ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีก",
        "group": "กลุ่ม:",
        "group-user": "ผู้ใช้",
        "group-autoconfirmed": "ผู้ใช้ทั่วไป",
        "right-createpage": "สร้างหน้า (ที่ไม่ใช่หน้าอภิปราย)",
        "right-createtalk": "สร้างหน้าอภิปราย",
        "right-createaccount": "สร้างบัญชีผู้ใช้ใหม่",
+       "right-autocreateaccount": "ล็อกอินโดยใช้บัญชีผู้ใช้ภายนอกอัตโนมัติ",
        "right-minoredit": "ทำเครื่องหมายการแก้ไขเป็นการแก้ไขเล็กน้อย",
        "right-move": "ย้ายหน้า",
        "right-move-subpages": "ย้ายหน้าพร้อมหน้าย่อย",
        "right-siteadmin": "ล็อกและปลดล็อกฐานข้อมูล",
        "right-override-export-depth": "ส่งออกหน้า รวมหน้าที่เชื่อมโยงกับหน้านี้สูงสุด 5 ลำดับชั้น",
        "right-sendemail": "ส่งอีเมลหาผู้ใช้อื่น",
-       "right-passwordreset": "ดูอีเมลตั้งรหัสผ่านใหม่",
+       "right-managechangetags": "สร้างและเปิด/ปิดใช้งาน[[Special:Tags|ป้ายชื่อ]]",
+       "right-deletechangetags": "ลบ[[Special:Tags|ป้ายชื่อ]]ออกจากฐานข้อมูล",
+       "grant-group-page-interaction": "โต้ตอบกับหน้า",
+       "grant-group-file-interaction": "โต้ตอบกับสื่อ",
+       "grant-group-watchlist-interaction": "โต้ตอบกับรายการเฝ้าดูของคุณ",
        "grant-group-email": "ส่งอีเมล",
+       "grant-group-customization": "การปรับแต่งและการตั้งค่า",
+       "grant-group-other": "กิจกรรมเบ็ดเตล็ด",
+       "grant-blockusers": "บล็อกและปลดบล็อกผู้ใช้ต่าง ๆ",
        "grant-createaccount": "สร้างบัญชี",
        "grant-createeditmovepage": "สร้าง แก้ไข และย้ายหน้า",
+       "grant-delete": "ลบหน้า รุ่นแก้ไขเก่า และรายการบันทึก",
+       "grant-editinterface": "แก้ไขเนมสเปซของมีเดียวิกิและ CSS/JavaScript ของผู้ใช้",
+       "grant-editmycssjs": "แก้ไข CSS/JavaScript ผู้ใช้ของคุณ",
+       "grant-editmyoptions": "แก้ไขการตั้งค่าผู้ใช้ของคุณ",
        "grant-editmywatchlist": "แก้ไขรายการเฝ้าดูของคุณ",
        "grant-editpage": "แก้ไขหน้านี้",
+       "grant-editprotected": "แก้ไขหน้าที่ถูกล็อก",
+       "grant-highvolume": "การแก้ไขในปริมาณสูง",
+       "grant-patrol": "ลาดตระเวนตรวจการเปลี่ยนแปลงหน้าต่าง ๆ",
+       "grant-privateinfo": "เข้าถึงข้อมูลส่วนบุคคล",
+       "grant-protect": "ล็อกและปลดล็อกหน้าต่าง ๆ",
+       "grant-rollback": "ทำกลับการเปลี่ยนแปลงในหน้า",
+       "grant-sendemail": "ส่งอีเมลหาผู้ใช้อื่น",
        "grant-uploadeditmovefile": "อัปโหลด แทนที่ และย้ายไฟล์",
        "grant-uploadfile": "อัปโหลดไฟล์ใหม่",
+       "grant-basic": "สิทธิพื้นฐาน",
+       "grant-viewdeleted": "ดูไฟล์และหน้าที่ถูกลบ",
        "grant-viewmywatchlist": "ดูรายการเฝ้าดูของคุณ",
+       "grant-viewrestrictedlogs": "ดูรายการบันทึกที่ถูกจำกัดไว้",
        "newuserlogpage": "ปูมการสร้างผู้ใช้",
        "newuserlogpagetext": "นี่คือปูมการสร้างผู้ใช้",
        "rightslog": "ปูมสิทธิผู้ใช้",
        "rightslogtext": "นี่คือปูมการเปลี่ยนแปลงสิทธิผู้ใช้",
        "action-read": "อ่านหน้านี้",
        "action-edit": "แก้ไขหน้านี้",
-       "action-createpage": "สร้างหน้า",
-       "action-createtalk": "สร้างหน้าอภิปราย",
+       "action-createpage": "สร้างหน้านี้",
+       "action-createtalk": "สร้างหน้าอภิปรายนี้",
        "action-createaccount": "สร้างบัญชีผู้ใช้นี้",
+       "action-autocreateaccount": "สร้างบัญชีผู้ใช้ภายนอกนี้อัตโนมัติ",
        "action-history": "ดูประวัติหน้านี้",
        "action-minoredit": "ทำเครื่องหมายการแก้ไขนี้เป็นการแก้ไขเล็กน้อย",
        "action-move": "ย้ายหน้านี้",
        "action-upload_by_url": "อัปโหลดไฟล์นี้จากยูอาร์แอล",
        "action-writeapi": "ใช้การเขียนเอพีไอ",
        "action-delete": "ลบหน้านี้",
-       "action-deleterevision": "ลบรุ่นปรับปรุงนี้",
-       "action-deletedhistory": "ดูประวัติที่ถูกลบของหน้านี้",
+       "action-deleterevision": "ลบรุ่นปรับปรุง",
+       "action-deletelogentry": "ลบรายการบันทึก",
+       "action-deletedhistory": "ดูประวัติที่ถูกลบของหน้าใดหน้าหนึ่ง",
+       "action-deletedtext": "ดูข้อความรุ่นแก้ไขเก่าที่ถูกลบ",
        "action-browsearchive": "ค้นหาหน้าที่ถูกลบ",
-       "action-undelete": "กู้คืนหน้านี้",
-       "action-suppressrevision": "à¸\97à¸\9aà¸\97วà¸\99à¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¸\8bà¹\88อà¸\99อยูà¹\88à¸\99ีà¹\89",
+       "action-undelete": "กู้คืนหน้า",
+       "action-suppressrevision": "à¸\95รวà¸\88à¸\97าà¸\99à¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¸\8bà¹\88อà¸\99อยูà¹\88",
        "action-suppressionlog": "ดูปูมส่วนตัวนี้",
        "action-block": "บล็อกผู้ใช้นี้มิให้แก้ไข",
        "action-protect": "เปลี่ยนระดับการล็อกสำหรับหน้านี้",
        "action-userrights-interwiki": "แก้ไขสิทธิผู้ใช้ของผู้ใช้บนวิกิอื่น",
        "action-siteadmin": "ล็อกหรือปลดล็อกฐานข้อมูล",
        "action-sendemail": "ส่งอีเมล",
+       "action-editmyoptions": "แก้ไขการตั้งค่าของคุณ",
        "action-editmywatchlist": "แก้ไขรายการเฝ้าดูของคุณ",
        "action-viewmywatchlist": "ดูรายการเฝ้าดูของคุณ",
        "action-viewmyprivateinfo": "ดูสารสนเทศส่วนตัวของคุณ",
        "action-editmyprivateinfo": "แก้ไขสารสนเทศส่วนตัวของคุณ",
        "action-editcontentmodel": "แก้ไขตัวแบบเนื้อหาของหน้า",
+       "action-deletechangetags": "ลบป้ายชื่อออกจากฐานข้อมูล",
+       "action-purge": "ล้างหน้านี้",
        "nchanges": "$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-activefilters": "ตัวกรองที่ทำงาน",
+       "rcfilters-restore-default-filters": "คืนค่าตัวกรองปริยาย",
+       "rcfilters-clear-all-filters": "ล้างตัวกรองทั้งหมด",
+       "rcfilters-invalid-filter": "ตัวกรองไม่ถูกต้อง",
+       "rcfilters-filterlist-title": "ตัวกรอง",
+       "rcfilters-filterlist-noresults": "ไม่พบตัวกรองใด ๆ",
+       "rcfilters-filtergroup-registration": "การลงทะเบียนผู้ใช้",
+       "rcfilters-filter-registered-label": "ลงทะเบียน",
+       "rcfilters-filter-registered-description": "ผู้แก้ไขที่ล็อกอินแล้ว",
+       "rcfilters-filter-unregistered-label": "ไม่ได้ลงทะเบียน",
+       "rcfilters-filter-unregistered-description": "ผู้แก้ไขที่ไม่ได้ล็อกอิน",
+       "rcfilters-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-experienced-label": "ผู้ใช้ที่มีความเชี่ยวชาญ",
        "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$3, $4</strong> (แสดงมากสุด <strong>$1</strong>)",
        "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $2, $3",
        "rcshowhideminor": "$1การแก้ไขเล็กน้อย",
        "recentchangeslinked-page": "ชื่อหน้า:",
        "recentchangeslinked-to": "แสดงการเปลี่ยนแปลงไปหน้าซึ่งโยงไปหน้าที่ระบุแทน",
        "recentchanges-page-added-to-category": "[[:$1]] ถูกเพิ่มเข้าหมวดหมู่",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] à¹\81ละ $2 à¸«à¸\99à¹\89าà¸\96ูà¸\81à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89าหมวà¸\94หมูà¹\88",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] à¸\96ูà¸\81à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89าหมวà¸\94หมูà¹\88à¹\81ลà¹\89ว [[Special:WhatLinksHere/$1|หà¸\99à¹\89าà¸\99ีà¹\89รวมà¸\96ึà¸\87ภายà¹\83à¸\99หà¸\99à¹\89าอืà¹\88à¸\99à¹\86 à¸\94à¹\89วย]]",
        "recentchanges-page-removed-from-category": "[[:$1]] ถูกลบจากหมวดหมู่",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] à¹\81ละ $2 à¸«à¸\99à¹\89าà¸\96ูà¸\81ลà¸\9aà¸\88าà¸\81หมวà¸\94หมูà¹\88",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] à¸\96ูà¸\81ลà¸\9aà¸\88าà¸\81หมวà¸\94หมูà¹\88à¹\81ลà¹\89ว [[Special:WhatLinksHere/$1|หà¸\99à¹\89าà¸\99ีà¹\89รวมà¸\96ึà¸\87ภายà¹\83à¸\99หà¸\99à¹\89าอืà¹\88à¸\99à¹\86 à¸\94à¹\89วย]]",
        "autochange-username": "การเปลี่ยนแปลงอัตโนมัติมีเดียวิกิ",
        "upload": "อัปโหลดไฟล์",
        "uploadbtn": "อัปโหลดไฟล์",
        "uploaddisabledtext": "ปิดใช้งานการอัปโหลดไฟล์",
        "php-uploaddisabledtext": "ปิดการใช้งานการอัปโหลดไฟล์ในพีเอชพี\nกรุณาตรวจสอบการตั้งค่า file_uploads",
        "uploadscripted": "ไฟล์นี้มีโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้การแปลคำสั่งของเบราว์เซอร์ผิดพลาด",
-       "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"$1\"",
+       "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"<nowiki>$1</nowiki>\"",
        "uploadvirus": "ไฟล์นี้มีไวรัส! \nรายละเอียด: $1",
        "upload-source": "ไฟล์ต้นทาง",
        "sourcefilename": "ชื่อไฟล์ต้นทาง:",
        "filedelete-maintenance": "ปิดใช้งานการลบและกู้คืนไฟล์ชั่วคราวระหว่างการบำรุงรักษา",
        "filedelete-maintenance-title": "ไม่สามารถลบไฟล์",
        "mimesearch": "ค้นหาไมม์",
-       "mimesearch-summary": "หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ของแต่ละไฟล์ \nใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>",
+       "mimesearch-summary": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¹\84à¸\9fลà¹\8cà¸\95ามà¸\81ารà¹\81à¸\9aà¹\88à¸\87à¸\82อà¸\87à¸\8aà¸\99ิà¸\94à¹\84มมà¹\8cà¸\82อà¸\87à¹\81à¸\95à¹\88ละà¹\84à¸\9fลà¹\8c \nà¹\83สà¹\88à¸\84à¹\88า: contenttype/subtype à¸«à¸£à¸·à¸­ contenttype/* à¹\80à¸\8aà¹\88à¸\99 <code>image/jpeg</code>",
        "mimetype": "ชนิดไมม์:",
        "download": "ดาวน์โหลด",
        "unwatchedpages": "หน้าที่ไม่มีผู้เฝ้าดู",
        "emailccsubject": "คัดลอกสารของคุณไป $1: $2",
        "emailsent": "ส่งอีเมลแล้ว",
        "emailsenttext": "ส่งสารอีเมลของคุณแล้ว",
-       "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}}",
+       "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}} อีเมลของคุณจะถูกส่งไปที่ผู้ส่งคนเดิมโดยตรง โดยจะเปิดเผยที่อยู่อีเมลให้พวกเขาเห็น",
        "usermessage-summary": "ฝากสารระบบ",
        "usermessage-editor": "ตัวส่งสารของระบบ",
        "watchlist": "รายการเฝ้าดู",
        "enotif_lastvisited": "ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณเยี่ยมชมครั้งสุดท้าย",
        "enotif_lastdiff": "ดู $1 เพื่อดูการเปลี่ยนแปลงนี้",
        "enotif_anon_editor": "ผู้ใช้นิรนาม $1",
-       "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
+       "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ขณะที่กำลังล็อกอินอยู่ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
        "created": "ถูกสร้าง",
        "changed": "ถูกเปลี่ยนแปลง",
        "deletepage": "ลบหน้า",
        "thumbnail_error": "มีข้อผิดพลาดในการสร้างรูปย่อ: $1",
        "djvu_page_error": "หน้าเดจาวู (DjVu) เกินขนาด",
        "djvu_no_xml": "ไม่สามารถส่งเอกซ์เอ็มแอล (XML) สำหรับไฟล์เดจาวู (DjVu)",
+       "thumbnail-dest-create": "ไม่สามารถบันทึกรูปย่อลงในปลายทางได้",
        "thumbnail_invalid_params": "พารามิเตอร์รูปย่อไม่ถูกต้อง",
        "thumbnail_dest_directory": "ไม่สามารถสร้างสารบบปลายทาง",
        "thumbnail_image-type": "ไม่รองรับรูปแบบของไฟล์รูปภาพนี้",
        "htmlform-no": "ไม่",
        "htmlform-yes": "ใช่",
        "htmlform-chosen-placeholder": "เลือกตัวเลือก",
+       "htmlform-cloner-create": "เพิ่มอีก",
        "htmlform-cloner-required": "ต้องการอย่างน้อยหนึ่งค่า",
        "htmlform-title-badnamespace": "[[:$1]] ไม่อยู่ในเนมสเปซ \"{{ns:$2}}\"",
        "htmlform-title-not-creatable": "\"$1\" มิใช่ชื่อเรื่องหน้าที่สร้างได้",
        "feedback-thanks": "ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า \"[$2 $1]\" แล้ว",
        "searchsuggest-search": "ค้นหา {{SITENAME}}",
        "searchsuggest-containing": "มี...",
-       "api-error-badaccess-groups": "คุณไม่ได้รับอนุญาตให้อัปโหลดไฟล์มายังวิกินี้",
-       "api-error-empty-file": "ไฟล์ที่คุณส่งมานั้นว่าง",
        "api-error-emptypage": "ไม่อนุญาตให้สร้างหน้าใหม่ที่ว่าง",
-       "api-error-file-too-large": "ไฟล์ที่คุณส่งมาใหญ่เกินไป",
-       "api-error-filename-tooshort": "ชื่อไฟล์สั้นเกินไป",
-       "api-error-filetype-banned": "ไฟล์ประเภทนี้ถูกห้าม",
-       "api-error-mustbeloggedin": "กรุณาลงชื่อเข้าใช้เพื่ออัปโหลดไฟล์",
-       "api-error-uploaddisabled": "การอัปโหลดถูกปิดใช้งานบนวิกินี้",
        "duration-seconds": "$1 วินาที",
        "duration-minutes": "$1 นาที",
        "duration-hours": "$1 ชั่วโมง",
index 405d823..30fe744 100644 (file)
        "userloginnocreate": "Lumagda",
        "logout": "Umalis sa pagkaka-login",
        "userlogout": "Umalis sa pagkaka-login",
-       "notloggedin": "Hindi nakalagda",
+       "notloggedin": "Hindi naka-login",
        "userlogin-noaccount": "Wala ka pa bang account?",
        "userlogin-joinproject": "Sumali sa {{SITENAME}}",
        "nologin": "Wala ka pang account? $1.",
        "passwordreset-emaildisabled": "Hindi pinagana ang email features sa wiking ito.",
        "passwordreset-username": "Pangalan ng tagagamit:",
        "passwordreset-domain": "Nasasakupan:",
-       "passwordreset-capture": "Tingnan ang lumabas na e-liham?",
-       "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang email (may pansamantalang password) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
        "passwordreset-email": "Direksiyong e-liham:",
        "passwordreset-emailtitle": "Mga detalye ng account sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
        "saveprefs": "Itala",
        "restoreprefs": "Ibalik ang lahat ng likas na mga pagtatakda",
        "prefs-editing": "May binabago",
-       "rows": "Mga pahalang na hanay:",
-       "columns": "Mga pahabang hanay:",
        "searchresultshead": "Hanapin",
        "stub-threshold": "Kakayanan para sa pagpopormat ng <a href=\"#\" class=\"usbong\">kawing ng usbong</a> (mga ''byte''):",
        "stub-threshold-disabled": "Hindi pinagagana",
        "username": "{{GENDER:$1|Bansag}}:",
        "prefs-memberingroups": "{{GENDER:$2|Kasapi}} ng {{PLURAL:$1|na pangkat|na mga pangkat}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (hanggang $2)",
        "prefs-registration": "Oras ng pagtatala:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Tunay na pangalan:",
        "userrights-reason": "Dahilan:",
        "userrights-no-interwiki": "Wala kang pahintulot na baguhin ang mga karapatan ng tagagamit sa ibang mga wiki.",
        "userrights-nodatabase": "Hindi umiiral o hindi lokal ang kalipunan ng datos na $1",
-       "userrights-nologin": "Kailangang [[Special:UserLogin|nakalagda ka]] bilang tagapangasiwa upang maitalaga ang mga karapatan ng tagagamit.",
-       "userrights-notallowed": "Wala kang pahintulot na magdagdag o magtanggal ng mga karapatan ng tagagamit.",
        "userrights-changeable-col": "Mga pangkat na maaari mong baguhin",
        "userrights-unchangeable-col": "Mga pangkat na hindi mo mababago",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Mapapaso sa $1",
+       "userrights-expiry-none": "Hindi napapaso",
+       "userrights-expiry": "Mapapaso ng:",
+       "userrights-expiry-existing": "Sa kaunting oras na: $3, $2",
+       "userrights-expiry-options": "Isang araw:1 day,Isang linggo:1 week,Isang buwan:1 month,Tatlong buwan:3 months,Anim na buwan:6 months,Isang taon:1 year",
+       "userrights-invalid-expiry": "Sa oras na mapaso ang grupong \"$1\" ay hindi na magagamit.",
+       "userrights-expiry-in-past": "Sa oras na mapaso ang grupong \"$1\" ay hindi na magagamit.",
        "group": "Pangkat:",
        "group-user": "Mga tagagamit",
        "group-autoconfirmed": "Mga tagagamit na nakompirma sa kusang paraan (autokompirmasyon)",
        "right-siteadmin": "Ikandado at alisin ang pagkakakandado ng kalipunan ng dato",
        "right-override-export-depth": "Iluwas ang mga pahina na kabilang ang mga pahinang nakakawing magpahanggang sa isang lalim na 5",
        "right-sendemail": "Magpadala ng e-liham sa ibang mga tagagamit",
-       "right-passwordreset": "Tingnan ang mga email ng muling pagtatakda ng password",
        "newuserlogpage": "Talaan ng paglikha ng tagagamit",
        "newuserlogpagetext": "Isa itong talaan ng mga paglikha ng tagagamit.",
        "rightslog": "Tala ng mga karapatan ng tagagamit",
        "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-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.",
        "rcnotefrom": "Nasa ibaba ang mga pagbabago mula pa noong '''$2''' (ipinapakita ang magpahanggang sa '''$1''').",
        "rclistfrom": "Ipakita ang bagong mga pagbabago simula sa $3 $2",
        "rcshowhideminor": "$1 ang mga maliliit na pagbabago",
        "apisandbox-reset": "Hawiin",
        "apisandbox-examples": "Halimbawa",
        "apisandbox-results": "Kinalabasan",
+       "apisandbox-request-selectformat-label": "Pakitang inihinging-datos gamit ang:",
        "apisandbox-request-url-label": "Hilingin ang URL:",
        "apisandbox-request-time": "Oras ng paghiling: $1",
        "apisandbox-continue": "Ipagpatuloy",
        "feedback-useragent": "Ahente ng tagagamit:",
        "searchsuggest-search": "Maghanap",
        "searchsuggest-containing": "naglalaman ng ...",
-       "api-error-badaccess-groups": "Hindi ka pinapayagang makapagkarga ng mga talaksan papunta sa wiking ito.",
        "api-error-badtoken": "Panloob na kamalian: masamang kahalip.",
-       "api-error-copyuploaddisabled": "Ang pagkakarga ng URL ay hindi pinagagana sa tagapaghaing ito.",
-       "api-error-duplicate": "May {{PLURAL:$1|ibang talaksang|ibang ilang mga talaksang}} nasa wiki na na may katulad na nilalaman",
-       "api-error-duplicate-archive": "Nagkaroon {{PLURAL:$1|dati ng iba pang talaksan|dati ng mga ilang iba pang mga talaksan}} na umiiral na sa sityo na may katulad na nilalaman, ngunit {{PLURAL:$1|ito ay|ito ay mga}} nabura na.",
-       "api-error-empty-file": "Walang laman ang ipinasa mong talaksan.",
        "api-error-emptypage": "Lumilikha ng bago, hindi pinapayagan ang mga pahinang walang laman.",
-       "api-error-fetchfileerror": "Panloob na kamalian: may naganap na pagkakamali habang kinukuha ang talaksan.",
-       "api-error-fileexists-forbidden": "Isang talaksan na may pangalang \"$1\" ang umiiral na, at hindi maaaring patungan ng muling pagsusulat.",
-       "api-error-fileexists-shared-forbidden": "Isang talaksang may pangalang \"$1\" ang umiiral na sa loob ng repository ng pinagsasaluhang talaksan, at hindi maaaring patungan ng muling pagsusulat.",
-       "api-error-file-too-large": "Napakalaki ng talaksang ipinasa mo.",
-       "api-error-filename-tooshort": "Napakaiksi ng pangalan ng talaksan.",
-       "api-error-filetype-banned": "Ipinagbabawal ang ganitong uri ng talaksan.",
-       "api-error-filetype-banned-type": "Ang $1 {{PLURAL:$4|ay isang hindi pinapahintulutang uri ng talaksan|ay hindi pinapahintulutang mga uri ng talaksan}}. Ang pinapayagang {{PLURAL:$3|uri ng talaksan ay ang|mga uri ng talaksan ay ang mga}} $2.",
-       "api-error-filetype-missing": "Kulang ng karugtong ang talaksan.",
-       "api-error-hookaborted": "Ang pagbabagong sinubok mong gawin ay hindi itinuloy ng isang kawil ng dugtong.",
-       "api-error-http": "Panloob na kamalian: hindi makaugnay sa tagahain.",
-       "api-error-illegal-filename": "Hindi pinapayagan ang pangalan ng talaksan.",
-       "api-error-internal-error": "Panloob na kamalian: may naganap na kamalian habang pinoproseso ang pagkakarga mo sa wiki.",
-       "api-error-invalid-file-key": "Panloob na kamalian: hindi matagpuan ang talaksan sa loob ng pansamantalang taguan.",
-       "api-error-missingparam": "Panloob na kamalian: nawawala ang mga parametro ng kahilingan.",
-       "api-error-missingresult": "Panloob na kamalian: hindi matukoy kung nagtagumpay ang kopya.",
-       "api-error-mustbeloggedin": "Dapat na nakalagda ka upang makapagkarga ng mga talaksan.",
-       "api-error-mustbeposted": "Panloob na kamalian: ang kahilingan ay nangangailangan ng HTTP POST.",
-       "api-error-noimageinfo": "Nagtagumpay ang pagkakarga, subalit hindi nakapagbigay ng anumang kabatiran ang tagapaghain hinggil sa talaksan.",
-       "api-error-nomodule": "Panloob na kamalian: walang pangkat ng modyul na pangkarga.",
-       "api-error-ok-but-empty": "Panloob na kamalian: walang tugon mula sa tagapaghain.",
-       "api-error-overwrite": "Hindi pinapayagan ang pagsusulat sa ibabaw ng isang umiiral na talaksan.",
        "api-error-stashfailed": "Panloob na kamalian: nabigo ang tagapaghain na magtabi ng pansamantalang talaksan.",
-       "api-error-timeout": "Hindi tumugon ang tagapaghain sa loob ng inaasahang panahon.",
-       "api-error-unclassified": "Naganap ang isang hindi nalalamang kamalian",
-       "api-error-unknown-code": "Hindi malamang kamalian: \"$1\"",
-       "api-error-unknown-error": "Panloob na kamalian: may nangyaring kamalian habang sinusubok mong ikarga ang talaksan mo.",
        "api-error-unknown-warning": "Hindi nalalamang babala: $1",
        "api-error-unknownerror": "Hindi malamang kamalian: \"$1\".",
-       "api-error-uploaddisabled": "Hindi pinapagana ang pagkakargang paitaas sa wiking ito.",
-       "api-error-verification-error": "Maaaring sira ang talaksang ito, o may maling karugtong.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|mga segundo}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|mga minuto}}",
        "duration-hours": "$1 {{PLURAL:$1|oras|mga oras}}",
        "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",
-       "edit-error-long": "Mga kamalian:"
+       "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina"
 }
index cbf3596..1b2cb44 100644 (file)
                        "Kumkumuk",
                        "Basak",
                        "Ece Alpdeniz",
-                       "Superyetkin"
+                       "Superyetkin",
+                       "Alikaan",
+                       "By erdo can",
+                       "1917 Ekim Devrimi"
                ]
        },
-       "tog-underline": "Bağlantıların altını çiz:",
-       "tog-hideminor": "Son değişiklikler sayfasında küçük değişiklikleri gizle",
-       "tog-hidepatrolled": "Son değişikliklerde devriye görmüş değişiklikleri gizle",
-       "tog-newpageshidepatrolled": "Yeni sayfalar listesinde, devriye görmüş sayfaları gizle",
+       "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-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östermek üzere genişlet",
-       "tog-usenewrc": "Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri sayfalara gruplandır",
+       "tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri gösterecek şekilde genişlet",
+       "tog-usenewrc": "Son değişiklikler ve izleme listesindeki değişiklikleri sayfalara göre gruplandır",
        "tog-numberheadings": "Başlıkları otomatik numaralandır",
        "tog-showtoolbar": "Düzenleme araç çubuğunu göster",
-       "tog-editondblclick": "Çift tıklayarak sayfaları düzenle",
-       "tog-editsectiononrightclick": "Bölüm başlığına sağ tıklayarak bölüm düzenleyebilmeyi etkinleştir",
+       "tog-editondblclick": "Çift tıklandığında sayfaları düzenle",
+       "tog-editsectiononrightclick": "Bölüm başlıklarına sağ tıklayarak bölüm düzenlemeyi etkinleştir",
        "tog-watchcreations": "Oluşturduğum sayfaları ve yüklediğim dosyaları izleme listeme ekle",
-       "tog-watchdefault": "Değişiklik yaptığım sayfaları ve dosyaları izleme listeme ekle",
+       "tog-watchdefault": "Düzenlediğim sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchmoves": "Taşıdığım sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchuploads": "Yüklediğim yeni dosyaları izleme listeme ekle",
-       "tog-watchrollback": "Geridönüş yaptığım sayfaları izleme listeme ekle",
-       "tog-minordefault": "Varsayılan olarak, bütün düzenlemelerimi küçük değişiklik olarak işaretle",
-       "tog-previewontop": "Ã\96n izlemeyi, düzenleme kutusunun Ã¼stünde göster",
+       "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": "Ã\96n izlemeyi, düzenleme kutusunun Ã¶ncesinde göster",
        "tog-previewonfirst": "İlk düzenlemede ön izlemeyi 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",
        "searcharticle": "Git",
        "history": "Sayfa geçmişi",
        "history_short": "Geçmiş",
+       "history_small": "geçmiş",
        "updatedmarker": "son ziyaretimden sonra güncellenmiş",
        "printableversion": "Yazdırılabilir sürüm",
        "permalink": "Kalıcı bağlantı",
        "views": "Görünümler",
        "toolbox": "Araçlar",
        "tool-link-userrights": "{{GENDER:$1|Kullanıcı}} gruplarını değiştir",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Kullanıcı}} gruplarını gör",
        "tool-link-emailuser": "Bu {{GENDER:$1|kullanıcıya}} e-posta gönder",
        "userpage": "Kullanıcı sayfasını görüntüle",
        "projectpage": "Proje sayfasını görüntüle",
        "missingarticle-rev": "(revizyon#: $1)",
        "missingarticle-diff": "(Fark: $1, $2)",
        "readonly_lag": "Yedek sunucular ana sunucu ile güncellenirken veritabanı otomatik olarak kilitlendi.",
+       "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' HTTP üstbilgisi gönderildi, ancak istek bir API yazma modülüne yapıldı.",
        "internalerror": "Dahili hata",
        "internalerror_info": "Dahili hata: $1",
        "internalerror-fatal-exception": "\"$1\" tipinde hayati istisna",
        "createacct-email-ph": "E-posta adresinizi girin",
        "createacct-another-email-ph": "E-posta adresinizi girin",
        "createaccountmail": "Geçici bir rastgele şifre kullanabilir ve bu şifreyi belirtilen e-posta adresine gönderebilirsiniz",
+       "createaccountmail-help": "Parolayı öğrenmeden başka bir kişi için hesap oluşturmak amacıyla kullanılabilir.",
        "createacct-realname": "Gerçek adı (isteğe bağlı)",
        "createaccountreason": "Sebep:",
        "createacct-reason": "Gerekçe",
        "createacct-reason-ph": "Neden başka bir hesap oluşturuyorsunuz",
+       "createacct-reason-help": "Hesap oluşturma günlüğünde gösterilen mesaj",
        "createacct-submit": "Hesabınızı oluşturun",
        "createacct-another-submit": "Hesap oluşturun",
        "createacct-continue-submit": "Hesap oluşturmaya devam et",
        "eauthentsent": "Belirtilen e-posta adresine onay kodu içeren bir e-posta gönderildi.\nHesaba başka bir e-posta gönderilmeden önce, e-postadaki yönergeleri uygulayıp, hesabın gerçekten size ait olduğunu onaylamanız gerekir.",
        "throttled-mailpassword": "Bir parola sıfırlama e-postası son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi. Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola sıfırlama e-postası gönderilecektir.",
        "mailerror": "E-posta gönderim hatası: $1",
-       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son günde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
+       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler $2 içinde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
        "emailauthenticated": "E-posta adresiniz $2 $3 tarihinde onaylandı.",
        "emailnotauthenticated": "E-posta adresiniz henüz onaylanmadı.\nAşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.",
        "noemailprefs": "Bu özelliklerin çalışması için bir e-posta adresi belirtiniz.",
        "changepassword-success": "Parolanız değiştirildi!",
        "changepassword-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
        "botpasswords": "Bot şifreleri",
+       "botpasswords-summary": "<em>Bot şifreleri,</em> hesabın ana giriş kimlik bilgilerini kullanmadan API aracılığıyla bir kullanıcı hesabına erişime izin verir. Bir bot şifresi ile giriş yaptığınızda mevcut kullanıcı hakları kısıtlanabilir.\n\nBunu neden yapmak isteyebileceğinizi bilmiyorsanız, yapmayınız. Hiç kimse sizden bunlardan birini üretip onlara vermenizi istememelidir.",
        "botpasswords-disabled": "Bot şifreleri devre dışı.",
        "botpasswords-no-central-id": "Bot şifresini kullanmak için, merkezi bir hesap ile giriş yapmalısınız.",
        "botpasswords-existing": "Mevcut bot şifreleri",
        "passwordreset-emaildisabled": "Bu wiki'deki e-posta özellikleri devre dışı bırakıldı.",
        "passwordreset-username": "Kullanıcı adı:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Sonuç e-postasını görüntüle?",
-       "passwordreset-capture-help": "Bu kutuyu işaretlerseniz, e-posta (geçici şifre ile) size ve yanı sıra kullanıcıya gönderiliyor.",
        "passwordreset-email": "E-posta adresi:",
        "passwordreset-emailtitle": "{{SITENAME}} hesap detayları",
        "passwordreset-emailtext-ip": "Birisi, (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için hesap bilgilerinizin \nhatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Şifre değişimini siz istemediyseniz veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
        "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.",
        "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": "Ön izleme özeti:",
+       "summary-preview": "Değişiklik özeti ön izlemesi:",
        "subject-preview": "Konu ön izlemesi:",
        "previewerrortext": "Yaptığınız değişikliklerin önizlemesi sırasında bir hata oluştu.",
        "blockedtitle": "Kullanıcı erişimi engellendi.",
        "previewnote": "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''\nYaptığınız değişiklikler henüz kaydedilmedi!",
        "continue-editing": "Düzenlemeye devam et",
        "previewconflict": "Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.",
-       "session_fail_preview": "Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik.\n\nLütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.",
+       "session_fail_preview": "Özür dileriz. Oturum verisi kaybından dolayı değişikliğinizi kaydedemedik.\n\nOturumunuzu kapatmış olabilirsiniz. <strong>Lütfen oturumunuzun açık olduğunu doğrulayıp tekrar deneyiniz</strong>.\nEğer sorun devam ederse, [[Special:UserLogout|oturumu kapatıp]] tekrar giriş yapmayı deneyin ve tarayıcınızın bu siteden çerezlere izin verip vermediğini kontrol edin.",
        "session_fail_preview_html": "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''\n\n''Çünkü {{SITENAME}} sitesinde raw HTML etkindir, önizleme JavaScript saldırılarına önlem olarak gizlenmiştir.''\n\n'''Eğer bu haklı bir düzenleme girişimiyse, lütfen yeniden deneyin. Eğer hala çalışmazsa, [[Special:UserLogout|çıkış yapıp]] yeniden oturum açmayı deneyin.'''",
        "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.'''",
        "search-interwiki-caption": "Kardeş projeler",
        "search-interwiki-default": "$1 sonuçları:",
        "search-interwiki-more": "(daha çok)",
+       "search-interwiki-more-results": "daha fazla sonuç",
        "search-relatedarticle": "ilgili",
        "searchrelated": "ilgili",
        "searchall": "tümü",
        "search-external": "Dış arama",
        "searchdisabled": "{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.",
        "search-error": "Arama yapılırken bir hata oluştu: $1",
+       "search-warning": "Arama yapılırken bir hata oluştu: $1",
        "preferences": "Tercihler",
        "mypreferences": "Tercihler",
        "prefs-edits": "Değişiklik sayısı:",
        "saveprefs": "Kaydet",
        "restoreprefs": "Tüm varsayılan ayarları geri yükle (tüm bölümlerde)",
        "prefs-editing": "Sayfa yazma alanı",
-       "rows": "Satır",
-       "columns": "Sütun",
        "searchresultshead": "Arama",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Taslak bağlantısı</a> formatı için baraj (bayt):",
+       "stub-threshold": "Taslak bağlantısı formatı için sınır ($1):",
        "stub-threshold-sample-link": "örnek",
        "stub-threshold-disabled": "Devre dışı",
        "recentchangesdays": "Son değişikliklerde gösterilecek günler:",
        "prefs-help-recentchangescount": "Bu, son değişiklikleri, sayfa geçmişlerini ve günlükleri içerir.",
        "prefs-help-watchlist-token2": "Bu izleme listenizin gizli anahtarıdır. Anahtarı bilen herkes izleme listenizi görebilir. Bu nedenle kimseyle paylaşmayın. [[Special:ResetTokens|Bu anahtarı sıfırlamak isterseniz buraya tıklayın]].",
        "savedprefs": "Tercihleriniz kaydedildi.",
-       "savedrights": "{{GENDER:$1|$1}} için kullanıcı hakları kaydedildi.",
+       "savedrights": "{{GENDER:$1|$1}} için kullanıcı grupları kaydedildi.",
        "timezonelegend": "Zaman dilimi:",
        "localtime": "Yerel saat:",
        "timezoneuseserverdefault": "Viki varsayılanını kullanın ($1)",
        "username": "{{GENDER:$1|Kullanıcı adı}}:",
        "prefs-memberingroups": "{{GENDER:$2|Üye}} {{PLURAL:$1|group|grupları}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 ($2 tarihine kadar)",
        "prefs-registration": "Kayıt zamanı:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Gerçek adınız:",
        "badsig": "Geçersiz ham imza; HTML etiketlerini kontrol edin.",
        "badsiglength": "İmzanız çok uzun.\n$1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.",
        "yourgender": "Cinsiyet?",
-       "gender-unknown": "Açıklamak istemiyorum",
+       "gender-unknown": "Yazılım sizden bahsederken, mümkün olduğu sürece cinsiyet belirtmeyen kelimeler kullanacak",
        "gender-male": "Erkek",
        "gender-female": "Kadın",
        "prefs-help-gender": "Bu tercih ayarı isteğe bağlıdır.\nYazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.\nBu bilgiler herkes tarafından görülebilir.",
        "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-lookup-user": "Kullanıcı gruplarını düzenle",
+       "userrights-lookup-user": "Bir kullanıcı seç",
        "userrights-user-editname": "Kullanıcı adı giriniz:",
-       "editusergroup": "Kullanıcı grupları düzenle",
+       "editusergroup": "Kullanıcı gruplarını gör",
        "editinguser": "<strong>'''[[User:$1|$1]]'''</strong> $2 kullanıcısının yetkileri değiştiriliyor",
-       "userrights-editusergroup": "Kullanıcı grupları düzenle",
-       "saveusergroups": "Kullanıcı grupları kaydet",
+       "userrights-editusergroup": "{{GENDER:$1|Kullanıcı}} gruplarını düzenle",
+       "userrights-viewusergroup": "{{GENDER:$1|Kullanıcı}} gruplarını gör",
+       "saveusergroups": "{{GENDER:$1|Kullanıcı}} gruplarını kaydet",
        "userrights-groupsmember": "İçinde olduğu gruplar:",
        "userrights-groupsmember-auto": "Saklı olarak içinde olduğu gruplar:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "Bu kullanıcının içinde olduğu grupları değiştirebilirsiniz:\n* Seçili bir kutu, kullanıcının o gruba dahil olduğu anlamına gelir\n* Seçilmemiş bir kutu, kullanıcının o grupta olmadığı anlamına gelir.\n* *, grubu bir kez oluşturduktan sonra silemeceğinizi belirtir, ya da karşılıklı olarak.",
+       "userrights-groups-help": "Bu kullanıcının içinde olduğu grupları değiştirebilirsiniz:\n* Seçili bir kutu, kullanıcının o gruba dahil olduğunu anlatır.\n* Seçilmemiş bir kutu, kullanıcının o gruba dahil olmadığını anlatır.\n* *, grubu bir kez ekledikten sonra kaldıramayacağınızı veya tam tersi kaldırdıktan sonra ekleyemeyeceğiniz belirtir.\n* #, grubun sona erme zamanını yalnızca öne çekebileceğinizi, ileri alamayacağınızı belirtir.",
        "userrights-reason": "Neden:",
        "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-nologin": "Kullanıcı haklarını atamak için hizmetli hesabı ile [[Special:UserLogin|giriş yapmanız gerekir]].",
-       "userrights-notallowed": "Kullanıcı hakları eklemek veya kaldırmak için izniniz yok.",
        "userrights-changeable-col": "Değiştirebildiğiniz gruplar",
        "userrights-unchangeable-col": "Değiştirebilmediğiniz gruplar",
        "userrights-conflict": "Kullanıcı hakları değişikliklerinde çakışma! Lütfen değişikliklerinizi gözden geçirin ve onaylayın.",
-       "userrights-removed-self": "Kendi haklarınız başarıyla kaldırıldı. Bu nedenle, artık bu sayfaya erişemeyeceksiniz.",
        "group": "Grup:",
        "group-user": "Kullanıcılar",
        "group-autoconfirmed": "Otomatik onaylanmış kullanıcılar",
        "right-siteadmin": "Veritabanını kilitle ve kilidi aç",
        "right-override-export-depth": "Sayfaları, derinlik 5'e kadar bağlantılı sayfalarla beraber, dışa aktar",
        "right-sendemail": "Diğer kullanıcılara e-posta gönder",
-       "right-passwordreset": "Parola sıfırlama e-postalarını görür",
        "right-managechangetags": "Veritabanında [[Special:Tags|etiket]] oluşturma veya silme",
        "right-applychangetags": "Değişiklikleriyle beraber [[Special:Tags|etiketleri]] uygula",
        "right-changetags": "Tekil sürümler ve günlük kayıtlarına rastgele [[Special:Tags|etiket]] ekleme veya çıkarma",
        "recentchanges-legend-heading": "<strong>Gösterge:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca [[Special:NewPages|yeni sayfalar listesine]] bakınız)",
        "recentchanges-submit": "Göster",
+       "rcfilters-filter-minor-label": "Küçük değişiklikler",
+       "rcfilters-filter-major-label": "Küçük olmayan değişiklikler",
        "rcnotefrom": "<strong>$3, $4</strong> tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır (<strong>$1</strong> tarhine kadar olanlar gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "uploaded-event-handler-on-svg": "SVG dosyalarında event-handler özniteliğini <code>$1=\"$2\"</code> şeklinde ayarlanmasına izin verilmiyor.",
        "uploaded-href-unsafe-target-svg": "Yüklenen SVG dosyasında <code>&lt;$1 $2=\"$3\"&gt;</code> güvensiz hedefine href bulundu.",
        "uploaded-animate-svg": "\"animate\" etiketi bulundu, href'i değiştiriyor olabilir. Yüklenen SVG dosyasındaki \"from\" özniteliği kullanılıyor  <code>&lt;$1 $2=\"$3\"&gt;</code>",
-       "uploadscriptednamespace": "Bu SVG dosyası geçersiz \"$1\" alan adını içermektedir.",
+       "uploadscriptednamespace": "Bu SVG dosyası geçersiz \"<nowiki>$1</nowiki>\" alan adını içermektedir.",
        "uploadinvalidxml": "Yüklenen dosyadaki XML işlenemedi.",
        "uploadvirus": "Bu dosya virüslüdür! Detayları: $1",
        "uploadjava": "Dosya, bir Java .classdosyası içeren bir ZIP dosyasıdır.\nJava dosyalarının yüklenmesine izin verilmemektedir, zira güvenlik kısıtlamalarının atlanmasına neden olabilmektedirler.",
        "booksources-search": "Ara",
        "booksources-text": "Aşağıdaki, yeni ve kullanılmış kitap satan diğer sitelere bağlantıların listesidir, ve aradığınız kitaplar hakkında daha fazla bilgiye sahip olabilirler:",
        "booksources-invalid-isbn": "Verilen ISBN geçersiz gibi görünüyor; orijinal kaynaktan kopyalama hataları için kontrol edin.",
+       "magiclink-tracking-rfc": "RFC sihirli bağlantısını kullanan sayfalar",
+       "magiclink-tracking-pmid": "PMID sihirli bağlantısını kullanan sayfalar",
+       "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",
        "changecontentmodel-submit": "Değiştir",
        "changecontentmodel-success-title": "İçerik modeli değiştirildi",
        "changecontentmodel-success-text": "İçerik türü [[:$1]] olarak değiştirildi.",
+       "log-name-contentmodel": "İçerik modeli değiştirme günlüğü",
        "logentry-contentmodel-change-revertlink": "Eski haline döndür",
        "logentry-contentmodel-change-revert": "Eski haline döndür",
        "protectlogpage": "Koruma kayıtları",
        "modifiedarticleprotection": "\"[[$1]]\" için koruma düzeyi değiştirildi",
        "unprotectedarticle": "koruma kaldırıldı: \"[[$1]]\"",
        "movedarticleprotection": "koruma ayarları \"[[$2]]\" sayfasından \"[[$1]]\" sayfasına taşındı",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" için {{GENDER:$2|koruma düzeyini değiştirdi}}",
        "protect-title": "\"$1\" için bir koruma seviyesi seçiniz",
        "protect-title-notallowed": "\"$1\" için koruma seviyesini görüntüleyin",
        "prot_1movedto2": "[[$1]] sayfasının yeni adı: [[$2]]",
        "htmlform-user-not-exists": "<strong>$1</strong> mevcut değil.",
        "htmlform-user-not-valid": "<strong>$1</strong> geçerli bir kullanıcı ismi değildir.",
        "logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
+       "logentry-delete-delete_redir": "$1, $3 yönlendirmesini üzerine yazılması için {{GENDER:$2|sildi}}",
        "logentry-delete-restore": "$1 $3 sayfasını {{GENDER:$2|geri getirdi}}",
        "logentry-delete-event": "$1, $3 sayfasında {{PLURAL:$5|bir günlük girdisinin |$5 günlük girdisinin}} görünürlüğünü {{GENDER:$2|değiştirdi}}: $4",
        "logentry-delete-revision": "$1, $3 sayfasında {{PLURAL:$5|bir sürümün|$5 sürümün}} görünürlüğünü {{GENDER:$2|değiştirdi}}: $4",
        "feedback-useragent": "Kullanıcı temsilcisi",
        "searchsuggest-search": "Ara",
        "searchsuggest-containing": "içeren...",
-       "api-error-badaccess-groups": "Bu wiki için dosya yüklemenize izin verilmiyor.",
        "api-error-badtoken": "İç hata: Bozuk anahtar.",
-       "api-error-copyuploaddisabled": "URL ile yükleme bu sunucuda devre dışı bırakılmıştır.",
-       "api-error-duplicate": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} mevcut.",
-       "api-error-duplicate-archive": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} vardı, ama {{PLURAL:$1|silindi|silindiler}}.",
-       "api-error-empty-file": "Gönderdiğiniz dosya boş.",
        "api-error-emptypage": "Yeni, boş bir sayfa oluşturmaya izin verilmez.",
-       "api-error-fetchfileerror": "İç hata: Dosya alınırken bir hata oluştu.",
-       "api-error-fileexists-forbidden": "\"$1\" adıyla bir dosya zaten mevcut dolayısıyla üzerine yazamazsınız.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" adında bir dosya ortak havuzda zaten var, ve üzerine yazılamaz.",
-       "api-error-file-too-large": "Gönderdiğiniz dosya çok büyük.",
-       "api-error-filename-tooshort": "Dosya adı çok kısa.",
-       "api-error-filetype-banned": "Bu dosya biçimi yasaklanmıştır.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|izin verilen bir dosya türü değil|izin verilen dosya türleri değil}}. İzin verilen {{PLURAL:$3|dosya türü|dosya türleri}} $2.",
-       "api-error-filetype-missing": "Dosya uzantısı eksik.",
-       "api-error-hookaborted": "Yapmaya çalıştığınız değişiklik bir eklenti tarafından iptal edildi.",
-       "api-error-http": "İç hata: sunucu ile bağlantı kurulamıyor.",
-       "api-error-illegal-filename": "Bu dosya adına izin verilmiyor.",
-       "api-error-internal-error": "İç hata: Wiki'ye yükleme yapma işleminizde bir şeyler ters gitti.",
-       "api-error-invalid-file-key": "İç hata: geçici depolama dosyası bulunamadı.",
-       "api-error-missingparam": "İç hata: İstenilen parametreler eksik.",
-       "api-error-missingresult": "İç hata: Kopyalamanın başarılı olup olmadığı belirlenemedi.",
-       "api-error-mustbeloggedin": "Dosya yükleyebilmek için oturum açmanız gereklidir.",
-       "api-error-mustbeposted": "İç hata: İstek HTTP POST gerektiriyor.",
-       "api-error-noimageinfo": "Yükleme başarılı oldu, ancak sunucu, bize dosya hakkında herhangi bir bilgi vermedi.",
-       "api-error-nomodule": "İç hata: Yükleme modülü ayarı yapılmadı.",
-       "api-error-ok-but-empty": "İç hata: Sunucu yanıt vermiyor.",
-       "api-error-overwrite": "Varolan dosyanın üzerine yazmaya izin verilmiyor.",
-       "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-publishfailed": "İç hata: Sunucu geçici dosyayı yayınlarken başarısız oldu.",
-       "api-error-stasherror": "Dosya zulaya yüklenirken hata oluştu.",
-       "api-error-stashedfilenotfound": "Saklandığı yerden yüklenmeye çalışılan dosya bu yerde bulunamadı.",
-       "api-error-stashpathinvalid": "Saklanan dosyanın bulunması beklenen yer bilgisi geçersiz.",
-       "api-error-stashfilestorage": "Dosya zulaya saklanmaya çalışılırken hata ile karşılaşıldı.",
-       "api-error-stashzerolength": "Sunucu dosyayı zulada saklayamadı; çünkü dosya boyutu sıfır uzunlukta.",
-       "api-error-stashnotloggedin": "Dosya yükleme zulasına dosya kaydetmek için oturum açmış olmanız gerekiyor.",
-       "api-error-stashwrongowner": "Zulada erişmeye çalıştığınız belge size ait değil.",
-       "api-error-stashnosuchfilekey": "Zulaya erişmeye çalışırken kullanılan dosya anahtarı mevcut değil.",
-       "api-error-timeout": "Sunucu beklenen süre içinde yanıt vermedi.",
-       "api-error-unclassified": "Bilinmeyen bir hata oluştu.",
-       "api-error-unknown-code": "Bilinmeyen hata: \"$1\"",
-       "api-error-unknown-error": "İç hata: Dosya yüklemeye çalışırken bir şeyler ters gitti.",
+       "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-unknown-warning": "Bilinmeyen uyarı: $1",
        "api-error-unknownerror": "Bilinmeyen hata: \"$1\".",
-       "api-error-uploaddisabled": "Yükleme bu vikide devre dışı bırakılmıştır.",
-       "api-error-verification-error": "Dosya bozuk veya yanlış uzantıya sahip olabilir.",
        "duration-seconds": "$1 {{PLURAL:$1|saniye|saniye}}",
        "duration-minutes": "$1 {{PLURAL:$1|dakika|dakika}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
        "special-characters-title-emdash": "uzun çizgi",
        "special-characters-title-minus": "Eksi işareti",
        "mw-widgets-dateinput-no-date": "Hiçbir tarih seçilmedi",
+       "mw-widgets-mediasearch-input-placeholder": "Medya ara",
+       "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",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "çerez tabanlı oturumlar",
index 5ea66b8..f907c59 100644 (file)
                        "Selimcan",
                        "Исмаил Садуев",
                        "Matma Rex",
-                       "Irus"
+                       "Irus",
+                       "Ifs"
                ]
        },
-       "tog-underline": "Сылтамаларның астына сызу:",
+       "tog-underline": "Сылтамаларны сызымлау:",
        "tog-hideminor": "Соңгы үзгәртүләр исемлегендә кече үзгәртүләр яшерелсен",
-       "tog-hidepatrolled": "Тикшерелгән үзгәртүләр яңа үзгәртүләр исемлегеннән яшерелсен.",
+       "tog-hidepatrolled": "Тикшерелгән үзгәртүләр яңа үзгәртүләр исемлегеннән яшерелсен",
        "tog-newpageshidepatrolled": "Тикшерелгән битләр яңа битләр исемлегеннән яшерелсен",
        "tog-hidecategorization": "Битләрне төркемләшүне ябу",
        "tog-extendwatchlist": "Соңгыларын гына түгел, ә барлык үзгәртүләрне эченә алган, киңәйтелгән күзәтү исемлеге",
@@ -45,6 +46,7 @@
        "tog-watchmoves": "Мин күчергән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchdeletion": "Мин бетергән битләр һәм файлларны күзәтү исемлегемгә өстәлсен",
        "tog-watchuploads": "Минем тарафтан йөкләнелгән файлларны күзәтү исемлегемә кертергә",
+       "tog-watchrollback": "Мин үткәрмәгән битләрне күзәтү исемлегемә өстәргә",
        "tog-minordefault": "Барлык үзгәртүләрне килешү буенча кече дип билгеләнсен",
        "tog-previewontop": "Үзгәртү тәрәзәсеннән өстәрәк битне алдан карау өлкәсен күрсәтелсен",
        "tog-previewonfirst": "Үзгәртү битенә күчкәндә башта алдан карау бите күрсәтелсен",
        "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": "Файл битен карау",
        "pool-queuefull": "Сорауларны саклау  бите тулы",
        "pool-errorunknown": "Билгесез  хата",
        "pool-servererror": "Пул санау хезмәте эшләми ($1).",
-       "poolcounter-usage-error": "$1: куллану хатасы",
+       "poolcounter-usage-error": "Куллану хатасы: $1",
        "aboutsite": "{{SITENAME}} турында",
        "aboutpage": "Project:Тасвирлама",
        "copyright": "Мәгълүмат $1 буенча таратыла (әгәр башкасы күрсәтелмәсә).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Сезгә}} {{PLURAL:$3|$3 кулланучыдан}} $1 килде ($2).",
        "youhavenewmessagesmanyusers": "Сез бик күп кулланучыдан $1 алдыгыз ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|яңа хәбәр|999=яңа хәбәрләр}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|1=соңгы үзгәртү|соңгы үзгәртүләр}}\nсоңгы {{PLURAL:$1|үзгәртү|999=үзгәртү}}",
-       "youhavenewmessagesmulti": "Сезгә монда яңа хәбәрләр бар: $1",
+       "newmessagesdifflinkplural": "соңгы {{PLURAL:$1|үзгәртү|үзгәртүләр}}",
+       "youhavenewmessagesmulti": "$1 эчендә яңа хат бар",
        "editsection": "үзгәртү",
        "editold": "үзгәртү",
-       "viewsourceold": "башлангыч кодны карау",
+       "viewsourceold": "чыганак кодны карау",
        "editlink": "үзгәртү",
        "viewsourcelink": "чыганак кодны карау",
        "editsectionhint": "$1 бүлеген үзгәртү",
        "toc": "Эчтәлек",
        "showtoc": "күрсәтү",
        "hidetoc": "яшерү",
-       "collapsible-collapse": "Төрү",
+       "collapsible-collapse": "төрү",
        "collapsible-expand": "Ачу",
        "confirmable-confirm": "{{GENDER:$1|Шулаймы}}?",
        "confirmable-yes": "Әйе",
        "createacct-reason-ph": "Нигә сез яңа зисап язмасы төзисез",
        "createacct-submit": "Хисап язмасы төзү",
        "createacct-another-submit": "Хисап язмасын төзү",
+       "createacct-continue-submit": "Хисап язмасын ясауны дәвам итү",
+       "createacct-another-continue-submit": "Хисап язмасын ясауны дәвам итү",
        "createacct-benefit-heading": "{{SITENAME}} — сезнең шикелле кешеләрнең хезмәте.",
        "createacct-benefit-body1": "{{PLURAL:$1|төзәтмә}}",
        "createacct-benefit-body2": "{{PLURAL:$1|мәкалә}}",
        "createacct-benefit-body3": "Соңгы вакытта {{PLURAL:$1|кулланучы}}",
        "badretype": "Кертелгән серсүзләр бер үк түгел.",
+       "usernameinprogress": "Бу кулланучы исеме хисап язмасы булдыру башланды инде. Зинһар көтегез.",
        "userexists": "Кертелгән исем кулланыла.\nЗинһар, башка исем сайлагыз.",
        "loginerror": "Керү хатасы",
        "createacct-error": "Хисап язмазын булдыруда хата китте",
        "eauthentsent": "Күрсәтелгән электрон почта адресына үзгәртүләрне раслау өчен хат җибәрелде. Киләчәктәдә хатлар кабул итү өчен, раслауны үтегез.",
        "throttled-mailpassword": "Серсүзне электрон почтага җибәрү гамәлен сез {{PLURAL:$1|1=соңгы $1 сәгать}} эчендә кулландыгыз инде. Бу гамәлне явызларча куллануны кисәтү максатыннан аны $1 {{PLURAL:$1|сәгать}} аралыгында бер генә тапкыр башкарып була.",
        "mailerror": "Хат җибәрү хатасы: $1",
-       "acct_creation_throttle_hit": "Сезнең IP адресыннан бу тәүлек эчендә {{PLURAL:$1|$1 хисап язмасы}} төзелде инде. Шунлыктан бу IP-адрес буенча сезнең өчен әлеге гамәл вакытлыча ябык.",
+       "acct_creation_throttle_hit": "Сезнең IP адресыннан  $2 эчендә {{PLURAL:$1|$1 хисап язмасы}} төзелде инде. Шунлыктан бу IP-адрес буенча сезнең өчен әлеге гамәл вакытлыча ябык.",
        "emailauthenticated": "Сезнең электрон почта адресыгыз $2 $3 расланды.",
        "emailnotauthenticated": "Электрон почта адресыгыз әле дәлилләнмәгән.\nХатлар әлеге мөмкинлекләргә җибәрелмәячәк.",
        "noemailprefs": "Электрон почта адресыгыз күрсәтелмәгән, шуңа викиның электрон почта белән эшләү гамәлләре сүндерелгән.",
        "emailconfirmlink": "Электрон почта адресыгызны дәлилләгез.",
        "invalidemailaddress": "Электрон почта адресы кабул ителә алмый, чөнки ул дөрес форматка туры килми. Зинһар, дөрес адрес кертегез яки юлны буш калдырыгыз.",
        "cannotchangeemail": "Бу хисап язмасының электрон почта адресы бу викида үзгәртелә алмый",
+       "emaildisabled": "Бу сайт электрон хатлар җибәрә алмый.",
        "accountcreated": "Хисап язмасы төзелде",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|бәхәс]]) кулланучысы өчен хисап язмасы төзелде.",
        "createaccount-title": "{{SITENAME}}: теркәлү",
        "suspicious-userlogout": "Сезнең эшчәнлекне бетерү соравыгыз кире кагылды, чөнки ул ялгыш браузер яисә кэшлаучы прокси аша җибәрелергэ мөмкин.",
        "pt-login": "Керү",
        "pt-login-button": "Керү",
+       "pt-login-continue-button": "Керүне дәвам итү",
        "pt-createaccount": "Яңа кулланучыны теркәү",
        "pt-userlogout": "Чыгу",
        "php-mail-error-unknown": "PHP mail() функциясендә билгесез хата",
        "passwordreset-disabled": "Бу викида серсүз бетереп булмый",
        "passwordreset-username": "Кулланучы исеме:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Килеп чыккан хатны күрсәтелсенме?",
-       "passwordreset-capture-help": "Әгәр сез бу тамганы куйсагыз, сезгә кулланучыга вакытлы серсүз белән җибәреләчәк хат күрсәтеләчәк.",
        "passwordreset-email": "E-mail адресы:",
        "passwordreset-emailtitle": "{{SITENAME}} хисап язмасы турында мәгълүматлар",
        "passwordreset-emailtext-ip": "Кемдер (бәлки, сездер, $1 IP-адресыннан) {{SITENAME}} ($4) проектында сезнең серсүзне искә төшерүне сорады.\n{{PLURAL:$3|1=Түбәндәге хисап язмасы|Түбәндәге хисап язмалары}} бу электрон әрҗә адресы белән бәйле:\n\n$2\n\n{{PLURAL:$3|1=Бу вакытлы серсүз|Бу вакытлы серсүзләр}} {{PLURAL:$5|$5 көн}} дәвамында эшлиячәкләр.\nСез системага керергә һәм яңа серсүз сайларга тиешсез.\nӘгәр сез серсүз сорамаган булсагыз яки элеккеге серсүзегезне искә төшерсәгез \nһәм аны үзгәртергә теләмәсәгез, бу хатка җавап бирмәгез\nһәм элеккеге серсүзегезне кулланыгыз.",
        "preview": "Алдан карау",
        "showpreview": "Алдан карау",
        "showdiff": "Кертелгән үзгәртүләр",
-       "anoneditwarning": "<strong>Игътибар!</strong> Сез сайтта теркәлмәдегез. Әгәрдә сез нинди дә булсә төзәтмәләр  яисә үзгәртүләр кертсәгез, сезне IP-адрес башкаларга да курсәтеләчәк. Сайтка <strong>[$1 керсәгез]</strong> яки <strong>[$2 кулланучы язмасын төзесәгез]</strong>, сез керткән үзгәртүләр яезнен кулланучы язмагызга бәйләнгән була, шулай ук башка мөмкинлекләр дә туачак.",
+       "anoneditwarning": "<strong>Игътибар!</strong> Сез сайтта теркәлмәдегез. Әгәрдә сез нинди дә булсә төзәтмәләр яисә үзгәртүләр кертсәгез, сезнең IP-адрес башка кулланучыларга да билгеле булачак. Сайтка <strong>[$1 керсәгез]</strong> яисә <strong>[$2 кулланучы язмасын төзесәгез]</strong>, сез керткән үзгәртүләр сезнең кулланучы язмагызга бәйләнгән булачак, шулай ук башка мөмкинлекләр дә туачак.",
        "anonpreviewwarning": "''Сез системада теркәлмәдегез.Сезнең тарафтан эшләнгән барлык үзгәртүләр дә сезнең IP-юлламагызны саклауга китерә.''",
        "missingsummary": "'''Искәртү.''' Сез үзгәртүгә кыскача тасвирлау язмадыгыз. Сез «Битне саклау» төймәсенә тагын бер тапкыр бассагыз, үзгәртүләр тасвирламасыз сакланачак.",
        "missingcommenttext": "Аска тасвирлама язуыгыз сорала.",
        "missingcommentheader": "<strong>Искәртү:</strong> Сез шәрехнең темасын күрсәтмәгәнсез.\n«{{int:savearticle}}» төймәсенә кабат бассагыз, үзгәртүләр темасыз язылачак.",
        "summary-preview": "Тасвирламаны алдан карау:",
-       "subject-preview": "Башисемне болай булачак:",
+       "subject-preview": "Башисем шушындый булачак:",
        "blockedtitle": "Кулланучы тыелды",
        "blockedtext": "'''Сезнең хисап язмагыз яки IP адресыгыз тыелган.'''\n\nТыючы идарәче: $1.\nКүрсәтелгән сәбәп: ''$2''.\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:''$2''\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Буш объект",
        "content-json-empty-array": "Буш массив",
+       "deprecated-self-close-category": "Үзлегеннән ябылучы HTML-тегларны кулланучы битләр",
        "duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
        "expensive-parserfunction-warning": "<strong>Игътибар:</strong>  бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nБиттә {{PLURAL:$2|$2 эш куллану}} рөхсәт ителгән очракта, монда $1 {{PLURAL:$1|эш башкарыла}}.",
        "expensive-parserfunction-category": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "mergehistory-from": "Чыганак:",
        "mergehistory-into": "Төп бит:",
        "mergehistory-submit": "Төзәтмәләрне берләштерү",
+       "mergehistory-comment": "[[:$1]] [[:$2]] битенә күчерелде: $3",
        "mergehistory-reason": "Сәбәп:",
        "mergelog": "Берләштерүләр көндәлеге",
        "revertmerge": "Бүлү",
        "shown-title": "Сәхифәдә $1 {{PLURAL:$1|язма}} күрсәтелсен",
        "viewprevnext": "Күрсәтелүе: ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Бу вики-проектта «[[:$1]]» исемле бит бар инде</strong>{{PLURAL:$2|0=|Башка эзләү нәтиҗәләрен дә карап ал.}}",
-       "searchmenu-new": "<strong>«Әлеге [[:$1]]» вики-проектта бит ясарга!</strong>\n{{PLURAL:$2|0=|Шулай ук, эзләү ярдәмендә табылган битне карагыз.|Шулай ук, эзләү ярдәмендә табылган битләрне карагыз.}}",
+       "searchmenu-new": "<strong>Әлеге вики-проектта «[[:$1]]» исемле бит ясарга!</strong>\n{{PLURAL:$2|0=|Шулай ук, эзләү ярдәмендә табылган битне карагыз.|Шулай ук, эзләү ярдәмендә табылган битләрне карагыз.}}",
        "searchprofile-articles": "Төп битләр",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Һәркайда",
        "prefs-editwatchlist-label": "Күзәтү исемлеге язмаларын үзгәртү:",
        "prefs-editwatchlist-edit": "Күзәтү исемлегеннән исемнәрне карау һәм сөртү",
        "prefs-editwatchlist-raw": "Күзәтү исемлеген текстсыман үзгәртү",
-       "prefs-editwatchlist-clear": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлеген Ñ\82азарту",
+       "prefs-editwatchlist-clear": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлеген Ñ\87иÑ\81Ñ\82арту",
        "prefs-watchlist-days": "Күзәтү исемлегендә көннәр санын күрсәтергә:",
        "prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}",
        "prefs-watchlist-edits": "Киңәйтелгән күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:",
        "saveprefs": "Саклау",
        "restoreprefs": "Башлангыч көйләнмәләрне кире кайтару",
        "prefs-editing": "Төзәтү",
-       "rows": "Юллар:",
-       "columns": "Баганалар:",
        "searchresultshead": "Эзләү",
        "stub-threshold": "Ясалма сылтамаларның бизәлеше буенча чикләүләр ($1):",
        "stub-threshold-sample-link": "мисал",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Юрамалар аермасы",
        "userrights": "Кулланучы хокуклары белән идарә итү",
-       "userrights-lookup-user": "Кулланучы төркемнәре белән идарә итү",
+       "userrights-lookup-user": "Кулланучыны сайлау",
        "userrights-user-editname": "Кулланучының исемен кертегез:",
-       "editusergroup": "{{GENDER:$1|Кулланучының}} төркемнәрен алмаштыру",
+       "editusergroup": "Кулланучының төркемнәрен кую",
        "editinguser": "{{GENDER:$1|Кулланучы}} <strong>[[User:$1|$1]]</strong> $2 хокукларын үзгәртү",
        "userrights-editusergroup": "Кулланучының төркемнәрен алмаштыру",
        "saveusergroups": "{{GENDER:$1|Кулланучы}} төркемнәрен саклау",
        "userrights-reason": "Сәбәп:",
        "userrights-no-interwiki": "Сезнең башка викиларда кулланучыларның хокукларын үзгәртергә хокукларыгыз юк.",
        "userrights-nodatabase": "Бирелгән $1 базасы юк яисә  локаль булып тормый.",
-       "userrights-nologin": "Кулланучыларга вәкаләтләр билгеләү өчен идарәче хисап язмасы белән [[Special:UserLogin|керергә кирәк]]",
-       "userrights-notallowed": "Сезнең кулланучыларга вәкаләтләр тапшырырга яки кире алырга хокукы юк.",
        "userrights-changeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр",
        "userrights-unchangeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Кулланучы хокукларын үзгәртү конфликты! Төзәтмәләрегезне тикшерегез, аннары кабатлагыз.",
-       "userrights-removed-self": "Сез үзегезне хокукларыгыздан мәхрүм иттегез. Шул сәбәпле сез бу сәхифәгә башка керә алмыйсыз.",
        "group": "Төркем:",
        "group-user": "Кулланучылар",
        "group-autoconfirmed": "Авторасланган кулланучы",
        "filename-prefix-blacklist": " #<!-- ничек бар шулай калдырыгыз --> <pre>\n# Синтаксис төбәндәгечә:\n#   *  «#» дип башланган барлык нәрсә дә комментарий дип аталачак\n#   * Һәрбер буш рәт — файлның исеменең префиксы, цифрлы камера бирүче исем\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # кайсыбер кәрәзле телефоннар\nIMG # барлык\nJD # Jenoptik\nMGP # Pentax\nPICT # төрле\n #</pre> <!-- ничек бар шулай калдырыгыз -->",
        "upload-dialog-title": "Файл йөкләү",
        "upload-dialog-button-cancel": "Баш тарту",
+       "upload-dialog-button-back": "Артка",
        "upload-dialog-button-done": "Әзер",
        "upload-dialog-button-save": "Саклау",
        "upload-dialog-button-upload": "Йөкләү",
        "suppress": "Яшерү",
        "apihelp": "API ярдәм",
        "apihelp-no-such-module": "«$1» модуле табылмады.",
+       "apisandbox": "API комлыгы",
+       "apisandbox-unfullscreen": "Битне күрсәтү",
        "apisandbox-reset": "Чистарту",
        "apisandbox-retry": "Кабатлау",
        "apisandbox-examples": "Мисаллар",
        "apisandbox-dynamic-parameters": "Өстәмә параметрлар",
        "apisandbox-results": "Нәтиҗәләр",
+       "apisandbox-continue": "Дәвам итү",
+       "apisandbox-continue-clear": "Чистарту",
        "booksources": "Китап чыганаклары",
        "booksources-search-legend": "Китап чыганакларыны эзләү",
        "booksources-search": "Эзләү",
        "booksources-text": "Әлеге биттә күрсәтелгән сылтамалар ярәмендә сезнең кызыксындырган китап буенча өстәмә мәгълүматлар табарга мөмкин. Болар интернет-кибетләр һәм китапханә җыентыгында эзләүче системалар.",
        "booksources-invalid-isbn": "Бирелгән ISBN саны бәлки хаталдыр. Зинһар, бирелгән саннарны яңадан тикшерегез.",
+       "magiclink-tracking-rfc": "Тылсымлы RFC сылтамаларын кулланучы битләр",
+       "magiclink-tracking-pmid": "Тылсымлы PMID сылтамаларын кулланучы битләр",
+       "magiclink-tracking-isbn": "Тылсымлы ISBN сылтамаларын кулланучы битләр",
        "specialloguserlabel": "Башкаручы:",
        "speciallogtitlelabel": "Максат (атама яисә {{ns:user}}:кулланучы исеме):",
        "log": "Көндәлекләр",
        "pageinfo-length": "Бит озынлыгы (байтларда)",
        "pageinfo-article-id": "Бит идентификаторы",
        "pageinfo-language": "Битнең теле",
+       "pageinfo-language-change": "үзгәртү",
        "pageinfo-content-model-change": "үзгәртү",
        "pageinfo-robot-index": "Рөхсәт",
        "pageinfo-robot-noindex": "Рөхсәтсез",
        "pageinfo-edits": "Гомуми төзәтүләр саны",
        "pageinfo-authors": "Гомуми авторлар саны",
        "pageinfo-toolboxlink": "Бит турында мәгълүмат",
+       "pageinfo-redirectsto": "Юнәлтү",
        "pageinfo-redirectsto-info": "мәгълүмат",
        "pageinfo-contentpage-yes": "Әйе",
        "pageinfo-protect-cascading-yes": "Әйе",
        "patrol-log-page": "Тикшерү көндәлеге",
        "patrol-log-header": "Бу тикшерелгән битләрнең көндәлеге.",
        "log-show-hide-patrol": "$1 тикшерү көндәлеге",
+       "confirm-markpatrolled-button": "Ярый",
        "deletedrevision": "$1 битенең иске юрамасы бетерелде",
        "filedeleteerror-short": "Файлны бетерү хатасы: $1",
        "filedeleteerror-long": "Файлны бетерү вакытында хаталар чыкты:\n\n$1",
        "exif-meteringmode-1": "Уртача",
        "exif-meteringmode-3": "Нокталы",
        "exif-meteringmode-4": "Мультинокталы",
+       "exif-meteringmode-5": "Паттернлы",
+       "exif-meteringmode-6": "Өлешләтә",
        "exif-meteringmode-255": "Башка",
        "exif-lightsource-0": "Билгесез",
        "exif-lightsource-4": "Яктылык",
        "exif-dc-type": "Медиа төре",
        "exif-rating-rejected": "Кире кагылды",
        "exif-isospeedratings-overflow": "65535-тән күп",
+       "exif-iimcategory-hth": "Сәламәтлек",
+       "exif-iimcategory-lab": "Хезмәт",
+       "exif-iimcategory-wea": "Һава тырышы",
+       "exif-urgency-normal": "Гадәти ($1)",
+       "exif-urgency-low": "Түбән ($1)",
+       "exif-urgency-high": "Югары ($1)",
        "namespacesall": "барлык",
        "monthsall": "барлык",
        "recreate": "Яңадан ясау",
        "autoredircomment": "[[$1]] битенә юнәлтү",
        "autosumm-new": "Яңа бит: «$1»",
        "watchlistedit-raw-titles": "Язмалар:",
+       "watchlistedit-clear-titles": "Башлык:",
+       "watchlisttools-clear": "Күзәтү исемлеген чистарту",
        "watchlisttools-view": "Соңгы үзгәртүләрне күрсәтү",
        "watchlisttools-edit": "Күзәтү исемлегене карау һәм үзгәртү",
        "watchlisttools-raw": "Текст сыман үзгәртү",
        "version-libraries-license": "Лицензия",
        "version-libraries-description": "Тасвирлама",
        "version-libraries-authors": "Авторлар",
+       "redirect-submit": "Күчү",
        "fileduplicatesearch": "Бер үк файлларны эзләү",
        "fileduplicatesearch-submit": "Эзләү",
        "specialpages": "Махсус битләр",
        "tags-source-header": "Чыганак",
        "tags-active-yes": "Әйе",
        "tags-active-no": "Юк",
+       "tags-source-extension": "Тәэминат тарафыннан билгеләнә",
        "tags-edit": "үзгәртү",
+       "tags-delete": "бетерү",
+       "tags-activate": "активлаштыру",
+       "tags-deactivate": "сүндерү",
+       "tags-create-submit": "Төзү",
        "comparepages": "Битләрне чагыштыру",
        "compare-page1": "Беренче сәхифә",
        "compare-page2": "Икенче сәхифә",
        "htmlform-no": "Юк",
        "htmlform-yes": "Әйе",
        "htmlform-cloner-delete": "Бетерү",
+       "htmlform-date-placeholder": "ЕЕЕЕ-АА-КК",
+       "htmlform-time-placeholder": "СС:ММ:СС",
+       "htmlform-datetime-placeholder": "ЕЕЕЕ-АА-КК СС:ММ:СС",
        "logentry-delete-delete": "$1 $3 битен {{GENDER:$2|бетерә}}",
        "revdelete-content-hid": "эчтәлек яшерелгән",
        "revdelete-summary-hid": "төзәтмәнең тасвирламасы яшерелгән",
        "feedback-thanks-title": "Рәхмәт!",
        "searchsuggest-search": "{{SITENAME}} эчендә эзләү",
        "searchsuggest-containing": "эчтәлек...",
-       "api-error-badaccess-groups": "Сезгә бу викигә файллар өстәү рөхсәт ителмәгән",
        "api-error-badtoken": "Эчке хата: дөрес булмаган токен.",
-       "api-error-copyuploaddisabled": "URL-адрес буенча йөкләү бу серверда сүндерелгән.",
-       "api-error-duplicate": "Мондый эчтәлекле {{PLURAL:$1|башка файл}} да бар.",
-       "api-error-duplicate-archive": "Элек сайтта мондый эчтәлекле {{PLURAL:$1|башка файл}} бар иде инде, ләкин {{PLURAL:$1|1=аны бетерделәр|аларны бетерделәр}}.",
-       "api-error-empty-file": "Сезнең тарафтан җибәрелгән файл буш.",
        "api-error-emptypage": "Яңа буш сәхифәләр төзү рөхсәт ителми",
-       "api-error-unknown-code": "Билгесез хата: \"$1\"",
-       "api-error-unknown-error": "Эчке хата: файлны йөкләргә тырышканда нәрсәдер ялгыш китте.",
-       "api-error-unknown-warning": "Билгесез кисәтү: $1",
+       "api-error-unknown-warning": "Билгесез кисәтү: \"$1\".",
        "api-error-unknownerror": "Билгесез хата: \"$1\".",
-       "api-error-uploaddisabled": "Бу викидә файллар йөкләү мөмкинлеге сүндерелгән.",
-       "api-error-verification-error": "Бәлки, бу файл бозылгандыр яки дөрес түгел киңәйтелмәгә ия.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|сәгать}}",
        "special-characters-group-ipa": "ХФӘ (IPA)",
        "special-characters-group-symbols": "Тамгалар",
        "special-characters-group-greek": "Грек",
+       "special-characters-group-greekextended": "Грек (киңәйтелгән)",
        "special-characters-group-cyrillic": "Кирилл",
        "special-characters-group-arabic": "Гарәп",
+       "special-characters-group-arabicextended": "Гарәп (киңәйтелгән)",
        "special-characters-group-persian": "Фарсы",
        "special-characters-group-hebrew": "Яхүд",
        "special-characters-group-bangla": "Бенгаль",
-       "special-characters-group-tamil": "Тамиль",
+       "special-characters-group-tamil": "Тамил",
        "special-characters-group-telugu": "Телугу",
-       "special-characters-group-sinhala": "Сингаль",
+       "special-characters-group-sinhala": "Сингал",
        "special-characters-group-gujarati": "Гуҗарати",
        "special-characters-group-devanagari": "Деванагари",
-       "special-characters-group-thai": "Таиланд",
+       "special-characters-group-thai": "Тай",
        "special-characters-group-lao": "Лаос",
-       "special-characters-group-khmer": "Кһмер"
+       "special-characters-group-khmer": "Кһмер",
+       "log-action-filter-all": "Барысы",
+       "log-action-filter-block-block": "Тыю",
+       "authmanager-email-label": "Электрон почта",
+       "authmanager-email-help": "Электрон почта адресы",
+       "authmanager-realname-label": "Чын исеме",
+       "authprovider-resetpass-skip-label": "Калдыру"
 }
index fc367b9..a5dbfef 100644 (file)
@@ -11,7 +11,8 @@
                        "Irus",
                        "Shklyaev",
                        "Wadorgurt",
-                       "Zpizza"
+                       "Zpizza",
+                       "Mouse21"
                ]
        },
        "tog-underline": "Чӧлсконъёсыз ултӥз гожен сызоно",
        "cancel": "Берытсконо",
        "mypage": "Бам",
        "mytalk": "Викиавтор сярысь вераськон",
-       "anontalk": "СÑ\8fÑ\80Ñ\8bÑ\81Ñ\8c Ð²ераськон",
+       "anontalk": "Ð\92ераськон",
        "navigation": "Навигация",
        "and": "&#32;но",
        "qbfind": "Утчан",
        "variants": "Вариантъёс",
        "navigation-heading": "Навигация",
        "errorpagetitle": "Янгыш",
-       "returnto": "Берыктон борды бам $1.",
+       "returnto": "$1 баме берытскон.",
        "tagline": "{{SITENAME}}-ысь материал",
        "help": "Валэктонъёс",
        "search": "Утчан",
        "create-this-page": "Та бамез кылдытыны",
        "delete": "Быдтыны",
        "deletethispage": "Та бамез быдтыны",
-       "undeletethispage": "Та Ð±Ð°Ð¼ÐµÐ· Ð±Ñ\8bдÑ\82Ñ\8bнÑ\8b",
+       "undeletethispage": "Ð\91еÑ\80ен Ñ\81Ñ\91Ñ\82Ñ\8bнÑ\8b Ñ\82а Ð±Ð°Ð¼ÐµÐ·",
        "protect": "Утьыны",
        "protect_change": "воштыны",
        "protectthispage": "Та бамез утьыны",
        "unprotectthispage": "Та бамлэсь утемзэ воштыны",
        "newpage": "Выль бам",
        "talkpage": "Та бам сярысь вераськыны",
-       "talkpagelinktext": "Ð\92ераськон",
+       "talkpagelinktext": "вераськон",
        "specialpage": "Ваньмыз панель",
        "personaltools": "Нимаз тӥрлыке",
        "articlepage": "Статьяез учкыны",
        "categorypage": "Категорилэсь бамзэ учкыны",
        "viewtalkpage": "Вераськонэз учкыны",
        "otherlanguages": "Мукет кылъёсын",
-       "redirectedfrom": "(Ð\9fеÑ\80енапÑ\80авлÑ\8fÑ\82Ñ\8c $1)",
+       "redirectedfrom": "(ЫÑ\81Ñ\82Ñ\8dмÑ\8bн Â«$1» Ð±Ð°Ð¼Ñ\8bÑ\81Ñ\8c)",
        "redirectpagesub": "Ыстӥсь бам",
-       "redirectto": "Ð\92Ñ\8bжÑ\8bÑ\82он:",
+       "redirectto": "ЫÑ\81Ñ\82он Ð±Ð°Ð¼Ðµ:",
        "lastmodifiedat": "Та бамлэн берпуметӥ воштонэз: $2, $1.",
        "protectedpage": "Утем бам",
        "jumpto": "Выжон:",
        "copyrightpage": "{{ns:project}}:Автор праваос",
        "currentevents": "Выль иворъёс",
        "currentevents-url": "Project:Выль иворъёс",
-       "disclaimers": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ð¿Ñ\83миÑ\82 Ð»Ñ\83он",
-       "disclaimerpage": "Project:Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ð¿Ñ\83миÑ\82 Ð»Ñ\83он",
+       "disclaimers": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8dмлÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cкон",
+       "disclaimerpage": "Project:Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8dмлÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cкон",
        "edithelp": "Тупатонъя юрттэт",
        "helppage-top-gethelp": "Юрттэт",
        "mainpage": "Кутскон бам",
        "portal-url": "Project:Портал сообщества",
        "privacy": "Конфиденциальностья политика",
        "privacypage": "Project:Конфиденциальностья политика",
-       "badaccess": "ЯнгÑ\8bÑ\88Ñ\8aÑ\91Ñ\81 Ñ\8eаÑ\81Ñ\8cке",
-       "badaccess-group0": "Ð\91Ñ\8bдÑ\8dÑ\81Ñ\82Ñ\8dм Ñ\83жез Ñ\82онÑ\8d Ñ\83г Ð»Ñ\8dзÑ\8cÑ\8b, ÐºÐ¸Ð½ Ñ\82онÑ\8d ÐºÑ\83Ñ\80озы.",
-       "badaccess-groups": "УжÑ\8aÑ\91Ñ\81Ñ\8bн Ð½Ð¾, ÐºÑ\83даз Ñ\82ӥледÑ\8bз ÐºÑ\83Ñ\80иÑ\81Ñ\8cко Ð¿Ð¾Ñ\86иенÑ\82 {{PLURAL:$2|Ñ\82Ñ\83Ñ\80кÑ\8bм|гÑ\80Ñ\83ппа Ð¾Ð´Ó¥Ð³}}: $1.",
-       "versionrequired": "MediaWiki доллар кулэ версия $1",
+       "badaccess": "Ð\9bÑ\8dзÑ\91н Ñ\8fнгÑ\8bÑ\88",
+       "badaccess-group0": "Тӥ Ñ\83д Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cке Ñ\82ӥледÑ\8bн ÐºÑ\83Ñ\80ем Ñ\83жез Ð±Ñ\8bдÑ\8dÑ\81Ñ\8aÑ\8fны.",
+       "badaccess-groups": "Ð\9aÑ\83Ñ\80ем Ñ\83жез Ð±Ñ\8bдÑ\8dÑ\81Ñ\8aÑ\8fнÑ\8b Ð±Ñ\8bгаÑ\82о {{PLURAL:$2|1=«$1» Ð³Ñ\80Ñ\83ппаÑ\8bÑ\81Ñ\8c Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð³Ð¸Ð½Ñ\8d\82а Ð³Ñ\80Ñ\83ппаоÑ\81 Ð¿Ó§Ð»Ñ\8bÑ\81Ñ\8c Ð¾Ð³ÐµÐ·Ð»Ñ\8dн Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81Ñ\8bз Ð³Ð¸Ð½Ñ\8d: $1}}.",
+       "versionrequired": "$1 номеро MediaWiki версия кулэ",
        "ok": "OK",
        "retrievedfrom": "«$1»-лэсь басьтэмын",
        "editsection": "тупатыны",
        "hidetoc": "ватоно",
        "collapsible-collapse": "ватоно",
        "collapsible-expand": "возьматоно",
-       "confirmable-yes": "Ð\9cед",
+       "confirmable-yes": "Ð\91ен",
        "confirmable-no": "Ӧвӧл",
        "viewdeleted": "Учкыны $1",
        "site-rss-feed": "$1 — RSS-лента",
        "databaseerror-query": "Курон: $1",
        "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Янгыш: $1",
+       "badtitle": "Умойтэм ним",
+       "badtitletext": "Курем бам ним луэ мыдлань, буш либо кылъёс куспын яке викиос куспын нимыз умойтэм герӟамын.\nНимын, вылды, ярантэм символъёс вань.",
        "viewsource": "Кодзэ учкыны",
-       "viewsource-title": "Кодзэ учкыны бам $1",
-       "actionthrottled": "Ð\9aекаÑ\82Ñ\8bнÑ\8b Ñ\83жÑ\8aÑ\91Ñ\81",
-       "actionthrottledtext": "УжÑ\80адлÑ\8dн Ó\9fеÑ\87лÑ\8bкез Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебление-нÑ\8eÑ\80Ñ\8aÑ\8fÑ\81Ñ\8cкон, Ñ\82а Ñ\83жÑ\80ад Ñ\82Ó¥ Ð¿Ð¾Ð½Ð½Ð° Ñ\83кÑ\8bÑ\80 Ñ\82Ñ\80оÑ\81 Ð¿Ð¾Ð»Ð»Ñ\8b Ñ\81Ñ\8eбегамÑ\8bн Ð±Ñ\8bдÑ\8dÑ\81Ñ\82он Ð²Ð°ÐºÑ\87и Ð´Ñ\8bÑ\80 ÐºÑ\83Ñ\81Ñ\8bпÑ\8aÑ\91Ñ\81, Ð»Ð¸Ð¼Ð¸Ñ\82Ñ\8aÑ\91Ñ\81, Ñ\82а Ñ\82ӥлÑ\8fд Ð½Ð¾ Ñ\82Ñ\83бе.\nÐ\9fожалÑ\83йÑ\81Ñ\82а, ÐºÓ§Ð½Ñ\8f ÐºÐµ Ð¼Ð¸Ð½Ñ\83Ñ\82 Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\81а, Ð½Ð¾Ñ\88 Ð¸Ðº Ñ\83Ñ\82Ñ\87аÑ\81Ñ\8cко.",
-       "protectedpagetext": "Та бамез утьыны луэ шуыса, яке мукет уже предотвращать редактировать карон.",
-       "viewsourcetext": "Та бамез учкыны быгатӥськоды тӥ но потон кӧчыро.",
-       "viewyourtext": "Ð\9eÑ\88меÑ\81 Ð½Ð¾, Ñ\82онÑ\8d Ñ\83Ñ\87кÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b ÐºÓ§Ñ\87Ñ\8bÑ\80Ñ\8bнÑ\8b <strong>Ñ\82он Ñ\88онеÑ\80Ñ\82он</strong> Ñ\82а Ð±Ð°Ð¼Ð°Ð¼.",
-       "protectedinterface": "Та текст бам вайытиськом, та программаын вики интерфейсъёс, но дурбасьтэ, мед злоупотребление предотвращать.\nВика ватсаса, ваньзэ воштыны яке берыктон понна, пожалуйста, [https://translatewiki.net/ translatewiki.net] MediaWiki локализация проект.",
-       "editinginterface": "<strong>Юа:</strong> Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bнÑ\8b Ð±Ð°Ð¼Ð·Ñ\8d Ñ\82он, Ð¿Ñ\80огÑ\80аммное Ð¾Ð±ÐµÑ\81пеÑ\87ение Ð¿Ð¾Ð½Ð½Ð° Ñ\81о Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81 Ñ\82екÑ\81Ñ\82овÑ\8bе ÐºÑ\8bлдÑ\8bÑ\82он Ð¿Ð¾Ð½Ð½Ð° ÐºÑ\83Ñ\82Ñ\8bнÑ\8b.\nТа Ð²Ð¸ÐºÐ¸Ð»Ñ\8dн Ð¼Ñ\83кеÑ\82 Ð±Ð°Ð¼Ð°Ð· Ð»Ñ\83иÑ\81Ñ\8c Ñ\82Ñ\83Ñ\81Ñ\81Ñ\8d Ð²Ð¾Ñ\88Ñ\82он Ð¿Ð¾Ð½Ð½Ð° Ñ\82а Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81Ñ\8dз Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8c Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8cÑ\81кий Ð¿ÐµÐ´Ð¿Ð°Ð» Ð±Ñ\8bгаÑ\82онлÑ\8bкÑ\8aÑ\91Ñ\81Ñ\81Ñ\8dÑ\81.",
+       "viewsource-title": "$1 бамлэсь кодзэ учкон",
+       "actionthrottled": "Уж Ð´Ñ\83гдÑ\8bÑ\82Ñ\8dмÑ\8bн",
+       "actionthrottledtext": "СпамлÑ\8b Ð¿Ñ\83миÑ\82 Ð½Ñ\8eÑ\80Ñ\8aÑ\8fÑ\81Ñ\8cкемен Ñ\82Ó¥ Ñ\83д Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cке Ñ\82а Ñ\83жез Ð±Ñ\8bдÑ\8dÑ\81Ñ\8aÑ\8fнÑ\8b Ñ\83кÑ\8bÑ\80 Ñ\82Ñ\80оÑ\81 Ð¿Ð¾Ð» Ð²Ð°ÐºÑ\87и Ð´Ñ\8bÑ\80 ÐºÑ\83Ñ\81пÑ\8bн â\80\94 Ð½Ð¾ Ñ\82Ó¥ Ñ\82а Ð»Ð¸Ð¼Ð¸Ñ\82лÑ\8dÑ\81Ñ\8c Ð²Ñ\8bлÑ\82Ó¥ Ð»Ñ\83идÑ\8b.\nТаÑ\83на, Ð²Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c Ð¾Ñ\81калÑ\82Ñ\8d ÐºÓ§Ð½Ñ\8f ÐºÐµ Ð¼Ð¸Ð½Ñ\83Ñ\82 ÐºÑ\83Ñ\81паÑ\82Ñ\8bÑ\81а.",
+       "protectedpagetext": "Та бам утемын вал сое тупатъянэз яке мукет ужъёсты палэнтон понна.",
+       "viewsourcetext": "Тӥ быгатӥськоды та бамлэсь кодзэ учкыны но кӧчырыны.",
+       "viewyourtext": "Тӥ Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b Ñ\82а Ð±Ð°Ð¼ÐµÐ· <strong>Ñ\82ӥлÑ\8fд Ñ\82Ñ\83паÑ\82онÑ\8aÑ\91Ñ\81Ñ\82Ñ\8bлÑ\8dÑ\81Ñ\8c</strong> ÐºÐ¾Ð´Ð·Ñ\8dÑ\81 Ñ\83Ñ\87кÑ\8bнÑ\8b Ð½Ð¾ ÐºÓ§Ñ\87Ñ\8bÑ\80Ñ\8bнÑ\8b.",
+       "protectedinterface": "Та бам возе интерфейс текстэз та викилэн программной обеспечениезлы. Вандализмез палэнтон понна со утемын воштонъёслэсь.\nВань викиослы берыктэмъёсты ватсалляны яке вошъяны вылысь, тауна, MediaWiki локализацияя сайтэ выжелэ — [https://translatewiki.net/ translatewiki.net].",
+       "editinginterface": "<strong>Сак Ð»Ñ\83Ñ\8d:</strong> Ð¢Ó¥ Ñ\82Ñ\83паÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b Ð±Ð°Ð¼ÐµÐ·, ÐºÑ\83дӥз Ð²Ð¾Ð·Ðµ Ð¿Ñ\80огÑ\80аммной Ð¾Ð±ÐµÑ\81пеÑ\87енилÑ\8dÑ\81Ñ\8c Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81 Ñ\82екÑ\81Ñ\82Ñ\81Ñ\8d.\nТа Ð±Ð°Ð¼ÐµÐ· Ñ\82Ñ\83паÑ\82он Ð²Ð¾Ñ\88Ñ\82оз Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81Ñ\8dз Ð²Ð¾Ð·Ñ\8cмаÑ\82онÑ\8dз Ð¼Ñ\83кеÑ\82 Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8b Ñ\82а Ð²Ð¸ÐºÐ¸Ñ\8bн.",
        "namespaceprotected": "Тон дорын редактировать карыны бам ӧвӧл юаське <кужмо>$1</strong> инты нимъёс.",
-       "exception-nologin": "Тон эн тусбуяськыны сӧзнэтэз",
-       "logouttext": "<strong>Тон али потэ.</strong>\n\nУчком, мар быгатозы бам куд-ог сямъёсты тӥледыз кадь возьматӥсько ке луысал, азьвыл сямен азьвыл системая пыртэмын, тон ӧд сузя, дыр кеш браузер.",
-       "welcomeuser": "Гажаса, $1!",
-       "welcomecreation-msg": "Тӥляд гожъямъёсты учётной кылдытэмын вал.\nТӥ быгатӥськоды воштэ {{SITENAME}} [[Special:Preferences|параметръёсты]] ке потэ тӥледлы.",
-       "yourname": "Ð\9fÑ\8bÑ\80он Ð½Ð¸Ð¼:",
-       "userlogin-yourname": "Ð\9fÑ\8bÑ\80он Ð½Ð¸Ð¼:",
+       "exception-nologin": "Ӧд пыре системае",
+       "logouttext": "<strong>Тӥ ужан сеансэз йылпумъяды.</strong>\n\nКуд-огез бамъёс возьматӥськыны на быгато озьы, тӥ авторизовать каремын на кадь. Талы пумит нюръяськон понна бушатэ браузерлэсь кэшсэ.",
+       "welcomeuser": "Гажаса ӧтиськом, $1!",
+       "welcomecreation-msg": "Тӥляд учётной записьты кылдытэмын.\nТӥ быгатӥськоды воштыны асьтэлэсь [[Special:Preferences|настройкаостэс]] {{SITENAME}} сайтлы, потэ ке.",
+       "yourname": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cлÑ\8dн Ð½Ð¸Ð¼Ñ\8bз:",
+       "userlogin-yourname": "Ð\92икиавÑ\82оÑ\80 Ð½Ð¸Ð¼",
        "userlogin-yourname-ph": "Гожтэ учётной записьтылэсь нимзэ",
-       "createacct-another-username-ph": "УÑ\87Ñ\91Ñ\82ной ÐºÐ½Ð¸Ð³Ð° Ð½Ð¸Ð¼Ñ\8aÑ\91Ñ\81 Ð¿Ñ\8bÑ\80Ñ\82Ñ\8dмÑ\8bн",
+       "createacct-another-username-ph": "Ð\93ожÑ\82Ñ\8d Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cлÑ\8dÑ\81Ñ\8c Ð½Ð¸Ð¼Ð·Ñ\8d",
        "yourpassword": "Лушкемкыл:",
        "userlogin-yourpassword": "Лушкемкыл",
-       "createacct-yourpasswordagain": "Пароль юнматэ",
-       "userlogin-remembermypassword": "Кылем сӧзнэтэз",
-       "cannotcreateaccount-title": "Уг быгатиськы гожъян кылдӥз учётной",
-       "yourdomainname": "Тӥ доменэн:",
+       "userlogin-yourpassword-ph": "Гожтэ асьтэлэсь парольдэс",
+       "createacct-yourpassword-ph": "Гожтэ паролез",
+       "createacct-yourpasswordagain": "Юнматэ паролез",
+       "createacct-yourpasswordagain-ph": "Гожтэ паролез эшшо одӥг пол",
+       "userlogin-remembermypassword": "Кылёно системаын",
+       "cannotcreateaccount-title": "Учётной записьёсты кылдытыны уг луы",
+       "yourdomainname": "Тӥляд доменды:",
        "login": "Пырыны",
        "nav-login-createaccount": "Нимдэс вераны / Регистрациез ортчытыны",
-       "userlogin": "Ð\9dимдÑ\8dÑ\81 Ð²ÐµÑ\80анÑ\8b / Ð ÐµÐ³Ð¸Ñ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82ыны",
+       "userlogin": "РегиÑ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82Ñ\8bнÑ\8b Ñ\8fке Ð\92икипедие Ð¿Ñ\8bÑ\80ыны",
        "userloginnocreate": "Пырыны",
        "logout": "Кошкыны",
        "userlogout": "Потыны",
-       "notloggedin": "Тон эн тусбуяськыны сӧзнэтэз",
-       "nologin": "Учётной книга ӧвӧл-а? $1.",
-       "nologinlink": "Выль вики-авторлэн регистрациез",
-       "createaccount": "выль вики-авторлэн регистрациез",
-       "gotaccountlink": "Пырыны",
+       "notloggedin": "Ӧд пыре системае",
+       "userlogin-noaccount": "Ас учётной записьты ӧвӧл?",
+       "userlogin-joinproject": "Проектэ пыриськоно",
+       "nologin": "Учётной запись ӧвӧл? $1.",
+       "nologinlink": "Учётной записез кылдытыны",
+       "createaccount": "Выль викиавторлэн регистрациез",
+       "gotaccountlink": "Пырелэ",
        "userlogin-resetpassword-link": "Тӥлесьтыд парольдэс куштыны?",
        "userlogin-helplink2": "Пыронъя юрттэт",
-       "createacct-emailrequired": "Электронной почталэн адресэз",
-       "createacct-emailoptional": "Электронной почтаезлэн адресэз (необязательное)",
-       "createaccountmail": "Адрес электронной почта огдырлы кутӥ вылын возьматэм образъёсыныз но соослэн случайной сгенерировать пароль ыстыны",
-       "createacct-submit": "Выль вики-авторлэн регистрациез",
-       "createacct-another-submit": "Выль вики-авторлэн регистрациез",
-       "loginerror": "Янгышъёс пырон",
-       "createacct-error": "Янгышъёс бордын учётной книга кылдытыны",
-       "createaccounterror": "Уг быгатиськы гожъян учётной кылдоз: $1",
-       "nocookiesnew": "Книга кылдытыны учётной пользователь вал, нош система тон уд пыры.\n{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, со гожтӥське, нош собере выльысь пырыны логин но пароль.",
-       "nocookieslogin": "{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, соосты утчано, выльысь гожтыны.",
-       "blocked-mailpassword": "Тон IP-адрес заблокировать-ысь редактировать карон. Злоупотребление предотвращение понна, та понна кутыны ӧз лэзиське пароль-ысь восстановление IP-адрес.",
+       "createacct-emailrequired": "Электрон почталэн адресэз",
+       "createacct-emailoptional": "Электрон почталэн адресэз (одно ик ӧвӧл)",
+       "createacct-email-ph": "Гожтэ асьтэлэн электрон почтадылэсь адрессэ",
+       "createaccountmail": "Эрказ малпаськытэк кылдытыны огдырлы паролез но ыстыны сое электрон почталэн гожтэм адресаз",
+       "createacct-submit": "Учётной записьтэс кылдытоно",
+       "createacct-another-submit": "Учётной записез кылдытоно",
+       "createacct-benefit-heading": "{{SITENAME}} — тӥ выллем адямиослэн валче ужамзы.",
+       "createacct-benefit-body1": "{{PLURAL:$1|тупатон}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|бам}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|викиавтор}} берло дыре",
+       "loginerror": "Пырон янгыш",
+       "createacct-error": "Учётной записез кылдытон янгыш",
+       "createaccounterror": "Учётной запись кылдытыны уг луы: $1",
+       "nocookiesnew": "Викиавтор регистрировать каремын, нош тӥ сайтэ ӧд пырелэ.\n{{SITENAME}} «cookies» уже кутэ викиавторъёсты сайтэ лэзьылыны вылысь.\nТӥляд «cookies-ты» ӧвӧл.\nТауна лэзе соосты, собере пыре сайтэ асьтэлэн выль викиавтор нименыды но пароленыды.",
+       "nocookieslogin": "{{SITENAME}} «cookies» уже кутэ викиавторъёсты сайтэ лэзьылыны вылысь.\nТӥляд «cookies-ты» ӧвӧл.\nТауна лэзе соосты но оскалтэ выльысь.",
+       "blocked-mailpassword": "Тӥляд IP-адресысьтыды бамъёсыз тупатъян дугдытэмын. Урод ужъёслы пумит нюръяськон понна паролез тупатон но уг лэзиськы та IP-адресысь.",
        "loginlanguagelabel": "Кыл: $1",
        "pt-login": "Пырыны",
        "pt-login-button": "Пырыны",
-       "pt-createaccount": "Выль вики-авторлэн регистрациез",
+       "pt-createaccount": "Выль викиавторлэн регистрациез",
        "pt-userlogout": "Потыны",
        "oldpassword": "Вуж лушкемкыл:",
        "newpassword": "Выль лушкемкыл:",
+       "passwordreset": "Пароль куштыны",
        "passwordreset-username": "Пырон ним:",
+       "bold_sample": "Зӧк шрифт",
+       "bold_tip": "Зӧк шрифт",
        "italic_sample": "Бекырес текст",
        "italic_tip": "Бекырес текст",
        "link_sample": "Чӧлсконлэн йыръянэз",
        "showpreview": "Бамез эскерон",
        "showdiff": "Пыртэм воштонъёс",
        "anoneditwarning": "<strong>Сак луэ!</strong> Тӥ сайтэ ӧд пырелэ. Тӥ котькыӵе тупатонъёсыз лэсьтоды бере, тӥляд IP-адресты ваньмызлы адӟытӥськоз. Тӥ <strong>[$1 пыроды]</strong> яке <strong>[$2 учётной записез кылдытоды]</strong> бере, тӥляд тупатонъёсты герӟаськозы нимдылы, мукет пайдаосын ӵош.",
-       "blockedtitle": "Ð\97аблокиÑ\80оваÑ\82Ñ\8c Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "blockedtext": "<strong>Ð\9aнигае Ñ\8fке Ñ\83Ñ\87Ñ\91Ñ\82ной IP-адÑ\80еÑ\81 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ован.</strong>\n\nÐ\91локиÑ\80овка Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð¿Ð¾Ñ\82ӥз $1.\nÐ\92озÑ\8cмалÑ\8d Ð²Ñ\83оно Ð¼Ñ\83гез: \"\"$2\"\".\n\n* Ð\9aÑ\83Ñ\82Ñ\81кон Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка: $8\n* Ð\91локиÑ\80овка Ð¾Ñ\80Ñ\82Ñ\87из: $6\n* Ð\91локиÑ\80овка Ð¼ÐµÑ\80еÑ\82Ñ\8aÑ\91Ñ\81Ñ\8bз: $7\n\nÐ\91Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкод-а Ñ\82он Ð³ÐµÑ\80Ó\9fаÑ\81Ñ\8cкемÑ\8bн $1 Ñ\8fке Ð¼Ñ\83кеÑ\82 ÐºÐ¾Ñ\82Ñ\8cкÑ\83дӥнÑ\8bз [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8aÑ\91Ñ\81]], Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð¼ÐµÐ´ Ñ\8dÑ\81кеÑ\80озÑ\8b.\nУÑ\87ком, Ð¼Ð°Ñ\80 ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ñ\83г Ð±Ñ\8bгаÑ\82о Ñ\84Ñ\83нкÑ\86изÑ\8dÑ\81 \"гожÑ\82Ñ\8dÑ\82\", Ð°Ñ\81 ÐºÐµ [[Special:Preferences|наÑ\81Ñ\82Ñ\80ойка Ð¿ÐµÑ\80Ñ\81оналÑ\8cной]] Ð·Ñ\83Ñ\80каÑ\82Ó¥Ñ\81Ñ\8c Ñ\8fке Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82аезлÑ\8dн Ð°Ð´Ñ\80еÑ\81Ñ\8dз Ñ\8dн Ñ\87Ñ\83Ñ\80Ñ\82на Ñ\83г ÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bй, Ñ\8fке Ð³Ð¾Ð¶Ñ\82Ó¥Ñ\81Ñ\8cкод ÐºÐµ, Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82 Ñ\8bÑ\81Ñ\82он Ñ\83кÑ\88аÑ\81Ñ\8c Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð°Ð»Ð¾Ð½.\nТон IP-адÑ\80еÑ\81 â\80\94 $3, Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80лÑ\8dн â\80\94 $5.\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð°Ñ\81лÑ\8dÑ\81Ñ\8cÑ\82Ñ\8bм Ñ\82одон-Ñ\82а Ð²Ð°Ð·Ð¸Ñ\81Ñ\8cконÑ\8dз ÐºÐ¾Ñ\82Ñ\8cкÑ\83 Ð²Ð¾Ð·Ñ\8cмано.",
-       "autoblockedtext": "Тон IP-адрес, герӟет автоматически заблокирован а со, мар солэн кутыны луоно азьвыл кин ке но пырисьёс пӧлысь, заблокирован {{GENDER:$4|участник|куакеч}} $1. \nБлокировка возьмано луоз вуоно мугез:\n\n: \"$2\" - лы.\n\n* Кутскон блокировка: $8\n* Блокировка ортчиз: $6\n* Блокировка меретъёсыз: $7\n\nБыгатӥськод-а тон герӟаськемын $1 яке мукет котькудӥныз [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]], блокировка мед эскерозы.\n\nУчком, мар кутыны уг быгато функцизэс \"гожтэт\", ас ке [[Special:Preferences|настройка персональной]] зуркатӥсь яке электронной почтаезлэн адресэз эн чуртна уг корректный, яке гожтӥськод ке, гожтэт ыстон укшась блокировка алон.\n\nТон IP-адрес — $3, блокировка идентификаторлэн — #$5.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
-       "blockednoreason": "мÑ\83гезлÑ\8b Ñ\8dн Ð²Ð¾Ð·Ñ\8cмалÑ\8d",
-       "whitelistedittext": "Тон ÐºÑ\83лÑ\8d $1 Ð±Ð°Ð¼ Ð²Ð¾Ñ\88Ñ\82он Ð¿Ð¾Ð½Ð½Ð°.",
-       "loginreqtitle": "Ð\90вÑ\82оÑ\80изаÑ\86иÑ\8f ÐºÑ\83лÑ\8d",
+       "blockedtitle": "Ð\92икиавÑ\82оÑ\80 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн",
+       "blockedtext": "<strong>ТӥлÑ\8fд Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\82Ñ\8b Ñ\8fке IP-адÑ\80еÑ\81Ñ\82Ñ\8b Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн Ð²Ð°Ð».</strong>\n\nÐ\91локиÑ\80овкаез Ð»Ñ\8dÑ\81Ñ\8cÑ\82ӥз $1.\nÐ\9fÑ\83Ñ\81Ñ\8aем Ð¼Ñ\83гез: <em>$2</em>.\n\n* Ð\91локиÑ\80овка ÐºÑ\83Ñ\82Ñ\81киз: $8\n* Ð\91локиÑ\80овка Ð¹Ñ\8bлпÑ\83мÑ\8aÑ\8fÑ\81Ñ\8cкоз: $6\n* Ð\91локиÑ\80овкалÑ\8dн Ñ\83жпÑ\83мез: $7\n\nТӥ Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c Ð²ÐµÑ\80аÑ\81Ñ\8cкÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b $1 Ñ\8fке ÐºÐ¾Ñ\82Ñ\8cкин Ð¼Ñ\83кеÑ\82 [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80]] Ð´Ð¾Ñ\80Ñ\8b Ð³ÐµÑ\80Ó\9fаÑ\81Ñ\8cкÑ\8bÑ\81а.\n[[Special:Preferences|Ð\9dаÑ\81Ñ\82Ñ\80ойкаоÑ\81адÑ\8b]] Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82алÑ\8dн Ñ\83жаÑ\81Ñ\8c Ð°Ð´Ñ\80еÑ\81Ñ\8dз Ó§Ð²Ó§Ð» Ð´Ñ\8bÑ\80Ñ\8aÑ\8f, Ñ\82Ó¥ Â«Ð\92икиавÑ\82оÑ\80лÑ\8b Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82» Ñ\84Ñ\83нкÑ\86иез Ñ\83же ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ñ\83д Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cке, Ñ\81ое Ñ\82ӥленÑ\8bдÑ\8b Ñ\83же ÐºÑ\83Ñ\82он Ð´Ñ\83гдÑ\8bÑ\82Ñ\8dмÑ\8bн Ó§Ð²Ó§Ð» ÐºÐµ.\nТӥлÑ\8fд Ð°Ð»Ð¸ IP-адÑ\80еÑ\81Ñ\82Ñ\8b Ð»Ñ\83Ñ\8d $3, Ð½Ð¾ Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 â\80\94 #$5.\nТаÑ\83на Ð¿Ñ\8bÑ\80Ñ\82Ñ\8d Ð²Ð°Ð½Ñ\8c Ñ\82а Ð¿Ñ\8bÑ\80-поÑ\87 Ñ\81ведениоÑ\81Ñ\8bз Ð°Ñ\81Ñ\8cÑ\82Ñ\8dлÑ\8dн ÐºÑ\83Ñ\80онÑ\8aÑ\91Ñ\81адÑ\8b.",
+       "autoblockedtext": "Тӥляд IP-адресты автоматически заблокировать каремын вал, малы ке шуоно со кутӥськиз вал мукет викиавторен, кинзэ $1 заблокировать кариз.\nБлокировкалэн пусъем мугез:\n\n:<em>$2</em>\n\n* Блокировка кутскиз: $8\n* Блокировка йылпумъяськоз: $6\n* Блокировкалэн ужпумез: $7\n\nТӥ блокировка сярысь вераськыны быгатӥськоды $1 яке мукет [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]] пӧлысь огез доры герӟаськыса.\n\nСак луэ, тӥ «Викиавторлы гожтэт» функциез уже кутыны уд быгатӥське [[Special:Preferences|асьтэлэн настройкаосады]] электрон почталэсь шонер адрессэ гожтытозь яке юнматытозь, либо блокировкады сыӵе амалэн гожтэтъёсыз ыстыны уг лэзьы ке.\n\nТӥляд али IP-адресты луэ $3, но блокировка идентификатор — #$5.\nТауна пыртэ вань та пыр-поч сведениосыз асьтэлэн куронъёсады.",
+       "blockednoreason": "пÑ\83кÑ\82Ñ\8dм Ð¼Ñ\83г Ó§Ð²Ó§Ð»",
+       "whitelistedittext": "Ð\91амÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ð²Ð¾Ñ\88Ñ\8aÑ\8fнÑ\8b Ð²Ñ\8bлÑ\8bÑ\81Ñ\8c $1 ÐºÑ\83лÑ\8d.",
+       "loginreqtitle": "СиÑ\81Ñ\82емае Ð¿Ñ\8bÑ\80оно",
        "loginreqlink": "пырыны",
-       "loginreqpagetext": "Тон ÐºÑ\83лÑ\8d $1-Ñ\8bÑ\81Ñ\8c, Ñ\81ое Ð¼Ñ\83кеÑ\82 Ð±Ð°Ð¼ÐµÐ· Ñ\83Ñ\87кÑ\8bнÑ\8b Ñ\88Ñ\83Ñ\8bÑ\81а.",
-       "newarticletext": "Тон бам ссылкаос вылэ выжыса, со кема уз улы.\nСоос мед кылдозы, текст бичась укноос, улазы интыяськемын (умой-умой см. [$1 бам справочной]).\nЯнгыш-а тон татын луысалыд ке, кнопказэ зӥбиз гинэ <strong>берлань</strong> асьтэлэсь браузеръёстэс.",
+       "loginreqpagetext": "Ð\9cÑ\83кеÑ\82 Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\83Ñ\87кÑ\8bнÑ\8b Ð²Ñ\8bлÑ\8bÑ\81Ñ\8c $1 ÐºÑ\83лÑ\8d.",
+       "newarticletext": "Тӥ чӧлсконэтӥ ортчиды баме, кудӥз ӧвӧл на.\nСое кылдытыны вылысь, печатлалэ текст улӥ возьматэм укное (пыр-почгес учке [$1 юрттэт бамын]).\nТӥ вуиды татчы янгыш луэмен ке, зӥбе тӥляд браузердылэсь <strong>берлань</strong> кнопказэ.",
        "noarticletext": "Али дыре та бамын текст ӧвӧл. \nТӥ быгатоды [[Special:Search/{{PAGENAME}}|шедьтыны со сярысь кыӵе ке ивор]] мукет бамъёсысь,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} шедьтыны журналъёсысь гожъямъёсыз], \nяке [{{fullurl:{{FULLPAGENAME}}|action=edit}} сыӵе нимын бам кылдытыны]</span>.",
-       "noarticletext-nopermission": "Али дыре та бам вылын кылкуэт ӧвӧл.\nТон быгатӥськод [[Special:Search/{{PAGENAME}}|сётэм йыръянъёс шедьто упоминание]] мукет бам вылын,\nяке <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} соответствующий журнал книгаез шедьтыны].</span> Тӥ дорын сётӥське юаськыны кылдӥз бам ӧвӧл.",
-       "blocked-notice-logextract": "Ð\9fолÑ\8cзоваÑ\82елÑ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ован Ñ\81Ñ\91Ñ\82ӥз Ñ\82а Ñ\83Ñ\87Ñ\8bÑ\80лÑ\8b.\nСпÑ\80авка Ð¿Ð¾Ð½Ð½Ð° Ñ\80адÑ\8aÑ\8fÑ\81Ñ\8cкÑ\8bлӥÑ\81Ñ\8c Ð¶Ñ\83Ñ\80нал Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð»Ð°Ð¿ÐµÐ³ Ð±ÐµÑ\80пÑ\83меÑ\82Ó¥ Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82:",
+       "noarticletext-nopermission": "Али дыре та бамын текст ӧвӧл.\nТӥ быгатоды [[Special:Search/{{PAGENAME}}|шедьтыны со сярысь кыӵе ке ивор]] мукет бамъёсысь, яке <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} шедьтыны журналъёсысь гожъямъёсыз]</span>, нош та бамез кылдытыны тӥляд лэзёнды ӧвӧл.",
+       "blocked-notice-logextract": "Та Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð°Ð»Ð¸ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн.\nÐ\91локиÑ\80овкаоÑ\81Ñ\8bн Ð¶Ñ\83Ñ\80налÑ\8bÑ\81Ñ\8c Ð±ÐµÑ\80пÑ\83м Ð³Ð¾Ð¶Ñ\8aÑ\8fм Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн:",
        "continue-editing": "Тупатъянэз азьланьтоно",
        "editing": "Тупатон: $1",
+       "creating": "Кылдытон: $1",
        "editingsection": "Тупатон: $1 (люкет)",
+       "templatesused": "Та бам пушкы пыртэм {{PLURAL:$1|шаблон|шаблонъёс}}:",
        "template-protected": "(утемын)",
-       "template-semiprotected": "(полуутемын)",
-       "nocreatetext": "Та сайтлэн бамаз выль сюбегатэм луонлыкъёсын кылдытон.\nТон улыса, берлань вуэ быгатэ бам отредактировать, [[Special:UserLogin|тусбуяськыны книгае яке выль система кылдыто учётной]].",
-       "nocreate-loggedin": "Тон доразы юаськыны кылдӥз выль бам ӧвӧл.",
-       "permissionserrors": "Янгышъёс юаське",
-       "permissionserrorstext": "Тон дорын разрешенизы ӧвӧлэн, тазэ лэсьтом шуыса, со понна вуоно {{PLURAL:$1|мугез}}:",
-       "permissionserrorstext-withaction": "Правоез ӧвӧл, тон дорын $2 тӥ {{PLURAL:$1/1=мугез вуоно|мугез вуоно}}:",
+       "template-semiprotected": "(ӧжытак утемын)",
+       "hiddencategories": "Та бам пыре {{PLURAL:$1|$1 ватэм категорие}}:",
+       "nocreatetext": "{{SITENAME}} сюбегомытӥз луонлыкез выль бамъёсты кылдытъяны.\nТӥ быгатӥськоды берытскыны но азьло кылдытэм бам тупатыны, [[Special:UserLogin|системае пырыны яке выль аккаунт кылдытыны]].",
+       "nocreate-loggedin": "Выль бамъёсты кылдытъяны тӥляд лэзёнды ӧвӧл.",
+       "permissionserrors": "Лэзён янгыш",
+       "permissionserrorstext": "Тӥляд тае быдэстыны лэзёнды ӧвӧл та {{PLURAL:$1|1=муген|мугъёсын}} сэрен:",
+       "permissionserrorstext-withaction": "Тӥляд $2 лэзёнды ӧвӧл та {{PLURAL:$1|1=муген|мугъёсын}} сэрен:",
+       "moveddeleted-notice": "Та бам быдтэмын вал.\nБыдтонъёсын но ним воштонъёсын журналъёсысь ярано записьёс чӧлсконлы улӥ возьматэмын.",
        "content-model-wikitext": "викитекст",
-       "undo-summary": "Шонертон вошъян $1, лэсьтӥзы {{GENDER:$2|участник|куакеч}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
-       "cantcreateaccount-text": "Та книгаез кылдытонлы учётной IP-адрес (<strong>$1</strong>) заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
-       "cantcreateaccount-range-text": "Учётной кылдытон - гожъян IP-адрес диапазонын <strong>$1</strong>, Тон пыриське со IP-адрес (<strong>$4</strong>), заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|вераськон]]) викиавторлэн $1 номеро тупатонэз палэнтэмын",
+       "cantcreateaccount-text": "Та IP-адресысь (<strong>$1</strong>) учётной записьёсты кылдытон заблокировать каремын вал [[User:$3|$3]] викиавторен.\n\n$3 пусйиз таӵе мугез: <em>$2</em>.",
+       "cantcreateaccount-range-text": "[[User:$3|$3]] викиавтор дугдытӥз учётной записьёсты кылдытыны <strong>$1</strong> радлэн IP-адресъёсысьтыз, кудъёсыз пӧлы пыре тӥляд IP-адресты (<strong>$4</strong>).\n\n$3 пусйиз таӵе мугез: <em>$2</em>.",
        "viewpagelogs": "Та бамлы журналъёсыз возьматыны",
+       "currentrev-asof": "Алиез версия $1",
        "revisionasof": "Версия $1",
+       "revision-info": "Версия $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Вужгем",
+       "nextrevision": "Выльгем →",
+       "currentrevisionlink": "Алиез версия",
        "cur": "али",
        "last": "азьв.",
+       "history-fieldset-title": "Историез учкыны",
        "history-show-deleted": "Ӵушылэмъёссэ гинэ",
        "rev-delundel": "возьматыны/ватыны",
        "rev-showdeleted": "возьматоно",
-       "revdelete-show-file-submit": "да",
+       "revdelete-show-file-submit": "Ð\91ен",
        "revdelete-radio-set": "Ватэм",
        "revdelete-radio-unset": "Адӟымон",
-       "revdelete-reason-dropdown": "*Ð\92ӧлÑ\81кем Ð¿Ð°Ð»Ñ\8dнÑ\81кон Ð¼Ñ\83гÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b\n** Ð\90вÑ\82оÑ\80Ñ\81кой Ð¿Ñ\80авооÑ\81Ñ\82Ñ\8b Ñ\82Ó¥Ñ\8fн\n** Ð¯ÐºÐµ ÐºÑ\83лÑ\8dÑ\82Ñ\8dм Ð¸Ð½Ñ\84оÑ\80маÑ\86иез Ð»Ð¸Ñ\87ной ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ий\n** Ð\9bогин Ð½ÐµÑ\81ооÑ\82веÑ\82Ñ\81Ñ\82воваÑ\82Ñ\8c\n** Ð\9aÑ\83Ñ\80ла Ð¸Ð½Ñ\84оÑ\80маÑ\86иез Ð\9fоÑ\82енÑ\86иалÑ\8cно",
+       "revdelete-reason-dropdown": "*Ð\9eгÑ\88оÑ\80Ñ\8b Ð±Ñ\8bдÑ\82он Ð¼Ñ\83гÑ\8aÑ\91Ñ\81\n** Ð\90вÑ\82оÑ\80 Ð¿Ñ\80авооÑ\81Ñ\82Ñ\8b Ñ\82Ó¥Ñ\8fн\n** Ð¯Ñ\80анÑ\82Ñ\8dм ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ий Ñ\8fке Ð»Ð¸Ñ\87ной Ñ\81ведениоÑ\81\n** Ð\92икиавÑ\82оÑ\80лÑ\8dн Ñ\8fÑ\80анÑ\82Ñ\8dм Ð½Ð¸Ð¼Ñ\8bз\n** Ð\9bÑ\83оно Ð»ÐµÐºÐ°Ñ\82Ó¥Ñ\81Ñ\8c Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f",
        "history-title": "$1 — воштонъёслэн историзы",
+       "difference-title": "$1 — версиосыз куспын пӧртэмлык",
        "lineno": "$1-тӥ чур:",
        "compareselectedversions": "Быръем версиосыз ӵошатыны",
        "showhideselectedversions": "Возьматыны/ватыны быръем версиосыз",
        "editundo": "берытсконо",
+       "diff-multi-sameuser": "(таизлэн ик викиавторлэн {{PLURAL:$1|вискын шедьтэм $1 версиез}} возьматэмын ӧвӧл)",
        "searchresults": "Шедьтэмын",
        "searchresults-title": "утчан \"$1\"",
        "prevn": "{{PLURAL:$1|$1-лы}} берлань",
        "nextn": "{{PLURAL:$1|$1-лы}} азьлань",
+       "nextn-title": "$1 {{PLURAL:$1|шедьтэмлы}} азьлань",
        "shown-title": "Адӟытылоно $1 {{PLURAL:$1|шедьтэмез}} бамлы быдэ",
        "viewprevnext": "Учкыны ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>Кылдытыны «[[:$1]]» бамез та вики-проектын!</strong> {{PLURAL:$2|0=|Со сяна утчанэныды шедьтэм бамез учке.|Со сяна шедьтэм бамъёсты учке.}}",
        "search-result-size": "$1 ({{PLURAL:$2|$2 кыл}})",
        "search-redirect": "($1 бамысь ыстон)",
        "search-section": "(«$1» люкет)",
+       "search-suggest": "Тӥ, вылды, утчаллямды «$1».",
        "search-interwiki-more": "(эшшо)",
        "searchall": "Ваньзэ",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> пӧлысь <strong>$1-тӥ</strong> шедьтэм|<strong>$3</strong> пӧлысь <strong>$1—$2</strong> шедьтэмъёс}}",
        "prefs-editing": "Тупатон",
        "yourlanguage": "Интерфейслэн кылыз:",
        "prefs-preview": "Бамез эскерон",
-       "editusergroup": "Группае {{GENDER:$1|пырись}} мукет",
-       "group-autoconfirmed": "Автоподтвержденный пыриськисьёс",
-       "group-bot": "Боты",
+       "userrights": "Пыриськисьлэн правоосыныз кивалтон",
+       "editusergroup": "Викиавторлэсь группаоссэ возьматыны",
+       "group-autoconfirmed": "Авто-юнматэм викиавторъёс",
+       "group-bot": "Ботъёс",
        "group-sysop": "Администраторъёс",
        "group-all": "(ваньзэ)",
-       "right-read": "лыдӟыны бам",
-       "right-edit": "правка бам",
-       "right-createpage": "бам кылдытон-а, уг-возьматэмзэ эскерон",
-       "right-createtalk": "создание бамлэн обсуждениосаз",
-       "right-createaccount": "выль книга кылдытон пыриськизы учётной",
-       "right-writeapi": "гожтэтъёсты кутон понна API",
-       "right-block": "мукет пыриськисьёслэсь курон-косон вылэ установкаосты редактировать",
+       "grouppage-sysop": "{{ns:project}}:Администраторъёс",
+       "right-read": "Бамъёсты учкон",
+       "right-edit": "Бамъёсты тупатъян",
+       "right-createpage": "Бамъёсты кылдытон (вераськон бамъёс сяна)",
+       "right-createtalk": "Вераськон бамъёсты кылдытон",
+       "right-createaccount": "Викиавторъёслэсь выль учётной записьёссэс кылдытон",
+       "right-writeapi": "Гожъясь API уже кутон",
+       "right-block": "Мукет викиавторъёсты тупатъянлэсь палэнтон",
        "newuserlogpage": "Викиавторъёсыз регистрациосын журнал",
-       "action-read": "Ñ\82а Ð»Ñ\8bдÓ\9fонÑ\8aÑ\91Ñ\81 Ð±Ð°Ð¼",
-       "action-edit": "Ñ\82а Ð±Ð°Ð¼ÐµÐ· Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c",
-       "action-block": "пыриськисьёс та понна луонлыкъёссы сюбегам редактировать",
+       "action-read": "Ñ\82а Ð±Ð°Ð¼ Ð»Ñ\8bдÓ\9fÑ\8bнÑ\8b",
+       "action-edit": "Ñ\82а Ð±Ð°Ð¼ÐµÐ· Ñ\82Ñ\83паÑ\82Ñ\8bнÑ\8b",
+       "action-block": "та викиавтор блокировать карыны",
        "enhancedrc-history": "история",
        "recentchanges": "Выль тупатонъёс",
        "recentchanges-legend": "Выль тупатонъёслы настройкаос",
        "recentchanges-summary": "Та бамын викилэн дыръя радъям выль воштонъёсыз возьматэмын.",
        "recentchanges-label-newpage": "Та тупатонэн выль бам кылдӥз",
-       "recentchanges-label-minor": "Ð\9fичи воштон",
-       "recentchanges-label-bot": "Та Ñ\82Ñ\83паÑ\82онÑ\8dз ÐºÐ°Ñ\80из Ð±Ð¾Ñ\82",
+       "recentchanges-label-minor": "Та Ñ\82Ñ\83паÑ\82он Ð»Ñ\83Ñ\8d Ð¿ичи воштон",
+       "recentchanges-label-bot": "Та Ñ\82Ñ\83паÑ\82онÑ\8dз Ð±Ð¾Ñ\82 ÐºÐ°Ñ\80из",
        "recentchanges-label-unpatrolled": "Та тупатонэз нокин но ӧз эскеры на",
        "recentchanges-label-plusminus": "Бамлэн быдӟалаез сомында байтъёслы воштӥськиз",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "rcshowhideminor-hide": "Ватыны",
        "rcshowhidebots": "$1 ботъёсыз",
        "rcshowhidebots-show": "Возьматыны",
+       "rcshowhidebots-hide": "Ватыны",
        "rcshowhideliu": "$1 пырем викиавторъёсыз",
        "rcshowhideliu-show": "Возьматыны",
        "rcshowhideliu-hide": "Ватыны",
        "recentchangeslinked-page": "Бамлэн нимыз:",
        "recentchangeslinked-to": "Мыддоринтыны: та бамез чӧлскись бамъёсыз воштонъёсыз возьматыны",
        "upload": "Файл поныны",
-       "uploadnologin": "Тон эн тусбуяськыны сӧзнэтэз",
-       "uploadnologintext": "Тон ÐºÑ\83лÑ\8d $1, Ð¼ÐµÐ´Ð°Ð· Ð·Ð°Ð³Ñ\80Ñ\83зка Ñ\84айл Ñ\81еÑ\80веÑ\80.",
+       "uploadnologin": "Ӧд пыре системае",
+       "uploadnologintext": "ФайлÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\81еÑ\80веÑ\80е Ð¿Ð¾Ð½Ñ\8bнÑ\8b Ð²Ñ\8bлÑ\8bÑ\81Ñ\8c $1 ÐºÑ\83лÑ\8d.",
        "filedesc": "Вакчияк описаниез",
-       "uploaddisabled": "Ð\97агÑ\80Ñ\83зка Ð°Ð»Ó¥Ð·Ñ\8b",
-       "copyuploaddisabled": "Ð\97агÑ\80Ñ\83зка URL disconnect.",
-       "uploaddisabledtext": "Ð\97агÑ\80Ñ\83зка Ñ\84айл disconnect.",
+       "uploaddisabled": "ФайлÑ\8aÑ\91Ñ\81Ñ\8bз Ð²Ð°Ñ\82Ñ\81ан Ñ\83г Ð»Ñ\8dзиÑ\81Ñ\8cкÑ\8b.",
+       "copyuploaddisabled": "ФайлÑ\8aÑ\91Ñ\81Ñ\8bз Ð²Ð°Ñ\82Ñ\81ан URL Ð¿Ñ\8bÑ\80 Ñ\83г Ð»Ñ\8dзиÑ\81Ñ\8cкÑ\8b.",
+       "uploaddisabledtext": "Файл Ð¿Ð¾Ð½Ñ\8bнÑ\8b Ð»Ñ\83онлÑ\8bк Ó§Ð²Ó§Ð».",
        "upload-dialog-button-cancel": "Берытсконо",
        "license-header": "Лицензия",
        "nolicense": "Ӧвӧл",
+       "imgfile": "файл",
        "file-anchor-link": "Файл",
        "filehist": "Файллэн историез",
        "filehist-help": "Зӥбе дата/дыр шоры, кызьы файл со дырын адӟиськемез учкыны вылысь.",
        "filehist-current": "алиез",
        "filehist-datetime": "Дата/дыр",
        "filehist-thumb": "Миниатюра",
+       "filehist-thumbtext": "$1 лэсьтэм версилэн миниатюраез",
        "filehist-user": "Викиавтор",
        "filehist-dimensions": "Быдӟала",
        "filehist-comment": "Валэктон",
        "randompage": "Олокыӵе статья",
        "withoutinterwiki-submit": "Возьматыны",
        "nbytes": "{{PLURAL:$1|$1 байт}}",
+       "nmembers": "$1 {{PLURAL:$1|объект}}",
        "prefixindex-submit": "Возьматыны",
        "newpages": "Выль бамъёс",
        "newpages-submit": "Возьматыны",
        "move": "Нимзэ воштыны",
+       "pager-older-n": "{{PLURAL:$1|вужгес $1}}",
        "booksources": "Книгаосын источникъёс",
+       "booksources-search-legend": "Книга сярысь информациез утчан",
+       "booksources-search": "Утчаны",
        "log": "Журналъёс",
        "logeventslist-submit": "Возьматыны",
        "showhideselectedlogentries": "Возьматыны/ватыны быръем журналъёсысь гожъямъёсыз",
        "checkbox-all": "Ваньзэ",
        "checkbox-none": "Номыре",
        "checkbox-invert": "Воштыны интыен",
+       "allarticles": "Ваньмыз бамъёс",
        "allpagessubmit": "Быдэстоно",
+       "categories": "Категориос",
        "categories-submit": "Возьматыны",
        "sp-deletedcontributions-contribs": "тупатонъёсыз",
        "listusers-submit": "Возьматыны",
-       "listusers-blocked": "(заблокиÑ\80оваÑ\82Ñ\8c{{GENDER:$1||а}})",
-       "listgrouprights": "Ð\9fÑ\80аво Ð³Ñ\80Ñ\83ппае Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "listgrouprights-summary": "Та Ð³Ñ\80Ñ\83ппае Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cÑ\91Ñ\81 Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8bнÑ\8b ÐºÑ\83лÑ\8d Ð²Ð¸ÐºÐ¸ Ñ\81пиÑ\81ок Ñ\83лӥзÑ\8b, Ð¿Ñ\80аво Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89ийгеÑ\81 Ñ\81олÑ\8b Ð²Ð¾Ð·Ñ\8cмаÑ\82оно ÐºÐ°Ñ\80иÑ\81Ñ\8cкиз. Ð\9eло, Ð°Ñ\81 ÐºÐ¾Ð¶Ð°Ð·Ñ\8b Ð²Ð°Ñ\82Ñ\81аÑ\81а Ð¸Ð²Ð¾Ñ\80Ñ\82одÑ\8dÑ\82 Ñ\83лÑ\8bнÑ\8b Ñ\8dÑ\80икÑ\80адÑ\8dз Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81ь.",
-       "listgrouprights-members": "(список пыриськисьёс)",
+       "listusers-blocked": "(блокиÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн)",
+       "listgrouprights": "Ð\92икиавÑ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8dн Ð³Ñ\80Ñ\83ппаоÑ\81Ñ\81Ñ\8bлÑ\8dн Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b",
+       "listgrouprights-summary": "Улӥ Ñ\81пиÑ\81ок Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8dн Ñ\82а Ð²Ð¸ÐºÐ¸Ñ\8bн ÐºÑ\8bлдÑ\8bÑ\82Ñ\8dм Ð³Ñ\80Ñ\83ппаоÑ\81Ñ\81Ñ\8bлÑ\8b, Ñ\81ооÑ\81Ñ\8bн Ð³ÐµÑ\80Ó\9fаÑ\81Ñ\8cкем Ð»Ñ\8dзÑ\91н Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b ÓµÐ¾Ñ\88ен.\nÐ\9dимаз Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c, Ð¾Ð»Ð¾, [[{{MediaWiki:Listgrouprights-helppage}}|Ñ\8dÑ\88Ñ\88о Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f]] Ð²Ð°Ð½ь.",
+       "listgrouprights-members": "(викиавторъёсызлэн списоксы)",
        "emailuser": "Викиавторлы гожтэт",
        "emailmessage": "Ивортон:",
        "watchlist": "Чаклан список",
        "watchlist-options": "Чаклан списокез тупатыны",
        "enotif_reset": "Вань бамъёсыз лыдӟем пусйыны",
        "historyaction-submit": "Возьматыны",
-       "deletionlog": "палэнэ журнал",
+       "dellogpage": "Быдтонъёсын журнал",
+       "deletionlog": "быдтонъёсын журнал",
        "rollbacklink": "ӝог берыктыны",
-       "revertpage": "Откат шонертон [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) доры версия [[User:$1|$1]]",
-       "revertpage-nouser": "Откат шонертон (пыриськисьёс ватэм нимъёссы) доры версия {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollbacklinkcount": "$1 {{PLURAL:$1|тупатонэз}} ӝог берыктыны",
+       "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|вераськон]]) викиавторлэн тупатонъёсыз берыктэмын [[User:$1|$1]] викиавторлэн версиезозь",
+       "revertpage-nouser": "Ватэм викиавторлэн тупатонъёсыз берыктэмын {{GENDER:$1|[[User:$1|$1]] викиавторлэн}} версиезозь",
+       "protectlogpage": "Утёнъёсын журнал",
        "restriction-edit": "Тупатон",
-       "undeletehistory": "Ð\92Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c ÐºÐµ Ñ\82он Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8d, Ð²Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fз Ð»Ñ\83Ñ\8dм Ð²Ð¾Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cконÑ\8aÑ\91Ñ\81 Ð²Ð°Ð½Ñ\8c.\nÐ\91Ó§Ñ\80Ñ\8bÑ\81Ñ\8c ÐºÑ\8bлдӥзÑ\8b Ð²Ñ\8bлÑ\8c Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81 Ð¿Ð°Ð»Ñ\8dнÑ\8d ÐºÐ¾Ñ\88коно Ð»Ñ\83Ñ\8d ÐºÐµ, Ñ\81Ñ\8bӵе Ð¸Ðº Ð½Ð¸Ð¼Ñ\8bз, Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fз Ð²Ð¾Ñ\88Ñ\8aÑ\8fÑ\81Ñ\8cконÑ\8aÑ\91Ñ\81 Ð¿Ñ\80едÑ\88еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ий Ð²Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c ÐºÑ\8bлдозÑ\8b.",
-       "undeletehistorynoadmin": "СÑ\82аÑ\82Ñ\8cÑ\8fоÑ\81 Ð¿Ð°Ð»Ñ\8dнÑ\82Ñ\8dмÑ\8bн Ð²Ð°Ð». Ð\9cÑ\83гез Ð½Ð¾ Ð¿Ð°Ð»Ñ\8dнÑ\8d Ñ\81пиÑ\81ок Ð¿Ñ\8bÑ\80идÑ\8b, Ñ\81о Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fе Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c-озÑ\8c Ð¿Ð°Ð»Ñ\8dнÑ\8dгеÑ\81, Ð·Ó§Ðº Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8d. Ð¢ÐµÐºÑ\81Ñ\82 Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fез Ñ\83даленнÑ\8bй Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð³Ð¸Ð½Ñ\8d Ñ\83Ñ\87кÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82од.",
+       "undeletehistory": "Ð\91амез Ð±ÐµÑ\80ен Ñ\81Ñ\91Ñ\82одÑ\8b ÐºÐµ, Ñ\81ое Ð²Ð¾Ñ\88Ñ\82онÑ\8aÑ\91Ñ\81лÑ\8dн Ð¸Ñ\81Ñ\82оÑ\80изÑ\8b Ð±ÐµÑ\80Ñ\8bÑ\82Ñ\81коз Ð½Ð¾.\nÐ\91Ñ\8bдÑ\82он Ð±ÐµÑ\80е Ñ\82аӵе Ð¸Ðº Ð½Ð¸Ð¼ÐµÐ½ Ð²Ñ\8bлÑ\8c Ð±Ð°Ð¼ ÐºÑ\8bлдÑ\8bÑ\82Ñ\8dмÑ\8bн Ð²Ð°Ð» ÐºÐµ, Ð±ÐµÑ\80ен Ñ\81Ñ\91Ñ\82Ñ\8dм Ð²ÐµÑ\80Ñ\81иоÑ\81 Ð°Ð´Ó\9fиÑ\81Ñ\8cкозÑ\8b Ð²Ð¾Ñ\88Ñ\82онÑ\8aÑ\91Ñ\81лÑ\8dн Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fзÑ\8b Ð²Ñ\8bлÑ\8c Ð²ÐµÑ\80Ñ\81иоÑ\81лÑ\8dÑ\81Ñ\8c Ð°Ð·Ñ\8cло.",
+       "undeletehistorynoadmin": "Та Ð±Ð°Ð¼ Ð±Ñ\8bдÑ\82Ñ\8dмÑ\8bн Ð²Ð°Ð».\nÐ\91Ñ\8bдÑ\82онлÑ\8dн Ð¼Ñ\83гез Ð½Ð¾ Ñ\81пиÑ\81ок Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8b, ÐºÐ¸Ð½Ñ\8aÑ\91Ñ\81 Ñ\82а Ð±Ð°Ð¼ÐµÐ· Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fзÑ\8b Ñ\81ое Ð±Ñ\8bдÑ\82он Ð´Ñ\8bÑ\80озÑ\8c, Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн.\nÐ\91Ñ\8bдÑ\82Ñ\8dм Ð±Ð°Ð¼Ð»Ñ\8dÑ\81Ñ\8c Ñ\82екÑ\81Ñ\82Ñ\81Ñ\8d Ñ\83Ñ\87кÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82о Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð³Ð¸Ð½Ñ\8d.",
        "invert": "Ватыны быръемез",
        "blanknamespace": "(Валтӥсез)",
        "contributions": "{{GENDER:$1|Викиавтор}} гожтэмъёсы",
        "contributions-title": "$1 викиавтор гожтэмъёсы",
        "mycontris": "Гожтэмъёс",
        "anoncontribs": "Гожтэмъёс",
-       "nocontribs": "Критерии нокыӵе воштӥськонъёс та соответствующий шедьтыны уг луы.",
-       "sp-contributions-blocklog": "блокировка",
-       "sp-contributions-deleted": "шонертон палэнтыны {{GENDER:$1|участник|куакеч}}",
-       "sp-contributions-blocked-notice": "Пользователь заблокирован сётӥз та учырлы. Справка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
-       "sp-contributions-blocked-notice-anon": "Со ip-адрес вие заблокировать сётӥзы. Блокировка журналъёсты вайытэк улӥзы берпуметӥ книгаысь:",
+       "contribsub2": "{{GENDER:$3|$1}} гожтэмъёсы ($2)",
+       "nocontribs": "Та критериослы кельшись воштонъёс шедьтэмын ӧвӧл.",
+       "month": "Толэзьысен (вазен но):",
+       "year": "Арысен (вазен но):",
+       "sp-contributions-blocklog": "блокировкаосыз",
+       "sp-contributions-deleted": "{{GENDER:$1|викиавторлэн}} быдтэм тупатонъёсыз",
+       "sp-contributions-userrights": "пыриськисьлэн правоосыныз кивалтон",
+       "sp-contributions-blocked-notice": "Али дыре та викиавтор заблокировать каремын.\nВалэктон понна блокировкаосын журналысь берло гожъям улӥ возьматэмын:",
+       "sp-contributions-blocked-notice-anon": "Али дыре та IP-адрес заблокировать каремын.\nВалэктон понна блокировкаосын журналысь берло гожъям улӥ возьматэмын:",
+       "sp-contributions-submit": "Шедьтыны",
        "whatlinkshere": "Татчы чӧлсконъёс",
        "whatlinkshere-title": "«$1» вылэ чӧлскись бамъёс",
        "whatlinkshere-page": "Бам:",
        "linkshere": "Та бамъёс <strong>[[:$1]]</strong> вылэ чӧлско:",
        "isredirect": "ыстӥсь бам",
        "istemplate": "пыртон",
+       "isimage": "файл линк",
        "whatlinkshere-prev": "{{PLURAL:$1|берлань|$1-лы берлань}}",
        "whatlinkshere-next": "{{PLURAL:$1|азьлань|$1-лы азьлань}}",
        "whatlinkshere-links": "← чӧлсконъёс",
+       "whatlinkshere-hideredirs": "$1 ыстӥсь бамъёсты",
        "whatlinkshere-hidetrans": "$1 пыртонъёсты",
        "whatlinkshere-hidelinks": "$1 чӧлсконъёсты",
        "whatlinkshere-filters": "Фильтръёс",
-       "block": "Блокировка пыриськисьёс",
-       "blockip": "Заблокировать пыриськисьёс",
-       "ipbreason-dropdown": "* Блокировка мугез кабес\n** Полы информациез оскизы\n** Вордскем палэнэ бам\n** Спам-сайтъя педпал чӧлскон\n** Текстлэсь визьем ватсан/жуг-жаг\n** Кышкытлыклэсь, пыриськыны уйиськон\n** Злоупотребление кӧня ке книга учётной\n** Пыриськисьёслэн нимъёссы пыриськисьёс",
-       "ipboptions": "2 час:2 hours,1 нуналлы:1 day,3 нуналлы:3 days,1 арняезлы:1 week,2 арняяз:2 weeks,1 толэзь:1 month,3 толэзь:3 months,6 толэзь:6 months,1 арлэн:1 year,бессрочно:infinite",
-       "unblocked": "$1 разблокировать",
-       "unblocked-id": "Блокировка $1 басьтоно луиз",
-       "blocklist-target": "Ужпумъёс",
+       "block": "Викиавторез заблокировать карыны",
+       "blockip": "{{GENDER:$1|Викиавторез}} заблокировать карыны",
+       "blockip-legend": "Викиавторез блокировка",
+       "blockiptext": "Кутэ та формаез гожтылыны луонлыкез дугдытыны вылысь быръем IP-адресысь яке ог викиавтор ним улсын.\nТае лэсьтыны кулэ вандализмез палэнтон понна гинэ но [[{{MediaWiki:Policy-url}}|правилоосъя]] гинэ.\nУлӥ конкретной мугез гожтэ (кылсярысь, цитировать карыса вандалэн сӧрем куд-ог бамъёсты).\nТӥ быгатӥськоды IP-адресъёслэсь диапазонъёссэс заблокировать карыны [https://ru.wikipedia.org/wiki/Бесклассовая_адресация CIDR]-синтаксис уже кутыса; IPv4 протокол понна самой бадӟым луоно диапазон луэ /$1, но IPv6 протокол понна — /$2.",
+       "ipbreason-dropdown": "*Блокировкаослэн огшоры мугъёссы\n** Ӧрекчась информациез ватсан\n** Бамъёслэсь текстсэс быдтон\n** Спам-чӧлсконъёс педпал сайтъёс вылэ\n** Валантэм/жаг текстэз бамъёсы ватсан\n** Викиавторъёсыз кышкатъян/ултӥяллян\n** Лэзёнтэм ужан трос аккаунтъёсын\n** Викиавторлэн ярантэм нимыз",
+       "ipbsubmit": "Та викиавтор заблокировать карыны",
+       "ipboptions": "2 час:2 hours,1 нунал:1 day,3 нунал:3 days,1 арня:1 week,2 арня:2 weeks,1 толэзь:1 month,3 толэзь:3 months,6 толэзь:6 months,1 ар:1 year,пырак азелы:infinite",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} гожтэмъёсы",
+       "unblocked": "[[User:$1|$1]] разблокировать каремын.",
+       "unblocked-id": "$1 номеро блокировка палэнтэмын вал.",
+       "blocklist-target": "Ужпумез",
        "blocklist-reason": "Мугез",
-       "infiniteblock": "беÑ\81Ñ\81Ñ\80оÑ\87но",
-       "expiringblock": "йÑ\8bлпÑ\83мÑ\8aÑ\8fÑ\81Ñ\8cкиз $1-Ñ\8bÑ\81Ñ\8c $2",
-       "anononlyblock": "аноним гинэ",
-       "noautoblockblock": "disconnect автоблокировка",
-       "createaccountblock": "гожÑ\8aÑ\8fмÑ\8aÑ\91Ñ\81Ñ\82Ñ\8dÑ\81 Ð»Ñ\8dзÑ\8cÑ\8bнÑ\8b ÐºÑ\8bлдÑ\8bÑ\82он Ñ\83Ñ\87Ñ\91Ñ\82ной",
-       "emailblock": "лÑ\8dзÑ\8cÑ\8bмÑ\82Ñ\8d Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82 Ñ\8bÑ\81Ñ\82он",
-       "blocklist-nousertalk": "Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fнÑ\8b Ð°Ñ\87из Ñ\83ггеÑ\81 Ð±Ñ\8bгаÑ\82Ñ\8b Ð±Ð°Ð¼Ð»Ñ\8dн Ð¾Ð±Ñ\81Ñ\83ждениоÑ\81аз",
+       "infiniteblock": "нокÑ\83",
+       "expiringblock": "йÑ\8bлпÑ\83мÑ\8aÑ\8fÑ\81Ñ\8cкоз $1 $2",
+       "anononlyblock": "анонимъёс гинэ",
+       "noautoblockblock": "автоблокировка ӧвӧл",
+       "createaccountblock": "аккаÑ\83нÑ\82Ñ\8aÑ\91Ñ\81Ñ\8bз ÐºÑ\8bлдÑ\8bÑ\82он Ð´Ñ\83гдÑ\8bÑ\82Ñ\8dмÑ\8bн",
+       "emailblock": "гожÑ\82Ñ\8dÑ\82Ñ\8aÑ\91Ñ\81Ñ\8bз Ñ\8bÑ\81Ñ\82Ñ\8bлÑ\8bнÑ\8b Ñ\83г Ð»Ñ\83Ñ\8b",
+       "blocklist-nousertalk": "Ñ\83г Ð±Ñ\8bгаÑ\82Ñ\8b Ð°Ñ\81 Ð²ÐµÑ\80аÑ\81Ñ\8cкон Ð±Ð°Ð¼Ð·Ñ\8d Ð²Ð¾Ñ\88Ñ\8aÑ\8fнÑ\8b",
        "blocklink": "блокировать карыны",
-       "unblocklink": "разблокировать",
+       "unblocklink": "разблокировать карыны",
        "change-blocklink": "блокировка воштыны",
        "contribslink": "тупатонъёсыз",
-       "autoblocker": "Автоблокировка-со понна, мае тӥ IP-адрес кутыны али \"[[User:$1|$1]]\". \nБлокировка мугез $1: \"$2\"",
-       "blocklogentry": "заблокировать [[$1]] дыр $2 $3",
-       "reblock-logentry": "блокировка воштӥз [[$1]] дыр $2 $3",
-       "blocklogtext": "Блокировка но та журналлэн ужезлы разблокирование пользователь.\nЗаблокировать Автоматически IP-адрес уг возьма.\nПроизведениосыз печатласько эстониын [[Special:BlockList|сьӧд списокын]], бан список блокъёс лэсьтыны.",
-       "unblocklogentry": "разблокировать $1",
-       "block-log-flags-anononly": "пользователь гинэ нимтултэм",
-       "block-log-flags-nocreate": "регистрация учётной книгая ужъёсты быдэстон",
-       "block-log-flags-noemail": "лэзьымтэ гожтэт ыстон",
-       "block-log-flags-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
-       "range_block_disabled": "Администратор диапазонэз блокировать али.",
+       "autoblocker": "Автоблокировка, малы ке шуоно «[[User:$1|$1]]» тӥлесьтыд IP-адрестэс алигес уже кутӥз.\n$1 блокировкалэн мугез: «$2»",
+       "blocklogpage": "Блокировкаосын журнал",
+       "blocklogentry": "заблокировать кариз [[$1]] дырлы: $2 $3",
+       "reblock-logentry": "воштӥз блокировкалэсь йылпумъянзэ [[$1]] понна дырлы: $2 $3",
+       "blocklogtext": "Викиавторъёсты блокировкаосын но разблокировкаосын журнал.\nАвтоматически блокировать кариськись IP-адресъёс татын уг адӟытӥсько.\nУчке [[Special:BlockList|списокез али кутӥськись блокировкаослы]].",
+       "unblocklogentry": "разблокировать кариз $1",
+       "block-log-flags-anononly": "аноним викиавторъёс гинэ",
+       "block-log-flags-nocreate": "аккаунтъёсыз кылдытон дугдытэмын",
+       "block-log-flags-noemail": "гожтэтъёсыз ыстылыны уг луы",
+       "block-log-flags-nousertalk": "уг быгаты ас вераськон бамзэ вошъяны",
+       "range_block_disabled": "Администраторъёслэн диапазонъёсыз блокировать карыны луонлыксы дугдытэмын.",
        "move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
+       "movelogpage": "Нимъёсты воштонъёсын журнал",
        "export": "Бамъёсты поттон",
        "allmessagesname": "Ивортон",
        "allmessages-filter-all": "Ваньзэ",
        "tooltip-ca-addsection": "Выль люкет кылдытоно",
        "tooltip-ca-viewsource": "Та бам воштонъёслэсь утемын.\nТӥ быгатӥськоды инъет текстсэ учкыны но кӧчырыны",
        "tooltip-ca-history": "Бамлэн воштонъёсыныз журнал",
+       "tooltip-ca-move": "Та бамлэсь нимзэ воштыны",
        "tooltip-ca-watch": "Та бамез чаклан списокады пыртоно",
        "tooltip-search": "Утчано {{SITENAME}}",
        "tooltip-search-go": "Выжоно сыӵе ик нимын баме",
        "tooltip-t-whatlinkshere": "Ваньмыз бамъёс, кудъёсаз та бамлы линксы вань",
        "tooltip-t-recentchangeslinked": "Выль тупатонъёс бамъёсын, кудъёссэ та бам чӧлске",
        "tooltip-feed-atom": "Та бамлэн Atom-е трансляциез",
+       "tooltip-t-contributions": "{{GENDER:$1|Та викиавторен}} тупатэм бамъёслы список",
        "tooltip-t-upload": "Файл поныны",
        "tooltip-t-specialpages": "Специальной бамъёслэн списоксы",
        "tooltip-t-print": "Та бамысь печатламон версия",
        "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": "Категорилэн бамез",
        "tooltip-preview": "Воштонъёстэс эскерон. Тауна, бамез гожтонлэсь азьло учкелэ соосыз.",
        "tooltip-diff": "Возьматыны воштонъёсыз, кудъёссэ тӥ текстэ пыртӥды.",
        "tooltip-rollback": "Берло викиавторен лэсьтэм воштонъёсыз одӥг зӥбонэн палэнтыны",
+       "tooltip-undo": "Палэнтыны та тупатонэз но возьматыны воштон эскерымон бамез, кытын палэнтонлэсь мугзэ гожтыны луоз.",
        "tooltip-summary": "Воштонъёсты сярысь вакчияк гожтэлэ",
        "simpleantispam-label": "Анти-спам эскерон.\n<strong>Эн</strong> гожтэ татчы!",
        "pageinfo-header-edits": "Воштонъёслэн историзы",
        "pageinfo-toolboxlink": "Бам сярысь тодэтъёс",
+       "previousdiff": "← Вужгес тупатон",
+       "nextdiff": "Выльгес тупатон →",
        "file-info-size": "$1 × $2 пиксель, файллэн быдӟалаез: $3, MIME-тип: $4",
        "file-nohires": "Бадӟымгес быдӟалаен суред ӧвӧл.",
+       "svg-long-desc": "SVG файл, номинально $1 × $2 пиксель, файллэн быдӟалаез: $3",
        "show-big-image": "Инъет файл",
        "show-big-image-preview": "Быдӟалаез та бамын: $1.",
        "show-big-image-other": "Мукет {{PLURAL:$2|быдӟалаез|быдӟалаосыз}}: $1.",
        "metadata": "Метаданнойёс",
        "metadata-help": "Файл пушкын информация вань на, кудзэ лыдпусо камераос яке сканеръёс файлэз кылдытыку огшоры ватсалляло.\nКылдытон бере файл воштӥськиз ке, куд-огез параметръёс воштэм суредлы ярантэм луыны быгато.",
        "metadata-fields": "Суредысь метаданнойёслэн та списоке пыртэм полеоссы адӟытӥськозы суред бам вылын, метаданнойёслэн таблицазы бинемын дыръя.\nМукет полеоссы ватскозы.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "Ориентация",
        "exif-xresolution": "Горизонтальной разрешение",
        "exif-yresolution": "Вертикальной разрешение",
        "exif-datetime": "Файлэз воштонлэн датаез но дырыз",
+       "exif-make": "Камера лэсьтӥсь",
        "exif-model": "Камералэн моделез",
        "exif-software": "Компьютер программаос",
        "exif-exifversion": "Exif версия",
        "exif-colorspace": "Буёлъёслэн пространствозы",
-       "exif-disclaimer": "Кыл кутыны пумит луон",
+       "exif-datetimeoriginal": "Нырысь дата но дыр",
+       "exif-datetimedigitized": "Цифраослы пӧрмытонлэн датаез но дырыз",
+       "exif-disclaimer": "Кыл кутэмлэсь куштӥськон",
+       "exif-orientation-1": "Огшоры",
        "namespacesall": "ваньзэ",
        "monthsall": "ваньзэ",
-       "confirmrecreate-noreason": "{{GENDER:$1|Участник|Куакеч|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|палэнтыны|палэнтыны}} таиз бере бам, кызьы тон сое редактировать карыны кутскиз. Пожалуйста, подтвердите, мар тон малпаськод та бамез зэм но выльысь кылдозы.",
+       "confirmrecreate-noreason": "Тӥ та бам тупатыны кутскиды бере, [[User:$1|$1]] ([[User talk:$1|вер]]) викиавтор сое {{GENDER:$1|быдтӥз}}. Тауна, юнматэ, та бамез выльысь кылдытэмды зэм но потэ шуыса.",
        "confirm-watch-top": "Та бамез чаклан списокады пыртоно?",
        "autosumm-new": "Выль бам: «$1»",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|вераськон]])",
        "version": "Версия",
        "specialpages": "Ваньмыз панельёс",
-       "specialpages-group-login": "ТÑ\83Ñ\81бÑ\83Ñ\8fÑ\81Ñ\8cкÑ\8bнÑ\8b / Ð\93ожÑ\82Ó¥Ñ\81Ñ\8cконо",
-       "specialpages-group-users": "Ð\9fÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8dÑ\81 Ð½Ð¾",
+       "specialpages-group-login": "СиÑ\81Ñ\82емае Ð¿Ñ\8bÑ\80он / Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f",
+       "specialpages-group-users": "Ð\92икиавÑ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð½Ð¾ Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b",
        "tag-filter": "[[Special:Tags|Тэгъёсыз]] фильтр:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
        "tags-title": "Меткаос",
-       "logentry-delete-delete": "$1 {{GENDER:$2|палэнтыны|палэнтыны}} бам $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|выльысь}} бам $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|быдтӥз}} $3 бамез",
+       "logentry-delete-restore": "$1 {{GENDER:$2|берен сётӥз}} $3 бамез",
+       "logentry-block-block": "$1 {{GENDER:$2|заблокировать кариз}} {{GENDER:$4|$3}} дырлы: $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|воштӥз}} блокировкалэсь йылпумъянзэ {{GENDER:$4|$3}} понна дырлы: $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|заблокировать кариз}} {{GENDER:$4|$3}} дырлы: $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|воштӥз}} блокировкалэсь йылпумъянзэ {{GENDER:$4|$3}} понна дырлы: $5 $6",
+       "logentry-move-move": "$1 $3 бамлы $4 выль ним {{GENDER:$2|сётӥз}}",
        "logentry-newusers-create": "$1 нимо учётной запись {{GENDER:$2|кылдытэмын}} вал",
+       "logentry-upload-upload": "$1 {{GENDER:$2|понӥз}} $3",
        "searchsuggest-search": "Утчано {{SITENAME}}",
        "searchsuggest-containing": "кудъёсаз вань...",
-       "api-error-autoblocked": "Тон IP-адрес заблокировать эрказ луи, малы ке шуоно со заблокировать пользователь кутыны луоз.",
-       "api-error-blocked": "Редактирование заблокировать вал тӥлесьтыд.",
        "expand_templates_preview": "Эскерон",
        "log-action-filter-all": "Ваньзэ"
 }
index 12a2ae4..a976001 100644 (file)
        "searcharticle": "Перейти",
        "history": "Історія сторінки",
        "history_short": "Історія",
+       "history_small": "історія",
        "updatedmarker": "оновлено після мого останнього перегляду",
        "printableversion": "Версія до друку",
        "permalink": "Постійне посилання",
        "talk": "Обговорення",
        "views": "Перегляди",
        "toolbox": "Інструменти",
-       "tool-link-userrights": "Змінити групи {{GENDER:$1|користувачів}}",
-       "tool-link-emailuser": "Надіслати електронного листа {{GENDER:$1|цьому користувачеві|цій користувачці}}",
+       "tool-link-userrights": "Змінити групи {{GENDER:$1|користувача|користувачки}}",
+       "tool-link-userrights-readonly": "Перегляд груп {{GENDER:$1|користувача|користувачки}}",
+       "tool-link-emailuser": "Лист {{GENDER:$1|користувачеві|користувачці}}",
        "userpage": "Переглянути сторінку користувача",
        "projectpage": "Переглянути сторінку проекту",
        "imagepage": "Переглянути сторінку файлу",
        "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|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший або ви згадали свій старий пароль і не бажаєте його змінювати, можете ігнорувати це повідомлення та продовжувати використовувати старий пароль.",
        "passwordreset-emailelement": "Ім'я користувача: \n$1\n\nТимчасовий пароль: \n$2",
        "passwordreset-emailsentemail": "Якщо ця електронна адреса асоційована з вашим обліковим записом, то лист для відновлення пароля буде відправлено на неї.",
        "passwordreset-emailsentusername": "Якщо існує електронна адреса, яка асоційована з цим обліковим записом, на неї буде надіслано лист для відновлення пароля.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Електронний лист|Електронні листи}} скидання паролю було надіслано. {{PLURAL:$1|Ім'я користувача і пароль|Список імен користувачів і паролів}} показано тут.",
-       "passwordreset-emailerror-capture2": "Не вдалося надіслати листа {{GENDER:$2|користувачу|користувачці}}: $1 {{PLURAL:$3|Ім'я користувача і пароль|список імен користувачів і паролів}} показано тут.",
        "passwordreset-nocaller": "Має бути надане джерело виклику",
        "passwordreset-nosuchcaller": "Джерело виклику не існує: $1",
        "passwordreset-ignored": "Скидання пароля не відбулося. Можливо, не було налашатовано надавача?",
        "blockedtitle": "Користувача заблоковано",
        "blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із заблокованих користувачів. Адміністратор ($1), що її заблокував, зазначив наступну причину блокування:\n\n:''$2''\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністраторові, якщо ви не зареєстровані у проекті або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте його у своїх запитах.",
+       "systemblockedtext": "Ваше ім'я користувача або IP-адресу було автоматично заблоковано MediaWiki.\nВказана причина:\n\n:<em>$2</em>\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.",
        "blockednoreason": "не вказано причини",
        "whitelistedittext": "Ви повинні $1, щоб редагувати сторінки.",
        "confirmedittext": "Ви повинні підтвердити вашу адресу електронної пошти перед редагуванням сторінок.\nБудь-ласка вкажіть і підтвердіть вашу електронну адресу на [[Special:Preferences|сторінці налаштувань]].",
        "revdelete-hide-image": "Приховати вміст файлу",
        "revdelete-hide-name": "Приховати цілі та параметри",
        "revdelete-hide-comment": "Коментар редагування",
-       "revdelete-hide-user": "Ім'я автора/IP адреса",
+       "revdelete-hide-user": "Ім'я редактора/IP-адреса",
        "revdelete-hide-restricted": "Приховати дані також і від адміністраторів",
        "revdelete-radio-same": "(не змінювати)",
        "revdelete-radio-set": "Приховано",
        "search-interwiki-caption": "Братні проекти",
        "search-interwiki-default": "Результати із $1:",
        "search-interwiki-more": "(більше)",
+       "search-interwiki-more-results": "більше результатів",
        "search-relatedarticle": "Пов'язаний",
        "searchrelated": "пов'язаний",
        "searchall": "усі",
        "search-external": "Зовнішній пошук",
        "searchdisabled": "<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>",
        "search-error": "Сталася помилка під час пошуку:$1",
+       "search-warning": "Попередження виникло під час пошуку: $1",
        "preferences": "Налаштування",
        "mypreferences": "Налаштування",
        "prefs-edits": "Кількість редагувань:",
        "saveprefs": "Зберегти",
        "restoreprefs": "Відновити всі стандартні налаштування (у всіх розділах)",
        "prefs-editing": "Редагування",
-       "rows": "Рядків:",
-       "columns": "Стовпців:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Поріг для визначення оформлення посилань на стаби ($1):",
        "stub-threshold-sample-link": "зразок",
        "prefs-help-recentchangescount": "Це стосується нових редагувань, історій сторінок і журналів.",
        "prefs-help-watchlist-token2": "Це секретний ключ до веб-каналу вашого списку спостереження.\nБудь-хто, хто його знає, матиме можливість читати ваш список спостереження, тому не поширюйте його.\n[[Special:ResetTokens|Натисніть тут, якщо вам потрібно скинути його]].",
        "savedprefs": "Ваші налаштування збережено.",
-       "savedrights": "Ð\9fÑ\80ава ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а {{GENDER:$1|$1}} Ð±Ñ\83ли Ð·Ð±ÐµÑ\80еженÑ\96.",
+       "savedrights": "Ð\93Ñ\80Ñ\83пи {{GENDER:$1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87а $1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87ки $1}} Ð±Ñ\83ло Ð·Ð±ÐµÑ\80ежено.",
        "timezonelegend": "Часовий пояс:",
        "localtime": "Місцевий час:",
        "timezoneuseserverdefault": "Використовувати стандартне налаштування вікі ($1)",
        "username": "{{GENDER:$1|Ім'я користувача|Ім'я користувачки}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} {{PLURAL:$1|1=групи|груп}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (до $2)",
        "prefs-registration": "Час реєстрації:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Справжнє ім'я:",
        "prefswarning-warning": "Ви внесли в свої налаштування зміни, які ще не були збережені.\nЯкщо ви залишите цю сторінку, не натиснувши \"$1\", налаштування не будуть оновлені.",
        "prefs-tabs-navigation-hint": "Порада: Ви можете використовувати клавіші стрілок вліво і вправо для переходу між вкладками в списку вкладок.",
        "userrights": "Керування правами користувачів",
-       "userrights-lookup-user": "Ð\9aеÑ\80Ñ\83ваннÑ\8f Ð³Ñ\80Ñ\83пами користувача",
+       "userrights-lookup-user": "Ð\92ибеÑ\80Ñ\96Ñ\82Ñ\8c користувача",
        "userrights-user-editname": "Введіть ім'я користувача:",
-       "editusergroup": "РедагÑ\83ваÑ\82и Ð³Ñ\80Ñ\83пи {{GENDER:$1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в}}",
+       "editusergroup": "Ð\97аванÑ\82ажиÑ\82и Ð³Ñ\80Ñ\83пи ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в",
        "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-nologin": "Ви повинні [[Special:UserLogin|ввійти до системи]] з обліковим записом адміністратора, щоб призначати права користувачам.",
-       "userrights-notallowed": "У вас не має дозволів на додавання або зміну прав користувачів.",
        "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": "Конфлікт зміни прав користувача! Будь ласка, перевірте та  підтвердіть зміни знову.",
-       "userrights-removed-self": "Ви позбавили себе власних прав. Через це Ви більше не маєте доступу до цієї сторінки.",
        "group": "Група:",
        "group-user": "Користувачі",
        "group-autoconfirmed": "Автопідтверджені користувачі",
        "right-siteadmin": "Блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
-       "right-passwordreset": "Перегляд повідомлень електронної пошти для зміни паролю",
        "right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
        "right-applychangetags": "додавання [[Special:Tags|міток]] разом зі змінами",
        "right-changetags": "додавання або вилучення будь-яких [[Special:Tags|міток]] для певних версій сторінок або записів журналів",
        "action-upload_by_url": "завантаження цього файлу з адреси URL",
        "action-writeapi": "використання API для редагувань",
        "action-delete": "вилучення цієї сторінки",
-       "action-deleterevision": "вилучення цієї версії сторінки",
-       "action-deletedhistory": "перегляд вилученої історії редагувань цієї сторінки",
+       "action-deleterevision": "вилучення версій",
+       "action-deletelogentry": "вилучення записів журналу",
+       "action-deletedhistory": "перегляд вилученої історії редагувань сторінки",
+       "action-deletedtext": "перегляд тексту вилученої версії",
        "action-browsearchive": "пошук вилучених сторінок",
-       "action-undelete": "вÑ\96дновленнÑ\8f Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки",
-       "action-suppressrevision": "перегляд і відновлення цієї прихованої версії",
+       "action-undelete": "вÑ\96дновленнÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок",
+       "action-suppressrevision": "перегляд і відновлення прихованих версій",
        "action-suppressionlog": "перегляд цього приватного журналу",
        "action-block": "блокування цього дописувача",
        "action-protect": "зміну рівня захисту цієї сторінки",
        "action-userrights-interwiki": "зміну прав користувачів у інших вікі",
        "action-siteadmin": "блокування і розблоковування баз даних",
        "action-sendemail": "відправка електронної пошти",
+       "action-editmyoptions": "редагування власних налаштувань",
        "action-editmywatchlist": "редагування Вашого списку спостереження",
        "action-viewmywatchlist": "перегляд власного списку спостереження",
        "action-viewmyprivateinfo": "перегляд своєї приватної інформації",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (див. також [[Special:NewPages|список нових сторінок]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показати",
+       "rcfilters-activefilters": "Активні фільтри",
+       "rcfilters-restore-default-filters": "Відновити стандартні фільтри",
+       "rcfilters-clear-all-filters": "Очистити фільтри",
+       "rcfilters-search-placeholder": "Фільтруйте нові редагування (переглядайте або почніть вводити)",
+       "rcfilters-invalid-filter": "Недійсний фільтр",
+       "rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
+       "rcfilters-filterlist-title": "Фільтри",
+       "rcfilters-filterlist-noresults": "Фільтри не знайдено",
+       "rcfilters-filtergroup-registration": "Реєстрація користувача",
+       "rcfilters-filter-registered-label": "Зареєстровані",
+       "rcfilters-filter-registered-description": "Користувачі, що увійшли в систему.",
+       "rcfilters-filter-unregistered-label": "Незареєстровані",
+       "rcfilters-filter-unregistered-description": "Користувачі, які не ввійшли в систему.",
+       "rcfilters-filtergroup-authorship": "Авторство редагувань",
+       "rcfilters-filter-editsbyself-label": "Ваші власні редагування",
+       "rcfilters-filter-editsbyself-description": "Редагування, зроблені Вами.",
+       "rcfilters-filter-editsbyother-label": "Редагування, зроблені іншими",
+       "rcfilters-filter-editsbyother-description": "Редагування, виконані іншими користувачами (не Вами).",
+       "rcfilters-filtergroup-userExpLevel": "Рівень досвіду (тільки для зареєстрованих користувачів)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новачки",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Менше ніж 10 редагувань і 4 дні активності.",
+       "rcfilters-filter-userExpLevel-learner-label": "Учні",
+       "rcfilters-filter-userExpLevel-learner-description": "Більше днів активності та більше редагувань, ніж у «новачків», але менше, ніж у «досвідчених користувачів».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Досвідчені користувачі",
+       "rcfilters-filter-userExpLevel-experienced-description": "Більше 30 днів активності і понад 500 редагувань.",
+       "rcfilters-filtergroup-automated": "Автоматизовані редагування",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-bots-description": "Редагування, зроблені з допомогою автоматизованих засобів.",
+       "rcfilters-filter-humans-label": "Людина (не бот)",
+       "rcfilters-filter-humans-description": "Редагування, зроблені людиною.",
+       "rcfilters-filtergroup-significance": "Важливість",
+       "rcfilters-filter-minor-label": "Незначні редагування",
+       "rcfilters-filter-minor-description": "Редагування, позначені авторами як незначні.",
+       "rcfilters-filter-major-label": "Звичайні редагування",
+       "rcfilters-filter-major-description": "Редагування, не позначені як незначні.",
+       "rcfilters-filtergroup-changetype": "Вид зміни",
+       "rcfilters-filter-pageedits-label": "Редагування сторінок",
+       "rcfilters-filter-pageedits-description": "Редагування вікі-вмісту, обговорень, опису категорій тощо.",
+       "rcfilters-filter-newpages-label": "Створення сторінок",
+       "rcfilters-filter-newpages-description": "Редагування, якими створено нові сторінки.",
+       "rcfilters-filter-categorization-label": "Зміна категорій",
+       "rcfilters-filter-categorization-description": "Записи про додавання або вилучення сторінок з категорій.",
+       "rcfilters-filter-logactions-label": "Журнальні дії",
+       "rcfilters-filter-logactions-description": "Адміністративні дії, створення облікових записів, видалення сторінок, завантаження файлів тощо.",
        "rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "rcshowhideminor": "$1 незначні редагування",
        "uploaded-setting-handler-svg": "SVG, який встановлює атрибут «handler» з віддаленою адресою/даними/сценарієм, заблоковано. У завантаженому SVG-файлі знайдено <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, який встановлює будь-який атрибут з віддаленим URL, заблоковано. У завантаженому SVG-файлі знайдено <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "У завантаженому SVG-файлі знайдено фільтр зображення з URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Цей SVG-файл містить недопустимий простір назв «$1».",
+       "uploadscriptednamespace": "Цей SVG-файл містить недопустимий простір назв «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "Не вдалося проаналізувати XML у завантаженому файлі.",
        "uploadvirus": "Файл містить вірус! Див. $1",
        "uploadjava": "Файл є ZIP-архівом, що містить .class-файл Java.\nЗавантаження Java-файлів не дозволене, бо вони можуть використовуватися для обходу системи безпеки.",
        "uncategorizedcategories": "Некатегоризовані категорії",
        "uncategorizedimages": "Некатегоризовані зображення",
        "uncategorizedtemplates": "Некатегоризовані шаблони",
+       "uncategorized-categories-exceptionlist": " # Містить список категорій, які не мають згадуватись на сторінці Special:UncategorizedCategories. Одна категорія на рядок, починається з «*». Рядки, що починаються з іншого символу (включно з пробілом) ігноруються. Використовуйте «#» для коментарів.",
        "unusedcategories": "Категорії, що не використовуються",
        "unusedimages": "Файли, що не використовуються",
        "wantedcategories": "Необхідні категорії",
        "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 мс}}",
        "apisandbox-results-fixtoken": "Виправте токен і надішліть ще раз",
        "apisandbox-results-fixtoken-fail": "Не вдалося викликати токен «$1».",
        "apisandbox-continue-clear": "Очистити",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries продовжить] останній запит; {{int:apisandbox-continue-clear}} очистить параметри, пов'язані з продовженням.",
        "apisandbox-param-limit": "Введіть <kbd>max</kbd>, щоб використати максимальний ліміт.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Усі простори назв)",
+       "apisandbox-multivalue-all-values": "$1 (Усі значення)",
        "booksources": "Джерела книг",
        "booksources-search-legend": "Пошук інформації про книгу",
        "booksources-isbn": "ISBN:",
        "activeusers-count": "$1 {{PLURAL:$1|дія|дії|дій}} за {{PLURAL:$3|останній $3 день|останні $3 дні|останні $3 днів}}",
        "activeusers-from": "Показувати користувачів, починаючи з:",
        "activeusers-groups": "Показувати користувачів, належних до груп:",
+       "activeusers-excludegroups": "Виключити користувачів, що належать до груп:",
        "activeusers-noresult": "Не знайдено користувачів.",
        "activeusers-submit": "Показати активних користувачів",
        "listgrouprights": "Права груп користувачів",
        "emailccsubject": "Копія вашого повідомлення до $1: $2",
        "emailsent": "Електронне повідомлення надіслано",
        "emailsenttext": "Ваше електронне повідомлення надіслано.",
-       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}.",
+       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}. Якщо Ви відповісте на цей лист, Ваш електронний лист буде надіслано безпосередньо до {{GENDER:$1|початковго відправника|початкової відправниці}}, відкривши {{GENDER:$1|йому|їй}} {{GENDER:$2|Вашу}} електронну адресу.",
        "usermessage-summary": "Залишити системне повідомлення.",
        "usermessage-editor": "Системний вісник",
        "usermessage-template": "MediaWiki:UserMessage",
        "changecontentmodel-emptymodels-title": "Немає доступних моделей коментарів",
        "changecontentmodel-emptymodels-text": "Вміст сторінки [[:$1]] не може бути перетворений до будь якого типу.",
        "log-name-contentmodel": "Журнал змін моделі вмісту",
-       "log-description-contentmodel": "Ð\9fодÑ\96Ñ\97, Ð¿Ð¾Ð²'Ñ\8fзанÑ\96 Ð· Ð¼Ð¾Ð´ÐµÐ»Ñ\8fми Ð²Ð¼Ñ\96Ñ\81Ñ\82Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нки",
+       "log-description-contentmodel": "Ð\9dа Ñ\86Ñ\96й Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 Ð¿ÐµÑ\80елÑ\96Ñ\87енÑ\96 Ð·Ð¼Ñ\96ни Ð´Ð¾ ÐºÐ¾Ð½Ñ\82енÑ\82ниÑ\85 Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Ñ\81Ñ\82оÑ\80Ñ\96нок, Ð° Ñ\82акож Ñ\81Ñ\82оÑ\80Ñ\96нки, Ñ\81Ñ\82воÑ\80енÑ\96 Ð· Ð½ÐµÑ\81Ñ\82андаÑ\80Ñ\82ноÑ\8e ÐºÐ¾Ð½Ñ\82енÑ\82ноÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð»Ñ\8e.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|створив|створила}} сторінку $3, використовуючи нестандартну модель вмісту «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|змінив|змінила}} модель вмісту сторінки $3 з «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "відкинути",
        "sorbs": "DNSBL",
        "sorbsreason": "Ваша IP-адреса числиться як відкритий проксі в DNSBL.",
        "sorbs_create_account_reason": "Ваша IP-адреса числиться як відкритий проксі в DNSBL. Ви не можете створити обліковий запис.",
+       "softblockrangesreason": "Анонімний внесок заборонений з Вашої IP-адреси ($1). Будь ласка, увійдіть у систему.",
        "xffblockreason": "IP-адреса в X-Forwarded-For полі заголовка, або ваша, або проксі сервера, що використовується вами, заблокована. Початкова причина блокування була:$1",
        "cant-see-hidden-user": "Користувача, якого ви хочете заблокувати, вже заблоковано та приховано. Оскільки у вас немає прав щодо приховання користувачів, ви не можете переглянути або змінити дане блокування.",
        "ipbblocked": "Ви не можете блокувати чи розблоковувати інших користувачів, оскільки самі заблоковані",
        "cant-move-to-user-page": "У вас нема дозволу перейменовувати сторінки на сторінки простору «Користувач» (окрім підсторінок)",
        "cant-move-category-page": "У вас немає прав перейменовувати сторінки категорій.",
        "cant-move-to-category-page": "У вас немає дозволу перейменовувати сторінку на сторінку категорії.",
+       "cant-move-subpages": "У Вас немає прав на перейменування підсторінок.",
+       "namespace-nosubpages": "Простір назв «$1» не дозволяє використання підсторінок.",
        "newtitle": "Нова назва:",
        "move-watch": "Спостерігати за цією сторінкою",
        "movepagebtn": "Перейменувати сторінку",
        "pageinfo-length": "Довжина сторінки (в байтах)",
        "pageinfo-article-id": "ID сторінки",
        "pageinfo-language": "Мова вмісту сторінки",
+       "pageinfo-language-change": "Змінити",
        "pageinfo-content-model": "Модель вмісту сторінки",
        "pageinfo-content-model-change": "змінити",
        "pageinfo-robot-policy": "Індексація пошуковими системами",
        "timezone-local": "Місцеві",
        "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
        "duplicate-displaytitle": "<strong>Увага:</strong> Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
-       "restricted-displaytitle": "<strong>Увага:</strong> Ð\92Ñ\96добÑ\80ажÑ\83ванÑ\83 Ð½Ð°Ð·Ð²Ñ\83 Â«$1» Ð±Ñ\83ло Ð¿Ñ\80оÑ\96гноÑ\80овано, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ð¾Ð½Ð¾ Ð½Ðµ Ð²Ñ\96дповÑ\96даÑ\94 Ð²Ð»Ð°Ñ\81не назві сторінки.",
+       "restricted-displaytitle": "<strong>Увага:</strong> Ð\92Ñ\96добÑ\80ажÑ\83ванÑ\83 Ð½Ð°Ð·Ð²Ñ\83 Â«$1» Ð±Ñ\83ло Ð¿Ñ\80оÑ\96гноÑ\80овано, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ð¾Ð½Ð° Ð½Ðµ Ð²Ñ\96дповÑ\96даÑ\94 Ñ\87иннÑ\96й назві сторінки.",
        "invalid-indicator-name": "<strong>Помилка:</strong> Сторінка індикатора стану <code>name</code> атрибута не може бути пуста.",
        "version": "Версія MediaWiki",
        "version-extensions": "Установлені розширення",
        "tags": "Чинні мітки змін",
        "tag-filter": "Фільтр&nbsp;[[Special:Tags|міток]]:",
        "tag-filter-submit": "Відфільтрувати",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Мітка|Мітки|Міток}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Мітка|Мітки}}]]: $2)",
        "tag-mw-contentmodelchange": "зміна контентної моделі",
        "tag-mw-contentmodelchange-description": "Редагування, якими була здійснена [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel зміна контентної моделі] сторінки",
        "tags-title": "Мітки",
        "htmlform-user-not-exists": "<strong>$1</strong> не існує.",
        "htmlform-user-not-valid": "<strong>$1</strong> не є дійсним іменем користувача.",
        "logentry-delete-delete": "$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|вилучив|вилучила}} перенаправлення $3 шляхом перезапису",
        "logentry-delete-restore": "$1 {{GENDER:$2|відновив|відновила}} сторінку $3",
        "logentry-delete-event": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 запису журналу|$5 записів журналу}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5|$5 версії|$5 версій}} на сторінці $3: $4",
        "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-useragent": "User Agent:",
        "searchsuggest-search": "Пошук {{GRAMMAR:locative|{{SITENAME}}}}",
        "searchsuggest-containing": "що містять...",
-       "api-error-autoblocked": "Вашу IP-адресу було заблоковано автоматично, тому що її використовував заблокований користувач.",
-       "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
        "api-error-badtoken": "Внутрішня помилка: некоректний токен.",
-       "api-error-blocked": "Можливість редагування для вас заблоковано.",
-       "api-error-copyuploaddisabled": "На цьому сервері вимкнене завантаження за URL-адресою.",
-       "api-error-duplicate": "Уже {{PLURAL:$1|1=існує інший файл|існують інші файли}} з таким самим вмістом.",
-       "api-error-duplicate-archive": "Раніше на сайті вже {{PLURAL:$1|1=був файл|були файли}} з ідентичним вмістом, але {{PLURAL:$1|1=його|їх}} вилучили.",
-       "api-error-empty-file": "Файл, який ви надіслали, порожній.",
        "api-error-emptypage": "Створення нової порожньої сторінки неприпустиме.",
-       "api-error-fetchfileerror": "Внутрішня помилка: щось пішло не так під час отримання файлу.",
-       "api-error-fileexists-forbidden": "Файл з назвою «$1» вже існує і його не можна перезаписати.",
-       "api-error-fileexists-shared-forbidden": "Файл з назвою «$1» вже існує в сховищі спільних файлів, його не можна перезаписати.",
-       "api-error-file-too-large": "Файл, який ви надіслали, завеликий.",
-       "api-error-filename-tooshort": "Назва файлу занадто коротка.",
-       "api-error-filetype-banned": "Цей тип файлів заборонений.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|1=недозволений тип файлів|недозволені типи файлів}}. {{PLURAL:$3|1=Дозволений тип файлів|Дозволені типи файлів}}: $2.",
-       "api-error-filetype-missing": "У цього файла відсутнє розширення.",
-       "api-error-hookaborted": "Зміну, що Ви намагалися зробити, відкинуто обробником.",
-       "api-error-http": "Внутрішня помилка: Не вдається підключитися до сервера.",
-       "api-error-illegal-filename": "Неприпустиме ім'я файлу.",
-       "api-error-internal-error": "Внутрішня помилка: Щось пішло не так під час обробки вашого завантаження на вікі.",
-       "api-error-invalid-file-key": "Внутрішня помилка: Файл не знайдено в тимчасовому сховищі.",
-       "api-error-missingparam": "Внутрішня помилка: Відсутні параметри за запитом.",
-       "api-error-missingresult": "Внутрішня помилка: не вдалося визначити, чи пройшло копіювання вдало.",
-       "api-error-mustbeloggedin": "Ви повинні увійти в систему для завантаження файлів.",
-       "api-error-mustbeposted": "Внутрішня помилка: Запит вимагає HTTP POST.",
-       "api-error-noimageinfo": "Завантаження завершено, але сервер не надав ніякої інформації про файл.",
-       "api-error-nomodule": "Внутрішня помилка: Відсутній модуль завантажень.",
-       "api-error-ok-but-empty": "Внутрішня помилка: сервер не відповідає.",
-       "api-error-overwrite": "Заміну існуючого файлу не дозволено.",
-       "api-error-ratelimited": "Ви намагаєтесь завантажити більше файлів за короткий проміжок часу, ніж дозволено у цій вікі. Будь ласка, спробуйте за декілька хвилин.",
-       "api-error-stashfailed": "Внутрішня помилка: сервер не зміг зберегти тимчасовий файл.",
        "api-error-publishfailed": "Внутрішня помилка: сервер не зміг опублікувати тимчасовий файл.",
-       "api-error-stasherror": "Сталася помилка при завантаженні файлу у сховище.",
-       "api-error-stashedfilenotfound": "Неможливо знайти прихований файл, під час спроби його надсилання зі схованки.",
-       "api-error-stashpathinvalid": "Шлях, за яким повинен знаходитись прихований файл, є хибним.",
-       "api-error-stashfilestorage": "Сталася помилка під час збереження файлу в схованці.",
-       "api-error-stashzerolength": "Сервер не може зберегти файл, тому що він має нульовий розмір.",
-       "api-error-stashnotloggedin": "Ви повинні увійти в систему, аби мати змогу зберігати файли у сховку завантажень.",
-       "api-error-stashwrongowner": "Файл, до якого ви намагалися отримати доступ в схованці, не належить вам.",
-       "api-error-stashnosuchfilekey": "Ключ файлу, до якого Ви намагались отримати доступ у сховку, не існує.",
-       "api-error-timeout": "Сервер не відповідає протягом очікуваного часу.",
-       "api-error-unclassified": "Сталася невідома помилка.",
-       "api-error-unknown-code": "Невідома помилка: «$1»",
-       "api-error-unknown-error": "Внутрішня помилка: щось пішло не так, при спробі завантажити файл.",
-       "api-error-unknown-warning": "Невідоме попередження: $1",
+       "api-error-stashfailed": "Внутрішня помилка: сервер не зміг зберегти тимчасовий файл.",
+       "api-error-unknown-warning": "Невідоме попередження: «$1».",
        "api-error-unknownerror": "Невідома помилка: \"$1\".",
-       "api-error-uploaddisabled": "Завантаження вимкнуто у цій вікі.",
-       "api-error-verification-error": "Цей файл можливо пошкоджено, або він має неправильне розширення.",
-       "api-error-was-deleted": "Файл із цією назвою раніше було завантажено і згодом вилучено.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунди|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|хвилина|хвилини|хвилин}}",
        "duration-hours": "$1 {{PLURAL:$1|година|години|годин}}",
        "pagelang-language": "Мова",
        "pagelang-use-default": "Мова за замовчуванням",
        "pagelang-select-lang": "Оберіть мову",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Відправити",
+       "pagelang-nonexistent-page": "Сторінка $1 не існує.",
+       "pagelang-unchanged-language": "Мова сторінки $1 вже визначена як «$2».",
+       "pagelang-unchanged-language-default": "Мова сторінки $1 вже визначена як стандартна мова вмісту.",
+       "pagelang-db-failed": "База даних не змогла змінити мову сторінки.",
        "right-pagelang": "зміна мови сторінки",
        "action-pagelang": "змінити мову сторінки",
        "log-name-pagelang": "Журнал змін мови",
        "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": "сесій на основі кук",
        "sessionprovider-nocookies": "Куки можуть бути відключені. Переконайтеся, що у Вас включені cookies і почніть знову.",
        "randomrootpage": "Випадкова коренева сторінка",
        "log-action-filter-block": "Тип блокування:",
-       "log-action-filter-contentmodel": "Тип Ð¼Ð¾Ð´Ð¸Ñ\84Ñ\96каÑ\86Ñ\96Ñ\97 contentmodel:",
+       "log-action-filter-contentmodel": "Тип Ð·Ð¼Ñ\96ни ÐºÐ¾Ð½Ñ\82енÑ\82ноÑ\97 Ð¼Ð¾Ð´ÐµÐ»Ñ\96:",
        "log-action-filter-delete": "Тип вилучення:",
        "log-action-filter-import": "Тип імпорту:",
        "log-action-filter-managetags": "Тип дії з управління тегами:",
        "log-action-filter-block-block": "Блокування",
        "log-action-filter-block-reblock": "Зміна блокування",
        "log-action-filter-block-unblock": "Розблокування",
-       "log-action-filter-contentmodel-change": "Зміна Contentmodel",
-       "log-action-filter-contentmodel-new": "СÑ\82воÑ\80еннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нки Ð· Ð½ÐµÑ\81Ñ\82андаÑ\80Ñ\82ноÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð»Ñ\8e Contentmodel",
+       "log-action-filter-contentmodel-change": "Зміна контентної моделі",
+       "log-action-filter-contentmodel-new": "СÑ\82воÑ\80еннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нки Ð· Ð½ÐµÑ\81Ñ\82андаÑ\80Ñ\82ноÑ\8e ÐºÐ¾Ð½Ñ\82енÑ\82ноÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð»Ñ\8e",
        "log-action-filter-delete-delete": "Видалення сторінки",
+       "log-action-filter-delete-delete_redir": "Перезапис перенаправлення",
        "log-action-filter-delete-restore": "Відновлення сторінки",
        "log-action-filter-delete-event": "Вилучення журналу",
        "log-action-filter-delete-revision": "Вилучення версії",
        "usercssispublic": "Будь ласка, зверніть увагу: підсторінки CSS не повинні містити конфіденційних даних, бо їх можуть бачити інші користувачі.",
        "restrictionsfield-badip": "Недійсна IP-адреса або діапазон: $1",
        "restrictionsfield-label": "Дозволені діапазони IP-адрес:",
-       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Помилка: $1",
-       "edit-error-long": "Помилки:\n\n$1"
+       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "версія $1",
+       "pageid": "ID сторінки $1"
 }
index de2ee22..860697d 100644 (file)
@@ -29,7 +29,8 @@
                        "Hindustanilanguage",
                        "امین اکبر",
                        "Jdforrester",
-                       "قیصرانی"
+                       "قیصرانی",
+                       "Junaid Ahmad"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "views": "مشاہدات",
        "toolbox": "آلات",
        "tool-link-userrights": "حلقہ ہائے {{GENDER:$1|صارف}} میں تبدیلی",
+       "tool-link-userrights-readonly": "حلقے{{GENDER:$1|}}دیکھیں",
        "tool-link-emailuser": "اس {{GENDER:$1|صارف}} کو برقی خط لکھیں",
        "userpage": "صارف کا صفحہ دیکھیے",
        "projectpage": "منصوبہ کا صفحہ دیکھیے",
        "passwordreset-emaildisabled": "اس ویکی پر برقی خط کی سہولت غیر فعال ہیں۔",
        "passwordreset-username": "اسمِ صارف:",
        "passwordreset-domain": "ساحہ:",
-       "passwordreset-capture": "برقی خط کی حتمی شکل دیکھیں؟",
-       "passwordreset-capture-help": "اس خانے کو نشان زد کرنے کی صورت میں (عارضی پاس ورڈ کا حامل) برقی خط آپ کو بھی نظر آئے گا اور صارف کو بھی روانہ کیا جائے گا۔",
        "passwordreset-email": "برقی ڈاک پتہ:",
        "passwordreset-emailtitle": "{{SITENAME}} کھاتہ کی تفصیلات",
        "passwordreset-emailelement": "صارف نام:\n$1\n\nعارضی پاس ورڈ: \n$2",
        "passwordreset-emailsentemail": "اگر یہ برقی ڈاک پتا آپ کے کھاتے سے منسلک ہے تو پاس ورڈ کی ترتیب نو کا برقی خط بھیج دیا جائے گا۔",
        "passwordreset-emailsentusername": "اگر کوئی برقی ڈاک پتا آپ کے کھاتے سے منسلک ہے تو پاس ورڈ کی ترتیب نو کا برقی خط بھیج دیا جائے گا۔",
-       "passwordreset-emailsent-capture2": "پاس ورڈ کی ترتیب نو {{PLURAL:$1|کا برقی خط بھیج دیا گیا ہے|کے برقی خطوط بھیج دیے گئے ہیں}}۔ {{PLURAL:$1|صارف نام اور پاس ورڈ|صارف ناموں اور ان کے پاس ورڈ کی فہرست}} یہاں ملاحظہ فرمائیں۔",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|صارف}} کو برقی خط بھیجنے میں ناکامی: $1\n{{PLURAL:$3|صارف نام اور پاس ورڈ|صارف ناموں کی فہرست اور ان کے پاس ورڈ}} یہاں ملاحظہ فرمائیں۔",
        "passwordreset-nocaller": "کالر کا فراہم کیا جانا لازمی ہے",
        "passwordreset-nosuchcaller": "کالر موجود نہیں: $1",
        "passwordreset-ignored": "پاس ورڈ کی ترتیب نو مکمل نہیں ہو سکی۔ شاید کوئی پرووائڈر فراہم نہیں کیا گیا؟",
        "continue-editing": "خانہ ترمیم میں جائیں",
        "previewconflict": "اس نمائش میں خانہ ترمیم کے اوپر موجود متن جس انداز میں ظاہر ہو رہا ہے، محفوظ کرنے کے بعد اسی طرح نظر آئے گا۔",
        "session_fail_preview": "معذرت! نشست کے مواد میں خامی کی وجہ سے آپ کی  ترمیم مکمل نہیں ہو سکی۔\n\nشاید آپ اپنے کھاتے سے خارج ہو گئے ہیں۔ <strong>براہ کرم اس بات کی تصدیق کر لیں کہ آپ داخل ہیں اور دوبارہ کوشش کریں۔</strong> اگر آپ کو پھر بھی مشکل پیش آرہی ہو تو ایک بار [[Special:UserLogout|خارج ہو کر]] واپس داخل ہو جائیں اور اپنے براؤزر کو جانچ لیں کہ آیا وہ اس سائٹ کی کوکیز اخذ کر رہا ہے یا نہیں۔",
+       "session_fail_preview_html": "معاف کیجیے گا!سیشن ڈاٹا کے نقصان کی وجہ سے ہم آپ کی تبدیلی نافذنہیں کرسکتے.\n<em>چونکہ{{SITENAME}}نے نامکملHTMLکوفعال کررکھاہے,اس لئےنمائش کوجاوااسکرپٹ کےحملوں سےحفاظت کےلئےپوشیدہ کردیاگیاہے.</em>\n<strong>اگرتبدیلی کی یہ جدوجہدقانونی ہےتوبرائےمہربانی دوبارہ کوشش کریں.<strong>\nاگراس کےبعدبھی کام نہ کرے تو[[Special:UserLogout|logging out]]لاگ آؤٹ ہوکردوبارہ لاگ ان کیجیے.اورجانچ کیجیے کہ آپ کابراؤزراس سائٹ کےکوکیزکی اجأزت دیتاہےیانہیں.",
        "edit_form_incomplete": "<strong>خانہ ترمیم سے کچھ حصے سرور تک نہیں پہنچ سکے ہیں؛ براہ کرم اپنی ترامیم کو دوبارہ جانچ لیں کہ آیا وہ برقرار ہیں یا نہیں اور دوبارہ کوشش کریں۔</strong>",
        "editing": "آپ \"$1\" میں ترمیم کر رہے ہیں۔",
        "creating": "زیر تخلیق $1",
        "saveprefs": "محفوظ",
        "restoreprefs": "تمام ابتدائی ترتیبات کو بحال کریں",
        "prefs-editing": "ترمیم کاری",
-       "rows": "صفیں:",
-       "columns": "قطاریں:",
        "searchresultshead": "تلاش",
        "stub-threshold": "نامکمل ربط کے فارمیٹ کی حد ($1):",
        "stub-threshold-sample-link": "نمونہ",
        "userrights-reason": "وجہ:",
        "userrights-no-interwiki": "دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.",
        "userrights-nodatabase": "ڈیٹابیس $1 موجود نہیں یا مقامی نہیں۔",
-       "userrights-nologin": "اختیارات تفویض کرنے کے لیے آپ کا کسی منتظم کھاتے سے [[Special:UserLogin|داخل ہونا]] ضروری ہے۔",
-       "userrights-notallowed": "آپ کو  اختیارات تفویض کرنے یا انہیں واپس لینے کی اجازت نہیں ہے۔",
        "userrights-changeable-col": "مجموعات جو آپ تبدیل کرسکتے ہیں",
        "userrights-unchangeable-col": "مجموعات جو آپ تبدیل نہیں کرسکتے",
        "userrights-conflict": "اختیارات کی تبدیلی میں تنازعہ! براہ کرم نظر ثانی کریں اور اپنی تبدیلیوں کی تصدیق کریں۔",
-       "userrights-removed-self": "آپ نے اپنے اختیارات ختم کر لیے ہیں، چنانچہ اب یہ صفحہ آپ کی دسترس سے باہر ہو گیا ہے۔",
        "group": "حلقہ:",
        "group-user": "صارفین",
        "group-autoconfirmed": "خود توثیق شدہ صارفین",
        "right-siteadmin": "ڈیٹابیس کو مقفل یا غیر مقفل کرنا",
        "right-override-export-depth": "پانچویں سطح کی گہرائی تک مربوط صفحات پر مشتمل صفحات کی برآمد",
        "right-sendemail": "دیگر صارفین کو برقی ڈاک بھیجیں",
-       "right-passwordreset": "پاس ورڈ کی ترتیب نو کے حامل برقی خطوط کا معائنہ",
        "right-managechangetags": "[[Special:Tags|ٹیگوں]] کی تخلیق اور (غیر)فعالی",
        "right-applychangetags": "کسی کی تبدیلیوں کے ساتھ [[Special:Tags|ٹیگوں]] کا اطلاق",
        "right-changetags": "انفرادی نسخوں اور نوشتہ کے اندراج پر [[Special:Tags|ٹیگوں]] کا حذف و اضافہ",
        "action-writeapi": "اے پی آئی تحریر کے استعمال کرنے",
        "action-delete": "یہ صفحہ حذف کرنے",
        "action-deleterevision": "یہ نسخہ حذف کرنے",
-       "action-deletedhistory": "اس صفحہ کا حذف شدہ تاریخچہ دیکھنے",
+       "action-deletedhistory": "اس صفحہ کا حذف شدہ تاریخچہ دیکھیں",
        "action-browsearchive": "حذف شدہ صفحات میں تلاش کرنے",
-       "action-undelete": "اس صفحہ کو بحال کرنے",
+       "action-undelete": "یہ صفحہ بحال کرنے",
        "action-suppressrevision": "اس پوشیدہ ترمیم کی نظرثانی اور بحال کرنے",
        "action-suppressionlog": "نجی نوشتہ کے دیکھنے",
        "action-block": "اس صارف پر پابندی لگانے",
        "uploadscripted": "اس فائل میں ایچ ٹی ایم ایل یا اسکرپٹ کوڈ کا استعمال کیا گیا ہے لہذا عین ممکن ہے کہ کوئی ویب براؤزر اس کی غلط تشریح کرے۔",
        "upload-scripted-pi-callback": "ایسی کسی فائل کو اپلوڈ نہیں کیا جا سکتا جس میں ایکس ایم ایل اسٹائل شیٹ پر عمل کرنے کی ہدایت ہو۔",
        "uploaded-hostile-svg": "اپلوڈ کردہ ایس وی جی فائل کے اسٹائل عنصر میں غیر محفوظ سی ایس ایس دریافت ہوئی ہے۔",
-       "uploadscriptednamespace": "اس ایس وی جی فائل میں غیر قانونی نام فضا \"$1\" موجود ہے۔",
+       "uploadscriptednamespace": "اس ایس وی جی فائل میں غیر قانونی نام فضا \"<nowiki>$1</nowiki>\" موجود ہے۔",
        "uploadinvalidxml": "اپلوڈ کردہ فائل میں موجود ایکس ایم ایل کا تجزیہ نہیں کیا جا سکا۔",
        "uploadvirus": "اس فائل میں وائرس موجود ہے!\nتفصیلات: $1",
        "upload-source": "اصل فائل",
        "feedback-useragent": "یوزر ایجنٹ:",
        "searchsuggest-search": "تلاش",
        "searchsuggest-containing": "نتائج...",
-       "api-error-autoblocked": "آپ کے آئی پی پتے پر خودکار طور پر پابندی لگا دی گئی ہے، کیونکہ اسے کسی ممنوع صارف نے استعمال کیا ہے۔",
-       "api-error-badaccess-groups": "آپ کو اس ویکی میں فائلیں اپلوڈ کرنے کی اجازت نہیں ہے۔",
        "api-error-badtoken": "داخلی نقص: غلط ٹوکن۔",
-       "api-error-blocked": "آپ کی ترمیم کاری پر پابندی لگا دی گئی ہے۔",
-       "api-error-copyuploaddisabled": "یوآرایل کے ذریعہ اس سرور پر اپلوڈ کو غیر فعال کر دیا گیا ہے۔",
-       "api-error-duplicate": "یکساں مواد کی حامل {{PLURAL:$1|ایک اور فائل|مزید فائلیں}} ویکی پر موجود {{PLURAL:$1|ہے|ہیں}}۔",
-       "api-error-duplicate-archive": "یکساں مواد کی حامل {{PLURAL:$1|ایک اور فائل|مزید فائلیں}} ویکی پر موجود {{PLURAL:$1|تھی|تھیں}}، لیکن {{PLURAL:$1|اسے|انہیں}} حذف کر دیا گیا۔",
-       "api-error-empty-file": "آپ کی ارسال کردہ فائل خالی تھی۔",
        "api-error-emptypage": "نئے خالی صفحات بنانے کی اجازت نہیں ہے۔",
-       "api-error-fetchfileerror": "داخلی نقص: فائل کو اخذ کرنے کے دوران میں کچھ غلط ہوا ہے۔",
-       "api-error-fileexists-forbidden": "«$1» کے نام سے ایک فائل پہلے سے موجود ہے، اسے تبدیل نہیں کیا جا سکتا۔",
-       "api-error-fileexists-shared-forbidden": "«$1» کے نام سے مشترکہ ذخیرے میں ایک فائل پہلے سے موجود ہے، اسے تبدیل نہیں کیا جا سکتا۔",
-       "api-error-file-too-large": "آپ کی ارسال کردہ فائل بہت بڑی تھی۔",
-       "api-error-filename-tooshort": "فائل کا نام انتہائی مختصر ہے۔",
-       "api-error-filetype-banned": "فائل کی اس قسم پر پابندی عائد ہے۔",
-       "api-error-filetype-banned-type": "$1 نوعیت کی {{PLURAL:$4|فائل|فائلوں}} کی اجازت نہیں۔\nاجازت یافتہ نوعیت کی {{PLURAL:$3|فائل|فائلیں}} $2 {{PLURAL:$3|ہے|ہیں}}۔",
-       "api-error-filetype-missing": "فائل کی توسیع موجود نہیں",
-       "api-error-hookaborted": "آپ نے جو تبدیلی کرنے کی کوشش کی اسے کسی توسیع نے منسوخ کر دیا۔",
-       "api-error-http": "داخلی نقص: سرور سے رابطہ نہیں ہو سکا",
-       "api-error-illegal-filename": "اس نام کی فائل ممنوع ہے۔",
-       "api-error-internal-error": "داخلی نقص: ویکی پر آپ کے اپلوڈ کی انجام دہی کے دوران میں کچھ غلط واقع ہوا۔",
-       "api-error-invalid-file-key": "داخلی نقص: عارضی ذخیرے میں فائل نہیں مل سکی۔",
-       "api-error-missingparam": "داخلی نقص: درخواست میں مفقود متغیرات",
-       "api-error-missingresult": "داخلی نقص: نہیں بتایا جا سکتا کہ نقل و چسپاں کا عمل کامیاب ہوا یا نہیں۔",
-       "api-error-mustbeloggedin": "فائلیں اپلوڈ کرنے کے لیے آپ کا داخل ہونا ضروری ہے۔",
-       "api-error-mustbeposted": "داخلی نقص: یہ درخواست HTTP POST کی متقاضی ہے۔",
-       "api-error-noimageinfo": "اپلوڈ کامیاب رہا لیکن فائل کے متعلق سرور نے ہمیں کسی قسم کی معلومات بہم نہیں پہنچائیں۔",
-       "api-error-nomodule": "داخلی نقص: کسی ماڈیول کو مرتب نہیں کیا گیا۔",
-       "api-error-ok-but-empty": "داخلی نقص: سرور سے کوئی جواب نہیں ملا۔",
-       "api-error-overwrite": "موجودہ فائل کو دوبارہ اپلوڈ کرنے کی اجازت نہیں۔",
-       "api-error-ratelimited": "مختصر وقت میں آپ اس ویکی میں اجازت یافتہ تعداد سے زیادہ فائلوں کو اپلوڈ کرنے کی کوشش کر رہے ہیں۔\nبراہ کرم کچھ منٹ بعد دوبارہ کوشش کریں۔",
-       "api-error-stashfailed": "داخلی نقص: عارضی فائل رکھنے میں سرور کو ناکامی ہوئی۔",
        "api-error-publishfailed": "داخل نقص: عارضی فائل شائع کرنے میں سرور کو ناکامی ہوئی۔",
-       "api-error-stasherror": "نہاں خانے میں فائل کو اپلوڈ کرتے وقت کوئی نقص واقع ہوا۔",
-       "api-error-stashedfilenotfound": "نہاں خانے میں رکھی گئی فائل وہاں سے اپلوڈ کرنے کے دوران نہیں ملی۔",
-       "api-error-stashpathinvalid": "وہ جگہ غلط ہے جہاں پوشیدہ فائل ملنی چاہیے تھی۔",
-       "api-error-stashfilestorage": "نہاں خانے میں فائل کو رکھتے وقت کوئی نقص واقع ہوا۔",
-       "api-error-stashzerolength": "سرور اس فائل کو پوشیدہ نہ کر سکا کیونکہ اس کی لمبائی صفر ہے۔",
-       "api-error-stashnotloggedin": "اپلوڈ کے نہاں خانے میں فائلوں کو محفوظ کرنے کے لیے آپ کا داخل ہونا ضروری ہے۔",
-       "api-error-stashwrongowner": "فائل کی جس کلید کے ذریعہ آپ نہاں خانے میں رسائی کی کوشش کر رہے ہیں وہ آپ کی نہیں ہے۔",
-       "api-error-stashnosuchfilekey": "فائل کی جس کلید کے ذریعہ آپ نہاں خانے میں رسائی کی کوشش کر رہے ہیں وہ موجود نہیں۔",
-       "api-error-timeout": "متوقع مدت کے دوران میں سرور نے کوئی جواب نہیں دیا۔",
-       "api-error-unclassified": "نامعلوم نقص واقع ہوا۔",
-       "api-error-unknown-code": "نامعلوم نقص: \"$1\" ۔",
-       "api-error-unknown-error": "داخلی نقص: آپ کی فائل کو اپلوڈ کرنے کے دوران میں کچھ غلط ہو گیا ہے۔",
+       "api-error-stashfailed": "داخلی نقص: عارضی فائل رکھنے میں سرور کو ناکامی ہوئی۔",
        "api-error-unknown-warning": "نامعلوم انتباہ: \"$1\"",
        "api-error-unknownerror": "نامعلوم نقص: \"$1\"",
-       "api-error-uploaddisabled": "اس ویکی پر اپلوڈ کی سہولت غیر فعال ہے۔",
-       "api-error-verification-error": "شاید فائل خراب ہے یا غلط توسیع کی حامل ہے۔",
-       "api-error-was-deleted": "اس نام کی فائل پہلے اپلوڈ کی گئی تھی اور معاً بعد حذف کر دی گئی۔",
        "duration-seconds": "$1 {{PLURAL:$1|سیکنڈ}}",
        "duration-minutes": "$1 {{PLURAL:$1|منٹ}}",
        "duration-hours": "$1 {{PLURAL:$1|گھنٹہ|گھنٹے}}",
index 9446b05..c72fc02 100644 (file)
        "passwordreset-emaildisabled": "Le funsionalità de posta eletrònega le xe stà disabilità su sta wiki.",
        "passwordreset-username": "Nome utente:",
        "passwordreset-domain": "Dominio",
-       "passwordreset-capture": "Vixuałixare el contenuto del mesajo de posta ełetronega?",
-       "passwordreset-capture-help": "Se se sełesiona sta caxeła, l'indiriso de posta ełetronega (co' ła password tenporanea) ve vegnarà mostrà anca a voialtri oltre che esare invià a 'l utente.",
        "passwordreset-email": "Indiriso de posta ełetronega",
        "passwordreset-emailtitle": "Detaji de l'account so {{SITENAME}}",
        "passwordreset-emailtext-ip": "Cualcheduni (probabilmente ti, co indiriso IP $1) ga richiesto l'invio de na nova password par l'aceso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente asocià|I utenti asociadi}} a sto indiriso de posta ełetronega łi xe:\n\n$2\n\n{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.\n\nSarìa mejo acedare e deçidare na nova password sùito. Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
        "userinvalidcssjstitle": "'''Ocio:'''  No ghe xe nissuna skin con nome \"$1\". Nota che le pagine par i .css e .js personalizà le gà l'iniziale del titolo minuscola, par esenpio {{ns:user}}:Esenpio/vector.css e no {{ns:user}}:Esenpio/Vector.css.",
        "updated": "(Agiornà)",
        "note": "'''Nota:'''",
-       "previewnote": "Sta cua ła xe soło n'anteprima; i canbiamenti a ła pajina NO i xe gnancora stà salvài!",
+       "previewnote": "'''Tiente in mente che sta qua la xe solo n'anteprima.'''\nI to canbiamenti NO i xe gnancora stà salvài!",
        "continue-editing": "Va a l'area de modifega",
        "previewconflict": "Sta anteprima la corisponde al testo ne la casèla de edizion de sora, e la fa védar come vegnarà fora la pagina se te machi \"Salva la pagina\" in sto momento.",
        "session_fail_preview": "No xè stà possibiłe salvar le to modifiche parché i dati de la session i xè andai persi.\nPar piaser, riproa da novo.\nSe no funsiona gnancora, proa a [[Special:UserLogout|scołegarte]] e a cołegarte de novo.'''",
        "saveprefs": "Salva le preferense",
        "restoreprefs": "Ripristina le inpostassion predefinìe",
        "prefs-editing": "Canbiamento",
-       "rows": "Righe:",
-       "columns": "Cołone:",
        "searchresultshead": "Riserca",
        "stub-threshold": "Valor minimo par i <a href=\"#\" class=\"stub\">colegamenti ai stub</a>:",
        "stub-threshold-disabled": "Disativà",
        "userrights-reason": "Motivassion:",
        "userrights-no-interwiki": "No te ghè i parmessi necessari par modificar i diriti dei utenti su altri siti.",
        "userrights-nodatabase": "El database $1 no l'esiste mìa o no l'è un database local.",
-       "userrights-nologin": "Par assegnarghe diriti ai utenti te ghè da [[Special:UserLogin|efetuar l'acesso]] come aministrador.",
-       "userrights-notallowed": "No te ghe i parmesi necesari par xontarghe o cavarghe diriti ai utenti.",
        "userrights-changeable-col": "Grupi che te pol canbiar",
        "userrights-unchangeable-col": "Grupi che no te pol canbiar",
        "userrights-conflict": "Conflito de diriti utente! Aplica de novo le to modifiche.",
        "right-siteadmin": "Bloca e desbloca el database",
        "right-override-export-depth": "Esporta le pàxene, includendo le pàxene ligàe fin a na profondità de 5",
        "right-sendemail": "Mandarghe e-mail a cheialtri utenti",
-       "right-passwordreset": "Vedi i mesaji de rinpostasion de ła password",
        "newuserlogpage": "Novi utenti",
        "newuserlogpagetext": "Sto qua el xè el registro dei novi utenti registrai.",
        "rightslog": "Diriti de i utenti",
        "sp-contributions-search": "Serca contributi",
        "sp-contributions-username": "Indirizo IP o nome utente:",
        "sp-contributions-toponly": "Mostra solo i contributi che i xe l'ultima revision de la pagina",
+       "sp-contributions-newonly": "Fame védar solo le creassion de pagina",
+       "sp-contributions-hideminor": "Scondi i canbiamenti picenini",
        "sp-contributions-submit": "Riserca",
        "whatlinkshere": "Punta qua",
        "whatlinkshere-title": "Pagine che ponta a ''$1''",
        "feedback-thanks-title": "Grassie!",
        "searchsuggest-search": "Serca drento de {{SITENAME}}",
        "searchsuggest-containing": "che contien...",
-       "api-error-badaccess-groups": "Nó te si autorixà a cargar documenti so sta wiki.",
        "api-error-badtoken": "Eror interno: token fałà.",
-       "api-error-copyuploaddisabled": "El cargamento tramite URL el xe dixabiłità so sto server.",
-       "api-error-duplicate": "So'l sito {{PLURAL:$1|ghe xe xà 'n altro documento|ghe xe xà altri documenti}} có 'l steso contegnuo.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Ghe xera 'n altro file|Ghe xera altri file}} xà inte'l sito có 'l steso contegnuo, ma {{PLURAL:$1|el xe sta scansełà|i xe stai scansełai}}.",
-       "api-error-empty-file": "El file sełesionà el gera vodo.",
        "api-error-emptypage": "Ła creasion de nove pàjine vode nó ła xe consentia.",
-       "api-error-fetchfileerror": "Eror interno: ghe xe sta un problema durante el recupero del documento.",
-       "api-error-fileexists-forbidden": "Un file de nome \"$1\" 'l existe xà e nò 'l pol esar sovrascrito.",
-       "api-error-fileexists-shared-forbidden": "Un file de nome \"$1\" 'l existe xà inte'l repository condivixo e nó 'l pol esar sovrascrito.",
-       "api-error-file-too-large": "El file sełesionà el gera masa grando.",
-       "api-error-filename-tooshort": "El nome del file el xe massa curto.",
-       "api-error-filetype-banned": "Sto tipo de file el xe vietà.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nó 'l xe un tipo de file consentio|nó i xe tipi de file consentìi}}. {{PLURAL:$3|El tipo de file consentio el xe|I tipi de file consentìi i xe}} $2.",
-       "api-error-filetype-missing": "Al file ghe manca l'estension.",
-       "api-error-hookaborted": "Ła modifega che te ghe proà a far ła xe sta interota da na estension.",
-       "api-error-http": "Eror interno: inposibiłe conetarse al server.",
-       "api-error-illegal-filename": "El nome del file nó 'l xe parmeso.",
-       "api-error-internal-error": "Eror interno: calcosa xe ndà storo có l'elaborasion del to cargamento so ła wiki.",
-       "api-error-invalid-file-key": "Eror interno: file nó prexente inte ła carteła de i file tenporanei.",
-       "api-error-missingparam": "Eror interno: parametri de ła dimanda mancanti.",
-       "api-error-missingresult": "Eror interno: inposibiłe determinar se ła copia ła xe riusia.",
-       "api-error-mustbeloggedin": "Te ghe da efetuar 'l aceso par cargar i file.",
-       "api-error-mustbeposted": "Eror interno: ła dimanda dimanda HTTP POST.",
-       "api-error-noimageinfo": "El cargamento el xe riusio, ma 'l server nó el ne ga dato gnauna informasion so'l file.",
-       "api-error-nomodule": "Eror interno: nó xe sta inpostà el moduło de cargamento.",
-       "api-error-ok-but-empty": "Eror interno: nisuna risposta dal server.",
-       "api-error-overwrite": "Nó xe parmeso de sorascrìvar un file existente.",
-       "api-error-stashfailed": "Eror interno: el server nó 'l xe riusio a memorixar el documento tenporaneo.",
        "api-error-publishfailed": "Eror interno: el server nó 'l xe riusio a publicar el documento tenporaneo.",
-       "api-error-timeout": "El server nó 'l ga risposto entro el tenpo previsto.",
-       "api-error-unclassified": "Se gà verifegà un eror sconosùo.",
-       "api-error-unknown-code": "Eror sconosùo: \"$1\"",
-       "api-error-unknown-error": "Eror interno: calcosa xe ndà storto có se jera drio proar a cargar el file.",
+       "api-error-stashfailed": "Eror interno: el server nó 'l xe riusio a memorixar el documento tenporaneo.",
        "api-error-unknown-warning": "Avixo sconosùo: \"$1\".",
        "api-error-unknownerror": "Eror sconosùo: \"$1\".",
-       "api-error-uploaddisabled": "El cargamento el xe dixabiłità so sta wiki.",
-       "api-error-verification-error": "Sto file el podaria esar danegià, o 'ver l'estension sbałià.",
        "duration-seconds": "$1 {{PLURAL:$1|secondo|secondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
index 133edc9..ca65ea9 100644 (file)
        "searcharticle": "Xem",
        "history": "Lịch sử trang",
        "history_short": "Lịch sử",
+       "history_small": "lịch sử",
        "updatedmarker": "được cập nhật kể từ lần xem cuối",
        "printableversion": "Bản để in",
        "permalink": "Liên kết thường trực",
        "views": "Các hiển thị",
        "toolbox": "Công cụ",
        "tool-link-userrights": "Thay đổi nhóm {{GENDER:$1}}người dùng",
+       "tool-link-userrights-readonly": "Xem {{GENDER:$1}}nhóm người dùng",
        "tool-link-emailuser": "Gửi thư cho {{GENDER:$1}}người dùng này",
        "userpage": "Xem trang thành viên",
        "projectpage": "Xem trang dự án",
        "botpasswords-label-appid": "Tên bot:",
        "botpasswords-label-create": "Tạo",
        "botpasswords-label-update": "Cập nhật",
-       "botpasswords-label-cancel": "Huỷ bỏ",
+       "botpasswords-label-cancel": "Hủy bỏ",
        "botpasswords-label-delete": "Xoá",
        "botpasswords-label-resetpassword": "Đặt lại mật khẩu",
        "botpasswords-label-grants": "Các quyền có liên quan:",
        "passwordreset-emaildisabled": "Tính năng gửi thư điện tử không được kích hoạt trên wiki này.",
        "passwordreset-username": "Tên người dùng:",
        "passwordreset-domain": "Tên miền:",
-       "passwordreset-capture": "Xem thư điện tử có mật khẩu tạm",
-       "passwordreset-capture-help": "Nếu bạn kiểm hộp này, bạn sẽ xem thư điện tử có mật khẩu tạm lúc khi nó được gửi cho người dùng.",
        "passwordreset-email": "Địa chỉ thư điện tử:",
        "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailelement": "Tên người dùng: \n$1\n\nMật khẩu tạm: \n$2",
        "passwordreset-emailsentemail": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử dùng để tái tạo mật khẩu sẽ được gửi cho bạn.",
        "passwordreset-emailsentusername": "Nếu một địa chỉ thư điện tử đã gắn với tên người dùng này thì một thư điện tử để đặt lại mật khẩu sẽ được gửi đến.",
-       "passwordreset-emailsent-capture2": "Đã gửi {{PLURAL:$1|thư điện tử|các thư điện tử}} để đặt lại mật khẩu. {{PLURAL:$1|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
-       "passwordreset-emailerror-capture2": "Không gửi được thư điện tử đến {{GENDER:$2}}người dùng: $1 {{PLURAL:$3|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
        "passwordreset-nocaller": "Yêu cầu hàm gọi",
        "passwordreset-nosuchcaller": "Hàm gọi không tồn tại: $1",
        "passwordreset-ignored": "Tác vụ đặt lại mật khẩu không được xử lý. Có lẽ trình cung cấp chưa được cấu hình?",
        "blockedtitle": "Thành viên bị cấm",
        "blockedtext": "'''Tên người dùng hoặc địa chỉ IP của bạn đã bị cấm.'''\n\nNgười thực hiện cấm là $1.\nLý do được cung cấp là ''$2''.\n\n* Bắt đầu cấm: $8\n* Kết thúc cấm: $6\n* Mục tiêu cấm: $7\n\nBạn có thể liên hệ với $1 hoặc một [[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.\nBạn không thể sử dụng tính năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn tài khoản]] và bạn không bị khóa chức năng đó.\nĐịa chỉ IP hiện tại của bạn là $3, và mã số cấm là #$5.\nXin hãy ghi kèm tất cả các thông tin trên vào thư yêu cầu của bạn.",
        "autoblockedtext": "Địa chỉ IP của bạn đã bị tự động cấm vì một người nào đó đã sử dụng nó, $1 là thành viên đã thực hiện cấm.\nLý do được cung cấp là:\n\n:''$2''\n\n* Bắt đầu cấm: $8\n* Kết thúc cấm: $6\n* Mục tiêu cấm: $7\n\nBạn có thể liên hệ với $1 hoặc một trong số các\n[[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.\n\nChú ý rằng bạn sẽ không dùng được chức năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn]] và bạn không bị cấm dùng chức năng đó.\n\nĐịa chỉ IP hiện tại của bạn là $3, mã số cấm là $5.\nXin hãy ghi kèm tất cả các chi tiết trên vào thư yêu cầu của bạn.",
+       "systemblockedtext": "Tên người dùng hoặc địa chỉ IP của bạn bị MediaWiki cấm tự động.\nLý do được cung cấp là:\n\n:<em>$2</em>\n\n* Bắt đầu cấm: $8\n* Kết thúc cấm: $6\n* Mục tiêu cấm: $7\n\nĐịa chỉ IP hiện tại của bạn là $3.\nXin vui lòng bao gồm tất cả các chi tiết bên trên khi nào hỏi về tác vụ này.",
        "blockednoreason": "không đưa ra lý do",
        "whitelistedittext": "Bạn phải $1 để sửa trang.",
        "confirmedittext": "Bạn cần phải xác nhận địa chỉ thư điện tử trước khi được sửa đổi trang. Xin hãy đặt và xác nhận địa chỉ thư điện tử của bạn dùng trang [[Special:Preferences|tùy chọn]].",
        "search-interwiki-caption": "Các dự án liên quan",
        "search-interwiki-default": "Kết quả từ $1:",
        "search-interwiki-more": "(thêm)",
+       "search-interwiki-more-results": "thêm kết quả",
        "search-relatedarticle": "Liên quan",
        "searchrelated": "có liên quan",
        "searchall": "tất cả",
        "search-external": "Tìm kiếm từ bên ngoài",
        "searchdisabled": "Chức năng tìm kiếm tại {{SITENAME}} đã bị tắt. Bạn có tìm kiếm bằng Google trong thời gian này. Chú ý rằng các chỉ mục từ {{SITENAME}} của chúng có thể đã lỗi thời.",
        "search-error": "Đã xuất hiện lỗi khi tìm kiếm: $1",
+       "search-warning": "Đã xuất hiện lỗi khi tìm kiếm: $1",
        "preferences": "Tùy chọn",
        "mypreferences": "Tùy chọn",
        "prefs-edits": "Số lần sửa đổi:",
        "saveprefs": "Lưu tùy chọn",
        "restoreprefs": "Mặc định lại toàn bộ tùy chọn (trong tất cả các phần)",
        "prefs-editing": "Sửa đổi",
-       "rows": "Số hàng:",
-       "columns": "Số cột:",
        "searchresultshead": "Tìm kiếm",
        "stub-threshold": "Định dạng liên kết đến sơ khai ($1) cho các trang ngắn hơn:",
        "stub-threshold-sample-link": "ví dụ",
        "prefs-help-recentchangescount": "Số này bao gồm các thay đổi gần đây, lịch sử trang, và nhật trình.",
        "prefs-help-watchlist-token2": "Đây là chìa khóa bí mật cho nguồn cấp dữ liệu danh sách theo dõi của bạn.\nBất cứ ai biết nó sẽ có thể để đọc danh sách theo dõi của bạn, vì vậy đừng chia sẻ nó.\n[[Special:ResetTokens|Nhấn chuột vào đây nếu bạn cần phải thiết lập lại nó]].",
        "savedprefs": "Đã lưu các tùy chọn cá nhân.",
-       "savedrights": "Đã lưu các quyền hạn của người dùng {{GENDER:$1}}$1.",
+       "savedrights": "Đã lưu các nhóm người dùng của {{GENDER:$1}}$1.",
        "timezonelegend": "Múi giờ:",
        "localtime": "Giờ hiện tại:",
        "timezoneuseserverdefault": "Sử dụng giờ mặc định của wiki ($1)",
        "youremail": "Thư điện tử:",
        "username": "{{GENDER:$1}}Tên người dùng:",
        "prefs-memberingroups": "{{GENDER:$2}}Thành viên của {{PLURAL:$1|nhóm|các nhóm}}:",
+       "group-membership-link-with-expiry": "$1 (cho đến $2)",
        "prefs-registration": "Lúc mở tài khoản:",
        "yourrealname": "Tên thật:",
        "yourlanguage": "Ngôn ngữ:",
        "prefswarning-warning": "Bạn chưa lưu những thay đổi tùy chọn đã thực hiện.\nNếu bạn rời khỏi trang này mà không bấm “$1”, các tùy chọn của bạn sẽ không được cập nhật.",
        "prefs-tabs-navigation-hint": "Mẹo: Bạn có thể bấm các phím mũi tên trái phải để luân chuyển qua các thẻ trong danh sách thẻ.",
        "userrights": "Quản lý quyền thành viên",
-       "userrights-lookup-user": "Quản lý nhóm thành viên",
+       "userrights-lookup-user": "Chọn thành viên",
        "userrights-user-editname": "Nhập tên thành viên:",
-       "editusergroup": "Sửa nhóm {{GENDER:$1}}người dùng",
+       "editusergroup": "Tải nhóm người dùng",
        "editinguser": "Thay đổi quyền hạn của người dùng <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Sửa nhóm thành viên",
+       "viewinguserrights": "Xem quyền hạn của người dùng <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Sửa nhóm {{GENDER:$1}}thành viên",
+       "userrights-viewusergroup": "Xem nhóm {{GENDER:$1}}người dùng",
        "saveusergroups": "Lưu nhóm {{GENDER:$1}}người dùng",
        "userrights-groupsmember": "Thuộc nhóm:",
        "userrights-groupsmember-auto": "Ngầm thuộc nhóm:",
-       "userrights-groups-help": "Bạn có thể xếp thành viên này vào nhóm khác:\n* Hộp kiểm được đánh dấu có nghĩa rằng thành viên thuộc về nhóm đó.\n* Hộp không được đánh dấu có nghĩa rằng thành viên không thuộc về nhóm đó.\n* Dấu * có nghĩa là bạn sẽ không thể loại thành viên ra khỏi nhóm một khi bạn đã đưa thành viên vào, hoặc ngược lại.",
+       "userrights-groups-help": "Bạn có thể xếp thành viên này vào nhóm khác:\n* Hộp kiểm được đánh dấu có nghĩa rằng thành viên thuộc về nhóm đó.\n* Hộp không được đánh dấu có nghĩa rằng thành viên không thuộc về nhóm đó.\n* Dấu * có nghĩa là bạn sẽ không thể loại thành viên ra khỏi nhóm một khi bạn đã đưa thành viên vào, hoặc ngược lại.\n* Dấu # có nghĩa là bạn chỉ có thể trì hoãn thời hạn của nhóm này; bạn không thể đẩy sớm thời hạn.",
        "userrights-reason": "Lý do:",
        "userrights-no-interwiki": "Bạn không có quyền thay đổi quyền hạn của thành viên tại các wiki khác.",
        "userrights-nodatabase": "Cơ sở dữ liệu $1 không tồn tại hoặc nằm ở bên ngoài.",
-       "userrights-nologin": "Bạn phải [[Special:UserLogin|đăng nhập]] vào một tài khoản có quyền quản lý để gán quyền cho thành viên.",
-       "userrights-notallowed": "Bạn không có quyền gán hoặc bãi miễn quyền cho thành viên.",
        "userrights-changeable-col": "Những nhóm bạn có thể thay đổi",
        "userrights-unchangeable-col": "Những nhóm bạn không thể thay đổi",
+       "userrights-expiry-current": "Hết hạn $1",
+       "userrights-expiry-none": "Vô hạn",
+       "userrights-expiry": "Thời hạn:",
+       "userrights-expiry-existing": "Thời hạn hiện thời: $3, $2",
+       "userrights-expiry-othertime": "Thời gian khác:",
+       "userrights-expiry-options": "1 ngày:1 day,1 tuần:1 week,1 tháng:1 month,3 tháng:3 months,6 tháng:6 months,1 năm:1 year",
+       "userrights-invalid-expiry": "Thời hạn của nhóm “$1” không hợp lệ.",
+       "userrights-expiry-in-past": "Thời hạn của nhóm “$1” đã xảy ra ở quá khứ.",
+       "userrights-cannot-shorten-expiry": "Bạn không thể đẩy sớm thời hạn của nhóm “$1”. Chỉ có những người dùng có quyền thêm hay xóa nhóm này có thể đẩy sớm thời hạn.",
        "userrights-conflict": "Mâu thuẫn thay đổi sửa nhóm thành viên! Xin vui lòng xem lại và xác nhận các thay đổi của bạn.",
-       "userrights-removed-self": "Bạn đã loại bỏ quyền của chính mình nên không còn truy cập được trang này.",
        "group": "Nhóm:",
        "group-user": "Thành viên thông thường",
        "group-autoconfirmed": "Thành viên tự xác nhận",
        "right-siteadmin": "Khóa và mở khóa cơ sở dữ liệu",
        "right-override-export-depth": "Xuất trang kèm theo các trang được liên kết đến với độ sâu tối đa là 5",
        "right-sendemail": "Gửi thư điện tử cho thành viên khác",
-       "right-passwordreset": "Xem các thư điện tử đặt lại mật khẩu",
        "right-managechangetags": "Tạo và bật/tắt [[Special:Tags|thẻ]]",
        "right-applychangetags": "Áp dụng [[Special:Tags|thẻ]], cùng với những thay đổi của một người",
        "right-changetags": "Thêm và loại bỏ tùy ý các [[Special:Tags|thẻ]] vào các phiên bản riêng và các mục nhật trình",
        "action-upload_by_url": "tải lên tập tin này từ địa chỉ URL",
        "action-writeapi": "dùng API để sửa đổi",
        "action-delete": "xóa trang này",
-       "action-deleterevision": "xóa phiên bản này",
-       "action-deletedhistory": "xem các phiên bản đã bị xóa của trang này",
+       "action-deleterevision": "xóa phiên bản",
+       "action-deletelogentry": "xóa mục nhật trình",
+       "action-deletedhistory": "xem các phiên bản đã bị xóa của trang",
+       "action-deletedtext": "xem văn bản của phiên bản đã xóa",
        "action-browsearchive": "tìm kiếm trang đã bị xóa",
-       "action-undelete": "phục hồi trang này",
-       "action-suppressrevision": "xem và phục hồi phiên bản ẩn này",
+       "action-undelete": "phục hồi trang",
+       "action-suppressrevision": "xem và phục hồi phiên bản ẩn",
        "action-suppressionlog": "xem nhật trình ẩn giấu này",
        "action-block": "cấm không cho người dùng này sửa đổi",
        "action-protect": "thay đổi mức khóa của trang này",
        "action-userrights-interwiki": "sửa đổi quyền của người dùng tại wiki khác",
        "action-siteadmin": "khóa hoặc mở khóa cơ sở dữ liệu",
        "action-sendemail": "gửi thư điện tử",
+       "action-editmyoptions": "sửa đổi tùy chọn của bạn",
        "action-editmywatchlist": "sửa đổi danh sách theo dõi của mình",
        "action-viewmywatchlist": "xem danh sách theo dõi của mình",
        "action-viewmyprivateinfo": "xem thông tin cá nhân của bạn",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Xem",
+       "rcfilters-activefilters": "Bộ lọc hiện hành",
+       "rcfilters-restore-default-filters": "Mặc định lại các bộ lọc",
+       "rcfilters-clear-all-filters": "Xóa sạch các bộ lọc",
+       "rcfilters-search-placeholder": "Lọc các thay đổi gần đây (duyệt hoặc bắt đầu đánh chữ)",
+       "rcfilters-invalid-filter": "Bộ lọc không hợp lệ",
+       "rcfilters-empty-filter": "Không có bộ lọc hiện hành. Tất cả các đóng góp được hiển thị.",
+       "rcfilters-filterlist-title": "Bộ lọc",
+       "rcfilters-filterlist-noresults": "Không tìm thấy bộ lọc",
+       "rcfilters-filtergroup-registration": "Trạng thái đăng ký thành viên",
+       "rcfilters-filter-registered-label": "Đã đăng ký",
+       "rcfilters-filter-registered-description": "Người dùng đã đăng nhập.",
+       "rcfilters-filter-unregistered-label": "Vô danh",
+       "rcfilters-filter-unregistered-description": "Người dùng chưa đăng nhập.",
+       "rcfilters-filtergroup-authorship": "Người sửa đổi",
+       "rcfilters-filter-editsbyself-label": "Bạn",
+       "rcfilters-filter-editsbyself-description": "Các sửa đổi của bạn.",
+       "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-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.",
+       "rcfilters-filter-humans-label": "Con người (không phải bot)",
+       "rcfilters-filter-humans-description": "Các sửa đổi của người thật.",
+       "rcfilters-filtergroup-significance": "Sự quan trọng",
+       "rcfilters-filter-minor-label": "Sửa đổi nhỏ",
+       "rcfilters-filter-minor-description": "Các sửa đổi được tác giả đánh dấu là nhỏ.",
+       "rcfilters-filter-major-label": "Sửa đổi không nhỏ",
+       "rcfilters-filter-major-description": "Các sửa đổi không được tác giả đánh dấu là nhỏ.",
+       "rcfilters-filtergroup-changetype": "Kiểu thay đổi",
+       "rcfilters-filter-pageedits-label": "Sửa đổi trang",
+       "rcfilters-filter-pageedits-description": "Các sửa đổi đối với nội dung, thảo luận, miêu tả thể loại, …",
+       "rcfilters-filter-newpages-label": "Tạo trang",
+       "rcfilters-filter-newpages-description": "Các sửa đổi tạo trang mới.",
+       "rcfilters-filter-categorization-label": "Thay đổi thể loại",
+       "rcfilters-filter-categorization-description": "Các tác vụ xếp trang vào thể loại hoặc gỡ trang khỏi thể loại.",
+       "rcfilters-filter-logactions-label": "Tác vụ được ghi trong nhật trình",
+       "rcfilters-filter-logactions-description": "Các tác vụ bảo quản, mở tài khoản, xóa trang, tải lên, …",
        "rcnotefrom": "Dưới đây là {{PLURAL:$5|thay đổi duy nhất|các thay đổi}} từ <strong>$3 $4</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
        "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "rcshowhideminor": "$1 sửa đổi nhỏ",
        "uploaded-setting-handler-svg": "Đã ngăn cản mã SVG đặt thuộc tính “handler” là từ xa/dữ liệu/kịch bản. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "uploaded-remote-url-svg": "Đã ngăn cản mã SVG đặt thuộc tính style nào đó là URL ngoài máy. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "uploaded-image-filter-svg": "Đã phát hiện bộ lọc hình ảnh có URL: <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
-       "uploadscriptednamespace": "Tập tin SVG này chứa không gian tên “$1” không được cho phép",
+       "uploadscriptednamespace": "Tập tin SVG này chứa không gian tên “<nowiki>$1</nowiki>” không được cho phép",
        "uploadinvalidxml": "Không thể phân tích mã XML trong tập tin tải lên.",
        "uploadvirus": "Tập tin có virút! Chi tiết: $1",
        "uploadjava": "Tập tin ZIP này chứa một tập tin Java .class.\nKhông được phép tải lên các tập tin Java, bởi vì chúng có thể vượt qua các hạn chế bảo mật.",
        "uncategorizedcategories": "Thể loại chưa phân loại",
        "uncategorizedimages": "Tập tin chưa được phân loại",
        "uncategorizedtemplates": "Bản mẫu chưa được phân loại",
+       "uncategorized-categories-exceptionlist": " # Danh sách các thể loại không nên liệt kê trong Special:UncategorizedCategories. Mỗi dòng một thể loại với tiền tố “*”. Các dòng bắt đầu với ký tự khác (kể cả khoảng cách) đuợc bỏ qua. Hãy dùng “#” để chú thích.",
        "unusedcategories": "Thể loại trống",
        "unusedimages": "Tập tin chưa dùng",
        "wantedcategories": "Thể loại cần thiết",
        "apisandbox-sending-request": "Đang gửi yêu cầu API...",
        "apisandbox-loading-results": "Nhận kết quả API...",
        "apisandbox-results-error": "Một lỗi xuất hiện khi tải các đáp ứng truy vấn API: $1.",
+       "apisandbox-request-selectformat-label": "Hiển thị dữ liệu yêu cầu dưới dạng:",
+       "apisandbox-request-format-url-label": "Chuỗi truy vấn URL",
        "apisandbox-request-url-label": "URL của yêu cầu:",
+       "apisandbox-request-json-label": "Yêu cầu dưới dạng JSON:",
        "apisandbox-request-time": "Thời gian yêu cầu: $1 ms",
        "apisandbox-results-fixtoken": "Sửa lại dấu hiệu và gửi lại",
        "apisandbox-results-fixtoken-fail": "Thất bại khi lấy dấu hiệu “$1”.",
        "apisandbox-continue-clear": "Đặt lại",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} sẽ [https://www.mediawiki.org/wiki/API:Query#Continuing_queries tiếp tục] lời yêu cầu cuối cùng; {{int:apisandbox-continue-clear}} sẽ đặt lại các tham số có liên quan đến chức năng tiếp tục yêu cầu.",
        "apisandbox-param-limit": "Nhập <kbd>max</kbd> để sử dụng hạn chế tối đa.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tất cả các không gian tên)",
+       "apisandbox-multivalue-all-values": "$1 (Tất cả các giá trị)",
        "booksources": "Nguồn sách",
        "booksources-search-legend": "Tìm kiếm nguồn sách",
        "booksources-search": "Tìm kiếm",
        "activeusers-count": "$1 tác vụ trong {{PLURAL:$3|ngày|$3 ngày}} qua",
        "activeusers-from": "Hiển thị thành viên bắt đầu từ:",
        "activeusers-groups": "Xem những người dùng theo nhóm:",
+       "activeusers-excludegroups": "Trừ những người dùng thuộc các nhóm:",
        "activeusers-noresult": "Không thấy thành viên.",
        "activeusers-submit": "Xem người dùng tích cực",
        "listgrouprights": "Nhóm thành viên",
        "emailccsubject": "Bản sao của thư gửi cho $1: $2",
        "emailsent": "Đã gửi",
        "emailsenttext": "Thư của bạn đã được gửi.",
-       "emailuserfooter": "Thư điện tử này được $1 gửi đến $2 thông qua chức năng “{{int:emailuser}}” của {{SITENAME}}.",
+       "emailuserfooter": "Thư điện tử này được $1 gửi đến $2 thông qua chức năng “{{int:emailuser}}” của {{SITENAME}}. Nếu bạn trả lời thư điện tử này, thư của bạn sẽ được gửi trực tiếp cho người gưi ban đầu, bằng cách đó cho họ biết địa chỉ thư điện tử của bạn.",
        "usermessage-summary": "Đang để lại thông điệp hệ thống.",
        "usermessage-editor": "Trình thông điệp hệ thống",
        "watchlist": "Danh sách theo dõi",
        "changecontentmodel-emptymodels-title": "Không có sẵn kiểu nội dung nào",
        "changecontentmodel-emptymodels-text": "Không thể chuyển đổi nội dung tại [[:$1]] thành nội dung dưới định dạng nào.",
        "log-name-contentmodel": "Nhật trình thay đổi kiểu nội dung",
-       "log-description-contentmodel": "Sự kiện có liên quan đến kiểu nội dung của trang.",
+       "log-description-contentmodel": "Đây là danh sách các thay đổi về mô hình nội dung của trang, cũng như các trang được tạo với mô hình nội dung không chuẩn.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2}}đã tạo trang $3 với kiểu nội dung không mặc định “$5”",
        "logentry-contentmodel-change": "$1 {{GENDER:$2}}đã thay đổi kiểu nội dung của trang $3 từ “$4” thành “$5”",
        "logentry-contentmodel-change-revertlink": "lùi lại",
        "proxyblockreason": "Địa chỉ IP của bạn đã bị cấm vì là proxy mở. Xin hãy liên hệ nhà cung cấp dịch vụ Internet hoặc bộ phận hỗ trợ kỹ thuật của bạn và thông báo với họ về vấn đề an ninh nghiêm trọng này.",
        "sorbsreason": "Địa chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng.",
        "sorbs_create_account_reason": "Địa chỉ chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng. Bạn không thể mở tài khoản.",
+       "softblockrangesreason": "Không cho phép đóng góp vô danh từ địa chỉ IP của bạn ($1). Xin hãy đăng nhập.",
        "xffblockreason": "Đầu đề X-Forwarded-For chứa một địa chỉ IP đã bị cấm, địa chỉ này hoặc của bạn hoặc của một máy chủ proxy bạn đang sử dụng. Lý do cấm ban đầu là: $1",
        "cant-see-hidden-user": "Thành viên bạn muốn cấm đã bị cấm trước đây hoặc đã bị ẩn đi. Vì bạn không có quyền hideuser, bạn không thể xem hoặc thay đổi mức cấm của thành viên.",
        "ipbblocked": "Bạn không thể cấm hay bỏ cấm người dùng khác vì chính bạn đang bị cấm.",
        "cant-move-to-user-page": "Bạn không có quyền di chuyển một trang đến trang cá nhân (ngoại trừ đến trang con của trang cá nhân).",
        "cant-move-category-page": "Bạn không có quyền di chuyển trang thể loại.",
        "cant-move-to-category-page": "Bạn không có quyền di chuyển một trang vào không gian tên Thể loại.",
+       "cant-move-subpages": "Bạn không có quyền di chuyển trang con.",
+       "namespace-nosubpages": "Không gian tên “$1” không cho phép trang con.",
        "newtitle": "Tên mới:",
        "move-watch": "Theo dõi trang này",
        "movepagebtn": "Di chuyển trang",
        "pageinfo-length": "Chiều dài của trang (byte)",
        "pageinfo-article-id": "Mã số trang",
        "pageinfo-language": "Ngôn ngữ nội dung trang",
+       "pageinfo-language-change": "thay đổi",
        "pageinfo-content-model": "Kiểu nội dung trang",
        "pageinfo-content-model-change": "thay đổi",
        "pageinfo-robot-policy": "Ghi chỉ mục bởi robot",
        "htmlform-user-not-exists": "<strong>$1</strong> không tồn tại.",
        "htmlform-user-not-valid": "<strong>$1</strong> không phải là tên người dùng.",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2}}đã xóa trang đổi hướng $3 bằng cách ghi đè",
        "logentry-delete-restore": "$1 {{GENDER:$2}}đã phục hồi trang “$3”",
        "logentry-delete-event": "$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4",
        "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",
        "feedback-bugcheck": "Tuyệt! Chỉ cần kiểm tra nó chưa được [$1 báo cáo trước đây].",
        "feedback-useragent": "Tác nhân người dùng:",
        "searchsuggest-search": "Tìm kiếm {{SITENAME}}",
        "searchsuggest-containing": "có chứa…",
-       "api-error-autoblocked": "Địa chỉ IP của bạn bị cấm tự động vì nó đã được sử dụng bởi một người dùng bị cấm.",
-       "api-error-badaccess-groups": "Bạn không được phép tải tập tin lên wiki này.",
        "api-error-badtoken": "Lỗi nội bộ: Dấu hiệu bị hỏng.",
-       "api-error-blocked": "Bạn đã bị cấm không được sửa đổi.",
-       "api-error-copyuploaddisabled": "Chức năng tải lên từ URL đã bị tắt trên máy chủ này.",
-       "api-error-duplicate": "Wiki này đã có {{PLURAL:$1|tập tin|$1 tập tin}} cùng nội dung có tên khác.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Một|Các}} tập tin khác cùng nội dung đã tồn tại trên website, nhưng {{PLURAL:$1|nó|chúng}} đã bị xóa.",
-       "api-error-empty-file": "Bạn đã gửi tập tin rỗng.",
        "api-error-emptypage": "Không cho phép tạo mới các trang rỗng.",
-       "api-error-fetchfileerror": "Lỗi nội bộ: Việc tải tập tin bị thất bại.",
-       "api-error-fileexists-forbidden": "Một tập tin với tên “$1” đã tồn tại; không thể ghi đè nó.",
-       "api-error-fileexists-shared-forbidden": "Một tập tin với tên “$1” đã tồn tại ở kho tập tin dùng chung; không thể ghi đè nó.",
-       "api-error-file-too-large": "Bạn đã gửi tập tin lớn quá hạn.",
-       "api-error-filename-tooshort": "Tên tập tin ngắn quá.",
-       "api-error-filetype-banned": "Kiểu tập tin này đã bị cấm.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Định dạng|Các định dạng}} $1 không được chấp nhận. Chỉ chấp nhận {{PLURAL:$3|loại tập tin|các loại tập tin}} sau: $2.",
-       "api-error-filetype-missing": "Tên tập tin bị thiếu phần mở rộng.",
-       "api-error-hookaborted": "Sửa đổi của bạn bị hook phần mở rộng hủy bỏ.",
-       "api-error-http": "Lỗi nội bộ: Không thể kết nối với dịch vụ.",
-       "api-error-illegal-filename": "Không được đặt tên tập tin này.",
-       "api-error-internal-error": "Lỗi nội bộ: Việc xử lý tập tin tải lên của bạn trên wiki bị thất bại.",
-       "api-error-invalid-file-key": "Lỗi nội bộ: Không tìm thấy tập tin trong kho tạm.",
-       "api-error-missingparam": "Lỗi nội bộ: Yêu cầu thiếu tham số.",
-       "api-error-missingresult": "Lỗi nội bộ: Không rõ việc sao chép có thành công.",
-       "api-error-mustbeloggedin": "Bạn phải đăng nhập để tải lên tập tin.",
-       "api-error-mustbeposted": "Phần mềm này có lỗi: nó không sử dụng phương pháp HTTP chính xác.",
-       "api-error-noimageinfo": "Đã tải lên tập tin thành công, nhưng máy chủ không cung cấp thông tin về tập tin.",
-       "api-error-nomodule": "Lỗi nội bộ: Mô đun tải lên không được định rõ.",
-       "api-error-ok-but-empty": "Lỗi nội bộ: Máy chủ không phản hồi.",
-       "api-error-overwrite": "Không được ghi đè một tập tin đã tồn tại.",
-       "api-error-ratelimited": "Bạn cố tải lên nhiều tập tin trong một thời gian ngắn vượt quá hạn chế của wiki này.",
-       "api-error-stashfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc lưu giữ tập tin tạm.",
        "api-error-publishfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc xuất bản tập tin tạm.",
-       "api-error-stasherror": "Đã xuất hiện lỗi khi tải tập tin lên hàng đợi.",
-       "api-error-stashedfilenotfound": "Không tìm thấy tập tin khi thử tải nó lên từ hàng đợi.",
-       "api-error-stashpathinvalid": "Đường dẫn mong đợi đến tập tin đợi tải lên là không hợp lệ.",
-       "api-error-stashfilestorage": "Đã xuất hiện lỗi khi tải tập tin lên từ hàng đợi.",
-       "api-error-stashzerolength": "Máy chủ không thể lưu tập tin vào hàng đợi vì nó không có nội dung.",
-       "api-error-stashnotloggedin": "Bạn phải đăng nhập để lưu tập tin vào hàng đợi tải lên.",
-       "api-error-stashwrongowner": "Không thể truy cập một tập tin không phải của bạn trong hàng đợi tải lên.",
-       "api-error-stashnosuchfilekey": "Bạn không thể truy cập chìa khóa tập tin đợi tải lên vì chìa khóa này không tồn tại.",
-       "api-error-timeout": "Máy chủ không đáp ứng trong thời gian dự kiến.",
-       "api-error-unclassified": "Gặp lỗi không ngờ",
-       "api-error-unknown-code": "Lỗi không rõ: “$1”",
-       "api-error-unknown-error": "Lỗi nội bộ: Việc tải lên tập tin của bạn bị thất bại vì lý do không rõ.",
-       "api-error-unknown-warning": "Cảnh báo không rõ: $1",
+       "api-error-stashfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc lưu giữ tập tin tạm.",
+       "api-error-unknown-warning": "Cảnh báo không rõ: “$1”.",
        "api-error-unknownerror": "Lỗi không rõ: “$1”.",
-       "api-error-uploaddisabled": "Chức năng tải lên đã bị tắt trên wiki này.",
-       "api-error-verification-error": "Tập tin này có thể bị hỏng hoặc có phần mở rộng sai.",
-       "api-error-was-deleted": "Một tập tin cùng tên này đã được tải lên và bị xóa về sau.",
        "duration-seconds": "$1 giây",
        "duration-minutes": "$1 phút",
        "duration-hours": "$1 giờ",
        "pagelang-language": "Ngôn ngữ",
        "pagelang-use-default": "Sử dụng ngôn ngữ mặc định",
        "pagelang-select-lang": "Chọn ngôn ngữ",
+       "pagelang-reason": "Lý do",
        "pagelang-submit": "Áp dụng",
+       "pagelang-nonexistent-page": "Trang $1 không tồn tại.",
+       "pagelang-unchanged-language": "Trang $1 đã có ngôn ngữ là $2.",
+       "pagelang-unchanged-language-default": "Trang $1 đã có ngôn ngữ là ngôn ngữ nội dung mặc định của wiki.",
+       "pagelang-db-failed": "Cơ sở dữ liệu không thể thay đổi ngôn ngữ của trang.",
        "right-pagelang": "Thay đổi ngôn ngữ của trang",
        "action-pagelang": "thay đổi ngôn ngữ của trang",
        "log-name-pagelang": "Nhật trình thay đổi ngôn ngữ",
        "mw-widgets-dateinput-no-date": "Không chọn ngày tháng",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD (năm-tháng-ngày)",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM (năm-tháng)",
+       "mw-widgets-mediasearch-input-placeholder": "Tìm phương tiện",
+       "mw-widgets-mediasearch-noresults": "Không tìm thấy kết quả.",
        "mw-widgets-titleinput-description-new-page": "trang này chưa tồn tại",
        "mw-widgets-titleinput-description-redirect": "đổi hướng đến $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Thêm thể loại…",
+       "mw-widgets-usersmultiselect-placeholder": "Thêm nữa…",
        "sessionmanager-tie": "Không thể kết hợp nhiều yêu cầu xác thực loại: $1.",
        "sessionprovider-generic": "phiên $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "phiên dựa trên cookie",
        "log-action-filter-contentmodel-change": "Thay đổi kiểu nội dung",
        "log-action-filter-contentmodel-new": "Tạo trang có kiểu nội dung không chuẩn",
        "log-action-filter-delete-delete": "Xóa trang",
+       "log-action-filter-delete-delete_redir": "Ghi đè trang đổi hướng",
        "log-action-filter-delete-restore": "Phục hồi trang",
        "log-action-filter-delete-event": "Xóa nhật trình",
        "log-action-filter-delete-revision": "Xóa phiên bản",
        "usercssispublic": "Xin lưu ý: Các trang con CSS không nên chứa dữ liệu bí mật, vì những người dùng khác có thể xem các trang này.",
        "restrictionsfield-badip": "Địa chỉ hoặc dải IP không hợp lệ: $1.",
        "restrictionsfield-label": "Các dải IP được cho phép:",
-       "restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Lỗi: $1",
-       "edit-error-long": "Lỗi:\n\n$1"
+       "restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "phiên bản $1",
+       "pageid": "số trang $1"
 }
index 9a4f66e..172f08b 100644 (file)
        "nstab-template": "Batakan",
        "nstab-help": "Pakli hin pabulig",
        "nstab-category": "Kaarangay",
-       "mainpage-nstab": "Panguna nga pakli",
+       "mainpage-nstab": "Syahan nga Pakli",
        "nosuchaction": "Waray sugad nga buhat",
        "nosuchactiontext": "An buhat nga gin-ispisipikar han URL diri puyde.\nBangin la, nagsayop ka pagmakinilya han URL, o sinmunod hin sayop nga sumpay.\nBangin liwat ini usa nga bug dida han software nga ginagamit han {{SITENAME}}.",
        "nosuchspecialpage": "Waray sugad nga pinaurog nga pakli",
        "passwordreset-emaildisabled": "Mga mga higamit ha email in waray pinaandar hini nga wiki.",
        "passwordreset-username": "Agnay hiton gumaramit:",
        "passwordreset-domain": "Dominyo:",
-       "passwordreset-capture": "Kikitaon mo an resulta nga e-mail?",
-       "passwordreset-capture-help": "Kun imo igtsek ini nga kahon, an email (lakip an temporaryo nga tigaman-panakob) in igpapakita ha imo labot la han ginpadangat ha gumaramit.",
        "passwordreset-email": "E-mail adres:",
        "passwordreset-emailtitle": "Mga detalye han akawnt ha {{SITENAME}}",
        "passwordreset-emailtext-ip": "Mayda gumaramit (bangin hi ikaw, tikang han IP adres nga $1) nga naghangyo hin reset han imo tigaman-pansulod han {{SITENAME}} ($4). An nasunod nga gumaramit {{PLURAL:$3|nga akawnt|nga mga akawnt}} nahanungod hini nga email nga adres: \n\n$2\n\n{{PLURAL:$3|Iní nga temporaryo nga tigaman-pansulod|Iní nga mga temporaryo nga tigaman-pansulod}} ma-waray bali hin {{PLURAL:$5|usa ka adlaw|$5 nga mga adlaw}}.\nAngay ka sumakob ngan pumílì hin bag-o nga tigaman-pansulod ha yanâ.  Kun mayda lain nga naghatag hini nga hangyo, o kun nahinumdoman mo an imo orihinal nga tigaman-pansulod, ngan nadírì ka na pagbalyo hiní, puyde mo pasagdan ini nga sumat ngan magpadayon hin paggamit han imo daan nga tigaman-pansulod.",
        "searchprofile-advanced-tooltip": "Pamilnga ha mga nabatasan nga ngaran-lat'ang",
        "search-result-size": "$1 ({{PLURAL:$2|1 nga pulong|$2 nga mga pulong}})",
        "search-result-category-size": "{{PLURAL:$1|1 nga api|$1 nga mga api}} ({{PLURAL:$2|1 nga ubos-nga-kaarangay|$2 nga mga ubos-nga-kaarangay}}, {{PLURAL:$3| 1 nga fayl|$3 nga mga fayl}})",
-       "search-redirect": "(redirekta $1)",
+       "search-redirect": "(Ginredirekta tikang ha $1)",
        "search-section": "(bahin $1)",
        "search-category": "(kaarangay $1)",
        "search-suggest": "Buot sidngon mo ba: $1",
        "saveprefs": "Igtipig",
        "restoreprefs": "Igbalik an ngatanan ngada nga aada-nga-daan nga settings (ha ngatanan nga mga bahin)",
        "prefs-editing": "Ginliliwat",
-       "rows": "Mga rumbay pahigda:",
-       "columns": "Mga rumbay patindog:",
        "searchresultshead": "Bilnga",
        "stub-threshold-sample-link": "pananglitan",
        "stub-threshold-disabled": "Waray ginpagana",
        "userrights-reason": "Katadungan:",
        "userrights-no-interwiki": "\nDiri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki.",
        "userrights-nodatabase": "Waray kaaagii an Database $1 o diri ini aada ha lokal.",
-       "userrights-notallowed": "Waray nim pagtugot hin pagdugang o pagtanggal hin mga katungod han gumaramit.",
        "userrights-changeable-col": "Mga hugpo nga puydi mo labtan",
        "userrights-unchangeable-col": "Mga hugpo nga diri mo puydi labtan",
-       "userrights-removed-self": "Imo gintanggal an imo kalugaringon mga katungod. Tungod hito, diri kana makaka-access hinin nga pakli.",
        "group": "Hugpo:",
        "group-user": "Mga gumaramit",
        "group-autoconfirmed": "Mga gumaramit nga lugaring nakokonpirma",
        "right-userrights-interwiki": "Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki",
        "right-siteadmin": "Igtrangka ngan igrangka an database",
        "right-sendemail": "Padad-i hin e-mail ngada ha iba nga mga gumaramit",
-       "right-passwordreset": "Pakit-a an mga password reset email",
        "right-deletechangetags": "Igpara an [[Special:Tags|tags]] tikang han database",
        "grant-generic": "mga katungod nga katitirok han \"$1\"",
        "grant-group-page-interaction": "Pakig-interact han mga pakli",
        "whatlinkshere-links": "← mga sumpay",
        "whatlinkshere-hideredirs": "$1 nga mga redirek",
        "whatlinkshere-hidetrans": "$1 nga mga transklusyon",
-       "whatlinkshere-hidelinks": "$1 an mga sumpay",
+       "whatlinkshere-hidelinks": "$1 nga mga sumpay",
        "whatlinkshere-hideimages": "$1 an mga sumpay han paypay",
        "whatlinkshere-filters": "Mga panara",
        "whatlinkshere-submit": "Kadto-a",
        "block": "Pugngi an gumaramit",
-       "blockip": "Pugngi an{{GENDER:$1|gumaramit}}",
+       "blockip": "Pugngi an {{GENDER:$1|gumaramit}}",
        "blockip-legend": "Pugngi an gumaramit",
        "ipaddressorusername": "IP address o agnay-hit-gumaramit:",
        "ipbexpiry": "Matitima an dulot:",
        "feedback-message": "Mensahe:",
        "feedback-subject": "Himangrawon:",
        "feedback-thanks-title": "Salamat!",
-       "searchsuggest-search": "Pamilnga",
+       "searchsuggest-search": "Bilnga ha {{SITENAME}}",
        "searchsuggest-containing": "nagsusulod. . .",
-       "api-error-badaccess-groups": "Diri ka gintutugotan pagkarga paigbaw ha dinhi nga wiki.",
        "api-error-badtoken": "Sayop ha sulod: Maraot nga token.",
-       "api-error-copyuploaddisabled": "Pagkarga paigbaw pinaagi han URL in diri mahihimo ha dinhi nga serbidor.",
-       "api-error-empty-file": "An paypay nga isinumite nimo in waray sulod.",
        "api-error-emptypage": "Naghihimo hin bag-o, diri gintutugotan an waray sulod nga mga pakli.",
-       "api-error-filename-tooshort": "An ngaran han paypay in halipot hin duro.",
-       "api-error-filetype-banned": "Diri gintutugotan ini nga klase nga paypay.",
-       "api-error-filetype-missing": "Ini nga ngaran han paypay in nawawad-an hin ekstensyon.",
-       "api-error-http": "Sayop ha sulod: Diri nakakasumpay ha serbidor.",
-       "api-error-illegal-filename": "Diri gintutugotan an ngaran-han-paypay.",
-       "api-error-mustbeloggedin": "Diri ka nakalog-in para makapagkarga-pasaka hin mga paypay.",
-       "api-error-mustbeposted": "Sayop ha sulod: Iton paalayon in nagkikinahanglan hin HTTP POST.",
-       "api-error-overwrite": "Pagsasapaw in aada nga paypay in diri gintutugotan.",
        "api-error-stashfailed": "Sayop ha sulod:  An serbidor in waray makatipig han temporaryo nga paypay.",
-       "api-error-timeout": "An serbidor in diri nabaton ha sulod han ginaasahan nga oras.",
-       "api-error-unclassified": "Nahitabo an waray kasabti nga sayop.",
-       "api-error-unknown-code": "Waray kasabti nga sayop: \"$1\".",
-       "api-error-unknown-error": "Sayop ha sulod: May-ada nagkasayop han pagkakarga paigbaw han imo paypay.",
        "api-error-unknown-warning": "Waray kasabti nga pahimatngon: \"$1\".",
        "api-error-unknownerror": "Waray kasabti nga sayop: \"$1\".",
-       "api-error-uploaddisabled": "Diri ginpapakarga paigbaw ha dinhi nga wiki.",
-       "api-error-verification-error": "Ini nga paypay in bangin naraot, o may-ada iba nga ekstensyon.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|mga segundo}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|mga minuto}}",
        "duration-hours": "$1 {{PLURAL:$1|oras|mga oras}}",
index 5197c00..5f342a8 100644 (file)
@@ -50,7 +50,7 @@
        "tog-enotifminoredits": "頁搭文件細編也用電子信通知我",
        "tog-enotifrevealaddr": "電子信通知單裏顯示我個電子信地址",
        "tog-shownumberswatching": "顯示關注人數",
-       "tog-oldsig": "原生个签名:",
+       "tog-oldsig": "原生个签名:",
        "tog-fancysig": "拿签名当成维基文本(弗自动链接)",
        "tog-uselivepreview": "使用实时预览",
        "tog-forceeditsummary": "朆写编辑摘要个辰光提醒我",
        "newwindow": "(用新窗口开)",
        "cancel": "取消",
        "moredotdotdot": "還多...",
-       "morenotlisted": "ç®\87張表é\82\84æ\9c\86å®\8cæ\88\90。",
+       "morenotlisted": "ç®\87å¼ æ¸\85å\8d\95ä½\9cå\85´å¼\97å®\8cæ\95´。",
        "mypage": "页面",
        "mytalk": "讲张",
        "anontalk": "讲张",
        "botpasswords-label-create": "建立",
        "botpasswords-label-update": "更新",
        "resetpass_forbidden": "密码弗好更改",
+       "resetpass_forbidden-reason": "密码弗好更改:$1",
        "resetpass-no-info": "侬必须登录著才好直接进入箇只页面。",
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-submit-cancel": "取消",
        "resetpass-expired": "侬个密码到期哉。请设置新个登录密码。",
        "passwordreset": "重置密码",
        "passwordreset-username": "用戶名",
-       "passwordreset-capture": "啊要看生成个电子邮件?",
        "passwordreset-email": "电子邮件地址:",
        "passwordreset-emailtitle": "{{SITENAME}}上个账号详细信息",
        "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
        "minoredit": "箇是小变化",
        "watchthis": "关注箇页",
        "savearticle": "保存页面",
+       "savechanges": "保存改动",
+       "publishpage": "发布页面",
+       "publishchanges": "发布改动",
        "preview": "望望相",
        "showpreview": "显示预览",
        "showdiff": "显示变化",
        "searchprofile-advanced-tooltip": "垃拉自定义名字空间里向搜索",
        "search-result-size": "$1($2个字)",
        "search-result-category-size": "$1个成员($2个儿分类,$3个文件)",
-       "search-redirect": "(重定向 $1)",
+       "search-redirect": "(从$1重定向过来)",
        "search-section": "(段落 $1)",
        "search-category": "(分类$1)",
        "search-file-match": "(匹配文件内容)",
        "recentchangescount": "默认显示个编辑数:",
        "prefs-help-recentchangescount": "迭个包括近段辰光个改动、页面历史搭著日志。",
        "savedprefs": "倷个偏好已经保存哉。",
-       "savedrights": "{{GENDER:$1|$1}}个用户权限已经畀保存。",
+       "savedrights": "{{GENDER:$1|$1}}个用户组已经保存哉。",
        "timezonelegend": "时区:",
        "localtime": "当地辰光:",
        "timezoneuseserverdefault": "使用wiki默认值($1)",
        "prefs-advancedwatchlist": "高级选项",
        "prefs-tabs-navigation-hint": "提示:侬可以用左、右箭头键来选项卡之间切换。",
        "userrights-user-editname": "输入用户名:",
-       "editusergroup": "编辑{{GENDER:$1|用户}}组",
+       "editusergroup": "加载用户组",
        "editinguser": "改动{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>个用户权限$2",
+       "userrights-editusergroup": "编辑用户组",
+       "userrights-viewusergroup": "望用户组",
+       "saveusergroups": "保存{{GENDER:$1|用户}}组",
+       "userrights-reason": "理由:",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
        "action-reupload": "箇文件以舊換新",
        "action-upload_by_url": "從URL傳文件",
        "action-delete": "刪箇頁",
-       "action-deleterevision": "å\88ªç®\87ç\89\88æ\9c¬",
-       "action-deletedhistory": "望箇页删脱个历史",
+       "action-deleterevision": "å\88 è\84±ä¿®è®¢",
+       "action-deletedhistory": "望页面删脱个历史",
        "action-browsearchive": "尋已刪頁",
-       "action-undelete": "弗刪箇頁",
+       "action-undelete": "还原页面",
        "action-patrol": "拿别人家个编辑标记成已巡查",
        "action-userrights": "編全部用戶權",
        "action-userrights-interwiki": "編用戶徠各許維基個權",
        "brokenredirects-delete": "删除",
        "withoutinterwiki": "嘸語言鏈接個頁面",
        "withoutinterwiki-summary": "下向許頁面朆鏈接到別樣語言版本。",
+       "fewestrevisions": "版本顶少个页面",
        "nbytes": "$1字节",
        "nmembers": "$1只成员",
        "unusedimages": "朆用着个文件",
        "prefixindex": "全部带前缀个页面",
        "shortpages": "短页面",
        "longpages": "长页面",
-       "protectedpages": "受保护页面",
-       "protectedtitles": "保护个标题",
+       "protectedpages": "畀保护个页面",
+       "protectedtitles": "保护个标题",
        "listusers": "用户列表",
        "listusers-creationsort": "照建個日子排",
        "newpages": "新页",
        "ipboptions": "2个钟头:2 hours,1天:1 day,3天:3 days,1个礼拜:1 week,2个礼拜:2 weeks,1个号头:1 month,3个号头:3 months,6个号头:6 months,1年:1 year,老世:infinite",
        "badipaddress": "无效 IP 地址",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已经畀查封。<br />\n参看[[Special:BlockList|查封列表]]来复审查封。",
+       "blocklist": "封脱个用户",
        "ipblocklist": "封脱个用户",
        "infiniteblock": "永远",
        "blocklist-nousertalk": "弗准编辑自家个讨论页",
        "interlanguage-link-title": "̩$1 - $2",
        "anonymous": "{{SITENAME}}上个匿名{{PLURAL:$1|用户}}",
        "simpleantispam-label": "反垃圾检查。<strong>弗要</strong>填伊个!",
+       "pageinfo-title": "“$1”个信息",
+       "pageinfo-display-title": "显示题目头",
+       "pageinfo-language": "页面内容闲话",
+       "pageinfo-redirects-name": "指向箇页个重定向数目",
+       "pageinfo-firstuser": "页面建立者",
+       "pageinfo-firsttime": "页面建立日脚",
+       "pageinfo-lastuser": "阿末位编辑者",
+       "pageinfo-lasttime": "阿末趟编辑日脚",
+       "pageinfo-recent-authors": "最近作者数",
        "pageinfo-toolboxlink": "页面信息",
+       "pageinfo-contentpage": "算成内容页面",
        "deletedrevision": "拨删脱个旧修订 $1",
        "previousdiff": "←老版",
        "nextdiff": "新版→",
        "rightsnone": "(呒)",
        "revdelete-summary": "编辑摘要",
        "feedback-thanks-title": "谢谢侬!",
-       "searchsuggest-search": "搜寻",
+       "searchsuggest-search": "搜寻{{SITENAME}}",
        "pagelang-language": "闲话"
 }
index 51150e4..6b8e5a5 100644 (file)
        "passwordreset-emaildisabled": "ამ ვიკიში ელ.ფოსტის ფუნქციები გამორთულია.",
        "passwordreset-username": "მახვარებუშ ჯოხო:",
        "passwordreset-domain": "დომენი:",
-       "passwordreset-capture": "გამოსული ელ-ფოსტის ხილვა?",
-       "passwordreset-capture-help": "თუ მონიშნავთ ამ უჯრას, მაშინ თქვენ შეგეძლებათ მომხმარებლისათვის გაგზავნილი ელ.ფოსტის ნახვა (დროებითი პაროლით).",
        "passwordreset-email": "ელ. ფოსტის მისამართი:",
        "passwordreset-emailtitle": "ანგარიშის მონაცემები {{SITENAME}}-თვის",
        "passwordreset-emailtext-ip": "ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "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-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]] დამატება ან წაშლა ცალკეულ ცვლილებებსა და ჟურნალის ჩანაწერებში",
        "uploaddisabledtext": "ფაილების ატვირთვა შეუძლებელია.",
        "php-uploaddisabledtext": "ფაილების ატვირთვა შეჩერებულია PHP-ით. გთხოვთ შეამოწმოთ file_uploads-ის მნიშვნელობა.",
        "uploadscripted": "ფაილი შეიცავს HTML-კოდს, ან სკრიპტს, რომელიც ბროუზერმა შეიძლება არასწორედ გაანალიზოს.",
-       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"$1\".",
+       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML ჩატვირთულ ფაილში არ შეიძლება იყოს ანალიზირებული.",
        "uploadvirus": "ფაილი ვირუსს შეიცავს! \nდეტალები: $1",
        "uploadjava": "ეს არის ZIP-ფაილი, რომელიც Java .class ფაილს შეიცავს.\nჯავა-ფაილების ატვირთვა დაუშვებელია, ვინაიდან მათ შესაძლოა შეზღუდონ უსაფრთხოება.",
index 8a9f6f1..b4fd680 100644 (file)
@@ -46,7 +46,7 @@
        "tog-enotifminoredits": "שיקט מיר ע-פאסט אויך פֿאַר מינערדיקע רעדאַקטירונגען פֿון בלעטער",
        "tog-enotifrevealaddr": "דעק אויף מיין בליצפאסט אדרעס אין פאסט מודעות",
        "tog-shownumberswatching": "ווייזן דעם נומער פון בלאט אויפֿפאסערס",
-       "tog-oldsig": "איצטיגער אונטערשריפֿט:",
+       "tog-oldsig": "×\90×\99×\99ער ×\90×\99צ×\98×\99×\92ער ×\90×\95× ×\98ערשר×\99פֿ×\98:",
        "tog-fancysig": "באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)",
        "tog-uselivepreview": "באניצן זיך מיט גיכער פאראויסדיגער ווייזונג",
        "tog-forceeditsummary": "ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג",
@@ -62,7 +62,7 @@
        "tog-showhiddencats": "ווײַזן באהאלטענע קאטעגאריעס",
        "tog-norollbackdiff": "נישט ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי",
        "tog-useeditwarning": "שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען",
-       "tog-prefershttps": "ניצט שטענדיק א זיכערע פארבינדונג ווען ארײַנגלאגירט",
+       "tog-prefershttps": "ניצט שטענדיק א זיכערע פארבינדונג ווען ארײנגלאגירט",
        "underline-always": "אייביג",
        "underline-never": "קיינמאל",
        "underline-default": "בלעטערער גרונטשטעלונג",
        "newwindow": "(עפֿנט זיך אין א נײַעם פענסטער)",
        "cancel": "אַנולירן",
        "moredotdotdot": "נאך…",
-       "morenotlisted": "די ליסטע איז נישט פֿולשטענדיק.",
+       "morenotlisted": "×\93×\99 ×\9c×\99ס×\98×¢ ×\90×\99×\96 ×\90פשר × ×\99ש×\98 ×¤Ö¿×\95×\9cש×\98×¢× ×\93×\99ק.",
        "mypage": "מיין בלאַט",
        "mytalk": "שמועס",
        "anontalk": "שמועס",
        "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": "זען טעקע בלאט",
        "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": "עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פֿעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.",
        "createacct-email-ph": "קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס",
        "createacct-another-email-ph": "אַרײַנגעבן בליצפּאָסט אַדרעס",
        "createaccountmail": "ניצן א פראוויזאריש פאסווארט און שיקן צום געצייכנטן ע-פאסט אדרעס",
+       "createaccountmail-help": "קען ווערן באניצט צו שאפֿן קאנטע פֿאר א צווייטן אן צו דערגיין דאס פאסווארט.",
        "createacct-realname": "עכטער נאמען (אפציאנאל)",
        "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "eauthentsent": "א באשטעטיגונג ע-בריוו איז געשיקט געווארן צו דעם באשטימטן ע-פאסט אדרעס. איידער סיי וועלכע אנדערע ע-פאסט וועט ווערן געשיקט צו דער קאנטע, וועט איר דארפן פאלגן די אנווייזונגען אין דער מעלדונג כדי צו זיין זיכער אז די קאנטע איז טאקע אייערס.",
        "throttled-mailpassword": "מ'האט שוין געשיקט א בליצבריוו צוריקצושטעלן דאס פאסווארט, אין {{PLURAL:$1|דער לעצטער שעה|די לעצטע $1 שעה'ן}}. כדי צו פארמײַדן שלעכט באניצן, נאר איין פאסווארט צוריקשטעלן בליצבריוו וועט געשיקט ווערן אין {{PLURAL:$1|א שעה |$1 שעה'ן}}.",
        "mailerror": "פעלער ביים שיקן פּאָסט: $1",
-       "acct_creation_throttle_hit": "באַזוכער צו דער וויקי וואס באַניצן אייער IP אַדרעס האָבן שױן באַשאַפֿן {{PLURAL:$1|1 קאנטע|$1 קאנטעס}} במשך דעם לעצטן טאָג, דעם מאַקסימום וואָס מען ערלויבט אין דעם פעריאד.\n\nדערפֿאַר קענען באַזוכער וואס באַניצן דעם  IP אַדרעס נישט מער שאַפֿן נײַע קאָנטעס דערווײַל.",
+       "acct_creation_throttle_hit": "באַזוכער צו דער וויקי וואס באַניצן אייער IP אַדרעס האָבן שױן באַשאַפֿן {{PLURAL:$1|1 קאנטע|$1 קאנטעס}} במשך דעם לעצטן $2, דעם מאַקסימום וואָס מען ערלויבט אין דעם צייט פעריאד.\n\nדערפֿאַר קענען באַזוכער וואס באַניצן דעם  IP אַדרעס נישט מער שאַפֿן נײַע קאָנטעס דערווײַל.",
        "emailauthenticated": "אייער ע-פאסט אדרעס איז באשטעטיגט געווארן אום $2, $3.",
        "emailnotauthenticated": "אײַער ע-פאסט אדרעס איז נאכנישט באשטעטיגט. \nקיין ע-פאסט וועט נישט ווערן געשיקט פון קיין איינע פון די פאלגנדע אייגנקייטן.",
        "noemailprefs": "ספעציפֿירט אן ע־פאסט אַדרעס אין אײַער פרעפֿערענצן כדי די פֿעאיקייטן זאלן אַרבעטן.",
        "passwordreset-emaildisabled": "ע-פאסט דינסטן זענען געווארן אומאקטיווירט אויף דער דאזיקער וויקי.",
        "passwordreset-username": "באַניצער נאָמען:",
        "passwordreset-domain": "דאמען:",
-       "passwordreset-capture": "זען  דעם געשיקטן ע־בריוו?",
-       "passwordreset-capture-help": "אַז איר צייכנט דאס קעסטל, וועט מען ווײַזן דעם ע־בריוו (מיטן פראוויזארישן פאַסווארט) צו אײַך ווי אויך ווערן געשיקט צום באַניצער.",
        "passwordreset-email": "בליצפּאָסט אַדרעס:",
        "passwordreset-emailtitle": "קאנטע פרטים אין {{SITENAME}}",
        "passwordreset-emailtext-ip": "עמעצער (מסתמא איר, פון IP אדרעס $1) האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4). די פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}}\nפארבונדן מיט דעם ע־פאסט אדרעס:\n\n$2\n\n{{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.\nאיר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,\nאדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,\n קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.",
        "selfredirect": "<strong>ווארענונג:</strong> איר טוט ווײַטערפירן דעם בלאט צו זיך אליין.\nאיר העט אפשר ספעציפיצירט א פאלשן ווײַטערפירונג־ציל  אדער איר רעדאקטירט דעם פאלשן בלאט.\nטאמער קליקט איר נאכאמאל \"{{int:savearticle}}\", וועט מען טאקע שאפן די ווײַטערפירונג.",
        "missingcommenttext": "ביטע שטעלט אריין א אנמערקונג פון אונטן.",
        "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
-       "summary-preview": "ס×\9a\94×\9b×\9c ×¤×\90ר×\90×\95×\99ס×\93×\99×\92×¢ ×\95×\95×\99×\99×\96×\95× ×\92:",
-       "subject-preview": "טעמע פאראויסדיגע ווייזונג:",
+       "summary-preview": "פ×\90ר×\90×\95×\99סק×\95ק ×¤Ö¿×\95×\9f ×¨×¢×\93×\90ק×\98×\99ר×\95× ×\92־רע×\96×\95×\9e×¢:",
+       "subject-preview": " פאראויסקוק פֿון טעמע:",
        "previewerrortext": "א פעלער האט פאסירט ביים פרובירן פארויסקוקן אײַערע ענדערונגען.",
        "blockedtitle": "באַניצער איז בלאקירט",
        "blockedtext": "'''אייער באניצער נאמען אדער IP אדרעס איז געווארן בלאקירט.'''\n\nדעם בלאק האט $1 געמאכט פון וועגן ''$2''.\n\n* בלאקירן הייבט אן: $8\n* בלאקירן גייט אויס: $6\n* בלאק מכוון צו: $7\n\nאיר קענט זיך ווענדן צו $1 אדער צו אנדערע [[{{MediaWiki:Grouppage-sysop}}|אדמיניסטראטארן]] אדורכצורעדן דעם בלאק.\n\nגיט אכט אז איר קענט נישט ניצן די \"שיקט דעם באניצער א ע-פאסט\" אייגנקייט אויב האט איר נישט איינגעשטעלט אין אייערע [[Special:Preferences|קונטע פרעפערענצן]] א גילטיקן בליצפאסט אדרעסדאס אדער איר זענט בלאקירט פון שיקן בליצפאסט.\n\nאייער IP אדרעס איז $3, און דער בלאק האט נומער #$5. ביטע שיקט איינעם פון די צוויי (אדער זיי ביידע) ווען איר ווענדט זיך צו די אדמיניסטראטורן.",
        "content-model-css": "CSS",
        "content-json-empty-object": "ליידיגער אביעקט",
        "content-json-empty-array": "ליידיגער אריי",
+       "deprecated-self-close-category": "בלעטער וואס ניצן אומגילטיגע אליין־פֿאַרמאַכטע HTML טאַגן",
        "duplicate-args-warning": "<strong>ווארענונג:</strong> [[:$1]] רופט [[:$2]] מיט מער ווי איין ווערט פארן פאראמעטער \"$3\". נאר דעם לעצטן ווערט וועט מען ניצן.",
        "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>.",
        "searchprofile-advanced-tooltip": "זוכן אין צוגעשטעלטע ָנאָמענטיילן",
        "search-result-size": "$1 ({{PLURAL:$2|איין ווארט|$2 ווערטער}})",
        "search-result-category-size": "{{PLURAL:$1|1 מיטגליד|$1 מיטגלידער}} ({{PLURAL:$2|1 אונטער־קאַטעגאריע|$2 אונטער־קאַטעגאריעס}}, {{PLURAL:$3|1 טעקע|$3 טעקעס}})",
-       "search-redirect": "(ווײַטערפֿירן $1)",
+       "search-redirect": "(×\95×\95ײַ×\98ערפֿ×\99ר×\95× ×\92 ×¤Ö¿×\95×\9f $1)",
        "search-section": "(אפטיילונג $1)",
        "search-category": "(קאטעגאריע $1)",
        "search-file-match": "(פאסט צו טעקע אינהאלט)",
        "search-interwiki-caption": "שוועסטער פראיעקטן",
        "search-interwiki-default": "רעזולטאטן פון $1:",
        "search-interwiki-more": "(נאך)",
+       "search-interwiki-more-results": "נאך רעזולטאטן",
        "search-relatedarticle": "פארבינדן",
        "searchrelated": "פארבינדן",
        "searchall": "אלץ",
        "saveprefs": "אויפֿהיטן",
        "restoreprefs": "צוריקשטעלן אלע גרונטלעכע שטעלונגען (אין אלע אפטיילן)",
        "prefs-editing": "באַאַרבעטן",
-       "rows": "שורות:",
-       "columns": "עמודים:",
        "searchresultshead": "זוכן",
        "stub-threshold": "שוועל פֿאַר שטומף לינק פֿאָרמאַטירונג ($1):",
        "stub-threshold-sample-link": "ביישפיל",
        "prefs-help-recentchangescount": "כולל לעצטע ענדערונגען, בלאַט היסטאָריעס, און לאָגביכער.",
        "prefs-help-watchlist-token2": "דאס איז דער געהיימער שליסל צום וועבפֿיד פון אײַער אויפֿפאסונג ליסטע.\nיעדער וואס ווייסט אים וועט קענען לייענען אײַער אויפֿפאסונג ליסטע; טוט אים נישט טיילן.\n[[Special:ResetTokens|קליקט דא ווען איר דארפט אים צוריקשטעלן]].",
        "savedprefs": "אייערע פרעפערענצן איז אפגעהיטן געווארן.",
-       "savedrights": "×\93×\99 ×\91×\90× ×\99צער־רע×\9b×\98×\9f פֿון {{GENDER:$1|$1}} זענען געווארן געשפייכלערט.",
+       "savedrights": "×\93×\99 ×\91×\90× ×\99צער־×\92ר×\95פעס פֿון {{GENDER:$1|$1}} זענען געווארן געשפייכלערט.",
        "timezonelegend": "צײַט זאנע:",
        "localtime": "לאקאלע צייט:",
        "timezoneuseserverdefault": "ניצן סערווירער גרונט ($1)",
        "youremail": "ע-פאסט:",
        "username": "{{GENDER:$1|באַניצער־נאָמען}}:",
        "prefs-memberingroups": "{{GENDER:$2|מיטגליד}} אין {{PLURAL:$1|גרופע|גרופעס}}:",
+       "group-membership-link-with-expiry": "$1 (ביז $2)",
        "prefs-registration": "אײַנשרײַבן צײַט:",
        "yourrealname": "עכטער נאָמען:",
        "yourlanguage": "שפּראַך:",
        "prefswarning-warning": "איר האט געמאכט ענדערונגען צו אײַערע פרעפערענצן וואס זענען נאך נישט אויפגעהיטן.\nאז איר פארלאזט דעם בלאט אן קליקן ״$1״ וועלן אײַערע פרעפערענצן נישט ווערן דערהײַנטיקט.",
        "prefs-tabs-navigation-hint": "טיפ: איר קענט ניצן די רעכטס און לינקס פייל־קלאווישן צו נאוויגירן צווישן די צינגלעך אין דער צינגלעך־ליסטע.",
        "userrights": "באַניצער רעכטן פֿאַרוואַלטערשאפט",
-       "userrights-lookup-user": "פֿ×\90ַר×\95×\95×\90Ö·×\9c×\98×\9f ×\91×\90× ×\99צער ×\92ר×\95פעס",
+       "userrights-lookup-user": "×\90×\95×\99ס×\95×\95×\99×\99×\9c×\9f ×\90 ×\91×\90× ×\99צער",
        "userrights-user-editname": "לייגט אריין א באַניצער-נאמען:",
-       "editusergroup": "רע×\93×\90Ö·×\92×\99ר×\9f {{GENDER:$1|×\91×\90Ö·× ×\99צער}} גרופּעס",
+       "editusergroup": "×\9c×\90×\93×\9f ×\91×\90Ö·× ×\99צער גרופּעס",
        "editinguser": "ענדערן באַניצער רעכטן פון  {{GENDER:$1|באַניצער|באַניצערין}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "רעדאַקטירן באַניצער גרופעס",
+       "userrights-editusergroup": "רעדאַקטירן {{GENDER:$1|באַניצער|באַניצערין}} גרופעס",
+       "userrights-viewusergroup": "באַקוקן {{GENDER:$1|באַניצער|באַניצערין}} גרופעס",
        "saveusergroups": "אויפֿהיטן {{GENDER:$1|באַניצער}} גרופעס",
        "userrights-groupsmember": "מיטגליד פון:",
        "userrights-groupsmember-auto": "אויטאמטישער מיטגליד פֿון:",
-       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען דער באַניצער געהערט:\n*א מאַרקירט קעסטל באַדײַט אָז דער באַניצער איז א מיטגליד אין דער גרופע.\n* אַן אוממאַרקירט קעסטל באַדײַט אָז דער באַניצער איז נישט קיין מיטגליד אין דער גרופע.\n* א * ווײַזט אַז איר קענט נישט אַראפנעמען די גרופע נאָך דעם וואָט איר האט זי צוגעלייגט, אדער פֿאַרקערט.",
+       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען {{GENDER:$1|דער באַניצער|די באַניצערין}} געהערט:\n*א מאַרקירט קעסטל באַדײַט אָז דער באַניצער איז א מיטגליד אין דער גרופע.\n* אַן אוממאַרקירט קעסטל באַדײַט אָז דער באַניצער איז נישט קיין מיטגליד אין דער גרופע.\n* א * ווײַזט אַז איר קענט נישט אַראפנעמען די גרופע נאָך דעם וואָט איר האט זי צוגעלייגט, אדער פֿאַרקערט.",
        "userrights-reason": "אורזאַך:",
        "userrights-no-interwiki": "איר האט נישט קיין ערלויבניש צו רעדאַקטירן באַניצער רעכטן אויף אַנדערע וויקיס.",
        "userrights-nodatabase": "דאַטנבאַזע $1 אדער עקזיסטירט נישט אדער איז נישט ארטיק.",
-       "userrights-nologin": "איר דאַרפֿט [[Special:UserLogin| אַרײַנלאגירן]] מיט א סיסאפ קאנטע צו באַשטימען באַניצער רעכטן.",
-       "userrights-notallowed": "איר האט נישט קיין ערלויבניש צוצולייגן אדער אוועקנעמען באַניצער רעכטן.",
        "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 Monat:1 month,3 מאנאט:3 months,6 מאנאטן:6 months,1 יאר:1 year",
        "userrights-conflict": "קאנפֿליקט פון באניצער־רעכטן ענדערונגען! זייט אזוי גוט רעצענזירן און באשטעטיקן אײַערע ענדערונגען.",
-       "userrights-removed-self": "איר האט אראפגענומען אייערע אייגענע רעכטן. אזוי קענט איר מער נישט דערגרייכן דעם בלאט.",
        "group": "גרופע:",
        "group-user": "באניצערס",
        "group-autoconfirmed": "באַשטעטיקטע באַניצער",
        "right-siteadmin": "פארשליס און שליס-אויף די דאטעבאזע",
        "right-override-export-depth": "עקספארטירן בלעטער כולל געלינקטע בלעטער ביז א טיף פון 5",
        "right-sendemail": "שיקן ע-פאסט צו אנדערע באניצער",
-       "right-passwordreset": "באַקוקן פאַסווארט צוריקשטעלן ע־בריוו",
        "right-managechangetags": "שאפן און (אומ)אקטיווירן [[Special:Tags|טאגן]]",
        "right-applychangetags": "אנווענדן [[Special:Tags|טאגן]] צוזאמען מיט ענדערונגען",
        "grant-generic": "\"$1\" רעכטן־בינטל",
        "grant-group-file-interaction": "אינטעראגירן מיט מעדיע",
        "grant-group-watchlist-interaction": "אינטעראגירן מיט אייער אויפֿפאסונג־ליסטע",
        "grant-group-email": "שיקן ע־פאסט",
+       "grant-group-other": "פֿארשידענע אקטיוויטעטן",
        "grant-createaccount": "שאַפֿן קאנטעס",
        "grant-editmywatchlist": "רעדאקטירן אײַער אויפֿפאסונג ליסטע",
        "grant-editpage": "רעדאקטירן עקזיסטירנדע בלעטער",
        "action-upload_by_url": "ארויפֿלאָדן די טעקע פֿון א URL",
        "action-writeapi": "ניצן דעם שרײַבן API",
        "action-delete": "אויסמעקן דעם בלאַט",
-       "action-deleterevision": "אויסמעקן די רעוויזיע",
-       "action-deletedhistory": "באַקוקן דעם בלאט'ס אויסגעמעקטע היסטאריע",
+       "action-deleterevision": "אויסמעקן רעוויזיעס",
+       "action-deletedhistory": "באַקוקן א בלאט'ס אויסגעמעקטע היסטאריע",
+       "action-deletedtext": "באקוקן אויסגעמעקטן רעוויזיע טעקסט",
        "action-browsearchive": "זוכן אויסגעמעקטע בלעטער",
-       "action-undelete": "צ×\95ר×\99קש×\98×¢×\9c×\9f ×\93×¢×\9d ×\91×\9c×\90×\98",
-       "action-suppressrevision": "×\90×\99×\91ער×\92×\99×\99×\9f ×\90×\95×\9f ×¦×\95ר×\99קש×\98×¢×\9c×\9f ×\93×\99 ×¤Ö¿×\90ַר×\91×\90ר×\92×\98×¢ ×¨×¢×\95×\95×\99×\96×\99×¢",
+       "action-undelete": "צ×\95ר×\99קש×\98×¢×\9c×\9f ×\91×\9c×¢×\98ער",
+       "action-suppressrevision": "×\90×\99×\91ער×\92×\99×\99×\9f ×\90×\95×\9f ×¦×\95ר×\99קש×\98×¢×\9c×\9f ×¤Ö¿×\90ַר×\91×\90ר×\92×\98×¢ ×¨×¢×\95×\95×\99×\96×\99עס",
        "action-suppressionlog": "באקוקן דעם פריוואטן לאג",
        "action-block": "בלאקירן דעם באַניצער פֿון רעדאַקטירן",
        "action-protect": "ענדערן שיצונג ניוואען פֿאַר דעם בלאַט",
        "action-userrights-interwiki": "רעדאַקטירן רעכטן פון באַניצער אויף אַנדערע וויקיס",
        "action-siteadmin": "שליסן אדער אויפשליסן די דאטנבאזע",
        "action-sendemail": "שיקן ע־פאסט",
+       "action-editmyoptions": "רעדאקטירן אײַערע פרעפערענצן",
        "action-editmywatchlist": "רעדאקטירן אײַער אויפֿפאסונג ליסטע",
        "action-viewmywatchlist": "באקוקן אײַער אויפֿפאסונג ליסטע",
        "action-viewmyprivateinfo": "באקוקן אײַער פריוואטע אינפארמאציע",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "ווייזן",
+       "rcfilters-invalid-filter": "אומגילטיגער פֿילטער",
+       "rcfilters-filterlist-title": "פֿילטערס",
+       "rcfilters-filterlist-noresults": "קיין פֿילטערס נישט געטראפֿן",
+       "rcfilters-filter-bots-label": "באט",
        "rcnotefrom": "פֿאלגנד {{PLURAL:$5|איז די ענדערונג| זענען די ענדערונגען}} זײַט <strong>$3, $4</strong> (ביז <strong>$1</strong>).",
        "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
        "rcshowhideminor": "$1 מינערדיגע ענדערונגען",
        "uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט.",
        "php-uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אין PHP.\nזייט אזוי גוט בודק זיין די file_uploads שטעלונג.",
        "uploadscripted": "די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער",
-       "uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל  \"$1\"",
+       "uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל  \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "דאס XML אין דער ארויפגעלאדענער טעקע קען מען נישט פארזירן.",
        "uploadvirus": "די טעקע האָט אַ ווירוס! פרטים: <div dir=\"rtl\">$1</div>",
        "upload-source": "מקור טעקע",
        "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": "אַרויפֿלאָדן",
        "pageswithprop-text": "דער בלאט האלט א רשימה פון בלעטער וואס ניצן א געוויסע בלאט אייגנשאפט.",
        "pageswithprop-prop": "אייגנשאפט נאמען:",
        "pageswithprop-submit": "גייט",
-       "pageswithprop-prophidden-long": "לא גער טעקסט אייגנשאפט־ווערט באהאלטן ($1)",
+       "pageswithprop-prophidden-long": "לאנגער טעקסט אייגנשאפט־ווערט באהאלטן ($1)",
        "pageswithprop-prophidden-binary": "בינארישער אייגנשאפט־ווערט באהאלטן ($1)",
        "doubleredirects": "געטאפלטע ווײַטערפֿירונגען",
        "doubleredirectstext": "דער בלאט רעכנט אויס בלעטער וואס פירן ווייטער צו אנדערע ווייטערפירן בלעטער.\nיעדע שורה אנטהאלט א לינק צום ערשטן און צווייטן ווייטערפירונג, ווי אויך די ציל פון דער צווייטער ווייטערפירונג, וואס רוב מאל געפינט זיך די ריכטיגע ציל וואו די ערשטע ווייטערפירונג זאל ווייזן.\n<del>אויסגעשטראכענע</del> טעמעס זענען שוין געלייזט.",
        "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:$1|צום אריגינעלן אפשיקער|צו דער אריגינעלער אפשיקערין}}, וואס וועט אויפדעקן {{GENDER:$2|אייער}} ע־פאסט אדרעס צו {{GENDER:$1|אים|איר}}.",
        "usermessage-summary": "איבערלאזן סיסטעם אָנזאָג",
        "usermessage-editor": "סיסטעם שליח",
        "usermessage-template": "MediaWiki:באניצער־מעלדונג",
        "sp-contributions-newbies-title": "ביישטייערונגען פון נייע באַניצער",
        "sp-contributions-blocklog": "בלאקירן לאג",
        "sp-contributions-suppresslog": "אונטערדריקטע {{GENDER:$1|באַניצער}} בײַשטײַערונגען",
-       "sp-contributions-deleted": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
+       "sp-contributions-deleted": "אויסגעמעקטע {{GENDER:$1|באַניצער|באַניצערין}} בײַשטײַערונגען",
        "sp-contributions-uploads": "אַרויפֿלאָדונגען",
        "sp-contributions-logs": "לאגביכער",
        "sp-contributions-talk": "שמועס",
        "htmlform-cloner-delete": "אַראָפּנעמען",
        "htmlform-title-not-exists": "$1 עקזיסטירט נישט",
        "logentry-delete-delete": "$1 {{GENDER:$2|האט אויסגעמעקט}} בלאט $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|האט אויסגעמעקט}} ווייטערפֿירונג $3 דורך איבערשרייבן",
        "logentry-delete-restore": "$1 {{GENDER:$2|האט צוריקגעשטעלט }} בלאט $3",
        "logentry-delete-event": "$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4",
        "feedback-subject": "טעמע:",
        "feedback-submit": "אײַנגעבן",
        "feedback-thanks": "ייש\"כ! אײַער פֿידבעק איז געווארן ארויפגעלעגט צום בלאט \"[$2 $1]\".",
-       "searchsuggest-search": "×\96×\95×\9a",
+       "searchsuggest-search": "×\96×\95×\9b×\9f {{SITENAME}}",
        "searchsuggest-containing": "כולל…",
-       "api-error-badaccess-groups": "איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.",
        "api-error-badtoken": "אינערלעכער גרײַז: סימן טויג נישט.",
-       "api-error-copyuploaddisabled": "אַרויפֿלאָדן דורך URL איז אומאַקטיווירט אויף דעם סערווירער.",
-       "api-error-duplicate": "שוין דאָ אין דער וויקי {{PLURAL:$1|אַן אַנדער טעקע|אַנדערע טעקעס}} מיטן זעלבן תוכן.",
-       "api-error-duplicate-archive": "ס'איז שוין געווען {{PLURAL:$1| אַן אַנדער טעקע | [$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-unknown-warning": "אומבאַקאַנטע ווארענונג: $1",
+       "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 ec49fc8..bd8577c 100644 (file)
@@ -15,6 +15,7 @@
        "tog-hideminor": "Ìbòmọ́lẹ̀ àwọn àtúnṣe kékeré nínú àwọn àtúnse tuntun",
        "tog-hidepatrolled": "Ìbòmọ́lẹ̀ àwọn àtúnṣe oníìṣọ́ nínú àwọn àtúnṣe tuntun",
        "tog-newpageshidepatrolled": "Ìbòmọ́lẹ̀ àwọn ojúewé oníìṣọ́ lọ́dọ̀ àtòjọ ojúewé tuntun",
+       "tog-hidecategorization": "Ìbòmọ́lẹ̀ ìṣeẹ̀ka àwọn ojúewé",
        "tog-extendwatchlist": "Ìfẹ̀ àmójútó láti ṣ'àfihàn gbogbo àtúnṣe, kìí ṣe tuntun nìkan",
        "tog-usenewrc": "Ìtò àwọn àtúnṣe gẹ́gẹ́bí ojúewé nínú àwọn àtúnṣe tuntun àti ìmújútó",
        "tog-numberheadings": "Àwọn àkọlé nọmba-araẹni",
@@ -25,6 +26,7 @@
        "tog-watchdefault": "Ṣ'àfikún àwọn ojúewé àti fáìlì tí mo ṣ'àtúnse mọ́ ìmójútó mi",
        "tog-watchmoves": "Ṣ'àfikún àwọn ojúewé ati fáìlì tí mo yípò mọ́ ìmójútó mi",
        "tog-watchdeletion": "Ṣ'àfikún àwọn ojúewé àti fáìlì tí mo parẹ́ mọ́ ìmójútó mi",
+       "tog-watchuploads": "Ìdàpọ̀ àwọn fáìlì tuntun sí ìmójútó mi",
        "tog-minordefault": "Se àmì sí gbogbo àtúnse gẹ́gẹ́ bi kékeré lát'ìbẹ̀rẹ̀.",
        "tog-previewontop": "Se àyẹ̀wò kí ẹ tó s'àtúnṣe",
        "tog-previewonfirst": "S'àfihàn àgbéwò fún àtúnse àkọ́kọ́",
@@ -33,7 +35,7 @@
        "tog-enotifminoredits": "Fi e-mail ránṣẹ́ sí mi bákannà fún àtúnṣe kékékèé sí àwọn ojúewé àti fáìlì",
        "tog-enotifrevealaddr": "Ṣ'àfihàn àdírẹ́ẹ̀sì e-mail mi nínú àwọn ìránṣẹ́ e-mail",
        "tog-shownumberswatching": "S'àfihàn iye àwọn oníṣe tí wọn tẹjú mọ́ọ",
-       "tog-oldsig": "Ìtọwọ́bọ̀wé tówà:",
+       "tog-oldsig": "Ìtọwọ́bọ̀wé yín tówà lọ́wọ́:",
        "tog-fancysig": "Ṣe ìtọwọ́bọ̀wé bíi ìkọ wiki (láìní ìjápọ̀ fúnrararẹ̀)",
        "tog-uselivepreview": "Ìlo àkọ́kọ́yẹ̀wò lẹ́ṣẹ̀kẹṣẹ̀ (àdánwò)",
        "tog-forceeditsummary": "Kìlọ̀ fún mi tí àkótán àtúnṣe bá jẹ́ òfo",
        "passwordreset-emaildisabled": "Ìdálẹ́kun lílo email lórí wiki yìí.",
        "passwordreset-username": "Orúkọ oníṣe:",
        "passwordreset-domain": "Àbùgbé:",
-       "passwordreset-capture": "Wo e-mail tí yíò jáde?",
-       "passwordreset-capture-help": "Tí ẹ bá fagi sínú àpótí yìí, e-mail náà (pẹ̀lú ọ̀rọ̀ìpamọ́ onígbàdíẹ̀) yíò hàn si yín bákannáà yíò jẹ́ fífiránṣẹ́ sí oníṣe náà.",
        "passwordreset-email": "Àdírẹ̀sì e-mail:",
        "passwordreset-emailtitle": "Àwọn ẹ̀kúnrẹ́rẹ́ àpamọ́ lórí {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ẹnìkan (bóyá ẹ̀yin ni, láti àdírẹ̀sì IP $1) tọrọ àtúntò ọ̀rọ̀ìpamọ́ yín fún {{SITENAME}} ($4). {{PLURAL:$3|Àkópamọ́|Àwọn àkópamọ́}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pọ̀ mọ́ àdírẹ̀sì e-mail yìí:\n\n$2\n\n{{PLURAL:$3|Ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ yìí|Àwọn ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ wọ̀nyí}} yíò dópin lẹ́yìn {{PLURAL:$5|ọjọ́ kan|ọjọ́ $5}}.\nẸ gbọ́dọ̀ lọ yan ọ̀rọ̀ìpamọ́ tuntun báyìí. Tóbá jẹ́ pé ẹ̀lòmíràn ló ṣe ìtọrọ yìí, tàbí tọ́bá jẹ́ pé ẹ ti rántí ọ̀rọ̀ìpamọ́ àtètèkọ́ṣe yín, tí ẹ kọ̀ sí fẹ́ yíipadà mọ́, ẹ lé ṣàìkàsí ìránṣẹ́ yìí, kí ẹ sì tẹ̀síwájú ní lo ọ̀rọ̀ìpamọ́ àtijọ́ yín.",
        "search-section": "(abala $1)",
        "search-suggest": "Ṣé ẹ fẹ́: $1",
        "search-interwiki-caption": "Àwọn iṣẹ́-ọwọ́ mìràn",
-       "search-interwiki-default": "èsì $1",
+       "search-interwiki-default": "Ã\81wá»\8dn Ã¨sì láti $1:",
        "search-interwiki-more": "(tókù)",
        "search-relatedarticle": "Tóbáramu",
        "searchrelated": "tóbáramu",
        "userrights-reason": "Ìdíẹ̀:",
        "userrights-no-interwiki": "Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe àwọn ẹ̀tọ́ oníṣe lórí àwọn wiki míràn.",
        "userrights-nodatabase": "Ibùdó dátà $1 kò sí tàbí kò sí lábẹ́lé.",
-       "userrights-nologin": "Ẹ gbọ́dọ̀ [[Special:UserLogin|wọlé]] pẹ̀lú àpamọ́ alámòójútó láti pín àwọn ẹ̀tọ́ oníṣe.",
-       "userrights-notallowed": "Àpamọ́ yín kò ní ìyọ̀nda láti ṣàfikún tàbí ṣàyọkúrò àwọn ẹ̀tọ́ oníṣe.",
        "userrights-changeable-col": "Àwọn ẹgbẹ́ tí ẹ le túnṣe",
        "userrights-unchangeable-col": "Àwọn ẹgbẹ́ tí ẹ kò le túnṣe",
        "group": "Ìdìpọ̀:",
        "right-siteadmin": "Ìtìpa àti ìṣí ibùdó dátà",
        "right-override-export-depth": "Ìkójáde àwọn ojúewé lámùúpọ̀ mọ́ àwọn ojúewé jíjápọ̀ títí dé ìbú 5",
        "right-sendemail": "Fi e-mail ránṣẹ́ sí àwọn oníṣe míràn",
-       "right-passwordreset": "Ìwo àwọn e-mail fún ìtúntò ọ̀rọ̀ìpamọ́",
        "newuserlogpage": "Àkọsílẹ̀ ìdá oníṣe",
        "newuserlogpagetext": "Àkọọ́lẹ̀ àwọn ìdá oníṣe nì yí.",
        "rightslog": "Àwọn ẹ̀tọ́ oníṣe",
        "action-read": "wo ojúewé yìí",
        "action-edit": "ṣàtúnṣe ojúewé yìí",
        "action-createpage": "dá ojúewé yìí",
-       "action-createtalk": "dá ojúewé ìfọ̀rọ̀wérọ̀",
+       "action-createtalk": "dá ojúewé ìfọ̀rọ̀wérọ̀ yìí",
        "action-createaccount": "dá àpamọ́ oníṣe yìí",
        "action-minoredit": "fagisí àtúnṣe yìí gẹ́gẹ́ bíi kékeré",
        "action-move": "yípò ojúewé yìí",
        "upload-too-many-redirects": "URL náà ní àwọn àtúnjúwe pípọ̀jùlọ",
        "upload-http-error": "Àṣìṣe HTTP ti ṣẹlẹ̀: $1",
        "upload-copy-upload-invalid-domain": "Àwòkọ àwọn ìrùsókè kò sí láti apá yìí.",
+       "upload-dialog-title": "Ìrùsókè fáìlì",
+       "upload-dialog-button-cancel": "Fagilé",
+       "upload-dialog-button-back": "Ẹ̀yìn",
+       "upload-dialog-button-save": "Ìmúpamọ́",
+       "upload-dialog-button-upload": "Ìrùsókè",
+       "upload-form-label-infoform-title": "Àwọn ẹ̀kúnrẹ́rẹ́",
+       "upload-form-label-infoform-name": "Orúkọ",
+       "upload-form-label-infoform-description": "Ìjúwe",
+       "upload-form-label-usage-title": "Ìlò",
+       "upload-form-label-usage-filename": "Ọrúkọ fáìlì",
+       "upload-form-label-own-work": "Iṣẹ́-ọwọ́ mi ló jẹ́",
+       "upload-form-label-infoform-categories": "Àwọn ẹ̀ka",
+       "upload-form-label-infoform-date": "Ọjọ́ọdún",
        "backend-fail-stream": "Kò le ṣe ìgbéhànjáde fáìlì \"$1\".",
        "backend-fail-backup": "Kò le ṣe àwòkọpamọ́ fáìlì \"$1\".",
        "backend-fail-notexists": "Fáìlì $1 kò sí.",
        "license-nopreview": "(Àkọ́yẹ̀wò kò sí)",
        "upload_source_url": " (URL oníìbámu kan tó ṣe é bọ́sí látigboro)",
        "upload_source_file": "(fáìlì lórí kọ̀mpútà yín)",
-       "listfiles-summary": "Ojúewé pàtàkì yìí ṣe àfihàn gbogbo àwọn fáìlì àrùsókè.\nTó bá jẹ́ jíjọ̀ gẹ́gẹ́bí oníṣe, àwọn fáìlì tí oníṣe náà tí ru àtúnyẹ̀wò tuntun sòkè sí nìkan ni yíò hàn.",
+       "listfiles-delete": "ìparẹ́",
+       "listfiles-summary": "Ojúewé pàtàkì yìí ṣe àfihàn gbogbo àwọn fáìlì tí a rùsókè.",
        "listfiles_search_for": "Ṣàwàrí fún orúkọ amóhùnmáwòrán:",
        "imgfile": "fáìlì",
        "listfiles": "Àkójọ \tfáìlì",
        "mostrevisions": "Àwọn ojúewé pẹ̀lu àwọn àtúnyẹ̀wò tópọ̀jùlọ",
        "prefixindex": "Gbogbo ojúewé tó ní ìtọ́ka ìpele",
        "prefixindex-namespace": "Gbogbo ojúewé pẹ̀lú àlẹ̀mọ́wájú (orúkọàyè $1)",
+       "prefixindex-submit": "Ìfihàn",
        "shortpages": "Àwọn ojúewé kúkúrú",
        "longpages": "Ojúewé gúngùn",
        "deadendpages": "Àwọn ojúewé aláìníjàápọ́",
        "protectedpages-indef": "Àwọn àbò aláìlópin",
        "protectedpages-cascade": "Àwọn àbò atẹ̀léra nìkan",
        "protectedpagesempty": "Kò sí àwọn ojúewé kankan tó ní àbò pẹ̀lú àwọn pàrámítà wọ̀nyí.",
+       "protectedpages-page": "Ojúewé",
+       "protectedpages-expiry": "Ìparí",
        "protectedtitles": "Àwọn àkọlé ajẹ́dídáàbòbò",
        "protectedtitlesempty": "Kò sí àwọn àkolé kankan tó ní àbò pẹ̀lú àwọn pàrámítà wọ̀nyí.",
        "listusers": "Àkójọ àwọn oníṣe",
        "wlheader-showupdated": "Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
        "wlnote": "Lábẹ́ {{PLURAL:$1|ni àtúnṣe tó gbẹ̀yìn|ni àwọn àtúnṣe '''$1''' tí wọn gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí '''$2'''}} sẹ́yìn, títí dí ọjọ́ $3, $4.",
        "wlshowlast": "Ìfihàn wákàtí $1 sẹ́yìn ọjọ́ $2 sẹ́yìn",
+       "watchlist-hide": "Ìbòmọ́lẹ̀",
+       "watchlist-submit": "Ìfihàn",
+       "wlshowhideminor": "àwọn àtúnṣe kékéèké",
+       "wlshowhidebots": "àwọn bot",
        "watchlist-options": "Àṣàyàn ìmójútọ́",
        "watching": "Ó ún mójútó...",
        "unwatching": "Jíjáwọ́ ìmójútó...",
        "rollback-success": "Ìdápadà àwọn àtúnṣe ti $1;\njẹ́ yíyípadà sí àtúnyẹ̀wò tógbẹ̀yìn látọwọ́ $2.",
        "sessionfailure-title": "Ìkùnà ètò iṣẹ́",
        "sessionfailure": "Ó dà wípé ìsòro wà pẹ̀lú ìwọlé yín;\na ti fagilé gbogbo ohun tí ẹ ti ṣe nísìnsinyì kí ẹlòmíràn ó mọ́ baà ji mú.\nẸ padà sí ojúewé tó kọjá, ẹ tún ojúewé náà gbéjáde, kí ẹ tó tún tó dán wó.",
+       "changecontentmodel-title-label": "Àkọlé ojúewé",
+       "changecontentmodel-reason-label": "Ìdíẹ̀:",
        "protectlogpage": "Àkọsílẹ̀ àbò",
        "protectlogtext": "Nísàlẹ̀ ni àtòjọ àwọn àtúnṣe sí àwọn àbò ojúewé.\nẸ wo [[Special:ProtectedPages|àtòjọ àwọn ojúewé aláàbò]] fún àtòjọ àwọn àbò ojúewé ìgbàyí.",
        "protectedarticle": "ti dá àbò bo \"[[$1]]\"",
        "whatlinkshere-hidelinks": "Ìjápọ̀ $1",
        "whatlinkshere-hideimages": "$1 àwọn ìjápọ̀ fáìlì",
        "whatlinkshere-filters": "Ajọ̀",
+       "whatlinkshere-submit": "Rìnsó",
        "autoblockid": "Ìdínàaláraẹni #$1",
        "block": "Dínà oníṣe",
        "unblock": "Ìmúkúrò ìdínà oníṣe",
        "movenotallowedfile": "Ẹ kò ní ìyọ̀nda láti yípò fáìlì.",
        "cant-move-user-page": "Ẹ kò ní ìyọ̀nda láti yípò àwọn ojúewé oníṣe (àyàfi láti ọ̀dọ̀ àwọn abẹ́ojúewé).",
        "cant-move-to-user-page": "Ẹ kò ní ìyọ̀nda láti yípò àwọn ojúewé sí ojúewé oníṣe (àyàfi sí abẹ́ojúewé oníṣe).",
-       "newtitle": "Sí àkọlé tuntun:",
+       "newtitle": "Àkọlé tuntun:",
        "move-watch": "Mójútó ojúewé yìí",
        "movepagebtn": "Yípò ojúewé",
        "pagemovedsub": "Ìyípò ti já sí rere",
        "movenosubpage": "Ojúewé yìí kò ní àwọn abẹ́ojúewé.",
        "movereason": "Ìdíẹ̀:",
        "revertmove": "dápadà",
-       "delete_and_move_text": "== Ìparẹ́ pọndandan ==\nOjúewé àdésí \"[[:$1]]\" wà tẹ́lẹ̀tẹ́lẹ̀.\nṢé ẹ fẹ́ paárẹ́ láti sínà fún ìyípò?",
+       "delete_and_move_text": "Ojúewé àdésí \"[[:$1]]\" wà tẹ́lẹ̀.\nṢé ẹ fẹ́ paárẹ́ láti sínà fún ìyípò?",
        "delete_and_move_confirm": "Bẹ́ẹ̀ni, pa ojúewé náà rẹ́",
        "delete_and_move_reason": "Jẹ́ píparẹ́ láti baà fi ayè lẹ̀ fún ìyípòdà láti \"[[$1]]\"",
        "selfmove": "Àwọn àkọlé orísun àti ibiàyè jẹ́ ọ̀kannáà;\nkò le yípò ojúewé padà sí ara rẹ̀.",
        "move-leave-redirect": "Ẹ fún ní àtúnjúwe",
        "protectedpagemovewarning": "'''Àkíyèsí:''' Ojúewé yìí ti jẹ́ dídáàbòbò nítoríẹ̀ àwọn olùmójútó tí wọ́n ní ẹ̀tọ́ nìkan ni wọ́n le yínípòpadà.\nÀkọọ́lẹ̀ àìpẹ́ nìyí nísàlẹ̀ fún ìtọ́kasí:",
        "semiprotectedpagemovewarning": "'''Àkíyèsí:''' Ojúewé yìí ti jẹ́ dídáàbòbò nítoríẹ̀ àwọn oníṣe tí wọ́n ti forúkọsílẹ̀ nìkan ni wọ́n le yínípòpadà.\nÀkọọ́lẹ̀ àìpẹ́ nìyí nísàlẹ̀ fún ìtọ́kasí:",
-       "move-over-sharedrepo": "==Fáìlì wà ==\n[[:$1]] wà lórí ibi-àkójọ àjọpín kan. Ìyípò fáìlì kan padà sí àkọlé yìí yíò gun fáìlì àjọpin náà lórí.",
+       "move-over-sharedrepo": "[[:$1]] wà lórí ibi-àkójọ àjọpín kan. Ìyípò fáìlì kan padà sí àkọlé yìí yíò gun fáìlì àjọpin náà lórí.",
        "file-exists-sharedrepo": "Orúkọ fáìlì tí ẹ yàn pilẹ̀ tí únjẹ́ lílò lórí ibi-àkójọ àjọpín kan.\nẸ jọ̀wọ́ ẹ yan orúkọ míràn.",
        "export": "Ìkójáde àwọn ojúewé",
        "exporttext": "Ẹ le ṣàkójáde ìkọ̀rọ̀ àti ìtàn àtúnṣe ojúewé pàtó kan tàbí àpapọ̀ àwọn ojúewé tí a fi XML yí.\nÈyí ṣe é kówọlé sínú wiki míràn pẹ̀lú MediaWiki láti orí [[Special:Import|ìkówọlé ojúewé]].\n\nLáti ṣàkójáde àwọn ojúewé, ẹ tẹ àkọlé wọn sínú àpótí ọ̀rọ̀ ìsàlẹ̀, àkọlé kan lórí ìlà kan, kí ẹ sì sọ bóyá ẹ fẹ́ àtúnyẹ̀wò ìwòyí àti àwọn àtúnyẹ̀wò tó ti pẹ́, pẹ̀lú ìlà ìtàn ojúewé, tàbí àtúnyẹ̀wò ìwòyí pẹ̀lú ẹ̀kúnrẹ́rẹ́ ọ̀rọ̀ nípa àtúnṣe tó gbẹ̀yìn.\n\nẸ tún le lo àjápọ̀, fún àpẹrẹ  [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fún ojúewé \"[[{{MediaWiki:Mainpage}}]]\".",
        "allmessages-prefix": "Ajọ̀ pẹ̀lú àlẹ̀mọ́wájú:",
        "allmessages-language": "Èdè:",
        "allmessages-filter-submit": "Lọ",
+       "allmessages-filter-translate": "Y'édèpadà",
        "thumbnail-more": "Ìmútóbi",
        "filemissing": "Fáìlì kò sí",
        "thumbnail_error": "Asìṣẹ ìdá àwòrán kékeré: $1",
        "patrol-log-page": "Àkọọ́lẹ̀ ìsọ́",
        "patrol-log-header": "Àkọọ́lẹ̀ àwọn àtúnyẹ̀wò sísọ́ nì yí.",
        "log-show-hide-patrol": "$1 àkọọ́lẹ̀ ìsọ́",
+       "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Àtúnyẹ̀wò àtijọ́ píparẹ́ $1",
        "filedeleteerror-short": "Àsìṣe ìparẹ́ fáílì: $1",
        "filedeleteerror-long": "Àwọn àsìṣe ṣẹlẹ̀ nígbà ìṣeìparẹ́ fáìlì náà:\n\n$1",
        "minutes": "{{PLURAL:$1|ìṣẹ́jú $1}}",
        "hours": "{{PLURAL:$1|wákàtí $1}}",
        "days": "{{PLURAL:$1|ọjọ́ $1}}",
+       "weeks": "{{PLURAL:$1|ọ̀sẹ̀ $1|ọ̀sẹ̀ $1}}",
        "months": "{{PLURAL:$1|oṣù $1|oṣù $1}}",
        "years": "{{PLURAL:$1|ọdún $1|ọdún $1}}",
        "ago": "$1 sẹ́yìn",
        "just-now": "nísinsìnyí",
+       "hours-ago": "{{PLURAL:$1|wákàtí|wákàtí}} $1 ṣẹ́yìn",
+       "minutes-ago": "{{PLURAL:$1|ìṣẹ́jú|ìṣẹ́jú}} $1 ṣẹ́yìn",
+       "seconds-ago": "{{PLURAL:$1|ìṣẹ́júàáyá|ìṣẹ́júàáyá}} $1 ṣẹ́yìn",
        "monday-at": "Ọjọ́ajé ní ago $1",
        "tuesday-at": "Ọjọ́ìṣẹ́gun ní ago $1",
        "wednesday-at": "Ọjọ́rú ní ago $1",
        "confirm-watch-top": "Ṣe ìfikún ojúewé yìí mọ́ ìmójútó yín?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Yọ ojúewé yìí kúrò nínú ìmójútó yín?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← ojúewé tókọjá",
        "imgmultipagenext": "ojúewé tóúnbọ̀ →",
        "imgmultigo": "Lọ!",
        "special-characters-group-gujarati": "Gujarati",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer",
-       "edit-error-short": "Àṣìṣe: $1",
-       "edit-error-long": "Àwọn àsìṣe:\n\n\n$1"
+       "special-characters-group-khmer": "Khmer"
 }
index f225126..f57c71b 100644 (file)
                        "Shinjiman",
                        "Macofe",
                        "Jdforrester",
-                       "Tungakl"
+                       "Tungakl",
+                       "Suzukaze-c",
+                       "Asdfugil",
+                       "Deryck Chan"
                ]
        },
        "tog-underline": "連結加底線:",
@@ -46,6 +49,7 @@
        "tog-watchdefault": "將我修改嘅頁同檔案加入監視清單",
        "tog-watchmoves": "將我移動嘅頁同檔案加入監視清單",
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
+       "tog-watchuploads": "將我上載嘅檔案加入監視清單",
        "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
        "tog-minordefault": "預設全部編輯做小修改",
        "tog-previewontop": "喺修改欄上邊顯示預覽",
@@ -55,7 +59,7 @@
        "tog-enotifminoredits": "喺頁面同檔案有細修改時,用電郵通知我。",
        "tog-enotifrevealaddr": "喺電郵通知信上面話畀人聽我嘅電郵地址",
        "tog-shownumberswatching": "顯示有幾多人監視",
-       "tog-oldsig": "現有簽名:",
+       "tog-oldsig": "你而家嘅簽名:",
        "tog-fancysig": "將簽名以維基字對待(冇自動連結)",
        "tog-uselivepreview": "用即時預覽",
        "tog-forceeditsummary": "我冇入修改註解時通知我",
@@ -69,7 +73,7 @@
        "tog-ccmeonemails": "喺我寄電郵畀其他人嗰陣,寄返封副本畀我。",
        "tog-diffonly": "響差異下面唔顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏類",
-       "tog-norollbackdiff": "進行反轉之後略過差異",
+       "tog-norollbackdiff": "進行反轉之後唔睇差異",
        "tog-useeditwarning": "當我離開未保存好嘅修改嗰陣警告我",
        "tog-prefershttps": "簽到後繼續用加密連線",
        "underline-always": "全部",
        "newwindow": "(響新視窗度打開)",
        "cancel": "取消",
        "moredotdotdot": "更多...",
-       "morenotlisted": "爾張清單重未完成。",
+       "morenotlisted": "爾張清單可能重未完成。",
        "mypage": "版",
        "mytalk": "傾偈",
        "anontalk": "傾偈",
        "searcharticle": "去",
        "history": "版史",
        "history_short": "歷史",
+       "history_small": "歷史",
        "updatedmarker": "我上次來之後嘅修改",
        "printableversion": "可打印版本",
        "permalink": "固定連結",
        "talk": "討論",
        "views": "去睇",
        "toolbox": "架撐",
+       "tool-link-emailuser": "電郵畀呢個{{GENDER:$1|用戶}}",
        "userpage": "去睇用戶頁",
        "projectpage": "去睇專題頁",
        "imagepage": "去睇檔案頁",
        "laggedslavemode": "警告:呢頁可能未包括最新嘅更新。",
        "readonly": "資料庫鎖咗",
        "enterlockreason": "輸入鎖資料庫嘅原因,同埋預計幾耐後會解鎖",
-       "readonlytext": "{{SITENAME}}資料庫而家鎖住咗,唔改得;可能因為維修緊。搞掂就會正常返。\n\n管理員嘅解釋: $1",
+       "readonlytext": "{{SITENAME}}è³\87æ\96\99庫è\80\8c家é\8e\96ä½\8få\92\97ï¼\8cå\94\94æ\94¹å¾\97ï¼\9bå\8f¯è\83½å\9b ç\82ºç¶­ä¿®ç·\8aã\80\82æ\90\9eæ\8e\82å°±æ\9c\83正常è¿\94ã\80\82\n\n系統管ç\90\86å\93¡å\98\85解é\87\8bï¼\9a $1",
        "missing-article": "資料庫搵唔到你要嘅版,「$1」 $2。\n\n通常係因為修訂歷史頁上面,由過時嘅連結去到刪除咗嘅版所引起嘅。\n\n如果唔係,你可能係搵到軟件裏面嘅臭蟲。\n請記低 URL 地址,向[[Special:ListUsers/sysop|管理員]]報告。",
        "missingarticle-rev": "(修訂#: $1)",
        "missingarticle-diff": "(差異: $1, $2)",
        "mypreferencesprotected": "你無權改呢版你嘅個人設定。",
        "ns-specialprotected": "特別頁係唔可以編輯嘅。",
        "titleprotected": "呢個標題已經俾[[User:$1|$1]]保護咗防止去開。原因係<em>$2</em>。",
-       "filereadonlyerror": "改唔到檔案 \"$1\",因為檔案庫 \"$2\" 而家係唯讀。\n\n負責鎖嘅管理員嘅解釋:\"$3\"。",
+       "filereadonlyerror": "æ\94¹å\94\94å\88°æª\94æ¡\88 \"$1\"ï¼\8cå\9b ç\82ºæª\94æ¡\88庫 \"$2\" è\80\8c家ä¿\82å\94¯è®\80ã\80\82\n\n負責é\8e\96å\98\85系統管ç\90\86å\93¡å\98\85解é\87\8bï¼\9a\"$3\"ã\80\82",
        "invalidtitle-knownnamespace": "名域 \"$2\" 同版名 \"$3\" 無效嘅標題",
        "invalidtitle-unknownnamespace": "未知名域號碼 \"$1\" 同版名 \"$2\" 無效嘅標題",
        "exception-nologin": "未簽到",
        "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
        "virus-unknownscanner": "未知嘅防病毒:",
        "logouttext": "<strong>你而家已經簽退咗。</strong>\n\n但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
+       "cannotlogoutnow-title": "而家簽走唔到",
        "welcomeuser": "歡迎,$1!",
        "welcomecreation-msg": "你個戶口已經起好。\n唔好唔記得去改改你嘅{{SITENAME}}[[Special:Preferences|喜好設定]]喎。",
        "yourname": "用戶名:",
        "createacct-yourpasswordagain-ph": "入多次密碼",
        "userlogin-remembermypassword": "記住我有簽到",
        "userlogin-signwithsecure": "用安全連線",
+       "cannotlogin-title": "簽到唔到",
+       "cannotlogin-text": "冇可能簽到",
+       "cannotloginnow-title": "而家簽到唔到",
+       "cannotcreateaccount-title": "開唔到新戶口",
+       "cannotcreateaccount-text": "呢個維基唔准直接開戶",
        "yourdomainname": "你嘅網域:",
        "password-change-forbidden": "你唔可以改呢個維基站嘅密碼。",
        "externaldberror": "驗證資料庫出錯,或者唔允許你更新你嘅外部帳戶。",
        "login": "登入",
+       "login-security": "確認你嘅身份",
        "nav-login-createaccount": "登入/開新戶口",
        "userlogin": "登入/開新戶口",
        "userloginnocreate": "登入",
        "userlogin-resetpassword-link": "唔記得密碼?",
        "userlogin-helplink2": "幫我簽到",
        "userlogin-loggedin": "您目前用{{GENDER:$1|$1}}身份簽到,\n請用下面表格用另一身份簽到。",
+       "userlogin-reauth": "請你簽到多次,確認你真係{{GENDER:$1|$1}}。",
        "userlogin-createanother": "開過個戶口",
        "createacct-emailrequired": "電郵地址",
        "createacct-emailoptional": "電郵地址(可以唔填)",
        "createacct-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|版|版}}",
        "nocookieslogin": "{{SITENAME}} 登入要開 cookies。熄咗佢。請你開咗再試。",
        "nocookiesfornew": "呢位用戶嘅戶開未開,我哋唔能夠確認佢嘅來源。\n請肯定你已經開咗 cookies,重新載入再試。",
        "noname": "你未指定一個有效嘅用戶名。",
-       "loginsuccesstitle": "ç\99»å\85¥成功",
+       "loginsuccesstitle": "ç°½å\88°成功",
        "loginsuccess": "'''「$1」登入咗{{SITENAME}}。'''",
-       "nosuchuser": "呢度冇叫做 \"$1\"嘅用戶。\n用戶名係有分大細楷嘅。\n請檢查你個名嘅輸入方法,或者[[Special:CreateAccount|建立一個新嘅戶口]]。",
+       "nosuchuser": "呢度冇用戶叫做 \"$1\"嘅。\n用戶名係有分大細楷嘅。\n請檢查你個名嘅輸入方法,或者[[Special:CreateAccount|建立一個新嘅戶口]]。",
        "nosuchusershort": "呢度冇叫做 \"$1\"嘅用戶。 請檢查你個名嘅輸入方法。",
        "nouserspecified": "你需要指定一個用戶名。",
        "login-userblocked": "呢位用戶封鎖咗。唔容許登入。",
        "eauthentsent": "確認電郵已經傳送到指定嘅電郵地址。\n喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。",
        "throttled-mailpassword": "一個密碼提醒已經響$1{{PLURAL:$1|個鐘頭}}之前發送咗。為咗防止濫用,響$1{{PLURAL:$1|個鐘頭}}之內只可以發送一個密碼提醒。",
        "mailerror": "傳送電郵錯誤: $1",
-       "acct_creation_throttle_hit": "利用你呢個IP地址嘅訪客響上一日已經開咗 $1 個戶口,係響呢段時間嘅上限。\n結果,利用呢個IP地址嘅訪客唔可以響呢段時間再開多個戶口。",
+       "acct_creation_throttle_hit": "利用你呢個IP地址嘅訪客響上$2已經開咗$1個戶口,係響呢段時間嘅上限。\n所以,利用呢個IP地址嘅訪客暫時唔可以再開新戶口。",
        "emailauthenticated": "你嘅電郵地址已經喺 $2 $3 確認。",
        "emailnotauthenticated": "你嘅電郵地址重未確認。\n任何傳送電郵嘅功能都唔會運作。",
        "noemailprefs": "響你嘅喜好設定度設置一個電郵地址令到呢啲功能開始運作。",
        "createacct-another-realname-tip": "真名可以唔填。\n如果你畀埋佢,有需要嘅時候會用佢來標示你嘅工夫。",
        "pt-login": "簽到",
        "pt-login-button": "簽到",
+       "pt-login-continue-button": "繼續簽到",
        "pt-createaccount": "開戶口",
        "pt-userlogout": "簽走",
        "php-mail-error-unknown": "響 PHP 嘅 mail() 參數度出現咗未知嘅錯誤",
        "newpassword": "新密碼:",
        "retypenew": "打多次新密碼:",
        "resetpass_submit": "設定密碼同登入",
-       "changepassword-success": "ä½ å\98\85å¯\86碼已ç¶\93æ\88\90å\8a\9få\99\89æ\94¹å\92\97ï¼\81",
+       "changepassword-success": "你嘅密碼已經改咗!",
        "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
+       "botpasswords": "機械人密碼",
+       "botpasswords-disabled": "唔俾用機械人密碼。",
+       "botpasswords-label-create": "創造",
+       "botpasswords-label-update": "上載",
+       "botpasswords-label-cancel": "取消",
+       "botpasswords-label-delete": "刪除",
+       "botpasswords-label-resetpassword": "改過個個密碼",
        "resetpass_forbidden": "唔可以更改密碼",
        "resetpass-no-info": "你一定要登入咗去直接入來呢一版。",
        "resetpass-submit-loggedin": "改密碼",
        "passwordreset-emaildisabled": "呢個維基站無得傳送電郵。",
        "passwordreset-username": "用戶名:",
        "passwordreset-domain": "域名:",
-       "passwordreset-capture": "睇電郵內容?",
-       "passwordreset-capture-help": "如果揀呢度,電郵連臨時密碼金向你顯示,同時會送畀用戶。",
        "passwordreset-email": "電郵地址:",
        "passwordreset-emailtitle": "{{SITENAME}}嘅戶口資料",
        "passwordreset-emailtext-ip": "有人(可能係閣下自己,來自IP地址$1)請求更改閣下喺{{SITENAME}}($4)嘅密碼。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
        "minoredit": "呢個係小修改",
        "watchthis": "睇實呢一頁",
        "savearticle": "儲存呢頁",
+       "savechanges": "記好",
        "publishpage": "發佈呢頁",
        "publishchanges": "發佈修改",
        "preview": "預覽",
        "searchprofile-advanced-tooltip": "響自定空間名度搵",
        "search-result-size": "$1 ($2個字)",
        "search-result-category-size": "$1位成員 ($2個細類,$3個檔案)",
-       "search-redirect": "(跳轉 $1)",
+       "search-redirect": "(由$1過嚟)",
        "search-section": "(小節 $1)",
        "search-category": "(類 $1)",
        "search-file-match": "(夾啱樓案内容)",
        "saveprefs": "儲存",
        "restoreprefs": "恢復全部預設設定(喺所有項目)",
        "prefs-editing": "編輯中",
-       "rows": "行數:",
-       "columns": "列數:",
        "searchresultshead": "搵嘢",
        "stub-threshold": "楔位連結格式門檻 ($1):",
        "stub-threshold-sample-link": "樣辦",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "你並無權限去編輯響其它wiki嘅用戶權限。",
        "userrights-nodatabase": "資料庫$1唔存在或者唔係本地嘅。",
-       "userrights-nologin": "你一定要以操作員戶口[[Special:UserLogin|登入]]咗之後先可以指定用戶權限。",
-       "userrights-notallowed": "你無權限去加減用戶權限。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
        "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
-       "userrights-removed-self": "移走自身權限成功,但你冇乜可能入到呢頁。",
        "group": "組:",
        "group-user": "用戶",
        "group-autoconfirmed": "自動確認用戶",
        "right-siteadmin": "鎖同解鎖資料庫",
        "right-override-export-depth": "倒出包含有五層深連版嘅頁面",
        "right-sendemail": "寄電郵畀其他用戶",
-       "right-passwordreset": "檢查密碼/重設電郵",
        "right-managechangetags": "從數據庫度開或刪走[[Special:Tags|tags]]",
        "right-applychangetags": "套用[[Special:Tags|標籤]]到某個人嘅改動",
        "newuserlogpage": "使用者開戶記錄",
        "uploaddisabledtext": "檔案上載已經停用。",
        "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
        "uploadscripted": "呢個檔案包含可能會誤被瀏覽器解釋執行嘅 HTML 或 script 代碼。",
-       "uploadscriptednamespace": "呢個SVG文件可能有“$1”嘅非法字詞響度",
+       "uploadscriptednamespace": "呢個SVG文件可能有“<nowiki>$1</nowiki>”嘅非法字詞響度",
        "uploadinvalidxml": "分析唔到已經上傳咗嘅XML文件",
        "uploadvirus": "呢個檔案有病毒!\n詳情:$1",
        "uploadjava": "呢個係個ZIP檔案包括Java .class檔案。\n因為保安問題,上傳Java檔案係禁止左嘅。",
        "contribsub2": "{{GENDER:$3|$1}}嘅貢獻 ($2)",
        "contributions-userdoesnotexist": "用戶「$1」未有註冊。",
        "nocontribs": "搵唔到符合呢啲條件嘅修改。",
-       "uctop": "(而家)",
+       "uctop": "(最新)",
        "month": "由呢個月 (同更早):",
        "year": "由呢一年 (同更早):",
        "sp-contributions-newbies": "只顯示新戶口嘅貢獻",
        "feedback-thanks-title": "多謝!",
        "searchsuggest-search": "搵{{SITENAME}}",
        "searchsuggest-containing": "名單傳送緊...",
-       "api-error-unclassified": "發生未知嘅錯誤。",
-       "api-error-unknown-code": "未知嘅出錯:$1。",
        "api-error-unknown-warning": "未知嘅警告:$1。",
        "api-error-unknownerror": "未知嘅出錯:$1。",
-       "api-error-uploaddisabled": "呢個維基唔畀上載檔案。",
-       "api-error-verification-error": "檔案壞咗或者用錯副檔名。",
        "duration-seconds": "$1 {{PLURAL:$1|秒}}",
        "duration-minutes": "$1 {{PLURAL:$1|分鐘}}",
        "duration-hours": "$1{{PLURAL:$1|個鐘}}",
index 33aa12a..85ef77a 100644 (file)
@@ -93,7 +93,8 @@
                        "Arthur2e5",
                        "Myy730",
                        "SolidBlock",
-                       "D41D8CD98F"
+                       "D41D8CD98F",
+                       "Wmr"
                ]
        },
        "tog-underline": "链接下划线:",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|分类}}",
-       "category_header": "å\88\86ç±»â\80\9c$1â\80\9d中的页面",
+       "category_header": "å\88\86ç±»â\80\9c$1â\80\9dä¸\8b的页面",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
        "category-empty": "<em>本分类目前不含有任何页面或媒体文件。</em>",
        "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": "查看项目页面",
        "redirectpagesub": "重定向页面",
        "redirectto": "重定向至:",
        "lastmodifiedat": "本页面最后修改于$1 $2。",
-       "viewcount": "本页面已经被访问过$1次。",
+       "viewcount": "本页面已经被访问过{{PLURAL:$1|$1次}}。",
        "protectedpage": "受保护页面",
        "jumpto": "跳转至:",
        "jumptonavigation": "导航",
        "passwordreset-emaildisabled": "此Wiki上无法使用邮件功能。",
        "passwordreset-username": "用户名:",
        "passwordreset-domain": "域:",
-       "passwordreset-capture": "查看生成的电子邮件吗?",
-       "passwordreset-capture-help": "如果您选中此框,电子邮件(包括临时密码)将显示,并发送给用户。",
        "passwordreset-email": "电子邮件地址:",
        "passwordreset-emailtitle": "在 {{SITENAME}} 的帐户详细信息",
        "passwordreset-emailtext-ip": "有人(可能是您,来自IP地址$1)请求重设{{SITENAME}}($4)上相关账户的密码。以下$3个账户与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
        "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
        "passwordreset-emailsentemail": "如果此邮件地址与您的账户相关联的话,将发送一封密码重置邮件。",
        "passwordreset-emailsentusername": "如果有邮件地址与此用户名相关联的话,将发送一封密码重置邮件。",
-       "passwordreset-emailsent-capture2": "密码重置{{PLURAL:$1|邮件}}已发送。{{PLURAL:$1|用户名和密码|用户名和密码列表}}在此显示。",
-       "passwordreset-emailerror-capture2": "向{{GENDER:$2|用户}}发送电子邮件失败:$1 {{PLURAL:$3|用户名和密码|用户名和密码列表}}在此显示。",
        "passwordreset-nocaller": "必须提供一个调用方",
        "passwordreset-nosuchcaller": "调用方不存在:$1",
        "passwordreset-ignored": "密码重置没有处理。也许没有配置提供者?",
        "selfredirect": "<strong>警告:</strong>您正在将此页面重定向至它自己。您可能指定了错误的重定向目标,或者您正在编辑错误的页面。如果您再次点击“{{int:savearticle}}”,重定向仍将被创建。",
        "missingcommenttext": "请在下面输入评论。",
        "missingcommentheader": "<strong>提示:</strong>您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
-       "summary-preview": "摘要预览:",
-       "subject-preview": "主题预览:",
+       "summary-preview": "编辑摘要的预览:",
+       "subject-preview": "主题预览:",
        "previewerrortext": "尝试预览您的更改时发生未知错误。",
        "blockedtitle": "用户被封禁",
-       "blockedtext": "<strong>您的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联络$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当您在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。您当前的IP地址是$3,该封禁ID是#$5。请在您的询问中包含上面的所有信息。",
-       "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。\n请您在申诉内容中说明以上所有信息。",
+       "blockedtext": "<strong>您的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联络$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当您在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。您当前的IP地址是$3,该封禁ID是#$5。请在您做出的任何查询中包含所有上述详情。",
+       "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。请在您做出的任何查询中包含所有上述详情。",
+       "systemblockedtext": "您的用户名或IP地址已被MediaWiki自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您当前的IP地址是$3。请在您做出的任何查询中包含所有上述详情。",
        "blockednoreason": "未给出原因",
        "whitelistedittext": "请$1以编辑页面。",
        "confirmedittext": "您必须确认您的电子邮件地址才能编辑页面。请通过[[Special:Preferences|系统设置]]设置并确认您的电子邮件地址。",
        "previewnote": "<strong>请记住这只是预览。</strong>您的更改尚未保存!",
        "continue-editing": "前往编辑区",
        "previewconflict": "该预览反映了上面文字编辑区中的文字在你保存后的显示状况。",
-       "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
-       "session_fail_preview_html": "对不起!由于会话数据丢失,我们无法处理您的编辑,\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
+       "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
+       "session_fail_preview_html": "对不起!由于会话数据丢失,我们无法处理您的编辑,\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "token_suffix_mismatch": "<strong>由于您客户端中的编辑令牌毁损了一些标点符号字符,您的编辑已经被拒绝。</strong>\n此次编辑被拒绝以防止页面文本损坏。\n这种情况通常在您使用含有故障的网页式匿名代理服务的时候出现。",
        "edit_form_incomplete": "<strong>编辑表格的某些部分没有到达服务器,请检查您的编辑是否完整并重试。</strong>",
        "editing": "编辑“$1”",
        "creating": "创建“$1”",
-       "editingsection": "编辑“$1(段落)”",
-       "editingcomment": "编辑“$1”(新段落)",
+       "editingsection": "编辑“$1”(章节)",
+       "editingcomment": "编辑“$1”(新章节)",
        "editconflict": "编辑冲突:$1",
        "explainconflict": "其他用户在您开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示您的更改。您必须把您的更改合并至现有文字。<strong>只有</strong>当您单击“{{int:savearticle}}”后,上面的文字区中的文字才会被保存。",
        "yourtext": "您的文字",
        "nonunicodebrowser": "<strong>警告:您的浏览器不兼容Unicode编码。</strong>这里有一个工作区将使您能安全地编辑页面:非ASCII字符将以十六进制编码方式出现在编辑框中。",
        "editingold": "<strong>警告:您正在编辑的是本页面的旧版本。</strong>如果您保存该编辑,该版本后的所有更改都会丢失。",
        "yourdiff": "差异",
-       "copyrightwarning": "请注意您对{{SITENAME}}的所有贡献都被认为是在$2下发布,请查看在$1的细节。\n如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。\n'''不要在未获授权的情况下发表!'''<br />",
+       "copyrightwarning": "请注意您对{{SITENAME}}的所有贡献都被认为是在$2下发布,请查看在$1的细节。如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。<strong>不要在未获授权的情况下发表!</strong>",
        "copyrightwarning2": "请注意,您对{{SITENAME}}的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅$1的细节)。<strong>不要在未获授权的情况下发表!</strong>",
        "editpage-cannot-use-custom-model": "此页面的内容模型不能被更改。",
        "longpageerror": "<strong>错误:您所提交的文本长度有{{PLURAL:$1|1|$1}}KB,这大于{{PLURAL:$2|1|$2}}KB的最大值。</strong>\n因此,该文本无法保存。",
        "content-failed-to-parse": "未能将 $2 内容转换为 $1:$3",
        "invalid-content-data": "无效的内容数据",
        "content-not-allowed-here": "[[$2]]页面上不允许“$1”内容",
-       "editwarning-warning": "离开本页面可能导致您失去任何已经作出的更改。如果您处于登录状态,您可以在您的设置的“{{int:prefs-editing}}”部分停用该警告。",
+       "editwarning-warning": "离开本页面可能导致您失去任何已经作出的更改。如果您处于登录状态,您可以在您的设置的“{{int:prefs-editing}}”部分停用该警告。",
        "editpage-invalidcontentmodel-title": "内容模型不支持",
        "editpage-invalidcontentmodel-text": "内容模型“$1”不被支持。",
        "editpage-notsupportedcontentformat-title": "内容格式尚不支持",
        "suppressionlogtext": "该列表列出了管理人员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。",
        "mergehistory": "合并页面历史",
        "mergehistory-header": "此页面让您将来源页面的版本合并到新页面中去。请确保此次更改能继续保持历史页面的连续性。",
-       "mergehistory-box": "合并两个页面的版本历史:",
+       "mergehistory-box": "合并两个页面的修订版本:",
        "mergehistory-from": "来源页面:",
        "mergehistory-into": "目的页面:",
        "mergehistory-list": "可以合并的编辑历史",
        "search-interwiki-caption": "姊妹项目",
        "search-interwiki-default": "来自$1的结果:",
        "search-interwiki-more": "(更多)",
+       "search-interwiki-more-results": "更多结果",
        "search-relatedarticle": "相关",
        "searchrelated": "相关",
        "searchall": "所有",
        "search-external": "外部搜索",
        "searchdisabled": "{{SITENAME}}的搜索已被禁用。您可以暂时使用搜索引擎进行搜索,须注意其索引的{{SITENAME}}内容可能不是最新的。",
        "search-error": "搜索时发生错误:$1",
+       "search-warning": "搜索时发生警告:$1",
        "preferences": "设置",
        "mypreferences": "参数设置",
        "prefs-edits": "编辑数:",
        "saveprefs": "保存",
        "restoreprefs": "还原所有默认设置(所有分项)",
        "prefs-editing": "编辑",
-       "rows": "行数:",
-       "columns": "列数:",
        "searchresultshead": "搜索",
        "stub-threshold": "小作品链接格式阈值($1):",
        "stub-threshold-sample-link": "样例",
        "prefs-help-recentchangescount": "这包括最近更改、页面历史和日志。",
        "prefs-help-watchlist-token2": "这是您的监视列表的网络feed密钥。\n任何拥有者均可以浏览您的监视列表,因此不要公开该密钥。\n如果有需要,[[Special:ResetTokens|您可以重置密钥]]。",
        "savedprefs": "您的系统设置已保存。",
-       "savedrights": "{{GENDER:$1|$1}}的用户权限已被保存。",
+       "savedrights": "{{GENDER:$1|$1}}的用户已被保存。",
        "timezonelegend": "时区:",
        "localtime": "当地时间:",
        "timezoneuseserverdefault": "使用wiki默认值($1)",
        "youremail": "电子邮件:",
        "username": "{{GENDER:$1|用户名}}:",
        "prefs-memberingroups": "{{GENDER:$2|用户}}{{PLURAL:$1|组}}:",
+       "group-membership-link-with-expiry": "$1(直到$2)",
        "prefs-registration": "注册时间:",
        "yourrealname": "真实姓名:",
        "yourlanguage": "界面语言:",
        "badsig": "错误的原始签名。请检查HTML标签。",
        "badsiglength": "签名过长。请不超过$1个字符。",
        "yourgender": "您希望使用什么性别称呼?",
-       "gender-unknown": "当提及您时,软件将使用性别中性的词汇(只要可能)",
+       "gender-unknown": "当提及您时,软件将尽可能使用性别中性的词法",
        "gender-male": "他",
        "gender-female": "她",
        "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
        "prefswarning-warning": "您对您的参数设置的更改尚未保存。如果您不点击“$1”就离开,您的设置就不会更新。",
        "prefs-tabs-navigation-hint": "提示:您可以通过左、右箭头键在选项卡之间切换。",
        "userrights": "用户权限管理",
-       "userrights-lookup-user": "管理用户组",
+       "userrights-lookup-user": "选择用户",
        "userrights-user-editname": "输入用户名:",
-       "editusergroup": "编辑{{GENDER:$1|用户}}组",
+       "editusergroup": "加载用户组",
        "editinguser": "更改{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
-       "userrights-editusergroup": "编辑用户组",
+       "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": "æ\82¨å\8f¯ä»¥æ\9b´æ\94¹è¯¥ç\94¨æ\88·ç\9a\84ç\94¨æ\88·ç»\84ï¼\9a\n* é\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·å±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\9cªé\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·ä¸\8då±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\98\9få\8f·ï¼\88*ï¼\89表示ä¸\80æ\97¦æ·»å\8a è¯¥ç\94¨æ\88·ç»\84å\90\8eä¸\8dè\83½å\88 é\99¤ï¼\8cå\8f\8dä¹\8b亦ç\84。",
+       "userrights-groups-help": "æ\82¨å\8f¯ä»¥æ\9b´æ\94¹è¯¥ç\94¨æ\88·ç\9a\84ç\94¨æ\88·ç»\84ï¼\9a\n* é\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·å±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\9cªé\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·ä¸\8då±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\98\9få\8f·ï¼\88*ï¼\89表示ä¸\80æ\97¦æ\82¨è¢«æ·»å\8a è\87³è¯¥ç\94¨æ\88·ç»\84å\90\8eï¼\8cæ\82¨ä¸\8dè\83½äº²è\87ªç§»é\99¤å\85¶æ\9d\83é\99\90ï¼\8cå\8f\8dä¹\8b亦ç\84¶ã\80\82\n* äº\95å\8f·ï¼\88#ï¼\89表示æ\82¨å\8fªå\8f¯ä»¥æ\8e¨è¿\9f该ç\94¨æ\88·ç»\84ç\9a\84è¿\87æ\9c\9fæ\97¶é\97´ï¼\9bæ\82¨ä¸\8dè\83½å°\86å\85¶æ\8f\90å\89\8d。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您并没有权限去编辑在其它wiki上的用户权限。",
        "userrights-nodatabase": "数据库$1不存在或并非为本地的。",
-       "userrights-nologin": "您必须要以管理员帐户[[Special:UserLogin|登录]]之后才可以指定用户权限。",
-       "userrights-notallowed": "您没有权限添加或移除用户权限。",
        "userrights-changeable-col": "您可以更改的用户组",
        "userrights-unchangeable-col": "您不能更改的用户组",
+       "userrights-expiry-current": "终止于$1",
+       "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": "用户权限的更改存在冲突!请检查并确认您的更改。",
-       "userrights-removed-self": "您已删除您自己的权利。因此,您不再能够访问此页。",
        "group": "用户组:",
        "group-user": "用户",
        "group-autoconfirmed": "自动确认用户",
        "right-siteadmin": "锁定和解锁数据库",
        "right-override-export-depth": "导出页面,包括最多5层链接",
        "right-sendemail": "发送电子邮件给其他用户",
-       "right-passwordreset": "查看密码重置电子邮件",
        "right-managechangetags": "创建和(取消)激活[[Special:Tags|标签]]",
        "right-applychangetags": "连同某人的更改一起应用[[Special:Tags|标签]]",
        "right-changetags": "在个别修订和日志记录中添加和移除任意[[Special:Tags|标签]]",
        "action-upload_by_url": "从URL上传本文件",
        "action-writeapi": "使用写入API",
        "action-delete": "删除本页",
-       "action-deleterevision": "删除本版本",
-       "action-deletedhistory": "查看本页面被删除的历史",
+       "action-deleterevision": "删除修订",
+       "action-deletelogentry": "删除日志记录",
+       "action-deletedhistory": "查看页面被删除的历史",
+       "action-deletedtext": "查看已删除的修订版本文字",
        "action-browsearchive": "搜索已被删除的页面",
-       "action-undelete": "还原本页",
-       "action-suppressrevision": "复核并还原该隐藏版本",
+       "action-undelete": "还原页面",
+       "action-suppressrevision": "复核并还原隐藏修订版本",
        "action-suppressionlog": "查看本非公开日志",
        "action-block": "阻止该用户编辑",
        "action-protect": "更改本页面的保护级别",
        "action-userrights-interwiki": "编辑其他wiki用户的用户权限",
        "action-siteadmin": "锁定或解锁数据库",
        "action-sendemail": "发送电子邮件",
+       "action-editmyoptions": "编辑您的参数设置",
        "action-editmywatchlist": "编辑您的监视列表",
        "action-viewmywatchlist": "查看您的监视列表",
        "action-viewmyprivateinfo": "查看您的私人信息",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "显示",
+       "rcfilters-activefilters": "活跃的过滤器",
+       "rcfilters-restore-default-filters": "恢复默认过滤器",
+       "rcfilters-clear-all-filters": "清空所有过滤器",
+       "rcfilters-search-placeholder": "过滤器最近更改(浏览或开始输入)",
+       "rcfilters-invalid-filter": "无效过滤器",
+       "rcfilters-empty-filter": "没有活跃的过滤器。已显示所有贡献。",
+       "rcfilters-filterlist-title": "过滤器",
+       "rcfilters-filterlist-noresults": "找不到过滤器",
+       "rcfilters-filtergroup-registration": "用户注册",
+       "rcfilters-filter-registered-label": "已注册",
+       "rcfilters-filter-registered-description": "登录编辑者。",
+       "rcfilters-filter-unregistered-label": "未注册",
+       "rcfilters-filter-unregistered-description": "未登录的编辑者。",
+       "rcfilters-filtergroup-authorship": "编辑的作者",
+       "rcfilters-filter-editsbyself-label": "您自己的编辑",
+       "rcfilters-filter-editsbyself-description": "由您编辑。",
+       "rcfilters-filter-editsbyother-label": "由其他人编辑",
+       "rcfilters-filter-editsbyother-description": "由其他用户(而不是您)创建的编辑。",
+       "rcfilters-filtergroup-userExpLevel": "体验水平(仅限注册用户)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "新手",
+       "rcfilters-filter-userExpLevel-newcomer-description": "少于10次编辑和4天活跃。",
+       "rcfilters-filter-userExpLevel-learner-label": "初学者",
+       "rcfilters-filter-userExpLevel-learner-description": "比“新手”拥有更多活跃天数和编辑数,但少于“有经验的用户”。",
+       "rcfilters-filter-userExpLevel-experienced-label": "有经验的用户",
+       "rcfilters-filter-userExpLevel-experienced-description": "超过30天活跃和500次编辑。",
+       "rcfilters-filtergroup-automated": "自动化贡献者",
+       "rcfilters-filter-bots-label": "机器人",
+       "rcfilters-filter-bots-description": "由自动化工具做出的编辑。",
+       "rcfilters-filter-humans-label": "人类(不是机器人)",
+       "rcfilters-filter-humans-description": "由人类编辑者做出的编辑。",
+       "rcfilters-filtergroup-significance": "意义",
+       "rcfilters-filter-minor-label": "小编辑",
+       "rcfilters-filter-minor-description": "作者已标记为小编辑的编辑。",
+       "rcfilters-filter-major-label": "不是小编辑",
+       "rcfilters-filter-major-description": "未标记为小编辑的编辑。",
+       "rcfilters-filtergroup-changetype": "更改类型",
+       "rcfilters-filter-pageedits-label": "页面编辑",
+       "rcfilters-filter-pageedits-description": "对wiki内容、讨论、分类描述的编辑....",
+       "rcfilters-filter-newpages-label": "页面创建",
+       "rcfilters-filter-newpages-description": "做出新页面的编辑。",
+       "rcfilters-filter-categorization-label": "分类更改",
+       "rcfilters-filter-categorization-description": "从分类中添加或移除页面的记录。",
+       "rcfilters-filter-logactions-label": "记录的操作",
+       "rcfilters-filter-logactions-description": "管理操作、账户创建、页面删除、上传....",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "fileexists": "已存在相同名称的文件,如果您无法确定您是否要改变它,请检查<strong>[[:$1]]</strong>。 [[$1|thumb]]",
        "filepageexists": "该文件的说明页面已经创建于<strong>[[:$1]]</strong>,但是目前没有名称为此的文件存在。您输入的摘要不会显示在说明页面上。要使你的摘要在那里显示,您需要手工编辑它。[[$1|thumb]]",
        "fileexists-extension": "一个相似名称的文件已经存在: [[$2|thumb]]\n* 上传文件的文件名:<strong>[[:$1]]</strong>\n* 现有文件的文件名:<strong>[[:$2]]</strong>\n请选择一个不同的名字。",
-       "fileexists-thumbnail-yes": "此文件可能是另一幅图像的缩小版本<em>(缩略图)</em>。 [[$1|thumb]]\n请仔细检查该文件<strong>[[:$1]]</strong>。\n如果被检查文件与原始大小的图像是同一幅图像,您无需上传多余的缩略图。",
+       "fileexists-thumbnail-yes": "此文件可能是另一幅图像的缩小版本<em>(缩略图)</em>。[[$1|thumb]]请仔细检查该文件<strong>[[:$1]]</strong>。如果被检查文件与原始大小的图像是同一幅图像,您无需上传多余的缩略图。",
        "file-thumbnail-no": "文件名以<strong>$1</strong>开始。它似乎是缩小的图像<em>(缩略图)</em>。如果您有完整分辨率的该图像,请上传它,否则请更改文件名。",
        "fileexists-forbidden": "已存在相同名称的文件,且不能覆盖;请返回并用一个新的名称来上传此文件。[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "共享文件库中存在该名称的文件。如果您仍想上传你的文件,请返回使用其他名称。[[File:$1|thumb|center|$1]]",
        "uploaded-setting-handler-svg": "通过远程/数据/脚本设置“handler”属性的SVG时受阻。在上传的SVG文件中找到<code>$1=\"$2\"</code>。",
        "uploaded-remote-url-svg": "通过远程URL设置任意样式属性的SVG时受阻。在上传的SVG文件中找到<code>$1=\"$2\"</code>。",
        "uploaded-image-filter-svg": "在上传的SVG文件中找到图片过滤器带URL:<code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploadscriptednamespace": "此SVG文件包含非法名字空间“$1”。",
+       "uploadscriptednamespace": "此SVG文件包含非法名字空间“<nowiki>$1</nowiki>”。",
        "uploadinvalidxml": "上传文件中的XML无法解析。",
        "uploadvirus": "该文件包含病毒!\n详情:$1",
        "uploadjava": "该文件是 ZIP 文件,其中包含 Java 的.class 文件。上传Java文件不被允许,因为它们可能绕过限制,从而引起安全问题。",
        "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-notexists": "æ\9d¡ç\9b®$1不存在。",
-       "backend-fail-hashes": "æ¯\94è¾\83æ\97 æ³\95è\8e·å\8f\96æ\96\87件hashes",
-       "backend-fail-notsame": "$1已存在不同的文件。",
-       "backend-fail-invalidpath": "$1不是有效的存储路径。",
+       "backend-fail-stream": "无法流传送文件“$1”。",
+       "backend-fail-backup": "无法备份文件“$1”。",
+       "backend-fail-notexists": "æ\96\87件$1不存在。",
+       "backend-fail-hashes": "æ\97 æ³\95è\8e·å\8f\96æ\96\87件å\93\88å¸\8cç\94¨äº\8eæ¯\94è¾\83ã\80\82",
+       "backend-fail-notsame": "“$1”已存在不同的文件。",
+       "backend-fail-invalidpath": "“$1”不是有效的存储路径。",
        "backend-fail-delete": "无法删除文件“$1”。",
        "backend-fail-describe": "无法修改文件“$1”的元数据。",
-       "backend-fail-alreadyexists": "“$1”页面已存在",
-       "backend-fail-store": "无法在$2存储文件$1。",
-       "backend-fail-copy": "无法复制文件$1到$2。",
-       "backend-fail-move": "无法移动文件$1到$2。",
+       "backend-fail-alreadyexists": "“$1”文件已存在。",
+       "backend-fail-store": "无法在“$2”存储文件“$1”。",
+       "backend-fail-copy": "无法复制文件“$1”到“$2”。",
+       "backend-fail-move": "无法移动文件“$1”到“$2”。",
        "backend-fail-opentemp": "无法打开临时文件。",
        "backend-fail-writetemp": "无法写临时文件。",
-       "backend-fail-closetemp": "æ\97 æ³\95å\88\9b建临时文件。",
+       "backend-fail-closetemp": "æ\97 æ³\95å\85³é\97­临时文件。",
        "backend-fail-read": "找不到文件“$1”。",
-       "backend-fail-create": "无法写入文件 $1 。",
+       "backend-fail-create": "无法写入文件“$1”。",
        "backend-fail-maxsize": "无法写入文件“$1”,因为它大于$2字节。",
        "backend-fail-readonly": "“$1”存储后端目前在只读模式,因为:<em>$2</em>",
-       "backend-fail-synced": "文件\"$1\"在内部存储后端之中处于不一致状态",
+       "backend-fail-synced": "文件“$1”在内部存储后端之中处于不一致状态",
        "backend-fail-connect": "无法连接到存储后端“$1。",
        "backend-fail-internal": "存储后端“$1”发生了一个未知错误。",
        "backend-fail-contenttype": "无法判断文件的内容类型来储存于“$1”。",
        "randompage-nopages": "在以下{{PLURAL:$2|名字空间}}中没有页面:$1。",
        "randomincategory": "分类中随机页面",
        "randomincategory-invalidcategory": "“$1”不是一个有效的分类名称。",
-       "randomincategory-nopages": "[[:Category:$1|$1]]å\88\86类中没有页面。",
+       "randomincategory-nopages": "[[:Category:$1|$1]]å\88\86ç±»ä¸\8b没有页面。",
        "randomincategory-category": "分类:",
        "randomincategory-legend": "分类中随机页面",
        "randomincategory-submit": "提交",
        "nrevisions": "$1个版本",
        "nimagelinks": "用于$1个页面中",
        "ntransclusions": "用于$1个页面中",
-       "specialpage-empty": "æ­¤æ\8a¥å\91\8aæ\97 结果。",
+       "specialpage-empty": "没æ\9c\89ç\94¨äº\8eæ­¤æ\8a¥å\91\8aç\9a\84结果。",
        "lonelypages": "孤立页面",
        "lonelypagestext": "以下页面没有被{{SITENAME}}的其它页面链接或包含。",
        "uncategorizedpages": "未归类页面",
        "uncategorizedcategories": "未归类分类",
        "uncategorizedimages": "未归类文件",
        "uncategorizedtemplates": "未归类模板",
+       "uncategorized-categories-exceptionlist": " #包含分类列表,它不能在Special:UncategorizedCategories中被提及。每行一条,以“*”开头。其他字符开头的行(包括空格)将被忽略。使用“#”作为注释。",
        "unusedcategories": "未使用分类",
        "unusedimages": "未使用文件",
        "wantedcategories": "需要的分类",
        "mostimages": "最多链接文件",
        "mostinterwikis": "有最多跨wiki的页面",
        "mostrevisions": "有最多版本的页面",
-       "prefixindex": "所有前缀的页面",
-       "prefixindex-namespace": "所有前缀的页面($1名字空间)",
+       "prefixindex": "所有前缀的页面",
+       "prefixindex-namespace": "所有前缀的页面($1名字空间)",
        "prefixindex-submit": "显示",
        "prefixindex-strip": "在列表中除去前缀",
        "shortpages": "短页面",
        "ancientpages": "最老页面",
        "move": "移动",
        "movethispage": "移动本页",
-       "unusedimagestext": "以下文件实际存在,但并没有插入任何页面。请注意,其他网站可能会使用直接URL链接某个文件,因此它即使被实际使用也可能在这里列出。",
+       "unusedimagestext": "存在以下没有插入任何页面的文件。请注意,其他网站可能会使用直接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毫秒}}",
        "apisandbox-results-fixtoken": "改正令牌并重新提交",
        "apisandbox-results-fixtoken-fail": "检索“$1”令牌失败。",
        "apisandbox-continue-clear": "清除",
        "apisandbox-continue-help": "{{int:apisandbox-continue}}将[https://www.mediawiki.org/wiki/API:Query#Continuing_queries 继续]上次请求;{{int:apisandbox-continue-clear}}将清除继续相关的参数。",
        "apisandbox-param-limit": "输入<kbd>max</kbd>以使用最大限制。",
+       "apisandbox-multivalue-all-namespaces": "$1(所有名字空间)",
+       "apisandbox-multivalue-all-values": "$1(所有值)",
        "booksources": "网络书源",
        "booksources-search-legend": "搜索图书来源",
        "booksources-isbn": "ISBN:",
        "allarticles": "所有页面",
        "allinnamespace": "所有页面($1名字空间)",
        "allpagessubmit": "提交",
-       "allpagesprefix": "显示有该前缀的页面:",
+       "allpagesprefix": "显示前缀的页面:",
        "allpagesbadtitle": "给定的页面标题是非法的,或者具有一个内部语言或内部 wiki 的前缀。它可能包含一个或更多的不能用于标题的字符。",
        "allpages-bad-ns": "在{{SITENAME}}中没有一个叫做\"$1\"的名字空间。",
        "allpages-hide-redirects": "隐藏重定向",
        "activeusers-count": "过去$3天有$1次操作",
        "activeusers-from": "显示用户开始于:",
        "activeusers-groups": "显示属于用户组的用户:",
+       "activeusers-excludegroups": "排除属于用户组的用户:",
        "activeusers-noresult": "找不到用户。",
        "activeusers-submit": "显示活跃用户",
        "listgrouprights": "用户组权限",
        "emailccsubject": "您发送给$1的消息的副本:$2",
        "emailsent": "电子邮件已发送",
        "emailsenttext": "您的电子邮件已经发出。",
-       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailuser}}”功能被$1{{GENDER:$1|发送}}至{{GENDER:$2|$2}}的。",
+       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailuser}}”功能被$1{{GENDER:$1|发送}}至{{GENDER:$2|$2}}的。如果{{GENDER:$2|您}}回复该电子邮件的话,{{GENDER:$2|您}}的电子邮件将直接发送至{{GENDER:$1|原始发送者}},并向{{GENDER:$1|其}}显示{{GENDER:$2|您}}的电子邮件地址。",
        "usermessage-summary": "留下系统消息。",
        "usermessage-editor": "系统信息编辑器",
        "watchlist": "监视列表",
        "changecontentmodel-emptymodels-title": "没有内容模型可用",
        "changecontentmodel-emptymodels-text": "[[:$1]]上的内容不能转换为任何类型。",
        "log-name-contentmodel": "内容模型更改日志",
-       "log-description-contentmodel": "与一个页面的内容模型相关的活动",
+       "log-description-contentmodel": "此页面列举对页面内容模型的更改,以及使用默认模型以外的内容模型创建的页面。",
        "logentry-contentmodel-new": "$1已使用非默认的内容模型“$5”{{GENDER:$2|创建}}页面$3",
        "logentry-contentmodel-change": "$1将页面$3的内容模型从“$4”{{GENDER:$2|更改}}为“$5”",
        "logentry-contentmodel-change-revertlink": "回退",
        "ipaddressorusername": "IP地址或用户名:",
        "ipbexpiry": "终止时间:",
        "ipbreason": "原因:",
-       "ipbreason-dropdown": "*常见封禁原因\n** 插入虚假信息\n** 除页面内容\n** 添加垃圾外部链接\n** 插入无意义文字\n** 恐吓行为/骚扰\n** 滥用多个账户\n** 不能接受的用户名",
+       "ipbreason-dropdown": "*常见封禁原因\n** 插入虚假信息\n** 除页面内容\n** 添加垃圾外部链接\n** 插入无意义文字\n** 恐吓行为/骚扰\n** 滥用多个账户\n** 不能接受的用户名",
        "ipb-hardblock": "阻止登录用户使用该IP地址编辑",
        "ipbcreateaccount": "阻止创建新账号",
        "ipbemailban": "阻止用户发送电子邮件",
        "change-blocklink": "更改封禁",
        "contribslink": "贡献",
        "emaillink": "发送电子邮件",
-       "autoblocker": "因为您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。\n$1被封禁的理由是“$2”",
+       "autoblocker": "因为您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。$1被封禁的理由是“$2”",
        "blocklogpage": "封禁日志",
        "blocklog-showlog": "该用户曾被封禁。下面提供封禁日志以供参考:",
        "blocklog-showsuppresslog": "该用户曾被封禁并隐藏。下面提供封锁日志以供参考:",
        "proxyblockreason": "您的IP地址为已被封禁的公开代理。请联系您的互联网服务提供商或技术支持者,并告知他们此严重的安全问题。",
        "sorbsreason": "在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理。",
        "sorbs_create_account_reason": "在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理,因此您不能创建新账户。",
+       "softblockrangesreason": "您的IP地址($1)不允许匿名贡献。请登录。",
        "xffblockreason": "您或您正在使用的代理服务器呈现在X-Forwarded-For数据包头的一个IP地址已被封禁。封禁原因为:$1",
        "cant-see-hidden-user": "您尝试封禁的用户已被封禁并隐藏。\n由于您尚无隐藏用户的权限,您无法查看或编辑此用户的封禁。",
        "ipbblocked": "您无法封禁或解封其他用户,因为您自己已被封禁",
        "cant-move-to-user-page": "您没有权限移动页面至用户页面(用户子页面除外)。",
        "cant-move-category-page": "您没有权限移动分类页面。",
        "cant-move-to-category-page": "您没有权限移动页面至分类页面。",
+       "cant-move-subpages": "您没有权限移动子页面。",
+       "namespace-nosubpages": "名字空间“$1”不允许子页面。",
        "newtitle": "新标题:",
        "move-watch": "监视来源页面和目标页面",
        "movepagebtn": "移动页面",
        "import-nonewrevisions": "没有导入版本(所有都已存在或因错误跳过)。",
        "xml-error-string": "$1于行$2,列$3($4字节):$5",
        "import-upload": "上传XML数据",
-       "import-token-mismatch": "会话数据丢失。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
+       "import-token-mismatch": "会话数据丢失。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "import-invalid-interwiki": "不能从指定的wiki导入。",
        "import-error-edit": "页面“$1”未导入,因为您不被允许编辑它。",
        "import-error-create": "页面“$1”未导入,因为您不被允许创建它。",
        "interlanguage-link-title-nonlang": "$1——$2",
        "common.css": "/* 这里放置的CSS将应用于所有皮肤 */",
        "print.css": "/* 这里放置的CSS将影响打印输出 */",
-       "noscript.css": "/* 这里放置的CSS将影响用JavaScript的用户 */",
+       "noscript.css": "/* 这里放置的CSS将影响用JavaScript的用户 */",
        "group-autoconfirmed.css": "/* 这里放置的CSS将只影响自动确认用户 */",
        "group-user.css": "/* 这里放置的CSS将只影响注册用户 */",
        "group-bot.css": "/* 这里放置的CSS将只影响机器人 */",
        "group-bureaucrat.css": "/* 这里放置的CSS将只影响行政员 */",
        "common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
        "group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
-       "group-user.js": "/* 放置于此的JavaScript将只为注册用户加载 */",
+       "group-user.js": "/* 这里的任何JavaScript将只为注册用户加载 */",
        "group-bot.js": "/* 这里的任何JavaScript将只为机器人加载 */",
        "group-sysop.js": "/* 这里的任何JavaScript将只为管理员加载 */",
        "group-bureaucrat.js": "/* 这里的任何JavaScript将只为行政员加载 */",
        "siteuser": "{{SITENAME}}用户$1",
        "anonuser": "{{SITENAME}}匿名用户$1",
        "lastmodifiedatby": "本页面被$3最后修改于$1 $2。",
-       "othercontribs": "å\9fºäº\8e$1ç\9a\84å·¥ä½\9cã\80\82",
+       "othercontribs": "å\9fºäº\8e$1ç\9a\84å\8a³å\8a¨æ\88\90æ\9e\9cã\80\82",
        "others": "其他",
        "siteusers": "{{SITENAME}}{{PLURAL:$2|{{GENDER:$1|用户}}}}$1",
        "anonusers": "{{SITENAME}}匿名{{PLURAL:$2|用户}}$1",
        "pageinfo-length": "页面长度(字节)",
        "pageinfo-article-id": "页面ID",
        "pageinfo-language": "页面内容语言",
+       "pageinfo-language-change": "更改",
        "pageinfo-content-model": "页面内容类型",
        "pageinfo-content-model-change": "更改",
        "pageinfo-robot-policy": "爬虫索引",
        "pageinfo-recent-edits": "最近编辑数(过去$1内)",
        "pageinfo-recent-authors": "最近的不同作者数",
        "pageinfo-magic-words": "魔术字($1)",
-       "pageinfo-hidden-categories": "隐藏分类($1)",
+       "pageinfo-hidden-categories": "隐藏{{PLURAL:$1|分类}}($1)",
        "pageinfo-templates": "使用的模板($1)",
        "pageinfo-transclusions": "包含该页的页面($1)",
        "pageinfo-toolboxlink": "页面信息",
        "previousdiff": "←上一编辑",
        "nextdiff": "下一编辑→",
        "mediawarning": "<strong>警告:</strong>该文件类型可能含有恶意代码。执行后您的系统可能受损。",
-       "imagemaxsize": "图像尺寸限制:<br />''(文件说明页面)''",
+       "imagemaxsize": "图像尺寸限制:<br /><em>(文件说明页面)</em>",
        "thumbsize": "缩略图尺寸:",
        "widthheightpage": "$1×$2,$3页",
        "file-info": "文件大小:$1,MIME类型:$2",
        "seconds": "$1秒",
        "minutes": "$1分",
        "hours": "$1小时",
-       "days": "$1天",
+       "days": "{{PLURAL:$1|$1天}}",
        "weeks": "$1周",
        "months": "$1个月",
        "years": "$1年",
        "variantname-gan-hant": "hant",
        "variantname-kk-cyrl": "kk-cyrl",
        "metadata": "元数据",
-       "metadata-help": "此文件中包含有扩展的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。\n\n如果此文件的源文件已经被修改,一些信息在修改后的文件中将不能完全反映出来。",
+       "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",
        "htmlform-user-not-exists": "<strong>$1</strong>不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong>不是一个有效的用户名。",
        "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
+       "logentry-delete-delete_redir": "$1通过覆盖{{GENDER:$2|删除}}重定向$3",
        "logentry-delete-restore": "$1{{GENDER:$2|还原}}页面$3",
        "logentry-delete-event": "$1{{GENDER:$2|更改}}$3的{{PLURAL:$5|$5个日志事件}}的可见性:$4",
        "logentry-delete-revision": "$1{{GENDER:$2|更改}}页面$3的{{PLURAL:$5|$5个版本}}的可见性:$4",
        "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": "返回",
        "feedback-bugcheck": "请检查本bug是否为[$1 已知bug]。",
        "feedback-useragent": "用户代理:",
        "searchsuggest-search": "搜索{{SITENAME}}",
        "searchsuggest-containing": "含有...",
-       "api-error-autoblocked": "您的IP地址已被自动封禁,因为它曾被一位已封禁用户使用。",
-       "api-error-badaccess-groups": "您没有将文件上传到此 wiki 的权限。",
        "api-error-badtoken": "内部错误:会话无效。",
-       "api-error-blocked": "您已被封禁,不能编辑。",
-       "api-error-copyuploaddisabled": "通过URL上传的功能已被此服务器禁用。",
-       "api-error-duplicate": "在网站上已经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}}。",
-       "api-error-duplicate-archive": "在网站上曾经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}},但已被删除。",
-       "api-error-empty-file": "您提交的文件是空的。",
        "api-error-emptypage": "不能创建没有内容的新页面。",
-       "api-error-fetchfileerror": "内部错误:获取文件时发生错误。",
-       "api-error-fileexists-forbidden": "名为$1的文件已经存在而且无法覆盖。",
-       "api-error-fileexists-shared-forbidden": "名为$1的文件已经存在于共享媒体库中而且无法覆盖。",
-       "api-error-file-too-large": "您提交的文件过大。",
-       "api-error-filename-tooshort": "文件名过短。",
-       "api-error-filetype-banned": "此类文件被禁止。",
-       "api-error-filetype-banned-type": "$1{{PLURAL:$4|不是允许的文件类型}}。允许的{{PLURAL:$3|文件类型是|文件类型有}}$2。",
-       "api-error-filetype-missing": "该文件没有扩展名。",
-       "api-error-hookaborted": "您试图进行的修改被一个扩展钩子终止。",
-       "api-error-http": "内部错误:无法连接到服务器。",
-       "api-error-illegal-filename": "文件名非法。",
-       "api-error-internal-error": "内部错误:此wiki在处理您的上传数据时出现了错误。",
-       "api-error-invalid-file-key": "内部错误:找不到临时文件。",
-       "api-error-missingparam": "内部错误:请求中缺少参数。",
-       "api-error-missingresult": "内部错误:无法确定是否复制成功。",
-       "api-error-mustbeloggedin": "您必须登录后再上传文件。",
-       "api-error-mustbeposted": "内部错误:请求需要HTTP POST",
-       "api-error-noimageinfo": "上传成功,但服务器没有给我们任何该文件的信息。",
-       "api-error-nomodule": "内部错误:缺少上传模块集。",
-       "api-error-ok-but-empty": "内部错误:服务器没有响应。",
-       "api-error-overwrite": "不允许覆盖现有文件。",
-       "api-error-ratelimited": "您正在尝试在比该wiki允许时间更短的时间内上传更多文件。请等待几分钟后再试。",
-       "api-error-stashfailed": "内部错误:服务器保存临时文件失败。",
        "api-error-publishfailed": "内部错误:服务器发布临时文件失败。",
-       "api-error-stasherror": "上传文件存档时出现错误。",
-       "api-error-stashedfilenotfound": "试图从藏匿处上传时找不到藏匿的文件。",
-       "api-error-stashpathinvalid": "找到的藏匿文件的路径是无效的。",
-       "api-error-stashfilestorage": "存储文件至藏匿处时出错。",
-       "api-error-stashzerolength": "服务器不能藏匿文件,因为它已经没有藏匿空间。",
-       "api-error-stashnotloggedin": "您必须登录以保存文件至上传藏匿处。",
-       "api-error-stashwrongowner": "您试图在藏匿处访问的文件不属于您。",
-       "api-error-stashnosuchfilekey": "您试图在藏匿处访问的文件密钥不存在。",
-       "api-error-timeout": "服务器没有在预期内响应。",
-       "api-error-unclassified": "出现未知错误。",
-       "api-error-unknown-code": "未知错误:“$1”。",
-       "api-error-unknown-error": "内部错误:尝试上传文件时出错。",
-       "api-error-unknown-warning": "未知的警告:“$1”。",
+       "api-error-stashfailed": "内部错误:服务器保存临时文件失败。",
+       "api-error-unknown-warning": "未知警告:“$1”。",
        "api-error-unknownerror": "未知错误:$1。",
-       "api-error-uploaddisabled": "该wiki停用上传。",
-       "api-error-verification-error": "该文件可能损坏或扩展名错误。",
-       "api-error-was-deleted": "此名称的文件曾被上传,随后被删除。",
        "duration-seconds": "$1秒",
        "duration-minutes": "$1分",
        "duration-hours": "$1小时",
        "expand_templates_generate_xml": "显示XML语法树",
        "expand_templates_generate_rawhtml": "显示原始HTML",
        "expand_templates_preview": "预览",
-       "expand_templates_preview_fail_html": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请再次重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
+       "expand_templates_preview_fail_html": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请再次重试。</strong>如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "expand_templates_preview_fail_html_anon": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</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已设置为wiki的默认内容语言。",
+       "pagelang-db-failed": "数据库更改页面语言失败。",
        "right-pagelang": "更改页面语言",
        "action-pagelang": "更改页面语言",
        "log-name-pagelang": "语言更改日志",
        "mediastatistics-header-audio": "音频",
        "mediastatistics-header-video": "视频",
        "mediastatistics-header-multimedia": "富媒体",
-       "mediastatistics-header-office": "办公文件",
+       "mediastatistics-header-office": "文档",
        "mediastatistics-header-text": "文本",
        "mediastatistics-header-executable": "可执行文件",
        "mediastatistics-header-archive": "压缩格式",
        "special-characters-title-emdash": "长划线",
        "special-characters-title-minus": "减号",
        "mw-widgets-dateinput-no-date": "没有选定日期",
+       "mw-widgets-mediasearch-input-placeholder": "搜索媒体",
+       "mw-widgets-mediasearch-noresults": "找不到结果。",
        "mw-widgets-titleinput-description-new-page": "页面不存在",
        "mw-widgets-titleinput-description-redirect": "重定向至$1",
+       "mw-widgets-categoryselector-add-category-placeholder": "添加分类...",
+       "mw-widgets-usersmultiselect-placeholder": "添加更多...",
        "sessionmanager-tie": "不能结合多个请求的身份验证类型:$1。",
        "sessionprovider-generic": "$1会话",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "基于cookie的会话",
        "sessionprovider-nocookies": "Cookie可能已被禁用。确保您已启用cookie,并重试。",
        "randomrootpage": "随机根页面",
        "log-action-filter-block": "封禁类型:",
-       "log-action-filter-contentmodel": "内容模型改的类型:",
+       "log-action-filter-contentmodel": "内容模型改的类型:",
        "log-action-filter-delete": "删除类型:",
        "log-action-filter-import": "导入的类型:",
        "log-action-filter-managetags": "标签管理行为的类型:",
        "log-action-filter-block-block": "封禁",
        "log-action-filter-block-reblock": "封禁修改",
        "log-action-filter-block-unblock": "解封",
-       "log-action-filter-contentmodel-change": "内容型的更改",
-       "log-action-filter-contentmodel-new": "带有非标准内容模型的页面的更改",
+       "log-action-filter-contentmodel-change": "内容型的更改",
+       "log-action-filter-contentmodel-new": "带有非默认内容模型的页面的更改",
        "log-action-filter-delete-delete": "页面删除",
+       "log-action-filter-delete-delete_redir": "重定向覆盖",
        "log-action-filter-delete-restore": "页面还原",
        "log-action-filter-delete-event": "日志删除",
        "log-action-filter-delete-revision": "修订版本删除",
        "changecredentials": "更改凭据",
        "changecredentials-submit": "更改凭据",
        "changecredentials-invalidsubpage": "$1不是有效的凭据类型。",
-       "changecredentials-success": "您的证书已被更改。",
+       "changecredentials-success": "您的凭据已被更改。",
        "removecredentials": "移除凭据",
-       "removecredentials-submit": "移除证书",
+       "removecredentials-submit": "移除凭据",
        "removecredentials-invalidsubpage": "$1不是有效的凭据类型。",
        "removecredentials-success": "您的证书已被移除。",
        "credentialsform-provider": "凭据类型:",
        "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>",
-       "edit-error-short": "错误:$1",
-       "edit-error-long": "错误:\n\n$1"
+       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "修订版本$1",
+       "pageid": "页面ID$1"
 }
index ee7ce7c..2896d34 100644 (file)
                        "Cosine02",
                        "一個正常人",
                        "Wehwei",
-                       "1233thehongkonger"
+                       "1233thehongkonger",
+                       "Maskers",
+                       "Knch903",
+                       "Winstonyin",
+                       "Wmr"
                ]
        },
        "tog-underline": "底線標示連結:",
@@ -88,7 +92,7 @@
        "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
-       "tog-editondblclick": "é\96\8bå\95\9fæ»\91é¼ é\9b\99æ\93\8a編輯頁面",
+       "tog-editondblclick": "é\9b\99æ\93\8aæ»\91é¼ 編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
        "tog-watchdefault": "將我編輯的頁面和檔案加入監視清單",
        "oct": "10 月",
        "nov": "11 月",
        "dec": "12 月",
-       "january-date": "一月 $1 日",
-       "february-date": "二月 $1 日",
-       "march-date": "三月 $1 日",
-       "april-date": "四月 $1 日",
-       "may-date": "五月 $1 日",
-       "june-date": "六月 $1 日",
-       "july-date": "七月 $1 日",
-       "august-date": "八月 $1 日",
-       "september-date": "九月 $1 日",
-       "october-date": "十月 $1 日",
-       "november-date": "十一月 $1 日",
-       "december-date": "十二月 $1 日",
+       "january-date": "1月$1日",
+       "february-date": "2月$1日",
+       "march-date": "3月$1日",
+       "april-date": "4月$1日",
+       "may-date": "5月$1日",
+       "june-date": "6月$1日",
+       "july-date": "7月$1日",
+       "august-date": "8月$1日",
+       "september-date": "9月$1日",
+       "october-date": "10月$1日",
+       "november-date": "11月$1日",
+       "december-date": "12月$1日",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|分類|$1 個分類}}",
-       "category_header": "分類 \"$1\" 中的頁面",
+       "category_header": "分類「$1」中的頁面",
        "subcategories": "子分類",
        "category-media-header": "分類 \"$1\" 中的媒體",
        "category-empty": "<em>此分類目前未包含頁面或媒體。</em>",
        "searcharticle": "執行",
        "history": "頁面歷史",
        "history_short": "歷史",
-       "updatedmarker": "自我上次造訪後的更新",
+       "history_small": "歷史",
+       "updatedmarker": "自我上次瀏覽之後的更新",
        "printableversion": "可列印版",
        "permalink": "靜態連結",
        "print": "列印",
        "views": "檢視",
        "toolbox": "工具",
        "tool-link-userrights": "更改{{GENDER:$1|使用者}}群組",
+       "tool-link-userrights-readonly": "檢視{{GENDER:$1|使用者}}群組",
        "tool-link-emailuser": "寄信給這位{{GENDER:$1|使用者}}",
        "userpage": "檢視使用者頁面",
        "projectpage": "檢視專案頁面",
        "redirectpagesub": "重新導向頁面",
        "redirectto": "重新導向至:",
        "lastmodifiedat": "此頁面最後修改於 $1 $2。",
-       "viewcount": "此頁面已被檢視過 $1 次。",
+       "viewcount": "此頁面已被檢視過 {{PLURAL:$1|$1 次}}。",
        "protectedpage": "受保護頁面",
        "jumpto": "前往:",
        "jumptonavigation": "導覽",
        "ok": "確定",
        "retrievedfrom": "取自 \"$1\"",
        "youhavenewmessages": "您有 $1 ($2)。",
-       "youhavenewmessagesfromusers": "有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的 $1 ($2)。",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|您}}有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的 $1 ($2)。",
        "youhavenewmessagesmanyusers": "你有來自多位使用者的 $1 ($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|一則新訊息|999=新訊息}}",
        "newmessagesdifflinkplural": "最近{{PLURAL:$1|變更}}",
        "botpasswords-label-delete": "刪除",
        "botpasswords-label-resetpassword": "重設密碼",
        "botpasswords-label-grants": "適用的權限:",
-       "botpasswords-help-grants": "æ¯\8få\80\8bæ\8e\88æ¬\8aæ\9c\83給äº\88æ\93\81æ\9c\89該æ\8e\88æ¬\8aç\9a\84使ç\94¨è\80\85帳è\99\9få\88\97æ\96¼è©²æ\8e\88æ¬\8aæ¸\85å\96®ç\9a\84使ç\94¨è\80\85æ¬\8aé\99\90ã\80\82 請參考 [[Special:ListGrants|授權表]] 取得更多資訊。",
+       "botpasswords-help-grants": "æ\8e\88æ¬\8aå\8f¯ä»¥å\85\81許æ\82¨å­\98å\8f\96æ\82¨ç\9a\84使ç\94¨è\80\85帳è\99\9få·²ç¶\93æ\93\81æ\9c\89ç\9a\84æ¬\8aé\99\90ï¼\8cä½\86å\9c¨æ­¤é\96\8bå\95\9fæ\8e\88æ¬\8a並ä¸\8dæ\9c\83è®\93æ\82¨ç\9a\84使ç\94¨è\80\85帳è\99\9få\8f¯ä»¥å­\98å\8f\96é\82£äº\9bæ\82¨ä¸¦æ\9cªæ\93\81æ\9c\89ç\9a\84æ¬\8aé\99\90ã\80\82請參考 [[Special:ListGrants|授權表]] 取得更多資訊。",
        "botpasswords-label-grants-column": "已授權",
        "botpasswords-bad-appid": "機器人名稱 \"$1\" 無效。",
        "botpasswords-insert-failed": "新增機器人名稱 \"$1\" 失敗,是否已新增過?",
        "botpasswords-update-failed": "更新機器人名稱 \"$1\" 失敗,是否已刪除過?",
        "botpasswords-created-title": "已建立機器人密碼",
-       "botpasswords-created-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已建立。",
+       "botpasswords-created-body": "給使用者 \"$2\" 的機器人 \"$1\" 的機器人密碼已建立。",
        "botpasswords-updated-title": "已更新機器人密碼",
-       "botpasswords-updated-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已更新。",
+       "botpasswords-updated-body": "給使用者 \"$2\" 的機器人 \"$1\" 的機器人密碼已更新。",
        "botpasswords-deleted-title": "已刪除機器人密碼",
-       "botpasswords-deleted-body": "使用者''$2\"所擁有的機器人\"$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": "BotPasswordsSessionProvider 無法使用。",
        "botpasswords-restriction-failed": "機器人密碼限制已拒絕此次登入。",
        "passwordreset-emaildisabled": "此 Wiki 已停用電子郵件功能。",
        "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您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
        "passwordreset-emailsentemail": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsentusername": "若此確實為您使用者名稱所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
-       "passwordreset-emailsent-capture2": "密碼重設{{PLURAL:$1|郵件|郵件}}已寄出,{{PLURAL:$1|使用者名稱與密碼|使用者名稱與密碼清單}}如下顯示。",
-       "passwordreset-emailerror-capture2": "寄發電子郵件給{{GENDER:$2|使用者}}失敗:$1,{{PLURAL:$3|使用者名稱與密碼|使用者名稱與密碼清單}}如下顯示。",
        "passwordreset-nocaller": "必須提供 caller",
        "passwordreset-nosuchcaller": "Caller 不存在:$1",
        "passwordreset-ignored": "未處理密碼重設動作,可能尚未設定提供者?",
        "blockedtitle": "使用者已被封鎖",
        "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
        "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細資料。",
+       "systemblockedtext": "您的使用者名稱或IP位址已被MediaWiki自動封禁。原因如下:\n\n:<em>$2</em>\n\n* 開始時間:$8\n* 結束時間:$6\n* 被封禁使用者:$7\n\n您目前的IP位址是$3。請在作出任何查詢時包含上述所有詳情。",
        "blockednoreason": "未說明原因",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
        "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件地址。",
        "revdelete-unsuppress": "移除已還原修訂上的顯示限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "套用至已選取的{{PLURAL:$1|一筆|多筆}}修訂",
-       "revdelete-success": "å·²æ\88\90å\8a\9fæ\9b´æ\96°æª¢ç¤ºä¿®è¨\82å\85§å®¹ç\9a\84æ¬\8aé\99\90設å®\9a。",
+       "revdelete-success": "å·²æ\9b´æ\96°ä¿®è¨\82ç\9a\84å\8f¯è¦\8bæ\80§。",
        "revdelete-failure": "無法更新修訂的顯示設定:\n$1",
-       "logdelete-success": "已成功更新檢視日誌的權限設定。",
+       "logdelete-success": "已設定日誌的可見性。",
        "logdelete-failure": "無法更新日誌的顯示設定:\n$1",
-       "revdel-restore": "變更能見度",
+       "revdel-restore": "變更可見性",
        "pagehist": "頁面歷史",
        "deletedhist": "已刪除歷史",
        "revdelete-hide-current": "隱藏於 $1 $2 的項目錯誤:此為目前的修訂,不可隱藏。",
        "search-external": "外部搜尋",
        "searchdisabled": "{{SITENAME}} 已停用搜尋功能。\n您可以改透過 Google 搜尋。\n請注意,在 Google 中搜尋到的 {{SITENAME}} 頁面內容可能不是最新的。",
        "search-error": "搜尋時發生錯誤:$1",
+       "search-warning": "搜尋時發生錯誤:$1",
        "preferences": "偏好設定",
        "mypreferences": "偏好設定",
        "prefs-edits": "編輯次數:",
        "saveprefs": "儲存",
        "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-editing": "編輯",
-       "rows": "橫行數:",
-       "columns": "直行數:",
        "searchresultshead": "搜尋",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "stub-threshold-sample-link": "樣本",
        "prefswarning-warning": "您對您的偏好設定所做的變更尚未儲存。\n若您未點選 \"$1\" 離開此頁面,將不會更新您的偏好設定。",
        "prefs-tabs-navigation-hint": "提示:您可使用左、右方向鍵切換頁籤。",
        "userrights": "使用者權限管理",
-       "userrights-lookup-user": "管理使用者群組",
+       "userrights-lookup-user": "選擇用戶",
        "userrights-user-editname": "請輸入使用者名稱:",
-       "editusergroup": "編輯{{GENDER:$1|使用者}}群組",
+       "editusergroup": "載入使用者群組",
        "editinguser": "變更{{GENDER:$1|使用者}} <strong>[[User:$1|$1]]</strong> 的使用者權限 $2",
+       "viewinguserrights": "檢視{{GENDER:$1|使用者}}<strong>[[User:$1|$1]]</strong>的使用者權限 $2",
        "userrights-editusergroup": "編輯使用者群組",
+       "userrights-viewusergroup": "檢視使用者群組",
        "saveusergroups": "儲存{{GENDER:$1|使用者}}群組",
        "userrights-groupsmember": "所屬群組:",
        "userrights-groupsmember-auto": "所屬隱含群組:",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您沒有權限去編輯其他 Wiki 上的使用者權限。",
        "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
-       "userrights-nologin": "您必須 [[Special:UserLogin|登入]] 管理員帳號以指定使用者權限。",
-       "userrights-notallowed": "您沒有權限加入或刪除使用者權限。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
+       "userrights-expiry-othertime": "其他時間:",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
-       "userrights-removed-self": "您已移除自己的權限,故您已無法再次存取此頁面。",
        "group": "群組:",
        "group-user": "使用者",
        "group-autoconfirmed": "自動確認的使用者",
        "right-siteadmin": "鎖定和解除鎖定資料庫",
        "right-override-export-depth": "匯出頁面包含連結內容,深度上限為 5 層",
        "right-sendemail": "傳送電子郵件聯絡其他使用者",
-       "right-passwordreset": "檢視重設密碼電子郵件",
        "right-managechangetags": "建立並自資料庫 (取消) 啟用 [[Special:Tags|標籤]]",
        "right-applychangetags": "連同某個人的變更一起套用[[Special:Tags|標籤]]",
        "right-changetags": "加入與移除任何於各別修訂與日誌項目的[[Special:Tags|標籤]]",
        "action-upload_by_url": "使用 URL 上傳此檔案",
        "action-writeapi": "使用寫入 API",
        "action-delete": "刪除此頁面",
-       "action-deleterevision": "刪除此修訂",
-       "action-deletedhistory": "檢視此頁面的刪除歷史",
+       "action-deleterevision": "刪除修訂",
+       "action-deletelogentry": "删除日誌記錄",
+       "action-deletedhistory": "檢視頁面的刪除歷史",
+       "action-deletedtext": "查看已刪除的修訂版本文字",
        "action-browsearchive": "搜尋已刪除頁面",
-       "action-undelete": "取消刪除頁面",
-       "action-suppressrevision": "檢閱與還原隱藏修訂",
+       "action-undelete": "取消刪除頁面",
+       "action-suppressrevision": "檢閱與還原隱藏修訂",
        "action-suppressionlog": "檢視此非公開日誌",
        "action-block": "封鎖此使用者的編輯權限",
        "action-protect": "變更此頁面的保護層級",
        "action-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
        "action-siteadmin": "鎖定或解除鎖定資料庫",
        "action-sendemail": "傳送電子郵件",
+       "action-editmyoptions": "編輯自己的偏好設定",
        "action-editmywatchlist": "編輯您的監視清單",
        "action-viewmywatchlist": "檢視您的監視清單",
        "action-viewmyprivateinfo": "檢視您的個人資訊",
        "action-applychangetags": "連同您的變更一起套用標籤",
        "action-changetags": "加入與移除任何於各別修訂與日誌項目的標籤",
        "action-deletechangetags": "從資料庫刪除標籤",
-       "action-purge": "刷新此頁面",
+       "action-purge": "清除此頁面",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
        "enhancedrc-history": "歷史",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "顯示",
+       "rcfilters-activefilters": "現用過濾規則",
+       "rcfilters-search-placeholder": "過濾最近變更(瀏覽或開始輸入)",
+       "rcfilters-invalid-filter": "過濾規則無效",
+       "rcfilters-filterlist-title": "篩選器",
+       "rcfilters-filterlist-noresults": "找不到過濾規則",
+       "rcfilters-filtergroup-authorship": "編輯者",
+       "rcfilters-filter-editsbyself-label": "您自己的編輯",
+       "rcfilters-filter-editsbyself-description": "您的編輯。",
+       "rcfilters-filter-editsbyother-label": "其他人的編輯",
+       "rcfilters-filter-editsbyother-description": "由其他使用者而非您所作的編輯。",
+       "rcfilters-filtergroup-userExpLevel": "經驗等級 (僅限已註冊的使用者)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "新手",
+       "rcfilters-filter-userExpLevel-newcomer-description": "編輯數低於 10 次,活躍低於 4 天。",
+       "rcfilters-filter-userExpLevel-learner-label": "初學者",
+       "rcfilters-filter-userExpLevel-learner-description": "活躍的天數以及編輯數比「新手」多,但比「有經驗的使用者」少。",
+       "rcfilters-filter-userExpLevel-experienced-label": "有經驗的使用者",
+       "rcfilters-filter-userExpLevel-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的新變更",
        "rcshowhideminor": "$1 小修訂",
        "uploaded-setting-handler-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用 remote/data/script 設定 \"handler\" 屬性。",
        "uploaded-remote-url-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用任何遠端 URL 設定樣式。",
        "uploaded-image-filter-svg": "於已上傳的 SVG 檔案中找到圖片過濾器使用 URL:<code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"$1\"。",
+       "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"<nowiki>$1</nowiki>\"。",
        "uploadinvalidxml": "無法解析已上傳檔案中的 XML。",
        "uploadvirus": "該檔案含有病毒!\n詳細資料:$1",
        "uploadjava": "該檔案為包含 Java .class 檔案的 ZIP 檔案。\n因 Java 檔案可能跳過安全檢查造成安全性問題,不允許上傳 Java 檔案。",
        "mostimages": "被連結最多的檔案",
        "mostinterwikis": "最多跨 Wiki 連結的頁面",
        "mostrevisions": "最多修訂的頁面",
-       "prefixindex": "æ\89\80æ\9c\89é \81é\9d¢è\88\87å­\97é¦\96",
-       "prefixindex-namespace": "æ\89\80æ\9c\89å\90«å­\97é¦\96ç\9a\84頁面 ($1 命名空間)",
+       "prefixindex": "æ\8c\89è©\9eé ­æ\9f¥è©¢é \81é\9d¢",
+       "prefixindex-namespace": "æ\8c\89è©\9eé ­æ\9f¥è©¢頁面 ($1 命名空間)",
        "prefixindex-submit": "顯示",
-       "prefixindex-strip": "於清單中省略首",
+       "prefixindex-strip": "於清單中省略首",
        "shortpages": "過短的頁面",
        "longpages": "過長的頁面",
        "deadendpages": "無連結頁面",
        "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 (所有值)",
        "booksources": "圖書資源",
        "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
        "booksources-search": "搜尋",
        "booksources-text": "下列清單包含其他銷售新書籍或二手書籍的網站連結,可會有你想尋找書籍的進一部資訊:",
        "booksources-invalid-isbn": "您提供的 ISBN 不正確,請檢查複製的來源是否有誤。",
+       "magiclink-tracking-rfc": "使用 RFC 魔法連結的頁面",
+       "magiclink-tracking-rfc-desc": "此頁面使用 RFC 魔法連結的頁面,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] 的如何遷移。",
+       "magiclink-tracking-pmid": "使用 PMID 魔法連結的頁面",
+       "magiclink-tracking-pmid-desc": "此頁面使用 PMID 魔法連結的頁面,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] 的如何遷移。",
+       "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}}:使用者 表示使用者):",
        "log": "日誌",
        "allarticles": "所有頁面",
        "allinnamespace": "所有頁面 ($1 命名空間)",
        "allpagessubmit": "執行",
-       "allpagesprefix": "顯示以此為字首頁面:",
+       "allpagesprefix": "根據詞首查詢頁面",
        "allpagesbadtitle": "指定的頁面標題無效、包含內部語言或內部 Wiki 的字首。\n它可能包含一個或多個的不能用於標題的字元。",
        "allpages-bad-ns": "{{SITENAME}} 沒有 \"$1\" 命名空間。",
        "allpages-hide-redirects": "隱藏重新導向頁面",
        "activeusers-count": "最近 $3 天內有 $1 次動作",
        "activeusers-from": "顯示使用者開始自:",
        "activeusers-groups": "顯示屬於以下群組的使用者:",
+       "activeusers-excludegroups": "排除屬於以下群組的使用者:",
        "activeusers-noresult": "查無使用者。",
        "activeusers-submit": "顯示活動中的使用者",
        "listgrouprights": "使用者群組權限",
        "listgrouprights-addgroup-all": "加入所有群組",
        "listgrouprights-removegroup-all": "移除所有群組",
        "listgrouprights-addgroup-self": "在自己的帳號中加入的{{PLURAL:$2|一個|多個}}群組: $1",
-       "listgrouprights-removegroup-self": "在自己的帳號中移除的{{PLURAL:$2|一個|多個}}群組: $1",
+       "listgrouprights-removegroup-self": "移除自己帳號中的{{PLURAL:$2|一個|多個}}群組: $1",
        "listgrouprights-addgroup-self-all": "在自己的帳號中加入所有群組",
-       "listgrouprights-removegroup-self-all": "在自己的帳號中移除所有群組",
+       "listgrouprights-removegroup-self-all": "移除自己帳號中的所有群組",
        "listgrouprights-namespaceprotection-header": "命名空間限制",
        "listgrouprights-namespaceprotection-namespace": "命名空間",
        "listgrouprights-namespaceprotection-restrictedto": "允許使用者編輯的權限",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能{{GENDER:$1|寄給}} {{GENDER:$1|$2}}。",
+       "emailuserfooter": "這封電子郵件是由$1透過{{SITENAME}}的「{{int:emailuser}}」功能{{GENDER:$1|寄給}}{{GENDER:$1|$2}}的。{{GENDER:$2|您的}}郵件將直接寄往{{GENDER:$1|原發件人}},{{GENDER:$1|他|她|他}}將能夠看到您的電子郵件地址。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "changecontentmodel-emptymodels-title": "沒有內容模型可用",
        "changecontentmodel-emptymodels-text": "[[:$1]]上的內容不能轉換為任何類型。",
        "log-name-contentmodel": "內容模型變更日誌",
-       "log-description-contentmodel": "與頁面內容模型相關的事件",
+       "log-description-contentmodel": "此頁列舉頁面內容模型的變更記錄以及使用非預設的內容模型所創建的頁面。",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|已使用}}非預設的內容模型 \"$5\" 建立頁面 $3",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|已變更}}頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
        "logentry-contentmodel-change-revertlink": "還原",
        "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]]",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯絡您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
        "sorbs_create_account_reason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
+       "softblockrangesreason": "您的IP位址($1)不允許匿名貢獻,請登入。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "cant-move-to-user-page": "您沒有權限移動頁面至使用者頁面 (除使用者子頁面外)。",
        "cant-move-category-page": "您沒有權限移動分類頁面。",
        "cant-move-to-category-page": "您沒有權限移動頁面至分類頁面。",
+       "cant-move-subpages": "您沒有權限移動子頁面。",
+       "namespace-nosubpages": "名字空間「$1」不允許有子頁面。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁面",
        "movepagebtn": "移動頁面",
        "import-mapping-namespace": "匯入至命名空間:",
        "import-mapping-subpage": "匯入做為以下頁面的子頁面:",
        "import-upload-filename": "檔案名稱:",
-       "import-comment": "註解:",
+       "import-comment": "è©\95è«\96:",
        "importtext": "請使用 [[Special:Export|匯出工具]] 從來源 Wiki 匯出檔案,\n儲存至您的電腦後再上傳到這裡。",
        "importstart": "正在匯入頁面...",
        "import-revision-count": "$1 個修訂",
        "pageinfo-length": "頁面長度 (位元組)",
        "pageinfo-article-id": "頁面 ID",
        "pageinfo-language": "頁面內容語言",
+       "pageinfo-language-change": "變更",
        "pageinfo-content-model": "頁面內容模型",
        "pageinfo-content-model-change": "變更",
        "pageinfo-robot-policy": "由機器人建立索引",
        "markaspatrolleddiff": "標記為已巡查",
        "markaspatrolledtext": "標記此頁面為已巡查",
        "markaspatrolledtext-file": "標記此檔案版本為己巡查",
-       "markedaspatrolled": "標記為已巡查",
+       "markedaspatrolled": "標記為已巡查",
        "markedaspatrolledtext": "已標記選擇的修訂 [[:$1]] 為已巡查。",
        "rcpatroldisabled": "最近變更巡查已停用",
        "rcpatroldisabledtext": "最新變更巡查的功能目前已停用。",
        "log-show-hide-patrol": "$1 巡查日誌",
        "log-show-hide-tag": "$1 標籤日誌",
        "confirm-markpatrolled-button": "確定",
+       "confirm-markpatrolled-top": "標記 $2 的修訂 $3 為已巡查?",
        "deletedrevision": "已刪除舊修訂 $1",
        "filedeleteerror-short": "刪除檔案發生錯誤:$1",
        "filedeleteerror-long": "刪除檔案時發生錯誤:\n\n$1",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
        "metadata": "詮釋資料",
-       "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n若修改此檔案,部份資訊將無法保留。",
+       "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n\n如果已自檔案初始狀態修改,一些詳細說明可能無法反映修改後的檔案。",
        "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",
        "exif-colorspace": "色彩空間",
        "exif-componentsconfiguration": "每像素內含",
        "exif-compressedbitsperpixel": "影像壓縮模式",
-       "exif-pixelxdimension": "å\9c\96ç\89\87寬度",
-       "exif-pixelydimension": "å\9c\96ç\89\87高度",
+       "exif-pixelxdimension": "å½±å\83\8f寬度",
+       "exif-pixelydimension": "å½±å\83\8f高度",
        "exif-usercomment": "使用者評論",
        "exif-relatedsoundfile": "相關的音效檔案",
        "exif-datetimeoriginal": "資料產生的日期時間",
        "exif-source": "來源",
        "exif-editstatus": "圖片社評狀態",
        "exif-urgency": "緊急性",
-       "exif-fixtureidentifier": "夾具名稱",
+       "exif-fixtureidentifier": "Fixture 名稱",
        "exif-locationdest": "描繪地點",
        "exif-locationdestcode": "位置代碼描述",
        "exif-objectcycle": "媒體發生時間",
        "tags-deactivate": "停用",
        "tags-hitcount": "$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\"。",
        "tags-edit-revision-legend": "加入或移除此標籤自{{PLURAL:$1|此修訂|全部 $1 筆修訂}}",
        "tags-edit-logentry-legend": "加入或移除此標籤自{{PLURAL:$1|此日誌項目|全部 $1 筆日誌項目}}",
        "tags-edit-existing-tags": "已存在的標籤:",
-       "tags-edit-existing-tags-none": "''無''",
+       "tags-edit-existing-tags-none": "<em>無</em>",
        "tags-edit-new-tags": "新標籤:",
        "tags-edit-add": "加入這些標籤:",
        "tags-edit-remove": "移除這些標籤:",
        "htmlform-user-not-exists": "<strong>$1</strong> 並不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong> 不是有效的使用者名稱。",
        "logentry-delete-delete": "$1 刪除頁面 $3",
+       "logentry-delete-delete_redir": "$1通過覆蓋,{{GENDER:$2|刪除了}}重定向$3。",
        "logentry-delete-restore": "$1 還原頁面 $3",
        "logentry-delete-event": "$1 {{GENDER:$2|已更改}} $3 中 {{PLURAL:$5|1 筆日誌|$5 筆日誌}}的可見性:$4",
        "logentry-delete-revision": "$1 {{GENDER:$2|已更改}}頁面 $3 中 {{PLURAL:$5|1 筆修訂|$5 筆修訂}}的可見性:$4",
        "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": "取消隱藏編輯摘要",
        "feedback-useragent": "使用者代理:",
        "searchsuggest-search": "搜尋 {{SITENAME}}",
        "searchsuggest-containing": "包含...",
-       "api-error-autoblocked": "您的IP位址已經被自動封禁,因為它曾經被一名已封禁的使用者使用過。",
-       "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:密鑰錯誤。",
-       "api-error-blocked": "您已被封鎖,無法編輯。",
-       "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
-       "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|其他檔案|其他檔案}}。",
-       "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|其他檔案|其他檔案}},但已被刪除。",
-       "api-error-empty-file": "您送出的檔案是空的。",
        "api-error-emptypage": "不允許建立空白的頁面。",
-       "api-error-fetchfileerror": "內部錯誤:取得檔案時發生錯誤。",
-       "api-error-fileexists-forbidden": "名稱為 \"$1\" 的檔案已經存在,並且不能被覆寫。",
-       "api-error-fileexists-shared-forbidden": "名稱為 \"$1\" 的檔案已經存在於共用儲存庫,並且不能被覆寫。",
-       "api-error-file-too-large": "您送出的檔案太大了。",
-       "api-error-filename-tooshort": "檔案名稱過短。",
-       "api-error-filetype-banned": "此檔案類型已禁止使用。",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|不是允許的檔案類型}}。 允許的{{PLURAL:$3|檔案類型有}} $2。",
-       "api-error-filetype-missing": "此檔案名稱缺少副檔名。",
-       "api-error-hookaborted": "您嘗試進行的修改被某個擴充套件中止。",
-       "api-error-http": "內部錯誤:無法連線到伺服器。",
-       "api-error-illegal-filename": "不允許使用的檔案名稱。",
-       "api-error-internal-error": "內部錯誤:此 Wiki 在處理你的上傳時發生錯誤。",
-       "api-error-invalid-file-key": "內部錯誤:於暫存儲存庫中查無檔案。",
-       "api-error-missingparam": "內部錯誤:請求中缺少參數。",
-       "api-error-missingresult": "內部錯誤:無法辨識複製是否成功。",
-       "api-error-mustbeloggedin": "您必須登入方可上傳檔案。",
-       "api-error-mustbeposted": "內部錯誤:請求需使用 HTTP POST。",
-       "api-error-noimageinfo": "已成功上傳,但伺服器未回應任何該檔案的資訊。",
-       "api-error-nomodule": "內部錯誤:缺少上傳模組集。",
-       "api-error-ok-but-empty": "內部錯誤:伺服器沒有回應。",
-       "api-error-overwrite": "不允許覆蓋已存在的檔案。",
-       "api-error-ratelimited": "您正在嘗試在比本wiki所允許時間更短的時間內,上傳更多的檔案。請稍待幾分鐘之後再試一次。",
-       "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
        "api-error-publishfailed": "內部錯誤:伺服器發佈暫存檔案失敗。",
-       "api-error-stasherror": "上傳檔案至儲藏庫時發生錯誤。",
-       "api-error-stashedfilenotfound": "嘗試從儲藏庫上傳檔案時查無該檔案。",
-       "api-error-stashpathinvalid": "應該存在儲藏檔案的路徑無效。",
-       "api-error-stashfilestorage": "儲存檔案至儲藏庫時發生錯誤。",
-       "api-error-stashzerolength": "伺服器無法儲藏該檔案,因為該檔案大小為 0。",
-       "api-error-stashnotloggedin": "您必須登入以儲存檔案於上傳儲藏庫。",
-       "api-error-stashwrongowner": "您嘗試在儲藏庫存取的檔案不屬於您的。",
-       "api-error-stashnosuchfilekey": "您嘗試在儲藏庫存取的檔案金鑰不存在。",
-       "api-error-timeout": "伺服器沒有在預期的時間內回應。",
-       "api-error-unclassified": "發生不明錯誤。",
-       "api-error-unknown-code": "不明錯誤:\"$1\"。",
-       "api-error-unknown-error": "內部錯誤:嘗試上傳您的檔案時發生錯誤。",
+       "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
        "api-error-unknown-warning": "不明警告:\"$1\"。",
        "api-error-unknownerror": "不明錯誤:\"$1\"。",
-       "api-error-uploaddisabled": "此 Wiki 的上傳功能已停用。",
-       "api-error-verification-error": "此檔案可能已損壞,或副檔名錯誤。",
-       "api-error-was-deleted": "與此名稱相同的檔案曾被上傳過,隨後遭到刪除。",
        "duration-seconds": "$1 秒",
        "duration-minutes": "$1 分鐘",
        "duration-hours": "$1 小時",
        "pagelang-language": "語言",
        "pagelang-use-default": "使用預設語言",
        "pagelang-select-lang": "選擇語言",
+       "pagelang-reason": "原因",
        "pagelang-submit": "送出",
+       "pagelang-nonexistent-page": "頁面 $1 不存在。",
+       "pagelang-unchanged-language": "頁面$1的語言已經設為$2。",
+       "pagelang-unchanged-language-default": "頁面$1的語言已經設為wiki的預設內容語言。",
+       "pagelang-db-failed": "資料庫更改頁面語言失敗。",
        "right-pagelang": "變更頁面語言",
        "action-pagelang": "變更頁面語言",
        "log-name-pagelang": "語言變更日誌",
        "special-characters-title-emdash": "長破折號",
        "special-characters-title-minus": "減號",
        "mw-widgets-dateinput-no-date": "未選擇日期",
+       "mw-widgets-mediasearch-input-placeholder": "搜尋媒體",
+       "mw-widgets-mediasearch-noresults": "查無結果。",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
        "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "加入分類...",
        "sessionmanager-tie": "無法合併多個請求認証類型:$1。",
        "sessionprovider-generic": "$1 連線階段",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
        "sessionprovider-nocookies": "Cookie 功能可能已被關閉,請確認您改開啟 Cookie 功能並重新啟動。",
        "randomrootpage": "隨機根頁面",
        "log-action-filter-block": "封鎖類型:",
-       "log-action-filter-contentmodel": "內容模型修改類型:",
+       "log-action-filter-contentmodel": "內容模型變更類型:",
        "log-action-filter-delete": "刪除類型:",
        "log-action-filter-import": "匯入類型:",
        "log-action-filter-managetags": "標籤管理動作類型:",
        "log-action-filter-block-block": "封鎖",
        "log-action-filter-block-reblock": "封鎖修改",
        "log-action-filter-block-unblock": "解除封鎖",
-       "log-action-filter-contentmodel-change": "變更內容模型",
-       "log-action-filter-contentmodel-new": "使用非標準內容模型建立的頁面",
+       "log-action-filter-contentmodel-change": "內容模型的變更",
+       "log-action-filter-contentmodel-new": "使用非預設內容模型建立的頁面",
        "log-action-filter-delete-delete": "頁面刪除",
+       "log-action-filter-delete-delete_redir": "重新導向覆寫",
        "log-action-filter-delete-restore": "頁面取消刪除",
        "log-action-filter-delete-event": "日誌刪除",
        "log-action-filter-delete-revision": "修訂刪除",
        "log-action-filter-newusers-create": "由匿名使用者建立",
        "log-action-filter-newusers-create2": "由註冊使用者建立",
        "log-action-filter-newusers-autocreate": "自動建立",
-       "log-action-filter-newusers-byemail": "使用電子郵件送密碼建立",
+       "log-action-filter-newusers-byemail": "使用電子郵件送密碼建立",
        "log-action-filter-patrol-patrol": "手動巡查",
        "log-action-filter-patrol-autopatrol": "自動巡查",
        "log-action-filter-protect-protect": "保護",
        "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-from-login": "要建立您的帳號,請先填寫欄位。",
        "authmanager-create-not-in-progress": "帳號建立尚未進行或連線階段資料已遺失,請重頭再開始。",
        "authmanager-create-no-primary": "提供的憑證無使用在帳號建立。",
        "authmanager-link-no-primary": "提供的憑證無使用在帳號連結。",
        "authpage-cannot-link-continue": "無法繼續帳號連結,您的連線階段似乎已逾時。",
        "cannotauth-not-allowed-title": "權限不足",
        "cannotauth-not-allowed": "您不被允許使用此頁面",
-       "changecredentials": "更改憑證",
-       "changecredentials-submit": "更改憑證",
+       "changecredentials": "變更認證",
+       "changecredentials-submit": "變更認證",
        "changecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
-       "changecredentials-success": "已更改您的憑證。",
-       "removecredentials": "移除證",
-       "removecredentials-submit": "移除證",
+       "changecredentials-success": "已變更您的認證。",
+       "removecredentials": "移除證",
+       "removecredentials-submit": "移除證",
        "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "removecredentials-success": "已移除您的憑證。",
-       "credentialsform-provider": "證類型:",
+       "credentialsform-provider": "證類型:",
        "credentialsform-account": "帳號名稱:",
        "cannotlink-no-provider-title": "沒有可連結的帳號",
        "cannotlink-no-provider": "沒有可連結的帳號。",
        "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>",
-       "edit-error-short": "錯誤:$1",
-       "edit-error-long": "錯誤:\n\n$1"
+       "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "修訂 $1",
+       "pageid": "頁面 ID $1"
 }
index c675f09..9ad5951 100644 (file)
@@ -73,4 +73,3 @@ $magicWords = [
        'special'                   => [ '0', 'цастәи', 'служебная', 'special' ],
        'index'                     => [ '1', '__АИНДЕКС__', '__ИНДЕКС__', '__INDEX__' ],
 ];
-
index ad14f4d..d20ad9b 100644 (file)
@@ -153,4 +153,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Hubong_gisa' ],
        'Withoutinterwiki'          => [ 'Hana_interwiki' ],
 ];
-
index d6dab21..d82cde7 100644 (file)
@@ -196,4 +196,3 @@ $specialPageAliases = [
 # glibc is wrong in this respect in some versions
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = "/^([a-z]+)(.*)$/sD";
-
index b45bdbf..abbffa4 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Nkyekyem',
        NS_CATEGORY_TALK    => 'Nkyekyem_nkɔmmɔbea',
 ];
-
index 80d31bc..f5abe87 100644 (file)
@@ -59,4 +59,3 @@ $magicWords = [
        'servername'                => [ '0', 'EMNISERVERIT', 'EMRIISERVERIT', 'SERVERNAME' ],
        'currentweek'               => [ '1', 'JAVAAKTUALE', 'JAVAMOMENTALE', 'CURRENTWEEK' ],
 ];
-
index a991c63..99f6d3a 100644 (file)
@@ -37,4 +37,3 @@ $specialPageAliases = [
        'Newpages'                  => [ 'አዳዲስ_ገጾች' ],
        'Shortpages'                => [ 'አጫጭር_ገጾች' ],
 ];
-
index 038566b..b66fe0e 100644 (file)
@@ -119,4 +119,3 @@ $specialPageAliases = [
        'Wantedtemplates'           => [ 'Plantillas_requiestas', 'Plantillas_demandatas' ],
        'Watchlist'                 => [ 'Lista_de_seguimiento' ],
 ];
-
index d6432de..9e113b4 100644 (file)
@@ -39,4 +39,3 @@ $namespaceAliases = [
        'Floccgesprec'  => NS_CATEGORY_TALK,
        'Floccmotung'   => NS_CATEGORY_TALK,
 ];
-
index a83b717..795d706 100644 (file)
@@ -433,4 +433,3 @@ $imageFiles = [
        'button-headline' => 'ar/button_headline.png',
        'button-nowiki'   => 'ar/button_nowiki.png',
 ];
-
index 0c1b668..e0ab2da 100644 (file)
@@ -125,4 +125,3 @@ $magicWords = [
        'url_path'                  => [ '0', 'ܫܒܝܠܐ', 'PATH' ],
        'url_wiki'                  => [ '0', 'ܘܝܩܝ', 'WIKI' ],
 ];
-
index 311f2e2..2cfb464 100644 (file)
@@ -16,4 +16,3 @@ $separatorTransformTable = [
 ];
 
 $fallback = 'ar';
-
index 2e69353..d99a721 100644 (file)
@@ -332,4 +332,3 @@ $digitTransformTable = [
        '.' => '.',
        ',' => ',',
 ];
-
index bf757ee..2516fc7 100644 (file)
@@ -165,4 +165,3 @@ $digitTransformTable = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 99cc28b..95bbf5a 100644 (file)
@@ -60,4 +60,3 @@ $specialPageAliases = [
        'Search'                    => [ 'Gueta' ],
        'Statistics'                => [ 'Estadístiques' ],
 ];
-
index fab56b1..b335f66 100644 (file)
@@ -89,4 +89,3 @@ $specialPageAliases = [
        'Wantedpages'               => [ 'ErunBueem', 'EmpayanGluyasikieem' ],
        'Watchlist'                 => [ 'Suzdasiki' ],
 ];
-
index 66c7b9f..45afe2a 100644 (file)
@@ -59,4 +59,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index 92ca0f8..1ae3939 100644 (file)
@@ -83,4 +83,3 @@ $magicWords = [
        'img_none'                  => [ '1', 'هئچ', 'هیچ', 'none' ],
        'img_framed'                => [ '1', 'قابیق', 'قاب', 'frame', 'framed', 'enframed' ],
 ];
-
index b00da10..e118036 100644 (file)
@@ -129,4 +129,3 @@ $specialPageAliases = [
 $namespaceGenderAliases = [];
 
 $linkTrail = '/^((?:[a-z]|а|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|ә|ө|ү|ғ|ҡ|ң|ҙ|ҫ|һ|“|»)+)(.*)$/sDu';
-
index f484027..8b8041f 100644 (file)
@@ -47,4 +47,3 @@ $namespaceAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index 84f273b..14b89bf 100644 (file)
@@ -131,4 +131,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'ای لینکی ادان هست' ],
        'Withoutinterwiki'          => [ 'بی بین ویکی' ],
 ];
-
index 0b0d42e..44e1f25 100644 (file)
@@ -87,4 +87,3 @@ $magicWords = [
        'pagesincategory'           => [ '1', 'PAHINASAKATEGORYA', 'PAHINASAKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ],
        'pagesize'                  => [ '1', 'PAHINASOKOL', 'PAGESIZE' ],
 ];
-
index 9822436..ea807fd 100644 (file)
@@ -46,7 +46,7 @@ $magicWords = [
 
 $bookstoreList = [
        'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $datePreferences = [
@@ -70,4 +70,3 @@ $separatorTransformTable = [
 ];
 
 $linkTrail = '/^([абвгґджзеёжзійклмнопрстуўфхцчшыьэюяćčłńśšŭźža-z]+)(.*)$/sDu';
-
index 25449f8..a6fd58a 100644 (file)
@@ -215,7 +215,7 @@ $magicWords = [
 
 $bookstoreList = [
        'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $datePreferences = [
@@ -244,4 +244,3 @@ $imageFiles = [
        'button-italic'   => 'be-tarask/button_italic.png',
        'button-link'     => 'be-tarask/button_link.png',
 ];
-
index 74b7fe0..3a21e75 100644 (file)
@@ -218,4 +218,3 @@ $bookstoreList = [
 $linkTrail = '/^([a-zабвгдежзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 9b70dbf..f1505af 100644 (file)
@@ -135,4 +135,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Tautan_balik' ],
        'Withoutinterwiki'          => [ 'Kada_pakai_interwiki' ],
 ];
-
index f5afe2a..654171e 100644 (file)
@@ -12,4 +12,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 59b4f65..4edce3d 100644 (file)
@@ -171,3 +171,141 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'সংযোগকারী_পৃষ্ঠাসমূহ' ],
        'Withoutinterwiki'          => [ 'আন্তঃউইকিহীন' ],
 ];
+
+$magicWords = [
+       'redirect'                => [ 0, '#পুনর্নির্দেশ', '#পুনঃর্নির্দেশ', '#পুনঃনির্দেশ', '#পুননির্দেশ', '#REDIRECT' ],
+       'notoc'                   => [ 0, '__কোন_বিষয়বস্তুর_ছক_নয়__', '__কোনবিষয়বস্তুরছকনয়__', '__কোন_বিষয়বস্তুর_টেবিল_নয়__', '__কোনবিষয়বস্তুরটেবিলনয়__', '__NOTOC__' ],
+       'nogallery'               => [ 0, '__কোনগ্যালারিনয়__', '__কোনগ্যালারীনয়__', '__কোন_গ্যালারি_নয়__', '__কোন_গ্যালারী_নয়__', '__NOGALLERY__' ],
+       'toc'                     => [ 0, '__বিষয়বস্তুর_ছক__', '__বিষয়বস্তুরছক__', '__বিষয়বস্তুর_টেবিল__', '__বিষয়বস্তুরটেবিল__', '__TOC__' ],
+       'noeditsection'           => [ 0, '__কোনসম্পাদনাঅনুচ্ছেদনয়__', '__কোন_সম্পাদনা_অনুচ্ছেদ_নয়__', '__NOEDITSECTION__' ],
+       'currentmonth'            => [ 1, 'চলতি_মাস', 'চলতিমাস', 'বর্তমান_মাস', 'বর্তমানমাস', 'বর্তমান_মাস_২', 'বর্তমানমাস২', 'CURRENTMONTH', 'CURRENTMONTH2' ],
+       'currentmonth1'           => [ 1, 'চলতি_মাস_১', 'চলতিমাস১', 'বর্তমান_মাস_১', 'বর্তমানমাস১', 'CURRENTMONTH1' ],
+       'currentmonthname'        => [ 1, 'বর্তমান_মাসের_নাম', 'বর্তমানমাসেরনাম', 'CURRENTMONTHNAME' ],
+       'currentmonthnamegen'     => [ 1, 'বর্তমান_মাসের_নাম_উৎপন্ন', 'বর্তমানমাসেরনামউৎপন্ন', 'CURRENTMONTHNAMEGEN' ],
+       'currentmonthabbrev'      => [ 1, 'বর্তমান_মাস_সংক্ষেপ', 'বর্তমানমাসসংক্ষেপ', 'বর্তমান_মাস_সংক্ষিপ্ত', 'বর্তমানমাসসংক্ষিপ্ত', 'CURRENTMONTHABBREV' ],
+       'currentday'              => [ 1, 'বর্তমান_দিন', 'বর্তমানদিন', 'আজকের_দিন', 'আজকেরদিন', 'CURRENTDAY' ],
+       'currentday2'             => [ 1, 'বর্তমান_দিন_২', 'বর্তমানদিন২', 'আজকের_দিন_২', 'আজকেরদিন২', 'CURRENTDAY2' ],
+       'currentdayname'          => [ 1, 'বর্তমান_দিনের_নাম', 'বর্তমানদিনেরনাম', 'আজকের_দিনের_নাম', 'আজকেরদিনেরনাম', 'CURRENTDAYNAME' ],
+       'currentyear'             => [ 1, 'চলতি_বছর', 'চলতিবছর', 'বর্তমান_বছর', 'বর্তমানবছর', 'CURRENTYEAR' ],
+       'currenttime'             => [ 1, 'বর্তমান_সময়', 'বর্তমানসময়', 'এখনকার_সময়', 'এখনকারসময়', 'এখন_সময়', 'CURRENTTIME' ],
+       'currenthour'             => [ 1, 'বর্তমান_ঘণ্টা', 'বর্তমানঘণ্টা', 'বর্তমান_ঘন্টা', 'বর্তমানঘন্টা', 'এখনকার_ঘণ্টা', 'এখনকারঘণ্টা', 'CURRENTHOUR' ],
+       'localmonth'              => [ 1, 'স্থানীয়_মাস', 'স্থানীয়মাস', 'স্থানীয়_মাস_২', 'স্থানীয়মাস২', 'LOCALMONTH', 'LOCALMONTH2' ],
+       'localmonth1'             => [ 1, 'স্থানীয়_মাস_১', 'স্থানীয়মাস১', 'LOCALMONTH1' ],
+       'localmonthname'          => [ 1, 'স্থানীয়_মাসের_নাম', 'স্থানীয়মাসেরনাম', 'LOCALMONTHNAME' ],
+       'localmonthnamegen'       => [ 1, 'স্থানীয়_মাসের_নাম_উৎপন্ন', 'স্থানীয়মাসেরনামউৎপন্ন', 'LOCALMONTHNAMEGEN' ],
+       'localmonthabbrev'        => [ 1, 'স্থানীয়_মাস_সংক্ষেপ', 'স্থানীয়মাসসংক্ষেপ', 'স্থানীয়_মাস_সংক্ষিপ্ত', 'স্থানীয়মাসসংক্ষিপ্ত', 'সংক্ষেপিত_স্থানীয়_মাস', 'সংক্ষেপিতস্থানীয়মাস', 'LOCALMONTHABBREV' ],
+       'localday'                => [ 1, 'স্থানীয়_দিন', 'স্থানীয়দিন', 'স্থানীয়_বার', 'স্থানীয়বার', 'LOCALDAY' ],
+       'localday2'               => [ 1, 'স্থানীয়_দিন_২', 'স্থানীয়দিন২', 'LOCALDAY2' ],
+       'localdayname'            => [ 1, 'স্থানীয়_দিনের_নাম', 'স্থানীয়দিনেরনাম', 'LOCALDAYNAME' ],
+       'localyear'               => [ 1, 'স্থানীয়_বছর', 'স্থানীয়বছর', 'LOCALYEAR' ],
+       'localtime'               => [ 1, 'স্থানীয়_সময়', 'স্থানীয়সময়', 'LOCALTIME' ],
+       'localhour'               => [ 1, 'স্থানীয়_ঘণ্টা', 'স্থানীয়ঘণ্টা', 'স্থানীয়_ঘন্টা', 'স্থানীয়ঘন্টা', 'LOCALHOUR' ],
+       'numberofpages'           => [ 1, 'পাতার_সংখ্যা', 'পাতারসংখ্যা', 'পৃষ্ঠার_সংখ্যা', 'পৃষ্ঠারসংখ্যা', 'পৃষ্ঠা_সংখ্যা', 'পৃষ্ঠাসংখ্যা', 'NUMBEROFPAGES' ],
+       'numberofarticles'        => [ 1, 'নিবন্ধের_সংখ্যা', 'নিবন্ধেরসংখ্যা', 'নিবন্ধ_সংখ্যা', 'নিবন্ধসংখ্যা', 'NUMBEROFARTICLES' ],
+       'numberoffiles'           => [ 1, 'ফাইলের_সংখ্যা', 'ফাইলেরসংখ্যা', 'ফাইল_সংখ্যা', 'ফাইলসংখ্যা', 'NUMBEROFFILES' ],
+       'numberofusers'           => [ 1, 'ব্যবহারকারীর_সংখ্যা', 'ব্যবহারকারীরসংখ্যা', 'ব্যবহারকারী_সংখ্যা', 'ব্যবহারকারীসংখ্যা', 'NUMBEROFUSERS' ],
+       'numberofactiveusers'     => [ 1, 'সক্রিয়_ব্যবহারকারীর_সংখ্যা', 'সক্রিয়ব্যবহারকারীরসংখ্যা', 'সক্রিয়_ব্যবহারকারী_সংখ্যা', 'সক্রিয়ব্যবহারকারীসংখ্যা', 'NUMBEROFACTIVEUSERS' ],
+       'numberofedits'           => [ 1, 'সম্পাদনার_সংখ্যা', 'সম্পাদনারসংখ্যা', 'সম্পাদনা_সংখ্যা', 'সম্পাদনাসংখ্যা', 'NUMBEROFEDITS' ],
+       'pagename'                => [ 1, 'পাতার_নাম', 'পাতারনাম', 'পৃষ্ঠার_নাম', 'পৃষ্ঠারনাম', 'PAGENAME' ],
+       'pagenamee'               => [ 1, 'পাতার_নামম', 'পাতারনামম', 'পৃষ্ঠার_নামম', 'পৃষ্ঠারনামম', 'PAGENAMEE' ],
+       'namespace'               => [ 1, 'নামস্থান', 'NAMESPACE' ],
+       'namespacee'              => [ 1, 'নামস্থানন', 'NAMESPACEE' ],
+       'namespacenumber'         => [ 1, 'নামস্থানের_সংখ্যা', 'নামস্থানেরসংখ্যা', 'NAMESPACENUMBER' ],
+       'talkspace'               => [ 1, 'আলাপের_স্থান', 'আলোচনার_স্থান', 'আলাপেরস্থান', 'আলোচনারস্থান', 'আলাপের_জায়গা', 'আলাপেরজায়গা', 'TALKSPACE' ],
+       'talkspacee'              => [ 1, 'আলাপের_স্থানন', 'আলোচনার_স্থানন', 'আলাপেরস্থানন', 'আলোচনারস্থানন', 'TALKSPACEE' ],
+       'subjectspace'            => [ 1, 'বিষয়ের_স্থান', 'নিবন্ধের_স্থান', 'বিষয়েরস্থান', 'নিবন্ধেরস্থান', 'SUBJECTSPACE', 'ARTICLESPACE' ],
+       'subjectspacee'           => [ 1, 'বিষয়ের_স্থানন', 'নিবন্ধের_স্থানন', 'বিষয়েরস্থানন', 'নিবন্ধেরস্থানন', 'SUBJECTSPACEE', 'ARTICLESPACEE' ],
+       'fullpagename'            => [ 1, 'পূর্ণ_পাতার_নাম', 'সম্পূর্ণ_পাতার_নাম', 'পূর্ণপাতারনাম', 'সম্পূর্ণপাতারনাম', 'পূর্ণ_পৃষ্ঠার_নাম', 'সম্পূর্ণ_পৃষ্ঠার_নাম', 'পূর্ণপৃষ্ঠারনাম', 'সম্পূর্ণপৃষ্ঠারনাম', 'FULLPAGENAME' ],
+       'fullpagenamee'           => [ 1, 'পূর্ণ_পাতার_নামম', 'সম্পূর্ণ_পাতার_নামম', 'পূর্ণপাতারনামম', 'সম্পূর্ণপাতারনামম', 'পূর্ণ_পৃষ্ঠার_নামম', 'সম্পূর্ণ_পৃষ্ঠার_নামম', 'পূর্ণপৃষ্ঠারনামম', 'সম্পূর্ণপৃষ্ঠারনামম', 'FULLPAGENAMEE' ],
+       'subpagename'             => [ 1, 'উপপাতার_নাম', 'উপপাতারনাম', 'উপপৃষ্ঠার_নাম', 'উপপৃষ্ঠারনাম', 'SUBPAGENAME' ],
+       'subpagenamee'            => [ 1, 'উপপাতার_নামম', 'উপপাতারনামম', 'উপপৃষ্ঠার_নামম', 'উপপৃষ্ঠারনামম', 'SUBPAGENAMEE' ],
+       'rootpagename'            => [ 1, 'মূল_পাতার_নাম', 'মূলপাতারনাম', 'মূল_পৃষ্ঠার_নাম', 'মূল_পৃষ্ঠার_নাম', 'ROOTPAGENAME' ],
+       'rootpagenamee'           => [ 1, 'মূল_পাতার_নামম', 'মূলপাতারনামম', 'মূল_পৃষ্ঠার_নামম', 'মূল_পৃষ্ঠার_নামম', 'ROOTPAGENAMEE' ],
+       'basepagename'            => [ 1, 'ভিত্তি_পাতার_নাম', 'ভিত্তিপাতারনাম', 'ভিত্তি_পৃষ্ঠার_নাম', 'ভিত্তি_পৃষ্ঠার_নাম', 'BASEPAGENAME' ],
+       'basepagenamee'           => [ 1, 'ভিত্তি_পাতার_নামম', 'ভিত্তিপাতারনামম', 'ভিত্তি_পৃষ্ঠার_নামম', 'ভিত্তি_পৃষ্ঠার_নামম', 'BASEPAGENAMEE' ],
+       'talkpagename'            => [ 1, 'আলাপ_পাতার_নাম', 'আলাপপাতারনাম', 'আলাপ_পৃষ্ঠার_নাম', 'আলোচনা_পৃষ্ঠার_নাম', 'আলোচনা_পাতার_নাম', 'আলোচনাপাতারনাম', 'আলোচনা_পৃষ্ঠার_নাম', 'আলোচনা_পৃষ্ঠার_নাম', 'TALKPAGENAME' ],
+       'talkpagenamee'           => [ 1, 'আলাপ_পাতার_নামম', 'আলাপপাতারনামম', 'আলাপ_পৃষ্ঠার_নামম', 'আলোচনা_পৃষ্ঠার_নামম', 'আলোচনা_পাতার_নামম', 'আলোচনাপাতারনামম', 'আলোচনা_পৃষ্ঠার_নামম', 'আলোচনা_পৃষ্ঠার_নামম', 'TALKPAGENAMEE' ],
+       'subjectpagename'         => [ 1, 'বিষয়ের_পাতার_নাম', 'বিষয়েরপাতারনাম', 'বিষয়ের_পৃষ্ঠার_নাম', 'বিষয়েরপৃষ্ঠারনাম', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ],
+       'subjectpagenamee'        => [ 1, 'বিষয়ের_পাতার_নামম', 'বিষয়েরপাতারনামম', 'বিষয়ের_পৃষ্ঠার_নামম', 'বিষয়েরপৃষ্ঠারনামম', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ],
+       'img_thumbnail'           => [ 1, 'থাম্ব','থাম্বনেইল', 'thumb', 'thumbnail' ],
+       'img_manualthumb'         => [ 1, 'থাম্ব=$1','থাম্বনেইল=$1', 'thumbnail=$1', 'thumb=$1' ],
+       'img_right'               => [ 1, 'ডান', 'ডানে', 'right' ],
+       'img_left'                => [ 1, 'বাম', 'বামে', 'left' ],
+       'img_none'                => [ 1, 'কিছুই_না', 'কোনটি_না', 'কিছুইনা', 'কোনটিনা', 'none' ],
+       'img_width'               => [ 1, '$1পিক্সেল', '$1পিক্স', '$1px' ],
+       'img_center'              => [ 1, 'কেন্দ্র', 'কেন্দ্রে', 'center', 'centre' ],
+       'img_framed'              => [ 1, 'ফ্রেম', 'ফ্রেমসহ', 'frame', 'framed', 'enframed' ],
+       'img_frameless'           => [ 1, 'ফ্রেমহীন', 'ফ্রেমবিহীন', 'frameless' ],
+       'img_lang'                => [ 1, 'ভাষা=$1', 'lang=$1' ],
+       'img_page'                => [ 1, 'পাতা=$1', 'পাতা $1', 'পৃষ্ঠা=$1', 'পৃষ্ঠা $1', 'page=$1', 'page $1' ],
+       'img_upright'             => [ 1, 'ডানে_উপরে', 'ডানেউপরে=$1', 'ডানদিকে_উপরে', 'ডানদিকে_উপরে $1', 'ডানদিকে_উপরে=$1', 'ডানেউপরে $1', 'upright', 'upright=$1', 'upright $1' ],
+       'img_border'              => [ 1, 'সীমানা', 'সীমান্ত', 'border' ],
+       'img_top'                 => [ 1, 'শীর্ষ', 'উপর', 'শীর্ষে', 'উপরে', 'top' ],
+       'img_text_top'            => [ 1, 'পাঠ্য-উপরে', 'লেখা-উপরে', 'পাঠ্য-উপর', 'লেখা-উপর', 'text-top' ],
+       'img_middle'              => [ 1, 'মধ্য', 'মধ্যে', 'middle' ],
+       'img_bottom'              => [ 1, 'নিচে', 'নিচ', 'নীচ', 'নীচে', 'তলদেশ', 'নিম্নে', 'bottom' ],
+       'img_text_bottom'         => [ 1, 'পাঠ্য-নীচে', 'লেখা-নীচ', 'text-bottom' ],
+       'img_link'                => [ 1, 'সংযোগ=$1', 'লিঙ্ক=$1', 'link=$1' ],
+       'img_class'               => [ 1, 'ক্লাস=$1', 'class=$1' ],
+       'sitename'                => [ 1, 'সাইটের_নাম', 'সাইটেরনাম', 'SITENAME' ],
+       'localurl'                => [ 0, 'স্থানীয়_ইউআরএল:', 'স্থানীয়ইউআরএল:', 'LOCALURL:' ],
+       'articlepath'             => [ 0, 'নিবন্ধের_পথ', 'নিবন্ধেরপথ', 'ARTICLEPATH' ],
+       'pageid'                  => [ 0, 'পাতার_আইডি', 'পাতারআইডি', 'পৃষ্ঠার_আইডি', 'পৃষ্ঠারআইডি', 'PAGEID' ],
+       'server'                  => [ 0, 'সার্ভার', 'SERVER' ],
+       'servername'              => [ 0, 'সার্ভারের_নাম', 'সার্ভারেরনাম', 'SERVERNAME' ],
+       'scriptpath'              => [ 0, 'স্ক্রিপ্টের_পথ', 'স্ক্রিপ্টেরপথ', 'SCRIPTPATH' ],
+       'stylepath'               => [ 0, 'শৈলীর_পথ', 'শৈলীরপথ', 'STYLEPATH' ],
+       'grammar'                 => [ 0, 'ব্যাকরণ:', 'GRAMMAR:' ],
+       'gender'                  => [ 0, 'লিঙ্গ:', 'GENDER:' ],
+       'bidi'                    => [ 0, 'বিআইডিআই:', 'BIDI:' ],
+       'notitleconvert'          => [ 0, '__কোন_শিরোনাম_রূপান্তরকারী_নয়__', '__কোনশিরোনামরূপান্তরকারীনয়__', '__NOTITLECONVERT__', '__NOTC__' ],
+       'nocontentconvert'        => [ 0, '__কোন_বিষয়বস্তু_রূপান্তরকারী_নয়__', '__কোনবিষয়বস্তুরূপান্তরকারীনয়__', '__NOCONTENTCONVERT__', '__NOCC__' ],
+       'currentweek'             => [ 1, 'বর্তমান_সপ্তাহ', 'বর্তমানসপ্তাহ', 'চলতি_সপ্তাহ', 'চলতিসপ্তাহ', 'CURRENTWEEK' ],
+       'currentdow'              => [ 1, 'বর্তমান_সপ্তাহের_দিন', 'বর্তমানসপ্তাহেরদিন', 'CURRENTDOW' ],
+       'localweek'               => [ 1, 'স্থানীয়_সপ্তাহ', 'স্থানীয়সপ্তাহ', 'LOCALWEEK' ],
+       'localdow'                => [ 1, 'স্থানীয়_সপ্তাহের_দিন', 'স্থানীয়সপ্তাহেরদিন', 'LOCALDOW' ],
+       'revisionid'              => [ 1, 'সংশোধনের_আইডি', 'সংশোধনেরআইডি', 'REVISIONID' ],
+       'revisionday'             => [ 1, 'সংশোধনের_দিন', 'সংশোধনেরদিন', 'REVISIONDAY' ],
+       'revisionday2'            => [ 1, 'সংশোধনের_দিন_২', 'সংশোধনেরদিন২', 'REVISIONDAY2' ],
+       'revisionmonth'           => [ 1, 'সংশোধনের_মাস', 'সংশোধনেরমাস', 'REVISIONMONTH' ],
+       'revisionmonth1'          => [ 1, 'সংশোধনের_মাস_১', 'সংশোধনেরমাস১', 'REVISIONMONTH1' ],
+       'revisionyear'            => [ 1, 'সংশোধনের_বছর', 'সংশোধনেরবছর', 'REVISIONYEAR' ],
+       'revisiontimestamp'       => [ 1, 'সংশোধনের_সময়তারিখ', 'সংশোধনেরসময়তারিখ', 'REVISIONTIMESTAMP' ],
+       'revisionuser'            => [ 1, 'সংশোধনের_ব্যবহারকারী', 'সংশোধনেরব্যবহারকারী', 'REVISIONUSER' ],
+       'revisionsize'            => [ 1, 'সংশোধনের_আকার', 'সংশোধনেরআকার', 'REVISIONSIZE' ],
+       'plural'                  => [ 0, 'বহুবচন:', 'PLURAL:' ],
+       'raw'                     => [ 0, 'অবিন্যস্ত:', 'RAW:' ],
+       'displaytitle'            => [ 1, 'প্রদর্শনের_শিরোনাম', 'প্রদর্শনেরশিরোনাম', 'প্রদর্শিত_শিরোনাম', 'প্রদর্শিতশিরোনাম', 'DISPLAYTITLE' ],
+       'newsectionlink'          => [ 1, '__নতুন_অনুচ্ছেদের_সংযোগ__', '__নতুন_অনুচ্ছেদের_লিঙ্ক__', '__নতুনঅনুচ্ছেদেরসংযোগ__', '__নতুনঅনুচ্ছেদেরলিঙ্ক__', '__NEWSECTIONLINK__' ],
+       'nonewsectionlink'        => [ 1, '__কোন_নতুন_অনুচ্ছেদের_সংযোগ_নয়__', '__কোন_নতুন_অনুচ্ছেদের_লিঙ্ক_নয়__', '__কোননতুনঅনুচ্ছেদেরসংযোগনয়__', '__কোননতুনঅনুচ্ছেদেরলিঙ্কনয়__', '__NONEWSECTIONLINK__' ],
+       'currentversion'          => [ 1, 'বর্তমান_সংস্করণ', 'বর্তমানসংস্করণ', 'CURRENTVERSION' ],
+       'currenttimestamp'        => [ 1, 'বর্তমান_সময়তারিখ', 'বর্তমান_সময়তারিখ', 'CURRENTTIMESTAMP' ],
+       'localtimestamp'          => [ 1, 'স্থানীয়_সময়তারিখ', 'স্থানীয়সময়তারিখ', 'LOCALTIMESTAMP' ],
+       'language'                => [ 0, '#ভাষা:', '#LANGUAGE:' ],
+       'contentlanguage'         => [ 1, 'বিষয়বস্তুর_ভাষা', 'বিষয়বস্তুরভাষা', 'CONTENTLANGUAGE', 'CONTENTLANG' ],
+       'pagesinnamespace'        => [ 1, 'নামস্থানে_পাতা', 'নামস্থানে_পৃষ্ঠা', 'নামস্থানেপাতা', 'নামস্থানেপৃষ্ঠা', 'PAGESINNAMESPACE:', 'PAGESINNS:' ],
+       'numberofadmins'          => [ 1, 'প্রশাসকের_সংখ্যা', 'প্রশাসকেরসংখ্যা', 'প্রশাসক_সংখ্যা', 'প্রশাসকসংখ্যা', 'NUMBEROFADMINS' ],
+       'formatnum'               => [ 0, 'নম্বর_বিন্যাস', 'নম্বরবিন্যাস', 'FORMATNUM' ],
+       'special'                 => [ 0, 'বিশেষ', 'special' ],
+       'defaultsort'             => [ 1, 'পূর্বনির্ধারিত_বাছাই', 'পূর্বনির্ধারিতবাছাই', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ],
+       'filepath'                => [ 0, 'ফাইলের_পথ:', 'ফাইলেরপথ:', 'FILEPATH:' ],
+       'tag'                     => [ 0, 'ট্যাগ', 'tag' ],
+       'hiddencat'               => [ 1, '__লুকায়িতবিষয়শ্রেণী__', '__লুক্কায়িতবিষয়শ্রেণী__', '__HIDDENCAT__' ],
+       'pagesincategory'         => [ 1, 'বিষয়শ্রেণীতেপাতা', 'বিষয়শ্রেণীতেপৃষ্ঠা', 'বিষয়শ্রেণীতে_পাতা', 'বিষয়শ্রেণীতে_পৃষ্ঠা', 'PAGESINCATEGORY', 'PAGESINCAT' ],
+       'pagesize'                => [ 1, 'পাতার_আকার', 'পাতারআকার', 'পৃষ্ঠার_আকার', 'পৃষ্ঠারআকার', 'PAGESIZE' ],
+       'index'                   => [ 1, '__নির্ঘণ্ট__', '__INDEX__' ],
+       'noindex'                 => [ 1, '__কোননির্ঘণ্টনয়__', '__কোন_নির্ঘণ্ট_নয়__', '__নির্ঘণ্টনয়__', '__NOINDEX__' ],
+       'numberingroup'           => [ 1, 'দলে_সংখ্যা', 'দলেসংখ্যা', 'NUMBERINGROUP', 'NUMINGROUP' ],
+       'staticredirect'          => [ 1, '__স্থির_পুনর্নির্দেশ__', '__স্থিরপুনর্নির্দেশ__', '__STATICREDIRECT__' ],
+       'protectionlevel'         => [ 1, 'সুরক্ষার_স্তর', 'সুরক্ষারস্তর', 'সুরক্ষা_স্তর', 'সুরক্ষাস্তর', 'PROTECTIONLEVEL' ],
+       'protectionexpiry'        => [ 1, 'সুরক্ষার_মেয়াদোত্তীর্ণ', 'সুরক্ষারমেয়াদোত্তীর্ণ', 'সুরক্ষা_মেয়াদোত্তীর্ণ', 'সুরক্ষামেয়াদোত্তীর্ণ', 'PROTECTIONEXPIRY' ],
+       'formatdate'              => [ 0, 'তারিখ_বিন্যাস', 'তারিখবিন্যাস', 'formatdate', 'dateformat' ],
+       'url_path'                => [ 0, 'পথ', 'PATH' ],
+       'url_wiki'                => [ 0, 'উইকি', 'WIKI' ],
+       'pagesincategory_all'     => [ 0, 'সব', 'সকল', 'all' ],
+       'pagesincategory_pages'   => [ 0, 'পাতাসমূহ', 'পৃষ্ঠাসমূহ', 'pages' ],
+       'pagesincategory_subcats' => [ 0, 'উপবিষয়শ্রেণী', '', 'subcats' ],
+       'pagesincategory_files'   => [ 0, 'ফাইলসমূহ', 'files' ],
+];
+
+$linkTrail = '/^([\x{0980}-\x{09FF}]+)(.*)$/sDu';
index dbf3443..043f4d1 100644 (file)
@@ -20,4 +20,3 @@ $digitTransformTable = [
        '8' => '༨', # &#x0f28;
        '9' => '༩', # &#x0f29;
 ];
-
index d8aee4f..decfbdd 100644 (file)
@@ -41,4 +41,3 @@ $digitTransformTable = [
        '8' => '৮',
        '9' => '৯'
 ];
-
index 69a5d2f..d7614cc 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'fr';
+
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Dibar',
@@ -32,6 +34,8 @@ $namespaceAliases = [
        'Kaozeadenn_Skeudenn' => NS_FILE_TALK,
 ];
 
+$namespaceGenderAliases = [];
+
 $specialPageAliases = [
        'Activeusers'               => [ 'ImplijerienOberiant' ],
        'Allmessages'               => [ 'HollGemennadennoù' ],
@@ -146,7 +150,7 @@ $magicWords = [
 ];
 
 $bookstoreList = [
-       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'Amazon.fr'    => 'https://www.amazon.fr/exec/obidos/ISBN=$1',
        'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
        'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
        'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
@@ -162,4 +166,3 @@ $dateFormats = [
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = "/^((?:c\'h|C\'H|C\'h|c’h|C’H|C’h|[a-zA-ZàâçéèêîôûäëïöüùñÇÉÂÊÎÔÛÄËÏÖÜÀÈÙÑ])+)(.*)$/sDu";
-
index 6211da2..23122cd 100644 (file)
@@ -261,4 +261,3 @@ $magicWords = [
 $fallback8bitEncoding = "iso-8859-2";
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zćčžšđž]+)(.*)$/sDu';
-
index 93142b7..79381c1 100644 (file)
@@ -67,4 +67,3 @@ $specialPageAliases = [
        'Userlogin'                 => [ 'Нэбтэрхэ' ],
        'Userlogout'                => [ 'Гараха' ],
 ];
-
index 0d932a8..b38287e 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'oc';
+
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Especial',
@@ -126,6 +128,7 @@ $specialPageAliases = [
 ];
 
 $magicWords = [
+       'redirect'                  => [ '0', '#REDIRECCIÓ', '#REDIRECCIO', '#REDIRECT' ],
        'numberofarticles'          => [ '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ],
        'numberoffiles'             => [ '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ],
        'numberofusers'             => [ '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ],
@@ -158,11 +161,17 @@ $dateFormats = [
        'ymd both' => 'H:i, Y M j',
 ];
 
+$datePreferences = [
+       'default',
+       'dmy',
+       'ymd',
+       'ISO 8601',
+];
+$defaultDateFormat = 'dmy';
+
 $bookstoreList = [
-       'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
-       'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
+       'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.cat/search*cat/X?SEARCH=$1',
        'inherit' => true,
 ];
 
 $linkTrail = "/^((?:[a-zàèéíòóúç·ïü]|'(?!'))+)(.*)$/sDu";
-
index 6d875ae..d5e52e8 100644 (file)
@@ -138,4 +138,3 @@ $dateFormats = [
        'cdo date' => 'Y "nièng" n "nguŏk" j "hô̤" (l)',
        'cdo both' => 'Y "nièng" n "nguŏk" j "hô̤" (D) H:i',
 ];
-
index e2c038b..9ad3c52 100644 (file)
@@ -55,4 +55,3 @@ $specialPageAliases = [
        'Version'                   => [ 'Bersiyon' ],
        'Watchlist'                 => [ 'Gibantayan' ],
 ];
-
index 08f4e39..1bccad3 100644 (file)
@@ -22,4 +22,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Katigoria',
        NS_CATEGORY_TALK    => 'Kombetsasion_ni_katigoria',
 ];
-
index dab649d..ff68ad8 100644 (file)
@@ -99,4 +99,3 @@ $dateFormats = [
 $separatorTransformTable = [ ','  => '.', '.' => ',' ];
 $linkTrail = '/^([a-zâçğıñöşüа-яё“»]+)(.*)$/sDu';
 $linkPrefixCharset = 'a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„';
-
index 738cb02..9a993ea 100644 (file)
@@ -94,4 +94,3 @@ $dateFormats = [
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zâçğıñöşüа-яё“»]+)(.*)$/sDu';
 $linkPrefixCharset = 'a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„';
-
index e778856..90f1128 100644 (file)
@@ -356,4 +356,3 @@ $bookstoreList = [
 $linkTrail = '/^([a-záčďéěíňóřšťúůýž]+)(.*)$/sDu';
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index ee94546..27c786d 100644 (file)
@@ -28,4 +28,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Kategòrëjô',
        NS_CATEGORY_TALK    => 'Diskùsëjô_Kategòrëji',
 ];
-
index 8375270..c45f025 100644 (file)
@@ -92,4 +92,3 @@ $dateFormats = [
 
 $linkTrail = '/^([a-zабвгдеєжѕзїіıићклмнопсстѹфхѡѿцчшщъыьѣюѥѧѩѫѭѯѱѳѷѵґѓђёјйљњќуўџэ҄я“»]+)(.*)$/sDu';
 $linkPrefixCharset = '„«';
-
index 5b9c2b6..56b4d1d 100644 (file)
@@ -35,4 +35,3 @@ $namespaceGenderAliases = [];
 $linkPrefixExtension = true;
 $linkTrail = '/^([a-zа-яĕçăӳ"»]+)(.*)$/sDu';
 $linkPrefixCharset = 'a-zA-Z"\\x{80}-\\x{10ffff}';
-
index a569f16..2fec9fc 100644 (file)
@@ -98,9 +98,8 @@ $defaultDateFormat = 'dmy';
 $bookstoreList = [
        "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
        "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
-       "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1",
-       "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1"
+       "Amazon.com" => "https://www.amazon.com/exec/obidos/ISBN=$1",
+       "Amazon.co.uk" => "https://www.amazon.co.uk/exec/obidos/ISBN=$1"
 ];
 
 $linkTrail = "/^([àáâèéêìíîïòóôûŵŷa-z]+)(.*)$/sDu";
-
index c96a442..48450d3 100644 (file)
@@ -144,4 +144,3 @@ $bookstoreList = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
-
index 5fc359e..160f57d 100644 (file)
@@ -344,7 +344,7 @@ $dateFormats = [
 $capitalizeAllNouns = true;
 $bookstoreList = [
        'abebooks.de' => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
-       'amazon.de' => 'http://www.amazon.de/gp/search/field-isbn=$1',
+       'amazon.de' => 'https://www.amazon.de/gp/search/field-isbn=$1',
        'buch.de' => 'http://www.buch.de/shop/home/suche/?sswg=BUCH&sq=$1',
        'Karlsruher Virtueller Katalog (KVK)' => 'http://www.ubka.uni-karlsruhe.de/kvk.html?SB=$1',
        'Lehmanns Fachbuchhandlung' => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1'
@@ -357,4 +357,3 @@ $imageFiles = [
        'button-bold'     => 'de/button_bold.png',
        'button-italic'   => 'de/button_italic.png',
 ];
-
index dacefa3..c0f53ed 100644 (file)
@@ -10,4 +10,3 @@
 
 $fallback = 'de';
 $separatorTransformTable = [ ',' => "'", '.' => ',' ];
-
index c81fd34..51067bf 100644 (file)
@@ -325,4 +325,3 @@ $magicWords = [
        'pagesincategory_subcats'   => [ '0', 'bınkatategori', 'subcats' ],
        'pagesincategory_files'     => [ '0', 'dosyey', 'files' ],
 ];
-
index bce8b62..4b5aeb0 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-$fallback = 'de';
+$fallback = 'hsb, de';
 
 $namespaceNames = [
        NS_MEDIA            => 'Medija',
@@ -140,4 +140,3 @@ $dateFormats = [
        'dmy date' => 'j. xg Y',
        'dmy both' => 'j. xg Y, H:i',
 ];
-
index f3dfefb..67c59e3 100644 (file)
@@ -80,4 +80,3 @@ $specialPageAliases = [
        'Wantedtemplates'           => [ 'ބޭނުންވާ_ފަންވަތްތައް' ],
        'Watchlist'                 => [ 'މަގޭ_ނަޒަރު' ],
 ];
-
index 646012e..50ae191 100644 (file)
@@ -20,4 +20,3 @@ $digitTransformTable = [
        '8' => '༨', # &#x0f28;
        '9' => '༩', # &#x0f29;
 ];
-
index dd7cd68..7bf07ea 100644 (file)
@@ -332,4 +332,3 @@ $dateFormats = [
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 ];
-
index 67369e2..689586b 100644 (file)
@@ -187,7 +187,7 @@ $dateFormats = [
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/gp/search/?field-isbn=$1'
+       'Amazon.com' => 'https://www.amazon.com/gp/search/?field-isbn=$1'
 ];
 
 /**
@@ -349,6 +349,7 @@ $magicWords = [
        'directionmark'           => [ 1, 'DIRECTIONMARK', 'DIRMARK' ],
        'language'                => [ 0, '#LANGUAGE:' ],
        'contentlanguage'         => [ 1, 'CONTENTLANGUAGE', 'CONTENTLANG' ],
+       'pagelanguage'            => [ 1, 'PAGELANGUAGE' ],
        'pagesinnamespace'        => [ 1, 'PAGESINNAMESPACE:', 'PAGESINNS:' ],
        'numberofadmins'          => [ 1, 'NUMBEROFADMINS' ],
        'formatnum'               => [ 0, 'FORMATNUM' ],
index c886457..61addfa 100644 (file)
@@ -14,4 +14,3 @@ $specialPageAliases = [
        'Uncategorizedpages'        => [ 'UncategorisedPages' ],
        'Uncategorizedtemplates'    => [ 'UncategorisedTemplates' ],
 ];
-
index 9c6b7be..0ce25e2 100644 (file)
@@ -284,4 +284,3 @@ $dateFormats = [
        'dmy date' => 'j M. Y',
        'dmy both' => 'H:i, j M. Y',
 ];
-
index 3b7c4bc..01bd00c 100644 (file)
@@ -300,4 +300,3 @@ $dateFormats = [
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
-
index 8a53d9e..28c69df 100644 (file)
@@ -146,7 +146,7 @@ $bookstoreList = [
        'Raamatukoi' => 'http://www.raamatukoi.ee/cgi-bin/index?valik=otsing&paring=$1',
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -289,4 +289,3 @@ $dateFormats = [
        'et roman date' => 'j. xrm Y',
        'et roman both' => 'j. xrm Y, "kell" H:i',
 ];
-
index 85d172c..bf65812 100644 (file)
@@ -106,4 +106,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* Bug 15717 */
-
index 2bf6ce2..7b3b31a 100644 (file)
@@ -25,8 +25,13 @@ $namespaceNames = [
        NS_TEMPLATE_TALK    => 'Prantilla_caraba',
        NS_HELP             => 'Ayua',
        NS_HELP_TALK        => 'Ayua_caraba',
-       NS_CATEGORY         => 'Categoria',
-       NS_CATEGORY_TALK    => 'Categoria_caraba',
+       NS_CATEGORY         => 'Categoría',
+       NS_CATEGORY_TALK    => 'Categoría_caraba',
+];
+
+$namespaceAliases = [ // T157846
+       'Categoria' => NS_CATEGORY,
+       'Categoria_caraba' => NS_CATEGORY_TALK,
 ];
 
 $namespaceGenderAliases = [
index eee9793..84dfabf 100644 (file)
@@ -417,4 +417,3 @@ $imageFiles = [
        'button-headline' => 'fa/button_headline.png',
        'button-nowiki'   => 'fa/button_nowiki.png',
 ];
-
index 71c4a75..ea09933 100644 (file)
@@ -12,4 +12,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 0d1abbd..b019fd6 100644 (file)
@@ -286,4 +286,3 @@ $bookstoreList = [
 ];
 
 $linkTrail = '/^([a-zäö]+)(.*)$/sDu';
-
index f7614ce..e0e7492 100644 (file)
@@ -99,4 +99,3 @@ $bookstoreList = [
 ];
 
 $linkTrail = '/^([áðíóúýæøa-z]+)(.*)$/sDu';
-
index 9bb02da..3e3cf80 100644 (file)
@@ -294,7 +294,7 @@ $magicWords = [
 ];
 
 $bookstoreList = [
-       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'Amazon.fr'    => 'https://www.amazon.fr/exec/obidos/ISBN=$1',
        'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
        'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
        'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
@@ -317,4 +317,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 106ba5e..0ac1caf 100644 (file)
@@ -11,7 +11,7 @@
 $fallback = 'fr';
 
 $bookstoreList = [
-       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'Amazon.fr'    => 'https://www.amazon.fr/exec/obidos/ISBN=$1',
        'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
        'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
        'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
@@ -302,4 +302,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 7ad9d50..d76edbf 100644 (file)
@@ -11,4 +11,3 @@
 $fallback = 'de';
 
 $linkTrail = '/^([a-zäöüßåāđē]+)(.*)$/sDu';
-
index 8bb6c6c..9846686 100644 (file)
@@ -105,4 +105,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 4bf6a09..28f52b6 100644 (file)
@@ -129,4 +129,3 @@ $specialPageAliases = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zàáèéìíòóùúâêîôûäëïöü]+)(.*)$/sDu';
-
index a508790..585e697 100644 (file)
@@ -77,4 +77,3 @@ $namespaceAliases = [
        'Plé_múnla' => NS_TEMPLATE_TALK,
        'Rang' => NS_CATEGORY
 ];
-
index 7a6d127..adf578f 100644 (file)
@@ -88,4 +88,3 @@ $specialPageAliases = [
 $magicWords = [
        'redirect'                  => [ '0', '#YÖNNENDİRMÄKLER', '#YÖNNENDİR', '#YÖNNENDİRMÄ', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ],
 ];
-
index 6dd812d..86e2b27 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
 $namespaceAliases = [
        '$1_談詑' => NS_PROJECT_TALK,
 ];
-
index 5fb511e..155ba2b 100644 (file)
@@ -20,4 +20,3 @@ $namespaceNames = [
        NS_HELP_TALK        => '帮助谈詑',
        NS_CATEGORY_TALK    => '分类谈詑',
 ];
-
index 1a136db..ae6944a 100644 (file)
@@ -45,4 +45,3 @@ $specialPageAliases = [
        'Unusedimages'              => [ '冇用嗰檔案' ],
        'Watchlist'                 => [ '監視列表' ],
 ];
-
index b147d5c..caa16d9 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Roinn-seòrsa',
        NS_CATEGORY_TALK    => 'Deasbaireachd_na_roinn-seòrsa',
 ];
-
index 8f1d4a7..a447df4 100644 (file)
@@ -274,4 +274,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index c5d7f46..6281208 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
 
 // Remove Spanish gender aliases (bug 37090)
 $namespaceGenderAliases = [];
-
index d5817b6..a6fab27 100644 (file)
@@ -26,4 +26,3 @@ $specialPageAliases = [
        'Allpages'                  => [ '𐌰𐌻𐌻𐍃𐍃𐌴𐌹𐌳𐍉𐌽𐍃' ],
        'Recentchanges'             => [ '𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃' ],
 ];
-
index f1bb4f8..e2f0cc0 100644 (file)
@@ -21,4 +21,3 @@ $dateFormats = [
        'ymd date' => 'Y xg j',
        'ymd both' => 'H:i, Y xg j',
 ];
-
index 6d1b7b8..d47d9c0 100644 (file)
@@ -112,4 +112,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
-
index db29a56..aec3a76 100644 (file)
@@ -127,4 +127,3 @@ $digitTransformTable = [
 $digitGroupingPattern = "##,##,###";
 
 $linkTrail = "/^([\x{0A80}-\x{0AFF}]+)(.*)$/sDu";
-
index d3b6e44..e2fc110 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Ronney',
        NS_CATEGORY_TALK    => 'Resooney_ronney',
 ];
-
index 66a3e41..fab2a13 100644 (file)
@@ -117,4 +117,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'ʻaoʻao', 'aoao', 'pages' ],
        'pagesincategory_files'     => [ '0', 'waihona', 'files' ],
 ];
-
index 9e03942..19f8232 100644 (file)
@@ -343,6 +343,5 @@ $bookstoreList = [
        'מיתוס'          => 'http://www.mitos.co.il/',
        'iBooks'         => 'http://www.ibooks.co.il/',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       'Amazon.com'     => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com'     => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
-
index 3f3b007..5a70a83 100644 (file)
@@ -299,4 +299,3 @@ $digitTransformTable = [
 $linkTrail = "/^([a-z\x{0900}-\x{0963}\x{0966}-\x{A8E0}-\x{A8FF}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index 5a32567..6671feb 100644 (file)
@@ -24,4 +24,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'vibhag',
        NS_CATEGORY_TALK    => 'voibhag_ke_baat',
 ];
-
index 97cac52..498585f 100644 (file)
@@ -289,4 +289,3 @@ $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $fallback8bitEncoding = 'iso-8859-2';
 
 $linkTrail = '/^([čšžćđßa-z]+)(.*)$/sDu';
-
index 6aa28e5..7fe8773 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-$fallback = 'de';
+$fallback = 'dsb, de';
 
 $namespaceNames = [
        NS_MEDIA            => 'Media',
@@ -144,4 +144,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Lisćina_wotkazow' ],
        'Withoutinterwiki'          => [ 'Falowace_mjezyrěčne_wotkazy' ],
 ];
-
index a217a29..0c894ef 100644 (file)
@@ -136,4 +136,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zàèòÀÈÒ]+)(.*)$/sDu';
-
index 6ba075a..7fcfad8 100644 (file)
@@ -279,4 +279,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-záéíóúöüőűÁÉÍÓÚÖÜŐŰ]+)(.*)$/sDu';
-
index ab1d198..9a5a809 100644 (file)
@@ -76,7 +76,7 @@ $dateFormats = [
 ];
 
 $bookstoreList = [
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -255,4 +255,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆև«»]+)(.*)$/sDu';
-
index b4adcbb..c3a2905 100644 (file)
@@ -132,4 +132,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Referentias_a_iste_pagina' ],
        'Withoutinterwiki'          => [ 'Sin_interwiki' ],
 ];
-
index 5fee306..2107e7d 100644 (file)
@@ -43,7 +43,7 @@ $namespaceAliases = [
 
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
        'Bhinneka.com bookstore' => 'http://www.bhinneka.com/Buku/Engine/search.asp?fisbn=$1',
        'Gramedia Cyberstore (via Google)' => 'http://www.google.com/search?q=%22ISBN+:+$1%22+%22product_detail%22+site:www.gramediacyberstore.com+OR+site:www.gramediaonline.com+OR+site:www.kompas.com&hl=id',
@@ -310,4 +310,3 @@ $dateFormats = [
        'ymd date' => 'Y F j',
        'ymd both' => 'Y F j H.i',
 ];
-
index 75f45b1..6723742 100644 (file)
@@ -119,4 +119,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Quo_catenunes_ci' ],
        'Withoutinterwiki'          => [ 'Sin_interwiki' ],
 ];
-
index 29edef3..2177cbf 100644 (file)
@@ -69,4 +69,3 @@ $magicWords = [
        'displaytitle'              => [ '1', 'ZIÍSHÍ', 'DISPLAYTITLE' ],
        'pagesize'                  => [ '1', 'ÀSÁIHÜ', 'PAGESIZE' ],
 ];
-
index 6f4f23a..389cdcf 100644 (file)
@@ -9,4 +9,3 @@
  */
 
 $fallback = 'zh-cn, zh-hans';
-
index 280ea41..6bc195b 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Kategoria',
        NS_CATEGORY_TALK    => 'Kategoria_tungtungan',
 ];
-
index 7aae422..0b49204 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'eo';
+
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Specala',
@@ -27,6 +29,11 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Kategorio_Debato',
 ];
 
+$namespaceGenderAliases = [
+       NS_USER => [ 'male' => 'Uzanto', 'female' => 'Uzantino' ],
+       NS_USER_TALK => [ 'male' => 'Uzanto_Debato', 'female' => 'Uzantino_Debato' ],
+];
+
 $namespaceAliases = [
        'Imajo' => NS_FILE,
        'Imajo_Debato' => NS_FILE_TALK,
@@ -96,4 +103,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Surveyaji' ],
        'Whatlinkshere'             => [ 'QuoLigasHike' ],
 ];
-
index c6f0e39..e6151db 100644 (file)
@@ -212,4 +212,3 @@ $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkPrefixExtension = true;
 $linkTrail = '/^([áðéíóúýþæöa-z-–]+)(.*)$/sDu';
 $linkPrefixCharset = 'áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z–-';
-
index 8714c72..e73a2fc 100644 (file)
@@ -226,4 +226,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zàéèíîìóòúù]+)(.*)$/sDu';
-
index b905345..c45a0dd 100644 (file)
@@ -321,4 +321,3 @@ $magicWords = [
        'url_wiki'                  => [ '0', 'ウィキ', 'WIKI' ],
        'url_query'                 => [ '0', 'クエリ', 'クエリー', 'QUERY' ],
 ];
-
index 05e892b..5488b9a 100644 (file)
@@ -13,27 +13,34 @@ $fallback = 'id';
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Astamiwa',
-       NS_TALK             => 'Dhiskusi',
+       NS_TALK             => 'Parembugan',
        NS_USER             => 'Panganggo',
-       NS_USER_TALK        => 'Dhiskusi_Panganggo',
-       NS_PROJECT_TALK     => 'Dhiskusi_$1',
+       NS_USER_TALK        => 'Parembugan_Panganggo',
+       NS_PROJECT_TALK     => 'Parembugan_$1',
        NS_FILE             => 'Gambar',
-       NS_FILE_TALK        => 'Dhiskusi_Gambar',
+       NS_FILE_TALK        => 'Parembugan_Gambar',
        NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'Dhiskusi_MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Parembugan_MediaWiki',
        NS_TEMPLATE         => 'Cithakan',
-       NS_TEMPLATE_TALK    => 'Dhiskusi_Cithakan',
+       NS_TEMPLATE_TALK    => 'Parembugan_Cithakan',
        NS_HELP             => 'Pitulung',
-       NS_HELP_TALK        => 'Dhiskusi_Pitulung',
+       NS_HELP_TALK        => 'Parembugan_Pitulung',
        NS_CATEGORY         => 'Kategori',
-       NS_CATEGORY_TALK    => 'Dhiskusi_Kategori',
+       NS_CATEGORY_TALK    => 'Parembugan_Kategori',
 ];
 
-$namespaceAliases = [
-       'Gambar_Dhiskusi' => NS_FILE_TALK,
+$namespaceAliases = [ // Kept former namespaces for backwards compatibility - T155957
+       'Cithakan_Dhiskusi'  => NS_TEMPLATE_TALK,
+       'Dhiskusi'           => NS_TALK,
+       'Dhiskusi_$1'        => NS_PROJECT_TALK,
+       'Dhiskusi_Cithakan'  => NS_TEMPLATE_TALK,
+       'Dhiskusi_Gambar'    => NS_FILE_TALK,
+       'Dhiskusi_Kategori'  => NS_CATEGORY_TALK,
+       'Dhiskusi_MediaWiki' => NS_MEDIAWIKI_TALK,
+       'Dhiskusi_Panganggo' => NS_USER_TALK,
+       'Dhiskusi_Pitulung'  => NS_HELP_TALK,
+       'Kategori_Dhiskusi'  => NS_CATEGORY_TALK,
        'MediaWiki_Dhiskusi' => NS_MEDIAWIKI_TALK,
-       'Cithakan_Dhiskusi' => NS_TEMPLATE_TALK,
-       'Pitulung_Dhiskusi' => NS_HELP_TALK,
-       'Kategori_Dhiskusi' => NS_CATEGORY_TALK,
+       'Pitulung_Dhiskusi'  => NS_HELP_TALK,
+       'Gambar_Dhiskusi'    => NS_FILE_TALK,
 ];
-
index 7c55460..d2e2d27 100644 (file)
@@ -146,4 +146,3 @@ $magicWords = [
 
 $linkPrefixExtension = true;
 $linkTrail = '/^([a-zაბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰ“»]+)(.*)$/sDu';
-
index 1f993b0..52e8e77 100644 (file)
@@ -142,4 +142,3 @@ $dateFormats = [
 
 $linkTrail = "/^((?:[a-zıʼ’“»]|'(?!'))+)(.*)$/sDu";
 $linkPrefixCharset = 'a-zıA-Zİ\\x80-\\xff';
-
index 2cfab54..3ae9975 100644 (file)
@@ -31,4 +31,3 @@ $namespaceAliases = [
        'Talγa'            => NS_TEMPLATE,
        'Amyannan_n_talγa' => NS_TEMPLATE_TALK,
 ];
-
index 621c964..256abd7 100644 (file)
@@ -46,4 +46,3 @@ $namespaceAliases = [
 
 // Remove Russian gender aliases
 $namespaceGenderAliases = [];
-
index fe2e92a..97d8d68 100644 (file)
@@ -20,4 +20,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Kalasi',
        NS_CATEGORY_TALK    => 'Disolo_kalasi',
 ];
-
index 23280af..b8f85e4 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'زمرہ',
        NS_CATEGORY_TALK    => 'تبادلۂ_خیال_زمرہ',
 ];
-
index 10e3ac3..39b68fa 100644 (file)
@@ -47,4 +47,3 @@ $namespaceAliases = [
        'Kategori'           => NS_CATEGORY,
        'Kategori_tartışma'  => NS_CATEGORY_TALK,
 ];
-
index ce30e55..b8fc7e7 100644 (file)
@@ -11,4 +11,3 @@
 # Stub message file for converter code "kk"
 
 $fallback = 'kk-cyrl';
-
index a589ac2..72179d6 100644 (file)
@@ -385,4 +385,3 @@ $specialPageAliases = [
 # -------------------------------------------------------------------
 # Default messages
 # -------------------------------------------------------------------
-
index 37b4a15..818a9b6 100644 (file)
@@ -355,4 +355,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Мында_сілтегендер' ],
        'Withoutinterwiki'          => [ 'Уики-аралықсыздар' ],
 ];
-
index 1f1289d..56d8a58 100644 (file)
@@ -349,4 +349,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Mında_siltegender' ],
        'Withoutinterwiki'          => [ 'Wïkï-aralıqsızdar' ],
 ];
-
index 5e7ae13..150d5cc 100644 (file)
@@ -54,4 +54,3 @@ $namespaceAliases = [
        'Kategori' => NS_CATEGORY,
        'Kategoridiskussion' => NS_CATEGORY_TALK
 ];
-
index e970b17..967224f 100644 (file)
@@ -256,4 +256,3 @@ $magicWords = [
        'noindex'                   => [ '1', '__មិនមានលិបិក្រម__', '__NOINDEX__' ],
        'staticredirect'            => [ '1', '__ស្ថិតិទំព័របញ្ជូនបន្ត__', '__STATICREDIRECT__' ],
 ];
-
index 5d846ea..5fa77e9 100644 (file)
@@ -62,4 +62,3 @@ $digitTransformTable = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 4a3c15e..3ac7779 100644 (file)
@@ -367,4 +367,3 @@ $dateFormats = [
        'ko date'            => 'Y년 M월 j일 (D)',
        'ko both'            => 'Y년 M월 j일 (D) H:i',
 ];
-
index eebd0fb..79548ea 100644 (file)
@@ -107,4 +107,3 @@ $magicWords = [
        'notoc'                     => [ '0', '__БАШЛАСЫЗ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ],
        'nogallery'                 => [ '0', '_ГАЛЛЕРЕЯСЫЗ__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ],
 ];
-
index b2f4697..27ac9f1 100644 (file)
@@ -49,4 +49,3 @@ $separatorTransformTable = [
        '.' => '٫', # &#x066b;
        ',' => '٬', # &#x066c;
 ];
-
index f8dc00f..55dc004 100644 (file)
@@ -41,4 +41,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index b13578e..164b20a 100644 (file)
@@ -210,4 +210,3 @@ $magicWords = [
 $imageFiles = [
        'button-italic'   => 'ksh/button_italic.png',
 ];
-
index d8bee65..7551ccf 100644 (file)
@@ -32,4 +32,3 @@ $digitTransformTable = [
        '.' => '٫', # &#x066b; wrong table ?
        ',' => '٬', # &#x066c;
 ];
-
index c97ef25..32844a2 100644 (file)
@@ -109,3 +109,4 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'rûpel', 'pages' ],
 ];
 
+$linkTrail = '/^([a-zçêîşûẍḧÇÊÎŞÛẌḦ]+)(.*)$/sDu';
index a5204be..069c64b 100644 (file)
@@ -44,4 +44,3 @@ $namespaceAliases = [
        'Категория'                          => NS_CATEGORY,
        'Обсуждение_категории'               => NS_CATEGORY_TALK
 ];
-
index 5a0a02b..53be156 100644 (file)
@@ -202,4 +202,3 @@ $magicWords = [
        'pagesincategory_all'       => [ '0', 'oll', 'all' ],
        'pagesincategory_pages'     => [ '0', 'folennow', 'pages' ],
 ];
-
index e2256af..99b49a5 100644 (file)
@@ -32,4 +32,3 @@ $namespaceNames = [
        NS_HELP             => 'Жардам',
        NS_CATEGORY         => 'Категория',
 ];
-
index 67143e7..1fa3e11 100644 (file)
@@ -157,4 +157,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Nexus_ad_paginam' ],
        'Withoutinterwiki'          => [ 'Paginae_sine_nexibus_ad_linguas_alias', 'Paginae_sine_nexibus_intervicis' ],
 ];
-
index 78c87fc..bb18959 100644 (file)
@@ -177,4 +177,3 @@ $magicWords = [
        'img_left'                  => [ '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ],
        'img_none'                  => [ '1', 'dinguna', 'dinguno', 'ninguna', 'nada', 'no', 'ninguno', 'none' ],
 ];
-
index 2f52faf..a416fe7 100644 (file)
@@ -191,4 +191,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'Säiten', 'seiten', 'pages' ],
        'pagesincategory_files'     => [ '0', 'Fichieren', 'dateien', 'files' ],
 ];
-
index b54f73a..9b4aa82 100644 (file)
@@ -42,4 +42,3 @@ $namespaceNames = [
 $namespaceGenderAliases = [];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюяӀ1“»]+)(.*)$/sDu';
-
index 86e9f88..0002adc 100644 (file)
@@ -56,4 +56,3 @@ $namespaceAliases = [
 
 // Remove Russian gender aliases
 $namespaceGenderAliases = [];
-
index eb453ea..051b323 100644 (file)
@@ -33,4 +33,3 @@ $specialPageAliases = [
        'Newimages'                 => [ 'FixesNova' ],
        'Newpages'                  => [ 'PajesNova' ],
 ];
-
index fe512b2..56ccf7b 100644 (file)
@@ -150,4 +150,3 @@ $dateFormats = [
        'ymd date' => 'Y M j',
        'ymd both' => 'Y M j H:i',
 ];
-
index d5a0788..8c01b09 100644 (file)
@@ -120,4 +120,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Cose appunta chì' ],
        'Withoutinterwiki'          => [ 'Sensa Interwiki' ],
 ];
-
index 92001ed..dc1840c 100644 (file)
@@ -100,4 +100,3 @@ $magicWords = [
        'img_none'                  => [ '1', 'nissön', 'nessuno', 'none' ],
        'sitename'                  => [ '1', 'NUMSIT', 'NOMESITO', 'SITENAME' ],
 ];
-
index d7ea41f..a44e0ac 100644 (file)
@@ -20,4 +20,3 @@ $linkPrefixExtension = true;
 
 # Same as the French (bug 8485)
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 1c79efd..665b222 100644 (file)
@@ -91,4 +91,3 @@ $digitTransformTable = [
        '8' => '໘', # &#x0ed8;
        '9' => '໙', # &#x0ed9;
 ];
-
index 8bdfc7f..f77049a 100644 (file)
@@ -32,4 +32,3 @@ $namespaceNames = [
 ];
 
 $fallback = 'lv';
-
index d9ef8bc..5214c46 100644 (file)
@@ -151,4 +151,3 @@ $digitTransformTable = [
        '.' => '點',
        ',' => '',
 ];
-
index 45d6f6c..b86bb14 100644 (file)
@@ -55,4 +55,3 @@ $namespaceAliases = [
        'Kategori'           => NS_CATEGORY,
        'Kategori_tartışma'  => NS_CATEGORY_TALK,
 ];
-
index 954d911..76110ac 100644 (file)
@@ -13,7 +13,7 @@
  * @author Numulunj pilgae
  */
 
-$fallbak = 'ru';
+$fallback = 'ru';
 
 $namespaceNames = [
        NS_MEDIA            => 'Медиа',
@@ -137,4 +137,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'МезеньСюлмафкстТяса' ],
        'Withoutinterwiki'          => [ 'Интервикифтома' ],
 ];
-
index 653be83..e8df5aa 100644 (file)
@@ -231,4 +231,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pejy_mirohy' ],
        'Withoutinterwiki'          => [ 'Tsy_misy_interwiki' ],
 ];
-
index 99ab0e5..7d12967 100644 (file)
@@ -91,4 +91,3 @@ $magicWords = [
        'img_bottom'                => [ '1', 'ӱлычын', 'снизу', 'bottom' ],
        'sitename'                  => [ '1', 'САЙТЛӰМ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ],
 ];
-
index 0529a0e..4bee5e1 100644 (file)
@@ -159,4 +159,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'laman', 'halaman', 'pages' ],
        'pagesincategory_files'     => [ '0', 'berkas', 'files' ],
 ];
-
index c15b040..cf608fc 100644 (file)
@@ -359,4 +359,3 @@ $magicWords = [
 
 $linkTrail = '/^([a-zабвгдѓежзѕијклљмнњопрстќуфхцчџш]+)(.*)$/sDu';
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index 2c9542b..f6d0d14 100644 (file)
@@ -356,4 +356,3 @@ $magicWords = [
 $linkTrail = "/^([a-z\x{0D02}-\x{0D7F}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index e63f009..a672fc4 100644 (file)
@@ -47,4 +47,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя“»]+)(.*)$/sDu';
-
index dd8133e..744fe73 100644 (file)
@@ -18,4 +18,3 @@ $specialPageAliases = [
        'Preferences'               => [ 'Преферинце' ],
        'Recentchanges'             => [ 'Модификэрьреченте' ],
 ];
-
index 61fc613..b51839d 100644 (file)
@@ -326,4 +326,3 @@ $digitTransformTable = [
 $linkTrail = "/^([\xE0\xA4\x80-\xE0\xA5\xA3\xE0\xA5\xB1-\xE0\xA5\xBF\xEF\xBB\xBF\xE2\x80\x8D]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index a9ddf7d..4d01b28 100644 (file)
@@ -42,4 +42,3 @@ $namespaceAliases = [
 
 // Remove Russian aliases
 $namespaceGenderAliases = [];
-
index c39854e..5d720ce 100644 (file)
@@ -211,4 +211,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pautan_ke_sini', 'Pautan_ke' ],
        'Withoutinterwiki'          => [ 'Laman_tanpa_pautan_bahasa' ],
 ];
-
index aad38b7..015dade 100644 (file)
@@ -268,4 +268,3 @@ $magicWords = [
 ];
 
 $linkPrefixCharset = 'A-\\x{10ffff}';
-
index 42afbd9..0dcfe2d 100644 (file)
@@ -75,4 +75,3 @@ $magicWords = [
        'pagesize'                  => [ '1', 'TAMANHOFEXEIRO', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ],
        'staticredirect'            => [ '1', '_ANCAMINARSTATICO_', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ],
 ];
-
index ebaa7ca..3bafe48 100644 (file)
@@ -57,4 +57,3 @@ $dateFormats = [
        'my long date' => 'Y "ဇန်နဝါရီ" F"လ" j "ရက်"',
        'my long both' => 'H:i"၊" Y "ဇန်နဝါရီ" F"လ" j "ရက်"',
 ];
-
index 20057d5..01bc33d 100644 (file)
@@ -183,4 +183,3 @@ $magicWords = [
        'url_path'                  => [ '0', 'ЯН', 'ПУТЬ', 'PATH' ],
        'url_wiki'                  => [ '0', 'ВИКИ', 'WIKI' ],
 ];
-
index 027cf34..e93362b 100644 (file)
@@ -121,4 +121,3 @@ $magicWords = [
        'grammar'                   => [ '0', 'دستور_زبون:', 'دستور_زوون:', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ],
        'gender'                    => [ '0', 'جنسیت:', 'جنس:', 'GENDER:' ],
 ];
-
index 1bf970c..767a305 100644 (file)
@@ -75,4 +75,3 @@ $specialPageAliases = [
        'Upload'                    => [ 'Quetza', 'Subir' ],
        'Userlogin'                 => [ 'Tlacalaquiliztli', 'Registrarse' ],
 ];
-
index 3f67a61..be7574c 100644 (file)
@@ -53,4 +53,3 @@ $namespaceAliases = [
        'Categoria' => NS_CATEGORY,
        'Discussioni_categoria' => NS_CATEGORY_TALK,
 ];
-
index c378f23..66f0527 100644 (file)
  * @author לערי ריינהארט
  */
 
+$fallback = 'nn';
+
 $bookstoreList = [
        'Antikvariat.net' => 'http://www.antikvariat.net/',
        'Frida' => 'http://wo.uio.no/as/WebObjects/frida.woa/wa/fres?action=sok&isbn=$1&visParametre=1&sort=alfabetisk&bs=50',
        'Bibsys' => 'http://ask.bibsys.no/ask/action/result?cmd=&kilde=biblio&fid=isbn&term=$1&op=and&fid=bd&term=&arstall=&sortering=sortdate-&treffPrSide=50',
        'Akademika' => 'http://www.akademika.no/sok.php?ts=4&sok=$1',
        'Haugenbok' => 'http://www.haugenbok.no/resultat.cfm?st=extended&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $namespaceNames = [
@@ -83,6 +85,14 @@ $namespaceAliases = [
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
 
+$datePreferenceMigrationMap = [
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
+];
+$defaultDateFormat = 'dmy';
+
 $dateFormats = [
        'mdy time' => 'H:i',
        'mdy date' => 'M j., Y',
@@ -320,4 +330,3 @@ $magicWords = [
        'url_path'                  => [ '0', 'STI', 'PATH' ],
        'url_query'                 => [ '0', 'SPØRRING', 'QUERY' ],
 ];
-
index b04066c..10d0a83 100644 (file)
@@ -88,7 +88,7 @@ $magicWords = [
 $bookstoreList = [
        'Verteken vun leverbore Böker'  => 'http://www.buchhandel.de/sixcms/list.php?page=buchhandel_profisuche_frameset&suchfeld=isbn&suchwert=$1=0&y=0',
        'abebooks.de'                   => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
-       'Amazon.de'                     => 'http://www.amazon.de/exec/obidos/ISBN=$1',
+       'Amazon.de'                     => 'https://www.amazon.de/exec/obidos/ISBN=$1',
        'Lehmanns Fachbuchhandlung'     => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1',
 ];
 
@@ -211,4 +211,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Wat wiest hier hen' ],
        'Withoutinterwiki'          => [ 'Sieden ahn Spraaklenken' ],
 ];
-
index 2a3ab0b..8af1c00 100644 (file)
@@ -319,4 +319,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zäöüïëéèà]+)(.*)$/sDu';
-
index 2f7ad26..c6ab806 100644 (file)
@@ -57,4 +57,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index 2d2cf39..65a7595 100644 (file)
@@ -39,4 +39,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index dde2e04..9d22254 100644 (file)
@@ -382,4 +382,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zäöüïëéèà]+)(.*)$/sDu';
-
index 5ceafd1..7572c67 100644 (file)
@@ -42,6 +42,8 @@
  * @see https://nn.wikipedia.org/w/index.php?title=Brukar:Dittaeva/LanguageNn.php&action=history
  */
 
+$fallback = 'nb';
+
 $datePreferences = [
        'default',
        'dmyt',
@@ -94,9 +96,9 @@ $bookstoreList = [
        'Haugenbok'    => 'http://www.haugenbok.no/resultat.cfm?st=hurtig&isbn=$1',
        'Akademika'    => 'http://www.akademika.no/sok.php?isbn=$1',
        'Gnist'        => 'http://www.gnist.no/sok.php?isbn=$1',
-       'Amazon.co.uk' => 'http://www.amazon.co.uk/exec/obidos/ISBN=$1',
-       'Amazon.de'    => 'http://www.amazon.de/exec/obidos/ISBN=$1',
-       'Amazon.com'   => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.co.uk' => 'https://www.amazon.co.uk/exec/obidos/ISBN=$1',
+       'Amazon.de'    => 'https://www.amazon.de/exec/obidos/ISBN=$1',
+       'Amazon.com'   => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -319,4 +321,3 @@ $separatorTransformTable = [
        '.' => ','
 ];
 $linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
-
diff --git a/languages/messages/MessagesNrm.php b/languages/messages/MessagesNrm.php
new file mode 100644 (file)
index 0000000..6cb8c47
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Norman (normaund)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fr';
index 2cdc6f0..80ce2dc 100644 (file)
@@ -40,4 +40,3 @@ $magicWords = [
        'currenttime'               => [ '1', 'NAKO_BJALE', 'CURRENTTIME' ],
        'currenthour'               => [ '1', 'IRI_BJALE', 'CURRENTHOUR' ],
 ];
-
index 0917c73..334160f 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
 ];
 
 $datePreferences = false;
-
index 6c7512b..eb8ed88 100644 (file)
  * @author לערי ריינהארט
  */
 
+$fallback = 'ca, fr';
+
 $bookstoreList = [
-       'Amazon.fr' => 'http://www.amazon.fr/exec/obidos/ISBN=$1'
+       'Amazon.fr' => 'https://www.amazon.fr/exec/obidos/ISBN=$1'
 ];
 
 $namespaceNames = [
@@ -57,6 +59,8 @@ $namespaceAliases = [
        'Discussion_Imatge'    => NS_FILE_TALK,
 ];
 
+$namespaceGenderAliases = [];
+
 $specialPageAliases = [
        'Allmessages'               => [ 'Messatge_sistèma', 'Messatge_del_sistèma' ],
        'Allpages'                  => [ 'Totas_las_paginas' ],
@@ -285,4 +289,3 @@ $dateFormats = [
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 
 $linkTrail = "/^([a-zàâçéèêîôû]+)(.*)$/sDu";
-
index 14f5b6f..022a9ac 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-$fallback = 'ru';
+$fallback = 'fi'; // T146744#2678472
 
 $namespaceNames = [
        NS_MEDIA            => 'Medii',
@@ -30,4 +30,3 @@ $namespaceNames = [
 ];
 
 $linkTrail = '/^([a-zčČšŠžŽäÄöÖ]+)(.*)$/sDu';
-
index 4f500a7..d17105a 100644 (file)
@@ -252,4 +252,3 @@ $magicWords = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 5ba4ff5..44e943e 100644 (file)
@@ -179,4 +179,3 @@ $magicWords = [
 
 $linkTrail = '/^((?:[a-z]|а|æ|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|“|»)+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
-
index 856ffa2..253119b 100644 (file)
@@ -182,4 +182,3 @@ $magicWords = [
 $linkTrail = '/^([ਁਂਃਅਆਇਈਉਊਏਐਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਲ਼ਵਸ਼ਸਹ਼ਾਿੀੁੂੇੈੋੌ੍ਖ਼ਗ਼ਜ਼ੜਫ਼ੰੱੲੳa-z]+)(.*)$/sDu';
 
 $digitGroupingPattern = "##,##,###";
-
index ff9a2b4..62c8418 100644 (file)
@@ -14,4 +14,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 449ec0e..bd13273 100644 (file)
@@ -58,4 +58,3 @@ $specialPageAliases = [
        'Listbots'                  => [ 'Waddefresser', 'Bots' ],
        'Search'                    => [ 'Uffgucke', 'Suche' ],
 ];
-
index 1e4706d..6365b8a 100644 (file)
@@ -60,4 +60,3 @@ $namespaceAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index f49889a..7062e07 100644 (file)
@@ -42,4 +42,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index cfe0345..d7b5bea 100644 (file)
@@ -317,4 +317,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'strony', 'pages' ],
        'pagesincategory_files'     => [ '0', 'pliki', 'files' ],
 ];
-
index 7fd9f1f..1d1a8c3 100644 (file)
@@ -39,4 +39,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Categorìa',
        NS_CATEGORY_TALK    => 'Discussion_ant_sla_categorìa',
 ];
-
index 239c888..410927b 100644 (file)
@@ -16,6 +16,8 @@
  * @author ZaDiak
  */
 
+$fallback = 'el';
+
 $namespaceNames = [
        NS_MEDIA            => 'Μέσον',
        NS_SPECIAL          => 'Ειδικόν',
@@ -53,4 +55,3 @@ $dateFormats = [
        'pnt date' => 'j xg Y',
        'pnt both' => 'H:i, j xg Y',
 ];
-
index cc555b6..5db6ce4 100644 (file)
@@ -155,4 +155,3 @@ $magicWords = [
        'noindex'                   => [ '1', '__بې_ليکلړ__', '__NOINDEX__' ],
        'protectionlevel'           => [ '1', 'ژغورکچه', 'PROTECTIONLEVEL' ],
 ];
-
index 5c3c191..f020303 100644 (file)
@@ -329,4 +329,3 @@ $magicWords = [
        'staticredirect'            => [ '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ],
        'protectionlevel'           => [ '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ],
 ];
-
index 8f84f20..61625e1 100644 (file)
@@ -328,4 +328,3 @@ $magicWords = [
        'protectionlevel'           => [ '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ],
        'url_path'                  => [ '0', 'CAMINHO', 'PATH' ],
 ];
-
index eb1c8d9..d8282dc 100644 (file)
@@ -277,4 +277,3 @@ $magicWords = [
        'protectionlevel'           => [ '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ],
        'formatdate'                => [ '0', 'punchawrikchakuy', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ],
 ];
-
index a85d801..523783e 100644 (file)
@@ -34,4 +34,3 @@ $namespaceNames = [
 
 // Remove Spanish gender aliases (bug 37090)
 $namespaceGenderAliases = [];
-
index 7304dbf..d4da53f 100644 (file)
@@ -40,4 +40,3 @@ $magicWords = [
        'img_manualthumb'           => [ '1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ],
        'img_upright'               => [ '1', 'sidretg', 'sidretg=$1', 'sidretg_$1', 'upright', 'upright=$1', 'upright $1' ],
 ];
-
index 0a5fd11..cb6b47d 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Shopni',
        NS_CATEGORY_TALK    => 'Shopni_vakyarimata',
 ];
-
index 8b92171..55674ce 100644 (file)
@@ -292,4 +292,3 @@ $dateFormats = [
 $fallback8bitEncoding = 'iso8859-2';
 
 $linkTrail = '/^([a-zăâîşţșțĂÂÎŞŢȘȚ]+)(.*)$/sDu';
-
index 838ea33..7c3663a 100644 (file)
@@ -12,6 +12,8 @@
  * @author Reder
  */
 
+$fallback = 'it';
+
 $specialPageAliases = [
        'Allmessages'               => [ 'TutteLeMessagge' ],
        'Preferences'               => [ 'Preferenze' ],
@@ -21,4 +23,3 @@ $specialPageAliases = [
        'Version'                   => [ 'Versione' ],
        'Watchlist'                 => [ 'PàggeneCondrollete' ],
 ];
-
index e1af8f3..3041abd 100644 (file)
@@ -413,7 +413,7 @@ $bookstoreList = [
        'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
        'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
        'Books.Ru' => 'http://www.books.ru/shop/search?query=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 /**
@@ -439,4 +439,3 @@ $imageFiles = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
-
index 34832b0..6225aef 100644 (file)
@@ -128,4 +128,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Одказы_гев' ],
        'Withoutinterwiki'          => [ 'Без_інтервікі' ],
 ];
-
diff --git a/languages/messages/MessagesRup.php b/languages/messages/MessagesRup.php
new file mode 100644 (file)
index 0000000..041dc46
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+/** Aromanian (armãneashti)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ */
+
+$fallback = 'ro';
index 4a369bd..aa5fdeb 100644 (file)
@@ -283,4 +283,3 @@ $magicWords = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 38d58f6..8a69163 100644 (file)
@@ -41,4 +41,3 @@ $namespaceAliases = [
 
 // Remove Russian aliases
 $namespaceGenderAliases = [];
-
index 83770fa..0697595 100644 (file)
@@ -54,4 +54,3 @@ $dateFormats = [
 ];
 
 $linkTrail = "/^([a-z]+)(.*)$/sD";
-
index 43350d1..35d6e0a 100644 (file)
@@ -149,4 +149,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'PuntanoQui' ],
        'Withoutinterwiki'          => [ 'PagineSenzaInterwiki' ],
 ];
-
index 20c23f3..4d4a48e 100644 (file)
@@ -150,4 +150,3 @@ $magicWords = [
        'pagesincategory'           => [ '1', 'زمريجاصفحا', 'PAGESINCATEGORY', 'PAGESINCAT' ],
        'pagesize'                  => [ '1', 'صفحيجيماپ', 'PAGESIZE' ],
 ];
-
index 53e763f..954f3b6 100644 (file)
@@ -101,4 +101,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'PuntaniInogghi' ],
        'Withoutinterwiki'          => [ 'PàginiChenaInterwiki' ],
 ];
-
index e04b004..8e1d476 100644 (file)
@@ -137,4 +137,3 @@ $magicWords = [
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 
 $linkTrail = '/^(:?[a-zàáâçčʒǯđðéèêëǧǥȟíìîïıǩŋñóòôõßšŧúùûýÿüžþæøåäö]+)(.*)$/sDu';
-
index b6de002..1253350 100644 (file)
@@ -14,4 +14,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index adf90ce..f0367ae 100644 (file)
@@ -56,4 +56,3 @@ $namespaceAliases = [
 ];
 
 $namespaceGenderAliases = [];
-
index fb79237..8130978 100644 (file)
@@ -13,6 +13,8 @@
  * @author לערי ריינהארט
  */
 
+$fallback = 'bs, sr-el, hr';
+
 $namespaceNames = [
        NS_SPECIAL          => 'Posebno',
        NS_TALK             => 'Razgovor',
@@ -30,6 +32,23 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Razgovor_o_kategoriji',
 ];
 
+# Some dummy translations to prevent language fallback for now
+# @TODO: Check whether localising them is appropriate.
+$namespaceGenderAliases = [];
+$defaultDateFormat = 'dmy';
+$datePreferences = [
+       'default',
+       'dmy',
+       'ymd',
+       'ISO 8601',
+];
+$datePreferenceMigrationMap = [
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
+];
+
 $specialPageAliases = [
        'Activeusers'               => [ 'Aktivni_korisnici' ],
        'Allmessages'               => [ 'Sve_poruke' ],
@@ -202,4 +221,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zčćđžš]+)(.*)$/sDu';
-
index eeed627..89e74e9 100644 (file)
@@ -188,4 +188,3 @@ $magicWords = [
        'img_middle'                => [ '1', 'මැද', 'middle' ],
        'special'                   => [ '0', 'විශේෂ', 'special' ],
 ];
-
index 40dc198..0399bfa 100644 (file)
@@ -177,9 +177,9 @@ $bookstoreList = [
        'Haugenbok' => 'http://www.haugenbok.no/searchresults.cfm?searchtype=simple&isbn=$1',
        'Akademika' => 'http://www.akademika.no/sok.php?isbn=$1',
        'Gnist' => 'http://www.gnist.no/sok.php?isbn=$1',
-       'Amazon.co.uk' => 'http://www.amazon.co.uk/exec/obidos/ISBN=$1',
-       'Amazon.de' => 'http://www.amazon.de/exec/obidos/ISBN=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.co.uk' => 'https://www.amazon.co.uk/exec/obidos/ISBN=$1',
+       'Amazon.de' => 'https://www.amazon.de/exec/obidos/ISBN=$1',
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -290,4 +290,3 @@ $separatorTransformTable = [
 ];
 
 $linkTrail = '/^([a-záäčďéíľĺňóôŕšťúýž]+)(.*)$/sDu';
-
index 7599bc2..3893109 100644 (file)
@@ -182,4 +182,3 @@ $dateFormats = [
 
 $fallback8bitEncoding = "iso-8859-2";
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index a0d88d4..b674c49 100644 (file)
@@ -211,4 +211,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index 2bf0156..892307a 100644 (file)
@@ -15,4 +15,3 @@
 
 $fallback = 'sr-ec';
 $linkTrail = '/^([abvgdđežzijklljmnnjoprstćufhcčdžšабвгдђежзијклљмнњопрстћуфхцчџш]+)(.*)$/usD';
-
index a34771d..9a6c51f 100644 (file)
@@ -405,4 +405,3 @@ $magicWords = [
        'pagesincategory_files'     => [ '0', 'датотеке', 'files' ],
 ];
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index b03a482..b4d715b 100644 (file)
@@ -301,4 +301,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index c42b4bc..fc26b43 100644 (file)
@@ -148,4 +148,3 @@ $magicWords = [
        'talkspacee'                => [ '1', 'TAKIPREKIE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ],
        'special'                   => [ '0', 'spesyal', 'speciaal', 'special' ],
 ];
-
index cce58e8..4f656d4 100644 (file)
@@ -41,4 +41,3 @@ $namespaceGenderAliases = [
        NS_USER => [ 'male' => 'Benutser', 'female' => 'Benutserske' ],
        NS_USER_TALK => [ 'male' => 'Benutser_Diskussion', 'female' => 'Benutserske_Diskussion' ],
 ];
-
index 5646cf1..75fff56 100644 (file)
@@ -123,4 +123,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'NumbuKaDieu' ],
        'Withoutinterwiki'          => [ 'TanpaInterwiki' ],
 ];
-
index 8819be6..01c33ee 100644 (file)
@@ -338,4 +338,3 @@ $dateFormats = [
        'ymd date' => 'Y F j',
        'ymd both' => 'Y F j "kl." H.i',
 ];
-
index 2aa75cd..a7f4278 100644 (file)
@@ -119,4 +119,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Maangalizi' ],
        'Whatlinkshere'             => [ 'VingoViungavyoUkurasahuu' ],
 ];
-
index 97853d4..797e443 100644 (file)
@@ -62,4 +62,3 @@ $namespaceAliases = [
 
 // Remove Polish gender aliases
 $namespaceGenderAliases = [];
-
index 1702d1f..f089896 100644 (file)
@@ -83,4 +83,3 @@ $magicWords = [
 $linkTrail = "/^([\xE0\xAE\x80-\xE0\xAF\xBF]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index 4383ab4..7ad1a7e 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'ವರ್ಗೊ',
        NS_CATEGORY_TALK    => 'ವರ್ಗೊ_ಪಾತೆರ',
 ];
-
index f322cfd..8e1020b 100644 (file)
@@ -147,4 +147,3 @@ $magicWords = [
 $linkTrail = "/^([\xE0\xB0\x81-\xE0\xB1\xAF]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index 6680d3c..18eb9fa 100644 (file)
@@ -69,4 +69,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pájina_sira_ne\'ebé_bá_iha_ne\'e' ],
        'Withoutinterwiki'          => [ 'Laiha_interwiki' ],
 ];
-
index 9c58ee6..bd107f5 100644 (file)
@@ -67,4 +67,3 @@ $dateFormats = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхчшъэюяғӣқўҳҷцщыь]+)(.*)$/sDu';
-
index 484d400..39b636a 100644 (file)
@@ -190,4 +190,3 @@ $dateFormats = [
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 ];
-
index 484446b..1ae4716 100644 (file)
@@ -35,4 +35,3 @@ $namespaceNames = [
 ];
 
 $linkTrail = '/^([a-zÄäÇçĞğŇňÖöŞşÜüÝýŽž]+)(.*)$/sDu';
-
index 0c1813c..949969b 100644 (file)
@@ -144,4 +144,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Ano_ang_nakakawing_dito' ],
        'Withoutinterwiki'          => [ 'Walang_ugnayang-wiki' ],
 ];
-
index 613cb28..ed0ff28 100644 (file)
@@ -154,4 +154,3 @@ $magicWords = [
        'pagesize'                  => [ '1', 'СӘҺИФӘ_ПАМЈӘ', 'PAGESIZE' ],
        'url_wiki'                  => [ '0', 'ВИКИ', 'WIKI' ],
 ];
-
index 8e8d475..16fa65f 100644 (file)
@@ -47,4 +47,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Lukautbuk' ],
        'Whatlinkshere'             => [ 'Ol link ikam long hia' ],
 ];
-
index 9e07263..564da6c 100644 (file)
@@ -354,4 +354,3 @@ $magicWords = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zÇĞçğİıÖöŞşÜüÂâÎîÛû]+)(.*)$/sDu';
-
index 34c3cca..9d95444 100644 (file)
@@ -210,4 +210,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюяӘәӨөҮүҖҗҢңҺһ]+)(.*)$/sDu';
-
index da073b1..c545012 100644 (file)
@@ -89,4 +89,3 @@ $magicWords = [
 $fallback8bitEncoding = "windows-1254";
 
 $linkTrail = '/^([a-zäçğıñöşü“»]+)(.*)$/sDu';
-
index cc9e2a3..7742b68 100644 (file)
@@ -15,4 +15,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 32194f6..01254e7 100644 (file)
@@ -116,8 +116,7 @@ $bookstoreList = [
        'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
        'Books.Ru' => 'http://www.books.ru/shop/search/advanced?as%5Btype%5D=books&as%5Bname%5D=&as%5Bisbn%5D=$1&as%5Bauthor%5D=&as%5Bmaker%5D=&as%5Bcontents%5D=&as%5Binfo%5D=&as%5Bdate_after%5D=&as%5Bdate_before%5D=&as%5Bprice_less%5D=&as%5Bprice_more%5D=&as%5Bstrict%5D=%E4%E0&as%5Bsub%5D=%E8%F1%EA%E0%F2%FC&x=22&y=8',
        'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1'
 ];
-
index 79cf100..46d5dcb 100644 (file)
@@ -45,4 +45,3 @@ $namespaceGenderAliases = [];
 $linkTrail = '/^([a-zа-яёӝӟӥӧӵ]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 13d5775..492fbcb 100644 (file)
@@ -45,4 +45,3 @@ $specialPageAliases = [
        'Allpages'                  => [ 'بارلىق_بەتلەر' ],
        'Ancientpages'              => [ 'كونا_بەتلەر' ],
 ];
-
index 369e0be..480d94f 100644 (file)
@@ -58,7 +58,6 @@ $separatorTransformTable = [
        '.' => ','
 ];
 
-$fallback = 'ru';
 $fallback8bitEncoding = 'windows-1251';
 $linkPrefixExtension = true;
 
@@ -86,11 +85,23 @@ $namespaceAliases = [
        'Зображення' => NS_FILE,
        'Обговорення_зображення' => NS_FILE_TALK,
        'Обговорення_шаблона' => NS_TEMPLATE_TALK,
+       // Backwards compatibility from Russian
+       'Медиа' => NS_MEDIA,
+       'Служебная' => NS_SPECIAL,
+       'Обсуждение' => NS_TALK,
+       'Участник' => NS_USER,
+       'Обсуждение_участника' => NS_USER_TALK,
+       'Обсуждение_файла' => NS_FILE_TALK,
+       'Обсуждение_MediaWiki' => NS_MEDIAWIKI_TALK,
+       'Обсуждение_шаблона' => NS_TEMPLATE_TALK,
+       'Справка' => NS_HELP,
+       'Обсуждение_справки' => NS_HELP_TALK,
+       'Категория' => NS_CATEGORY,
+       'Обсуждение_категории' => NS_CATEGORY_TALK,
+       'Изображение' => NS_FILE,
+       'Обсуждение_изображения' => NS_FILE_TALK,
 ];
 
-// Remove Russian aliases
-$namespaceGenderAliases = [];
-
 $dateFormats = [
        'mdy time' => 'H:i',
        'mdy date' => 'xg j, Y',
@@ -110,111 +121,112 @@ $dateFormats = [
 ];
 
 $bookstoreList = [
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
+// Russian names are kept for backwards compatibility
 $specialPageAliases = [
-       'Activeusers'               => [ 'Активні_дописувачі' ],
-       'Allmessages'               => [ 'Системні_повідомлення' ],
-       'AllMyUploads'              => [ 'Усі_мої_файли' ],
-       'Allpages'                  => [ 'Усі_сторінки' ],
+       'Activeusers'               => [ 'Активні_дописувачі', 'Активные_участники' ],
+       'Allmessages'               => [ 'Системні_повідомлення', 'Системные_сообщения' ],
+       'AllMyUploads'              => [ 'Усі_мої_файли', 'Все_мои_файлы' ],
+       'Allpages'                  => [ 'Усі_сторінки', 'Все_страницы' ],
        'Ancientpages'              => [ 'Давні_сторінки' ],
-       'Badtitle'                  => [ 'Помилковий_заголовок' ],
-       'Blankpage'                 => [ 'Порожня_сторінка' ],
-       'Block'                     => [ 'Заблокувати' ],
-       'Booksources'               => [ 'Джерела_книг' ],
-       'BrokenRedirects'           => [ 'Розірвані_перенаправлення' ],
-       'Categories'                => [ 'Категорії' ],
-       'ChangeEmail'               => [ 'Змінити_e-mail' ],
-       'ChangePassword'            => [ 'Змінити_пароль' ],
-       'ComparePages'              => [ 'Порівняння_сторінок' ],
-       'Confirmemail'              => [ 'Підтвердити_e-mail' ],
-       'Contributions'             => [ 'Внесок' ],
-       'CreateAccount'             => [ 'Створити_обліковий_запис' ],
-       'Deadendpages'              => [ 'Сторінки_без_посилань' ],
-       'DeletedContributions'      => [ 'Вилучений_внесок' ],
-       'DoubleRedirects'           => [ 'Подвійні_перенаправлення' ],
-       'EditWatchlist'             => [ 'Редагувати_список_спостереження' ],
-       'Emailuser'                 => [ 'Лист_користувачеві' ],
-       'ExpandTemplates'           => [ 'Розгортання_шаблонів' ],
-       'Export'                    => [ 'Експорт' ],
-       'Fewestrevisions'           => [ 'Найменшредаговані' ],
-       'FileDuplicateSearch'       => [ 'Пошук_дублікатів_файлів' ],
-       'Filepath'                  => [ 'Шлях_до_файлу' ],
-       'Import'                    => [ 'Імпорт' ],
-       'Invalidateemail'           => [ 'Неперевірена_email-адреса' ],
-       'JavaScriptTest'            => [ 'JavaScript_тест' ],
-       'BlockList'                 => [ 'Список_блокувань', 'Блокування', 'Блокування_IP-адрес' ],
-       'LinkSearch'                => [ 'Пошук_посилань' ],
-       'Listadmins'                => [ 'Список_адміністраторів' ],
-       'Listbots'                  => [ 'Список_ботів' ],
-       'Listfiles'                 => [ 'Список_файлів' ],
-       'Listgrouprights'           => [ 'Список_прав_груп', 'Права_груп_користувачів' ],
-       'Listredirects'             => [ 'Список_перенаправлень' ],
-       'ListDuplicatedFiles'       => [ 'Список_дубльованих_файлів' ],
-       'Listusers'                 => [ 'Список_користувачів' ],
-       'Lockdb'                    => [ 'Заблокувати_базу_даних' ],
-       'Log'                       => [ 'Журнали' ],
-       'Lonelypages'               => [ 'Ізольовані_сторінки' ],
-       'Longpages'                 => [ 'Найдовші_сторінки' ],
-       'MergeHistory'              => [ 'Об\'єднання_історії' ],
-       'MIMEsearch'                => [ 'Пошук_за_MIME' ],
-       'Mostcategories'            => [ 'Найбільш_категоризовані' ],
-       'Mostimages'                => [ 'Найуживаніші_файли' ],
-       'Mostinterwikis'            => [ 'Найбільше_інтервікі' ],
-       'Mostlinked'                => [ 'Найуживаніші_сторінки', 'Найбільше_посилань' ],
-       'Mostlinkedcategories'      => [ 'Найуживаніші_категорії' ],
-       'Mostlinkedtemplates'       => [ 'Найуживаніші_шаблони' ],
-       'Mostrevisions'             => [ 'Найбільш_редаговані' ],
-       'Movepage'                  => [ 'Перейменувати' ],
-       'Mycontributions'           => [ 'Мій_внесок' ],
-       'MyLanguage'                => [ 'Моя_мова' ],
-       'Mypage'                    => [ 'Моя_сторінка' ],
-       'Mytalk'                    => [ 'Моє_обговорення' ],
-       'Myuploads'                 => [ 'Мої_завантаження' ],
-       'Newimages'                 => [ 'Нові_файли' ],
-       'Newpages'                  => [ 'Нові_сторінки' ],
-       'PasswordReset'             => [ 'Скинути_пароль' ],
-       'PermanentLink'             => [ 'Постійне_посилання' ],
-       'Preferences'               => [ 'Налаштування' ],
-       'Prefixindex'               => [ 'Покажчик_за_початком_назви' ],
-       'Protectedpages'            => [ 'Захищені_сторінки' ],
-       'Protectedtitles'           => [ 'Захищені_назви_сторінок' ],
-       'Randompage'                => [ 'Випадкова_сторінка' ],
-       'Randomredirect'            => [ 'Випадкове_перенаправлення' ],
-       'Recentchanges'             => [ 'Нові_редагування' ],
-       'Recentchangeslinked'       => [ 'Пов\'язані_редагування' ],
+       'Badtitle'                  => [ 'Помилковий_заголовок', 'Недопустимое_название' ],
+       'Blankpage'                 => [ 'Порожня_сторінка', 'Пустая_страница' ],
+       'Block'                     => [ 'Заблокувати', 'Заблокировать' ],
+       'Booksources'               => [ 'Джерела_книг', 'Источники_книг' ],
+       'BrokenRedirects'           => [ 'Розірвані_перенаправлення', 'Разорванные_перенаправления' ],
+       'Categories'                => [ 'Категорії', 'Категории' ],
+       'ChangeEmail'               => [ 'Змінити_e-mail', 'Сменить_e-mail', 'Сменить_почту' ],
+       'ChangePassword'            => [ 'Змінити_пароль', 'Сменить_пароль' ],
+       'ComparePages'              => [ 'Порівняння_сторінок', 'Сравнение_страниц' ],
+       'Confirmemail'              => [ 'Підтвердити_e-mail', 'Подтвердить_e-mail', 'Подтвердить_почту' ],
+       'Contributions'             => [ 'Внесок', 'Вклад' ],
+       'CreateAccount'             => [ 'Створити_обліковий_запис', 'Создать_учётную_запись', 'Создать_пользователя', 'Зарегистрироваться' ],
+       'Deadendpages'              => [ 'Сторінки_без_посилань', 'Тупиковые_страницы' ],
+       'DeletedContributions'      => [ 'Вилучений_внесок', 'Удалённый_вклад' ],
+       'DoubleRedirects'           => [ 'Подвійні_перенаправлення', 'Двойные_перенаправления' ],
+       'EditWatchlist'             => [ 'Редагувати_список_спостереження', 'Править_список_наблюдения' ],
+       'Emailuser'                 => [ 'Лист_користувачеві', 'Письмо_участнику', 'Отправить_письмо' ],
+       'ExpandTemplates'           => [ 'Розгортання_шаблонів', 'Развёртка_шаблонов' ],
+       'Export'                    => [ 'Експорт', 'Экспорт', 'Выгрузка' ],
+       'Fewestrevisions'           => [ 'Найменшредаговані', 'Редко_редактируемые' ],
+       'FileDuplicateSearch'       => [ 'Пошук_дублікатів_файлів', 'Поиск_дубликатов_файлов' ],
+       'Filepath'                  => [ 'Шлях_до_файлу', 'Путь_к_файлу' ],
+       'Import'                    => [ 'Імпорт', 'Импорт' ],
+       'Invalidateemail'           => [ 'Неперевірена_email-адреса', 'Отменить_подтверждение_адреса' ],
+       'JavaScriptTest'            => [ 'JavaScript_тест', 'Тестирование_JavaScript' ],
+       'BlockList'                 => [ 'Список_блокувань', 'Блокування', 'Блокування_IP-адрес', 'Список_блокировок', 'Блокировки' ],
+       'LinkSearch'                => [ 'Пошук_посилань', 'Поиск_ссылок' ],
+       'Listadmins'                => [ 'Список_адміністраторів', 'Список_администраторов' ],
+       'Listbots'                  => [ 'Список_ботів', 'Список_ботов' ],
+       'Listfiles'                 => [ 'Список_файлів', 'Список_файлов', 'Список_изображений' ],
+       'Listgrouprights'           => [ 'Список_прав_груп', 'Права_груп_користувачів', 'Права_групп_участников', 'Список_прав_групп' ],
+       'Listredirects'             => [ 'Список_перенаправлень', 'Список_перенаправлений' ],
+       'ListDuplicatedFiles'       => [ 'Список_дубльованих_файлів', 'Список_файлов-дубликатов' ],
+       'Listusers'                 => [ 'Список_користувачів', 'Список_участников' ],
+       'Lockdb'                    => [ 'Заблокувати_базу_даних', 'Заблокировать_БД', 'Заблокировать_базу_данных' ],
+       'Log'                       => [ 'Журнали', 'Журналы', 'Журнал' ],
+       'Lonelypages'               => [ 'Ізольовані_сторінки', 'Изолированные_страницы' ],
+       'Longpages'                 => [ 'Найдовші_сторінки', 'Длинные_страницы' ],
+       'MergeHistory'              => [ 'Об\'єднання_історії', 'Объединение_историй' ],
+       'MIMEsearch'                => [ 'Пошук_за_MIME', 'Поиск_по_MIME' ],
+       'Mostcategories'            => [ 'Найбільш_категоризовані', 'Самые_категоризованные' ],
+       'Mostimages'                => [ 'Найуживаніші_файли', 'Самые_используемые_файлы' ],
+       'Mostinterwikis'            => [ 'Найбільше_інтервікі', 'Наибольшее_количество_интервики-ссылок' ],
+       'Mostlinked'                => [ 'Найуживаніші_сторінки', 'Найбільше_посилань', 'Самые_используемые_страницы' ],
+       'Mostlinkedcategories'      => [ 'Найуживаніші_категорії', 'Самые_используемые_категории' ],
+       'Mostlinkedtemplates'       => [ 'Найуживаніші_шаблони', 'Самые_используемые_шаблоны' ],
+       'Mostrevisions'             => [ 'Найбільш_редаговані', 'Наибольшее_количество_версий' ],
+       'Movepage'                  => [ 'Перейменувати', 'Переименовать_страницу', 'Переименование', 'Переименовать' ],
+       'Mycontributions'           => [ 'Мій_внесок', 'Мой_вклад' ],
+       'MyLanguage'                => [ 'Моя_мова', 'Мой_язык' ],
+       'Mypage'                    => [ 'Моя_сторінка', 'Моя_страница' ],
+       'Mytalk'                    => [ 'Моє_обговорення', 'Моё_обсуждение' ],
+       'Myuploads'                 => [ 'Мої_завантаження', 'Мои_загрузки' ],
+       'Newimages'                 => [ 'Нові_файли', 'Новые_файлы' ],
+       'Newpages'                  => [ 'Нові_сторінки', 'Новые_страницы' ],
+       'PasswordReset'             => [ 'Скинути_пароль', 'Сброс_пароля' ],
+       'PermanentLink'             => [ 'Постійне_посилання', 'Постоянная_ссылка' ],
+       'Preferences'               => [ 'Налаштування', 'Настройки' ],
+       'Prefixindex'               => [ 'Покажчик_за_початком_назви', 'Указатель_по_началу_названия' ],
+       'Protectedpages'            => [ 'Захищені_сторінки', 'Защищённые_страницы' ],
+       'Protectedtitles'           => [ 'Захищені_назви_сторінок', 'Защищённые_названия' ],
+       'Randompage'                => [ 'Випадкова_сторінка', 'Случайная_страница', 'Случайная' ],
+       'Randomredirect'            => [ 'Випадкове_перенаправлення', 'Случайное_перенаправление' ],
+       'Recentchanges'             => [ 'Нові_редагування', 'Свежие_правки' ],
+       'Recentchangeslinked'       => [ 'Пов\'язані_редагування', 'Связанные_правки' ],
        'Redirect'                  => [ 'Перенаправлення' ],
-       'Revisiondelete'            => [ 'Вилучити_редагування' ],
-       'Search'                    => [ 'Пошук' ],
-       'Shortpages'                => [ 'Короткі_сторінки' ],
-       'Specialpages'              => [ 'Спеціальні_сторінки' ],
+       'Revisiondelete'            => [ 'Вилучити_редагування', 'Удаление_правки' ],
+       'Search'                    => [ 'Пошук', 'Поиск' ],
+       'Shortpages'                => [ 'Короткі_сторінки', 'Короткие_страницы' ],
+       'Specialpages'              => [ 'Спеціальні_сторінки', 'Спецстраницы' ],
        'Statistics'                => [ 'Статистика' ],
-       'Tags'                      => [ 'Мітки' ],
-       'Unblock'                   => [ 'Розблокувати' ],
-       'Uncategorizedcategories'   => [ 'Некатегоризовані_категорії' ],
-       'Uncategorizedimages'       => [ 'Некатегоризовані_файли' ],
-       'Uncategorizedpages'        => [ 'Некатегоризовані_сторінки' ],
-       'Uncategorizedtemplates'    => [ 'Некатегоризовані_шаблони' ],
-       'Undelete'                  => [ 'Відновити' ],
-       'Unlockdb'                  => [ 'Розблокувати_базу_даних' ],
-       'Unusedcategories'          => [ 'Порожні_категорії' ],
-       'Unusedimages'              => [ 'Невикористані_файли' ],
-       'Unusedtemplates'           => [ 'Невикористані_шаблони' ],
+       'Tags'                      => [ 'Мітки', 'Метки' ],
+       'Unblock'                   => [ 'Розблокувати', 'Разблокировка' ],
+       'Uncategorizedcategories'   => [ 'Некатегоризовані_категорії', 'Некатегоризованные_категории' ],
+       'Uncategorizedimages'       => [ 'Некатегоризовані_файли', 'Некатегоризованные_файлы' ],
+       'Uncategorizedpages'        => [ 'Некатегоризовані_сторінки', 'Некатегоризованные_страницы' ],
+       'Uncategorizedtemplates'    => [ 'Некатегоризовані_шаблони', 'Некатегоризованные_шаблоны' ],
+       'Undelete'                  => [ 'Відновити', 'Восстановить', 'Восстановление' ],
+       'Unlockdb'                  => [ 'Розблокувати_базу_даних', 'Разблокировка_БД' ],
+       'Unusedcategories'          => [ 'Порожні_категорії', 'Неиспользуемые_категории' ],
+       'Unusedimages'              => [ 'Невикористані_файли', 'Неиспользуемые_файлы' ],
+       'Unusedtemplates'           => [ 'Невикористані_шаблони', 'Неиспользуемые_шаблоны' ],
        'Unwatchedpages'            => [ 'Неспостережувані' ],
-       'Upload'                    => [ 'Завантаження' ],
-       'UploadStash'               => [ 'Приховане_завантаження' ],
-       'Userlogin'                 => [ 'Вхід' ],
-       'Userlogout'                => [ 'Вихід' ],
-       'Userrights'                => [ 'Керування_правами_користувачів' ],
-       'Version'                   => [ 'Версія' ],
-       'Wantedcategories'          => [ 'Потрібні_категорії' ],
-       'Wantedfiles'               => [ 'Потрібні_файли' ],
-       'Wantedpages'               => [ 'Потрібні_сторінки' ],
-       'Wantedtemplates'           => [ 'Потрібні_шаблони' ],
-       'Watchlist'                 => [ 'Список_спостереження' ],
-       'Whatlinkshere'             => [ 'Посилання_сюди' ],
-       'Withoutinterwiki'          => [ 'Без_інтервікі' ],
+       'Upload'                    => [ 'Завантаження', 'Загрузка' ],
+       'UploadStash'               => [ 'Приховане_завантаження', 'Скрытная_загрузка' ],
+       'Userlogin'                 => [ 'Вхід', 'Вход' ],
+       'Userlogout'                => [ 'Вихід', 'Завершение_сеанса', 'Выход' ],
+       'Userrights'                => [ 'Керування_правами_користувачів', 'Управление_правами' ],
+       'Version'                   => [ 'Версія', 'Версия' ],
+       'Wantedcategories'          => [ 'Потрібні_категорії', 'Требуемые_категории' ],
+       'Wantedfiles'               => [ 'Потрібні_файли', 'Требуемые_файлы' ],
+       'Wantedpages'               => [ 'Потрібні_сторінки', 'Требуемые_страницы' ],
+       'Wantedtemplates'           => [ 'Потрібні_шаблони', 'Требуемые_шаблоны' ],
+       'Watchlist'                 => [ 'Список_спостереження', 'Список_наблюдения' ],
+       'Whatlinkshere'             => [ 'Посилання_сюди', 'Ссылки_сюда' ],
+       'Withoutinterwiki'          => [ 'Без_інтервікі', 'Без_интервики' ],
 ];
 
 $magicWords = [
@@ -368,8 +380,8 @@ $magicWords = [
        'pagesincategory_all'       => [ '0', 'усе', 'все', 'all' ],
        'pagesincategory_pages'     => [ '0', 'сторінки', 'страницы', 'pages' ],
        'pagesincategory_subcats'   => [ '0', 'підкатегорії', 'подкатегории', 'subcats' ],
+       'pagesincategory_files'     => [ '0', 'файли', 'файлы', 'files' ],
 ];
 
 $linkTrail = '/^([a-zабвгґдеєжзиіїйклмнопрстуфхцчшщьєюяёъы“»]+)(.*)$/sDu';
 $linkPrefixCharset = '„«';
-
index d5449bf..cac8482 100644 (file)
@@ -167,4 +167,3 @@ $magicWords = [
        'index'                     => [ '1', '__اشاریہ__', '__INDEX__' ],
        'noindex'                   => [ '1', '__نااشاریہ__', '__NOINDEX__' ],
 ];
-
index 1f3aae2..53d8efa 100644 (file)
@@ -123,4 +123,3 @@ $separatorTransformTable = [
        '.' => ',',
        ',' => "\xc2\xa0", # nbsp
 ];
-
index f71092c..986d9bd 100644 (file)
@@ -155,4 +155,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'PuntaQua' ],
        'Withoutinterwiki'          => [ 'PagineSensaInterwiki' ],
 ];
-
index 0283b7d..b28c618 100644 (file)
@@ -85,4 +85,3 @@ $magicWords = [
        'fullurl'                   => [ '0', 'TÄUZ\'URL:', 'KOGUURL:', 'FULLURL:' ],
        'index'                     => [ '1', '__INDEKS__', 'INDEKSIGA', '__INDEX__' ],
 ];
-
index 201a677..64d4604 100644 (file)
@@ -351,4 +351,3 @@ $datePreferenceMigrationMap = [
 
 $linkTrail = "/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÏÖÜÀÈÙ]+)(.*)$/sDu";
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index a28777f..271fae1 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Categorie',
        NS_CATEGORY_TALK    => 'Discuusje_categorie',
 ];
-
index 7400417..1a29f02 100644 (file)
@@ -61,4 +61,3 @@ $specialPageAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index ffb788a..d0f5ca5 100644 (file)
@@ -109,4 +109,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Galädalised' ],
        'Whatlinkshere'             => [ 'Yümsisio', 'Isio' ],
 ];
-
index 4829601..bef241a 100644 (file)
@@ -39,4 +39,3 @@ $namespaceNames = [
 $magicWords = [
        'redirect'                  => [ '0', '#saadaq', '#suuna', '#REDIRECT' ],
 ];
-
index 45841fd..68f3ae7 100644 (file)
@@ -83,4 +83,3 @@ $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 
 # $linkTrail = '/^([a-zåâêîôûçéèA-ZÅÂÊÎÔÛÇÉÈ]+)(.*)$/sDu';
 $linkTrail = '/^([a-zåâêîôûçéè]+)(.*)$/sDu';
-
index 1c6e9b5..8243e15 100644 (file)
@@ -60,4 +60,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'AnoAnNasumpayDinhi' ],
        'Withoutinterwiki'          => [ 'Warayinterwiki' ],
 ];
-
index d96b51f..7722884 100644 (file)
@@ -80,4 +80,3 @@ $specialPageAliases = [
        'Wantedpages'               => [ 'Xët yiñ laaj' ],
        'Watchlist'                 => [ 'Limu toppte' ],
 ];
-
index 477f76a..ddbebbd 100644 (file)
 
 $fallback = 'zh-hans';
 
+$datePreferences = [
+       'default',
+       'wuu',
+       'ISO 8601',
+];
+
+$defaultDateFormat = 'wuu';
+
+$dateFormats = [
+       'wuu time' => 'H:i',
+       'wuu date' => 'Y年n月j号 (D)',
+       'wuu both' => 'Y年n月j号 (D) H:i',
+];
index 68ad7fb..07f9716 100644 (file)
@@ -53,4 +53,3 @@ $namespaceAliases = [
 
 // Remove Russian aliases
 $namespaceGenderAliases = [];
-
index edc860e..1553f6d 100644 (file)
@@ -199,4 +199,3 @@ $magicWords = [
        'url_wiki'                  => [ '0', 'וויקי', 'ויקי', 'WIKI' ],
        'pagesincategory_pages'     => [ '0', 'בלעטער', 'דפים', 'pages' ],
 ];
-
index 46acbb5..fc8581b 100644 (file)
@@ -50,4 +50,3 @@ $specialPageAliases = [
        'Userlogin'                 => [ 'ÌwọléOníse' ],
        'Userlogout'                => [ 'Ìbọ̀sódeOníṣe' ],
 ];
-
index 2422244..58024d2 100644 (file)
@@ -193,7 +193,7 @@ $specialPageAliases = [
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       '亞馬遜' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+       '亞馬遜' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
        '博客來書店' => 'http://www.books.com.tw/exep/prod/booksfile.php?item=$1',
        '三民書店' => 'http://www.sanmin.com.tw/page-qsearch.asp?ct=search_isbn&qu=$1',
        '天下書店' => 'http://www.cwbook.com.tw/search/result1.jsp?field=2&keyWord=$1',
@@ -227,4 +227,3 @@ $dateFormats = [
        'yue ymd date' => 'Y-n-j',
        'yue ymd both' => 'Y-n-j H:i',
 ];
-
index bd56d64..a7978be 100644 (file)
@@ -40,4 +40,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Categorie',
        NS_CATEGORY_TALK    => 'Overleg_categorie',
 ];
-
index 845db8b..3ac5d58 100644 (file)
@@ -180,4 +180,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ '监视列表', '監視列表', '監視清单' ],
        'Whatlinkshere'             => [ '链入页面', '鏈入頁面', '連入頁面' ],
 ];
-
index b887a00..bd822d6 100644 (file)
@@ -15,4 +15,3 @@
 
 # Inherit everything for now
 $fallback = 'zh-hans';
-
index 7c80db1..7a0dbb6 100644 (file)
@@ -425,12 +425,11 @@ $dateFormats = [
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       '亚马逊' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
-       '卓越亚马逊' => 'http://www.amazon.cn/mn/advancedSearchApp?isbn=$1',
+       '亚马逊' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
+       '卓越亚马逊' => 'https://www.amazon.cn/mn/advancedSearchApp?isbn=$1',
        '当当网' => 'http://search.dangdang.com/search.aspx?key=$1',
        '博客来书店' => 'http://www.books.com.tw/exep/prod/booksfile.php?item=$1',
        '三民书店' => 'http://www.sanmin.com.tw/page-qsearch.asp?ct=search_isbn&qu=$1',
        '天下书店' => 'http://www.cwbook.com.tw/search/result1.jsp?field=2&keyWord=$1',
        '新丝路书店' => 'http://www.silkbook.com/function/Search_list_book_data.asp?item=5&text=$1'
 ];
-
index cfa926d..1bfe940 100644 (file)
@@ -306,4 +306,3 @@ $bookstoreList = [
        '天下書店' => 'http://www.cwbook.com.tw/search/result1.jsp?field=2&keyWord=$1',
        '新絲路書店' => 'http://www.silkbook.com/function/Search_list_book_data.asp?item=5&text=$1'
 ];
-
index c25e44f..b15b22f 100644 (file)
@@ -25,4 +25,3 @@ $specialPageAliases = [
        'ComparePages'              => [ '頁面比較' ],
        'Unblock'                   => [ '解除封禁' ],
 ];
-
index 48e79cf..962811c 100644 (file)
@@ -13,4 +13,3 @@
 
 # Inherit everything for now
 $fallback = 'zh-hans';
-
index 94510ef..a6c6b84 100644 (file)
@@ -105,4 +105,3 @@ $dateFormats = [
        'CNS 7648 compact date'  => '"ROC" xoY-m-d (l)',
        'CNS 7648 compact both'  => '"ROC" xoY-m-d (D) H:i',
 ];
-
diff --git a/maintenance/CodeCleanerGlobalsPass.inc b/maintenance/CodeCleanerGlobalsPass.inc
new file mode 100644 (file)
index 0000000..5e8e754
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Psy CodeCleaner to allow PHP super globals.
+ *
+ * https://github.com/bobthecow/psysh/issues/353
+ *
+ * Copyright © 2017 Justin Hileman <justin@justinhileman.info>
+ *
+ * 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 Justin Hileman <justin@justinhileman.info>
+ */
+
+/**
+ * Prefix the real command with a bunch of 'global $VAR;' commands, one for each global.
+ * This will make the shell behave as if it was running in the global scope (almost;
+ * variables created in the shell won't become global if no global variable by that name
+ * existed before).
+ */
+class CodeCleanerGlobalsPass extends \Psy\CodeCleaner\CodeCleanerPass {
+       private static $superglobals = [
+               'GLOBALS', '_SERVER', '_ENV', '_FILES', '_COOKIE', '_POST', '_GET', '_SESSION'
+       ];
+
+       public function beforeTraverse( array $nodes ) {
+               $names = [];
+               foreach ( array_diff( array_keys( $GLOBALS ), self::$superglobals ) as $name ) {
+                       array_push( $names, new \PhpParser\Node\Expr\Variable( $name ) );
+               }
+
+               array_unshift( $nodes, new \PhpParser\Node\Stmt\Global_( $names ) );
+
+               return $nodes;
+       }
+}
+
index 552bec0..62dc36c 100644 (file)
@@ -38,6 +38,7 @@ $maintClass = false;
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * Abstract maintenance class for quickly writing and churning out
@@ -498,7 +499,7 @@ abstract class Maintenance {
         */
        public function getConfig() {
                if ( $this->config === null ) {
-                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                return $this->config;
diff --git a/maintenance/archives/patch-externallinks-el_index_60.sql b/maintenance/archives/patch-externallinks-el_index_60.sql
new file mode 100644 (file)
index 0000000..eacb107
--- /dev/null
@@ -0,0 +1,4 @@
+-- @since 1.29
+ALTER TABLE /*$wgDBprefix*/externallinks ADD COLUMN el_index_60 varbinary(60) NOT NULL DEFAULT '';
+CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id);
+CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id);
diff --git a/maintenance/archives/patch-user_groups-primary-key.sql b/maintenance/archives/patch-user_groups-primary-key.sql
new file mode 100644 (file)
index 0000000..e3c8735
--- /dev/null
@@ -0,0 +1,5 @@
+-- Convert unique index into a primary key on user_groups
+
+ALTER TABLE /*$wgDBprefix*/user_groups
+  DROP INDEX ug_user_group,
+  ADD PRIMARY KEY (ug_user, ug_group);
diff --git a/maintenance/archives/patch-user_groups-ug_expiry.sql b/maintenance/archives/patch-user_groups-ug_expiry.sql
new file mode 100644 (file)
index 0000000..b329f94
--- /dev/null
@@ -0,0 +1,5 @@
+-- Add expiry column in user_groups table
+
+ALTER TABLE /*$wgDBprefix*/user_groups
+  ADD COLUMN ug_expiry varbinary(14) NULL default NULL,
+  ADD INDEX ug_expiry (ug_expiry);
index 38daf64..286fb58 100644 (file)
@@ -27,6 +27,8 @@
 require_once __DIR__ . '/Maintenance.php';
 require_once __DIR__ . '/../includes/export/DumpFilter.php';
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * @ingroup Dump Maintenance
  */
@@ -60,7 +62,7 @@ class BackupDumper extends Maintenance {
        /**
         * The dependency-injected database to use.
         *
-        * @var DatabaseBase|null
+        * @var IDatabase|null
         *
         * @see self::setDB
         */
@@ -163,7 +165,7 @@ class BackupDumper extends Maintenance {
                                        $val = explode( ':', $param );
 
                                        if ( count( $val ) === 1 ) {
-                                               $this->loadPlugin( $val[0] );
+                                               $this->loadPlugin( $val[0], '' );
                                        } elseif ( count( $val ) === 2 ) {
                                                $this->loadPlugin( $val[0], $val[1] );
                                        } else {
@@ -314,7 +316,7 @@ class BackupDumper extends Maintenance {
         * @todo Fixme: the --server parameter is currently not respected, as it
         * doesn't seem terribly easy to ask the load balancer for a particular
         * connection by name.
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function backupDb() {
                if ( $this->forcedDb !== null ) {
@@ -335,7 +337,7 @@ class BackupDumper extends Maintenance {
         * Force the dump to use the provided database connection for database
         * operations, wherever possible.
         *
-        * @param DatabaseBase|null $db (Optional) the database connection to use. If null, resort to
+        * @param IDatabase|null $db (Optional) the database connection to use. If null, resort to
         *   use the globally provided ways to get database connections.
         */
        function setDB( IDatabase $db = null ) {
index 453464a..bff2c13 100644 (file)
@@ -24,7 +24,6 @@
 use \Cdb\Exception as CdbException;
 use \Cdb\Reader as CdbReader;
 
-/** */
 require_once __DIR__ . '/commandLine.inc';
 
 function cdbShowHelp( $command ) {
index 38b8ba1..863d74a 100644 (file)
@@ -22,6 +22,8 @@
  * @author Roan Kattouw
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -41,7 +43,7 @@ class CleanupRemovedModules extends Maintenance {
 
        public function execute() {
                $dbw = $this->getDB( DB_MASTER );
-               $rl = new ResourceLoader( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
                $moduleNames = $rl->getModuleNames();
                $moduleList = implode( ', ', array_map( [ $dbw, 'addQuotes' ], $moduleNames ) );
                $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
index 914336f..a2a06d2 100644 (file)
@@ -1036,7 +1036,6 @@ csrf
 css
 cssclass
 csslinks
-cssprefs
 cta
 ctime
 ctor
index f3561b5..e649c9d 100644 (file)
@@ -98,7 +98,7 @@ $maintenance->finalSetup();
 require_once "$IP/includes/Setup.php";
 
 // Initialize main config instance
-$maintenance->setConfig( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+$maintenance->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
 
 // Sanity-check required extensions are installed
 $maintenance->checkRequiredExtensions();
index d8661c1..5d92eec 100644 (file)
@@ -27,6 +27,8 @@
 require_once __DIR__ . '/backup.inc';
 require_once __DIR__ . '/../includes/export/WikiExporter.php';
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * @ingroup Maintenance
  */
@@ -212,7 +214,6 @@ TEXT
                // We do /not/ retry upon failure, but delegate to encapsulating logic, to avoid
                // individually retrying at different layers of code.
 
-               // 1. The LoadBalancer.
                try {
                        $this->lb = wfGetLBFactory()->newMainLB();
                } catch ( Exception $e ) {
@@ -220,7 +221,6 @@ TEXT
                                . " rotating DB failed to obtain new load balancer (" . $e->getMessage() . ")" );
                }
 
-               // 2. The Connection, through the load balancer.
                try {
                        $this->db = $this->lb->getConnection( DB_REPLICA, 'dump' );
                } catch ( Exception $e ) {
index 4996446..d98e5cd 100644 (file)
@@ -32,7 +32,6 @@
 
 $optionsWithArgs = [ 'd' ];
 
-/** */
 require_once __DIR__ . "/commandLine.inc";
 
 if ( isset( $options['d'] ) ) {
index f6e65f9..81e18c9 100644 (file)
@@ -48,7 +48,7 @@ class FindHooks extends Maintenance {
        /*
         * Hooks that are ignored
         */
-       protected static $ignore = [ 'testRunLegacyHooks', 'Test' ];
+       protected static $ignore = [ 'Test' ];
 
        public function __construct() {
                parent::__construct();
@@ -238,7 +238,7 @@ class FindHooks extends Maintenance {
                $m = [];
                preg_match_all(
                        // All functions which runs hooks
-                       '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\s*\(\s*' .
+                       '/(?:wfRunHooks|Hooks\:\:run)\s*\(\s*' .
                                // First argument is the hook name as string
                                '([\'"])(.*?)\1' .
                                // Comma for second argument
index d3041d9..a84f2ae 100644 (file)
@@ -108,6 +108,7 @@ class GenerateJsonI18n extends Maintenance {
                if ( !is_readable( $phpfile ) ) {
                        $this->error( "Error reading $phpfile", 1 );
                }
+               $messages = null;
                include $phpfile;
                $phpfileContents = file_get_contents( $phpfile );
 
index f0e0555..6717a8e 100644 (file)
@@ -109,7 +109,8 @@ TEXT
                }
 
                $this->output( "Done!\n" );
-               $this->output( "You might want to run rebuildrecentchanges.php to regenerate RecentChanges\n" );
+               $this->output( "You might want to run rebuildrecentchanges.php to regenerate RecentChanges,\n" );
+               $this->output( "and initSiteStats.php to update page and revision counts\n" );
        }
 
        function setNsfilter( array $namespaces ) {
@@ -283,6 +284,9 @@ TEXT
                $source = new ImportStreamSource( $handle );
                $importer = new WikiImporter( $source, $this->getConfig() );
 
+               // Updating statistics require a lot of time so disable it
+               $importer->disableStatisticsUpdate();
+
                if ( $this->hasOption( 'debug' ) ) {
                        $importer->setDebug( true );
                }
diff --git a/maintenance/importImages.inc b/maintenance/importImages.inc
deleted file mode 100644 (file)
index fc9428d..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-/**
- * Support functions for the importImages.php script
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Rob Church <robchur@gmail.com>
- * @author Mij <mij@bitchx.it>
- */
-
-/**
- * Search a directory for files with one of a set of extensions
- *
- * @param string $dir Path to directory to search
- * @param array $exts Array of extensions to search for
- * @param bool $recurse Search subdirectories recursively
- * @return array|bool Array of filenames on success, or false on failure
- */
-function findFiles( $dir, $exts, $recurse = false ) {
-       if ( is_dir( $dir ) ) {
-               $dhl = opendir( $dir );
-               if ( $dhl ) {
-                       $files = [];
-                       while ( ( $file = readdir( $dhl ) ) !== false ) {
-                               if ( is_file( $dir . '/' . $file ) ) {
-                                       list( /* $name */, $ext ) = splitFilename( $dir . '/' . $file );
-                                       if ( array_search( strtolower( $ext ), $exts ) !== false ) {
-                                               $files[] = $dir . '/' . $file;
-                                       }
-                               } elseif ( $recurse && is_dir( $dir . '/' . $file ) && $file !== '..' && $file !== '.' ) {
-                                       $files = array_merge( $files, findFiles( $dir . '/' . $file, $exts, true ) );
-                               }
-                       }
-
-                       return $files;
-               } else {
-                       return [];
-               }
-       } else {
-               return [];
-       }
-}
-
-/**
- * Split a filename into filename and extension
- *
- * @param string $filename Filename
- * @return array
- */
-function splitFilename( $filename ) {
-       $parts = explode( '.', $filename );
-       $ext = $parts[count( $parts ) - 1];
-       unset( $parts[count( $parts ) - 1] );
-       $fname = implode( '.', $parts );
-
-       return [ $fname, $ext ];
-}
-
-/**
- * Find an auxilliary file with the given extension, matching
- * the give base file path. $maxStrip determines how many extensions
- * may be stripped from the original file name before appending the
- * new extension. For example, with $maxStrip = 1 (the default),
- * file files acme.foo.bar.txt and acme.foo.txt would be auxilliary
- * files for acme.foo.bar and the extension ".txt". With $maxStrip = 2,
- * acme.txt would also be acceptable.
- *
- * @param string $file Base path
- * @param string $auxExtension The extension to be appended to the base path
- * @param int $maxStrip The maximum number of extensions to strip from the base path (default: 1)
- * @return string|bool
- */
-function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
-       if ( strpos( $auxExtension, '.' ) !== 0 ) {
-               $auxExtension = '.' . $auxExtension;
-       }
-
-       $d = dirname( $file );
-       $n = basename( $file );
-
-       while ( $maxStrip >= 0 ) {
-               $f = $d . '/' . $n . $auxExtension;
-
-               if ( file_exists( $f ) ) {
-                       return $f;
-               }
-
-               $idx = strrpos( $n, '.' );
-               if ( !$idx ) {
-                       break;
-               }
-
-               $n = substr( $n, 0, $idx );
-               $maxStrip -= 1;
-       }
-
-       return false;
-}
-
-# @todo FIXME: Access the api in a saner way and performing just one query
-# (preferably batching files too).
-function getFileCommentFromSourceWiki( $wiki_host, $file ) {
-       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-               . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
-       $body = Http::get( $url, [], __METHOD__ );
-       if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
-               return false;
-       }
-
-       return html_entity_decode( $matches[1] );
-}
-
-function getFileUserFromSourceWiki( $wiki_host, $file ) {
-       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-               . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
-       $body = Http::get( $url, [], __METHOD__ );
-       if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
-               return false;
-       }
-
-       return html_entity_decode( $matches[1] );
-}
index 5a4ab39..4a3d2d6 100644 (file)
  * @author Mij <mij@bitchx.it>
  */
 
-$optionsWithArgs = [
-       'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
-       'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
-];
+require_once __DIR__ . '/Maintenance.php';
+
+class ImportImages extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+
+               $this->addDescription( 'Imports images and other media files into the wiki' );
+               $this->addArg( 'dir', 'Path to the directory containing images to be imported' );
+
+               $this->addOption( 'extensions',
+                       'Comma-separated list of allowable extensions, defaults to $wgFileExtensions',
+                       false,
+                       true
+               );
+               $this->addOption( 'overwrite',
+                       'Overwrite existing images with the same name (default is to skip them)' );
+               $this->addOption( 'limit',
+                       'Limit the number of images to process. Ignored or skipped images are not counted',
+                       false,
+                       true
+               );
+               $this->addOption( 'from',
+                       "Ignore all files until the one with the given name. Useful for resuming aborted "
+                               . "imports. The name should be the file's canonical database form.",
+                       false,
+                       true
+               );
+               $this->addOption( 'skip-dupes',
+                       'Skip images that were already uploaded under a different name (check SHA1)' );
+               $this->addOption( 'search-recursively', 'Search recursively for files in subdirectories' );
+               $this->addOption( 'sleep',
+                       'Sleep between files. Useful mostly for debugging',
+                       false,
+                       true
+               );
+               $this->addOption( 'user',
+                       "Set username of uploader, default 'Maintenance script'",
+                       false,
+                       true
+               );
+               // This parameter can optionally have an argument. If none specified, getOption()
+               // returns 1 which is precisely what we need.
+               $this->addOption( 'check-userblock', 'Check if the user got blocked during import' );
+               $this->addOption( 'comment',
+                       "Set file description, default 'Importing file'",
+                       false,
+                       true
+               );
+               $this->addOption( 'comment-file',
+                       'Set description to the content of this file',
+                       false,
+                       true
+               );
+               $this->addOption( 'comment-ext',
+                       'Causes the description for each file to be loaded from a file with the same name, but '
+                               . 'the extension provided. If a global description is also given, it is appended.',
+                       false,
+                       true
+               );
+               $this->addOption( 'summary',
+                       'Upload summary, description will be used if not provided',
+                       false,
+                       true
+               );
+               $this->addOption( 'license',
+                       'Use an optional license template',
+                       false,
+                       true
+               );
+               $this->addOption( 'timestamp',
+                       'Override upload time/date, all MediaWiki timestamp formats are accepted',
+                       false,
+                       true
+               );
+               $this->addOption( 'protect',
+                       'Specify the protect value (autoconfirmed,sysop)',
+                       false,
+                       true
+               );
+               $this->addOption( 'unprotect', 'Unprotects all uploaded images' );
+               $this->addOption( 'source-wiki-url',
+                       'If specified, take User and Comment data for each imported file from this URL. '
+                               . 'For example, --source-wiki-url="http://en.wikipedia.org/',
+                       false,
+                       true
+               );
+               $this->addOption( 'dry', "Dry run, don't import anything" );
+       }
 
-$optionsWithoutArgs = [
-       'protect', 'unprotect', 'search-recursively', 'check-userblock', 'overwrite',
-       'skip-dupes', 'dry'
-];
+       public function execute() {
+               global $wgFileExtensions, $wgUser, $wgRestrictionLevels;
 
-require_once __DIR__ . '/commandLine.inc';
-require_once __DIR__ . '/importImages.inc';
-$processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
+               $processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
 
-echo "Import Images\n\n";
+               $this->output( "Import Images\n\n" );
 
-# Need a path
-if ( count( $args ) == 0 ) {
-       showUsage();
-}
+               $dir = $this->getArg( 0 );
 
-$dir = $args[0];
+               # Check Protection
+               if ( $this->hasOption( 'protect' ) && $this->hasOption( 'unprotect' ) ) {
+                       $this->error( "Cannot specify both protect and unprotect.  Only 1 is allowed.\n", 1 );
+               }
 
-# Check Protection
-if ( isset( $options['protect'] ) && isset( $options['unprotect'] ) ) {
-       die( "Cannot specify both protect and unprotect.  Only 1 is allowed.\n" );
-}
+               if ( $this->hasOption( 'protect' ) && trim( $this->getOption( 'protect' ) ) ) {
+                       $this->error( "You must specify a protection option.\n", 1 );
+               }
 
-if ( isset( $options['protect'] ) && $options['protect'] == 1 ) {
-       die( "You must specify a protection option.\n" );
-}
+               # Prepare the list of allowed extensions
+               $extensions = $this->hasOption( 'extensions' )
+                       ? explode( ',', strtolower( $this->getOption( 'extensions' ) ) )
+                       : $wgFileExtensions;
 
-# Prepare the list of allowed extensions
-global $wgFileExtensions;
-$extensions = isset( $options['extensions'] )
-       ? explode( ',', strtolower( $options['extensions'] ) )
-       : $wgFileExtensions;
-
-# Search the path provided for candidates for import
-$files = findFiles( $dir, $extensions, isset( $options['search-recursively'] ) );
-
-# Initialise the user for this operation
-$user = isset( $options['user'] )
-       ? User::newFromName( $options['user'] )
-       : User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
-if ( !$user instanceof User ) {
-       $user = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
-}
-$wgUser = $user;
-
-# Get block check. If a value is given, this specified how often the check is performed
-if ( isset( $options['check-userblock'] ) ) {
-       if ( !$options['check-userblock'] ) {
-               $checkUserBlock = 1;
-       } else {
-               $checkUserBlock = (int)$options['check-userblock'];
-       }
-} else {
-       $checkUserBlock = false;
-}
+               # Search the path provided for candidates for import
+               $files = $this->findFiles( $dir, $extensions, $this->hasOption( 'search-recursively' ) );
 
-# Get --from
-MediaWiki\suppressWarnings();
-$from = $options['from'];
-MediaWiki\restoreWarnings();
+               # Initialise the user for this operation
+               $user = $this->hasOption( 'user' )
+                       ? User::newFromName( $this->getOption( 'user' ) )
+                       : User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
+               if ( !$user instanceof User ) {
+                       $user = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
+               }
+               $wgUser = $user;
+
+               # Get block check. If a value is given, this specified how often the check is performed
+               $checkUserBlock = (int)$this->getOption( 'check-userblock' );
+
+               $from = $this->getOption( 'from' );
+               $sleep = (int)$this->getOption( 'sleep' );
+               $limit = (int)$this->getOption( 'limit' );
+               $timestamp = $this->getOption( 'timestamp', false );
+
+               # Get the upload comment. Provide a default one in case there's no comment given.
+               $commentFile = $this->getOption( 'comment-file' );
+               if ( $commentFile !== null ) {
+                       $comment = file_get_contents( $commentFile );
+                       if ( $comment === false || $comment === null ) {
+                               $this->error( "failed to read comment file: {$commentFile}\n", 1 );
+                       }
+               } else {
+                       $comment = $this->getOption( 'comment', 'Importing file' );
+               }
+               $commentExt = $this->getOption( 'comment-ext' );
+               $summary = $this->getOption( 'summary', '' );
 
-# Get sleep time.
-MediaWiki\suppressWarnings();
-$sleep = $options['sleep'];
-MediaWiki\restoreWarnings();
+               $license = $this->getOption( 'license', '' );
 
-if ( $sleep ) {
-       $sleep = (int)$sleep;
-}
+               $sourceWikiUrl = $this->getOption( 'source-wiki-url' );
 
-# Get limit number
-MediaWiki\suppressWarnings();
-$limit = $options['limit'];
-MediaWiki\restoreWarnings();
+               # Batch "upload" operation
+               $count = count( $files );
+               if ( $count > 0 ) {
 
-if ( $limit ) {
-       $limit = (int)$limit;
-}
+                       foreach ( $files as $file ) {
 
-$timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
+                               if ( $sleep && ( $processed > 0 ) ) {
+                                       sleep( $sleep );
+                               }
 
-# Get the upload comment. Provide a default one in case there's no comment given.
-$comment = 'Importing file';
+                               $base = UtfNormal\Validator::cleanUp( wfBaseName( $file ) );
 
-if ( isset( $options['comment-file'] ) ) {
-       $comment = file_get_contents( $options['comment-file'] );
-       if ( $comment === false || $comment === null ) {
-               die( "failed to read comment file: {$options['comment-file']}\n" );
-       }
-} elseif ( isset( $options['comment'] ) ) {
-       $comment = $options['comment'];
-}
+                               # Validate a title
+                               $title = Title::makeTitleSafe( NS_FILE, $base );
+                               if ( !is_object( $title ) ) {
+                                       $this->output(
+                                               "{$base} could not be imported; a valid title cannot be produced\n" );
+                                       continue;
+                               }
 
-$commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
+                               if ( $from ) {
+                                       if ( $from == $title->getDBkey() ) {
+                                               $from = null;
+                                       } else {
+                                               $ignored++;
+                                               continue;
+                                       }
+                               }
 
-$summary = isset( $options['summary'] ) ? $options['summary'] : '';
+                               if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
+                                       $user->clearInstanceCache( 'name' ); // reload from DB!
+                                       if ( $user->isBlocked() ) {
+                                               $this->output( $user->getName() . " was blocked! Aborting.\n" );
+                                               break;
+                                       }
+                               }
 
-# Get the license specifier
-$license = isset( $options['license'] ) ? $options['license'] : '';
+                               # Check existence
+                               $image = wfLocalFile( $title );
+                               if ( $image->exists() ) {
+                                       if ( $this->hasOption( 'overwrite' ) ) {
+                                               $this->output( "{$base} exists, overwriting..." );
+                                               $svar = 'overwritten';
+                                       } else {
+                                               $this->output( "{$base} exists, skipping\n" );
+                                               $skipped++;
+                                               continue;
+                                       }
+                               } else {
+                                       if ( $this->hasOption( 'skip-dupes' ) ) {
+                                               $repo = $image->getRepo();
+                                               # XXX: we end up calculating this again when actually uploading. that sucks.
+                                               $sha1 = FSFile::getSha1Base36FromPath( $file );
+
+                                               $dupes = $repo->findBySha1( $sha1 );
+
+                                               if ( $dupes ) {
+                                                       $this->output(
+                                                               "{$base} already exists as {$dupes[0]->getName()}, skipping\n" );
+                                                       $skipped++;
+                                                       continue;
+                                               }
+                                       }
 
-# Batch "upload" operation
-$count = count( $files );
-if ( $count > 0 ) {
+                                       $this->output( "Importing {$base}..." );
+                                       $svar = 'added';
+                               }
 
-       foreach ( $files as $file ) {
-               $base = UtfNormal\Validator::cleanUp( wfBaseName( $file ) );
+                               if ( $sourceWikiUrl ) {
+                                       /* find comment text directly from source wiki, through MW's API */
+                                       $real_comment = $this->getFileCommentFromSourceWiki( $sourceWikiUrl, $base );
+                                       if ( $real_comment === false ) {
+                                               $commentText = $comment;
+                                       } else {
+                                               $commentText = $real_comment;
+                                       }
 
-               # Validate a title
-               $title = Title::makeTitleSafe( NS_FILE, $base );
-               if ( !is_object( $title ) ) {
-                       echo "{$base} could not be imported; a valid title cannot be produced\n";
-                       continue;
-               }
+                                       /* find user directly from source wiki, through MW's API */
+                                       $real_user = $this->getFileUserFromSourceWiki( $sourceWikiUrl, $base );
+                                       if ( $real_user === false ) {
+                                               $wgUser = $user;
+                                       } else {
+                                               $wgUser = User::newFromName( $real_user );
+                                               if ( $wgUser === false ) {
+                                                       # user does not exist in target wiki
+                                                       $this->output(
+                                                               "failed: user '$real_user' does not exist in target wiki." );
+                                                       continue;
+                                               }
+                                       }
+                               } else {
+                                       # Find comment text
+                                       $commentText = false;
+
+                                       if ( $commentExt ) {
+                                               $f = $this->findAuxFile( $file, $commentExt );
+                                               if ( !$f ) {
+                                                       $this->output( " No comment file with extension {$commentExt} found "
+                                                                . "for {$file}, using default comment. " );
+                                               } else {
+                                                       $commentText = file_get_contents( $f );
+                                                       if ( !$commentText ) {
+                                                               $this->output(
+                                                                       " Failed to load comment file {$f}, using default comment. " );
+                                                       }
+                                               }
+                                       }
 
-               if ( $from ) {
-                       if ( $from == $title->getDBkey() ) {
-                               $from = null;
-                       } else {
-                               $ignored++;
-                               continue;
-                       }
-               }
+                                       if ( !$commentText ) {
+                                               $commentText = $comment;
+                                       }
+                               }
 
-               if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
-                       $user->clearInstanceCache( 'name' ); // reload from DB!
-                       if ( $user->isBlocked() ) {
-                               echo $user->getName() . " was blocked! Aborting.\n";
-                               break;
-                       }
-               }
+                               # Import the file
+                               if ( $this->hasOption( 'dry' ) ) {
+                                       $this->output(
+                                               " publishing {$file} by '{$wgUser->getName()}', comment '$commentText'... "
+                                       );
+                               } else {
+                                       $mwProps = new MWFileProps( MimeMagic::singleton() );
+                                       $props = $mwProps->getPropsFromPath( $file, true );
+                                       $flags = 0;
+                                       $publishOptions = [];
+                                       $handler = MediaHandler::getHandler( $props['mime'] );
+                                       if ( $handler ) {
+                                               $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                                       } else {
+                                               $publishOptions['headers'] = [];
+                                       }
+                                       $archive = $image->publish( $file, $flags, $publishOptions );
+                                       if ( !$archive->isGood() ) {
+                                               $this->output( "failed. (" .
+                                                        $archive->getWikiText( false, false, 'en' ) .
+                                                        ")\n" );
+                                               $failed++;
+                                               continue;
+                                       }
+                               }
 
-               # Check existence
-               $image = wfLocalFile( $title );
-               if ( $image->exists() ) {
-                       if ( isset( $options['overwrite'] ) ) {
-                               echo "{$base} exists, overwriting...";
-                               $svar = 'overwritten';
-                       } else {
-                               echo "{$base} exists, skipping\n";
-                               $skipped++;
-                               continue;
-                       }
-               } else {
-                       if ( isset( $options['skip-dupes'] ) ) {
-                               $repo = $image->getRepo();
-                               # XXX: we end up calculating this again when actually uploading. that sucks.
-                               $sha1 = FSFile::getSha1Base36FromPath( $file );
+                               $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
+                               if ( !$this->hasOption( 'summary' ) ) {
+                                       $summary = $commentText;
+                               }
 
-                               $dupes = $repo->findBySha1( $sha1 );
+                               if ( $this->hasOption( 'dry' ) ) {
+                                       $this->output( "done.\n" );
+                               } elseif ( $image->recordUpload2(
+                                       $archive->value,
+                                       $summary,
+                                       $commentText,
+                                       $props,
+                                       $timestamp
+                               ) ) {
+                                       # We're done!
+                                       $this->output( "done.\n" );
 
-                               if ( $dupes ) {
-                                       echo "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n";
-                                       $skipped++;
-                                       continue;
+                                       $doProtect = false;
+
+                                       $protectLevel = $this->getOption( 'protect' );
+
+                                       if ( $protectLevel && in_array( $protectLevel, $wgRestrictionLevels ) ) {
+                                               $doProtect = true;
+                                       }
+                                       if ( $this->hasOption( 'unprotect' ) ) {
+                                               $protectLevel = '';
+                                               $doProtect = true;
+                                       }
+
+                                       if ( $doProtect ) {
+                                               # Protect the file
+                                               $this->output( "\nWaiting for replica DBs...\n" );
+                                               // Wait for replica DBs.
+                                               sleep( 2.0 ); # Why this sleep?
+                                               wfWaitForSlaves();
+
+                                               $this->output( "\nSetting image restrictions ... " );
+
+                                               $cascade = false;
+                                               $restrictions = [];
+                                               foreach ( $title->getRestrictionTypes() as $type ) {
+                                                       $restrictions[$type] = $protectLevel;
+                                               }
+
+                                               $page = WikiPage::factory( $title );
+                                               $status = $page->doUpdateRestrictions( $restrictions, [], $cascade, '', $user );
+                                               $this->output( ( $status->isOK() ? 'done' : 'failed' ) . "\n" );
+                                       }
+                               } else {
+                                       $this->output( "failed. (at recordUpload stage)\n" );
+                                       $svar = 'failed';
                                }
-                       }
 
-                       echo "Importing {$base}...";
-                       $svar = 'added';
-               }
+                               $$svar++;
+                               $processed++;
 
-               if ( isset( $options['source-wiki-url'] ) ) {
-                       /* find comment text directly from source wiki, through MW's API */
-                       $real_comment = getFileCommentFromSourceWiki( $options['source-wiki-url'], $base );
-                       if ( $real_comment === false ) {
-                               $commentText = $comment;
-                       } else {
-                               $commentText = $real_comment;
+                               if ( $limit && $processed >= $limit ) {
+                                       break;
+                               }
                        }
 
-                       /* find user directly from source wiki, through MW's API */
-                       $real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
-                       if ( $real_user === false ) {
-                               $wgUser = $user;
-                       } else {
-                               $wgUser = User::newFromName( $real_user );
-                               if ( $wgUser === false ) {
-                                       # user does not exist in target wiki
-                                       echo "failed: user '$real_user' does not exist in target wiki.";
-                                       continue;
+                       # Print out some statistics
+                       $this->output( "\n" );
+                       foreach (
+                               [
+                                       'count' => 'Found',
+                                       'limit' => 'Limit',
+                                       'ignored' => 'Ignored',
+                                       'added' => 'Added',
+                                       'skipped' => 'Skipped',
+                                       'overwritten' => 'Overwritten',
+                                       'failed' => 'Failed'
+                               ] as $var => $desc
+                       ) {
+                               if ( $$var > 0 ) {
+                                       $this->output( "{$desc}: {$$var}\n" );
                                }
                        }
                } else {
-                       # Find comment text
-                       $commentText = false;
-
-                       if ( $commentExt ) {
-                               $f = findAuxFile( $file, $commentExt );
-                               if ( !$f ) {
-                                       echo " No comment file with extension {$commentExt} found "
-                                               . "for {$file}, using default comment. ";
-                               } else {
-                                       $commentText = file_get_contents( $f );
-                                       if ( !$commentText ) {
-                                               echo " Failed to load comment file {$f}, using default comment. ";
+                       $this->output( "No suitable files could be found for import.\n" );
+               }
+       }
+
+       /**
+        * Search a directory for files with one of a set of extensions
+        *
+        * @param string $dir Path to directory to search
+        * @param array $exts Array of extensions to search for
+        * @param bool $recurse Search subdirectories recursively
+        * @return array|bool Array of filenames on success, or false on failure
+        */
+       private function findFiles( $dir, $exts, $recurse = false ) {
+               if ( is_dir( $dir ) ) {
+                       $dhl = opendir( $dir );
+                       if ( $dhl ) {
+                               $files = [];
+                               while ( ( $file = readdir( $dhl ) ) !== false ) {
+                                       if ( is_file( $dir . '/' . $file ) ) {
+                                               list( /* $name */, $ext ) = $this->splitFilename( $dir . '/' . $file );
+                                               if ( array_search( strtolower( $ext ), $exts ) !== false ) {
+                                                       $files[] = $dir . '/' . $file;
+                                               }
+                                       } elseif ( $recurse && is_dir( $dir . '/' . $file ) && $file !== '..' && $file !== '.' ) {
+                                               $files = array_merge( $files, $this->findFiles( $dir . '/' . $file, $exts, true ) );
                                        }
                                }
-                       }
 
-                       if ( !$commentText ) {
-                               $commentText = $comment;
-                       }
-               }
-
-               # Import the file
-               if ( isset( $options['dry'] ) ) {
-                       echo " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... ";
-               } else {
-                       $mwProps = new MWFileProps( MimeMagic::singleton() );
-                       $props = $mwProps->getPropsFromPath( $file, true );
-                       $flags = 0;
-                       $publishOptions = [];
-                       $handler = MediaHandler::getHandler( $props['mime'] );
-                       if ( $handler ) {
-                               $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                               return $files;
                        } else {
-                               $publishOptions['headers'] = [];
+                               return [];
                        }
-                       $archive = $image->publish( $file, $flags, $publishOptions );
-                       if ( !$archive->isGood() ) {
-                               echo "failed. (" .
-                                       $archive->getWikiText( false, false, 'en' ) .
-                                       ")\n";
-                               $failed++;
-                               continue;
-                       }
-               }
-
-               $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
-               if ( !isset( $options['summary'] ) ) {
-                       $summary = $commentText;
+               } else {
+                       return [];
                }
+       }
 
-               if ( isset( $options['dry'] ) ) {
-                       echo "done.\n";
-               } elseif ( $image->recordUpload2(
-                       $archive->value,
-                       $summary,
-                       $commentText,
-                       $props,
-                       $timestamp
-               ) ) {
-                       # We're done!
-                       echo "done.\n";
+       /**
+        * Split a filename into filename and extension
+        *
+        * @param string $filename Filename
+        * @return array
+        */
+       private function splitFilename( $filename ) {
+               $parts = explode( '.', $filename );
+               $ext = $parts[count( $parts ) - 1];
+               unset( $parts[count( $parts ) - 1] );
+               $fname = implode( '.', $parts );
+
+               return [ $fname, $ext ];
+       }
 
-                       $doProtect = false;
+       /**
+        * Find an auxilliary file with the given extension, matching
+        * the give base file path. $maxStrip determines how many extensions
+        * may be stripped from the original file name before appending the
+        * new extension. For example, with $maxStrip = 1 (the default),
+        * file files acme.foo.bar.txt and acme.foo.txt would be auxilliary
+        * files for acme.foo.bar and the extension ".txt". With $maxStrip = 2,
+        * acme.txt would also be acceptable.
+        *
+        * @param string $file Base path
+        * @param string $auxExtension The extension to be appended to the base path
+        * @param int $maxStrip The maximum number of extensions to strip from the base path (default: 1)
+        * @return string|bool
+        */
+       private function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
+               if ( strpos( $auxExtension, '.' ) !== 0 ) {
+                       $auxExtension = '.' . $auxExtension;
+               }
 
-                       global $wgRestrictionLevels;
+               $d = dirname( $file );
+               $n = basename( $file );
 
-                       $protectLevel = isset( $options['protect'] ) ? $options['protect'] : null;
+               while ( $maxStrip >= 0 ) {
+                       $f = $d . '/' . $n . $auxExtension;
 
-                       if ( $protectLevel && in_array( $protectLevel, $wgRestrictionLevels ) ) {
-                               $doProtect = true;
-                       }
-                       if ( isset( $options['unprotect'] ) ) {
-                               $protectLevel = '';
-                               $doProtect = true;
+                       if ( file_exists( $f ) ) {
+                               return $f;
                        }
 
-                       if ( $doProtect ) {
-                               # Protect the file
-                               echo "\nWaiting for replica DBs...\n";
-                               // Wait for replica DBs.
-                               sleep( 2.0 ); # Why this sleep?
-                               wfWaitForSlaves();
-
-                               echo "\nSetting image restrictions ... ";
-
-                               $cascade = false;
-                               $restrictions = [];
-                               foreach ( $title->getRestrictionTypes() as $type ) {
-                                       $restrictions[$type] = $protectLevel;
-                               }
-
-                               $page = WikiPage::factory( $title );
-                               $status = $page->doUpdateRestrictions( $restrictions, [], $cascade, '', $user );
-                               echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
+                       $idx = strrpos( $n, '.' );
+                       if ( !$idx ) {
+                               break;
                        }
-               } else {
-                       echo "failed. (at recordUpload stage)\n";
-                       $svar = 'failed';
-               }
 
-               $$svar++;
-               $processed++;
-
-               if ( $limit && $processed >= $limit ) {
-                       break;
+                       $n = substr( $n, 0, $idx );
+                       $maxStrip -= 1;
                }
 
-               if ( $sleep ) {
-                       sleep( $sleep );
-               }
+               return false;
        }
 
-       # Print out some statistics
-       echo "\n";
-       foreach (
-               [
-                       'count' => 'Found',
-                       'limit' => 'Limit',
-                       'ignored' => 'Ignored',
-                       'added' => 'Added',
-                       'skipped' => 'Skipped',
-                       'overwritten' => 'Overwritten',
-                       'failed' => 'Failed'
-               ] as $var => $desc
-       ) {
-               if ( $$var > 0 ) {
-                       echo "{$desc}: {$$var}\n";
+       # @todo FIXME: Access the api in a saner way and performing just one query
+       # (preferably batching files too).
+       private function getFileCommentFromSourceWiki( $wiki_host, $file ) {
+               $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
+                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
+               $body = Http::get( $url, [], __METHOD__ );
+               if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
+                       return false;
                }
+
+               return html_entity_decode( $matches[1] );
        }
-} else {
-       echo "No suitable files could be found for import.\n";
-}
 
-exit( 0 );
+       private function getFileUserFromSourceWiki( $wiki_host, $file ) {
+               $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
+                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+               $body = Http::get( $url, [], __METHOD__ );
+               if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
+                       return false;
+               }
 
-function showUsage( $reason = false ) {
-       if ( $reason ) {
-               echo $reason . "\n";
+               return html_entity_decode( $matches[1] );
        }
 
-       echo <<<TEXT
-Imports images and other media files into the wiki
-USAGE: php importImages.php [options] <dir>
-
-<dir> : Path to the directory containing images to be imported
-
-Options:
---extensions=<exts>     Comma-separated list of allowable extensions, defaults
-                        to \$wgFileExtensions.
---overwrite             Overwrite existing images with the same name (default
-                        is to skip them).
---limit=<num>           Limit the number of images to process. Ignored or
-                        skipped images are not counted.
---from=<name>           Ignore all files until the one with the given name.
-                        Useful for resuming aborted imports. <name> should be
-                        the file's canonical database form.
---skip-dupes            Skip images that were already uploaded under a different
-                        name (check SHA1).
---search-recursively    Search recursively for files in subdirectories.
---sleep=<sec>           Sleep between files. Useful mostly for debugging.
---user=<username>       Set username of uploader, default 'Maintenance script'.
---check-userblock       Check if the user got blocked during import.
---comment=<text>        Set file description, default 'Importing file'.
---comment-file=<file>   Set description to the content of <file>.
---comment-ext=<ext>     Causes the description for each file to be loaded from a
-                        file with the same name, but the extension <ext>. If a
-                        global description is also given, it is appended.
---license=<code>        Use an optional license template.
---dry                   Dry run, don't import anything.
---protect=<protect>     Specify the protect value (autoconfirmed,sysop).
---summary=<summary>     Upload summary, description will be used if not
-                        provided.
---timestamp=<timestamp> Override upload time/date, all MediaWiki timestamp
-                        formats are accepted.
---unprotect             Unprotects all uploaded images.
---source-wiki-url       If specified, take User and Comment data for each
-                        imported file from this URL. For example,
-                        --source-wiki-url="http://en.wikipedia.org/."
-
-TEXT;
-       exit( 1 );
 }
+
+$maintClass = 'ImportImages';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2894653..816e745 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -129,7 +131,7 @@ class ImportTextFiles extends Maintenance {
                                }
                        }
 
-                       $rev = new WikiRevision( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+                       $rev = new WikiRevision( MediaWikiServices::getInstance()->getMainConfig() );
                        $rev->setText( rtrim( $text ) );
                        $rev->setTitle( $title );
                        $rev->setUserObj( $user );
index aad85da..9fe5009 100644 (file)
@@ -27,6 +27,7 @@
                                        "mw.notification",
                                        "mw.Notification_",
                                        "mw.storage",
+                                       "mw.storage.session",
                                        "mw.user",
                                        "mw.util",
                                        "mw.plugin.*",
index bced265..9fee611 100644 (file)
@@ -84,7 +84,6 @@ U+05E03布|U+05E03布|U+04F48佈|
 U+05E18帘|U+07C3E簾|U+05E18帘|
 U+05E2D席|U+05E2D席|U+084C6蓆|
 U+05E72干|U+05E72干|U+04E7E乾|U+05E79幹|U+069A6榦|
-U+05E7A幺|U+04E48么|
 U+05E76并|U+04E26並|U+04F75併|
 U+05E78幸|U+05E78幸|U+05016倖|
 U+05E7F广|U+05EE3廣|U+05E7F广|
index 17d2f21..19ec7b1 100644 (file)
 於志贺
 覆盖
 五箇山
-麽麽
-幺厮
-幺半群
-幺元
-幺爹
-幺叔
-幺舅
-幺爸
-幺妈
-幺姨
-幺娘
-幺妹
-幺小
-幺姓
-姓幺
-幺氏
-麽氏
-幺蛾子
-幺麽
-幺麽小丑
-幺凤
-幺二三
-幺篇
-幺谦
 阿部正瞭
 醯酱
 醯鸡
index bae5fd8..ed94fc8 100644 (file)
 著絲 着丝
 著麼 着么
 著人 着人
-著什麼      着什么
+著什 着什
 著他 着他
 著令 着令
 著位 着位
 飃著 飘着
 沈著 沉着
 擡著 抬着
\91\97ç\94\9a麽      着什么
\91\97ç\94\9a麼      着什么
 滿著 满着
 滿著名      满著名
 滿著作      满著作
 三極體      三极管
 軟體 软件
 軟體動物   软体动物
+軟體生物   软体生物
 軟體家具   软体家具
 網路 网络
 人工智慧   人工智能
 賓·拉登    本·拉登
 歐巴馬      奥巴马
 北韓 北朝鲜
+台北韓      台北韩
 寮人民民主共和國       老挝人民民主共和国
 寮語 老挝语
 蘭卡威      浮罗交怡
index 31e02c2..d21ba55 100644 (file)
@@ -6,6 +6,7 @@
 汙    污
 溼    濕
 硅    矽
+幺    么
 計畫 計劃
 吧台 吧枱
 坐台 坐枱
 沖著。      沖著。
 沖著,      沖著,
 衝著 衝着
\91\97ç\94\9a麽      ç\9d\80ç\94\9a麽
\91\97ç\94\9a麼      ç\9d\80ç\94\9a麼
 存著 存着
 存著名      存著名
 存著作      存著作
index 8618a93..4df3f02 100644 (file)
 么姨 幺姨
 么娘 幺娘
 么孃 幺娘
-幺孃 幺娘
 么弟 幺弟
 么妹 幺妹
 么小 幺小
 么姓 幺姓
 么氏 幺氏
 么蛾子      幺蛾子
-幺厮 幺厮
-麼麼 麽麽
-么麼 幺麽
 么鳳 幺凤
 么二三      幺二三
 么篇 幺篇
-么謙 幺谦
 六么 六幺
 老么 老幺
 么正 幺正
 么女 幺女
 么九 幺九
 么子 幺子
-这么 这么
-那么 那么
-什么 什么
-怎么 怎么
-多么 多么
+姓么 姓幺
+么兒 幺儿
+么喝 幺喝
+么爺 幺爷
+么雞 幺鸡
+么麼 幺麽
+幺麽 幺麽
+麽氏 麽氏
+麼氏 麽氏
 乾乾淨淨   干干净净
 乾乾脆脆   干干脆脆
 肉乾乾      肉干干
 馬鞌 马鞍
 觔斗 斤斗
 穀阳 穀阳
+伊東豊雄   伊东丰雄
index 075deab..bc99cfa 100644 (file)
@@ -15,6 +15,7 @@
 锎    鉲
 钚    鈽
 硅    矽
+幺    么
 煙草 菸草
 烟草 菸草
 煙蒂 菸蒂
index 3062c1e..f106db1 100644 (file)
 划進 划進
 划過 划過
 划龍舟      划龍舟
+划龍船      划龍船
 只影響      只影響
+義联 義联
+杠轂 杠轂
+局促 侷促
+開山辟谷   開山辟谷
+戲院里      戲院里
+么半 么半
+么元 么元
+么爹 么爹
+么叔 么叔
+么舅 么舅
+么爸 么爸
+么媽 么媽
+么姨 么姨
+么娘 么娘
+么孃 么孃
 么弟 么弟
+么妹 么妹
+么小 么小
+么姓 么姓
+么氏 么氏
+么蛾子      么蛾子
+么鳳 么鳳
+么二三      么二三
+么篇 么篇
 六么 六么
-么雞 么雞
+老么 老么
 么正 么正
 么女 么女
 么九 么九
 么子 么子
-么半 么半
-義联 義联
-杠轂 杠轂
-局促 侷促
-開山辟谷   開山辟谷
-戲院里      戲院里
+姓么 姓么
+么兒 么兒
+么喝 么喝
+么爺 么爺
+么雞 么雞
+么麼 么麼
 惨淡 慘澹
 恶心 噁心
 证谏 証諫
 苧麻 苧麻
 张柏芝      張栢芝
 杜琪峰      杜琪峯
+單向 單向
+轉向 轉向 #分詞用
index dd38a30..21946a1 100644 (file)
 碼錶
 錶冠
 魔錶
-彆口氣
-彆強
-皺彆
-一彆頭
 并州
 幽并
 併力
 丑三
 丑表功
 公孫丑
-么麼小丑
 平平當當
 滿滿當當
 當當丁丁
 於後
 猜三划五
 划龍舟
+划龍船
 南迴線
 南迴鐵路
 北迴線
 藉此
 龍捲
 捲舌
+不捲
+漫捲
+捲地
+捲瓣
+捲葉蛾
+捲尾猴
+捲積雲
 夸父
 夸克
 夸特
 水里溪
 二里頭
 年歷史
+年歷次
 西歷史
+西歷次
+西歷代
+西歷任
 國歷史
 國歷代
 國歷任
 上簽署
 上簽發
 上簽約
+上簽了
 中簽名
 中簽字
 中簽收
 中簽署
 中簽發
 中簽約
+中簽了
 下簽名
 下簽字
 下簽收
 下簽署
 下簽發
 下簽約
+下簽了
 犖确
 磽确
 确瘠
 蒼朮
 赤朮
 朮赤
+莪朮
 博爾朮
+巴而朮
+朮虎高
+耶律朮烈
 髼鬆
 皮鬆
 濛鬆雨
 不斗膽
 不每只
 不采聲
-專向往
+向往常
+向往日
+向往時
+向往來
+方向
+轉向
+單向 #分詞用
 丰容
 之一只
 之二只
 網球台
 合府上
 後面店
-向往常
-向往日
-向往時
-向往來
 唯一只
 喂了一聲
-喜向往
 四出徵收
 四面包
 多半只
 扎好根
 扑撻
 打吨
-折向往
 拉面上
 拉面具
 拉面前
 敢情欲
 敢斗了膽
 敲扑
-方向往
 望了望
 桌几
 每每只
 要自制
 語有云
 跌扑
-轉向往
 酒帘
 金表態
 金表情
 幸運鬍
 刮鬍
 剃鬍
-吹鬍
 蓄鬍
-白鬍
-長鬍
 鬍髯
 髯鬍
 髭鬍
 功勳
 蝎虎
 磨蝎
-方志恒
 古蹟
 瀋撫
 賦范
 乃係
 製衣
 巨製
-不捲
-漫捲
-捲地
-捲葉蛾
-捲尾猴
-捲積雲
 窗簾
 吉徵
 凶徵
 譯製
 燉製
 煮製
+熬製
 遏制 #以下分詞用
 管制
 抑制
 繫上,
 繫上。
 繫舟
+繫膜
 亂發生
 亂發脾氣
 秀發村
 啊喂
 呵喂
 呦喂
+哈囉喂
 松口鎮
+岩松了
 沙瑯
 琺瑯
 菜餚
 仁貴 #分詞用
 金聖歎
 天台 #分詞用
+性別扭曲
diff --git a/maintenance/manageJobs.php b/maintenance/manageJobs.php
new file mode 100644 (file)
index 0000000..bbedf0c
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Maintenance script that handles managing job queue admin tasks
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Aaron Schulz
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that handles managing job queue admin tasks (re-push, delete, ...)
+ *
+ * @ingroup Maintenance
+ */
+class ManageJobs extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Perform administrative tasks on a job queue' );
+               $this->addOption( 'type', 'Job type', true, true );
+               $this->addOption( 'action', 'Queue operation ("delete", "repush-abandoned")', true, true );
+       }
+
+       public function execute() {
+               $type = $this->getOption( 'type' );
+               $action = $this->getOption( 'action' );
+
+               $group = JobQueueGroup::singleton();
+               $queue = $group->get( $type );
+
+               if ( $action === 'delete' ) {
+                       $this->delete( $queue );
+               } elseif ( $action === 'repush-abandoned' ) {
+                       $this->repushAbandoned( $queue );
+               } else {
+                       $this->error( "Invalid action '$action'.", 1 );
+               }
+       }
+
+       private function delete( JobQueue $queue ) {
+               $this->output( "Queue has {$queue->getSize()} job(s); deleting...\n" );
+               $queue->delete();
+               $this->output( "Done; current size is {$queue->getSize()} job(s).\n" );
+       }
+
+       private function repushAbandoned( JobQueue $queue ) {
+               $cache = ObjectCache::getInstance( CACHE_DB );
+               $key = $cache->makeGlobalKey( 'last-job-repush', $queue->getWiki(), $queue->getType() );
+
+               $now = wfTimestampNow();
+               $lastRepushTime = $cache->get( $key );
+               if ( $lastRepushTime === false ) {
+                       $lastRepushTime = wfTimestamp( TS_MW, 1 ); // include all jobs
+               }
+
+               $this->output( "Last re-push time: $lastRepushTime; current time: $now\n" );
+
+               $count = 0;
+               $skipped = 0;
+               foreach ( $queue->getAllAbandonedJobs() as $job ) {
+                       /** @var Job $job */
+                       if ( $job->getQueuedTimestamp() < wfTimestamp( TS_UNIX, $lastRepushTime ) ) {
+                               ++$skipped;
+                               continue; // already re-pushed in prior round
+                       }
+
+                       $queue->push( $job );
+                       ++$count;
+
+                       if ( ( $count % $this->mBatchSize ) == 0 ) {
+                               $queue->waitForBackups();
+                       }
+               }
+
+               $cache->set( $key, $now ); // next run will ignore these jobs
+
+               $this->output( "Re-pushed $count job(s) [$skipped skipped].\n" );
+       }
+}
+
+$maintClass = "ManageJobs";
+require_once RUN_MAINTENANCE_IF_MAIN;
index a650aa0..bb47631 100644 (file)
@@ -36,11 +36,6 @@ $mmfl = false;
  * @ingroup Maintenance
  */
 class MergeMessageFileList extends Maintenance {
-       /**
-        * @var bool
-        */
-       protected $hasError;
-
        function __construct() {
                parent::__construct();
                $this->addOption(
@@ -106,7 +101,6 @@ class MergeMessageFileList extends Maintenance {
                                }
 
                                if ( !$found ) {
-                                       $this->hasError = true;
                                        $this->error( "Extension {$extname} in {$extdir} lacks expected entry point: " .
                                                "extension.json, skin.json, or {$extname}.php." );
                                }
@@ -119,10 +113,6 @@ class MergeMessageFileList extends Maintenance {
                        $mmfl['setupFiles'] = array_merge( $mmfl['setupFiles'], $extensionPaths );
                }
 
-               if ( $this->hasError ) {
-                       $this->error( "Some files are missing (see above). Giving up.", 1 );
-               }
-
                if ( $this->hasOption( 'output' ) ) {
                        $mmfl['output'] = $this->getOption( 'output' );
                }
diff --git a/maintenance/mssql/archives/patch-user_groups-ug_expiry.sql b/maintenance/mssql/archives/patch-user_groups-ug_expiry.sql
new file mode 100644 (file)
index 0000000..371d80b
--- /dev/null
@@ -0,0 +1,6 @@
+-- Primary key and expiry column in user_groups table
+
+DROP INDEX IF EXISTS /*i*/ug_user_group ON /*_*/user_groups;
+ALTER TABLE /*_*/tag_summary ADD CONSTRAINT pk_user_groups PRIMARY KEY(ug_user, ug_group);
+ALTER TABLE /*_*/tag_summary ADD ug_expiry varchar(14) DEFAULT NULL;
+CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups(ug_expiry);
index 256ee36..1c633be 100644 (file)
@@ -64,9 +64,11 @@ INSERT INTO /*_*/mwuser (user_name) VALUES ('##Anonymous##');
 CREATE TABLE /*_*/user_groups (
    ug_user  INT     NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
    ug_group NVARCHAR(255) NOT NULL DEFAULT '',
+   ug_expiry varchar(14) DEFAULT NULL,
+   PRIMARY KEY(ug_user, ug_group)
 );
-CREATE UNIQUE clustered INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user, ug_group);
 CREATE INDEX /*i*/ug_group ON /*_*/user_groups(ug_group);
+CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups(ug_expiry);
 
 -- Stores the groups the user has once belonged to.
 -- The user may still belong to these groups (check user_groups).
@@ -389,11 +391,18 @@ CREATE TABLE /*_*/externallinks (
   -- which allows for fast searching for all pages under example.com with the
   -- clause:
   --      WHERE el_index LIKE 'http://com.example.%'
-  el_index nvarchar(450) NOT NULL
+  el_index nvarchar(450) NOT NULL,
+
+  -- This is el_index truncated to 60 bytes to allow for sortable queries that
+  -- aren't supported by a partial index.
+  -- @todo Drop the default once this is deployed everywhere and code is populating it.
+  el_index_60 varbinary(60) NOT NULL default ''
 );
 
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index);
+CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id);
+CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id);
 -- el_to index intentionally not added; we cannot index nvarchar(max) columns,
 -- but we also cannot restrict el_to to a smaller column size as the external
 -- link may be larger.
index b705500..522871d 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 require_once __DIR__ . '/Maintenance.php';
 
@@ -224,7 +225,7 @@ class NamespaceConflictChecker extends Maintenance {
         * @return array
         */
        private function getInterwikiList() {
-               $result = Interwiki::getAllPrefixes();
+               $result = MediaWikiServices::getInstance()->getInterwikiLookup()->getAllPrefixes();
                $prefixes = [];
                foreach ( $result as $row ) {
                        $prefixes[] = $row['iw_prefix'];
diff --git a/maintenance/oracle/archives/patch-externallinks-el_index_60.sql b/maintenance/oracle/archives/patch-externallinks-el_index_60.sql
new file mode 100644 (file)
index 0000000..c4b906d
--- /dev/null
@@ -0,0 +1,5 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.externallinks ADD el_index_60 VARBINARY(60) NOT NULL DEFAULT '';
+CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
+CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
diff --git a/maintenance/oracle/archives/patch-user_groups-ug_expiry.sql b/maintenance/oracle/archives/patch-user_groups-ug_expiry.sql
new file mode 100644 (file)
index 0000000..d5376a3
--- /dev/null
@@ -0,0 +1,8 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.user_groups ADD (
+ug_expiry TIMESTAMP(6) WITH TIME ZONE  NULL
+);
+DROP INDEX IF EXISTS &mw_prefix.user_groups_u01;
+ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_pk PRIMARY KEY (ug_user,ug_group);
+CREATE INDEX &mw_prefix.user_groups_i02 ON &mw_prefix.user_groups (ug_expiry);
index 616b401..fc3c696 100644 (file)
@@ -33,11 +33,13 @@ INSERT INTO &mw_prefix.mwuser
 
 CREATE TABLE &mw_prefix.user_groups (
   ug_user   NUMBER      DEFAULT 0 NOT NULL,
-  ug_group  VARCHAR2(255)     NOT NULL
+  ug_group  VARCHAR2(255)     NOT NULL,
+  ug_expiry TIMESTAMP(6) WITH TIME ZONE NULL
 );
+ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_pk PRIMARY KEY (ug_user,ug_group);
 ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE UNIQUE INDEX &mw_prefix.user_groups_u01 ON &mw_prefix.user_groups (ug_user,ug_group);
 CREATE INDEX &mw_prefix.user_groups_i01 ON &mw_prefix.user_groups (ug_group);
+CREATE INDEX &mw_prefix.user_groups_i02 ON &mw_prefix.user_groups (ug_expiry);
 
 CREATE TABLE &mw_prefix.user_former_groups (
   ufg_user   NUMBER      DEFAULT 0 NOT NULL,
@@ -219,13 +221,16 @@ CREATE TABLE &mw_prefix.externallinks (
   el_id     NUMBER  NOT NULL,
   el_from   NUMBER  NOT NULL,
   el_to     VARCHAR2(2048) NOT NULL,
-  el_index  VARCHAR2(2048) NOT NULL
+  el_index  VARCHAR2(2048) NOT NULL,
+  el_index_60  VARBINARY(60) NOT NULL DEFAULT ''
 );
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to);
 CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
 CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
+CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
+CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
 
 CREATE TABLE &mw_prefix.langlinks (
   ll_from    NUMBER  NOT NULL,
index e4f3e91..2da8830 100644 (file)
@@ -57,7 +57,7 @@ class Orphans extends Maintenance {
        /**
         * Lock the appropriate tables for the script
         * @param Database $db
-        * @param string $extraTable The name of any extra tables to lock (eg: text)
+        * @param string[] $extraTable The name of any extra tables to lock (eg: text)
         */
        private function lockTables( $db, $extraTable = [] ) {
                $tbls = [ 'page', 'revision', 'redirect' ];
index c6bd794..b41e0e0 100644 (file)
@@ -28,6 +28,10 @@ require_once __DIR__ . '/Maintenance.php';
  *  populateContentModel.php --ns=1 --table=page
  */
 class PopulateContentModel extends Maintenance {
+       protected $wikiId;
+
+       protected $wanCache;
+
        public function __construct() {
                parent::__construct();
                $this->addDescription( 'Populate the various content_* fields' );
@@ -38,6 +42,11 @@ class PopulateContentModel extends Maintenance {
 
        public function execute() {
                $dbw = $this->getDB( DB_MASTER );
+
+               $this->wikiId = $dbw->getWikiID();
+
+               $this->wanCache = ObjectCache::getMainWANInstance();
+
                $ns = $this->getOption( 'ns' );
                if ( !ctype_digit( $ns ) && $ns !== 'all' ) {
                        $this->error( 'Invalid namespace', 1 );
@@ -57,6 +66,18 @@ class PopulateContentModel extends Maintenance {
                }
        }
 
+       protected function clearCache( $page_id, $rev_id ) {
+               $contentModelKey = $this->wanCache->makeKey( 'page', 'content-model', $rev_id );
+               $revisionKey =
+                       $this->wanCache->makeGlobalKey( 'revision', $this->wikiId, $page_id, $rev_id );
+
+               // WikiPage content model cache
+               $this->wanCache->delete( $contentModelKey );
+
+               // Revision object cache, which contains a content model
+               $this->wanCache->delete( $revisionKey );
+       }
+
        private function updatePageRows( Database $dbw, $pageIds, $model ) {
                $count = count( $pageIds );
                $this->output( "Setting $count rows to $model..." );
@@ -117,6 +138,7 @@ class PopulateContentModel extends Maintenance {
                        [ $key => $ids ],
                        __METHOD__
                );
+
                $this->output( "done.\n" );
        }
 
@@ -130,19 +152,27 @@ class PopulateContentModel extends Maintenance {
                        $fields = [ 'ar_namespace', 'ar_title' ];
                        $join_conds = [];
                        $where = $ns === 'all' ? [] : [ 'ar_namespace' => $ns ];
+                       $page_id_column = 'ar_page_id';
+                       $rev_id_column = 'ar_rev_id';
                } else { // revision
                        $selectTables = [ 'revision', 'page' ];
                        $fields = [ 'page_title', 'page_namespace' ];
                        $join_conds = [ 'page' => [ 'INNER JOIN', 'rev_page=page_id' ] ];
                        $where = $ns === 'all' ? [] : [ 'page_namespace' => $ns ];
+                       $page_id_column = 'rev_page';
+                       $rev_id_column = 'rev_id';
                }
 
                $toSave = [];
+               $idsToClear = [];
                $lastId = 0;
                do {
                        $rows = $dbw->select(
                                $selectTables,
-                               array_merge( $fields, [ $model_column, $format_column, $key ] ),
+                               array_merge(
+                                       $fields,
+                                       [ $model_column, $format_column, $key, $page_id_column, $rev_id_column ]
+                               ),
                                // @todo support populating format if model is already set
                                [
                                        $model_column => null,
@@ -174,9 +204,17 @@ class PopulateContentModel extends Maintenance {
                                if ( $dbModel === null && $dbFormat === null ) {
                                        // Set the defaults
                                        $toSave[$defaultModel][] = $row->{$key};
+                                       $idsToClear[] = [
+                                               'page_id' => $row->{$page_id_column},
+                                               'rev_id' => $row->{$rev_id_column},
+                                       ];
                                } else { // $dbModel === null, $dbFormat set.
                                        if ( $dbFormat === $defaultFormat ) {
                                                $toSave[$defaultModel][] = $row->{$key};
+                                               $idsToClear[] = [
+                                                       'page_id' => $row->{$page_id_column},
+                                                       'rev_id' => $row->{$rev_id_column},
+                                               ];
                                        } else { // non-default format, just update now
                                                $this->output( "Updating model to match format for $table $id of $title... " );
                                                $dbw->update(
@@ -186,6 +224,7 @@ class PopulateContentModel extends Maintenance {
                                                        __METHOD__
                                                );
                                                wfWaitForSlaves();
+                                               $this->clearCache( $row->{$page_id_column}, $row->{$rev_id_column} );
                                                $this->output( "done.\n" );
                                                continue;
                                        }
@@ -200,6 +239,10 @@ class PopulateContentModel extends Maintenance {
                foreach ( $toSave as $model => $ids ) {
                        $this->updateRevisionOrArchiveRows( $dbw, $ids, $model, $table );
                }
+
+               foreach ( $idsToClear as $idPair ) {
+                       $this->clearCache( $idPair['page_id'], $idPair['rev_id'] );
+               }
        }
 }
 
diff --git a/maintenance/populateInterwiki.php b/maintenance/populateInterwiki.php
new file mode 100644 (file)
index 0000000..8f7a918
--- /dev/null
@@ -0,0 +1,156 @@
+<?php
+
+/**
+ * Maintenance script that populates the interwiki table with list of sites from
+ * a source wiki, such as English Wikipedia. (the default source)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+class PopulateInterwiki extends Maintenance {
+
+       /**
+        * @var string
+        */
+       private $source;
+
+       public function __construct() {
+               parent::__construct();
+
+               $this->addDescription( <<<TEXT
+This script will populate the interwiki table, pulling in interwiki links that are used on Wikipedia
+or another MediaWiki wiki.
+
+When the script has finished, it will make a note of this in the database, and will not run again
+without the --force option.
+
+--source parameter is the url for the source wiki api, such as "https://en.wikipedia.org/w/api.php"
+(the default) from which the script fetches the interwiki data and uses here to populate
+the interwiki database table.
+TEXT
+               );
+
+               $this->addOption( 'source', 'Source wiki for interwiki table, such as '
+                       . 'https://en.wikipedia.org/w/api.php (the default)', false, true );
+               $this->addOption( 'force', 'Run regardless of whether the database says it has '
+                       . 'been run already.' );
+       }
+
+       public function execute() {
+               $force = $this->getOption( 'force', false );
+               $this->source = $this->getOption( 'source', 'https://en.wikipedia.org/w/api.php' );
+
+               $data = $this->fetchLinks();
+
+               if ( $data === false ) {
+                       $this->error( "Error during fetching data." );
+               } else {
+                       $this->doPopulate( $data, $force );
+               }
+       }
+
+       /**
+        * @return array[]|bool The 'interwikimap' sub-array or false on failure.
+        */
+       protected function fetchLinks() {
+               $url = wfArrayToCgi( [
+                       'action' => 'query',
+                       'meta' => 'siteinfo',
+                       'siprop' => 'interwikimap',
+                       'sifilteriw' => 'local',
+                       'format' => 'json'
+               ] );
+
+               if ( !empty( $this->source ) ) {
+                       $url = rtrim( $this->source, '?' ) . '?' . $url;
+               }
+
+               $json = Http::get( $url );
+               $data = json_decode( $json, true );
+
+               if ( is_array( $data ) ) {
+                       return $data['query']['interwikimap'];
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * @param array[] $data
+        * @param bool $force
+        *
+        * @return bool
+        */
+       protected function doPopulate( array $data, $force ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               if ( !$force ) {
+                       $row = $dbw->selectRow(
+                               'updatelog',
+                               '1',
+                               [ 'ul_key' => 'populate interwiki' ],
+                               __METHOD__
+                       );
+
+                       if ( $row ) {
+                               $this->output( "Interwiki table already populated.  Use php " .
+                                       "maintenance/populateInterwiki.php\n--force from the command line " .
+                                       "to override.\n" );
+                               return true;
+                       }
+               }
+
+               foreach ( $data as $d ) {
+                       $prefix = $d['prefix'];
+
+                       $row = $dbw->selectRow(
+                               'interwiki',
+                               '1',
+                               [ 'iw_prefix' => $prefix ],
+                               __METHOD__
+                       );
+
+                       if ( !$row ) {
+                               $dbw->insert(
+                                       'interwiki',
+                                       [
+                                               'iw_prefix' => $prefix,
+                                               'iw_url' => $d['url'],
+                                               'iw_local' => 1
+                                       ],
+                                       __METHOD__,
+                                       'IGNORE'
+                               );
+                       }
+
+                       Interwiki::invalidateCache( $prefix );
+               }
+
+               $this->output( "Interwiki links are populated.\n" );
+
+               return true;
+       }
+
+}
+
+$maintClass = PopulateInterwiki::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2273761..e19c447 100644 (file)
@@ -58,10 +58,13 @@ INSERT INTO mwuser
   VALUES (DEFAULT,'Anonymous','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,now(),now());
 
 CREATE TABLE user_groups (
-  ug_user   INTEGER      NULL  REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
-  ug_group  TEXT     NOT NULL
+  ug_user    INTEGER          NULL  REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  ug_group   TEXT         NOT NULL,
+  ug_expiry  TIMESTAMPTZ  NULL,
+  PRIMARY KEY(ug_user, ug_group)
 );
-CREATE UNIQUE INDEX user_groups_unique ON user_groups (ug_user, ug_group);
+CREATE INDEX user_groups_group  ON user_groups (ug_group);
+CREATE INDEX user_groups_expiry ON user_groups (ug_expiry);
 
 CREATE TABLE user_former_groups (
   ufg_user   INTEGER      NULL  REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
@@ -254,13 +257,16 @@ CREATE INDEX cl_sortkey     ON categorylinks (cl_to, cl_sortkey, cl_from);
 
 CREATE SEQUENCE externallinks_el_id_seq;
 CREATE TABLE externallinks (
-  el_id     INTEGER  NOT NULL  PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq'),
-  el_from   INTEGER  NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
-  el_to     TEXT     NOT NULL,
-  el_index  TEXT     NOT NULL
+  el_id       INTEGER     NOT NULL  PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq'),
+  el_from     INTEGER     NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  el_to       TEXT        NOT NULL,
+  el_index    TEXT        NOT NULL,
+  el_index_60 BYTEA       NOT NULL  DEFAULT ''
 );
 CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
 CREATE INDEX externallinks_index   ON externallinks (el_index);
+CREATE INDEX el_index_60           ON externallinks (el_index_60, el_id);
+CREATE INDEX el_from_index_60      ON externallinks (el_from, el_index_60, el_id);
 
 CREATE TABLE langlinks (
   ll_from    INTEGER  NOT NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
index 31b2101..f6bb253 100644 (file)
@@ -41,8 +41,8 @@ class Protect extends Maintenance {
        }
 
        public function execute() {
-               $userName = $this->getOption( 'u', false );
-               $reason = $this->getOption( 'r', '' );
+               $userName = $this->getOption( 'user', false );
+               $reason = $this->getOption( 'reason', '' );
 
                $cascade = $this->hasOption( 'cascade' );
 
index da8a6bc..d073282 100644 (file)
@@ -122,6 +122,9 @@ class RebuildFileCache extends Maintenance {
                                $article = Article::newFromTitle( $title, $context );
                                $context->setWikiPage( $article->getPage() );
 
+                               // Some extensions like FlaggedRevs while error out if this is unset
+                               RequestContext::getMain()->setTitle( $title );
+
                                // If the article is cacheable, then load it
                                if ( $article->isFileCacheable( HTMLFileCache::MODE_REBUILD ) ) {
                                        $viewCache = new HTMLFileCache( $title, 'view' );
index 37636c8..b7f0762 100644 (file)
@@ -108,9 +108,8 @@ class RebuildTextIndex extends Maintenance {
                        );
 
                        foreach ( $res as $s ) {
+                               $title = Title::makeTitle( $s->page_namespace, $s->page_title );
                                try {
-                                       $title = Title::makeTitle( $s->page_namespace, $s->page_title );
-
                                        $rev = new Revision( $s );
                                        $content = $rev->getContent();
 
index df4ce56..372c352 100644 (file)
@@ -139,45 +139,53 @@ class RefreshImageMetadata extends Maintenance {
                        }
 
                        foreach ( $res as $row ) {
-                               // LocalFile will upgrade immediately here if obsolete
-                               $file = $repo->newFileFromRow( $row );
-                               if ( $file->getUpgraded() ) {
-                                       // File was upgraded.
-                                       $upgraded++;
-                                       $newLength = strlen( $file->getMetadata() );
-                                       $oldLength = strlen( $row->img_metadata );
-                                       if ( $newLength < $oldLength - 5 ) {
-                                               // If after updating, the metadata is smaller then
-                                               // what it was before, that's probably not a good thing
-                                               // because we extract more data with time, not less.
-                                               // Thus this probably indicates an error of some sort,
-                                               // or at the very least is suspicious. Have the - 5 just
-                                               // to weed out any inconsequential changes.
-                                               $error++;
-                                               $this->output( "Warning: File:{$row->img_name} used to have " .
-                                                       "$oldLength bytes of metadata but now has $newLength bytes.\n" );
-                                       } elseif ( $verbose ) {
-                                               $this->output( "Refreshed File:{$row->img_name}.\n" );
-                                       }
-                               } else {
-                                       $leftAlone++;
-                                       if ( $force ) {
-                                               $file->upgradeRow();
+                               try {
+                                       // LocalFile will upgrade immediately here if obsolete
+                                       $file = $repo->newFileFromRow( $row );
+                                       if ( $file->getUpgraded() ) {
+                                               // File was upgraded.
+                                               $upgraded++;
                                                $newLength = strlen( $file->getMetadata() );
                                                $oldLength = strlen( $row->img_metadata );
                                                if ( $newLength < $oldLength - 5 ) {
+                                                       // If after updating, the metadata is smaller then
+                                                       // what it was before, that's probably not a good thing
+                                                       // because we extract more data with time, not less.
+                                                       // Thus this probably indicates an error of some sort,
+                                                       // or at the very least is suspicious. Have the - 5 just
+                                                       // to weed out any inconsequential changes.
                                                        $error++;
-                                                       $this->output( "Warning: File:{$row->img_name} used to have " .
-                                                               "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n" );
-                                               }
-                                               if ( $verbose ) {
-                                                       $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
+                                                       $this->output(
+                                                               "Warning: File:{$row->img_name} used to have " .
+                                                               "$oldLength bytes of metadata but now has $newLength bytes.\n"
+                                                       );
+                                               } elseif ( $verbose ) {
+                                                       $this->output( "Refreshed File:{$row->img_name}.\n" );
                                                }
                                        } else {
-                                               if ( $verbose ) {
-                                                       $this->output( "Skipping File:{$row->img_name}.\n" );
+                                               $leftAlone++;
+                                               if ( $force ) {
+                                                       $file->upgradeRow();
+                                                       $newLength = strlen( $file->getMetadata() );
+                                                       $oldLength = strlen( $row->img_metadata );
+                                                       if ( $newLength < $oldLength - 5 ) {
+                                                               $error++;
+                                                               $this->output(
+                                                                       "Warning: File:{$row->img_name} used to have " .
+                                                                       "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n"
+                                                               );
+                                                       }
+                                                       if ( $verbose ) {
+                                                               $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
+                                                       }
+                                               } else {
+                                                       if ( $verbose ) {
+                                                               $this->output( "Skipping File:{$row->img_name}.\n" );
+                                                       }
                                                }
                                        }
+                               } catch ( Exception $e ) {
+                                       $this->output( "{$row->img_name} failed. {$e->getMessage()}\n" );
                                }
                        }
                        $conds2 = [ 'img_name > ' . $dbw->addQuotes( $row->img_name ) ];
index e7a4d06..fb24a1d 100644 (file)
@@ -29,6 +29,8 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class RefreshLinks extends Maintenance {
+       const REPORTING_INTERVAL = 100;
+
        /** @var int|bool */
        protected $namespace = false;
 
@@ -43,6 +45,8 @@ class RefreshLinks extends Maintenance {
                $this->addOption( 'dfn-chunk-size', 'Maximum number of existent IDs to check per ' .
                        'query, default 100000', false, true );
                $this->addOption( 'namespace', 'Only fix pages in this namespace', false, true );
+               $this->addOption( 'category', 'Only fix pages in this category', false, true );
+               $this->addOption( 'tracking-category', 'Only fix pages in this tracking category', false, true );
                $this->addArg( 'start', 'Page_id to start from, default 1', false );
                $this->setBatchSize( 100 );
        }
@@ -61,7 +65,15 @@ class RefreshLinks extends Maintenance {
                } else {
                        $this->namespace = (int)$ns;
                }
-               if ( !$this->hasOption( 'dfn-only' ) ) {
+               if ( ( $category = $this->getOption( 'category', false ) ) !== false ) {
+                       $title = Title::makeTitleSafe( NS_CATEGORY, $category );
+                       if ( !$title ) {
+                               $this->error( "'$category' is an invalid category name!\n", true );
+                       }
+                       $this->refreshCategory( $category );
+               } elseif ( ( $category = $this->getOption( 'tracking-category', false ) ) !== false ) {
+                       $this->refreshTrackingCategory( $category );
+               } elseif ( !$this->hasOption( 'dfn-only' ) ) {
                        $new = $this->getOption( 'new-only', false );
                        $redir = $this->getOption( 'redirects-only', false );
                        $oldRedir = $this->getOption( 'old-redirects-only', false );
@@ -89,7 +101,6 @@ class RefreshLinks extends Maintenance {
        private function doRefreshLinks( $start, $newOnly = false,
                $end = null, $redirectsOnly = false, $oldRedirectsOnly = false
        ) {
-               $reportingInterval = 100;
                $dbr = $this->getDB( DB_REPLICA, [ 'vslow' ] );
 
                if ( $start === null ) {
@@ -124,7 +135,7 @@ class RefreshLinks extends Maintenance {
                        $i = 0;
 
                        foreach ( $res as $row ) {
-                               if ( !( ++$i % $reportingInterval ) ) {
+                               if ( !( ++$i % self::REPORTING_INTERVAL ) ) {
                                        $this->output( "$i\n" );
                                        wfWaitForSlaves();
                                }
@@ -145,7 +156,7 @@ class RefreshLinks extends Maintenance {
 
                        $i = 0;
                        foreach ( $res as $row ) {
-                               if ( !( ++$i % $reportingInterval ) ) {
+                               if ( !( ++$i % self::REPORTING_INTERVAL ) ) {
                                        $this->output( "$i\n" );
                                        wfWaitForSlaves();
                                }
@@ -166,7 +177,7 @@ class RefreshLinks extends Maintenance {
 
                        for ( $id = $start; $id <= $end; $id++ ) {
 
-                               if ( !( $id % $reportingInterval ) ) {
+                               if ( !( $id % self::REPORTING_INTERVAL ) ) {
                                        $this->output( "$id\n" );
                                        wfWaitForSlaves();
                                }
@@ -179,7 +190,7 @@ class RefreshLinks extends Maintenance {
 
                                for ( $id = $start; $id <= $end; $id++ ) {
 
-                                       if ( !( $id % $reportingInterval ) ) {
+                                       if ( !( $id % self::REPORTING_INTERVAL ) ) {
                                                $this->output( "$id\n" );
                                                wfWaitForSlaves();
                                        }
@@ -379,6 +390,7 @@ class RefreshLinks extends Maintenance {
         * @param string $var Field name
         * @param mixed $start First value to include or null
         * @param mixed $end Last value to include or null
+        * @return string
         */
        private static function intervalCond( IDatabase $db, $var, $start, $end ) {
                if ( $start === null && $end === null ) {
@@ -391,6 +403,87 @@ class RefreshLinks extends Maintenance {
                        return "$var BETWEEN {$db->addQuotes( $start )} AND {$db->addQuotes( $end )}";
                }
        }
+
+       /**
+        * Refershes links for pages in a tracking category
+        *
+        * @param string $category Category key
+        */
+       private function refreshTrackingCategory( $category ) {
+               $cats = $this->getPossibleCategories( $category );
+
+               if ( !$cats ) {
+                       $this->error( "Tracking category '$category' is disabled\n" );
+                       // Output to stderr but don't bail out,
+               }
+
+               foreach ( $cats as $cat ) {
+                       $this->refreshCategory( $cat );
+               }
+       }
+
+       /**
+        * Refreshes links to a category
+        *
+        * @param Title $category
+        */
+       private function refreshCategory( Title $category ) {
+               $this->output( "Refreshing pages in category '{$category->getText()}'...\n" );
+
+               $dbr = $this->getDB( DB_REPLICA );
+               $conds = [
+                       'page_id=cl_from',
+                       'cl_to' => $category->getDBkey(),
+               ];
+               if ( $this->namespace !== false ) {
+                       $conds['page_namespace'] = $this->namespace;
+               }
+
+               $i = 0;
+               $timestamp = '';
+               $lastId = 0;
+               do {
+                       $finalConds = $conds;
+                       $timestamp = $dbr->addQuotes( $timestamp );
+                       $finalConds []=
+                               "(cl_timestamp > $timestamp OR (cl_timestamp = $timestamp AND cl_from > $lastId))";
+                       $res = $dbr->select( [ 'page', 'categorylinks' ],
+                               [ 'page_id', 'cl_timestamp' ],
+                               $finalConds,
+                               __METHOD__,
+                               [
+                                       'ORDER BY' => [ 'cl_timestamp', 'cl_from' ],
+                                       'LIMIT' => $this->mBatchSize,
+                               ]
+                       );
+
+                       foreach ( $res as $row ) {
+                               if ( !( ++$i % self::REPORTING_INTERVAL ) ) {
+                                       $this->output( "$i\n" );
+                                       wfWaitForSlaves();
+                               }
+                               $lastId = $row->page_id;
+                               $timestamp = $row->cl_timestamp;
+                               self::fixLinksFromArticle( $row->page_id );
+                       }
+
+               } while ( $res->numRows() == $this->mBatchSize );
+       }
+
+       /**
+        * Returns a list of possible categories for a given tracking category key
+        *
+        * @param string $categoryKey
+        * @return Title[]
+        */
+       private function getPossibleCategories( $categoryKey ) {
+               $trackingCategories = new TrackingCategories( $this->getConfig() );
+               $cats = $trackingCategories->getTrackingCategories();
+               if ( isset( $cats[$categoryKey] ) ) {
+                       return $cats[$categoryKey]['cats'];
+               }
+               $this->error( "Unknown tracking category {$categoryKey}\n", true );
+       }
 }
 
 $maintClass = 'RefreshLinks';
diff --git a/maintenance/shell.php b/maintenance/shell.php
new file mode 100644 (file)
index 0000000..47ef804
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Modern interactive shell within the MediaWiki engine.
+ *
+ * Merely wraps around http://psysh.org/ and drop an interactive PHP shell in
+ * the global scope.
+ *
+ * Copyright © 2017 Antoine Musso <hashar@free.fr>
+ * Copyright © 2017 Gergő Tisza <tgr.huwiki@gmail.com>
+ * Copyright © 2017 Justin Hileman <justin@justinhileman.info>
+ * Copyright © 2017 Wikimedia Foundation Inc.
+ * https://www.mediawiki.org/
+ *
+ * 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 Antoine Musso <hashar@free.fr>
+ * @author Justin Hileman <justin@justinhileman.info>
+ * @author Gergő Tisza <tgr.huwiki@gmail.com>
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Interactive shell with completion and global scope.
+ *
+ */
+class MediaWikiShell extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->addOption( 'd',
+                       'For back compatibility with eval.php. ' .
+                       '0 send debug to stdout. ' .
+                       'With 1 additionally initialize database with debugging ',
+                       false, true
+               );
+       }
+
+       public function execute() {
+               if ( !class_exists( \Psy\Shell::class ) ) {
+                       $this->error( 'PsySH not found. Please run composer with the --dev option.', 1 );
+               }
+
+               $traverser = new \PhpParser\NodeTraverser();
+               $codeCleaner = new \Psy\CodeCleaner( null, null, $traverser );
+
+               // add this after initializing the code cleaner so all the default passes get added first
+               $traverser->addVisitor( new CodeCleanerGlobalsPass() );
+
+               $config = new \Psy\Configuration( [ 'codeCleaner' => $codeCleaner ] );
+               $config->setUpdateCheck( \Psy\VersionUpdater\Checker::NEVER );
+               $shell = new \Psy\Shell( $config );
+               if ( $this->hasOption( 'd' ) ) {
+                       $this->setupLegacy();
+               }
+
+               $shell->run();
+       }
+
+       /**
+        * For back compatibility with eval.php
+        */
+       protected function setupLegacy() {
+               global $wgDebugLogFile;
+
+               $d = intval( $this->getOption( 'd' ) );
+               if ( $d > 0 ) {
+                       $wgDebugLogFile = 'php://stdout';
+               }
+               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 );
+                       }
+               }
+       }
+
+}
+
+$maintClass = 'MediaWikiShell';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sqlite/archives/patch-user_groups-ug_expiry.sql b/maintenance/sqlite/archives/patch-user_groups-ug_expiry.sql
new file mode 100644 (file)
index 0000000..7fc8941
--- /dev/null
@@ -0,0 +1,21 @@
+DROP TABLE IF EXISTS /*_*/user_groups_tmp;
+
+CREATE TABLE /*$wgDBprefix*/user_groups_tmp (
+  ug_user int unsigned NOT NULL default 0,
+  ug_group varbinary(255) NOT NULL default '',
+  ug_expiry varbinary(14) NULL default NULL,
+  PRIMARY KEY (ug_user, ug_group)
+);
+
+INSERT OR IGNORE INTO /*_*/user_groups_tmp (
+    ug_user, ug_group )
+    SELECT
+    ug_user, ug_group
+    FROM /*_*/user_groups;
+
+DROP TABLE /*_*/user_groups;
+
+ALTER TABLE /*_*/user_groups_tmp RENAME TO /*_*/user_groups;
+
+CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
+CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups (ug_expiry);
index bb9f4ea..9045870 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance ExternalStorage
  */
 
+use MediaWiki\MediaWikiServices;
+
 if ( !defined( 'MEDIAWIKI' ) ) {
        $optionsWithoutArgs = [ 'fix' ];
        require_once __DIR__ . '/../commandLine.inc';
@@ -470,7 +472,7 @@ class CheckStorage {
                $source = new ImportStreamSource( $file );
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setRevisionCallback( [ $this, 'importRevision' ] );
                $importer->doImport();
index 28be6a3..c17ce99 100644 (file)
@@ -51,13 +51,11 @@ require_once __DIR__ . '/../Maintenance.php';
 class CompressOld extends Maintenance {
        /**
         * Option to load each revision individually.
-        *
         */
        const LS_INDIVIDUAL = 0;
 
        /**
         * Option to load revisions in chunks.
-        *
         */
        const LS_CHUNKED = 1;
 
index cf60d89..892f799 100644 (file)
@@ -160,11 +160,17 @@ CREATE TABLE /*_*/user_groups (
   -- with particular permissions. A user will have the combined
   -- permissions of any group they're explicitly in, plus
   -- the implicit '*' and 'user' groups.
-  ug_group varbinary(255) NOT NULL default ''
+  ug_group varbinary(255) NOT NULL default '',
+
+  -- Time at which the user group membership will expire. Set to
+  -- NULL for a non-expiring (infinite) membership.
+  ug_expiry varbinary(14) NULL default NULL,
+
+  PRIMARY KEY (ug_user, ug_group)
 ) /*$wgDBTableOptions*/;
 
-CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
 CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
+CREATE INDEX /*i*/ug_expiry ON /*_*/user_groups (ug_expiry);
 
 -- Stores the groups the user has once belonged to.
 -- The user may still belong to these groups (check user_groups).
@@ -676,12 +682,19 @@ CREATE TABLE /*_*/externallinks (
   -- which allows for fast searching for all pages under example.com with the
   -- clause:
   --      WHERE el_index LIKE 'http://com.example.%'
-  el_index blob NOT NULL
+  el_index blob NOT NULL,
+
+  -- This is el_index truncated to 60 bytes to allow for sortable queries that
+  -- aren't supported by a partial index.
+  -- @todo Drop the default once this is deployed everywhere and code is populating it.
+  el_index_60 varbinary(60) NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
+CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id);
+CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id);
 
 --
 -- Track interlanguage links
index b9baf8c..9906990 100644 (file)
@@ -2,73 +2,22 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
-use Composer\Spdx\SpdxLicenses;
-use JsonSchema\Validator;
-
 class ValidateRegistrationFile extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addArg( 'path', 'Path to extension.json/skin.json file.', true );
        }
        public function execute() {
-               if ( !class_exists( Validator::class ) ) {
-                       $this->error( 'The JsonSchema library cannot be found, please install it through composer.', 1 );
-               } elseif ( !class_exists( SpdxLicenses::class ) ) {
-                       $this->error(
-                               'The spdx-licenses library cannot be found, please install it through composer.', 1
-                       );
-               }
-
+               $validator = new ExtensionJsonValidator( function( $msg ) {
+                       $this->error( $msg, 1 );
+               } );
+               $validator->checkDependencies();
                $path = $this->getArg( 0 );
-               $data = json_decode( file_get_contents( $path ) );
-               if ( !is_object( $data ) ) {
-                       $this->error( "$path is not a valid JSON file.", 1 );
-               }
-               if ( !isset( $data->manifest_version ) ) {
-                       $this->output( "Warning: No manifest_version set, assuming 1.\n" );
-                       // For backwards-compatability assume 1
-                       $data->manifest_version = 1;
-               }
-               $version = $data->manifest_version;
-               if ( $version !== ExtensionRegistry::MANIFEST_VERSION ) {
-                       $schemaPath = dirname( __DIR__ ) . "/docs/extension.schema.v$version.json";
-               } else {
-                       $schemaPath = dirname( __DIR__ ) . '/docs/extension.schema.json';
-               }
-
-               if ( $version < ExtensionRegistry::OLDEST_MANIFEST_VERSION
-                       || $version > ExtensionRegistry::MANIFEST_VERSION
-               ) {
-                       $this->error( "Error: $path is using a non-supported schema version, it should use "
-                               . ExtensionRegistry::MANIFEST_VERSION, 1 );
-               } elseif ( $version < ExtensionRegistry::MANIFEST_VERSION ) {
-                       $this->output( "Warning: $path is using a deprecated schema, and should be updated to "
-                               . ExtensionRegistry::MANIFEST_VERSION . "\n" );
-               }
-
-               $licenseError = false;
-               // Check if it's a string, if not, schema validation will display an error
-               if ( isset( $data->{'license-name'} ) && is_string( $data->{'license-name'} ) ) {
-                       $licenses = new SpdxLicenses();
-                       $valid = $licenses->validate( $data->{'license-name'} );
-                       if ( !$valid ) {
-                               $licenseError = '[license-name] Invalid SPDX license identifier, '
-                                       . 'see <https://spdx.org/licenses/>';
-                       }
-               }
-
-               $validator = new Validator;
-               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
-               if ( $validator->isValid() && !$licenseError ) {
-                       $this->output( "$path validates against the version $version schema!\n" );
-               } else {
-                       foreach ( $validator->getErrors() as $error ) {
-                               $this->output( "[{$error['property']}] {$error['message']}\n" );
-                       }
-                       if ( $licenseError ) {
-                               $this->output( "$licenseError\n" );
-                       }
-                       $this->error( "$path does not validate.", 1 );
+               try {
+                       $validator->validate( $path );
+                       $this->output( "$path validates against the schema!\n" );
+               } catch ( ExtensionJsonValidationError $e ) {
+                       $this->error( $e->getMessage(), 1 );
                }
        }
 }
diff --git a/maintenance/view.php b/maintenance/view.php
new file mode 100644 (file)
index 0000000..af7eb2d
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Show page contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to show page contents.
+ *
+ * @ingroup Maintenance
+ */
+class ViewCLI extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Show article contents on the command line' );
+               $this->addArg( 'title', 'Title of article to view' );
+       }
+
+       public function execute() {
+               $title = Title::newFromText( $this->getArg() );
+               if ( !$title ) {
+                       $this->error( "Invalid title", true );
+               }
+
+               $page = WikiPage::factory( $title );
+
+               $content = $page->getContent( Revision::RAW );
+               if ( !$content ) {
+                       $this->error( "Page has no content", true );
+               }
+               if ( !$content instanceof TextContent ) {
+                       $this->error( "Non-text content models not supported", true );
+               }
+
+               $this->output( $content->getNativeData() );
+       }
+}
+
+$maintClass = "ViewCLI";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 0a859c0..85fa780 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use MediaWiki\MediaWikiServices;
+
 /**
  * Maintenance script to wrap all old-style passwords in a layered type
  *
@@ -71,6 +74,7 @@ class WrapOldPasswords extends Maintenance {
                $typeCond = 'user_password' . $dbw->buildLike( ":$firstType:", $dbw->anyString() );
 
                $minUserId = 0;
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                do {
                        $this->beginTransaction( $dbw, __METHOD__ );
 
@@ -113,7 +117,7 @@ class WrapOldPasswords extends Maintenance {
                        }
 
                        $this->commitTransaction( $dbw, __METHOD__ );
-                       LBFactory::waitForReplication();
+                       $lbFactory->waitForReplication();
 
                        // Clear memcached so old passwords are wiped out
                        foreach ( $updateUsers as $user ) {
index f9c6117..3b2798f 100644 (file)
@@ -29,7 +29,11 @@ body {
        margin: 0 0 10px 10px;
 }
 
-td, h3, p, h1, pre {
+h1,
+h3,
+p,
+pre,
+td {
        margin: 0 20px 20px 20px;
        font-size: 11px;
        line-height: 140%;
index 3aeb1ed..10a6de8 100644 (file)
 
 .config-block-label {
        display: block;
-       margin-bottom: .2em;
+       margin-bottom: 0.2em;
 }
 
-.config-block-label label, .config-label {
+.config-block-label label,
+.config-label {
        font-weight: bold;
-       padding-right: .5em;
-       padding-top: .2em;
+       padding-right: 0.5em;
+       padding-top: 0.2em;
 }
 
 .config-block-elements {
 .btn-install {
        font-weight: bold;
        font-size: 110%;
-       padding: .2em .3em;
+       padding: 0.2em 0.3em;
 }
 
 .success-message {
        background-position: left center;
        background-repeat: no-repeat;
        cursor: pointer;
-       font-size: .8em;
+       font-size: 0.8em;
        text-decoration: underline;
        color: #0645ad;
 }
index 926ac43..be9debc 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile Generic.Arrays.DisallowLongArraySyntax
 /**
  * New version of MediaWiki web-based config/installation
  *
@@ -60,7 +61,7 @@ function wfInstallerMain() {
        if ( isset( $_SESSION['installData'][$fingerprint] ) ) {
                $session = $_SESSION['installData'][$fingerprint];
        } else {
-               $session = [];
+               $session = array();
        }
 
        if ( !is_null( $wgRequest->getVal( 'uselang' ) ) ) {
index 0e841f8..b868295 100644 (file)
@@ -6,20 +6,21 @@
     "postdoc": "grunt copy:jsduck"
   },
   "devDependencies": {
+    "eslint": "3.12.2",
     "eslint-config-wikimedia": "0.3.0",
     "grunt": "1.0.1",
     "grunt-banana-checker": "0.5.0",
     "grunt-contrib-copy": "1.0.0",
     "grunt-contrib-watch": "1.0.0",
     "grunt-eslint": "19.0.0",
-    "grunt-jsonlint": "1.0.7",
+    "grunt-jsonlint": "1.1.0",
     "grunt-karma": "2.0.0",
-    "grunt-stylelint": "0.6.0",
+    "grunt-stylelint": "0.7.0",
     "karma": "1.1.0",
-    "karma-chrome-launcher": "1.0.1",
+    "karma-chrome-launcher": "2.0.0",
     "karma-firefox-launcher": "1.0.0",
     "karma-qunit": "1.0.0",
     "qunitjs": "1.22.0",
-    "stylelint-config-wikimedia": "0.3.0"
+    "stylelint-config-wikimedia": "0.4.1"
   }
 }
index edce2ea..4693b42 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -31,4 +31,7 @@
        <exclude-pattern type="relative">^extensions/</exclude-pattern>
        <exclude-pattern type="relative">^skins/</exclude-pattern>
        <exclude-pattern>.git</exclude-pattern>
+       <exclude-pattern>AdminSettings.php</exclude-pattern>
+       <exclude-pattern>LocalSettings.php</exclude-pattern>
+       <exclude-pattern>StartProfiler.php</exclude-pattern>
 </ruleset>
index e619771..d6cb43f 100644 (file)
@@ -53,9 +53,6 @@ return [
        'user' => [ 'class' => 'ResourceLoaderUserModule' ],
        'user.styles' => [ 'class' => 'ResourceLoaderUserStylesModule' ],
 
-       // Scripts generated based on the current user's preferences
-       'user.cssprefs' => [ 'class' => 'ResourceLoaderUserCSSPrefsModule' ],
-
        // Populate mediawiki.user placeholders with information about the current user
        'user.defaults' => [ 'class' => 'ResourceLoaderUserDefaultsModule' ],
        'user.options' => [ 'class' => 'ResourceLoaderUserOptionsModule' ],
@@ -334,7 +331,6 @@ return [
                        'message' => 'Please use "mediawiki.storage" instead.',
                ],
                'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
-               'dependencies' => 'json',
        ],
        'jquery.suggestions' => [
                'scripts' => 'resources/src/jquery/jquery.suggestions.js',
@@ -738,20 +734,22 @@ return [
 
        /* json2 */
 
+       // Deprecated since MediaWiki 1.29.0
        'json' => [
-               'scripts' => 'resources/lib/json2/json2.js',
+               'deprecated' => 'Use of the "json" MediaWiki module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/json-skip.js',
        ],
 
        /* Moment.js */
 
        'moment' => [
                'scripts' => [
-                       'resources/lib/moment/moment.js',
+                       // HACK: For some reason if you don't define window.moment first, loading moment fatals
                        'resources/src/moment-global.js',
+                       'resources/lib/moment/moment.js',
                ],
                'languageScripts' => [
+                       'aeb-arab' => 'resources/lib/moment/locale/ar-tn.js',
                        'af' => 'resources/lib/moment/locale/af.js',
                        'ar' => 'resources/lib/moment/locale/ar.js',
                        'ar-ma' => 'resources/lib/moment/locale/ar-ma.js',
@@ -770,6 +768,7 @@ return [
                        'da' => 'resources/lib/moment/locale/da.js',
                        'de' => 'resources/lib/moment/locale/de.js',
                        'de-at' => 'resources/lib/moment/locale/de-at.js',
+                       'dv' => 'resources/lib/moment/locale/dv.js',
                        'el' => 'resources/lib/moment/locale/el.js',
                        'en' => 'resources/src/moment-dmy.js',
                        'en-au' => 'resources/lib/moment/locale/en-au.js',
@@ -784,6 +783,8 @@ return [
                        'fo' => 'resources/lib/moment/locale/fo.js',
                        'fr-ca' => 'resources/lib/moment/locale/fr-ca.js',
                        'fr' => 'resources/lib/moment/locale/fr.js',
+                       'fy' => 'resources/lib/moment/locale/fy.js',
+                       'gd' => 'resources/lib/moment/locale/gd.js',
                        'gl' => 'resources/lib/moment/locale/gl.js',
                        'he' => 'resources/lib/moment/locale/he.js',
                        'hi' => 'resources/lib/moment/locale/hi.js',
@@ -794,31 +795,43 @@ return [
                        'is' => 'resources/lib/moment/locale/is.js',
                        'it' => 'resources/lib/moment/locale/it.js',
                        'ja' => 'resources/lib/moment/locale/ja.js',
+                       'jv' => 'resources/lib/moment/locale/jv.js',
                        'ka' => 'resources/lib/moment/locale/ka.js',
+                       'kk-cyrl' => 'resources/lib/moment/locale/kk.js',
                        'ko' => 'resources/lib/moment/locale/ko.js',
+                       'ky' => 'resources/lib/moment/locale/ky.js',
+                       'lo' => 'resources/lib/moment/locale/lo.js',
                        'lt' => 'resources/lib/moment/locale/lt.js',
                        'lv' => 'resources/lib/moment/locale/lv.js',
+                       'mi' => 'resources/lib/moment/locale/mi.js',
                        'mk' => 'resources/lib/moment/locale/mk.js',
                        'ml' => 'resources/lib/moment/locale/ml.js',
                        'mr' => 'resources/lib/moment/locale/mr.js',
                        'ms-my' => 'resources/lib/moment/locale/ms-my.js',
+                       'ms' => 'resources/lib/moment/locale/ms.js',
                        'my' => 'resources/lib/moment/locale/my.js',
                        'nb' => 'resources/lib/moment/locale/nb.js',
                        'ne' => 'resources/lib/moment/locale/ne.js',
                        'nl' => 'resources/lib/moment/locale/nl.js',
                        'nn' => 'resources/lib/moment/locale/nn.js',
+                       'pa' => 'resources/lib/moment/locale/pa-in.js',
                        'pl' => 'resources/lib/moment/locale/pl.js',
                        'pt-br' => 'resources/lib/moment/locale/pt-br.js',
                        'pt' => 'resources/lib/moment/locale/pt.js',
                        'ro' => 'resources/lib/moment/locale/ro.js',
                        'ru' => 'resources/lib/moment/locale/ru.js',
+                       'se' => 'resources/lib/moment/locale/se.js',
+                       'si' => 'resources/lib/moment/locale/si.js',
                        'sk' => 'resources/lib/moment/locale/sk.js',
                        'sl' => 'resources/lib/moment/locale/sl.js',
                        'sq' => 'resources/lib/moment/locale/sq.js',
                        'sr-ec' => 'resources/lib/moment/locale/sr-cyrl.js',
                        'sr-el' => 'resources/lib/moment/locale/sr.js',
+                       'ss' => 'resources/lib/moment/locale/ss.js',
                        'sv' => 'resources/lib/moment/locale/sv.js',
+                       'sw' => 'resources/lib/moment/locale/sw.js',
                        'ta' => 'resources/lib/moment/locale/ta.js',
+                       'te' => 'resources/lib/moment/locale/te.js',
                        'th' => 'resources/lib/moment/locale/th.js',
                        'tl-ph' => 'resources/lib/moment/locale/tl-ph.js',
                        'tr' => 'resources/lib/moment/locale/tr.js',
@@ -828,6 +841,7 @@ return [
                        'uz' => 'resources/lib/moment/locale/uz.js',
                        'vi' => 'resources/lib/moment/locale/vi.js',
                        'zh-cn' => 'resources/lib/moment/locale/zh-cn.js',
+                       'zh-hk' => 'resources/lib/moment/locale/zh-hk.js',
                        'zh-tw' => 'resources/lib/moment/locale/zh-tw.js',
                        'zh-hans' => 'resources/lib/moment/locale/zh-cn.js',
                        'zh-hant' => 'resources/lib/moment/locale/zh-tw.js',
@@ -926,7 +940,6 @@ return [
                        'dom-level2-shim',
                        'mediawiki.api',
                        'mediawiki.api.edit',
-                       'json',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1065,7 +1078,6 @@ return [
                        'resources/src/mediawiki/htmlform/autocomplete.js',
                        'resources/src/mediawiki/htmlform/autoinfuse.js',
                        'resources/src/mediawiki/htmlform/checkmatrix.js',
-                       'resources/src/mediawiki/htmlform/datetime.js',
                        'resources/src/mediawiki/htmlform/cloner.js',
                        'resources/src/mediawiki/htmlform/hide-if.js',
                        'resources/src/mediawiki/htmlform/multiselect.js',
@@ -1109,7 +1121,6 @@ return [
                'dependencies' => [
                        'jquery.byteLength',
                        'mediawiki.RegExp',
-                       'json',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1180,7 +1191,6 @@ return [
                        'searchsuggest-containing',
                ],
                'dependencies' => [
-                       'jquery.client',
                        'jquery.placeholder',
                        'jquery.suggestions',
                        'jquery.getAttrs',
@@ -1197,7 +1207,10 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.Title' => [
-               'scripts' => 'resources/src/mediawiki/mediawiki.Title.js',
+               'scripts' => [
+                       'resources/src/mediawiki/mediawiki.Title.js',
+                       'resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js',
+               ],
                'dependencies' => [
                        'jquery.byteLength',
                        'mediawiki.util',
@@ -1281,59 +1294,18 @@ return [
                        'upload-form-label-infoform-description-tooltip',
                        'upload-form-label-usage-title',
                        'upload-form-label-usage-filename',
-                       'api-error-unknownerror',
+                       'action-upload',
+                       'apierror-mustbeloggedin',
+                       'badaccess-groups',
+                       'apierror-unknownerror',
                        'api-error-unknown-warning',
-                       'api-error-autoblocked',
-                       'api-error-blocked',
-                       'api-error-badaccess-groups',
-                       'api-error-badtoken',
-                       'api-error-copyuploaddisabled',
-                       'api-error-duplicate',
-                       'api-error-duplicate-archive',
-                       'api-error-empty-file',
-                       'api-error-emptypage',
-                       'api-error-fetchfileerror',
-                       'api-error-fileexists-forbidden',
-                       'api-error-fileexists-shared-forbidden',
-                       'api-error-file-too-large',
-                       'api-error-filename-tooshort',
-                       'api-error-filetype-banned',
-                       'api-error-filetype-banned-type',
-                       'api-error-filetype-missing',
-                       'api-error-hookaborted',
-                       'api-error-http',
-                       'api-error-illegal-filename',
-                       'api-error-internal-error',
-                       'api-error-invalid-file-key',
-                       'api-error-missingparam',
-                       'api-error-missingresult',
-                       'api-error-mustbeloggedin',
-                       'api-error-mustbeposted',
-                       'api-error-noimageinfo',
-                       'api-error-nomodule',
-                       'api-error-ok-but-empty',
-                       'api-error-overwrite',
-                       'api-error-stashfailed',
-                       'api-error-publishfailed',
-                       'api-error-stasherror',
-                       'api-error-stashedfilenotfound',
-                       'api-error-stashpathinvalid',
-                       'api-error-stashfilestorage',
-                       'api-error-stashzerolength',
-                       'api-error-stashnotloggedin',
-                       'api-error-stashwrongowner',
-                       'api-error-stashnosuchfilekey',
-                       'api-error-timeout',
-                       'api-error-unclassified',
-                       'api-error-unknown-code',
-                       'api-error-unknown-error',
-                       'api-error-uploaddisabled',
-                       'api-error-verification-error',
-                       'api-error-was-deleted',
                        'fileexists',
                        'filepageexists',
+                       'file-exists-duplicate',
+                       'file-deleted-duplicate',
                        'filename-bad-prefix',
                        'filename-thumb-name',
+                       'filewasdeleted',
                        'badfilename',
                        'protectedpagetext',
                ],
@@ -1595,15 +1567,12 @@ return [
                        'dsb' => 'resources/src/mediawiki.language/languages/dsb.js',
                        'fi' => 'resources/src/mediawiki.language/languages/fi.js',
                        'ga' => 'resources/src/mediawiki.language/languages/ga.js',
-                       'he' => 'resources/src/mediawiki.language/languages/he.js',
                        'hsb' => 'resources/src/mediawiki.language/languages/hsb.js',
                        'hu' => 'resources/src/mediawiki.language/languages/hu.js',
                        'hy' => 'resources/src/mediawiki.language/languages/hy.js',
                        'la' => 'resources/src/mediawiki.language/languages/la.js',
                        'os' => 'resources/src/mediawiki.language/languages/os.js',
-                       'ru' => 'resources/src/mediawiki.language/languages/ru.js',
                        'sl' => 'resources/src/mediawiki.language/languages/sl.js',
-                       'uk' => 'resources/src/mediawiki.language/languages/uk.js',
                ],
                'dependencies' => [
                        'mediawiki.language.data',
@@ -1741,6 +1710,8 @@ return [
                        'mediawiki.api.watch',
                        'mediawiki.notify',
                        'mediawiki.util',
+                       'mediawiki.Title',
+                       'mediawiki.jqueryMsg',
                        'jquery.accessKeyLabel',
                        'mediawiki.RegExp',
                ],
@@ -1752,6 +1723,10 @@ return [
                        'tooltip-ca-watch',
                        'tooltip-ca-unwatch',
                        'watcherrortext',
+                       'addedwatchtext',
+                       'addedwatchtext-talk',
+                       'removedwatchtext',
+                       'removedwatchtext-talk',
                ],
        ],
        'mediawiki.page.rollback' => [
@@ -1776,6 +1751,108 @@ return [
 
        /* MediaWiki Special pages */
 
+       'mediawiki.rcfilters.filters.dm' => [
+               'scripts' => [
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js',
+               ],
+               'dependencies' => [
+                       'oojs',
+                       'mediawiki.Uri',
+               ],
+       ],
+       '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.FilterWrapperWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.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',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.init.js',
+               ],
+               'styles' => [
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less',
+                       '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.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',
+               ],
+               'messages' => [
+                       'rcfilters-activefilters',
+                       'rcfilters-restore-default-filters',
+                       'rcfilters-clear-all-filters',
+                       'rcfilters-search-placeholder',
+                       'rcfilters-invalid-filter',
+                       'rcfilters-empty-filter',
+                       'rcfilters-filterlist-title',
+                       'rcfilters-filterlist-noresults',
+                       'rcfilters-filtergroup-registration',
+                       'rcfilters-filter-registered-label',
+                       'rcfilters-filter-registered-description',
+                       'rcfilters-filter-unregistered-label',
+                       'rcfilters-filter-unregistered-description',
+                       'rcfilters-filtergroup-authorship',
+                       'rcfilters-filter-editsbyself-label',
+                       'rcfilters-filter-editsbyself-description',
+                       'rcfilters-filter-editsbyother-label',
+                       'rcfilters-filter-editsbyother-description',
+                       'rcfilters-filtergroup-userExpLevel',
+                       'rcfilters-filter-userExpLevel-newcomer-label',
+                       'rcfilters-filter-userExpLevel-newcomer-description',
+                       'rcfilters-filter-userExpLevel-learner-label',
+                       'rcfilters-filter-userExpLevel-learner-description',
+                       'rcfilters-filter-userExpLevel-experienced-label',
+                       'rcfilters-filter-userExpLevel-experienced-description',
+                       'rcfilters-filtergroup-automated',
+                       'rcfilters-filter-bots-label',
+                       'rcfilters-filter-bots-description',
+                       'rcfilters-filter-humans-label',
+                       'rcfilters-filter-humans-description',
+                       'rcfilters-filtergroup-significance',
+                       'rcfilters-filter-minor-label',
+                       'rcfilters-filter-minor-description',
+                       'rcfilters-filter-major-label',
+                       'rcfilters-filter-major-description',
+                       'rcfilters-filtergroup-changetype',
+                       'rcfilters-filter-pageedits-label',
+                       'rcfilters-filter-pageedits-description',
+                       'rcfilters-filter-newpages-label',
+                       'rcfilters-filter-newpages-description',
+                       'rcfilters-filter-categorization-label',
+                       'rcfilters-filter-categorization-description',
+                       'rcfilters-filter-logactions-label',
+                       'rcfilters-filter-logactions-description',
+                       'rcfilters-highlightbutton-title',
+                       'rcfilters-highlightmenu-title',
+                       'recentchanges-noresult',
+               ],
+               'dependencies' => [
+                       'oojs-ui',
+                       'mediawiki.rcfilters.filters.dm',
+                       'oojs-ui.styles.icons-moderation',
+                       'oojs-ui.styles.icons-editing-core',
+               ],
+       ],
        'mediawiki.special' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'targets' => [ 'desktop', 'mobile' ],
@@ -1827,7 +1904,11 @@ return [
                        'apisandbox-sending-request',
                        'apisandbox-loading-results',
                        'apisandbox-results-error',
+                       'apisandbox-request-selectformat-label',
+                       'apisandbox-request-format-url-label',
                        'apisandbox-request-url-label',
+                       'apisandbox-request-format-json-label',
+                       'apisandbox-request-json-label',
                        'apisandbox-request-time',
                        'apisandbox-results-fixtoken',
                        'apisandbox-results-fixtoken-fail',
@@ -1837,6 +1918,8 @@ return [
                        'apisandbox-continue-clear',
                        'apisandbox-continue-help',
                        'apisandbox-param-limit',
+                       'apisandbox-multivalue-all-namespaces',
+                       'apisandbox-multivalue-all-values',
                        'api-format-prettyprint-status',
                        'blanknamespace',
                ],
@@ -1848,9 +1931,11 @@ return [
        ],
        'mediawiki.special.changeslist' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changeslist.legend' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changeslist.legend.js' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js',
@@ -1858,6 +1943,7 @@ return [
                        'jquery.makeCollapsible',
                        'mediawiki.cookie',
                ],
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changeslist.enhanced' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
@@ -1918,6 +2004,7 @@ return [
                ],
        ],
        'mediawiki.special.userrights' => [
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.userrights.css',
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userrights.js',
                'dependencies' => [
                        'mediawiki.notification.convertmessagebox',
@@ -1928,6 +2015,7 @@ return [
        ],
        'mediawiki.special.recentchanges' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.search' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.js',
@@ -1943,6 +2031,23 @@ return [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.styles.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.special.search.interwikiwidget.styles' => [
+               'styles' => 'resources/src/mediawiki.special/'
+                       . 'mediawiki.special.search.interwikiwidget.styles.less',
+               'targets' => [ 'desktop', 'mobile' ]
+       ],
+       'mediawiki.special.search.commonsInterwikiWidget' => [
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js',
+               'dependencies' => [
+                       'mediawiki.Uri',
+                       'mediawiki.jqueryMsg'
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+               'messages' => [
+                       'search-interwiki-more',
+                       'searchprofile-images'
+               ],
+       ],
        'mediawiki.special.undelete' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
        ],
@@ -2028,6 +2133,11 @@ return [
        ],
        'mediawiki.special.watchlist' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.watchlist.js',
+               'dependencies' => [
+                       'mediawiki.api',
+                       'oojs-ui-core',
+                       'user.options',
+               ]
        ],
        'mediawiki.special.version' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.version.css',
@@ -2283,6 +2393,33 @@ return [
                ],
                'messages' => [
                        'red-link-title',
+                       'mw-widgets-categoryselector-add-category-placeholder'
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
+       'mediawiki.widgets.MediaSearch' => [
+               'scripts' => [
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js',
+               ],
+               'styles' => [
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css',
+               ],
+               'dependencies' => [
+                       'oojs-ui-widgets',
+                       'mediawiki.ForeignApi',
+                       'mediawiki.Title',
+               ],
+               'messages' => [
+                       'mw-widgets-mediasearch-noresults',
+                       'mw-widgets-mediasearch-input-placeholder',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -2295,6 +2432,15 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.widgets.UsersMultiselectWidget' => [
+               'scripts' => [
+                       'resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js',
+               ],
+               'dependencies' => [
+                       'oojs-ui-widgets',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.widgets.SearchInputWidget' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js',
@@ -2353,7 +2499,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
                'dependencies' => [
                        'es5-shim',
-                       'json',
                ],
        ],
 
index 3768022..723dbd4 100644 (file)
@@ -133,9 +133,13 @@ $.widget("ui.draggable", $.ui.mouse, {
                });
 
                //Generate the original position
-               this.originalPosition = this.position = this._generatePosition(event);
                this.originalPageX = event.pageX;
                this.originalPageY = event.pageY;
+               this.originalPosition = this.position = this._generatePosition(event);
+               // These lines where moved up to fix an issue with with draggable, revert and grid
+               // See: https://bugs.jqueryui.com/ticket/4696 and https://gerrit.wikimedia.org/r/#/c/333224
+               // this.originalPageX = event.pageX;
+               // this.originalPageY = event.pageY;
 
                //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
                (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
diff --git a/resources/lib/json2/json2.js b/resources/lib/json2/json2.js
deleted file mode 100644 (file)
index 5838457..0000000
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
-    json2.js
-    2015-05-03
-
-    Public Domain.
-
-    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-    See http://www.JSON.org/js.html
-
-
-    This code should be minified before deployment.
-    See http://javascript.crockford.com/jsmin.html
-
-    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-    NOT CONTROL.
-
-
-    This file creates a global JSON object containing two methods: stringify
-    and parse. This file is provides the ES5 JSON capability to ES3 systems.
-    If a project might run on IE8 or earlier, then this file should be included.
-    This file does nothing on ES5 systems.
-
-        JSON.stringify(value, replacer, space)
-            value       any JavaScript value, usually an object or array.
-
-            replacer    an optional parameter that determines how object
-                        values are stringified for objects. It can be a
-                        function or an array of strings.
-
-            space       an optional parameter that specifies the indentation
-                        of nested structures. If it is omitted, the text will
-                        be packed without extra whitespace. If it is a number,
-                        it will specify the number of spaces to indent at each
-                        level. If it is a string (such as '\t' or '&nbsp;'),
-                        it contains the characters used to indent at each level.
-
-            This method produces a JSON text from a JavaScript value.
-
-            When an object value is found, if the object contains a toJSON
-            method, its toJSON method will be called and the result will be
-            stringified. A toJSON method does not serialize: it returns the
-            value represented by the name/value pair that should be serialized,
-            or undefined if nothing should be serialized. The toJSON method
-            will be passed the key associated with the value, and this will be
-            bound to the value
-
-            For example, this would serialize Dates as ISO strings.
-
-                Date.prototype.toJSON = function (key) {
-                    function f(n) {
-                        // Format integers to have at least two digits.
-                        return n < 10 
-                            ? '0' + n 
-                            : n;
-                    }
-
-                    return this.getUTCFullYear()   + '-' +
-                         f(this.getUTCMonth() + 1) + '-' +
-                         f(this.getUTCDate())      + 'T' +
-                         f(this.getUTCHours())     + ':' +
-                         f(this.getUTCMinutes())   + ':' +
-                         f(this.getUTCSeconds())   + 'Z';
-                };
-
-            You can provide an optional replacer method. It will be passed the
-            key and value of each member, with this bound to the containing
-            object. The value that is returned from your method will be
-            serialized. If your method returns undefined, then the member will
-            be excluded from the serialization.
-
-            If the replacer parameter is an array of strings, then it will be
-            used to select the members to be serialized. It filters the results
-            such that only members with keys listed in the replacer array are
-            stringified.
-
-            Values that do not have JSON representations, such as undefined or
-            functions, will not be serialized. Such values in objects will be
-            dropped; in arrays they will be replaced with null. You can use
-            a replacer function to replace those with JSON values.
-            JSON.stringify(undefined) returns undefined.
-
-            The optional space parameter produces a stringification of the
-            value that is filled with line breaks and indentation to make it
-            easier to read.
-
-            If the space parameter is a non-empty string, then that string will
-            be used for indentation. If the space parameter is a number, then
-            the indentation will be that many spaces.
-
-            Example:
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}]);
-            // text is '["e",{"pluribus":"unum"}]'
-
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
-            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-            text = JSON.stringify([new Date()], function (key, value) {
-                return this[key] instanceof Date 
-                    ? 'Date(' + this[key] + ')' 
-                    : value;
-            });
-            // text is '["Date(---current time---)"]'
-
-
-        JSON.parse(text, reviver)
-            This method parses a JSON text to produce an object or array.
-            It can throw a SyntaxError exception.
-
-            The optional reviver parameter is a function that can filter and
-            transform the results. It receives each of the keys and values,
-            and its return value is used instead of the original value.
-            If it returns what it received, then the structure is not modified.
-            If it returns undefined then the member is deleted.
-
-            Example:
-
-            // Parse the text. Values that look like ISO date strings will
-            // be converted to Date objects.
-
-            myData = JSON.parse(text, function (key, value) {
-                var a;
-                if (typeof value === 'string') {
-                    a =
-/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-                    if (a) {
-                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
-                            +a[5], +a[6]));
-                    }
-                }
-                return value;
-            });
-
-            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
-                var d;
-                if (typeof value === 'string' &&
-                        value.slice(0, 5) === 'Date(' &&
-                        value.slice(-1) === ')') {
-                    d = new Date(value.slice(5, -1));
-                    if (d) {
-                        return d;
-                    }
-                }
-                return value;
-            });
-
-
-    This is a reference implementation. You are free to copy, modify, or
-    redistribute.
-*/
-
-/*jslint 
-    eval, for, this 
-*/
-
-/*property
-    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (typeof JSON !== 'object') {
-    JSON = {};
-}
-
-(function () {
-    'use strict';
-    
-    var rx_one = /^[\],:{}\s]*$/,
-        rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-        rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
-        rx_four = /(?:^|:|,)(?:\s*\[)+/g,
-        rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return n < 10 
-            ? '0' + n 
-            : n;
-    }
-    
-    function this_value() {
-        return this.valueOf();
-    }
-
-    if (typeof Date.prototype.toJSON !== 'function') {
-
-        Date.prototype.toJSON = function () {
-
-            return isFinite(this.valueOf())
-                ? this.getUTCFullYear() + '-' +
-                        f(this.getUTCMonth() + 1) + '-' +
-                        f(this.getUTCDate()) + 'T' +
-                        f(this.getUTCHours()) + ':' +
-                        f(this.getUTCMinutes()) + ':' +
-                        f(this.getUTCSeconds()) + 'Z'
-                : null;
-        };
-
-        Boolean.prototype.toJSON = this_value;
-        Number.prototype.toJSON = this_value;
-        String.prototype.toJSON = this_value;
-    }
-
-    var gap,
-        indent,
-        meta,
-        rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        rx_escapable.lastIndex = 0;
-        return rx_escapable.test(string) 
-            ? '"' + string.replace(rx_escapable, function (a) {
-                var c = meta[a];
-                return typeof c === 'string'
-                    ? c
-                    : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + '"' 
-            : '"' + string + '"';
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i,          // The loop counter.
-            k,          // The member key.
-            v,          // The member value.
-            length,
-            mind = gap,
-            partial,
-            value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (value && typeof value === 'object' &&
-                typeof value.toJSON === 'function') {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === 'function') {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case 'string':
-            return quote(value);
-
-        case 'number':
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return isFinite(value) 
-                ? String(value) 
-                : 'null';
-
-        case 'boolean':
-        case 'null':
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is 'object', we might be dealing with an object or an array or
-// null.
-
-        case 'object':
-
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
-// so watch out for that case.
-
-            if (!value) {
-                return 'null';
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === '[object Array]') {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || 'null';
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0
-                    ? '[]'
-                    : gap
-                        ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
-                        : '[' + partial.join(',') + ']';
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === 'object') {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    if (typeof rep[i] === 'string') {
-                        k = rep[i];
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                gap 
-                                    ? ': ' 
-                                    : ':'
-                            ) + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.prototype.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                gap 
-                                    ? ': ' 
-                                    : ':'
-                            ) + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0
-                ? '{}'
-                : gap
-                    ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
-                    : '{' + partial.join(',') + '}';
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== 'function') {
-        meta = {    // table of character substitutions
-            '\b': '\\b',
-            '\t': '\\t',
-            '\n': '\\n',
-            '\f': '\\f',
-            '\r': '\\r',
-            '"': '\\"',
-            '\\': '\\\\'
-        };
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = '';
-            indent = '';
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === 'number') {
-                for (i = 0; i < space; i += 1) {
-                    indent += ' ';
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === 'string') {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== 'function' &&
-                    (typeof replacer !== 'object' ||
-                    typeof replacer.length !== 'number')) {
-                throw new Error('JSON.stringify');
-            }
-
-// Make a fake root object containing our value under the key of ''.
-// Return the result of stringifying the value.
-
-            return str('', {'': value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== 'function') {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k, v, value = holder[key];
-                if (value && typeof value === 'object') {
-                    for (k in value) {
-                        if (Object.prototype.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            rx_dangerous.lastIndex = 0;
-            if (rx_dangerous.test(text)) {
-                text = text.replace(rx_dangerous, function (a) {
-                    return '\\u' +
-                            ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-
-            if (
-                rx_one.test(
-                    text
-                        .replace(rx_two, '@')
-                        .replace(rx_three, ']')
-                        .replace(rx_four, '')
-                )
-            ) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval('(' + text + ')');
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return typeof reviver === 'function'
-                    ? walk({'': j}, '')
-                    : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError('JSON.parse');
-        };
-    }
-}());
index bd17246..9ee5374 100644 (file)
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors
+Copyright (c) 2011-2016 Tim Wood, Iskren Chernev, Moment.js contributors
 
 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
index 55a41bd..d1a0dda 100644 (file)
@@ -1,24 +1,25 @@
-// moment.js locale configuration
-// locale : afrikaans (af)
-// author : Werner Mollentze : https://github.com/wernerm
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('af', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var af = moment.defineLocale('af', {
         months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
-        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+        monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
         weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
         weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
         weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+        meridiemParse: /vm|nm/i,
+        isPM : function (input) {
+            return /^nm$/i.test(input);
+        },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 12) {
                 return isLower ? 'vm' : 'VM';
         },
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Vandag om] LT',
@@ -66,4 +67,7 @@
             doy : 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
         }
     });
-}));
+
+    return af;
+
+}));
\ No newline at end of file
index 871e41c..b12a7b1 100644 (file)
@@ -1,32 +1,30 @@
-// moment.js locale configuration
-// locale : Moroccan Arabic (ar-ma)
-// author : ElFadili Yassine : https://github.com/ElFadiliY
-// author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ar-ma', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ar_ma = moment.defineLocale('ar-ma', {
         months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
         monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
         weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
         weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[اليوم على الساعة] LT',
@@ -56,4 +54,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ar_ma;
+
+}));
\ No newline at end of file
index 11350cb..430a184 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Arabic Saudi Arabia (ar-sa)
-// author : Suhail Alkowaileet : https://github.com/xsoh
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '١',
         '2': '٢',
         '٠': '0'
     };
 
-    return moment.defineLocale('ar-sa', {
+    var ar_sa = moment.defineLocale('ar-sa', {
         months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
         monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
         weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
         weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
             LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /ص|م/,
+        isPM : function (input) {
+            return 'م' === input;
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
@@ -96,4 +98,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ar_sa;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ar-tn.js b/resources/lib/moment/locale/ar-tn.js
new file mode 100644 (file)
index 0000000..dfabae3
--- /dev/null
@@ -0,0 +1,59 @@
+//! moment.js locale configuration
+//! locale  :  Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ar_tn = moment.defineLocale('ar-tn', {
+        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+        monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat: {
+            LT: 'HH:mm',
+            LTS: 'HH:mm:ss',
+            L: 'DD/MM/YYYY',
+            LL: 'D MMMM YYYY',
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd D MMMM YYYY HH:mm'
+        },
+        calendar: {
+            sameDay: '[اليوم على الساعة] LT',
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: 'في %s',
+            past: 'منذ %s',
+            s: 'ثوان',
+            m: 'دقيقة',
+            mm: '%d دقائق',
+            h: 'ساعة',
+            hh: '%d ساعات',
+            d: 'يوم',
+            dd: '%d أيام',
+            M: 'شهر',
+            MM: '%d أشهر',
+            y: 'سنة',
+            yy: '%d سنوات'
+        },
+        week: {
+            dow: 1, // Monday is the first day of the week.
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return ar_tn;
+
+}));
\ No newline at end of file
index cbec753..8bd2b1b 100644 (file)
@@ -1,20 +1,17 @@
-// moment.js locale configuration
-// Locale: Arabic (ar)
-// Author: Abdel Said: https://github.com/abdelsaid
-// Changes in months, weekdays: Ahmed Elkhatib
-// Native plural forms: forabi https://github.com/forabi
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '١',
         '2': '٢',
         'كانون الأول ديسمبر'
     ];
 
-    return moment.defineLocale('ar', {
+    var ar = moment.defineLocale('ar', {
         months : months,
         monthsShort : months,
         weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
         weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
             LTS : 'HH:mm:ss',
-            L : 'DD/MM/YYYY',
+            L : 'D/\u200FM/\u200FYYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /ص|م/,
+        isPM : function (input) {
+            return 'م' === input;
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
             yy : pluralize('y')
         },
         preparse: function (string) {
-            return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+            return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                 return numberMap[match];
             }).replace(/،/g, ',');
         },
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ar;
+
+}));
\ No newline at end of file
index 649d9f2..5400ed4 100644 (file)
@@ -1,56 +1,50 @@
-// moment.js locale configuration
-// locale : azerbaijani (az)
-// author : topchiyev : https://github.com/topchiyev
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var suffixes = {
         1: '-inci',
         5: '-inci',
         8: '-inci',
         70: '-inci',
         80: '-inci',
-
         2: '-nci',
         7: '-nci',
         20: '-nci',
         50: '-nci',
-
         3: '-üncü',
         4: '-üncü',
         100: '-üncü',
-
         6: '-ncı',
-
         9: '-uncu',
         10: '-uncu',
         30: '-uncu',
-
         60: '-ıncı',
         90: '-ıncı'
     };
-    return moment.defineLocale('az', {
+
+    var az = moment.defineLocale('az', {
         months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
         monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
         weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
         weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
         weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[bugün saat] LT',
             y : 'bir il',
             yy : '%d il'
         },
+        meridiemParse: /gecə|səhər|gündüz|axşam/,
+        isPM : function (input) {
+            return /^(gündüz|axşam)$/.test(input);
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'gecə';
@@ -94,7 +92,6 @@
             var a = number % 10,
                 b = number % 100 - a,
                 c = number >= 100 ? 100 : null;
-
             return number + (suffixes[a] || suffixes[b] || suffixes[c]);
         },
         week : {
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return az;
+
+}));
\ No newline at end of file
index 67ae899..a76157c 100644 (file)
@@ -1,25 +1,21 @@
-// moment.js locale configuration
-// locale : belarusian (be)
-// author : Dmitry Demidov : https://github.com/demidov91
-// author: Praleska: http://praleska.pro/
-// Author : Menelion Elensúle : https://github.com/Oire
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(word, num) {
         var forms = word.split('_');
         return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
             'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
         }
     }
 
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
-            'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
-            'accusative': 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_')
+    var be = moment.defineLocale('be', {
+        months : {
+            format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+            standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')
         },
-
-        nounCase = (/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.defineLocale('be', {
-        months : monthsCaseReplace,
         monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
-        weekdays : weekdaysCaseReplace,
+        weekdays : {
+            format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+            standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
+            isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/
+        },
         weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
         weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY г.',
-            LLL : 'D MMMM YYYY г., LT',
-            LLLL : 'dddd, D MMMM YYYY г., LT'
+            LLL : 'D MMMM YYYY г., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY г., HH:mm'
         },
         calendar : {
             sameDay: '[Сёння ў] LT',
             },
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 5:
-                case 6:
-                    return '[У мінулую] dddd [ў] LT';
-                case 1:
-                case 2:
-                case 4:
-                    return '[У мінулы] dddd [ў] LT';
+                    case 0:
+                    case 3:
+                    case 5:
+                    case 6:
+                        return '[У мінулую] dddd [ў] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                        return '[У мінулы] dddd [ў] LT';
                 }
             },
             sameElse: 'L'
             y : 'год',
             yy : relativeTimeWithPlural
         },
-
-
+        meridiemParse: /ночы|раніцы|дня|вечара/,
+        isPM : function (input) {
+            return /^(дня|вечара)$/.test(input);
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'ночы';
                 return 'вечара';
             }
         },
-
         ordinalParse: /\d{1,2}-(і|ы|га)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-            case 'w':
-            case 'W':
-                return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
-            case 'D':
-                return number + '-га';
-            default:
-                return number;
+                case 'M':
+                case 'd':
+                case 'DDD':
+                case 'w':
+                case 'W':
+                    return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
+                case 'D':
+                    return number + '-га';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return be;
+
+}));
\ No newline at end of file
index fe610ec..deedab8 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : bulgarian (bg)
-// author : Krasen Borisov : https://github.com/kraz
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('bg', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var bg = moment.defineLocale('bg', {
         months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
         monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
         weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
         weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'D.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY H:mm',
+            LLLL : 'dddd, D MMMM YYYY H:mm'
         },
         calendar : {
             sameDay : '[Днес в] LT',
             lastDay : '[Вчера в] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[В изминалата] dddd [в] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[В изминалия] dddd [в] LT';
+                    case 0:
+                    case 3:
+                    case 6:
+                        return '[В изминалата] dddd [в] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[В изминалия] dddd [в] LT';
                 }
             },
             sameElse : 'L'
@@ -87,4 +84,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bg;
+
+}));
\ No newline at end of file
index 59d26ba..1d49751 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Bengali (bn)
-// author : Kaushik Gandhi : https://github.com/kaushikgandhi
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '১',
         '2': '২',
         '০': '0'
     };
 
-    return moment.defineLocale('bn', {
-        months : 'à¦\9cানà§\81à§\9fারà§\80_ফà§\87বà§\81à§\9fারà§\80_মারà§\8dà¦\9a_à¦\8fপà§\8dরিল_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81লাà¦\87_à¦\85à¦\97াস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
-        monthsShort : 'à¦\9cানà§\81_ফà§\87ব_মারà§\8dà¦\9a_à¦\8fপর_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81ল_à¦\85à¦\97_সà§\87পà§\8dà¦\9f_à¦\85à¦\95à§\8dà¦\9fà§\8b_নভ_ডিসà§\87মà§\8d'.split('_'),
-        weekdays : 'রবিবার_সà§\8bমবার_মà¦\99à§\8dà¦\97লবার_বà§\81ধবার_বà§\83হসà§\8dপতà§\8dতিবার_শà§\81à¦\95à§\8dরà§\81বার_শনিবার'.split('_'),
-        weekdaysShort : 'রবি_সà§\8bম_মà¦\99à§\8dà¦\97ল_বà§\81ধ_বà§\83হসà§\8dপতà§\8dতি_শà§\81à¦\95à§\8dরà§\81_শনি'.split('_'),
-        weekdaysMin : 'রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি'.split('_'),
+    var bn = moment.defineLocale('bn', {
+        months : 'à¦\9cানà§\81à§\9fারà§\80_ফà§\87বà§\8dরà§\81à§\9fারি_মারà§\8dà¦\9a_à¦\8fপà§\8dরিল_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81লাà¦\87_à¦\86à¦\97স্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+        monthsShort : 'à¦\9cানà§\81_ফà§\87ব_মারà§\8dà¦\9a_à¦\8fপà§\8dর_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81ল_à¦\86à¦\97_সà§\87পà§\8dà¦\9f_à¦\85à¦\95à§\8dà¦\9fà§\8b_নভà§\87_ডিসà§\87'.split('_'),
+        weekdays : 'রবিবার_সà§\8bমবার_মà¦\99à§\8dà¦\97লবার_বà§\81ধবার_বà§\83হসà§\8dপতিবার_শà§\81à¦\95à§\8dরবার_শনিবার'.split('_'),
+        weekdaysShort : 'রবি_সà§\8bম_মà¦\99à§\8dà¦\97ল_বà§\81ধ_বà§\83হসà§\8dপতি_শà§\81à¦\95à§\8dর_শনি'.split('_'),
+        weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
         longDateFormat : {
             LT : 'A h:mm সময়',
             LTS : 'A h:mm:ss সময়',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm সময়',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'
         },
         calendar : {
             sameDay : '[আজ] LT',
@@ -63,7 +60,7 @@
         relativeTime : {
             future : '%s পরে',
             past : '%s আগে',
-            s : 'à¦\95à¦\8fক সেকেন্ড',
+            s : 'à¦\95à§\9fà§\87ক সেকেন্ড',
             m : 'এক মিনিট',
             mm : '%d মিনিট',
             h : 'এক ঘন্টা',
                 return symbolMap[match];
             });
         },
-        //Bengali is a vast language its spoken
-        //in different forms in various parts of the world.
-        //I have just generalized with most common one used
+        meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if ((meridiem === 'রাত' && hour >= 4) ||
+                    (meridiem === 'দুপুর' && hour < 5) ||
+                    meridiem === 'বিকাল') {
+                return hour + 12;
+            } else {
+                return hour;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'রাত';
             } else if (hour < 10) {
-                return 'à¦কাল';
+                return 'সকাল';
             } else if (hour < 17) {
                 return 'দুপুর';
             } else if (hour < 20) {
-                return 'বিà¦\95à§\87ল';
+                return 'বিà¦\95াল';
             } else {
                 return 'রাত';
             }
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bn;
+
+}));
\ No newline at end of file
index 346fbdf..3f6fe19 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : tibetan (bo)
-// author : Thupten N. Chakrishar : https://github.com/vajradog
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '༡',
         '2': '༢',
@@ -38,7 +35,7 @@
         '༠': '0'
     };
 
-    return moment.defineLocale('bo', {
+    var bo = moment.defineLocale('bo', {
         months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
         monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
         weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
         weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
         longDateFormat : {
             LT : 'A h:mm',
-            LTS : 'LT:ss',
+            LTS : 'A h:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm'
         },
         calendar : {
             sameDay : '[དི་རིང] LT',
                 return symbolMap[match];
             });
         },
+        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if ((meridiem === 'མཚན་མོ' && hour >= 4) ||
+                    (meridiem === 'ཉིན་གུང' && hour < 5) ||
+                    meridiem === 'དགོང་དག') {
+                return hour + 12;
+            } else {
+                return hour;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'མཚན་མོ';
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bo;
+
+}));
\ No newline at end of file
index 575d644..ca290f3 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : breton (br)
-// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function relativeTimeWithMutation(number, withoutSuffix, key) {
         var format = {
             'mm': 'munutenn',
         };
         return number + ' ' + mutation(format[key], number);
     }
-
     function specialMutationForYears(number) {
         switch (lastNumber(number)) {
-        case 1:
-        case 3:
-        case 4:
-        case 5:
-        case 9:
-            return number + ' bloaz';
-        default:
-            return number + ' vloaz';
+            case 1:
+            case 3:
+            case 4:
+            case 5:
+            case 9:
+                return number + ' bloaz';
+            default:
+                return number + ' vloaz';
         }
     }
-
     function lastNumber(number) {
         if (number > 9) {
             return lastNumber(number % 10);
         }
         return number;
     }
-
     function mutation(text, number) {
         if (number === 2) {
             return softMutation(text);
         }
         return text;
     }
-
     function softMutation(text) {
         var mutationTable = {
             'm': 'v',
         return mutationTable[text.charAt(0)] + text.substring(1);
     }
 
-    return moment.defineLocale('br', {
+    var br = moment.defineLocale('br', {
         months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
         monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
         weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
         weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
         weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'h[e]mm A',
             LTS : 'h[e]mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D [a viz] MMMM YYYY',
-            LLL : 'D [a viz] MMMM YYYY LT',
-            LLLL : 'dddd, D [a viz] MMMM YYYY LT'
+            LLL : 'D [a viz] MMMM YYYY h[e]mm A',
+            LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'
         },
         calendar : {
             sameDay : '[Hiziv da] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return br;
+
+}));
\ No newline at end of file
index 415b596..ddd346c 100644 (file)
-// moment.js locale configuration
-// locale : bosnian (bs)
-// author : Nedim Cholich : https://github.com/frontyard
-// based on (hr) translation by Bojan Marković
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function translate(number, withoutSuffix, key) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
+            case 'm':
+                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+            case 'mm':
+                if (number === 1) {
+                    result += 'minuta';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'minute';
+                } else {
+                    result += 'minuta';
+                }
+                return result;
+            case 'h':
+                return withoutSuffix ? 'jedan sat' : 'jednog sata';
+            case 'hh':
+                if (number === 1) {
+                    result += 'sat';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'sata';
+                } else {
+                    result += 'sati';
+                }
+                return result;
+            case 'dd':
+                if (number === 1) {
+                    result += 'dan';
+                } else {
+                    result += 'dana';
+                }
+                return result;
+            case 'MM':
+                if (number === 1) {
+                    result += 'mjesec';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'mjeseca';
+                } else {
+                    result += 'mjeseci';
+                }
+                return result;
+            case 'yy':
+                if (number === 1) {
+                    result += 'godina';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'godine';
+                } else {
+                    result += 'godina';
+                }
+                return result;
         }
     }
 
-    return moment.defineLocale('bs', {
+    var bs = moment.defineLocale('bs', {
         months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
         monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
         weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
         weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[danas u] LT',
             nextDay  : '[sutra u] LT',
-
             nextWeek : function () {
                 switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
+                    case 0:
+                        return '[u] [nedjelju] [u] LT';
+                    case 3:
+                        return '[u] [srijedu] [u] LT';
+                    case 6:
+                        return '[u] [subotu] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[u] dddd [u] LT';
                 }
             },
             lastDay  : '[jučer u] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
+                    case 0:
+                    case 3:
+                        return '[prošlu] dddd [u] LT';
+                    case 6:
+                        return '[prošle] [subote] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[prošli] dddd [u] LT';
                 }
             },
             sameElse : 'L'
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bs;
+
+}));
\ No newline at end of file
index 6c82db0..7882800 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : catalan (ca)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ca', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ca = moment.defineLocale('ca', {
         months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
         monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
         weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
         weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY H:mm',
+            LLLL : 'dddd D MMMM YYYY H:mm'
         },
         calendar : {
             sameDay : function () {
@@ -76,4 +75,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return ca;
+
+}));
\ No newline at end of file
index bf3e60a..129e936 100644 (file)
@@ -1,79 +1,74 @@
-// moment.js locale configuration
-// locale : czech (cs)
-// author : petrbela : https://github.com/petrbela
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
         monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
-
     function plural(n) {
         return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minuty' : 'minut');
-            } else {
-                return result + 'minutami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodin');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dny' : 'dní');
-            } else {
-                return result + 'dny';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'měsíce' : 'měsíců');
-            } else {
-                return result + 'měsíci';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'let');
-            } else {
-                return result + 'lety';
-            }
-            break;
+            case 's':  // a few seconds / in a few seconds / a few seconds ago
+                return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
+            case 'm':  // a minute / in a minute / a minute ago
+                return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'minuty' : 'minut');
+                } else {
+                    return result + 'minutami';
+                }
+                break;
+            case 'h':  // an hour / in an hour / an hour ago
+                return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+            case 'hh': // 9 hours / in 9 hours / 9 hours ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'hodiny' : 'hodin');
+                } else {
+                    return result + 'hodinami';
+                }
+                break;
+            case 'd':  // a day / in a day / a day ago
+                return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+            case 'dd': // 9 days / in 9 days / 9 days ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'dny' : 'dní');
+                } else {
+                    return result + 'dny';
+                }
+                break;
+            case 'M':  // a month / in a month / a month ago
+                return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+            case 'MM': // 9 months / in 9 months / 9 months ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'měsíce' : 'měsíců');
+                } else {
+                    return result + 'měsíci';
+                }
+                break;
+            case 'y':  // a year / in a year / a year ago
+                return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+            case 'yy': // 9 years / in 9 years / 9 years ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'roky' : 'let');
+                } else {
+                    return result + 'lety';
+                }
+                break;
         }
     }
 
-    return moment.defineLocale('cs', {
+    var cs = moment.defineLocale('cs', {
         months : months,
         monthsShort : monthsShort,
         monthsParse : (function (months, monthsShort) {
             }
             return _monthsParse;
         }(months, monthsShort)),
+        shortMonthsParse : (function (monthsShort) {
+            var i, _shortMonthsParse = [];
+            for (i = 0; i < 12; i++) {
+                _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');
+            }
+            return _shortMonthsParse;
+        }(monthsShort)),
+        longMonthsParse : (function (months) {
+            var i, _longMonthsParse = [];
+            for (i = 0; i < 12; i++) {
+                _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');
+            }
+            return _longMonthsParse;
+        }(months)),
         weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
         weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
         weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
         longDateFormat : {
             LT: 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd D. MMMM YYYY H:mm',
+            l : 'D. M. YYYY'
         },
         calendar : {
             sameDay: '[dnes v] LT',
             nextDay: '[zítra v] LT',
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[v neděli v] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [v] LT';
-                case 3:
-                    return '[ve středu v] LT';
-                case 4:
-                    return '[ve čtvrtek v] LT';
-                case 5:
-                    return '[v pátek v] LT';
-                case 6:
-                    return '[v sobotu v] LT';
+                    case 0:
+                        return '[v neděli v] LT';
+                    case 1:
+                    case 2:
+                        return '[v] dddd [v] LT';
+                    case 3:
+                        return '[ve středu v] LT';
+                    case 4:
+                        return '[ve čtvrtek v] LT';
+                    case 5:
+                        return '[v pátek v] LT';
+                    case 6:
+                        return '[v sobotu v] LT';
                 }
             },
             lastDay: '[včera v] LT',
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[minulou neděli v] LT';
-                case 1:
-                case 2:
-                    return '[minulé] dddd [v] LT';
-                case 3:
-                    return '[minulou středu v] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [v] LT';
-                case 6:
-                    return '[minulou sobotu v] LT';
+                    case 0:
+                        return '[minulou neděli v] LT';
+                    case 1:
+                    case 2:
+                        return '[minulé] dddd [v] LT';
+                    case 3:
+                        return '[minulou středu v] LT';
+                    case 4:
+                    case 5:
+                        return '[minulý] dddd [v] LT';
+                    case 6:
+                        return '[minulou sobotu v] LT';
                 }
             },
             sameElse: 'L'
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return cs;
+
+}));
\ No newline at end of file
index 10d33a6..60bf213 100644 (file)
@@ -1,63 +1,63 @@
-// moment.js locale configuration
-// locale : chuvash (cv)
-// author : Anatoly Mironov : https://github.com/mirontoli
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('cv', {
-        months : 'кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'),
-        monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'),
-        weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун'.split('_'),
-        weekdaysShort : 'выр_тун_ытл_юн_кĕç_эрн_шăм'.split('_'),
-        weekdaysMin : 'вр_тн_ыт_юн_кç_эр_шм'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var cv = moment.defineLocale('cv', {
+        months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+        monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+        weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+        weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+        weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD-MM-YYYY',
-            LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]',
-            LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT',
-            LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT'
+            LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+            LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+            LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
         },
         calendar : {
             sameDay: '[Паян] LT [сехетре]',
             nextDay: '[Ыран] LT [сехетре]',
-            lastDay: '[Ĕнер] LT [сехетре]',
-            nextWeek: '[Çитес] dddd LT [сехетре]',
-            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
+            lastDay: '[Ӗнер] LT [сехетре]',
+            nextWeek: '[Ҫитес] dddd LT [сехетре]',
+            lastWeek: '[Иртнӗ] dddd LT [сехетре]',
             sameElse: 'L'
         },
         relativeTime : {
             future : function (output) {
-                var affix = /сехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран';
+                var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';
                 return output + affix;
             },
             past : '%s каялла',
-            s : 'пĕр-ик çеккунт',
-            m : 'пĕр минут',
+            s : 'пӗр-ик ҫеккунт',
+            m : 'пӗр минут',
             mm : '%d минут',
-            h : 'пĕр сехет',
+            h : 'пӗр сехет',
             hh : '%d сехет',
-            d : 'пĕр кун',
+            d : 'пӗр кун',
             dd : '%d кун',
-            M : 'пĕр уйăх',
-            MM : '%d уйăх',
-            y : 'пĕр çул',
-            yy : '%d çул'
+            M : 'пӗр уйӑх',
+            MM : '%d уйӑх',
+            y : 'пӗр ҫул',
+            yy : '%d ҫул'
         },
-        ordinalParse: /\d{1,2}-мĕш/,
-        ordinal : '%d-мĕш',
+        ordinalParse: /\d{1,2}-мӗш/,
+        ordinal : '%d-мӗш',
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return cv;
+
+}));
\ No newline at end of file
index a14ed7d..9352567 100644 (file)
@@ -1,32 +1,31 @@
-// moment.js locale configuration
-// locale : Welsh (cy)
-// author : Robert Allen
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('cy', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var cy = moment.defineLocale('cy', {
         months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
         monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
         weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
         weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
         weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+        weekdaysParseExact : true,
         // time formats are the same as en-gb
         longDateFormat: {
             LT: 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
-            LLL: 'D MMMM YYYY LT',
-            LLLL: 'dddd, D MMMM YYYY LT'
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd, D MMMM YYYY HH:mm'
         },
         calendar: {
             sameDay: '[Heddiw am] LT',
@@ -60,7 +59,6 @@
                     '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
                     'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
                 ];
-
             if (b > 20) {
                 if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
                     output = 'fed'; // not 30ain, 70ain or 90ain
@@ -70,7 +68,6 @@
             } else if (b > 0) {
                 output = lookup[b];
             }
-
             return number + output;
         },
         week : {
@@ -78,4 +75,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return cy;
+
+}));
\ No newline at end of file
index 228ca02..d5cbbdb 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : danish (da)
-// author : Ulrik Nielsen : https://github.com/mrbase
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('da', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var da = moment.defineLocale('da', {
         months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
         weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
         weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd [d.] D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY HH:mm',
+            LLLL : 'dddd [d.] D. MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[I dag kl.] LT',
@@ -57,4 +54,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return da;
+
+}));
\ No newline at end of file
index af6e61c..d1fd398 100644 (file)
@@ -1,20 +1,18 @@
-// moment.js locale configuration
-// locale : austrian german (de-at)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-// author : Martin Groller : https://github.com/MadMG
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             'm': ['eine Minute', 'einer Minute'],
         return withoutSuffix ? format[key][0] : format[key][1];
     }
 
-    return moment.defineLocale('de-at', {
+    var de_at = moment.defineLocale('de-at', {
         months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
         monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
         weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
         weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT: 'HH:mm',
             LTS: 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY HH:mm',
+            LLLL : 'dddd, D. MMMM YYYY HH:mm'
         },
         calendar : {
-            sameDay: '[Heute um] LT [Uhr]',
+            sameDay: '[heute um] LT [Uhr]',
             sameElse: 'L',
-            nextDay: '[Morgen um] LT [Uhr]',
+            nextDay: '[morgen um] LT [Uhr]',
             nextWeek: 'dddd [um] LT [Uhr]',
-            lastDay: '[Gestern um] LT [Uhr]',
+            lastDay: '[gestern um] LT [Uhr]',
             lastWeek: '[letzten] dddd [um] LT [Uhr]'
         },
         relativeTime : {
@@ -73,4 +73,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return de_at;
+
+}));
\ No newline at end of file
index 1b50f0f..203dac9 100644 (file)
@@ -1,19 +1,17 @@
-// moment.js locale configuration
-// locale : german (de)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             'm': ['eine Minute', 'einer Minute'],
         return withoutSuffix ? format[key][0] : format[key][1];
     }
 
-    return moment.defineLocale('de', {
+    var de = moment.defineLocale('de', {
         months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
         monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
         weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
         weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT: 'HH:mm',
             LTS: 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY HH:mm',
+            LLLL : 'dddd, D. MMMM YYYY HH:mm'
         },
         calendar : {
-            sameDay: '[Heute um] LT [Uhr]',
+            sameDay: '[heute um] LT [Uhr]',
             sameElse: 'L',
-            nextDay: '[Morgen um] LT [Uhr]',
+            nextDay: '[morgen um] LT [Uhr]',
             nextWeek: 'dddd [um] LT [Uhr]',
-            lastDay: '[Gestern um] LT [Uhr]',
+            lastDay: '[gestern um] LT [Uhr]',
             lastWeek: '[letzten] dddd [um] LT [Uhr]'
         },
         relativeTime : {
@@ -72,4 +72,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return de;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/dv.js b/resources/lib/moment/locale/dv.js
new file mode 100644 (file)
index 0000000..911b89d
--- /dev/null
@@ -0,0 +1,99 @@
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var months = [
+        'ޖެނުއަރީ',
+        'ފެބްރުއަރީ',
+        'މާރިޗު',
+        'އޭޕްރީލު',
+        'މޭ',
+        'ޖޫން',
+        'ޖުލައި',
+        'އޯގަސްޓު',
+        'ސެޕްޓެމްބަރު',
+        'އޮކްޓޯބަރު',
+        'ނޮވެމްބަރު',
+        'ޑިސެމްބަރު'
+    ], weekdays = [
+        'އާދިއްތަ',
+        'ހޯމަ',
+        'އަންގާރަ',
+        'ބުދަ',
+        'ބުރާސްފަތި',
+        'ހުކުރު',
+        'ހޮނިހިރު'
+    ];
+
+    var dv = moment.defineLocale('dv', {
+        months : months,
+        monthsShort : months,
+        weekdays : weekdays,
+        weekdaysShort : weekdays,
+        weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+        longDateFormat : {
+
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'D/M/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /މކ|މފ/,
+        isPM : function (input) {
+            return 'މފ' === input;
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'މކ';
+            } else {
+                return 'މފ';
+            }
+        },
+        calendar : {
+            sameDay : '[މިއަދު] LT',
+            nextDay : '[މާދަމާ] LT',
+            nextWeek : 'dddd LT',
+            lastDay : '[އިއްޔެ] LT',
+            lastWeek : '[ފާއިތުވި] dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'ތެރޭގައި %s',
+            past : 'ކުރިން %s',
+            s : 'ސިކުންތުކޮޅެއް',
+            m : 'މިނިޓެއް',
+            mm : 'މިނިޓު %d',
+            h : 'ގަޑިއިރެއް',
+            hh : 'ގަޑިއިރު %d',
+            d : 'ދުވަހެއް',
+            dd : 'ދުވަސް %d',
+            M : 'މަހެއް',
+            MM : 'މަސް %d',
+            y : 'އަހަރެއް',
+            yy : 'އަހަރު %d'
+        },
+        preparse: function (string) {
+            return string.replace(/،/g, ',');
+        },
+        postformat: function (string) {
+            return string.replace(/,/g, '،');
+        },
+        week : {
+            dow : 7,  // Sunday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return dv;
+
+}));
\ No newline at end of file
index a0e1695..588cb23 100644 (file)
@@ -1,19 +1,20 @@
-// moment.js locale configuration
-// locale : modern greek (el)
-// author : Aggelos Karalias : https://github.com/mehiel
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('el', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+    function isFunction(input) {
+        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+    }
+
+
+    var el = moment.defineLocale('el', {
         monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
         monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
         months : function (momentToFormat, format) {
@@ -43,8 +44,8 @@
             LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
         },
         calendarEl : {
             sameDay : '[Σήμερα {}] LT',
         calendar : function (key, mom) {
             var output = this._calendarEl[key],
                 hours = mom && mom.hours();
-
-            if (typeof output === 'function') {
+            if (isFunction(output)) {
                 output = output.apply(mom);
             }
-
             return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
         },
         relativeTime : {
@@ -93,4 +92,7 @@
             doy : 4  // The week that contains Jan 4st is the first week of the year.
         }
     });
-}));
+
+    return el;
+
+}));
\ No newline at end of file
index 9d7b537..4a3d95c 100644 (file)
@@ -1,18 +1,16 @@
-// moment.js locale configuration
-// locale : australian english (en-au)
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('en-au', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var en_au = moment.defineLocale('en-au', {
         months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
         weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -23,8 +21,8 @@
             LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
         },
         calendar : {
             sameDay : '[Today at] LT',
@@ -63,4 +61,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return en_au;
+
+}));
\ No newline at end of file
index 45d3569..9ac521f 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : canadian english (en-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('en-ca', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var en_ca = moment.defineLocale('en-ca', {
         months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
         weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -23,9 +20,9 @@
             LT : 'h:mm A',
             LTS : 'h:mm:ss A',
             L : 'YYYY-MM-DD',
-            LL : 'D MMMM, YYYY',
-            LLL : 'D MMMM, YYYY LT',
-            LLLL : 'dddd, D MMMM, YYYY LT'
+            LL : 'MMMM D, YYYY',
+            LLL : 'MMMM D, YYYY h:mm A',
+            LLLL : 'dddd, MMMM D, YYYY h:mm A'
         },
         calendar : {
             sameDay : '[Today at] LT',
@@ -60,4 +57,7 @@
             return number + output;
         }
     });
-}));
+
+    return en_ca;
+
+}));
\ No newline at end of file
index 669ce5e..843d2e5 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : great britain english (en-gb)
-// author : Chris Gedrim : https://github.com/chrisgedrim
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('en-gb', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var en_gb = moment.defineLocale('en-gb', {
         months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
         weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -24,8 +21,8 @@
             LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Today at] LT',
@@ -64,4 +61,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return en_gb;
+
+}));
\ No newline at end of file
index 7f8c504..5b21f82 100644 (file)
@@ -1,21 +1,18 @@
-// moment.js locale configuration
-// locale : esperanto (eo)
-// author : Colin Dean : https://github.com/colindean
-// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
-//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//!          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('eo', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var eo = moment.defineLocale('eo', {
         months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
         weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
         weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'D[-an de] MMMM, YYYY',
-            LLL : 'D[-an de] MMMM, YYYY LT',
-            LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT'
+            LLL : 'D[-an de] MMMM, YYYY HH:mm',
+            LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm'
+        },
+        meridiemParse: /[ap]\.t\.m/i,
+        isPM: function (input) {
+            return input.charAt(0).toLowerCase() === 'p';
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours > 11) {
@@ -66,4 +67,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return eo;
+
+}));
\ No newline at end of file
index 5d352a4..cd81905 100644 (file)
@@ -1,22 +1,19 @@
-// moment.js locale configuration
-// locale : spanish (es)
-// author : Julio Napurí : https://github.com/julionc
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
         monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
 
-    return moment.defineLocale('es', {
+    var es = moment.defineLocale('es', {
         months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
         monthsShort : function (m, format) {
             if (/-MMM-/.test(format)) {
                 return monthsShortDot[m.month()];
             }
         },
+        monthsParseExact : true,
         weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
         weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
-        weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'),
+        weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
-            LLL : 'D [de] MMMM [de] YYYY LT',
-            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
+            LLL : 'D [de] MMMM [de] YYYY H:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
         },
         calendar : {
             sameDay : function () {
@@ -76,4 +75,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return es;
+
+}));
\ No newline at end of file
index fec168c..97fd945 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : estonian (et)
-// author : Henry Kehlmann : https://github.com/madhenry
-// improvements : Illimar Tambek : https://github.com/ragulka
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
@@ -33,7 +30,7 @@
         return isFuture ? format[key][0] : format[key][1];
     }
 
-    return moment.defineLocale('et', {
+    var et = moment.defineLocale('et', {
         months        : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
         monthsShort   : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
         weekdays      : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
         weekdaysMin   : 'P_E_T_K_N_R_L'.split('_'),
         longDateFormat : {
             LT   : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L    : 'DD.MM.YYYY',
             LL   : 'D. MMMM YYYY',
-            LLL  : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL  : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[Täna,] LT',
@@ -77,4 +74,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return et;
+
+}));
\ No newline at end of file
index 1401346..15d7dd3 100644 (file)
@@ -1,35 +1,34 @@
-// moment.js locale configuration
-// locale : euskara (eu)
-// author : Eneko Illarramendi : https://github.com/eillarra
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('eu', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var eu = moment.defineLocale('eu', {
         months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
         monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
         weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
         weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'YYYY[ko] MMMM[ren] D[a]',
-            LLL : 'YYYY[ko] MMMM[ren] D[a] LT',
-            LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT',
+            LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',
+            LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
             l : 'YYYY-M-D',
             ll : 'YYYY[ko] MMM D[a]',
-            lll : 'YYYY[ko] MMM D[a] LT',
-            llll : 'ddd, YYYY[ko] MMM D[a] LT'
+            lll : 'YYYY[ko] MMM D[a] HH:mm',
+            llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'
         },
         calendar : {
             sameDay : '[gaur] LT[etan]',
@@ -61,4 +60,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return eu;
+
+}));
\ No newline at end of file
index 0205adf..535174b 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Persian (fa)
-// author : Ebrahim Byagowi : https://github.com/ebraminio
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '۱',
         '2': '۲',
         '۰': '0'
     };
 
-    return moment.defineLocale('fa', {
+    var fa = moment.defineLocale('fa', {
         months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
         monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
         weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
         weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
         weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /قبل از ظهر|بعد از ظهر/,
+        isPM: function (input) {
+            return /بعد از ظهر/.test(input);
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
             doy : 12 // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return fa;
+
+}));
\ No newline at end of file
index 66cd1c0..ee93848 100644 (file)
@@ -1,64 +1,59 @@
-// moment.js locale configuration
-// locale : finnish (fi)
-// author : Tarmo Aidantausta : https://github.com/bleadof
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
         numbersFuture = [
             'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
             numbersPast[7], numbersPast[8], numbersPast[9]
         ];
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = '';
         switch (key) {
-        case 's':
-            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
-        case 'm':
-            return isFuture ? 'minuutin' : 'minuutti';
-        case 'mm':
-            result = isFuture ? 'minuutin' : 'minuuttia';
-            break;
-        case 'h':
-            return isFuture ? 'tunnin' : 'tunti';
-        case 'hh':
-            result = isFuture ? 'tunnin' : 'tuntia';
-            break;
-        case 'd':
-            return isFuture ? 'päivän' : 'päivä';
-        case 'dd':
-            result = isFuture ? 'päivän' : 'päivää';
-            break;
-        case 'M':
-            return isFuture ? 'kuukauden' : 'kuukausi';
-        case 'MM':
-            result = isFuture ? 'kuukauden' : 'kuukautta';
-            break;
-        case 'y':
-            return isFuture ? 'vuoden' : 'vuosi';
-        case 'yy':
-            result = isFuture ? 'vuoden' : 'vuotta';
-            break;
+            case 's':
+                return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+            case 'm':
+                return isFuture ? 'minuutin' : 'minuutti';
+            case 'mm':
+                result = isFuture ? 'minuutin' : 'minuuttia';
+                break;
+            case 'h':
+                return isFuture ? 'tunnin' : 'tunti';
+            case 'hh':
+                result = isFuture ? 'tunnin' : 'tuntia';
+                break;
+            case 'd':
+                return isFuture ? 'päivän' : 'päivä';
+            case 'dd':
+                result = isFuture ? 'päivän' : 'päivää';
+                break;
+            case 'M':
+                return isFuture ? 'kuukauden' : 'kuukausi';
+            case 'MM':
+                result = isFuture ? 'kuukauden' : 'kuukautta';
+                break;
+            case 'y':
+                return isFuture ? 'vuoden' : 'vuosi';
+            case 'yy':
+                result = isFuture ? 'vuoden' : 'vuotta';
+                break;
         }
         result = verbalNumber(number, isFuture) + ' ' + result;
         return result;
     }
-
     function verbalNumber(number, isFuture) {
         return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
     }
 
-    return moment.defineLocale('fi', {
+    var fi = moment.defineLocale('fi', {
         months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
         monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
         weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
             LTS : 'HH.mm.ss',
             L : 'DD.MM.YYYY',
             LL : 'Do MMMM[ta] YYYY',
-            LLL : 'Do MMMM[ta] YYYY, [klo] LT',
-            LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT',
+            LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',
+            LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
             l : 'D.M.YYYY',
             ll : 'Do MMM YYYY',
-            lll : 'Do MMM YYYY, [klo] LT',
-            llll : 'ddd, Do MMM YYYY, [klo] LT'
+            lll : 'Do MMM YYYY, [klo] HH.mm',
+            llll : 'ddd, Do MMM YYYY, [klo] HH.mm'
         },
         calendar : {
             sameDay : '[tänään] [klo] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return fi;
+
+}));
\ No newline at end of file
index 710abf7..93567e4 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : faroese (fo)
-// author : Ragnar Johannesen : https://github.com/ragnar123
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('fo', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var fo = moment.defineLocale('fo', {
         months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
         monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
         weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
         weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D. MMMM, YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D. MMMM, YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Í dag kl.] LT',
@@ -57,4 +54,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return fo;
+
+}));
\ No newline at end of file
index 2bbeb80..6ec487b 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : canadian french (fr-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('fr-ca', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var fr_ca = moment.defineLocale('fr-ca', {
         months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
         monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
         weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
         weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Aujourd\'hui à] LT',
             y : 'un an',
             yy : '%d ans'
         },
-        ordinalParse: /\d{1,2}(er|)/,
+        ordinalParse: /\d{1,2}(er|e)/,
         ordinal : function (number) {
-            return number + (number === 1 ? 'er' : '');
+            return number + (number === 1 ? 'er' : 'e');
         }
     });
-}));
+
+    return fr_ca;
+
+}));
\ No newline at end of file
index 29a3239..90662e2 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : french (fr)
-// author : John Fischer : https://github.com/jfroffice
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('fr', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var fr = moment.defineLocale('fr', {
         months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
         monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
         weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
         weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Aujourd\'hui à] LT',
@@ -59,4 +58,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return fr;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/fy.js b/resources/lib/moment/locale/fy.js
new file mode 100644 (file)
index 0000000..dc04ade
--- /dev/null
@@ -0,0 +1,73 @@
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
+        monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
+
+    var fy = moment.defineLocale('fy', {
+        months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+        monthsShort : function (m, format) {
+            if (/-MMM-/.test(format)) {
+                return monthsShortWithoutDots[m.month()];
+            } else {
+                return monthsShortWithDots[m.month()];
+            }
+        },
+        monthsParseExact : true,
+        weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+        weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
+        weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD-MM-YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay: '[hjoed om] LT',
+            nextDay: '[moarn om] LT',
+            nextWeek: 'dddd [om] LT',
+            lastDay: '[juster om] LT',
+            lastWeek: '[ôfrûne] dddd [om] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'oer %s',
+            past : '%s lyn',
+            s : 'in pear sekonden',
+            m : 'ien minút',
+            mm : '%d minuten',
+            h : 'ien oere',
+            hh : '%d oeren',
+            d : 'ien dei',
+            dd : '%d dagen',
+            M : 'ien moanne',
+            MM : '%d moannen',
+            y : 'ien jier',
+            yy : '%d jierren'
+        },
+        ordinalParse: /\d{1,2}(ste|de)/,
+        ordinal : function (number) {
+            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return fy;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/gd.js b/resources/lib/moment/locale/gd.js
new file mode 100644 (file)
index 0000000..901cd59
--- /dev/null
@@ -0,0 +1,76 @@
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var months = [
+        'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'
+    ];
+
+    var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];
+
+    var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];
+
+    var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];
+
+    var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];
+
+    var gd = moment.defineLocale('gd', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParseExact : true,
+        weekdays : weekdays,
+        weekdaysShort : weekdaysShort,
+        weekdaysMin : weekdaysMin,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[An-diugh aig] LT',
+            nextDay : '[A-màireach aig] LT',
+            nextWeek : 'dddd [aig] LT',
+            lastDay : '[An-dè aig] LT',
+            lastWeek : 'dddd [seo chaidh] [aig] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'ann an %s',
+            past : 'bho chionn %s',
+            s : 'beagan diogan',
+            m : 'mionaid',
+            mm : '%d mionaidean',
+            h : 'uair',
+            hh : '%d uairean',
+            d : 'latha',
+            dd : '%d latha',
+            M : 'mìos',
+            MM : '%d mìosan',
+            y : 'bliadhna',
+            yy : '%d bliadhna'
+        },
+        ordinalParse : /\d{1,2}(d|na|mh)/,
+        ordinal : function (number) {
+            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return gd;
+
+}));
\ No newline at end of file
index b939f8a..83291b6 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : galician (gl)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('gl', {
-        months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'),
-        monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'),
-        weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'),
-        weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'),
-        weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var gl = moment.defineLocale('gl', {
+        months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),
+        monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),
+        monthsParseExact: true,
+        weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
+        weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
+        weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD/MM/YYYY',
-            LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LL : 'D [de] MMMM [de] YYYY',
+            LLL : 'D [de] MMMM [de] YYYY H:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
         },
         calendar : {
             sameDay : function () {
@@ -47,8 +46,8 @@
         },
         relativeTime : {
             future : function (str) {
-                if (str === 'uns segundos') {
-                    return 'nuns segundos';
+                if (str.indexOf('un') === 0) {
+                    return 'n' + str;
                 }
                 return 'en ' + str;
             },
         ordinal : '%dº',
         week : {
             dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return gl;
+
+}));
\ No newline at end of file
index 05b0209..6e55a7a 100644 (file)
@@ -1,21 +1,18 @@
-// moment.js locale configuration
-// locale : Hebrew (he)
-// author : Tomer Cohen : https://github.com/tomer
-// author : Moshe Simantov : https://github.com/DevelopmentIL
-// author : Tal Ater : https://github.com/TalAter
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('he', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var he = moment.defineLocale('he', {
         months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
         monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
         weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
         weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [ב]MMMM YYYY',
-            LLL : 'D [ב]MMMM YYYY LT',
-            LLLL : 'dddd, D [ב]MMMM YYYY LT',
+            LLL : 'D [ב]MMMM YYYY HH:mm',
+            LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
             l : 'D/M/YYYY',
             ll : 'D MMM YYYY',
-            lll : 'D MMM YYYY LT',
-            llll : 'ddd, D MMM YYYY LT'
+            lll : 'D MMM YYYY HH:mm',
+            llll : 'ddd, D MMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[היום ב־]LT',
             yy : function (number) {
                 if (number === 2) {
                     return 'שנתיים';
+                } else if (number % 10 === 0 && number !== 10) {
+                    return number + ' שנה';
                 }
                 return number + ' שנים';
             }
+        },
+        meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
+        isPM : function (input) {
+            return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 5) {
+                return 'לפנות בוקר';
+            } else if (hour < 10) {
+                return 'בבוקר';
+            } else if (hour < 12) {
+                return isLower ? 'לפנה"צ' : 'לפני הצהריים';
+            } else if (hour < 18) {
+                return isLower ? 'אחה"צ' : 'אחרי הצהריים';
+            } else {
+                return 'בערב';
+            }
         }
     });
-}));
+
+    return he;
+
+}));
\ No newline at end of file
index 36ee3ff..fc59771 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : hindi (hi)
-// author : Mayank Singhal : https://github.com/mayanksinghal
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '१',
         '2': '२',
         '०': '0'
     };
 
-    return moment.defineLocale('hi', {
+    var hi = moment.defineLocale('hi', {
         months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
         monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
         weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
         weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
@@ -49,8 +47,8 @@
             LTS : 'A h:mm:ss बजे',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm बजे',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'
         },
         calendar : {
             sameDay : '[आज] LT',
         },
         // Hindi notation for meridiems are quite fuzzy in practice. While there exists
         // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+        meridiemParse: /रात|सुबह|दोपहर|शाम/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'रात') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'सुबह') {
+                return hour;
+            } else if (meridiem === 'दोपहर') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'शाम') {
+                return hour + 12;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'रात';
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hi;
+
+}));
\ No newline at end of file
index be9d785..a3a9be0 100644 (file)
-// moment.js locale configuration
-// locale : hrvatski (hr)
-// author : Bojan Marković : https://github.com/bmarkovic
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-// based on (sl) translation by Robert Sedovšek
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function translate(number, withoutSuffix, key) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
+            case 'm':
+                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+            case 'mm':
+                if (number === 1) {
+                    result += 'minuta';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'minute';
+                } else {
+                    result += 'minuta';
+                }
+                return result;
+            case 'h':
+                return withoutSuffix ? 'jedan sat' : 'jednog sata';
+            case 'hh':
+                if (number === 1) {
+                    result += 'sat';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'sata';
+                } else {
+                    result += 'sati';
+                }
+                return result;
+            case 'dd':
+                if (number === 1) {
+                    result += 'dan';
+                } else {
+                    result += 'dana';
+                }
+                return result;
+            case 'MM':
+                if (number === 1) {
+                    result += 'mjesec';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'mjeseca';
+                } else {
+                    result += 'mjeseci';
+                }
+                return result;
+            case 'yy':
+                if (number === 1) {
+                    result += 'godina';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'godine';
+                } else {
+                    result += 'godina';
+                }
+                return result;
         }
     }
 
-    return moment.defineLocale('hr', {
-        months : 'sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'),
-        monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+    var hr = moment.defineLocale('hr', {
+        months : {
+            format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),
+            standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')
+        },
+        monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
         weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
         weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[danas u] LT',
             nextDay  : '[sutra u] LT',
-
             nextWeek : function () {
                 switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
+                    case 0:
+                        return '[u] [nedjelju] [u] LT';
+                    case 3:
+                        return '[u] [srijedu] [u] LT';
+                    case 6:
+                        return '[u] [subotu] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[u] dddd [u] LT';
                 }
             },
             lastDay  : '[jučer u] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
+                    case 0:
+                    case 3:
+                        return '[prošlu] dddd [u] LT';
+                    case 6:
+                        return '[prošle] [subote] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[prošli] dddd [u] LT';
                 }
             },
             sameElse : 'L'
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hr;
+
+}));
\ No newline at end of file
index 3ed864e..af5c731 100644 (file)
@@ -1,57 +1,50 @@
-// moment.js locale configuration
-// locale : hungarian (hu)
-// author : Adam Brunner : https://github.com/adambrunner
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
 
+    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
     function translate(number, withoutSuffix, key, isFuture) {
         var num = number,
             suffix;
-
         switch (key) {
-        case 's':
-            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
-        case 'm':
-            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'mm':
-            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'h':
-            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'hh':
-            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'd':
-            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'dd':
-            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'M':
-            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'MM':
-            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'y':
-            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
-        case 'yy':
-            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+            case 's':
+                return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+            case 'm':
+                return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+            case 'mm':
+                return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+            case 'h':
+                return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+            case 'hh':
+                return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+            case 'd':
+                return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+            case 'dd':
+                return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+            case 'M':
+                return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+            case 'MM':
+                return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+            case 'y':
+                return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+            case 'yy':
+                return num + (isFuture || withoutSuffix ? ' év' : ' éve');
         }
-
         return '';
     }
-
     function week(isFuture) {
         return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
     }
 
-    return moment.defineLocale('hu', {
+    var hu = moment.defineLocale('hu', {
         months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
         monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
         weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
         weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'YYYY.MM.DD.',
             LL : 'YYYY. MMMM D.',
-            LLL : 'YYYY. MMMM D., LT',
-            LLLL : 'YYYY. MMMM D., dddd LT'
+            LLL : 'YYYY. MMMM D. H:mm',
+            LLLL : 'YYYY. MMMM D., dddd H:mm'
+        },
+        meridiemParse: /de|du/i,
+        isPM: function (input) {
+            return input.charAt(1).toLowerCase() === 'u';
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 12) {
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hu;
+
+}));
\ No newline at end of file
index 1e6540b..8b26200 100644 (file)
@@ -1,56 +1,31 @@
-// moment.js locale configuration
-// locale : Armenian (hy-am)
-// author : Armendarabyan : https://github.com/armendarabyan
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
-            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-        return monthsShort[m.month()];
-    }
 
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
-
-        return weekdays[m.day()];
-    }
-
-    return moment.defineLocale('hy-am', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
+    var hy_am = moment.defineLocale('hy-am', {
+        months : {
+            format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),
+            standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')
+        },
+        monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+        weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),
         weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
         weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY թ.',
-            LLL : 'D MMMM YYYY թ., LT',
-            LLLL : 'dddd, D MMMM YYYY թ., LT'
+            LLL : 'D MMMM YYYY թ., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY թ., HH:mm'
         },
         calendar : {
             sameDay: '[այսօր] LT',
             y : 'տարի',
             yy : '%d տարի'
         },
-
+        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
+        isPM: function (input) {
+            return /^(ցերեկվա|երեկոյան)$/.test(input);
+        },
         meridiem : function (hour) {
             if (hour < 4) {
                 return 'գիշերվա';
                 return 'երեկոյան';
             }
         },
-
         ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'DDD':
-            case 'w':
-            case 'W':
-            case 'DDDo':
-                if (number === 1) {
-                    return number + '-ին';
-                }
-                return number + '-րդ';
-            default:
-                return number;
+                case 'DDD':
+                case 'w':
+                case 'W':
+                case 'DDDo':
+                    if (number === 1) {
+                        return number + '-ին';
+                    }
+                    return number + '-րդ';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hy_am;
+
+}));
\ No newline at end of file
index b8fc9ad..16dff2f 100644 (file)
@@ -1,20 +1,17 @@
-// moment.js locale configuration
-// locale : Bahasa Indonesia (id)
-// author : Mohammad Satrio Utomo : https://github.com/tyok
-// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('id', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var id = moment.defineLocale('id', {
         months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
         weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
         weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
         longDateFormat : {
             LT : 'HH.mm',
-            LTS : 'LT.ss',
+            LTS : 'HH.mm.ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY [pukul] LT',
-            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /pagi|siang|sore|malam/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'pagi') {
+                return hour;
+            } else if (meridiem === 'siang') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'sore' || meridiem === 'malam') {
+                return hour + 12;
+            }
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 11) {
@@ -67,4 +77,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return id;
+
+}));
\ No newline at end of file
index 6422b47..810fee6 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : icelandic (is)
-// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(n) {
         if (n % 100 === 11) {
             return true;
         }
         return true;
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 's':
-            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
-        case 'm':
-            return withoutSuffix ? 'mínúta' : 'mínútu';
-        case 'mm':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
-            } else if (withoutSuffix) {
-                return result + 'mínúta';
-            }
-            return result + 'mínútu';
-        case 'hh':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
-            }
-            return result + 'klukkustund';
-        case 'd':
-            if (withoutSuffix) {
-                return 'dagur';
-            }
-            return isFuture ? 'dag' : 'degi';
-        case 'dd':
-            if (plural(number)) {
+            case 's':
+                return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+            case 'm':
+                return withoutSuffix ? 'mínúta' : 'mínútu';
+            case 'mm':
+                if (plural(number)) {
+                    return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+                } else if (withoutSuffix) {
+                    return result + 'mínúta';
+                }
+                return result + 'mínútu';
+            case 'hh':
+                if (plural(number)) {
+                    return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+                }
+                return result + 'klukkustund';
+            case 'd':
                 if (withoutSuffix) {
-                    return result + 'dagar';
+                    return 'dagur';
                 }
-                return result + (isFuture ? 'daga' : 'dögum');
-            } else if (withoutSuffix) {
-                return result + 'dagur';
-            }
-            return result + (isFuture ? 'dag' : 'degi');
-        case 'M':
-            if (withoutSuffix) {
-                return 'mánuður';
-            }
-            return isFuture ? 'mánuð' : 'mánuði';
-        case 'MM':
-            if (plural(number)) {
+                return isFuture ? 'dag' : 'degi';
+            case 'dd':
+                if (plural(number)) {
+                    if (withoutSuffix) {
+                        return result + 'dagar';
+                    }
+                    return result + (isFuture ? 'daga' : 'dögum');
+                } else if (withoutSuffix) {
+                    return result + 'dagur';
+                }
+                return result + (isFuture ? 'dag' : 'degi');
+            case 'M':
                 if (withoutSuffix) {
-                    return result + 'mánuðir';
+                    return 'mánuður';
+                }
+                return isFuture ? 'mánuð' : 'mánuði';
+            case 'MM':
+                if (plural(number)) {
+                    if (withoutSuffix) {
+                        return result + 'mánuðir';
+                    }
+                    return result + (isFuture ? 'mánuði' : 'mánuðum');
+                } else if (withoutSuffix) {
+                    return result + 'mánuður';
+                }
+                return result + (isFuture ? 'mánuð' : 'mánuði');
+            case 'y':
+                return withoutSuffix || isFuture ? 'ár' : 'ári';
+            case 'yy':
+                if (plural(number)) {
+                    return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
                 }
-                return result + (isFuture ? 'mánuði' : 'mánuðum');
-            } else if (withoutSuffix) {
-                return result + 'mánuður';
-            }
-            return result + (isFuture ? 'mánuð' : 'mánuði');
-        case 'y':
-            return withoutSuffix || isFuture ? 'ár' : 'ári';
-        case 'yy':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
-            }
-            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+                return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
         }
     }
 
-    return moment.defineLocale('is', {
+    var is = moment.defineLocale('is', {
         months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
         weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
         weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD/MM/YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY [kl.] LT',
-            LLLL : 'dddd, D. MMMM YYYY [kl.] LT'
+            LLL : 'D. MMMM YYYY [kl.] H:mm',
+            LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'
         },
         calendar : {
             sameDay : '[í dag kl.] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return is;
+
+}));
\ No newline at end of file
index 1330988..35d44cc 100644 (file)
@@ -1,32 +1,29 @@
-// moment.js locale configuration
-// locale : italian (it)
-// author : Lorenzo : https://github.com/aliem
-// author: Mattia Larentis: https://github.com/nostalgiaz
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('it', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var it = moment.defineLocale('it', {
         months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
         monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
         weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
         weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
-        weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'),
+        weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Oggi alle] LT',
@@ -67,4 +64,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return it;
+
+}));
\ No newline at end of file
index c3e3ebf..adea359 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : japanese (ja)
-// author : LI Long : https://github.com/baryon
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ja', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ja = moment.defineLocale('ja', {
         months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
         weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
         longDateFormat : {
             LT : 'Ah時m分',
-            LTS : 'LTs秒',
+            LTS : 'Ah時m分s秒',
             L : 'YYYY/MM/DD',
             LL : 'YYYY年M月D日',
-            LLL : 'YYYY年M月D日LT',
-            LLLL : 'YYYY年M月D日LT dddd'
+            LLL : 'YYYY年M月D日Ah時m分',
+            LLLL : 'YYYY年M月D日Ah時m分 dddd'
+        },
+        meridiemParse: /午前|午後/i,
+        isPM : function (input) {
+            return input === '午後';
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
             lastWeek : '[前週]dddd LT',
             sameElse : 'L'
         },
+        ordinalParse : /\d{1,2}日/,
+        ordinal : function (number, period) {
+            switch (period) {
+                case 'd':
+                case 'D':
+                case 'DDD':
+                    return number + '日';
+                default:
+                    return number;
+            }
+        },
         relativeTime : {
             future : '%s後',
             past : '%s前',
@@ -58,4 +70,7 @@
             yy : '%d年'
         }
     });
-}));
+
+    return ja;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/jv.js b/resources/lib/moment/locale/jv.js
new file mode 100644 (file)
index 0000000..c58e076
--- /dev/null
@@ -0,0 +1,83 @@
+//! moment.js locale configuration
+//! locale : Japanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var jv = moment.defineLocale('jv', {
+        months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+        weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+        weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+        weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+        longDateFormat : {
+            LT : 'HH.mm',
+            LTS : 'HH.mm.ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /enjing|siyang|sonten|ndalu/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'enjing') {
+                return hour;
+            } else if (meridiem === 'siyang') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'enjing';
+            } else if (hours < 15) {
+                return 'siyang';
+            } else if (hours < 19) {
+                return 'sonten';
+            } else {
+                return 'ndalu';
+            }
+        },
+        calendar : {
+            sameDay : '[Dinten puniko pukul] LT',
+            nextDay : '[Mbenjang pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kala wingi pukul] LT',
+            lastWeek : 'dddd [kepengker pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'wonten ing %s',
+            past : '%s ingkang kepengker',
+            s : 'sawetawis detik',
+            m : 'setunggal menit',
+            mm : '%d menit',
+            h : 'setunggal jam',
+            hh : '%d jam',
+            d : 'sedinten',
+            dd : '%d dinten',
+            M : 'sewulan',
+            MM : '%d wulan',
+            y : 'setaun',
+            yy : '%d taun'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return jv;
+
+}));
\ No newline at end of file
index 1437c71..b9faf68 100644 (file)
@@ -1,48 +1,26 @@
-// moment.js locale configuration
-// locale : Georgian (ka)
-// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
-            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
-        },
-
-        nounCase = (/D[oD] *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-        return months[nounCase][m.month()];
-    }
 
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
-            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
+    var ka = moment.defineLocale('ka', {
+        months : {
+            standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+            format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
         },
-
-        nounCase = (/(წინა|შემდეგ)/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.defineLocale('ka', {
-        months : monthsCaseReplace,
         monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
-        weekdays : weekdaysCaseReplace,
+        weekdays : {
+            standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+            format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),
+            isFormat: /(წინა|შემდეგ)/
+        },
         weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
         weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
         longDateFormat : {
@@ -50,8 +28,8 @@
             LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
         },
         calendar : {
             sameDay : '[დღეს] LT[-ზე]',
             if (number === 0) {
                 return number;
             }
-
             if (number === 1) {
                 return number + '-ლი';
             }
-
             if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
                 return 'მე-' + number;
             }
-
             return number + '-ე';
         },
         week : {
             doy : 7
         }
     });
-}));
+
+    return ka;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/kk.js b/resources/lib/moment/locale/kk.js
new file mode 100644 (file)
index 0000000..270106f
--- /dev/null
@@ -0,0 +1,87 @@
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var suffixes = {
+        0: '-ші',
+        1: '-ші',
+        2: '-ші',
+        3: '-ші',
+        4: '-ші',
+        5: '-ші',
+        6: '-шы',
+        7: '-ші',
+        8: '-ші',
+        9: '-шы',
+        10: '-шы',
+        20: '-шы',
+        30: '-шы',
+        40: '-шы',
+        50: '-ші',
+        60: '-шы',
+        70: '-ші',
+        80: '-ші',
+        90: '-шы',
+        100: '-ші'
+    };
+
+    var kk = moment.defineLocale('kk', {
+        months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),
+        monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
+        weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),
+        weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
+        weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[Бүгін сағат] LT',
+            nextDay : '[Ертең сағат] LT',
+            nextWeek : 'dddd [сағат] LT',
+            lastDay : '[Кеше сағат] LT',
+            lastWeek : '[Өткен аптаның] dddd [сағат] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s ішінде',
+            past : '%s бұрын',
+            s : 'бірнеше секунд',
+            m : 'бір минут',
+            mm : '%d минут',
+            h : 'бір сағат',
+            hh : '%d сағат',
+            d : 'бір күн',
+            dd : '%d күн',
+            M : 'бір ай',
+            MM : '%d ай',
+            y : 'бір жыл',
+            yy : '%d жыл'
+        },
+        ordinalParse: /\d{1,2}-(ші|шы)/,
+        ordinal : function (number) {
+            var a = number % 10,
+                b = number >= 100 ? 100 : null;
+            return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return kk;
+
+}));
\ No newline at end of file
index 6229791..cbfe31d 100644 (file)
@@ -1,34 +1,31 @@
-// moment.js locale configuration
-// locale : khmer (km)
-// author : Kruy Vanna : https://github.com/kruyvanna
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('km', {
-        months: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
-        monthsShort: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var km = moment.defineLocale('km', {
+        months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+        monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
         weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
         weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
         weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
         longDateFormat: {
             LT: 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
-            LLL: 'D MMMM YYYY LT',
-            LLLL: 'dddd, D MMMM YYYY LT'
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd, D MMMM YYYY HH:mm'
         },
         calendar: {
-            sameDay: '[á\9e\90á\9f\92á\9e\84á\9f\83á\9e\93á\9f\88 ម៉ោង] LT',
+            sameDay: '[á\9e\90á\9f\92á\9e\84á\9f\83á\9e\93á\9f\81á\9f\87 ម៉ោង] LT',
             nextDay: '[ស្អែក ម៉ោង] LT',
             nextWeek: 'dddd [ម៉ោង] LT',
             lastDay: '[ម្សិលមិញ ម៉ោង] LT',
@@ -55,4 +52,7 @@
             doy: 4 // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return km;
+
+}));
\ No newline at end of file
index 2638959..4f067e8 100644 (file)
@@ -1,22 +1,17 @@
-// moment.js locale configuration
-// locale : korean (ko)
-//
-// authors
-//
-// - Kyungwook, Park : https://github.com/kyungw00k
-// - Jeeeyul Lee <jeeeyul@gmail.com>
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ko', {
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ko = moment.defineLocale('ko', {
         months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
         monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
         weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
             LTS : 'A h시 m분 s초',
             L : 'YYYY.MM.DD',
             LL : 'YYYY년 MMMM D일',
-            LLL : 'YYYY년 MMMM D일 LT',
-            LLLL : 'YYYY년 MMMM D일 dddd LT'
-        },
-        meridiem : function (hour, minute, isUpper) {
-            return hour < 12 ? '오전' : '오후';
+            LLL : 'YYYY년 MMMM D일 A h시 m분',
+            LLLL : 'YYYY년 MMMM D일 dddd A h시 m분'
         },
         calendar : {
             sameDay : '오늘 LT',
         relativeTime : {
             future : '%s 후',
             past : '%s 전',
-            s : '몇초',
+            s : '몇 초',
             ss : '%d초',
             m : '일분',
             mm : '%d분',
-            h : '한시간',
+            h : '한 시간',
             hh : '%d시간',
             d : '하루',
             dd : '%d일',
-            M : '한달',
+            M : '한 달',
             MM : '%d달',
-            y : '일년',
+            y : '일 년',
             yy : '%d년'
         },
         ordinalParse : /\d{1,2}일/,
         ordinal : '%d일',
-        meridiemParse : /(오전|오후)/,
+        meridiemParse : /오전|오후/,
         isPM : function (token) {
             return token === '오후';
+        },
+        meridiem : function (hour, minute, isUpper) {
+            return hour < 12 ? '오전' : '오후';
         }
     });
-}));
+
+    return ko;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ky.js b/resources/lib/moment/locale/ky.js
new file mode 100644 (file)
index 0000000..eaffed1
--- /dev/null
@@ -0,0 +1,88 @@
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+
+    var suffixes = {
+        0: '-чү',
+        1: '-чи',
+        2: '-чи',
+        3: '-чү',
+        4: '-чү',
+        5: '-чи',
+        6: '-чы',
+        7: '-чи',
+        8: '-чи',
+        9: '-чу',
+        10: '-чу',
+        20: '-чы',
+        30: '-чу',
+        40: '-чы',
+        50: '-чү',
+        60: '-чы',
+        70: '-чи',
+        80: '-чи',
+        90: '-чу',
+        100: '-чү'
+    };
+
+    var ky = moment.defineLocale('ky', {
+        months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+        monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+        weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),
+        weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
+        weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[Бүгүн саат] LT',
+            nextDay : '[Эртең саат] LT',
+            nextWeek : 'dddd [саат] LT',
+            lastDay : '[Кече саат] LT',
+            lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s ичинде',
+            past : '%s мурун',
+            s : 'бирнече секунд',
+            m : 'бир мүнөт',
+            mm : '%d мүнөт',
+            h : 'бир саат',
+            hh : '%d саат',
+            d : 'бир күн',
+            dd : '%d күн',
+            M : 'бир ай',
+            MM : '%d ай',
+            y : 'бир жыл',
+            yy : '%d жыл'
+        },
+        ordinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
+        ordinal : function (number) {
+            var a = number % 10,
+                b = number >= 100 ? 100 : null;
+            return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return ky;
+
+}));
\ No newline at end of file
index fe6b34b..83bde2b 100644 (file)
@@ -1,22 +1,16 @@
-// moment.js locale configuration
-// locale : Luxembourgish (lb)
-// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the
-// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday'
-// and 'eifelerRegelAppliesToNumber' methods are meant for
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             'm': ['eng Minutt', 'enger Minutt'],
@@ -27,7 +21,6 @@
         };
         return withoutSuffix ? format[key][0] : format[key][1];
     }
-
     function processFutureTime(string) {
         var number = string.substr(0, string.indexOf(' '));
         if (eifelerRegelAppliesToNumber(number)) {
@@ -35,7 +28,6 @@
         }
         return 'an ' + string;
     }
-
     function processPastTime(string) {
         var number = string.substr(0, string.indexOf(' '));
         if (eifelerRegelAppliesToNumber(number)) {
@@ -43,7 +35,6 @@
         }
         return 'virun ' + string;
     }
-
     /**
      * Returns true if the word before the given number loses the '-n' ending.
      * e.g. 'an 10 Deeg' but 'a 5 Deeg'
         }
     }
 
-    return moment.defineLocale('lb', {
+    var lb = moment.defineLocale('lb', {
         months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
         monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        monthsParseExact : true,
         weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
         weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
         weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat: {
             LT: 'H:mm [Auer]',
             LTS: 'H:mm:ss [Auer]',
             L: 'DD.MM.YYYY',
             LL: 'D. MMMM YYYY',
-            LLL: 'D. MMMM YYYY LT',
-            LLLL: 'dddd, D. MMMM YYYY LT'
+            LLL: 'D. MMMM YYYY H:mm [Auer]',
+            LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'
         },
         calendar: {
             sameDay: '[Haut um] LT',
             doy: 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return lb;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/lo.js b/resources/lib/moment/locale/lo.js
new file mode 100644 (file)
index 0000000..689a183
--- /dev/null
@@ -0,0 +1,70 @@
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var lo = moment.defineLocale('lo', {
+        months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+        monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+        weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+        weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+        weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'ວັນdddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
+        isPM: function (input) {
+            return input === 'ຕອນແລງ';
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'ຕອນເຊົ້າ';
+            } else {
+                return 'ຕອນແລງ';
+            }
+        },
+        calendar : {
+            sameDay : '[ມື້ນີ້ເວລາ] LT',
+            nextDay : '[ມື້ອື່ນເວລາ] LT',
+            nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',
+            lastDay : '[ມື້ວານນີ້ເວລາ] LT',
+            lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'ອີກ %s',
+            past : '%sຜ່ານມາ',
+            s : 'ບໍ່ເທົ່າໃດວິນາທີ',
+            m : '1 ນາທີ',
+            mm : '%d ນາທີ',
+            h : '1 ຊົ່ວໂມງ',
+            hh : '%d ຊົ່ວໂມງ',
+            d : '1 ມື້',
+            dd : '%d ມື້',
+            M : '1 ເດືອນ',
+            MM : '%d ເດືອນ',
+            y : '1 ປີ',
+            yy : '%d ປີ'
+        },
+        ordinalParse: /(ທີ່)\d{1,2}/,
+        ordinal : function (number) {
+            return 'ທີ່' + number;
+        }
+    });
+
+    return lo;
+
+}));
\ No newline at end of file
index d9c8ae5..2bb9a36 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Lithuanian (lt)
-// author : Mindaugas Mozūras : https://github.com/mmozuras
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var units = {
         'm' : 'minutė_minutės_minutę',
         'mm': 'minutės_minučių_minutes',
@@ -24,9 +21,7 @@
         'MM': 'mėnesiai_mėnesių_mėnesius',
         'y' : 'metai_metų_metus',
         'yy': 'metai_metų_metus'
-    },
-    weekDays = 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_');
-
+    };
     function translateSeconds(number, withoutSuffix, key, isFuture) {
         if (withoutSuffix) {
             return 'kelios sekundės';
             return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
         }
     }
-
     function translateSingular(number, withoutSuffix, key, isFuture) {
         return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
     }
-
     function special(number) {
         return number % 10 === 0 || (number > 10 && number < 20);
     }
-
     function forms(key) {
         return units[key].split('_');
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         if (number === 1) {
             }
         }
     }
-
-    function relativeWeekDay(moment, format) {
-        var nominative = format.indexOf('dddd HH:mm') === -1,
-            weekDay = weekDays[moment.day()];
-
-        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į';
-    }
-
-    return moment.defineLocale('lt', {
-        months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+    var lt = moment.defineLocale('lt', {
+        months : {
+            format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+            standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),
+            isFormat: /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?|MMMM?(\[[^\[\]]*\]|\s+)+D[oD]?/
+        },
         monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
-        weekdays : relativeWeekDay,
+        weekdays : {
+            format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),
+            standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),
+            isFormat: /dddd HH:mm/
+        },
         weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
         weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'YYYY [m.] MMMM D [d.]',
-            LLL : 'YYYY [m.] MMMM D [d.], LT [val.]',
-            LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]',
+            LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+            LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
             l : 'YYYY-MM-DD',
             ll : 'YYYY [m.] MMMM D [d.]',
-            lll : 'YYYY [m.] MMMM D [d.], LT [val.]',
-            llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]'
+            lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+            llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
         },
         calendar : {
             sameDay : '[Šiandien] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return lt;
+
+}));
\ No newline at end of file
index 315f27f..780be13 100644 (file)
@@ -1,52 +1,65 @@
-// moment.js locale configuration
-// locale : latvian (lv)
-// author : Kristaps Karlsons : https://github.com/skakri
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var units = {
-        'mm': 'minūti_minūtes_minūte_minūtes',
-        'hh': 'stundu_stundas_stunda_stundas',
-        'dd': 'dienu_dienas_diena_dienas',
-        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
-        'yy': 'gadu_gadus_gads_gadi'
+        'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+        'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+        'h': 'stundas_stundām_stunda_stundas'.split('_'),
+        'hh': 'stundas_stundām_stunda_stundas'.split('_'),
+        'd': 'dienas_dienām_diena_dienas'.split('_'),
+        'dd': 'dienas_dienām_diena_dienas'.split('_'),
+        'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+        'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+        'y': 'gada_gadiem_gads_gadi'.split('_'),
+        'yy': 'gada_gadiem_gads_gadi'.split('_')
     };
-
-    function format(word, number, withoutSuffix) {
-        var forms = word.split('_');
+    /**
+     * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+     */
+    function format(forms, number, withoutSuffix) {
         if (withoutSuffix) {
-            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
+            // E.g. "21 minūte", "3 minūtes".
+            return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
         } else {
-            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
+            // E.g. "21 minūtes" as in "pēc 21 minūtes".
+            // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
+            return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
         }
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         return number + ' ' + format(units[key], number, withoutSuffix);
     }
+    function relativeTimeWithSingular(number, withoutSuffix, key) {
+        return format(units[key], number, withoutSuffix);
+    }
+    function relativeSeconds(number, withoutSuffix) {
+        return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
+    }
 
-    return moment.defineLocale('lv', {
+    var lv = moment.defineLocale('lv', {
         months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
         monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
         weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
         weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
         weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
-            L : 'DD.MM.YYYY',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY.',
             LL : 'YYYY. [gada] D. MMMM',
-            LLL : 'YYYY. [gada] D. MMMM, LT',
-            LLLL : 'YYYY. [gada] D. MMMM, dddd, LT'
+            LLL : 'YYYY. [gada] D. MMMM, HH:mm',
+            LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'
         },
         calendar : {
             sameDay : '[Šodien pulksten] LT',
             sameElse : 'L'
         },
         relativeTime : {
-            future : '%s vēlāk',
-            past : '%s agrāk',
-            s : 'dažas sekundes',
-            m : 'minūti',
+            future : 'pēc %s',
+            past : 'pirms %s',
+            s : relativeSeconds,
+            m : relativeTimeWithSingular,
             mm : relativeTimeWithPlural,
-            h : 'stundu',
+            h : relativeTimeWithSingular,
             hh : relativeTimeWithPlural,
-            d : 'dienu',
+            d : relativeTimeWithSingular,
             dd : relativeTimeWithPlural,
-            M : 'mēnesi',
+            M : relativeTimeWithSingular,
             MM : relativeTimeWithPlural,
-            y : 'gadu',
+            y : relativeTimeWithSingular,
             yy : relativeTimeWithPlural
         },
         ordinalParse: /\d{1,2}\./,
@@ -78,4 +91,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return lv;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/mi.js b/resources/lib/moment/locale/mi.js
new file mode 100644 (file)
index 0000000..850e4cd
--- /dev/null
@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var mi = moment.defineLocale('mi', {
+        months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),
+        monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),
+        monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+        monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+        monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+        monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
+        weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
+        weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+        weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+        longDateFormat: {
+            LT: 'HH:mm',
+            LTS: 'HH:mm:ss',
+            L: 'DD/MM/YYYY',
+            LL: 'D MMMM YYYY',
+            LLL: 'D MMMM YYYY [i] HH:mm',
+            LLLL: 'dddd, D MMMM YYYY [i] HH:mm'
+        },
+        calendar: {
+            sameDay: '[i teie mahana, i] LT',
+            nextDay: '[apopo i] LT',
+            nextWeek: 'dddd [i] LT',
+            lastDay: '[inanahi i] LT',
+            lastWeek: 'dddd [whakamutunga i] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: 'i roto i %s',
+            past: '%s i mua',
+            s: 'te hēkona ruarua',
+            m: 'he meneti',
+            mm: '%d meneti',
+            h: 'te haora',
+            hh: '%d haora',
+            d: 'he ra',
+            dd: '%d ra',
+            M: 'he marama',
+            MM: '%d marama',
+            y: 'he tau',
+            yy: '%d tau'
+        },
+        ordinalParse: /\d{1,2}º/,
+        ordinal: '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return mi;
+
+}));
\ No newline at end of file
index 74fd5a1..88413ac 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : macedonian (mk)
-// author : Borislav Mickov : https://github.com/B0k0
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('mk', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var mk = moment.defineLocale('mk', {
         months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
         monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
         weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
         weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'D.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY H:mm',
+            LLLL : 'dddd, D MMMM YYYY H:mm'
         },
         calendar : {
             sameDay : '[Денес во] LT',
             nextDay : '[Утре во] LT',
-            nextWeek : 'dddd [во] LT',
+            nextWeek : '[Во] dddd [во] LT',
             lastDay : '[Вчера во] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[Во изминатата] dddd [во] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[Во изминатиот] dddd [во] LT';
+                    case 0:
+                    case 3:
+                    case 6:
+                        return '[Изминатата] dddd [во] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[Изминатиот] dddd [во] LT';
                 }
             },
             sameElse : 'L'
@@ -87,4 +84,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return mk;
+
+}));
\ No newline at end of file
index f72b2c4..487b37a 100644 (file)
@@ -1,21 +1,19 @@
-// moment.js locale configuration
-// locale : malayalam (ml)
-// author : Floyd Pink : https://github.com/floydpink
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ml', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ml = moment.defineLocale('ml', {
         months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
         monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
         weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
         weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
@@ -24,8 +22,8 @@
             LTS : 'A h:mm:ss -നു',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm -നു',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'
         },
         calendar : {
             sameDay : '[ഇന്ന്] LT',
             y : 'ഒരു വർഷം',
             yy : '%d വർഷം'
         },
+        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if ((meridiem === 'രാത്രി' && hour >= 4) ||
+                    meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
+                    meridiem === 'വൈകുന്നേരം') {
+                return hour + 12;
+            } else {
+                return hour;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'രാത്രി';
@@ -64,4 +75,7 @@
             }
         }
     });
-}));
+
+    return ml;
+
+}));
\ No newline at end of file
index 7c04715..fc388b0 100644 (file)
@@ -1,18 +1,16 @@
-// moment.js locale configuration
-// locale : Marathi (mr)
-// author : Harshad Kale : https://github.com/kalehv
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '१',
         '2': '२',
         '०': '0'
     };
 
-    return moment.defineLocale('mr', {
+    function relativeTimeMr(number, withoutSuffix, string, isFuture)
+    {
+        var output = '';
+        if (withoutSuffix) {
+            switch (string) {
+                case 's': output = 'काही सेकंद'; break;
+                case 'm': output = 'एक मिनिट'; break;
+                case 'mm': output = '%d मिनिटे'; break;
+                case 'h': output = 'एक तास'; break;
+                case 'hh': output = '%d तास'; break;
+                case 'd': output = 'एक दिवस'; break;
+                case 'dd': output = '%d दिवस'; break;
+                case 'M': output = 'एक महिना'; break;
+                case 'MM': output = '%d महिने'; break;
+                case 'y': output = 'एक वर्ष'; break;
+                case 'yy': output = '%d वर्षे'; break;
+            }
+        }
+        else {
+            switch (string) {
+                case 's': output = 'काही सेकंदां'; break;
+                case 'm': output = 'एका मिनिटा'; break;
+                case 'mm': output = '%d मिनिटां'; break;
+                case 'h': output = 'एका तासा'; break;
+                case 'hh': output = '%d तासां'; break;
+                case 'd': output = 'एका दिवसा'; break;
+                case 'dd': output = '%d दिवसां'; break;
+                case 'M': output = 'एका महिन्या'; break;
+                case 'MM': output = '%d महिन्यां'; break;
+                case 'y': output = 'एका वर्षा'; break;
+                case 'yy': output = '%d वर्षां'; break;
+            }
+        }
+        return output.replace(/%d/i, number);
+    }
+
+    var mr = moment.defineLocale('mr', {
         months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
         monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
         weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
         weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
@@ -49,8 +84,8 @@
             LTS : 'A h:mm:ss वाजता',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm वाजता',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'
         },
         calendar : {
             sameDay : '[आज] LT',
             sameElse : 'L'
         },
         relativeTime : {
-            future : '%s नंतर',
-            past : '%s पूर्वी',
-            s : 'सेकंद',
-            m: 'एक मिनिट',
-            mm: '%d मिनिटे',
-            h : 'एक तास',
-            hh : '%d तास',
-            d : 'एक दिवस',
-            dd : '%d दिवस',
-            M : 'एक महिना',
-            MM : '%d महिने',
-            y : 'एक वर्ष',
-            yy : '%d वर्षे'
+            future: '%sमध्ये',
+            past: '%sपूर्वी',
+            s: relativeTimeMr,
+            m: relativeTimeMr,
+            mm: relativeTimeMr,
+            h: relativeTimeMr,
+            hh: relativeTimeMr,
+            d: relativeTimeMr,
+            dd: relativeTimeMr,
+            M: relativeTimeMr,
+            MM: relativeTimeMr,
+            y: relativeTimeMr,
+            yy: relativeTimeMr
         },
         preparse: function (string) {
             return string.replace(/[१२३४५६७८९०]/g, function (match) {
                 return symbolMap[match];
             });
         },
-        meridiem: function (hour, minute, isLower)
-        {
+        meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'रात्री') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'सकाळी') {
+                return hour;
+            } else if (meridiem === 'दुपारी') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'सायंकाळी') {
+                return hour + 12;
+            }
+        },
+        meridiem: function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'रात्री';
             } else if (hour < 10) {
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return mr;
+
+}));
\ No newline at end of file
index 7072c2f..e353173 100644 (file)
@@ -1,19 +1,17 @@
-// moment.js locale configuration
-// locale : Bahasa Malaysia (ms-MY)
-// author : Weldan Jamili : https://github.com/weldan
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ms-my', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ms_my = moment.defineLocale('ms-my', {
         months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
         monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
         weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
         weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
         longDateFormat : {
             LT : 'HH.mm',
-            LTS : 'LT.ss',
+            LTS : 'HH.mm.ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY [pukul] LT',
-            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /pagi|tengahari|petang|malam/,
+        meridiemHour: function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'pagi') {
+                return hour;
+            } else if (meridiem === 'tengahari') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'petang' || meridiem === 'malam') {
+                return hour + 12;
+            }
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 11) {
@@ -66,4 +77,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ms_my;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ms.js b/resources/lib/moment/locale/ms.js
new file mode 100644 (file)
index 0000000..280194c
--- /dev/null
@@ -0,0 +1,82 @@
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ms = moment.defineLocale('ms', {
+        months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+        monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+        weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+        weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+        weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+        longDateFormat : {
+            LT : 'HH.mm',
+            LTS : 'HH.mm.ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /pagi|tengahari|petang|malam/,
+        meridiemHour: function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'pagi') {
+                return hour;
+            } else if (meridiem === 'tengahari') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'petang' || meridiem === 'malam') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'tengahari';
+            } else if (hours < 19) {
+                return 'petang';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Esok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kelmarin pukul] LT',
+            lastWeek : 'dddd [lepas pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'dalam %s',
+            past : '%s yang lepas',
+            s : 'beberapa saat',
+            m : 'seminit',
+            mm : '%d minit',
+            h : 'sejam',
+            hh : '%d jam',
+            d : 'sehari',
+            dd : '%d hari',
+            M : 'sebulan',
+            MM : '%d bulan',
+            y : 'setahun',
+            yy : '%d tahun'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return ms;
+
+}));
\ No newline at end of file
index daba17d..0e7b86d 100644 (file)
@@ -1,18 +1,17 @@
-// moment.js locale configuration
-// locale : Burmese (my)
-// author : Squar team, mysquar.com
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '၁',
         '2': '၂',
         '၉': '9',
         '၀': '0'
     };
-    return moment.defineLocale('my', {
+
+    var my = moment.defineLocale('my', {
         months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
         monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
         weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
-        weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
-        weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+        weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+        weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+
         longDateFormat: {
             LT: 'HH:mm',
             LTS: 'HH:mm:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
-            LLL: 'D MMMM YYYY LT',
-            LLLL: 'dddd D MMMM YYYY LT'
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd D MMMM YYYY HH:mm'
         },
         calendar: {
             sameDay: '[ယနေ.] LT [မှာ]',
@@ -88,4 +89,7 @@
             doy: 4 // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return my;
+
+}));
\ No newline at end of file
index 4fab78b..592734d 100644 (file)
@@ -1,32 +1,31 @@
-// moment.js locale configuration
-// locale : norwegian bokmål (nb)
-// authors : Espen Hovlandsdal : https://github.com/rexxars
-//           Sigurd Gartmann : https://github.com/sigurdga
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//!           Sigurd Gartmann : https://github.com/sigurdga
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('nb', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var nb = moment.defineLocale('nb', {
         months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
-        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+        monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
-        weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'),
+        weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),
         weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
-            LT : 'H.mm',
-            LTS : 'LT.ss',
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY [kl.] LT',
-            LLLL : 'dddd D. MMMM YYYY [kl.] LT'
+            LLL : 'D. MMMM YYYY [kl.] HH:mm',
+            LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
         },
         calendar : {
             sameDay: '[i dag kl.] LT',
@@ -38,7 +37,7 @@
         },
         relativeTime : {
             future : 'om %s',
-            past : 'for %s siden',
+            past : '%s siden',
             s : 'noen sekunder',
             m : 'ett minutt',
             mm : '%d minutter',
@@ -58,4 +57,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return nb;
+
+}));
\ No newline at end of file
index ad10165..85de195 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : nepali/nepalese
-// author : suvash : https://github.com/suvash
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '१',
         '2': '२',
         '०': '0'
     };
 
-    return moment.defineLocale('ne', {
+    var ne = moment.defineLocale('ne', {
         months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
         monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
         weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
-        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split('_'),
+        weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'Aको h:mm बजे',
             LTS : 'Aको h:mm:ss बजे',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, Aको h:mm बजे',
+            LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'
         },
         preparse: function (string) {
             return string.replace(/[१२३४५६७८९०]/g, function (match) {
                 return symbolMap[match];
             });
         },
+        meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'राति') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'बिहान') {
+                return hour;
+            } else if (meridiem === 'दिउँसो') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'साँझ') {
+                return hour + 12;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 3) {
-                return 'रातà¥\80';
-            } else if (hour < 10) {
+                return 'राति';
+            } else if (hour < 12) {
                 return 'बिहान';
-            } else if (hour < 15) {
+            } else if (hour < 16) {
                 return 'दिउँसो';
-            } else if (hour < 18) {
-                return 'बेलुका';
             } else if (hour < 20) {
                 return 'साँझ';
             } else {
-                return 'रातà¥\80';
+                return 'राति';
             }
         },
         calendar : {
             sameDay : '[आज] LT',
-            nextDay : '[भà¥\8bलà¥\80] LT',
+            nextDay : '[भà¥\8bलि] LT',
             nextWeek : '[आउँदो] dddd[,] LT',
             lastDay : '[हिजो] LT',
             lastWeek : '[गएको] dddd[,] LT',
@@ -87,8 +99,8 @@
         },
         relativeTime : {
             future : '%sमा',
-            past : '%s à¤\85à¤\97ाडà¥\80',
-            s : 'à¤\95à¥\87हà¥\80 à¤¸à¤®à¤¯',
+            past : '%s à¤\85à¤\97ाडि',
+            s : 'à¤\95à¥\87हà¥\80 à¤\95à¥\8dषण',
             m : 'एक मिनेट',
             mm : '%d मिनेट',
             h : 'एक घण्टा',
             yy : '%d बर्ष'
         },
         week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ne;
+
+}));
\ No newline at end of file
index 871760d..9374101 100644 (file)
@@ -1,22 +1,23 @@
-// moment.js locale configuration
-// locale : dutch (nl)
-// author : Joris Röling : https://github.com/jjupiter
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
         monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
 
-    return moment.defineLocale('nl', {
+    var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+    var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+    var nl = moment.defineLocale('nl', {
         months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
         monthsShort : function (m, format) {
             if (/-MMM-/.test(format)) {
                 return monthsShortWithDots[m.month()];
             }
         },
+
+        monthsRegex: monthsRegex,
+        monthsShortRegex: monthsRegex,
+        monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+        monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+        monthsParse : monthsParse,
+        longMonthsParse : monthsParse,
+        shortMonthsParse : monthsParse,
+
         weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
         weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
         weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD-MM-YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[vandaag om] LT',
@@ -68,4 +80,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return nl;
+
+}));
\ No newline at end of file
index de8deff..cb3307d 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : norwegian nynorsk (nn)
-// author : https://github.com/mechuwind
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('nn', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var nn = moment.defineLocale('nn', {
         months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
         monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
         weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
         weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
-            LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY [kl.] H:mm',
+            LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
         },
         calendar : {
             sameDay: '[I dag klokka] LT',
@@ -37,7 +34,7 @@
         },
         relativeTime : {
             future : 'om %s',
-            past : 'for %s sidan',
+            past : '%s sidan',
             s : 'nokre sekund',
             m : 'eit minutt',
             mm : '%d minutt',
@@ -57,4 +54,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return nn;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/pa-in.js b/resources/lib/moment/locale/pa-in.js
new file mode 100644 (file)
index 0000000..595174f
--- /dev/null
@@ -0,0 +1,124 @@
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var symbolMap = {
+        '1': '੧',
+        '2': '੨',
+        '3': '੩',
+        '4': '੪',
+        '5': '੫',
+        '6': '੬',
+        '7': '੭',
+        '8': '੮',
+        '9': '੯',
+        '0': '੦'
+    },
+    numberMap = {
+        '੧': '1',
+        '੨': '2',
+        '੩': '3',
+        '੪': '4',
+        '੫': '5',
+        '੬': '6',
+        '੭': '7',
+        '੮': '8',
+        '੯': '9',
+        '੦': '0'
+    };
+
+    var pa_in = moment.defineLocale('pa-in', {
+        // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+        months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+        monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+        weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),
+        weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+        weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm ਵਜੇ',
+            LTS : 'A h:mm:ss ਵਜੇ',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'
+        },
+        calendar : {
+            sameDay : '[ਅਜ] LT',
+            nextDay : '[ਕਲ] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[ਕਲ] LT',
+            lastWeek : '[ਪਿਛਲੇ] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s ਵਿੱਚ',
+            past : '%s ਪਿਛਲੇ',
+            s : 'ਕੁਝ ਸਕਿੰਟ',
+            m : 'ਇਕ ਮਿੰਟ',
+            mm : '%d ਮਿੰਟ',
+            h : 'ਇੱਕ ਘੰਟਾ',
+            hh : '%d ਘੰਟੇ',
+            d : 'ਇੱਕ ਦਿਨ',
+            dd : '%d ਦਿਨ',
+            M : 'ਇੱਕ ਮਹੀਨਾ',
+            MM : '%d ਮਹੀਨੇ',
+            y : 'ਇੱਕ ਸਾਲ',
+            yy : '%d ਸਾਲ'
+        },
+        preparse: function (string) {
+            return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+        meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'ਰਾਤ') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'ਸਵੇਰ') {
+                return hour;
+            } else if (meridiem === 'ਦੁਪਹਿਰ') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'ਸ਼ਾਮ') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'ਰਾਤ';
+            } else if (hour < 10) {
+                return 'ਸਵੇਰ';
+            } else if (hour < 17) {
+                return 'ਦੁਪਹਿਰ';
+            } else if (hour < 20) {
+                return 'ਸ਼ਾਮ';
+            } else {
+                return 'ਰਾਤ';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return pa_in;
+
+}));
\ No newline at end of file
index 167b4b4..0a861d1 100644 (file)
@@ -1,46 +1,46 @@
-// moment.js locale configuration
-// locale : polish (pl)
-// author : Rafal Hirsz : https://github.com/evoL
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),
         monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
-
     function plural(n) {
         return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
     }
-
     function translate(number, withoutSuffix, key) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'minuta' : 'minutę';
-        case 'mm':
-            return result + (plural(number) ? 'minuty' : 'minut');
-        case 'h':
-            return withoutSuffix  ? 'godzina'  : 'godzinę';
-        case 'hh':
-            return result + (plural(number) ? 'godziny' : 'godzin');
-        case 'MM':
-            return result + (plural(number) ? 'miesiące' : 'miesięcy');
-        case 'yy':
-            return result + (plural(number) ? 'lata' : 'lat');
+            case 'm':
+                return withoutSuffix ? 'minuta' : 'minutę';
+            case 'mm':
+                return result + (plural(number) ? 'minuty' : 'minut');
+            case 'h':
+                return withoutSuffix  ? 'godzina'  : 'godzinę';
+            case 'hh':
+                return result + (plural(number) ? 'godziny' : 'godzin');
+            case 'MM':
+                return result + (plural(number) ? 'miesiące' : 'miesięcy');
+            case 'yy':
+                return result + (plural(number) ? 'lata' : 'lat');
         }
     }
 
-    return moment.defineLocale('pl', {
+    var pl = moment.defineLocale('pl', {
         months : function (momentToFormat, format) {
-            if (/D MMMM/.test(format)) {
+            if (format === '') {
+                // Hack: if format empty we know this is used to generate
+                // RegExp by moment. Give then back both valid forms of months
+                // in RegExp ready format.
+                return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';
+            } else if (/D MMMM/.test(format)) {
                 return monthsSubjective[momentToFormat.month()];
             } else {
                 return monthsNominative[momentToFormat.month()];
         monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
         weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
         weekdaysShort : 'nie_pon_wt_śr_czw_pt_sb'.split('_'),
-        weekdaysMin : 'N_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+        weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Dziś o] LT',
             lastDay: '[Wczoraj o] LT',
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[W zeszłą niedzielę o] LT';
-                case 3:
-                    return '[W zeszłą środę o] LT';
-                case 6:
-                    return '[W zeszłą sobotę o] LT';
-                default:
-                    return '[W zeszły] dddd [o] LT';
+                    case 0:
+                        return '[W zeszłą niedzielę o] LT';
+                    case 3:
+                        return '[W zeszłą środę o] LT';
+                    case 6:
+                        return '[W zeszłą sobotę o] LT';
+                    default:
+                        return '[W zeszły] dddd [o] LT';
                 }
             },
             sameElse: 'L'
@@ -99,4 +99,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return pl;
+
+}));
\ No newline at end of file
index 0c5d2c2..3227205 100644 (file)
@@ -1,31 +1,29 @@
-// moment.js locale configuration
-// locale : brazilian portuguese (pt-br)
-// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('pt-br', {
-        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
-        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
-        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
-        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
-        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var pt_br = moment.defineLocale('pt-br', {
+        months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+        monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+        weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
+        weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+        weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
-            LLL : 'D [de] MMMM [de] YYYY [às] LT',
-            LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT'
+            LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
         },
         calendar : {
             sameDay: '[Hoje às] LT',
@@ -42,7 +40,7 @@
         relativeTime : {
             future : 'em %s',
             past : '%s atrás',
-            s : 'segundos',
+            s : 'poucos segundos',
             m : 'um minuto',
             mm : '%d minutos',
             h : 'uma hora',
@@ -57,4 +55,7 @@
         ordinalParse: /\d{1,2}º/,
         ordinal : '%dº'
     });
-}));
+
+    return pt_br;
+
+}));
\ No newline at end of file
index ef9cb80..72c2a1b 100644 (file)
@@ -1,31 +1,29 @@
-// moment.js locale configuration
-// locale : portuguese (pt)
-// author : Jefferson : https://github.com/jalex79
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('pt', {
-        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
-        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
-        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
-        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
-        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var pt = moment.defineLocale('pt', {
+        months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+        monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+        weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+        weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+        weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
-            LLL : 'D [de] MMMM [de] YYYY LT',
-            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
+            LLL : 'D [de] MMMM [de] YYYY HH:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Hoje às] LT',
@@ -61,4 +59,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return pt;
+
+}));
\ No newline at end of file
index 7b2c93d..78b325a 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : romanian (ro)
-// author : Vlad Gurdiga : https://github.com/gurdiga
-// author : Valentin Agachi : https://github.com/avaly
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
                 'mm': 'minute',
         if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
             separator = ' de ';
         }
-
         return number + separator + format[key];
     }
 
-    return moment.defineLocale('ro', {
+    var ro = moment.defineLocale('ro', {
         months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
         monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
         weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
         weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY H:mm',
@@ -72,4 +69,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ro;
+
+}));
\ No newline at end of file
index 65265da..faa3cc2 100644 (file)
@@ -1,24 +1,21 @@
-// moment.js locale configuration
-// locale : russian (ru)
-// author : Viktorminator : https://github.com/Viktorminator
-// Author : Menelion Elensúle : https://github.com/Oire
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(word, num) {
         var forms = word.split('_');
         return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
             'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
             return number + ' ' + plural(format[key], +number);
         }
     }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
-            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
+    var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];
+
+    // http://new.gramota.ru/spravka/rules/139-prop : § 103
+    // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+    // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+    var ru = moment.defineLocale('ru', {
+        months : {
+            format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),
+            standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')
         },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = {
-            'nominative': 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
-            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
+        monthsShort : {
+            // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+            format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),
+            standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')
         },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return monthsShort[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
-            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
+        weekdays : {
+            standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+            format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),
+            isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/
         },
+        weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+        weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+        monthsParse : monthsParse,
+        longMonthsParse : monthsParse,
+        shortMonthsParse : monthsParse,
 
-        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/).test(format) ?
-            'accusative' :
-            'nominative';
+        // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+        monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
 
-        return weekdays[nounCase][m.day()];
-    }
+        // копия предыдущего
+        monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
 
-    return moment.defineLocale('ru', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
-        weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
-        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
+        // полные названия с падежами
+        monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+
+        // Выражение, которое соотвествует только сокращённым формам
+        monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY г.',
-            LLL : 'D MMMM YYYY г., LT',
-            LLLL : 'dddd, D MMMM YYYY г., LT'
+            LLL : 'D MMMM YYYY г., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY г., HH:mm'
         },
         calendar : {
             sameDay: '[Сегодня в] LT',
             nextDay: '[Завтра в] LT',
             lastDay: '[Вчера в] LT',
-            nextWeek: function () {
-                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
+            nextWeek: function (now) {
+                if (now.week() !== this.week()) {
+                    switch (this.day()) {
+                        case 0:
+                            return '[В следующее] dddd [в] LT';
+                        case 1:
+                        case 2:
+                        case 4:
+                            return '[В следующий] dddd [в] LT';
+                        case 3:
+                        case 5:
+                        case 6:
+                            return '[В следующую] dddd [в] LT';
+                    }
+                } else {
+                    if (this.day() === 2) {
+                        return '[Во] dddd [в] LT';
+                    } else {
+                        return '[В] dddd [в] LT';
+                    }
+                }
             },
             lastWeek: function (now) {
                 if (now.week() !== this.week()) {
                     switch (this.day()) {
-                    case 0:
-                        return '[В прошлое] dddd [в] LT';
-                    case 1:
-                    case 2:
-                    case 4:
-                        return '[В прошлый] dddd [в] LT';
-                    case 3:
-                    case 5:
-                    case 6:
-                        return '[В прошлую] dddd [в] LT';
+                        case 0:
+                            return '[В прошлое] dddd [в] LT';
+                        case 1:
+                        case 2:
+                        case 4:
+                            return '[В прошлый] dddd [в] LT';
+                        case 3:
+                        case 5:
+                        case 6:
+                            return '[В прошлую] dddd [в] LT';
                     }
                 } else {
                     if (this.day() === 2) {
             y : 'год',
             yy : relativeTimeWithPlural
         },
-
         meridiemParse: /ночи|утра|дня|вечера/i,
         isPM : function (input) {
             return /^(дня|вечера)$/.test(input);
         },
-
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'ночи';
                 return 'вечера';
             }
         },
-
         ordinalParse: /\d{1,2}-(й|го|я)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            case 'w':
-            case 'W':
-                return number + '-я';
-            default:
-                return number;
+                case 'M':
+                case 'd':
+                case 'DDD':
+                    return number + '-й';
+                case 'D':
+                    return number + '-го';
+                case 'w':
+                case 'W':
+                    return number + '-я';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ru;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/se.js b/resources/lib/moment/locale/se.js
new file mode 100644 (file)
index 0000000..4ed6afb
--- /dev/null
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+
+    var se = moment.defineLocale('se', {
+        months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),
+        monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
+        weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),
+        weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
+        weekdaysMin : 's_v_m_g_d_b_L'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'MMMM D. [b.] YYYY',
+            LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',
+            LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'
+        },
+        calendar : {
+            sameDay: '[otne ti] LT',
+            nextDay: '[ihttin ti] LT',
+            nextWeek: 'dddd [ti] LT',
+            lastDay: '[ikte ti] LT',
+            lastWeek: '[ovddit] dddd [ti] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : '%s geažes',
+            past : 'maŋit %s',
+            s : 'moadde sekunddat',
+            m : 'okta minuhta',
+            mm : '%d minuhtat',
+            h : 'okta diimmu',
+            hh : '%d diimmut',
+            d : 'okta beaivi',
+            dd : '%d beaivvit',
+            M : 'okta mánnu',
+            MM : '%d mánut',
+            y : 'okta jahki',
+            yy : '%d jagit'
+        },
+        ordinalParse: /\d{1,2}\./,
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return se;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/si.js b/resources/lib/moment/locale/si.js
new file mode 100644 (file)
index 0000000..be2387a
--- /dev/null
@@ -0,0 +1,71 @@
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    /*jshint -W100*/
+    var si = moment.defineLocale('si', {
+        months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),
+        monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),
+        weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+        weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+        weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'a h:mm',
+            LTS : 'a h:mm:ss',
+            L : 'YYYY/MM/DD',
+            LL : 'YYYY MMMM D',
+            LLL : 'YYYY MMMM D, a h:mm',
+            LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'
+        },
+        calendar : {
+            sameDay : '[අද] LT[ට]',
+            nextDay : '[හෙට] LT[ට]',
+            nextWeek : 'dddd LT[ට]',
+            lastDay : '[ඊයේ] LT[ට]',
+            lastWeek : '[පසුගිය] dddd LT[ට]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%sකින්',
+            past : '%sකට පෙර',
+            s : 'තත්පර කිහිපය',
+            m : 'මිනිත්තුව',
+            mm : 'මිනිත්තු %d',
+            h : 'පැය',
+            hh : 'පැය %d',
+            d : 'දිනය',
+            dd : 'දින %d',
+            M : 'මාසය',
+            MM : 'මාස %d',
+            y : 'වසර',
+            yy : 'වසර %d'
+        },
+        ordinalParse: /\d{1,2} වැනි/,
+        ordinal : function (number) {
+            return number + ' වැනි';
+        },
+        meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
+        isPM : function (input) {
+            return input === 'ප.ව.' || input === 'පස් වරු';
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'ප.ව.' : 'පස් වරු';
+            } else {
+                return isLower ? 'පෙ.ව.' : 'පෙර වරු';
+            }
+        }
+    });
+
+    return si;
+
+}));
\ No newline at end of file
index 7eae2f4..582ae7e 100644 (file)
-// moment.js locale configuration
-// locale : slovak (sk)
-// author : Martin Minka : https://github.com/k2s
-// based on work of petrbela : https://github.com/petrbela
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
         monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
-
     function plural(n) {
         return (n > 1) && (n < 5);
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minúty' : 'minút');
-            } else {
-                return result + 'minútami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodín');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dni' : 'dní');
-            } else {
-                return result + 'dňami';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'mesiace' : 'mesiacov');
-            } else {
-                return result + 'mesiacmi';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'rokov');
-            } else {
-                return result + 'rokmi';
-            }
-            break;
+            case 's':  // a few seconds / in a few seconds / a few seconds ago
+                return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+            case 'm':  // a minute / in a minute / a minute ago
+                return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'minúty' : 'minút');
+                } else {
+                    return result + 'minútami';
+                }
+                break;
+            case 'h':  // an hour / in an hour / an hour ago
+                return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+            case 'hh': // 9 hours / in 9 hours / 9 hours ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'hodiny' : 'hodín');
+                } else {
+                    return result + 'hodinami';
+                }
+                break;
+            case 'd':  // a day / in a day / a day ago
+                return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+            case 'dd': // 9 days / in 9 days / 9 days ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'dni' : 'dní');
+                } else {
+                    return result + 'dňami';
+                }
+                break;
+            case 'M':  // a month / in a month / a month ago
+                return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+            case 'MM': // 9 months / in 9 months / 9 months ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'mesiace' : 'mesiacov');
+                } else {
+                    return result + 'mesiacmi';
+                }
+                break;
+            case 'y':  // a year / in a year / a year ago
+                return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+            case 'yy': // 9 years / in 9 years / 9 years ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'roky' : 'rokov');
+                } else {
+                    return result + 'rokmi';
+                }
+                break;
         }
     }
 
-    return moment.defineLocale('sk', {
+    var sk = moment.defineLocale('sk', {
         months : months,
         monthsShort : monthsShort,
-        monthsParse : (function (months, monthsShort) {
-            var i, _monthsParse = [];
-            for (i = 0; i < 12; i++) {
-                // use custom parser to solve problem with July (červenec)
-                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
-            }
-            return _monthsParse;
-        }(months, monthsShort)),
         weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
         weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
         weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
         longDateFormat : {
             LT: 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay: '[dnes o] LT',
             nextDay: '[zajtra o] LT',
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[v nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [o] LT';
-                case 3:
-                    return '[v stredu o] LT';
-                case 4:
-                    return '[vo štvrtok o] LT';
-                case 5:
-                    return '[v piatok o] LT';
-                case 6:
-                    return '[v sobotu o] LT';
+                    case 0:
+                        return '[v nedeľu o] LT';
+                    case 1:
+                    case 2:
+                        return '[v] dddd [o] LT';
+                    case 3:
+                        return '[v stredu o] LT';
+                    case 4:
+                        return '[vo štvrtok o] LT';
+                    case 5:
+                        return '[v piatok o] LT';
+                    case 6:
+                        return '[v sobotu o] LT';
                 }
             },
             lastDay: '[včera o] LT',
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[minulú nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[minulý] dddd [o] LT';
-                case 3:
-                    return '[minulú stredu o] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [o] LT';
-                case 6:
-                    return '[minulú sobotu o] LT';
+                    case 0:
+                        return '[minulú nedeľu o] LT';
+                    case 1:
+                    case 2:
+                        return '[minulý] dddd [o] LT';
+                    case 3:
+                        return '[minulú stredu o] LT';
+                    case 4:
+                    case 5:
+                        return '[minulý] dddd [o] LT';
+                    case 6:
+                        return '[minulú sobotu o] LT';
                 }
             },
             sameElse: 'L'
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return sk;
+
+}));
\ No newline at end of file
index 54fe37d..3371f6b 100644 (file)
-// moment.js locale configuration
-// locale : slovenian (sl)
-// author : Robert Sedovšek : https://github.com/sedovsek
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    function translate(number, withoutSuffix, key) {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'ena minuta' : 'eno minuto';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2) {
-                result += 'minuti';
-            } else if (number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minut';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'ena ura' : 'eno uro';
-        case 'hh':
-            if (number === 1) {
-                result += 'ura';
-            } else if (number === 2) {
-                result += 'uri';
-            } else if (number === 3 || number === 4) {
-                result += 'ure';
-            } else {
-                result += 'ur';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dni';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mesec';
-            } else if (number === 2) {
-                result += 'meseca';
-            } else if (number === 3 || number === 4) {
-                result += 'mesece';
-            } else {
-                result += 'mesecev';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'leto';
-            } else if (number === 2) {
-                result += 'leti';
-            } else if (number === 3 || number === 4) {
-                result += 'leta';
-            } else {
-                result += 'let';
-            }
-            return result;
+            case 's':
+                return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
+            case 'm':
+                return withoutSuffix ? 'ena minuta' : 'eno minuto';
+            case 'mm':
+                if (number === 1) {
+                    result += withoutSuffix ? 'minuta' : 'minuto';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'minute' : 'minutami';
+                } else {
+                    result += withoutSuffix || isFuture ? 'minut' : 'minutami';
+                }
+                return result;
+            case 'h':
+                return withoutSuffix ? 'ena ura' : 'eno uro';
+            case 'hh':
+                if (number === 1) {
+                    result += withoutSuffix ? 'ura' : 'uro';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'uri' : 'urama';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'ure' : 'urami';
+                } else {
+                    result += withoutSuffix || isFuture ? 'ur' : 'urami';
+                }
+                return result;
+            case 'd':
+                return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
+            case 'dd':
+                if (number === 1) {
+                    result += withoutSuffix || isFuture ? 'dan' : 'dnem';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
+                } else {
+                    result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
+                }
+                return result;
+            case 'M':
+                return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
+            case 'MM':
+                if (number === 1) {
+                    result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
+                } else {
+                    result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
+                }
+                return result;
+            case 'y':
+                return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
+            case 'yy':
+                if (number === 1) {
+                    result += withoutSuffix || isFuture ? 'leto' : 'letom';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'leti' : 'letoma';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'leta' : 'leti';
+                } else {
+                    result += withoutSuffix || isFuture ? 'let' : 'leti';
+                }
+                return result;
         }
     }
 
-    return moment.defineLocale('sl', {
+    var sl = moment.defineLocale('sl', {
         months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
         monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
         weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
         weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[danes ob] LT',
 
             nextWeek : function () {
                 switch (this.day()) {
-                case 0:
-                    return '[v] [nedeljo] [ob] LT';
-                case 3:
-                    return '[v] [sredo] [ob] LT';
-                case 6:
-                    return '[v] [soboto] [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[v] dddd [ob] LT';
+                    case 0:
+                        return '[v] [nedeljo] [ob] LT';
+                    case 3:
+                        return '[v] [sredo] [ob] LT';
+                    case 6:
+                        return '[v] [soboto] [ob] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[v] dddd [ob] LT';
                 }
             },
             lastDay  : '[včeraj ob] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[prejšnja] dddd [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prejšnji] dddd [ob] LT';
+                    case 0:
+                        return '[prejšnjo] [nedeljo] [ob] LT';
+                    case 3:
+                        return '[prejšnjo] [sredo] [ob] LT';
+                    case 6:
+                        return '[prejšnjo] [soboto] [ob] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[prejšnji] dddd [ob] LT';
                 }
             },
             sameElse : 'L'
         },
         relativeTime : {
             future : 'čez %s',
-            past   : '%s nazaj',
-            s      : 'nekaj sekund',
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : 'en dan',
-            dd     : translate,
-            M      : 'en mesec',
-            MM     : translate,
-            y      : 'eno leto',
-            yy     : translate
+            past   : 'pred %s',
+            s      : processRelativeTime,
+            m      : processRelativeTime,
+            mm     : processRelativeTime,
+            h      : processRelativeTime,
+            hh     : processRelativeTime,
+            d      : processRelativeTime,
+            dd     : processRelativeTime,
+            M      : processRelativeTime,
+            MM     : processRelativeTime,
+            y      : processRelativeTime,
+            yy     : processRelativeTime
         },
         ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return sl;
+
+}));
\ No newline at end of file
index 89cd7ba..c224cac 100644 (file)
@@ -1,36 +1,38 @@
-// moment.js locale configuration
-// locale : Albanian (sq)
-// author : Flakërim Ismani : https://github.com/flakerimi
-// author: Menelion Elensúle: https://github.com/Oire (tests)
-// author : Oerd Cukalla : https://github.com/oerd (fixes)
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('sq', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var sq = moment.defineLocale('sq', {
         months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
         monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
         weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
         weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
         weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+        weekdaysParseExact : true,
+        meridiemParse: /PD|MD/,
+        isPM: function (input) {
+            return input.charAt(0) === 'M';
+        },
         meridiem : function (hours, minutes, isLower) {
             return hours < 12 ? 'PD' : 'MD';
         },
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Sot në] LT',
@@ -62,4 +64,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return sq;
+
+}));
\ No newline at end of file
index db1dea4..bf0df12 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Serbian-cyrillic (sr-cyrl)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var translator = {
         words: { //Different grammatical cases
             m: ['један минут', 'једне минуте'],
         }
     };
 
-    return moment.defineLocale('sr-cyrl', {
-        months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],
-        monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'],
-        weekdays: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],
-        weekdaysShort: ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'],
-        weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
+    var sr_cyrl = moment.defineLocale('sr-cyrl', {
+        months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),
+        monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
+        monthsParseExact: true,
+        weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
+        weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
+        weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat: {
             LT: 'H:mm',
-            LTS : 'LT:ss',
-            L: 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L: 'DD.MM.YYYY',
             LL: 'D. MMMM YYYY',
-            LLL: 'D. MMMM YYYY LT',
-            LLLL: 'dddd, D. MMMM YYYY LT'
+            LLL: 'D. MMMM YYYY H:mm',
+            LLLL: 'dddd, D. MMMM YYYY H:mm'
         },
         calendar: {
             sameDay: '[данас у] LT',
             nextDay: '[сутра у] LT',
-
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[у] [недељу] [у] LT';
-                case 3:
-                    return '[у] [среду] [у] LT';
-                case 6:
-                    return '[у] [суботу] [у] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[у] dddd [у] LT';
+                    case 0:
+                        return '[у] [недељу] [у] LT';
+                    case 3:
+                        return '[у] [среду] [у] LT';
+                    case 6:
+                        return '[у] [суботу] [у] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[у] dddd [у] LT';
                 }
             },
             lastDay  : '[јуче у] LT',
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return sr_cyrl;
+
+}));
\ No newline at end of file
index f732316..16f5dd0 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Serbian-latin (sr)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var translator = {
         words: { //Different grammatical cases
             m: ['jedan minut', 'jedne minute'],
         }
     };
 
-    return moment.defineLocale('sr', {
-        months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],
-        monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],
-        weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],
-        weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'],
-        weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
+    var sr = moment.defineLocale('sr', {
+        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+        monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+        monthsParseExact: true,
+        weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),
+        weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
+        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat: {
             LT: 'H:mm',
-            LTS : 'LT:ss',
-            L: 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L: 'DD.MM.YYYY',
             LL: 'D. MMMM YYYY',
-            LLL: 'D. MMMM YYYY LT',
-            LLLL: 'dddd, D. MMMM YYYY LT'
+            LLL: 'D. MMMM YYYY H:mm',
+            LLLL: 'dddd, D. MMMM YYYY H:mm'
         },
         calendar: {
             sameDay: '[danas u] LT',
             nextDay: '[sutra u] LT',
-
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[u] [nedelju] [u] LT';
-                case 3:
-                    return '[u] [sredu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
+                    case 0:
+                        return '[u] [nedelju] [u] LT';
+                    case 3:
+                        return '[u] [sredu] [u] LT';
+                    case 6:
+                        return '[u] [subotu] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[u] dddd [u] LT';
                 }
             },
             lastDay  : '[juče u] LT',
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return sr;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ss.js b/resources/lib/moment/locale/ss.js
new file mode 100644 (file)
index 0000000..e1d942e
--- /dev/null
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+
+    var ss = moment.defineLocale('ss', {
+        months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'),
+        monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
+        weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),
+        weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
+        weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'h:mm A',
+            LTS : 'h:mm:ss A',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
+        },
+        calendar : {
+            sameDay : '[Namuhla nga] LT',
+            nextDay : '[Kusasa nga] LT',
+            nextWeek : 'dddd [nga] LT',
+            lastDay : '[Itolo nga] LT',
+            lastWeek : 'dddd [leliphelile] [nga] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'nga %s',
+            past : 'wenteka nga %s',
+            s : 'emizuzwana lomcane',
+            m : 'umzuzu',
+            mm : '%d emizuzu',
+            h : 'lihora',
+            hh : '%d emahora',
+            d : 'lilanga',
+            dd : '%d emalanga',
+            M : 'inyanga',
+            MM : '%d tinyanga',
+            y : 'umnyaka',
+            yy : '%d iminyaka'
+        },
+        meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'ekuseni';
+            } else if (hours < 15) {
+                return 'emini';
+            } else if (hours < 19) {
+                return 'entsambama';
+            } else {
+                return 'ebusuku';
+            }
+        },
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'ekuseni') {
+                return hour;
+            } else if (meridiem === 'emini') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
+                if (hour === 0) {
+                    return 0;
+                }
+                return hour + 12;
+            }
+        },
+        ordinalParse: /\d{1,2}/,
+        ordinal : '%d',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return ss;
+
+}));
\ No newline at end of file
index 48c3dee..a77c3e1 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : swedish (sv)
-// author : Jens Alm : https://github.com/ulmus
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('sv', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var sv = moment.defineLocale('sv', {
         months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
         weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
         weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY [kl.] HH:mm',
+            LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',
+            lll : 'D MMM YYYY HH:mm',
+            llll : 'ddd D MMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Idag] LT',
             nextDay: '[Imorgon] LT',
             lastDay: '[Igår] LT',
-            nextWeek: 'dddd LT',
-            lastWeek: '[Förra] dddd[en] LT',
+            nextWeek: '[På] dddd LT',
+            lastWeek: '[I] dddd[s] LT',
             sameElse: 'L'
         },
         relativeTime : {
@@ -64,4 +63,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return sv;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/sw.js b/resources/lib/moment/locale/sw.js
new file mode 100644 (file)
index 0000000..1458d89
--- /dev/null
@@ -0,0 +1,59 @@
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var sw = moment.defineLocale('sw', {
+        months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),
+        monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
+        weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),
+        weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
+        weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[leo saa] LT',
+            nextDay : '[kesho saa] LT',
+            nextWeek : '[wiki ijayo] dddd [saat] LT',
+            lastDay : '[jana] LT',
+            lastWeek : '[wiki iliyopita] dddd [saat] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s baadaye',
+            past : 'tokea %s',
+            s : 'hivi punde',
+            m : 'dakika moja',
+            mm : 'dakika %d',
+            h : 'saa limoja',
+            hh : 'masaa %d',
+            d : 'siku moja',
+            dd : 'masiku %d',
+            M : 'mwezi mmoja',
+            MM : 'miezi %d',
+            y : 'mwaka mmoja',
+            yy : 'miaka %d'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return sw;
+
+}));
\ No newline at end of file
index 7e73599..c04fa58 100644 (file)
@@ -1,44 +1,40 @@
-// moment.js locale configuration
-// locale : tamil (ta)
-// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    /*var symbolMap = {
-            '1': '௧',
-            '2': '௨',
-            '3': '௩',
-            '4': '௪',
-            '5': '௫',
-            '6': '௬',
-            '7': '௭',
-            '8': '௮',
-            '9': '௯',
-            '0': '௦'
-        },
-        numberMap = {
-            '௧': '1',
-            '௨': '2',
-            '௩': '3',
-            '௪': '4',
-            '௫': '5',
-            '௬': '6',
-            '௭': '7',
-            '௮': '8',
-            '௯': '9',
-            '௦': '0'
-        }; */
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var symbolMap = {
+        '1': '௧',
+        '2': '௨',
+        '3': '௩',
+        '4': '௪',
+        '5': '௫',
+        '6': '௬',
+        '7': '௭',
+        '8': '௮',
+        '9': '௯',
+        '0': '௦'
+    }, numberMap = {
+        '௧': '1',
+        '௨': '2',
+        '௩': '3',
+        '௪': '4',
+        '௫': '5',
+        '௬': '6',
+        '௭': '7',
+        '௮': '8',
+        '௯': '9',
+        '௦': '0'
+    };
 
-    return moment.defineLocale('ta', {
+    var ta = moment.defineLocale('ta', {
         months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
         monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
         weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
         weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, HH:mm',
+            LLLL : 'dddd, D MMMM YYYY, HH:mm'
         },
         calendar : {
             sameDay : '[இன்று] LT',
             y : 'ஒரு வருடம்',
             yy : '%d ஆண்டுகள்'
         },
-/*        preparse: function (string) {
+        ordinalParse: /\d{1,2}வது/,
+        ordinal : function (number) {
+            return number + 'வது';
+        },
+        preparse: function (string) {
             return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
                 return numberMap[match];
             });
             return string.replace(/\d/g, function (match) {
                 return symbolMap[match];
             });
-        },*/
-        ordinalParse: /\d{1,2}வது/,
-        ordinal : function (number) {
-            return number + 'வது';
         },
-
-
         // refer http://ta.wikipedia.org/s/1er1
-
+        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
         meridiem : function (hour, minute, isLower) {
-            if (hour >= 6 && hour <= 10) {
-                return ' காலை';
-            } else if (hour >= 10 && hour <= 14) {
-                return ' நண்பகல்';
-            } else if (hour >= 14 && hour <= 18) {
-                return ' எற்பாடு';
-            } else if (hour >= 18 && hour <= 20) {
-                return ' மாலை';
-            } else if (hour >= 20 && hour <= 24) {
-                return ' இரவு';
-            } else if (hour >= 0 && hour <= 6) {
-                return ' வைகறை';
+            if (hour < 2) {
+                return ' யாமம்';
+            } else if (hour < 6) {
+                return ' வைகறை';  // வைகறை
+            } else if (hour < 10) {
+                return ' காலை'; // காலை
+            } else if (hour < 14) {
+                return ' நண்பகல்'; // நண்பகல்
+            } else if (hour < 18) {
+                return ' எற்பாடு'; // எற்பாடு
+            } else if (hour < 22) {
+                return ' மாலை'; // மாலை
+            } else {
+                return ' யாமம்';
+            }
+        },
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'யாமம்') {
+                return hour < 2 ? hour : hour + 12;
+            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
+                return hour;
+            } else if (meridiem === 'நண்பகல்') {
+                return hour >= 10 ? hour : hour + 12;
+            } else {
+                return hour + 12;
             }
         },
         week : {
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ta;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/te.js b/resources/lib/moment/locale/te.js
new file mode 100644 (file)
index 0000000..1061ad2
--- /dev/null
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var te = moment.defineLocale('te', {
+        months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),
+        monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),
+        monthsParseExact : true,
+        weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),
+        weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
+        weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm',
+            LTS : 'A h:mm:ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, A h:mm',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm'
+        },
+        calendar : {
+            sameDay : '[నేడు] LT',
+            nextDay : '[రేపు] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[నిన్న] LT',
+            lastWeek : '[గత] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s లో',
+            past : '%s క్రితం',
+            s : 'కొన్ని క్షణాలు',
+            m : 'ఒక నిమిషం',
+            mm : '%d నిమిషాలు',
+            h : 'ఒక గంట',
+            hh : '%d గంటలు',
+            d : 'ఒక రోజు',
+            dd : '%d రోజులు',
+            M : 'ఒక నెల',
+            MM : '%d నెలలు',
+            y : 'ఒక సంవత్సరం',
+            yy : '%d సంవత్సరాలు'
+        },
+        ordinalParse : /\d{1,2}వ/,
+        ordinal : '%dవ',
+        meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'రాత్రి') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'ఉదయం') {
+                return hour;
+            } else if (meridiem === 'మధ్యాహ్నం') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'సాయంత్రం') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'రాత్రి';
+            } else if (hour < 10) {
+                return 'ఉదయం';
+            } else if (hour < 17) {
+                return 'మధ్యాహ్నం';
+            } else if (hour < 20) {
+                return 'సాయంత్రం';
+            } else {
+                return 'రాత్రి';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return te;
+
+}));
\ No newline at end of file
index fc949cb..779968e 100644 (file)
@@ -1,31 +1,34 @@
-// moment.js locale configuration
-// locale : thai (th)
-// author : Kridsada Thanabulpong : https://github.com/sirn
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('th', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var th = moment.defineLocale('th', {
         months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
-        monthsShort : 'มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา'.split('_'),
+        monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
         weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
         weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
-            LT : 'H นาฬิกา m นาที',
-            LTS : 'LT s วินาที',
+            LT : 'H:mm',
+            LTS : 'H:mm:ss',
             L : 'YYYY/MM/DD',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY เวลา LT',
-            LLLL : 'วันddddที่ D MMMM YYYY เวลา LT'
+            LLL : 'D MMMM YYYY เวลา H:mm',
+            LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'
+        },
+        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
+        isPM: function (input) {
+            return input === 'หลังเที่ยง';
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
@@ -58,4 +61,7 @@
             yy : '%d ปี'
         }
     });
-}));
+
+    return th;
+
+}));
\ No newline at end of file
index 910c681..8c3448c 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : Tagalog/Filipino (tl-ph)
-// author : Dan Hagman
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('tl-ph', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var tl_ph = moment.defineLocale('tl-ph', {
         months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
         monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
         weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
         weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'MM/D/YYYY',
             LL : 'MMMM D, YYYY',
-            LLL : 'MMMM D, YYYY LT',
-            LLLL : 'dddd, MMMM DD, YYYY LT'
+            LLL : 'MMMM D, YYYY HH:mm',
+            LLLL : 'dddd, MMMM DD, YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Ngayon sa] LT',
@@ -59,4 +56,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return tl_ph;
+
+}));
\ No newline at end of file
index a2707bc..c88ed7e 100644 (file)
@@ -1,46 +1,38 @@
-// moment.js locale configuration
-// locale : turkish (tr)
-// authors : Erhan Gundogan : https://github.com/erhangundogan,
-//           Burak Yiğit Kaya: https://github.com/BYK
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//!           Burak Yiğit Kaya: https://github.com/BYK
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var suffixes = {
         1: '\'inci',
         5: '\'inci',
         8: '\'inci',
         70: '\'inci',
         80: '\'inci',
-
         2: '\'nci',
         7: '\'nci',
         20: '\'nci',
         50: '\'nci',
-
         3: '\'üncü',
         4: '\'üncü',
         100: '\'üncü',
-
         6: '\'ncı',
-
         9: '\'uncu',
         10: '\'uncu',
         30: '\'uncu',
-
         60: '\'ıncı',
         90: '\'ıncı'
     };
 
-    return moment.defineLocale('tr', {
+    var tr = moment.defineLocale('tr', {
         months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
         monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
         weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
         weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[bugün saat] LT',
@@ -85,7 +77,6 @@
             var a = number % 10,
                 b = number % 100 - a,
                 c = number >= 100 ? 100 : null;
-
             return number + (suffixes[a] || suffixes[b] || suffixes[c]);
         },
         week : {
@@ -93,4 +84,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return tr;
+
+}));
\ No newline at end of file
index 9eefde5..ccf96b9 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn)
-// author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('tzm-latn', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var tzm_latn = moment.defineLocale('tzm-latn', {
         months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
         monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
         weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
         weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[asdkh g] LT',
@@ -55,4 +52,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return tzm_latn;
+
+}));
\ No newline at end of file
index 0895298..71fb076 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt (tzm)
-// author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('tzm', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var tzm = moment.defineLocale('tzm', {
         months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
         monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
         weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
         weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS: 'LT:ss',
+            LTS: 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
@@ -55,4 +52,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return tzm;
+
+}));
\ No newline at end of file
index 32c51de..91ec18b 100644 (file)
@@ -1,28 +1,24 @@
-// moment.js locale configuration
-// locale : ukrainian (uk)
-// author : zemlanin : https://github.com/zemlanin
-// Author : Menelion Elensúle : https://github.com/Oire
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(word, num) {
         var forms = word.split('_');
         return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
-            'mm': 'хвилина_хвилини_хвилин',
-            'hh': 'година_години_годин',
+            'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
+            'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
             'dd': 'день_дні_днів',
             'MM': 'місяць_місяці_місяців',
             'yy': 'рік_роки_років'
             return number + ' ' + plural(format[key], +number);
         }
     }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
-            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
-        },
-
-        nounCase = (/D[oD]? *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
     function weekdaysCaseReplace(m, format) {
         var weekdays = {
             'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
             'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
             'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
         },
-
         nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
             'accusative' :
             ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
                 'genitive' :
                 'nominative');
-
         return weekdays[nounCase][m.day()];
     }
-
     function processHoursFunction(str) {
         return function () {
             return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
         };
     }
 
-    return moment.defineLocale('uk', {
-        months : monthsCaseReplace,
+    var uk = moment.defineLocale('uk', {
+        months : {
+            'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),
+            'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')
+        },
         monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
         weekdays : weekdaysCaseReplace,
         weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY р.',
-            LLL : 'D MMMM YYYY р., LT',
-            LLLL : 'dddd, D MMMM YYYY р., LT'
+            LLL : 'D MMMM YYYY р., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY р., HH:mm'
         },
         calendar : {
             sameDay: processHoursFunction('[Сьогодні '),
             nextWeek: processHoursFunction('[У] dddd ['),
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 5:
-                case 6:
-                    return processHoursFunction('[Минулої] dddd [').call(this);
-                case 1:
-                case 2:
-                case 4:
-                    return processHoursFunction('[Минулого] dddd [').call(this);
+                    case 0:
+                    case 3:
+                    case 5:
+                    case 6:
+                        return processHoursFunction('[Минулої] dddd [').call(this);
+                    case 1:
+                    case 2:
+                    case 4:
+                        return processHoursFunction('[Минулого] dddd [').call(this);
                 }
             },
             sameElse: 'L'
             y : 'рік',
             yy : relativeTimeWithPlural
         },
-
         // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
+        meridiemParse: /ночі|ранку|дня|вечора/,
+        isPM: function (input) {
+            return /^(дня|вечора)$/.test(input);
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'ночі';
                 return 'вечора';
             }
         },
-
         ordinalParse: /\d{1,2}-(й|го)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-            case 'w':
-            case 'W':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            default:
-                return number;
+                case 'M':
+                case 'd':
+                case 'DDD':
+                case 'w':
+                case 'W':
+                    return number + '-й';
+                case 'D':
+                    return number + '-го';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return uk;
+
+}));
\ No newline at end of file
index db4fc24..3fccde1 100644 (file)
@@ -1,31 +1,28 @@
-// moment.js locale configuration
-// locale : uzbek (uz)
-// author : Sardor Muminov : https://github.com/muminoff
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('uz', {
-        months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var uz = moment.defineLocale('uz', {
+        months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
         monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
         weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
         weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
         weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'D MMMM YYYY, dddd LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'D MMMM YYYY, dddd HH:mm'
         },
         calendar : {
             sameDay : '[Бугун соат] LT [да]',
@@ -55,4 +52,7 @@
             doy : 7  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return uz;
+
+}));
\ No newline at end of file
index 127d064..ba207e9 100644 (file)
@@ -1,35 +1,45 @@
-// moment.js locale configuration
-// locale : vietnamese (vi)
-// author : Bang Nguyen : https://github.com/bangnk
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('vi', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var vi = moment.defineLocale('vi', {
         months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
         monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+        monthsParseExact : true,
         weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
         weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
         weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+        weekdaysParseExact : true,
+        meridiemParse: /sa|ch/i,
+        isPM : function (input) {
+            return /^ch$/i.test(input);
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 12) {
+                return isLower ? 'sa' : 'SA';
+            } else {
+                return isLower ? 'ch' : 'CH';
+            }
+        },
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM [năm] YYYY',
-            LLL : 'D MMMM [năm] YYYY LT',
-            LLLL : 'dddd, D MMMM [năm] YYYY LT',
+            LLL : 'D MMMM [năm] YYYY HH:mm',
+            LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',
             l : 'DD/M/YYYY',
             ll : 'D MMM YYYY',
-            lll : 'D MMM YYYY LT',
-            llll : 'ddd, D MMM YYYY LT'
+            lll : 'D MMM YYYY HH:mm',
+            llll : 'ddd, D MMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Hôm nay lúc] LT',
@@ -63,4 +73,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return vi;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/x-pseudo.js b/resources/lib/moment/locale/x-pseudo.js
new file mode 100644 (file)
index 0000000..f573d4c
--- /dev/null
@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var x_pseudo = moment.defineLocale('x-pseudo', {
+        months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),
+        monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),
+        monthsParseExact : true,
+        weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),
+        weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
+        weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[T~ódá~ý át] LT',
+            nextDay : '[T~ómó~rró~w át] LT',
+            nextWeek : 'dddd [át] LT',
+            lastDay : '[Ý~ést~érdá~ý át] LT',
+            lastWeek : '[L~ást] dddd [át] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'í~ñ %s',
+            past : '%s á~gó',
+            s : 'á ~féw ~sécó~ñds',
+            m : 'á ~míñ~úté',
+            mm : '%d m~íñú~tés',
+            h : 'á~ñ hó~úr',
+            hh : '%d h~óúrs',
+            d : 'á ~dáý',
+            dd : '%d d~áýs',
+            M : 'á ~móñ~th',
+            MM : '%d m~óñt~hs',
+            y : 'á ~ýéár',
+            yy : '%d ý~éárs'
+        },
+        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return x_pseudo;
+
+}));
\ No newline at end of file
index 5b71928..cee6160 100644 (file)
@@ -1,36 +1,48 @@
-// moment.js locale configuration
-// locale : chinese (zh-cn)
-// author : suupic : https://github.com/suupic
-// author : Zeno Zeng : https://github.com/zenozeng
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('zh-cn', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var zh_cn = moment.defineLocale('zh-cn', {
         months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
         monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
         weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
         weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
         longDateFormat : {
-            LT : 'Ah点mm',
+            LT : 'Ah点mm',
             LTS : 'Ah点m分s秒',
             L : 'YYYY-MM-DD',
             LL : 'YYYY年MMMD日',
-            LLL : 'YYYY年MMMD日LT',
-            LLLL : 'YYYY年MMMD日ddddLT',
+            LLL : 'YYYY年MMMD日Ah点mm分',
+            LLLL : 'YYYY年MMMD日ddddAh点mm分',
             l : 'YYYY-MM-DD',
             ll : 'YYYY年MMMD日',
-            lll : 'YYYY年MMMD日LT',
-            llll : 'YYYY年MMMD日ddddLT'
+            lll : 'YYYY年MMMD日Ah点mm分',
+            llll : 'YYYY年MMMD日ddddAh点mm分'
+        },
+        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+        meridiemHour: function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === '凌晨' || meridiem === '早上' ||
+                    meridiem === '上午') {
+                return hour;
+            } else if (meridiem === '下午' || meridiem === '晚上') {
+                return hour + 12;
+            } else {
+                // '中午'
+                return hour >= 11 ? hour : hour + 12;
+            }
         },
         meridiem : function (hour, minute, isLower) {
             var hm = hour * 100 + minute;
@@ -61,7 +73,7 @@
             nextWeek : function () {
                 var startOfWeek, prefix;
                 startOfWeek = moment().startOf('week');
-                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
+                prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]';
                 return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
             },
             lastWeek : function () {
         ordinalParse: /\d{1,2}(日|月|周)/,
         ordinal : function (number, period) {
             switch (period) {
-            case 'd':
-            case 'D':
-            case 'DDD':
-                return number + '日';
-            case 'M':
-                return number + '月';
-            case 'w':
-            case 'W':
-                return number + '周';
-            default:
-                return number;
+                case 'd':
+                case 'D':
+                case 'DDD':
+                    return number + '日';
+                case 'M':
+                    return number + '月';
+                case 'w':
+                case 'W':
+                    return number + '周';
+                default:
+                    return number;
             }
         },
         relativeTime : {
             future : '%s内',
             past : '%s前',
             s : '几秒',
-            m : '1分钟',
-            mm : '%d分钟',
-            h : '1小时',
-            hh : '%d小时',
-            d : '1天',
-            dd : '%d天',
-            M : '1个月',
-            MM : '%d个月',
-            y : '1年',
-            yy : '%d年'
+            m : '1 分钟',
+            mm : '%d 分钟',
+            h : '1 小时',
+            hh : '%d 小时',
+            d : '1 天',
+            dd : '%d 天',
+            M : '1 个月',
+            MM : '%d 个月',
+            y : '1 年',
+            yy : '%d 年'
         },
         week : {
             // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return zh_cn;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/zh-hk.js b/resources/lib/moment/locale/zh-hk.js
new file mode 100644 (file)
index 0000000..d12a260
--- /dev/null
@@ -0,0 +1,105 @@
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var zh_hk = moment.defineLocale('zh-hk', {
+        months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+        weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+        weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+        weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+        longDateFormat : {
+            LT : 'Ah點mm分',
+            LTS : 'Ah點m分s秒',
+            L : 'YYYY年MMMD日',
+            LL : 'YYYY年MMMD日',
+            LLL : 'YYYY年MMMD日Ah點mm分',
+            LLLL : 'YYYY年MMMD日ddddAh點mm分',
+            l : 'YYYY年MMMD日',
+            ll : 'YYYY年MMMD日',
+            lll : 'YYYY年MMMD日Ah點mm分',
+            llll : 'YYYY年MMMD日ddddAh點mm分'
+        },
+        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+                return hour;
+            } else if (meridiem === '中午') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === '下午' || meridiem === '晚上') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 600) {
+                return '凌晨';
+            } else if (hm < 900) {
+                return '早上';
+            } else if (hm < 1130) {
+                return '上午';
+            } else if (hm < 1230) {
+                return '中午';
+            } else if (hm < 1800) {
+                return '下午';
+            } else {
+                return '晚上';
+            }
+        },
+        calendar : {
+            sameDay : '[今天]LT',
+            nextDay : '[明天]LT',
+            nextWeek : '[下]ddddLT',
+            lastDay : '[昨天]LT',
+            lastWeek : '[上]ddddLT',
+            sameElse : 'L'
+        },
+        ordinalParse: /\d{1,2}(日|月|週)/,
+        ordinal : function (number, period) {
+            switch (period) {
+                case 'd' :
+                case 'D' :
+                case 'DDD' :
+                    return number + '日';
+                case 'M' :
+                    return number + '月';
+                case 'w' :
+                case 'W' :
+                    return number + '週';
+                default :
+                    return number;
+            }
+        },
+        relativeTime : {
+            future : '%s內',
+            past : '%s前',
+            s : '幾秒',
+            m : '1 分鐘',
+            mm : '%d 分鐘',
+            h : '1 小時',
+            hh : '%d 小時',
+            d : '1 天',
+            dd : '%d 天',
+            M : '1 個月',
+            MM : '%d 個月',
+            y : '1 年',
+            yy : '%d 年'
+        }
+    });
+
+    return zh_hk;
+
+}));
\ No newline at end of file
index 7883ede..c6766c8 100644 (file)
@@ -1,39 +1,52 @@
-// moment.js locale configuration
-// locale : traditional chinese (zh-tw)
-// author : Ben : https://github.com/ben-lin
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('zh-tw', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var zh_tw = moment.defineLocale('zh-tw', {
         months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
         monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
         weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
         weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
         longDateFormat : {
-            LT : 'Ah點mm',
+            LT : 'Ah點mm',
             LTS : 'Ah點m分s秒',
             L : 'YYYY年MMMD日',
             LL : 'YYYY年MMMD日',
-            LLL : 'YYYY年MMMD日LT',
-            LLLL : 'YYYY年MMMD日ddddLT',
+            LLL : 'YYYY年MMMD日Ah點mm分',
+            LLLL : 'YYYY年MMMD日ddddAh點mm分',
             l : 'YYYY年MMMD日',
             ll : 'YYYY年MMMD日',
-            lll : 'YYYY年MMMD日LT',
-            llll : 'YYYY年MMMD日ddddLT'
+            lll : 'YYYY年MMMD日Ah點mm分',
+            llll : 'YYYY年MMMD日ddddAh點mm分'
+        },
+        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+                return hour;
+            } else if (meridiem === '中午') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === '下午' || meridiem === '晚上') {
+                return hour + 12;
+            }
         },
         meridiem : function (hour, minute, isLower) {
             var hm = hour * 100 + minute;
-            if (hm < 900) {
+            if (hm < 600) {
+                return '凌晨';
+            } else if (hm < 900) {
                 return '早上';
             } else if (hm < 1130) {
                 return '上午';
         ordinalParse: /\d{1,2}(日|月|週)/,
         ordinal : function (number, period) {
             switch (period) {
-            case 'd' :
-            case 'D' :
-            case 'DDD' :
-                return number + '日';
-            case 'M' :
-                return number + '月';
-            case 'w' :
-            case 'W' :
-                return number + '週';
-            default :
-                return number;
+                case 'd' :
+                case 'D' :
+                case 'DDD' :
+                    return number + '日';
+                case 'M' :
+                    return number + '月';
+                case 'w' :
+                case 'W' :
+                    return number + '週';
+                default :
+                    return number;
             }
         },
         relativeTime : {
             future : '%s內',
             past : '%s前',
             s : '幾秒',
-            m : '分鐘',
-            mm : '%d分鐘',
-            h : '小時',
-            hh : '%d小時',
-            d : '天',
-            dd : '%d天',
-            M : '個月',
-            MM : '%d個月',
-            y : '年',
-            yy : '%d年'
+            m : '分鐘',
+            mm : '%d 分鐘',
+            h : '小時',
+            hh : '%d 小時',
+            d : '天',
+            dd : '%d 天',
+            M : '個月',
+            MM : '%d 個月',
+            y : '年',
+            yy : '%d 年'
         }
     });
-}));
+
+    return zh_tw;
+
+}));
\ No newline at end of file
index 85e190d..7d0fef9 100644 (file)
 //! moment.js
-//! version : 2.8.4
+//! version : 2.15.0
 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
 //! license : MIT
 //! momentjs.com
 
-(function (undefined) {
-    /************************************
-        Constants
-    ************************************/
-
-    var moment,
-        VERSION = '2.8.4',
-        // the global-scope this is NOT the global object in Node.js
-        globalScope = typeof global !== 'undefined' ? global : this,
-        oldGlobalMoment,
-        round = Math.round,
-        hasOwnProperty = Object.prototype.hasOwnProperty,
-        i,
-
-        YEAR = 0,
-        MONTH = 1,
-        DATE = 2,
-        HOUR = 3,
-        MINUTE = 4,
-        SECOND = 5,
-        MILLISECOND = 6,
-
-        // internal storage for locale config files
-        locales = {},
-
-        // extra moment internal properties (plugins register props here)
-        momentProperties = [],
-
-        // check for nodeJS
-        hasModule = (typeof module !== 'undefined' && module && module.exports),
-
-        // ASP.NET json date format regex
-        aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
-        aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
-
-        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
-        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
-        isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
-
-        // format tokens
-        formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,
-        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
-
-        // parsing token regexes
-        parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
-        parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
-        parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
-        parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
-        parseTokenDigits = /\d+/, // nonzero number of digits
-        parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
-        parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
-        parseTokenT = /T/i, // T (ISO separator)
-        parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123
-        parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
-
-        //strict parsing regexes
-        parseTokenOneDigit = /\d/, // 0 - 9
-        parseTokenTwoDigits = /\d\d/, // 00 - 99
-        parseTokenThreeDigits = /\d{3}/, // 000 - 999
-        parseTokenFourDigits = /\d{4}/, // 0000 - 9999
-        parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
-        parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
-
-        // iso 8601 regex
-        // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
-        isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
-
-        isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
-
-        isoDates = [
-            ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
-            ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
-            ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
-            ['GGGG-[W]WW', /\d{4}-W\d{2}/],
-            ['YYYY-DDD', /\d{4}-\d{3}/]
-        ],
-
-        // iso time formats and regexes
-        isoTimes = [
-            ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
-            ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
-            ['HH:mm', /(T| )\d\d:\d\d/],
-            ['HH', /(T| )\d\d/]
-        ],
-
-        // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30']
-        parseTimezoneChunker = /([\+\-]|\d\d)/gi,
-
-        // getter and setter names
-        proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
-        unitMillisecondFactors = {
-            'Milliseconds' : 1,
-            'Seconds' : 1e3,
-            'Minutes' : 6e4,
-            'Hours' : 36e5,
-            'Days' : 864e5,
-            'Months' : 2592e6,
-            'Years' : 31536e6
-        },
-
-        unitAliases = {
-            ms : 'millisecond',
-            s : 'second',
-            m : 'minute',
-            h : 'hour',
-            d : 'day',
-            D : 'date',
-            w : 'week',
-            W : 'isoWeek',
-            M : 'month',
-            Q : 'quarter',
-            y : 'year',
-            DDD : 'dayOfYear',
-            e : 'weekday',
-            E : 'isoWeekday',
-            gg: 'weekYear',
-            GG: 'isoWeekYear'
-        },
-
-        camelFunctions = {
-            dayofyear : 'dayOfYear',
-            isoweekday : 'isoWeekday',
-            isoweek : 'isoWeek',
-            weekyear : 'weekYear',
-            isoweekyear : 'isoWeekYear'
-        },
-
-        // format function strings
-        formatFunctions = {},
-
-        // default relative time thresholds
-        relativeTimeThresholds = {
-            s: 45,  // seconds to minute
-            m: 45,  // minutes to hour
-            h: 22,  // hours to day
-            d: 26,  // days to month
-            M: 11   // months to year
-        },
-
-        // tokens to ordinalize and pad
-        ordinalizeTokens = 'DDD w W M D d'.split(' '),
-        paddedTokens = 'M D H h m s w W'.split(' '),
-
-        formatTokenFunctions = {
-            M    : function () {
-                return this.month() + 1;
-            },
-            MMM  : function (format) {
-                return this.localeData().monthsShort(this, format);
-            },
-            MMMM : function (format) {
-                return this.localeData().months(this, format);
-            },
-            D    : function () {
-                return this.date();
-            },
-            DDD  : function () {
-                return this.dayOfYear();
-            },
-            d    : function () {
-                return this.day();
-            },
-            dd   : function (format) {
-                return this.localeData().weekdaysMin(this, format);
-            },
-            ddd  : function (format) {
-                return this.localeData().weekdaysShort(this, format);
-            },
-            dddd : function (format) {
-                return this.localeData().weekdays(this, format);
-            },
-            w    : function () {
-                return this.week();
-            },
-            W    : function () {
-                return this.isoWeek();
-            },
-            YY   : function () {
-                return leftZeroFill(this.year() % 100, 2);
-            },
-            YYYY : function () {
-                return leftZeroFill(this.year(), 4);
-            },
-            YYYYY : function () {
-                return leftZeroFill(this.year(), 5);
-            },
-            YYYYYY : function () {
-                var y = this.year(), sign = y >= 0 ? '+' : '-';
-                return sign + leftZeroFill(Math.abs(y), 6);
-            },
-            gg   : function () {
-                return leftZeroFill(this.weekYear() % 100, 2);
-            },
-            gggg : function () {
-                return leftZeroFill(this.weekYear(), 4);
-            },
-            ggggg : function () {
-                return leftZeroFill(this.weekYear(), 5);
-            },
-            GG   : function () {
-                return leftZeroFill(this.isoWeekYear() % 100, 2);
-            },
-            GGGG : function () {
-                return leftZeroFill(this.isoWeekYear(), 4);
-            },
-            GGGGG : function () {
-                return leftZeroFill(this.isoWeekYear(), 5);
-            },
-            e : function () {
-                return this.weekday();
-            },
-            E : function () {
-                return this.isoWeekday();
-            },
-            a    : function () {
-                return this.localeData().meridiem(this.hours(), this.minutes(), true);
-            },
-            A    : function () {
-                return this.localeData().meridiem(this.hours(), this.minutes(), false);
-            },
-            H    : function () {
-                return this.hours();
-            },
-            h    : function () {
-                return this.hours() % 12 || 12;
-            },
-            m    : function () {
-                return this.minutes();
-            },
-            s    : function () {
-                return this.seconds();
-            },
-            S    : function () {
-                return toInt(this.milliseconds() / 100);
-            },
-            SS   : function () {
-                return leftZeroFill(toInt(this.milliseconds() / 10), 2);
-            },
-            SSS  : function () {
-                return leftZeroFill(this.milliseconds(), 3);
-            },
-            SSSS : function () {
-                return leftZeroFill(this.milliseconds(), 3);
-            },
-            Z    : function () {
-                var a = -this.zone(),
-                    b = '+';
-                if (a < 0) {
-                    a = -a;
-                    b = '-';
-                }
-                return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2);
-            },
-            ZZ   : function () {
-                var a = -this.zone(),
-                    b = '+';
-                if (a < 0) {
-                    a = -a;
-                    b = '-';
-                }
-                return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
-            },
-            z : function () {
-                return this.zoneAbbr();
-            },
-            zz : function () {
-                return this.zoneName();
-            },
-            x    : function () {
-                return this.valueOf();
-            },
-            X    : function () {
-                return this.unix();
-            },
-            Q : function () {
-                return this.quarter();
-            }
-        },
-
-        deprecations = {},
-
-        lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
-
-    // Pick the first defined of two or three arguments. dfl comes from
-    // default.
-    function dfl(a, b, c) {
-        switch (arguments.length) {
-            case 2: return a != null ? a : b;
-            case 3: return a != null ? a : b != null ? b : c;
-            default: throw new Error('Implement me');
-        }
-    }
+;(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    global.moment = factory()
+}(this, function () { 'use strict';
 
-    function hasOwnProp(a, b) {
-        return hasOwnProperty.call(a, b);
+    var hookCallback;
+
+    function utils_hooks__hooks () {
+        return hookCallback.apply(null, arguments);
     }
 
-    function defaultParsingFlags() {
-        // We need to deep clone this object, and es5 standard is not very
-        // helpful.
-        return {
-            empty : false,
-            unusedTokens : [],
-            unusedInput : [],
-            overflow : -2,
-            charsLeftOver : 0,
-            nullInput : false,
-            invalidMonth : null,
-            invalidFormat : false,
-            userInvalidated : false,
-            iso: false
-        };
+    // This is done to register the method called with moment()
+    // without creating circular dependencies.
+    function setHookCallback (callback) {
+        hookCallback = callback;
     }
 
-    function printMsg(msg) {
-        if (moment.suppressDeprecationWarnings === false &&
-                typeof console !== 'undefined' && console.warn) {
-            console.warn('Deprecation warning: ' + msg);
-        }
+    function isArray(input) {
+        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
     }
 
-    function deprecate(msg, fn) {
-        var firstTime = true;
-        return extend(function () {
-            if (firstTime) {
-                printMsg(msg);
-                firstTime = false;
-            }
-            return fn.apply(this, arguments);
-        }, fn);
+    function isObject(input) {
+        // IE8 will treat undefined and null as object if it wasn't for
+        // input != null
+        return input != null && Object.prototype.toString.call(input) === '[object Object]';
     }
 
-    function deprecateSimple(name, msg) {
-        if (!deprecations[name]) {
-            printMsg(msg);
-            deprecations[name] = true;
+    function isObjectEmpty(obj) {
+        var k;
+        for (k in obj) {
+            // even if its not own property I'd still call it non-empty
+            return false;
         }
+        return true;
     }
 
-    function padToken(func, count) {
-        return function (a) {
-            return leftZeroFill(func.call(this, a), count);
-        };
-    }
-    function ordinalizeToken(func, period) {
-        return function (a) {
-            return this.localeData().ordinal(func.call(this, a), period);
-        };
+    function isDate(input) {
+        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
     }
 
-    while (ordinalizeTokens.length) {
-        i = ordinalizeTokens.pop();
-        formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
+    function map(arr, fn) {
+        var res = [], i;
+        for (i = 0; i < arr.length; ++i) {
+            res.push(fn(arr[i], i));
+        }
+        return res;
     }
-    while (paddedTokens.length) {
-        i = paddedTokens.pop();
-        formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
+
+    function hasOwnProp(a, b) {
+        return Object.prototype.hasOwnProperty.call(a, b);
     }
-    formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
 
+    function extend(a, b) {
+        for (var i in b) {
+            if (hasOwnProp(b, i)) {
+                a[i] = b[i];
+            }
+        }
+
+        if (hasOwnProp(b, 'toString')) {
+            a.toString = b.toString;
+        }
 
-    /************************************
-        Constructors
-    ************************************/
+        if (hasOwnProp(b, 'valueOf')) {
+            a.valueOf = b.valueOf;
+        }
 
-    function Locale() {
+        return a;
     }
 
-    // Moment prototype object
-    function Moment(config, skipOverflow) {
-        if (skipOverflow !== false) {
-            checkOverflow(config);
-        }
-        copyConfig(this, config);
-        this._d = new Date(+config._d);
+    function create_utc__createUTC (input, format, locale, strict) {
+        return createLocalOrUTC(input, format, locale, strict, true).utc();
     }
 
-    // Duration Constructor
-    function Duration(duration) {
-        var normalizedInput = normalizeObjectUnits(duration),
-            years = normalizedInput.year || 0,
-            quarters = normalizedInput.quarter || 0,
-            months = normalizedInput.month || 0,
-            weeks = normalizedInput.week || 0,
-            days = normalizedInput.day || 0,
-            hours = normalizedInput.hour || 0,
-            minutes = normalizedInput.minute || 0,
-            seconds = normalizedInput.second || 0,
-            milliseconds = normalizedInput.millisecond || 0;
+    function defaultParsingFlags() {
+        // We need to deep clone this object.
+        return {
+            empty           : false,
+            unusedTokens    : [],
+            unusedInput     : [],
+            overflow        : -2,
+            charsLeftOver   : 0,
+            nullInput       : false,
+            invalidMonth    : null,
+            invalidFormat   : false,
+            userInvalidated : false,
+            iso             : false,
+            parsedDateParts : [],
+            meridiem        : null
+        };
+    }
 
-        // representation for dateAddRemove
-        this._milliseconds = +milliseconds +
-            seconds * 1e3 + // 1000
-            minutes * 6e4 + // 1000 * 60
-            hours * 36e5; // 1000 * 60 * 60
-        // Because of dateAddRemove treats 24 hours as different from a
-        // day when working around DST, we need to store them separately
-        this._days = +days +
-            weeks * 7;
-        // It is impossible translate months into days without knowing
-        // which months you are are talking about, so we have to store
-        // it separately.
-        this._months = +months +
-            quarters * 3 +
-            years * 12;
+    function getParsingFlags(m) {
+        if (m._pf == null) {
+            m._pf = defaultParsingFlags();
+        }
+        return m._pf;
+    }
 
-        this._data = {};
+    var some;
+    if (Array.prototype.some) {
+        some = Array.prototype.some;
+    } else {
+        some = function (fun) {
+            var t = Object(this);
+            var len = t.length >>> 0;
 
-        this._locale = moment.localeData();
+            for (var i = 0; i < len; i++) {
+                if (i in t && fun.call(this, t[i], i, t)) {
+                    return true;
+                }
+            }
 
-        this._bubble();
+            return false;
+        };
     }
 
-    /************************************
-        Helpers
-    ************************************/
+    function valid__isValid(m) {
+        if (m._isValid == null) {
+            var flags = getParsingFlags(m);
+            var parsedParts = some.call(flags.parsedDateParts, function (i) {
+                return i != null;
+            });
+            var isNowValid = !isNaN(m._d.getTime()) &&
+                flags.overflow < 0 &&
+                !flags.empty &&
+                !flags.invalidMonth &&
+                !flags.invalidWeekday &&
+                !flags.nullInput &&
+                !flags.invalidFormat &&
+                !flags.userInvalidated &&
+                (!flags.meridiem || (flags.meridiem && parsedParts));
 
+            if (m._strict) {
+                isNowValid = isNowValid &&
+                    flags.charsLeftOver === 0 &&
+                    flags.unusedTokens.length === 0 &&
+                    flags.bigHour === undefined;
+            }
 
-    function extend(a, b) {
-        for (var i in b) {
-            if (hasOwnProp(b, i)) {
-                a[i] = b[i];
+            if (Object.isFrozen == null || !Object.isFrozen(m)) {
+                m._isValid = isNowValid;
+            }
+            else {
+                return isNowValid;
             }
         }
+        return m._isValid;
+    }
 
-        if (hasOwnProp(b, 'toString')) {
-            a.toString = b.toString;
+    function valid__createInvalid (flags) {
+        var m = create_utc__createUTC(NaN);
+        if (flags != null) {
+            extend(getParsingFlags(m), flags);
         }
-
-        if (hasOwnProp(b, 'valueOf')) {
-            a.valueOf = b.valueOf;
+        else {
+            getParsingFlags(m).userInvalidated = true;
         }
 
-        return a;
+        return m;
+    }
+
+    function isUndefined(input) {
+        return input === void 0;
     }
 
+    // Plugins that add properties should also add the key here (null value),
+    // so we can properly clone ourselves.
+    var momentProperties = utils_hooks__hooks.momentProperties = [];
+
     function copyConfig(to, from) {
         var i, prop, val;
 
-        if (typeof from._isAMomentObject !== 'undefined') {
+        if (!isUndefined(from._isAMomentObject)) {
             to._isAMomentObject = from._isAMomentObject;
         }
-        if (typeof from._i !== 'undefined') {
+        if (!isUndefined(from._i)) {
             to._i = from._i;
         }
-        if (typeof from._f !== 'undefined') {
+        if (!isUndefined(from._f)) {
             to._f = from._f;
         }
-        if (typeof from._l !== 'undefined') {
+        if (!isUndefined(from._l)) {
             to._l = from._l;
         }
-        if (typeof from._strict !== 'undefined') {
+        if (!isUndefined(from._strict)) {
             to._strict = from._strict;
         }
-        if (typeof from._tzm !== 'undefined') {
+        if (!isUndefined(from._tzm)) {
             to._tzm = from._tzm;
         }
-        if (typeof from._isUTC !== 'undefined') {
+        if (!isUndefined(from._isUTC)) {
             to._isUTC = from._isUTC;
         }
-        if (typeof from._offset !== 'undefined') {
+        if (!isUndefined(from._offset)) {
             to._offset = from._offset;
         }
-        if (typeof from._pf !== 'undefined') {
-            to._pf = from._pf;
+        if (!isUndefined(from._pf)) {
+            to._pf = getParsingFlags(from);
         }
-        if (typeof from._locale !== 'undefined') {
+        if (!isUndefined(from._locale)) {
             to._locale = from._locale;
         }
 
             for (i in momentProperties) {
                 prop = momentProperties[i];
                 val = from[prop];
-                if (typeof val !== 'undefined') {
+                if (!isUndefined(val)) {
                     to[prop] = val;
                 }
             }
         return to;
     }
 
-    function absRound(number) {
-        if (number < 0) {
-            return Math.ceil(number);
-        } else {
-            return Math.floor(number);
-        }
-    }
-
-    // left zero fill a number
-    // see http://jsperf.com/left-zero-filling for performance comparison
-    function leftZeroFill(number, targetLength, forceSign) {
-        var output = '' + Math.abs(number),
-            sign = number >= 0;
+    var updateInProgress = false;
 
-        while (output.length < targetLength) {
-            output = '0' + output;
+    // Moment prototype object
+    function Moment(config) {
+        copyConfig(this, config);
+        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
+        // Prevent infinite loop in case updateOffset creates new moment
+        // objects.
+        if (updateInProgress === false) {
+            updateInProgress = true;
+            utils_hooks__hooks.updateOffset(this);
+            updateInProgress = false;
         }
-        return (sign ? (forceSign ? '+' : '') : '-') + output;
     }
 
-    function positiveMomentsDifference(base, other) {
-        var res = {milliseconds: 0, months: 0};
-
-        res.months = other.month() - base.month() +
-            (other.year() - base.year()) * 12;
-        if (base.clone().add(res.months, 'M').isAfter(other)) {
-            --res.months;
-        }
-
-        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
-
-        return res;
+    function isMoment (obj) {
+        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
     }
 
-    function momentsDifference(base, other) {
-        var res;
-        other = makeAs(other, base);
-        if (base.isBefore(other)) {
-            res = positiveMomentsDifference(base, other);
+    function absFloor (number) {
+        if (number < 0) {
+            // -0 -> 0
+            return Math.ceil(number) || 0;
         } else {
-            res = positiveMomentsDifference(other, base);
-            res.milliseconds = -res.milliseconds;
-            res.months = -res.months;
+            return Math.floor(number);
         }
-
-        return res;
-    }
-
-    // TODO: remove 'name' arg after deprecation is removed
-    function createAdder(direction, name) {
-        return function (val, period) {
-            var dur, tmp;
-            //invert the arguments, but complain about it
-            if (period !== null && !isNaN(+period)) {
-                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
-                tmp = val; val = period; period = tmp;
-            }
-
-            val = typeof val === 'string' ? +val : val;
-            dur = moment.duration(val, period);
-            addOrSubtractDurationFromMoment(this, dur, direction);
-            return this;
-        };
     }
 
-    function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) {
-        var milliseconds = duration._milliseconds,
-            days = duration._days,
-            months = duration._months;
-        updateOffset = updateOffset == null ? true : updateOffset;
+    function toInt(argumentForCoercion) {
+        var coercedNumber = +argumentForCoercion,
+            value = 0;
 
-        if (milliseconds) {
-            mom._d.setTime(+mom._d + milliseconds * isAdding);
-        }
-        if (days) {
-            rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding);
-        }
-        if (months) {
-            rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding);
-        }
-        if (updateOffset) {
-            moment.updateOffset(mom, days || months);
+        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+            value = absFloor(coercedNumber);
         }
-    }
 
-    // check if is an array
-    function isArray(input) {
-        return Object.prototype.toString.call(input) === '[object Array]';
-    }
-
-    function isDate(input) {
-        return Object.prototype.toString.call(input) === '[object Date]' ||
-            input instanceof Date;
+        return value;
     }
 
     // compare two arrays, return the number of differences
         return diffs + lengthDiff;
     }
 
-    function normalizeUnits(units) {
-        if (units) {
-            var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
-            units = unitAliases[units] || camelFunctions[lowered] || lowered;
+    function warn(msg) {
+        if (utils_hooks__hooks.suppressDeprecationWarnings === false &&
+                (typeof console !==  'undefined') && console.warn) {
+            console.warn('Deprecation warning: ' + msg);
         }
-        return units;
     }
 
-    function normalizeObjectUnits(inputObject) {
-        var normalizedInput = {},
-            normalizedProp,
-            prop;
+    function deprecate(msg, fn) {
+        var firstTime = true;
 
-        for (prop in inputObject) {
-            if (hasOwnProp(inputObject, prop)) {
-                normalizedProp = normalizeUnits(prop);
-                if (normalizedProp) {
-                    normalizedInput[normalizedProp] = inputObject[prop];
+        return extend(function () {
+            if (utils_hooks__hooks.deprecationHandler != null) {
+                utils_hooks__hooks.deprecationHandler(null, msg);
+            }
+            if (firstTime) {
+                var args = [];
+                var arg;
+                for (var i = 0; i < arguments.length; i++) {
+                    arg = '';
+                    if (typeof arguments[i] === 'object') {
+                        arg += '\n[' + i + '] ';
+                        for (var key in arguments[0]) {
+                            arg += key + ': ' + arguments[0][key] + ', ';
+                        }
+                        arg = arg.slice(0, -2); // Remove trailing comma and space
+                    } else {
+                        arg = arguments[i];
+                    }
+                    args.push(arg);
                 }
+                warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
+                firstTime = false;
             }
-        }
-
-        return normalizedInput;
+            return fn.apply(this, arguments);
+        }, fn);
     }
 
-    function makeList(field) {
-        var count, setter;
+    var deprecations = {};
 
-        if (field.indexOf('week') === 0) {
-            count = 7;
-            setter = 'day';
-        }
-        else if (field.indexOf('month') === 0) {
-            count = 12;
-            setter = 'month';
+    function deprecateSimple(name, msg) {
+        if (utils_hooks__hooks.deprecationHandler != null) {
+            utils_hooks__hooks.deprecationHandler(name, msg);
         }
-        else {
-            return;
+        if (!deprecations[name]) {
+            warn(msg);
+            deprecations[name] = true;
         }
+    }
 
-        moment[field] = function (format, index) {
-            var i, getter,
-                method = moment._locale[field],
-                results = [];
-
-            if (typeof format === 'number') {
-                index = format;
-                format = undefined;
-            }
-
-            getter = function (i) {
-                var m = moment().utc().set(setter, i);
-                return method.call(moment._locale, m, format || '');
-            };
+    utils_hooks__hooks.suppressDeprecationWarnings = false;
+    utils_hooks__hooks.deprecationHandler = null;
 
-            if (index != null) {
-                return getter(index);
-            }
-            else {
-                for (i = 0; i < count; i++) {
-                    results.push(getter(i));
-                }
-                return results;
-            }
-        };
+    function isFunction(input) {
+        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
     }
 
-    function toInt(argumentForCoercion) {
-        var coercedNumber = +argumentForCoercion,
-            value = 0;
-
-        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
-            if (coercedNumber >= 0) {
-                value = Math.floor(coercedNumber);
+    function locale_set__set (config) {
+        var prop, i;
+        for (i in config) {
+            prop = config[i];
+            if (isFunction(prop)) {
+                this[i] = prop;
             } else {
-                value = Math.ceil(coercedNumber);
+                this['_' + i] = prop;
             }
         }
-
-        return value;
+        this._config = config;
+        // Lenient ordinal parsing accepts just a number in addition to
+        // number + (possibly) stuff coming from _ordinalParseLenient.
+        this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
     }
 
-    function daysInMonth(year, month) {
-        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+    function mergeConfigs(parentConfig, childConfig) {
+        var res = extend({}, parentConfig), prop;
+        for (prop in childConfig) {
+            if (hasOwnProp(childConfig, prop)) {
+                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
+                    res[prop] = {};
+                    extend(res[prop], parentConfig[prop]);
+                    extend(res[prop], childConfig[prop]);
+                } else if (childConfig[prop] != null) {
+                    res[prop] = childConfig[prop];
+                } else {
+                    delete res[prop];
+                }
+            }
+        }
+        for (prop in parentConfig) {
+            if (hasOwnProp(parentConfig, prop) &&
+                    !hasOwnProp(childConfig, prop) &&
+                    isObject(parentConfig[prop])) {
+                // make sure changes to properties don't modify parent config
+                res[prop] = extend({}, res[prop]);
+            }
+        }
+        return res;
     }
 
-    function weeksInYear(year, dow, doy) {
-        return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week;
+    function Locale(config) {
+        if (config != null) {
+            this.set(config);
+        }
     }
 
-    function daysInYear(year) {
-        return isLeapYear(year) ? 366 : 365;
-    }
+    var keys;
 
-    function isLeapYear(year) {
-        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+    if (Object.keys) {
+        keys = Object.keys;
+    } else {
+        keys = function (obj) {
+            var i, res = [];
+            for (i in obj) {
+                if (hasOwnProp(obj, i)) {
+                    res.push(i);
+                }
+            }
+            return res;
+        };
     }
 
-    function checkOverflow(m) {
-        var overflow;
-        if (m._a && m._pf.overflow === -2) {
-            overflow =
-                m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
-                m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
-                m._a[HOUR] < 0 || m._a[HOUR] > 24 ||
-                    (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 ||
-                                           m._a[SECOND] !== 0 ||
-                                           m._a[MILLISECOND] !== 0)) ? HOUR :
-                m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
-                m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
-                m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
-                -1;
-
-            if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
-                overflow = DATE;
-            }
+    var defaultCalendar = {
+        sameDay : '[Today at] LT',
+        nextDay : '[Tomorrow at] LT',
+        nextWeek : 'dddd [at] LT',
+        lastDay : '[Yesterday at] LT',
+        lastWeek : '[Last] dddd [at] LT',
+        sameElse : 'L'
+    };
 
-            m._pf.overflow = overflow;
-        }
+    function locale_calendar__calendar (key, mom, now) {
+        var output = this._calendar[key] || this._calendar['sameElse'];
+        return isFunction(output) ? output.call(mom, now) : output;
     }
 
-    function isValid(m) {
-        if (m._isValid == null) {
-            m._isValid = !isNaN(m._d.getTime()) &&
-                m._pf.overflow < 0 &&
-                !m._pf.empty &&
-                !m._pf.invalidMonth &&
-                !m._pf.nullInput &&
-                !m._pf.invalidFormat &&
-                !m._pf.userInvalidated;
+    var defaultLongDateFormat = {
+        LTS  : 'h:mm:ss A',
+        LT   : 'h:mm A',
+        L    : 'MM/DD/YYYY',
+        LL   : 'MMMM D, YYYY',
+        LLL  : 'MMMM D, YYYY h:mm A',
+        LLLL : 'dddd, MMMM D, YYYY h:mm A'
+    };
 
-            if (m._strict) {
-                m._isValid = m._isValid &&
-                    m._pf.charsLeftOver === 0 &&
-                    m._pf.unusedTokens.length === 0 &&
-                    m._pf.bigHour === undefined;
-            }
+    function longDateFormat (key) {
+        var format = this._longDateFormat[key],
+            formatUpper = this._longDateFormat[key.toUpperCase()];
+
+        if (format || !formatUpper) {
+            return format;
         }
-        return m._isValid;
+
+        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
+            return val.slice(1);
+        });
+
+        return this._longDateFormat[key];
     }
 
-    function normalizeLocale(key) {
-        return key ? key.toLowerCase().replace('_', '-') : key;
+    var defaultInvalidDate = 'Invalid date';
+
+    function invalidDate () {
+        return this._invalidDate;
     }
 
-    // pick the locale from the array
-    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
-    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
-    function chooseLocale(names) {
-        var i = 0, j, next, locale, split;
+    var defaultOrdinal = '%d';
+    var defaultOrdinalParse = /\d{1,2}/;
 
-        while (i < names.length) {
-            split = normalizeLocale(names[i]).split('-');
-            j = split.length;
-            next = normalizeLocale(names[i + 1]);
-            next = next ? next.split('-') : null;
-            while (j > 0) {
-                locale = loadLocale(split.slice(0, j).join('-'));
-                if (locale) {
-                    return locale;
-                }
-                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
-                    //the next array item is better than a shallower substring of this one
-                    break;
-                }
-                j--;
-            }
-            i++;
-        }
-        return null;
+    function ordinal (number) {
+        return this._ordinal.replace('%d', number);
     }
 
-    function loadLocale(name) {
-        var oldLocale = null;
-        if (!locales[name] && hasModule) {
-            try {
-                oldLocale = moment.locale();
-                require('./locale/' + name);
-                // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales
-                moment.locale(oldLocale);
-            } catch (e) { }
-        }
-        return locales[name];
+    var defaultRelativeTime = {
+        future : 'in %s',
+        past   : '%s ago',
+        s  : 'a few seconds',
+        m  : 'a minute',
+        mm : '%d minutes',
+        h  : 'an hour',
+        hh : '%d hours',
+        d  : 'a day',
+        dd : '%d days',
+        M  : 'a month',
+        MM : '%d months',
+        y  : 'a year',
+        yy : '%d years'
+    };
+
+    function relative__relativeTime (number, withoutSuffix, string, isFuture) {
+        var output = this._relativeTime[string];
+        return (isFunction(output)) ?
+            output(number, withoutSuffix, string, isFuture) :
+            output.replace(/%d/i, number);
     }
 
-    // Return a moment from input, that is local/utc/zone equivalent to model.
-    function makeAs(input, model) {
-        var res, diff;
-        if (model._isUTC) {
-            res = model.clone();
-            diff = (moment.isMoment(input) || isDate(input) ?
-                    +input : +moment(input)) - (+res);
-            // Use low-level api, because this fn is low-level api.
-            res._d.setTime(+res._d + diff);
-            moment.updateOffset(res, false);
-            return res;
-        } else {
-            return moment(input).local();
-        }
+    function pastFuture (diff, output) {
+        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
     }
 
-    /************************************
-        Locale
-    ************************************/
+    var aliases = {};
 
+    function addUnitAlias (unit, shorthand) {
+        var lowerCase = unit.toLowerCase();
+        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
+    }
 
-    extend(Locale.prototype, {
+    function normalizeUnits(units) {
+        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
+    }
 
-        set : function (config) {
-            var prop, i;
-            for (i in config) {
-                prop = config[i];
-                if (typeof prop === 'function') {
-                    this[i] = prop;
-                } else {
-                    this['_' + i] = prop;
+    function normalizeObjectUnits(inputObject) {
+        var normalizedInput = {},
+            normalizedProp,
+            prop;
+
+        for (prop in inputObject) {
+            if (hasOwnProp(inputObject, prop)) {
+                normalizedProp = normalizeUnits(prop);
+                if (normalizedProp) {
+                    normalizedInput[normalizedProp] = inputObject[prop];
                 }
             }
-            // Lenient ordinal parsing accepts just a number in addition to
-            // number + (possibly) stuff coming from _ordinalParseLenient.
-            this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source);
-        },
+        }
 
-        _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
-        months : function (m) {
-            return this._months[m.month()];
-        },
+        return normalizedInput;
+    }
 
-        _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
-        monthsShort : function (m) {
-            return this._monthsShort[m.month()];
-        },
+    var priorities = {};
 
-        monthsParse : function (monthName, format, strict) {
-            var i, mom, regex;
+    function addUnitPriority(unit, priority) {
+        priorities[unit] = priority;
+    }
 
-            if (!this._monthsParse) {
-                this._monthsParse = [];
-                this._longMonthsParse = [];
-                this._shortMonthsParse = [];
-            }
+    function getPrioritizedUnits(unitsObj) {
+        var units = [];
+        for (var u in unitsObj) {
+            units.push({unit: u, priority: priorities[u]});
+        }
+        units.sort(function (a, b) {
+            return a.priority - b.priority;
+        });
+        return units;
+    }
 
-            for (i = 0; i < 12; i++) {
-                // make the regex if we don't have it already
-                mom = moment.utc([2000, i]);
-                if (strict && !this._longMonthsParse[i]) {
-                    this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
-                    this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
-                }
-                if (!strict && !this._monthsParse[i]) {
-                    regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
-                    this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
-                }
-                // test the regex
-                if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
-                    return i;
-                } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
-                    return i;
-                } else if (!strict && this._monthsParse[i].test(monthName)) {
-                    return i;
-                }
+    function makeGetSet (unit, keepTime) {
+        return function (value) {
+            if (value != null) {
+                get_set__set(this, unit, value);
+                utils_hooks__hooks.updateOffset(this, keepTime);
+                return this;
+            } else {
+                return get_set__get(this, unit);
             }
-        },
+        };
+    }
 
-        _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
-        weekdays : function (m) {
-            return this._weekdays[m.day()];
-        },
+    function get_set__get (mom, unit) {
+        return mom.isValid() ?
+            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
+    }
 
-        _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
-        weekdaysShort : function (m) {
-            return this._weekdaysShort[m.day()];
-        },
+    function get_set__set (mom, unit, value) {
+        if (mom.isValid()) {
+            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+        }
+    }
 
-        _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
-        weekdaysMin : function (m) {
-            return this._weekdaysMin[m.day()];
-        },
+    // MOMENTS
 
-        weekdaysParse : function (weekdayName) {
-            var i, mom, regex;
+    function stringGet (units) {
+        units = normalizeUnits(units);
+        if (isFunction(this[units])) {
+            return this[units]();
+        }
+        return this;
+    }
 
-            if (!this._weekdaysParse) {
-                this._weekdaysParse = [];
-            }
 
-            for (i = 0; i < 7; i++) {
-                // make the regex if we don't have it already
-                if (!this._weekdaysParse[i]) {
-                    mom = moment([2000, 1]).day(i);
-                    regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
-                    this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
-                }
-                // test the regex
-                if (this._weekdaysParse[i].test(weekdayName)) {
-                    return i;
-                }
+    function stringSet (units, value) {
+        if (typeof units === 'object') {
+            units = normalizeObjectUnits(units);
+            var prioritized = getPrioritizedUnits(units);
+            for (var i = 0; i < prioritized.length; i++) {
+                this[prioritized[i].unit](units[prioritized[i].unit]);
             }
-        },
-
-        _longDateFormat : {
-            LTS : 'h:mm:ss A',
-            LT : 'h:mm A',
-            L : 'MM/DD/YYYY',
-            LL : 'MMMM D, YYYY',
-            LLL : 'MMMM D, YYYY LT',
-            LLLL : 'dddd, MMMM D, YYYY LT'
-        },
-        longDateFormat : function (key) {
-            var output = this._longDateFormat[key];
-            if (!output && this._longDateFormat[key.toUpperCase()]) {
-                output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
-                    return val.slice(1);
-                });
-                this._longDateFormat[key] = output;
+        } else {
+            units = normalizeUnits(units);
+            if (isFunction(this[units])) {
+                return this[units](value);
             }
-            return output;
-        },
-
-        isPM : function (input) {
-            // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
-            // Using charAt should be more compatible.
-            return ((input + '').toLowerCase().charAt(0) === 'p');
-        },
-
-        _meridiemParse : /[ap]\.?m?\.?/i,
-        meridiem : function (hours, minutes, isLower) {
-            if (hours > 11) {
-                return isLower ? 'pm' : 'PM';
-            } else {
-                return isLower ? 'am' : 'AM';
-            }
-        },
-
-        _calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        calendar : function (key, mom, now) {
-            var output = this._calendar[key];
-            return typeof output === 'function' ? output.apply(mom, [now]) : output;
-        },
-
-        _relativeTime : {
-            future : 'in %s',
-            past : '%s ago',
-            s : 'a few seconds',
-            m : 'a minute',
-            mm : '%d minutes',
-            h : 'an hour',
-            hh : '%d hours',
-            d : 'a day',
-            dd : '%d days',
-            M : 'a month',
-            MM : '%d months',
-            y : 'a year',
-            yy : '%d years'
-        },
-
-        relativeTime : function (number, withoutSuffix, string, isFuture) {
-            var output = this._relativeTime[string];
-            return (typeof output === 'function') ?
-                output(number, withoutSuffix, string, isFuture) :
-                output.replace(/%d/i, number);
-        },
-
-        pastFuture : function (diff, output) {
-            var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
-            return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
-        },
+        }
+        return this;
+    }
 
-        ordinal : function (number) {
-            return this._ordinal.replace('%d', number);
-        },
-        _ordinal : '%d',
-        _ordinalParse : /\d{1,2}/,
+    function zeroFill(number, targetLength, forceSign) {
+        var absNumber = '' + Math.abs(number),
+            zerosToFill = targetLength - absNumber.length,
+            sign = number >= 0;
+        return (sign ? (forceSign ? '+' : '') : '-') +
+            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
+    }
 
-        preparse : function (string) {
-            return string;
-        },
+    var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
 
-        postformat : function (string) {
-            return string;
-        },
+    var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
 
-        week : function (mom) {
-            return weekOfYear(mom, this._week.dow, this._week.doy).week;
-        },
+    var formatFunctions = {};
 
-        _week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        },
+    var formatTokenFunctions = {};
 
-        _invalidDate: 'Invalid date',
-        invalidDate: function () {
-            return this._invalidDate;
+    // token:    'M'
+    // padded:   ['MM', 2]
+    // ordinal:  'Mo'
+    // callback: function () { this.month() + 1 }
+    function addFormatToken (token, padded, ordinal, callback) {
+        var func = callback;
+        if (typeof callback === 'string') {
+            func = function () {
+                return this[callback]();
+            };
         }
-    });
-
-    /************************************
-        Formatting
-    ************************************/
-
+        if (token) {
+            formatTokenFunctions[token] = func;
+        }
+        if (padded) {
+            formatTokenFunctions[padded[0]] = function () {
+                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
+            };
+        }
+        if (ordinal) {
+            formatTokenFunctions[ordinal] = function () {
+                return this.localeData().ordinal(func.apply(this, arguments), token);
+            };
+        }
+    }
 
     function removeFormattingTokens(input) {
         if (input.match(/\[[\s\S]/)) {
         }
 
         return function (mom) {
-            var output = '';
+            var output = '', i;
             for (i = 0; i < length; i++) {
                 output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
             }
         }
 
         format = expandFormat(format, m.localeData());
-
-        if (!formatFunctions[format]) {
-            formatFunctions[format] = makeFormatFunction(format);
-        }
+        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
 
         return formatFunctions[format](m);
     }
         return format;
     }
 
+    var match1         = /\d/;            //       0 - 9
+    var match2         = /\d\d/;          //      00 - 99
+    var match3         = /\d{3}/;         //     000 - 999
+    var match4         = /\d{4}/;         //    0000 - 9999
+    var match6         = /[+-]?\d{6}/;    // -999999 - 999999
+    var match1to2      = /\d\d?/;         //       0 - 99
+    var match3to4      = /\d\d\d\d?/;     //     999 - 9999
+    var match5to6      = /\d\d\d\d\d\d?/; //   99999 - 999999
+    var match1to3      = /\d{1,3}/;       //       0 - 999
+    var match1to4      = /\d{1,4}/;       //       0 - 9999
+    var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999
 
-    /************************************
-        Parsing
-    ************************************/
-
-
-    // get the regex to find the next token
-    function getParseRegexForToken(token, config) {
-        var a, strict = config._strict;
-        switch (token) {
-        case 'Q':
-            return parseTokenOneDigit;
-        case 'DDDD':
-            return parseTokenThreeDigits;
-        case 'YYYY':
-        case 'GGGG':
-        case 'gggg':
-            return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
-        case 'Y':
-        case 'G':
-        case 'g':
-            return parseTokenSignedNumber;
-        case 'YYYYYY':
-        case 'YYYYY':
-        case 'GGGGG':
-        case 'ggggg':
-            return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
-        case 'S':
-            if (strict) {
-                return parseTokenOneDigit;
-            }
-            /* falls through */
-        case 'SS':
-            if (strict) {
-                return parseTokenTwoDigits;
-            }
-            /* falls through */
-        case 'SSS':
-            if (strict) {
-                return parseTokenThreeDigits;
-            }
-            /* falls through */
-        case 'DDD':
-            return parseTokenOneToThreeDigits;
-        case 'MMM':
-        case 'MMMM':
-        case 'dd':
-        case 'ddd':
-        case 'dddd':
-            return parseTokenWord;
-        case 'a':
-        case 'A':
-            return config._locale._meridiemParse;
-        case 'x':
-            return parseTokenOffsetMs;
-        case 'X':
-            return parseTokenTimestampMs;
-        case 'Z':
-        case 'ZZ':
-            return parseTokenTimezone;
-        case 'T':
-            return parseTokenT;
-        case 'SSSS':
-            return parseTokenDigits;
-        case 'MM':
-        case 'DD':
-        case 'YY':
-        case 'GG':
-        case 'gg':
-        case 'HH':
-        case 'hh':
-        case 'mm':
-        case 'ss':
-        case 'ww':
-        case 'WW':
-            return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
-        case 'M':
-        case 'D':
-        case 'd':
-        case 'H':
-        case 'h':
-        case 'm':
-        case 's':
-        case 'w':
-        case 'W':
-        case 'e':
-        case 'E':
-            return parseTokenOneOrTwoDigits;
-        case 'Do':
-            return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient;
-        default :
-            a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));
-            return a;
+    var matchUnsigned  = /\d+/;           //       0 - inf
+    var matchSigned    = /[+-]?\d+/;      //    -inf - inf
+
+    var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
+    var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
+
+    var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
+
+    // any word (or two) characters or numbers including two/three word month in arabic.
+    // includes scottish gaelic two word and hyphenated months
+    var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
+
+
+    var regexes = {};
+
+    function addRegexToken (token, regex, strictRegex) {
+        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
+            return (isStrict && strictRegex) ? strictRegex : regex;
+        };
+    }
+
+    function getParseRegexForToken (token, config) {
+        if (!hasOwnProp(regexes, token)) {
+            return new RegExp(unescapeFormat(token));
         }
+
+        return regexes[token](config._strict, config._locale);
     }
 
-    function timezoneMinutesFromString(string) {
-        string = string || '';
-        var possibleTzMatches = (string.match(parseTokenTimezone) || []),
-            tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
-            parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
-            minutes = +(parts[1] * 60) + toInt(parts[2]);
+    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+    function unescapeFormat(s) {
+        return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+            return p1 || p2 || p3 || p4;
+        }));
+    }
 
-        return parts[0] === '+' ? -minutes : minutes;
+    function regexEscape(s) {
+        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
     }
 
-    // function to convert string input to date
-    function addTimeToArrayFromToken(token, input, config) {
-        var a, datePartArray = config._a;
-
-        switch (token) {
-        // QUARTER
-        case 'Q':
-            if (input != null) {
-                datePartArray[MONTH] = (toInt(input) - 1) * 3;
-            }
-            break;
-        // MONTH
-        case 'M' : // fall through to MM
-        case 'MM' :
-            if (input != null) {
-                datePartArray[MONTH] = toInt(input) - 1;
-            }
-            break;
-        case 'MMM' : // fall through to MMMM
-        case 'MMMM' :
-            a = config._locale.monthsParse(input, token, config._strict);
-            // if we didn't find a month name, mark the date as invalid.
-            if (a != null) {
-                datePartArray[MONTH] = a;
-            } else {
-                config._pf.invalidMonth = input;
-            }
-            break;
-        // DAY OF MONTH
-        case 'D' : // fall through to DD
-        case 'DD' :
-            if (input != null) {
-                datePartArray[DATE] = toInt(input);
-            }
-            break;
-        case 'Do' :
-            if (input != null) {
-                datePartArray[DATE] = toInt(parseInt(
-                            input.match(/\d{1,2}/)[0], 10));
-            }
-            break;
-        // DAY OF YEAR
-        case 'DDD' : // fall through to DDDD
-        case 'DDDD' :
-            if (input != null) {
-                config._dayOfYear = toInt(input);
-            }
-
-            break;
-        // YEAR
-        case 'YY' :
-            datePartArray[YEAR] = moment.parseTwoDigitYear(input);
-            break;
-        case 'YYYY' :
-        case 'YYYYY' :
-        case 'YYYYYY' :
-            datePartArray[YEAR] = toInt(input);
-            break;
-        // AM / PM
-        case 'a' : // fall through to A
-        case 'A' :
-            config._isPm = config._locale.isPM(input);
-            break;
-        // HOUR
-        case 'h' : // fall through to hh
-        case 'hh' :
-            config._pf.bigHour = true;
-            /* falls through */
-        case 'H' : // fall through to HH
-        case 'HH' :
-            datePartArray[HOUR] = toInt(input);
-            break;
-        // MINUTE
-        case 'm' : // fall through to mm
-        case 'mm' :
-            datePartArray[MINUTE] = toInt(input);
-            break;
-        // SECOND
-        case 's' : // fall through to ss
-        case 'ss' :
-            datePartArray[SECOND] = toInt(input);
-            break;
-        // MILLISECOND
-        case 'S' :
-        case 'SS' :
-        case 'SSS' :
-        case 'SSSS' :
-            datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
-            break;
-        // UNIX OFFSET (MILLISECONDS)
-        case 'x':
-            config._d = new Date(toInt(input));
-            break;
-        // UNIX TIMESTAMP WITH MS
-        case 'X':
-            config._d = new Date(parseFloat(input) * 1000);
-            break;
-        // TIMEZONE
-        case 'Z' : // fall through to ZZ
-        case 'ZZ' :
-            config._useUTC = true;
-            config._tzm = timezoneMinutesFromString(input);
-            break;
-        // WEEKDAY - human
-        case 'dd':
-        case 'ddd':
-        case 'dddd':
-            a = config._locale.weekdaysParse(input);
-            // if we didn't get a weekday name, mark the date as invalid
-            if (a != null) {
-                config._w = config._w || {};
-                config._w['d'] = a;
-            } else {
-                config._pf.invalidWeekday = input;
-            }
-            break;
-        // WEEK, WEEK DAY - numeric
-        case 'w':
-        case 'ww':
-        case 'W':
-        case 'WW':
-        case 'd':
-        case 'e':
-        case 'E':
-            token = token.substr(0, 1);
-            /* falls through */
-        case 'gggg':
-        case 'GGGG':
-        case 'GGGGG':
-            token = token.substr(0, 2);
-            if (input) {
-                config._w = config._w || {};
-                config._w[token] = toInt(input);
-            }
-            break;
-        case 'gg':
-        case 'GG':
-            config._w = config._w || {};
-            config._w[token] = moment.parseTwoDigitYear(input);
+    var tokens = {};
+
+    function addParseToken (token, callback) {
+        var i, func = callback;
+        if (typeof token === 'string') {
+            token = [token];
+        }
+        if (typeof callback === 'number') {
+            func = function (input, array) {
+                array[callback] = toInt(input);
+            };
+        }
+        for (i = 0; i < token.length; i++) {
+            tokens[token[i]] = func;
         }
     }
 
-    function dayOfYearFromWeekInfo(config) {
-        var w, weekYear, week, weekday, dow, doy, temp;
+    function addWeekParseToken (token, callback) {
+        addParseToken(token, function (input, array, config, token) {
+            config._w = config._w || {};
+            callback(input, config._w, config, token);
+        });
+    }
 
-        w = config._w;
-        if (w.GG != null || w.W != null || w.E != null) {
-            dow = 1;
-            doy = 4;
+    function addTimeToArrayFromToken(token, input, config) {
+        if (input != null && hasOwnProp(tokens, token)) {
+            tokens[token](input, config._a, config, token);
+        }
+    }
 
-            // TODO: We need to take the current isoWeekYear, but that depends on
-            // how we interpret now (local, utc, fixed offset). So create
-            // a now version of current config (take local/utc/offset flags, and
-            // create now).
-            weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);
-            week = dfl(w.W, 1);
-            weekday = dfl(w.E, 1);
-        } else {
-            dow = config._locale._week.dow;
-            doy = config._locale._week.doy;
+    var YEAR = 0;
+    var MONTH = 1;
+    var DATE = 2;
+    var HOUR = 3;
+    var MINUTE = 4;
+    var SECOND = 5;
+    var MILLISECOND = 6;
+    var WEEK = 7;
+    var WEEKDAY = 8;
 
-            weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);
-            week = dfl(w.w, 1);
+    var indexOf;
 
-            if (w.d != null) {
-                // weekday -- low day numbers are considered next week
-                weekday = w.d;
-                if (weekday < dow) {
-                    ++week;
+    if (Array.prototype.indexOf) {
+        indexOf = Array.prototype.indexOf;
+    } else {
+        indexOf = function (o) {
+            // I know
+            var i;
+            for (i = 0; i < this.length; ++i) {
+                if (this[i] === o) {
+                    return i;
                 }
-            } else if (w.e != null) {
-                // local weekday -- counting starts from begining of week
-                weekday = w.e + dow;
-            } else {
-                // default to begining of week
-                weekday = dow;
             }
-        }
-        temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
+            return -1;
+        };
+    }
 
-        config._a[YEAR] = temp.year;
-        config._dayOfYear = temp.dayOfYear;
+    function daysInMonth(year, month) {
+        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
     }
 
-    // convert an array to a date.
-    // the array should mirror the parameters below
-    // note: all values past the year are optional and will default to the lowest possible value.
-    // [year, month, day , hour, minute, second, millisecond]
-    function dateFromConfig(config) {
-        var i, date, input = [], currentDate, yearToUse;
+    // FORMATTING
 
-        if (config._d) {
-            return;
-        }
+    addFormatToken('M', ['MM', 2], 'Mo', function () {
+        return this.month() + 1;
+    });
 
-        currentDate = currentDateArray(config);
+    addFormatToken('MMM', 0, 0, function (format) {
+        return this.localeData().monthsShort(this, format);
+    });
 
-        //compute day of the year from weeks and weekdays
-        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
-            dayOfYearFromWeekInfo(config);
-        }
+    addFormatToken('MMMM', 0, 0, function (format) {
+        return this.localeData().months(this, format);
+    });
 
-        //if the day of the year is set, figure out what it is
-        if (config._dayOfYear) {
-            yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);
+    // ALIASES
 
-            if (config._dayOfYear > daysInYear(yearToUse)) {
-                config._pf._overflowDayOfYear = true;
-            }
+    addUnitAlias('month', 'M');
 
-            date = makeUTCDate(yearToUse, 0, config._dayOfYear);
-            config._a[MONTH] = date.getUTCMonth();
-            config._a[DATE] = date.getUTCDate();
-        }
+    // PRIORITY
 
-        // Default to current date.
-        // * if no year, month, day of month are given, default to today
-        // * if day of month is given, default month and year
-        // * if month is given, default only year
-        // * if year is given, don't default anything
-        for (i = 0; i < 3 && config._a[i] == null; ++i) {
-            config._a[i] = input[i] = currentDate[i];
+    addUnitPriority('month', 8);
+
+    // PARSING
+
+    addRegexToken('M',    match1to2);
+    addRegexToken('MM',   match1to2, match2);
+    addRegexToken('MMM',  function (isStrict, locale) {
+        return locale.monthsShortRegex(isStrict);
+    });
+    addRegexToken('MMMM', function (isStrict, locale) {
+        return locale.monthsRegex(isStrict);
+    });
+
+    addParseToken(['M', 'MM'], function (input, array) {
+        array[MONTH] = toInt(input) - 1;
+    });
+
+    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
+        var month = config._locale.monthsParse(input, token, config._strict);
+        // if we didn't find a month name, mark the date as invalid.
+        if (month != null) {
+            array[MONTH] = month;
+        } else {
+            getParsingFlags(config).invalidMonth = input;
         }
+    });
 
-        // Zero out whatever was not defaulted, including time
-        for (; i < 7; i++) {
-            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+    // LOCALES
+
+    var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/;
+    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+    function localeMonths (m, format) {
+        if (!m) {
+            return this._months;
         }
+        return isArray(this._months) ? this._months[m.month()] :
+            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
+    }
 
-        // Check for 24:00:00.000
-        if (config._a[HOUR] === 24 &&
-                config._a[MINUTE] === 0 &&
-                config._a[SECOND] === 0 &&
-                config._a[MILLISECOND] === 0) {
-            config._nextDay = true;
-            config._a[HOUR] = 0;
+    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+    function localeMonthsShort (m, format) {
+        if (!m) {
+            return this._monthsShort;
         }
+        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
+            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
+    }
 
-        config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
-        // Apply timezone offset from input. The actual zone can be changed
-        // with parseZone.
-        if (config._tzm != null) {
-            config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm);
+    function units_month__handleStrictParse(monthName, format, strict) {
+        var i, ii, mom, llc = monthName.toLocaleLowerCase();
+        if (!this._monthsParse) {
+            // this is not used
+            this._monthsParse = [];
+            this._longMonthsParse = [];
+            this._shortMonthsParse = [];
+            for (i = 0; i < 12; ++i) {
+                mom = create_utc__createUTC([2000, i]);
+                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
+                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
+            }
         }
 
-        if (config._nextDay) {
-            config._a[HOUR] = 24;
+        if (strict) {
+            if (format === 'MMM') {
+                ii = indexOf.call(this._shortMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._longMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            }
+        } else {
+            if (format === 'MMM') {
+                ii = indexOf.call(this._shortMonthsParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._longMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._longMonthsParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._shortMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            }
         }
     }
 
-    function dateFromObject(config) {
-        var normalizedInput;
+    function localeMonthsParse (monthName, format, strict) {
+        var i, mom, regex;
 
-        if (config._d) {
-            return;
+        if (this._monthsParseExact) {
+            return units_month__handleStrictParse.call(this, monthName, format, strict);
         }
 
-        normalizedInput = normalizeObjectUnits(config._i);
-        config._a = [
-            normalizedInput.year,
-            normalizedInput.month,
-            normalizedInput.day || normalizedInput.date,
-            normalizedInput.hour,
-            normalizedInput.minute,
-            normalizedInput.second,
-            normalizedInput.millisecond
-        ];
+        if (!this._monthsParse) {
+            this._monthsParse = [];
+            this._longMonthsParse = [];
+            this._shortMonthsParse = [];
+        }
 
-        dateFromConfig(config);
+        // TODO: add sorting
+        // Sorting makes sure if one month (or abbr) is a prefix of another
+        // see sorting in computeMonthsParse
+        for (i = 0; i < 12; i++) {
+            // make the regex if we don't have it already
+            mom = create_utc__createUTC([2000, i]);
+            if (strict && !this._longMonthsParse[i]) {
+                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
+                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
+            }
+            if (!strict && !this._monthsParse[i]) {
+                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+            }
+            // test the regex
+            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
+                return i;
+            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
+                return i;
+            } else if (!strict && this._monthsParse[i].test(monthName)) {
+                return i;
+            }
+        }
     }
 
-    function currentDateArray(config) {
-        var now = new Date();
-        if (config._useUTC) {
-            return [
-                now.getUTCFullYear(),
-                now.getUTCMonth(),
-                now.getUTCDate()
-            ];
-        } else {
-            return [now.getFullYear(), now.getMonth(), now.getDate()];
+    // MOMENTS
+
+    function setMonth (mom, value) {
+        var dayOfMonth;
+
+        if (!mom.isValid()) {
+            // No op
+            return mom;
         }
-    }
 
-    // date from string and format string
-    function makeDateFromStringAndFormat(config) {
-        if (config._f === moment.ISO_8601) {
-            parseISO(config);
-            return;
+        if (typeof value === 'string') {
+            if (/^\d+$/.test(value)) {
+                value = toInt(value);
+            } else {
+                value = mom.localeData().monthsParse(value);
+                // TODO: Another silent failure?
+                if (typeof value !== 'number') {
+                    return mom;
+                }
+            }
         }
 
-        config._a = [];
-        config._pf.empty = true;
+        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
+        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
+        return mom;
+    }
 
-        // This array is used to make a Date, either with `new Date` or `Date.UTC`
-        var string = '' + config._i,
-            i, parsedInput, tokens, token, skipped,
-            stringLength = string.length,
-            totalParsedInputLength = 0;
+    function getSetMonth (value) {
+        if (value != null) {
+            setMonth(this, value);
+            utils_hooks__hooks.updateOffset(this, true);
+            return this;
+        } else {
+            return get_set__get(this, 'Month');
+        }
+    }
 
-        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+    function getDaysInMonth () {
+        return daysInMonth(this.year(), this.month());
+    }
 
-        for (i = 0; i < tokens.length; i++) {
-            token = tokens[i];
-            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
-            if (parsedInput) {
-                skipped = string.substr(0, string.indexOf(parsedInput));
-                if (skipped.length > 0) {
-                    config._pf.unusedInput.push(skipped);
-                }
-                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
-                totalParsedInputLength += parsedInput.length;
+    var defaultMonthsShortRegex = matchWord;
+    function monthsShortRegex (isStrict) {
+        if (this._monthsParseExact) {
+            if (!hasOwnProp(this, '_monthsRegex')) {
+                computeMonthsParse.call(this);
             }
-            // don't parse if it's not a known token
-            if (formatTokenFunctions[token]) {
-                if (parsedInput) {
-                    config._pf.empty = false;
-                }
-                else {
-                    config._pf.unusedTokens.push(token);
-                }
-                addTimeToArrayFromToken(token, parsedInput, config);
+            if (isStrict) {
+                return this._monthsShortStrictRegex;
+            } else {
+                return this._monthsShortRegex;
             }
-            else if (config._strict && !parsedInput) {
-                config._pf.unusedTokens.push(token);
+        } else {
+            if (!hasOwnProp(this, '_monthsShortRegex')) {
+                this._monthsShortRegex = defaultMonthsShortRegex;
             }
+            return this._monthsShortStrictRegex && isStrict ?
+                this._monthsShortStrictRegex : this._monthsShortRegex;
         }
+    }
 
-        // add remaining unparsed input length to the string
-        config._pf.charsLeftOver = stringLength - totalParsedInputLength;
-        if (string.length > 0) {
-            config._pf.unusedInput.push(string);
+    var defaultMonthsRegex = matchWord;
+    function monthsRegex (isStrict) {
+        if (this._monthsParseExact) {
+            if (!hasOwnProp(this, '_monthsRegex')) {
+                computeMonthsParse.call(this);
+            }
+            if (isStrict) {
+                return this._monthsStrictRegex;
+            } else {
+                return this._monthsRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_monthsRegex')) {
+                this._monthsRegex = defaultMonthsRegex;
+            }
+            return this._monthsStrictRegex && isStrict ?
+                this._monthsStrictRegex : this._monthsRegex;
         }
+    }
 
-        // clear _12h flag if hour is <= 12
-        if (config._pf.bigHour === true && config._a[HOUR] <= 12) {
-            config._pf.bigHour = undefined;
+    function computeMonthsParse () {
+        function cmpLenRev(a, b) {
+            return b.length - a.length;
         }
-        // handle am pm
-        if (config._isPm && config._a[HOUR] < 12) {
-            config._a[HOUR] += 12;
+
+        var shortPieces = [], longPieces = [], mixedPieces = [],
+            i, mom;
+        for (i = 0; i < 12; i++) {
+            // make the regex if we don't have it already
+            mom = create_utc__createUTC([2000, i]);
+            shortPieces.push(this.monthsShort(mom, ''));
+            longPieces.push(this.months(mom, ''));
+            mixedPieces.push(this.months(mom, ''));
+            mixedPieces.push(this.monthsShort(mom, ''));
         }
-        // if is 12 am, change hours to 0
-        if (config._isPm === false && config._a[HOUR] === 12) {
-            config._a[HOUR] = 0;
+        // Sorting makes sure if one month (or abbr) is a prefix of another it
+        // will match the longer piece.
+        shortPieces.sort(cmpLenRev);
+        longPieces.sort(cmpLenRev);
+        mixedPieces.sort(cmpLenRev);
+        for (i = 0; i < 12; i++) {
+            shortPieces[i] = regexEscape(shortPieces[i]);
+            longPieces[i] = regexEscape(longPieces[i]);
+        }
+        for (i = 0; i < 24; i++) {
+            mixedPieces[i] = regexEscape(mixedPieces[i]);
         }
-        dateFromConfig(config);
-        checkOverflow(config);
-    }
 
-    function unescapeFormat(s) {
-        return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
-            return p1 || p2 || p3 || p4;
-        });
+        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+        this._monthsShortRegex = this._monthsRegex;
+        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
     }
 
-    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
-    function regexpEscape(s) {
-        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
-    }
+    // FORMATTING
 
-    // date from string and array of format strings
-    function makeDateFromStringAndArray(config) {
-        var tempConfig,
-            bestMoment,
+    addFormatToken('Y', 0, 0, function () {
+        var y = this.year();
+        return y <= 9999 ? '' + y : '+' + y;
+    });
 
-            scoreToBeat,
-            i,
-            currentScore;
+    addFormatToken(0, ['YY', 2], 0, function () {
+        return this.year() % 100;
+    });
 
-        if (config._f.length === 0) {
-            config._pf.invalidFormat = true;
-            config._d = new Date(NaN);
-            return;
-        }
+    addFormatToken(0, ['YYYY',   4],       0, 'year');
+    addFormatToken(0, ['YYYYY',  5],       0, 'year');
+    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
 
-        for (i = 0; i < config._f.length; i++) {
-            currentScore = 0;
-            tempConfig = copyConfig({}, config);
-            if (config._useUTC != null) {
-                tempConfig._useUTC = config._useUTC;
-            }
-            tempConfig._pf = defaultParsingFlags();
-            tempConfig._f = config._f[i];
-            makeDateFromStringAndFormat(tempConfig);
+    // ALIASES
 
-            if (!isValid(tempConfig)) {
-                continue;
-            }
+    addUnitAlias('year', 'y');
 
-            // if there is any input that was not parsed add a penalty for that format
-            currentScore += tempConfig._pf.charsLeftOver;
+    // PRIORITIES
 
-            //or tokens
-            currentScore += tempConfig._pf.unusedTokens.length * 10;
+    addUnitPriority('year', 1);
 
-            tempConfig._pf.score = currentScore;
+    // PARSING
 
-            if (scoreToBeat == null || currentScore < scoreToBeat) {
-                scoreToBeat = currentScore;
-                bestMoment = tempConfig;
-            }
-        }
+    addRegexToken('Y',      matchSigned);
+    addRegexToken('YY',     match1to2, match2);
+    addRegexToken('YYYY',   match1to4, match4);
+    addRegexToken('YYYYY',  match1to6, match6);
+    addRegexToken('YYYYYY', match1to6, match6);
 
-        extend(config, bestMoment || tempConfig);
-    }
+    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
+    addParseToken('YYYY', function (input, array) {
+        array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input);
+    });
+    addParseToken('YY', function (input, array) {
+        array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);
+    });
+    addParseToken('Y', function (input, array) {
+        array[YEAR] = parseInt(input, 10);
+    });
 
-    // date from iso format
-    function parseISO(config) {
-        var i, l,
-            string = config._i,
-            match = isoRegex.exec(string);
+    // HELPERS
 
-        if (match) {
-            config._pf.iso = true;
-            for (i = 0, l = isoDates.length; i < l; i++) {
-                if (isoDates[i][1].exec(string)) {
-                    // match[5] should be 'T' or undefined
-                    config._f = isoDates[i][0] + (match[6] || ' ');
-                    break;
-                }
-            }
-            for (i = 0, l = isoTimes.length; i < l; i++) {
-                if (isoTimes[i][1].exec(string)) {
-                    config._f += isoTimes[i][0];
-                    break;
-                }
-            }
-            if (string.match(parseTokenTimezone)) {
-                config._f += 'Z';
-            }
-            makeDateFromStringAndFormat(config);
-        } else {
-            config._isValid = false;
-        }
+    function daysInYear(year) {
+        return isLeapYear(year) ? 366 : 365;
     }
 
-    // date from iso format or fallback
-    function makeDateFromString(config) {
-        parseISO(config);
-        if (config._isValid === false) {
-            delete config._isValid;
-            moment.createFromInputFallback(config);
-        }
+    function isLeapYear(year) {
+        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
     }
 
-    function map(arr, fn) {
-        var res = [], i;
-        for (i = 0; i < arr.length; ++i) {
-            res.push(fn(arr[i], i));
-        }
-        return res;
-    }
+    // HOOKS
 
-    function makeDateFromInput(config) {
-        var input = config._i, matched;
-        if (input === undefined) {
-            config._d = new Date();
-        } else if (isDate(input)) {
-            config._d = new Date(+input);
-        } else if ((matched = aspNetJsonRegex.exec(input)) !== null) {
-            config._d = new Date(+matched[1]);
-        } else if (typeof input === 'string') {
-            makeDateFromString(config);
-        } else if (isArray(input)) {
-            config._a = map(input.slice(0), function (obj) {
-                return parseInt(obj, 10);
-            });
-            dateFromConfig(config);
-        } else if (typeof(input) === 'object') {
-            dateFromObject(config);
-        } else if (typeof(input) === 'number') {
-            // from milliseconds
-            config._d = new Date(input);
-        } else {
-            moment.createFromInputFallback(config);
-        }
+    utils_hooks__hooks.parseTwoDigitYear = function (input) {
+        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+    };
+
+    // MOMENTS
+
+    var getSetYear = makeGetSet('FullYear', true);
+
+    function getIsLeapYear () {
+        return isLeapYear(this.year());
     }
 
-    function makeDate(y, m, d, h, M, s, ms) {
+    function createDate (y, m, d, h, M, s, ms) {
         //can't just apply() to create a date:
         //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
         var date = new Date(y, m, d, h, M, s, ms);
 
-        //the date constructor doesn't accept years < 1970
-        if (y < 1970) {
+        //the date constructor remaps years 0-99 to 1900-1999
+        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
             date.setFullYear(y);
         }
         return date;
     }
 
-    function makeUTCDate(y) {
+    function createUTCDate (y) {
         var date = new Date(Date.UTC.apply(null, arguments));
-        if (y < 1970) {
+
+        //the Date.UTC function remaps years 0-99 to 1900-1999
+        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
             date.setUTCFullYear(y);
         }
         return date;
     }
 
-    function parseWeekday(input, locale) {
-        if (typeof input === 'string') {
-            if (!isNaN(input)) {
-                input = parseInt(input, 10);
-            }
-            else {
-                input = locale.weekdaysParse(input);
-                if (typeof input !== 'number') {
-                    return null;
-                }
-            }
+    // start-of-first-week - start-of-year
+    function firstWeekOffset(year, dow, doy) {
+        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+            fwd = 7 + dow - doy,
+            // first-week day local weekday -- which local weekday is fwd
+            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
+
+        return -fwdlw + fwd - 1;
+    }
+
+    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
+        var localWeekday = (7 + weekday - dow) % 7,
+            weekOffset = firstWeekOffset(year, dow, doy),
+            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
+            resYear, resDayOfYear;
+
+        if (dayOfYear <= 0) {
+            resYear = year - 1;
+            resDayOfYear = daysInYear(resYear) + dayOfYear;
+        } else if (dayOfYear > daysInYear(year)) {
+            resYear = year + 1;
+            resDayOfYear = dayOfYear - daysInYear(year);
+        } else {
+            resYear = year;
+            resDayOfYear = dayOfYear;
         }
-        return input;
+
+        return {
+            year: resYear,
+            dayOfYear: resDayOfYear
+        };
     }
 
-    /************************************
-        Relative Time
-    ************************************/
+    function weekOfYear(mom, dow, doy) {
+        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
+            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
+            resWeek, resYear;
+
+        if (week < 1) {
+            resYear = mom.year() - 1;
+            resWeek = week + weeksInYear(resYear, dow, doy);
+        } else if (week > weeksInYear(mom.year(), dow, doy)) {
+            resWeek = week - weeksInYear(mom.year(), dow, doy);
+            resYear = mom.year() + 1;
+        } else {
+            resYear = mom.year();
+            resWeek = week;
+        }
 
+        return {
+            week: resWeek,
+            year: resYear
+        };
+    }
 
-    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
-    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
-        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+    function weeksInYear(year, dow, doy) {
+        var weekOffset = firstWeekOffset(year, dow, doy),
+            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
+        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
     }
 
-    function relativeTime(posNegDuration, withoutSuffix, locale) {
-        var duration = moment.duration(posNegDuration).abs(),
-            seconds = round(duration.as('s')),
-            minutes = round(duration.as('m')),
-            hours = round(duration.as('h')),
-            days = round(duration.as('d')),
-            months = round(duration.as('M')),
-            years = round(duration.as('y')),
+    // FORMATTING
 
-            args = seconds < relativeTimeThresholds.s && ['s', seconds] ||
-                minutes === 1 && ['m'] ||
-                minutes < relativeTimeThresholds.m && ['mm', minutes] ||
-                hours === 1 && ['h'] ||
-                hours < relativeTimeThresholds.h && ['hh', hours] ||
-                days === 1 && ['d'] ||
-                days < relativeTimeThresholds.d && ['dd', days] ||
-                months === 1 && ['M'] ||
-                months < relativeTimeThresholds.M && ['MM', months] ||
-                years === 1 && ['y'] || ['yy', years];
+    addFormatToken('w', ['ww', 2], 'wo', 'week');
+    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
 
-        args[2] = withoutSuffix;
-        args[3] = +posNegDuration > 0;
-        args[4] = locale;
-        return substituteTimeAgo.apply({}, args);
-    }
+    // ALIASES
 
+    addUnitAlias('week', 'w');
+    addUnitAlias('isoWeek', 'W');
 
-    /************************************
-        Week of Year
-    ************************************/
+    // PRIORITIES
 
+    addUnitPriority('week', 5);
+    addUnitPriority('isoWeek', 5);
 
-    // firstDayOfWeek       0 = sun, 6 = sat
-    //                      the day of the week that starts the week
-    //                      (usually sunday or monday)
-    // firstDayOfWeekOfYear 0 = sun, 6 = sat
-    //                      the first week is the week that contains the first
-    //                      of this day of the week
-    //                      (eg. ISO weeks use thursday (4))
-    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
-        var end = firstDayOfWeekOfYear - firstDayOfWeek,
-            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
-            adjustedMoment;
+    // PARSING
 
+    addRegexToken('w',  match1to2);
+    addRegexToken('ww', match1to2, match2);
+    addRegexToken('W',  match1to2);
+    addRegexToken('WW', match1to2, match2);
 
-        if (daysToDayOfWeek > end) {
-            daysToDayOfWeek -= 7;
-        }
+    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
+        week[token.substr(0, 1)] = toInt(input);
+    });
 
-        if (daysToDayOfWeek < end - 7) {
-            daysToDayOfWeek += 7;
-        }
+    // HELPERS
 
-        adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd');
-        return {
-            week: Math.ceil(adjustedMoment.dayOfYear() / 7),
-            year: adjustedMoment.year()
-        };
+    // LOCALES
+
+    function localeWeek (mom) {
+        return weekOfYear(mom, this._week.dow, this._week.doy).week;
     }
 
-    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
-    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
-        var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
+    var defaultLocaleWeek = {
+        dow : 0, // Sunday is the first day of the week.
+        doy : 6  // The week that contains Jan 1st is the first week of the year.
+    };
 
-        d = d === 0 ? 7 : d;
-        weekday = weekday != null ? weekday : firstDayOfWeek;
-        daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
-        dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+    function localeFirstDayOfWeek () {
+        return this._week.dow;
+    }
 
-        return {
-            year: dayOfYear > 0 ? year : year - 1,
-            dayOfYear: dayOfYear > 0 ?  dayOfYear : daysInYear(year - 1) + dayOfYear
-        };
+    function localeFirstDayOfYear () {
+        return this._week.doy;
     }
 
-    /************************************
-        Top Level Functions
-    ************************************/
+    // MOMENTS
 
-    function makeMoment(config) {
-        var input = config._i,
-            format = config._f,
-            res;
+    function getSetWeek (input) {
+        var week = this.localeData().week(this);
+        return input == null ? week : this.add((input - week) * 7, 'd');
+    }
 
-        config._locale = config._locale || moment.localeData(config._l);
+    function getSetISOWeek (input) {
+        var week = weekOfYear(this, 1, 4).week;
+        return input == null ? week : this.add((input - week) * 7, 'd');
+    }
 
-        if (input === null || (format === undefined && input === '')) {
-            return moment.invalid({nullInput: true});
-        }
+    // FORMATTING
 
-        if (typeof input === 'string') {
-            config._i = input = config._locale.preparse(input);
-        }
+    addFormatToken('d', 0, 'do', 'day');
 
-        if (moment.isMoment(input)) {
-            return new Moment(input, true);
-        } else if (format) {
-            if (isArray(format)) {
-                makeDateFromStringAndArray(config);
-            } else {
-                makeDateFromStringAndFormat(config);
-            }
-        } else {
-            makeDateFromInput(config);
-        }
+    addFormatToken('dd', 0, 0, function (format) {
+        return this.localeData().weekdaysMin(this, format);
+    });
 
-        res = new Moment(config);
-        if (res._nextDay) {
-            // Adding is smart enough around DST
-            res.add(1, 'd');
-            res._nextDay = undefined;
-        }
+    addFormatToken('ddd', 0, 0, function (format) {
+        return this.localeData().weekdaysShort(this, format);
+    });
 
-        return res;
-    }
+    addFormatToken('dddd', 0, 0, function (format) {
+        return this.localeData().weekdays(this, format);
+    });
 
-    moment = function (input, format, locale, strict) {
-        var c;
+    addFormatToken('e', 0, 0, 'weekday');
+    addFormatToken('E', 0, 0, 'isoWeekday');
 
-        if (typeof(locale) === 'boolean') {
-            strict = locale;
-            locale = undefined;
+    // ALIASES
+
+    addUnitAlias('day', 'd');
+    addUnitAlias('weekday', 'e');
+    addUnitAlias('isoWeekday', 'E');
+
+    // PRIORITY
+    addUnitPriority('day', 11);
+    addUnitPriority('weekday', 11);
+    addUnitPriority('isoWeekday', 11);
+
+    // PARSING
+
+    addRegexToken('d',    match1to2);
+    addRegexToken('e',    match1to2);
+    addRegexToken('E',    match1to2);
+    addRegexToken('dd',   function (isStrict, locale) {
+        return locale.weekdaysMinRegex(isStrict);
+    });
+    addRegexToken('ddd',   function (isStrict, locale) {
+        return locale.weekdaysShortRegex(isStrict);
+    });
+    addRegexToken('dddd',   function (isStrict, locale) {
+        return locale.weekdaysRegex(isStrict);
+    });
+
+    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
+        var weekday = config._locale.weekdaysParse(input, token, config._strict);
+        // if we didn't get a weekday name, mark the date as invalid
+        if (weekday != null) {
+            week.d = weekday;
+        } else {
+            getParsingFlags(config).invalidWeekday = input;
         }
-        // object construction must be done this way.
-        // https://github.com/moment/moment/issues/1423
-        c = {};
-        c._isAMomentObject = true;
-        c._i = input;
-        c._f = format;
-        c._l = locale;
-        c._strict = strict;
-        c._isUTC = false;
-        c._pf = defaultParsingFlags();
+    });
 
-        return makeMoment(c);
-    };
+    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
+        week[token] = toInt(input);
+    });
 
-    moment.suppressDeprecationWarnings = false;
+    // HELPERS
 
-    moment.createFromInputFallback = deprecate(
-        'moment construction falls back to js Date. This is ' +
-        'discouraged and will be removed in upcoming major ' +
-        'release. Please refer to ' +
-        'https://github.com/moment/moment/issues/1407 for more info.',
-        function (config) {
-            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+    function parseWeekday(input, locale) {
+        if (typeof input !== 'string') {
+            return input;
         }
-    );
 
-    // Pick a moment m from moments so that m[fn](other) is true for all
-    // other. This relies on the function fn to be transitive.
-    //
-    // moments should either be an array of moment objects or an array, whose
-    // first element is an array of moment objects.
-    function pickBy(fn, moments) {
-        var res, i;
-        if (moments.length === 1 && isArray(moments[0])) {
-            moments = moments[0];
+        if (!isNaN(input)) {
+            return parseInt(input, 10);
         }
-        if (!moments.length) {
-            return moment();
+
+        input = locale.weekdaysParse(input);
+        if (typeof input === 'number') {
+            return input;
         }
-        res = moments[0];
-        for (i = 1; i < moments.length; ++i) {
-            if (moments[i][fn](res)) {
-                res = moments[i];
-            }
+
+        return null;
+    }
+
+    function parseIsoWeekday(input, locale) {
+        if (typeof input === 'string') {
+            return locale.weekdaysParse(input) % 7 || 7;
         }
-        return res;
+        return isNaN(input) ? null : input;
     }
 
-    moment.min = function () {
-        var args = [].slice.call(arguments, 0);
+    // LOCALES
 
-        return pickBy('isBefore', args);
-    };
+    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+    function localeWeekdays (m, format) {
+        if (!m) {
+            return this._weekdays;
+        }
+        return isArray(this._weekdays) ? this._weekdays[m.day()] :
+            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
+    }
 
-    moment.max = function () {
-        var args = [].slice.call(arguments, 0);
+    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+    function localeWeekdaysShort (m) {
+        return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
+    }
 
-        return pickBy('isAfter', args);
-    };
+    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+    function localeWeekdaysMin (m) {
+        return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
+    }
 
-    // creating with utc
-    moment.utc = function (input, format, locale, strict) {
-        var c;
+    function day_of_week__handleStrictParse(weekdayName, format, strict) {
+        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
+        if (!this._weekdaysParse) {
+            this._weekdaysParse = [];
+            this._shortWeekdaysParse = [];
+            this._minWeekdaysParse = [];
+
+            for (i = 0; i < 7; ++i) {
+                mom = create_utc__createUTC([2000, 1]).day(i);
+                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
+                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
+                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
+            }
+        }
 
-        if (typeof(locale) === 'boolean') {
-            strict = locale;
-            locale = undefined;
+        if (strict) {
+            if (format === 'dddd') {
+                ii = indexOf.call(this._weekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else if (format === 'ddd') {
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            }
+        } else {
+            if (format === 'dddd') {
+                ii = indexOf.call(this._weekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else if (format === 'ddd') {
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._weekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._weekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            }
         }
-        // object construction must be done this way.
-        // https://github.com/moment/moment/issues/1423
-        c = {};
-        c._isAMomentObject = true;
-        c._useUTC = true;
-        c._isUTC = true;
-        c._l = locale;
-        c._i = input;
-        c._f = format;
-        c._strict = strict;
-        c._pf = defaultParsingFlags();
+    }
 
-        return makeMoment(c).utc();
-    };
+    function localeWeekdaysParse (weekdayName, format, strict) {
+        var i, mom, regex;
 
-    // creating with unix timestamp (in seconds)
-    moment.unix = function (input) {
-        return moment(input * 1000);
-    };
+        if (this._weekdaysParseExact) {
+            return day_of_week__handleStrictParse.call(this, weekdayName, format, strict);
+        }
 
-    // duration
-    moment.duration = function (input, key) {
-        var duration = input,
-            // matching against regexp is expensive, do it on demand
-            match = null,
-            sign,
-            ret,
-            parseIso,
-            diffRes;
+        if (!this._weekdaysParse) {
+            this._weekdaysParse = [];
+            this._minWeekdaysParse = [];
+            this._shortWeekdaysParse = [];
+            this._fullWeekdaysParse = [];
+        }
 
-        if (moment.isDuration(input)) {
-            duration = {
-                ms: input._milliseconds,
-                d: input._days,
-                M: input._months
-            };
-        } else if (typeof input === 'number') {
-            duration = {};
-            if (key) {
-                duration[key] = input;
-            } else {
-                duration.milliseconds = input;
+        for (i = 0; i < 7; i++) {
+            // make the regex if we don't have it already
+
+            mom = create_utc__createUTC([2000, 1]).day(i);
+            if (strict && !this._fullWeekdaysParse[i]) {
+                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
+                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
+                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
             }
-        } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
-            sign = (match[1] === '-') ? -1 : 1;
-            duration = {
-                y: 0,
-                d: toInt(match[DATE]) * sign,
-                h: toInt(match[HOUR]) * sign,
-                m: toInt(match[MINUTE]) * sign,
-                s: toInt(match[SECOND]) * sign,
-                ms: toInt(match[MILLISECOND]) * sign
-            };
-        } else if (!!(match = isoDurationRegex.exec(input))) {
-            sign = (match[1] === '-') ? -1 : 1;
-            parseIso = function (inp) {
-                // We'd normally use ~~inp for this, but unfortunately it also
-                // converts floats to ints.
-                // inp may be undefined, so careful calling replace on it.
-                var res = inp && parseFloat(inp.replace(',', '.'));
-                // apply sign while we're at it
-                return (isNaN(res) ? 0 : res) * sign;
-            };
-            duration = {
-                y: parseIso(match[2]),
-                M: parseIso(match[3]),
-                d: parseIso(match[4]),
-                h: parseIso(match[5]),
-                m: parseIso(match[6]),
-                s: parseIso(match[7]),
-                w: parseIso(match[8])
-            };
-        } else if (typeof duration === 'object' &&
-                ('from' in duration || 'to' in duration)) {
-            diffRes = momentsDifference(moment(duration.from), moment(duration.to));
+            if (!this._weekdaysParse[i]) {
+                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+            }
+            // test the regex
+            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
+                return i;
+            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
+                return i;
+            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
+                return i;
+            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
+                return i;
+            }
+        }
+    }
 
-            duration = {};
-            duration.ms = diffRes.milliseconds;
-            duration.M = diffRes.months;
+    // MOMENTS
+
+    function getSetDayOfWeek (input) {
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
+        }
+        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+        if (input != null) {
+            input = parseWeekday(input, this.localeData());
+            return this.add(input - day, 'd');
+        } else {
+            return day;
         }
+    }
 
-        ret = new Duration(duration);
+    function getSetLocaleDayOfWeek (input) {
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
+        }
+        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
+        return input == null ? weekday : this.add(input - weekday, 'd');
+    }
 
-        if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {
-            ret._locale = input._locale;
+    function getSetISODayOfWeek (input) {
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
         }
 
-        return ret;
-    };
+        // behaves the same as moment#day except
+        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+        // as a setter, sunday should belong to the previous week.
 
-    // version number
-    moment.version = VERSION;
+        if (input != null) {
+            var weekday = parseIsoWeekday(input, this.localeData());
+            return this.day(this.day() % 7 ? weekday : weekday - 7);
+        } else {
+            return this.day() || 7;
+        }
+    }
 
-    // default format
-    moment.defaultFormat = isoFormat;
+    var defaultWeekdaysRegex = matchWord;
+    function weekdaysRegex (isStrict) {
+        if (this._weekdaysParseExact) {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                computeWeekdaysParse.call(this);
+            }
+            if (isStrict) {
+                return this._weekdaysStrictRegex;
+            } else {
+                return this._weekdaysRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                this._weekdaysRegex = defaultWeekdaysRegex;
+            }
+            return this._weekdaysStrictRegex && isStrict ?
+                this._weekdaysStrictRegex : this._weekdaysRegex;
+        }
+    }
 
-    // constant that refers to the ISO standard
-    moment.ISO_8601 = function () {};
+    var defaultWeekdaysShortRegex = matchWord;
+    function weekdaysShortRegex (isStrict) {
+        if (this._weekdaysParseExact) {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                computeWeekdaysParse.call(this);
+            }
+            if (isStrict) {
+                return this._weekdaysShortStrictRegex;
+            } else {
+                return this._weekdaysShortRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
+                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
+            }
+            return this._weekdaysShortStrictRegex && isStrict ?
+                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
+        }
+    }
 
-    // Plugins that add properties should also add the key here (null value),
-    // so we can properly clone ourselves.
-    moment.momentProperties = momentProperties;
+    var defaultWeekdaysMinRegex = matchWord;
+    function weekdaysMinRegex (isStrict) {
+        if (this._weekdaysParseExact) {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                computeWeekdaysParse.call(this);
+            }
+            if (isStrict) {
+                return this._weekdaysMinStrictRegex;
+            } else {
+                return this._weekdaysMinRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
+                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
+            }
+            return this._weekdaysMinStrictRegex && isStrict ?
+                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
+        }
+    }
 
-    // This function will be called whenever a moment is mutated.
-    // It is intended to keep the offset in sync with the timezone.
-    moment.updateOffset = function () {};
 
-    // This function allows you to set a threshold for relative time strings
-    moment.relativeTimeThreshold = function (threshold, limit) {
-        if (relativeTimeThresholds[threshold] === undefined) {
-            return false;
+    function computeWeekdaysParse () {
+        function cmpLenRev(a, b) {
+            return b.length - a.length;
         }
-        if (limit === undefined) {
-            return relativeTimeThresholds[threshold];
+
+        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
+            i, mom, minp, shortp, longp;
+        for (i = 0; i < 7; i++) {
+            // make the regex if we don't have it already
+            mom = create_utc__createUTC([2000, 1]).day(i);
+            minp = this.weekdaysMin(mom, '');
+            shortp = this.weekdaysShort(mom, '');
+            longp = this.weekdays(mom, '');
+            minPieces.push(minp);
+            shortPieces.push(shortp);
+            longPieces.push(longp);
+            mixedPieces.push(minp);
+            mixedPieces.push(shortp);
+            mixedPieces.push(longp);
         }
-        relativeTimeThresholds[threshold] = limit;
-        return true;
+        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
+        // will match the longer piece.
+        minPieces.sort(cmpLenRev);
+        shortPieces.sort(cmpLenRev);
+        longPieces.sort(cmpLenRev);
+        mixedPieces.sort(cmpLenRev);
+        for (i = 0; i < 7; i++) {
+            shortPieces[i] = regexEscape(shortPieces[i]);
+            longPieces[i] = regexEscape(longPieces[i]);
+            mixedPieces[i] = regexEscape(mixedPieces[i]);
+        }
+
+        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+        this._weekdaysShortRegex = this._weekdaysRegex;
+        this._weekdaysMinRegex = this._weekdaysRegex;
+
+        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
+    }
+
+    // FORMATTING
+
+    function hFormat() {
+        return this.hours() % 12 || 12;
+    }
+
+    function kFormat() {
+        return this.hours() || 24;
+    }
+
+    addFormatToken('H', ['HH', 2], 0, 'hour');
+    addFormatToken('h', ['hh', 2], 0, hFormat);
+    addFormatToken('k', ['kk', 2], 0, kFormat);
+
+    addFormatToken('hmm', 0, 0, function () {
+        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
+    });
+
+    addFormatToken('hmmss', 0, 0, function () {
+        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
+            zeroFill(this.seconds(), 2);
+    });
+
+    addFormatToken('Hmm', 0, 0, function () {
+        return '' + this.hours() + zeroFill(this.minutes(), 2);
+    });
+
+    addFormatToken('Hmmss', 0, 0, function () {
+        return '' + this.hours() + zeroFill(this.minutes(), 2) +
+            zeroFill(this.seconds(), 2);
+    });
+
+    function meridiem (token, lowercase) {
+        addFormatToken(token, 0, 0, function () {
+            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
+        });
+    }
+
+    meridiem('a', true);
+    meridiem('A', false);
+
+    // ALIASES
+
+    addUnitAlias('hour', 'h');
+
+    // PRIORITY
+    addUnitPriority('hour', 13);
+
+    // PARSING
+
+    function matchMeridiem (isStrict, locale) {
+        return locale._meridiemParse;
+    }
+
+    addRegexToken('a',  matchMeridiem);
+    addRegexToken('A',  matchMeridiem);
+    addRegexToken('H',  match1to2);
+    addRegexToken('h',  match1to2);
+    addRegexToken('HH', match1to2, match2);
+    addRegexToken('hh', match1to2, match2);
+
+    addRegexToken('hmm', match3to4);
+    addRegexToken('hmmss', match5to6);
+    addRegexToken('Hmm', match3to4);
+    addRegexToken('Hmmss', match5to6);
+
+    addParseToken(['H', 'HH'], HOUR);
+    addParseToken(['a', 'A'], function (input, array, config) {
+        config._isPm = config._locale.isPM(input);
+        config._meridiem = input;
+    });
+    addParseToken(['h', 'hh'], function (input, array, config) {
+        array[HOUR] = toInt(input);
+        getParsingFlags(config).bigHour = true;
+    });
+    addParseToken('hmm', function (input, array, config) {
+        var pos = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos));
+        array[MINUTE] = toInt(input.substr(pos));
+        getParsingFlags(config).bigHour = true;
+    });
+    addParseToken('hmmss', function (input, array, config) {
+        var pos1 = input.length - 4;
+        var pos2 = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos1));
+        array[MINUTE] = toInt(input.substr(pos1, 2));
+        array[SECOND] = toInt(input.substr(pos2));
+        getParsingFlags(config).bigHour = true;
+    });
+    addParseToken('Hmm', function (input, array, config) {
+        var pos = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos));
+        array[MINUTE] = toInt(input.substr(pos));
+    });
+    addParseToken('Hmmss', function (input, array, config) {
+        var pos1 = input.length - 4;
+        var pos2 = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos1));
+        array[MINUTE] = toInt(input.substr(pos1, 2));
+        array[SECOND] = toInt(input.substr(pos2));
+    });
+
+    // LOCALES
+
+    function localeIsPM (input) {
+        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+        // Using charAt should be more compatible.
+        return ((input + '').toLowerCase().charAt(0) === 'p');
+    }
+
+    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
+    function localeMeridiem (hours, minutes, isLower) {
+        if (hours > 11) {
+            return isLower ? 'pm' : 'PM';
+        } else {
+            return isLower ? 'am' : 'AM';
+        }
+    }
+
+
+    // MOMENTS
+
+    // Setting the hour should keep the time, because the user explicitly
+    // specified which hour he wants. So trying to maintain the same hour (in
+    // a new timezone) makes sense. Adding/subtracting hours does not follow
+    // this rule.
+    var getSetHour = makeGetSet('Hours', true);
+
+    var baseConfig = {
+        calendar: defaultCalendar,
+        longDateFormat: defaultLongDateFormat,
+        invalidDate: defaultInvalidDate,
+        ordinal: defaultOrdinal,
+        ordinalParse: defaultOrdinalParse,
+        relativeTime: defaultRelativeTime,
+
+        months: defaultLocaleMonths,
+        monthsShort: defaultLocaleMonthsShort,
+
+        week: defaultLocaleWeek,
+
+        weekdays: defaultLocaleWeekdays,
+        weekdaysMin: defaultLocaleWeekdaysMin,
+        weekdaysShort: defaultLocaleWeekdaysShort,
+
+        meridiemParse: defaultLocaleMeridiemParse
     };
 
-    moment.lang = deprecate(
-        'moment.lang is deprecated. Use moment.locale instead.',
-        function (key, value) {
-            return moment.locale(key, value);
+    // internal storage for locale config files
+    var locales = {};
+    var globalLocale;
+
+    function normalizeLocale(key) {
+        return key ? key.toLowerCase().replace('_', '-') : key;
+    }
+
+    // pick the locale from the array
+    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+    function chooseLocale(names) {
+        var i = 0, j, next, locale, split;
+
+        while (i < names.length) {
+            split = normalizeLocale(names[i]).split('-');
+            j = split.length;
+            next = normalizeLocale(names[i + 1]);
+            next = next ? next.split('-') : null;
+            while (j > 0) {
+                locale = loadLocale(split.slice(0, j).join('-'));
+                if (locale) {
+                    return locale;
+                }
+                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+                    //the next array item is better than a shallower substring of this one
+                    break;
+                }
+                j--;
+            }
+            i++;
+        }
+        return null;
+    }
+
+    function loadLocale(name) {
+        var oldLocale = null;
+        // TODO: Find a better way to register and load all the locales in Node
+        if (!locales[name] && (typeof module !== 'undefined') &&
+                module && module.require) {
+            try {
+                oldLocale = globalLocale._abbr;
+                module.require('./locale/' + name);
+                // because defineLocale currently also sets the global locale, we
+                // want to undo that for lazy loaded locales
+                locale_locales__getSetGlobalLocale(oldLocale);
+            } catch (e) { }
         }
-    );
+        return locales[name];
+    }
 
     // This function will load locale and then set the global locale.  If
     // no arguments are passed in, it will simply return the current global
     // locale key.
-    moment.locale = function (key, values) {
+    function locale_locales__getSetGlobalLocale (key, values) {
         var data;
         if (key) {
-            if (typeof(values) !== 'undefined') {
-                data = moment.defineLocale(key, values);
+            if (isUndefined(values)) {
+                data = locale_locales__getLocale(key);
             }
             else {
-                data = moment.localeData(key);
+                data = defineLocale(key, values);
             }
 
             if (data) {
-                moment.duration._locale = moment._locale = data;
+                // moment.duration._locale = moment._locale = data;
+                globalLocale = data;
             }
         }
 
-        return moment._locale._abbr;
-    };
+        return globalLocale._abbr;
+    }
 
-    moment.defineLocale = function (name, values) {
-        if (values !== null) {
-            values.abbr = name;
-            if (!locales[name]) {
-                locales[name] = new Locale();
+    function defineLocale (name, config) {
+        if (config !== null) {
+            var parentConfig = baseConfig;
+            config.abbr = name;
+            if (locales[name] != null) {
+                deprecateSimple('defineLocaleOverride',
+                        'use moment.updateLocale(localeName, config) to change ' +
+                        'an existing locale. moment.defineLocale(localeName, ' +
+                        'config) should only be used for creating a new locale ' +
+                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
+                parentConfig = locales[name]._config;
+            } else if (config.parentLocale != null) {
+                if (locales[config.parentLocale] != null) {
+                    parentConfig = locales[config.parentLocale]._config;
+                } else {
+                    // treat as if there is no base config
+                    deprecateSimple('parentLocaleUndefined',
+                            'specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/');
+                }
             }
-            locales[name].set(values);
+            locales[name] = new Locale(mergeConfigs(parentConfig, config));
 
             // backwards compat for now: also set the locale
-            moment.locale(name);
+            locale_locales__getSetGlobalLocale(name);
 
             return locales[name];
         } else {
             delete locales[name];
             return null;
         }
-    };
+    }
 
-    moment.langData = deprecate(
-        'moment.langData is deprecated. Use moment.localeData instead.',
-        function (key) {
-            return moment.localeData(key);
+    function updateLocale(name, config) {
+        if (config != null) {
+            var locale, parentConfig = baseConfig;
+            // MERGE
+            if (locales[name] != null) {
+                parentConfig = locales[name]._config;
+            }
+            config = mergeConfigs(parentConfig, config);
+            locale = new Locale(config);
+            locale.parentLocale = locales[name];
+            locales[name] = locale;
+
+            // backwards compat for now: also set the locale
+            locale_locales__getSetGlobalLocale(name);
+        } else {
+            // pass null for config to unupdate, useful for tests
+            if (locales[name] != null) {
+                if (locales[name].parentLocale != null) {
+                    locales[name] = locales[name].parentLocale;
+                } else if (locales[name] != null) {
+                    delete locales[name];
+                }
+            }
         }
-    );
+        return locales[name];
+    }
 
     // returns locale data
-    moment.localeData = function (key) {
+    function locale_locales__getLocale (key) {
         var locale;
 
-        if (key && key._locale && key._locale._abbr) {
-            key = key._locale._abbr;
-        }
+        if (key && key._locale && key._locale._abbr) {
+            key = key._locale._abbr;
+        }
+
+        if (!key) {
+            return globalLocale;
+        }
+
+        if (!isArray(key)) {
+            //short-circuit everything else
+            locale = loadLocale(key);
+            if (locale) {
+                return locale;
+            }
+            key = [key];
+        }
+
+        return chooseLocale(key);
+    }
+
+    function locale_locales__listLocales() {
+        return keys(locales);
+    }
+
+    function checkOverflow (m) {
+        var overflow;
+        var a = m._a;
+
+        if (a && getParsingFlags(m).overflow === -2) {
+            overflow =
+                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
+                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
+                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
+                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
+                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
+                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
+                -1;
+
+            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+                overflow = DATE;
+            }
+            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
+                overflow = WEEK;
+            }
+            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
+                overflow = WEEKDAY;
+            }
+
+            getParsingFlags(m).overflow = overflow;
+        }
+
+        return m;
+    }
+
+    // iso 8601 regex
+    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+    var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/;
+    var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/;
+
+    var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
+
+    var isoDates = [
+        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
+        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
+        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
+        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
+        ['YYYY-DDD', /\d{4}-\d{3}/],
+        ['YYYY-MM', /\d{4}-\d\d/, false],
+        ['YYYYYYMMDD', /[+-]\d{10}/],
+        ['YYYYMMDD', /\d{8}/],
+        // YYYYMM is NOT allowed by the standard
+        ['GGGG[W]WWE', /\d{4}W\d{3}/],
+        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
+        ['YYYYDDD', /\d{7}/]
+    ];
+
+    // iso time formats and regexes
+    var isoTimes = [
+        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
+        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
+        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
+        ['HH:mm', /\d\d:\d\d/],
+        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
+        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
+        ['HHmmss', /\d\d\d\d\d\d/],
+        ['HHmm', /\d\d\d\d/],
+        ['HH', /\d\d/]
+    ];
+
+    var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
+
+    // date from iso format
+    function configFromISO(config) {
+        var i, l,
+            string = config._i,
+            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
+            allowTime, dateFormat, timeFormat, tzFormat;
+
+        if (match) {
+            getParsingFlags(config).iso = true;
+
+            for (i = 0, l = isoDates.length; i < l; i++) {
+                if (isoDates[i][1].exec(match[1])) {
+                    dateFormat = isoDates[i][0];
+                    allowTime = isoDates[i][2] !== false;
+                    break;
+                }
+            }
+            if (dateFormat == null) {
+                config._isValid = false;
+                return;
+            }
+            if (match[3]) {
+                for (i = 0, l = isoTimes.length; i < l; i++) {
+                    if (isoTimes[i][1].exec(match[3])) {
+                        // match[2] should be 'T' or space
+                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
+                        break;
+                    }
+                }
+                if (timeFormat == null) {
+                    config._isValid = false;
+                    return;
+                }
+            }
+            if (!allowTime && timeFormat != null) {
+                config._isValid = false;
+                return;
+            }
+            if (match[4]) {
+                if (tzRegex.exec(match[4])) {
+                    tzFormat = 'Z';
+                } else {
+                    config._isValid = false;
+                    return;
+                }
+            }
+            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
+            configFromStringAndFormat(config);
+        } else {
+            config._isValid = false;
+        }
+    }
+
+    // date from iso format or fallback
+    function configFromString(config) {
+        var matched = aspNetJsonRegex.exec(config._i);
+
+        if (matched !== null) {
+            config._d = new Date(+matched[1]);
+            return;
+        }
+
+        configFromISO(config);
+        if (config._isValid === false) {
+            delete config._isValid;
+            utils_hooks__hooks.createFromInputFallback(config);
+        }
+    }
+
+    utils_hooks__hooks.createFromInputFallback = deprecate(
+        'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
+        'which is not reliable across all browsers and versions. Non ISO date formats are ' +
+        'discouraged and will be removed in an upcoming major release. Please refer to ' +
+        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
+        function (config) {
+            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+        }
+    );
+
+    // Pick the first defined of two or three arguments.
+    function defaults(a, b, c) {
+        if (a != null) {
+            return a;
+        }
+        if (b != null) {
+            return b;
+        }
+        return c;
+    }
+
+    function currentDateArray(config) {
+        // hooks is actually the exported moment object
+        var nowValue = new Date(utils_hooks__hooks.now());
+        if (config._useUTC) {
+            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
+        }
+        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
+    }
+
+    // convert an array to a date.
+    // the array should mirror the parameters below
+    // note: all values past the year are optional and will default to the lowest possible value.
+    // [year, month, day , hour, minute, second, millisecond]
+    function configFromArray (config) {
+        var i, date, input = [], currentDate, yearToUse;
+
+        if (config._d) {
+            return;
+        }
+
+        currentDate = currentDateArray(config);
+
+        //compute day of the year from weeks and weekdays
+        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+            dayOfYearFromWeekInfo(config);
+        }
+
+        //if the day of the year is set, figure out what it is
+        if (config._dayOfYear) {
+            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
+
+            if (config._dayOfYear > daysInYear(yearToUse)) {
+                getParsingFlags(config)._overflowDayOfYear = true;
+            }
+
+            date = createUTCDate(yearToUse, 0, config._dayOfYear);
+            config._a[MONTH] = date.getUTCMonth();
+            config._a[DATE] = date.getUTCDate();
+        }
+
+        // Default to current date.
+        // * if no year, month, day of month are given, default to today
+        // * if day of month is given, default month and year
+        // * if month is given, default only year
+        // * if year is given, don't default anything
+        for (i = 0; i < 3 && config._a[i] == null; ++i) {
+            config._a[i] = input[i] = currentDate[i];
+        }
+
+        // Zero out whatever was not defaulted, including time
+        for (; i < 7; i++) {
+            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+        }
+
+        // Check for 24:00:00.000
+        if (config._a[HOUR] === 24 &&
+                config._a[MINUTE] === 0 &&
+                config._a[SECOND] === 0 &&
+                config._a[MILLISECOND] === 0) {
+            config._nextDay = true;
+            config._a[HOUR] = 0;
+        }
+
+        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
+        // Apply timezone offset from input. The actual utcOffset can be changed
+        // with parseZone.
+        if (config._tzm != null) {
+            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+        }
+
+        if (config._nextDay) {
+            config._a[HOUR] = 24;
+        }
+    }
+
+    function dayOfYearFromWeekInfo(config) {
+        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
+
+        w = config._w;
+        if (w.GG != null || w.W != null || w.E != null) {
+            dow = 1;
+            doy = 4;
+
+            // TODO: We need to take the current isoWeekYear, but that depends on
+            // how we interpret now (local, utc, fixed offset). So create
+            // a now version of current config (take local/utc/offset flags, and
+            // create now).
+            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);
+            week = defaults(w.W, 1);
+            weekday = defaults(w.E, 1);
+            if (weekday < 1 || weekday > 7) {
+                weekdayOverflow = true;
+            }
+        } else {
+            dow = config._locale._week.dow;
+            doy = config._locale._week.doy;
+
+            weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);
+            week = defaults(w.w, 1);
+
+            if (w.d != null) {
+                // weekday -- low day numbers are considered next week
+                weekday = w.d;
+                if (weekday < 0 || weekday > 6) {
+                    weekdayOverflow = true;
+                }
+            } else if (w.e != null) {
+                // local weekday -- counting starts from begining of week
+                weekday = w.e + dow;
+                if (w.e < 0 || w.e > 6) {
+                    weekdayOverflow = true;
+                }
+            } else {
+                // default to begining of week
+                weekday = dow;
+            }
+        }
+        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
+            getParsingFlags(config)._overflowWeeks = true;
+        } else if (weekdayOverflow != null) {
+            getParsingFlags(config)._overflowWeekday = true;
+        } else {
+            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
+            config._a[YEAR] = temp.year;
+            config._dayOfYear = temp.dayOfYear;
+        }
+    }
+
+    // constant that refers to the ISO standard
+    utils_hooks__hooks.ISO_8601 = function () {};
+
+    // date from string and format string
+    function configFromStringAndFormat(config) {
+        // TODO: Move this to another part of the creation flow to prevent circular deps
+        if (config._f === utils_hooks__hooks.ISO_8601) {
+            configFromISO(config);
+            return;
+        }
+
+        config._a = [];
+        getParsingFlags(config).empty = true;
+
+        // This array is used to make a Date, either with `new Date` or `Date.UTC`
+        var string = '' + config._i,
+            i, parsedInput, tokens, token, skipped,
+            stringLength = string.length,
+            totalParsedInputLength = 0;
+
+        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+
+        for (i = 0; i < tokens.length; i++) {
+            token = tokens[i];
+            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+            // console.log('token', token, 'parsedInput', parsedInput,
+            //         'regex', getParseRegexForToken(token, config));
+            if (parsedInput) {
+                skipped = string.substr(0, string.indexOf(parsedInput));
+                if (skipped.length > 0) {
+                    getParsingFlags(config).unusedInput.push(skipped);
+                }
+                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+                totalParsedInputLength += parsedInput.length;
+            }
+            // don't parse if it's not a known token
+            if (formatTokenFunctions[token]) {
+                if (parsedInput) {
+                    getParsingFlags(config).empty = false;
+                }
+                else {
+                    getParsingFlags(config).unusedTokens.push(token);
+                }
+                addTimeToArrayFromToken(token, parsedInput, config);
+            }
+            else if (config._strict && !parsedInput) {
+                getParsingFlags(config).unusedTokens.push(token);
+            }
+        }
+
+        // add remaining unparsed input length to the string
+        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
+        if (string.length > 0) {
+            getParsingFlags(config).unusedInput.push(string);
+        }
+
+        // clear _12h flag if hour is <= 12
+        if (config._a[HOUR] <= 12 &&
+            getParsingFlags(config).bigHour === true &&
+            config._a[HOUR] > 0) {
+            getParsingFlags(config).bigHour = undefined;
+        }
+
+        getParsingFlags(config).parsedDateParts = config._a.slice(0);
+        getParsingFlags(config).meridiem = config._meridiem;
+        // handle meridiem
+        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
+
+        configFromArray(config);
+        checkOverflow(config);
+    }
+
+
+    function meridiemFixWrap (locale, hour, meridiem) {
+        var isPm;
+
+        if (meridiem == null) {
+            // nothing to do
+            return hour;
+        }
+        if (locale.meridiemHour != null) {
+            return locale.meridiemHour(hour, meridiem);
+        } else if (locale.isPM != null) {
+            // Fallback
+            isPm = locale.isPM(meridiem);
+            if (isPm && hour < 12) {
+                hour += 12;
+            }
+            if (!isPm && hour === 12) {
+                hour = 0;
+            }
+            return hour;
+        } else {
+            // this is not supposed to happen
+            return hour;
+        }
+    }
+
+    // date from string and array of format strings
+    function configFromStringAndArray(config) {
+        var tempConfig,
+            bestMoment,
+
+            scoreToBeat,
+            i,
+            currentScore;
+
+        if (config._f.length === 0) {
+            getParsingFlags(config).invalidFormat = true;
+            config._d = new Date(NaN);
+            return;
+        }
+
+        for (i = 0; i < config._f.length; i++) {
+            currentScore = 0;
+            tempConfig = copyConfig({}, config);
+            if (config._useUTC != null) {
+                tempConfig._useUTC = config._useUTC;
+            }
+            tempConfig._f = config._f[i];
+            configFromStringAndFormat(tempConfig);
+
+            if (!valid__isValid(tempConfig)) {
+                continue;
+            }
+
+            // if there is any input that was not parsed add a penalty for that format
+            currentScore += getParsingFlags(tempConfig).charsLeftOver;
+
+            //or tokens
+            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
+
+            getParsingFlags(tempConfig).score = currentScore;
+
+            if (scoreToBeat == null || currentScore < scoreToBeat) {
+                scoreToBeat = currentScore;
+                bestMoment = tempConfig;
+            }
+        }
+
+        extend(config, bestMoment || tempConfig);
+    }
+
+    function configFromObject(config) {
+        if (config._d) {
+            return;
+        }
+
+        var i = normalizeObjectUnits(config._i);
+        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
+            return obj && parseInt(obj, 10);
+        });
+
+        configFromArray(config);
+    }
+
+    function createFromConfig (config) {
+        var res = new Moment(checkOverflow(prepareConfig(config)));
+        if (res._nextDay) {
+            // Adding is smart enough around DST
+            res.add(1, 'd');
+            res._nextDay = undefined;
+        }
+
+        return res;
+    }
+
+    function prepareConfig (config) {
+        var input = config._i,
+            format = config._f;
+
+        config._locale = config._locale || locale_locales__getLocale(config._l);
+
+        if (input === null || (format === undefined && input === '')) {
+            return valid__createInvalid({nullInput: true});
+        }
+
+        if (typeof input === 'string') {
+            config._i = input = config._locale.preparse(input);
+        }
+
+        if (isMoment(input)) {
+            return new Moment(checkOverflow(input));
+        } else if (isArray(format)) {
+            configFromStringAndArray(config);
+        } else if (isDate(input)) {
+            config._d = input;
+        } else if (format) {
+            configFromStringAndFormat(config);
+        }  else {
+            configFromInput(config);
+        }
+
+        if (!valid__isValid(config)) {
+            config._d = null;
+        }
+
+        return config;
+    }
+
+    function configFromInput(config) {
+        var input = config._i;
+        if (input === undefined) {
+            config._d = new Date(utils_hooks__hooks.now());
+        } else if (isDate(input)) {
+            config._d = new Date(input.valueOf());
+        } else if (typeof input === 'string') {
+            configFromString(config);
+        } else if (isArray(input)) {
+            config._a = map(input.slice(0), function (obj) {
+                return parseInt(obj, 10);
+            });
+            configFromArray(config);
+        } else if (typeof(input) === 'object') {
+            configFromObject(config);
+        } else if (typeof(input) === 'number') {
+            // from milliseconds
+            config._d = new Date(input);
+        } else {
+            utils_hooks__hooks.createFromInputFallback(config);
+        }
+    }
+
+    function createLocalOrUTC (input, format, locale, strict, isUTC) {
+        var c = {};
+
+        if (typeof(locale) === 'boolean') {
+            strict = locale;
+            locale = undefined;
+        }
+
+        if ((isObject(input) && isObjectEmpty(input)) ||
+                (isArray(input) && input.length === 0)) {
+            input = undefined;
+        }
+        // object construction must be done this way.
+        // https://github.com/moment/moment/issues/1423
+        c._isAMomentObject = true;
+        c._useUTC = c._isUTC = isUTC;
+        c._l = locale;
+        c._i = input;
+        c._f = format;
+        c._strict = strict;
+
+        return createFromConfig(c);
+    }
+
+    function local__createLocal (input, format, locale, strict) {
+        return createLocalOrUTC(input, format, locale, strict, false);
+    }
+
+    var prototypeMin = deprecate(
+        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
+        function () {
+            var other = local__createLocal.apply(null, arguments);
+            if (this.isValid() && other.isValid()) {
+                return other < this ? this : other;
+            } else {
+                return valid__createInvalid();
+            }
+        }
+    );
+
+    var prototypeMax = deprecate(
+        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
+        function () {
+            var other = local__createLocal.apply(null, arguments);
+            if (this.isValid() && other.isValid()) {
+                return other > this ? this : other;
+            } else {
+                return valid__createInvalid();
+            }
+        }
+    );
+
+    // Pick a moment m from moments so that m[fn](other) is true for all
+    // other. This relies on the function fn to be transitive.
+    //
+    // moments should either be an array of moment objects or an array, whose
+    // first element is an array of moment objects.
+    function pickBy(fn, moments) {
+        var res, i;
+        if (moments.length === 1 && isArray(moments[0])) {
+            moments = moments[0];
+        }
+        if (!moments.length) {
+            return local__createLocal();
+        }
+        res = moments[0];
+        for (i = 1; i < moments.length; ++i) {
+            if (!moments[i].isValid() || moments[i][fn](res)) {
+                res = moments[i];
+            }
+        }
+        return res;
+    }
+
+    // TODO: Use [].sort instead?
+    function min () {
+        var args = [].slice.call(arguments, 0);
+
+        return pickBy('isBefore', args);
+    }
+
+    function max () {
+        var args = [].slice.call(arguments, 0);
+
+        return pickBy('isAfter', args);
+    }
+
+    var now = function () {
+        return Date.now ? Date.now() : +(new Date());
+    };
+
+    function Duration (duration) {
+        var normalizedInput = normalizeObjectUnits(duration),
+            years = normalizedInput.year || 0,
+            quarters = normalizedInput.quarter || 0,
+            months = normalizedInput.month || 0,
+            weeks = normalizedInput.week || 0,
+            days = normalizedInput.day || 0,
+            hours = normalizedInput.hour || 0,
+            minutes = normalizedInput.minute || 0,
+            seconds = normalizedInput.second || 0,
+            milliseconds = normalizedInput.millisecond || 0;
+
+        // representation for dateAddRemove
+        this._milliseconds = +milliseconds +
+            seconds * 1e3 + // 1000
+            minutes * 6e4 + // 1000 * 60
+            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+        // Because of dateAddRemove treats 24 hours as different from a
+        // day when working around DST, we need to store them separately
+        this._days = +days +
+            weeks * 7;
+        // It is impossible translate months into days without knowing
+        // which months you are are talking about, so we have to store
+        // it separately.
+        this._months = +months +
+            quarters * 3 +
+            years * 12;
+
+        this._data = {};
+
+        this._locale = locale_locales__getLocale();
+
+        this._bubble();
+    }
+
+    function isDuration (obj) {
+        return obj instanceof Duration;
+    }
+
+    function absRound (number) {
+        if (number < 0) {
+            return Math.round(-1 * number) * -1;
+        } else {
+            return Math.round(number);
+        }
+    }
+
+    // FORMATTING
+
+    function offset (token, separator) {
+        addFormatToken(token, 0, 0, function () {
+            var offset = this.utcOffset();
+            var sign = '+';
+            if (offset < 0) {
+                offset = -offset;
+                sign = '-';
+            }
+            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
+        });
+    }
+
+    offset('Z', ':');
+    offset('ZZ', '');
+
+    // PARSING
+
+    addRegexToken('Z',  matchShortOffset);
+    addRegexToken('ZZ', matchShortOffset);
+    addParseToken(['Z', 'ZZ'], function (input, array, config) {
+        config._useUTC = true;
+        config._tzm = offsetFromString(matchShortOffset, input);
+    });
+
+    // HELPERS
+
+    // timezone chunker
+    // '+10:00' > ['10',  '00']
+    // '-1530'  > ['-15', '30']
+    var chunkOffset = /([\+\-]|\d\d)/gi;
+
+    function offsetFromString(matcher, string) {
+        var matches = ((string || '').match(matcher) || []);
+        var chunk   = matches[matches.length - 1] || [];
+        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
+        var minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+        return parts[0] === '+' ? minutes : -minutes;
+    }
+
+    // Return a moment from input, that is local/utc/zone equivalent to model.
+    function cloneWithOffset(input, model) {
+        var res, diff;
+        if (model._isUTC) {
+            res = model.clone();
+            diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf();
+            // Use low-level api, because this fn is low-level api.
+            res._d.setTime(res._d.valueOf() + diff);
+            utils_hooks__hooks.updateOffset(res, false);
+            return res;
+        } else {
+            return local__createLocal(input).local();
+        }
+    }
+
+    function getDateOffset (m) {
+        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+        // https://github.com/moment/moment/pull/1871
+        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
+    }
+
+    // HOOKS
+
+    // This function will be called whenever a moment is mutated.
+    // It is intended to keep the offset in sync with the timezone.
+    utils_hooks__hooks.updateOffset = function () {};
+
+    // MOMENTS
+
+    // keepLocalTime = true means only change the timezone, without
+    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+    // +0200, so we adjust the time as needed, to be valid.
+    //
+    // Keeping the time actually adds/subtracts (one hour)
+    // from the actual represented time. That is why we call updateOffset
+    // a second time. In case it wants us to change the offset again
+    // _changeInProgress == true case, then we have to adjust, because
+    // there is no such time in the given timezone.
+    function getSetOffset (input, keepLocalTime) {
+        var offset = this._offset || 0,
+            localAdjust;
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
+        }
+        if (input != null) {
+            if (typeof input === 'string') {
+                input = offsetFromString(matchShortOffset, input);
+            } else if (Math.abs(input) < 16) {
+                input = input * 60;
+            }
+            if (!this._isUTC && keepLocalTime) {
+                localAdjust = getDateOffset(this);
+            }
+            this._offset = input;
+            this._isUTC = true;
+            if (localAdjust != null) {
+                this.add(localAdjust, 'm');
+            }
+            if (offset !== input) {
+                if (!keepLocalTime || this._changeInProgress) {
+                    add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);
+                } else if (!this._changeInProgress) {
+                    this._changeInProgress = true;
+                    utils_hooks__hooks.updateOffset(this, true);
+                    this._changeInProgress = null;
+                }
+            }
+            return this;
+        } else {
+            return this._isUTC ? offset : getDateOffset(this);
+        }
+    }
+
+    function getSetZone (input, keepLocalTime) {
+        if (input != null) {
+            if (typeof input !== 'string') {
+                input = -input;
+            }
+
+            this.utcOffset(input, keepLocalTime);
+
+            return this;
+        } else {
+            return -this.utcOffset();
+        }
+    }
+
+    function setOffsetToUTC (keepLocalTime) {
+        return this.utcOffset(0, keepLocalTime);
+    }
+
+    function setOffsetToLocal (keepLocalTime) {
+        if (this._isUTC) {
+            this.utcOffset(0, keepLocalTime);
+            this._isUTC = false;
+
+            if (keepLocalTime) {
+                this.subtract(getDateOffset(this), 'm');
+            }
+        }
+        return this;
+    }
+
+    function setOffsetToParsedOffset () {
+        if (this._tzm) {
+            this.utcOffset(this._tzm);
+        } else if (typeof this._i === 'string') {
+            var tZone = offsetFromString(matchOffset, this._i);
+
+            if (tZone === 0) {
+                this.utcOffset(0, true);
+            } else {
+                this.utcOffset(offsetFromString(matchOffset, this._i));
+            }
+        }
+        return this;
+    }
+
+    function hasAlignedHourOffset (input) {
+        if (!this.isValid()) {
+            return false;
+        }
+        input = input ? local__createLocal(input).utcOffset() : 0;
+
+        return (this.utcOffset() - input) % 60 === 0;
+    }
+
+    function isDaylightSavingTime () {
+        return (
+            this.utcOffset() > this.clone().month(0).utcOffset() ||
+            this.utcOffset() > this.clone().month(5).utcOffset()
+        );
+    }
+
+    function isDaylightSavingTimeShifted () {
+        if (!isUndefined(this._isDSTShifted)) {
+            return this._isDSTShifted;
+        }
+
+        var c = {};
+
+        copyConfig(c, this);
+        c = prepareConfig(c);
+
+        if (c._a) {
+            var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);
+            this._isDSTShifted = this.isValid() &&
+                compareArrays(c._a, other.toArray()) > 0;
+        } else {
+            this._isDSTShifted = false;
+        }
+
+        return this._isDSTShifted;
+    }
+
+    function isLocal () {
+        return this.isValid() ? !this._isUTC : false;
+    }
+
+    function isUtcOffset () {
+        return this.isValid() ? this._isUTC : false;
+    }
+
+    function isUtc () {
+        return this.isValid() ? this._isUTC && this._offset === 0 : false;
+    }
+
+    // ASP.NET json date format regex
+    var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
+
+    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+    // and further modified to allow for strings containing both week and day
+    var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
+
+    function create__createDuration (input, key) {
+        var duration = input,
+            // matching against regexp is expensive, do it on demand
+            match = null,
+            sign,
+            ret,
+            diffRes;
+
+        if (isDuration(input)) {
+            duration = {
+                ms : input._milliseconds,
+                d  : input._days,
+                M  : input._months
+            };
+        } else if (typeof input === 'number') {
+            duration = {};
+            if (key) {
+                duration[key] = input;
+            } else {
+                duration.milliseconds = input;
+            }
+        } else if (!!(match = aspNetRegex.exec(input))) {
+            sign = (match[1] === '-') ? -1 : 1;
+            duration = {
+                y  : 0,
+                d  : toInt(match[DATE])                         * sign,
+                h  : toInt(match[HOUR])                         * sign,
+                m  : toInt(match[MINUTE])                       * sign,
+                s  : toInt(match[SECOND])                       * sign,
+                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
+            };
+        } else if (!!(match = isoRegex.exec(input))) {
+            sign = (match[1] === '-') ? -1 : 1;
+            duration = {
+                y : parseIso(match[2], sign),
+                M : parseIso(match[3], sign),
+                w : parseIso(match[4], sign),
+                d : parseIso(match[5], sign),
+                h : parseIso(match[6], sign),
+                m : parseIso(match[7], sign),
+                s : parseIso(match[8], sign)
+            };
+        } else if (duration == null) {// checks for null or undefined
+            duration = {};
+        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
+            diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));
+
+            duration = {};
+            duration.ms = diffRes.milliseconds;
+            duration.M = diffRes.months;
+        }
+
+        ret = new Duration(duration);
+
+        if (isDuration(input) && hasOwnProp(input, '_locale')) {
+            ret._locale = input._locale;
+        }
+
+        return ret;
+    }
+
+    create__createDuration.fn = Duration.prototype;
+
+    function parseIso (inp, sign) {
+        // We'd normally use ~~inp for this, but unfortunately it also
+        // converts floats to ints.
+        // inp may be undefined, so careful calling replace on it.
+        var res = inp && parseFloat(inp.replace(',', '.'));
+        // apply sign while we're at it
+        return (isNaN(res) ? 0 : res) * sign;
+    }
+
+    function positiveMomentsDifference(base, other) {
+        var res = {milliseconds: 0, months: 0};
+
+        res.months = other.month() - base.month() +
+            (other.year() - base.year()) * 12;
+        if (base.clone().add(res.months, 'M').isAfter(other)) {
+            --res.months;
+        }
+
+        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
+
+        return res;
+    }
+
+    function momentsDifference(base, other) {
+        var res;
+        if (!(base.isValid() && other.isValid())) {
+            return {milliseconds: 0, months: 0};
+        }
+
+        other = cloneWithOffset(other, base);
+        if (base.isBefore(other)) {
+            res = positiveMomentsDifference(base, other);
+        } else {
+            res = positiveMomentsDifference(other, base);
+            res.milliseconds = -res.milliseconds;
+            res.months = -res.months;
+        }
+
+        return res;
+    }
+
+    // TODO: remove 'name' arg after deprecation is removed
+    function createAdder(direction, name) {
+        return function (val, period) {
+            var dur, tmp;
+            //invert the arguments, but complain about it
+            if (period !== null && !isNaN(+period)) {
+                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
+                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
+                tmp = val; val = period; period = tmp;
+            }
+
+            val = typeof val === 'string' ? +val : val;
+            dur = create__createDuration(val, period);
+            add_subtract__addSubtract(this, dur, direction);
+            return this;
+        };
+    }
+
+    function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {
+        var milliseconds = duration._milliseconds,
+            days = absRound(duration._days),
+            months = absRound(duration._months);
+
+        if (!mom.isValid()) {
+            // No op
+            return;
+        }
+
+        updateOffset = updateOffset == null ? true : updateOffset;
+
+        if (milliseconds) {
+            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
+        }
+        if (days) {
+            get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);
+        }
+        if (months) {
+            setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);
+        }
+        if (updateOffset) {
+            utils_hooks__hooks.updateOffset(mom, days || months);
+        }
+    }
+
+    var add_subtract__add      = createAdder(1, 'add');
+    var add_subtract__subtract = createAdder(-1, 'subtract');
+
+    function getCalendarFormat(myMoment, now) {
+        var diff = myMoment.diff(now, 'days', true);
+        return diff < -6 ? 'sameElse' :
+                diff < -1 ? 'lastWeek' :
+                diff < 0 ? 'lastDay' :
+                diff < 1 ? 'sameDay' :
+                diff < 2 ? 'nextDay' :
+                diff < 7 ? 'nextWeek' : 'sameElse';
+    }
+
+    function moment_calendar__calendar (time, formats) {
+        // We want to compare the start of today, vs this.
+        // Getting start-of-today depends on whether we're local/utc/offset or not.
+        var now = time || local__createLocal(),
+            sod = cloneWithOffset(now, this).startOf('day'),
+            format = utils_hooks__hooks.calendarFormat(this, sod) || 'sameElse';
+
+        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
+
+        return this.format(output || this.localeData().calendar(format, this, local__createLocal(now)));
+    }
+
+    function clone () {
+        return new Moment(this);
+    }
+
+    function isAfter (input, units) {
+        var localInput = isMoment(input) ? input : local__createLocal(input);
+        if (!(this.isValid() && localInput.isValid())) {
+            return false;
+        }
+        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+        if (units === 'millisecond') {
+            return this.valueOf() > localInput.valueOf();
+        } else {
+            return localInput.valueOf() < this.clone().startOf(units).valueOf();
+        }
+    }
+
+    function isBefore (input, units) {
+        var localInput = isMoment(input) ? input : local__createLocal(input);
+        if (!(this.isValid() && localInput.isValid())) {
+            return false;
+        }
+        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+        if (units === 'millisecond') {
+            return this.valueOf() < localInput.valueOf();
+        } else {
+            return this.clone().endOf(units).valueOf() < localInput.valueOf();
+        }
+    }
+
+    function isBetween (from, to, units, inclusivity) {
+        inclusivity = inclusivity || '()';
+        return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
+            (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
+    }
+
+    function isSame (input, units) {
+        var localInput = isMoment(input) ? input : local__createLocal(input),
+            inputMs;
+        if (!(this.isValid() && localInput.isValid())) {
+            return false;
+        }
+        units = normalizeUnits(units || 'millisecond');
+        if (units === 'millisecond') {
+            return this.valueOf() === localInput.valueOf();
+        } else {
+            inputMs = localInput.valueOf();
+            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
+        }
+    }
+
+    function isSameOrAfter (input, units) {
+        return this.isSame(input, units) || this.isAfter(input,units);
+    }
+
+    function isSameOrBefore (input, units) {
+        return this.isSame(input, units) || this.isBefore(input,units);
+    }
+
+    function diff (input, units, asFloat) {
+        var that,
+            zoneDelta,
+            delta, output;
+
+        if (!this.isValid()) {
+            return NaN;
+        }
+
+        that = cloneWithOffset(input, this);
+
+        if (!that.isValid()) {
+            return NaN;
+        }
+
+        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
+
+        units = normalizeUnits(units);
+
+        if (units === 'year' || units === 'month' || units === 'quarter') {
+            output = monthDiff(this, that);
+            if (units === 'quarter') {
+                output = output / 3;
+            } else if (units === 'year') {
+                output = output / 12;
+            }
+        } else {
+            delta = this - that;
+            output = units === 'second' ? delta / 1e3 : // 1000
+                units === 'minute' ? delta / 6e4 : // 1000 * 60
+                units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
+                units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+                units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+                delta;
+        }
+        return asFloat ? output : absFloor(output);
+    }
+
+    function monthDiff (a, b) {
+        // difference in months
+        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
+            // b is in (anchor - 1 month, anchor + 1 month)
+            anchor = a.clone().add(wholeMonthDiff, 'months'),
+            anchor2, adjust;
+
+        if (b - anchor < 0) {
+            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
+            // linear across the month
+            adjust = (b - anchor) / (anchor - anchor2);
+        } else {
+            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
+            // linear across the month
+            adjust = (b - anchor) / (anchor2 - anchor);
+        }
+
+        //check for negative zero, return zero if negative zero
+        return -(wholeMonthDiff + adjust) || 0;
+    }
+
+    utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
+    utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
+
+    function toString () {
+        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
+    }
+
+    function moment_format__toISOString () {
+        var m = this.clone().utc();
+        if (0 < m.year() && m.year() <= 9999) {
+            if (isFunction(Date.prototype.toISOString)) {
+                // native implementation is ~50x faster, use it when we can
+                return this.toDate().toISOString();
+            } else {
+                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+            }
+        } else {
+            return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+        }
+    }
+
+    function format (inputString) {
+        if (!inputString) {
+            inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat;
+        }
+        var output = formatMoment(this, inputString);
+        return this.localeData().postformat(output);
+    }
+
+    function from (time, withoutSuffix) {
+        if (this.isValid() &&
+                ((isMoment(time) && time.isValid()) ||
+                 local__createLocal(time).isValid())) {
+            return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
+        } else {
+            return this.localeData().invalidDate();
+        }
+    }
+
+    function fromNow (withoutSuffix) {
+        return this.from(local__createLocal(), withoutSuffix);
+    }
+
+    function to (time, withoutSuffix) {
+        if (this.isValid() &&
+                ((isMoment(time) && time.isValid()) ||
+                 local__createLocal(time).isValid())) {
+            return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
+        } else {
+            return this.localeData().invalidDate();
+        }
+    }
+
+    function toNow (withoutSuffix) {
+        return this.to(local__createLocal(), withoutSuffix);
+    }
+
+    // If passed a locale key, it will set the locale for this
+    // instance.  Otherwise, it will return the locale configuration
+    // variables for this instance.
+    function locale (key) {
+        var newLocaleData;
+
+        if (key === undefined) {
+            return this._locale._abbr;
+        } else {
+            newLocaleData = locale_locales__getLocale(key);
+            if (newLocaleData != null) {
+                this._locale = newLocaleData;
+            }
+            return this;
+        }
+    }
+
+    var lang = deprecate(
+        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+        function (key) {
+            if (key === undefined) {
+                return this.localeData();
+            } else {
+                return this.locale(key);
+            }
+        }
+    );
+
+    function localeData () {
+        return this._locale;
+    }
+
+    function startOf (units) {
+        units = normalizeUnits(units);
+        // the following switch intentionally omits break keywords
+        // to utilize falling through the cases.
+        switch (units) {
+            case 'year':
+                this.month(0);
+                /* falls through */
+            case 'quarter':
+            case 'month':
+                this.date(1);
+                /* falls through */
+            case 'week':
+            case 'isoWeek':
+            case 'day':
+            case 'date':
+                this.hours(0);
+                /* falls through */
+            case 'hour':
+                this.minutes(0);
+                /* falls through */
+            case 'minute':
+                this.seconds(0);
+                /* falls through */
+            case 'second':
+                this.milliseconds(0);
+        }
+
+        // weeks are a special case
+        if (units === 'week') {
+            this.weekday(0);
+        }
+        if (units === 'isoWeek') {
+            this.isoWeekday(1);
+        }
+
+        // quarters are also special
+        if (units === 'quarter') {
+            this.month(Math.floor(this.month() / 3) * 3);
+        }
+
+        return this;
+    }
+
+    function endOf (units) {
+        units = normalizeUnits(units);
+        if (units === undefined || units === 'millisecond') {
+            return this;
+        }
+
+        // 'date' is an alias for 'day', so it should be considered as such.
+        if (units === 'date') {
+            units = 'day';
+        }
+
+        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
+    }
+
+    function to_type__valueOf () {
+        return this._d.valueOf() - ((this._offset || 0) * 60000);
+    }
+
+    function unix () {
+        return Math.floor(this.valueOf() / 1000);
+    }
+
+    function toDate () {
+        return new Date(this.valueOf());
+    }
+
+    function toArray () {
+        var m = this;
+        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
+    }
+
+    function toObject () {
+        var m = this;
+        return {
+            years: m.year(),
+            months: m.month(),
+            date: m.date(),
+            hours: m.hours(),
+            minutes: m.minutes(),
+            seconds: m.seconds(),
+            milliseconds: m.milliseconds()
+        };
+    }
+
+    function toJSON () {
+        // new Date(NaN).toJSON() === null
+        return this.isValid() ? this.toISOString() : null;
+    }
+
+    function moment_valid__isValid () {
+        return valid__isValid(this);
+    }
+
+    function parsingFlags () {
+        return extend({}, getParsingFlags(this));
+    }
+
+    function invalidAt () {
+        return getParsingFlags(this).overflow;
+    }
+
+    function creationData() {
+        return {
+            input: this._i,
+            format: this._f,
+            locale: this._locale,
+            isUTC: this._isUTC,
+            strict: this._strict
+        };
+    }
+
+    // FORMATTING
+
+    addFormatToken(0, ['gg', 2], 0, function () {
+        return this.weekYear() % 100;
+    });
+
+    addFormatToken(0, ['GG', 2], 0, function () {
+        return this.isoWeekYear() % 100;
+    });
+
+    function addWeekYearFormatToken (token, getter) {
+        addFormatToken(0, [token, token.length], 0, getter);
+    }
+
+    addWeekYearFormatToken('gggg',     'weekYear');
+    addWeekYearFormatToken('ggggg',    'weekYear');
+    addWeekYearFormatToken('GGGG',  'isoWeekYear');
+    addWeekYearFormatToken('GGGGG', 'isoWeekYear');
+
+    // ALIASES
+
+    addUnitAlias('weekYear', 'gg');
+    addUnitAlias('isoWeekYear', 'GG');
+
+    // PRIORITY
+
+    addUnitPriority('weekYear', 1);
+    addUnitPriority('isoWeekYear', 1);
+
+
+    // PARSING
+
+    addRegexToken('G',      matchSigned);
+    addRegexToken('g',      matchSigned);
+    addRegexToken('GG',     match1to2, match2);
+    addRegexToken('gg',     match1to2, match2);
+    addRegexToken('GGGG',   match1to4, match4);
+    addRegexToken('gggg',   match1to4, match4);
+    addRegexToken('GGGGG',  match1to6, match6);
+    addRegexToken('ggggg',  match1to6, match6);
+
+    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
+        week[token.substr(0, 2)] = toInt(input);
+    });
+
+    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
+        week[token] = utils_hooks__hooks.parseTwoDigitYear(input);
+    });
+
+    // MOMENTS
+
+    function getSetWeekYear (input) {
+        return getSetWeekYearHelper.call(this,
+                input,
+                this.week(),
+                this.weekday(),
+                this.localeData()._week.dow,
+                this.localeData()._week.doy);
+    }
+
+    function getSetISOWeekYear (input) {
+        return getSetWeekYearHelper.call(this,
+                input, this.isoWeek(), this.isoWeekday(), 1, 4);
+    }
+
+    function getISOWeeksInYear () {
+        return weeksInYear(this.year(), 1, 4);
+    }
+
+    function getWeeksInYear () {
+        var weekInfo = this.localeData()._week;
+        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
+    }
+
+    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
+        var weeksTarget;
+        if (input == null) {
+            return weekOfYear(this, dow, doy).year;
+        } else {
+            weeksTarget = weeksInYear(input, dow, doy);
+            if (week > weeksTarget) {
+                week = weeksTarget;
+            }
+            return setWeekAll.call(this, input, week, weekday, dow, doy);
+        }
+    }
+
+    function setWeekAll(weekYear, week, weekday, dow, doy) {
+        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
+            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
+
+        this.year(date.getUTCFullYear());
+        this.month(date.getUTCMonth());
+        this.date(date.getUTCDate());
+        return this;
+    }
+
+    // FORMATTING
+
+    addFormatToken('Q', 0, 'Qo', 'quarter');
+
+    // ALIASES
+
+    addUnitAlias('quarter', 'Q');
+
+    // PRIORITY
+
+    addUnitPriority('quarter', 7);
+
+    // PARSING
+
+    addRegexToken('Q', match1);
+    addParseToken('Q', function (input, array) {
+        array[MONTH] = (toInt(input) - 1) * 3;
+    });
+
+    // MOMENTS
+
+    function getSetQuarter (input) {
+        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+    }
+
+    // FORMATTING
+
+    addFormatToken('D', ['DD', 2], 'Do', 'date');
+
+    // ALIASES
+
+    addUnitAlias('date', 'D');
+
+    // PRIOROITY
+    addUnitPriority('date', 9);
+
+    // PARSING
 
-        if (!key) {
-            return moment._locale;
-        }
+    addRegexToken('D',  match1to2);
+    addRegexToken('DD', match1to2, match2);
+    addRegexToken('Do', function (isStrict, locale) {
+        return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
+    });
 
-        if (!isArray(key)) {
-            //short-circuit everything else
-            locale = loadLocale(key);
-            if (locale) {
-                return locale;
-            }
-            key = [key];
-        }
+    addParseToken(['D', 'DD'], DATE);
+    addParseToken('Do', function (input, array) {
+        array[DATE] = toInt(input.match(match1to2)[0], 10);
+    });
 
-        return chooseLocale(key);
-    };
+    // MOMENTS
 
-    // compare moment object
-    moment.isMoment = function (obj) {
-        return obj instanceof Moment ||
-            (obj != null && hasOwnProp(obj, '_isAMomentObject'));
-    };
+    var getSetDayOfMonth = makeGetSet('Date', true);
 
-    // for typechecking Duration objects
-    moment.isDuration = function (obj) {
-        return obj instanceof Duration;
-    };
+    // FORMATTING
 
-    for (i = lists.length - 1; i >= 0; --i) {
-        makeList(lists[i]);
-    }
+    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
 
-    moment.normalizeUnits = function (units) {
-        return normalizeUnits(units);
-    };
+    // ALIASES
 
-    moment.invalid = function (flags) {
-        var m = moment.utc(NaN);
-        if (flags != null) {
-            extend(m._pf, flags);
-        }
-        else {
-            m._pf.userInvalidated = true;
-        }
+    addUnitAlias('dayOfYear', 'DDD');
 
-        return m;
-    };
+    // PRIORITY
+    addUnitPriority('dayOfYear', 4);
 
-    moment.parseZone = function () {
-        return moment.apply(null, arguments).parseZone();
-    };
+    // PARSING
 
-    moment.parseTwoDigitYear = function (input) {
-        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
-    };
+    addRegexToken('DDD',  match1to3);
+    addRegexToken('DDDD', match3);
+    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
+        config._dayOfYear = toInt(input);
+    });
 
-    /************************************
-        Moment Prototype
-    ************************************/
+    // HELPERS
 
+    // MOMENTS
 
-    extend(moment.fn = Moment.prototype, {
+    function getSetDayOfYear (input) {
+        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
+    }
 
-        clone : function () {
-            return moment(this);
-        },
+    // FORMATTING
 
-        valueOf : function () {
-            return +this._d + ((this._offset || 0) * 60000);
-        },
+    addFormatToken('m', ['mm', 2], 0, 'minute');
 
-        unix : function () {
-            return Math.floor(+this / 1000);
-        },
+    // ALIASES
 
-        toString : function () {
-            return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
-        },
+    addUnitAlias('minute', 'm');
 
-        toDate : function () {
-            return this._offset ? new Date(+this) : this._d;
-        },
+    // PRIORITY
 
-        toISOString : function () {
-            var m = moment(this).utc();
-            if (0 < m.year() && m.year() <= 9999) {
-                if ('function' === typeof Date.prototype.toISOString) {
-                    // native implementation is ~50x faster, use it when we can
-                    return this.toDate().toISOString();
-                } else {
-                    return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
-                }
-            } else {
-                return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
-            }
-        },
+    addUnitPriority('minute', 14);
 
-        toArray : function () {
-            var m = this;
-            return [
-                m.year(),
-                m.month(),
-                m.date(),
-                m.hours(),
-                m.minutes(),
-                m.seconds(),
-                m.milliseconds()
-            ];
-        },
+    // PARSING
 
-        isValid : function () {
-            return isValid(this);
-        },
+    addRegexToken('m',  match1to2);
+    addRegexToken('mm', match1to2, match2);
+    addParseToken(['m', 'mm'], MINUTE);
 
-        isDSTShifted : function () {
-            if (this._a) {
-                return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
-            }
+    // MOMENTS
 
-            return false;
-        },
+    var getSetMinute = makeGetSet('Minutes', false);
 
-        parsingFlags : function () {
-            return extend({}, this._pf);
-        },
+    // FORMATTING
 
-        invalidAt: function () {
-            return this._pf.overflow;
-        },
+    addFormatToken('s', ['ss', 2], 0, 'second');
 
-        utc : function (keepLocalTime) {
-            return this.zone(0, keepLocalTime);
-        },
+    // ALIASES
 
-        local : function (keepLocalTime) {
-            if (this._isUTC) {
-                this.zone(0, keepLocalTime);
-                this._isUTC = false;
+    addUnitAlias('second', 's');
 
-                if (keepLocalTime) {
-                    this.add(this._dateTzOffset(), 'm');
-                }
-            }
-            return this;
-        },
+    // PRIORITY
 
-        format : function (inputString) {
-            var output = formatMoment(this, inputString || moment.defaultFormat);
-            return this.localeData().postformat(output);
-        },
+    addUnitPriority('second', 15);
 
-        add : createAdder(1, 'add'),
+    // PARSING
 
-        subtract : createAdder(-1, 'subtract'),
+    addRegexToken('s',  match1to2);
+    addRegexToken('ss', match1to2, match2);
+    addParseToken(['s', 'ss'], SECOND);
 
-        diff : function (input, units, asFloat) {
-            var that = makeAs(input, this),
-                zoneDiff = (this.zone() - that.zone()) * 6e4,
-                diff, output, daysAdjust;
+    // MOMENTS
 
-            units = normalizeUnits(units);
+    var getSetSecond = makeGetSet('Seconds', false);
 
-            if (units === 'year' || units === 'month') {
-                // average number of days in the months in the given dates
-                diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
-                // difference in months
-                output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
-                // adjust by taking difference in days, average number of days
-                // and dst in the given months.
-                daysAdjust = (this - moment(this).startOf('month')) -
-                    (that - moment(that).startOf('month'));
-                // same as above but with zones, to negate all dst
-                daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) -
-                        (that.zone() - moment(that).startOf('month').zone())) * 6e4;
-                output += daysAdjust / diff;
-                if (units === 'year') {
-                    output = output / 12;
-                }
-            } else {
-                diff = (this - that);
-                output = units === 'second' ? diff / 1e3 : // 1000
-                    units === 'minute' ? diff / 6e4 : // 1000 * 60
-                    units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
-                    units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
-                    units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
-                    diff;
-            }
-            return asFloat ? output : absRound(output);
-        },
-
-        from : function (time, withoutSuffix) {
-            return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
-        },
-
-        fromNow : function (withoutSuffix) {
-            return this.from(moment(), withoutSuffix);
-        },
-
-        calendar : function (time) {
-            // We want to compare the start of today, vs this.
-            // Getting start-of-today depends on whether we're zone'd or not.
-            var now = time || moment(),
-                sod = makeAs(now, this).startOf('day'),
-                diff = this.diff(sod, 'days', true),
-                format = diff < -6 ? 'sameElse' :
-                    diff < -1 ? 'lastWeek' :
-                    diff < 0 ? 'lastDay' :
-                    diff < 1 ? 'sameDay' :
-                    diff < 2 ? 'nextDay' :
-                    diff < 7 ? 'nextWeek' : 'sameElse';
-            return this.format(this.localeData().calendar(format, this, moment(now)));
-        },
-
-        isLeapYear : function () {
-            return isLeapYear(this.year());
-        },
-
-        isDST : function () {
-            return (this.zone() < this.clone().month(0).zone() ||
-                this.zone() < this.clone().month(5).zone());
-        },
-
-        day : function (input) {
-            var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
-            if (input != null) {
-                input = parseWeekday(input, this.localeData());
-                return this.add(input - day, 'd');
-            } else {
-                return day;
-            }
-        },
+    // FORMATTING
 
-        month : makeAccessor('Month', true),
+    addFormatToken('S', 0, 0, function () {
+        return ~~(this.millisecond() / 100);
+    });
 
-        startOf : function (units) {
-            units = normalizeUnits(units);
-            // the following switch intentionally omits break keywords
-            // to utilize falling through the cases.
-            switch (units) {
-            case 'year':
-                this.month(0);
-                /* falls through */
-            case 'quarter':
-            case 'month':
-                this.date(1);
-                /* falls through */
-            case 'week':
-            case 'isoWeek':
-            case 'day':
-                this.hours(0);
-                /* falls through */
-            case 'hour':
-                this.minutes(0);
-                /* falls through */
-            case 'minute':
-                this.seconds(0);
-                /* falls through */
-            case 'second':
-                this.milliseconds(0);
-                /* falls through */
-            }
+    addFormatToken(0, ['SS', 2], 0, function () {
+        return ~~(this.millisecond() / 10);
+    });
 
-            // weeks are a special case
-            if (units === 'week') {
-                this.weekday(0);
-            } else if (units === 'isoWeek') {
-                this.isoWeekday(1);
-            }
+    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
+    addFormatToken(0, ['SSSS', 4], 0, function () {
+        return this.millisecond() * 10;
+    });
+    addFormatToken(0, ['SSSSS', 5], 0, function () {
+        return this.millisecond() * 100;
+    });
+    addFormatToken(0, ['SSSSSS', 6], 0, function () {
+        return this.millisecond() * 1000;
+    });
+    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
+        return this.millisecond() * 10000;
+    });
+    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
+        return this.millisecond() * 100000;
+    });
+    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
+        return this.millisecond() * 1000000;
+    });
 
-            // quarters are also special
-            if (units === 'quarter') {
-                this.month(Math.floor(this.month() / 3) * 3);
-            }
 
-            return this;
-        },
+    // ALIASES
 
-        endOf: function (units) {
-            units = normalizeUnits(units);
-            if (units === undefined || units === 'millisecond') {
-                return this;
-            }
-            return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
-        },
+    addUnitAlias('millisecond', 'ms');
 
-        isAfter: function (input, units) {
-            var inputMs;
-            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
-            if (units === 'millisecond') {
-                input = moment.isMoment(input) ? input : moment(input);
-                return +this > +input;
-            } else {
-                inputMs = moment.isMoment(input) ? +input : +moment(input);
-                return inputMs < +this.clone().startOf(units);
-            }
-        },
+    // PRIORITY
 
-        isBefore: function (input, units) {
-            var inputMs;
-            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
-            if (units === 'millisecond') {
-                input = moment.isMoment(input) ? input : moment(input);
-                return +this < +input;
-            } else {
-                inputMs = moment.isMoment(input) ? +input : +moment(input);
-                return +this.clone().endOf(units) < inputMs;
-            }
-        },
+    addUnitPriority('millisecond', 16);
 
-        isSame: function (input, units) {
-            var inputMs;
-            units = normalizeUnits(units || 'millisecond');
-            if (units === 'millisecond') {
-                input = moment.isMoment(input) ? input : moment(input);
-                return +this === +input;
-            } else {
-                inputMs = +moment(input);
-                return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));
-            }
-        },
-
-        min: deprecate(
-                 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
-                 function (other) {
-                     other = moment.apply(null, arguments);
-                     return other < this ? this : other;
-                 }
-         ),
-
-        max: deprecate(
-                'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
-                function (other) {
-                    other = moment.apply(null, arguments);
-                    return other > this ? this : other;
-                }
-        ),
-
-        // keepLocalTime = true means only change the timezone, without
-        // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]-->
-        // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone
-        // +0200, so we adjust the time as needed, to be valid.
-        //
-        // Keeping the time actually adds/subtracts (one hour)
-        // from the actual represented time. That is why we call updateOffset
-        // a second time. In case it wants us to change the offset again
-        // _changeInProgress == true case, then we have to adjust, because
-        // there is no such time in the given timezone.
-        zone : function (input, keepLocalTime) {
-            var offset = this._offset || 0,
-                localAdjust;
-            if (input != null) {
-                if (typeof input === 'string') {
-                    input = timezoneMinutesFromString(input);
-                }
-                if (Math.abs(input) < 16) {
-                    input = input * 60;
-                }
-                if (!this._isUTC && keepLocalTime) {
-                    localAdjust = this._dateTzOffset();
-                }
-                this._offset = input;
-                this._isUTC = true;
-                if (localAdjust != null) {
-                    this.subtract(localAdjust, 'm');
-                }
-                if (offset !== input) {
-                    if (!keepLocalTime || this._changeInProgress) {
-                        addOrSubtractDurationFromMoment(this,
-                                moment.duration(offset - input, 'm'), 1, false);
-                    } else if (!this._changeInProgress) {
-                        this._changeInProgress = true;
-                        moment.updateOffset(this, true);
-                        this._changeInProgress = null;
-                    }
-                }
-            } else {
-                return this._isUTC ? offset : this._dateTzOffset();
-            }
-            return this;
-        },
+    // PARSING
 
-        zoneAbbr : function () {
-            return this._isUTC ? 'UTC' : '';
-        },
+    addRegexToken('S',    match1to3, match1);
+    addRegexToken('SS',   match1to3, match2);
+    addRegexToken('SSS',  match1to3, match3);
 
-        zoneName : function () {
-            return this._isUTC ? 'Coordinated Universal Time' : '';
-        },
+    var token;
+    for (token = 'SSSS'; token.length <= 9; token += 'S') {
+        addRegexToken(token, matchUnsigned);
+    }
 
-        parseZone : function () {
-            if (this._tzm) {
-                this.zone(this._tzm);
-            } else if (typeof this._i === 'string') {
-                this.zone(this._i);
-            }
-            return this;
-        },
+    function parseMs(input, array) {
+        array[MILLISECOND] = toInt(('0.' + input) * 1000);
+    }
 
-        hasAlignedHourOffset : function (input) {
-            if (!input) {
-                input = 0;
-            }
-            else {
-                input = moment(input).zone();
-            }
-
-            return (this.zone() - input) % 60 === 0;
-        },
-
-        daysInMonth : function () {
-            return daysInMonth(this.year(), this.month());
-        },
-
-        dayOfYear : function (input) {
-            var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
-            return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
-        },
-
-        quarter : function (input) {
-            return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
-        },
-
-        weekYear : function (input) {
-            var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
-            return input == null ? year : this.add((input - year), 'y');
-        },
-
-        isoWeekYear : function (input) {
-            var year = weekOfYear(this, 1, 4).year;
-            return input == null ? year : this.add((input - year), 'y');
-        },
-
-        week : function (input) {
-            var week = this.localeData().week(this);
-            return input == null ? week : this.add((input - week) * 7, 'd');
-        },
-
-        isoWeek : function (input) {
-            var week = weekOfYear(this, 1, 4).week;
-            return input == null ? week : this.add((input - week) * 7, 'd');
-        },
-
-        weekday : function (input) {
-            var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
-            return input == null ? weekday : this.add(input - weekday, 'd');
-        },
-
-        isoWeekday : function (input) {
-            // behaves the same as moment#day except
-            // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
-            // as a setter, sunday should belong to the previous week.
-            return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
-        },
-
-        isoWeeksInYear : function () {
-            return weeksInYear(this.year(), 1, 4);
-        },
-
-        weeksInYear : function () {
-            var weekInfo = this.localeData()._week;
-            return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
-        },
-
-        get : function (units) {
-            units = normalizeUnits(units);
-            return this[units]();
-        },
+    for (token = 'S'; token.length <= 9; token += 'S') {
+        addParseToken(token, parseMs);
+    }
+    // MOMENTS
 
-        set : function (units, value) {
-            units = normalizeUnits(units);
-            if (typeof this[units] === 'function') {
-                this[units](value);
-            }
-            return this;
-        },
+    var getSetMillisecond = makeGetSet('Milliseconds', false);
 
-        // If passed a locale key, it will set the locale for this
-        // instance.  Otherwise, it will return the locale configuration
-        // variables for this instance.
-        locale : function (key) {
-            var newLocaleData;
+    // FORMATTING
 
-            if (key === undefined) {
-                return this._locale._abbr;
-            } else {
-                newLocaleData = moment.localeData(key);
-                if (newLocaleData != null) {
-                    this._locale = newLocaleData;
-                }
-                return this;
-            }
-        },
+    addFormatToken('z',  0, 0, 'zoneAbbr');
+    addFormatToken('zz', 0, 0, 'zoneName');
 
-        lang : deprecate(
-            'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
-            function (key) {
-                if (key === undefined) {
-                    return this.localeData();
-                } else {
-                    return this.locale(key);
-                }
-            }
-        ),
+    // MOMENTS
 
-        localeData : function () {
-            return this._locale;
-        },
+    function getZoneAbbr () {
+        return this._isUTC ? 'UTC' : '';
+    }
 
-        _dateTzOffset : function () {
-            // On Firefox.24 Date#getTimezoneOffset returns a floating point.
-            // https://github.com/moment/moment/pull/1871
-            return Math.round(this._d.getTimezoneOffset() / 15) * 15;
-        }
-    });
+    function getZoneName () {
+        return this._isUTC ? 'Coordinated Universal Time' : '';
+    }
 
-    function rawMonthSetter(mom, value) {
-        var dayOfMonth;
+    var momentPrototype__proto = Moment.prototype;
+
+    momentPrototype__proto.add               = add_subtract__add;
+    momentPrototype__proto.calendar          = moment_calendar__calendar;
+    momentPrototype__proto.clone             = clone;
+    momentPrototype__proto.diff              = diff;
+    momentPrototype__proto.endOf             = endOf;
+    momentPrototype__proto.format            = format;
+    momentPrototype__proto.from              = from;
+    momentPrototype__proto.fromNow           = fromNow;
+    momentPrototype__proto.to                = to;
+    momentPrototype__proto.toNow             = toNow;
+    momentPrototype__proto.get               = stringGet;
+    momentPrototype__proto.invalidAt         = invalidAt;
+    momentPrototype__proto.isAfter           = isAfter;
+    momentPrototype__proto.isBefore          = isBefore;
+    momentPrototype__proto.isBetween         = isBetween;
+    momentPrototype__proto.isSame            = isSame;
+    momentPrototype__proto.isSameOrAfter     = isSameOrAfter;
+    momentPrototype__proto.isSameOrBefore    = isSameOrBefore;
+    momentPrototype__proto.isValid           = moment_valid__isValid;
+    momentPrototype__proto.lang              = lang;
+    momentPrototype__proto.locale            = locale;
+    momentPrototype__proto.localeData        = localeData;
+    momentPrototype__proto.max               = prototypeMax;
+    momentPrototype__proto.min               = prototypeMin;
+    momentPrototype__proto.parsingFlags      = parsingFlags;
+    momentPrototype__proto.set               = stringSet;
+    momentPrototype__proto.startOf           = startOf;
+    momentPrototype__proto.subtract          = add_subtract__subtract;
+    momentPrototype__proto.toArray           = toArray;
+    momentPrototype__proto.toObject          = toObject;
+    momentPrototype__proto.toDate            = toDate;
+    momentPrototype__proto.toISOString       = moment_format__toISOString;
+    momentPrototype__proto.toJSON            = toJSON;
+    momentPrototype__proto.toString          = toString;
+    momentPrototype__proto.unix              = unix;
+    momentPrototype__proto.valueOf           = to_type__valueOf;
+    momentPrototype__proto.creationData      = creationData;
+
+    // Year
+    momentPrototype__proto.year       = getSetYear;
+    momentPrototype__proto.isLeapYear = getIsLeapYear;
+
+    // Week Year
+    momentPrototype__proto.weekYear    = getSetWeekYear;
+    momentPrototype__proto.isoWeekYear = getSetISOWeekYear;
+
+    // Quarter
+    momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;
+
+    // Month
+    momentPrototype__proto.month       = getSetMonth;
+    momentPrototype__proto.daysInMonth = getDaysInMonth;
+
+    // Week
+    momentPrototype__proto.week           = momentPrototype__proto.weeks        = getSetWeek;
+    momentPrototype__proto.isoWeek        = momentPrototype__proto.isoWeeks     = getSetISOWeek;
+    momentPrototype__proto.weeksInYear    = getWeeksInYear;
+    momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;
+
+    // Day
+    momentPrototype__proto.date       = getSetDayOfMonth;
+    momentPrototype__proto.day        = momentPrototype__proto.days             = getSetDayOfWeek;
+    momentPrototype__proto.weekday    = getSetLocaleDayOfWeek;
+    momentPrototype__proto.isoWeekday = getSetISODayOfWeek;
+    momentPrototype__proto.dayOfYear  = getSetDayOfYear;
+
+    // Hour
+    momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;
+
+    // Minute
+    momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;
+
+    // Second
+    momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;
+
+    // Millisecond
+    momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;
+
+    // Offset
+    momentPrototype__proto.utcOffset            = getSetOffset;
+    momentPrototype__proto.utc                  = setOffsetToUTC;
+    momentPrototype__proto.local                = setOffsetToLocal;
+    momentPrototype__proto.parseZone            = setOffsetToParsedOffset;
+    momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;
+    momentPrototype__proto.isDST                = isDaylightSavingTime;
+    momentPrototype__proto.isLocal              = isLocal;
+    momentPrototype__proto.isUtcOffset          = isUtcOffset;
+    momentPrototype__proto.isUtc                = isUtc;
+    momentPrototype__proto.isUTC                = isUtc;
+
+    // Timezone
+    momentPrototype__proto.zoneAbbr = getZoneAbbr;
+    momentPrototype__proto.zoneName = getZoneName;
+
+    // Deprecations
+    momentPrototype__proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
+    momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
+    momentPrototype__proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
+    momentPrototype__proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
+    momentPrototype__proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
+
+    var momentPrototype = momentPrototype__proto;
+
+    function moment__createUnix (input) {
+        return local__createLocal(input * 1000);
+    }
 
-        // TODO: Move this out of here!
-        if (typeof value === 'string') {
-            value = mom.localeData().monthsParse(value);
-            // TODO: Another silent failure?
-            if (typeof value !== 'number') {
-                return mom;
-            }
-        }
+    function moment__createInZone () {
+        return local__createLocal.apply(null, arguments).parseZone();
+    }
 
-        dayOfMonth = Math.min(mom.date(),
-                daysInMonth(mom.year(), value));
-        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
-        return mom;
+    function preParsePostFormat (string) {
+        return string;
     }
 
-    function rawGetter(mom, unit) {
-        return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
+    var prototype__proto = Locale.prototype;
+
+    prototype__proto.calendar        = locale_calendar__calendar;
+    prototype__proto.longDateFormat  = longDateFormat;
+    prototype__proto.invalidDate     = invalidDate;
+    prototype__proto.ordinal         = ordinal;
+    prototype__proto.preparse        = preParsePostFormat;
+    prototype__proto.postformat      = preParsePostFormat;
+    prototype__proto.relativeTime    = relative__relativeTime;
+    prototype__proto.pastFuture      = pastFuture;
+    prototype__proto.set             = locale_set__set;
+
+    // Month
+    prototype__proto.months            =        localeMonths;
+    prototype__proto.monthsShort       =        localeMonthsShort;
+    prototype__proto.monthsParse       =        localeMonthsParse;
+    prototype__proto.monthsRegex       = monthsRegex;
+    prototype__proto.monthsShortRegex  = monthsShortRegex;
+
+    // Week
+    prototype__proto.week = localeWeek;
+    prototype__proto.firstDayOfYear = localeFirstDayOfYear;
+    prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;
+
+    // Day of Week
+    prototype__proto.weekdays       =        localeWeekdays;
+    prototype__proto.weekdaysMin    =        localeWeekdaysMin;
+    prototype__proto.weekdaysShort  =        localeWeekdaysShort;
+    prototype__proto.weekdaysParse  =        localeWeekdaysParse;
+
+    prototype__proto.weekdaysRegex       =        weekdaysRegex;
+    prototype__proto.weekdaysShortRegex  =        weekdaysShortRegex;
+    prototype__proto.weekdaysMinRegex    =        weekdaysMinRegex;
+
+    // Hours
+    prototype__proto.isPM = localeIsPM;
+    prototype__proto.meridiem = localeMeridiem;
+
+    function lists__get (format, index, field, setter) {
+        var locale = locale_locales__getLocale();
+        var utc = create_utc__createUTC().set(setter, index);
+        return locale[field](utc, format);
     }
 
-    function rawSetter(mom, unit, value) {
-        if (unit === 'Month') {
-            return rawMonthSetter(mom, value);
-        } else {
-            return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+    function listMonthsImpl (format, index, field) {
+        if (typeof format === 'number') {
+            index = format;
+            format = undefined;
+        }
+
+        format = format || '';
+
+        if (index != null) {
+            return lists__get(format, index, field, 'month');
+        }
+
+        var i;
+        var out = [];
+        for (i = 0; i < 12; i++) {
+            out[i] = lists__get(format, i, field, 'month');
         }
+        return out;
     }
 
-    function makeAccessor(unit, keepTime) {
-        return function (value) {
-            if (value != null) {
-                rawSetter(this, unit, value);
-                moment.updateOffset(this, keepTime);
-                return this;
-            } else {
-                return rawGetter(this, unit);
+    // ()
+    // (5)
+    // (fmt, 5)
+    // (fmt)
+    // (true)
+    // (true, 5)
+    // (true, fmt, 5)
+    // (true, fmt)
+    function listWeekdaysImpl (localeSorted, format, index, field) {
+        if (typeof localeSorted === 'boolean') {
+            if (typeof format === 'number') {
+                index = format;
+                format = undefined;
             }
-        };
-    }
 
-    moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false);
-    moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false);
-    moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false);
-    // Setting the hour should keep the time, because the user explicitly
-    // specified which hour he wants. So trying to maintain the same hour (in
-    // a new timezone) makes sense. Adding/subtracting hours does not follow
-    // this rule.
-    moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true);
-    // moment.fn.month is defined separately
-    moment.fn.date = makeAccessor('Date', true);
-    moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true));
-    moment.fn.year = makeAccessor('FullYear', true);
-    moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true));
+            format = format || '';
+        } else {
+            format = localeSorted;
+            index = format;
+            localeSorted = false;
 
-    // add plural methods
-    moment.fn.days = moment.fn.day;
-    moment.fn.months = moment.fn.month;
-    moment.fn.weeks = moment.fn.week;
-    moment.fn.isoWeeks = moment.fn.isoWeek;
-    moment.fn.quarters = moment.fn.quarter;
+            if (typeof format === 'number') {
+                index = format;
+                format = undefined;
+            }
 
-    // add aliased format methods
-    moment.fn.toJSON = moment.fn.toISOString;
+            format = format || '';
+        }
 
-    /************************************
-        Duration Prototype
-    ************************************/
+        var locale = locale_locales__getLocale(),
+            shift = localeSorted ? locale._week.dow : 0;
 
+        if (index != null) {
+            return lists__get(format, (index + shift) % 7, field, 'day');
+        }
 
-    function daysToYears (days) {
-        // 400 years have 146097 days (taking into account leap year rules)
-        return days * 400 / 146097;
+        var i;
+        var out = [];
+        for (i = 0; i < 7; i++) {
+            out[i] = lists__get(format, (i + shift) % 7, field, 'day');
+        }
+        return out;
     }
 
-    function yearsToDays (years) {
-        // years * 365 + absRound(years / 4) -
-        //     absRound(years / 100) + absRound(years / 400);
-        return years * 146097 / 400;
+    function lists__listMonths (format, index) {
+        return listMonthsImpl(format, index, 'months');
     }
 
-    extend(moment.duration.fn = Duration.prototype, {
-
-        _bubble : function () {
-            var milliseconds = this._milliseconds,
-                days = this._days,
-                months = this._months,
-                data = this._data,
-                seconds, minutes, hours, years = 0;
-
-            // The following code bubbles up values, see the tests for
-            // examples of what that means.
-            data.milliseconds = milliseconds % 1000;
+    function lists__listMonthsShort (format, index) {
+        return listMonthsImpl(format, index, 'monthsShort');
+    }
 
-            seconds = absRound(milliseconds / 1000);
-            data.seconds = seconds % 60;
+    function lists__listWeekdays (localeSorted, format, index) {
+        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
+    }
 
-            minutes = absRound(seconds / 60);
-            data.minutes = minutes % 60;
+    function lists__listWeekdaysShort (localeSorted, format, index) {
+        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
+    }
 
-            hours = absRound(minutes / 60);
-            data.hours = hours % 24;
+    function lists__listWeekdaysMin (localeSorted, format, index) {
+        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
+    }
 
-            days += absRound(hours / 24);
+    locale_locales__getSetGlobalLocale('en', {
+        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (toInt(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        }
+    });
 
-            // Accurately convert days to years, assume start from year 0.
-            years = absRound(daysToYears(days));
-            days -= absRound(yearsToDays(years));
+    // Side effect imports
+    utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);
+    utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);
 
-            // 30 days to a month
-            // TODO (iskren): Use anchor date (like 1st Jan) to compute this.
-            months += absRound(days / 30);
-            days %= 30;
+    var mathAbs = Math.abs;
 
-            // 12 months -> 1 year
-            years += absRound(months / 12);
-            months %= 12;
+    function duration_abs__abs () {
+        var data           = this._data;
 
-            data.days = days;
-            data.months = months;
-            data.years = years;
-        },
+        this._milliseconds = mathAbs(this._milliseconds);
+        this._days         = mathAbs(this._days);
+        this._months       = mathAbs(this._months);
 
-        abs : function () {
-            this._milliseconds = Math.abs(this._milliseconds);
-            this._days = Math.abs(this._days);
-            this._months = Math.abs(this._months);
+        data.milliseconds  = mathAbs(data.milliseconds);
+        data.seconds       = mathAbs(data.seconds);
+        data.minutes       = mathAbs(data.minutes);
+        data.hours         = mathAbs(data.hours);
+        data.months        = mathAbs(data.months);
+        data.years         = mathAbs(data.years);
 
-            this._data.milliseconds = Math.abs(this._data.milliseconds);
-            this._data.seconds = Math.abs(this._data.seconds);
-            this._data.minutes = Math.abs(this._data.minutes);
-            this._data.hours = Math.abs(this._data.hours);
-            this._data.months = Math.abs(this._data.months);
-            this._data.years = Math.abs(this._data.years);
+        return this;
+    }
 
-            return this;
-        },
+    function duration_add_subtract__addSubtract (duration, input, value, direction) {
+        var other = create__createDuration(input, value);
 
-        weeks : function () {
-            return absRound(this.days() / 7);
-        },
+        duration._milliseconds += direction * other._milliseconds;
+        duration._days         += direction * other._days;
+        duration._months       += direction * other._months;
 
-        valueOf : function () {
-            return this._milliseconds +
-              this._days * 864e5 +
-              (this._months % 12) * 2592e6 +
-              toInt(this._months / 12) * 31536e6;
-        },
+        return duration._bubble();
+    }
 
-        humanize : function (withSuffix) {
-            var output = relativeTime(this, !withSuffix, this.localeData());
+    // supports only 2.0-style add(1, 's') or add(duration)
+    function duration_add_subtract__add (input, value) {
+        return duration_add_subtract__addSubtract(this, input, value, 1);
+    }
 
-            if (withSuffix) {
-                output = this.localeData().pastFuture(+this, output);
-            }
+    // supports only 2.0-style subtract(1, 's') or subtract(duration)
+    function duration_add_subtract__subtract (input, value) {
+        return duration_add_subtract__addSubtract(this, input, value, -1);
+    }
 
-            return this.localeData().postformat(output);
-        },
+    function absCeil (number) {
+        if (number < 0) {
+            return Math.floor(number);
+        } else {
+            return Math.ceil(number);
+        }
+    }
 
-        add : function (input, val) {
-            // supports only 2.0-style add(1, 's') or add(moment)
-            var dur = moment.duration(input, val);
+    function bubble () {
+        var milliseconds = this._milliseconds;
+        var days         = this._days;
+        var months       = this._months;
+        var data         = this._data;
+        var seconds, minutes, hours, years, monthsFromDays;
+
+        // if we have a mix of positive and negative values, bubble down first
+        // check: https://github.com/moment/moment/issues/2166
+        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
+                (milliseconds <= 0 && days <= 0 && months <= 0))) {
+            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
+            days = 0;
+            months = 0;
+        }
 
-            this._milliseconds += dur._milliseconds;
-            this._days += dur._days;
-            this._months += dur._months;
+        // The following code bubbles up values, see the tests for
+        // examples of what that means.
+        data.milliseconds = milliseconds % 1000;
 
-            this._bubble();
+        seconds           = absFloor(milliseconds / 1000);
+        data.seconds      = seconds % 60;
 
-            return this;
-        },
+        minutes           = absFloor(seconds / 60);
+        data.minutes      = minutes % 60;
 
-        subtract : function (input, val) {
-            var dur = moment.duration(input, val);
+        hours             = absFloor(minutes / 60);
+        data.hours        = hours % 24;
 
-            this._milliseconds -= dur._milliseconds;
-            this._days -= dur._days;
-            this._months -= dur._months;
+        days += absFloor(hours / 24);
 
-            this._bubble();
+        // convert days to months
+        monthsFromDays = absFloor(daysToMonths(days));
+        months += monthsFromDays;
+        days -= absCeil(monthsToDays(monthsFromDays));
 
-            return this;
-        },
+        // 12 months -> 1 year
+        years = absFloor(months / 12);
+        months %= 12;
 
-        get : function (units) {
-            units = normalizeUnits(units);
-            return this[units.toLowerCase() + 's']();
-        },
+        data.days   = days;
+        data.months = months;
+        data.years  = years;
 
-        as : function (units) {
-            var days, months;
-            units = normalizeUnits(units);
+        return this;
+    }
 
-            if (units === 'month' || units === 'year') {
-                days = this._days + this._milliseconds / 864e5;
-                months = this._months + daysToYears(days) * 12;
-                return units === 'month' ? months : months / 12;
-            } else {
-                // handle milliseconds separately because of floating point math errors (issue #1867)
-                days = this._days + Math.round(yearsToDays(this._months / 12));
-                switch (units) {
-                    case 'week': return days / 7 + this._milliseconds / 6048e5;
-                    case 'day': return days + this._milliseconds / 864e5;
-                    case 'hour': return days * 24 + this._milliseconds / 36e5;
-                    case 'minute': return days * 24 * 60 + this._milliseconds / 6e4;
-                    case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000;
-                    // Math.floor prevents floating point math errors here
-                    case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds;
-                    default: throw new Error('Unknown unit ' + units);
-                }
-            }
-        },
+    function daysToMonths (days) {
+        // 400 years have 146097 days (taking into account leap year rules)
+        // 400 years have 12 months === 4800
+        return days * 4800 / 146097;
+    }
 
-        lang : moment.fn.lang,
-        locale : moment.fn.locale,
+    function monthsToDays (months) {
+        // the reverse of daysToMonths
+        return months * 146097 / 4800;
+    }
 
-        toIsoString : deprecate(
-            'toIsoString() is deprecated. Please use toISOString() instead ' +
-            '(notice the capitals)',
-            function () {
-                return this.toISOString();
-            }
-        ),
+    function as (units) {
+        var days;
+        var months;
+        var milliseconds = this._milliseconds;
 
-        toISOString : function () {
-            // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
-            var years = Math.abs(this.years()),
-                months = Math.abs(this.months()),
-                days = Math.abs(this.days()),
-                hours = Math.abs(this.hours()),
-                minutes = Math.abs(this.minutes()),
-                seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
+        units = normalizeUnits(units);
 
-            if (!this.asSeconds()) {
-                // this is the same as C#'s (Noda) and python (isodate)...
-                // but not other JS (goog.date)
-                return 'P0D';
+        if (units === 'month' || units === 'year') {
+            days   = this._days   + milliseconds / 864e5;
+            months = this._months + daysToMonths(days);
+            return units === 'month' ? months : months / 12;
+        } else {
+            // handle milliseconds separately because of floating point math errors (issue #1867)
+            days = this._days + Math.round(monthsToDays(this._months));
+            switch (units) {
+                case 'week'   : return days / 7     + milliseconds / 6048e5;
+                case 'day'    : return days         + milliseconds / 864e5;
+                case 'hour'   : return days * 24    + milliseconds / 36e5;
+                case 'minute' : return days * 1440  + milliseconds / 6e4;
+                case 'second' : return days * 86400 + milliseconds / 1000;
+                // Math.floor prevents floating point math errors here
+                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
+                default: throw new Error('Unknown unit ' + units);
             }
+        }
+    }
 
-            return (this.asSeconds() < 0 ? '-' : '') +
-                'P' +
-                (years ? years + 'Y' : '') +
-                (months ? months + 'M' : '') +
-                (days ? days + 'D' : '') +
-                ((hours || minutes || seconds) ? 'T' : '') +
-                (hours ? hours + 'H' : '') +
-                (minutes ? minutes + 'M' : '') +
-                (seconds ? seconds + 'S' : '');
-        },
+    // TODO: Use this.as('ms')?
+    function duration_as__valueOf () {
+        return (
+            this._milliseconds +
+            this._days * 864e5 +
+            (this._months % 12) * 2592e6 +
+            toInt(this._months / 12) * 31536e6
+        );
+    }
 
-        localeData : function () {
-            return this._locale;
-        }
-    });
+    function makeAs (alias) {
+        return function () {
+            return this.as(alias);
+        };
+    }
 
-    moment.duration.fn.toString = moment.duration.fn.toISOString;
+    var asMilliseconds = makeAs('ms');
+    var asSeconds      = makeAs('s');
+    var asMinutes      = makeAs('m');
+    var asHours        = makeAs('h');
+    var asDays         = makeAs('d');
+    var asWeeks        = makeAs('w');
+    var asMonths       = makeAs('M');
+    var asYears        = makeAs('y');
+
+    function duration_get__get (units) {
+        units = normalizeUnits(units);
+        return this[units + 's']();
+    }
 
-    function makeDurationGetter(name) {
-        moment.duration.fn[name] = function () {
+    function makeGetter(name) {
+        return function () {
             return this._data[name];
         };
     }
 
-    for (i in unitMillisecondFactors) {
-        if (hasOwnProp(unitMillisecondFactors, i)) {
-            makeDurationGetter(i.toLowerCase());
-        }
+    var milliseconds = makeGetter('milliseconds');
+    var seconds      = makeGetter('seconds');
+    var minutes      = makeGetter('minutes');
+    var hours        = makeGetter('hours');
+    var days         = makeGetter('days');
+    var months       = makeGetter('months');
+    var years        = makeGetter('years');
+
+    function weeks () {
+        return absFloor(this.days() / 7);
     }
 
-    moment.duration.fn.asMilliseconds = function () {
-        return this.as('ms');
-    };
-    moment.duration.fn.asSeconds = function () {
-        return this.as('s');
-    };
-    moment.duration.fn.asMinutes = function () {
-        return this.as('m');
-    };
-    moment.duration.fn.asHours = function () {
-        return this.as('h');
-    };
-    moment.duration.fn.asDays = function () {
-        return this.as('d');
-    };
-    moment.duration.fn.asWeeks = function () {
-        return this.as('weeks');
-    };
-    moment.duration.fn.asMonths = function () {
-        return this.as('M');
-    };
-    moment.duration.fn.asYears = function () {
-        return this.as('y');
+    var round = Math.round;
+    var thresholds = {
+        s: 45,  // seconds to minute
+        m: 45,  // minutes to hour
+        h: 22,  // hours to day
+        d: 26,  // days to month
+        M: 11   // months to year
     };
 
-    /************************************
-        Default Locale
-    ************************************/
+    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
+        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+    }
 
+    function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {
+        var duration = create__createDuration(posNegDuration).abs();
+        var seconds  = round(duration.as('s'));
+        var minutes  = round(duration.as('m'));
+        var hours    = round(duration.as('h'));
+        var days     = round(duration.as('d'));
+        var months   = round(duration.as('M'));
+        var years    = round(duration.as('y'));
+
+        var a = seconds < thresholds.s && ['s', seconds]  ||
+                minutes <= 1           && ['m']           ||
+                minutes < thresholds.m && ['mm', minutes] ||
+                hours   <= 1           && ['h']           ||
+                hours   < thresholds.h && ['hh', hours]   ||
+                days    <= 1           && ['d']           ||
+                days    < thresholds.d && ['dd', days]    ||
+                months  <= 1           && ['M']           ||
+                months  < thresholds.M && ['MM', months]  ||
+                years   <= 1           && ['y']           || ['yy', years];
+
+        a[2] = withoutSuffix;
+        a[3] = +posNegDuration > 0;
+        a[4] = locale;
+        return substituteTimeAgo.apply(null, a);
+    }
 
-    // Set default locale, other locale will inherit from English.
-    moment.locale('en', {
-        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (toInt(number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
+    // This function allows you to set the rounding function for relative time strings
+    function duration_humanize__getSetRelativeTimeRounding (roundingFunction) {
+        if (roundingFunction === undefined) {
+            return round;
         }
-    });
+        if (typeof(roundingFunction) === 'function') {
+            round = roundingFunction;
+            return true;
+        }
+        return false;
+    }
 
-    /* EMBED_LOCALES */
+    // This function allows you to set a threshold for relative time strings
+    function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {
+        if (thresholds[threshold] === undefined) {
+            return false;
+        }
+        if (limit === undefined) {
+            return thresholds[threshold];
+        }
+        thresholds[threshold] = limit;
+        return true;
+    }
 
-    /************************************
-        Exposing Moment
-    ************************************/
+    function humanize (withSuffix) {
+        var locale = this.localeData();
+        var output = duration_humanize__relativeTime(this, !withSuffix, locale);
 
-    function makeGlobal(shouldDeprecate) {
-        /*global ender:false */
-        if (typeof ender !== 'undefined') {
-            return;
-        }
-        oldGlobalMoment = globalScope.moment;
-        if (shouldDeprecate) {
-            globalScope.moment = deprecate(
-                    'Accessing Moment through the global scope is ' +
-                    'deprecated, and will be removed in an upcoming ' +
-                    'release.',
-                    moment);
-        } else {
-            globalScope.moment = moment;
+        if (withSuffix) {
+            output = locale.pastFuture(+this, output);
         }
+
+        return locale.postformat(output);
     }
 
-    // CommonJS module is defined
-    if (hasModule) {
-        module.exports = moment;
-    } else if (typeof define === 'function' && define.amd) {
-        define('moment', function (require, exports, module) {
-            if (module.config && module.config() && module.config().noGlobal === true) {
-                // release the global variable
-                globalScope.moment = oldGlobalMoment;
-            }
+    var iso_string__abs = Math.abs;
+
+    function iso_string__toISOString() {
+        // for ISO strings we do not use the normal bubbling rules:
+        //  * milliseconds bubble up until they become hours
+        //  * days do not bubble at all
+        //  * months bubble up until they become years
+        // This is because there is no context-free conversion between hours and days
+        // (think of clock changes)
+        // and also not between days and months (28-31 days per month)
+        var seconds = iso_string__abs(this._milliseconds) / 1000;
+        var days         = iso_string__abs(this._days);
+        var months       = iso_string__abs(this._months);
+        var minutes, hours, years;
+
+        // 3600 seconds -> 60 minutes -> 1 hour
+        minutes           = absFloor(seconds / 60);
+        hours             = absFloor(minutes / 60);
+        seconds %= 60;
+        minutes %= 60;
+
+        // 12 months -> 1 year
+        years  = absFloor(months / 12);
+        months %= 12;
+
+
+        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+        var Y = years;
+        var M = months;
+        var D = days;
+        var h = hours;
+        var m = minutes;
+        var s = seconds;
+        var total = this.asSeconds();
+
+        if (!total) {
+            // this is the same as C#'s (Noda) and python (isodate)...
+            // but not other JS (goog.date)
+            return 'P0D';
+        }
 
-            return moment;
-        });
-        makeGlobal(true);
-    } else {
-        makeGlobal();
+        return (total < 0 ? '-' : '') +
+            'P' +
+            (Y ? Y + 'Y' : '') +
+            (M ? M + 'M' : '') +
+            (D ? D + 'D' : '') +
+            ((h || m || s) ? 'T' : '') +
+            (h ? h + 'H' : '') +
+            (m ? m + 'M' : '') +
+            (s ? s + 'S' : '');
     }
-}).call(this);
+
+    var duration_prototype__proto = Duration.prototype;
+
+    duration_prototype__proto.abs            = duration_abs__abs;
+    duration_prototype__proto.add            = duration_add_subtract__add;
+    duration_prototype__proto.subtract       = duration_add_subtract__subtract;
+    duration_prototype__proto.as             = as;
+    duration_prototype__proto.asMilliseconds = asMilliseconds;
+    duration_prototype__proto.asSeconds      = asSeconds;
+    duration_prototype__proto.asMinutes      = asMinutes;
+    duration_prototype__proto.asHours        = asHours;
+    duration_prototype__proto.asDays         = asDays;
+    duration_prototype__proto.asWeeks        = asWeeks;
+    duration_prototype__proto.asMonths       = asMonths;
+    duration_prototype__proto.asYears        = asYears;
+    duration_prototype__proto.valueOf        = duration_as__valueOf;
+    duration_prototype__proto._bubble        = bubble;
+    duration_prototype__proto.get            = duration_get__get;
+    duration_prototype__proto.milliseconds   = milliseconds;
+    duration_prototype__proto.seconds        = seconds;
+    duration_prototype__proto.minutes        = minutes;
+    duration_prototype__proto.hours          = hours;
+    duration_prototype__proto.days           = days;
+    duration_prototype__proto.weeks          = weeks;
+    duration_prototype__proto.months         = months;
+    duration_prototype__proto.years          = years;
+    duration_prototype__proto.humanize       = humanize;
+    duration_prototype__proto.toISOString    = iso_string__toISOString;
+    duration_prototype__proto.toString       = iso_string__toISOString;
+    duration_prototype__proto.toJSON         = iso_string__toISOString;
+    duration_prototype__proto.locale         = locale;
+    duration_prototype__proto.localeData     = localeData;
+
+    // Deprecations
+    duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);
+    duration_prototype__proto.lang = lang;
+
+    // Side effect imports
+
+    // FORMATTING
+
+    addFormatToken('X', 0, 0, 'unix');
+    addFormatToken('x', 0, 0, 'valueOf');
+
+    // PARSING
+
+    addRegexToken('x', matchSigned);
+    addRegexToken('X', matchTimestamp);
+    addParseToken('X', function (input, array, config) {
+        config._d = new Date(parseFloat(input, 10) * 1000);
+    });
+    addParseToken('x', function (input, array, config) {
+        config._d = new Date(toInt(input));
+    });
+
+    // Side effect imports
+
+
+    utils_hooks__hooks.version = '2.15.0';
+
+    setHookCallback(local__createLocal);
+
+    utils_hooks__hooks.fn                    = momentPrototype;
+    utils_hooks__hooks.min                   = min;
+    utils_hooks__hooks.max                   = max;
+    utils_hooks__hooks.now                   = now;
+    utils_hooks__hooks.utc                   = create_utc__createUTC;
+    utils_hooks__hooks.unix                  = moment__createUnix;
+    utils_hooks__hooks.months                = lists__listMonths;
+    utils_hooks__hooks.isDate                = isDate;
+    utils_hooks__hooks.locale                = locale_locales__getSetGlobalLocale;
+    utils_hooks__hooks.invalid               = valid__createInvalid;
+    utils_hooks__hooks.duration              = create__createDuration;
+    utils_hooks__hooks.isMoment              = isMoment;
+    utils_hooks__hooks.weekdays              = lists__listWeekdays;
+    utils_hooks__hooks.parseZone             = moment__createInZone;
+    utils_hooks__hooks.localeData            = locale_locales__getLocale;
+    utils_hooks__hooks.isDuration            = isDuration;
+    utils_hooks__hooks.monthsShort           = lists__listMonthsShort;
+    utils_hooks__hooks.weekdaysMin           = lists__listWeekdaysMin;
+    utils_hooks__hooks.defineLocale          = defineLocale;
+    utils_hooks__hooks.updateLocale          = updateLocale;
+    utils_hooks__hooks.locales               = locale_locales__listLocales;
+    utils_hooks__hooks.weekdaysShort         = lists__listWeekdaysShort;
+    utils_hooks__hooks.normalizeUnits        = normalizeUnits;
+    utils_hooks__hooks.relativeTimeRounding = duration_humanize__getSetRelativeTimeRounding;
+    utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;
+    utils_hooks__hooks.calendarFormat        = getCalendarFormat;
+    utils_hooks__hooks.prototype             = momentPrototype;
+
+    var _moment = utils_hooks__hooks;
+
+    return _moment;
+
+}));
\ No newline at end of file
index 7db7547..7b4e546 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Чаховіч Уладзіслаў",
                        "Artificial123",
-                       "Goshaproject"
+                       "Goshaproject",
+                       "Mechanizatar"
                ]
        },
        "ooui-outline-control-move-down": "Перамясціць элемент ўніз",
@@ -18,6 +19,7 @@
        "ooui-dialog-process-dismiss": "Прапусціць",
        "ooui-dialog-process-retry": "Паспрабаваць яшчэ раз",
        "ooui-dialog-process-continue": "Працягнуць",
+       "ooui-selectfile-button-select": "Выбраць файл",
        "ooui-selectfile-not-supported": "Выбраны файл не падтрымліваецца",
        "ooui-selectfile-placeholder": "Файл не выбраны"
 }
diff --git a/resources/lib/oojs-ui/i18n/bqi.json b/resources/lib/oojs-ui/i18n/bqi.json
new file mode 100644 (file)
index 0000000..8b85a20
--- /dev/null
@@ -0,0 +1,16 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mogoeilor"
+               ]
+       },
+       "ooui-toolbar-more": "بیشتر",
+       "ooui-toolgroup-expand": "بیشتر",
+       "ooui-toolgroup-collapse": "کمتر",
+       "ooui-dialog-message-accept": "خۈڤإ",
+       "ooui-dialog-message-reject": "أنجومشيڤ کردن",
+       "ooui-dialog-process-retry": "ز نۉ تلاش کونين",
+       "ooui-dialog-process-continue": "ديندا گرهڌن",
+       "ooui-selectfile-button-select": "گولإڤورچين کردن جانیا",
+       "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ"
+}
index 8538417..98835d5 100644 (file)
@@ -24,6 +24,7 @@
        "ooui-dialog-process-dismiss": "Απόρριψη",
        "ooui-dialog-process-retry": "Δοκιμάστε ξανά",
        "ooui-dialog-process-continue": "Συνέχεια",
+       "ooui-selectfile-button-select": "Επιλέξτε ένα αρχείο",
        "ooui-selectfile-not-supported": "Επιλογή αρχείου δεν υποστηρίζεται",
        "ooui-selectfile-placeholder": "Κανένα αρχείο δεν είναι επιλεγμένο",
        "ooui-selectfile-dragdrop-placeholder": "Σύρετε το αρχείο εδώ"
index 92015a4..a68c90f 100644 (file)
@@ -29,7 +29,8 @@
                        "SnowedEarth",
                        "Jdforrester",
                        "Wladek92",
-                       "Harmonia Amanda"
+                       "Harmonia Amanda",
+                       "The RedBurn"
                ]
        },
        "ooui-outline-control-move-down": "Descendre l’élément",
@@ -41,7 +42,7 @@
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuler",
        "ooui-dialog-process-error": "Quelque chose s'est mal passé",
-       "ooui-dialog-process-dismiss": "Rejeter",
+       "ooui-dialog-process-dismiss": "Fermer",
        "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
        "ooui-selectfile-button-select": "Sélectionner un fichier",
diff --git a/resources/lib/oojs-ui/i18n/hif-latn.json b/resources/lib/oojs-ui/i18n/hif-latn.json
new file mode 100644 (file)
index 0000000..9e903ca
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Thakurji"
+               ]
+       },
+       "ooui-outline-control-move-down": "Item ke niche karo",
+       "ooui-outline-control-move-up": "Item ke uppar karo",
+       "ooui-outline-control-remove": "Item ke hatao",
+       "ooui-toolbar-more": "Aur",
+       "ooui-toolgroup-expand": "Aur",
+       "ooui-toolgroup-collapse": "Kamtii",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Cancel karo",
+       "ooui-dialog-process-error": "Koi chij wrong hoe gais",
+       "ooui-dialog-process-dismiss": "Dismiss karo",
+       "ooui-dialog-process-retry": "Fir se try karo",
+       "ooui-dialog-process-continue": "Continue",
+       "ooui-selectfile-button-select": "Ek file ke select karo",
+       "ooui-selectfile-not-supported": "File selection ke support nai karaa jaawe hai",
+       "ooui-selectfile-placeholder": "Koi file ke nai select karaa gais hai",
+       "ooui-selectfile-dragdrop-placeholder": "Hian pe file ke girao"
+}
diff --git a/resources/lib/oojs-ui/i18n/io.json b/resources/lib/oojs-ui/i18n/io.json
new file mode 100644 (file)
index 0000000..7d7b1b8
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Idojc"
+               ]
+       },
+       "ooui-outline-control-move-down": "Movar elemento adsube",
+       "ooui-outline-control-move-up": "Movar elemento adsupere",
+       "ooui-outline-control-remove": "Forigar elemento",
+       "ooui-toolbar-more": "Plu multa",
+       "ooui-toolgroup-expand": "Plu multa",
+       "ooui-toolgroup-collapse": "Min multa",
+       "ooui-dialog-message-accept": "Aplikar",
+       "ooui-dialog-message-reject": "Anular",
+       "ooui-dialog-process-error": "Ulo faliis",
+       "ooui-dialog-process-dismiss": "Celar",
+       "ooui-dialog-process-retry": "Riprobar",
+       "ooui-dialog-process-continue": "Durar",
+       "ooui-selectfile-button-select": "Selektar dokumento",
+       "ooui-selectfile-not-supported": "Dokumento-selekto ne esas suportata",
+       "ooui-selectfile-placeholder": "Nula dokumento selektesis",
+       "ooui-selectfile-dragdrop-placeholder": "Pozar dokumento hike"
+}
index de52812..9d3b926 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Milicevic01",
                        "Nikola Smolenski",
-                       "Милан Јелисавчић"
+                       "Милан Јелисавчић",
+                       "Zoranzoki21"
                ]
        },
        "ooui-outline-control-move-down": "Премести ставку на доле",
@@ -19,5 +20,7 @@
        "ooui-dialog-process-retry": "Покушај поново",
        "ooui-dialog-process-continue": "Настави",
        "ooui-selectfile-button-select": "Изабери датотеку",
-       "ooui-selectfile-placeholder": "Није изабрана ниједна датотека"
+       "ooui-selectfile-not-supported": "Избор датотеке није подржан",
+       "ooui-selectfile-placeholder": "Није изабрана ниједна датотека",
+       "ooui-selectfile-dragdrop-placeholder": "Додајте датотеку овде"
 }
index dbe9f86..9b88695 100644 (file)
@@ -11,7 +11,8 @@
                        "Sayginer",
                        "Meelo",
                        "McAang",
-                       "Uğurkent"
+                       "Uğurkent",
+                       "1917 Ekim Devrimi"
                ]
        },
        "ooui-outline-control-move-down": "Ögeyi aşağı taşı",
@@ -28,5 +29,6 @@
        "ooui-dialog-process-continue": "Devam et",
        "ooui-selectfile-button-select": "Dosya seç",
        "ooui-selectfile-not-supported": "Dosya seçimi desteklenmiyor",
-       "ooui-selectfile-placeholder": "Herhangi bir dosya seçilmedi"
+       "ooui-selectfile-placeholder": "Herhangi bir dosya seçilmedi",
+       "ooui-selectfile-dragdrop-placeholder": "Dosyayı buraya aç"
 }
index 911b618..335e509 100644 (file)
@@ -18,5 +18,7 @@
        "ooui-dialog-process-retry": "Кабатлау",
        "ooui-dialog-process-continue": "Дәвам итү",
        "ooui-selectfile-button-select": "Файлны сайлагыз",
-       "ooui-selectfile-placeholder": "Файл сайланмаган"
+       "ooui-selectfile-not-supported": "Файл сайлау хупланмый",
+       "ooui-selectfile-placeholder": "Файл сайланмаган",
+       "ooui-selectfile-dragdrop-placeholder": "Файлны монда куегыз"
 }
index 542447d..2307413 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:37Z
+ * Date: 2017-02-14T22:47:20Z
  */
 ( function ( OO ) {
 
index bcc3778..524c16b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-element-hidden {
   display: none !important;
@@ -19,6 +19,9 @@
 .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;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   opacity: 0.5;
-  -webkit-transform: translate3d(0, 0, 0);
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
+  min-height: 3.125em;
 }
-.oo-ui-floatableElement-hidden {
-  display: none;
+.oo-ui-floatableElement {
+  position: absolute;
 }
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
 .oo-ui-fieldLayout:after {
   clear: both;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: block;
   float: left;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   text-align: right;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
   display: table;
+  width: 100%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: table-cell;
   vertical-align: middle;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  display: inline-block;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  width: 1px;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.5;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline .oo-ui-fieldLayout-help {
+  margin-top: -0.3em;
 }
 .oo-ui-fieldLayout:last-child {
   margin-bottom: 0;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-right: 5%;
-  width: 35%;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help {
+  margin-right: 0;
+  margin-left: -1.875em;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 60%;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  margin-right: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  display: block;
+  padding-top: 0.5em;
+}
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
   margin-bottom: 1.25em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.5em;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+  max-width: 50em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  padding: 0.25em 0 0.25em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  max-width: 50em;
   padding: 0.5em 0;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget {
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
-.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
   color: #ccc;
 }
 .oo-ui-fieldLayout-messages {
   line-height: 1.5em;
   vertical-align: middle;
 }
-.oo-ui-actionFieldLayout {
-  max-width: 50em;
-}
 .oo-ui-actionFieldLayout-input,
 .oo-ui-actionFieldLayout-button {
   display: table-cell;
   width: 1%;
   white-space: nowrap;
 }
+.oo-ui-actionFieldLayout.oo-ui-fieldLayout-align-top {
+  max-width: 50em;
+}
 .oo-ui-fieldsetLayout {
   position: relative;
   min-width: 0;
 body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: table-cell;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   display: block;
   position: absolute;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header {
   color: inherit;
   display: inline-table;
   box-sizing: border-box;
-  max-width: 100%;
   padding: 0;
   white-space: normal;
   float: left;
+  width: 100%;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label:empty {
+  display: none;
 }
 .oo-ui-fieldsetLayout-group {
   clear: both;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
   float: right;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.5;
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
+  max-width: 50em;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
   margin-top: 2em;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
+  display: inline-block;
   font-size: 1.1em;
   margin-bottom: 0.5em;
   padding: 0.25em 0;
   font-weight: bold;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
   padding-left: 2em;
   line-height: 1.8em;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   left: 0;
   top: 0.25em;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget {
   margin-right: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-formLayout + .oo-ui-fieldsetLayout,
@@ -449,6 +473,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-panelLayout-scrollable {
   overflow-y: auto;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -461,6 +487,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   padding: 1.25em;
 }
 .oo-ui-panelLayout-framed {
+  border: 1px solid #ccc;
   border-radius: 0.5em;
   box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
 }
@@ -596,7 +623,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 0.3em;
   margin-right: 0.5em;
 }
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-active .oo-ui-buttonElement-button {
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget.oo-ui-buttonElement-active .oo-ui-buttonElement-button {
   cursor: default;
 }
 .oo-ui-buttonGroupWidget:last-child {
@@ -623,7 +650,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  /* @noflip */
   left: 0;
 }
 .oo-ui-popupWidget-popup {
@@ -638,8 +664,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  top: 0;
-  /* @noflip */
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
   left: 0;
   background-repeat: no-repeat;
 }
@@ -659,7 +684,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget-body {
   clear: both;
-  overflow: hidden;
+}
+.oo-ui-popupWidget-body.oo-ui-clippableElement-clippable {
+  min-height: 1em;
 }
 .oo-ui-popupWidget-popup {
   background-color: #fff;
@@ -667,9 +694,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 0.25em;
   box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+.oo-ui-popupWidget-anchored {
   margin-top: 6px;
 }
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  top: -6px;
+}
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
   content: '';
@@ -706,23 +736,23 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-head > .oo-ui-labelElement-label {
   margin: 0.75em 1em;
 }
+.oo-ui-popupWidget-body {
+  line-height: 1.4;
+}
 .oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
+  margin: 0.75em 1em;
 }
 .oo-ui-popupButtonWidget {
   position: relative;
 }
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
   cursor: auto;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 0.9375em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
+  margin-left: 0.9375em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 1.2375em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
+  margin-left: 1.2375em;
 }
 .oo-ui-inputWidget {
   margin-right: 0.5em;
@@ -880,6 +910,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   top: 0;
 }
+.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
+  pointer-events: none;
+}
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
   padding: 0.5em;
@@ -972,6 +1007,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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;
 }
@@ -1090,9 +1131,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-comboBoxInputWidget-dropdownButton > .oo-ui-buttonElement-button {
   display: block;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
   overflow: hidden;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty .oo-ui-comboBoxInputWidget-dropdownButton {
@@ -1103,8 +1141,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   right: 0;
   top: 0;
-  height: 2.5em;
   width: 2.5em;
+  height: 2.5em;
   padding: 0;
 }
 .oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
@@ -1177,9 +1215,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-progressBarWidget-bar {
   height: 1em;
   border-right: 1px solid #ccc;
-  -webkit-transition: width 250ms ease, margin-left 250ms ease;
-     -moz-transition: width 250ms ease, margin-left 250ms ease;
-          transition: width 250ms ease, margin-left 250ms ease;
+  -webkit-transition: width 250ms ease;
+     -moz-transition: width 250ms ease;
+          transition: width 250ms ease;
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #eaf4fa), color-stop(100%, #b0d9ee));
   background-image: -webkit-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
@@ -1192,7 +1230,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
-  margin-left: -10%;
+  -webkit-transform: translate(-25%);
+     -moz-transform: translate(-25%);
+      -ms-transform: translate(-25%);
+          transform: translate(-25%);
   border-left: 1px solid #a6cee1;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
@@ -1200,25 +1241,43 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
index e7c2ee0..f3b3fce 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-element-hidden {
   display: none !important;
@@ -19,6 +19,9 @@
 .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;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:active {
   color: #000;
+  box-shadow: none;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
   color: #36c;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
   color: #447ff5;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   color: #2a4b8d;
   box-shadow: none;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   color: #36c;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
   color: #447ff5;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active:focus,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   color: #2a4b8d;
   box-shadow: none;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #c33;
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+  color: #d33;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label {
-  color: #e53939;
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
+  color: #ff4242;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #873636;
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  color: #b32424;
   box-shadow: none;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled[class*='oo-ui-flaggedElement'] > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
   padding: 0.546875em 1em;
-  min-height: 1.25em;
-  min-width: 1em;
+  min-height: 2.5em;
+  min-width: 3.125em;
   border-radius: 2px;
   position: relative;
 }
   box-shadow: inset 0 0 0 1px #36c;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #d9d9d9;
+  background-color: #c8ccd1;
   color: #000;
   border-color: #72777d;
+  box-shadow: none;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
   background-color: #2a4b8d;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
   background-color: #fff;
-  border-color: #859dcc;
+  border-color: #447ff5;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
   background-color: #fff;
-  border-color: #859dcc;
+  border-color: #447ff5;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active:focus,
   box-shadow: inset 0 0 0 1px #36c;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-  color: #c33;
+  color: #d33;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
   background-color: #fff;
-  border-color: #b77c79;
+  border-color: #ff4242;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
 .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 {
-  background-color: #fbf4f4;
-  color: #873636;
-  border-color: #873636;
+  background-color: #ffffff;
+  color: #b32424;
+  border-color: #b32424;
   box-shadow: none;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
-  border-color: #c33;
-  box-shadow: inset 0 0 0 1px #c33;
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33;
 }
 .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-destructive > .oo-ui-buttonElement-button {
   color: #fff;
-  background-color: #c33;
-  border-color: #c33;
+  background-color: #d33;
+  border-color: #d33;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
-  background-color: #e53939;
-  border-color: #e53939;
+  background-color: #ff4242;
+  border-color: #ff4242;
 }
 .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 {
   color: #fff;
-  background-color: #873636;
-  border-color: #873636;
+  background-color: #b32424;
+  border-color: #b32424;
   box-shadow: none;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
-  border-color: #c33;
-  box-shadow: inset 0 0 0 1px #c33, inset 0 0 0 2px #fff;
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33, inset 0 0 0 2px #fff;
 }
 .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 {
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
+  min-height: 3.125em;
 }
-.oo-ui-floatableElement-hidden {
-  display: none;
+.oo-ui-floatableElement {
+  position: absolute;
 }
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
 }
 .oo-ui-fieldLayout {
   display: block;
-  margin-bottom: 1em;
+  margin-top: 1.640625em;
 }
 .oo-ui-fieldLayout:before,
 .oo-ui-fieldLayout:after {
 .oo-ui-fieldLayout:after {
   clear: both;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: block;
   float: left;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   text-align: right;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
   display: table;
+  width: 100%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: table-cell;
   vertical-align: middle;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  display: inline-block;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  width: 1px;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.5;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline .oo-ui-fieldLayout-help {
+  margin-top: -0.3em;
 }
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
+.oo-ui-fieldLayout.oo-ui-labelElement,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
+  margin-top: 1.171875em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-right: 5%;
+.oo-ui-fieldLayout:first-child,
+.oo-ui-fieldLayout.oo-ui-labelElement:first-child,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline:first-child {
+  margin-top: 0;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  padding-bottom: 0.3125em;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  line-height: 1.4;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+  max-width: 50em;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   width: 35%;
+  margin-right: 5%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-  width: 60%;
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  display: block;
+  padding-top: 0.3125em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-  margin-bottom: 1.25em;
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help {
+  margin-right: 0;
+  margin-left: -1.875em;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  width: 60%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.5em;
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  padding: 0.3125em 0.46875em;
+  padding-right: 0;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding-top: 0.25em;
-  padding-bottom: 0.5em;
+.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  color: #72777d;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget {
   margin-right: 0;
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
-.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  color: #72777d;
-}
 .oo-ui-fieldLayout-messages {
   list-style: none none;
   margin: 0.25em 0 0 0.25em;
 }
 .oo-ui-fieldLayout-messages .oo-ui-iconWidget {
   display: table-cell;
-  border-right: 0.5em solid transparent;
 }
 .oo-ui-fieldLayout-messages .oo-ui-labelWidget {
   display: table-cell;
-  padding: 0.1em 0;
-  line-height: 1.5;
+  padding: 0.1em 0 0.1em 0.3125em;
+  line-height: 1.4;
   vertical-align: middle;
 }
-.oo-ui-actionFieldLayout {
-  max-width: 50em;
-}
 .oo-ui-actionFieldLayout-input,
 .oo-ui-actionFieldLayout-button {
   display: table-cell;
   width: 1%;
   white-space: nowrap;
 }
+.oo-ui-actionFieldLayout.oo-ui-fieldLayout-align-top {
+  max-width: 50em;
+}
 .oo-ui-fieldsetLayout {
   position: relative;
   min-width: 0;
 body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: table-cell;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   display: block;
   position: absolute;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header {
   color: inherit;
   display: inline-table;
   box-sizing: border-box;
-  max-width: 100%;
   padding: 0;
   white-space: normal;
   float: left;
+  width: 100%;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label:empty {
+  display: none;
 }
 .oo-ui-fieldsetLayout-group {
   clear: both;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
   float: right;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.5;
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
+  max-width: 50em;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
   margin-top: 2em;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-  margin-bottom: 0.5em;
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
+  display: inline-block;
+  margin-bottom: 0.56818em;
   font-size: 1.1em;
   font-weight: bold;
+  line-height: 1.4;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
   padding-left: 2em;
   line-height: 1.8;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   top: 0;
   left: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget {
   margin-right: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-formLayout + .oo-ui-fieldsetLayout,
@@ -579,6 +614,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-panelLayout-scrollable {
   overflow-y: auto;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -590,10 +627,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-panelLayout-padded {
   padding: 1.25em;
 }
+.oo-ui-panelLayout-padded.oo-ui-formLayout > .oo-ui-fieldsetLayout .oo-ui-labelElement-label,
+.oo-ui-panelLayout-padded.oo-ui-formLayout > .oo-ui-fieldsetLayout .oo-ui-iconElement-icon {
+  margin-top: -0.25em;
+}
 .oo-ui-panelLayout-framed {
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
   margin: 1em 0;
@@ -635,7 +675,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   overflow: hidden;
 }
 .oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5;
+  line-height: 1.6;
 }
 .oo-ui-optionWidget-selected .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   opacity: 1;
@@ -687,7 +727,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: transparent;
 }
 .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.5em;
+  padding: 0.25em 0.25em 0.25em 0.46875em;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget {
   margin-right: 0;
@@ -726,7 +766,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   z-index: 0;
   position: relative;
 }
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-active .oo-ui-buttonElement-button {
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget.oo-ui-buttonElement-active .oo-ui-buttonElement-button {
   cursor: default;
 }
 .oo-ui-buttonGroupWidget:last-child {
@@ -766,7 +806,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  /* @noflip */
   left: 0;
 }
 .oo-ui-popupWidget-popup {
@@ -781,8 +820,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  top: 0;
-  /* @noflip */
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
   left: 0;
   background-repeat: no-repeat;
 }
@@ -802,17 +840,22 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget-body {
   clear: both;
-  overflow: hidden;
+}
+.oo-ui-popupWidget-body.oo-ui-clippableElement-clippable {
+  min-height: 1em;
 }
 .oo-ui-popupWidget-popup {
   background-color: #fff;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+.oo-ui-popupWidget-anchored {
   margin-top: 9px;
 }
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  top: -9px;
+}
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
   content: '';
@@ -826,7 +869,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
   bottom: -10px;
   left: -9px;
-  border-bottom-color: #888;
+  border-bottom-color: #a2a9b1;
   border-width: 10px;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
@@ -849,23 +892,23 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-head > .oo-ui-labelElement-label {
   margin: 0.75em 1em;
 }
+.oo-ui-popupWidget-body {
+  line-height: 1.4;
+}
 .oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
+  margin: 0.75em 1em;
 }
 .oo-ui-popupButtonWidget {
   position: relative;
 }
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
   cursor: auto;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 0.9375em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
+  margin-left: 0.9375em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 1.5em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
+  margin-left: 1.5em;
 }
 .oo-ui-inputWidget {
   margin-right: 0.5em;
@@ -881,7 +924,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-checkboxInputWidget {
   position: relative;
-  line-height: 1.6em;
+  line-height: 1.5625em;
   white-space: nowrap;
 }
 .oo-ui-checkboxInputWidget * {
@@ -891,8 +934,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-checkboxInputWidget [type='checkbox'] {
   position: relative;
   max-width: none;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   margin: 0;
   opacity: 0;
   z-index: 1;
@@ -908,8 +951,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
           box-sizing: border-box;
   position: absolute;
   left: 0;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   border: 1px solid #72777d;
   border-radius: 2px;
 }
@@ -973,7 +1016,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
   padding: 0.25em 0;
@@ -1031,7 +1074,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-radioInputWidget {
   position: relative;
-  line-height: 1.6em;
+  line-height: 1.5625em;
   white-space: nowrap;
 }
 .oo-ui-radioInputWidget * {
@@ -1041,8 +1084,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-radioInputWidget [type='radio'] {
   position: relative;
   max-width: none;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   margin: 0;
   opacity: 0;
   z-index: 1;
@@ -1054,8 +1097,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   border: 1px solid #72777d;
   border-radius: 100%;
 }
@@ -1070,11 +1113,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 100%;
 }
 .oo-ui-radioInputWidget [type='radio']:checked + span {
-  border-width: 0.4em;
+  border-width: 0.390625em;
 }
 .oo-ui-radioInputWidget [type='radio']:checked:hover + span,
 .oo-ui-radioInputWidget [type='radio']:checked:focus:hover + span {
-  border-width: 0.4em;
+  border-width: 0.390625em;
 }
 .oo-ui-radioInputWidget [type='radio']:disabled + span {
   background-color: #c8ccd1;
@@ -1129,7 +1172,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   left: -3px;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
   padding: 0.25em 0;
@@ -1230,6 +1273,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   top: 0;
 }
+.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
+  pointer-events: none;
+}
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
   margin: 0;
@@ -1252,7 +1300,7 @@ 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 0.1em #fff;
+  box-shadow: inset 0 0 0 1px #fff;
   -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
      -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
           transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
@@ -1280,6 +1328,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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;
+  }
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled :-moz-placeholder {
   color: #72777d;
   opacity: 1;
@@ -1299,16 +1353,16 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
-  border-color: #f00;
+  border-color: #d33;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:hover {
-  border-color: #f00;
+  border-color: #d33;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:focus {
-  border-color: #f00;
-  box-shadow: inset 0 0 0 0.1em #f00;
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
 .oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
@@ -1364,7 +1418,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: -1px;
   border: 1px solid #a2a9b1;
   border-radius: 0 0 2px 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
 .oo-ui-menuSelectWidget input {
   position: absolute;
@@ -1373,6 +1427,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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;
   padding: 0.5em 1em;
@@ -1469,12 +1529,17 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:hover {
   background-color: #fff;
+  color: #444;
   border-color: #a2a9b1;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:hover .oo-ui-iconElement-icon,
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:hover .oo-ui-indicatorElement-indicator {
   opacity: 0.73;
 }
+.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:active {
+  color: #000;
+  border-color: #72777d;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:focus {
   border-color: #36c;
   outline: 0;
@@ -1532,9 +1597,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-comboBoxInputWidget-dropdownButton > .oo-ui-buttonElement-button {
   display: block;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
   overflow: hidden;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty .oo-ui-comboBoxInputWidget-dropdownButton {
@@ -1545,8 +1607,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   right: 0;
   top: 0;
-  height: 2.5em;
   width: 2.5em;
+  height: 2.5em;
   padding: 0;
 }
 .oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
@@ -1563,8 +1625,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   width: 2.5em;
 }
 .oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button {
+  min-width: 2.5em;
   min-height: 2.5em;
-  padding: 0.546875em;
+  padding-left: 0;
+  padding-right: 0;
 }
 .oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button,
 .oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button:focus {
@@ -1594,9 +1658,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   text-overflow: ellipsis;
   overflow: hidden;
 }
-.oo-ui-multioptionWidget .oo-ui-labelElement-label {
-  line-height: 1.5;
-}
 .oo-ui-multioptionWidget.oo-ui-widget-disabled {
   color: #72777d;
 }
@@ -1610,7 +1671,7 @@ 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.5em;
+  padding: 0.25em 0.25em 0.25em 0.46875em;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget {
   margin-right: 0;
@@ -1623,44 +1684,67 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
-  background-color: #36c;
   height: 1em;
-  -webkit-transition: width 200ms, margin-left 200ms;
-     -moz-transition: width 200ms, margin-left 200ms;
-          transition: width 200ms, margin-left 200ms;
+  -webkit-transition: width 200ms;
+     -moz-transition: width 200ms;
+          transition: width 200ms;
 }
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
   -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
      -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
-  margin-left: -10%;
+  -webkit-transform: translate(-25%);
+     -moz-transform: translate(-25%);
+      -ms-transform: translate(-25%);
+          transform: translate(-25%);
   border-left-width: 1px;
 }
-.oo-ui-progressBarWidget.oo-ui-widget-disabled {
-  opacity: 0.6;
+.oo-ui-progressBarWidget.oo-ui-widget-enabled .oo-ui-progressBarWidget-bar {
+  background-color: #36c;
+}
+.oo-ui-progressBarWidget.oo-ui-widget-disabled .oo-ui-progressBarWidget-bar {
+  background-color: #c8ccd1;
 }
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
index fd4e033..e327e5f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:37Z
+ * Date: 2017-02-14T22:47:20Z
  */
 ( function ( OO ) {
 
@@ -57,16 +57,17 @@ OO.ui.MouseButtons = {
 
 /**
  * @property {number}
+ * @private
  */
 OO.ui.elementId = 0;
 
 /**
  * Generate a unique ID for element
  *
- * @return {string} [id]
+ * @return {string} ID
  */
 OO.ui.generateElementId = function () {
-       OO.ui.elementId += 1;
+       OO.ui.elementId++;
        return 'oojsui-' + OO.ui.elementId;
 };
 
@@ -386,15 +387,49 @@ OO.ui.infuse = function ( idOrNode ) {
        /**
         * Get a localized message.
         *
-        * In environments that provide a localization system, this function should be overridden to
-        * return the message translated in the user's language. The default implementation always returns
-        * English messages.
-        *
         * After the message key, message parameters may optionally be passed. In the default implementation,
         * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.
         * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
         * they support unnamed, ordered message parameters.
         *
+        * In environments that provide a localization system, this function should be overridden to
+        * return the message translated in the user's language. The default implementation always returns
+        * English messages. An example of doing this with [jQuery.i18n](https://github.com/wikimedia/jquery.i18n)
+        * follows.
+        *
+        *     @example
+        *     var i, iLen, button,
+        *         messagePath = 'oojs-ui/dist/i18n/',
+        *         languages = [ $.i18n().locale, 'ur', 'en' ],
+        *         languageMap = {};
+        *
+        *     for ( i = 0, iLen = languages.length; i < iLen; i++ ) {
+        *         languageMap[ languages[ i ] ] = messagePath + languages[ i ].toLowerCase() + '.json';
+        *     }
+        *
+        *     $.i18n().load( languageMap ).done( function() {
+        *         // Replace the built-in `msg` only once we've loaded the internationalization.
+        *         // OOjs UI uses `OO.ui.deferMsg` for all initially-loaded messages. So long as
+        *         // you put off creating any widgets until this promise is complete, no English
+        *         // will be displayed.
+        *         OO.ui.msg = $.i18n;
+        *
+        *         // A button displaying "OK" in the default locale
+        *         button = new OO.ui.ButtonWidget( {
+        *             label: OO.ui.msg( 'ooui-dialog-message-accept' ),
+        *             icon: 'check'
+        *         } );
+        *         $( 'body' ).append( button.$element );
+        *
+        *         // A button displaying "OK" in Urdu
+        *         $.i18n().locale = 'ur';
+        *         button = new OO.ui.ButtonWidget( {
+        *             label: OO.ui.msg( 'ooui-dialog-message-accept' ),
+        *             icon: 'check'
+        *         } );
+        *         $( 'body' ).append( button.$element );
+        *     } );
+        *
         * @param {string} key Message key
         * @param {...Mixed} [params] Message parameters
         * @return {string} Translated message with parameters substituted
@@ -414,7 +449,7 @@ OO.ui.infuse = function ( idOrNode ) {
                }
                return message;
        };
-} )();
+}() );
 
 /**
  * Package a message and arguments for deferred resolution.
@@ -486,6 +521,22 @@ OO.ui.isSafeUrl = function ( url ) {
        return false;
 };
 
+/**
+ * Check if the user has a 'mobile' device.
+ *
+ * For our purposes this means the user is primarily using an
+ * on-screen keyboard, touch input instead of a mouse and may
+ * have a physically small display.
+ *
+ * It is left up to implementors to decide how to compute this
+ * so the default implementation always returns false.
+ *
+ * @return {boolean} Use is on a mobile device
+ */
+OO.ui.isMobile = function () {
+       return false;
+};
+
 /*!
  * Mixin namespace.
  */
@@ -538,7 +589,6 @@ OO.ui.Element = function OoUiElement( config ) {
        this.$element = config.$element ||
                $( document.createElement( this.getTagName() ) );
        this.elementGroup = null;
-       this.debouncedUpdateThemeClassesHandler = OO.ui.debounce( this.debouncedUpdateThemeClasses );
 
        // Initialization
        if ( Array.isArray( config.classes ) ) {
@@ -776,7 +826,7 @@ OO.ui.Element.static.reusePreInfuseDOM = function ( node, config ) {
 };
 
 /**
- * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
+ * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of an HTML DOM node
  * (and its children) that represent an Element of the same class and the given configuration,
  * generated by the PHP implementation.
  *
@@ -1113,6 +1163,9 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
 
        animations = {};
        callback = typeof config.complete === 'function' && config.complete;
+       if ( callback ) {
+               OO.ui.warnDeprecation( 'Element#scrollIntoView: The `complete` callback config option is deprecated. Use the return promise instead.' );
+       }
        container = this.getClosestScrollableContainer( el, config.direction );
        $container = $( container );
        elementDimensions = this.getDimensions( el );
@@ -1281,16 +1334,7 @@ OO.ui.Element.prototype.supports = function ( methods ) {
  *   guaranteeing that theme updates do not occur within an element's constructor
  */
 OO.ui.Element.prototype.updateThemeClasses = function () {
-       this.debouncedUpdateThemeClassesHandler();
-};
-
-/**
- * @private
- * @localdoc This method is called directly from the QUnit tests instead of #updateThemeClasses, to
- *   make them synchronous.
- */
-OO.ui.Element.prototype.debouncedUpdateThemeClasses = function () {
-       OO.ui.theme.updateElementClasses( this );
+       OO.ui.theme.queueUpdateElementClasses( this );
 };
 
 /**
@@ -1368,6 +1412,13 @@ OO.ui.Element.prototype.setElementGroup = function ( group ) {
  * @return {jQuery.Promise} Promise which resolves when the scroll is complete
  */
 OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
+       if (
+               !this.isElementAttached() ||
+               !this.isVisible() ||
+               ( this.getElementGroup() && !this.getElementGroup().isVisible() )
+       ) {
+               return $.Deferred().resolve();
+       }
        return OO.ui.Element.static.scrollIntoView( this.$element[ 0 ], config );
 };
 
@@ -1489,7 +1540,7 @@ OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 /* Static Properties */
 
 /**
- * Whether this widget will behave reasonably when wrapped in a HTML `<label>`. If this is true,
+ * Whether this widget will behave reasonably when wrapped in an HTML `<label>`. If this is true,
  * wrappers such as OO.ui.FieldLayout may use a `<label>` instead of implementing own label click
  * handling.
  *
@@ -1572,7 +1623,10 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  *
  * @constructor
  */
-OO.ui.Theme = function OoUiTheme() {};
+OO.ui.Theme = function OoUiTheme() {
+       this.elementClassesQueue = [];
+       this.debouncedUpdateQueuedElementClasses = OO.ui.debounce( this.updateQueuedElementClasses );
+};
 
 /* Setup */
 
@@ -1616,6 +1670,36 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
                .addClass( classes.on.join( ' ' ) );
 };
 
+/**
+ * @private
+ */
+OO.ui.Theme.prototype.updateQueuedElementClasses = function () {
+       var i;
+       for ( i = 0; i < this.elementClassesQueue.length; i++ ) {
+               this.updateElementClasses( this.elementClassesQueue[ i ] );
+       }
+       // Clear the queue
+       this.elementClassesQueue = [];
+};
+
+/**
+ * Queue #updateElementClasses to be called for this element.
+ *
+ * @localdoc QUnit tests override this method to directly call #queueUpdateElementClasses,
+ *   to make them synchronous.
+ *
+ * @param {OO.ui.Element} element Element for which to update classes
+ */
+OO.ui.Theme.prototype.queueUpdateElementClasses = function ( element ) {
+       // Keep items in the queue unique. Use lastIndexOf to start checking from the end because that's
+       // the most common case (this method is often called repeatedly for the same element).
+       if ( this.elementClassesQueue.lastIndexOf( element ) !== -1 ) {
+               return;
+       }
+       this.elementClassesQueue.push( element );
+       this.debouncedUpdateQueuedElementClasses();
+};
+
 /**
  * Get the transition duration in milliseconds for dialogs opening/closing
  *
@@ -2838,16 +2922,6 @@ OO.ui.mixin.LabelElement.prototype.getLabel = function () {
        return this.label;
 };
 
-/**
- * Fit the label.
- *
- * @chainable
- * @deprecated since 0.16.0
- */
-OO.ui.mixin.LabelElement.prototype.fitLabel = function () {
-       return this;
-};
-
 /**
  * Set the content of the label.
  *
@@ -3389,6 +3463,7 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );
 /* Static Properties */
 
 /**
+ * @static
  * @inheritdoc
  */
 OO.ui.ButtonWidget.static.cancelButtonMouseDownEvents = false;
@@ -3623,6 +3698,10 @@ OO.mixinClass( OO.ui.IconWidget, OO.ui.mixin.FlaggedElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.IconWidget.static.tagName = 'span';
 
 /**
@@ -3676,6 +3755,10 @@ OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.mixin.TitledElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.IndicatorWidget.static.tagName = 'span';
 
 /**
@@ -3731,12 +3814,12 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
        // Properties
        this.input = config.input;
 
-       // Events
+       // Initialization
        if ( this.input instanceof OO.ui.InputWidget ) {
-               this.$element.on( 'click', this.onClick.bind( this ) );
+               if ( this.input.getInputId() ) {
+                       this.$element.attr( 'for', this.input.getInputId() );
+               }
        }
-
-       // Initialization
        this.$element.addClass( 'oo-ui-labelWidget' );
 };
 
@@ -3748,20 +3831,11 @@ OO.mixinClass( OO.ui.LabelWidget, OO.ui.mixin.TitledElement );
 
 /* Static Properties */
 
-OO.ui.LabelWidget.static.tagName = 'span';
-
-/* Methods */
-
 /**
- * Handles label mouse click events.
- *
- * @private
- * @param {jQuery.Event} e Mouse click event
+ * @static
+ * @inheritdoc
  */
-OO.ui.LabelWidget.prototype.onClick = function () {
-       this.input.simulateLabelClick();
-       return false;
-};
+OO.ui.LabelWidget.static.tagName = 'label';
 
 /**
  * PendingElement is a mixin that is used to create elements that notify users that something is happening
@@ -3779,6 +3853,7 @@ OO.ui.LabelWidget.prototype.onClick = function () {
  *     }
  *     OO.inheritClass( MessageDialog, OO.ui.MessageDialog );
  *
+ *     MessageDialog.static.name = 'myMessageDialog';
  *     MessageDialog.static.actions = [
  *         { action: 'save', label: 'Done', flags: 'primary' },
  *         { label: 'Cancel', flags: 'safe' }
@@ -3896,124 +3971,124 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
 };
 
 /**
- * Element that can be automatically clipped to visible boundaries.
+ * 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).
  *
- * Whenever the element's natural height changes, you have to call
- * {@link OO.ui.mixin.ClippableElement#clip} to make sure it's still
- * clipping correctly.
+ * 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
+ * sure the element is still placed correctly.
  *
- * The dimensions of #$clippableContainer will be compared to the boundaries of the
- * nearest scrollable container. If #$clippableContainer is too tall and/or too wide,
- * then #$clippable will be given a fixed reduced height and/or width and will be made
- * scrollable. By default, #$clippable and #$clippableContainer are the same element,
- * but you can build a static footer by setting #$clippableContainer to an element that contains
- * #$clippable and the footer.
+ * As positioning is only possible when both the element and the container are attached to the DOM
+ * and visible, it's only done after you call #togglePositioning. You might want to do this inside
+ * the #toggle method to display a floating popup, for example.
  *
  * @abstract
  * @class
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$clippable] Node to clip, assigned to #$clippable, omit to use #$element
- * @cfg {jQuery} [$clippableContainer] Node to keep visible, assigned to #$clippableContainer,
- *   omit to use #$clippable
+ * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
+ * @cfg {jQuery} [$floatableContainer] Node to position below
  */
-OO.ui.mixin.ClippableElement = function OoUiMixinClippableElement( config ) {
+OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
        // Configuration initialization
        config = config || {};
 
        // Properties
-       this.$clippable = null;
-       this.$clippableContainer = null;
-       this.clipping = false;
-       this.clippedHorizontally = false;
-       this.clippedVertically = false;
-       this.$clippableScrollableContainer = null;
-       this.$clippableScroller = null;
-       this.$clippableWindow = null;
-       this.idealWidth = null;
-       this.idealHeight = null;
-       this.onClippableScrollHandler = this.clip.bind( this );
-       this.onClippableWindowResizeHandler = this.clip.bind( this );
+       this.$floatable = null;
+       this.$floatableContainer = null;
+       this.$floatableWindow = null;
+       this.$floatableClosestScrollable = null;
+       this.onFloatableScrollHandler = this.position.bind( this );
+       this.onFloatableWindowResizeHandler = this.position.bind( this );
 
        // Initialization
-       if ( config.$clippableContainer ) {
-               this.setClippableContainer( config.$clippableContainer );
-       }
-       this.setClippableElement( config.$clippable || this.$element );
+       this.setFloatableContainer( config.$floatableContainer );
+       this.setFloatableElement( config.$floatable || this.$element );
 };
 
 /* Methods */
 
 /**
- * Set clippable element.
+ * Set floatable element.
  *
  * If an element is already set, it will be cleaned up before setting up the new element.
  *
- * @param {jQuery} $clippable Element to make clippable
+ * @param {jQuery} $floatable Element to make floatable
  */
-OO.ui.mixin.ClippableElement.prototype.setClippableElement = function ( $clippable ) {
-       if ( this.$clippable ) {
-               this.$clippable.removeClass( 'oo-ui-clippableElement-clippable' );
-               this.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );
-               OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
+OO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatable ) {
+       if ( this.$floatable ) {
+               this.$floatable.removeClass( 'oo-ui-floatableElement-floatable' );
+               this.$floatable.css( { left: '', top: '' } );
        }
 
-       this.$clippable = $clippable.addClass( 'oo-ui-clippableElement-clippable' );
-       this.clip();
+       this.$floatable = $floatable.addClass( 'oo-ui-floatableElement-floatable' );
+       this.position();
 };
 
 /**
- * Set clippable container.
- *
- * This is the container that will be measured when deciding whether to clip. When clipping,
- * #$clippable will be resized in order to keep the clippable container fully visible.
+ * Set floatable container.
  *
- * If the clippable container is unset, #$clippable will be used.
+ * The element will be always positioned under the specified container.
  *
- * @param {jQuery|null} $clippableContainer Container to keep visible, or null to unset
+ * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
  */
-OO.ui.mixin.ClippableElement.prototype.setClippableContainer = function ( $clippableContainer ) {
-       this.$clippableContainer = $clippableContainer;
-       if ( this.$clippable ) {
-               this.clip();
+OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $floatableContainer ) {
+       this.$floatableContainer = $floatableContainer;
+       if ( this.$floatable ) {
+               this.position();
        }
 };
 
 /**
- * Toggle clipping.
+ * Toggle positioning.
  *
- * Do not turn clipping on until after the element is attached to the DOM and visible.
+ * Do not turn positioning on until after the element is attached to the DOM and visible.
  *
- * @param {boolean} [clipping] Enable clipping, omit to toggle
+ * @param {boolean} [positioning] Enable positioning, omit to toggle
  * @chainable
  */
-OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
-       clipping = clipping === undefined ? !this.clipping : !!clipping;
+OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {
+       var closestScrollableOfContainer;
 
-       if ( this.clipping !== clipping ) {
-               this.clipping = clipping;
-               if ( clipping ) {
-                       this.$clippableScrollableContainer = $( this.getClosestScrollableElementContainer() );
-                       // If the clippable container is the root, we have to listen to scroll events and check
-                       // jQuery.scrollTop on the window because of browser inconsistencies
-                       this.$clippableScroller = this.$clippableScrollableContainer.is( 'html, body' ) ?
-                               $( OO.ui.Element.static.getWindow( this.$clippableScrollableContainer ) ) :
-                               this.$clippableScrollableContainer;
-                       this.$clippableScroller.on( 'scroll', this.onClippableScrollHandler );
-                       this.$clippableWindow = $( this.getElementWindow() )
-                               .on( 'resize', this.onClippableWindowResizeHandler );
-                       // Initial clip after visible
-                       this.clip();
+       if ( !this.$floatable || !this.$floatableContainer ) {
+               return this;
+       }
+
+       positioning = positioning === undefined ? !this.positioning : !!positioning;
+
+       if ( this.positioning !== positioning ) {
+               this.positioning = positioning;
+
+               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' ) ) {
+                       closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
+               }
+
+               if ( positioning ) {
+                       this.$floatableWindow = $( this.getElementWindow() );
+                       this.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );
+
+                       this.$floatableClosestScrollable = $( closestScrollableOfContainer );
+                       this.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );
+
+                       // Initial position after visible
+                       this.position();
                } else {
-                       this.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );
-                       OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
+                       if ( this.$floatableWindow ) {
+                               this.$floatableWindow.off( 'resize', this.onFloatableWindowResizeHandler );
+                               this.$floatableWindow = null;
+                       }
 
-                       this.$clippableScrollableContainer = null;
-                       this.$clippableScroller.off( 'scroll', this.onClippableScrollHandler );
-                       this.$clippableScroller = null;
-                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
-                       this.$clippableWindow = null;
+                       if ( this.$floatableClosestScrollable ) {
+                               this.$floatableClosestScrollable.off( 'scroll', this.onFloatableScrollHandler );
+                               this.$floatableClosestScrollable = null;
+                       }
+
+                       this.$floatable.css( { left: '', right: '', top: '' } );
                }
        }
 
@@ -4021,22 +4096,244 @@ OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
 };
 
 /**
- * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ * Check whether the bottom edge of the given element is within the viewport of the given container.
  *
- * @return {boolean} Element will be clipped to the visible area
+ * @private
+ * @param {jQuery} $element
+ * @param {jQuery} $container
+ * @return {boolean}
  */
-OO.ui.mixin.ClippableElement.prototype.isClipping = function () {
-       return this.clipping;
-};
+OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
+       var elemRect, contRect,
+               leftEdgeInBounds = false,
+               bottomEdgeInBounds = false,
+               rightEdgeInBounds = false;
 
-/**
- * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
- *
- * @return {boolean} Part of the element is being clipped
- */
-OO.ui.mixin.ClippableElement.prototype.isClipped = function () {
-       return this.clippedHorizontally || this.clippedVertically;
-};
+       elemRect = $element[ 0 ].getBoundingClientRect();
+       if ( $container[ 0 ] === window ) {
+               contRect = {
+                       top: 0,
+                       left: 0,
+                       right: document.documentElement.clientWidth,
+                       bottom: document.documentElement.clientHeight
+               };
+       } else {
+               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;
+       }
+       if ( elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom ) {
+               bottomEdgeInBounds = true;
+       }
+       if ( elemRect.right >= contRect.left && elemRect.right <= contRect.right ) {
+               rightEdgeInBounds = true;
+       }
+
+       // We only care that any part of the bottom edge is visible
+       return bottomEdgeInBounds && ( leftEdgeInBounds || rightEdgeInBounds );
+};
+
+/**
+ * Position the floatable below its container.
+ *
+ * This should only be done when both of them are attached to the DOM and visible.
+ *
+ * @chainable
+ */
+OO.ui.mixin.FloatableElement.prototype.position = function () {
+       var pos;
+
+       if ( !this.positioning ) {
+               return this;
+       }
+
+       if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
+               this.$floatable.addClass( 'oo-ui-element-hidden' );
+               return;
+       } else {
+               this.$floatable.removeClass( 'oo-ui-element-hidden' );
+       }
+
+       if ( !this.needsCustomPosition ) {
+               return;
+       }
+
+       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 );
+
+       // We updated the position, so re-evaluate the clipping state.
+       // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
+       // will not notice the need to update itself.)
+       // TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does
+       // it not listen to the right events in the right places?
+       if ( this.clip ) {
+               this.clip();
+       }
+
+       return this;
+};
+
+/**
+ * Element that can be automatically clipped to visible boundaries.
+ *
+ * Whenever the element's natural height changes, you have to call
+ * {@link OO.ui.mixin.ClippableElement#clip} to make sure it's still
+ * clipping correctly.
+ *
+ * The dimensions of #$clippableContainer will be compared to the boundaries of the
+ * nearest scrollable container. If #$clippableContainer is too tall and/or too wide,
+ * then #$clippable will be given a fixed reduced height and/or width and will be made
+ * scrollable. By default, #$clippable and #$clippableContainer are the same element,
+ * but you can build a static footer by setting #$clippableContainer to an element that contains
+ * #$clippable and the footer.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$clippable] Node to clip, assigned to #$clippable, omit to use #$element
+ * @cfg {jQuery} [$clippableContainer] Node to keep visible, assigned to #$clippableContainer,
+ *   omit to use #$clippable
+ */
+OO.ui.mixin.ClippableElement = function OoUiMixinClippableElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$clippable = null;
+       this.$clippableContainer = null;
+       this.clipping = false;
+       this.clippedHorizontally = false;
+       this.clippedVertically = false;
+       this.$clippableScrollableContainer = null;
+       this.$clippableScroller = null;
+       this.$clippableWindow = null;
+       this.idealWidth = null;
+       this.idealHeight = null;
+       this.onClippableScrollHandler = this.clip.bind( this );
+       this.onClippableWindowResizeHandler = this.clip.bind( this );
+
+       // Initialization
+       if ( config.$clippableContainer ) {
+               this.setClippableContainer( config.$clippableContainer );
+       }
+       this.setClippableElement( config.$clippable || this.$element );
+};
+
+/* Methods */
+
+/**
+ * Set clippable element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $clippable Element to make clippable
+ */
+OO.ui.mixin.ClippableElement.prototype.setClippableElement = function ( $clippable ) {
+       if ( this.$clippable ) {
+               this.$clippable.removeClass( 'oo-ui-clippableElement-clippable' );
+               this.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );
+               OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
+       }
+
+       this.$clippable = $clippable.addClass( 'oo-ui-clippableElement-clippable' );
+       this.clip();
+};
+
+/**
+ * Set clippable container.
+ *
+ * This is the container that will be measured when deciding whether to clip. When clipping,
+ * #$clippable will be resized in order to keep the clippable container fully visible.
+ *
+ * If the clippable container is unset, #$clippable will be used.
+ *
+ * @param {jQuery|null} $clippableContainer Container to keep visible, or null to unset
+ */
+OO.ui.mixin.ClippableElement.prototype.setClippableContainer = function ( $clippableContainer ) {
+       this.$clippableContainer = $clippableContainer;
+       if ( this.$clippable ) {
+               this.clip();
+       }
+};
+
+/**
+ * Toggle clipping.
+ *
+ * Do not turn clipping on until after the element is attached to the DOM and visible.
+ *
+ * @param {boolean} [clipping] Enable clipping, omit to toggle
+ * @chainable
+ */
+OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
+       clipping = clipping === undefined ? !this.clipping : !!clipping;
+
+       if ( this.clipping !== clipping ) {
+               this.clipping = clipping;
+               if ( clipping ) {
+                       this.$clippableScrollableContainer = $( this.getClosestScrollableElementContainer() );
+                       // If the clippable container is the root, we have to listen to scroll events and check
+                       // jQuery.scrollTop on the window because of browser inconsistencies
+                       this.$clippableScroller = this.$clippableScrollableContainer.is( 'html, body' ) ?
+                               $( OO.ui.Element.static.getWindow( this.$clippableScrollableContainer ) ) :
+                               this.$clippableScrollableContainer;
+                       this.$clippableScroller.on( 'scroll', this.onClippableScrollHandler );
+                       this.$clippableWindow = $( this.getElementWindow() )
+                               .on( 'resize', this.onClippableWindowResizeHandler );
+                       // Initial clip after visible
+                       this.clip();
+               } else {
+                       this.$clippable.css( {
+                               width: '',
+                               height: '',
+                               maxWidth: '',
+                               maxHeight: '',
+                               overflowX: '',
+                               overflowY: ''
+                       } );
+                       OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
+
+                       this.$clippableScrollableContainer = null;
+                       this.$clippableScroller.off( 'scroll', this.onClippableScrollHandler );
+                       this.$clippableScroller = null;
+                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
+                       this.$clippableWindow = null;
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ *
+ * @return {boolean} Element will be clipped to the visible area
+ */
+OO.ui.mixin.ClippableElement.prototype.isClipping = function () {
+       return this.clipping;
+};
+
+/**
+ * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
+ *
+ * @return {boolean} Part of the element is being clipped
+ */
+OO.ui.mixin.ClippableElement.prototype.isClipped = function () {
+       return this.clippedHorizontally || this.clippedVertically;
+};
 
 /**
  * Check if the right of the element is being clipped by the nearest scrollable container.
@@ -4103,9 +4400,13 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        extraHeight = $container.outerHeight() - this.$clippable.outerHeight();
        extraWidth = $container.outerWidth() - this.$clippable.outerWidth();
        ccOffset = $container.offset();
-       $scrollableContainer = this.$clippableScrollableContainer.is( 'html, body' ) ?
-               this.$clippableWindow : this.$clippableScrollableContainer;
-       scOffset = $scrollableContainer.offset() || { top: 0, left: 0 };
+       if ( this.$clippableScrollableContainer.is( 'html, body' ) ) {
+               $scrollableContainer = this.$clippableWindow;
+               scOffset = { top: 0, left: 0 };
+       } else {
+               $scrollableContainer = this.$clippableScrollableContainer;
+               scOffset = $scrollableContainer.offset();
+       }
        scHeight = $scrollableContainer.innerHeight() - buffer;
        scWidth = $scrollableContainer.innerWidth() - buffer;
        ccWidth = $container.outerWidth() + buffer;
@@ -4127,8 +4428,11 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        clipHeight = allotedHeight < naturalHeight;
 
        if ( clipWidth ) {
+               // The order matters here. If overflow is not set first, Chrome displays bogus scrollbars. (T157672)
+               // Forcing a reflow is a smaller workaround than calling reconsiderScrollbars() for this case.
+               this.$clippable.css( 'overflowX', 'scroll' );
+               void this.$clippable[ 0 ].offsetHeight; // Force reflow
                this.$clippable.css( {
-                       overflowX: 'scroll',
                        width: Math.max( 0, allotedWidth ),
                        maxWidth: ''
                } );
@@ -4140,8 +4444,11 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
                } );
        }
        if ( clipHeight ) {
+               // The order matters here. If overflow is not set first, Chrome displays bogus scrollbars. (T157672)
+               // Forcing a reflow is a smaller workaround than calling reconsiderScrollbars() for this case.
+               this.$clippable.css( 'overflowY', 'scroll' );
+               void this.$clippable[ 0 ].offsetHeight; // Force reflow
                this.$clippable.css( {
-                       overflowY: 'scroll',
                        height: Math.max( 0, allotedHeight ),
                        maxHeight: ''
                } );
@@ -4187,6 +4494,7 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.LabelElement
  * @mixins OO.ui.mixin.ClippableElement
+ * @mixins OO.ui.mixin.FloatableElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -4232,6 +4540,7 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
                $clippable: this.$body,
                $clippableContainer: this.$popup
        } ) );
+       OO.ui.mixin.FloatableElement.call( this, config );
 
        // Properties
        this.$anchor = $( '<div>' );
@@ -4296,6 +4605,7 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
 OO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );
 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 );
 
 /* Methods */
 
@@ -4308,8 +4618,7 @@ OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.ClippableElement );
 OO.ui.PopupWidget.prototype.onMouseDown = function ( e ) {
        if (
                this.isVisible() &&
-               !$.contains( this.$element[ 0 ], e.target ) &&
-               ( !this.$autoCloseIgnore || !this.$autoCloseIgnore.has( e.target ).length )
+               !OO.ui.contains( this.$element.add( this.$autoCloseIgnore ).get(), e.target, true )
        ) {
                this.toggle( false );
        }
@@ -4420,6 +4729,8 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
        OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
 
        if ( change ) {
+               this.togglePositioning( show && !!this.$floatableContainer );
+
                if ( show ) {
                        if ( this.autoClose ) {
                                this.bindMouseDownListener();
@@ -4468,14 +4779,27 @@ OO.ui.PopupWidget.prototype.setSize = function ( width, height, transition ) {
  */
 OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        var popupOffset, originOffset, containerLeft, containerWidth, containerRight,
-               popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth,
-               align = this.align,
+               popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth, direction,
+               dirFactor, align,
+               alignMap = {
+                       ltr: {
+                               'force-left': 'backwards',
+                               'force-right': 'forwards'
+                       },
+                       rtl: {
+                               'force-left': 'forwards',
+                               'force-right': 'backwards'
+                       }
+               },
                widget = this;
 
        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)
@@ -4484,34 +4808,24 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                height: this.height !== null ? this.height : 'auto'
        } );
 
-       // If we are in RTL, we need to flip the alignment, unless it is center
-       if ( align === 'forwards' || align === 'backwards' ) {
-               if ( this.$container.css( 'direction' ) === 'rtl' ) {
-                       align = ( { forwards: 'force-left', backwards: 'force-right' } )[ this.align ];
-               } else {
-                       align = ( { forwards: 'force-right', backwards: 'force-left' } )[ this.align ];
-               }
-
-       }
-
        // Compute initial popupOffset based on alignment
-       popupOffset = this.width * ( { 'force-left': -1, center: -0.5, 'force-right': 0 } )[ align ];
+       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 = popupOffset - this.containerPadding;
-       popupRight = popupOffset + this.containerPadding + this.width + this.containerPadding;
+       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 += overlapRight;
+               popupOffset += dirFactor * overlapRight;
        } else if ( overlapLeft < 0 ) {
-               popupOffset -= overlapLeft;
+               popupOffset -= dirFactor * overlapLeft;
        }
 
        // Adjust offset to avoid anchor being rendered too close to the edge
@@ -4532,7 +4846,7 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        }
 
        // Position body relative to anchor
-       this.$popup.css( 'margin-left', popupOffset );
+       this.$popup.css( direction === 'rtl' ? 'margin-right' : 'margin-left', popupOffset );
 
        if ( transition ) {
                // Prevent transitioning after transition is complete
@@ -4553,13 +4867,19 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
 /**
  * Set popup alignment
  *
- * @param {string} align Alignment of the popup, `center`, `force-left`, `force-right`,
+ * @param {string} [align=center] Alignment of the popup, `center`, `force-left`, `force-right`,
  *  `backwards` or `forwards`.
  */
 OO.ui.PopupWidget.prototype.setAlignment = function ( align ) {
-       // Validate alignment and transform deprecated values
-       if ( [ 'left', 'right', 'force-left', 'force-right', 'backwards', 'forwards', 'center' ].indexOf( align ) > -1 ) {
-               this.align = { left: 'force-right', right: 'force-left' }[ align ] || align;
+       // Transform values deprecated since v0.11.0
+       if ( align === 'left' || align === 'right' ) {
+               OO.ui.warnDeprecation( 'PopupWidget#setAlignment parameter value `' + align + '` is deprecated. Use `force-right` or `force-left` instead.' );
+               align = { left: 'force-right', right: 'force-left' }[ align ];
+       }
+
+       // Validate alignment
+       if ( [ 'force-left', 'force-right', 'backwards', 'forwards', 'center' ].indexOf( align ) > -1 ) {
+               this.align = align;
        } else {
                this.align = 'center';
        }
@@ -4597,7 +4917,7 @@ OO.ui.mixin.PopupElement = function OoUiMixinPopupElement( config ) {
        this.popup = new OO.ui.PopupWidget( $.extend(
                { autoClose: true },
                config.popup,
-               { $autoCloseIgnore: this.$element }
+               { $autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore ) }
        ) );
 };
 
@@ -4636,13 +4956,23 @@ OO.ui.mixin.PopupElement.prototype.getPopup = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @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.
  */
 OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        // Parent constructor
        OO.ui.PopupButtonWidget.parent.call( this, config );
 
        // Mixin constructors
-       OO.ui.mixin.PopupElement.call( this, config );
+       OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
+               popup: {
+                       $floatableContainer: this.$element
+               }
+       } ) );
+
+       // Properties
+       this.$overlay = config.$overlay || this.$element;
 
        // Events
        this.connect( this, { click: 'onAction' } );
@@ -4650,8 +4980,12 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        // Initialization
        this.$element
                .addClass( 'oo-ui-popupButtonWidget' )
-               .attr( 'aria-haspopup', 'true' )
-               .append( this.popup.$element );
+               .attr( 'aria-haspopup', 'true' );
+       this.popup.$element
+               .addClass( 'oo-ui-popupButtonWidget-popup' )
+               .toggleClass( 'oo-ui-popupButtonWidget-framed-popup', this.isFramed() )
+               .toggleClass( 'oo-ui-popupButtonWidget-frameless-popup', !this.isFramed() );
+       this.$overlay.append( this.popup.$element );
 };
 
 /* Setup */
@@ -4825,12 +5159,40 @@ OO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Static Properties */
 
+/**
+ * Whether this option can be selected. See #setSelected.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.selectable = true;
 
+/**
+ * Whether this option can be highlighted. See #setHighlighted.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.highlightable = true;
 
+/**
+ * Whether this option can be pressed. See #setPressed.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.pressable = true;
 
+/**
+ * Whether this option will be scrolled into view when it is selected.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.scrollIntoViewOnSelect = false;
 
 /* Methods */
@@ -4953,6 +5315,19 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
        return this;
 };
 
+/**
+ * Get text to match search strings against.
+ *
+ * The default implementation returns the label text, but subclasses
+ * can override this to provide more complex behavior.
+ *
+ * @return {string|boolean} String to match search string against
+ */
+OO.ui.OptionWidget.prototype.getMatchText = function () {
+       var label = this.getLabel();
+       return typeof label === 'string' ? label : this.$label.text();
+};
+
 /**
  * A SelectWidget is of a generic selection of options. The OOjs UI library contains several types of
  * select widgets, including {@link OO.ui.ButtonSelectWidget button selects},
@@ -5397,7 +5772,7 @@ OO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {
  * @protected
  * @param {string} s String to match against items
  * @param {boolean} [exact=false] Only accept exact matches
- * @return {Function} function ( OO.ui.OptionItem ) => boolean
+ * @return {Function} function ( OO.ui.OptionWidget ) => boolean
  */
 OO.ui.SelectWidget.prototype.getItemMatcher = function ( s, exact ) {
        var re;
@@ -5412,14 +5787,11 @@ OO.ui.SelectWidget.prototype.getItemMatcher = function ( s, exact ) {
        }
        re = new RegExp( re, 'i' );
        return function ( item ) {
-               var l = item.getLabel();
-               if ( typeof l !== 'string' ) {
-                       l = item.$label.text();
-               }
-               if ( l.normalize ) {
-                       l = l.normalize();
+               var matchText = item.getMatchText();
+               if ( matchText.normalize ) {
+                       matchText = matchText.normalize();
                }
-               return re.test( l );
+               return re.test( matchText );
        };
 };
 
@@ -5903,6 +6275,10 @@ OO.inheritClass( OO.ui.MenuOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuOptionWidget.static.scrollIntoViewOnSelect = true;
 
 /**
@@ -5956,8 +6332,16 @@ OO.inheritClass( OO.ui.MenuSectionOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuSectionOptionWidget.static.selectable = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuSectionOptionWidget.static.highlightable = false;
 
 /**
@@ -6091,7 +6475,8 @@ OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
  * @protected
  */
 OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
-       var i, item,
+       var i, item, visible,
+               anyVisible = false,
                len = this.items.length,
                showAll = !this.isVisible(),
                filter = showAll ? null : this.getItemMatcher( this.$input.val() );
@@ -6099,10 +6484,14 @@ OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
        for ( i = 0; i < len; i++ ) {
                item = this.items[ i ];
                if ( item instanceof OO.ui.OptionWidget ) {
-                       item.toggle( showAll || filter( item ) );
+                       visible = showAll || filter( item );
+                       anyVisible = anyVisible || visible;
+                       item.toggle( visible );
                }
        }
 
+       this.$element.toggleClass( 'oo-ui-menuSelectWidget-invisible', !anyVisible );
+
        // Reevaluate clipping
        this.clip();
 };
@@ -6255,7 +6644,7 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
  * OO.ui.MenuOptionWidget. The DropdownWidget takes care of opening and displaying the menu so that
  * users can interact with it.
  *
- * If you want to use this within a HTML form, such as a OO.ui.FormLayout, use
+ * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use
  * OO.ui.DropdownInputWidget instead.
  *
  *     @example
@@ -6485,12 +6874,28 @@ OO.inheritClass( OO.ui.RadioOptionWidget, OO.ui.OptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.highlightable = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.scrollIntoViewOnSelect = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.pressable = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.tagName = 'label';
 
 /* Methods */
@@ -6526,7 +6931,7 @@ OO.ui.RadioOptionWidget.prototype.setDisabled = function ( disabled ) {
  * an interface for adding, removing and selecting options.
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  *
- * If you want to use this within a HTML form, such as a OO.ui.FormLayout, use
+ * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use
  * OO.ui.RadioSelectInputWidget instead.
  *
  *     @example
@@ -6820,6 +7225,10 @@ OO.inheritClass( OO.ui.CheckboxMultioptionWidget, OO.ui.MultioptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.CheckboxMultioptionWidget.static.tagName = 'label';
 
 /* Methods */
@@ -6887,7 +7296,7 @@ OO.ui.CheckboxMultioptionWidget.prototype.onKeyDown = function ( e ) {
  * CheckboxMultiselectWidget provides an interface for adding, removing and selecting options.
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  *
- * If you want to use this within a HTML form, such as a OO.ui.FormLayout, use
+ * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use
  * OO.ui.CheckboxMultiselectInputWidget instead.
  *
  *     @example
@@ -6910,320 +7319,113 @@ OO.ui.CheckboxMultioptionWidget.prototype.onKeyDown = function ( e ) {
  *     $( 'body' ).append( multiselect.$element );
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
- *
- * @class
- * @extends OO.ui.MultiselectWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.CheckboxMultiselectWidget = function OoUiCheckboxMultiselectWidget( config ) {
-       // Parent constructor
-       OO.ui.CheckboxMultiselectWidget.parent.call( this, config );
-
-       // Properties
-       this.$lastClicked = null;
-
-       // Events
-       this.$group.on( 'click', this.onClick.bind( this ) );
-
-       // Initialization
-       this.$element
-               .addClass( 'oo-ui-checkboxMultiselectWidget' );
-};
-
-/* Setup */
-
-OO.inheritClass( OO.ui.CheckboxMultiselectWidget, OO.ui.MultiselectWidget );
-
-/* Methods */
-
-/**
- * Get an option by its position relative to the specified item (or to the start of the option array,
- * if item is `null`). The direction in which to search through the option array is specified with a
- * number: -1 for reverse (the default) or 1 for forward. The method will return an option, or
- * `null` if there are no options in the array.
- *
- * @param {OO.ui.CheckboxMultioptionWidget|null} item Item to describe the start position, or `null` to start at the beginning of the array.
- * @param {number} direction Direction to move in: -1 to move backward, 1 to move forward
- * @return {OO.ui.CheckboxMultioptionWidget|null} Item at position, `null` if there are no items in the select
- */
-OO.ui.CheckboxMultiselectWidget.prototype.getRelativeFocusableItem = function ( item, direction ) {
-       var currentIndex, nextIndex, i,
-               increase = direction > 0 ? 1 : -1,
-               len = this.items.length;
-
-       if ( item ) {
-               currentIndex = this.items.indexOf( item );
-               nextIndex = ( currentIndex + increase + len ) % len;
-       } else {
-               // If no item is selected and moving forward, start at the beginning.
-               // If moving backward, start at the end.
-               nextIndex = direction > 0 ? 0 : len - 1;
-       }
-
-       for ( i = 0; i < len; i++ ) {
-               item = this.items[ nextIndex ];
-               if ( item && !item.isDisabled() ) {
-                       return item;
-               }
-               nextIndex = ( nextIndex + increase + len ) % len;
-       }
-       return null;
-};
-
-/**
- * Handle click events on checkboxes.
- *
- * @param {jQuery.Event} e
- */
-OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
-       var $options, lastClickedIndex, nowClickedIndex, i, direction, wasSelected, items,
-               $lastClicked = this.$lastClicked,
-               $nowClicked = $( e.target ).closest( '.oo-ui-checkboxMultioptionWidget' )
-                       .not( '.oo-ui-widget-disabled' );
-
-       // Allow selecting multiple options at once by Shift-clicking them
-       if ( $lastClicked && $nowClicked.length && e.shiftKey ) {
-               $options = this.$group.find( '.oo-ui-checkboxMultioptionWidget' );
-               lastClickedIndex = $options.index( $lastClicked );
-               nowClickedIndex = $options.index( $nowClicked );
-               // If it's the same item, either the user is being silly, or it's a fake event generated by the
-               // browser. In either case we don't need custom handling.
-               if ( nowClickedIndex !== lastClickedIndex ) {
-                       items = this.items;
-                       wasSelected = items[ nowClickedIndex ].isSelected();
-                       direction = nowClickedIndex > lastClickedIndex ? 1 : -1;
-
-                       // This depends on the DOM order of the items and the order of the .items array being the same.
-                       for ( i = lastClickedIndex; i !== nowClickedIndex; i += direction ) {
-                               if ( !items[ i ].isDisabled() ) {
-                                       items[ i ].setSelected( !wasSelected );
-                               }
-                       }
-                       // For the now-clicked element, use immediate timeout to allow the browser to do its own
-                       // handling first, then set our value. The order in which events happen is different for
-                       // clicks on the <input> and on the <label> and there are additional fake clicks fired for
-                       // non-click actions that change the checkboxes.
-                       e.preventDefault();
-                       setTimeout( function () {
-                               if ( !items[ nowClickedIndex ].isDisabled() ) {
-                                       items[ nowClickedIndex ].setSelected( !wasSelected );
-                               }
-                       } );
-               }
-       }
-
-       if ( $nowClicked.length ) {
-               this.$lastClicked = $nowClicked;
-       }
-};
-
-/**
- * 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).
- *
- * 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
- * sure the element is still placed correctly.
- *
- * As positioning is only possible when both the element and the container are attached to the DOM
- * and visible, it's only done after you call #togglePositioning. You might want to do this inside
- * the #toggle method to display a floating popup, for example.
- *
- * @abstract
- * @class
- *
- * @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
- */
-OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Properties
-       this.$floatable = null;
-       this.$floatableContainer = null;
-       this.$floatableWindow = null;
-       this.$floatableClosestScrollable = null;
-       this.onFloatableScrollHandler = this.position.bind( this );
-       this.onFloatableWindowResizeHandler = this.position.bind( this );
-
-       // Initialization
-       this.setFloatableContainer( config.$floatableContainer );
-       this.setFloatableElement( config.$floatable || this.$element );
-};
-
-/* Methods */
-
-/**
- * Set floatable element.
- *
- * If an element is already set, it will be cleaned up before setting up the new element.
- *
- * @param {jQuery} $floatable Element to make floatable
- */
-OO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatable ) {
-       if ( this.$floatable ) {
-               this.$floatable.removeClass( 'oo-ui-floatableElement-floatable' );
-               this.$floatable.css( { left: '', top: '' } );
-       }
-
-       this.$floatable = $floatable.addClass( 'oo-ui-floatableElement-floatable' );
-       this.position();
-};
-
-/**
- * Set floatable container.
- *
- * The element will be always positioned under the specified container.
- *
- * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
- */
-OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $floatableContainer ) {
-       this.$floatableContainer = $floatableContainer;
-       if ( this.$floatable ) {
-               this.position();
-       }
-};
-
-/**
- * Toggle positioning.
- *
- * Do not turn positioning on until after the element is attached to the DOM and visible.
- *
- * @param {boolean} [positioning] Enable positioning, omit to toggle
- * @chainable
- */
-OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {
-       var closestScrollableOfContainer, closestScrollableOfFloatable;
-
-       positioning = positioning === undefined ? !this.positioning : !!positioning;
-
-       if ( this.positioning !== positioning ) {
-               this.positioning = positioning;
-
-               closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
-               closestScrollableOfFloatable = OO.ui.Element.static.getClosestScrollableContainer( this.$floatable[ 0 ] );
-               this.needsCustomPosition = closestScrollableOfContainer !== closestScrollableOfFloatable;
-               // 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' ) ) {
-                       closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
-               }
+ *
+ * @class
+ * @extends OO.ui.MultiselectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.CheckboxMultiselectWidget = function OoUiCheckboxMultiselectWidget( config ) {
+       // Parent constructor
+       OO.ui.CheckboxMultiselectWidget.parent.call( this, config );
 
-               if ( positioning ) {
-                       this.$floatableWindow = $( this.getElementWindow() );
-                       this.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );
+       // Properties
+       this.$lastClicked = null;
 
-                       this.$floatableClosestScrollable = $( closestScrollableOfContainer );
-                       this.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );
+       // Events
+       this.$group.on( 'click', this.onClick.bind( this ) );
 
-                       // Initial position after visible
-                       this.position();
-               } else {
-                       if ( this.$floatableWindow ) {
-                               this.$floatableWindow.off( 'resize', this.onFloatableWindowResizeHandler );
-                               this.$floatableWindow = null;
-                       }
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-checkboxMultiselectWidget' );
+};
 
-                       if ( this.$floatableClosestScrollable ) {
-                               this.$floatableClosestScrollable.off( 'scroll', this.onFloatableScrollHandler );
-                               this.$floatableClosestScrollable = null;
-                       }
+/* Setup */
 
-                       this.$floatable.css( { left: '', top: '' } );
-               }
-       }
+OO.inheritClass( OO.ui.CheckboxMultiselectWidget, OO.ui.MultiselectWidget );
 
-       return this;
-};
+/* Methods */
 
 /**
- * Check whether the bottom edge of the given element is within the viewport of the given container.
+ * Get an option by its position relative to the specified item (or to the start of the option array,
+ * if item is `null`). The direction in which to search through the option array is specified with a
+ * number: -1 for reverse (the default) or 1 for forward. The method will return an option, or
+ * `null` if there are no options in the array.
  *
- * @private
- * @param {jQuery} $element
- * @param {jQuery} $container
- * @return {boolean}
+ * @param {OO.ui.CheckboxMultioptionWidget|null} item Item to describe the start position, or `null` to start at the beginning of the array.
+ * @param {number} direction Direction to move in: -1 to move backward, 1 to move forward
+ * @return {OO.ui.CheckboxMultioptionWidget|null} Item at position, `null` if there are no items in the select
  */
-OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
-       var elemRect, contRect,
-               leftEdgeInBounds = false,
-               bottomEdgeInBounds = false,
-               rightEdgeInBounds = false;
+OO.ui.CheckboxMultiselectWidget.prototype.getRelativeFocusableItem = function ( item, direction ) {
+       var currentIndex, nextIndex, i,
+               increase = direction > 0 ? 1 : -1,
+               len = this.items.length;
 
-       elemRect = $element[ 0 ].getBoundingClientRect();
-       if ( $container[ 0 ] === window ) {
-               contRect = {
-                       top: 0,
-                       left: 0,
-                       right: document.documentElement.clientWidth,
-                       bottom: document.documentElement.clientHeight
-               };
+       if ( item ) {
+               currentIndex = this.items.indexOf( item );
+               nextIndex = ( currentIndex + increase + len ) % len;
        } else {
-               contRect = $container[ 0 ].getBoundingClientRect();
+               // If no item is selected and moving forward, start at the beginning.
+               // If moving backward, start at the end.
+               nextIndex = direction > 0 ? 0 : len - 1;
        }
 
-       // 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;
-       }
-       if ( elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom ) {
-               bottomEdgeInBounds = true;
-       }
-       if ( elemRect.right >= contRect.left && elemRect.right <= contRect.right ) {
-               rightEdgeInBounds = true;
+       for ( i = 0; i < len; i++ ) {
+               item = this.items[ nextIndex ];
+               if ( item && !item.isDisabled() ) {
+                       return item;
+               }
+               nextIndex = ( nextIndex + increase + len ) % len;
        }
-
-       // We only care that any part of the bottom edge is visible
-       return bottomEdgeInBounds && ( leftEdgeInBounds || rightEdgeInBounds );
+       return null;
 };
 
 /**
- * Position the floatable below its container.
- *
- * This should only be done when both of them are attached to the DOM and visible.
+ * Handle click events on checkboxes.
  *
- * @chainable
+ * @param {jQuery.Event} e
  */
-OO.ui.mixin.FloatableElement.prototype.position = function () {
-       var pos;
-
-       if ( !this.positioning ) {
-               return this;
-       }
+OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
+       var $options, lastClickedIndex, nowClickedIndex, i, direction, wasSelected, items,
+               $lastClicked = this.$lastClicked,
+               $nowClicked = $( e.target ).closest( '.oo-ui-checkboxMultioptionWidget' )
+                       .not( '.oo-ui-widget-disabled' );
 
-       if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
-               this.$floatable.addClass( 'oo-ui-floatableElement-hidden' );
-               return;
-       } else {
-               this.$floatable.removeClass( 'oo-ui-floatableElement-hidden' );
-       }
+       // Allow selecting multiple options at once by Shift-clicking them
+       if ( $lastClicked && $nowClicked.length && e.shiftKey ) {
+               $options = this.$group.find( '.oo-ui-checkboxMultioptionWidget' );
+               lastClickedIndex = $options.index( $lastClicked );
+               nowClickedIndex = $options.index( $nowClicked );
+               // If it's the same item, either the user is being silly, or it's a fake event generated by the
+               // browser. In either case we don't need custom handling.
+               if ( nowClickedIndex !== lastClickedIndex ) {
+                       items = this.items;
+                       wasSelected = items[ nowClickedIndex ].isSelected();
+                       direction = nowClickedIndex > lastClickedIndex ? 1 : -1;
 
-       if ( !this.needsCustomPosition ) {
-               return;
+                       // This depends on the DOM order of the items and the order of the .items array being the same.
+                       for ( i = lastClickedIndex; i !== nowClickedIndex; i += direction ) {
+                               if ( !items[ i ].isDisabled() ) {
+                                       items[ i ].setSelected( !wasSelected );
+                               }
+                       }
+                       // For the now-clicked element, use immediate timeout to allow the browser to do its own
+                       // handling first, then set our value. The order in which events happen is different for
+                       // clicks on the <input> and on the <label> and there are additional fake clicks fired for
+                       // non-click actions that change the checkboxes.
+                       e.preventDefault();
+                       setTimeout( function () {
+                               if ( !items[ nowClickedIndex ].isDisabled() ) {
+                                       items[ nowClickedIndex ].setSelected( !wasSelected );
+                               }
+                       } );
+               }
        }
 
-       pos = OO.ui.Element.static.getRelativePosition( this.$floatableContainer, this.$floatable.offsetParent() );
-
-       // Position under container
-       pos.top += this.$floatableContainer.height();
-       this.$floatable.css( pos );
-
-       // We updated the position, so re-evaluate the clipping state.
-       // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
-       // will not notice the need to update itself.)
-       // TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does
-       // it not listen to the right events in the right places?
-       if ( this.clip ) {
-               this.clip();
+       if ( $nowClicked.length ) {
+               this.$lastClicked = $nowClicked;
        }
-
-       return this;
 };
 
 /**
@@ -7278,9 +7480,6 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
 OO.inheritClass( OO.ui.FloatingMenuSelectWidget, OO.ui.MenuSelectWidget );
 OO.mixinClass( OO.ui.FloatingMenuSelectWidget, OO.ui.mixin.FloatableElement );
 
-// For backwards compatibility
-OO.ui.TextInputMenuSelectWidget = OO.ui.FloatingMenuSelectWidget;
-
 /* Methods */
 
 /**
@@ -7307,6 +7506,23 @@ OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
        return this;
 };
 
+/*
+ * The old name for the FloatingMenuSelectWidget widget, provided for backwards-compatibility.
+ *
+ * @class
+ * @extends OO.ui.FloatingMenuSelectWidget
+ *
+ * @constructor
+ * @deprecated since v0.12.5.
+ */
+OO.ui.TextInputMenuSelectWidget = function OoUiTextInputMenuSelectWidget() {
+       OO.ui.warnDeprecation( 'TextInputMenuSelectWidget is deprecated. Use the FloatingMenuSelectWidget instead.' );
+       // Parent constructor
+       OO.ui.TextInputMenuSelectWidget.parent.apply( this, arguments );
+};
+
+OO.inheritClass( OO.ui.TextInputMenuSelectWidget, OO.ui.FloatingMenuSelectWidget );
+
 /**
  * Progress bars visually display the status of an operation, such as a download,
  * and can be either determinate or indeterminate:
@@ -7373,6 +7589,10 @@ OO.inheritClass( OO.ui.ProgressBarWidget, OO.ui.Widget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ProgressBarWidget.static.tagName = 'div';
 
 /* Methods */
@@ -7474,6 +7694,10 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.InputWidget.static.supportsSimpleLabel = true;
 
 /* Static Methods */
@@ -7527,6 +7751,25 @@ 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.
  *
@@ -7615,6 +7858,7 @@ OO.ui.InputWidget.prototype.cleanUpValue = function ( value ) {
  * called directly.
  */
 OO.ui.InputWidget.prototype.simulateLabelClick = function () {
+       OO.ui.warnDeprecation( 'InputWidget: simulateLabelClick() is deprecated.' );
        if ( !this.isDisabled() ) {
                if ( this.$input.is( ':checkbox, :radio' ) ) {
                        this.$input.click();
@@ -7746,6 +7990,9 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.TitledElement );
 /**
  * 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;
 
@@ -7809,7 +8056,7 @@ OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
  * in {@link OO.ui.FieldLayout field layouts} that use the {@link OO.ui.FieldLayout#align inline}
  * alignment. For more information, please see the [OOjs UI documentation on MediaWiki][1].
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  *     @example
  *     // An example of selected, unselected, and disabled checkbox inputs
@@ -7940,7 +8187,7 @@ OO.ui.CheckboxInputWidget.prototype.restorePreInfuseState = function ( state ) {
 
 /**
  * DropdownInputWidget is a {@link OO.ui.DropdownWidget DropdownWidget} intended to be used
- * within a HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
+ * within an HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
  * of a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for
  * more information about input widgets.
  *
@@ -8102,7 +8349,7 @@ OO.ui.DropdownInputWidget.prototype.blur = function () {
  * with {@link OO.ui.RadioOptionWidget radio options} instead of this class. For more information,
  * please see the [OOjs UI documentation on MediaWiki][1].
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  *     @example
  *     // An example of selected, unselected, and disabled radio inputs
@@ -8217,7 +8464,7 @@ OO.ui.RadioInputWidget.prototype.restorePreInfuseState = function ( state ) {
 
 /**
  * RadioSelectInputWidget is a {@link OO.ui.RadioSelectWidget RadioSelectWidget} intended to be used
- * within a HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
+ * within an HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
  * of a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for
  * more information about input widgets.
  *
@@ -8269,6 +8516,10 @@ OO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioSelectInputWidget.static.supportsSimpleLabel = false;
 
 /* Static Methods */
@@ -8392,7 +8643,7 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
+ * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: …, disabled: … }`
  */
 OO.ui.CheckboxMultiselectInputWidget = function OoUiCheckboxMultiselectInputWidget( config ) {
        // Configuration initialization
@@ -8424,6 +8675,10 @@ OO.inheritClass( OO.ui.CheckboxMultiselectInputWidget, OO.ui.InputWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.CheckboxMultiselectInputWidget.static.supportsSimpleLabel = false;
 
 /* Static Methods */
@@ -8517,7 +8772,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setDisabled = function ( state )
 /**
  * Set the options available for this input.
  *
- * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`
+ * @param {Object[]} options Array of menu options in the format `{ data: …, label: …, disabled: … }`
  * @chainable
  */
 OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options ) {
@@ -8527,12 +8782,14 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
        this.checkboxMultiselectWidget
                .clearItems()
                .addItems( options.map( function ( opt ) {
-                       var optValue, item;
+                       var optValue, item, optDisabled;
                        optValue =
                                OO.ui.CheckboxMultiselectInputWidget.parent.prototype.cleanUpValue.call( widget, opt.data );
+                       optDisabled = opt.disabled !== undefined ? opt.disabled : false;
                        item = new OO.ui.CheckboxMultioptionWidget( {
                                data: optValue,
-                               label: opt.label !== undefined ? opt.label : optValue
+                               label: opt.label !== undefined ? opt.label : optValue,
+                               disabled: optDisabled
                        } );
                        // Set the 'name' and 'value' for form submission
                        item.checkbox.$input.attr( 'name', widget.inputName );
@@ -8555,7 +8812,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  * which modifies incoming values rather than validating them.
  * Please see the [OOjs UI documentation on MediaWiki] [1] for more information and examples.
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  *     @example
  *     // Example of a text input widget
@@ -8658,9 +8915,6 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                blur: this.onBlur.bind( this ),
                focus: this.onFocus.bind( this )
        } );
-       this.$input.one( {
-               focus: this.onElementAttach.bind( this )
-       } );
        this.$icon.on( 'mousedown', this.onIconMouseDown.bind( this ) );
        this.$indicator.on( 'mousedown', this.onIndicatorMouseDown.bind( this ) );
        this.on( 'labelChange', this.updatePosition.bind( this ) );
@@ -8705,6 +8959,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                this.$input.attr( 'rows', config.rows );
        }
        if ( this.label || config.autosize ) {
+               this.isWaitingToBeAttached = true;
                this.installParentChangeDetector();
        }
 };
@@ -8815,6 +9070,11 @@ OO.ui.TextInputWidget.prototype.onBlur = function () {
  * @param {jQuery.Event} e Focus event
  */
 OO.ui.TextInputWidget.prototype.onFocus = function () {
+       if ( this.isWaitingToBeAttached ) {
+               // If we've received focus, then we must be attached to the document, and if
+               // isWaitingToBeAttached is still true, that means the handler never fired. Fire it now.
+               this.onElementAttach();
+       }
        this.setValidityFlag( true );
 };
 
@@ -8825,6 +9085,7 @@ OO.ui.TextInputWidget.prototype.onFocus = function () {
  * @param {jQuery.Event} e Element attach event
  */
 OO.ui.TextInputWidget.prototype.onElementAttach = function () {
+       this.isWaitingToBeAttached = false;
        // Any previously calculated size is now probably invalid if we reattached elsewhere
        this.valCache = null;
        this.adjustSize();
@@ -8937,7 +9198,7 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
        if ( MutationObserver ) {
                // The new way. If only it wasn't so ugly.
 
-               if ( this.$element.closest( 'html' ).length ) {
+               if ( this.isElementAttached() ) {
                        // Widget is attached already, do nothing. This breaks the functionality of this function when
                        // the widget is detached and reattached. Alas, doing this correctly with MutationObserver
                        // would require observation of the whole document, which would hurt performance of other,
@@ -8972,7 +9233,7 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
 
                onRemove = function () {
                        // If the node was attached somewhere else, report it
-                       if ( widget.$element.closest( 'html' ).length ) {
+                       if ( widget.isElementAttached() ) {
                                widget.onElementAttach();
                        }
                        mutationObserver.disconnect();
@@ -9001,6 +9262,11 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
        var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError,
                idealHeight, newHeight, scrollWidth, property;
 
+       if ( this.isWaitingToBeAttached ) {
+               // #onElementAttach will be called soon, which calls this method
+               return this;
+       }
+
        if ( this.multiline && this.$input.val() !== this.valCache ) {
                if ( this.autosize ) {
                        this.$clone
@@ -9312,6 +9578,15 @@ OO.ui.TextInputWidget.prototype.getValidity = function () {
                }
        }
 
+       // Check browser validity and reject if it is invalid
+       if (
+               this.$input[ 0 ].checkValidity !== undefined &&
+               this.$input[ 0 ].checkValidity() === false
+       ) {
+               return rejectOrResolve( false );
+       }
+
+       // Run our checks if the browser thinks the field is valid
        if ( this.validate instanceof Function ) {
                result = this.validate( this.getValue() );
                if ( result && $.isFunction( result.promise ) ) {
@@ -9387,6 +9662,12 @@ OO.ui.TextInputWidget.prototype.updateSearchIndicator = function () {
  */
 OO.ui.TextInputWidget.prototype.positionLabel = function () {
        var after, rtl, property;
+
+       if ( this.isWaitingToBeAttached ) {
+               // #onElementAttach will be called soon, which calls this method
+               return this;
+       }
+
        // Clear old values
        this.$input
                // Clear old values if present
@@ -9524,7 +9805,7 @@ OO.ui.SearchInputWidget.prototype.setReadOnly = function ( state ) {
  * - by choosing a value from the menu. The value of the chosen option will then appear in the text
  *   input field.
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
  *
@@ -9579,6 +9860,9 @@ OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
                autocomplete: false
        }, config );
 
+       // ComboBoxInputWidget shouldn't support multiline
+       config.multiline = false;
+
        // Parent constructor
        OO.ui.ComboBoxInputWidget.parent.call( this, config );
 
@@ -9797,8 +10081,6 @@ OO.ui.ComboBoxInputWidget.prototype.setOptions = function ( options ) {
  * @throws {Error} An error is thrown if no widget is specified
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
-       var hasInputWidget, div;
-
        // Allow passing positional parameters inside the config object
        if ( OO.isPlainObject( fieldWidget ) && config === undefined ) {
                config = fieldWidget;
@@ -9810,8 +10092,6 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
                throw new Error( 'Widget not found' );
        }
 
-       hasInputWidget = fieldWidget.constructor.static.supportsSimpleLabel;
-
        // Configuration initialization
        config = $.extend( { align: 'left' }, config );
 
@@ -9819,7 +10099,9 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        OO.ui.FieldLayout.parent.call( this, config );
 
        // Mixin constructors
-       OO.ui.mixin.LabelElement.call( this, config );
+       OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
+               $label: $( '<label>' )
+       } ) );
        OO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );
 
        // Properties
@@ -9828,41 +10110,43 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.notices = [];
        this.$field = $( '<div>' );
        this.$messages = $( '<ul>' );
-       this.$body = $( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
+       this.$header = $( '<div>' );
+       this.$body = $( '<div>' );
        this.align = null;
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       popup: {
+                               padded: true
+                       },
                        classes: [ 'oo-ui-fieldLayout-help' ],
                        framed: false,
                        icon: 'info'
                } );
-
-               div = $( '<div>' );
                if ( config.help instanceof OO.ui.HtmlSnippet ) {
-                       div.html( config.help.toString() );
+                       this.popupButtonWidget.getPopup().$body.html( config.help.toString() );
                } else {
-                       div.text( config.help );
+                       this.popupButtonWidget.getPopup().$body.text( config.help );
                }
-               this.popupButtonWidget.getPopup().$body.append(
-                       div.addClass( 'oo-ui-fieldLayout-help-content' )
-               );
                this.$help = this.popupButtonWidget.$element;
        } else {
                this.$help = $( [] );
        }
 
        // Events
-       if ( hasInputWidget ) {
-               this.$label.on( 'click', this.onLabelClick.bind( this ) );
-       }
        this.fieldWidget.connect( this, { disable: 'onFieldDisable' } );
 
        // Initialization
+       if ( fieldWidget.constructor.static.supportsSimpleLabel ) {
+               if ( this.fieldWidget.getInputId() ) {
+                       this.$label.attr( 'for', this.fieldWidget.getInputId() );
+               }
+       }
        this.$element
                .addClass( 'oo-ui-fieldLayout' )
                .toggleClass( 'oo-ui-fieldLayout-disabled', this.fieldWidget.isDisabled() )
-               .append( this.$help, this.$body );
+               .append( this.$body );
        this.$body.addClass( 'oo-ui-fieldLayout-body' );
+       this.$header.addClass( 'oo-ui-fieldLayout-header' );
        this.$messages.addClass( 'oo-ui-fieldLayout-messages' );
        this.$field
                .addClass( 'oo-ui-fieldLayout-field' )
@@ -9891,17 +10175,6 @@ OO.ui.FieldLayout.prototype.onFieldDisable = function ( value ) {
        this.$element.toggleClass( 'oo-ui-fieldLayout-disabled', value );
 };
 
-/**
- * Handle label mouse click events.
- *
- * @private
- * @param {jQuery.Event} e Mouse click event
- */
-OO.ui.FieldLayout.prototype.onLabelClick = function () {
-       this.fieldWidget.simulateLabelClick();
-       return false;
-};
-
 /**
  * Get the widget contained by the field.
  *
@@ -9948,10 +10221,15 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
                        value = 'left';
                }
                // Reorder elements
-               if ( value === 'inline' ) {
-                       this.$body.append( this.$field, this.$label );
+               if ( value === 'top' ) {
+                       this.$header.append( this.$label, this.$help );
+                       this.$body.append( this.$header, this.$field );
+               } else if ( value === 'inline' ) {
+                       this.$header.append( this.$label, this.$help );
+                       this.$body.append( this.$field, this.$header );
                } else {
-                       this.$body.append( this.$label, this.$field );
+                       this.$header.append( this.$label );
+                       this.$body.append( this.$header, this.$help, this.$field );
                }
                // Set classes. The following classes can be used here:
                // * oo-ui-fieldLayout-align-left
@@ -10138,6 +10416,9 @@ OO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {OO.ui.FieldLayout[]} [items] An array of fields to add to the fieldset. See OO.ui.FieldLayout for more information about fields.
+ * @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.
  */
 OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        // Configuration initialization
@@ -10148,31 +10429,38 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
 
        // Mixin constructors
        OO.ui.mixin.IconElement.call( this, config );
-       OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { $label: $( '<legend>' ) } ) );
+       OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { $label: $( '<div>' ) } ) );
        OO.ui.mixin.GroupElement.call( this, config );
 
+       // Properties
+       this.$header = $( '<div>' );
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       popup: {
+                               padded: true
+                       },
                        classes: [ 'oo-ui-fieldsetLayout-help' ],
                        framed: false,
                        icon: 'info'
                } );
-
-               this.popupButtonWidget.getPopup().$body.append(
-                       $( '<div>' )
-                               .text( config.help )
-                               .addClass( 'oo-ui-fieldsetLayout-help-content' )
-               );
+               if ( config.help instanceof OO.ui.HtmlSnippet ) {
+                       this.popupButtonWidget.getPopup().$body.html( config.help.toString() );
+               } else {
+                       this.popupButtonWidget.getPopup().$body.text( config.help );
+               }
                this.$help = this.popupButtonWidget.$element;
        } else {
                this.$help = $( [] );
        }
 
        // Initialization
+       this.$header
+               .addClass( 'oo-ui-fieldsetLayout-header' )
+               .append( this.$icon, this.$label, this.$help );
        this.$group.addClass( 'oo-ui-fieldsetLayout-group' );
        this.$element
                .addClass( 'oo-ui-fieldsetLayout' )
-               .prepend( this.$label, this.$help, this.$icon, this.$group );
+               .prepend( this.$header, this.$group );
        if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
        }
@@ -10187,6 +10475,10 @@ OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.mixin.GroupElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.FieldsetLayout.static.tagName = 'fieldset';
 
 /**
@@ -10300,6 +10592,10 @@ OO.mixinClass( OO.ui.FormLayout, OO.ui.mixin.GroupElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.FormLayout.static.tagName = 'form';
 
 /* Methods */
index 17bca7e..3989caa 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:37Z
+ * Date: 2017-02-14T22:47:20Z
  */
 ( function ( OO ) {
 
index 7fb36c4..b154288 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
 .oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
   color: #000;
 }
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
   display: inline-block;
   position: relative;
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2.5em;
   margin: 0 -1px;
   border: 1px solid #ccc;
   background-color: #fff;
   box-shadow: 0 0.3125em 1.25em rgba(0, 0, 0, 0.25);
 }
+.oo-ui-toolbar-position-top .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2.5em;
+}
+.oo-ui-toolbar-position-bottom .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  bottom: 2.5em;
+}
 .oo-ui-popupToolGroup .oo-ui-tool-link {
   padding: 0.3125em 0 0.3125em 0.3125em;
 }
   position: relative;
 }
 .oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
+.oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
      -moz-user-select: none;
       -ms-user-select: all;
           user-select: all;
 }
-.oo-ui-toolbar-shadow {
-  background-position: left top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
 .oo-ui-toolbar-bar {
-  border-bottom: 1px solid #ccc;
   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:         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 {
+  border-bottom: 1px solid #ccc;
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1);
+}
+.oo-ui-toolbar-position-bottom > .oo-ui-toolbar-bar {
+  border-top: 1px solid #ccc;
+  box-shadow: 0 -2px 2px 0 rgba(0, 0, 0, 0.1);
+}
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
   border: 0;
   background: none;
+  box-shadow: none;
 }
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-framed,
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-framed:last-child {
   margin: 0 1em;
   line-height: 3.40625em;
 }
-.oo-ui-toolbar-shadow {
-  background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
-  bottom: -9px;
-  height: 9px;
-  opacity: 0.5;
-  -webkit-transition: opacity 500ms ease;
-     -moz-transition: opacity 500ms ease;
-          transition: opacity 500ms ease;
-}
index cb9660a..5d313ab 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
 .oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
   margin-left: 0;
 }
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
   display: inline-block;
   position: relative;
   left: 0;
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 3.125em;
   margin: 0 -1px;
   border: 1px solid #c8ccd1;
   background-color: #fff;
-  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
   min-width: 16em;
 }
+.oo-ui-toolbar-position-top .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 3.125em;
+}
+.oo-ui-toolbar-position-bottom .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  bottom: 3.125em;
+}
 .oo-ui-popupToolGroup .oo-ui-tool-link {
   padding: 0.4em 0.625em;
   -webkit-box-sizing: border-box;
   position: relative;
 }
 .oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
+.oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
      -moz-user-select: none;
       -ms-user-select: all;
           user-select: all;
 }
-.oo-ui-toolbar-shadow {
-  background-position: left top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
 .oo-ui-toolbar-bar {
-  border-bottom: 1px solid #c8ccd1;
   background-color: #fff;
-  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
-  font-weight: 500;
   color: #222;
 }
+.oo-ui-toolbar-position-top > .oo-ui-toolbar-bar {
+  border-bottom: 1px solid #c8ccd1;
+  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
+}
+.oo-ui-toolbar-position-bottom > .oo-ui-toolbar-bar {
+  border-top: 1px solid #c8ccd1;
+  box-shadow: 0 -1px 1px 0 rgba(0, 0, 0, 0.1);
+}
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border-bottom: 0;
+  border: 0;
   background-color: transparent;
   box-shadow: none;
 }
index e17f511..e89a734 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:37Z
+ * Date: 2017-02-14T22:47:20Z
  */
 ( function ( OO ) {
 
  * @cfg {boolean} [actions] Add an actions section to the toolbar. Actions are commands that are included
  *  in the toolbar, but are not configured as tools. By default, actions are displayed on the right side of
  *  the toolbar.
- * @cfg {boolean} [shadow] Add a shadow below the toolbar.
+ * @cfg {string} [position='top'] Whether the toolbar is positioned above ('top') or below ('bottom') content.
  */
 OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        // Allow passing positional parameters inside the config object
@@ -317,6 +317,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        this.toolGroupFactory = toolGroupFactory;
        this.groups = [];
        this.tools = {};
+       this.position = config.position || 'top';
        this.$bar = $( '<div>' );
        this.$actions = $( '<div>' );
        this.initialized = false;
@@ -336,10 +337,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        this.$bar
                .addClass( 'oo-ui-toolbar-bar' )
                .append( this.$group, '<div style="clear:both"></div>' );
-       if ( config.shadow ) {
-               this.$bar.append( '<div class="oo-ui-toolbar-shadow"></div>' );
-       }
-       this.$element.addClass( 'oo-ui-toolbar' ).append( this.$bar );
+       this.$element.addClass( 'oo-ui-toolbar oo-ui-toolbar-position-' + this.position ).append( this.$bar );
 };
 
 /* Setup */
@@ -795,10 +793,10 @@ OO.ui.Tool.prototype.setActive = function ( state ) {
        this.active = !!state;
        if ( this.active ) {
                this.$element.addClass( 'oo-ui-tool-active' );
-               this.setFlags( 'progressive' );
+               this.setFlags( { progressive: true } );
        } else {
                this.$element.removeClass( 'oo-ui-tool-active' );
-               this.clearFlags();
+               this.setFlags( { progressive: false } );
        }
 };
 
@@ -993,6 +991,14 @@ OO.ui.ToolGroup.static.accelTooltips = false;
  */
 OO.ui.ToolGroup.static.autoDisable = true;
 
+/**
+ * @abstract
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.ToolGroup.static.name = null;
+
 /* Methods */
 
 /**
@@ -1741,10 +1747,22 @@ OO.inheritClass( OO.ui.BarToolGroup, OO.ui.ToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.BarToolGroup.static.titleTooltips = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.BarToolGroup.static.accelTooltips = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.BarToolGroup.static.name = 'bar';
 
 /**
@@ -1775,7 +1793,9 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        }
 
        // Configuration initialization
-       config = config || {};
+       config = $.extend( {
+               indicator: toolbar.position === 'bottom' ? 'up' : 'down'
+       }, config );
 
        // Parent constructor
        OO.ui.PopupToolGroup.parent.call( this, toolbar, config );
@@ -2010,7 +2030,6 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
  *             // Configurations for list toolgroup.
  *             type: 'list',
  *             label: 'ListToolGroup',
- *             indicator: 'down',
  *             icon: 'ellipsis',
  *             title: 'This is the title, displayed when user moves the mouse over the list toolgroup',
  *             header: 'This is the header',
@@ -2081,6 +2100,10 @@ OO.inheritClass( OO.ui.ListToolGroup, OO.ui.PopupToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ListToolGroup.static.name = 'list';
 
 /* Methods */
@@ -2240,7 +2263,6 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
  *             type: 'menu',
  *             header: 'This is the (optional) header',
  *             title: 'This is the (optional) title',
- *             indicator: 'down',
  *             include: [ 'settings', 'stuff' ]
  *         }
  *     ] );
@@ -2303,6 +2325,10 @@ OO.inheritClass( OO.ui.MenuToolGroup, OO.ui.PopupToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuToolGroup.static.name = 'menu';
 
 /* Methods */
index d6ba00b..b8445e9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
           transform: translateZ(0);
   height: 2em;
   width: 4em;
 .oo-ui-capsuleMultiselectWidget-group {
   display: inline;
 }
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup > .oo-ui-popupWidget-body > * {
+  display: block;
+}
+.oo-ui-capsuleMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
 .oo-ui-capsuleMultiselectWidget-handle {
   background-color: #fff;
   cursor: text;
 .oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
   opacity: 0.2;
 }
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup {
+  border: 0;
+}
 .oo-ui-capsuleItemWidget {
   position: relative;
   display: inline-block;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
   opacity: 0.5;
-  -webkit-transform: translate3d(0, 0, 0);
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
 }
-.oo-ui-numberInputWidget-buttoned .oo-ui-buttonElement-button {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
 .oo-ui-numberInputWidget-field {
   display: table;
   table-layout: fixed;
index bf50532..aab3b62 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
@@ -68,7 +68,7 @@
   border-right: 1px solid #ddd;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
 .oo-ui-indexLayout > .oo-ui-menuLayout-menu {
   height: 3em;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
           transform: translateZ(0);
   background-color: #f8f9fa;
   width: 3.5em;
   text-align: left;
   white-space: nowrap;
   overflow: hidden;
-  background-color: #ddd;
+  background-color: #eaecf0;
 }
 .oo-ui-tabOptionWidget {
   display: inline-block;
   vertical-align: bottom;
-  padding: 0.35em 1em;
+  color: #222;
   margin: 0.5em 0 0 0.75em;
   border: 1px solid transparent;
   border-bottom: 0;
   border-top-left-radius: 2px;
   border-top-right-radius: 2px;
-  color: #222;
+  padding: 0.35em 1em;
   font-weight: bold;
+  -webkit-transition: background-color 100ms, color 100ms;
+     -moz-transition: background-color 100ms, color 100ms;
+          transition: background-color 100ms, color 100ms;
 }
 .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
   background-color: rgba(255, 255, 255, 0.3);
 .oo-ui-selectWidget-depressed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected,
 .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected:hover {
   background-color: #fff;
-  color: #333;
+  color: #000;
 }
 .oo-ui-capsuleMultiselectWidget {
   display: inline-block;
 .oo-ui-capsuleMultiselectWidget-group {
   display: inline;
 }
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup > .oo-ui-popupWidget-body > * {
+  display: block;
+}
+.oo-ui-capsuleMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
 .oo-ui-capsuleMultiselectWidget-handle {
   min-height: 2.4em;
   margin-right: 0.5em;
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   position: absolute;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-ms-input-placeholder {
+  color: #72777d;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-webkit-input-placeholder {
+  color: #72777d;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :placeholder-shown {
+  color: #72777d;
+}
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
   border: 0;
   line-height: 1.675;
   top: 0;
   margin: 0.3em;
 }
-.oo-ui-capsuleMultiselectWidget .oo-ui-popupWidget {
-  width: 100%;
+.oo-ui-capsuleMultiselectWidget-popup {
   margin-top: -1px;
 }
-.oo-ui-capsuleMultiselectWidget .oo-ui-popupWidget-popup {
-  min-width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  border-width: 0 1px;
-  border-radius: 0 0 2px 2px;
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup {
+  border: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-widget-enabled .oo-ui-capsuleMultiselectWidget-handle {
   background-color: #fff;
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
 }
-.oo-ui-numberInputWidget-buttoned .oo-ui-buttonElement-button {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
 .oo-ui-numberInputWidget-field {
   display: table;
   table-layout: fixed;
 }
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonElement-button {
   display: block;
+  min-width: 2.5em;
   min-height: 2.5em;
   padding-left: 0;
   padding-right: 0;
index 6962c92..d5a796b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:37Z
+ * Date: 2017-02-14T22:47:20Z
  */
 ( function ( OO ) {
 
@@ -241,6 +241,7 @@ OO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( con
        }
        this.$element
                .addClass( 'oo-ui-draggableGroupElement' )
+               .attr( 'role', 'listbox' )
                .append( this.$status )
                .toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' );
 };
@@ -1642,7 +1643,7 @@ OO.ui.MenuLayout.prototype.getMenuPosition = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed.
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed. Disabled on mobile.
  * @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.
  * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
  */
@@ -1779,11 +1780,9 @@ OO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page )
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        var layout = this;
        if ( !this.scrolling && page ) {
-               page.scrollElementIntoView( {
-                       complete: function () {
-                               if ( layout.autoFocus ) {
-                                       layout.focus();
-                               }
+               page.scrollElementIntoView().done( function () {
+                       if ( layout.autoFocus && !OO.ui.isMobile() ) {
+                               layout.focus();
                        }
                } );
        }
@@ -2112,6 +2111,7 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
                                // meaningless because the next page is not visible yet and thus can't hold focus.
                                if (
                                        this.autoFocus &&
+                                       !OO.ui.isMobile() &&
                                        this.stackLayout.continuous &&
                                        OO.ui.findFocusable( page.$element ).length !== 0
                                ) {
@@ -2188,7 +2188,7 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all cards, one after another
  * @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed.
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed. Disabled on mobile.
  */
 OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
        // Configuration initialization
@@ -2289,11 +2289,9 @@ OO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {
 OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
        var layout = this;
        if ( card ) {
-               card.scrollElementIntoView( {
-                       complete: function () {
-                               if ( layout.autoFocus ) {
-                                       layout.focus();
-                               }
+               card.scrollElementIntoView().done( function () {
+                       if ( layout.autoFocus && !OO.ui.isMobile() ) {
+                               layout.focus();
                        }
                } );
        }
@@ -2556,6 +2554,7 @@ OO.ui.IndexLayout.prototype.setCard = function ( name ) {
                                // meaningless because the next card is not visible yet and thus can't hold focus.
                                if (
                                        this.autoFocus &&
+                                       !OO.ui.isMobile() &&
                                        this.stackLayout.continuous &&
                                        OO.ui.findFocusable( card.$element ).length !== 0
                                ) {
@@ -3059,12 +3058,30 @@ OO.inheritClass( OO.ui.OutlineOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.OutlineOptionWidget.static.highlightable = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.OutlineOptionWidget.static.scrollIntoViewOnSelect = true;
 
+/**
+ * @static
+ * @inheritable
+ * @property {string}
+ */
 OO.ui.OutlineOptionWidget.static.levelClass = 'oo-ui-outlineOptionWidget-level-';
 
+/**
+ * @static
+ * @inheritable
+ * @property {number}
+ */
 OO.ui.OutlineOptionWidget.static.levels = 3;
 
 /* Methods */
@@ -3106,9 +3123,9 @@ OO.ui.OutlineOptionWidget.prototype.getLevel = function () {
 OO.ui.OutlineOptionWidget.prototype.setPressed = function ( state ) {
        OO.ui.OutlineOptionWidget.parent.prototype.setPressed.call( this, state );
        if ( this.pressed ) {
-               this.setFlags( 'progressive' );
+               this.setFlags( { progressive: true } );
        } else if ( !this.selected ) {
-               this.clearFlags();
+               this.setFlags( { progressive: false } );
        }
        return this;
 };
@@ -3147,9 +3164,9 @@ OO.ui.OutlineOptionWidget.prototype.setRemovable = function ( removable ) {
 OO.ui.OutlineOptionWidget.prototype.setSelected = function ( state ) {
        OO.ui.OutlineOptionWidget.parent.prototype.setSelected.call( this, state );
        if ( this.selected ) {
-               this.setFlags( 'progressive' );
+               this.setFlags( { progressive: true } );
        } else {
-               this.clearFlags();
+               this.setFlags( { progressive: false } );
        }
        return this;
 };
@@ -3260,9 +3277,18 @@ OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.TitledElement );
 
 /* Static Properties */
 
-// Allow button mouse down events to pass through so they can be handled by the parent select widget
+/**
+ * Allow button mouse down events to pass through so they can be handled by the parent select widget
+ *
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ButtonOptionWidget.static.cancelButtonMouseDownEvents = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ButtonOptionWidget.static.highlightable = false;
 
 /* Methods */
@@ -3373,6 +3399,10 @@ OO.inheritClass( OO.ui.TabOptionWidget, OO.ui.OptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.TabOptionWidget.static.highlightable = false;
 
 /**
@@ -3573,6 +3603,7 @@ OO.ui.CapsuleItemWidget.prototype.focus = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [placeholder] Placeholder text
  * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if not present in the menu.
+ * @cfg {boolean} [allowDuplicates=false] Allow duplicate items to be added.
  * @cfg {Object} [menu] (required) Configuration options to pass to the
  *  {@link OO.ui.MenuSelectWidget menu select widget}.
  * @cfg {Object} [popup] Configuration options to pass to the {@link OO.ui.PopupWidget popup widget}.
@@ -3594,6 +3625,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        // Configuration initialization
        config = $.extend( {
                allowArbitrary: false,
+               allowDuplicates: false,
                $overlay: this.$element
        }, config );
 
@@ -3611,7 +3643,11 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
                        align: 'forwards',
                        anchor: false
                } );
-               OO.ui.mixin.PopupElement.call( this, config );
+               OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
+                       popup: {
+                               $floatableContainer: this.$element
+                       }
+               } ) );
                $tabFocus = $( '<span>' );
                OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: $tabFocus } ) );
        } else {
@@ -3625,6 +3661,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        // Properties
        this.$content = $( '<div>' );
        this.allowArbitrary = config.allowArbitrary;
+       this.allowDuplicates = config.allowDuplicates;
        this.$overlay = config.$overlay;
        this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
                {
@@ -3640,7 +3677,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        // Events
        if ( this.popup ) {
                $tabFocus.on( {
-                       focus: this.onFocusForPopup.bind( this )
+                       focus: this.focus.bind( this )
                } );
                this.popup.$element.on( 'focusout', this.onPopupFocusOut.bind( this ) );
                if ( this.popup.$autoCloseIgnore ) {
@@ -3690,12 +3727,16 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        this.$element.addClass( 'oo-ui-capsuleMultiselectWidget' )
                .append( this.$handle );
        if ( this.popup ) {
+               this.popup.$element.addClass( 'oo-ui-capsuleMultiselectWidget-popup' );
                this.$content.append( $tabFocus );
                this.$overlay.append( this.popup.$element );
        } else {
                this.$content.append( this.$input );
                this.$overlay.append( this.menu.$element );
        }
+       if ( $tabFocus ) {
+               $tabFocus.addClass( 'oo-ui-capsuleMultiselectWidget-focusTrap' );
+       }
 
        // Input size needs to be calculated after everything else is rendered
        setTimeout( function () {
@@ -3716,6 +3757,10 @@ 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 */
 
 /**
@@ -3751,6 +3796,26 @@ OO.ui.CapsuleMultiselectWidget.prototype.createItemWidget = function ( data, lab
        return new OO.ui.CapsuleItemWidget( { data: data, label: label } );
 };
 
+/**
+ * Get the widget's input's id, or generate one, if it has an input.
+ *
+ * @return {string}
+ */
+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 id;
+};
+
 /**
  * Get the data of the items in the capsule
  *
@@ -3824,7 +3889,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.addItemsFromData = function ( datas ) {
        $.each( datas, function ( i, data ) {
                var item;
 
-               if ( !widget.getItemFromData( data ) ) {
+               if ( !widget.getItemFromData( data ) || widget.allowDuplicates ) {
                        item = menu.getItemFromData( data );
                        if ( item ) {
                                item = widget.createItemWidget( data, item.label );
@@ -4048,20 +4113,6 @@ OO.ui.CapsuleMultiselectWidget.prototype.onInputBlur = function () {
        this.clearInput();
 };
 
-/**
- * Handle focus events
- *
- * @private
- * @param {jQuery.Event} event
- */
-OO.ui.CapsuleMultiselectWidget.prototype.onFocusForPopup = function () {
-       if ( !this.isDisabled() ) {
-               this.popup.setSize( this.$handle.width() );
-               this.popup.toggle( true );
-               OO.ui.findFocusable( this.popup.$element ).focus();
-       }
-};
-
 /**
  * Handles popup focus out events.
  *
@@ -4074,8 +4125,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.onPopupFocusOut = function () {
        setTimeout( function () {
                if (
                        widget.isVisible() &&
-                       !OO.ui.contains( widget.$element[ 0 ], document.activeElement, true ) &&
-                       ( !widget.$autoCloseIgnore || !widget.$autoCloseIgnore.has( document.activeElement ).length )
+                       !OO.ui.contains( widget.$element.add( widget.$autoCloseIgnore ).get(), document.activeElement, true )
                ) {
                        widget.toggle( false );
                }
@@ -4315,7 +4365,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.setDisabled = function ( disabled ) {
 OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
        if ( !this.isDisabled() ) {
                if ( this.popup ) {
-                       this.popup.setSize( this.$handle.width() );
+                       this.popup.setSize( this.$handle.outerWidth() );
                        this.popup.toggle( true );
                        OO.ui.findFocusable( this.popup.$element ).focus();
                } else {
@@ -4328,10 +4378,21 @@ OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
 };
 
 /**
+ * The old name for the CapsuleMultiselectWidget widget, provided for backwards-compatibility.
+ *
  * @class
+ * @extends OO.ui.CapsuleMultiselectWidget
+ *
+ * @constructor
  * @deprecated since 0.17.3; use OO.ui.CapsuleMultiselectWidget instead
  */
-OO.ui.CapsuleMultiSelectWidget = OO.ui.CapsuleMultiselectWidget;
+OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget() {
+       OO.ui.warnDeprecation( 'CapsuleMultiSelectWidget is deprecated. Use the CapsuleMultiselectWidget instead.' );
+       // Parent constructor
+       OO.ui.CapsuleMultiSelectWidget.parent.apply( this, arguments );
+};
+
+OO.inheritClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.CapsuleMultiselectWidget );
 
 /**
  * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
@@ -5235,11 +5296,9 @@ OO.ui.NumberInputWidget.prototype.validateNumber = function ( value ) {
                return false;
        }
 
-       /* eslint-disable no-bitwise */
-       if ( this.isInteger && ( n | 0 ) !== n ) {
+       if ( this.isInteger && Math.floor( n ) !== n ) {
                return false;
        }
-       /* eslint-enable no-bitwise */
 
        if ( n < this.min || n > this.max ) {
                return false;
index 6258b84..310d616 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
index 359c469..4b99fa6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:42Z
+ * Date: 2017-02-14T22:47:25Z
  */
 .oo-ui-window {
   background: transparent;
 }
 .oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
-  line-height: 1.5;
+  line-height: 1.4;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
   text-align: left;
   margin: 1em;
   padding: 1em;
-  border: 1px solid #ff9e9e;
+  border: 1px solid #d33;
   background-color: #fff7f7;
   border-radius: 2px;
 }
   max-height: calc(100% - 2em);
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
index 8b614c6..c842c62 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.0
+ * OOjs UI v0.19.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-09T00:52:37Z
+ * Date: 2017-02-14T22:47:20Z
  */
 ( function ( OO ) {
 
@@ -203,6 +203,7 @@ OO.ui.ActionWidget.prototype.toggle = function () {
  *     }
  *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
  *     MyProcessDialog.static.title = 'An action set in a process dialog';
+ *     MyProcessDialog.static.name = 'myProcessDialog';
  *     // An action set that uses modes ('edit' and 'help' mode, in this example).
  *     MyProcessDialog.static.actions = [
  *         { action: 'continue', modes: 'edit', label: 'Continue', flags: [ 'primary', 'constructive' ] },
@@ -1286,7 +1287,8 @@ OO.ui.WindowManager.prototype.getCurrentWindow = function () {
  *
  * @param {OO.ui.Window|string} win Window object or symbolic name of window to open
  * @param {Object} [data] Window opening data
- * @param {jQuery} [data.$returnFocusTo] Element to which the window will return focus when closed.
+ * @param {jQuery|null} [data.$returnFocusTo] Element to which the window will return focus when closed.
+ *  Defaults the current activeElement. If set to null, focus isn't changed on close.
  * @return {jQuery.Promise} An `opening` promise resolved when the window is done opening.
  *  See {@link #event-opening 'opening' event}  for more information about `opening` promises.
  * @fires opening
@@ -1418,7 +1420,9 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
                                                                manager.toggleGlobalEvents( false );
                                                                manager.toggleAriaIsolation( false );
                                                        }
-                                                       manager.$returnFocusTo[ 0 ].focus();
+                                                       if ( manager.$returnFocusTo && manager.$returnFocusTo.length ) {
+                                                               manager.$returnFocusTo[ 0 ].focus();
+                                                       }
                                                        manager.closing = null;
                                                        manager.currentWindow = null;
                                                        closing.resolve( data );
@@ -1439,6 +1443,41 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
  * See the [OOjs ui documentation on MediaWiki] [2] for examples.
  * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers
  *
+ * This function can be called in two manners:
+ *
+ * 1. `.addWindows( [ windowA, windowB, ... ] )` (where `windowA`, `windowB` are OO.ui.Window objects)
+ *
+ *    This syntax registers windows under the symbolic names defined in their `.static.name`
+ *    properties. For example, if `windowA.constructor.static.name` is `'nameA'`, calling
+ *    `.openWindow( 'nameA' )` afterwards will open the window `windowA`. This syntax requires the
+ *    static name to be set, otherwise an exception will be thrown.
+ *
+ *    This is the recommended way, as it allows for an easier switch to using a window factory.
+ *
+ * 2. `.addWindows( { nameA: windowA, nameB: windowB, ... } )`
+ *
+ *    This syntax registers windows under the explicitly given symbolic names. In this example,
+ *    calling `.openWindow( 'nameA' )` afterwards will open the window `windowA`, regardless of what
+ *    its `.static.name` is set to. The static name is not required to be set.
+ *
+ *    This should only be used if you need to override the default symbolic names.
+ *
+ * Example:
+ *
+ *     var windowManager = new OO.ui.WindowManager();
+ *     $( 'body' ).append( windowManager.$element );
+ *
+ *     // Add a window under the default name: see OO.ui.MessageDialog.static.name
+ *     windowManager.addWindows( [ new OO.ui.MessageDialog() ] );
+ *     // Add a window under an explicit name
+ *     windowManager.addWindows( { myMessageDialog: new OO.ui.MessageDialog() } );
+ *
+ *     // Open window by default name
+ *     windowManager.openWindow( 'message' );
+ *     // Open window by explicitly given name
+ *     windowManager.openWindow( 'myMessageDialog' );
+ *
+ *
  * @param {Object.<string,OO.ui.Window>|OO.ui.Window[]} windows An array of window objects specified
  *  by reference, symbolic name, or explicitly defined symbolic names.
  * @throws {Error} An error is thrown if a window is added by symbolic name, but has neither an
@@ -1452,11 +1491,8 @@ OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
                list = {};
                for ( i = 0, len = windows.length; i < len; i++ ) {
                        name = windows[ i ].constructor.static.name;
-                       if ( typeof name !== 'string' ) {
-                               throw new Error( 'Cannot add window' );
-                       }
                        if ( !name ) {
-                               OO.ui.warnDeprecation( 'OO.ui.WindowManager#addWindows: Windows must have a `name` static property defined.' );
+                               throw new Error( 'Windows must have a `name` static property defined.' );
                        }
                        list[ name ] = windows[ i ];
                }
@@ -1984,7 +2020,7 @@ OO.ui.Window.prototype.getReadyProcess = function () {
 /**
  * Get the 'hold' process.
  *
- * The hold proccess is used to keep a window from being used in a particular context,
+ * The hold process is used to keep a window from being used in a particular context,
  * based on the `data` argument. This method is called during the closing phase of the window’s
  * lifecycle.
  *
@@ -2317,6 +2353,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
  *         MyDialog.parent.call( this, config );
  *     }
  *     OO.inheritClass( MyDialog, OO.ui.Dialog );
+ *     MyDialog.static.name = 'myDialog';
  *     MyDialog.prototype.initialize = function () {
  *         MyDialog.parent.prototype.initialize.call( this );
  *         this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
@@ -2362,7 +2399,6 @@ OO.ui.Dialog = function OoUiDialog( config ) {
        // Events
        this.actions.connect( this, {
                click: 'onActionClick',
-               resize: 'onActionResize',
                change: 'onActionsChange'
        } );
 
@@ -2446,7 +2482,7 @@ OO.ui.Dialog.prototype.onDialogKeyDown = function ( e ) {
                this.executeAction( '' );
                e.preventDefault();
                e.stopPropagation();
-       } else if ( e.which === OO.ui.Keys.ENTER && e.ctrlKey ) {
+       } else if ( e.which === OO.ui.Keys.ENTER && ( e.ctrlKey || e.metaKey ) ) {
                actions = this.actions.get( { flags: 'primary', visible: true, disabled: false } );
                if ( actions.length > 0 ) {
                        this.executeAction( actions[ 0 ].getAction() );
@@ -2456,16 +2492,6 @@ OO.ui.Dialog.prototype.onDialogKeyDown = function ( e ) {
        }
 };
 
-/**
- * Handle action resized events.
- *
- * @private
- * @param {OO.ui.ActionWidget} action Action that was resized
- */
-OO.ui.Dialog.prototype.onActionResize = function () {
-       // Override in subclass
-};
-
 /**
  * Handle action click events.
  *
@@ -2695,11 +2721,23 @@ OO.inheritClass( OO.ui.MessageDialog, OO.ui.Dialog );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MessageDialog.static.name = 'message';
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MessageDialog.static.size = 'small';
 
-OO.ui.MessageDialog.static.verbose = false;
+/**
+ * @static
+ * @deprecated since v0.18.4 as default; TODO: Remove
+ */
+OO.ui.MessageDialog.static.verbose = true;
 
 /**
  * Dialog title.
@@ -2725,8 +2763,12 @@ OO.ui.MessageDialog.static.title = null;
  */
 OO.ui.MessageDialog.static.message = null;
 
-// Note that OO.ui.alert() and OO.ui.confirm() rely on these.
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MessageDialog.static.actions = [
+       // Note that OO.ui.alert() and OO.ui.confirm() rely on these.
        { action: 'accept', label: OO.ui.deferMsg( 'ooui-dialog-message-accept' ), flags: 'primary' },
        { action: 'reject', label: OO.ui.deferMsg( 'ooui-dialog-message-reject' ), flags: 'safe' }
 ];
@@ -2747,14 +2789,6 @@ OO.ui.MessageDialog.prototype.setManager = function ( manager ) {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.MessageDialog.prototype.onActionResize = function ( action ) {
-       this.fitActions();
-       return OO.ui.MessageDialog.parent.prototype.onActionResize.call( this, action );
-};
-
 /**
  * Handle window resized events.
  *
@@ -2807,7 +2841,6 @@ OO.ui.MessageDialog.prototype.getActionProcess = function ( action ) {
  * @param {Object} [data] Dialog opening data
  * @param {jQuery|string|Function|null} [data.title] Description of the action being confirmed
  * @param {jQuery|string|Function|null} [data.message] Description of the action's consequence
- * @param {boolean} [data.verbose] Message is verbose and should be styled as a long message
  * @param {Object[]} [data.actions] List of OO.ui.ActionOptionWidget configuration options for each
  *   action item
  */
@@ -2823,6 +2856,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
@@ -2878,11 +2912,19 @@ OO.ui.MessageDialog.prototype.setDimensions = function ( dim ) {
        // Twiddle the overflow property, otherwise an unnecessary scrollbar will be produced.
        // Need to do it after transition completes (250ms), add 50ms just in case.
        setTimeout( function () {
-               var oldOverflow = $scrollable[ 0 ].style.overflow;
+               var oldOverflow = $scrollable[ 0 ].style.overflow,
+                       activeElement = document.activeElement;
+
                $scrollable[ 0 ].style.overflow = 'hidden';
 
                OO.ui.Element.static.reconsiderScrollbars( $scrollable[ 0 ] );
 
+               // Check reconsiderScrollbars didn't destroy our focus, as we
+               // are doing this after the ready process.
+               if ( activeElement && activeElement !== document.activeElement && activeElement.focus ) {
+                       activeElement.focus();
+               }
+
                $scrollable[ 0 ].style.overflow = oldOverflow;
        }, 300 );
 
@@ -3006,6 +3048,7 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
  *     }
  *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
  *
+ *     MyProcessDialog.static.name = 'myProcessDialog';
  *     MyProcessDialog.static.title = 'Process dialog';
  *     MyProcessDialog.static.actions = [
  *         { action: 'save', label: 'Done', flags: 'primary' },
@@ -3084,16 +3127,6 @@ OO.ui.ProcessDialog.prototype.onRetryButtonClick = function () {
        this.executeAction( this.currentAction );
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.ProcessDialog.prototype.onActionResize = function ( action ) {
-       if ( this.actions.isSpecial( action ) ) {
-               this.fitLabel();
-       }
-       return OO.ui.ProcessDialog.parent.prototype.onActionResize.call( this, action );
-};
-
 /**
  * @inheritdoc
  */
@@ -3150,10 +3183,22 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
  * @inheritdoc
  */
 OO.ui.ProcessDialog.prototype.getActionWidgets = function ( actions ) {
-       var i, len, widgets = [];
+       var i, len, config,
+               isMobile = OO.ui.isMobile(),
+               widgets = [];
+
        for ( i = 0, len = actions.length; i < len; i++ ) {
+               config = $.extend( { framed: !OO.ui.isMobile() }, actions[ i ] );
+               if ( isMobile &&
+                       ( config.flags === 'back' || ( Array.isArray( config.flags ) && config.flags.indexOf( 'back' ) !== -1 ) )
+               ) {
+                       $.extend( config, {
+                               icon: 'previous',
+                               label: ''
+                       } );
+               }
                widgets.push(
-                       new OO.ui.ActionWidget( $.extend( { framed: true }, actions[ i ] ) )
+                       new OO.ui.ActionWidget( config )
                );
        }
        return widgets;
@@ -3350,9 +3395,7 @@ OO.ui.getWindowManager = function () {
        if ( !OO.ui.windowManager ) {
                OO.ui.windowManager = new OO.ui.WindowManager();
                $( 'body' ).append( OO.ui.windowManager.$element );
-               OO.ui.windowManager.addWindows( {
-                       messageDialog: new OO.ui.MessageDialog()
-               } );
+               OO.ui.windowManager.addWindows( [ new OO.ui.MessageDialog() ] );
        }
        return OO.ui.windowManager;
 };
@@ -3374,9 +3417,8 @@ OO.ui.getWindowManager = function () {
  * @return {jQuery.Promise} Promise resolved when the user closes the dialog
  */
 OO.ui.alert = function ( text, options ) {
-       return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
+       return OO.ui.getWindowManager().openWindow( 'message', $.extend( {
                message: text,
-               verbose: true,
                actions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]
        }, options ) ).then( function ( opened ) {
                return opened.then( function ( closing ) {
@@ -3411,9 +3453,8 @@ OO.ui.alert = function ( text, options ) {
  *  `false`.
  */
 OO.ui.confirm = function ( text, options ) {
-       return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
-               message: text,
-               verbose: true
+       return OO.ui.getWindowManager().openWindow( 'message', $.extend( {
+               message: text
        }, options ) ).then( function ( opened ) {
                return opened.then( function ( closing ) {
                        return closing.then( function ( data ) {
@@ -3423,4 +3464,54 @@ OO.ui.confirm = function ( text, options ) {
        } );
 };
 
+/**
+ * Display a quick modal prompt dialog, using a OO.ui.MessageDialog. While the dialog is open,
+ * the rest of the page will be dimmed out and the user won't be able to interact with it. The
+ * dialog has a text input widget and two action buttons, one to confirm an operation (labelled "OK")
+ * and one to cancel it (labelled "Cancel").
+ *
+ * A window manager is created automatically when this function is called for the first time.
+ *
+ *     @example
+ *     OO.ui.prompt( 'Choose a line to go to', { textInput: { placeholder: 'Line number' } } ).done( function ( result ) {
+ *         if ( result !== null ) {
+ *             console.log( 'User typed "' + result + '" then clicked "OK".' );
+ *         } else {
+ *             console.log( 'User clicked "Cancel" or closed the dialog.' );
+ *         }
+ *     } );
+ *
+ * @param {jQuery|string} text Message text to display
+ * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
+ * @param {Object} [options.textInput] Additional options for text input widget, see OO.ui.TextInputWidget
+ * @return {jQuery.Promise} Promise resolved when the user closes the dialog. If the user chose to
+ *  confirm, the promise will resolve with the value of the text input widget; otherwise, it will
+ *  resolve to `null`.
+ */
+OO.ui.prompt = function ( text, options ) {
+       var manager = OO.ui.getWindowManager(),
+               textInput = new OO.ui.TextInputWidget( ( options && options.textInput ) || {} ),
+               textField = new OO.ui.FieldLayout( textInput, {
+                       align: 'top',
+                       label: text
+               } );
+
+       // TODO: This is a little hacky, and could be done by extending MessageDialog instead.
+
+       return manager.openWindow( 'message', $.extend( {
+               message: textField.$element
+       }, options ) ).then( function ( opened ) {
+               // After ready
+               textInput.on( 'enter', function () {
+                       manager.getCurrentWindow().close( { action: 'accept' } );
+               } );
+               textInput.focus();
+               return opened.then( function ( closing ) {
+                       return closing.then( function ( data ) {
+                               return $.Deferred().resolve( data && data.action === 'accept' ? textInput.getValue() : null );
+                       } );
+               } );
+       } );
+};
+
 }( OO ) );
index 02dfffa..449cb77 100644 (file)
@@ -9,7 +9,7 @@
        },
        "images": {
                "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/betaLaunch.svg" },
+               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
index f904cc2..15c0251 100644 (file)
@@ -4,30 +4,50 @@
        "images": {
                "block": { "file": "images/icons/block.svg" },
                "blockUndo": { "file": {
-                       "ltr": "images/icons/blockUndo-ltr.svg",
-                       "rtl": "images/icons/blockUndo-rtl.svg"
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
+               } },
+               "unBlock": { "file": {
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
                } },
                "flag": { "file": {
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                } },
                "flagUndo": { "file": {
-                       "ltr": "images/icons/flagUndo-ltr.svg",
-                       "rtl": "images/icons/flagUndo-rtl.svg"
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
                } },
-               "lock": { "file": "images/icons/lock.svg" },
-               "star": { "file": "images/icons/star.svg" },
-               "trash": { "file": "images/icons/trash.svg" },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/trashUndo-ltr.svg",
-                       "rtl": "images/icons/trashUndo-rtl.svg"
+               "unFlag": { "file": {
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
                } },
+               "lock": { "file": "images/icons/lock.svg" },
                "unLock": { "file": {
                        "ltr": "images/icons/unLock-ltr.svg",
                        "rtl": "images/icons/unLock-rtl.svg"
                } },
-               "unStar": { "file": "images/icons/unStar.svg" }
-
-
+               "star": { "file": "images/icons/star.svg" },
+               "halfStar": { "file": {
+                       "ltr": "images/icons/halfStar-ltr.svg",
+                       "rtl": "images/icons/halfStar-rtl.svg"
+               } },
+               "unStar": { "file": "images/icons/unStar.svg" },
+               "trash": { "file": "images/icons/trash.svg" },
+               "unTrash": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
+               "trashUndo": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
+               "ongoingConversation": {
+                       "file": {
+                               "ltr": "images/icons/ongoingConversation-ltr.svg",
+                               "rtl": "images/icons/ongoingConversation-rtl.svg"
+                       }
+               }
        }
 }
index 4d8c673..a140a5a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png
deleted file mode 100644 (file)
index 0963538..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg
deleted file mode 100644 (file)
index 5058629..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png
deleted file mode 100644 (file)
index 6d3c067..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg
deleted file mode 100644 (file)
index c3f99d6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png
deleted file mode 100644 (file)
index 640bb2a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.svg
deleted file mode 100644 (file)
index 160219c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png
deleted file mode 100644 (file)
index 2475b06..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.svg
deleted file mode 100644 (file)
index 90fe46a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
index bf39564..8098166 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 729b8c2..bc3ef4e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 762e641..792b4aa 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index d6378bf..079a62c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 0738205..09df1d3 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"><style>* { fill: #FFFFFF }</style>
+<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>
-</svg>
+</g></svg>
index 322fc31..c11e11e 100644 (file)
@@ -1,7 +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"><style>* { fill: #FFFFFF }</style>
+<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>
-</svg>
+</g></svg>
index 62c82c0..eb5f963 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/eye.png and b/resources/lib/oojs-ui/themes/apex/images/icons/eye.png differ
index 343e9cf..cec85d0 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png
deleted file mode 100644 (file)
index 780cb87..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.svg
deleted file mode 100644 (file)
index 4bbd61c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png
deleted file mode 100644 (file)
index fa3696a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.svg
deleted file mode 100644 (file)
index 5d94425..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
index 40d01b4..d533779 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index d960a65..f99e338 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png
new file mode 100644 (file)
index 0000000..d52a908
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.svg
new file mode 100644 (file)
index 0000000..cfb17d8
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png
new file mode 100644 (file)
index 0000000..4991b65
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.svg
new file mode 100644 (file)
index 0000000..c649b50
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</svg>
index fc78226..ab9e536 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 131bbdb..454f6a9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 906ee6e..6b7fd63 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 238ca48..d137db6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 8248804..792025b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 8b10f25..14f148a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 412cd92..e3ce38b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</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
new file mode 100644 (file)
index 0000000..0963538
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg
new file mode 100644 (file)
index 0000000..971ac48
--- /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="#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
new file mode 100644 (file)
index 0000000..6d3c067
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg
new file mode 100644 (file)
index 0000000..c3f99d6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
index 18e4118..f7a92e0 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index e357be6..ef51a66 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png
new file mode 100644 (file)
index 0000000..df49095
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.svg
new file mode 100644 (file)
index 0000000..658809d
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+    <path d="M17.8 18.6H2.5l2.7-2.7V6h15.3v9.9c0 1.53-1.17 2.7-2.7 2.7zm-7.542-4.95c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png
new file mode 100644 (file)
index 0000000..3d7e9bd
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.svg
new file mode 100644 (file)
index 0000000..648ce55
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+    <path d="M5.2 18.6h15.3l-2.7-2.7V6H2.5v9.9c0 1.53 1.17 2.7 2.7 2.7zm7.542-4.95c0 .405.135.675.405.945.27.27.607.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.607-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.608-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.332 1.332 0 0 0-.945-.405c-.337 0-.675.135-.945.405-.27.27-.405.608-.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
+</svg>
index 08c2c36..1442004 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index d431703..0d1cd83 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 3a09864..578f12b 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 7f7ef3a..f533999 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 7559366..0e19566 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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)"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png
deleted file mode 100644 (file)
index 87590fa..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.svg
deleted file mode 100644 (file)
index 9a625b8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M4.5 3.5l-1 1L6 7v2h1v7.97L8 18h6.97l.03-.03 1-.97 2.5 2.5 1-1L16 15l-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1zM9 5v1l1 1h6v1h-5l1 1h3v3l1 1V9h1V6h-3V5zM8 9l1 1v6h1v-5l1 1v4h1v-3l1 1v2h1v-1l1 1v1H8zm5 1l1 1v-1z" id="trash-can-undo"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png
deleted file mode 100644 (file)
index dd35023..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.svg
deleted file mode 100644 (file)
index 17ca8dc..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M18.5 3.5l1 1L17 7v2h-1v7.97L15 18H8.03L8 17.97 7 17l-2.5 2.5-1-1L7 15l1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1zM14 5v1l-1 1H7v1h5l-1 1H8v3l-1 1V9H6V6h3V5zm1 4l-1 1v6h-1v-5l-1 1v4h-1v-3l-1 1v2H9v-1l-1 1v1h7zm-5 1l-1 1v-1z" id="trash-can-undo"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png
new file mode 100644 (file)
index 0000000..640bb2a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.svg
new file mode 100644 (file)
index 0000000..160219c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png
new file mode 100644 (file)
index 0000000..2475b06
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.svg
new file mode 100644 (file)
index 0000000..90fe46a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png
new file mode 100644 (file)
index 0000000..780cb87
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.svg
new file mode 100644 (file)
index 0000000..4bbd61c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png
new file mode 100644 (file)
index 0000000..fa3696a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.svg
new file mode 100644 (file)
index 0000000..5d94425
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png
new file mode 100644 (file)
index 0000000..87590fa
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.svg
new file mode 100644 (file)
index 0000000..9a625b8
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4.5 3.5l-1 1L6 7v2h1v7.97L8 18h6.97l.03-.03 1-.97 2.5 2.5 1-1L16 15l-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1zM9 5v1l1 1h6v1h-5l1 1h3v3l1 1V9h1V6h-3V5zM8 9l1 1v6h1v-5l1 1v4h1v-3l1 1v2h1v-1l1 1v1H8zm5 1l1 1v-1z" id="trash-can-undo"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png
new file mode 100644 (file)
index 0000000..dd35023
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.svg
new file mode 100644 (file)
index 0000000..17ca8dc
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M18.5 3.5l1 1L17 7v2h-1v7.97L15 18H8.03L8 17.97 7 17l-2.5 2.5-1-1L7 15l1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1zM14 5v1l-1 1H7v1h5l-1 1H8v3l-1 1V9H6V6h3V5zm1 4l-1 1v6h-1v-5l-1 1v4h-1v-3l-1 1v2H9v-1l-1 1v1h7zm-5 1l-1 1v-1z" id="trash-can-undo"/>
+</svg>
index 7545aeb..a6d466a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 812ee38..61a2866 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png b/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png
deleted file mode 100644 (file)
index eeb20b0..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png and /dev/null differ
index f5694a1..e6fa863 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 651cddf..80bbcaf 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 6b9e490..21efb82 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 11fcef7..4515405 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index cd4087e..3edb545 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index d168364..c97d770 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 7efe531..e040ffb 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
@@ -23,7 +23,7 @@
        },
        "images": {
                "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/betaLaunch.svg" },
+               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
index 765b8fe..6ff4a0e 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index c844449..7098f23 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 8c7b845..afdb9e5 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index e98012f..6a47267 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
        "images": {
                "block": { "file": "images/icons/block.svg", "variants": [ "destructive" ] },
                "blockUndo": { "file": {
-                       "ltr": "images/icons/blockUndo-ltr.svg",
-                       "rtl": "images/icons/blockUndo-rtl.svg"
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
+               } },
+               "unBlock": { "file": {
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
                } },
                "flag": { "file": {
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                } },
+               "unFlag": { "file": {
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
+               } },
                "flagUndo": { "file": {
-                       "ltr": "images/icons/flagUndo-ltr.svg",
-                       "rtl": "images/icons/flagUndo-rtl.svg"
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
                } },
                "lock": { "file": {
                        "ltr": "images/icons/lock-ltr.svg",
                        "rtl": "images/icons/lock-rtl.svg"
                }, "variants": [ "destructive" ] },
+               "unLock": { "file": {
+                       "ltr": "images/icons/unLock-ltr.svg",
+                       "rtl": "images/icons/unLock-rtl.svg"
+               }, "variants": [ "destructive" ] },
+               "star": { "file": "images/icons/star.svg", "variants": [ "constructive", "progressive" ] },
+               "halfStar": { "file": {
+                       "ltr": "images/icons/halfStar-ltr.svg",
+                       "rtl": "images/icons/halfStar-rtl.svg"
+               }, "variants": [ "constructive", "progressive" ] },
+               "unStar": { "file": "images/icons/unStar.svg", "variants": [ "constructive", "progressive" ] },
+               "trash": { "file": "images/icons/trash.svg" },
+               "unTrash": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
+               "trashUndo": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
                                "rtl": "images/icons/ongoingConversation-rtl.svg"
                        },
                        "variants": [ "progressive" ]
-               },
-               "star": { "file": "images/icons/star.svg", "variants": [ "constructive", "progressive" ] },
-               "trash": { "file": "images/icons/trash.svg" },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/trashUndo-ltr.svg",
-                       "rtl": "images/icons/trashUndo-rtl.svg"
-               } },
-               "unLock": { "file": {
-                       "ltr": "images/icons/unLock-ltr.svg",
-                       "rtl": "images/icons/unLock-rtl.svg"
-               }, "variants": [ "destructive" ] },
-               "unStar": { "file": "images/icons/unStar.svg", "variants": [ "constructive", "progressive" ] }
+               }
        }
 }
index c545a49..059073f 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 39fdda5..5a70c5e 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index bac9768..14f6b18 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
@@ -24,6 +24,7 @@
        "images": {
                "logoCC": { "file": "images/icons/logo-cc.svg" },
                "logoWikimediaCommons": { "file": "images/icons/logo-wikimediaCommons.svg" },
+               "logoWikimediaDiscovery": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
                "logoWikipedia": { "file": "images/icons/logo-wikipedia.svg" }
        }
 }
index 6a7c565..4666fd1 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 94b9b7b..60c74f5 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="add">
         <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
-</svg>
+</g></svg>
index 55f0013..dfbbc82 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="add">
         <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
-</svg>
+</g></svg>
index 94b9b7b..60c74f5 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="add">
         <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
-</svg>
+</g></svg>
index 8e5d7ac..feb4dd4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-1c.4.2.9.395 1.4.594l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.092 2.1-2.08-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
-</svg>
+</g></svg>
index b8d38f5..6bb1b10 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-1c.4.2.9.395 1.4.594l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.092 2.1-2.08-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
-</svg>
+</g></svg>
index d72ac35..0f64141 100644 (file)
@@ -1,8 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
         <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
-</svg>
+</g></svg>
index ddbb983..78c22cd 100644 (file)
@@ -1,8 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
         <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
-</svg>
+</g></svg>
index c5c5687..6e96e13 100644 (file)
@@ -1,8 +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"><style>* { fill: #ff5d00 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ff5d00">
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
         <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
-</svg>
+</g></svg>
index dc3a39a..b6db392 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H9c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm-5.5 9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0-12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-center"/>
-</svg>
+</g></svg>
index a88b9fe..e69f542 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H9c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm-5.5 9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0-12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-center"/>
-</svg>
+</g></svg>
index 770e354..5232a48 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H4c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm9.5 0h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm-10-9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0 12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-float-left"/>
-</svg>
+</g></svg>
index ff0257f..7e03b95 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H4c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm9.5 0h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm-10-9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0 12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-float-left"/>
-</svg>
+</g></svg>
index 014fb7e..3395516 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 9h-6c-.554 0-1 .446-1 1v5c0 .554.446 1 1 1h6c.554 0 1-.446 1-1v-5c0-.554-.446-1-1-1zm-9.5 0h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm10-9h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1zm0 12h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1z" id="align-float-right"/>
-</svg>
+</g></svg>
index 37ec2b5..f7f45e2 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 9h-6c-.554 0-1 .446-1 1v5c0 .554.446 1 1 1h6c.554 0 1-.446 1-1v-5c0-.554-.446-1-1-1zm-9.5 0h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm10-9h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1zm0 12h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1z" id="align-float-right"/>
-</svg>
+</g></svg>
index 9e18fd2..7a6c6a4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M13.3 6.3l6.3 5.7-6.3 5.7v-3.8H12c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9V6.3z"/>
-</svg>
+</g></svg>
index ee78b93..c17ebc7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M13.3 6.3l6.3 5.7-6.3 5.7v-3.8H12c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9V6.3z"/>
-</svg>
+</g></svg>
index 5bbad61..b05aec3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10.7 6.3L4.4 12l6.3 5.7v-3.8H12c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9V6.3z"/>
-</svg>
+</g></svg>
index d9ad31e..cc7b2aa 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10.7 6.3L4.4 12l6.3 5.7v-3.8H12c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9V6.3z"/>
-</svg>
+</g></svg>
index 7ec8b03..cfde7f5 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 12H6c-1.7 0-3 1.3-3 3h13v3l5-4.5L16 9v3z"/>
-</svg>
+</g></svg>
index 1317492..020e740 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 12H6c-1.7 0-3 1.3-3 3h13v3l5-4.5L16 9v3z"/>
-</svg>
+</g></svg>
index 38c0f88..b701b61 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M8 12h10c1.7 0 3 1.3 3 3H8v3l-5-4.5L8 9v3z"/>
-</svg>
+</g></svg>
index e56da3c..476c443 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M8 12h10c1.7 0 3 1.3 3 3H8v3l-5-4.5L8 9v3z"/>
-</svg>
+</g></svg>
index 5caf7dd..3285cc7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 10h4V5h-4v5zm-5 2h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zM5 3h13v16H8c-1.7 0-3-1.3-3-3V3z"/>
-</svg>
+</g></svg>
index cd35d36..61dda31 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 10h4V5h-4v5zm-5 2h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zM5 3h13v16H8c-1.7 0-3-1.3-3-3V3z"/>
-</svg>
+</g></svg>
index 19a1d72..b92172a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 10H7V5h4v5zm5 2H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zm6-2H5v16h10c1.7 0 3-1.3 3-3V3z"/>
-</svg>
+</g></svg>
index b04ecae..d0e6a7a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 10H7V5h4v5zm5 2H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zm6-2H5v16h10c1.7 0 3-1.3 3-3V3z"/>
-</svg>
+</g></svg>
index 1f30f59..9557c56 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 11l-6 7-4-4-1 1 5 5 7-8z"/>
     <path d="M17 14V3H4v13c0 1.7 1.3 3 3 3h5l-3-3H6v-1h2.6l1-1H6v-1h9v1h-2l1 1h2l1-1zM6 5h4v1H6V5zm0 2h4v1H6V7zm0 2h4v1H6V9zm9 3H6v-1h9v1zm-4-2V5h4v5h-4z"/>
-</svg>
+</g></svg>
index b554100..5802afd 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 11l-6 7-4-4-1 1 5 5 7-8z"/>
     <path d="M17 14V3H4v13c0 1.7 1.3 3 3 3h5l-3-3H6v-1h2.6l1-1H6v-1h9v1h-2l1 1h2l1-1zM6 5h4v1H6V5zm0 2h4v1H6V7zm0 2h4v1H6V9zm9 3H6v-1h9v1zm-4-2V5h4v5h-4z"/>
-</svg>
+</g></svg>
index f4dc6e9..fba5a32 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 11l6 7 4-4 1 1-5 5-7-8z"/>
     <path d="M9 14V3h13v13c0 1.7-1.3 3-3 3h-5l3-3h3v-1h-2.6l-1-1H20v-1h-9v1h2l-1 1h-2l-1-1zm11-9h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm-9 3h9v-1h-9v1zm4-2V5h-4v5h4z"/>
-</svg>
+</g></svg>
index 7a47a0e..0215593 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 11l6 7 4-4 1 1-5 5-7-8z"/>
     <path d="M9 14V3h13v13c0 1.7-1.3 3-3 3h-5l3-3h3v-1h-2.6l-1-1H20v-1h-9v1h2l-1 1h-2l-1-1zm11-9h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm-9 3h9v-1h-9v1zm4-2V5h-4v5h4z"/>
-</svg>
+</g></svg>
index 8b566ba..f68467f 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="article-redirect">
         <path id="arrow" d="M18.1 14.2L23 18l-4.9 4.8v-2.2c-1.7 0-2.9-.2-4.3-1.2-1.2-.8-2.5-2.6-2.3-4.1 1.4 1 2.9 1.5 4.4 1.5.7 0 1.4-.1 2.1-.3l.1-2.3"/>
         <path id="page" d="M5 3v13c0 1.7 1.3 3 3 3h3.375c-.157-.205-.3-.43-.438-.656-.42-.688-.77-1.483-.843-2.344H7v-1h3.125l.125-1H7v-1h3.375l.03-.188.283.188H16v1h-3.906l.22.156c.523.375 1.065.64 1.592.844H16v.406c.208-.013.418-.07.625-.094.068-1.294.125-3.874.125-3.874l1.25.968V3H5zm2 2h4v1H7V5zm5 0h4v5h-4V5zM7 7h4v1H7V7zm0 2h4v1H7V9zm0 2h9v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 49c1975..28e7a46 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="article-redirect">
         <path id="arrow" d="M18.1 14.2L23 18l-4.9 4.8v-2.2c-1.7 0-2.9-.2-4.3-1.2-1.2-.8-2.5-2.6-2.3-4.1 1.4 1 2.9 1.5 4.4 1.5.7 0 1.4-.1 2.1-.3l.1-2.3"/>
         <path id="page" d="M5 3v13c0 1.7 1.3 3 3 3h3.375c-.157-.205-.3-.43-.438-.656-.42-.688-.77-1.483-.843-2.344H7v-1h3.125l.125-1H7v-1h3.375l.03-.188.283.188H16v1h-3.906l.22.156c.523.375 1.065.64 1.592.844H16v.406c.208-.013.418-.07.625-.094.068-1.294.125-3.874.125-3.874l1.25.968V3H5zm2 2h4v1H7V5zm5 0h4v5h-4V5zM7 7h4v1H7V7zm0 2h4v1H7V9zm0 2h9v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 9bce7f2..d70b35f 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="article-redirect">
         <path id="arrow" d="M5.9 14.2L1 18l4.9 4.8v-2.2c1.7 0 2.9-.2 4.3-1.2 1.2-.8 2.5-2.6 2.3-4.1-1.4 1-2.9 1.5-4.4 1.5-.7 0-1.4-.1-2.1-.3l-.1-2.3"/>
         <path id="page" d="M19 3v13c0 1.7-1.3 3-3 3h-3.375c.157-.205.3-.43.438-.656.42-.688.77-1.483.843-2.344H17v-1h-3.125l-.125-1H17v-1h-3.375l-.03-.188-.283.188H8v1h3.906l-.22.156a7.097 7.097 0 0 1-1.592.844H8v.406c-.208-.013-.418-.07-.625-.094a178.903 178.903 0 0 1-.125-3.874L6 12.405V3zm-2 2h-4v1h4zm-5 0H8v5h4zm5 2h-4v1h4zm0 2h-4v1h4zm0 2H8v1h9z"/>
     </g>
-</svg>
+</g></svg>
index 98a0d4c..d49b9bd 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="article-redirect">
         <path id="arrow" d="M5.9 14.2L1 18l4.9 4.8v-2.2c1.7 0 2.9-.2 4.3-1.2 1.2-.8 2.5-2.6 2.3-4.1-1.4 1-2.9 1.5-4.4 1.5-.7 0-1.4-.1-2.1-.3l-.1-2.3"/>
         <path id="page" d="M19 3v13c0 1.7-1.3 3-3 3h-3.375c.157-.205.3-.43.438-.656.42-.688.77-1.483.843-2.344H17v-1h-3.125l-.125-1H17v-1h-3.375l-.03-.188-.283.188H8v1h3.906l-.22.156a7.097 7.097 0 0 1-1.592.844H8v.406c-.208-.013-.418-.07-.625-.094a178.903 178.903 0 0 1-.125-3.874L6 12.405V3zm-2 2h-4v1h4zm-5 0H8v5h4zm5 2h-4v1h4zm0 2h-4v1h4zm0 2H8v1h9z"/>
     </g>
-</svg>
+</g></svg>
index 1febaf2..c4dbcde 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19.1 18.5c.6-.7.9-1.5.9-2.5 0-2.2-1.8-4-4-4s-4 1.8-4 4 1.8 4 4 4c.7 0 1.3-.1 1.8-.4l2.7 2.7 1.1-1.1-2.5-2.7zm-3.1-.3c-1.2 0-2.2-1-2.2-2.3 0-1.2 1-2.2 2.2-2.2 1.2 0 2.3 1 2.3 2.2-.1 1.3-1.1 2.3-2.3 2.3zM11.8 13c.3-.4.6-.7 1-1H7v-1h9s1.2 0 2 .6V3H5v13c0 1.7 1.3 3 3 3h3.8c-.6-.8-1-1.9-1-3H7v-1h3.9l.3-1H7v-1h4.8zm.2-8h4v5h-4V5zM7 5h4v1H7V5zm0 2h4v1H7V7zm0 2h4v1H7V9z"/>
-</svg>
+</g></svg>
index 394203a..2d71a62 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19.1 18.5c.6-.7.9-1.5.9-2.5 0-2.2-1.8-4-4-4s-4 1.8-4 4 1.8 4 4 4c.7 0 1.3-.1 1.8-.4l2.7 2.7 1.1-1.1-2.5-2.7zm-3.1-.3c-1.2 0-2.2-1-2.2-2.3 0-1.2 1-2.2 2.2-2.2 1.2 0 2.3 1 2.3 2.2-.1 1.3-1.1 2.3-2.3 2.3zM11.8 13c.3-.4.6-.7 1-1H7v-1h9s1.2 0 2 .6V3H5v13c0 1.7 1.3 3 3 3h3.8c-.6-.8-1-1.9-1-3H7v-1h3.9l.3-1H7v-1h4.8zm.2-8h4v5h-4V5zM7 5h4v1H7V5zm0 2h4v1H7V7zm0 2h4v1H7V9z"/>
-</svg>
+</g></svg>
index be69d2a..ffd4285 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7.5 18.5c-.6-.7-.9-1.5-.9-2.5 0-2.2 1.8-4 4-4s4 1.8 4 4-1.8 4-4 4c-.7 0-1.3-.1-1.8-.4l-2.7 2.7L5 21.2l2.5-2.7zm3.1-.3c1.2 0 2.2-1 2.2-2.3 0-1.2-1-2.2-2.2-2.2-1.2 0-2.3 1-2.3 2.2.1 1.3 1.1 2.3 2.3 2.3zm4.2-5.2c-.3-.4-.6-.7-1-1h5.8v-1h-9s-1.2 0-2 .6V3h13v13c0 1.7-1.3 3-3 3h-3.8c.6-.8 1-1.9 1-3h3.8v-1h-3.9l-.3-1h4.2v-1h-4.8zm-.2-8h-4v5h4V5zm5 0h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9z"/>
-</svg>
+</g></svg>
index 47768e9..48ae222 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7.5 18.5c-.6-.7-.9-1.5-.9-2.5 0-2.2 1.8-4 4-4s4 1.8 4 4-1.8 4-4 4c-.7 0-1.3-.1-1.8-.4l-2.7 2.7L5 21.2l2.5-2.7zm3.1-.3c1.2 0 2.2-1 2.2-2.3 0-1.2-1-2.2-2.2-2.2-1.2 0-2.3 1-2.3 2.2.1 1.3 1.1 2.3 2.3 2.3zm4.2-5.2c-.3-.4-.6-.7-1-1h5.8v-1h-9s-1.2 0-2 .6V3h13v13c0 1.7-1.3 3-3 3h-3.8c.6-.8 1-1.9 1-3h3.8v-1h-3.9l-.3-1h4.2v-1h-4.8zm-.2-8h-4v5h4V5zm5 0h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9z"/>
-</svg>
+</g></svg>
index 2ac7914..884e55c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 678916b..599aa69 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index e45e450..64b9181 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index e4ca34b..18799af 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 8e7de03..2ced027 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><g fill="#fff">
     <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
-</svg>
+</g></svg>
index c062052..0f02b30 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><g fill="#36c">
     <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
-</svg>
+</g></svg>
index 91304a1..faa925c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><g fill="#fff">
     <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
-</svg>
+</g></svg>
index 6185c05..5e234a0 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><g fill="#36c">
     <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
-</svg>
+</g></svg>
index 3762e49..61caba7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17.5 13V8c0-3-2.3-5-5.5-5S6.5 5 6.5 8v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 19H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
-</svg>
+</g></svg>
index 7a6b31c..157430b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17.5 13V8c0-3-2.3-5-5.5-5S6.5 5 6.5 8v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 19H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
-</svg>
+</g></svg>
index 6f76157..49416aa 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17.8 13.7L19.5 9c1-2.8-.5-5.5-3.5-6.6-3-1.1-5.9 0-6.9 2.8L7.4 9.9c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 18.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
-</svg>
+</g></svg>
index 0a3d93d..d064356 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17.8 13.7L19.5 9c1-2.8-.5-5.5-3.5-6.6-3-1.1-5.9 0-6.9 2.8L7.4 9.9c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 18.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
-</svg>
+</g></svg>
index 886a34c..b854834 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6.21 13.7L4.51 9c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
-</svg>
+</g></svg>
index 2b0d7df..a9cdb3c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6.21 13.7L4.51 9c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
-</svg>
+</g></svg>
index 0f5bf22..eca628f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 84be0ce..ba896ef 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png
deleted file mode 100644 (file)
index 0963538..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.svg
deleted file mode 100644 (file)
index 21548d9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png
deleted file mode 100644 (file)
index 6afb2bd..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.svg
deleted file mode 100644 (file)
index 359d032..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png
deleted file mode 100644 (file)
index 6d3c067..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.svg
deleted file mode 100644 (file)
index c3f99d6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
index b5ce7e7..60d7fd4 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 9H4l2.5-3z"/>
-</svg>
+</g></svg>
index e1f33d8..863fe92 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 9H4l2.5-3z"/>
-</svg>
+</g></svg>
index 8ed760b..b2fbe9e 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 9h5l-2.5-3z"/>
-</svg>
+</g></svg>
index 34ec7c0..46c5048 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 9h5l-2.5-3z"/>
-</svg>
+</g></svg>
index 53460be..54b9f62 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/block-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/block-destructive.png differ
index abf656f..b703094 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <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-8zm5 9H7v-2h10v2z"/>
-</svg>
+</g></svg>
index 2807149..97f21c3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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-8zm5 9H7v-2h10v2z"/>
-</svg>
+</g></svg>
index abcc7e0..e3648cf 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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-8zm5 9H7v-2h10v2z"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png
deleted file mode 100644 (file)
index 7426f56..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.svg
deleted file mode 100644 (file)
index 36fd719..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png
deleted file mode 100644 (file)
index d797f3e..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.svg
deleted file mode 100644 (file)
index bc96e99..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png
deleted file mode 100644 (file)
index 640bb2a..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.svg
deleted file mode 100644 (file)
index 160219c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png
deleted file mode 100644 (file)
index a02e2e0..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.svg
deleted file mode 100644 (file)
index b6f1610..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png
deleted file mode 100644 (file)
index 4d062cb..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.svg
deleted file mode 100644 (file)
index dc03220..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png
deleted file mode 100644 (file)
index 2475b06..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.svg
deleted file mode 100644 (file)
index 90fe46a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
index f14a008..b02b5c7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 18h3L14 6h-3L6 18h3l1.25-3h4.5L16 18zm-4.917-5L12.5 9.6l1.417 3.4h-2.834z" id="bold-a"/>
-</svg>
+</g></svg>
index 6bf90f6..4f051bf 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 18h3L14 6h-3L6 18h3l1.25-3h4.5L16 18zm-4.917-5L12.5 9.6l1.417 3.4h-2.834z" id="bold-a"/>
-</svg>
+</g></svg>
index ed986c8..ab901fb 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-arab-ain">
         <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.12-.25.34-.66.65l-.09.06c-1.233.93-2.42 1.394-3.56 1.394-1.14 0-2.043-.33-2.71-.99-.65-.66-.973-1.56-.973-2.7.006-1.353.567-2.572 1.685-3.657v-.044l-.606-.55a.952.952 0 0 1-.222-.63c0-.49.24-1.11.72-1.863.65-1.045 1.302-1.565 1.957-1.56.886.005 1.618.42 2.194 1.246.325.48-.03.55-1.064.22-.843-.33-1.528-.05-2.055.826l.016.074 1.125.866.05.005c1.405-.497 2.42-.74 3.044-.725-.06.116-.14.36-.244.732a27.75 27.75 0 0 1-.304.982l-.125.372-.386.05c-1.743.24-2.992.716-3.745 1.43-.465.463-.7.972-.704 1.524"/>
     </g>
-</svg>
+</g></svg>
index 081c571..d905f22 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-arab-ain">
         <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.12-.25.34-.66.65l-.09.06c-1.233.93-2.42 1.394-3.56 1.394-1.14 0-2.043-.33-2.71-.99-.65-.66-.973-1.56-.973-2.7.006-1.353.567-2.572 1.685-3.657v-.044l-.606-.55a.952.952 0 0 1-.222-.63c0-.49.24-1.11.72-1.863.65-1.045 1.302-1.565 1.957-1.56.886.005 1.618.42 2.194 1.246.325.48-.03.55-1.064.22-.843-.33-1.528-.05-2.055.826l.016.074 1.125.866.05.005c1.405-.497 2.42-.74 3.044-.725-.06.116-.14.36-.244.732a27.75 27.75 0 0 1-.304.982l-.125.372-.386.05c-1.743.24-2.992.716-3.745 1.43-.465.463-.7.972-.704 1.524"/>
     </g>
-</svg>
+</g></svg>
index d8ecaa0..e02613e 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-arab-dad">
         <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.478 0-.99.205-1.54.616l-.505.38.006.024c1.085.066 1.935.1 2.55.1h.315c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006M10.38 14.6c-.016-.905-.33-1.87-.937-2.9l1.294-1.73.118.15c.267.337.504.925.713 1.767l.064.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.383.003.85.194 1.394.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.193.31-.474.555-.845.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.064l-.142.43c-.254.67-.463 1.112-.625 1.323-.724.937-1.785 1.405-3.182 1.405-1.71-.006-2.56-.92-2.56-2.74.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
     </g>
-</svg>
+</g></svg>
index c314577..bbf7a38 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-arab-dad">
         <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.478 0-.99.205-1.54.616l-.505.38.006.024c1.085.066 1.935.1 2.55.1h.315c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006M10.38 14.6c-.016-.905-.33-1.87-.937-2.9l1.294-1.73.118.15c.267.337.504.925.713 1.767l.064.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.383.003.85.194 1.394.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.193.31-.474.555-.845.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.064l-.142.43c-.254.67-.463 1.112-.625 1.323-.724.937-1.785 1.405-3.182 1.405-1.71-.006-2.56-.92-2.56-2.74.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
     </g>
-</svg>
+</g></svg>
index c8467bb..1d9ea40 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-armn-to">
         <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.28a1.43 1.43 0 0 0 .273-.517c.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078a.905.905 0 0 0-.383.258c-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.21.18.39.29.53.12.13.25.23.39.29.14.05.276.07.406.07m-2.97-7.84a2.67 2.67 0 0 0-.975.45 2.1 2.1 0 0 0-.672.813c-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04a4.227 4.227 0 0 1 1.234-1.467c.52-.39 1.13-.685 1.83-.883a8.114 8.114 0 0 1 2.225-.297c.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.34.49.73.64 1.17.15.43.226 1.09.226 1.61h1.36v2.04h-1.36v1.6c0 .58-.102 1.09-.31 1.54-.21.44-.49.81-.844 1.11-.35.302-.834.53-1.297.687-.465.15-.954.226-1.47.226-.51 0-.997-.08-1.46-.235a3.46 3.46 0 0 1-1.22-.703 3.452 3.452 0 0 1-.836-1.174c-.203-.472-.304-1.027-.304-1.662s.1-1.18.32-1.64c.21-.46.49-.684.85-.976.35-.297.76-.513 1.22-.648.452-.14.93-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36a2.26 2.26 0 0 0-.77-.767 3.234 3.234 0 0 0-.986-.427c-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
     </g>
-</svg>
+</g></svg>
index 10b5fdc..4bb91c9 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-armn-to">
         <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.28a1.43 1.43 0 0 0 .273-.517c.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078a.905.905 0 0 0-.383.258c-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.21.18.39.29.53.12.13.25.23.39.29.14.05.276.07.406.07m-2.97-7.84a2.67 2.67 0 0 0-.975.45 2.1 2.1 0 0 0-.672.813c-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04a4.227 4.227 0 0 1 1.234-1.467c.52-.39 1.13-.685 1.83-.883a8.114 8.114 0 0 1 2.225-.297c.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.34.49.73.64 1.17.15.43.226 1.09.226 1.61h1.36v2.04h-1.36v1.6c0 .58-.102 1.09-.31 1.54-.21.44-.49.81-.844 1.11-.35.302-.834.53-1.297.687-.465.15-.954.226-1.47.226-.51 0-.997-.08-1.46-.235a3.46 3.46 0 0 1-1.22-.703 3.452 3.452 0 0 1-.836-1.174c-.203-.472-.304-1.027-.304-1.662s.1-1.18.32-1.64c.21-.46.49-.684.85-.976.35-.297.76-.513 1.22-.648.452-.14.93-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36a2.26 2.26 0 0 0-.77-.767 3.234 3.234 0 0 0-.986-.427c-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
     </g>
-</svg>
+</g></svg>
index 49236c3..0a03c2e 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-b">
         <path id="b" d="M7 18h6c2 0 4-1 4-3 0-1.064.01-1.975-1.99-3 2-.975 1.99-1.935 1.99-3 0-2-2-3-4-3H7v12zm7-8c0 1 0 1-2 1h-2V8h2c2 0 2 0 2 1v1zm-2 6h-2v-3h2c2 0 2 0 2 1v1s0 1-2 1z"/>
     </g>
-</svg>
+</g></svg>
index 4980f22..adf665e 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-b">
         <path id="b" d="M7 18h6c2 0 4-1 4-3 0-1.064.01-1.975-1.99-3 2-.975 1.99-1.935 1.99-3 0-2-2-3-4-3H7v12zm7-8c0 1 0 1-2 1h-2V8h2c2 0 2 0 2 1v1zm-2 6h-2v-3h2c2 0 2 0 2 1v1s0 1-2 1z"/>
     </g>
-</svg>
+</g></svg>
index 8cbe378..cd67107 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-cyrl-be">
         <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.4-.255-1.07-.397-2.02-.397H10v3"/>
     </g>
-</svg>
+</g></svg>
index 9476ae8..22c3bf5 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-cyrl-be">
         <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.4-.255-1.07-.397-2.02-.397H10v3"/>
     </g>
-</svg>
+</g></svg>
index dc7b0df..42ba193 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-cyrl-te">
         <path id="te" d="M11 18V8H7V6h11v2h-4v10"/>
     </g>
-</svg>
+</g></svg>
index 6554299..73a76a3 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-cyrl-te">
         <path id="te" d="M11 18V8H7V6h11v2h-4v10"/>
     </g>
-</svg>
+</g></svg>
index 32980c1..4643345 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-cyrl-zhe">
         <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.112-.337.3-.452.55-.115.25-.286.76-.512 1.533-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.455.603 1.103.944 1.943L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09A.726.726 0 0 0 13 12.78V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772a6.357 6.357 0 0 1-.392-1.04c-.222-.76-.39-1.26-.505-1.52-.11-.25-.26-.44-.45-.57-.18-.12-.49-.18-.912-.18H6V6l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
     </g>
-</svg>
+</g></svg>
index a6694e7..3b7fee9 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-cyrl-zhe">
         <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.112-.337.3-.452.55-.115.25-.286.76-.512 1.533-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.455.603 1.103.944 1.943L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09A.726.726 0 0 0 13 12.78V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772a6.357 6.357 0 0 1-.392-1.04c-.222-.76-.39-1.26-.505-1.52-.11-.25-.26-.44-.45-.57-.18-.12-.49-.18-.912-.18H6V6l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
     </g>
-</svg>
+</g></svg>
index a2fbced..5cf18ff 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-f">
         <path id="f" d="M16 8V6H8v12h3v-5h4v-2h-4V8z"/>
     </g>
-</svg>
+</g></svg>
index cbd80ed..cce2c59 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-f">
         <path id="f" d="M16 8V6H8v12h3v-5h4v-2h-4V8z"/>
     </g>
-</svg>
+</g></svg>
index 5aeb9a4..2741c4f 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-g">
         <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26A7.994 7.994 0 0 1 11.97 18c-1.23 0-2.303-.253-3.217-.76a4.908 4.908 0 0 1-2.062-2.185A7.008 7.008 0 0 1 6 11.96c0-1.208.26-2.282.77-3.222.518-.94 1.27-1.66 2.26-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435a2.433 2.433 0 0 0-.94-1.346c-.454-.34-1.022-.5-1.707-.5-1.038 0-1.864.32-2.48.97-.61.65-.914 1.61-.914 2.89 0 1.375.31 2.41.93 3.1.62.687 1.434 1.03 2.44 1.03.497 0 .995-.095 1.49-.285.505-.196 1.334-.57 1.69-.846v-.868"/>
     </g>
-</svg>
+</g></svg>
index 77d543f..9e85e63 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-g">
         <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26A7.994 7.994 0 0 1 11.97 18c-1.23 0-2.303-.253-3.217-.76a4.908 4.908 0 0 1-2.062-2.185A7.008 7.008 0 0 1 6 11.96c0-1.208.26-2.282.77-3.222.518-.94 1.27-1.66 2.26-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435a2.433 2.433 0 0 0-.94-1.346c-.454-.34-1.022-.5-1.707-.5-1.038 0-1.864.32-2.48.97-.61.65-.914 1.61-.914 2.89 0 1.375.31 2.41.93 3.1.62.687 1.434 1.03 2.44 1.03.497 0 .995-.095 1.49-.285.505-.196 1.334-.57 1.69-.846v-.868"/>
     </g>
-</svg>
+</g></svg>
index b8ba06f..c6eea49 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-geor-man">
         <path id="geor-man" d="M13.832 14.06c0-1.714-.394-2.572-1.182-2.572-.868 0-1.302.78-1.302 2.338-.01 1.624.42 2.436 1.295 2.436.793 0 1.19-.734 1.19-2.2m2.167 0C16 16.686 14.884 18 12.65 18 10.218 18 9 16.614 9 13.84c0-2.737 1.217-4.105 3.65-4.105.842 0 1.183.63 1.183.63v-1.58c0-.788-.45-1.183-1.347-1.183-.572 0-.858.374-.858 1.123h-2.34C9.29 6.908 10.35 6 12.462 6 14.83 6 16.01 6.946 16 8.84"/>
     </g>
-</svg>
+</g></svg>
index 04dc619..bca4a1a 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-geor-man">
         <path id="geor-man" d="M13.832 14.06c0-1.714-.394-2.572-1.182-2.572-.868 0-1.302.78-1.302 2.338-.01 1.624.42 2.436 1.295 2.436.793 0 1.19-.734 1.19-2.2m2.167 0C16 16.686 14.884 18 12.65 18 10.218 18 9 16.614 9 13.84c0-2.737 1.217-4.105 3.65-4.105.842 0 1.183.63 1.183.63v-1.58c0-.788-.45-1.183-1.347-1.183-.572 0-.858.374-.858 1.123h-2.34C9.29 6.908 10.35 6 12.462 6 14.83 6 16.01 6.946 16 8.84"/>
     </g>
-</svg>
+</g></svg>
index 8d92de4..a5516ed 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-l">
         <path id="l" d="M8 18V6h3v10h5v2"/>
     </g>
-</svg>
+</g></svg>
index 7aa3a8e..44178b7 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-l">
         <path id="l" d="M8 18V6h3v10h5v2"/>
     </g>
-</svg>
+</g></svg>
index 023f0ad..528efe8 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-n">
         <path id="n" d="M7 18V6h3l4 8V6h3v12h-3l-4-8v8H7"/>
     </g>
-</svg>
+</g></svg>
index 0ed4acd..d686921 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-n">
         <path id="n" d="M7 18V6h3l4 8V6h3v12h-3l-4-8v8H7"/>
     </g>
-</svg>
+</g></svg>
index 2b8c035..c1549dc 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-v">
         <path id="v" d="M10.5 18L6 6h3l3 8 3-8h3l-4.5 12"/>
     </g>
-</svg>
+</g></svg>
index a6d9a25..a94a50c 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-v">
         <path id="v" d="M10.5 18L6 6h3l3 8 3-8h3l-4.5 12"/>
     </g>
-</svg>
+</g></svg>
index 061ad41..83265e4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 7c-1.7 0-3 1.3-3 3 0-1.7-1.3-3-3-3H3v13h6c1.7 0 3 1 3 2 0-1 1.3-2 3-2h6V7h-6zm5 12h-5c-1.7 0-2 .4-2 .4v-8.9C13 9.1 14.1 8 15.5 8H20v11z"/>
-</svg>
+</g></svg>
index 626a020..89fff50 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 7c-1.7 0-3 1.3-3 3 0-1.7-1.3-3-3-3H3v13h6c1.7 0 3 1 3 2 0-1 1.3-2 3-2h6V7h-6zm5 12h-5c-1.7 0-2 .4-2 .4v-8.9C13 9.1 14.1 8 15.5 8H20v11z"/>
-</svg>
+</g></svg>
index f9be70f..256ee41 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 7c1.7 0 3 1.3 3 3 0-1.7 1.3-3 3-3h6v13h-6c-1.7 0-3 1-3 2 0-1-1.3-2-3-2H3V7h6zM4 19h5c1.7 0 2 .4 2 .4v-8.9C11 9.1 9.9 8 8.5 8H4v11z"/>
-</svg>
+</g></svg>
index 948472d..150fd95 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 7c1.7 0 3 1.3 3 3 0-1.7 1.3-3 3-3h6v13h-6c-1.7 0-3 1-3 2 0-1-1.3-2-3-2H3V7h6zM4 19h5c1.7 0 2 .4 2 .4v-8.9C11 9.1 9.9 8 8.5 8H4v11z"/>
-</svg>
+</g></svg>
index 44a7710..e511a8a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index d321cea..9f1c2b4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index c2cf8c7..f949201 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 9c752a8..4967af9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 28fac21..8f41c1a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<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.9-.3.3-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4.3.3.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-.4-.3-.3-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9.3-.3.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8 0-.3.1-.6.3-.8zM12 8c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3m0-1c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z"/>
     <path d="M12 8c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3m0-1c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z"/>
-</svg>
+</g></svg>
index 1f61e46..3ee311a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 14a79cb..d3dd3fe 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 1290997..98238cf 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 80839ad..e2ad0ab 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index d65c8fe..f933a1e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 5v10c0 1.7 1.3 3 3 3h14V8c0-1.7-1.3-3-3-3H4zm2 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zM5 9h3v2H5V9zm4 0h3v2H9V9zm4 0h3v2h-3V9zm4 0h3v2h-3V9zM5 12h3v2H5v-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2zM5 15h3v2H7c-1.195 0-2-.805-2-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2z"/>
-</svg>
+</g></svg>
index f28c0ad..97d6a58 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 5v10c0 1.7 1.3 3 3 3h14V8c0-1.7-1.3-3-3-3H4zm2 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zM5 9h3v2H5V9zm4 0h3v2H9V9zm4 0h3v2h-3V9zm4 0h3v2h-3V9zM5 12h3v2H5v-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2zM5 15h3v2H7c-1.195 0-2-.805-2-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2z"/>
-</svg>
+</g></svg>
index 4d1fd8b..dccd818 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 5v10c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3h14zm-2 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zM7 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm13 3h-3v2h3V9zm-4 0h-3v2h3V9zm-4 0H9v2h3V9zM8 9H5v2h3V9zm12 3h-3v2h3v-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2zm12 3h-3v2h1c1.195 0 2-.805 2-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2z"/>
-</svg>
+</g></svg>
index 0e530c0..3757322 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 5v10c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3h14zm-2 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zM7 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm13 3h-3v2h3V9zm-4 0h-3v2h3V9zm-4 0H9v2h3V9zM8 9H5v2h3V9zm12 3h-3v2h3v-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2zm12 3h-3v2h1c1.195 0 2-.805 2-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2z"/>
-</svg>
+</g></svg>
index 000e529..f574a39 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.png differ
index b2b0179..c0f8dc0 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"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <g id="cancel">
         <path id="circle-with-strike" d="M12 5.022a6.98 6.98 0 0 0-.003 13.956 6.98 6.98 0 0 0-.002-13.956zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93A5.113 5.113 0 0 1 6.884 12zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93a5.112 5.112 0 0 1 5.114 5.113c0 1.092-.364 3.542-.93 2.93z"/>
     </g>
-</svg>
+</g></svg>
index 80de8e0..893486d 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="cancel">
         <path id="circle-with-strike" d="M12 5.022a6.98 6.98 0 0 0-.003 13.956 6.98 6.98 0 0 0-.002-13.956zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93A5.113 5.113 0 0 1 6.884 12zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93a5.112 5.112 0 0 1 5.114 5.113c0 1.092-.364 3.542-.93 2.93z"/>
     </g>
-</svg>
+</g></svg>
index c36387f..18698eb 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="cancel">
         <path id="circle-with-strike" d="M12 5.022a6.98 6.98 0 0 0-.003 13.956 6.98 6.98 0 0 0-.002-13.956zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93A5.113 5.113 0 0 1 6.884 12zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93a5.112 5.112 0 0 1 5.114 5.113c0 1.092-.364 3.542-.93 2.93z"/>
     </g>
-</svg>
+</g></svg>
index 228a503..f4e15cf 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 4b2594b..0558da7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index a24bc6c..6a74d9b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 0b5cb95..3274959 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index cf819c3..4d4bf6e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 4239e3b..e651488 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 625df49..9686715 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index d87a183..6f1b02d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 96c111e..dbd98d2 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="regular-expression">
         <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>
-</svg>
+</g></svg>
index a81eb4c..c5f35b0 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="regular-expression">
         <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>
-</svg>
+</g></svg>
index 63b425a..4cea8a3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index 0cc9169..305f41d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-destructive.png differ
index 7e3dc53..3609a7b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index b7a1be0..7f3299a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index 63b425a..4cea8a3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index 82e64cd..2c20c6e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <circle cx="12" cy="12" r="6"/>
-</svg>
+</g></svg>
index 96d39e8..88a64fe 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <circle cx="12" cy="12" r="6"/>
-</svg>
+</g></svg>
index 82e64cd..2c20c6e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <circle cx="12" cy="12" r="6"/>
-</svg>
+</g></svg>
index 4c6db6f..9e2795e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 12h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zm5-2h2v16H8c-1.7 0-3-1.3-3-3V3h8v7l1.5-2 1.5 2V3z"/>
-</svg>
+</g></svg>
index e4b3aaf..677ee81 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 12h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zm5-2h2v16H8c-1.7 0-3-1.3-3-3V3h8v7l1.5-2 1.5 2V3z"/>
-</svg>
+</g></svg>
index 86781cf..131a271 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 12H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zM7 3H5v16h10c1.7 0 3-1.3 3-3V3h-8v7L8.5 8 7 10V3z"/>
-</svg>
+</g></svg>
index c51cfc9..b19d640 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 12H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zM7 3H5v16h10c1.7 0 3-1.3 3-3V3h-8v7L8.5 8 7 10V3z"/>
-</svg>
+</g></svg>
index bbe321a..b43d794 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index 1cc7c1d..2fa1f2f 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
-</svg>
+</g></svg>
index 9ad3926..8376288 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 12l-4-3V8h2v5l1.7 1.2c1.3.9 1 1.9.3 2.8z"/>
-</svg>
+</g></svg>
index a1a307b..4c8accd 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 12l-4-3V8h2v5l1.7 1.2c1.3.9 1 1.9.3 2.8z"/>
-</svg>
+</g></svg>
index 0ea5a9a..6de3e30 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"><style>* { fill: #fff }</style>
+<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>
-</svg>
+</g></svg>
index dd053f1..122340e 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"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 848a0e3..67dc06c 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"><style>* { fill: #fff }</style>
+<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>
-</svg>
+</g></svg>
index 6d53d36..c6494de 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"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 224f1e7..e9179bf 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="code">
         <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.48.808-.59.335-.11.872-.25 1.835-.25H10v1h-.752c-.457 0-.77.19-.936.406-.167.216-.312.446-.312 1.07v1.856c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.31.238.76.238 1.49v1.86c0 .62.145.85.312 1.06.166.22.48.41.936.41H10v1H8.973c-.963 0-1.5-.133-1.835-.248a1.578 1.578 0 0 1-.808-.59 1.68 1.68 0 0 1-.257-.626C6.023 16.283 6 15.9 6 15.386V13c0-1 0-1-1-1H4z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index d4f3de8..ce0e492 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="code">
         <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.48.808-.59.335-.11.872-.25 1.835-.25H10v1h-.752c-.457 0-.77.19-.936.406-.167.216-.312.446-.312 1.07v1.856c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.31.238.76.238 1.49v1.86c0 .62.145.85.312 1.06.166.22.48.41.936.41H10v1H8.973c-.963 0-1.5-.133-1.835-.248a1.578 1.578 0 0 1-.808-.59 1.68 1.68 0 0 1-.257-.626C6.023 16.283 6 15.9 6 15.386V13c0-1 0-1-1-1H4z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index 9cd2f78..7b7305a 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="collapse">
         <path id="arrow" d="M6.697 15.714L12 10.412l5.303 5.302 1.414-1.414L12 7.583 5.283 14.3z"/>
     </g>
-</svg>
+</g></svg>
index b0253f2..29157ae 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="collapse">
         <path id="arrow" d="M6.697 15.714L12 10.412l5.303 5.302 1.414-1.414L12 7.583 5.283 14.3z"/>
     </g>
-</svg>
+</g></svg>
index 2ddc29c..e6f6bb1 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="comment">
         <path id="speech-bubble" d="M15 6H9a3 3 0 0 0-3 3v4a3 3 0 0 0 3 3v3l3-3h3a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3z"/>
     </g>
-</svg>
+</g></svg>
index 31087f3..63bdad9 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="comment">
         <path id="speech-bubble" d="M15 6H9a3 3 0 0 0-3 3v4a3 3 0 0 0 3 3v3l3-3h3a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3z"/>
     </g>
-</svg>
+</g></svg>
index cffcd94..a9ef321 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 5H4v12c0 1.6 1.3 3 3 3h12V8c0-1.7-1.4-3-3-3zM7.5 17c-.8 0-1.5-.7-1.5-1.5S6.7 14 7.5 14s1.5.7 1.5 1.5S8.3 17 7.5 17zm0-6C6.7 11 6 10.3 6 9.5S6.7 8 7.5 8 9 8.7 9 9.5 8.3 11 7.5 11zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm0-6c-.8 0-1.5-.7-1.5-1.5S14.7 8 15.5 8s1.5.7 1.5 1.5-.7 1.5-1.5 1.5z"/>
-</svg>
+</g></svg>
index 55ee4a5..a63bf03 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 5H4v12c0 1.6 1.3 3 3 3h12V8c0-1.7-1.4-3-3-3zM7.5 17c-.8 0-1.5-.7-1.5-1.5S6.7 14 7.5 14s1.5.7 1.5 1.5S8.3 17 7.5 17zm0-6C6.7 11 6 10.3 6 9.5S6.7 8 7.5 8 9 8.7 9 9.5 8.3 11 7.5 11zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm0-6c-.8 0-1.5-.7-1.5-1.5S14.7 8 15.5 8s1.5.7 1.5 1.5-.7 1.5-1.5 1.5z"/>
-</svg>
+</g></svg>
index ab88fb0..344e2fb 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 5h12v12c0 1.6-1.3 3-3 3H4V8c0-1.7 1.4-3 3-3zm8.5 12c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm0-6c.8 0 1.5-.7 1.5-1.5S16.3 8 15.5 8 14 8.7 14 9.5s.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5S8.3 14 7.5 14 6 14.7 6 15.5 6.7 17 7.5 17zm0-6c.8 0 1.5-.7 1.5-1.5S8.3 8 7.5 8 6 8.7 6 9.5 6.7 11 7.5 11z"/>
-</svg>
+</g></svg>
index 9e3a64e..fd4f13b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 5h12v12c0 1.6-1.3 3-3 3H4V8c0-1.7 1.4-3 3-3zm8.5 12c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm0-6c.8 0 1.5-.7 1.5-1.5S16.3 8 15.5 8 14 8.7 14 9.5s.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5S8.3 14 7.5 14 6 14.7 6 15.5 6.7 17 7.5 17zm0-6c.8 0 1.5-.7 1.5-1.5S8.3 8 7.5 8 6 8.7 6 9.5 6.7 11 7.5 11z"/>
-</svg>
+</g></svg>
index 53fc581..9c64f50 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 18l8-10H4z"/>
-</svg>
+</g></svg>
index 6fe38de..aaa6ec9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 18l8-10H4z"/>
-</svg>
+</g></svg>
index 9c7573e..312b19e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 11h-3V4c-1.7 0-3 1.3-3 3v4H7l4.5 5 4.5-5zm1 2v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index 98a86bb..8d69423 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 11h-3V4c-1.7 0-3 1.3-3 3v4H7l4.5 5 4.5-5zm1 2v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index a89fd52..141ca5c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 11h3V4c1.7 0 3 1.3 3 3v4h3l-4.5 5L7 11zm-1 2v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index c5cbee5..4767dc1 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 11h3V4c1.7 0 3 1.3 3 3v4h3l-4.5 5L7 11zm-1 2v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index 1e9b853..138f8e8 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 2L5 14l-1 5 5-1L21 6c0-2-2-4-4-4zM7.2 15.5c-.3-.3-.7-.6-1-.8C8.5 12.4 17.5 3.3 17.5 3.3c.4.1.7.3 1 .7L7.2 15.5z"/>
-</svg>
+</g></svg>
index c7e6f15..40446e9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 2L5 14l-1 5 5-1L21 6c0-2-2-4-4-4zM7.2 15.5c-.3-.3-.7-.6-1-.8C8.5 12.4 17.5 3.3 17.5 3.3c.4.1.7.3 1 .7L7.2 15.5z"/>
-</svg>
+</g></svg>
index 36f6d48..0b9a4af 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M8 2l12 12 1 5-5-1L4 6c0-2 2-4 4-4zm9.8 13.5c.3-.3.7-.6 1-.8C16.5 12.4 7.5 3.3 7.5 3.3c-.4.1-.7.3-1 .7l11.3 11.5z"/>
-</svg>
+</g></svg>
index a77a027..8c0b879 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M8 2l12 12 1 5-5-1L4 6c0-2 2-4 4-4zm9.8 13.5c.3-.3.7-.6 1-.8C16.5 12.4 7.5 3.3 7.5 3.3c-.4.1-.7.3-1 .7l11.3 11.5z"/>
-</svg>
+</g></svg>
index 00a7670..82b39cd 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-1.5 0h-3V3s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zM13 9.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9V6l-9 9-1 5 5-1 8-8h-3z"/>
-</svg>
+</g></svg>
index 335b9a5..618debe 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-1.5 0h-3V3s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zM13 9.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9V6l-9 9-1 5 5-1 8-8h-3z"/>
-</svg>
+</g></svg>
index 3d6c9f1..9b9f765 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 4V3s0-3 3-3 3 3 3 3v1h1v6H3V4zm1.5 0h3V3s0-1.5-1.5-1.5C5.52 1.56 5.5 3 5.5 3zM12 9.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9V6l9 9 1 5-5-1-8-8h3z"/>
-</svg>
+</g></svg>
index 96ad98d..ad87acc 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 4V3s0-3 3-3 3 3 3 3v1h1v6H3V4zm1.5 0h3V3s0-1.5-1.5-1.5C5.52 1.56 5.5 3 5.5 3zM12 9.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9V6l9 9 1 5-5-1-8-8h3z"/>
-</svg>
+</g></svg>
index 8b6022d..a34235e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14.9 2.8c.9 0 1.8.2 2.7.6.9.4 1.6.9 1.9 1.6-2.8.1-5 1.1-6.6 3.1l1.3 2-6.7-.3L8 3l1.7 2c1.8-1.5 3.5-2.2 5.2-2.2z"/>
     <path d="M15.2 11.1l-2.6-.1-5.4 5.5c-.3-.3-.7-.6-1-.8.9-.9 2.8-2.8 4.7-4.8H9.1L5 15l-1 5 5-1 7.8-7.8-1.6-.1zM20.6 6c-1.7 0-3.2.5-4.4 1.4l-.9.9.8 1.3.9 1.4 4-4c0-.3-.1-.7-.2-1h-.2z"/>
-</svg>
+</g></svg>
index d231819..c7d9bbe 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14.9 2.8c.9 0 1.8.2 2.7.6.9.4 1.6.9 1.9 1.6-2.8.1-5 1.1-6.6 3.1l1.3 2-6.7-.3L8 3l1.7 2c1.8-1.5 3.5-2.2 5.2-2.2z"/>
     <path d="M15.2 11.1l-2.6-.1-5.4 5.5c-.3-.3-.7-.6-1-.8.9-.9 2.8-2.8 4.7-4.8H9.1L5 15l-1 5 5-1 7.8-7.8-1.6-.1zM20.6 6c-1.7 0-3.2.5-4.4 1.4l-.9.9.8 1.3.9 1.4 4-4c0-.3-.1-.7-.2-1h-.2z"/>
-</svg>
+</g></svg>
index ff45759..1aea7a8 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10.1 2.8c-.9 0-1.8.2-2.7.6-.9.4-1.6.9-1.9 1.6 2.8.1 5 1.1 6.6 3.1l-1.3 2 6.7-.3L17 3l-1.7 2c-1.8-1.5-3.5-2.2-5.2-2.2z"/>
     <path d="M9.8 11.1l2.6-.1 5.4 5.5c.3-.3.7-.6 1-.8-.9-.9-2.8-2.8-4.7-4.8h1.8L20 15l1 5-5-1-7.8-7.8 1.6-.1zM4.4 6c1.7 0 3.2.5 4.4 1.4l.9.9-.8 1.3L8 11 4 7c0-.3.1-.7.2-1h.2z"/>
-</svg>
+</g></svg>
index fbb984b..a743341 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10.1 2.8c-.9 0-1.8.2-2.7.6-.9.4-1.6.9-1.9 1.6 2.8.1 5 1.1 6.6 3.1l-1.3 2 6.7-.3L17 3l-1.7 2c-1.8-1.5-3.5-2.2-5.2-2.2z"/>
     <path d="M9.8 11.1l2.6-.1 5.4 5.5c.3-.3.7-.6 1-.8-.9-.9-2.8-2.8-4.7-4.8h1.8L20 15l1 5-5-1-7.8-7.8 1.6-.1zM4.4 6c1.7 0 3.2.5 4.4 1.4l.9.9-.8 1.3L8 11 4 7c0-.3.1-.7.2-1h.2z"/>
-</svg>
+</g></svg>
index a2a651d..e5b0d24 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M8 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM14 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM20 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4z"/>
-</svg>
+</g></svg>
index a56ec14..0675f6e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M8 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM14 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM20 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4z"/>
-</svg>
+</g></svg>
index 7c034f0..a8260ae 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="expand">
         <path id="arrow" d="M17.303 8.283L12 13.586 6.697 8.283 5.283 9.697 12 16.414l6.717-6.717z"/>
     </g>
-</svg>
+</g></svg>
index 13d3b24..e7f6aa5 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="expand">
         <path id="arrow" d="M17.303 8.283L12 13.586 6.697 8.283 5.283 9.697 12 16.414l6.717-6.717z"/>
     </g>
-</svg>
+</g></svg>
index af20a07..e9ddf2c 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="external">
         <path id="box" d="M4 4h6v2H6v12h12v-4h2v6H4z"/>
         <path id="arrow" d="M12.42 4H20v7.58l-2.84-2.846L12.892 13 11 11.106l4.264-4.266z"/>
     </g>
-</svg>
+</g></svg>
index 6688713..dcc2962 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="external">
         <path id="box" d="M4 4h6v2H6v12h12v-4h2v6H4z"/>
         <path id="arrow" d="M12.42 4H20v7.58l-2.84-2.846L12.892 13 11 11.106l4.264-4.266z"/>
     </g>
-</svg>
+</g></svg>
index 754374a..59cd0aa 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="external">
         <path id="box" d="M20 4h-6v2h4v12H6v-4H4v6h16z"/>
         <path id="arrow" d="M11.58 4H4v7.58l2.84-2.846L11.108 13 13 11.106 8.736 6.84z"/>
     </g>
-</svg>
+</g></svg>
index 440fbd2..8d0cd25 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="external">
         <path id="box" d="M20 4h-6v2h4v12H6v-4H4v6h16z"/>
         <path id="arrow" d="M11.58 4H4v7.58l2.84-2.846L11.108 13 13 11.106 8.736 6.84z"/>
     </g>
-</svg>
+</g></svg>
index b456478..4e11ebc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.png differ
index 3a63516..158860e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
+</g></svg>
index 383c78e..94524c0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.png differ
index a9b1dde..ae45685 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
+</g></svg>
index 62c82c0..eb5f963 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.png differ
index 343e9cf..cec85d0 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
 </svg>
index e070981..7e1567d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19.4 12.7c.7-.8 1.2-1.7 1.4-2.7h-1.6c-.9 2.5-3.9 4.4-7.7 4.6h-.1c-3.7-.2-6.8-2.1-7.7-4.6H2.2c.2 1 .8 1.9 1.4 2.7l-2 2 .7.7 2-2c.8.6 1.7 1.2 2.7 1.7l-1 2.8.9.3 1-2.8c1 .3 2 .6 3.1.6v3h1v-3c1.1-.1 2.2-.3 3.1-.6l1 2.8.9-.3-1-2.8c1-.4 1.9-1 2.6-1.7l2 2 .7-.7-1.9-2z"/>
-</svg>
+</g></svg>
index 4515bdb..5d0d44d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19.4 12.7c.7-.8 1.2-1.7 1.4-2.7h-1.6c-.9 2.5-3.9 4.4-7.7 4.6h-.1c-3.7-.2-6.8-2.1-7.7-4.6H2.2c.2 1 .8 1.9 1.4 2.7l-2 2 .7.7 2-2c.8.6 1.7 1.2 2.7 1.7l-1 2.8.9.3 1-2.8c1 .3 2 .6 3.1.6v3h1v-3c1.1-.1 2.2-.3 3.1-.6l1 2.8.9-.3-1-2.8c1-.4 1.9-1 2.6-1.7l2 2 .7-.7-1.9-2z"/>
-</svg>
+</g></svg>
index 5df95e9..928e954 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="find">
         <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.37c.19.19.534.15.78-.096s.315-.59.126-.78l-2.37-2.377-.185-.094a3.545 3.545 0 0 0 .655-2.03c0-1.92-1.55-3.47-3.47-3.47zm0 1.656a1.8 1.8 0 0 1 1.813 1.813 1.83 1.83 0 0 1-1.82 1.84c-1.01 0-1.844-.83-1.844-1.847s.832-1.814 1.844-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53a4.443 4.443 0 0 1 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
-</svg>
+</g></svg>
index b13bef8..65fc298 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="find">
         <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.37c.19.19.534.15.78-.096s.315-.59.126-.78l-2.37-2.377-.185-.094a3.545 3.545 0 0 0 .655-2.03c0-1.92-1.55-3.47-3.47-3.47zm0 1.656a1.8 1.8 0 0 1 1.813 1.813 1.83 1.83 0 0 1-1.82 1.84c-1.01 0-1.844-.83-1.844-1.847s.832-1.814 1.844-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53a4.443 4.443 0 0 1 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
-</svg>
+</g></svg>
index 6277016..612c1dc 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="find">
         <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.37c-.19.19-.534.15-.78-.096s-.315-.59-.126-.78l2.37-2.377.185-.094a3.545 3.545 0 0 1-.655-2.03c0-1.92 1.55-3.47 3.47-3.47zm0 1.656A1.8 1.8 0 0 0 9.53 14.47c0 1.01.806 1.84 1.818 1.84 1.01 0 1.844-.83 1.844-1.845s-.832-1.814-1.844-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53a4.443 4.443 0 0 0-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
-</svg>
+</g></svg>
index 6e21dcc..f18e0ad 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="find">
         <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.37c-.19.19-.534.15-.78-.096s-.315-.59-.126-.78l2.37-2.377.185-.094a3.545 3.545 0 0 1-.655-2.03c0-1.92 1.55-3.47 3.47-3.47zm0 1.656A1.8 1.8 0 0 0 9.53 14.47c0 1.01.806 1.84 1.818 1.84 1.01 0 1.844-.83 1.844-1.845s-.832-1.814-1.844-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53a4.443 4.443 0 0 0-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
-</svg>
+</g></svg>
index 659d524..f6c2213 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 6.5V5c-1.4-1.5-5.2-1.2-6 0V4H7v15h1v-7c.8-.8 3.4-.9 5-.5V13c1.2 1.5 4.3 1.2 5 0V6c-.7.7-2.7.9-4 .5z"/>
-</svg>
+</g></svg>
index 0d94ea8..c1f681a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 6.5V5c-1.4-1.5-5.2-1.2-6 0V4H7v15h1v-7c.8-.8 3.4-.9 5-.5V13c1.2 1.5 4.3 1.2 5 0V6c-.7.7-2.7.9-4 .5z"/>
-</svg>
+</g></svg>
index bc0df6c..ce147ec 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
        <path d="M10.3 7.5V6c1.4-1.5 5.2-1.2 6 0V5h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V14c-1.2 1.5-4.3 1.2-5 0V7c.7.7 2.7.9 4 .5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
index 1c0e572..661f234 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
        <path d="M10.3 7.5V6c1.4-1.5 5.2-1.2 6 0V5h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V14c-1.2 1.5-4.3 1.2-5 0V7c.7.7 2.7.9 4 .5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png
deleted file mode 100644 (file)
index 8338017..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.svg
deleted file mode 100644 (file)
index c73d23f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png
deleted file mode 100644 (file)
index bf1a6e0..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.svg
deleted file mode 100644 (file)
index 16b6d3a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png
deleted file mode 100644 (file)
index 780cb87..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.svg
deleted file mode 100644 (file)
index 4bbd61c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png
deleted file mode 100644 (file)
index 4f9c3ad..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.svg
deleted file mode 100644 (file)
index 440390e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png
deleted file mode 100644 (file)
index 4abe9c8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.svg
deleted file mode 100644 (file)
index 7f45734..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png
deleted file mode 100644 (file)
index fa3696a..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.svg
deleted file mode 100644 (file)
index 5d94425..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
index 641d37b..4c6d402 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M2 5v15h20V5H2zm15 11H8c-.6 0-1-.4-1-1V9h3l2 1h5v6z"/>
-</svg>
+</g></svg>
index af577c6..e1f8be3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M2 5v15h20V5H2zm15 11H8c-.6 0-1-.4-1-1V9h3l2 1h5v6z"/>
-</svg>
+</g></svg>
index 1f27fdb..d2bfb08 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M22 5v15H2V5h20zM7 16h9c.6 0 1-.4 1-1V9h-3l-2 1H7v6z"/>
-</svg>
+</g></svg>
index 30e27f9..ba0eb3b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M22 5v15H2V5h20zM7 16h9c.6 0 1-.4 1-1V9h-3l-2 1H7v6z"/>
-</svg>
+</g></svg>
index 3012dd9..588bef0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
     <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
-</svg>
+</g></svg>
index 53adc94..a9a0aa0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
     <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
-</svg>
+</g></svg>
index 82156c4..cffafb7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
-</svg>
+</g></svg>
index 646c6c2..9ef43f0 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
-</svg>
+</g></svg>
index 94f0385..64a71fa 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z"/>
-</svg>
+</g></svg>
index 0e016df..b44b385 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z"/>
-</svg>
+</g></svg>
index 95b83c2..82f466e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M11.4 5.4V2.2c.3 0 .6.1.9.4.3.3.4.5.4.8v2h-1.3zm-5.2-.5c.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-.4-.3-.3-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9.3-.3.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8 0-.3.1-.6.3-.8zM12 7c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm-3 4c0-1.7 1.3-3 3-3v6c-1.7 0-3-1.3-3-3z"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png
new file mode 100644 (file)
index 0000000..57dfe53
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.svg
new file mode 100644 (file)
index 0000000..dbdacc6
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png
new file mode 100644 (file)
index 0000000..f28e35d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.svg
new file mode 100644 (file)
index 0000000..febf500
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png
new file mode 100644 (file)
index 0000000..57dfe53
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..dbdacc6
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png
new file mode 100644 (file)
index 0000000..d52a908
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.svg
new file mode 100644 (file)
index 0000000..cfb17d8
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png
new file mode 100644 (file)
index 0000000..d24672a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.svg
new file mode 100644 (file)
index 0000000..2f45816
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png
new file mode 100644 (file)
index 0000000..c9429ae
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.svg
new file mode 100644 (file)
index 0000000..11b99df
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png
new file mode 100644 (file)
index 0000000..d24672a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..2f45816
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png
new file mode 100644 (file)
index 0000000..4991b65
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.svg
new file mode 100644 (file)
index 0000000..c649b50
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</svg>
index 817b768..1607feb 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 6fbe267..816e672 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 385bb7b..7e0a658 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="help">
         <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.92 9.916 9.92 5.48 0 9.92-4.44 9.92-9.913 0-5.477-4.44-9.915-9.913-9.915zm.002 18a8.084 8.084 0 1 1 0-16.168 8.084 8.084 0 0 1 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M11 16h2v2h-2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 863d202..8a2e3ca 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="help">
         <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.92 9.916 9.92 5.48 0 9.92-4.44 9.92-9.913 0-5.477-4.44-9.915-9.913-9.915zm.002 18a8.084 8.084 0 1 1 0-16.168 8.084 8.084 0 0 1 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M11 16h2v2h-2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 9c6c365..2d78cb8 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="help">
         <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.92-9.916 9.92-5.48 0-9.92-4.44-9.92-9.913 0-5.477 4.44-9.915 9.913-9.915zm-.002 18a8.084 8.084 0 1 0 0-16.168 8.084 8.084 0 0 0 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M13 16h-2v2h2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 9dd7edf..878c72c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="help">
         <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.92-9.916 9.92-5.48 0-9.92-4.44-9.92-9.913 0-5.477 4.44-9.915 9.913-9.915zm-.002 18a8.084 8.084 0 1 0 0-16.168 8.084 8.084 0 0 0 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M13 16h-2v2h2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 900a565..fa0a150 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="history">
         <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.56 1.702-6.56s-4.35 5.364-4.877 6.7c-.463 1.168 1.46 2.21 2.346 1.678 1.9.55 4.834 1.244 4.834 1.244z"/>
         <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12a9.86 9.86 0 0 0 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616A7.982 7.982 0 0 1 4.004 12a8.084 8.084 0 0 1 16.167.004 8.08 8.08 0 0 1-8.08 8.085 7.975 7.975 0 0 1-3.21-.68L8.05 21.04a9.81 9.81 0 0 0 4.045.874C17.563 21.914 22 17.476 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
-</svg>
+</g></svg>
index 29f0c89..bd26dfb 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="history">
         <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.56 1.702-6.56s-4.35 5.364-4.877 6.7c-.463 1.168 1.46 2.21 2.346 1.678 1.9.55 4.834 1.244 4.834 1.244z"/>
         <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12a9.86 9.86 0 0 0 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616A7.982 7.982 0 0 1 4.004 12a8.084 8.084 0 0 1 16.167.004 8.08 8.08 0 0 1-8.08 8.085 7.975 7.975 0 0 1-3.21-.68L8.05 21.04a9.81 9.81 0 0 0 4.045.874C17.563 21.914 22 17.476 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
-</svg>
+</g></svg>
index 784b183..04354ce 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="image">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-11v13H4V6z"/>
     </g>
-</svg>
+</g></svg>
index ed5c051..252099f 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="image">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-11v13H4V6z"/>
     </g>
-</svg>
+</g></svg>
index 226690e..875fe66 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="image">
         <path id="mountains" d="M6 17l3-3 2 1 3-3 4 5zM4 6v13h16V6z"/>
     </g>
-</svg>
+</g></svg>
index e506ea5..d015e8b 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="image">
         <path id="mountains" d="M6 17l3-3 2 1 3-3 4 5zM4 6v13h16V6z"/>
     </g>
-</svg>
+</g></svg>
index 3a883bc..78c40b3 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M16 17l-3-3-2 1-3-3-4 5zm-1-8v4h3v6H2V6h9v3z"/>
         <path id="add" d="M22 6h-4V2h-2v4h-4v2h4v4h2V8h4z"/>
     </g>
-</svg>
+</g></svg>
index 47878dc..b898956 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M16 17l-3-3-2 1-3-3-4 5zm-1-8v4h3v6H2V6h9v3z"/>
         <path id="add" d="M22 6h-4V2h-2v4h-4v2h4v4h2V8h4z"/>
     </g>
-</svg>
+</g></svg>
index e1afd33..e76b43f 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M8 17l3-3 2 1 3-3 4 5zm1-8v4H6v6h16V6h-9v3z"/>
         <path id="add" d="M2 6h4V2h2v4h4v2H8v4H6V8H2z"/>
     </g>
-</svg>
+</g></svg>
index 089da6a..61e2ed4 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M8 17l3-3 2 1 3-3 4 5zm1-8v4H6v6h16V6h-9v3z"/>
         <path id="add" d="M2 6h4V2h2v4h4v2H8v4H6V8H2z"/>
     </g>
-</svg>
+</g></svg>
index e0022a5..c2d3d8a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M2 4v14h2V6h15V4H2zm3 3v13h16V7H5zm6 6l3 3 2-1 3 3H7l4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index d0bc4ad..4029c27 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M2 4v14h2V6h15V4H2zm3 3v13h16V7H5zm6 6l3 3 2-1 3 3H7l4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index 8769498..b32a86a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 4v14h-2V6H4V4h17zm-3 3v13H2V7h16zm-6 6l-3 3-2-1-3 3h12l-4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index ccba6ea..21f4a80 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 4v14h-2V6H4V4h17zm-3 3v13H2V7h16zm-6 6l-3 3-2-1-3 3h12l-4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index 74f8e58..b726d4b 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-5v7H4V6h8v6z"/>
         <path id="lock" d="M18.5 5h-3V4s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM20 5V4s0-3-3-3-3 3-3 3v1h-1v6h8V5z"/>
     </g>
-</svg>
+</g></svg>
index 635dd52..e726c03 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-5v7H4V6h8v6z"/>
         <path id="lock" d="M18.5 5h-3V4s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM20 5V4s0-3-3-3-3 3-3 3v1h-1v6h8V5z"/>
     </g>
-</svg>
+</g></svg>
index faf34b9..c92cd7f 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M7 17l3-3 2 1 3-3 4 5zm-2-5v7h16V6h-8v6z"/>
         <path id="lock" d="M6.5 5h3V4s0-1.5-1.5-1.5C6.5 2.56 6.5 4 6.5 4zM5 5V4s0-3 3-3 3 3 3 3v1h1v6H4V5z"/>
     </g>
-</svg>
+</g></svg>
index dd65b62..8381443 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M7 17l3-3 2 1 3-3 4 5zm-2-5v7h16V6h-8v6z"/>
         <path id="lock" d="M6.5 5h3V4s0-1.5-1.5-1.5C6.5 2.56 6.5 4 6.5 4zM5 5V4s0-3 3-3 3 3 3 3v1h1v6H4V5z"/>
     </g>
-</svg>
+</g></svg>
index 589187a..04768db 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 8v8l5-4-5-4z"/>
-</svg>
+</g></svg>
index f5e9b04..2734879 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 8v8l5-4-5-4z"/>
-</svg>
+</g></svg>
index 544bbb3..c70f991 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zM21 8v8l-5-4 5-4z"/>
-</svg>
+</g></svg>
index 1509cd5..992ed82 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zM21 8v8l-5-4 5-4z"/>
-</svg>
+</g></svg>
index c80da91..f3519f3 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="info">
         <path id="circled-i" d="M11.5 17a5.5 5.5 0 1 1 0-11 5.5 5.5 0 0 1 0 11zm0-12a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zm.5 5v4h1v1h-3v-1h1v-3h-1v-1zm-1-2h1v1h-1z"/>
     </g>
-</svg>
+</g></svg>
index 648386e..1e2ecf8 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="info">
         <path id="circled-i" d="M11.5 17a5.5 5.5 0 1 1 0-11 5.5 5.5 0 0 1 0 11zm0-12a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zm.5 5v4h1v1h-3v-1h1v-3h-1v-1zm-1-2h1v1h-1z"/>
     </g>
-</svg>
+</g></svg>
index f274352..7a52242 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-a">
         <path id="a" d="M14.667 6h-1.372l-7 12H8l2.333-4h4L15 18h1.667l-2-12zm-3.75 7l2.527-4.333.723 4.333h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index 3ac0de6..2431aeb 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-a">
         <path id="a" d="M14.667 6h-1.372l-7 12H8l2.333-4h4L15 18h1.667l-2-12zm-3.75 7l2.527-4.333.723 4.333h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index 20bca5e..4d68c38 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-arab-keheh-jeem">
         <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.77.712-.87 1.125a1.26 1.26 0 0 0 .065.78c.19.406.54.575.844.814l.093-.12.53.627c.14.165.345.514.47.94.138.462.08.724 0 1.124h-3.44c-.34 0-.592.007-.766-.02-.34-.053-.256-.21-.234-.34.33-.127.56-.173.934-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.046-.698-.185-1.094-.155-.36.026-.77.24-1.03.72-.25.447-.436.838-.66 1.28l.75-.47c.23-.14.486-.226.72-.218.158.004.276.053.407.093-.234.204-.51.4-.72.56-.3.26-.704.69-.908 1-.403.617-.694 1.086-.875 1.78-.18.69.003 1.34.468 1.75.426.38.846.52 1.28.566.65.064 1.206.092 2-.19.658-.23 1.022-.552 1.5-.97-.882.11-1.816.09-2.53.033-.87-.07-1.268-.386-1.47-.596-.27-.283-.306-.64-.155-1.22a1.44 1.44 0 0 1 .25-.53c.17-.228.363-.435.593-.656.45-.436 1.01-.737 1.46-.94-.042.207-.104.444-.052.69.05.23.25.38.44.47.26.12.506.152.69.153 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.343-.845.13-.5.094-1.062-.094-1.625a4.812 4.812 0 0 0-.72-1.406c-.336-.444-.675-.83-1-1.22 1.256-.815 2.715-1.24 3.97-1.688.12-.452.222-.926.31-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .38.286.75.556 1.1.813.336-.303.627-.674.876-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
-</svg>
+</g></svg>
index eb04c40..8c23b30 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-arab-keheh-jeem">
         <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.77.712-.87 1.125a1.26 1.26 0 0 0 .065.78c.19.406.54.575.844.814l.093-.12.53.627c.14.165.345.514.47.94.138.462.08.724 0 1.124h-3.44c-.34 0-.592.007-.766-.02-.34-.053-.256-.21-.234-.34.33-.127.56-.173.934-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.046-.698-.185-1.094-.155-.36.026-.77.24-1.03.72-.25.447-.436.838-.66 1.28l.75-.47c.23-.14.486-.226.72-.218.158.004.276.053.407.093-.234.204-.51.4-.72.56-.3.26-.704.69-.908 1-.403.617-.694 1.086-.875 1.78-.18.69.003 1.34.468 1.75.426.38.846.52 1.28.566.65.064 1.206.092 2-.19.658-.23 1.022-.552 1.5-.97-.882.11-1.816.09-2.53.033-.87-.07-1.268-.386-1.47-.596-.27-.283-.306-.64-.155-1.22a1.44 1.44 0 0 1 .25-.53c.17-.228.363-.435.593-.656.45-.436 1.01-.737 1.46-.94-.042.207-.104.444-.052.69.05.23.25.38.44.47.26.12.506.152.69.153 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.343-.845.13-.5.094-1.062-.094-1.625a4.812 4.812 0 0 0-.72-1.406c-.336-.444-.675-.83-1-1.22 1.256-.815 2.715-1.24 3.97-1.688.12-.452.222-.926.31-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .38.286.75.556 1.1.813.336-.303.627-.674.876-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
-</svg>
+</g></svg>
index ecc636f..799a785 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-arab-meem">
         <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627a8.31 8.31 0 0 1-1.082 1.833c-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.42-.638.692-.98a24.1 24.1 0 0 1 .94-1.09c.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.765-.293l.065-.128c.01-.11-.01-.24-.052-.394a2.403 2.403 0 0 0-.232-.522c-.22-.428-.438-.64-.654-.64-.294 0-.915.268-1.864.805-.36.208-.378.125-.05-.247 1.555-1.71 2.705-2.566 3.45-2.566.38 0 .67.13.86.394.134.195.25.6.343 1.21l.202 1.2c.105.586.24.895.408.925"/>
     </g>
-</svg>
+</g></svg>
index 5742238..b22bd45 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-arab-meem">
         <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627a8.31 8.31 0 0 1-1.082 1.833c-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.42-.638.692-.98a24.1 24.1 0 0 1 .94-1.09c.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.765-.293l.065-.128c.01-.11-.01-.24-.052-.394a2.403 2.403 0 0 0-.232-.522c-.22-.428-.438-.64-.654-.64-.294 0-.915.268-1.864.805-.36.208-.378.125-.05-.247 1.555-1.71 2.705-2.566 3.45-2.566.38 0 .67.13.86.394.134.195.25.6.343 1.21l.202 1.2c.105.586.24.895.408.925"/>
     </g>
-</svg>
+</g></svg>
index 38c45d5..6b56e37 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-armn-sha">
         <path id="armn-sha" d="M11.564 7.678a3.073 3.073 0 0 0-.93-.268c-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.33 1.67-2.625-1.165a1.867 1.867 0 0 0-.433-.134 2.45 2.45 0 0 0-.576-.06 4.88 4.88 0 0 0-1.663.28c-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283a5.48 5.48 0 0 0-.63 1.71c-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.044-.08 1.48-.236a3.488 3.488 0 0 0 1.135-.66c.325-.29.59-.634.795-1.034.21-.4.363-.84.458-1.322l.11-.56h1.6l-.12.59a5.925 5.925 0 0 1-.676 1.844 5.19 5.19 0 0 1-1.214 1.423c-.488.395-1.053.7-1.694.923a6.573 6.573 0 0 1-2.106.324c-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.437-.573-.97-.678-1.608-.105-.64-.078-1.366.08-2.186.125-.66.346-1.274.66-1.836A6.332 6.332 0 0 1 8.792 9.54a5.955 5.955 0 0 1 1.496-1.072 5.87 5.87 0 0 1 1.732-.57l-.465-.23"/>
     </g>
-</svg>
+</g></svg>
index c2d580e..50ee046 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-armn-sha">
         <path id="armn-sha" d="M11.564 7.678a3.073 3.073 0 0 0-.93-.268c-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.33 1.67-2.625-1.165a1.867 1.867 0 0 0-.433-.134 2.45 2.45 0 0 0-.576-.06 4.88 4.88 0 0 0-1.663.28c-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283a5.48 5.48 0 0 0-.63 1.71c-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.044-.08 1.48-.236a3.488 3.488 0 0 0 1.135-.66c.325-.29.59-.634.795-1.034.21-.4.363-.84.458-1.322l.11-.56h1.6l-.12.59a5.925 5.925 0 0 1-.676 1.844 5.19 5.19 0 0 1-1.214 1.423c-.488.395-1.053.7-1.694.923a6.573 6.573 0 0 1-2.106.324c-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.437-.573-.97-.678-1.608-.105-.64-.078-1.366.08-2.186.125-.66.346-1.274.66-1.836A6.332 6.332 0 0 1 8.792 9.54a5.955 5.955 0 0 1 1.496-1.072 5.87 5.87 0 0 1 1.732-.57l-.465-.23"/>
     </g>
-</svg>
+</g></svg>
index 882af04..01afe88 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-c">
         <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04a4.835 4.835 0 0 1-3.015 1.03c-1.36 0-2.438-.43-3.237-1.29C7.4 15.85 7 14.618 7 13.012c0-2.09.606-3.817 1.817-5.184C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.42-1.05-.63-1.78-.63-1.368 0-2.475.63-3.32 1.89-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.78 0 1.48-.26 2.1-.785.63-.52 1.08-1.26 1.37-2.216"/>
     </g>
-</svg>
+</g></svg>
index 29da4c6..03aa494 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-c">
         <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04a4.835 4.835 0 0 1-3.015 1.03c-1.36 0-2.438-.43-3.237-1.29C7.4 15.85 7 14.618 7 13.012c0-2.09.606-3.817 1.817-5.184C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.42-1.05-.63-1.78-.63-1.368 0-2.475.63-3.32 1.89-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.78 0 1.48-.26 2.1-.785.63-.52 1.08-1.26 1.37-2.216"/>
     </g>
-</svg>
+</g></svg>
index 1c305e3..dcd0d94 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-d">
         <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.5.063 1.95.188.642.17 1.192.472 1.65.91.454.43.8.97 1.03 1.62.23.65.344 1.378.344 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.946 1.072-1.455 1.416-.504.33-1.1.582-1.794.75-.525.122-1.17.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.24a3.26 3.26 0 0 0 1.05-.436 4.19 4.19 0 0 0 1.04-.975 6.652 6.652 0 0 0 .975-1.825c.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.522-.755-.87-1.27-1.04-.38-.124-.974-.186-1.78-.186H11L9.095 16.64"/>
     </g>
-</svg>
+</g></svg>
index e995e48..ff61b37 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-d">
         <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.5.063 1.95.188.642.17 1.192.472 1.65.91.454.43.8.97 1.03 1.62.23.65.344 1.378.344 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.946 1.072-1.455 1.416-.504.33-1.1.582-1.794.75-.525.122-1.17.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.24a3.26 3.26 0 0 0 1.05-.436 4.19 4.19 0 0 0 1.04-.975 6.652 6.652 0 0 0 .975-1.825c.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.522-.755-.87-1.27-1.04-.38-.124-.974-.186-1.78-.186H11L9.095 16.64"/>
     </g>
-</svg>
+</g></svg>
index 21d3dc7..f91db71 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-e">
         <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74l-.88 4.273h7.44L16.018 18H7"/>
     </g>
-</svg>
+</g></svg>
index 351d968..c5ca7b1 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-e">
         <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74l-.88 4.273h7.44L16.018 18H7"/>
     </g>
-</svg>
+</g></svg>
index 5b57252..fea68a5 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-geor-kan">
         <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.62c-.055.26-.083.497-.083.71 0 .97.52 1.46 1.564 1.46 1.31 0 2.108-.724 2.39-2.17l.058-.33a3.17 3.17 0 0 0 .066-.615c0-.927-.546-1.39-1.64-1.39H10.87l.247-1.26h1.118c1.203-.004 1.91-.55 2.12-1.64.04-.18.057-.355.057-.52 0-1.144-.9-1.715-2.696-1.715L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
     </g>
-</svg>
+</g></svg>
index a9ee28c..bacc38c 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-geor-kan">
         <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.62c-.055.26-.083.497-.083.71 0 .97.52 1.46 1.564 1.46 1.31 0 2.108-.724 2.39-2.17l.058-.33a3.17 3.17 0 0 0 .066-.615c0-.927-.546-1.39-1.64-1.39H10.87l.247-1.26h1.118c1.203-.004 1.91-.55 2.12-1.64.04-.18.057-.355.057-.52 0-1.144-.9-1.715-2.696-1.715L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
     </g>
-</svg>
+</g></svg>
index ddb927e..3919051 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-i">
         <path id="i" d="M12.5 18l.25-.995h-1.5l2.508-10.037h1.5L15.5 6h-5l-.242.968h1.5l-2.51 10.037h-1.5L7.5 18z"/>
     </g>
-</svg>
+</g></svg>
index 0ae89f9..f71f6f7 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-i">
         <path id="i" d="M12.5 18l.25-.995h-1.5l2.508-10.037h1.5L15.5 6h-5l-.242.968h1.5l-2.51 10.037h-1.5L7.5 18z"/>
     </g>
-</svg>
+</g></svg>
index 2bdddd5..b6e87b4 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-k">
         <path id="k" d="M12.018 10.652L17 6h-2l-5.31 5.234L11 6H9.5l-3 12H8l1.173-4.693 1.54-1.438C11 16 14 18 14 18h2s-4-2-3.982-7.348z"/>
     </g>
-</svg>
+</g></svg>
index 778b92c..7494e8f 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-k">
         <path id="k" d="M12.018 10.652L17 6h-2l-5.31 5.234L11 6H9.5l-3 12H8l1.173-4.693 1.54-1.438C11 16 14 18 14 18h2s-4-2-3.982-7.348z"/>
     </g>
-</svg>
+</g></svg>
index 1d48f72..ed2fe67 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-s">
         <path id="s" d="M16.474 6.59l-.302 1.525a7.36 7.36 0 0 0-1.557-.628 5.432 5.432 0 0 0-1.487-.217c-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.65.302.86.207.19.733.4 1.58.63l.937.23c1.06.274 1.795.622 2.208 1.046.413.42.62 1.007.62 1.766 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.3-1.867-.55l.31-1.61a7.613 7.613 0 0 0 1.72.805c.58.18 1.155.27 1.73.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.465-.12-.816-.354-1.054-.233-.242-.737-.46-1.512-.657l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.368-.584-.88-.584-1.535 0-1.152.442-2.094 1.325-2.828.89-.74 2.043-1.108 3.463-1.108.555 0 1.1.05 1.644.146.542.1 1.085.245 1.627.442"/>
     </g>
-</svg>
+</g></svg>
index 901d0e7..0eeeb50 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-s">
         <path id="s" d="M16.474 6.59l-.302 1.525a7.36 7.36 0 0 0-1.557-.628 5.432 5.432 0 0 0-1.487-.217c-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.65.302.86.207.19.733.4 1.58.63l.937.23c1.06.274 1.795.622 2.208 1.046.413.42.62 1.007.62 1.766 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.3-1.867-.55l.31-1.61a7.613 7.613 0 0 0 1.72.805c.58.18 1.155.27 1.73.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.465-.12-.816-.354-1.054-.233-.242-.737-.46-1.512-.657l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.368-.584-.88-.584-1.535 0-1.152.442-2.094 1.325-2.828.89-.74 2.043-1.108 3.463-1.108.555 0 1.1.05 1.644.146.542.1 1.085.245 1.627.442"/>
     </g>
-</svg>
+</g></svg>
index d9eb01e..e04818f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 5375d92..0232e22 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index bd7ba07..3487511 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index e93ed43..f2eb554 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index fa77f37..4b00ee7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 7ba0a1a..e079ac6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 2a03797..1777cec 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 308c9c0..d070568 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index b206787..2230bf5 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index b17e024..25f22c7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index d1799f9..df9d39d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 48fb71c..1cff12c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 4a36a34..9b8523f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="A">
         <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
         <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
-</svg>
+</g></svg>
index 4a3893b..1adc6aa 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="A">
         <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
         <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
-</svg>
+</g></svg>
index 152a252..3ceea08 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="A">
         <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
         <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
-</svg>
+</g></svg>
index 3b11ea9..050fe1e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="A">
         <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
         <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
-</svg>
+</g></svg>
index f6e3d8e..491adb5 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M20.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
-</svg>
+</g></svg>
index 264811b..b91b35c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.png differ
index f6e3d8e..4842411 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
-    <path d="M20.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
+    <path d="M3.4 20h8.1v-.8c-.4 0-.8-.1-1.3-.2s-.8-.2-.8-.4v-.2c0-.1 0-.2.1-.3l1.3-3.1h5.1c.1.3.2.6.4 1 .1.4.3.7.4 1 .1.4.2.7.2.8v.4c0 .2-.2.4-.5.6-.3.2-.9.3-1.7.3v.9h6.1v-.8c-.2 0-.5-.1-.8-.1-.3-.1-.5-.1-.7-.2-.3-.2-.5-.4-.7-.6-.2-.3-.4-.6-.5-.9-.8-2-1.6-3.9-2.4-5.9-.8-2-1.7-4.1-2.7-6.5h-2.1c-1.4 3.3-2.4 6-3.2 7.9-.8 1.9-1.4 3.6-2 4.8l-.3.6c-.1.2-.3.3-.6.5-.2.1-.4.2-.7.3-.3.1-.5.1-.7.1v.8zm7.8-6l2.1-5.3 2.1 5.3h-4.2z"/>
+</g></svg>
index 4b6d298..77d7796 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.png differ
index 4b01d74..6ac62dc 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M20.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
+    <path d="M3.4 20h8.1v-.8c-.4 0-.8-.1-1.3-.2s-.8-.2-.8-.4v-.2c0-.1 0-.2.1-.3l1.3-3.1h5.1c.1.3.2.6.4 1 .1.4.3.7.4 1 .1.4.2.7.2.8v.4c0 .2-.2.4-.5.6-.3.2-.9.3-1.7.3v.9h6.1v-.8c-.2 0-.5-.1-.8-.1-.3-.1-.5-.1-.7-.2-.3-.2-.5-.4-.7-.6-.2-.3-.4-.6-.5-.9-.8-2-1.6-3.9-2.4-5.9-.8-2-1.7-4.1-2.7-6.5h-2.1c-1.4 3.3-2.4 6-3.2 7.9-.8 1.9-1.4 3.6-2 4.8l-.3.6c-.1.2-.3.3-.6.5-.2.1-.4.2-.7.3-.3.1-.5.1-.7.1v.8zm7.8-6l2.1-5.3 2.1 5.3h-4.2z"/>
 </svg>
index c75fed3..a12fc5a 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="layout-ltr">
         <path id="text" d="M5 19V5h6v8h8v6H5z"/>
         <path id="float" d="M13 5v6h6V5h-6zm5 5h-4V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index a2bd2eb..8243e34 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="layout-ltr">
         <path id="text" d="M5 19V5h6v8h8v6H5z"/>
         <path id="float" d="M13 5v6h6V5h-6zm5 5h-4V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index 9229671..165c996 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="layout-rtl">
         <path id="text" d="M5 19v-6h8V5h6v14H5z"/>
         <path id="float" d="M5 5v6h6V5H5zm1 1h4v4H6V6z"/>
     </g>
-</svg>
+</g></svg>
index eaad0a0..db1081c 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="layout-rtl">
         <path id="text" d="M5 19v-6h8V5h6v14H5z"/>
         <path id="float" d="M5 5v6h6V5H5zm1 1h4v4H6V6z"/>
     </g>
-</svg>
+</g></svg>
index d5a69c0..7c36535 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15.387 4.33c-2.1 0-3.6 1.9-5.1 3.3.2 0 .5-.1.8-.1.5 0 1 .1 1.5.3.8-.8 1.6-1.7 2.8-1.7.6 0 1.3.3 1.8.7 1 1 1 2.6 0 3.6l-2.6 2.6c-.4.4-1.2.7-1.8.7-1.4 0-2.1-.9-2.6-2l-1.3 1.3c.8 1.5 2 2.6 3.8 2.6 1.2 0 2.3-.5 3-1.3l2.6-2.6c.9-.9 1.5-2 1.5-3.3-.2-2.2-2.2-4.1-4.4-4.1zm-4.3 12.1l-.9.9c-.4.4-1.2.7-1.8.7-.6 0-1.3-.3-1.8-.7-1-1-1-2.7 0-3.6l2.6-2.6c.4-.4 1.2-.7 1.8-.7 1.4 0 2.1 1 2.6 2l1.3-1.3c-.8-1.5-2-2.6-3.8-2.6-1.2 0-2.3.5-3 1.3l-2.6 2.6c-1.7 1.7-1.7 4.4 0 6 1.6 1.6 4.4 1.7 5.9 0l1.9-1.9c-.3.1-.6.1-.9.1-.5 0-.9 0-1.3-.2z"/>
-</svg>
+</g></svg>
index c62fcca..22228cd 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15.387 4.33c-2.1 0-3.6 1.9-5.1 3.3.2 0 .5-.1.8-.1.5 0 1 .1 1.5.3.8-.8 1.6-1.7 2.8-1.7.6 0 1.3.3 1.8.7 1 1 1 2.6 0 3.6l-2.6 2.6c-.4.4-1.2.7-1.8.7-1.4 0-2.1-.9-2.6-2l-1.3 1.3c.8 1.5 2 2.6 3.8 2.6 1.2 0 2.3-.5 3-1.3l2.6-2.6c.9-.9 1.5-2 1.5-3.3-.2-2.2-2.2-4.1-4.4-4.1zm-4.3 12.1l-.9.9c-.4.4-1.2.7-1.8.7-.6 0-1.3-.3-1.8-.7-1-1-1-2.7 0-3.6l2.6-2.6c.4-.4 1.2-.7 1.8-.7 1.4 0 2.1 1 2.6 2l1.3-1.3c-.8-1.5-2-2.6-3.8-2.6-1.2 0-2.3.5-3 1.3l-2.6 2.6c-1.7 1.7-1.7 4.4 0 6 1.6 1.6 4.4 1.7 5.9 0l1.9-1.9c-.3.1-.6.1-.9.1-.5 0-.9 0-1.3-.2z"/>
-</svg>
+</g></svg>
index 7bb02fa..1ea19e8 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9.025 3.6c2.1 0 3.6 1.9 5.1 3.3-.2 0-.5-.1-.8-.1-.5 0-1 .1-1.5.3-.8-.8-1.6-1.7-2.8-1.7-.6 0-1.3.3-1.8.7-1 1-1 2.6 0 3.6l2.6 2.6c.4.4 1.2.7 1.8.7 1.4 0 2.1-.9 2.6-2l1.3 1.3c-.8 1.5-2 2.6-3.8 2.6-1.2 0-2.3-.5-3-1.3l-2.6-2.6c-.9-.9-1.5-2-1.5-3.3.2-2.2 2.2-4.1 4.4-4.1zm4.3 12.1l.9.9c.4.4 1.2.7 1.8.7.6 0 1.3-.3 1.8-.7 1-1 1-2.7 0-3.6l-2.6-2.6c-.4-.4-1.2-.7-1.8-.7-1.4 0-2.1 1-2.6 2l-1.3-1.3c.8-1.5 2-2.6 3.8-2.6 1.2 0 2.3.5 3 1.3l2.6 2.6c1.7 1.7 1.7 4.4 0 6-1.6 1.6-4.4 1.7-5.9 0l-1.9-1.9c.3.1.6.1.9.1.5 0 .9 0 1.3-.2z"/>
-</svg>
+</g></svg>
index 1d6be90..3af1611 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9.025 3.6c2.1 0 3.6 1.9 5.1 3.3-.2 0-.5-.1-.8-.1-.5 0-1 .1-1.5.3-.8-.8-1.6-1.7-2.8-1.7-.6 0-1.3.3-1.8.7-1 1-1 2.6 0 3.6l2.6 2.6c.4.4 1.2.7 1.8.7 1.4 0 2.1-.9 2.6-2l1.3 1.3c-.8 1.5-2 2.6-3.8 2.6-1.2 0-2.3-.5-3-1.3l-2.6-2.6c-.9-.9-1.5-2-1.5-3.3.2-2.2 2.2-4.1 4.4-4.1zm4.3 12.1l.9.9c.4.4 1.2.7 1.8.7.6 0 1.3-.3 1.8-.7 1-1 1-2.7 0-3.6l-2.6-2.6c-.4-.4-1.2-.7-1.8-.7-1.4 0-2.1 1-2.6 2l-1.3-1.3c.8-1.5 2-2.6 3.8-2.6 1.2 0 2.3.5 3 1.3l2.6 2.6c1.7 1.7 1.7 4.4 0 6-1.6 1.6-4.4 1.7-5.9 0l-1.9-1.9c.3.1.6.1.9.1.5 0 .9 0 1.3-.2z"/>
-</svg>
+</g></svg>
index d63a791..cb63d50 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 7H9V5h12v2zM7 6c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 12c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z"/>
-</svg>
+</g></svg>
index db97e4b..0417a94 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 7H9V5h12v2zM7 6c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 12c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z"/>
-</svg>
+</g></svg>
index 49879fb..081fee4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 7h12V5H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 13h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 19h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2z"/>
-</svg>
+</g></svg>
index 05b4b85..c8610c9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 7h12V5H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 13h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 19h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2z"/>
-</svg>
+</g></svg>
index 0d37861..c752585 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 7H8V5h13v2zm0 6H8v-2h13v2zm0 6H8v-2h13v2zM4 4h2v4H5V5H4zm-1 6V9h3v3H4v1h2v1H3v-3h2v-1zm3 10H3v-1h2v-1H4v-1h1v-1H3v-1h3z"/>
-</svg>
+</g></svg>
index d3328a1..150723f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 7H8V5h13v2zm0 6H8v-2h13v2zm0 6H8v-2h13v2zM4 4h2v4H5V5H4zm-1 6V9h3v3H4v1h2v1H3v-3h2v-1zm3 10H3v-1h2v-1H4v-1h1v-1H3v-1h3z"/>
-</svg>
+</g></svg>
index fff182c..493654d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 7h13V5H3zm0 6h13v-2H3zm0 6h13v-2H3zM18 4h2v4h-1V5h-1zm0 6V9h3v3h-2v1h2v1h-3v-3h2v-1zm3 10h-3v-1h2v-1h-1v-1h1v-1h-2v-1h3z"/>
-</svg>
+</g></svg>
index c4c9396..469f949 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 7h13V5H3zm0 6h13v-2H3zm0 6h13v-2H3zM18 4h2v4h-1V5h-1zm0 6V9h3v3h-2v1h2v1h-3v-3h2v-1zm3 10h-3v-1h2v-1h-1v-1h1v-1h-2v-1h3z"/>
-</svg>
+</g></svg>
index 42311de..e16f042 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-destructive.png differ
index a9900c1..9e4aee0 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z"/>
-</svg>
+</g></svg>
index fa72442..7e11b41 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z"/>
-</svg>
+</g></svg>
index e21e755..a90a981 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z"/>
-</svg>
+</g></svg>
index 72d6a7b..29cd2b5 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-destructive.png differ
index 2811b25..1eea0ed 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z"/>
-</svg>
+</g></svg>
index cfbad71..9396317 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z"/>
-</svg>
+</g></svg>
index afd2e07..6d2fa9c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z"/>
-</svg>
+</g></svg>
index 0d5cc21..da6a634 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
-</svg>
+</g></svg>
index 9e8d1a6..bdf23f4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
-</svg>
+</g></svg>
index 07ef00f..ea35803 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z"/>
-</svg>
+</g></svg>
index 5a8617a..403bfc9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z"/>
-</svg>
+</g></svg>
index da611ba..6d95c87 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 6c-3.9 0-7 3.1-7 7s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7zm0 13c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm-1.7-4.6c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5zm4 0c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5z"/>
-</svg>
+</g></svg>
index c24cba6..ee16220 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 6c-3.9 0-7 3.1-7 7s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7zm0 13c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm-1.7-4.6c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5zm4 0c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5z"/>
-</svg>
+</g></svg>
index 9414378..27513cc 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15.4 7.8c-2-.9-2.3-2.5-2.4-2.8.1.1 2 1 2 1l-3-5-3 5 2-1s0 .8.6 2.1c.8 1.5 2.2 2.2 2.2 2.2s1.6.7 2.2 1.3l-.7.7-.5-.5-.4 1.8 1.8-.4-.5-.5.7-.7c.9 1 1.5 2.3 1.6 3.8h-1V14l-1.5 1 1.5 1v-.8h1c-.1 1.5-.6 2.8-1.6 3.8l-.7-.7.5-.5-1.8-.4.4 1.8.5-.5.7.7c-1 .9-2.3 1.5-3.8 1.6v-1h.8l-1-1.5-1 1.5h.8v1c-1.5-.1-2.8-.6-3.8-1.6l.7-.7.5.5.4-1.8-1.8.4.5.5-.7.7c-.9-1-1.5-2.3-1.6-3.8h1v.8l1.5-1L7 14v.8H6c.1-1.5.6-2.8 1.6-3.8l.7.7-.5.5 1.8.4-.4-1.8-.5.5-.7-.7-1.5-1.4A7.99 7.99 0 0 0 4 15c0 4.4 3.6 8 8 8s8-3.6 8-8c0-3.2-1.9-5.9-4.6-7.2z"/>
     <circle cx="12" cy="15" r="3"/>
-</svg>
+</g></svg>
index 5e89b3d..bb82d1f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15.4 7.8c-2-.9-2.3-2.5-2.4-2.8.1.1 2 1 2 1l-3-5-3 5 2-1s0 .8.6 2.1c.8 1.5 2.2 2.2 2.2 2.2s1.6.7 2.2 1.3l-.7.7-.5-.5-.4 1.8 1.8-.4-.5-.5.7-.7c.9 1 1.5 2.3 1.6 3.8h-1V14l-1.5 1 1.5 1v-.8h1c-.1 1.5-.6 2.8-1.6 3.8l-.7-.7.5-.5-1.8-.4.4 1.8.5-.5.7.7c-1 .9-2.3 1.5-3.8 1.6v-1h.8l-1-1.5-1 1.5h.8v1c-1.5-.1-2.8-.6-3.8-1.6l.7-.7.5.5.4-1.8-1.8.4.5.5-.7.7c-.9-1-1.5-2.3-1.6-3.8h1v.8l1.5-1L7 14v.8H6c.1-1.5.6-2.8 1.6-3.8l.7.7-.5.5 1.8.4-.4-1.8-.5.5-.7-.7-1.5-1.4A7.99 7.99 0 0 0 4 15c0 4.4 3.6 8 8 8s8-3.6 8-8c0-3.2-1.9-5.9-4.6-7.2z"/>
     <circle cx="12" cy="15" r="3"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png
new file mode 100644 (file)
index 0000000..0963538
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.svg
new file mode 100644 (file)
index 0000000..9c4a955
--- /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.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/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png
new file mode 100644 (file)
index 0000000..6afb2bd
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg
new file mode 100644 (file)
index 0000000..594cdfb
--- /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.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/mediawiki/images/icons/logo-wikimediaDiscovery.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.png
new file mode 100644 (file)
index 0000000..6d3c067
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.svg
new file mode 100644 (file)
index 0000000..c3f99d6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
index f7293c8..fb304f6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M22.3 6.3c0 .2 0 .3-.1.3-.7.1-1.2.5-1.6 1.1-.1.2-.2.4-.3.7l-4.6 10.1c-.1.2-.2.3-.2.3s-.1.1-.2.1c-.2 0-.4-.1-.5-.4L12.2 13l-2.8 5.5c-.1.3-.3.4-.5.4s-.4-.1-.5-.4L4.1 8.4c-.3-.8-.6-1.2-.8-1.4-.2-.2-.5-.3-1-.4-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h4.3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.6.1-1 .2-1.1.4-.1.2 0 .6.3 1.2l3.6 8.2h.1l2.2-4.4L10 8.4c-.3-.7-.6-1.2-.8-1.4s-.5-.3-.9-.4c-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h3.6c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.4.1-.6.2-.6.4s.1.6.4 1.2l1 1.9 1-1.9c.3-.6.5-.9.5-1.1 0-.2 0-.3-.1-.4-.1-.1-.3-.1-.5-.1l-.1-.3c0-.2 0-.3.1-.3h3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.5.1-.8.2-1.1.5-.3.3-.6.7-.8 1.3l-1.3 2.8 2.5 5.2h.1l3.7-8.1c.3-.5.3-.9.2-1.2-.1-.3-.5-.4-1.1-.5-.1-.1-.1-.2-.1-.3s0-.3.1-.3h3.7c-.2.1-.2.2-.2.3z"/>
-</svg>
+</g></svg>
index 64d2e28..4c7864b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M22.3 6.3c0 .2 0 .3-.1.3-.7.1-1.2.5-1.6 1.1-.1.2-.2.4-.3.7l-4.6 10.1c-.1.2-.2.3-.2.3s-.1.1-.2.1c-.2 0-.4-.1-.5-.4L12.2 13l-2.8 5.5c-.1.3-.3.4-.5.4s-.4-.1-.5-.4L4.1 8.4c-.3-.8-.6-1.2-.8-1.4-.2-.2-.5-.3-1-.4-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h4.3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.6.1-1 .2-1.1.4-.1.2 0 .6.3 1.2l3.6 8.2h.1l2.2-4.4L10 8.4c-.3-.7-.6-1.2-.8-1.4s-.5-.3-.9-.4c-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h3.6c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.4.1-.6.2-.6.4s.1.6.4 1.2l1 1.9 1-1.9c.3-.6.5-.9.5-1.1 0-.2 0-.3-.1-.4-.1-.1-.3-.1-.5-.1l-.1-.3c0-.2 0-.3.1-.3h3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.5.1-.8.2-1.1.5-.3.3-.6.7-.8 1.3l-1.3 2.8 2.5 5.2h.1l3.7-8.1c.3-.5.3-.9.2-1.2-.1-.3-.5-.4-1.1-.5-.1-.1-.1-.2-.1-.3s0-.3.1-.3h3.7c-.2.1-.2.2-.2.3z"/>
-</svg>
+</g></svg>
index fb772cf..59bb24e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 6L9 4 3 6v15l6-2 6 2 6-2V4l-6 2zM8.7 18.1L4 19.6V6.7L9 5v12.9l-.3.2zm11.3.2L15 20V7.1l.3-.1L20 5.4v12.9z"/>
-</svg>
+</g></svg>
index c148e74..bebac9c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 6L9 4 3 6v15l6-2 6 2 6-2V4l-6 2zM8.7 18.1L4 19.6V6.7L9 5v12.9l-.3.2zm11.3.2L15 20V7.1l.3-.1L20 5.4v12.9z"/>
-</svg>
+</g></svg>
index bfbfe72..06c3d10 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 6l6-2 6 2v15l-6-2-6 2-6-2V4l6 2zm6.3 12.1l4.7 1.5V6.7L15 5v12.9l.3.2zM4 18.3L9 20V7.1L8.7 7 4 5.4v12.9z"/>
-</svg>
+</g></svg>
index e928f61..a969ee6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 6l6-2 6 2v15l-6-2-6 2-6-2V4l6 2zm6.3 12.1l4.7 1.5V6.7L15 5v12.9l.3.2zM4 18.3L9 20V7.1L8.7 7 4 5.4v12.9z"/>
-</svg>
+</g></svg>
index 55a68db..441fe2d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.png differ
index 663913a..a8010f9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 4c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
+</g></svg>
index c1676e6..2e7107d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.png differ
index a9631cc..717b91c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 4c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
+</g></svg>
index 536e77c..ddb1c5c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.png differ
index f1fa246..26fb6b7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 4c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
 </svg>
index 607354c..ee5de90 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.png differ
index 43074af..eb5e624 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4z"/>
-    <path d="M18 11h-1V7.1l-.1-.1H13V5.1c-.3-.1-.7-.1-1-.1-3.9 0-7 3.1-7 7 0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7 0-.3 0-.7-.1-1H18zm-6 5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+  <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
+  <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
+</g></svg>
+
index 2fcf2e1..036a31d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.png differ
index 7dc09d4..3e0ea6c 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4z"/>
-    <path d="M18 11h-1V7.1l-.1-.1H13V5.1c-.3-.1-.7-.1-1-.1-3.9 0-7 3.1-7 7 0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7 0-.3 0-.7-.1-1H18zm-6 5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+  <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
+  <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
+</g></svg>
+
index 88160bc..d8c1691 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.png differ
index d84970f..9d71335 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4z"/>
-    <path d="M18 11h-1V7.1l-.1-.1H13V5.1c-.3-.1-.7-.1-1-.1-3.9 0-7 3.1-7 7 0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7 0-.3 0-.7-.1-1H18zm-6 5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+  <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
+  <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
 </svg>
+
index 6ea8226..934d5cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.png differ
index 6a4af93..a7a14e9 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0z"/>
-    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 5c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
+    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
+</g></svg>
index 56b7924..be7c51e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.png differ
index 8108685..9bcc436 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0z"/>
-    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 5c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
+    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
+</g></svg>
index 20aba25..7cc1f74 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.png differ
index 8f35458..03c484a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0z"/>
-    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 5c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4z"/>
+    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
+    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
 </svg>
index 0fde2c9..cb54763 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="markup">
         <path id="left-bracket" d="M9.665 6.32l-4.259 4.274-1.406 1.406 1.406 1.406 4.259 4.274 1.406-1.438-4.259-4.243 4.259-4.243z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index 891f51d..af2f0ff 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="markup">
         <path id="left-bracket" d="M9.665 6.32l-4.259 4.274-1.406 1.406 1.406 1.406 4.259 4.274 1.406-1.438-4.259-4.243 4.259-4.243z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index 1c1dc22..e87b9bf 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="menu">
         <path id="lines" d="M6 15h12a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1zm-1-4v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1zm0-5v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1z"/>
     </g>
-</svg>
+</g></svg>
index a94207a..6d9edd1 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="menu">
         <path id="lines" d="M6 15h12a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1zm-1-4v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1zm0-5v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1z"/>
     </g>
-</svg>
+</g></svg>
index b7a09c6..a3aae21 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 9c0-1.7-1.3-3-3-3H3v3l9 4 9-4zM3 11v6c0 1.7 1.3 3 3 3h15v-9l-9 4-9-4z"/>
-</svg>
+</g></svg>
index 47e2797..36bfd0c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 9c0-1.7-1.3-3-3-3H3v3l9 4 9-4zM3 11v6c0 1.7 1.3 3 3 3h15v-9l-9 4-9-4z"/>
-</svg>
+</g></svg>
index 63493b7..0a52eec 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 9c0-1.7 1.3-3 3-3h15v3l-9 4-9-4zm18 2v6c0 1.7-1.3 3-3 3H3v-9l9 4 9-4z"/>
-</svg>
+</g></svg>
index c7b2c68..0beb5ee 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 9c0-1.7 1.3-3 3-3h15v3l-9 4-9-4zm18 2v6c0 1.7-1.3 3-3 3H3v-9l9 4 9-4z"/>
-</svg>
+</g></svg>
index 6fce33f..7ecd512 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M19.1 17.5c-3.3 1.4-7.1-.2-8.5-3.5-1.4-3.3.2-7.1 3.5-8.5.2-.1.5-.2.7-.3-1.6-.4-3.2-.3-4.8.4C6 7.3 4 12 5.7 16c1.7 4.1 6.4 6 10.5 4.3 1.7-.7 3-1.9 3.8-3.4-.3.3-.6.4-.9.6z"/>
-</svg>
+</g></svg>
index 5d9b12a..2da24a5 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 11l-4-3v2h-3V7h2l-3-4-3 4h2v3H8V8l-4 3 4 3v-2h3v3H9l3 4 3-4h-2v-3h3v2z"/>
-</svg>
+</g></svg>
index b5b9a8a..468ad1b 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="move-ltr">
         <path id="arrow" d="M8.935 7.18l5.302 5.303-5.302 5.303L10.35 19.2l6.715-6.717-6.716-6.716z"/>
     </g>
-</svg>
+</g></svg>
index 0a9917f..dd47881 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="move-ltr">
         <path id="arrow" d="M8.935 7.18l5.302 5.303-5.302 5.303L10.35 19.2l6.715-6.717-6.716-6.716z"/>
     </g>
-</svg>
+</g></svg>
index 00ae97b..6274f6f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 11l-4-3v2h-3V7h2l-3-4-3 4h2v3H8V8l-4 3 4 3v-2h3v3H9l3 4 3-4h-2v-3h3v2z"/>
-</svg>
+</g></svg>
index 6ba135e..264f3b6 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="move-rtl">
         <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
     </g>
-</svg>
+</g></svg>
index e98ca08..32aee25 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="move-rtl">
         <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
     </g>
-</svg>
+</g></svg>
index 8b86916..bc7fedc 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 54e3194..1ef309b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index a372d88..41e0401 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 3bcf517..a877db8 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 5f531f3..6ec8972 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17.8 5.7c-.5 0-.9.2-1.2.5s-.5.7-.5 1.2v4.3H11v-4l-6 5.5 6 5.5v-4h8v-9h-1.2z" id="line_return"/>
-</svg>
+</g></svg>
index bf7a001..b0e6aaf 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17.8 5.7c-.5 0-.9.2-1.2.5s-.5.7-.5 1.2v4.3H11v-4l-6 5.5 6 5.5v-4h8v-9h-1.2z" id="line_return"/>
-</svg>
+</g></svg>
index 34d15fd..c919608 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6.2 5.7c.5 0 .9.2 1.2.5.3.3.5.7.5 1.2v4.3H13v-4l6 5.5-6 5.5v-4H5v-9h1.2z" id="line_return"/>
-</svg>
+</g></svg>
index b209825..1547e82 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6.2 5.7c.5 0 .9.2 1.2.5.3.3.5.7.5 1.2v4.3H13v-4l6 5.5-6 5.5v-4H5v-9h1.2z" id="line_return"/>
-</svg>
+</g></svg>
index 903b3a0..69b737a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6 7v12c-.6 0-1-.4-1-1V9H4v9c0 1.1.9 2 2 2h15V7H6zm9 11H8v-1h7v1zm0-2H8v-1h7v1zm0-2H8v-1h7v1zm4 4h-3v-5h3v5zm0-7H8V9h11v2z"/>
-</svg>
+</g></svg>
index f2c23c1..df59aac 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6 7v12c-.6 0-1-.4-1-1V9H4v9c0 1.1.9 2 2 2h15V7H6zm9 11H8v-1h7v1zm0-2H8v-1h7v1zm0-2H8v-1h7v1zm4 4h-3v-5h3v5zm0-7H8V9h11v2z"/>
-</svg>
+</g></svg>
index 86bdeb0..74fa337 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19 7v12c.6 0 1-.4 1-1V9h1v9c0 1.1-.9 2-2 2H4V7h15zm-9 11h7v-1h-7v1zm0-2h7v-1h-7v1zm0-2h7v-1h-7v1zm-4 4h3v-5H6v5zm0-7h11V9H6v2z"/>
-</svg>
+</g></svg>
index edcab40..5533c83 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19 7v12c.6 0 1-.4 1-1V9h1v9c0 1.1-.9 2-2 2H4V7h15zm-9 11h7v-1h-7v1zm0-2h7v-1h-7v1zm0-2h7v-1h-7v1zm-4 4h3v-5H6v5zm0-7h11V9H6v2z"/>
-</svg>
+</g></svg>
index f89b415..d4cad39 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 13l2 2V5h-3v2h1zM3 3L2 4l1 1v14h3v-2H5V7l2 2v10h3v-2H9v-6l6 6h-1v2h3l3 3 1-1-3-3zm7 4V5H7l2 2zm8-2v2h1v10l2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index 898c674..3fb2dd9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 13l2 2V5h-3v2h1zM3 3L2 4l1 1v14h3v-2H5V7l2 2v10h3v-2H9v-6l6 6h-1v2h3l3 3 1-1-3-3zm7 4V5H7l2 2zm8-2v2h1v10l2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index ddac4c9..346c582 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 13l-2 2V5h3v2H9zM21 3l1 1-1 1v14h-3v-2h1V7l-2 2v10h-3v-2h1v-6l-6 6h1v2H7l-3 3-1-1 3-3zm-7 4V5h3l-2 2zM6 5v2H5v10l-2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index a81c3a5..9915009 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 13l-2 2V5h3v2H9zM21 3l1 1-1 1v14h-3v-2h1V7l-2 2v10h-3v-2h1v-6l-6 6h1v2H7l-3 3-1-1 3-3zm-7 4V5h3l-2 2zM6 5v2H5v10l-2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index 94fd0b8..ca20b5a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8z"/>
-</svg>
+</g></svg>
index c7d59cc..a0f8ddc 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116"><g fill="#fff">
     <path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="alert"/>
-</svg>
+</g></svg>
index fefbc9f..d828121 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116"><g fill="#36c">
     <path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="alert"/>
-</svg>
+</g></svg>
index 6e878c3..ffd31b2 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #fff }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#fff">
     <path d="M17.8 18.6H2.5l2.7-2.7V6h15.3v9.9c0 1.53-1.17 2.7-2.7 2.7zm-7.542-4.95c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 25ca20d..7178cb4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #36c }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#36c">
     <path d="M17.8 18.6H2.5l2.7-2.7V6h15.3v9.9c0 1.53-1.17 2.7-2.7 2.7zm-7.542-4.95c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index f483a16..61e51ca 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #fff }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#fff">
     <path d="M5.2 18.6h15.3l-2.7-2.7V6H2.5v9.9c0 1.53 1.17 2.7 2.7 2.7zm7.542-4.95c0 .405.135.675.405.945.27.27.607.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.607-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.608-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.332 1.332 0 0 0-.945-.405c-.337 0-.675.135-.945.405-.27.27-.405.608-.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 659dde8..6320f87 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #36c }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#36c">
     <path d="M5.2 18.6h15.3l-2.7-2.7V6H2.5v9.9c0 1.53 1.17 2.7 2.7 2.7zm7.542-4.95c0 .405.135.675.405.945.27.27.607.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.607-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.608-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.332 1.332 0 0 0-.945-.405c-.337 0-.675.135-.945.405-.27.27-.405.608-.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 14cf6d7..efdbe9a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 12l5 4V8l-5 4z"/>
-</svg>
+</g></svg>
index c5f296f..29e5f42 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 12l5 4V8l-5 4z"/>
-</svg>
+</g></svg>
index 2d47900..3a9d2b5 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zm18-8l-5 4V8l5 4z"/>
-</svg>
+</g></svg>
index 16eb16e..560abbb 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zm18-8l-5 4V8l5 4z"/>
-</svg>
+</g></svg>
index 56d505c..e9fb818 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="outline-ltr">
         <path id="text" d="M5 13h14v6H5v-6z"/>
         <path id="float" d="M5 5v6h6V5H5zm5 5H6V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index bed7254..662409a 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="outline-ltr">
         <path id="text" d="M5 13h14v6H5v-6z"/>
         <path id="float" d="M5 5v6h6V5H5zm5 5H6V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index 49dd03e..74689d1 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="outline-rtl">
         <path id="text" d="M19 19H5v-6h14v6z"/>
         <path id="float" d="M13 5v6h6V5h-6zm1 1h4v4h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 8c126eb..b579315 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="outline-rtl">
         <path id="text" d="M19 19H5v-6h14v6z"/>
         <path id="float" d="M13 5v6h6V5h-6zm1 1h4v4h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 2ced125..1a0340c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm-2 12V9l6 4-6 4z"/>
-</svg>
+</g></svg>
index 8703508..5b62113 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm-2 12V9l6 4-6 4z"/>
-</svg>
+</g></svg>
index 4e1287f..b27b913 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 5c4.4 0 8 3.6 8 8s-3.6 8-8 8-8-3.6-8-8 3.6-8 8-8zm2 12V9l-6 4 6 4z"/>
-</svg>
+</g></svg>
index c8529dc..05b7749 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 5c4.4 0 8 3.6 8 8s-3.6 8-8 8-8-3.6-8-8 3.6-8 8-8zm2 12V9l-6 4 6 4z"/>
-</svg>
+</g></svg>
index cc215e7..ae4352f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
-</svg>
+</g></svg>
index 0d68d7d..fb372de 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
-</svg>
+</g></svg>
index 8b66878..d045ff9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z"/>
-</svg>
+</g></svg>
index 6f3ccbb..91ccc6f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z"/>
-</svg>
+</g></svg>
index f1dba0f..27c3ab6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18 9.9c-.7 0-1.4.3-1.8.9V6h-4c.2-.4.4-.8.4-1.2 0-1.2-1-2.2-2.2-2.2-1.3-.1-2.3.9-2.3 2.2 0 .4.2.8.4 1.2H4.1v3.6l.6-.1c1.4 0 2.5 1.1 2.5 2.5s-1.1 2.5-2.5 2.5c-.2 0-.4 0-.6-.1V18H9c-.5.4-.9 1-.9 1.8 0 1.2 1 2.2 2.3 2.2 1.2 0 2.2-1 2.2-2.2 0-.7-.3-1.4-.9-1.8h4.5v-4.5c.4.5 1 .9 1.8.9 1.2 0 2.2-1 2.2-2.2 0-1.3-1-2.3-2.2-2.3z"/>
-</svg>
+</g></svg>
index c4af15c..3406199 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18 9.9c-.7 0-1.4.3-1.8.9V6h-4c.2-.4.4-.8.4-1.2 0-1.2-1-2.2-2.2-2.2-1.3-.1-2.3.9-2.3 2.2 0 .4.2.8.4 1.2H4.1v3.6l.6-.1c1.4 0 2.5 1.1 2.5 2.5s-1.1 2.5-2.5 2.5c-.2 0-.4 0-.6-.1V18H9c-.5.4-.9 1-.9 1.8 0 1.2 1 2.2 2.3 2.2 1.2 0 2.2-1 2.2-2.2 0-.7-.3-1.4-.9-1.8h4.5v-4.5c.4.5 1 .9 1.8.9 1.2 0 2.2-1 2.2-2.2 0-1.3-1-2.3-2.2-2.3z"/>
-</svg>
+</g></svg>
index 7cce537..cee2e1a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6.3 9.9c.7 0 1.4.3 1.8.9V6h4c-.2-.4-.4-.8-.4-1.2 0-1.2 1-2.2 2.2-2.2 1.3-.1 2.3.9 2.3 2.2 0 .4-.2.8-.4 1.2h4.4v3.6l-.6-.1c-1.4 0-2.5 1.1-2.5 2.5s1.1 2.5 2.5 2.5c.2 0 .4 0 .6-.1V18h-4.9c.5.4.9 1 .9 1.8 0 1.2-1 2.2-2.3 2.2-1.2 0-2.2-1-2.2-2.2 0-.7.3-1.4.9-1.8H8.1v-4.5c-.4.5-1 .9-1.8.9-1.2 0-2.2-1-2.2-2.2 0-1.3 1-2.3 2.2-2.3z"/>
-</svg>
+</g></svg>
index 3ea0529..3f6a3a8 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6.3 9.9c.7 0 1.4.3 1.8.9V6h4c-.2-.4-.4-.8-.4-1.2 0-1.2 1-2.2 2.2-2.2 1.3-.1 2.3.9 2.3 2.2 0 .4-.2.8-.4 1.2h4.4v3.6l-.6-.1c-1.4 0-2.5 1.1-2.5 2.5s1.1 2.5 2.5 2.5c.2 0 .4 0 .6-.1V18h-4.9c.5.4.9 1 .9 1.8 0 1.2-1 2.2-2.3 2.2-1.2 0-2.2-1-2.2-2.2 0-.7.3-1.4.9-1.8H8.1v-4.5c-.4.5-1 .9-1.8.9-1.2 0-2.2-1-2.2-2.2 0-1.3 1-2.3 2.2-2.3z"/>
-</svg>
+</g></svg>
index ca34c66..7c9feea 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes">
         <path id="quote" d="M6.9 8.4c-.446.55-1.974 2.6-1.9 5.7V17h4.7c.9 0 1.6-.7 1.6-1.6V11H8.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
     </g>
     <use transform="translate(8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index f795285..c64995d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes">
         <path id="quote" d="M6.9 8.4c-.446.55-1.974 2.6-1.9 5.7V17h4.7c.9 0 1.6-.7 1.6-1.6V11H8.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
     </g>
     <use transform="translate(8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index 38e0cbc..baae1fa 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes">
         <path id="quote" d="M17.1 8.4c.446.55 1.9 2.6 1.9 5.7V17h-4.7c-.9 0-1.6-.7-1.6-1.6V11h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
     </g>
     <use transform="translate(-8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index 097b62a..255faad 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes">
         <path id="quote" d="M17.1 8.4c.446.55 1.9 2.6 1.9 5.7V17h-4.7c-.9 0-1.6-.7-1.6-1.6V11h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
     </g>
     <use transform="translate(-8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index 425815b..0d79616 100644 (file)
@@ -1,8 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes-add">
         <path id="quote" d="M5.9 10.4c-.446.55-1.974 2.6-1.9 5.7V19h4.7c.9 0 1.593-.7 1.6-1.6V13H7.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
         <path id="quote2" d="M15 9.344c-.476.32-.78.677-1.094 1.062A8.76 8.76 0 0 0 12 16.094V19h4.688a1.6 1.6 0 0 0 1.625-1.594V13H15V9.344z"/>
         <path id="add" d="M18 6V2h-2v4h-4v2h4v4h2V8h4V6z"/>
     </g>
-</svg>
+</g></svg>
index be02943..755708d 100644 (file)
@@ -1,8 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes-add">
         <path id="quote" d="M5.9 10.4c-.446.55-1.974 2.6-1.9 5.7V19h4.7c.9 0 1.593-.7 1.6-1.6V13H7.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
         <path id="quote2" d="M15 9.344c-.476.32-.78.677-1.094 1.062A8.76 8.76 0 0 0 12 16.094V19h4.688a1.6 1.6 0 0 0 1.625-1.594V13H15V9.344z"/>
         <path id="add" d="M18 6V2h-2v4h-4v2h4v4h2V8h4V6z"/>
     </g>
-</svg>
+</g></svg>
index c7aea7a..2a839f0 100644 (file)
@@ -1,8 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes-add">
         <path id="quote" d="M18.097 10.4c.446.55 1.974 2.6 1.9 5.7V19h-4.7c-.9 0-1.593-.7-1.6-1.6V13h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
         <path id="quote2" d="M8.997 9.344c.476.32.782.677 1.094 1.062A8.758 8.758 0 0 1 12 16.094V19H7.31c-.9 0-1.618-.694-1.625-1.594V13h3.312V9.344z"/>
         <path id="add" d="M5.997 6V2h2v4h4v2h-4v4h-2V8h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 2758fa6..a5c10b4 100644 (file)
@@ -1,8 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes-add">
         <path id="quote" d="M18.097 10.4c.446.55 1.974 2.6 1.9 5.7V19h-4.7c-.9 0-1.593-.7-1.6-1.6V13h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
         <path id="quote2" d="M8.997 9.344c.476.32.782.677 1.094 1.062A8.758 8.758 0 0 1 12 16.094V19H7.31c-.9 0-1.618-.694-1.625-1.594V13h3.312V9.344z"/>
         <path id="add" d="M5.997 6V2h2v4h4v2h-4v4h-2V8h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 76ead20..0cb419e 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="regular-expression">
         <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777A6.886 6.886 0 0 1 4.764 7H6.23a7.923 7.923 0 0 0-1.25 2.374 8.563 8.563 0 0 0 .007 5.314c.29.85.7 1.622 1.23 2.312h-1.45a6.53 6.53 0 0 1-1.314-2.223 8.126 8.126 0 0 1-.45-2.732"/>
         <path id="dot" d="M10 16a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
         <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.47-1.992.14 1.307 1.74-1.33.71-.914-1.833-.8 1.822-1.38-.698 1.296-1.74-1.98-.152.23-1.464 2.14.61-.24-2.158h1.534"/>
         <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744A6.51 6.51 0 0 1 19.236 17h-1.453a8.017 8.017 0 0 0 1.225-2.31c.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66a7.913 7.913 0 0 0-1.248-2.374h1.465a6.764 6.764 0 0 1 1.313 2.28c.3.86.45 1.782.45 2.764"/>
     </g>
-</svg>
+</g></svg>
index 82598da..5e2894b 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="regular-expression">
         <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777A6.886 6.886 0 0 1 4.764 7H6.23a7.923 7.923 0 0 0-1.25 2.374 8.563 8.563 0 0 0 .007 5.314c.29.85.7 1.622 1.23 2.312h-1.45a6.53 6.53 0 0 1-1.314-2.223 8.126 8.126 0 0 1-.45-2.732"/>
         <path id="dot" d="M10 16a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
         <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.47-1.992.14 1.307 1.74-1.33.71-.914-1.833-.8 1.822-1.38-.698 1.296-1.74-1.98-.152.23-1.464 2.14.61-.24-2.158h1.534"/>
         <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744A6.51 6.51 0 0 1 19.236 17h-1.453a8.017 8.017 0 0 0 1.225-2.31c.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66a7.913 7.913 0 0 0-1.248-2.374h1.465a6.764 6.764 0 0 1 1.313 2.28c.3.86.45 1.782.45 2.764"/>
     </g>
-</svg>
+</g></svg>
index 64430f9..640d263 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index cf0888d..c0aa287 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 5b608cf..3c02eb4 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index cb64033..efc8223 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 9969490..8df7b16 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index d95aa42..07f23a8 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 3fbdebd..1b24dbb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <g id="secure">
         <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.49-.485 1.45-.487 1.94-.002.543.546.545 1.536.545 1.55V5H3.998z"/>
     </g>
-</svg>
+</g></svg>
index 3b755c1..ee69fc4 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
     <g id="secure">
         <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.49-.485 1.45-.487 1.94-.002.543.546.545 1.536.545 1.55V5H3.998z"/>
     </g>
-</svg>
+</g></svg>
index da266da..630835a 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="settings">
         <path id="gear" d="M3 4h3v2H3zm9 0h9v2h-9zM8 3h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm-5 8h9v2H3zm15 0h3v2h-3zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zM3 18h6v2H3zm12 0h6v2h-6zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1z"/>
     </g>
-</svg>
+</g></svg>
index 9d28697..a93d312 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="settings">
         <path id="gear" d="M3 4h3v2H3zm9 0h9v2h-9zM8 3h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm-5 8h9v2H3zm15 0h3v2h-3zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zM3 18h6v2H3zm12 0h6v2h-6zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1z"/>
     </g>
-</svg>
+</g></svg>
index bde5f71..b783779 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M0 20h24v1H0v-1zm6-8l-1-1-2 2-2-2-1 1 2 2-2 2 1 1 2-2 2 2 1-1-2-2zm15.6 3.7c-.9-.5-1.9-.5-2.7 0-1.5.9-3.1.4-3.1.4-.4-.2-.8-.4-1.1-.6 2.2-.6 4.4-1.8 6-3.9 1.1-1.2 2.5-3.9.4-6-.7-.7-1.6-1.1-2.7-1-1.4.1-2.8.9-3.9 2.1-.9 1.1-3.1 4.5-2.3 7.5 0 .1 0 .2.1.3-2.3.3-4.2.2-4.4.1v1.5c.7.1 2.7.2 5.1-.2.5.7 1.3 1.2 2.3 1.6.1 0 2.4.8 4.5-.6.5-.3.9-.1 1.1 0 .4.2.7.6.7 1H23c0-.8-.6-1.7-1.4-2.2zm-8-1.7c-.5-2.2 1.1-5.1 2-6.2.8-.9 1.8-1.5 2.8-1.6h.1c.6 0 1.1.2 1.5.6 1.6 1.6-.4 3.9-.5 4-1.5 2-3.7 3-5.8 3.5l-.1-.3z"/>
-</svg>
+</g></svg>
index d38c7ec..366aafb 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M0 20h24v1H0v-1zm6-8l-1-1-2 2-2-2-1 1 2 2-2 2 1 1 2-2 2 2 1-1-2-2zm15.6 3.7c-.9-.5-1.9-.5-2.7 0-1.5.9-3.1.4-3.1.4-.4-.2-.8-.4-1.1-.6 2.2-.6 4.4-1.8 6-3.9 1.1-1.2 2.5-3.9.4-6-.7-.7-1.6-1.1-2.7-1-1.4.1-2.8.9-3.9 2.1-.9 1.1-3.1 4.5-2.3 7.5 0 .1 0 .2.1.3-2.3.3-4.2.2-4.4.1v1.5c.7.1 2.7.2 5.1-.2.5.7 1.3 1.2 2.3 1.6.1 0 2.4.8 4.5-.6.5-.3.9-.1 1.1 0 .4.2.7.6.7 1H23c0-.8-.6-1.7-1.4-2.2zm-8-1.7c-.5-2.2 1.1-5.1 2-6.2.8-.9 1.8-1.5 2.8-1.6h.1c.6 0 1.1.2 1.5.6 1.6 1.6-.4 3.9-.5 4-1.5 2-3.7 3-5.8 3.5l-.1-.3z"/>
-</svg>
+</g></svg>
index de006d7..ffbf189 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M24 20H0v1h24v-1zm-6-8l1-1 2 2 2-2 1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2zM2.4 15.7c.9-.5 1.9-.5 2.7 0 1.5.9 3.1.4 3.1.4.4-.2.8-.4 1.1-.6-2.2-.6-4.4-1.8-6-3.9-1.1-1.2-2.5-3.9-.4-6 .7-.7 1.6-1.1 2.7-1 1.4.1 2.8.9 3.9 2.1.9 1.1 3.1 4.5 2.3 7.5 0 .1 0 .2-.1.3 2.3.3 4.2.2 4.4.1v1.5c-.7.1-2.7.2-5.1-.2-.5.7-1.3 1.2-2.3 1.6-.1 0-2.4.8-4.5-.6-.5-.3-.9-.1-1.1 0-.4.2-.7.6-.7 1H1c0-.8.6-1.7 1.4-2.2zm8-1.7c.5-2.2-1.1-5.1-2-6.2-.8-.9-1.8-1.5-2.8-1.6h-.1c-.6 0-1.1.2-1.5.6-1.6 1.6.4 3.9.5 4 1.5 2 3.7 3 5.8 3.5l.1-.3z"/>
-</svg>
+</g></svg>
index caa2839..3131849 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M24 20H0v1h24v-1zm-6-8l1-1 2 2 2-2 1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2zM2.4 15.7c.9-.5 1.9-.5 2.7 0 1.5.9 3.1.4 3.1.4.4-.2.8-.4 1.1-.6-2.2-.6-4.4-1.8-6-3.9-1.1-1.2-2.5-3.9-.4-6 .7-.7 1.6-1.1 2.7-1 1.4.1 2.8.9 3.9 2.1.9 1.1 3.1 4.5 2.3 7.5 0 .1 0 .2-.1.3 2.3.3 4.2.2 4.4.1v1.5c-.7.1-2.7.2-5.1-.2-.5.7-1.3 1.2-2.3 1.6-.1 0-2.4.8-4.5-.6-.5-.3-.9-.1-1.1 0-.4.2-.7.6-.7 1H1c0-.8.6-1.7 1.4-2.2zm8-1.7c.5-2.2-1.1-5.1-2-6.2-.8-.9-1.8-1.5-2.8-1.6h-.1c-.6 0-1.1.2-1.5.6-1.6 1.6.4 3.9.5 4 1.5 2 3.7 3 5.8 3.5l.1-.3z"/>
-</svg>
+</g></svg>
index b29f718..3f82d69 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 6h5l-2.5 3z"/>
-</svg>
+</g></svg>
index 9b7962e..67bf3a9 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 6h5l-2.5 3z"/>
-</svg>
+</g></svg>
index 171b31d..3d99520 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 6H4l2.5 3z"/>
-</svg>
+</g></svg>
index 23c0b09..2ca5200 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 6H4l2.5 3z"/>
-</svg>
+</g></svg>
index 107f5f6..146a212 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M17.6 20h-5.4v-.5c.2 0 .5-.1.9-.1.3-.1.5-.2.5-.3V19s0-.1-.1-.2l-.8-2H9.3c-.1.2-.2.4-.3.7-.1.3-.2.5-.2.7-.1.3-.1.4-.2.6v.2c0 .1.1.3.3.4.2.1.6.2 1.1.2v.4H6v-.5c.2 0 .3 0 .5-.1.2 0 .3-.1.5-.2s.4-.2.5-.4l.3-.6c.5-1.3 1.1-2.6 1.6-3.9.5-1.3 1.1-2.7 1.8-4.3h1.4c.9 2.2 1.6 4 2.1 5.3.5 1.3 1 2.4 1.3 3.2.1.1.1.3.2.4.1.1.2.2.4.3.1.1.3.1.5.2s.3.1.5.1v.5zm-5.2-4L11 12.4 9.6 16h2.8z"/>
-</svg>
+</g></svg>
index a290c92..960793c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M6 19.5c.1 0 .3 0 .5-.1s.3-.1.5-.2.3-.2.4-.3c.1-.1.2-.2.2-.4.4-.9.8-1.9 1.3-3.2.5-1.3 1.2-3.1 2.1-5.3h1.4c.7 1.6 1.2 3 1.8 4.3.5 1.3 1.1 2.6 1.6 3.9l.3.6c.1.2.3.3.5.4.1.1.3.1.5.2.2 0 .4.1.5.1v.5h-4v-.5c.5 0 .9-.1 1.1-.2.2-.1.3-.2.3-.4v-.2c0-.1-.1-.3-.2-.6-.1-.2-.2-.4-.2-.7-.1-.3-.2-.5-.3-.7h-3.4l-.8 2c0 .1-.1.1-.1.2v.1c0 .1.2.2.5.3.3.1.6.1.9.1v.6H6v-.5zm8-3.5l-1.4-3.6-1.4 3.6H14z"/>
-</svg>
+</g></svg>
index 6dd9266..b234e63 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="special-character">
         <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327a7.232 7.232 0 0 0-.19 1.7c0 .512.06 1 .18 1.46.12.46.31.87.567 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.6.044.75.035.455.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99a4.428 4.428 0 0 1-.89-1.4 4.78 4.78 0 0 1-.32-1.778c0-.82.13-1.537.394-2.15a3.97 3.97 0 0 1 1.163-1.54c.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.51.407.9.92 1.16 1.54.27.614.404 1.33.404 2.15a4.79 4.79 0 0 1-.32 1.78 4.35 4.35 0 0 1-.9 1.397c-.38.4-.83.732-1.355.99-.526.255-.708.43-1.337.523l-.092.894h.66l.448-.01.75-.034.606-.044.4-.053.534-1.354H18v3h-5l.246-3.04c1.066-.11 1.337-.698 2.002-1.365.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.07-1.186-.198-1.7a3.175 3.175 0 0 0-.66-1.326c-.31-.37-.73-.66-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
     </g>
-</svg>
+</g></svg>
index 4473704..091063f 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="special-character">
         <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327a7.232 7.232 0 0 0-.19 1.7c0 .512.06 1 .18 1.46.12.46.31.87.567 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.6.044.75.035.455.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99a4.428 4.428 0 0 1-.89-1.4 4.78 4.78 0 0 1-.32-1.778c0-.82.13-1.537.394-2.15a3.97 3.97 0 0 1 1.163-1.54c.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.51.407.9.92 1.16 1.54.27.614.404 1.33.404 2.15a4.79 4.79 0 0 1-.32 1.78 4.35 4.35 0 0 1-.9 1.397c-.38.4-.83.732-1.355.99-.526.255-.708.43-1.337.523l-.092.894h.66l.448-.01.75-.034.606-.044.4-.053.534-1.354H18v3h-5l.246-3.04c1.066-.11 1.337-.698 2.002-1.365.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.07-1.186-.198-1.7a3.175 3.175 0 0 0-.66-1.326c-.31-.37-.73-.66-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
     </g>
-</svg>
+</g></svg>
index a5f137d..5fa3f49 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19 20H2l3-3V6h17v11c0 1.7-1.3 3-3 3z"/>
-</svg>
+</g></svg>
index 3cc8dc6..d196d55 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19 20H2l3-3V6h17v11c0 1.7-1.3 3-3 3z"/>
-</svg>
+</g></svg>
index 03d53d2..2da483c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 20h17l-3-3V6H2v11c0 1.7 1.3 3 3 3z"/>
-</svg>
+</g></svg>
index 2722814..43b2364 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 20h17l-3-3V6H2v11c0 1.7 1.3 3 3 3z"/>
-</svg>
+</g></svg>
index e85c9a6..843469e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm8 3h1v3h3v1h-3v3h-1v-3h-3v-1h3V9z"/>
-</svg>
+</g></svg>
index 6e28601..bd4128b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm8 3h1v3h3v1h-3v3h-1v-3h-3v-1h3V9z"/>
-</svg>
+</g></svg>
index 810766a..d0e2cc4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M2 6v11c0 1.7 1.3 3 3 3h17l-3-3V6H2zm8 3h1v3h3v1h-3v3h-1v-3H7v-1h3V9z"/>
-</svg>
+</g></svg>
index 266efc4..a35ff20 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M2 6v11c0 1.7 1.3 3 3 3h17l-3-3V6H2zm8 3h1v3h3v1h-3v3h-1v-3H7v-1h3V9z"/>
-</svg>
+</g></svg>
index 1cf7d78..a9ea6c8 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 9v9l2 2H8V9h12zM3 4h12v4H7v7H1l2-2V4z"/>
-</svg>
+</g></svg>
index 4a065cd..1c79ef6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 9v9l2 2H8V9h12zM3 4h12v4H7v7H1l2-2V4z"/>
-</svg>
+</g></svg>
index ed874d1..c8b684a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 9v9l-2 2h14V9H3zm17-5H8v4h8v7h6l-2-2V4z"/>
-</svg>
+</g></svg>
index eb262e7..fe65227 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 9v9l-2 2h14V9H3zm17-5H8v4h8v7h6l-2-2V4z"/>
-</svg>
+</g></svg>
index defc618..407d2da 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
-</svg>
+</g></svg>
index ba60a4b..0cbd1d0 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
-</svg>
+</g></svg>
index defc618..407d2da 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
-</svg>
+</g></svg>
index eed2650..40f44d7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
        <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 11.1H9v-6h6v6z"/>
-</svg>
+</g></svg>
index 1e702f9..5b44a8d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
        <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 11.1H9v-6h6v6z"/>
-</svg>
+</g></svg>
index 11949f8..e277ae3 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="strikethrough-a">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M12.666 6h-1.372l-4.48 12H8.52l1.493-4h4l1.507 4h1.666l-4.52-12zm-2.28 7l1.617-4.333L13.637 13h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index f80a245..a957e80 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="strikethrough-a">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M12.666 6h-1.372l-4.48 12H8.52l1.493-4h4l1.507 4h1.666l-4.52-12zm-2.28 7l1.617-4.333L13.637 13h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index c570ba9..a8301f2 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="strikethrough-s">
         <path id="strikethrough" d="M6 12h12v1H6v-1z"/>
         <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.47 0-.962-.074-1.462-.24a7.288 7.288 0 0 1-1.562-.75l-.374-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.714-.148-1.202-.352-1.404-.54-.206-.202-.313-.484-.313-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.375.18V6.63s-1.19-.383-1.69-.48c-.5-.097-.983-.15-1.467-.15z"/>
     </g>
-</svg>
+</g></svg>
index 6446e8e..f6f5331 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="strikethrough-s">
         <path id="strikethrough" d="M6 12h12v1H6v-1z"/>
         <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.47 0-.962-.074-1.462-.24a7.288 7.288 0 0 1-1.562-.75l-.374-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.714-.148-1.202-.352-1.404-.54-.206-.202-.313-.484-.313-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.375.18V6.63s-1.19-.383-1.69-.48c-.5-.097-.983-.15-1.467-.15z"/>
     </g>
-</svg>
+</g></svg>
index bd80846..f34be15 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="strikethrough-y">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M7 6h1.724l3.288 4.935L15.276 6H17l-4.194 6.285V18h-1.612v-5.715L7 6"/>
     </g>
-</svg>
+</g></svg>
index 95d7218..778a941 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="strikethrough-y">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M7 6h1.724l3.288 4.935L15.276 6H17l-4.194 6.285V18h-1.612v-5.715L7 6"/>
     </g>
-</svg>
+</g></svg>
index b774dce..4b2040c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 9h12v2H4V9zm0 3h8v2H4v-2zm0-7h16v3H4V5zm16 14H4v-3h16v3z"/>
-</svg>
+</g></svg>
index c6c541c..a7ddaac 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 9h12v2H4V9zm0 3h8v2H4v-2zm0-7h16v3H4V5zm16 14H4v-3h16v3z"/>
-</svg>
+</g></svg>
index eb52a4d..af6e715 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 9H8v2h12V9zm0 3h-8v2h8v-2zm0-7H4v3h16V5zM4 19h16v-3H4v3z"/>
-</svg>
+</g></svg>
index a59254c..e835c21 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 9H8v2h12V9zm0 3h-8v2h8v-2zm0-7H4v3h16V5zM4 19h16v-3H4v3z"/>
-</svg>
+</g></svg>
index 7d8ccdc..68085f9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 19H4v-2h16v2zM20 15H4v-2h16v2zM20 11H4V9h16v2z"/>
-</svg>
+</g></svg>
index 862a2f7..7bb2d16 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 19H4v-2h16v2zM20 15H4v-2h16v2zM20 11H4V9h16v2z"/>
-</svg>
+</g></svg>
index 893d559..91fcd8f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 11H4V9h16v2zM4 12h8v2H4v-2z"/>
-</svg>
+</g></svg>
index 503dc27..59342a5 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 11H4V9h16v2zM4 12h8v2H4v-2z"/>
-</svg>
+</g></svg>
index a5f1417..dae554e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 11h16V9H4v2zm16 1h-8v2h8v-2z"/>
-</svg>
+</g></svg>
index 75b3cb6..6b94663 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 11h16V9H4v2zm16 1h-8v2h8v-2z"/>
-</svg>
+</g></svg>
index 7424959..7b2ec17 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 13H4v-3h13v3zm-5 6H4v-3h8v3zM4 7V4h16v3H4z"/>
-</svg>
+</g></svg>
index 1a59715..d027539 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 13H4v-3h13v3zm-5 6H4v-3h8v3zM4 7V4h16v3H4z"/>
-</svg>
+</g></svg>
index e1802d1..2e75158 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 13h13v-3H7v3zm5 6h8v-3h-8v3zm8-12V4H4v3h16z"/>
-</svg>
+</g></svg>
index 15aa549..3c27eaf 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 13h13v-3H7v3zm5 6h8v-3h-8v3zm8-12V4H4v3h16z"/>
-</svg>
+</g></svg>
index d168e2f..b6f5d6d 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 13l-1 1v3l1 1h-1l-.527-.46L16 18h-1l1-1v-3l-1-1h1l.485.497L17 13z"/>
-</svg>
+</g></svg>
index da428f7..11dc32f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 13l-1 1v3l1 1h-1l-.527-.46L16 18h-1l1-1v-3l-1-1h1l.485.497L17 13z"/>
-</svg>
+</g></svg>
index 25fcb14..b1608f9 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 13l1 1v3l-1 1h1l.527-.46L10 18h1l-1-1v-3l1-1h-1l-.485.497L9 13z"/>
-</svg>
+</g></svg>
index e65abbb..f0c5d31 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 13l1 1v3l-1 1h1l.527-.46L10 18h1l-1-1v-3l1-1h-1l-.485.497L9 13z"/>
-</svg>
+</g></svg>
index 6abcb57..498df82 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 29f965b..afd390c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 92a045d..f932701 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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)"/>
-</svg>
+</g></svg>
index 1f78472..72754d4 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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)"/>
-</svg>
+</g></svg>
index 03636db..430abf0 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 7l-1 1v3l1 1h-1l-.527-.46L16 12h-1l1-1V8l-1-1h1l.485.497L17 7z"/>
-</svg>
+</g></svg>
index d926f44..80495b8 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 7l-1 1v3l1 1h-1l-.527-.46L16 12h-1l1-1V8l-1-1h1l.485.497L17 7z"/>
-</svg>
+</g></svg>
index 59418fe..ea8ea9c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 7l1 1v3l-1 1h1l.527-.46L10 12h1l-1-1V8l1-1h-1l-.485.497L9 7z"/>
-</svg>
+</g></svg>
index 20db11c..e742990 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 7l1 1v3l-1 1h1l.527-.46L10 12h1l-1-1V8l1-1h-1l-.485.497L9 7z"/>
-</svg>
+</g></svg>
index f62c61c..360fbe1 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-caption">
         <path id="caption" d="M6 6h12v3H6z"/>
         <path id="table" d="M4 10v7h16v-7H4zm1 1h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2zM5 14h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2z"/>
     </g>
-</svg>
+</g></svg>
index 9270ddf..02faf85 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-caption">
         <path id="caption" d="M6 6h12v3H6z"/>
         <path id="table" d="M4 10v7h16v-7H4zm1 1h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2zM5 14h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2z"/>
     </g>
-</svg>
+</g></svg>
index 2944ec1..9a93e24 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-column-ltr">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h2v14H5z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 9c5550b..1f560bb 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-column-ltr">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h2v14H5z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 2f4627b..7c54e2c 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-column-rtl">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M17 5h2v14h-2z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 224cd80..3e178ee 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-column-rtl">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M17 5h2v14h-2z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 8ce9614..2df3cfc 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-row-after">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 17h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index 6085525..f85c5a3 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-row-after">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 17h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index 98a8732..5d529f1 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-row-before">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index b23e4a0..f26feef 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-row-before">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index 171473d..85a3f97 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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert">
         <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
-</svg>
+</g></svg>
index bc8f537..102a686 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-merge-cells">
         <g id="merge-cell-left">
             <path id="cell-border" d="M4 7v9h7v-3l-1 .834V15H5V8h5v1.167L11 10V7z"/>
@@ -7,4 +7,4 @@
         </g>
         <use id="merge-cell-right" xlink:href="#merge-cell-left" transform="matrix(-1 0 0 1 24 0)"/>
     </g>
-</svg>
+</g></svg>
index cb90635..c2c5a7e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-merge-cells">
         <g id="merge-cell-left">
             <path id="cell-border" d="M4 7v9h7v-3l-1 .834V15H5V8h5v1.167L11 10V7z"/>
@@ -7,4 +7,4 @@
         </g>
         <use id="merge-cell-right" xlink:href="#merge-cell-left" transform="matrix(-1 0 0 1 24 0)"/>
     </g>
-</svg>
+</g></svg>
index 5aa79ee..3441e65 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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert">
         <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
-</svg>
+</g></svg>
index e55880e..ce04687 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index 55ab6c4..cf85c4d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.png differ
index 7048a40..cb00c1c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index e90541b..a4f38b4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index e55880e..ce04687 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index df57de5..bf31a97 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ff5d00 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ff5d00">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index c427bba..4d0e4a5 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="template-add">
         <path id="add" d="M23 7h-4V3h-2v4h-4v2h4v4h2V9h4z"/>
         <path id="template" d="M18 14v4H6c-1.1 0-2-.9-2-2V8h8V7H3v9c0 1.7 1.3 3 3 3h13v-5z"/>
     </g>
-</svg>
+</g></svg>
index 1800115..8b6325e 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="template-add">
         <path id="add" d="M23 7h-4V3h-2v4h-4v2h4v4h2V9h4z"/>
         <path id="template" d="M18 14v4H6c-1.1 0-2-.9-2-2V8h8V7H3v9c0 1.7 1.3 3 3 3h13v-5z"/>
     </g>
-</svg>
+</g></svg>
index 0142745..3277986 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="template-add">
         <path id="add" d="M1 7h4V3h2v4h4v2H7v4H5V9H1z"/>
         <path id="template" d="M6 14v4h12c1.1 0 2-.9 2-2V8h-8V7h9v9c0 1.7-1.3 3-3 3H5v-5z"/>
     </g>
-</svg>
+</g></svg>
index 134d304..ea7a4ce 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="template-add">
         <path id="add" d="M1 7h4V3h2v4h4v2H7v4H5V9H1z"/>
         <path id="template" d="M6 14v4h12c1.1 0 2-.9 2-2V8h-8V7h9v9c0 1.7-1.3 3-3 3H5v-5z"/>
     </g>
-</svg>
+</g></svg>
index 00b1928..8824e9c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 7H5V6h2l.47.5L8 6h2v1H8v10h2v1H8l-.5-.53L7 18H5v-1h2zm6.976 9v-2H11v-4h2.976V8.044L20 12.022z" id="text-dir-ltr"/>
-</svg>
+</g></svg>
index f67802a..968e13b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 7H5V6h2l.47.5L8 6h2v1H8v10h2v1H8l-.5-.53L7 18H5v-1h2zm6.976 9v-2H11v-4h2.976V8.044L20 12.022z" id="text-dir-ltr"/>
-</svg>
+</g></svg>
index c1dc96e..12544d9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 17h2v1h-2l-.47-.5-.53.5h-2v-1h2V7h-2V6h2l.5.53L17 6h2v1h-2zm-6.976-9v2H13v4h-2.976v1.956L4 11.978z" id="text-dir-rtl"/>
-</svg>
+</g></svg>
index 52fa585..73ebe60 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 17h2v1h-2l-.47-.5-.53.5h-2v-1h2V7h-2V6h2l.5.53L17 6h2v1h-2zm-6.976-9v2H13v4h-2.976v1.956L4 11.978z" id="text-dir-rtl"/>
-</svg>
+</g></svg>
index d26f68f..318c168 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="text-style">
         <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.29 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
         <path id="underline" d="M6 19h12v1H6v-1z"/>
     </g>
-</svg>
+</g></svg>
index fc53802..6f17920 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="text-style">
         <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.29 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
         <path id="underline" d="M6 19h12v1H6v-1z"/>
     </g>
-</svg>
+</g></svg>
index c1d2a66..c367e77 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.png differ
index 3ebc63b..eb52343 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
-</svg>
+</g></svg>
index 92c7966..f84bfe9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
-</svg>
+</g></svg>
index 6a328db..1099f6a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png
deleted file mode 100644 (file)
index af3f0e9..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.svg
deleted file mode 100644 (file)
index 0763ff8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png
deleted file mode 100644 (file)
index 2f09eb6..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.svg
deleted file mode 100644 (file)
index 6d1fdd9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png
deleted file mode 100644 (file)
index 3b5231f..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.svg
deleted file mode 100644 (file)
index 64b3b71..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png
deleted file mode 100644 (file)
index 1cb5449..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.svg
deleted file mode 100644 (file)
index 12e57b2..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png
deleted file mode 100644 (file)
index e828b36..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.svg
deleted file mode 100644 (file)
index 6395968..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png
deleted file mode 100644 (file)
index a1d2388..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.svg
deleted file mode 100644 (file)
index e5e4032..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
index fe8600a..28442a3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 13.35l1.8-7.2c.2-.996.81-1.8 1.8-1.8h10.8c.99 0 1.6.867 1.8 1.8l1.8 7.2v4.5c0 .99-.81 1.8-1.8 1.8H4.8c-.99 0-1.8-.81-1.8-1.8v-4.5zm6.96 1.8h4.08c-.49.557-1.212.9-2.04.9a2.68 2.68 0 0 1-2.04-.9h4.08c.414-.472.66-1.098.66-1.8h4.14l-1.44-7.2H6.6l-1.44 7.2H9.3c0 .702.246 1.328.66 1.8z" id="tray"/>
-</svg>
+</g></svg>
index 5544fd3..7b079ea 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 13.35l1.8-7.2c.2-.996.81-1.8 1.8-1.8h10.8c.99 0 1.6.867 1.8 1.8l1.8 7.2v4.5c0 .99-.81 1.8-1.8 1.8H4.8c-.99 0-1.8-.81-1.8-1.8v-4.5zm6.96 1.8h4.08c-.49.557-1.212.9-2.04.9a2.68 2.68 0 0 1-2.04-.9h4.08c.414-.472.66-1.098.66-1.8h4.14l-1.44-7.2H6.6l-1.44 7.2H9.3c0 .702.246 1.328.66 1.8z" id="tray"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png
new file mode 100644 (file)
index 0000000..7426f56
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.svg
new file mode 100644 (file)
index 0000000..148da47
--- /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 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png
new file mode 100644 (file)
index 0000000..d797f3e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..e80e6ae
--- /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 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png
new file mode 100644 (file)
index 0000000..640bb2a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.svg
new file mode 100644 (file)
index 0000000..160219c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png
new file mode 100644 (file)
index 0000000..a02e2e0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg
new file mode 100644 (file)
index 0000000..8aace96
--- /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="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png
new file mode 100644 (file)
index 0000000..4d062cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..1337e16
--- /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="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png
new file mode 100644 (file)
index 0000000..2475b06
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.svg
new file mode 100644 (file)
index 0000000..90fe46a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png
new file mode 100644 (file)
index 0000000..8338017
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg
new file mode 100644 (file)
index 0000000..dba18af
--- /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="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</g></svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png
new file mode 100644 (file)
index 0000000..bf1a6e0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..e84befe
--- /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="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</g></svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png
new file mode 100644 (file)
index 0000000..780cb87
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.svg
new file mode 100644 (file)
index 0000000..4bbd61c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png
new file mode 100644 (file)
index 0000000..4f9c3ad
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg
new file mode 100644 (file)
index 0000000..88256ec
--- /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="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</g></svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png
new file mode 100644 (file)
index 0000000..4abe9c8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..fcb4d11
--- /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="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</g></svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png
new file mode 100644 (file)
index 0000000..fa3696a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.svg
new file mode 100644 (file)
index 0000000..5d94425
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
index 8fb039c..2cb27f1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-destructive.png differ
index 7ee7522..cf82e1f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z"/>
-</svg>
+</g></svg>
index bfc7a3f..3c6f966 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z"/>
-</svg>
+</g></svg>
index 86a7bb9..55b8cc3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z"/>
-</svg>
+</g></svg>
index 7c2786d..fac51b9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-destructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-destructive.png differ
index a5f2721..d70f3a9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #c33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z"/>
-</svg>
+</g></svg>
index 78cd92b..bfe53ad 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z"/>
-</svg>
+</g></svg>
index 272c543..20e4afa 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z"/>
-</svg>
+</g></svg>
index f9c609a..7265f4a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
-</svg>
+</g></svg>
index 8105090..b34f49b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
-</svg>
+</g></svg>
index f9c609a..7265f4a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png
new file mode 100644 (file)
index 0000000..af3f0e9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.svg
new file mode 100644 (file)
index 0000000..efa8e83
--- /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="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png
new file mode 100644 (file)
index 0000000..2f09eb6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..c5bf2cc
--- /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="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png
new file mode 100644 (file)
index 0000000..3b5231f
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.svg
new file mode 100644 (file)
index 0000000..64b3b71
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png
new file mode 100644 (file)
index 0000000..1cb5449
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg
new file mode 100644 (file)
index 0000000..3fb2085
--- /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="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png
new file mode 100644 (file)
index 0000000..e828b36
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..0a67774
--- /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="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png
new file mode 100644 (file)
index 0000000..a1d2388
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.svg
new file mode 100644 (file)
index 0000000..e5e4032
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
+</svg>
index 1fb4ca9..3078617 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="underline-a">
         <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623L12 7.997l1.51 4.38h-3z"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index ec858c9..99d9dad 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="underline-a">
         <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623L12 7.997l1.51 4.38h-3z"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 0c73875..8136276 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="underline-u">
         <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.658-1.666.98-2.98.98-1.32 0-2.32-.32-2.996-.98C8.336 14.37 8 13.41 8 12.13V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 691846b..2953213 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="underline-u">
         <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.658-1.666.98-2.98.98-1.32 0-2.32-.32-2.996-.98C8.336 14.37 8 13.41 8 12.13V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 7d91326..e5c84a9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 8l8 10H4z"/>
-</svg>
+</g></svg>
index 1757188..b6bbc97 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 8l8 10H4z"/>
-</svg>
+</g></svg>
index 818178e..4a7cf26 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 13c0 1.7 1.3 3 3 3V9h3l-4.5-5L7 9h3v4zm7 0v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index edeb448..85bb62f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 13c0 1.7 1.3 3 3 3V9h3l-4.5-5L7 9h3v4zm7 0v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index 9abf396..d347e6a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M13 13c0 1.7-1.3 3-3 3V9H7l4.5-5L16 9h-3v4zm-7 0v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index 29e8f16..d367074 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M13 13c0 1.7-1.3 3-3 3V9H7l4.5-5L16 9h-3v4zm-7 0v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index 93b7c5e..beefd8d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-2 4c.7 0 1.2.6 1.2 1.2s-.6 1.2-1.2 1.2-1.2-.6-1.2-1.2S13.3 9 14 9zM9 9c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2S8.3 9 9 9zm7 5.4c0 .2-.1.3-.3.5-.7.6-1.6 1-2.6 1.3s-2.1.2-3.1 0-2-.9-2.7-1.5c-.1-.1-.2-.3-.2-.4s.1-.3.2-.4c.1-.1.3-.2.4-.2.2 0 .3.1.4.2.5.5 1.2.9 2.1 1.1s1.7.2 2.6 0 1.6-.5 2.1-1c.1-.1.3-.2.4-.2s.3.1.5.2.2.2.2.4z"/>
-</svg>
+</g></svg>
index b1147fc..3232e97 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-2 4c.7 0 1.2.6 1.2 1.2s-.6 1.2-1.2 1.2-1.2-.6-1.2-1.2S13.3 9 14 9zM9 9c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2S8.3 9 9 9zm7 5.4c0 .2-.1.3-.3.5-.7.6-1.6 1-2.6 1.3s-2.1.2-3.1 0-2-.9-2.7-1.5c-.1-.1-.2-.3-.2-.4s.1-.3.2-.4c.1-.1.3-.2.4-.2.2 0 .3.1.4.2.5.5 1.2.9 2.1 1.1s1.7.2 2.6 0 1.6-.5 2.1-1c.1-.1.3-.2.4-.2s.3.1.5.2.2.2.2.4z"/>
-</svg>
+</g></svg>
index ad40b9e..08a382a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm2 4c-.7 0-1.2.6-1.2 1.2s.6 1.2 1.2 1.2 1.2-.6 1.2-1.2S9.7 9 9 9zm5 0c-.7 0-1.2.6-1.2 1.2s.5 1.3 1.2 1.3 1.2-.6 1.2-1.2S14.7 9 14 9zm-7 5.4c0 .2.1.3.3.5.7.6 1.6 1 2.6 1.3 1 .3 2.1.2 3.1 0s2-.9 2.7-1.5c.1-.1.2-.3.2-.4 0-.1-.1-.3-.2-.4-.1-.1-.3-.2-.4-.2-.2 0-.3.1-.4.2-.5.5-1.2.9-2.1 1.1-.9.2-1.7.2-2.6 0-.9-.2-1.6-.5-2.1-1-.1-.1-.3-.2-.4-.2-.1 0-.3.1-.5.2s-.2.2-.2.4z"/>
-</svg>
+</g></svg>
index 958e480..c38292e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm2 4c-.7 0-1.2.6-1.2 1.2s.6 1.2 1.2 1.2 1.2-.6 1.2-1.2S9.7 9 9 9zm5 0c-.7 0-1.2.6-1.2 1.2s.5 1.3 1.2 1.3 1.2-.6 1.2-1.2S14.7 9 14 9zm-7 5.4c0 .2.1.3.3.5.7.6 1.6 1 2.6 1.3 1 .3 2.1.2 3.1 0s2-.9 2.7-1.5c.1-.1.2-.3.2-.4 0-.1-.1-.3-.2-.4-.1-.1-.3-.2-.4-.2-.2 0-.3.1-.4.2-.5.5-1.2.9-2.1 1.1-.9.2-1.7.2-2.6 0-.9-.2-1.6-.5-2.1-1-.1-.1-.3-.2-.4-.2-.1 0-.3.1-.5.2s-.2.2-.2.4z"/>
-</svg>
+</g></svg>
index a2e039b..5f4e136 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18.75 17.4c-1.08-.36-3.6-1.35-3.6-1.35-.81-.27-.81-.99-.9-1.8v-.09c1.26-1.08 2.25-2.88 2.25-4.86 0-4.23-1.8-5.85-4.5-5.85-1.89 0-4.5 1.08-4.5 5.85 0 1.89.99 3.69 2.25 4.86v.09c0 .81-.09 1.53-.9 1.8 0 0-2.61.99-3.6 1.35-1.17.36-2.25.9-2.25 2.25v.9h18v-.9c0-1.08-.72-1.8-2.25-2.25z"/>
-</svg>
+</g></svg>
index 257f593..26ae8b6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18.75 17.4c-1.08-.36-3.6-1.35-3.6-1.35-.81-.27-.81-.99-.9-1.8v-.09c1.26-1.08 2.25-2.88 2.25-4.86 0-4.23-1.8-5.85-4.5-5.85-1.89 0-4.5 1.08-4.5 5.85 0 1.89.99 3.69 2.25 4.86v.09c0 .81-.09 1.53-.9 1.8 0 0-2.61.99-3.6 1.35-1.17.36-2.25.9-2.25 2.25v.9h18v-.9c0-1.08-.72-1.8-2.25-2.25z"/>
-</svg>
+</g></svg>
index c4049a5..075ea5c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-9.3 5.4C6.2 10 6 9.6 6 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6zm8.4 4.3c0 .2-.1.3-.3.4-1 .6-2.2.9-3.5.9-1.2 0-2.3-.3-3.3-1-.2-.1-.2-.2-.3-.4s0-.3.1-.5.2-.2.4-.3.3 0 .5.1c.8.5 1.7.8 2.8.8s2-.2 2.8-.7c.1-.1.3-.1.5-.1s.3.1.4.3l-.1.5zm1.2-4.3c-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6S12 9.6 12 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4z"/>
-</svg>
+</g></svg>
index 60165e7..f48929d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-9.3 5.4C6.2 10 6 9.6 6 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6zm8.4 4.3c0 .2-.1.3-.3.4-1 .6-2.2.9-3.5.9-1.2 0-2.3-.3-3.3-1-.2-.1-.2-.2-.3-.4s0-.3.1-.5.2-.2.4-.3.3 0 .5.1c.8.5 1.7.8 2.8.8s2-.2 2.8-.7c.1-.1.3-.1.5-.1s.3.1.4.3l-.1.5zm1.2-4.3c-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6S12 9.6 12 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4z"/>
-</svg>
+</g></svg>
index 2759926..0b3aa4d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm9.3 5.4c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S12.6 9.6 12 9c0 .6.2 1 .7 1.4.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6zm-8.4 4.3c0 .2.1.3.3.4 1 .6 2.2.9 3.5.9 1.2 0 2.3-.3 3.3-1 .2-.1.2-.2.3-.4.1-.2 0-.3-.1-.5s-.2-.2-.4-.3c-.2-.1-.3 0-.5.1-.8.5-1.7.8-2.8.8-1.1 0-2-.2-2.8-.7-.1-.1-.3-.1-.5-.1s-.3.1-.4.3l.1.5zm-1.2-4.3c.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S6.6 9.6 6 9c0 .6.2 1 .7 1.4z"/>
-</svg>
+</g></svg>
index 9ec8f4f..76d950c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm9.3 5.4c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S12.6 9.6 12 9c0 .6.2 1 .7 1.4.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6zm-8.4 4.3c0 .2.1.3.3.4 1 .6 2.2.9 3.5.9 1.2 0 2.3-.3 3.3-1 .2-.1.2-.2.3-.4.1-.2 0-.3-.1-.5s-.2-.2-.4-.3c-.2-.1-.3 0-.5.1-.8.5-1.7.8-2.8.8-1.1 0-2-.2-2.8-.7-.1-.1-.3-.1-.5-.1s-.3.1-.4.3l.1.5zm-1.2-4.3c.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S6.6 9.6 6 9c0 .6.2 1 .7 1.4z"/>
-</svg>
+</g></svg>
index c781931..934128f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm11.2 2.5c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2.6-1.3 1.2-1.3zm-5.4 0c.7 0 1.2.6 1.2 1.2s-.6 1.3-1.2 1.3-1.2-.6-1.2-1.2.5-1.3 1.2-1.3zm2.7 8.5c-5.1 0-6-5-6-5s2 1 6 1l6-1s-1 5-6 5z"/>
-</svg>
+</g></svg>
index 539f6f4..232a04a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm11.2 2.5c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2.6-1.3 1.2-1.3zm-5.4 0c.7 0 1.2.6 1.2 1.2s-.6 1.3-1.2 1.3-1.2-.6-1.2-1.2.5-1.3 1.2-1.3zm2.7 8.5c-5.1 0-6-5-6-5s2 1 6 1l6-1s-1 5-6 5z"/>
-</svg>
+</g></svg>
index dd8588a..5c48db2 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19 6v11l3 3H5c-1.7 0-3-1.3-3-3V6h17zM7.8 8.5c-.7 0-1.2.6-1.2 1.2S7.1 11 7.8 11 9 10.4 9 9.8s-.6-1.3-1.2-1.3zm5.4 0c-.7 0-1.2.6-1.2 1.2s.6 1.3 1.2 1.3 1.2-.6 1.2-1.2-.5-1.3-1.2-1.3zM10.5 17c5.1 0 6-5 6-5s-2 1-6 1l-6-1s1 5 6 5z"/>
-</svg>
+</g></svg>
index 32cad91..2a2b17b 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19 6v11l3 3H5c-1.7 0-3-1.3-3-3V6h17zM7.8 8.5c-.7 0-1.2.6-1.2 1.2S7.1 11 7.8 11 9 10.4 9 9.8s-.6-1.3-1.2-1.3zm5.4 0c-.7 0-1.2.6-1.2 1.2s.6 1.3 1.2 1.3 1.2-.6 1.2-1.2-.5-1.3-1.2-1.3zM10.5 17c5.1 0 6-5 6-5s-2 1-6 1l-6-1s1 5 6 5z"/>
-</svg>
+</g></svg>
index f33f917..b70f4f9 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="viewCompact">
         <circle cx="6" cy="6" r="2"/>
         <circle cx="12" cy="6" r="2"/>
@@ -11,4 +11,4 @@
         <circle cx="12" cy="18" r="2"/>
         <circle cx="18" cy="18" r="2"/>
     </g>
-</svg>
+</g></svg>
index 7f66bc7..a7edfc5 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="viewCompact">
         <circle cx="6" cy="6" r="2"/>
         <circle cx="12" cy="6" r="2"/>
@@ -11,4 +11,4 @@
         <circle cx="12" cy="18" r="2"/>
         <circle cx="18" cy="18" r="2"/>
     </g>
-</svg>
+</g></svg>
index cea83f9..1e349b3 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index 1e1d76b..c6588c2 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 34ee977..f2d6a87 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index d253a88..9b7b78d 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 0e7728f..10edb0f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M0 10v8h2.3c.3.6 1 1 1.7 1h4c1.5 0 2.7-.8 3-2h2c.3 1.2 1.5 2 3 2h4c.7 0 1.4 0 1.7-1H24v-8zm10 6c0 1-.4 2-2 2H4c-.6 0-1-.4-1-1v-3c0-.6.4-1 1-1h5c.6 0 1 .4 1 1zm11 1c0 .6-.4 1-1 1h-4c-1.6 0-2-1-2-2v-2c0-.6.4-1 1-1h5c.6 0 1 .4 1 1z"/>
-</svg>
+</g></svg>
index 5600602..ff99d08 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 212193f..6d06ede 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 08986e5..50224d0 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index e529a67..a2589bd 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 12e246c..72601da 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="wikiText">
         <path id="opening-bracket-inner" d="M7 19h3v-2H9V7h1V5H7z"/>
         <path id="closing-bracket-inner" d="M17 19h-3v-2h1V7h-1V5h3z"/>
         <path id="closing-bracket-outer" d="M21 19h-3v-2h1V7h-1V5h3z"/>
         <path id="opening-bracket-outer" d="M3 19h3v-2H5V7h1V5H3z"/>
     </g>
-</svg>
+</g></svg>
index 4afd5e0..f7ba89d 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="wikiText">
         <path id="opening-bracket-inner" d="M7 19h3v-2H9V7h1V5H7z"/>
         <path id="closing-bracket-inner" d="M17 19h-3v-2h1V7h-1V5h3z"/>
         <path id="closing-bracket-outer" d="M21 19h-3v-2h1V7h-1V5h3z"/>
         <path id="opening-bracket-outer" d="M3 19h3v-2H5V7h1V5H3z"/>
     </g>
-</svg>
+</g></svg>
index d373c0d..17d3645 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 7a49393..2b49b99 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 4021b30..fbb9cab 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<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)"/>
-</svg>
+</g></svg>
index a937688..a2f62ff 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<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)"/>
-</svg>
+</g></svg>
index eaaca54..bebd3a8 100644 (file)
@@ -1,7 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="window">
         <path id="title" d="M7 10h10v1H7z"/>
         <path id="frame" d="M16 19H8c-2.206 0-4-1.794-4-4V9c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zM8 7c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2V9c0-1.103-.897-2-2-2H8z"/>
     </g>
-</svg>
+</g></svg>
index cb2de06..9204afe 100644 (file)
@@ -1,7 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="window">
         <path id="title" d="M7 10h10v1H7z"/>
         <path id="frame" d="M16 19H8c-2.206 0-4-1.794-4-4V9c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zM8 7c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2V9c0-1.103-.897-2-2-2H8z"/>
     </g>
-</svg>
+</g></svg>
index bb38ce5..a520175 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <path d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zM5 7h2V2H5zm0 3h2V8H5z" id="alert"/>
-</svg>
+</g></svg>
index 8bff5c9..900e477 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index a02090b..e194d0d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<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>
-</svg>
+</g></svg>
index 422d51a..511359a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index d0c754b..9e0e569 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<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>
-</svg>
+</g></svg>
index b866ef9..fc6cb9a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 157f000..d032b05 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<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>
-</svg>
+</g></svg>
index 0623742..8f1a254 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 14bc04c..3b79abb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<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>
-</svg>
+</g></svg>
index ef83982..4e9221a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index e3fd49c..eb45dfc 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index ff05cfa..4ea1013 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 632eb89..efd0840 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 26e4913..ab95a3d 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 036697e..cc383ee 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index 51ff91d..5e8e395 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 3b2e1b6..19114d8 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index 2cd760a..015d02e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 349227a..91d0358 100644 (file)
@@ -15,7 +15,7 @@
                        "color": "#36c"
                },
                "destructive": {
-                       "color": "#c33"
+                       "color": "#d33"
                },
                "warning": {
                        "color": "#ff5d00"
index 8c78b67..ae68fc4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * QUnit 1.22.0
+ * QUnit 1.23.1
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2016-02-23T15:57Z
+ * Date: 2016-04-12T17:29Z
  */
 
 /** Font Family and Sizes */
index 84873ae..5df0822 100644 (file)
@@ -1,15 +1,15 @@
 /*!
- * QUnit 1.22.0
+ * QUnit 1.23.1
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2016-02-23T15:57Z
+ * Date: 2016-04-12T17:29Z
  */
 
-(function( global ) {
+( function( global ) {
 
 var QUnit = {};
 
@@ -27,7 +27,7 @@ var window = global.window;
 var defined = {
        document: window && window.document !== undefined,
        setTimeout: setTimeout !== undefined,
-       sessionStorage: (function() {
+       sessionStorage: ( function() {
                var x = "qunit-test-string";
                try {
                        sessionStorage.setItem( x, x );
@@ -46,7 +46,7 @@ var runStarted = false;
 var toString = Object.prototype.toString,
        hasOwn = Object.prototype.hasOwnProperty;
 
-// returns a new Array with the elements that are in a but not in b
+// Returns a new Array with the elements that are in a but not in b
 function diff( a, b ) {
        var i, j,
                result = a.slice();
@@ -63,7 +63,7 @@ function diff( a, b ) {
        return result;
 }
 
-// from jquery.js
+// From jquery.js
 function inArray( elem, array ) {
        if ( array.indexOf ) {
                return array.indexOf( elem );
@@ -157,32 +157,6 @@ function is( type, obj ) {
        return QUnit.objectType( obj ) === type;
 }
 
-var getUrlParams = function() {
-       var i, param, name, value;
-       var urlParams = {};
-       var location = window.location;
-       var params = location.search.slice( 1 ).split( "&" );
-       var length = params.length;
-
-       for ( i = 0; i < length; i++ ) {
-               if ( params[ i ] ) {
-                       param = params[ i ].split( "=" );
-                       name = decodeURIComponent( param[ 0 ] );
-
-                       // allow just a key to turn on a flag, e.g., test.html?noglobals
-                       value = param.length === 1 ||
-                               decodeURIComponent( param.slice( 1 ).join( "=" ) ) ;
-                       if ( urlParams[ name ] ) {
-                               urlParams[ name ] = [].concat( urlParams[ name ], value );
-                       } else {
-                               urlParams[ name ] = value;
-                       }
-               }
-       }
-
-       return urlParams;
-};
-
 // Doesn't support IE6 to IE9, it will return undefined on these browsers
 // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
 function extractStacktrace( e, offset ) {
@@ -212,12 +186,12 @@ function extractStacktrace( e, offset ) {
        // Support: Safari <=6 only
        } else if ( e.sourceURL ) {
 
-               // exclude useless self-reference for generated Error objects
+               // Exclude useless self-reference for generated Error objects
                if ( /qunit.js$/.test( e.sourceURL ) ) {
                        return;
                }
 
-               // for actual exceptions, this is useful
+               // For actual exceptions, this is useful
                return e.sourceURL + ":" + e.line;
        }
 }
@@ -244,53 +218,35 @@ function sourceFromStacktrace( offset ) {
  * `config` initialized at top of scope
  */
 var config = {
+
        // The queue of tests to run
        queue: [],
 
-       // block until document ready
+       // Block until document ready
        blocking: true,
 
-       // by default, run previously failed tests first
+       // By default, run previously failed tests first
        // very useful in combination with "Hide passed tests" checked
        reorder: true,
 
-       // by default, modify document.title when suite is done
+       // By default, modify document.title when suite is done
        altertitle: true,
 
        // HTML Reporter: collapse every test except the first failing test
        // If false, all failing tests will be expanded
        collapse: true,
 
-       // by default, scroll to top of the page when suite is done
+       // By default, scroll to top of the page when suite is done
        scrolltop: true,
 
-       // depth up-to which object will be dumped
+       // Depth up-to which object will be dumped
        maxDepth: 5,
 
-       // when enabled, all tests must call expect()
+       // When enabled, all tests must call expect()
        requireExpects: false,
 
-       // add checkboxes that are persisted in the query-string
-       // when enabled, the id is set to `true` as a `QUnit.config` property
-       urlConfig: [
-               {
-                       id: "hidepassed",
-                       label: "Hide passed tests",
-                       tooltip: "Only show tests and assertions that fail. Stored as query-strings."
-               },
-               {
-                       id: "noglobals",
-                       label: "Check for Globals",
-                       tooltip: "Enabling this will test if any test introduces new properties on the " +
-                               "global object (`window` in Browsers). Stored as query-strings."
-               },
-               {
-                       id: "notrycatch",
-                       label: "No try-catch",
-                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
-                               "exceptions in IE reasonable. Stored as query-strings."
-               }
-       ],
+       // Placeholder for user-configurable form-exposed URL parameters
+       urlConfig: [],
 
        // Set of all modules.
        modules: [],
@@ -307,27 +263,9 @@ var config = {
        callbacks: {}
 };
 
-var urlParams = defined.document ? getUrlParams() : {};
-
 // Push a loose unnamed module to the modules collection
 config.modules.push( config.currentModule );
 
-if ( urlParams.filter === true ) {
-       delete urlParams.filter;
-}
-
-// String search anywhere in moduleName+testName
-config.filter = urlParams.filter;
-
-config.testId = [];
-if ( urlParams.testId ) {
-       // Ensure that urlParams.testId is an array
-       urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," );
-       for (var i = 0; i < urlParams.testId.length; i++ ) {
-               config.testId.push( urlParams.testId[ i ] );
-       }
-}
-
 var loggingCallbacks = {};
 
 // Register logging callbacks
@@ -431,7 +369,7 @@ function verifyLoggingCallbacks() {
                                }
                                QUnit.pushFailure( error, filePath + ":" + linerNr );
                        } else {
-                               QUnit.test( "global failure", extend(function() {
+                               QUnit.test( "global failure", extend( function() {
                                        QUnit.pushFailure( error, filePath + ":" + linerNr );
                                }, { validTest: true } ) );
                        }
@@ -440,25 +378,23 @@ function verifyLoggingCallbacks() {
 
                return ret;
        };
-} )();
-
-QUnit.urlParams = urlParams;
+}() );
 
 // Figure out if we're running the tests from a server or not
 QUnit.isLocal = !( defined.document && window.location.protocol !== "file:" );
 
 // Expose the current QUnit version
-QUnit.version = "1.22.0";
+QUnit.version = "1.23.1";
 
 extend( QUnit, {
 
-       // call on start of module test to prepend name to all tests
+       // Call on start of module test to prepend name to all tests
        module: function( name, testEnvironment, executeNow ) {
                var module, moduleFns;
                var currentModule = config.currentModule;
 
                if ( arguments.length === 2 ) {
-                       if ( testEnvironment instanceof Function ) {
+                       if ( objectType( testEnvironment ) === "function" ) {
                                executeNow = testEnvironment;
                                testEnvironment = undefined;
                        }
@@ -482,7 +418,7 @@ extend( QUnit, {
                        afterEach: setHook( module, "afterEach" )
                };
 
-               if ( executeNow instanceof Function ) {
+               if ( objectType( executeNow ) === "function" ) {
                        config.moduleStack.push( module );
                        setCurrentModule( module );
                        executeNow.call( module.testEnvironment, moduleFns );
@@ -500,7 +436,8 @@ extend( QUnit, {
                        var module = {
                                name: moduleName,
                                parentModule: parentModule,
-                               tests: []
+                               tests: [],
+                               moduleId: generateHash( moduleName )
                        };
 
                        var env = {};
@@ -573,7 +510,7 @@ extend( QUnit, {
                                return;
                        }
 
-                       // throw an Error if start is called more often than stop
+                       // Throw an Error if start is called more often than stop
                        if ( config.current.semaphore < 0 ) {
                                config.current.semaphore = 0;
 
@@ -634,7 +571,7 @@ extend( QUnit, {
                offset = ( offset || 0 ) + 2;
                return sourceFromStacktrace( offset );
        }
-});
+} );
 
 registerLoggingCallbacks( QUnit );
 
@@ -657,17 +594,17 @@ function begin() {
 
                // Avoid unnecessary information by not logging modules' test environments
                for ( i = 0, l = config.modules.length; i < l; i++ ) {
-                       modulesLog.push({
+                       modulesLog.push( {
                                name: config.modules[ i ].name,
                                tests: config.modules[ i ].tests
-                       });
+                       } );
                }
 
                // The test run is officially beginning now
                runLoggingCallbacks( "begin", {
                        totalTests: Test.count,
                        modules: modulesLog
-               });
+               } );
        }
 
        config.blocking = false;
@@ -706,7 +643,7 @@ function pauseProcessing() {
 
        if ( config.testTimeout && defined.setTimeout ) {
                clearTimeout( config.timeout );
-               config.timeout = setTimeout(function() {
+               config.timeout = setTimeout( function() {
                        if ( config.current ) {
                                config.current.semaphore = 0;
                                QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
@@ -723,7 +660,7 @@ function resumeProcessing() {
 
        // A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)
        if ( defined.setTimeout ) {
-               setTimeout(function() {
+               setTimeout( function() {
                        if ( config.current && config.current.semaphore > 0 ) {
                                return;
                        }
@@ -752,7 +689,7 @@ function done() {
                        passed: config.moduleStats.all - config.moduleStats.bad,
                        total: config.moduleStats.all,
                        runtime: now() - config.moduleStats.started
-               });
+               } );
        }
        delete config.previousModule;
 
@@ -764,7 +701,7 @@ function done() {
                passed: passed,
                total: config.stats.all,
                runtime: runtime
-       });
+       } );
 }
 
 function setHook( module, hookName ) {
@@ -779,6 +716,7 @@ function setHook( module, hookName ) {
 
 var focused = false;
 var priorityCount = 0;
+var unitSampler;
 
 function Test( settings ) {
        var i, l;
@@ -801,10 +739,10 @@ function Test( settings ) {
 
        this.testId = generateHash( this.module.name, this.testName );
 
-       this.module.tests.push({
+       this.module.tests.push( {
                name: this.testName,
                testId: this.testId
-       });
+       } );
 
        if ( settings.skip ) {
 
@@ -840,14 +778,14 @@ Test.prototype = {
                                        passed: config.moduleStats.all - config.moduleStats.bad,
                                        total: config.moduleStats.all,
                                        runtime: now() - config.moduleStats.started
-                               });
+                               } );
                        }
                        config.previousModule = this.module;
                        config.moduleStats = { all: 0, bad: 0, started: now() };
                        runLoggingCallbacks( "moduleStart", {
                                name: this.module.name,
                                tests: this.module.tests
-                       });
+                       } );
                }
 
                config.current = this;
@@ -863,7 +801,7 @@ Test.prototype = {
                        name: this.testName,
                        module: this.module.name,
                        testId: this.testId
-               });
+               } );
 
                if ( !config.pollution ) {
                        saveGlobal();
@@ -892,7 +830,7 @@ Test.prototype = {
                        this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " +
                                this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
 
-                       // else next test will carry the responsibility
+                       // Else next test will carry the responsibility
                        saveGlobal();
 
                        // Restart the tests if they're blocking
@@ -1001,7 +939,7 @@ Test.prototype = {
 
                        // DEPRECATED: this property will be removed in 2.0.0, use runtime instead
                        duration: this.runtime
-               });
+               } );
 
                // QUnit.reset() is deprecated and will be replaced for a new
                // fixture reset function on QUnit 2.0/2.1.
@@ -1021,8 +959,8 @@ Test.prototype = {
 
                function run() {
 
-                       // each of these can by async
-                       synchronize([
+                       // Each of these can by async
+                       synchronize( [
                                function() {
                                        test.before();
                                },
@@ -1040,19 +978,19 @@ Test.prototype = {
                                function() {
                                        test.finish();
                                }
-                       ]);
+                       ] );
                }
 
                // Prioritize previously failed tests, detected from sessionStorage
                priority = QUnit.config.reorder && defined.sessionStorage &&
                                +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName );
 
-               return synchronize( run, priority );
+               return synchronize( run, priority, config.seed );
        },
 
        pushResult: function( resultInfo ) {
 
-               // resultInfo = { result, actual, expected, message, negative }
+               // Destructure of resultInfo = { result, actual, expected, message, negative }
                var source,
                        details = {
                                module: this.module.name,
@@ -1076,10 +1014,10 @@ Test.prototype = {
 
                runLoggingCallbacks( "log", details );
 
-               this.assertions.push({
+               this.assertions.push( {
                        result: !!resultInfo.result,
                        message: resultInfo.message
-               });
+               } );
        },
 
        pushFailure: function( message, source, actual ) {
@@ -1104,10 +1042,10 @@ Test.prototype = {
 
                runLoggingCallbacks( "log", details );
 
-               this.assertions.push({
+               this.assertions.push( {
                        result: false,
                        message: message
-               });
+               } );
        },
 
        resolvePromise: function( promise, phase ) {
@@ -1126,7 +1064,7 @@ Test.prototype = {
                                                        " " + test.testName + ": " + ( error.message || error );
                                                test.pushFailure( message, extractStacktrace( error, 0 ) );
 
-                                               // else next test will carry the responsibility
+                                               // Else next test will carry the responsibility
                                                saveGlobal();
 
                                                // Unblock
@@ -1140,30 +1078,43 @@ Test.prototype = {
        valid: function() {
                var filter = config.filter,
                        regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec( filter ),
-                       module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(),
+                       module = config.module && config.module.toLowerCase(),
                        fullName = ( this.module.name + ": " + this.testName );
 
-               function testInModuleChain( testModule ) {
+               function moduleChainNameMatch( testModule ) {
                        var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
                        if ( testModuleName === module ) {
                                return true;
                        } else if ( testModule.parentModule ) {
-                               return testInModuleChain( testModule.parentModule );
+                               return moduleChainNameMatch( testModule.parentModule );
                        } else {
                                return false;
                        }
                }
 
+               function moduleChainIdMatch( testModule ) {
+                       return inArray( testModule.moduleId, config.moduleId ) > -1 ||
+                               testModule.parentModule && moduleChainIdMatch( testModule.parentModule );
+               }
+
                // Internally-generated tests are always valid
                if ( this.callback && this.callback.validTest ) {
                        return true;
                }
 
-               if ( config.testId.length > 0 && inArray( this.testId, config.testId ) < 0 ) {
+               if ( config.moduleId && config.moduleId.length > 0 &&
+                       !moduleChainIdMatch( this.module ) ) {
+
+                       return false;
+               }
+
+               if ( config.testId && config.testId.length > 0 &&
+                       inArray( this.testId, config.testId ) < 0 ) {
+
                        return false;
                }
 
-               if ( module && !testInModuleChain( this.module ) ) {
+               if ( module && !moduleChainNameMatch( this.module ) ) {
                        return false;
                }
 
@@ -1172,7 +1123,7 @@ Test.prototype = {
                }
 
                return regexFilter ?
-                       this.regexFilter( !!regexFilter[1], regexFilter[2], regexFilter[3], fullName ) :
+                       this.regexFilter( !!regexFilter[ 1 ], regexFilter[ 2 ], regexFilter[ 3 ], fullName ) :
                        this.stringFilter( filter, fullName );
        },
 
@@ -1260,8 +1211,9 @@ function generateHash( module, testName ) {
        return hex.slice( -8 );
 }
 
-function synchronize( callback, priority ) {
-       var last = !priority;
+function synchronize( callback, priority, seed ) {
+       var last = !priority,
+               index;
 
        if ( QUnit.objectType( callback ) === "array" ) {
                while ( callback.length ) {
@@ -1272,6 +1224,14 @@ function synchronize( callback, priority ) {
 
        if ( priority ) {
                config.queue.splice( priorityCount++, 0, callback );
+       } else if ( seed ) {
+               if ( !unitSampler ) {
+                       unitSampler = unitSamplerGenerator( seed );
+               }
+
+               // Insert into a random position after all priority items
+               index = Math.floor( unitSampler() * ( config.queue.length - priorityCount + 1 ) );
+               config.queue.splice( priorityCount + index, 0, callback );
        } else {
                config.queue.push( callback );
        }
@@ -1281,6 +1241,25 @@ function synchronize( callback, priority ) {
        }
 }
 
+function unitSamplerGenerator( seed ) {
+
+       // 32-bit xorshift, requires only a nonzero seed
+       // http://excamera.com/sphinx/article-xorshift.html
+       var sample = parseInt( generateHash( seed ), 16 ) || -1;
+       return function() {
+               sample ^= sample << 13;
+               sample ^= sample >>> 17;
+               sample ^= sample << 5;
+
+               // ECMAScript has no unsigned number type
+               if ( sample < 0 ) {
+                       sample += 0x100000000;
+               }
+
+               return sample / 0x100000000;
+       };
+}
+
 function saveGlobal() {
        config.pollution = [];
 
@@ -1288,7 +1267,7 @@ function saveGlobal() {
                for ( var key in global ) {
                        if ( hasOwn.call( global, key ) ) {
 
-                               // in Opera sometimes DOM element ids show up here, ignore them
+                               // In Opera sometimes DOM element ids show up here, ignore them
                                if ( /^qunit-test-output/.test( key ) ) {
                                        continue;
                                }
@@ -1337,12 +1316,12 @@ function test( testName, expected, callback, async ) {
                expected = null;
        }
 
-       newTest = new Test({
+       newTest = new Test( {
                testName: testName,
                expected: expected,
                async: async,
                callback: callback
-       });
+       } );
 
        newTest.queue();
 }
@@ -1351,10 +1330,10 @@ function test( testName, expected, callback, async ) {
 function skip( testName ) {
        if ( focused )  { return; }
 
-       var test = new Test({
+       var test = new Test( {
                testName: testName,
                skip: true
-       });
+       } );
 
        test.queue();
 }
@@ -1373,12 +1352,12 @@ function only( testName, expected, callback, async ) {
                expected = null;
        }
 
-       newTest = new Test({
+       newTest = new Test( {
                testName: testName,
                expected: expected,
                async: async,
                callback: callback
-       });
+       } );
 
        newTest.queue();
 }
@@ -1448,7 +1427,7 @@ QUnit.assert = Assert.prototype = {
 
        pushResult: function( resultInfo ) {
 
-               // resultInfo = { result, actual, expected, message, negative }
+               // Destructure of resultInfo = { result, actual, expected, message, negative }
                var assert = this,
                        currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;
 
@@ -1594,7 +1573,7 @@ QUnit.assert = Assert.prototype = {
                currentTest.ignoreGlobalErrors = true;
                try {
                        block.call( currentTest.testEnvironment );
-               } catch (e) {
+               } catch ( e ) {
                        actual = e;
                }
                currentTest.ignoreGlobalErrors = false;
@@ -1602,30 +1581,30 @@ QUnit.assert = Assert.prototype = {
                if ( actual ) {
                        expectedType = QUnit.objectType( expected );
 
-                       // we don't want to validate thrown error
+                       // We don't want to validate thrown error
                        if ( !expected ) {
                                ok = true;
                                expectedOutput = null;
 
-                       // expected is a regexp
+                       // Expected is a regexp
                        } else if ( expectedType === "regexp" ) {
                                ok = expected.test( errorString( actual ) );
 
-                       // expected is a string
+                       // Expected is a string
                        } else if ( expectedType === "string" ) {
                                ok = expected === errorString( actual );
 
-                       // expected is a constructor, maybe an Error constructor
+                       // Expected is a constructor, maybe an Error constructor
                        } else if ( expectedType === "function" && actual instanceof expected ) {
                                ok = true;
 
-                       // expected is an Error object
+                       // Expected is an Error object
                        } else if ( expectedType === "object" ) {
                                ok = actual instanceof expected.constructor &&
                                        actual.name === expected.name &&
                                        actual.message === expected.message;
 
-                       // expected is a validation function which returns true if validation passed
+                       // Expected is a validation function which returns true if validation passed
                        } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) {
                                expectedOutput = null;
                                ok = true;
@@ -1643,10 +1622,10 @@ QUnit.assert = Assert.prototype = {
 
 // Provide an alternative to assert.throws(), for environments that consider throws a reserved word
 // Known to us are: Closure Compiler, Narwhal
-(function() {
+( function() {
        /*jshint sub:true */
-       Assert.prototype.raises = Assert.prototype[ "throws" ];
-}());
+       Assert.prototype.raises = Assert.prototype [ "throws" ]; //jscs:ignore requireDotNotation
+}() );
 
 function errorString( error ) {
        var name, message,
@@ -1670,7 +1649,7 @@ function errorString( error ) {
 
 // Test for equality any JavaScript type.
 // Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
+QUnit.equiv = ( function() {
 
        // Stack to decide between skip/abort functions
        var callers = [];
@@ -1766,7 +1745,8 @@ QUnit.equiv = (function() {
 
                        len = a.length;
                        if ( len !== b.length ) {
-                               // safe and faster
+
+                               // Safe and faster
                                return false;
                        }
 
@@ -1800,33 +1780,53 @@ QUnit.equiv = (function() {
                },
 
                "set": function( b, a ) {
-                       var aArray, bArray;
-
-                       aArray = [];
-                       a.forEach( function( v ) {
-                               aArray.push( v );
-                       });
-                       bArray = [];
-                       b.forEach( function( v ) {
-                               bArray.push( v );
-                       });
-
-                       return innerEquiv( bArray, aArray );
+                       var innerEq,
+                               outerEq = true;
+
+                       if ( a.size !== b.size ) {
+                               return false;
+                       }
+
+                       a.forEach( function( aVal ) {
+                               innerEq = false;
+
+                               b.forEach( function( bVal ) {
+                                       if ( innerEquiv( bVal, aVal ) ) {
+                                               innerEq = true;
+                                       }
+                               } );
+
+                               if ( !innerEq ) {
+                                       outerEq = false;
+                               }
+                       } );
+
+                       return outerEq;
                },
 
                "map": function( b, a ) {
-                       var aArray, bArray;
-
-                       aArray = [];
-                       a.forEach( function( v, k ) {
-                               aArray.push( [ k, v ] );
-                       });
-                       bArray = [];
-                       b.forEach( function( v, k ) {
-                               bArray.push( [ k, v ] );
-                       });
-
-                       return innerEquiv( bArray, aArray );
+                       var innerEq,
+                               outerEq = true;
+
+                       if ( a.size !== b.size ) {
+                               return false;
+                       }
+
+                       a.forEach( function( aVal, aKey ) {
+                               innerEq = false;
+
+                               b.forEach( function( bVal, bKey ) {
+                                       if ( innerEquiv( [ bVal, bKey ], [ aVal, aKey ] ) ) {
+                                               innerEq = true;
+                                       }
+                               } );
+
+                               if ( !innerEq ) {
+                                       outerEq = false;
+                               }
+                       } );
+
+                       return outerEq;
                },
 
                "object": function( b, a ) {
@@ -1908,11 +1908,11 @@ QUnit.equiv = (function() {
        }
 
        return innerEquiv;
-}());
+}() );
 
 // Based on jsDump by Ariel Flesler
 // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
-QUnit.dump = (function() {
+QUnit.dump = ( function() {
        function quote( str ) {
                return "\"" + str.toString().replace( /\\/g, "\\\\" ).replace( /"/g, "\\\"" ) + "\"";
        }
@@ -1950,7 +1950,7 @@ QUnit.dump = (function() {
        var reName = /^function (\w+)/,
                dump = {
 
-                       // objType is used mostly internally, you can fix a (custom) type in advance
+                       // The objType is used mostly internally, you can fix a (custom) type in advance
                        parse: function( obj, objType, stack ) {
                                stack = stack || [];
                                var res, parser, parserType,
@@ -1994,7 +1994,7 @@ QUnit.dump = (function() {
                                        type = "node";
                                } else if (
 
-                                       // native arrays
+                                       // Native arrays
                                        toString.call( obj ) === "[object Array]" ||
 
                                        // NodeList objects
@@ -2010,10 +2010,12 @@ QUnit.dump = (function() {
                                }
                                return type;
                        },
+
                        separator: function() {
                                return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&#160;" : " ";
                        },
-                       // extra can be a number, shortcut for increasing-calling-decreasing
+
+                       // Extra can be a number, shortcut for increasing-calling-decreasing
                        indent: function( extra ) {
                                if ( !this.multiline ) {
                                        return "";
@@ -2033,11 +2035,11 @@ QUnit.dump = (function() {
                        setParser: function( name, parser ) {
                                this.parsers[ name ] = parser;
                        },
+
                        // The next 3 are exposed so you can use them
                        quote: quote,
                        literal: literal,
                        join: join,
-                       //
                        depth: 1,
                        maxDepth: QUnit.config.maxDepth,
 
@@ -2054,13 +2056,13 @@ QUnit.dump = (function() {
                                "function": function( fn ) {
                                        var ret = "function",
 
-                                               // functions never have name in IE
+                                               // Functions never have name in IE
                                                name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
 
                                        if ( name ) {
                                                ret += " " + name;
                                        }
-                                       ret += "( ";
+                                       ret += "(";
 
                                        ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
                                        return join( ret, dump.parse( fn, "functionCode" ), "}" );
@@ -2131,7 +2133,7 @@ QUnit.dump = (function() {
                                        return ret + open + "/" + tag + close;
                                },
 
-                               // function calls it internally, it's the arguments part of the function
+                               // Function calls it internally, it's the arguments part of the function
                                functionArgs: function( fn ) {
                                        var args,
                                                l = fn.length;
@@ -2148,11 +2150,14 @@ QUnit.dump = (function() {
                                        }
                                        return " " + args.join( ", " ) + " ";
                                },
-                               // object calls it internally, the key part of an item in a map
+
+                               // Object calls it internally, the key part of an item in a map
                                key: quote,
-                               // function calls it internally, it's the content of the function
+
+                               // Function calls it internally, it's the content of the function
                                functionCode: "[code]",
-                               // node calls it internally, it's a html attribute value
+
+                               // Node calls it internally, it's a html attribute value
                                attribute: quote,
                                string: quote,
                                date: quote,
@@ -2160,23 +2165,26 @@ QUnit.dump = (function() {
                                number: literal,
                                "boolean": literal
                        },
-                       // if true, entities are escaped ( <, >, \t, space and \n )
+
+                       // If true, entities are escaped ( <, >, \t, space and \n )
                        HTML: false,
-                       // indentation unit
+
+                       // Indentation unit
                        indentChar: "  ",
-                       // if true, items in a collection, are separated by a \n, else just a space.
+
+                       // If true, items in a collection, are separated by a \n, else just a space.
                        multiline: true
                };
 
        return dump;
-}());
+}() );
 
-// back compat
+// Back compat
 QUnit.jsDump = QUnit.dump;
 
 // Deprecated
 // Extend assert methods to QUnit for Backwards compatibility
-(function() {
+( function() {
        var i,
                assertions = Assert.prototype;
 
@@ -2190,12 +2198,12 @@ QUnit.jsDump = QUnit.dump;
        for ( i in assertions ) {
                QUnit[ i ] = applyCurrent( assertions[ i ] );
        }
-})();
+}() );
 
 // For browser, export only select globals
 if ( defined.document ) {
 
-       (function() {
+       ( function() {
                var i, l,
                        keys = [
                                "test",
@@ -2221,7 +2229,7 @@ if ( defined.document ) {
                for ( i = 0, l = keys.length; i < l; i++ ) {
                        window[ keys[ i ] ] = QUnit[ keys[ i ] ];
                }
-       })();
+       }() );
 
        window.QUnit = QUnit;
 }
@@ -2246,1959 +2254,2081 @@ if ( typeof define === "function" && define.amd ) {
        QUnit.config.autostart = false;
 }
 
-/*
- * This file is a modified version of google-diff-match-patch's JavaScript implementation
- * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
- * modifications are licensed as more fully set forth in LICENSE.txt.
- *
- * The original source of google-diff-match-patch is attributable and licensed as follows:
- *
- * Copyright 2006 Google Inc.
- * https://code.google.com/p/google-diff-match-patch/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://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 OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * More Info:
- *  https://code.google.com/p/google-diff-match-patch/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- */
-QUnit.diff = ( function() {
-       function DiffMatchPatch() {
-       }
+// Get a reference to the global object, like window in browsers
+}( ( function() {
+       return this;
+}() ) ) );
 
-       //  DIFF FUNCTIONS
+( function() {
 
-       /**
-        * The data structure representing a diff is an array of tuples:
-        * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
-        * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
-        */
-       var DIFF_DELETE = -1,
-               DIFF_INSERT = 1,
-               DIFF_EQUAL = 0;
+// Only interact with URLs via window.location
+var location = typeof window !== "undefined" && window.location;
+if ( !location ) {
+       return;
+}
 
-       /**
-        * Find the differences between two texts.  Simplifies the problem by stripping
-        * any common prefix or suffix off the texts before diffing.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {boolean=} optChecklines Optional speedup flag. If present and false,
-        *     then don't run a line-level diff first to identify the changed areas.
-        *     Defaults to true, which does a faster, slightly less optimal diff.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
-               var deadline, checklines, commonlength,
-                       commonprefix, commonsuffix, diffs;
+var urlParams = getUrlParams();
 
-               // The diff must be complete in up to 1 second.
-               deadline = ( new Date() ).getTime() + 1000;
+QUnit.urlParams = urlParams;
 
-               // Check for null inputs.
-               if ( text1 === null || text2 === null ) {
-                       throw new Error( "Null input. (DiffMain)" );
-               }
+// Match module/test by inclusion in an array
+QUnit.config.moduleId = [].concat( urlParams.moduleId || [] );
+QUnit.config.testId = [].concat( urlParams.testId || [] );
 
-               // Check for equality (speedup).
-               if ( text1 === text2 ) {
-                       if ( text1 ) {
-                               return [
-                                       [ DIFF_EQUAL, text1 ]
-                               ];
-                       }
-                       return [];
-               }
+// Exact case-insensitive match of the module name
+QUnit.config.module = urlParams.module;
 
-               if ( typeof optChecklines === "undefined" ) {
-                       optChecklines = true;
-               }
+// Regular expression or case-insenstive substring match against "moduleName: testName"
+QUnit.config.filter = urlParams.filter;
 
-               checklines = optChecklines;
+// Test order randomization
+if ( urlParams.seed === true ) {
 
-               // Trim off common prefix (speedup).
-               commonlength = this.diffCommonPrefix( text1, text2 );
-               commonprefix = text1.substring( 0, commonlength );
-               text1 = text1.substring( commonlength );
-               text2 = text2.substring( commonlength );
+       // Generate a random seed if the option is specified without a value
+       QUnit.config.seed = Math.random().toString( 36 ).slice( 2 );
+} else if ( urlParams.seed ) {
+       QUnit.config.seed = urlParams.seed;
+}
 
-               // Trim off common suffix (speedup).
-               commonlength = this.diffCommonSuffix( text1, text2 );
-               commonsuffix = text1.substring( text1.length - commonlength );
-               text1 = text1.substring( 0, text1.length - commonlength );
-               text2 = text2.substring( 0, text2.length - commonlength );
+// Add URL-parameter-mapped config values with UI form rendering data
+QUnit.config.urlConfig.push(
+       {
+               id: "hidepassed",
+               label: "Hide passed tests",
+               tooltip: "Only show tests and assertions that fail. Stored as query-strings."
+       },
+       {
+               id: "noglobals",
+               label: "Check for Globals",
+               tooltip: "Enabling this will test if any test introduces new properties on the " +
+                       "global object (`window` in Browsers). Stored as query-strings."
+       },
+       {
+               id: "notrycatch",
+               label: "No try-catch",
+               tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
+                       "exceptions in IE reasonable. Stored as query-strings."
+       }
+);
 
-               // Compute the diff on the middle block.
-               diffs = this.diffCompute( text1, text2, checklines, deadline );
+QUnit.begin( function() {
+       var i, option,
+               urlConfig = QUnit.config.urlConfig;
 
-               // Restore the prefix and suffix.
-               if ( commonprefix ) {
-                       diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
-               }
-               if ( commonsuffix ) {
-                       diffs.push( [ DIFF_EQUAL, commonsuffix ] );
-               }
-               this.diffCleanupMerge( diffs );
-               return diffs;
-       };
+       for ( i = 0; i < urlConfig.length; i++ ) {
 
-       /**
-        * Reduce the number of edits by eliminating operationally trivial equalities.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
-               var changes, equalities, equalitiesLength, lastequality,
-                       pointer, preIns, preDel, postIns, postDel;
-               changes = false;
-               equalities = []; // Stack of indices where equalities are found.
-               equalitiesLength = 0; // Keeping our own length var is faster in JS.
-               /** @type {?string} */
-               lastequality = null;
-               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
-               pointer = 0; // Index of current position.
-               // Is there an insertion operation before the last equality.
-               preIns = false;
-               // Is there a deletion operation before the last equality.
-               preDel = false;
-               // Is there an insertion operation after the last equality.
-               postIns = false;
-               // Is there a deletion operation after the last equality.
-               postDel = false;
-               while ( pointer < diffs.length ) {
+               // Options can be either strings or objects with nonempty "id" properties
+               option = QUnit.config.urlConfig[ i ];
+               if ( typeof option !== "string" ) {
+                       option = option.id;
+               }
 
-                       // Equality found.
-                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
-                               if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
+               if ( QUnit.config[ option ] === undefined ) {
+                       QUnit.config[ option ] = urlParams[ option ];
+               }
+       }
+} );
 
-                                       // Candidate found.
-                                       equalities[ equalitiesLength++ ] = pointer;
-                                       preIns = postIns;
-                                       preDel = postDel;
-                                       lastequality = diffs[ pointer ][ 1 ];
-                               } else {
+function getUrlParams() {
+       var i, param, name, value;
+       var urlParams = {};
+       var params = location.search.slice( 1 ).split( "&" );
+       var length = params.length;
 
-                                       // Not a candidate, and can never become one.
-                                       equalitiesLength = 0;
-                                       lastequality = null;
-                               }
-                               postIns = postDel = false;
+       for ( i = 0; i < length; i++ ) {
+               if ( params[ i ] ) {
+                       param = params[ i ].split( "=" );
+                       name = decodeURIComponent( param[ 0 ] );
 
-                       // An insertion or deletion.
+                       // Allow just a key to turn on a flag, e.g., test.html?noglobals
+                       value = param.length === 1 ||
+                               decodeURIComponent( param.slice( 1 ).join( "=" ) ) ;
+                       if ( urlParams[ name ] ) {
+                               urlParams[ name ] = [].concat( urlParams[ name ], value );
                        } else {
+                               urlParams[ name ] = value;
+                       }
+               }
+       }
 
-                               if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
-                                       postDel = true;
-                               } else {
-                                       postIns = true;
-                               }
+       return urlParams;
+}
 
-                               /*
-                                * Five types to be split:
-                                * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
-                                * <ins>A</ins>X<ins>C</ins><del>D</del>
-                                * <ins>A</ins><del>B</del>X<ins>C</ins>
-                                * <ins>A</del>X<ins>C</ins><del>D</del>
-                                * <ins>A</ins><del>B</del>X<del>C</del>
-                                */
-                               if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
-                                               ( ( lastequality.length < 2 ) &&
-                                               ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
+// Don't load the HTML Reporter on non-browser environments
+if ( typeof window === "undefined" || !window.document ) {
+       return;
+}
 
-                                       // Duplicate record.
-                                       diffs.splice(
-                                               equalities[ equalitiesLength - 1 ],
-                                               0,
-                                               [ DIFF_DELETE, lastequality ]
-                                       );
+// Deprecated QUnit.init - Ref #530
+// Re-initialize the configuration options
+QUnit.init = function() {
+       var config = QUnit.config;
 
-                                       // Change second copy to insert.
-                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
-                                       equalitiesLength--; // Throw away the equality we just deleted;
-                                       lastequality = null;
-                                       if ( preIns && preDel ) {
-                                               // No changes made which could affect previous entry, keep going.
-                                               postIns = postDel = true;
-                                               equalitiesLength = 0;
-                                       } else {
-                                               equalitiesLength--; // Throw away the previous equality.
-                                               pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
-                                               postIns = postDel = false;
-                                       }
-                                       changes = true;
-                               }
-                       }
-                       pointer++;
-               }
+       config.stats = { all: 0, bad: 0 };
+       config.moduleStats = { all: 0, bad: 0 };
+       config.started = 0;
+       config.updateRate = 1000;
+       config.blocking = false;
+       config.autostart = true;
+       config.autorun = false;
+       config.filter = "";
+       config.queue = [];
 
-               if ( changes ) {
-                       this.diffCleanupMerge( diffs );
-               }
-       };
+       appendInterface();
+};
 
-       /**
-        * Convert a diff array into a pretty HTML report.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        * @param {integer} string to be beautified.
-        * @return {string} HTML representation.
-        */
-       DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
-               var op, data, x,
-                       html = [];
-               for ( x = 0; x < diffs.length; x++ ) {
-                       op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
-                       data = diffs[ x ][ 1 ]; // Text of change.
-                       switch ( op ) {
-                       case DIFF_INSERT:
-                               html[ x ] = "<ins>" + data + "</ins>";
-                               break;
-                       case DIFF_DELETE:
-                               html[ x ] = "<del>" + data + "</del>";
-                               break;
-                       case DIFF_EQUAL:
-                               html[ x ] = "<span>" + data + "</span>";
-                               break;
+var config = QUnit.config,
+       document = window.document,
+       collapseNext = false,
+       hasOwn = Object.prototype.hasOwnProperty,
+       unfilteredUrl = setUrl( { filter: undefined, module: undefined,
+               moduleId: undefined, testId: undefined } ),
+       defined = {
+               sessionStorage: ( function() {
+                       var x = "qunit-test-string";
+                       try {
+                               sessionStorage.setItem( x, x );
+                               sessionStorage.removeItem( x );
+                               return true;
+                       } catch ( e ) {
+                               return false;
                        }
-               }
-               return html.join( "" );
-       };
+               }() )
+       },
+       modulesList = [];
 
-       /**
-        * Determine the common prefix of two strings.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {number} The number of characters common to the start of each
-        *     string.
-        */
-       DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
-               var pointermid, pointermax, pointermin, pointerstart;
-               // Quick check for common null cases.
-               if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
-                       return 0;
-               }
-               // Binary search.
-               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
-               pointermin = 0;
-               pointermax = Math.min( text1.length, text2.length );
-               pointermid = pointermax;
-               pointerstart = 0;
-               while ( pointermin < pointermid ) {
-                       if ( text1.substring( pointerstart, pointermid ) ===
-                                       text2.substring( pointerstart, pointermid ) ) {
-                               pointermin = pointermid;
-                               pointerstart = pointermin;
-                       } else {
-                               pointermax = pointermid;
-                       }
-                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
-               }
-               return pointermid;
-       };
+/**
+* Escape text for attribute or text content.
+*/
+function escapeText( s ) {
+       if ( !s ) {
+               return "";
+       }
+       s = s + "";
 
-       /**
-        * Determine the common suffix of two strings.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {number} The number of characters common to the end of each string.
-        */
-       DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
-               var pointermid, pointermax, pointermin, pointerend;
-               // Quick check for common null cases.
-               if ( !text1 ||
-                               !text2 ||
-                               text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
-                       return 0;
-               }
-               // Binary search.
-               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
-               pointermin = 0;
-               pointermax = Math.min( text1.length, text2.length );
-               pointermid = pointermax;
-               pointerend = 0;
-               while ( pointermin < pointermid ) {
-                       if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
-                                       text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
-                               pointermin = pointermid;
-                               pointerend = pointermin;
-                       } else {
-                               pointermax = pointermid;
-                       }
-                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+       // Both single quotes and double quotes (for attributes)
+       return s.replace( /['"<>&]/g, function( s ) {
+               switch ( s ) {
+               case "'":
+                       return "&#039;";
+               case "\"":
+                       return "&quot;";
+               case "<":
+                       return "&lt;";
+               case ">":
+                       return "&gt;";
+               case "&":
+                       return "&amp;";
                }
-               return pointermid;
-       };
-
-       /**
-        * Find the differences between two texts.  Assumes that the texts do not
-        * have any common prefix or suffix.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {boolean} checklines Speedup flag.  If false, then don't run a
-        *     line-level diff first to identify the changed areas.
-        *     If true, then run a faster, slightly less optimal diff.
-        * @param {number} deadline Time when the diff should be complete by.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
-               var diffs, longtext, shorttext, i, hm,
-                       text1A, text2A, text1B, text2B,
-                       midCommon, diffsA, diffsB;
+       } );
+}
 
-               if ( !text1 ) {
-                       // Just add some text (speedup).
-                       return [
-                               [ DIFF_INSERT, text2 ]
-                       ];
-               }
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvent( elem, type, fn ) {
+       if ( elem.addEventListener ) {
 
-               if ( !text2 ) {
-                       // Just delete some text (speedup).
-                       return [
-                               [ DIFF_DELETE, text1 ]
-                       ];
-               }
+               // Standards-based browsers
+               elem.addEventListener( type, fn, false );
+       } else if ( elem.attachEvent ) {
 
-               longtext = text1.length > text2.length ? text1 : text2;
-               shorttext = text1.length > text2.length ? text2 : text1;
-               i = longtext.indexOf( shorttext );
-               if ( i !== -1 ) {
-                       // Shorter text is inside the longer text (speedup).
-                       diffs = [
-                               [ DIFF_INSERT, longtext.substring( 0, i ) ],
-                               [ DIFF_EQUAL, shorttext ],
-                               [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
-                       ];
-                       // Swap insertions for deletions if diff is reversed.
-                       if ( text1.length > text2.length ) {
-                               diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
+               // Support: IE <9
+               elem.attachEvent( "on" + type, function() {
+                       var event = window.event;
+                       if ( !event.target ) {
+                               event.target = event.srcElement || document;
                        }
-                       return diffs;
-               }
 
-               if ( shorttext.length === 1 ) {
-                       // Single character string.
-                       // After the previous speedup, the character can't be an equality.
-                       return [
-                               [ DIFF_DELETE, text1 ],
-                               [ DIFF_INSERT, text2 ]
-                       ];
-               }
+                       fn.call( elem, event );
+               } );
+       }
+}
 
-               // Check to see if the problem can be split in two.
-               hm = this.diffHalfMatch( text1, text2 );
-               if ( hm ) {
-                       // A half-match was found, sort out the return data.
-                       text1A = hm[ 0 ];
-                       text1B = hm[ 1 ];
-                       text2A = hm[ 2 ];
-                       text2B = hm[ 3 ];
-                       midCommon = hm[ 4 ];
-                       // Send both pairs off for separate processing.
-                       diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
-                       diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
-                       // Merge the results.
-                       return diffsA.concat( [
-                               [ DIFF_EQUAL, midCommon ]
-                       ], diffsB );
-               }
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+       var i = elems.length;
+       while ( i-- ) {
+               addEvent( elems[ i ], type, fn );
+       }
+}
 
-               if ( checklines && text1.length > 100 && text2.length > 100 ) {
-                       return this.diffLineMode( text1, text2, deadline );
-               }
+function hasClass( elem, name ) {
+       return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
+}
 
-               return this.diffBisect( text1, text2, deadline );
-       };
+function addClass( elem, name ) {
+       if ( !hasClass( elem, name ) ) {
+               elem.className += ( elem.className ? " " : "" ) + name;
+       }
+}
 
-       /**
-        * Do the two texts share a substring which is at least half the length of the
-        * longer text?
-        * This speedup can produce non-minimal diffs.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {Array.<string>} Five element Array, containing the prefix of
-        *     text1, the suffix of text1, the prefix of text2, the suffix of
-        *     text2 and the common middle.  Or null if there was no match.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
-               var longtext, shorttext, dmp,
-                       text1A, text2B, text2A, text1B, midCommon,
-                       hm1, hm2, hm;
+function toggleClass( elem, name, force ) {
+       if ( force || typeof force === "undefined" && !hasClass( elem, name ) ) {
+               addClass( elem, name );
+       } else {
+               removeClass( elem, name );
+       }
+}
 
-               longtext = text1.length > text2.length ? text1 : text2;
-               shorttext = text1.length > text2.length ? text2 : text1;
-               if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
-                       return null; // Pointless.
+function removeClass( elem, name ) {
+       var set = " " + elem.className + " ";
+
+       // Class name may appear multiple times
+       while ( set.indexOf( " " + name + " " ) >= 0 ) {
+               set = set.replace( " " + name + " ", " " );
+       }
+
+       // Trim for prettiness
+       elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
+}
+
+function id( name ) {
+       return document.getElementById && document.getElementById( name );
+}
+
+function getUrlConfigHtml() {
+       var i, j, val,
+               escaped, escapedTooltip,
+               selection = false,
+               urlConfig = config.urlConfig,
+               urlConfigHtml = "";
+
+       for ( i = 0; i < urlConfig.length; i++ ) {
+
+               // Options can be either strings or objects with nonempty "id" properties
+               val = config.urlConfig[ i ];
+               if ( typeof val === "string" ) {
+                       val = {
+                               id: val,
+                               label: val
+                       };
                }
-               dmp = this; // 'this' becomes 'window' in a closure.
 
-               /**
-                * Does a substring of shorttext exist within longtext such that the substring
-                * is at least half the length of longtext?
-                * Closure, but does not reference any external variables.
-                * @param {string} longtext Longer string.
-                * @param {string} shorttext Shorter string.
-                * @param {number} i Start index of quarter length substring within longtext.
-                * @return {Array.<string>} Five element Array, containing the prefix of
-                *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
-                *     of shorttext and the common middle.  Or null if there was no match.
-                * @private
-                */
-               function diffHalfMatchI( longtext, shorttext, i ) {
-                       var seed, j, bestCommon, prefixLength, suffixLength,
-                               bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
-                       // Start with a 1/4 length substring at position i as a seed.
-                       seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
-                       j = -1;
-                       bestCommon = "";
-                       while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
-                               prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
-                                       shorttext.substring( j ) );
-                               suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
-                                       shorttext.substring( 0, j ) );
-                               if ( bestCommon.length < suffixLength + prefixLength ) {
-                                       bestCommon = shorttext.substring( j - suffixLength, j ) +
-                                               shorttext.substring( j, j + prefixLength );
-                                       bestLongtextA = longtext.substring( 0, i - suffixLength );
-                                       bestLongtextB = longtext.substring( i + prefixLength );
-                                       bestShorttextA = shorttext.substring( 0, j - suffixLength );
-                                       bestShorttextB = shorttext.substring( j + prefixLength );
+               escaped = escapeText( val.id );
+               escapedTooltip = escapeText( val.tooltip );
+
+               if ( !val.value || typeof val.value === "string" ) {
+                       urlConfigHtml += "<input id='qunit-urlconfig-" + escaped +
+                               "' name='" + escaped + "' type='checkbox'" +
+                               ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
+                               ( config[ val.id ] ? " checked='checked'" : "" ) +
+                               " title='" + escapedTooltip + "' /><label for='qunit-urlconfig-" + escaped +
+                               "' title='" + escapedTooltip + "'>" + val.label + "</label>";
+               } else {
+                       urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
+                               "' title='" + escapedTooltip + "'>" + val.label +
+                               ": </label><select id='qunit-urlconfig-" + escaped +
+                               "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
+
+                       if ( QUnit.is( "array", val.value ) ) {
+                               for ( j = 0; j < val.value.length; j++ ) {
+                                       escaped = escapeText( val.value[ j ] );
+                                       urlConfigHtml += "<option value='" + escaped + "'" +
+                                               ( config[ val.id ] === val.value[ j ] ?
+                                                       ( selection = true ) && " selected='selected'" : "" ) +
+                                               ">" + escaped + "</option>";
                                }
-                       }
-                       if ( bestCommon.length * 2 >= longtext.length ) {
-                               return [ bestLongtextA, bestLongtextB,
-                                       bestShorttextA, bestShorttextB, bestCommon
-                               ];
                        } else {
-                               return null;
+                               for ( j in val.value ) {
+                                       if ( hasOwn.call( val.value, j ) ) {
+                                               urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
+                                                       ( config[ val.id ] === j ?
+                                                               ( selection = true ) && " selected='selected'" : "" ) +
+                                                       ">" + escapeText( val.value[ j ] ) + "</option>";
+                                       }
+                               }
+                       }
+                       if ( config[ val.id ] && !selection ) {
+                               escaped = escapeText( config[ val.id ] );
+                               urlConfigHtml += "<option value='" + escaped +
+                                       "' selected='selected' disabled='disabled'>" + escaped + "</option>";
                        }
+                       urlConfigHtml += "</select>";
                }
+       }
 
-               // First check if the second quarter is the seed for a half-match.
-               hm1 = diffHalfMatchI( longtext, shorttext,
-                       Math.ceil( longtext.length / 4 ) );
-               // Check again based on the third quarter.
-               hm2 = diffHalfMatchI( longtext, shorttext,
-                       Math.ceil( longtext.length / 2 ) );
-               if ( !hm1 && !hm2 ) {
-                       return null;
-               } else if ( !hm2 ) {
-                       hm = hm1;
-               } else if ( !hm1 ) {
-                       hm = hm2;
-               } else {
-                       // Both matched.  Select the longest.
-                       hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
-               }
+       return urlConfigHtml;
+}
 
-               // A half-match was found, sort out the return data.
-               text1A, text1B, text2A, text2B;
-               if ( text1.length > text2.length ) {
-                       text1A = hm[ 0 ];
-                       text1B = hm[ 1 ];
-                       text2A = hm[ 2 ];
-                       text2B = hm[ 3 ];
-               } else {
-                       text2A = hm[ 0 ];
-                       text2B = hm[ 1 ];
-                       text1A = hm[ 2 ];
-                       text1B = hm[ 3 ];
+// Handle "click" events on toolbar checkboxes and "change" for select menus.
+// Updates the URL with the new state of `config.urlConfig` values.
+function toolbarChanged() {
+       var updatedUrl, value, tests,
+               field = this,
+               params = {};
+
+       // Detect if field is a select menu or a checkbox
+       if ( "selectedIndex" in field ) {
+               value = field.options[ field.selectedIndex ].value || undefined;
+       } else {
+               value = field.checked ? ( field.defaultValue || true ) : undefined;
+       }
+
+       params[ field.name ] = value;
+       updatedUrl = setUrl( params );
+
+       // Check if we can apply the change without a page refresh
+       if ( "hidepassed" === field.name && "replaceState" in window.history ) {
+               QUnit.urlParams[ field.name ] = value;
+               config[ field.name ] = value || false;
+               tests = id( "qunit-tests" );
+               if ( tests ) {
+                       toggleClass( tests, "hidepass", value || false );
                }
-               midCommon = hm[ 4 ];
-               return [ text1A, text1B, text2A, text2B, midCommon ];
-       };
+               window.history.replaceState( null, "", updatedUrl );
+       } else {
+               window.location = updatedUrl;
+       }
+}
 
-       /**
-        * Do a quick line-level diff on both strings, then rediff the parts for
-        * greater accuracy.
-        * This speedup can produce non-minimal diffs.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {number} deadline Time when the diff should be complete by.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
-               var a, diffs, linearray, pointer, countInsert,
-                       countDelete, textInsert, textDelete, j;
-               // Scan the text on a line-by-line basis first.
-               a = this.diffLinesToChars( text1, text2 );
-               text1 = a.chars1;
-               text2 = a.chars2;
-               linearray = a.lineArray;
+function setUrl( params ) {
+       var key, arrValue, i,
+               querystring = "?",
+               location = window.location;
 
-               diffs = this.DiffMain( text1, text2, false, deadline );
+       params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
 
-               // Convert the diff back to original text.
-               this.diffCharsToLines( diffs, linearray );
-               // Eliminate freak matches (e.g. blank lines)
-               this.diffCleanupSemantic( diffs );
+       for ( key in params ) {
 
-               // Rediff any replacement blocks, this time character-by-character.
-               // Add a dummy entry at the end.
-               diffs.push( [ DIFF_EQUAL, "" ] );
-               pointer = 0;
-               countDelete = 0;
-               countInsert = 0;
-               textDelete = "";
-               textInsert = "";
-               while ( pointer < diffs.length ) {
-                       switch ( diffs[ pointer ][ 0 ] ) {
-                       case DIFF_INSERT:
-                               countInsert++;
-                               textInsert += diffs[ pointer ][ 1 ];
-                               break;
-                       case DIFF_DELETE:
-                               countDelete++;
-                               textDelete += diffs[ pointer ][ 1 ];
-                               break;
-                       case DIFF_EQUAL:
-                               // Upon reaching an equality, check for prior redundancies.
-                               if ( countDelete >= 1 && countInsert >= 1 ) {
-                                       // Delete the offending records and add the merged ones.
-                                       diffs.splice( pointer - countDelete - countInsert,
-                                               countDelete + countInsert );
-                                       pointer = pointer - countDelete - countInsert;
-                                       a = this.DiffMain( textDelete, textInsert, false, deadline );
-                                       for ( j = a.length - 1; j >= 0; j-- ) {
-                                               diffs.splice( pointer, 0, a[ j ] );
-                                       }
-                                       pointer = pointer + a.length;
+               // Skip inherited or undefined properties
+               if ( hasOwn.call( params, key ) && params[ key ] !== undefined ) {
+
+                       // Output a parameter for each value of this key (but usually just one)
+                       arrValue = [].concat( params[ key ] );
+                       for ( i = 0; i < arrValue.length; i++ ) {
+                               querystring += encodeURIComponent( key );
+                               if ( arrValue[ i ] !== true ) {
+                                       querystring += "=" + encodeURIComponent( arrValue[ i ] );
                                }
-                               countInsert = 0;
-                               countDelete = 0;
-                               textDelete = "";
-                               textInsert = "";
-                               break;
+                               querystring += "&";
                        }
-                       pointer++;
                }
-               diffs.pop(); // Remove the dummy entry at the end.
+       }
+       return location.protocol + "//" + location.host +
+               location.pathname + querystring.slice( 0, -1 );
+}
 
-               return diffs;
-       };
+function applyUrlParams() {
+       var selectedModule,
+               modulesList = id( "qunit-modulefilter" ),
+               filter = id( "qunit-filter-input" ).value;
 
-       /**
-        * Find the 'middle snake' of a diff, split the problem in two
-        * and return the recursively constructed diff.
-        * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {number} deadline Time at which to bail if not yet complete.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
-               var text1Length, text2Length, maxD, vOffset, vLength,
-                       v1, v2, x, delta, front, k1start, k1end, k2start,
-                       k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
-               // Cache the text lengths to prevent multiple calls.
-               text1Length = text1.length;
-               text2Length = text2.length;
-               maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
-               vOffset = maxD;
-               vLength = 2 * maxD;
-               v1 = new Array( vLength );
-               v2 = new Array( vLength );
-               // Setting all elements to -1 is faster in Chrome & Firefox than mixing
-               // integers and undefined.
-               for ( x = 0; x < vLength; x++ ) {
-                       v1[ x ] = -1;
-                       v2[ x ] = -1;
+       selectedModule = modulesList ?
+               decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :
+               undefined;
+
+       window.location = setUrl( {
+               module: ( selectedModule === "" ) ? undefined : selectedModule,
+               filter: ( filter === "" ) ? undefined : filter,
+
+               // Remove moduleId and testId filters
+               moduleId: undefined,
+               testId: undefined
+       } );
+}
+
+function toolbarUrlConfigContainer() {
+       var urlConfigContainer = document.createElement( "span" );
+
+       urlConfigContainer.innerHTML = getUrlConfigHtml();
+       addClass( urlConfigContainer, "qunit-url-config" );
+
+       // For oldIE support:
+       // * Add handlers to the individual elements instead of the container
+       // * Use "click" instead of "change" for checkboxes
+       addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
+       addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
+
+       return urlConfigContainer;
+}
+
+function toolbarLooseFilter() {
+       var filter = document.createElement( "form" ),
+               label = document.createElement( "label" ),
+               input = document.createElement( "input" ),
+               button = document.createElement( "button" );
+
+       addClass( filter, "qunit-filter" );
+
+       label.innerHTML = "Filter: ";
+
+       input.type = "text";
+       input.value = config.filter || "";
+       input.name = "filter";
+       input.id = "qunit-filter-input";
+
+       button.innerHTML = "Go";
+
+       label.appendChild( input );
+
+       filter.appendChild( label );
+       filter.appendChild( button );
+       addEvent( filter, "submit", function( ev ) {
+               applyUrlParams();
+
+               if ( ev && ev.preventDefault ) {
+                       ev.preventDefault();
                }
-               v1[ vOffset + 1 ] = 0;
-               v2[ vOffset + 1 ] = 0;
-               delta = text1Length - text2Length;
-               // If the total number of characters is odd, then the front path will collide
-               // with the reverse path.
-               front = ( delta % 2 !== 0 );
-               // Offsets for start and end of k loop.
-               // Prevents mapping of space beyond the grid.
-               k1start = 0;
-               k1end = 0;
-               k2start = 0;
-               k2end = 0;
-               for ( d = 0; d < maxD; d++ ) {
-                       // Bail out if deadline is reached.
-                       if ( ( new Date() ).getTime() > deadline ) {
-                               break;
-                       }
 
-                       // Walk the front path one step.
-                       for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
-                               k1Offset = vOffset + k1;
-                               if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
-                                       x1 = v1[ k1Offset + 1 ];
-                               } else {
-                                       x1 = v1[ k1Offset - 1 ] + 1;
-                               }
-                               y1 = x1 - k1;
-                               while ( x1 < text1Length && y1 < text2Length &&
-                                       text1.charAt( x1 ) === text2.charAt( y1 ) ) {
-                                       x1++;
-                                       y1++;
-                               }
-                               v1[ k1Offset ] = x1;
-                               if ( x1 > text1Length ) {
-                                       // Ran off the right of the graph.
-                                       k1end += 2;
-                               } else if ( y1 > text2Length ) {
-                                       // Ran off the bottom of the graph.
-                                       k1start += 2;
-                               } else if ( front ) {
-                                       k2Offset = vOffset + delta - k1;
-                                       if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
-                                               // Mirror x2 onto top-left coordinate system.
-                                               x2 = text1Length - v2[ k2Offset ];
-                                               if ( x1 >= x2 ) {
-                                                       // Overlap detected.
-                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
-                                               }
-                                       }
-                               }
-                       }
+               return false;
+       } );
+
+       return filter;
+}
+
+function toolbarModuleFilterHtml() {
+       var i,
+               moduleFilterHtml = "";
+
+       if ( !modulesList.length ) {
+               return false;
+       }
+
+       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
+               "<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
+               ( QUnit.urlParams.module === undefined ? "selected='selected'" : "" ) +
+               ">< All Modules ></option>";
+
+       for ( i = 0; i < modulesList.length; i++ ) {
+               moduleFilterHtml += "<option value='" +
+                       escapeText( encodeURIComponent( modulesList[ i ] ) ) + "' " +
+                       ( QUnit.urlParams.module === modulesList[ i ] ? "selected='selected'" : "" ) +
+                       ">" + escapeText( modulesList[ i ] ) + "</option>";
+       }
+       moduleFilterHtml += "</select>";
+
+       return moduleFilterHtml;
+}
+
+function toolbarModuleFilter() {
+       var toolbar = id( "qunit-testrunner-toolbar" ),
+               moduleFilter = document.createElement( "span" ),
+               moduleFilterHtml = toolbarModuleFilterHtml();
+
+       if ( !toolbar || !moduleFilterHtml ) {
+               return false;
+       }
+
+       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
+       moduleFilter.innerHTML = moduleFilterHtml;
+
+       addEvent( moduleFilter.lastChild, "change", applyUrlParams );
+
+       toolbar.appendChild( moduleFilter );
+}
+
+function appendToolbar() {
+       var toolbar = id( "qunit-testrunner-toolbar" );
+
+       if ( toolbar ) {
+               toolbar.appendChild( toolbarUrlConfigContainer() );
+               toolbar.appendChild( toolbarLooseFilter() );
+               toolbarModuleFilter();
+       }
+}
+
+function appendHeader() {
+       var header = id( "qunit-header" );
+
+       if ( header ) {
+               header.innerHTML = "<a href='" + escapeText( unfilteredUrl ) + "'>" + header.innerHTML +
+                       "</a> ";
+       }
+}
+
+function appendBanner() {
+       var banner = id( "qunit-banner" );
+
+       if ( banner ) {
+               banner.className = "";
+       }
+}
+
+function appendTestResults() {
+       var tests = id( "qunit-tests" ),
+               result = id( "qunit-testresult" );
+
+       if ( result ) {
+               result.parentNode.removeChild( result );
+       }
+
+       if ( tests ) {
+               tests.innerHTML = "";
+               result = document.createElement( "p" );
+               result.id = "qunit-testresult";
+               result.className = "result";
+               tests.parentNode.insertBefore( result, tests );
+               result.innerHTML = "Running...<br />&#160;";
+       }
+}
+
+function storeFixture() {
+       var fixture = id( "qunit-fixture" );
+       if ( fixture ) {
+               config.fixture = fixture.innerHTML;
+       }
+}
+
+function appendFilteredTest() {
+       var testId = QUnit.config.testId;
+       if ( !testId || testId.length <= 0 ) {
+               return "";
+       }
+       return "<div id='qunit-filteredTest'>Rerunning selected tests: " +
+               escapeText( testId.join( ", " ) ) +
+               " <a id='qunit-clearFilter' href='" +
+               escapeText( unfilteredUrl ) +
+               "'>Run all tests</a></div>";
+}
+
+function appendUserAgent() {
+       var userAgent = id( "qunit-userAgent" );
+
+       if ( userAgent ) {
+               userAgent.innerHTML = "";
+               userAgent.appendChild(
+                       document.createTextNode(
+                               "QUnit " + QUnit.version + "; " + navigator.userAgent
+                       )
+               );
+       }
+}
 
-                       // Walk the reverse path one step.
-                       for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
-                               k2Offset = vOffset + k2;
-                               if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
-                                       x2 = v2[ k2Offset + 1 ];
-                               } else {
-                                       x2 = v2[ k2Offset - 1 ] + 1;
-                               }
-                               y2 = x2 - k2;
-                               while ( x2 < text1Length && y2 < text2Length &&
-                                       text1.charAt( text1Length - x2 - 1 ) ===
-                                       text2.charAt( text2Length - y2 - 1 ) ) {
-                                       x2++;
-                                       y2++;
-                               }
-                               v2[ k2Offset ] = x2;
-                               if ( x2 > text1Length ) {
-                                       // Ran off the left of the graph.
-                                       k2end += 2;
-                               } else if ( y2 > text2Length ) {
-                                       // Ran off the top of the graph.
-                                       k2start += 2;
-                               } else if ( !front ) {
-                                       k1Offset = vOffset + delta - k2;
-                                       if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
-                                               x1 = v1[ k1Offset ];
-                                               y1 = vOffset + x1 - k1Offset;
-                                               // Mirror x2 onto top-left coordinate system.
-                                               x2 = text1Length - x2;
-                                               if ( x1 >= x2 ) {
-                                                       // Overlap detected.
-                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
-                                               }
-                                       }
-                               }
-                       }
+function appendInterface() {
+       var qunit = id( "qunit" );
+
+       if ( qunit ) {
+               qunit.innerHTML =
+                       "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
+                       "<h2 id='qunit-banner'></h2>" +
+                       "<div id='qunit-testrunner-toolbar'></div>" +
+                       appendFilteredTest() +
+                       "<h2 id='qunit-userAgent'></h2>" +
+                       "<ol id='qunit-tests'></ol>";
+       }
+
+       appendHeader();
+       appendBanner();
+       appendTestResults();
+       appendUserAgent();
+       appendToolbar();
+}
+
+function appendTestsList( modules ) {
+       var i, l, x, z, test, moduleObj;
+
+       for ( i = 0, l = modules.length; i < l; i++ ) {
+               moduleObj = modules[ i ];
+
+               for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
+                       test = moduleObj.tests[ x ];
+
+                       appendTest( test.name, test.testId, moduleObj.name );
                }
-               // Diff took too long and hit the deadline or
-               // number of diffs equals number of characters, no commonality at all.
-               return [
-                       [ DIFF_DELETE, text1 ],
-                       [ DIFF_INSERT, text2 ]
-               ];
-       };
+       }
+}
 
-       /**
-        * Given the location of the 'middle snake', split the diff in two parts
-        * and recurse.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {number} x Index of split point in text1.
-        * @param {number} y Index of split point in text2.
-        * @param {number} deadline Time at which to bail if not yet complete.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
-               var text1a, text1b, text2a, text2b, diffs, diffsb;
-               text1a = text1.substring( 0, x );
-               text2a = text2.substring( 0, y );
-               text1b = text1.substring( x );
-               text2b = text2.substring( y );
+function appendTest( name, testId, moduleName ) {
+       var title, rerunTrigger, testBlock, assertList,
+               tests = id( "qunit-tests" );
 
-               // Compute both diffs serially.
-               diffs = this.DiffMain( text1a, text2a, false, deadline );
-               diffsb = this.DiffMain( text1b, text2b, false, deadline );
+       if ( !tests ) {
+               return;
+       }
 
-               return diffs.concat( diffsb );
-       };
+       title = document.createElement( "strong" );
+       title.innerHTML = getNameHtml( name, moduleName );
 
-       /**
-        * Reduce the number of edits by eliminating semantically trivial equalities.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
-               var changes, equalities, equalitiesLength, lastequality,
-                       pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
-                       lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
-               changes = false;
-               equalities = []; // Stack of indices where equalities are found.
-               equalitiesLength = 0; // Keeping our own length var is faster in JS.
-               /** @type {?string} */
-               lastequality = null;
-               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
-               pointer = 0; // Index of current position.
-               // Number of characters that changed prior to the equality.
-               lengthInsertions1 = 0;
-               lengthDeletions1 = 0;
-               // Number of characters that changed after the equality.
-               lengthInsertions2 = 0;
-               lengthDeletions2 = 0;
-               while ( pointer < diffs.length ) {
-                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
-                               equalities[ equalitiesLength++ ] = pointer;
-                               lengthInsertions1 = lengthInsertions2;
-                               lengthDeletions1 = lengthDeletions2;
-                               lengthInsertions2 = 0;
-                               lengthDeletions2 = 0;
-                               lastequality = diffs[ pointer ][ 1 ];
-                       } else { // An insertion or deletion.
-                               if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
-                                       lengthInsertions2 += diffs[ pointer ][ 1 ].length;
-                               } else {
-                                       lengthDeletions2 += diffs[ pointer ][ 1 ].length;
-                               }
-                               // Eliminate an equality that is smaller or equal to the edits on both
-                               // sides of it.
-                               if ( lastequality && ( lastequality.length <=
-                                               Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
-                                               ( lastequality.length <= Math.max( lengthInsertions2,
-                                                       lengthDeletions2 ) ) ) {
+       rerunTrigger = document.createElement( "a" );
+       rerunTrigger.innerHTML = "Rerun";
+       rerunTrigger.href = setUrl( { testId: testId } );
 
-                                       // Duplicate record.
-                                       diffs.splice(
-                                               equalities[ equalitiesLength - 1 ],
-                                               0,
-                                               [ DIFF_DELETE, lastequality ]
-                                       );
+       testBlock = document.createElement( "li" );
+       testBlock.appendChild( title );
+       testBlock.appendChild( rerunTrigger );
+       testBlock.id = "qunit-test-output-" + testId;
 
-                                       // Change second copy to insert.
-                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+       assertList = document.createElement( "ol" );
+       assertList.className = "qunit-assert-list";
 
-                                       // Throw away the equality we just deleted.
-                                       equalitiesLength--;
+       testBlock.appendChild( assertList );
 
-                                       // Throw away the previous equality (it needs to be reevaluated).
-                                       equalitiesLength--;
-                                       pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+       tests.appendChild( testBlock );
+}
 
-                                       // Reset the counters.
-                                       lengthInsertions1 = 0;
-                                       lengthDeletions1 = 0;
-                                       lengthInsertions2 = 0;
-                                       lengthDeletions2 = 0;
-                                       lastequality = null;
-                                       changes = true;
-                               }
-                       }
-                       pointer++;
-               }
+// HTML Reporter initialization and load
+QUnit.begin( function( details ) {
+       var i, moduleObj, tests;
 
-               // Normalize the diff.
-               if ( changes ) {
-                       this.diffCleanupMerge( diffs );
+       // Sort modules by name for the picker
+       for ( i = 0; i < details.modules.length; i++ ) {
+               moduleObj = details.modules[ i ];
+               if ( moduleObj.name ) {
+                       modulesList.push( moduleObj.name );
                }
+       }
+       modulesList.sort( function( a, b ) {
+               return a.localeCompare( b );
+       } );
 
-               // Find any overlaps between deletions and insertions.
-               // e.g: <del>abcxxx</del><ins>xxxdef</ins>
-               //   -> <del>abc</del>xxx<ins>def</ins>
-               // e.g: <del>xxxabc</del><ins>defxxx</ins>
-               //   -> <ins>def</ins>xxx<del>abc</del>
-               // Only extract an overlap if it is as big as the edit ahead or behind it.
-               pointer = 1;
-               while ( pointer < diffs.length ) {
-                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
-                                       diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
-                               deletion = diffs[ pointer - 1 ][ 1 ];
-                               insertion = diffs[ pointer ][ 1 ];
-                               overlapLength1 = this.diffCommonOverlap( deletion, insertion );
-                               overlapLength2 = this.diffCommonOverlap( insertion, deletion );
-                               if ( overlapLength1 >= overlapLength2 ) {
-                                       if ( overlapLength1 >= deletion.length / 2 ||
-                                                       overlapLength1 >= insertion.length / 2 ) {
-                                               // Overlap found.  Insert an equality and trim the surrounding edits.
-                                               diffs.splice(
-                                                       pointer,
-                                                       0,
-                                                       [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
-                                               );
-                                               diffs[ pointer - 1 ][ 1 ] =
-                                                       deletion.substring( 0, deletion.length - overlapLength1 );
-                                               diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
-                                               pointer++;
-                                       }
-                               } else {
-                                       if ( overlapLength2 >= deletion.length / 2 ||
-                                                       overlapLength2 >= insertion.length / 2 ) {
+       // Capture fixture HTML from the page
+       storeFixture();
 
-                                               // Reverse overlap found.
-                                               // Insert an equality and swap and trim the surrounding edits.
-                                               diffs.splice(
-                                                       pointer,
-                                                       0,
-                                                       [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
-                                               );
+       // Initialize QUnit elements
+       appendInterface();
+       appendTestsList( details.modules );
+       tests = id( "qunit-tests" );
+       if ( tests && config.hidepassed ) {
+               addClass( tests, "hidepass" );
+       }
+} );
+
+QUnit.done( function( details ) {
+       var i, key,
+               banner = id( "qunit-banner" ),
+               tests = id( "qunit-tests" ),
+               html = [
+                       "Tests completed in ",
+                       details.runtime,
+                       " milliseconds.<br />",
+                       "<span class='passed'>",
+                       details.passed,
+                       "</span> assertions of <span class='total'>",
+                       details.total,
+                       "</span> passed, <span class='failed'>",
+                       details.failed,
+                       "</span> failed."
+               ].join( "" );
+
+       if ( banner ) {
+               banner.className = details.failed ? "qunit-fail" : "qunit-pass";
+       }
+
+       if ( tests ) {
+               id( "qunit-testresult" ).innerHTML = html;
+       }
+
+       if ( config.altertitle && document.title ) {
 
-                                               diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
-                                               diffs[ pointer - 1 ][ 1 ] =
-                                                       insertion.substring( 0, insertion.length - overlapLength2 );
-                                               diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
-                                               diffs[ pointer + 1 ][ 1 ] =
-                                                       deletion.substring( overlapLength2 );
-                                               pointer++;
-                                       }
-                               }
-                               pointer++;
+               // Show ✖ for good, ✔ for bad suite result in title
+               // use escape sequences in case file gets loaded with non-utf-8-charset
+               document.title = [
+                       ( details.failed ? "\u2716" : "\u2714" ),
+                       document.title.replace( /^[\u2714\u2716] /i, "" )
+               ].join( " " );
+       }
+
+       // Clear own sessionStorage items if all tests passed
+       if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
+               for ( i = 0; i < sessionStorage.length; i++ ) {
+                       key = sessionStorage.key( i++ );
+                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
+                               sessionStorage.removeItem( key );
                        }
-                       pointer++;
                }
-       };
+       }
 
-       /**
-        * Determine if the suffix of one string is the prefix of another.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {number} The number of characters common to the end of the first
-        *     string and the start of the second string.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
-               var text1Length, text2Length, textLength,
-                       best, length, pattern, found;
-               // Cache the text lengths to prevent multiple calls.
-               text1Length = text1.length;
-               text2Length = text2.length;
-               // Eliminate the null case.
-               if ( text1Length === 0 || text2Length === 0 ) {
-                       return 0;
-               }
-               // Truncate the longer string.
-               if ( text1Length > text2Length ) {
-                       text1 = text1.substring( text1Length - text2Length );
-               } else if ( text1Length < text2Length ) {
-                       text2 = text2.substring( 0, text1Length );
-               }
-               textLength = Math.min( text1Length, text2Length );
-               // Quick check for the worst case.
-               if ( text1 === text2 ) {
-                       return textLength;
-               }
+       // Scroll back to top to show results
+       if ( config.scrolltop && window.scrollTo ) {
+               window.scrollTo( 0, 0 );
+       }
+} );
 
-               // Start by looking for a single character match
-               // and increase length until no match is found.
-               // Performance analysis: https://neil.fraser.name/news/2010/11/04/
-               best = 0;
-               length = 1;
-               while ( true ) {
-                       pattern = text1.substring( textLength - length );
-                       found = text2.indexOf( pattern );
-                       if ( found === -1 ) {
-                               return best;
-                       }
-                       length += found;
-                       if ( found === 0 || text1.substring( textLength - length ) ===
-                                       text2.substring( 0, length ) ) {
-                               best = length;
-                               length++;
-                       }
-               }
-       };
+function getNameHtml( name, module ) {
+       var nameHtml = "";
 
-       /**
-        * Split two texts into an array of strings.  Reduce the texts to a string of
-        * hashes where each Unicode character represents one line.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
-        *     An object containing the encoded text1, the encoded text2 and
-        *     the array of unique strings.
-        *     The zeroth element of the array of unique strings is intentionally blank.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
-               var lineArray, lineHash, chars1, chars2;
-               lineArray = []; // e.g. lineArray[4] === 'Hello\n'
-               lineHash = {}; // e.g. lineHash['Hello\n'] === 4
+       if ( module ) {
+               nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
+       }
 
-               // '\x00' is a valid character, but various debuggers don't like it.
-               // So we'll insert a junk entry to avoid generating a null character.
-               lineArray[ 0 ] = "";
+       nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
 
-               /**
-                * Split a text into an array of strings.  Reduce the texts to a string of
-                * hashes where each Unicode character represents one line.
-                * Modifies linearray and linehash through being a closure.
-                * @param {string} text String to encode.
-                * @return {string} Encoded string.
-                * @private
-                */
-               function diffLinesToCharsMunge( text ) {
-                       var chars, lineStart, lineEnd, lineArrayLength, line;
-                       chars = "";
-                       // Walk the text, pulling out a substring for each line.
-                       // text.split('\n') would would temporarily double our memory footprint.
-                       // Modifying text would create many large strings to garbage collect.
-                       lineStart = 0;
-                       lineEnd = -1;
-                       // Keeping our own length variable is faster than looking it up.
-                       lineArrayLength = lineArray.length;
-                       while ( lineEnd < text.length - 1 ) {
-                               lineEnd = text.indexOf( "\n", lineStart );
-                               if ( lineEnd === -1 ) {
-                                       lineEnd = text.length - 1;
-                               }
-                               line = text.substring( lineStart, lineEnd + 1 );
-                               lineStart = lineEnd + 1;
+       return nameHtml;
+}
 
-                               if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
-                                                       ( lineHash[ line ] !== undefined ) ) {
-                                       chars += String.fromCharCode( lineHash[ line ] );
-                               } else {
-                                       chars += String.fromCharCode( lineArrayLength );
-                                       lineHash[ line ] = lineArrayLength;
-                                       lineArray[ lineArrayLength++ ] = line;
-                               }
-                       }
-                       return chars;
-               }
+QUnit.testStart( function( details ) {
+       var running, testBlock, bad;
 
-               chars1 = diffLinesToCharsMunge( text1 );
-               chars2 = diffLinesToCharsMunge( text2 );
-               return {
-                       chars1: chars1,
-                       chars2: chars2,
-                       lineArray: lineArray
-               };
-       };
+       testBlock = id( "qunit-test-output-" + details.testId );
+       if ( testBlock ) {
+               testBlock.className = "running";
+       } else {
 
-       /**
-        * Rehydrate the text in a diff from a string of line hashes to real lines of
-        * text.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        * @param {!Array.<string>} lineArray Array of unique strings.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
-               var x, chars, text, y;
-               for ( x = 0; x < diffs.length; x++ ) {
-                       chars = diffs[ x ][ 1 ];
-                       text = [];
-                       for ( y = 0; y < chars.length; y++ ) {
-                               text[ y ] = lineArray[ chars.charCodeAt( y ) ];
-                       }
-                       diffs[ x ][ 1 ] = text.join( "" );
-               }
-       };
+               // Report later registered tests
+               appendTest( details.name, details.testId, details.module );
+       }
 
-       /**
-        * Reorder and merge like edit sections.  Merge equalities.
-        * Any edit section can move as long as it doesn't cross an equality.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
-               var pointer, countDelete, countInsert, textInsert, textDelete,
-                       commonlength, changes, diffPointer, position;
-               diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
-               pointer = 0;
-               countDelete = 0;
-               countInsert = 0;
-               textDelete = "";
-               textInsert = "";
-               commonlength;
-               while ( pointer < diffs.length ) {
-                       switch ( diffs[ pointer ][ 0 ] ) {
-                       case DIFF_INSERT:
-                               countInsert++;
-                               textInsert += diffs[ pointer ][ 1 ];
-                               pointer++;
-                               break;
-                       case DIFF_DELETE:
-                               countDelete++;
-                               textDelete += diffs[ pointer ][ 1 ];
-                               pointer++;
-                               break;
-                       case DIFF_EQUAL:
-                               // Upon reaching an equality, check for prior redundancies.
-                               if ( countDelete + countInsert > 1 ) {
-                                       if ( countDelete !== 0 && countInsert !== 0 ) {
-                                               // Factor out any common prefixes.
-                                               commonlength = this.diffCommonPrefix( textInsert, textDelete );
-                                               if ( commonlength !== 0 ) {
-                                                       if ( ( pointer - countDelete - countInsert ) > 0 &&
-                                                                       diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
-                                                                       DIFF_EQUAL ) {
-                                                               diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
-                                                                       textInsert.substring( 0, commonlength );
-                                                       } else {
-                                                               diffs.splice( 0, 0, [ DIFF_EQUAL,
-                                                                       textInsert.substring( 0, commonlength )
-                                                               ] );
-                                                               pointer++;
-                                                       }
-                                                       textInsert = textInsert.substring( commonlength );
-                                                       textDelete = textDelete.substring( commonlength );
-                                               }
-                                               // Factor out any common suffixies.
-                                               commonlength = this.diffCommonSuffix( textInsert, textDelete );
-                                               if ( commonlength !== 0 ) {
-                                                       diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
-                                                                       commonlength ) + diffs[ pointer ][ 1 ];
-                                                       textInsert = textInsert.substring( 0, textInsert.length -
-                                                               commonlength );
-                                                       textDelete = textDelete.substring( 0, textDelete.length -
-                                                               commonlength );
-                                               }
-                                       }
-                                       // Delete the offending records and add the merged ones.
-                                       if ( countDelete === 0 ) {
-                                               diffs.splice( pointer - countInsert,
-                                                       countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
-                                       } else if ( countInsert === 0 ) {
-                                               diffs.splice( pointer - countDelete,
-                                                       countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
-                                       } else {
-                                               diffs.splice(
-                                                       pointer - countDelete - countInsert,
-                                                       countDelete + countInsert,
-                                                       [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
-                                               );
-                                       }
-                                       pointer = pointer - countDelete - countInsert +
-                                               ( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
-                               } else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
+       running = id( "qunit-testresult" );
+       if ( running ) {
+               bad = QUnit.config.reorder && defined.sessionStorage &&
+                       +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
+
+               running.innerHTML = ( bad ?
+                       "Rerunning previously failed test: <br />" :
+                       "Running: <br />" ) +
+                       getNameHtml( details.name, details.module );
+       }
 
-                                       // Merge this equality with the previous one.
-                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
-                                       diffs.splice( pointer, 1 );
-                               } else {
-                                       pointer++;
-                               }
-                               countInsert = 0;
-                               countDelete = 0;
-                               textDelete = "";
-                               textInsert = "";
-                               break;
-                       }
-               }
-               if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
-                       diffs.pop(); // Remove the dummy entry at the end.
-               }
+} );
 
-               // Second pass: look for single edits surrounded on both sides by equalities
-               // which can be shifted sideways to eliminate an equality.
-               // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
-               changes = false;
-               pointer = 1;
+function stripHtml( string ) {
 
-               // Intentionally ignore the first and last element (don't need checking).
-               while ( pointer < diffs.length - 1 ) {
-                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
-                                       diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
+       // Strip tags, html entity and whitespaces
+       return string.replace( /<\/?[^>]+(>|$)/g, "" ).replace( /\&quot;/g, "" ).replace( /\s+/g, "" );
+}
 
-                               diffPointer = diffs[ pointer ][ 1 ];
-                               position = diffPointer.substring(
-                                       diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
-                               );
+QUnit.log( function( details ) {
+       var assertList, assertLi,
+               message, expected, actual, diff,
+               showDiff = false,
+               testItem = id( "qunit-test-output-" + details.testId );
 
-                               // This is a single edit surrounded by equalities.
-                               if ( position === diffs[ pointer - 1 ][ 1 ] ) {
+       if ( !testItem ) {
+               return;
+       }
 
-                                       // Shift the edit over the previous equality.
-                                       diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
-                                               diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
-                                                       diffs[ pointer - 1 ][ 1 ].length );
-                                       diffs[ pointer + 1 ][ 1 ] =
-                                               diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
-                                       diffs.splice( pointer - 1, 1 );
-                                       changes = true;
-                               } else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
-                                               diffs[ pointer + 1 ][ 1 ] ) {
+       message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
+       message = "<span class='test-message'>" + message + "</span>";
+       message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
 
-                                       // Shift the edit over the next equality.
-                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
-                                       diffs[ pointer ][ 1 ] =
-                                               diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
-                                               diffs[ pointer + 1 ][ 1 ];
-                                       diffs.splice( pointer + 1, 1 );
-                                       changes = true;
-                               }
-                       }
-                       pointer++;
-               }
-               // If shifts were made, the diff needs reordering and another shift sweep.
-               if ( changes ) {
-                       this.diffCleanupMerge( diffs );
+       // The pushFailure doesn't provide details.expected
+       // when it calls, it's implicit to also not show expected and diff stuff
+       // Also, we need to check details.expected existence, as it can exist and be undefined
+       if ( !details.result && hasOwn.call( details, "expected" ) ) {
+               if ( details.negative ) {
+                       expected = "NOT " + QUnit.dump.parse( details.expected );
+               } else {
+                       expected = QUnit.dump.parse( details.expected );
                }
-       };
 
-       return function( o, n ) {
-               var diff, output, text;
-               diff = new DiffMatchPatch();
-               output = diff.DiffMain( o, n );
-               diff.diffCleanupEfficiency( output );
-               text = diff.diffPrettyHtml( output );
+               actual = QUnit.dump.parse( details.actual );
+               message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
+                       escapeText( expected ) +
+                       "</pre></td></tr>";
 
-               return text;
-       };
-}() );
+               if ( actual !== expected ) {
 
-// Get a reference to the global object, like window in browsers
-}( (function() {
-       return this;
-})() ));
+                       message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
+                               escapeText( actual ) + "</pre></td></tr>";
 
-(function() {
+                       // Don't show diff if actual or expected are booleans
+                       if ( !( /^(true|false)$/.test( actual ) ) &&
+                                       !( /^(true|false)$/.test( expected ) ) ) {
+                               diff = QUnit.diff( expected, actual );
+                               showDiff = stripHtml( diff ).length !==
+                                       stripHtml( expected ).length +
+                                       stripHtml( actual ).length;
+                       }
 
-// Don't load the HTML Reporter on non-Browser environments
-if ( typeof window === "undefined" || !window.document ) {
-       return;
-}
+                       // Don't show diff if expected and actual are totally different
+                       if ( showDiff ) {
+                               message += "<tr class='test-diff'><th>Diff: </th><td><pre>" +
+                                       diff + "</pre></td></tr>";
+                       }
+               } else if ( expected.indexOf( "[object Array]" ) !== -1 ||
+                               expected.indexOf( "[object Object]" ) !== -1 ) {
+                       message += "<tr class='test-message'><th>Message: </th><td>" +
+                               "Diff suppressed as the depth of object is more than current max depth (" +
+                               QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
+                               " run with a higher max depth or <a href='" +
+                               escapeText( setUrl( { maxDepth: -1 } ) ) + "'>" +
+                               "Rerun</a> without max depth.</p></td></tr>";
+               } else {
+                       message += "<tr class='test-message'><th>Message: </th><td>" +
+                               "Diff suppressed as the expected and actual results have an equivalent" +
+                               " serialization</td></tr>";
+               }
 
-// Deprecated QUnit.init - Ref #530
-// Re-initialize the configuration options
-QUnit.init = function() {
-       var tests, banner, result, qunit,
-               config = QUnit.config;
+               if ( details.source ) {
+                       message += "<tr class='test-source'><th>Source: </th><td><pre>" +
+                               escapeText( details.source ) + "</pre></td></tr>";
+               }
 
-       config.stats = { all: 0, bad: 0 };
-       config.moduleStats = { all: 0, bad: 0 };
-       config.started = 0;
-       config.updateRate = 1000;
-       config.blocking = false;
-       config.autostart = true;
-       config.autorun = false;
-       config.filter = "";
-       config.queue = [];
+               message += "</table>";
 
-       // Return on non-browser environments
-       // This is necessary to not break on node tests
-       if ( typeof window === "undefined" ) {
-               return;
+       // This occurs when pushFailure is set and we have an extracted stack trace
+       } else if ( !details.result && details.source ) {
+               message += "<table>" +
+                       "<tr class='test-source'><th>Source: </th><td><pre>" +
+                       escapeText( details.source ) + "</pre></td></tr>" +
+                       "</table>";
        }
 
-       qunit = id( "qunit" );
-       if ( qunit ) {
-               qunit.innerHTML =
-                       "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-                       "<h2 id='qunit-banner'></h2>" +
-                       "<div id='qunit-testrunner-toolbar'></div>" +
-                       "<h2 id='qunit-userAgent'></h2>" +
-                       "<ol id='qunit-tests'></ol>";
-       }
+       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
 
-       tests = id( "qunit-tests" );
-       banner = id( "qunit-banner" );
-       result = id( "qunit-testresult" );
+       assertLi = document.createElement( "li" );
+       assertLi.className = details.result ? "pass" : "fail";
+       assertLi.innerHTML = message;
+       assertList.appendChild( assertLi );
+} );
 
-       if ( tests ) {
-               tests.innerHTML = "";
-       }
+QUnit.testDone( function( details ) {
+       var testTitle, time, testItem, assertList,
+               good, bad, testCounts, skipped, sourceName,
+               tests = id( "qunit-tests" );
 
-       if ( banner ) {
-               banner.className = "";
+       if ( !tests ) {
+               return;
        }
 
-       if ( result ) {
-               result.parentNode.removeChild( result );
-       }
+       testItem = id( "qunit-test-output-" + details.testId );
 
-       if ( tests ) {
-               result = document.createElement( "p" );
-               result.id = "qunit-testresult";
-               result.className = "result";
-               tests.parentNode.insertBefore( result, tests );
-               result.innerHTML = "Running...<br />&#160;";
+       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+
+       good = details.passed;
+       bad = details.failed;
+
+       // Store result when possible
+       if ( config.reorder && defined.sessionStorage ) {
+               if ( bad ) {
+                       sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
+               } else {
+                       sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
+               }
        }
-};
 
-var config = QUnit.config,
-       collapseNext = false,
-       hasOwn = Object.prototype.hasOwnProperty,
-       defined = {
-               document: window.document !== undefined,
-               sessionStorage: (function() {
-                       var x = "qunit-test-string";
-                       try {
-                               sessionStorage.setItem( x, x );
-                               sessionStorage.removeItem( x );
-                               return true;
-                       } catch ( e ) {
-                               return false;
-                       }
-               }())
-       },
-       modulesList = [];
+       if ( bad === 0 ) {
 
-/**
-* Escape text for attribute or text content.
-*/
-function escapeText( s ) {
-       if ( !s ) {
-               return "";
+               // Collapse the passing tests
+               addClass( assertList, "qunit-collapsed" );
+       } else if ( bad && config.collapse && !collapseNext ) {
+
+               // Skip collapsing the first failing test
+               collapseNext = true;
+       } else {
+
+               // Collapse remaining tests
+               addClass( assertList, "qunit-collapsed" );
        }
-       s = s + "";
 
-       // Both single quotes and double quotes (for attributes)
-       return s.replace( /['"<>&]/g, function( s ) {
-               switch ( s ) {
-               case "'":
-                       return "&#039;";
-               case "\"":
-                       return "&quot;";
-               case "<":
-                       return "&lt;";
-               case ">":
-                       return "&gt;";
-               case "&":
-                       return "&amp;";
-               }
-       });
-}
+       // The testItem.firstChild is the test name
+       testTitle = testItem.firstChild;
 
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-       if ( elem.addEventListener ) {
+       testCounts = bad ?
+               "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
+               "";
 
-               // Standards-based browsers
-               elem.addEventListener( type, fn, false );
-       } else if ( elem.attachEvent ) {
+       testTitle.innerHTML += " <b class='counts'>(" + testCounts +
+               details.assertions.length + ")</b>";
+
+       if ( details.skipped ) {
+               testItem.className = "skipped";
+               skipped = document.createElement( "em" );
+               skipped.className = "qunit-skipped-label";
+               skipped.innerHTML = "skipped";
+               testItem.insertBefore( skipped, testTitle );
+       } else {
+               addEvent( testTitle, "click", function() {
+                       toggleClass( assertList, "qunit-collapsed" );
+               } );
 
-               // support: IE <9
-               elem.attachEvent( "on" + type, function() {
-                       var event = window.event;
-                       if ( !event.target ) {
-                               event.target = event.srcElement || document;
-                       }
+               testItem.className = bad ? "fail" : "pass";
 
-                       fn.call( elem, event );
-               });
+               time = document.createElement( "span" );
+               time.className = "runtime";
+               time.innerHTML = details.runtime + " ms";
+               testItem.insertBefore( time, assertList );
        }
-}
 
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-       var i = elems.length;
-       while ( i-- ) {
-               addEvent( elems[ i ], type, fn );
+       // Show the source of the test when showing assertions
+       if ( details.source ) {
+               sourceName = document.createElement( "p" );
+               sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
+               addClass( sourceName, "qunit-source" );
+               if ( bad === 0 ) {
+                       addClass( sourceName, "qunit-collapsed" );
+               }
+               addEvent( testTitle, "click", function() {
+                       toggleClass( sourceName, "qunit-collapsed" );
+               } );
+               testItem.appendChild( sourceName );
        }
-}
+} );
 
-function hasClass( elem, name ) {
-       return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
-}
+// Avoid readyState issue with phantomjs
+// Ref: #818
+var notPhantom = ( function( p ) {
+       return !( p && p.version && p.version.major > 0 );
+} )( window.phantom );
 
-function addClass( elem, name ) {
-       if ( !hasClass( elem, name ) ) {
-               elem.className += ( elem.className ? " " : "" ) + name;
-       }
+if ( notPhantom && document.readyState === "complete" ) {
+       QUnit.load();
+} else {
+       addEvent( window, "load", QUnit.load );
 }
 
-function toggleClass( elem, name ) {
-       if ( hasClass( elem, name ) ) {
-               removeClass( elem, name );
-       } else {
-               addClass( elem, name );
+/*
+ * This file is a modified version of google-diff-match-patch's JavaScript implementation
+ * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
+ * modifications are licensed as more fully set forth in LICENSE.txt.
+ *
+ * The original source of google-diff-match-patch is attributable and licensed as follows:
+ *
+ * Copyright 2006 Google Inc.
+ * https://code.google.com/p/google-diff-match-patch/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://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 OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * More Info:
+ *  https://code.google.com/p/google-diff-match-patch/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ */
+QUnit.diff = ( function() {
+       function DiffMatchPatch() {
        }
-}
 
-function removeClass( elem, name ) {
-       var set = " " + elem.className + " ";
-
-       // Class name may appear multiple times
-       while ( set.indexOf( " " + name + " " ) >= 0 ) {
-               set = set.replace( " " + name + " ", " " );
-       }
+       //  DIFF FUNCTIONS
 
-       // trim for prettiness
-       elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
-}
+       /**
+        * The data structure representing a diff is an array of tuples:
+        * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
+        * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
+        */
+       var DIFF_DELETE = -1,
+               DIFF_INSERT = 1,
+               DIFF_EQUAL = 0;
 
-function id( name ) {
-       return defined.document && document.getElementById && document.getElementById( name );
-}
+       /**
+        * Find the differences between two texts.  Simplifies the problem by stripping
+        * any common prefix or suffix off the texts before diffing.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {boolean=} optChecklines Optional speedup flag. If present and false,
+        *     then don't run a line-level diff first to identify the changed areas.
+        *     Defaults to true, which does a faster, slightly less optimal diff.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
+               var deadline, checklines, commonlength,
+                       commonprefix, commonsuffix, diffs;
 
-function getUrlConfigHtml() {
-       var i, j, val,
-               escaped, escapedTooltip,
-               selection = false,
-               len = config.urlConfig.length,
-               urlConfigHtml = "";
+               // The diff must be complete in up to 1 second.
+               deadline = ( new Date() ).getTime() + 1000;
 
-       for ( i = 0; i < len; i++ ) {
-               val = config.urlConfig[ i ];
-               if ( typeof val === "string" ) {
-                       val = {
-                               id: val,
-                               label: val
-                       };
+               // Check for null inputs.
+               if ( text1 === null || text2 === null ) {
+                       throw new Error( "Null input. (DiffMain)" );
                }
 
-               escaped = escapeText( val.id );
-               escapedTooltip = escapeText( val.tooltip );
-
-               if ( config[ val.id ] === undefined ) {
-                       config[ val.id ] = QUnit.urlParams[ val.id ];
+               // Check for equality (speedup).
+               if ( text1 === text2 ) {
+                       if ( text1 ) {
+                               return [
+                                       [ DIFF_EQUAL, text1 ]
+                               ];
+                       }
+                       return [];
                }
 
-               if ( !val.value || typeof val.value === "string" ) {
-                       urlConfigHtml += "<input id='qunit-urlconfig-" + escaped +
-                               "' name='" + escaped + "' type='checkbox'" +
-                               ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
-                               ( config[ val.id ] ? " checked='checked'" : "" ) +
-                               " title='" + escapedTooltip + "' /><label for='qunit-urlconfig-" + escaped +
-                               "' title='" + escapedTooltip + "'>" + val.label + "</label>";
-               } else {
-                       urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
-                               "' title='" + escapedTooltip + "'>" + val.label +
-                               ": </label><select id='qunit-urlconfig-" + escaped +
-                               "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
-
-                       if ( QUnit.is( "array", val.value ) ) {
-                               for ( j = 0; j < val.value.length; j++ ) {
-                                       escaped = escapeText( val.value[ j ] );
-                                       urlConfigHtml += "<option value='" + escaped + "'" +
-                                               ( config[ val.id ] === val.value[ j ] ?
-                                                       ( selection = true ) && " selected='selected'" : "" ) +
-                                               ">" + escaped + "</option>";
-                               }
-                       } else {
-                               for ( j in val.value ) {
-                                       if ( hasOwn.call( val.value, j ) ) {
-                                               urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
-                                                       ( config[ val.id ] === j ?
-                                                               ( selection = true ) && " selected='selected'" : "" ) +
-                                                       ">" + escapeText( val.value[ j ] ) + "</option>";
-                                       }
-                               }
-                       }
-                       if ( config[ val.id ] && !selection ) {
-                               escaped = escapeText( config[ val.id ] );
-                               urlConfigHtml += "<option value='" + escaped +
-                                       "' selected='selected' disabled='disabled'>" + escaped + "</option>";
-                       }
-                       urlConfigHtml += "</select>";
+               if ( typeof optChecklines === "undefined" ) {
+                       optChecklines = true;
                }
-       }
 
-       return urlConfigHtml;
-}
+               checklines = optChecklines;
 
-// Handle "click" events on toolbar checkboxes and "change" for select menus.
-// Updates the URL with the new state of `config.urlConfig` values.
-function toolbarChanged() {
-       var updatedUrl, value,
-               field = this,
-               params = {};
+               // Trim off common prefix (speedup).
+               commonlength = this.diffCommonPrefix( text1, text2 );
+               commonprefix = text1.substring( 0, commonlength );
+               text1 = text1.substring( commonlength );
+               text2 = text2.substring( commonlength );
 
-       // Detect if field is a select menu or a checkbox
-       if ( "selectedIndex" in field ) {
-               value = field.options[ field.selectedIndex ].value || undefined;
-       } else {
-               value = field.checked ? ( field.defaultValue || true ) : undefined;
-       }
+               // Trim off common suffix (speedup).
+               commonlength = this.diffCommonSuffix( text1, text2 );
+               commonsuffix = text1.substring( text1.length - commonlength );
+               text1 = text1.substring( 0, text1.length - commonlength );
+               text2 = text2.substring( 0, text2.length - commonlength );
 
-       params[ field.name ] = value;
-       updatedUrl = setUrl( params );
+               // Compute the diff on the middle block.
+               diffs = this.diffCompute( text1, text2, checklines, deadline );
 
-       if ( "hidepassed" === field.name && "replaceState" in window.history ) {
-               config[ field.name ] = value || false;
-               if ( value ) {
-                       addClass( id( "qunit-tests" ), "hidepass" );
-               } else {
-                       removeClass( id( "qunit-tests" ), "hidepass" );
+               // Restore the prefix and suffix.
+               if ( commonprefix ) {
+                       diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
                }
+               if ( commonsuffix ) {
+                       diffs.push( [ DIFF_EQUAL, commonsuffix ] );
+               }
+               this.diffCleanupMerge( diffs );
+               return diffs;
+       };
 
-               // It is not necessary to refresh the whole page
-               window.history.replaceState( null, "", updatedUrl );
-       } else {
-               window.location = updatedUrl;
-       }
-}
-
-function setUrl( params ) {
-       var key,
-               querystring = "?";
+       /**
+        * Reduce the number of edits by eliminating operationally trivial equalities.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
+               var changes, equalities, equalitiesLength, lastequality,
+                       pointer, preIns, preDel, postIns, postDel;
+               changes = false;
+               equalities = []; // Stack of indices where equalities are found.
+               equalitiesLength = 0; // Keeping our own length var is faster in JS.
+               /** @type {?string} */
+               lastequality = null;
 
-       params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
+               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+               pointer = 0; // Index of current position.
 
-       for ( key in params ) {
-               if ( hasOwn.call( params, key ) ) {
-                       if ( params[ key ] === undefined ) {
-                               continue;
-                       }
-                       querystring += encodeURIComponent( key );
-                       if ( params[ key ] !== true ) {
-                               querystring += "=" + encodeURIComponent( params[ key ] );
-                       }
-                       querystring += "&";
-               }
-       }
-       return location.protocol + "//" + location.host +
-               location.pathname + querystring.slice( 0, -1 );
-}
+               // Is there an insertion operation before the last equality.
+               preIns = false;
 
-function applyUrlParams() {
-       var selectedModule,
-               modulesList = id( "qunit-modulefilter" ),
-               filter = id( "qunit-filter-input" ).value;
+               // Is there a deletion operation before the last equality.
+               preDel = false;
 
-       selectedModule = modulesList ?
-               decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :
-               undefined;
+               // Is there an insertion operation after the last equality.
+               postIns = false;
 
-       window.location = setUrl({
-               module: ( selectedModule === "" ) ? undefined : selectedModule,
-               filter: ( filter === "" ) ? undefined : filter,
+               // Is there a deletion operation after the last equality.
+               postDel = false;
+               while ( pointer < diffs.length ) {
 
-               // Remove testId filter
-               testId: undefined
-       });
-}
+                       // Equality found.
+                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
+                               if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
 
-function toolbarUrlConfigContainer() {
-       var urlConfigContainer = document.createElement( "span" );
+                                       // Candidate found.
+                                       equalities[ equalitiesLength++ ] = pointer;
+                                       preIns = postIns;
+                                       preDel = postDel;
+                                       lastequality = diffs[ pointer ][ 1 ];
+                               } else {
 
-       urlConfigContainer.innerHTML = getUrlConfigHtml();
-       addClass( urlConfigContainer, "qunit-url-config" );
+                                       // Not a candidate, and can never become one.
+                                       equalitiesLength = 0;
+                                       lastequality = null;
+                               }
+                               postIns = postDel = false;
 
-       // For oldIE support:
-       // * Add handlers to the individual elements instead of the container
-       // * Use "click" instead of "change" for checkboxes
-       addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
-       addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
+                       // An insertion or deletion.
+                       } else {
 
-       return urlConfigContainer;
-}
+                               if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
+                                       postDel = true;
+                               } else {
+                                       postIns = true;
+                               }
 
-function toolbarLooseFilter() {
-       var filter = document.createElement( "form" ),
-               label = document.createElement( "label" ),
-               input = document.createElement( "input" ),
-               button = document.createElement( "button" );
+                               /*
+                                * Five types to be split:
+                                * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
+                                * <ins>A</ins>X<ins>C</ins><del>D</del>
+                                * <ins>A</ins><del>B</del>X<ins>C</ins>
+                                * <ins>A</del>X<ins>C</ins><del>D</del>
+                                * <ins>A</ins><del>B</del>X<del>C</del>
+                                */
+                               if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
+                                               ( ( lastequality.length < 2 ) &&
+                                               ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
 
-       addClass( filter, "qunit-filter" );
+                                       // Duplicate record.
+                                       diffs.splice(
+                                               equalities[ equalitiesLength - 1 ],
+                                               0,
+                                               [ DIFF_DELETE, lastequality ]
+                                       );
 
-       label.innerHTML = "Filter: ";
+                                       // Change second copy to insert.
+                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+                                       equalitiesLength--; // Throw away the equality we just deleted;
+                                       lastequality = null;
+                                       if ( preIns && preDel ) {
 
-       input.type = "text";
-       input.value = config.filter || "";
-       input.name = "filter";
-       input.id = "qunit-filter-input";
+                                               // No changes made which could affect previous entry, keep going.
+                                               postIns = postDel = true;
+                                               equalitiesLength = 0;
+                                       } else {
+                                               equalitiesLength--; // Throw away the previous equality.
+                                               pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+                                               postIns = postDel = false;
+                                       }
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
+               }
 
-       button.innerHTML = "Go";
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
+               }
+       };
 
-       label.appendChild( input );
+       /**
+        * Convert a diff array into a pretty HTML report.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        * @param {integer} string to be beautified.
+        * @return {string} HTML representation.
+        */
+       DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
+               var op, data, x,
+                       html = [];
+               for ( x = 0; x < diffs.length; x++ ) {
+                       op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
+                       data = diffs[ x ][ 1 ]; // Text of change.
+                       switch ( op ) {
+                       case DIFF_INSERT:
+                               html[ x ] = "<ins>" + escapeText( data ) + "</ins>";
+                               break;
+                       case DIFF_DELETE:
+                               html[ x ] = "<del>" + escapeText( data ) + "</del>";
+                               break;
+                       case DIFF_EQUAL:
+                               html[ x ] = "<span>" + escapeText( data ) + "</span>";
+                               break;
+                       }
+               }
+               return html.join( "" );
+       };
 
-       filter.appendChild( label );
-       filter.appendChild( button );
-       addEvent( filter, "submit", function( ev ) {
-               applyUrlParams();
+       /**
+        * Determine the common prefix of two strings.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the start of each
+        *     string.
+        */
+       DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
+               var pointermid, pointermax, pointermin, pointerstart;
 
-               if ( ev && ev.preventDefault ) {
-                       ev.preventDefault();
+               // Quick check for common null cases.
+               if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
+                       return 0;
                }
 
-               return false;
-       });
+               // Binary search.
+               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+               pointermin = 0;
+               pointermax = Math.min( text1.length, text2.length );
+               pointermid = pointermax;
+               pointerstart = 0;
+               while ( pointermin < pointermid ) {
+                       if ( text1.substring( pointerstart, pointermid ) ===
+                                       text2.substring( pointerstart, pointermid ) ) {
+                               pointermin = pointermid;
+                               pointerstart = pointermin;
+                       } else {
+                               pointermax = pointermid;
+                       }
+                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+               }
+               return pointermid;
+       };
 
-       return filter;
-}
+       /**
+        * Determine the common suffix of two strings.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the end of each string.
+        */
+       DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
+               var pointermid, pointermax, pointermin, pointerend;
 
-function toolbarModuleFilterHtml() {
-       var i,
-               moduleFilterHtml = "";
+               // Quick check for common null cases.
+               if ( !text1 ||
+                               !text2 ||
+                               text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
+                       return 0;
+               }
 
-       if ( !modulesList.length ) {
-               return false;
-       }
+               // Binary search.
+               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+               pointermin = 0;
+               pointermax = Math.min( text1.length, text2.length );
+               pointermid = pointermax;
+               pointerend = 0;
+               while ( pointermin < pointermid ) {
+                       if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
+                                       text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
+                               pointermin = pointermid;
+                               pointerend = pointermin;
+                       } else {
+                               pointermax = pointermid;
+                       }
+                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+               }
+               return pointermid;
+       };
 
-       modulesList.sort(function( a, b ) {
-               return a.localeCompare( b );
-       });
+       /**
+        * Find the differences between two texts.  Assumes that the texts do not
+        * have any common prefix or suffix.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {boolean} checklines Speedup flag.  If false, then don't run a
+        *     line-level diff first to identify the changed areas.
+        *     If true, then run a faster, slightly less optimal diff.
+        * @param {number} deadline Time when the diff should be complete by.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
+               var diffs, longtext, shorttext, i, hm,
+                       text1A, text2A, text1B, text2B,
+                       midCommon, diffsA, diffsB;
 
-       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
-               "<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-               ( QUnit.urlParams.module === undefined ? "selected='selected'" : "" ) +
-               ">< All Modules ></option>";
+               if ( !text1 ) {
 
-       for ( i = 0; i < modulesList.length; i++ ) {
-               moduleFilterHtml += "<option value='" +
-                       escapeText( encodeURIComponent( modulesList[ i ] ) ) + "' " +
-                       ( QUnit.urlParams.module === modulesList[ i ] ? "selected='selected'" : "" ) +
-                       ">" + escapeText( modulesList[ i ] ) + "</option>";
-       }
-       moduleFilterHtml += "</select>";
+                       // Just add some text (speedup).
+                       return [
+                               [ DIFF_INSERT, text2 ]
+                       ];
+               }
 
-       return moduleFilterHtml;
-}
+               if ( !text2 ) {
 
-function toolbarModuleFilter() {
-       var toolbar = id( "qunit-testrunner-toolbar" ),
-               moduleFilter = document.createElement( "span" ),
-               moduleFilterHtml = toolbarModuleFilterHtml();
+                       // Just delete some text (speedup).
+                       return [
+                               [ DIFF_DELETE, text1 ]
+                       ];
+               }
+
+               longtext = text1.length > text2.length ? text1 : text2;
+               shorttext = text1.length > text2.length ? text2 : text1;
+               i = longtext.indexOf( shorttext );
+               if ( i !== -1 ) {
+
+                       // Shorter text is inside the longer text (speedup).
+                       diffs = [
+                               [ DIFF_INSERT, longtext.substring( 0, i ) ],
+                               [ DIFF_EQUAL, shorttext ],
+                               [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
+                       ];
 
-       if ( !toolbar || !moduleFilterHtml ) {
-               return false;
-       }
+                       // Swap insertions for deletions if diff is reversed.
+                       if ( text1.length > text2.length ) {
+                               diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
+                       }
+                       return diffs;
+               }
 
-       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-       moduleFilter.innerHTML = moduleFilterHtml;
+               if ( shorttext.length === 1 ) {
 
-       addEvent( moduleFilter.lastChild, "change", applyUrlParams );
+                       // Single character string.
+                       // After the previous speedup, the character can't be an equality.
+                       return [
+                               [ DIFF_DELETE, text1 ],
+                               [ DIFF_INSERT, text2 ]
+                       ];
+               }
 
-       toolbar.appendChild( moduleFilter );
-}
+               // Check to see if the problem can be split in two.
+               hm = this.diffHalfMatch( text1, text2 );
+               if ( hm ) {
 
-function appendToolbar() {
-       var toolbar = id( "qunit-testrunner-toolbar" );
+                       // A half-match was found, sort out the return data.
+                       text1A = hm[ 0 ];
+                       text1B = hm[ 1 ];
+                       text2A = hm[ 2 ];
+                       text2B = hm[ 3 ];
+                       midCommon = hm[ 4 ];
 
-       if ( toolbar ) {
-               toolbar.appendChild( toolbarUrlConfigContainer() );
-               toolbar.appendChild( toolbarLooseFilter() );
-       }
-}
+                       // Send both pairs off for separate processing.
+                       diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
+                       diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
 
-function appendHeader() {
-       var header = id( "qunit-header" );
+                       // Merge the results.
+                       return diffsA.concat( [
+                               [ DIFF_EQUAL, midCommon ]
+                       ], diffsB );
+               }
 
-       if ( header ) {
-               header.innerHTML = "<a href='" +
-                       escapeText( setUrl( { filter: undefined, module: undefined, testId: undefined } ) ) +
-                       "'>" + header.innerHTML + "</a> ";
-       }
-}
+               if ( checklines && text1.length > 100 && text2.length > 100 ) {
+                       return this.diffLineMode( text1, text2, deadline );
+               }
 
-function appendBanner() {
-       var banner = id( "qunit-banner" );
+               return this.diffBisect( text1, text2, deadline );
+       };
 
-       if ( banner ) {
-               banner.className = "";
-       }
-}
+       /**
+        * Do the two texts share a substring which is at least half the length of the
+        * longer text?
+        * This speedup can produce non-minimal diffs.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {Array.<string>} Five element Array, containing the prefix of
+        *     text1, the suffix of text1, the prefix of text2, the suffix of
+        *     text2 and the common middle.  Or null if there was no match.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
+               var longtext, shorttext, dmp,
+                       text1A, text2B, text2A, text1B, midCommon,
+                       hm1, hm2, hm;
 
-function appendTestResults() {
-       var tests = id( "qunit-tests" ),
-               result = id( "qunit-testresult" );
+               longtext = text1.length > text2.length ? text1 : text2;
+               shorttext = text1.length > text2.length ? text2 : text1;
+               if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
+                       return null; // Pointless.
+               }
+               dmp = this; // 'this' becomes 'window' in a closure.
 
-       if ( result ) {
-               result.parentNode.removeChild( result );
-       }
+               /**
+                * Does a substring of shorttext exist within longtext such that the substring
+                * is at least half the length of longtext?
+                * Closure, but does not reference any external variables.
+                * @param {string} longtext Longer string.
+                * @param {string} shorttext Shorter string.
+                * @param {number} i Start index of quarter length substring within longtext.
+                * @return {Array.<string>} Five element Array, containing the prefix of
+                *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
+                *     of shorttext and the common middle.  Or null if there was no match.
+                * @private
+                */
+               function diffHalfMatchI( longtext, shorttext, i ) {
+                       var seed, j, bestCommon, prefixLength, suffixLength,
+                               bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
 
-       if ( tests ) {
-               tests.innerHTML = "";
-               result = document.createElement( "p" );
-               result.id = "qunit-testresult";
-               result.className = "result";
-               tests.parentNode.insertBefore( result, tests );
-               result.innerHTML = "Running...<br />&#160;";
-       }
-}
+                       // Start with a 1/4 length substring at position i as a seed.
+                       seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
+                       j = -1;
+                       bestCommon = "";
+                       while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
+                               prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
+                                       shorttext.substring( j ) );
+                               suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
+                                       shorttext.substring( 0, j ) );
+                               if ( bestCommon.length < suffixLength + prefixLength ) {
+                                       bestCommon = shorttext.substring( j - suffixLength, j ) +
+                                               shorttext.substring( j, j + prefixLength );
+                                       bestLongtextA = longtext.substring( 0, i - suffixLength );
+                                       bestLongtextB = longtext.substring( i + prefixLength );
+                                       bestShorttextA = shorttext.substring( 0, j - suffixLength );
+                                       bestShorttextB = shorttext.substring( j + prefixLength );
+                               }
+                       }
+                       if ( bestCommon.length * 2 >= longtext.length ) {
+                               return [ bestLongtextA, bestLongtextB,
+                                       bestShorttextA, bestShorttextB, bestCommon
+                               ];
+                       } else {
+                               return null;
+                       }
+               }
 
-function storeFixture() {
-       var fixture = id( "qunit-fixture" );
-       if ( fixture ) {
-               config.fixture = fixture.innerHTML;
-       }
-}
+               // First check if the second quarter is the seed for a half-match.
+               hm1 = diffHalfMatchI( longtext, shorttext,
+                       Math.ceil( longtext.length / 4 ) );
 
-function appendFilteredTest() {
-       var testId = QUnit.config.testId;
-       if ( !testId || testId.length <= 0 ) {
-               return "";
-       }
-       return "<div id='qunit-filteredTest'>Rerunning selected tests: " +
-               escapeText( testId.join(", ") ) +
-               " <a id='qunit-clearFilter' href='" +
-               escapeText( setUrl( { filter: undefined, module: undefined, testId: undefined } ) ) +
-               "'>" + "Run all tests" + "</a></div>";
-}
+               // Check again based on the third quarter.
+               hm2 = diffHalfMatchI( longtext, shorttext,
+                       Math.ceil( longtext.length / 2 ) );
+               if ( !hm1 && !hm2 ) {
+                       return null;
+               } else if ( !hm2 ) {
+                       hm = hm1;
+               } else if ( !hm1 ) {
+                       hm = hm2;
+               } else {
 
-function appendUserAgent() {
-       var userAgent = id( "qunit-userAgent" );
+                       // Both matched.  Select the longest.
+                       hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
+               }
 
-       if ( userAgent ) {
-               userAgent.innerHTML = "";
-               userAgent.appendChild(
-                       document.createTextNode(
-                               "QUnit " + QUnit.version + "; " + navigator.userAgent
-                       )
-               );
-       }
-}
+               // A half-match was found, sort out the return data.
+               text1A, text1B, text2A, text2B;
+               if ( text1.length > text2.length ) {
+                       text1A = hm[ 0 ];
+                       text1B = hm[ 1 ];
+                       text2A = hm[ 2 ];
+                       text2B = hm[ 3 ];
+               } else {
+                       text2A = hm[ 0 ];
+                       text2B = hm[ 1 ];
+                       text1A = hm[ 2 ];
+                       text1B = hm[ 3 ];
+               }
+               midCommon = hm[ 4 ];
+               return [ text1A, text1B, text2A, text2B, midCommon ];
+       };
 
-function appendTestsList( modules ) {
-       var i, l, x, z, test, moduleObj;
+       /**
+        * Do a quick line-level diff on both strings, then rediff the parts for
+        * greater accuracy.
+        * This speedup can produce non-minimal diffs.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} deadline Time when the diff should be complete by.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
+               var a, diffs, linearray, pointer, countInsert,
+                       countDelete, textInsert, textDelete, j;
 
-       for ( i = 0, l = modules.length; i < l; i++ ) {
-               moduleObj = modules[ i ];
+               // Scan the text on a line-by-line basis first.
+               a = this.diffLinesToChars( text1, text2 );
+               text1 = a.chars1;
+               text2 = a.chars2;
+               linearray = a.lineArray;
 
-               if ( moduleObj.name ) {
-                       modulesList.push( moduleObj.name );
-               }
+               diffs = this.DiffMain( text1, text2, false, deadline );
 
-               for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
-                       test = moduleObj.tests[ x ];
+               // Convert the diff back to original text.
+               this.diffCharsToLines( diffs, linearray );
 
-                       appendTest( test.name, test.testId, moduleObj.name );
-               }
-       }
-}
+               // Eliminate freak matches (e.g. blank lines)
+               this.diffCleanupSemantic( diffs );
 
-function appendTest( name, testId, moduleName ) {
-       var title, rerunTrigger, testBlock, assertList,
-               tests = id( "qunit-tests" );
+               // Rediff any replacement blocks, this time character-by-character.
+               // Add a dummy entry at the end.
+               diffs.push( [ DIFF_EQUAL, "" ] );
+               pointer = 0;
+               countDelete = 0;
+               countInsert = 0;
+               textDelete = "";
+               textInsert = "";
+               while ( pointer < diffs.length ) {
+                       switch ( diffs[ pointer ][ 0 ] ) {
+                       case DIFF_INSERT:
+                               countInsert++;
+                               textInsert += diffs[ pointer ][ 1 ];
+                               break;
+                       case DIFF_DELETE:
+                               countDelete++;
+                               textDelete += diffs[ pointer ][ 1 ];
+                               break;
+                       case DIFF_EQUAL:
+
+                               // Upon reaching an equality, check for prior redundancies.
+                               if ( countDelete >= 1 && countInsert >= 1 ) {
 
-       if ( !tests ) {
-               return;
-       }
+                                       // Delete the offending records and add the merged ones.
+                                       diffs.splice( pointer - countDelete - countInsert,
+                                               countDelete + countInsert );
+                                       pointer = pointer - countDelete - countInsert;
+                                       a = this.DiffMain( textDelete, textInsert, false, deadline );
+                                       for ( j = a.length - 1; j >= 0; j-- ) {
+                                               diffs.splice( pointer, 0, a[ j ] );
+                                       }
+                                       pointer = pointer + a.length;
+                               }
+                               countInsert = 0;
+                               countDelete = 0;
+                               textDelete = "";
+                               textInsert = "";
+                               break;
+                       }
+                       pointer++;
+               }
+               diffs.pop(); // Remove the dummy entry at the end.
 
-       title = document.createElement( "strong" );
-       title.innerHTML = getNameHtml( name, moduleName );
+               return diffs;
+       };
 
-       rerunTrigger = document.createElement( "a" );
-       rerunTrigger.innerHTML = "Rerun";
-       rerunTrigger.href = setUrl({ testId: testId });
+       /**
+        * Find the 'middle snake' of a diff, split the problem in two
+        * and return the recursively constructed diff.
+        * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} deadline Time at which to bail if not yet complete.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
+               var text1Length, text2Length, maxD, vOffset, vLength,
+                       v1, v2, x, delta, front, k1start, k1end, k2start,
+                       k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
 
-       testBlock = document.createElement( "li" );
-       testBlock.appendChild( title );
-       testBlock.appendChild( rerunTrigger );
-       testBlock.id = "qunit-test-output-" + testId;
+               // Cache the text lengths to prevent multiple calls.
+               text1Length = text1.length;
+               text2Length = text2.length;
+               maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
+               vOffset = maxD;
+               vLength = 2 * maxD;
+               v1 = new Array( vLength );
+               v2 = new Array( vLength );
 
-       assertList = document.createElement( "ol" );
-       assertList.className = "qunit-assert-list";
+               // Setting all elements to -1 is faster in Chrome & Firefox than mixing
+               // integers and undefined.
+               for ( x = 0; x < vLength; x++ ) {
+                       v1[ x ] = -1;
+                       v2[ x ] = -1;
+               }
+               v1[ vOffset + 1 ] = 0;
+               v2[ vOffset + 1 ] = 0;
+               delta = text1Length - text2Length;
 
-       testBlock.appendChild( assertList );
+               // If the total number of characters is odd, then the front path will collide
+               // with the reverse path.
+               front = ( delta % 2 !== 0 );
 
-       tests.appendChild( testBlock );
-}
+               // Offsets for start and end of k loop.
+               // Prevents mapping of space beyond the grid.
+               k1start = 0;
+               k1end = 0;
+               k2start = 0;
+               k2end = 0;
+               for ( d = 0; d < maxD; d++ ) {
 
-// HTML Reporter initialization and load
-QUnit.begin(function( details ) {
-       var qunit = id( "qunit" );
+                       // Bail out if deadline is reached.
+                       if ( ( new Date() ).getTime() > deadline ) {
+                               break;
+                       }
 
-       // Fixture is the only one necessary to run without the #qunit element
-       storeFixture();
+                       // Walk the front path one step.
+                       for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
+                               k1Offset = vOffset + k1;
+                               if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
+                                       x1 = v1[ k1Offset + 1 ];
+                               } else {
+                                       x1 = v1[ k1Offset - 1 ] + 1;
+                               }
+                               y1 = x1 - k1;
+                               while ( x1 < text1Length && y1 < text2Length &&
+                                       text1.charAt( x1 ) === text2.charAt( y1 ) ) {
+                                       x1++;
+                                       y1++;
+                               }
+                               v1[ k1Offset ] = x1;
+                               if ( x1 > text1Length ) {
 
-       if ( qunit ) {
-               qunit.innerHTML =
-                       "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-                       "<h2 id='qunit-banner'></h2>" +
-                       "<div id='qunit-testrunner-toolbar'></div>" +
-                       appendFilteredTest() +
-                       "<h2 id='qunit-userAgent'></h2>" +
-                       "<ol id='qunit-tests'></ol>";
-       }
+                                       // Ran off the right of the graph.
+                                       k1end += 2;
+                               } else if ( y1 > text2Length ) {
 
-       appendHeader();
-       appendBanner();
-       appendTestResults();
-       appendUserAgent();
-       appendToolbar();
-       appendTestsList( details.modules );
-       toolbarModuleFilter();
+                                       // Ran off the bottom of the graph.
+                                       k1start += 2;
+                               } else if ( front ) {
+                                       k2Offset = vOffset + delta - k1;
+                                       if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
 
-       if ( qunit && config.hidepassed ) {
-               addClass( qunit.lastChild, "hidepass" );
-       }
-});
+                                               // Mirror x2 onto top-left coordinate system.
+                                               x2 = text1Length - v2[ k2Offset ];
+                                               if ( x1 >= x2 ) {
 
-QUnit.done(function( details ) {
-       var i, key,
-               banner = id( "qunit-banner" ),
-               tests = id( "qunit-tests" ),
-               html = [
-                       "Tests completed in ",
-                       details.runtime,
-                       " milliseconds.<br />",
-                       "<span class='passed'>",
-                       details.passed,
-                       "</span> assertions of <span class='total'>",
-                       details.total,
-                       "</span> passed, <span class='failed'>",
-                       details.failed,
-                       "</span> failed."
-               ].join( "" );
+                                                       // Overlap detected.
+                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+                                               }
+                                       }
+                               }
+                       }
 
-       if ( banner ) {
-               banner.className = details.failed ? "qunit-fail" : "qunit-pass";
-       }
+                       // Walk the reverse path one step.
+                       for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
+                               k2Offset = vOffset + k2;
+                               if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
+                                       x2 = v2[ k2Offset + 1 ];
+                               } else {
+                                       x2 = v2[ k2Offset - 1 ] + 1;
+                               }
+                               y2 = x2 - k2;
+                               while ( x2 < text1Length && y2 < text2Length &&
+                                       text1.charAt( text1Length - x2 - 1 ) ===
+                                       text2.charAt( text2Length - y2 - 1 ) ) {
+                                       x2++;
+                                       y2++;
+                               }
+                               v2[ k2Offset ] = x2;
+                               if ( x2 > text1Length ) {
 
-       if ( tests ) {
-               id( "qunit-testresult" ).innerHTML = html;
-       }
+                                       // Ran off the left of the graph.
+                                       k2end += 2;
+                               } else if ( y2 > text2Length ) {
 
-       if ( config.altertitle && defined.document && document.title ) {
+                                       // Ran off the top of the graph.
+                                       k2start += 2;
+                               } else if ( !front ) {
+                                       k1Offset = vOffset + delta - k2;
+                                       if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
+                                               x1 = v1[ k1Offset ];
+                                               y1 = vOffset + x1 - k1Offset;
 
-               // show ✖ for good, ✔ for bad suite result in title
-               // use escape sequences in case file gets loaded with non-utf-8-charset
-               document.title = [
-                       ( details.failed ? "\u2716" : "\u2714" ),
-                       document.title.replace( /^[\u2714\u2716] /i, "" )
-               ].join( " " );
-       }
+                                               // Mirror x2 onto top-left coordinate system.
+                                               x2 = text1Length - x2;
+                                               if ( x1 >= x2 ) {
 
-       // clear own sessionStorage items if all tests passed
-       if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
-               for ( i = 0; i < sessionStorage.length; i++ ) {
-                       key = sessionStorage.key( i++ );
-                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
-                               sessionStorage.removeItem( key );
+                                                       // Overlap detected.
+                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+                                               }
+                                       }
+                               }
                        }
                }
-       }
-
-       // scroll back to top to show results
-       if ( config.scrolltop && window.scrollTo ) {
-               window.scrollTo( 0, 0 );
-       }
-});
 
-function getNameHtml( name, module ) {
-       var nameHtml = "";
+               // Diff took too long and hit the deadline or
+               // number of diffs equals number of characters, no commonality at all.
+               return [
+                       [ DIFF_DELETE, text1 ],
+                       [ DIFF_INSERT, text2 ]
+               ];
+       };
 
-       if ( module ) {
-               nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
-       }
+       /**
+        * Given the location of the 'middle snake', split the diff in two parts
+        * and recurse.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} x Index of split point in text1.
+        * @param {number} y Index of split point in text2.
+        * @param {number} deadline Time at which to bail if not yet complete.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
+               var text1a, text1b, text2a, text2b, diffs, diffsb;
+               text1a = text1.substring( 0, x );
+               text2a = text2.substring( 0, y );
+               text1b = text1.substring( x );
+               text2b = text2.substring( y );
 
-       nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
+               // Compute both diffs serially.
+               diffs = this.DiffMain( text1a, text2a, false, deadline );
+               diffsb = this.DiffMain( text1b, text2b, false, deadline );
 
-       return nameHtml;
-}
+               return diffs.concat( diffsb );
+       };
 
-QUnit.testStart(function( details ) {
-       var running, testBlock, bad;
+       /**
+        * Reduce the number of edits by eliminating semantically trivial equalities.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
+               var changes, equalities, equalitiesLength, lastequality,
+                       pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
+                       lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
+               changes = false;
+               equalities = []; // Stack of indices where equalities are found.
+               equalitiesLength = 0; // Keeping our own length var is faster in JS.
+               /** @type {?string} */
+               lastequality = null;
 
-       testBlock = id( "qunit-test-output-" + details.testId );
-       if ( testBlock ) {
-               testBlock.className = "running";
-       } else {
+               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+               pointer = 0; // Index of current position.
 
-               // Report later registered tests
-               appendTest( details.name, details.testId, details.module );
-       }
+               // Number of characters that changed prior to the equality.
+               lengthInsertions1 = 0;
+               lengthDeletions1 = 0;
 
-       running = id( "qunit-testresult" );
-       if ( running ) {
-               bad = QUnit.config.reorder && defined.sessionStorage &&
-                       +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
+               // Number of characters that changed after the equality.
+               lengthInsertions2 = 0;
+               lengthDeletions2 = 0;
+               while ( pointer < diffs.length ) {
+                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
+                               equalities[ equalitiesLength++ ] = pointer;
+                               lengthInsertions1 = lengthInsertions2;
+                               lengthDeletions1 = lengthDeletions2;
+                               lengthInsertions2 = 0;
+                               lengthDeletions2 = 0;
+                               lastequality = diffs[ pointer ][ 1 ];
+                       } else { // An insertion or deletion.
+                               if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+                                       lengthInsertions2 += diffs[ pointer ][ 1 ].length;
+                               } else {
+                                       lengthDeletions2 += diffs[ pointer ][ 1 ].length;
+                               }
 
-               running.innerHTML = ( bad ?
-                       "Rerunning previously failed test: <br />" :
-                       "Running: <br />" ) +
-                       getNameHtml( details.name, details.module );
-       }
+                               // Eliminate an equality that is smaller or equal to the edits on both
+                               // sides of it.
+                               if ( lastequality && ( lastequality.length <=
+                                               Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
+                                               ( lastequality.length <= Math.max( lengthInsertions2,
+                                                       lengthDeletions2 ) ) ) {
 
-});
+                                       // Duplicate record.
+                                       diffs.splice(
+                                               equalities[ equalitiesLength - 1 ],
+                                               0,
+                                               [ DIFF_DELETE, lastequality ]
+                                       );
 
-function stripHtml( string ) {
-       // strip tags, html entity and whitespaces
-       return string.replace(/<\/?[^>]+(>|$)/g, "").replace(/\&quot;/g, "").replace(/\s+/g, "");
-}
+                                       // Change second copy to insert.
+                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
 
-QUnit.log(function( details ) {
-       var assertList, assertLi,
-               message, expected, actual, diff,
-               showDiff = false,
-               testItem = id( "qunit-test-output-" + details.testId );
+                                       // Throw away the equality we just deleted.
+                                       equalitiesLength--;
 
-       if ( !testItem ) {
-               return;
-       }
+                                       // Throw away the previous equality (it needs to be reevaluated).
+                                       equalitiesLength--;
+                                       pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
 
-       message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
-       message = "<span class='test-message'>" + message + "</span>";
-       message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
+                                       // Reset the counters.
+                                       lengthInsertions1 = 0;
+                                       lengthDeletions1 = 0;
+                                       lengthInsertions2 = 0;
+                                       lengthDeletions2 = 0;
+                                       lastequality = null;
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
+               }
 
-       // pushFailure doesn't provide details.expected
-       // when it calls, it's implicit to also not show expected and diff stuff
-       // Also, we need to check details.expected existence, as it can exist and be undefined
-       if ( !details.result && hasOwn.call( details, "expected" ) ) {
-               if ( details.negative ) {
-                       expected = escapeText( "NOT " + QUnit.dump.parse( details.expected ) );
-               } else {
-                       expected = escapeText( QUnit.dump.parse( details.expected ) );
+               // Normalize the diff.
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
                }
 
-               actual = escapeText( QUnit.dump.parse( details.actual ) );
-               message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
-                       expected +
-                       "</pre></td></tr>";
+               // Find any overlaps between deletions and insertions.
+               // e.g: <del>abcxxx</del><ins>xxxdef</ins>
+               //   -> <del>abc</del>xxx<ins>def</ins>
+               // e.g: <del>xxxabc</del><ins>defxxx</ins>
+               //   -> <ins>def</ins>xxx<del>abc</del>
+               // Only extract an overlap if it is as big as the edit ahead or behind it.
+               pointer = 1;
+               while ( pointer < diffs.length ) {
+                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
+                                       diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+                               deletion = diffs[ pointer - 1 ][ 1 ];
+                               insertion = diffs[ pointer ][ 1 ];
+                               overlapLength1 = this.diffCommonOverlap( deletion, insertion );
+                               overlapLength2 = this.diffCommonOverlap( insertion, deletion );
+                               if ( overlapLength1 >= overlapLength2 ) {
+                                       if ( overlapLength1 >= deletion.length / 2 ||
+                                                       overlapLength1 >= insertion.length / 2 ) {
 
-               if ( actual !== expected ) {
+                                               // Overlap found.  Insert an equality and trim the surrounding edits.
+                                               diffs.splice(
+                                                       pointer,
+                                                       0,
+                                                       [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
+                                               );
+                                               diffs[ pointer - 1 ][ 1 ] =
+                                                       deletion.substring( 0, deletion.length - overlapLength1 );
+                                               diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
+                                               pointer++;
+                                       }
+                               } else {
+                                       if ( overlapLength2 >= deletion.length / 2 ||
+                                                       overlapLength2 >= insertion.length / 2 ) {
 
-                       message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
-                               actual + "</pre></td></tr>";
+                                               // Reverse overlap found.
+                                               // Insert an equality and swap and trim the surrounding edits.
+                                               diffs.splice(
+                                                       pointer,
+                                                       0,
+                                                       [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
+                                               );
 
-                       // Don't show diff if actual or expected are booleans
-                       if ( !( /^(true|false)$/.test( actual ) ) &&
-                                       !( /^(true|false)$/.test( expected ) ) ) {
-                               diff = QUnit.diff( expected, actual );
-                               showDiff = stripHtml( diff ).length !==
-                                       stripHtml( expected ).length +
-                                       stripHtml( actual ).length;
+                                               diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
+                                               diffs[ pointer - 1 ][ 1 ] =
+                                                       insertion.substring( 0, insertion.length - overlapLength2 );
+                                               diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
+                                               diffs[ pointer + 1 ][ 1 ] =
+                                                       deletion.substring( overlapLength2 );
+                                               pointer++;
+                                       }
+                               }
+                               pointer++;
                        }
+                       pointer++;
+               }
+       };
 
-                       // Don't show diff if expected and actual are totally different
-                       if ( showDiff ) {
-                               message += "<tr class='test-diff'><th>Diff: </th><td><pre>" +
-                                       diff + "</pre></td></tr>";
-                       }
-               } else if ( expected.indexOf( "[object Array]" ) !== -1 ||
-                               expected.indexOf( "[object Object]" ) !== -1 ) {
-                       message += "<tr class='test-message'><th>Message: </th><td>" +
-                               "Diff suppressed as the depth of object is more than current max depth (" +
-                               QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
-                               " run with a higher max depth or <a href='" +
-                               escapeText( setUrl( { maxDepth: -1 } ) ) + "'>" +
-                               "Rerun</a> without max depth.</p></td></tr>";
+       /**
+        * Determine if the suffix of one string is the prefix of another.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the end of the first
+        *     string and the start of the second string.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
+               var text1Length, text2Length, textLength,
+                       best, length, pattern, found;
+
+               // Cache the text lengths to prevent multiple calls.
+               text1Length = text1.length;
+               text2Length = text2.length;
+
+               // Eliminate the null case.
+               if ( text1Length === 0 || text2Length === 0 ) {
+                       return 0;
                }
 
-               if ( details.source ) {
-                       message += "<tr class='test-source'><th>Source: </th><td><pre>" +
-                               escapeText( details.source ) + "</pre></td></tr>";
+               // Truncate the longer string.
+               if ( text1Length > text2Length ) {
+                       text1 = text1.substring( text1Length - text2Length );
+               } else if ( text1Length < text2Length ) {
+                       text2 = text2.substring( 0, text1Length );
                }
+               textLength = Math.min( text1Length, text2Length );
 
-               message += "</table>";
+               // Quick check for the worst case.
+               if ( text1 === text2 ) {
+                       return textLength;
+               }
 
-       // this occurs when pushFailure is set and we have an extracted stack trace
-       } else if ( !details.result && details.source ) {
-               message += "<table>" +
-                       "<tr class='test-source'><th>Source: </th><td><pre>" +
-                       escapeText( details.source ) + "</pre></td></tr>" +
-                       "</table>";
-       }
+               // Start by looking for a single character match
+               // and increase length until no match is found.
+               // Performance analysis: https://neil.fraser.name/news/2010/11/04/
+               best = 0;
+               length = 1;
+               while ( true ) {
+                       pattern = text1.substring( textLength - length );
+                       found = text2.indexOf( pattern );
+                       if ( found === -1 ) {
+                               return best;
+                       }
+                       length += found;
+                       if ( found === 0 || text1.substring( textLength - length ) ===
+                                       text2.substring( 0, length ) ) {
+                               best = length;
+                               length++;
+                       }
+               }
+       };
 
-       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+       /**
+        * Split two texts into an array of strings.  Reduce the texts to a string of
+        * hashes where each Unicode character represents one line.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
+        *     An object containing the encoded text1, the encoded text2 and
+        *     the array of unique strings.
+        *     The zeroth element of the array of unique strings is intentionally blank.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
+               var lineArray, lineHash, chars1, chars2;
+               lineArray = []; // E.g. lineArray[4] === 'Hello\n'
+               lineHash = {};  // E.g. lineHash['Hello\n'] === 4
 
-       assertLi = document.createElement( "li" );
-       assertLi.className = details.result ? "pass" : "fail";
-       assertLi.innerHTML = message;
-       assertList.appendChild( assertLi );
-});
+               // '\x00' is a valid character, but various debuggers don't like it.
+               // So we'll insert a junk entry to avoid generating a null character.
+               lineArray[ 0 ] = "";
 
-QUnit.testDone(function( details ) {
-       var testTitle, time, testItem, assertList,
-               good, bad, testCounts, skipped, sourceName,
-               tests = id( "qunit-tests" );
+               /**
+                * Split a text into an array of strings.  Reduce the texts to a string of
+                * hashes where each Unicode character represents one line.
+                * Modifies linearray and linehash through being a closure.
+                * @param {string} text String to encode.
+                * @return {string} Encoded string.
+                * @private
+                */
+               function diffLinesToCharsMunge( text ) {
+                       var chars, lineStart, lineEnd, lineArrayLength, line;
+                       chars = "";
 
-       if ( !tests ) {
-               return;
-       }
+                       // Walk the text, pulling out a substring for each line.
+                       // text.split('\n') would would temporarily double our memory footprint.
+                       // Modifying text would create many large strings to garbage collect.
+                       lineStart = 0;
+                       lineEnd = -1;
 
-       testItem = id( "qunit-test-output-" + details.testId );
+                       // Keeping our own length variable is faster than looking it up.
+                       lineArrayLength = lineArray.length;
+                       while ( lineEnd < text.length - 1 ) {
+                               lineEnd = text.indexOf( "\n", lineStart );
+                               if ( lineEnd === -1 ) {
+                                       lineEnd = text.length - 1;
+                               }
+                               line = text.substring( lineStart, lineEnd + 1 );
+                               lineStart = lineEnd + 1;
 
-       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+                               if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
+                                                       ( lineHash[ line ] !== undefined ) ) {
+                                       chars += String.fromCharCode( lineHash[ line ] );
+                               } else {
+                                       chars += String.fromCharCode( lineArrayLength );
+                                       lineHash[ line ] = lineArrayLength;
+                                       lineArray[ lineArrayLength++ ] = line;
+                               }
+                       }
+                       return chars;
+               }
 
-       good = details.passed;
-       bad = details.failed;
+               chars1 = diffLinesToCharsMunge( text1 );
+               chars2 = diffLinesToCharsMunge( text2 );
+               return {
+                       chars1: chars1,
+                       chars2: chars2,
+                       lineArray: lineArray
+               };
+       };
 
-       // store result when possible
-       if ( config.reorder && defined.sessionStorage ) {
-               if ( bad ) {
-                       sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
-               } else {
-                       sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
+       /**
+        * Rehydrate the text in a diff from a string of line hashes to real lines of
+        * text.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        * @param {!Array.<string>} lineArray Array of unique strings.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
+               var x, chars, text, y;
+               for ( x = 0; x < diffs.length; x++ ) {
+                       chars = diffs[ x ][ 1 ];
+                       text = [];
+                       for ( y = 0; y < chars.length; y++ ) {
+                               text[ y ] = lineArray[ chars.charCodeAt( y ) ];
+                       }
+                       diffs[ x ][ 1 ] = text.join( "" );
                }
-       }
+       };
 
-       if ( bad === 0 ) {
+       /**
+        * Reorder and merge like edit sections.  Merge equalities.
+        * Any edit section can move as long as it doesn't cross an equality.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
+               var pointer, countDelete, countInsert, textInsert, textDelete,
+                       commonlength, changes, diffPointer, position;
+               diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
+               pointer = 0;
+               countDelete = 0;
+               countInsert = 0;
+               textDelete = "";
+               textInsert = "";
+               commonlength;
+               while ( pointer < diffs.length ) {
+                       switch ( diffs[ pointer ][ 0 ] ) {
+                       case DIFF_INSERT:
+                               countInsert++;
+                               textInsert += diffs[ pointer ][ 1 ];
+                               pointer++;
+                               break;
+                       case DIFF_DELETE:
+                               countDelete++;
+                               textDelete += diffs[ pointer ][ 1 ];
+                               pointer++;
+                               break;
+                       case DIFF_EQUAL:
 
-               // Collapse the passing tests
-               addClass( assertList, "qunit-collapsed" );
-       } else if ( bad && config.collapse && !collapseNext ) {
+                               // Upon reaching an equality, check for prior redundancies.
+                               if ( countDelete + countInsert > 1 ) {
+                                       if ( countDelete !== 0 && countInsert !== 0 ) {
 
-               // Skip collapsing the first failing test
-               collapseNext = true;
-       } else {
+                                               // Factor out any common prefixes.
+                                               commonlength = this.diffCommonPrefix( textInsert, textDelete );
+                                               if ( commonlength !== 0 ) {
+                                                       if ( ( pointer - countDelete - countInsert ) > 0 &&
+                                                                       diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
+                                                                       DIFF_EQUAL ) {
+                                                               diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
+                                                                       textInsert.substring( 0, commonlength );
+                                                       } else {
+                                                               diffs.splice( 0, 0, [ DIFF_EQUAL,
+                                                                       textInsert.substring( 0, commonlength )
+                                                               ] );
+                                                               pointer++;
+                                                       }
+                                                       textInsert = textInsert.substring( commonlength );
+                                                       textDelete = textDelete.substring( commonlength );
+                                               }
 
-               // Collapse remaining tests
-               addClass( assertList, "qunit-collapsed" );
-       }
+                                               // Factor out any common suffixies.
+                                               commonlength = this.diffCommonSuffix( textInsert, textDelete );
+                                               if ( commonlength !== 0 ) {
+                                                       diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
+                                                                       commonlength ) + diffs[ pointer ][ 1 ];
+                                                       textInsert = textInsert.substring( 0, textInsert.length -
+                                                               commonlength );
+                                                       textDelete = textDelete.substring( 0, textDelete.length -
+                                                               commonlength );
+                                               }
+                                       }
 
-       // testItem.firstChild is the test name
-       testTitle = testItem.firstChild;
+                                       // Delete the offending records and add the merged ones.
+                                       if ( countDelete === 0 ) {
+                                               diffs.splice( pointer - countInsert,
+                                                       countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
+                                       } else if ( countInsert === 0 ) {
+                                               diffs.splice( pointer - countDelete,
+                                                       countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
+                                       } else {
+                                               diffs.splice(
+                                                       pointer - countDelete - countInsert,
+                                                       countDelete + countInsert,
+                                                       [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
+                                               );
+                                       }
+                                       pointer = pointer - countDelete - countInsert +
+                                               ( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
+                               } else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
 
-       testCounts = bad ?
-               "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
-               "";
+                                       // Merge this equality with the previous one.
+                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
+                                       diffs.splice( pointer, 1 );
+                               } else {
+                                       pointer++;
+                               }
+                               countInsert = 0;
+                               countDelete = 0;
+                               textDelete = "";
+                               textInsert = "";
+                               break;
+                       }
+               }
+               if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
+                       diffs.pop(); // Remove the dummy entry at the end.
+               }
 
-       testTitle.innerHTML += " <b class='counts'>(" + testCounts +
-               details.assertions.length + ")</b>";
+               // Second pass: look for single edits surrounded on both sides by equalities
+               // which can be shifted sideways to eliminate an equality.
+               // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
+               changes = false;
+               pointer = 1;
 
-       if ( details.skipped ) {
-               testItem.className = "skipped";
-               skipped = document.createElement( "em" );
-               skipped.className = "qunit-skipped-label";
-               skipped.innerHTML = "skipped";
-               testItem.insertBefore( skipped, testTitle );
-       } else {
-               addEvent( testTitle, "click", function() {
-                       toggleClass( assertList, "qunit-collapsed" );
-               });
+               // Intentionally ignore the first and last element (don't need checking).
+               while ( pointer < diffs.length - 1 ) {
+                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
+                                       diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
 
-               testItem.className = bad ? "fail" : "pass";
+                               diffPointer = diffs[ pointer ][ 1 ];
+                               position = diffPointer.substring(
+                                       diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
+                               );
 
-               time = document.createElement( "span" );
-               time.className = "runtime";
-               time.innerHTML = details.runtime + " ms";
-               testItem.insertBefore( time, assertList );
-       }
+                               // This is a single edit surrounded by equalities.
+                               if ( position === diffs[ pointer - 1 ][ 1 ] ) {
 
-       // Show the source of the test when showing assertions
-       if ( details.source ) {
-               sourceName = document.createElement( "p" );
-               sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
-               addClass( sourceName, "qunit-source" );
-               if ( bad === 0 ) {
-                       addClass( sourceName, "qunit-collapsed" );
+                                       // Shift the edit over the previous equality.
+                                       diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
+                                               diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
+                                                       diffs[ pointer - 1 ][ 1 ].length );
+                                       diffs[ pointer + 1 ][ 1 ] =
+                                               diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
+                                       diffs.splice( pointer - 1, 1 );
+                                       changes = true;
+                               } else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
+                                               diffs[ pointer + 1 ][ 1 ] ) {
+
+                                       // Shift the edit over the next equality.
+                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
+                                       diffs[ pointer ][ 1 ] =
+                                               diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
+                                               diffs[ pointer + 1 ][ 1 ];
+                                       diffs.splice( pointer + 1, 1 );
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
                }
-               addEvent( testTitle, "click", function() {
-                       toggleClass( sourceName, "qunit-collapsed" );
-               });
-               testItem.appendChild( sourceName );
-       }
-});
 
-if ( defined.document ) {
+               // If shifts were made, the diff needs reordering and another shift sweep.
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
+               }
+       };
 
-       // Avoid readyState issue with phantomjs
-       // Ref: #818
-       var notPhantom = ( function( p ) {
-               return !( p && p.version && p.version.major > 0 );
-       } )( window.phantom );
+       return function( o, n ) {
+               var diff, output, text;
+               diff = new DiffMatchPatch();
+               output = diff.DiffMain( o, n );
+               diff.diffCleanupEfficiency( output );
+               text = diff.diffPrettyHtml( output );
 
-       if ( notPhantom && document.readyState === "complete" ) {
-               QUnit.load();
-       } else {
-               addEvent( window, "load", QUnit.load );
-       }
-} else {
-       config.pageLoaded = true;
-       config.autorun = true;
-}
+               return text;
+       };
+}() );
 
-})();
+}() );
index 2c6a588..ddda432 100644 (file)
             }
         };
 
-        if (!options.live) this.each(function() { get(this); });
+        this.each(function() { get(this); });
 
         if ( options.trigger != 'manual' ) {
             var eventIn  = options.trigger == 'hover' ? 'mouseenter focus' : 'focus',
                 eventOut = options.trigger == 'hover' ? 'mouseleave blur' : 'blur';
             if ( options.live ) {
                 mw.track( 'mw.deprecate', 'tipsy-live' );
-                mw.log.warn( 'Use of the "live" option of jquery.tipsy is deprecated.' );
-                // XXX: The official status of 'context' is deprecated, and the official status of
-                // 'selector' is removed, so this really needs to go.
-                $( this.context )
-                    .on( eventIn, this.selector, enter )
-                    .on( eventOut, this.selector, leave );
-            } else {
-                this
-                    .on( eventIn, enter )
-                    .on( eventOut, leave );
+                mw.log.warn( 'Use of the "live" option of jquery.tipsy is no longer supported.' );
             }
+            this
+                .on( eventIn, enter )
+                .on( eventOut, leave );
         }
 
         return this;
index f25944c..4f900a4 100644 (file)
@@ -24,7 +24,7 @@
         *
         * @private
         * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
-        * @return {Array} Array with 0 or more of the string values: ctrl, option, alt, shift, esc
+        * @return {Array} Array with 1 or more of the string values, in this order: ctrl, option, alt, shift, esc
         */
        function getAccessKeyModifiers( ua ) {
                var profile, accessKeyModifiers;
                }
 
                profile = $.client.profile( ua );
-               accessKeyModifiers = [ 'alt' ];
-
-               // Classic Opera on any platform
-               if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
-                       accessKeyModifiers = [ 'shift', 'esc' ];
-
-               // Chrome and modern Opera on any platform
-               } else if ( profile.name === 'chrome' || profile.name === 'opera' ) {
-                       accessKeyModifiers = (
-                               profile.platform === 'mac' ?
-                                       // Chrome on Mac
-                                       [ 'ctrl', 'option' ] :
-                                       // Chrome on Windows or Linux
+
+               switch ( profile.name ) {
+                       case 'chrome':
+                       case 'opera':
+                               if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
+                                       accessKeyModifiers = [ 'shift', 'esc' ];
+                               } else if ( profile.platform === 'mac' ) {
+                                       accessKeyModifiers = [ 'ctrl', 'option' ];
+                               } else {
+                                       // Chrome/Opera on Windows or Linux
                                        // (both alt- and alt-shift work, but alt with E, D, F etc does not
                                        // work since they are browser shortcuts)
-                                       [ 'alt', 'shift' ]
-                       );
-
-               // Non-Windows Safari with webkit_version > 526
-               } else if ( profile.platform !== 'win' &&
-                       profile.name === 'safari' &&
-                       profile.layoutVersion > 526
-               ) {
-                       accessKeyModifiers = [ 'ctrl', 'alt' ];
-
-               // Safari/Konqueror on any platform, or any browser on Mac
-               // (but not Safari on Windows)
-               } else if (
-                       !( profile.platform === 'win' && profile.name === 'safari' ) &&
-                       (
-                               profile.name === 'safari' ||
-                               profile.platform === 'mac' ||
-                               profile.name === 'konqueror'
-                       )
-               ) {
-                       accessKeyModifiers = [ 'ctrl' ];
-
-               // Firefox/Iceweasel 2.x and later
-               } else if (
-                       ( profile.name === 'firefox' || profile.name === 'iceweasel' ) &&
-                       profile.versionBase > '1'
-               ) {
-                       accessKeyModifiers = [ 'alt', 'shift' ];
+                                       accessKeyModifiers = [ 'alt', 'shift' ];
+                               }
+                               break;
+                       case 'firefox':
+                       case 'iceweasel':
+                               if ( profile.versionBase < 2 ) {
+                                       // Before v2, Firefox used alt, though it was rebindable in about:config
+                                       accessKeyModifiers = [ 'alt' ];
+                               } else {
+                                       if ( profile.platform === 'mac' ) {
+                                               if ( profile.versionNumber < 14 ) {
+                                                       accessKeyModifiers = [ 'ctrl' ];
+                                               } else {
+                                                       accessKeyModifiers = [ 'ctrl', 'option' ];
+                                               }
+                                       } else {
+                                               accessKeyModifiers = [ 'alt', 'shift' ];
+                                       }
+                               }
+                               break;
+                       case 'safari':
+                       case 'konqueror':
+                               if ( profile.platform === 'win' ) {
+                                       accessKeyModifiers = [ 'alt' ];
+                               } else {
+                                       if ( profile.layoutVersion > 526 ) {
+                                               // Non-Windows Safari with webkit_version > 526
+                                               accessKeyModifiers = [ 'ctrl', profile.platform === 'mac' ? 'option' : 'alt' ];
+                                       } else {
+                                               accessKeyModifiers = [ 'ctrl' ];
+                                       }
+                               }
+                               break;
+                       case 'msie':
+                       case 'edge':
+                               accessKeyModifiers = [ 'alt' ];
+                               break;
+                       default:
+                               accessKeyModifiers = profile.platform === 'mac' ? [ 'ctrl' ] : [ 'alt' ];
+                               break;
                }
 
                // cache modifiers
index d24fcc9..92c6c43 100644 (file)
@@ -7,9 +7,9 @@
 
 .arrowSteps li {
        float: left;
-       padding: 0px;
-       margin: 0px;
-       border: 0 none;
+       padding: 0;
+       margin: 0;
+       border: 0;
 }
 
 .arrowSteps li div {
index 8b4bd7b..8e0e512 100644 (file)
@@ -19,9 +19,9 @@
 .mw-badge-inline {
        margin-left: 3px;
        display: inline-block;
-       /* Hack for IE6 and IE7 (bug 47926) */
+       /* Hack for IE6 and IE7 (T49926) */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 
 }
 .mw-badge-overlay {
index 567bec8..c75246c 100644 (file)
@@ -87,7 +87,7 @@
                // Chop off characters from the end of the "inserted content" string
                // until the limit is statisfied.
                if ( fn ) {
-                       // stop, when there is nothing to slice - bug 41450
+                       // stop, when there is nothing to slice - T43450
                        while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[ 1 ].length > 0 ) {
                                inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
                        }
                                }
                                // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
                                // trimByteLength to compare the new value to an empty string instead of the
-                               // old value, resulting in trimming always from the end (bug 40850).
+                               // old value, resulting in trimming always from the end (T42850).
                                prevSafeVal = res.newVal;
                        } );
                } );
index 0bfa8f3..c3d39da 100644 (file)
@@ -12,7 +12,6 @@
  *             $('#textbox').expandableField();
  *
  * Options:
- *
  */
 ( function ( $ ) {
 
index b7e0af5..0cba34f 100644 (file)
        position: absolute;
        cursor: crosshair;
 }
-.farbtastic, .farbtastic .wheel {
+.farbtastic,
+.farbtastic .wheel {
        width: 195px;
        height: 195px;
 }
-.farbtastic .color, .farbtastic .overlay {
+.farbtastic .color,
+.farbtastic .overlay {
        top: 47px;
        left: 47px;
        width: 101px;
index 3feca81..a14e3eb 100644 (file)
@@ -8,18 +8,28 @@
        $.highlightText = {
 
                // Split our pattern string at spaces and run our highlight function on the results
-               splitAndHighlight: function ( node, pat ) {
+               splitAndHighlight: function ( node, text ) {
                        var i,
-                               patArray = pat.split( ' ' );
-                       for ( i = 0; i < patArray.length; i++ ) {
-                               if ( patArray[ i ].length === 0 ) {
+                               words = text.split( ' ' );
+                       for ( i = 0; i < words.length; i++ ) {
+                               if ( words[ i ].length === 0 ) {
                                        continue;
                                }
-                               $.highlightText.innerHighlight( node, patArray[ i ] );
+                               $.highlightText.innerHighlight(
+                                       node,
+                                       new RegExp( '(^|\\s)' + mw.RegExp.escape( words[ i ] ), 'i' )
+                               );
                        }
                        return node;
                },
 
+               prefixHighlight: function ( node, prefix ) {
+                       $.highlightText.innerHighlight(
+                               node,
+                               new RegExp( '(^)' + mw.RegExp.escape( prefix ), 'i' )
+                       );
+               },
+
                // scans a node looking for the pattern and wraps a span around each match
                innerHighlight: function ( node, pat ) {
                        var i, match, pos, spannode, middlebit, middleclone;
@@ -28,7 +38,7 @@
                                // non latin characters can make regex think a new word has begun: do not use \b
                                // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
                                // look for an occurrence of our pattern and store the starting position
-                               match = node.data.match( new RegExp( '(^|\\s)' + mw.RegExp.escape( pat ), 'i' ) );
+                               match = node.data.match( pat );
                                if ( match ) {
                                        pos = match.index + match[ 1 ].length; // include length of any matched spaces
                                        // create the span wrapper for the matched text
@@ -37,7 +47,7 @@
                                        // shave off the characters preceding the matched text
                                        middlebit = node.splitText( pos );
                                        // shave off any unmatched text off the end
-                                       middlebit.splitText( pat.length );
+                                       middlebit.splitText( match[ 0 ].length - match[ 1 ].length );
                                        // clone for appending to our span
                                        middleclone = middlebit.cloneNode( true );
                                        // append the matched text node to the span
                }
        };
 
-       $.fn.highlightText = function ( matchString ) {
+       /**
+        * Highlight certain text in current nodes (by wrapping it in `<span class="highlight">...</span>`).
+        *
+        * @param {string} matchString String to match
+        * @param {Object} [options]
+        * @param {string} [options.method='splitAndHighlight'] Method of matching to use, one of:
+        *   - 'splitAndHighlight': Split `matchString` on spaces, then match each word separately.
+        *   - 'prefixHighlight': Match `matchString` at the beginning of text only.
+        * @return {jQuery}
+        * @chainable
+        */
+       $.fn.highlightText = function ( matchString, options ) {
+               options = options || {};
+               options.method = options.method || 'splitAndHighlight';
                return this.each( function () {
                        var $el = $( this );
                        $el.data( 'highlightText', { originalText: $el.text() } );
-                       $.highlightText.splitAndHighlight( this, matchString );
+                       $.highlightText[ options.method ]( this, matchString );
                } );
        };
 
index ae9c943..12b0404 100644 (file)
@@ -85,7 +85,7 @@
                                                                'placeholder-password': $input,
                                                                'placeholder-id': id
                                                        } )
-                                                       .bind( 'focus.placeholder drop.placeholder', clearPlaceholder );
+                                                       .on( 'focus.placeholder drop.placeholder', clearPlaceholder );
                                        $input
                                                        .data( {
                                                                'placeholder-textinput': $replacement,
                                .filter( function () {
                                        return !$( this ).data( 'placeholder-enabled' );
                                } )
-                               .bind( {
+                               .on( {
                                        'focus.placeholder drop.placeholder': clearPlaceholder,
                                        'blur.placeholder': setPlaceholder
                                } )
                } );
 
                // Clear placeholder values upon page reload
-               $( window ).bind( 'beforeunload.placeholder', function () {
+               $( window ).on( 'beforeunload.placeholder', function () {
                        $( '.placeholder' ).each( function () {
                                this.value = '';
                        } );
index 4353dd7..0aaa4ff 100644 (file)
@@ -12,6 +12,7 @@
  *
  * @author Timo Tijhof, 2011-2012
  */
+/* eslint-env qunit */
 ( function ( mw, $ ) {
        'use strict';
 
index 76b4845..6c7bd0e 100644 (file)
@@ -36,5 +36,5 @@
 
        /* IE < 8 */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
index f6b4fd1..2cc0cc9 100644 (file)
@@ -6,7 +6,7 @@
        top: 0;
        left: 0;
        width: 0;
-       border: none;
+       border: 0;
        z-index: 1099;
        padding: 0;
        margin: -1px 0 0 0;
@@ -17,7 +17,6 @@
        background-color: #fff;
        cursor: pointer;
        border: solid 1px #aaa;
-       padding: 0;
        margin: 0;
        margin-top: -2px;
        display: none;
index f3e4e09..fdc8a26 100644 (file)
                                                                }
 
                                                                if ( context.config.highlightInput ) {
-                                                                       $result.highlightText( context.data.prevText );
+                                                                       $result.highlightText( context.data.prevText, { method: 'prefixHighlight' } );
                                                                }
 
                                                                // Widen results box if needed (new width is only calculated here, applied later).
                                                                // Don't interfere with special clicks (e.g. to open in new tab)
                                                                if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
                                                                        // This will hide the link we're just clicking on, which causes problems
-                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       // when done synchronously in at least Firefox 3.6 (T64858).
                                                                        setTimeout( function () {
                                                                                $.suggestions.hide( context );
                                                                        }, 0 );
                                                                // Don't interfere with special clicks (e.g. to open in new tab)
                                                                if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
                                                                        // This will hide the link we're just clicking on, which causes problems
-                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       // when done synchronously in at least Firefox 3.6 (T64858).
                                                                        setTimeout( function () {
                                                                                $.suggestions.hide( context );
                                                                        }, 0 );
index 4da05e6..f84c091 100644 (file)
@@ -63,7 +63,7 @@
                var $node = $( node ),
                        // Use data-sort-value attribute.
                        // Use data() instead of attr() so that live value changes
-                       // are processed as well (bug 38152).
+                       // are processed as well (T40152).
                        data = $node.data( 'sortValue' );
 
                if ( data !== null && data !== undefined ) {
                                s = out;
                        }
                        i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
-                       return isNaN( i ) ? 0 : i;
+                       return isNaN( i ) ? -Infinity : i;
                },
 
                formatFloat: function ( s ) {
                        var i = parseFloat( s );
-                       return isNaN( i ) ? 0 : i;
+                       return isNaN( i ) ? -Infinity : i;
                },
 
                formatInt: function ( s ) {
                        var i = parseInt( s, 10 );
-                       return isNaN( i ) ? 0 : i;
+                       return isNaN( i ) ? -Infinity : i;
                },
 
                clearTableBody: function ( table ) {
index c897302..c6ad945 100644 (file)
@@ -4,7 +4,7 @@
 ( function ( $ ) {
        if ( document.selection && document.selection.createRange ) {
                // On IE, patch the focus() method to restore the windows' scroll position
-               // (bug 32241)
+               // (T34241)
                $.fn.extend( {
                        focus: ( function ( jqFocus ) {
                                return function () {
@@ -56,7 +56,7 @@
                 */
                function activateElementOnIE( element ) {
                        if ( element.setActive ) {
-                               element.setActive(); // bug 32241: doesn't scroll
+                               element.setActive(); // T34241: doesn't scroll
                        } else {
                                $( element ).focus(); // may scroll (but we patched it above)
                        }
                                                        // IE
 
                                                        // Note that IE9 will trigger the next section unless we check this first.
-                                                       // See bug 35201.
+                                                       // See bug T37201.
 
                                                        activateElementOnIE( this );
                                                        if ( context ) {
                                                // IE doesn't properly report non-selected caret position through
                                                // the selection ranges when textarea isn't focused. This can
                                                // lead to saving a bogus empty selection, which then screws up
-                                               // whatever we do later (bug 31847).
+                                               // whatever we do later (T33847).
                                                activateElementOnIE( e );
 
                                                preFinished = false;
diff --git a/resources/src/json-skip.js b/resources/src/json-skip.js
deleted file mode 100644 (file)
index 0a1e1c2..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Skip function for json2.js.
- */
-return !!( window.JSON && JSON.stringify && JSON.parse );
index 9b0c430..f68dbfa 100644 (file)
@@ -11,5 +11,5 @@
        display: inline-block;
        /* IE7 */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable declaration-block-no-duplicate-properties */
 }
index f26c336..15d0a39 100644 (file)
 
                // This should be moved down to '#editform', but is kept on the body for now
                // because the LiquidThreads extension is re-using this module with only half
-               // the EditPage (doesn't include #editform presumably, bug 55463).
+               // the EditPage (doesn't include #editform presumably, T57463).
                $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
        } );
 
index c8d3fad..31c22af 100644 (file)
@@ -11,7 +11,7 @@
                var idleTimeout = 3000,
                        api = new mw.Api(),
                        timer,
-                       pending,
+                       stashReq,
                        lastText,
                        lastSummary,
                        lastTextHash,
                        PRIORITY_LOW = 1,
                        PRIORITY_HIGH = 2;
 
+               // We don't attempt to stash new section edits because in such cases the parser output
+               // varies on the edit summary (since it determines the new section's name).
+               if ( !$form.length || section === 'new' ) {
+                       return;
+               }
+
                // Send a request to stash the edit to the API.
                // If a request is in progress, abort it since its payload is stale and the API
                // may limit concurrent stash parses.
                function stashEdit() {
-                       api.getToken( 'csrf' ).then( function ( token ) {
-                               var req, params,
-                                       textChanged = isTextChanged(),
-                                       priority = textChanged ? PRIORITY_HIGH : PRIORITY_LOW;
-
-                               if ( pending ) {
-                                       if ( lastPriority > priority ) {
-                                               // Stash request for summary change should wait on pending text change stash
-                                               pending.then( checkStash );
-                                               return;
-                                       }
-                                       pending.abort();
+                       var req, params,
+                               textChanged = isTextChanged(),
+                               priority = textChanged ? PRIORITY_HIGH : PRIORITY_LOW;
+
+                       if ( stashReq ) {
+                               if ( lastPriority > priority ) {
+                                       // Stash request for summary change should wait on pending text change stash
+                                       stashReq.then( checkStash );
+                                       return;
                                }
+                               stashReq.abort();
+                       }
 
-                               // Update the "last" tracking variables
-                               lastSummary = $summary.textSelection( 'getContents' );
-                               lastPriority = priority;
-                               if ( textChanged ) {
-                                       lastText = $text.textSelection( 'getContents' );
-                                       // Reset hash
-                                       lastTextHash = null;
-                               }
+                       // Update the "last" tracking variables
+                       lastSummary = $summary.textSelection( 'getContents' );
+                       lastPriority = priority;
+                       if ( textChanged ) {
+                               lastText = $text.textSelection( 'getContents' );
+                               // Reset hash
+                               lastTextHash = null;
+                       }
+
+                       params = {
+                               formatversion: 2,
+                               action: 'stashedit',
+                               title: mw.config.get( 'wgPageName' ),
+                               section: section,
+                               sectiontitle: '',
+                               summary: lastSummary,
+                               contentmodel: model,
+                               contentformat: format,
+                               baserevid: revId
+                       };
+                       if ( lastTextHash ) {
+                               params.stashedtexthash = lastTextHash;
+                       } else {
+                               params.text = lastText;
+                       }
 
-                               params = {
-                                       action: 'stashedit',
-                                       token: token,
-                                       title: mw.config.get( 'wgPageName' ),
-                                       section: section,
-                                       sectiontitle: '',
-                                       summary: lastSummary,
-                                       contentmodel: model,
-                                       contentformat: format,
-                                       baserevid: revId
-                               };
-                               if ( lastTextHash ) {
-                                       params.stashedtexthash = lastTextHash;
+                       req = api.postWithToken( 'csrf', params );
+                       stashReq = req;
+                       req.then( function ( data ) {
+                               if ( req === stashReq ) {
+                                       stashReq = null;
+                               }
+                               if ( data.stashedit && data.stashedit.texthash ) {
+                                       lastTextHash = data.stashedit.texthash;
                                } else {
-                                       params.text = lastText;
+                                       // Request failed or text hash expired;
+                                       // include the text in a future stash request.
+                                       lastTextHash = null;
                                }
-
-                               req = api.post( params );
-                               pending = req;
-                               req.then( function ( data ) {
-                                       if ( req === pending ) {
-                                               pending = null;
-                                       }
-                                       if ( data.stashedit && data.stashedit.texthash ) {
-                                               lastTextHash = data.stashedit.texthash;
-                                       } else {
-                                               // Request failed or text hash expired;
-                                               // include the text in a future stash request.
-                                               lastTextHash = null;
-                                       }
-                               } );
                        } );
                }
 
                        idleTimeout = 3000;
                }
 
-               function onFormLoaded() {
-                       if (
-                               // Reverts may involve use (undo) links; stash as they review the diff.
-                               // Since the form has a pre-filled summary, stash the edit immediately.
-                               mw.util.getParamValue( 'undo' ) !== null ||
-                               // Pressing "show changes" and "preview" also signify that the user will
-                               // probably save the page soon
-                               $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
-                       ) {
-                               checkStash();
-                       }
-               }
-
-               // We don't attempt to stash new section edits because in such cases the parser output
-               // varies on the edit summary (since it determines the new section's name).
-               if ( $form.find( 'input[name=wpSection]' ).val() === 'new' ) {
-                       return;
-               }
-
                $text.on( {
-                       change: checkStash,
                        keyup: onKeyUp,
-                       focus: onTextFocus
+                       focus: onTextFocus,
+                       change: checkStash
                } );
                $summary.on( {
+                       keyup: onKeyUp,
                        focus: onSummaryFocus,
-                       focusout: checkStash,
-                       keyup: onKeyUp
+                       focusout: checkStash
                } );
-               onFormLoaded();
+
+               if (
+                       // Reverts may involve use (undo) links; stash as they review the diff.
+                       // Since the form has a pre-filled summary, stash the edit immediately.
+                       mw.util.getParamValue( 'undo' ) !== null ||
+                       // Pressing "show changes" and "preview" also signify that the user will
+                       // probably save the page soon
+                       $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
+               ) {
+                       checkStash();
+               }
        } );
 }( mediaWiki, jQuery ) );
index 5b08f95..cad530b 100644 (file)
@@ -10,8 +10,8 @@
 }
 
 #pagehistory li.selected {
-       background-color: #f9f9f9;
-       border: 1px dashed #aaa;
+       background-color: #f8f9fa;
+       border: 1px dashed #a2a9b1;
 }
 
 .mw-history-revisionactions {
index 7439754..d89cd4a 100644 (file)
@@ -8,9 +8,9 @@
                        // Recheck preference so extensions can do a hack to disable this code.
                        if ( parseInt( mw.user.options.get( 'editondblclick' ), 10 ) ) {
                                e.preventDefault();
-                               // Trigger native HTMLElement click instead of opening URL (bug 43052)
+                               // Trigger native HTMLElement click instead of opening URL (T45052)
                                $a = $( '#ca-edit a' );
-                               // Not every page has an edit link (bug 57713)
+                               // Not every page has an edit link (T59713)
                                if ( $a.length ) {
                                        $a.get( 0 ).click();
                                }
index d5520a1..d466216 100644 (file)
@@ -33,7 +33,7 @@
 
 /*
  * Add a checkered background image on hover for file
- * description pages. (bug 26470)
+ * description pages. (T28470)
  */
 .filehistory a img,
 #file img:hover {
@@ -46,8 +46,8 @@
  */
 #filetoc {
        text-align: center;
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
+       border: 1px solid #a2a9b1;
+       background-color: #f8f9fa;
        padding: 5px;
        font-size: 95%;
        margin-bottom: 0.5em;
@@ -76,6 +76,8 @@
        font-size: 0.8em;
        margin-left: 0.5em;
        margin-bottom: 0.5em;
+       border: 0;
+       border-collapse: collapse;
        width: 400px;
 }
 
        font-weight: bold;
 }
 
-.mw_metadata th {
-       font-weight: normal;
-       text-align: center;
-}
-
-.mw_metadata td {
-       padding: 0.1em;
-}
-
-.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
 .mw_metadata td,
 .mw_metadata th {
-       border: 1px solid #aaa;
+       border: 1px solid #a2a9b1;
        padding-left: 5px;
        padding-right: 5px;
 }
 
 .mw_metadata th {
-       background-color: #f9f9f9;
+       background-color: #f8f9fa;
+       font-weight: normal;
+       text-align: center;
 }
 
 .mw_metadata td {
        background-color: #fcfcfc;
+       padding-top: 0.1em;
+       padding-bottom: 0.1em;
 }
 
 .mw_metadata ul.metadata-langlist {
index 9a8edef..6e0010c 100644 (file)
@@ -16,7 +16,7 @@
        position: relative;
        top: 0.6em;
        left: -50%;
-       padding: .6em 3.6em .6em 1.1em;
+       padding: 0.6em 3.6em 0.6em 1.1em;
        line-height: 1.5625em;
        color: #626465;
        background-color: #f4f4f4;
@@ -55,7 +55,7 @@
 
 .postedit-close {
        position: absolute;
-       padding: 0 .8em;
+       padding: 0 0.8em;
        right: 0;
        top: 0;
        font-size: 1.25em;
index ada101e..ebd1ebc 100644 (file)
@@ -18,7 +18,7 @@ jQuery( function ( $ ) {
                // inside the heading (e.g. to do things like copy URL, open in new tab, ..).
                // e.target can be the heading, but it can also be anything inside the heading.
                if ( e.target.nodeName.toLowerCase() !== 'a' ) {
-                       // Trigger native HTMLElement click instead of opening URL (bug 43052)
+                       // Trigger native HTMLElement click instead of opening URL (T45052)
                        e.preventDefault();
                        $edit.get( 0 ).click();
                }
diff --git a/resources/src/mediawiki.language/languages/he.js b/resources/src/mediawiki.language/languages/he.js
deleted file mode 100644 (file)
index 5bf8c4d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Hebrew (עברית) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
-       if ( grammarForms && grammarForms[ form ] ) {
-               return grammarForms[ form ][ word ];
-       }
-       switch ( form ) {
-               case 'prefixed':
-               case 'תחילית': // the same word in Hebrew
-                       // Duplicate prefixed "Waw", but only if it's not already double
-                       if ( word.slice( 0, 1 ) === 'ו' && word.slice( 0, 2 ) !== 'וו' ) {
-                               word = 'ו' + word;
-                       }
-
-                       // Remove the "He" if prefixed
-                       if ( word.slice( 0, 1 ) === 'ה' ) {
-                               word = word.slice( 1 );
-                       }
-
-                       // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if ( word.slice( 0, 1 ) < 'א' || word.slice( 0, 1 ) > 'ת' ) {
-                               word = '־' + word;
-                       }
-       }
-       return word;
-};
diff --git a/resources/src/mediawiki.language/languages/ru.js b/resources/src/mediawiki.language/languages/ru.js
deleted file mode 100644 (file)
index 09d7c0b..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * Russian (Русский) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       'use strict';
-
-       var forms, transformations, i, rule, sourcePattern, regexp, replacement;
-
-       forms = mediaWiki.language.getData( 'ru', 'grammarForms' );
-       if ( forms && forms[ form ] ) {
-               return forms[ form ][ word ];
-       }
-
-       transformations = mediaWiki.language.getData( 'ru', 'grammarTransformations' );
-
-       if ( !transformations[ form ] ) {
-               return word;
-       }
-
-       for ( i = 0; i < transformations[ form ].length; i++ ) {
-               rule = transformations[ form ][ i ];
-               sourcePattern = rule[ 0 ];
-
-               if ( sourcePattern === '@metadata' ) {
-                       continue;
-               }
-
-               regexp = new RegExp( sourcePattern );
-               replacement = rule[ 1 ];
-
-               if ( word.match( regexp ) ) {
-                       return word.replace( regexp, replacement );
-               }
-       }
-
-       return word;
-};
diff --git a/resources/src/mediawiki.language/languages/uk.js b/resources/src/mediawiki.language/languages/uk.js
deleted file mode 100644 (file)
index 138045c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Ukrainian (Українська) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
-       if ( grammarForms && grammarForms[ form ] ) {
-               return grammarForms[ form ][ word ];
-       }
-       switch ( form ) {
-               case 'genitive': // родовий відмінок
-                       if ( word.slice( -2 ) === 'ія' ) {
-                               word = word.slice( 0, -2 ) + 'ії';
-                       } else if ( word.slice( -2 ) === 'ти' ) {
-                               word = word.slice( 0, -2 ) + 'т';
-                       } else if ( word.slice( -2 ) === 'ди' ) {
-                               word = word.slice( 0, -2 ) + 'дів';
-                       } else if ( word.slice( -3 ) === 'ник' ) {
-                               word = word.slice( 0, -3 ) + 'ника';
-                       }
-
-                       break;
-               case 'accusative': // знахідний відмінок
-                       if ( word.slice( -2 ) === 'ія' ) {
-                               word = word.slice( 0, -2 ) + 'ію';
-                       }
-
-                       break;
-       }
-
-       return word;
-};
index fc2af3d..3726a68 100644 (file)
 
                /**
                 * Grammatical transformations, needed for inflected languages.
-                * Invoked by putting `{{grammar:form|word}}` in a message.
+                * Invoked by putting `{{grammar:case|word}}` in a message.
                 *
                 * The rules can be defined in $wgGrammarForms global or computed
                 * dynamically by overriding this method per language.
                 * @return {string}
                 */
                convertGrammar: function ( word, form ) {
-                       var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
-                       if ( grammarForms && grammarForms[ form ] ) {
-                               return grammarForms[ form ][ word ] || word;
+                       var userLanguage, forms, transformations,
+                               patterns, i, rule, sourcePattern, regexp, replacement;
+
+                       userLanguage = mw.config.get( 'wgUserLanguage' );
+
+                       forms = mw.language.getData( userLanguage, 'grammarForms' );
+                       if ( forms && forms[ form ] ) {
+                               return forms[ form ][ word ];
+                       }
+
+                       transformations = mediaWiki.language.getData( userLanguage, 'grammarTransformations' );
+
+                       if ( !( transformations && transformations[ form ] ) ) {
+                               return word;
+                       }
+
+                       patterns = transformations[ form ];
+
+                       // Some names of grammar rules are aliases for other rules.
+                       // In such cases the value is a string rather than object,
+                       // so load the actual rules.
+                       if ( typeof patterns === 'string' ) {
+                               patterns = transformations[ patterns ];
                        }
+
+                       for ( i = 0; i < patterns.length; i++ ) {
+                               rule = patterns[ i ];
+                               sourcePattern = rule[ 0 ];
+
+                               if ( sourcePattern === '@metadata' ) {
+                                       continue;
+                               }
+
+                               regexp = new RegExp( sourcePattern );
+                               replacement = rule[ 1 ];
+
+                               if ( word.match( regexp ) ) {
+                                       return word.replace( regexp, replacement );
+                               }
+                       }
+
                        return word;
                },
 
index 1192650..83277cb 100644 (file)
                return valueParts.join( options.decimal );
        }
 
+       /**
+        * Helper function to flip transformation tables.
+        *
+        * @param {...Object} Transformation tables
+        * @return {Object}
+        */
+       function flipTransform() {
+               var i, key, table, flipped = {};
+
+               // Ensure we strip thousand separators. This might be overwritten.
+               flipped[ ',' ] = '';
+
+               for ( i = 0; i < arguments.length; i++ ) {
+                       table = arguments[ i ];
+                       for ( key in table ) {
+                               if ( table.hasOwnProperty( key ) ) {
+                                       // The thousand separator should be deleted
+                                       flipped[ table[ key ] ] = key === ',' ? '' : key;
+                               }
+                       }
+               }
+
+               return flipped;
+       }
+
        $.extend( mw.language, {
 
                /**
                 * @return {number|string} Formatted number
                 */
                convertNumber: function ( num, integer ) {
-                       var i, tmp, transformTable, numberString, convertedNumber, pattern;
-
-                       pattern = mw.language.getData( mw.config.get( 'wgUserLanguage' ),
-                               'digitGroupingPattern' ) || '#,##0.###';
+                       var transformTable, digitTransformTable, separatorTransformTable,
+                               i, numberString, convertedNumber, pattern;
 
-                       // Set the target transform table:
-                       transformTable = mw.language.getDigitTransformTable();
-
-                       if ( !transformTable ) {
+                       // Quick shortcut for plain numbers
+                       if ( integer && parseInt( num, 10 ) === num ) {
                                return num;
                        }
 
-                       // Check if the 'restore' to Latin number flag is set:
+                       // Load the transformation tables (can be empty)
+                       digitTransformTable = mw.language.getDigitTransformTable();
+                       separatorTransformTable = mw.language.getSeparatorTransformTable();
+
                        if ( integer ) {
-                               if ( parseInt( num, 10 ) === num ) {
-                                       return num;
-                               }
-                               tmp = [];
-                               for ( i in transformTable ) {
-                                       tmp[ transformTable[ i ] ] = i;
-                               }
-                               transformTable = tmp;
+                               // Reverse the digit transformation tables if we are doing unformatting
+                               transformTable = flipTransform( separatorTransformTable, digitTransformTable );
                                numberString = String( num );
                        } else {
-                               // Ignore transform table if wgTranslateNumerals is false
-                               if ( !mw.config.get( 'wgTranslateNumerals' ) ) {
-                                       transformTable = [];
+                               // This check being here means that digits can still be unformatted
+                               // even if we do not produce them. This seems sane behavior.
+                               if ( mw.config.get( 'wgTranslateNumerals' ) ) {
+                                       transformTable = digitTransformTable;
                                }
+
+                               // Commaying is more complex, so we handle it here separately.
+                               // When unformatting, we just use separatorTransformTable.
+                               pattern = mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+                                       'digitGroupingPattern' ) || '#,##0.###';
                                numberString = mw.language.commafy( num, pattern );
                        }
 
-                       convertedNumber = '';
-                       for ( i = 0; i < numberString.length; i++ ) {
-                               if ( transformTable[ numberString[ i ] ] ) {
-                                       convertedNumber += transformTable[ numberString[ i ] ];
-                               } else {
-                                       convertedNumber += numberString[ i ];
+                       if ( transformTable ) {
+                               convertedNumber = '';
+                               for ( i = 0; i < numberString.length; i++ ) {
+                                       if ( transformTable.hasOwnProperty( numberString[ i ] ) ) {
+                                               convertedNumber += transformTable[ numberString[ i ] ];
+                                       } else {
+                                               convertedNumber += numberString[ i ];
+                                       }
                                }
+                       } else {
+                               convertedNumber = numberString;
                        }
-                       return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
+
+                       if ( integer ) {
+                               // Parse string to integer. This loses decimals!
+                               convertedNumber = parseInt( convertedNumber, 10 );
+                       }
+
+                       return convertedNumber;
                },
 
                /**
index ec94df3..7c2f92b 100644 (file)
@@ -182,22 +182,16 @@ a {
        content: " (https:" attr( href ) ")";
 }
 
-/* MSIE/Win doesn't understand 'inherit' */
 a,
 a.external,
 a.new,
 a.stub {
+       /* IE 6 & 7 don't understand `inherit` */
        color: #000 !important;
        text-decoration: none !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-       color: inherit !important;
-       text-decoration: inherit !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 */
 }
 
 /**
@@ -258,7 +252,7 @@ html .thumbimage {
 }
 
 html .thumbcaption {
-       border: none;
+       border: 0;
        text-align: left;
        line-height: 1.4em;
        padding: 3px;
@@ -336,13 +330,13 @@ table.listing td {
 .catlinks li {
        display: inline-block;
        line-height: 1.15em;
-       padding: 0 .4em;
+       padding: 0 0.4em;
        border-left: 1pt solid #aaa;
        margin: 0.1em 0;
 }
 
 .catlinks li:first-child {
-       padding-left: .2em;
+       padding-left: 0.2em;
        border-left: 0;
 }
 
index 4daf77f..7c4dbb1 100644 (file)
@@ -32,7 +32,12 @@ h6 {
        font-size: 1em;
 }
 
-h1, h2, h3, h4, h5, h6 {
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
        font-weight: bolder;
 }
 
@@ -78,7 +83,7 @@ table.rimage {
 
 /* thumbnails */
 div.thumb {
-       margin-bottom: .5em;
+       margin-bottom: 0.5em;
        border-style: solid;
        border-color: #fff;
        width: auto;
@@ -100,7 +105,7 @@ html .thumbimage {
 }
 
 html .thumbcaption {
-       border: none;
+       border: 0;
        line-height: 1.4em;
        padding: 3px;
        font-size: 94%;
@@ -136,15 +141,15 @@ div.magnify a {
 div.tright {
        clear: right;
        float: right;
-       border-width: .5em 0 .8em 1.4em;
+       border-width: 0.5em 0 0.8em 1.4em;
 }
 
 /* @noflip */
 div.tleft {
        float: left;
        clear: left;
-       margin-right: .5em;
-       border-width: .5em 1.4em .8em 0;
+       margin-right: 0.5em;
+       border-width: 0.5em 1.4em 0.8em 0;
 }
 
 img.thumbborder {
@@ -158,14 +163,14 @@ img.thumbborder {
 }
 
 img {
-       border: none;
+       border: 0;
 }
 
 #toc,
 .toc {
        border: 1px solid #bba;
        background-color: #f7f8ff;
-       padding: 5px;
+       padding: 7px;
        font-size: 95%;
        text-align: center;
        display: inline-block;
@@ -173,9 +178,7 @@ img {
 
        /* IE7 and earlier */
        zoom: 1;
-       *display: inline;
-
-       padding: 7px;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
 
 /* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
@@ -193,7 +196,7 @@ table.toc td {
 #toc h2,
 .toc h2 {
        display: inline;
-       border: none;
+       border: 0;
        padding: 0;
        font-size: 100%;
        font-weight: bold;
@@ -308,9 +311,7 @@ span.comment {
 }
 
 .editExternally {
-       border-style: solid;
-       border-width: 1px;
-       border-color: #808080;
+       border: 1px solid #808080;
        background: #fff;
        padding: 3px;
        margin-top: 0.5em;
@@ -333,25 +334,14 @@ li span.deleted {
 /* Classes for Exif data display */
 table.mw_metadata {
        margin-left: 0.5em;
+       border: 0;
+       border-collapse: collapse;
 }
 
 table.mw_metadata caption {
        font-weight: bold;
 }
 
-table.mw_metadata th {
-       font-weight: normal;
-}
-
-table.mw_metadata td {
-       padding: 0.1em;
-}
-
-table.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
 table.mw_metadata td,
 table.mw_metadata th {
        border: 1px solid #aaa;
@@ -361,16 +351,18 @@ table.mw_metadata th {
 
 table.mw_metadata th {
        background-color: #f9f9f9;
+       font-weight: normal;
 }
 
 table.mw_metadata td {
        background-color: #fcfcfc;
+       padding-top: 0.1em;
+       padding-bottom: 0.1em;
 }
 
 table.mw_metadata td.spacer {
        background: inherit;
-       border-top: none;
-       border-bottom: none;
+       border-width: 0 1px;
 }
 
 .visualClear {
@@ -399,14 +391,14 @@ table.mw_metadata td.spacer {
 }
 
 div.multipageimagenavbox {
-       border: solid 1px #c0c0c0;
+       border: 1px solid #c0c0c0;
        padding: 4px;
        margin: 1em;
        background: #f0f0f0;
 }
 
 div.multipageimagenavbox div.thumb {
-       border: none;
+       border: 0;
        margin-left: 2em;
        margin-right: 2em;
 }
index 1522de1..0d7512f 100644 (file)
@@ -83,10 +83,10 @@ abbr[title],
        cursor: help;
 }
 
-@supports (text-decoration: underline dotted) {
+@supports ( text-decoration: underline dotted ) {
        abbr[title],
        .explain[title] {
-               border-bottom: none;
+               border-bottom: 0;
                text-decoration: underline dotted;
        }
 }
@@ -124,6 +124,16 @@ span.comment {
        font-family: serif;
 }
 
+/* Underline preference */
+
+.mw-underline-always a {
+       text-decoration: underline;
+}
+
+.mw-underline-never a {
+       text-decoration: none;
+}
+
 /**
  * rev_deleted stuff
  */
@@ -156,6 +166,7 @@ div.patrollink {
  */
 td.mw-label {
        text-align: right;
+       vertical-align: middle;
 }
 
 td.mw-input {
@@ -164,19 +175,30 @@ td.mw-input {
 
 td.mw-submit {
        text-align: left;
-}
-
-td.mw-label {
-       vertical-align: middle;
-}
-
-td.mw-submit {
        white-space: nowrap;
 }
 
 input#wpSummary {
+       background-color: #fff;
+       color: #000;
        width: 80%;
        margin-bottom: 1em;
+       padding: 0.625em 0.546875em 0.546875em;
+       border: 1px solid #a2a9b1;
+       border-radius: 2px;
+       box-shadow: inset 0 0 0 1px #fff;
+       font-family: inherit;
+       font-size: inherit;
+       -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 );
+}
+
+input#wpSummary:focus,
+input#wpSummary:active {
+       outline: 0;
+       border-color: #36c;
+       box-shadow: inset 0 0 0 1px #36c;
 }
 
 .mw-input-with-label {
@@ -216,7 +238,7 @@ input#wpSummary {
 #catlinks {
        /**
         * Overrides text justification (user preference)
-        * See bug 31990
+        * See T33990
         */
        text-align: left;
 }
@@ -234,19 +256,19 @@ input#wpSummary {
 .catlinks li {
        display: inline-block;
        line-height: 1.25em;
-       border-left: 1px solid #aaa;
+       border-left: 1px solid #a2a9b1;
        margin: 0.125em 0;
        padding: 0 0.5em;
        zoom: 1;
-       display: inline !ie;
+       display: inline !ie; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
 
 .catlinks li:first-child {
        padding-left: 0.25em;
-       border-left: none;
+       border-left: 0;
 }
 
-/* (bug 5346) make category redirects italic */
+/* (T7346) make category redirects italic */
 .catlinks li a.mw-redirect {
        font-style: italic;
 }
@@ -293,7 +315,7 @@ p.mw-delete-editreasons {
 div.mw-warning-with-logexcerpt {
        padding: 3px;
        margin-bottom: 3px;
-       border: 2px solid #2f6fab;
+       border: 2px solid #2a4b8d;
        clear: both;
 }
 
@@ -318,7 +340,7 @@ th.mw-revdel-checkbox {
        text-align: center;
 }
 
-/* red links; see bug 36276 */
+/* red links; see T38276 */
 a.new {
        color: #ba0000;
 }
@@ -330,7 +352,7 @@ a.new {
        padding: 0 !important;
 }
 
-/* External URLs should always be treated as LTR (bug 4330) */
+/* External URLs should always be treated as LTR (T6330) */
 /* @noflip */ .rtl a.external.free,
 .rtl a.external.autonumber {
        direction: ltr;
@@ -343,8 +365,8 @@ a.new {
  */
 table.wikitable {
        margin: 1em 0;
-       background-color: #f9f9f9;
-       border: 1px solid #aaa;
+       background-color: #f8f9fa;
+       border: 1px solid #a2a9b1;
        border-collapse: collapse;
        color: #000;
 }
@@ -353,13 +375,13 @@ table.wikitable > tr > th,
 table.wikitable > tr > td,
 table.wikitable > * > tr > th,
 table.wikitable > * > tr > td {
-       border: 1px solid #aaa;
+       border: 1px solid #a2a9b1;
        padding: 0.2em 0.4em;
 }
 
 table.wikitable > tr > th,
 table.wikitable > * > tr > th {
-       background-color: #f2f2f2;
+       background-color: #eaecf0;
        text-align: center;
 }
 
@@ -390,11 +412,11 @@ table.wikitable > caption {
 .warningbox,
 .successbox {
        border: 1px solid;
-       padding: .5em 1em;
+       padding: 0.5em 1em;
        margin-bottom: 1em;
        display: inline-block;
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
 
 .errorbox h2,
@@ -404,8 +426,8 @@ table.wikitable > caption {
        color: inherit;
        font-weight: bold;
        display: inline;
-       margin: 0 .5em 0 0;
-       border: none;
+       margin: 0 0.5em 0 0;
+       border: 0;
 }
 
 .errorbox {
@@ -472,7 +494,7 @@ table.wikitable > caption {
 .mw-datatable,
 .mw-datatable td,
 .mw-datatable th {
-       border: 1px solid #aaa;
+       border: 1px solid #a2a9b1;
        padding: 0 0.15em 0 0.15em;
 }
 
@@ -485,7 +507,7 @@ table.wikitable > caption {
 }
 
 .mw-datatable tr:hover td {
-       background-color: #eef;
+       background-color: #eaf3ff;
 }
 
 /* Correct directionality when page dir is different from site/user dir */
@@ -548,96 +570,99 @@ table.wikitable > caption {
        background-repeat: no-repeat;
 }
 
-/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
+/* Language specific height correction for titles. Ref T31405 and T32809 */
 /* Languages like hi or ml require slightly more vertical space to show diacritics properly */
-h1:lang(anp),
-h1:lang(as),
-h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
-h1:lang(bho),
-h1:lang(bn),
-h1:lang(gu),
-h1:lang(hi),
-h1:lang(kn),
-h1:lang(ks),
-h1:lang(ml),
-h1:lang(mr),
-h1:lang(my),
-h1:lang(mai),
-h1:lang(ne),
-h1:lang(new),
-h1:lang(or),
-h1:lang(pa),
-h1:lang(pi),
-h1:lang(sa),
-h1:lang(ta),
-h1:lang(te) {
+h1:lang( anp ),
+h1:lang( as ),
+h1:lang( bh ), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
+h1:lang( bho ),
+h1:lang( bn ),
+h1:lang( gu ),
+h1:lang( hi ),
+h1:lang( kn ),
+h1:lang( ks ),
+h1:lang( ml ),
+h1:lang( mr ),
+h1:lang( my ),
+h1:lang( mai ),
+h1:lang( ne ),
+h1:lang( new ),
+h1:lang( or ),
+h1:lang( pa ),
+h1:lang( pi ),
+h1:lang( sa ),
+h1:lang( ta ),
+h1:lang( te ) {
        line-height: 1.6em !important;
 }
 
-h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
-h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
-h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
-h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
-h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
-h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
-h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
-h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
-h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
-h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
-h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
-h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
-h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
-h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
-h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
-h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
-h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
-h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
-h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
-h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
-h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
+/* stylelint-disable selector-list-comma-newline-after */
+h2:lang( anp ), h3:lang( anp ), h4:lang( anp ), h5:lang( anp ), h6:lang( anp ),
+h2:lang( as ), h3:lang( as ), h4:lang( as ), h5:lang( as ), h6:lang( as ),
+h2:lang( bho ), h3:lang( bho ), h4:lang( bho ), h5:lang( bho ), h6:lang( bho ),
+h2:lang( bh ), h3:lang( bh ), h4:lang( bh ), h5:lang( bh ), h6:lang( bh ),
+h2:lang( bn ), h3:lang( bn ), h4:lang( bn ), h5:lang( bn ), h6:lang( bn ),
+h2:lang( gu ), h3:lang( gu ), h4:lang( gu ), h5:lang( gu ), h6:lang( gu ),
+h2:lang( hi ), h3:lang( hi ), h4:lang( hi ), h5:lang( hi ), h6:lang( hi ),
+h2:lang( kn ), h3:lang( kn ), h4:lang( kn ), h5:lang( kn ), h6:lang( kn ),
+h2:lang( ks ), h3:lang( ks ), h4:lang( ks ), h5:lang( ks ), h6:lang( ks ),
+h2:lang( ml ), h3:lang( ml ), h4:lang( ml ), h5:lang( ml ), h6:lang( ml ),
+h2:lang( mr ), h3:lang( mr ), h4:lang( mr ), h5:lang( mr ), h6:lang( mr ),
+h2:lang( my ), h3:lang( my ), h4:lang( my ), h5:lang( my ), h6:lang( my ),
+h2:lang( mai ), h3:lang( mai ), h4:lang( mai ), h5:lang( mai ), h6:lang( mai ),
+h2:lang( ne ), h3:lang( ne ), h4:lang( ne ), h5:lang( ne ), h6:lang( ne ),
+h2:lang( new ), h3:lang( new ), h4:lang( new ), h5:lang( new ), h6:lang( new ),
+h2:lang( or ), h3:lang( or ), h4:lang( or ), h5:lang( or ), h6:lang( or ),
+h2:lang( pa ), h3:lang( pa ), h4:lang( pa ), h5:lang( pa ), h6:lang( pa ),
+h2:lang( pi ), h3:lang( pi ), h4:lang( pi ), h5:lang( pi ), h6:lang( pi ),
+h2:lang( sa ), h3:lang( sa ), h4:lang( sa ), h5:lang( sa ), h6:lang( sa ),
+h2:lang( ta ), h3:lang( ta ), h4:lang( ta ), h5:lang( ta ), h6:lang( ta ),
+h2:lang( te ), h3:lang( te ), h4:lang( te ), h5:lang( te ), h6:lang( te ) {
        line-height: 1.2em;
 }
+/* stylelint-enable selector-list-comma-newline-after */
 
 /* Localised ordered list numbering for some languages */
-ol:lang(azb) li,
-ol:lang(bcc) li,
-ol:lang(bgn) li,
-ol:lang(bqi) li,
-ol:lang(fa) li,
-ol:lang(glk) li,
-ol:lang(kk-arab) li,
-ol:lang(lrc) li,
-ol:lang(luz) li,
-ol:lang(mzn) li {
+ol:lang( azb ) li,
+ol:lang( bcc ) li,
+ol:lang( bgn ) li,
+ol:lang( bqi ) li,
+ol:lang( fa ) li,
+ol:lang( glk ) li,
+ol:lang( kk-arab ) li,
+ol:lang( lrc ) li,
+ol:lang( luz ) li,
+ol:lang( mzn ) li {
        list-style-type: -moz-persian;
        list-style-type: persian;
 }
 
-ol:lang(ckb) li,
-ol:lang(sdh) li {
+ol:lang( ckb ) li,
+ol:lang( sdh ) li {
        list-style-type: -moz-arabic-indic;
        list-style-type: arabic-indic;
 }
 
-ol:lang(hi) li,
-ol:lang(mr) li {
+ol:lang( hi ) li,
+ol:lang( mr ) li {
        list-style-type: -moz-devanagari;
        list-style-type: devanagari;
 }
 
-ol:lang(as) li,
-ol:lang(bn) li {
+ol:lang( as ) li,
+ol:lang( bn ) li {
        list-style-type: -moz-bengali;
        list-style-type: bengali;
 }
 
-ol:lang(or) li {
+ol:lang( or ) li {
        list-style-type: -moz-oriya;
        list-style-type: oriya;
 }
 
-#toc ul, .toc ul {
-       margin: .3em 0;
+#toc ul,
+.toc ul {
+       margin: 0.3em 0;
 }
 
 /* Correct directionality when page dir is different from site/user dir */
@@ -714,7 +739,7 @@ table.floatleft {
        position: relative;
 }
 
-/* bug 12205 */
+/* T14205 */
 #mw-credits a {
        unicode-bidi: embed;
 }
index fd615b7..651a018 100644 (file)
@@ -9,4 +9,4 @@
        -webkit-transform: rotate( @deg );
        -moz-transform: rotate( @deg );
        transform: rotate( @deg );
-}
\ No newline at end of file
+}
index 3535be8..4cca1a6 100644 (file)
        display: @display;
 }
 
+.flex-wrap( @wrap: wrap ) {
+       -webkit-flex-wrap: @wrap; // iOS 6-, Safari 3.1-6
+       -moz-flex-wrap: @wrap; // Firefox 21-
+       -ms-flex-wrap: @wrap; // IE 10
+       flex-wrap: @wrap;
+}
+
 .flex( @grow: 1, @shrink: 1, @width: auto, @order: 1 ) {
        // For 2009/2012 spec alignment consistency with current default
        -webkit-box-pack: justify; // iOS 6-, Safari 3.1-6
        order: @order;
 }
 
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+.mixin-placeholder( @rules ) {
+       // WebKit, Blink, Edge
+       &::-webkit-input-placeholder {
+               @rules();
+       }
+       // Internet Explorer 10-11
+       &:-ms-input-placeholder {
+               @rules();
+       }
+       // Firefox 19-
+       &::-moz-placeholder {
+               @rules();
+       }
+       // Firefox 4-18
+       &:-moz-placeholder {
+               @rules();
+       }
+       // W3C Standard Selectors Level 4
+       &::placeholder {
+               @rules();
+       }
+       // For inputs that use jquery.placeholder.js e.g. IE9
+       &.placeholder {
+               @rules();
+       }
+}
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 
 // Screen Reader Helper Mixin
 .mixin-screen-reader-text() {
index 676ecca..d4937c6 100644 (file)
@@ -26,9 +26,9 @@
 // Orange; for contextual use of returning to a past action
 @colorRegressive: #ff5d00;
 // Red; for contextual use of a negative action of high severity
-@colorDestructive: #c33;
-@colorDestructiveHighlight: #e53939;
-@colorDestructiveActive: #873636;
+@colorDestructive: #d33;
+@colorDestructiveHighlight: #ff4242;
+@colorDestructiveActive: #b32424;
 // Orange; for contextual use of a potentially negative action of medium severity
 @colorMediumSevere: #ff5d00;
 // Yellow; for contextual use of a potentially negative action of low severity
 // Form input sizes
 @checkboxSize: 2em;
 @radioSize: 2em;
-
-// The following rules are deprecated
-@colorWhite: #fff;
-@colorOffWhite: #fafafa;
-@colorGrayDark: #898989;
-@colorGrayLight: #ccc;
-@colorGrayLighter: #ddd;
-@colorGrayLightest: #eee;
-// Green; for contextual use of a positive finalizing action
-@colorConstructive: #00af89;
-@colorConstructiveHighlight: #1c6665;
-@colorConstructiveActive: #134645;
-
index 558fd4c..e20b422 100644 (file)
                        api = apiUrl ? new mw.ForeignApi( apiUrl ) : new mw.Api();
 
                return api.get( {
+                       formatversion: 2,
                        action: 'query',
                        prop: 'info',
-                       indexpageids: true,
                        titles: title.getPrefixedDb()
                } ).then( function ( data ) {
-                       var pageId, page, contentModel, moduleName;
-                       if ( !data.query.pageids[ 0 ] ) {
+                       var contentModel, moduleName, page = data.query.pages[ 0 ];
+                       if ( !page ) {
                                return $.Deferred().reject( 'unexpected-response', 'Unexpected API response' );
                        }
-                       pageId = data.query.pageids[ 0 ];
-                       page = data.query.pages[ pageId ];
-
                        contentModel = page.contentmodel;
                        moduleName = 'mediawiki.messagePoster.' + contentModel;
                        return mw.loader.using( moduleName ).then( function () {
@@ -99,7 +96,6 @@
         * @param {mw.Title} title Title being posted to
         * @param {mw.Api} api mw.Api instance that the instance should use
         * @return {mw.messagePoster.MessagePoster}
-        *
         */
        MessagePosterFactory.prototype.createForContentModel = function ( contentModel, title, api ) {
                return new this.contentModelToClass[ contentModel ]( title, api );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js
new file mode 100644 (file)
index 0000000..edb6744
--- /dev/null
@@ -0,0 +1,59 @@
+( function ( mw ) {
+       /**
+        * View model for the changes list
+        *
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        */
+       mw.rcfilters.dm.ChangesListViewModel = function MwRcfiltersDmChangesListViewModel() {
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+
+               this.valid = true;
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.dm.ChangesListViewModel );
+       OO.mixinClass( mw.rcfilters.dm.ChangesListViewModel, OO.EventEmitter );
+
+       /* Events */
+
+       /**
+        * @event invalidate
+        *
+        * The list of changes is now invalid (out of date)
+        */
+
+       /**
+        * @event update
+        * @param {jQuery|string} changesListContent
+        *
+        * The list of change is now up to date
+        */
+
+       /* Methods */
+
+       /**
+        * Invalidate the list of changes
+        *
+        * @fires invalidate
+        */
+       mw.rcfilters.dm.ChangesListViewModel.prototype.invalidate = function () {
+               if ( this.valid ) {
+                       this.valid = false;
+                       this.emit( 'invalidate' );
+               }
+       };
+
+       /**
+        * Update the model with an updated list of changes
+        *
+        * @param {jQuery|string} changesListContent
+        */
+       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent ) {
+               this.valid = true;
+               this.emit( 'update', changesListContent );
+       };
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
new file mode 100644 (file)
index 0000000..14a610b
--- /dev/null
@@ -0,0 +1,183 @@
+( function ( mw ) {
+       /**
+        * View model for a filter group
+        *
+        * @mixins OO.EventEmitter
+        * @mixins OO.EmitterList
+        *
+        * @constructor
+        * @param {string} name Group name
+        * @param {Object} [config] Configuration options
+        * @cfg {string} [type='send_unselected_if_any'] Group type
+        * @cfg {string} [title] Group title
+        * @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
+        */
+       mw.rcfilters.dm.FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) {
+               config = config || {};
+
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+               OO.EmitterList.call( this );
+
+               this.name = name;
+               this.type = config.type || 'send_unselected_if_any';
+               this.title = config.title;
+               this.separator = config.separator || '|';
+
+               this.active = !!config.active;
+               this.fullCoverage = !!config.fullCoverage;
+
+               this.aggregate( { update: 'filterItemUpdate' } );
+               this.connect( this, { filterItemUpdate: 'onFilterItemUpdate' } );
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.dm.FilterGroup );
+       OO.mixinClass( mw.rcfilters.dm.FilterGroup, OO.EventEmitter );
+       OO.mixinClass( mw.rcfilters.dm.FilterGroup, OO.EmitterList );
+
+       /* Events */
+
+       /**
+        * @event update
+        *
+        * Group state has been updated
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to filterItem update event
+        *
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.onFilterItemUpdate = function () {
+               // Update state
+               var active = this.areAnySelected();
+
+               if ( this.active !== active ) {
+                       this.active = active;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Get group active state
+        *
+        * @return {boolean} Active state
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.isActive = function () {
+               return this.active;
+       };
+
+       /**
+        * Get group name
+        *
+        * @return {string} Group name
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Check whether there are any items selected
+        *
+        * @return {boolean} Any items in the group are selected
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.areAnySelected = function () {
+               return this.getItems().some( function ( filterItem ) {
+                       return filterItem.isSelected();
+               } );
+       };
+
+       /**
+        * Check whether all items selected
+        *
+        * @return {boolean} All items are selected
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.areAllSelected = function () {
+               return this.getItems().every( function ( filterItem ) {
+                       return filterItem.isSelected();
+               } );
+       };
+
+       /**
+        * Get all selected items in this group
+        *
+        * @param {mw.rcfilters.dm.FilterItem} [excludeItem] Item to exclude from the list
+        * @return {mw.rcfilters.dm.FilterItem[]} Selected items
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getSelectedItems = function ( excludeItem ) {
+               var excludeName = ( excludeItem && excludeItem.getName() ) || '';
+
+               return this.getItems().filter( function ( item ) {
+                       return item.getName() !== excludeName && item.isSelected();
+               } );
+       };
+
+       /**
+        * Check whether all selected items are in conflict with the given item
+        *
+        * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item to test
+        * @return {boolean} All selected items are in conflict with this item
+        */
+       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 );
+               } );
+       };
+
+       /**
+        * Check whether any of the selected items are in conflict with the given item
+        *
+        * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item to test
+        * @return {boolean} Any of the selected items are in conflict with this item
+        */
+       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 );
+               } );
+       };
+
+       /**
+        * Get group type
+        *
+        * @return {string} Group type
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getType = function () {
+               return this.type;
+       };
+
+       /**
+        * Get group's title
+        *
+        * @return {string} Title
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getTitle = function () {
+               return this.title;
+       };
+
+       /**
+        * Get group's values separator
+        *
+        * @return {string} Values separator
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getSeparator = function () {
+               return this.separator;
+       };
+
+       /**
+        * Check whether the group is defined as full coverage
+        *
+        * @return {boolean} Group is full coverage
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.isFullCoverage = function () {
+               return this.fullCoverage;
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js
new file mode 100644 (file)
index 0000000..675f4b5
--- /dev/null
@@ -0,0 +1,367 @@
+( function ( mw ) {
+       /**
+        * Filter item model
+        *
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {string} name Filter 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
+        */
+       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, 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;
+
+               // Interaction definitions
+               this.subset = config.subset || [];
+               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
+        */
+
+       /* Methods */
+
+       /**
+        * Get the name of this filter
+        *
+        * @return {string} Filter name
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Get the model of the group this filter belongs to
+        *
+        * @return {mw.rcfilters.dm.FilterGroup} Filter group model
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getGroupModel = function () {
+               return this.groupModel;
+       };
+
+       /**
+        * Get the group name this filter belongs to
+        *
+        * @return {string} Filter group name
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getGroupName = function () {
+               return this.groupModel.getName();
+       };
+
+       /**
+        * Get the label of this filter
+        *
+        * @return {string} Filter label
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getLabel = function () {
+               return this.label;
+       };
+
+       /**
+        * Get the description of this filter
+        *
+        * @return {string} Filter description
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getDescription = function () {
+               return this.description;
+       };
+
+       /**
+        * Get the default value of this filter
+        *
+        * @return {boolean} Filter default
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getDefault = function () {
+               return this.default;
+       };
+
+       /**
+        * Get filter subset
+        * This is a list of filter names that are defined to be included
+        * when this filter is selected.
+        *
+        * @return {string[]} Filter subset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getSubset = function () {
+               return this.subset;
+       };
+
+       /**
+        * Get filter superset
+        * This is a generated list of filters that define this filter
+        * to be included when either of them is selected.
+        *
+        * @return {string[]} Filter superset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getSuperset = function () {
+               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
+        *
+        * @return {boolean} Filter is in conflict state
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isConflicted = function () {
+               return this.conflicted;
+       };
+
+       /**
+        * Check whether the filter is currently in an already included subset
+        *
+        * @return {boolean} Filter is in an already-included subset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isIncluded = function () {
+               return this.included;
+       };
+
+       /**
+        * Check whether the filter is currently fully covered
+        *
+        * @return {boolean} Filter is in fully-covered state
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isFullyCovered = function () {
+               return this.fullyCovered;
+       };
+
+       /**
+        * Get filter conflicts
+        *
+        * @return {string[]} Filter conflicts
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getConflicts = function () {
+               return this.conflicts;
+       };
+
+       /**
+        * Set filter conflicts
+        *
+        * @param {string[]} conflicts Filter conflicts
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setConflicts = function ( conflicts ) {
+               this.conflicts = conflicts || [];
+       };
+
+       /**
+        * Set filter superset
+        *
+        * @param {string[]} superset Filter superset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setSuperset = function ( superset ) {
+               this.superset = superset || [];
+       };
+
+       /**
+        * Check whether a filter exists in the subset list for this filter
+        *
+        * @param {string} filterName Filter name
+        * @return {boolean} Filter name is in the subset list
+        */
+       mw.rcfilters.dm.FilterItem.prototype.existsInSubset = function ( filterName ) {
+               return this.subset.indexOf( filterName ) > -1;
+       };
+
+       /**
+        * 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.FilterItem.prototype.existsInConflicts = function ( filterItem ) {
+               return this.conflicts.indexOf( filterItem.getName() ) > -1;
+       };
+
+       /**
+        * Set the state of this filter as being conflicted
+        * (This means any filters in its conflicts are selected)
+        *
+        * @param {boolean} [conflicted] Filter is in conflict state
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleConflicted = function ( conflicted ) {
+               conflicted = conflicted === undefined ? !this.conflicted : conflicted;
+
+               if ( this.conflicted !== conflicted ) {
+                       this.conflicted = conflicted;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Set the state of this filter as being already included
+        * (This means any filters in its superset are selected)
+        *
+        * @param {boolean} [included] Filter is included as part of a subset
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleIncluded = function ( included ) {
+               included = included === undefined ? !this.included : included;
+
+               if ( this.included !== included ) {
+                       this.included = included;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Toggle the selected state of the item
+        *
+        * @param {boolean} [isSelected] Filter is selected
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected === undefined ? !this.selected : isSelected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Toggle the fully covered state of the item
+        *
+        * @param {boolean} [isFullyCovered] Filter is fully covered
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleFullyCovered = function ( isFullyCovered ) {
+               isFullyCovered = isFullyCovered === undefined ? !this.fullycovered : isFullyCovered;
+
+               if ( this.fullyCovered !== isFullyCovered ) {
+                       this.fullyCovered = isFullyCovered;
+                       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 ) );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
new file mode 100644 (file)
index 0000000..d58eb2e
--- /dev/null
@@ -0,0 +1,759 @@
+( function ( mw, $ ) {
+       /**
+        * View model for the filters selection and display
+        *
+        * @mixins OO.EventEmitter
+        * @mixins OO.EmitterList
+        *
+        * @constructor
+        */
+       mw.rcfilters.dm.FiltersViewModel = function MwRcfiltersDmFiltersViewModel() {
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+               OO.EmitterList.call( this );
+
+               this.groups = {};
+               this.defaultParams = {};
+               this.defaultFiltersEmpty = null;
+               this.highlightEnabled = false;
+
+               // Events
+               this.aggregate( { update: 'filterItemUpdate' } );
+               this.connect( this, { filterItemUpdate: [ 'emit', 'itemUpdate' ] } );
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.dm.FiltersViewModel );
+       OO.mixinClass( mw.rcfilters.dm.FiltersViewModel, OO.EventEmitter );
+       OO.mixinClass( mw.rcfilters.dm.FiltersViewModel, OO.EmitterList );
+
+       /* Events */
+
+       /**
+        * @event initialize
+        *
+        * Filter list is initialized
+        */
+
+       /**
+        * @event itemUpdate
+        * @param {mw.rcfilters.dm.FilterItem} item Filter item updated
+        *
+        * Filter item has changed
+        */
+
+       /**
+        * @event highlightChange
+        * @param {boolean} Highlight feature is enabled
+        *
+        * Highlight feature has been toggled enabled or disabled
+        */
+
+       /* Methods */
+
+       /**
+        * Re-assess the states of filter items based on the interactions between them
+        *
+        * @param {mw.rcfilters.dm.FilterItem} [item] Changed item. If not given, the
+        *  method will go over the state of all items
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.reassessFilterInteractions = function ( item ) {
+               var allSelected,
+                       model = this,
+                       iterationItems = item !== undefined ? [ item ] : this.getItems();
+
+               iterationItems.forEach( function ( checkedItem ) {
+                       var allCheckedItems = checkedItem.getSubset().concat( [ checkedItem.getName() ] ),
+                               groupModel = checkedItem.getGroupModel();
+
+                       // Check for subsets (included filters) plus the item itself:
+                       allCheckedItems.forEach( function ( filterItemName ) {
+                               var itemInSubset = model.getItemByName( filterItemName );
+
+                               itemInSubset.toggleIncluded(
+                                       // If any of itemInSubset's supersets are selected, this item
+                                       // is included
+                                       itemInSubset.getSuperset().some( function ( supersetName ) {
+                                               return ( model.getItemByName( supersetName ).isSelected() );
+                                       } )
+                               );
+                       } );
+
+                       // Update coverage for the changed group
+                       if ( groupModel.isFullCoverage() ) {
+                               allSelected = groupModel.areAllSelected();
+                               groupModel.getItems().forEach( function ( filterItem ) {
+                                       filterItem.toggleFullyCovered( allSelected );
+                               } );
+                       }
+               } );
+
+               // Check for conflicts
+               // In this case, we must go over all items, since
+               // conflicts are bidirectional and depend not only on
+               // individual items, but also on the selected states of
+               // the groups they're in.
+               this.getItems().forEach( function ( filterItem ) {
+                       var inConflict = false,
+                               filterItemGroup = filterItem.getGroupModel();
+
+                       // For each item, see if that item is still conflicting
+                       $.each( model.groups, function ( groupName, groupModel ) {
+                               if ( filterItem.getGroupName() === groupName ) {
+                                       // Check inside the group
+                                       inConflict = groupModel.areAnySelectedInConflictWith( filterItem );
+                               } else {
+                                       // According to the spec, if two items conflict from two different
+                                       // groups, the conflict only lasts if the groups **only have selected
+                                       // items that are conflicting**. If a group has selected items that
+                                       // are conflicting and non-conflicting, the scope of the result has
+                                       // expanded enough to completely remove the conflict.
+
+                                       // For example, see two groups with conflicts:
+                                       // userExpLevel: [
+                                       //   {
+                                       //      name: 'experienced',
+                                       //      conflicts: [ 'unregistered' ]
+                                       //   }
+                                       // ],
+                                       // registration: [
+                                       //   {
+                                       //      name: 'registered',
+                                       //   },
+                                       //   {
+                                       //      name: 'unregistered',
+                                       //   }
+                                       // ]
+                                       // If we select 'experienced', then 'unregistered' is in conflict (and vice versa),
+                                       // because, inherently, 'experienced' filter only includes registered users, and so
+                                       // both filters are in conflict with one another.
+                                       // However, the minute we select 'registered', the scope of our results
+                                       // has expanded to no longer have a conflict with 'experienced' filter, and
+                                       // so the conflict is removed.
+
+                                       // In our case, we need to check if the entire group conflicts with
+                                       // the entire item's group, so we follow the above spec
+                                       inConflict = (
+                                               // The foreign group is in conflict with this item
+                                               groupModel.areAllSelectedInConflictWith( filterItem ) &&
+                                               // Every selected member of the item's own group is also
+                                               // in conflict with the other group
+                                               filterItemGroup.getSelectedItems().every( function ( otherGroupItem ) {
+                                                       return groupModel.areAllSelectedInConflictWith( otherGroupItem );
+                                               } )
+                                       );
+                               }
+
+                               // If we're in conflict, this will return 'false' which
+                               // will break the loop. Otherwise, we're not in conflict
+                               // and the loop continues
+                               return !inConflict;
+                       } );
+
+                       // Toggle the item state
+                       filterItem.toggleConflicted( inConflict );
+               } );
+       };
+
+       /**
+        * Set filters and preserve a group relationship based on
+        * the definition given by an object
+        *
+        * @param {Object} filters Filter group definition
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
+               var i, filterItem, selectedFilterNames,
+                       model = this,
+                       items = [],
+                       addArrayElementsUnique = function ( arr, elements ) {
+                               elements = Array.isArray( elements ) ? elements : [ elements ];
+
+                               elements.forEach( function ( element ) {
+                                       if ( arr.indexOf( element ) === -1 ) {
+                                               arr.push( element );
+                                       }
+                               } );
+
+                               return arr;
+                       },
+                       conflictMap = {},
+                       supersetMap = {};
+
+               // Reset
+               this.clearItems();
+               this.groups = {};
+
+               $.each( filters, function ( group, data ) {
+                       if ( !model.groups[ group ] ) {
+                               model.groups[ group ] = new mw.rcfilters.dm.FilterGroup( group, {
+                                       type: data.type,
+                                       title: data.title,
+                                       separator: data.separator,
+                                       fullCoverage: !!data.fullCoverage
+                               } );
+                       }
+
+                       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()
+                                               );
+                                       } );
+                               }
+
+                               // 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.
+                               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()
+                                               );
+                                       } );
+                               }
+
+                               if ( data.type === 'send_unselected_if_any' ) {
+                                       // Store the default parameter state
+                                       // For this group type, parameter values are direct
+                                       model.defaultParams[ data.filters[ i ].name ] = Number( !!data.filters[ i ].default );
+                               } else if (
+                                       data.type === 'string_options' &&
+                                       data.filters[ i ].default
+                               ) {
+                                       selectedFilterNames.push( data.filters[ i ].name );
+                               }
+
+                               model.groups[ group ].addItems( filterItem );
+                               items.push( filterItem );
+                       }
+
+                       if ( data.type === 'string_options' ) {
+                               // Store the default parameter group state
+                               // For this group, the parameter is group name and value is the names
+                               // of selected items
+                               model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, selectedFilterNames ).join( model.groups[ group ].getSeparator() );
+                       }
+               } );
+
+               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() ] );
+               } );
+
+               // Add items to the model
+               this.addItems( items );
+
+               this.emit( 'initialize' );
+       };
+
+       /**
+        * Get the names of all available filters
+        *
+        * @return {string[]} An array of filter names
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFilterNames = function () {
+               return this.getItems().map( function ( item ) { return item.getName(); } );
+       };
+
+       /**
+        * Get the object that defines groups by their name.
+        *
+        * @return {Object} Filter groups
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFilterGroups = function () {
+               return this.groups;
+       };
+
+       /**
+        * Get the value of a specific parameter
+        *
+        * @param {string} name Parameter name
+        * @return {number|string} Parameter value
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getParamValue = function ( name ) {
+               return this.parameters[ name ];
+       };
+
+       /**
+        * Get the current selected state of the filters
+        *
+        * @return {Object} Filters selected state
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getSelectedState = function () {
+               var i,
+                       items = this.getItems(),
+                       result = {};
+
+               for ( i = 0; i < items.length; i++ ) {
+                       result[ items[ i ].getName() ] = items[ i ].isSelected();
+               }
+
+               return result;
+       };
+
+       /**
+        * Get the current full state of the filters
+        *
+        * @return {Object} Filters full state
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFullState = function () {
+               var i,
+                       items = this.getItems(),
+                       result = {};
+
+               for ( i = 0; i < items.length; i++ ) {
+                       result[ items[ i ].getName() ] = {
+                               selected: items[ i ].isSelected(),
+                               conflicted: items[ i ].isConflicted(),
+                               included: items[ i ].isIncluded()
+                       };
+               }
+
+               return result;
+       };
+
+       /**
+        * Get the default parameters object
+        *
+        * @return {Object} Default parameter values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getDefaultParams = function () {
+               return this.defaultParams;
+       };
+
+       /**
+        * Set all filter states to default values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.setFiltersToDefaults = function () {
+               var defaultFilterStates = this.getFiltersFromParameters( this.getDefaultParams() );
+
+               this.updateFilters( defaultFilterStates );
+       };
+
+       /**
+        * Analyze the groups and their filters and output an object representing
+        * the state of the parameters they represent.
+        *
+        * @param {Object} [filterGroups] An object defining the filter groups to
+        *  translate to parameters. Its structure must follow that of this.groups
+        *  see #getFilterGroups
+        * @return {Object} Parameter state object
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterGroups ) {
+               var i, filterItems, anySelected, values,
+                       result = {},
+                       groupItems = filterGroups || this.getFilterGroups();
+
+               $.each( groupItems, function ( group, 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();
+                               } );
+
+                               // 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() );
+                                       }
+                               }
+
+                               if ( values.length === 0 || values.length === filterItems.length ) {
+                                       result[ group ] = 'all';
+                               } else {
+                                       result[ group ] = values.join( model.getSeparator() );
+                               }
+                       }
+               } );
+
+               return result;
+       };
+
+       /**
+        * Get the highlight parameters based on current filter configuration
+        *
+        * @return {object} Object where keys are "<filter name>_color" and values
+        *                  are the selected highlight colors.
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightParameters = function () {
+               var result = { highlight: this.isHighlightEnabled() };
+
+               this.getItems().forEach( function ( filterItem ) {
+                       result[ filterItem.getName() + '_color' ] = filterItem.getHighlightColor();
+               } );
+               return result;
+       };
+
+       /**
+        * Sanitize value group of a string_option groups type
+        * Remove duplicates and make sure to only use valid
+        * values.
+        *
+        * @private
+        * @param {string} groupName Group name
+        * @param {string[]} valueArray Array of values
+        * @return {string[]} Array of valid values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function( groupName, valueArray ) {
+               var result = [],
+                       validNames = this.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 );
+                       }
+               } );
+
+               return result;
+       };
+
+       /**
+        * Check whether the current filter state is set to all false.
+        *
+        * @return {boolean} Current filters are all empty
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.areCurrentFiltersEmpty = function () {
+               var 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() )
+                       );
+               } );
+       };
+
+       /**
+        * Check whether the default values of the filters are all false.
+        *
+        * @return {boolean} Default filters are all false
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.areDefaultFiltersEmpty = function () {
+               var defaultFilters;
+
+               if ( this.defaultFiltersEmpty !== null ) {
+                       // We only need to do this test once,
+                       // because defaults are set once per session
+                       defaultFilters = this.getFiltersFromParameters();
+                       this.defaultFiltersEmpty = Object.keys( defaultFilters ).every( function ( filterName ) {
+                               return !defaultFilters[ filterName ];
+                       } );
+               }
+
+               return this.defaultFiltersEmpty;
+       };
+
+       /**
+        * This is the opposite of the #getParametersFromFilters method; this goes over
+        * the given parameters and translates into a selected/unselected value in the filters.
+        *
+        * @param {Object} params Parameters query object
+        * @return {Object} Filter state object
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) {
+               var i, filterItem,
+                       groupMap = {},
+                       model = this,
+                       base = this.getDefaultParams(),
+                       result = {};
+
+               params = $.extend( {}, base, params );
+
+               $.each( params, function ( paramName, paramValue ) {
+                       // Find the filter item
+                       filterItem = model.getItemByName( paramName );
+                       // Ignore if no filter item exists
+                       if ( filterItem ) {
+                               groupMap[ filterItem.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
+        *
+        * @param {string} name Filter name
+        * @return {mw.rcfilters.dm.FilterItem} Filter item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getItemByName = function ( name ) {
+               return this.getItems().filter( function ( item ) {
+                       return name === item.getName();
+               } )[ 0 ];
+       };
+
+       /**
+        * Set all filters to false or empty/all
+        * This is equivalent to display all.
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.emptyAllFilters = function () {
+               var filters = {};
+
+               this.getItems().forEach( function ( filterItem ) {
+                       filters[ filterItem.getName() ] = false;
+               } );
+
+               // Update filters
+               this.updateFilters( filters );
+       };
+
+       /**
+        * Toggle selected state of items by their names
+        *
+        * @param {Object} filterDef Filter definitions
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.updateFilters = function ( filterDef ) {
+               var name, filterItem;
+
+               for ( name in filterDef ) {
+                       filterItem = this.getItemByName( name );
+                       filterItem.toggleSelected( filterDef[ name ] );
+               }
+       };
+
+       /**
+        * Get a group model from its name
+        *
+        * @param {string} groupName Group name
+        * @return {mw.rcfilters.dm.FilterGroup} Group model
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getGroup = function ( groupName ) {
+               return this.groups[ groupName ];
+       };
+
+       /**
+        * Get all filters within a specified group by its name
+        *
+        * @param {string} groupName Group name
+        * @return {mw.rcfilters.dm.FilterItem[]} Filters belonging to this group
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getGroupFilters = function ( groupName ) {
+               return ( this.getGroup( groupName ) && this.getGroup( groupName ).getItems() ) || [];
+       };
+
+       /**
+        * Find items whose labels match the given string
+        *
+        * @param {string} query Search string
+        * @return {Object} An object of items to show
+        *  arranged by their group names
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query ) {
+               var i,
+                       groupTitle,
+                       result = {},
+                       items = this.getItems();
+
+               // Normalize so we can search strings regardless of case
+               query = query.toLowerCase();
+
+               // item label starting with the query string
+               for ( i = 0; i < items.length; i++ ) {
+                       if ( items[ i ].getLabel().toLowerCase().indexOf( query ) === 0 ) {
+                               result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
+                               result[ items[ i ].getGroupName() ].push( items[ i ] );
+                       }
+               }
+
+               if ( $.isEmptyObject( result ) ) {
+                       // item containing the query string in their label, description, or group title
+                       for ( i = 0; i < items.length; i++ ) {
+                               groupTitle = items[ i ].getGroupModel().getTitle();
+                               if (
+                                       items[ i ].getLabel().toLowerCase().indexOf( query ) > -1 ||
+                                       items[ i ].getDescription().toLowerCase().indexOf( query ) > -1 ||
+                                       groupTitle.toLowerCase().indexOf( query ) > -1
+                               ) {
+                                       result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
+                                       result[ items[ i ].getGroupName() ].push( items[ i ] );
+                               }
+                       }
+               }
+
+               return result;
+       };
+
+       /**
+        * Get items that are highlighted
+        *
+        * @return {mw.rcfilters.dm.FilterItem[]} Highlighted items
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightedItems = function () {
+               return this.getItems().filter( function ( filterItem ) {
+                       return filterItem.isHighlightSupported() &&
+                               filterItem.getHighlightColor();
+               } );
+       };
+
+       /**
+        * Toggle the highlight feature on and off.
+        * Propagate the change to filter items.
+        *
+        * @param {boolean} enable Highlight should be enabled
+        * @fires highlightChange
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.toggleHighlight = function ( enable ) {
+               enable = enable === undefined ? !this.highlightEnabled : enable;
+
+               if ( this.highlightEnabled !== enable ) {
+                       this.highlightEnabled = enable;
+
+                       this.getItems().forEach( function ( filterItem ) {
+                               filterItem.toggleHighlight( this.highlightEnabled );
+                       }.bind( this ) );
+
+                       this.emit( 'highlightChange', this.highlightEnabled );
+               }
+       };
+
+       /**
+        * Check if the highlight feature is enabled
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.isHighlightEnabled = function () {
+               return this.highlightEnabled;
+       };
+
+       /**
+        * Set highlight color for a specific filter item
+        *
+        * @param {string} filterName Name of the filter item
+        * @param {string} color Selected color
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.setHighlightColor = function ( filterName, color ) {
+               this.getItemByName( filterName ).setHighlightColor( color );
+       };
+
+       /**
+        * Clear highlight for a specific filter item
+        *
+        * @param {string} filterName Name of the filter item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.clearHighlightColor = function ( filterName ) {
+               this.getItemByName( filterName ).clearHighlightColor();
+       };
+
+       /**
+        * Clear highlight for all filter items
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.clearAllHighlightColors = function () {
+               this.getItems().forEach( function ( filterItem ) {
+                       filterItem.clearHighlightColor();
+               } );
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
new file mode 100644 (file)
index 0000000..1df31a2
--- /dev/null
@@ -0,0 +1,202 @@
+( function ( mw, $ ) {
+       /**
+        * 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
+        */
+       mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel ) {
+               this.filtersModel = filtersModel;
+               this.changesListModel = changesListModel;
+               this.requestCounter = 0;
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.Controller );
+
+       /**
+        * Initialize the filter and parameter states
+        *
+        * @param {Object} filterStructure Filter definition and structure for the model
+        */
+       mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
+               var uri = new mw.Uri();
+
+               // 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
+                               )
+                       )
+               );
+
+               // Initialize highlights
+               this.filtersModel.toggleHighlight( !!uri.query.highlight );
+               this.filtersModel.getItems().forEach( function ( filterItem ) {
+                       var color = uri.query[ filterItem.getName() + '_color' ];
+                       if ( !color ) {
+                               return;
+                       }
+
+                       filterItem.setHighlightColor( color );
+               } );
+
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+       };
+
+       /**
+        * Reset to default filters
+        */
+       mw.rcfilters.Controller.prototype.resetToDefaults = function () {
+               this.filtersModel.setFiltersToDefaults();
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+
+               this.updateURL();
+               this.updateChangesList();
+       };
+
+       /**
+        * Empty all selected filters
+        */
+       mw.rcfilters.Controller.prototype.emptyFilters = function () {
+               this.filtersModel.emptyAllFilters();
+               this.filtersModel.clearAllHighlightColors();
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+
+               this.updateURL();
+               this.updateChangesList();
+       };
+
+       /**
+        * Update the state of a filter
+        *
+        * @param {string} filterName Filter name
+        * @param {boolean} isSelected Filter selected state
+        */
+       mw.rcfilters.Controller.prototype.updateFilter = function ( filterName, isSelected ) {
+               var obj = {},
+                       filterItem = this.filtersModel.getItemByName( filterName );
+
+               if ( filterItem.isSelected() !== isSelected ) {
+                       obj[ filterName ] = isSelected;
+                       this.filtersModel.updateFilters( obj );
+
+                       this.updateURL();
+                       this.updateChangesList();
+
+                       // Check filter interactions
+                       this.filtersModel.reassessFilterInteractions( this.filtersModel.getItemByName( filterName ) );
+               }
+       };
+
+       /**
+        * Update the URL of the page to reflect current filters
+        */
+       mw.rcfilters.Controller.prototype.updateURL = function () {
+               var uri = this.getUpdatedUri();
+               window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
+       };
+
+       /**
+        * Get an updated mw.Uri object based on the model state
+        *
+        * @return {mw.Uri} Updated Uri
+        */
+       mw.rcfilters.Controller.prototype.getUpdatedUri = function () {
+               var uri = new mw.Uri(),
+                       highlightParams = this.filtersModel.getHighlightParameters();
+
+               // Add to existing queries in URL
+               // TODO: Clean up the list of filters; perhaps 'falsy' filters
+               // shouldn't appear at all? Or compare to existing query string
+               // and see if current state of a specific filter is needed?
+               uri.extend( this.filtersModel.getParametersFromFilters() );
+
+               // highlight params
+               Object.keys( highlightParams ).forEach( function ( paramName ) {
+                       if ( highlightParams[ paramName ] ) {
+                               uri.query[ paramName ] = highlightParams[ paramName ];
+                       } else {
+                               delete uri.query[ paramName ];
+                       }
+               } );
+
+               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
+        */
+       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;
+                       } );
+       };
+
+       /**
+        * 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 ) );
+       };
+
+       /**
+        * Toggle the highlight feature on and off
+        */
+       mw.rcfilters.Controller.prototype.toggleHighlight = function () {
+               this.filtersModel.toggleHighlight();
+               this.updateURL();
+       };
+
+       /**
+        * 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();
+       };
+
+       /**
+        * 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();
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js
new file mode 100644 (file)
index 0000000..ebeaad6
--- /dev/null
@@ -0,0 +1,9 @@
+( function ( mw ) {
+       /**
+        * Supported highlight colors.
+        * Warning: These are also hardcoded in "styles/mw.rcfilters.variables.less"
+        *
+        * @type {string[]}
+        */
+       mw.rcfilters.HighlightColors = [ 'c1', 'c2', 'c3', 'c4', 'c5' ];
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
new file mode 100644 (file)
index 0000000..33e9f57
--- /dev/null
@@ -0,0 +1,239 @@
+/*!
+ * JavaScript for Special:RecentChanges
+ */
+( function ( mw, $ ) {
+       /**
+        * @class mw.rcfilters
+        * @singleton
+        */
+       var rcfilters = {
+               /** */
+               init: function () {
+                       var filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
+                               changesListModel = new mw.rcfilters.dm.ChangesListViewModel(),
+                               controller = new mw.rcfilters.Controller( filtersModel, changesListModel ),
+                               $overlay = $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-overlay' ),
+                               filtersWidget = new mw.rcfilters.ui.FilterWrapperWidget(
+                                       controller, filtersModel, { $overlay: $overlay } );
+
+                       // eslint-disable-next-line no-new
+                       new mw.rcfilters.ui.ChangesListWrapperWidget(
+                               filtersModel, changesListModel, $( '.mw-changeslist, .mw-changeslist-empty' ) );
+
+                       // 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'
+                                               }
+                                       ]
+                               }
+                       } );
+
+                       $( '.rcoptions' ).before( 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 );
+                               }
+                       } );
+
+                       window.addEventListener( 'popstate', function () {
+                               controller.updateFromURL();
+                               controller.updateChangesList();
+                       } );
+               }
+       };
+
+       $( rcfilters.init );
+
+       module.exports = rcfilters;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.js
new file mode 100644 (file)
index 0000000..3ddb5a0
--- /dev/null
@@ -0,0 +1,3 @@
+( function ( mw ) {
+       mw.rcfilters = { dm: {}, ui: {} };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
new file mode 100644 (file)
index 0000000..8423363
--- /dev/null
@@ -0,0 +1,9 @@
+// Corrections for the standard special page
+.rcoptions {
+       border: 0;
+       border-bottom: 1px solid #a2a9b1;
+
+       legend {
+               display: none;
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less
new file mode 100644 (file)
index 0000000..5c31b5d
--- /dev/null
@@ -0,0 +1,63 @@
+@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 ) {
+       border-radius: 50%;
+       min-width: @diameter;
+       width: @diameter;
+       min-height: @diameter;
+       height: @diameter;
+       margin: @padding;
+       .box-sizing( border-box );
+
+       background-color: @color;
+
+       & when (@border = true) {
+               border: 1px solid #565656;
+       }
+}
+
+// This is the circle that appears next to the results
+// Its visibility is directly dependent on whether there is
+// a color class on its parent element
+.result-circle( @colorName: 'none' ) {
+       &-@{colorName} {
+               .mw-rcfilters-mixin-circle( ~"@{highlight-@{colorName}}", @result-circle-diameter, 0 );
+               display: none;
+
+               .mw-rcfilters-highlight-color-@{colorName} & {
+                       display: inline-block;
+               }
+       }
+}
+
+// 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}";
+
+       // 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}";
+
+       // Two colors
+       @{highlight-color-class-var} when ( @color3 = false ) and ( @color4 = false ) and not ( @color1 = false ), ( @color2 = false ) {
+               background-color: tint( average( @@c1var, @@c2var ), 50% );
+       }
+       // Three colors
+       @{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3} when ( @color4 = false ) and not ( @color3 = false ) {
+               @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}";
+               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
new file mode 100644 (file)
index 0000000..2521899
--- /dev/null
@@ -0,0 +1,50 @@
+@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.ChangesListWrapperWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less
new file mode 100644 (file)
index 0000000..5ad2a19
--- /dev/null
@@ -0,0 +1,125 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-changesListWrapperWidget {
+       &-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} )";
+               }
+       }
+
+       // 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} )";
+
+               td:last-child {
+                       width: 100%;
+               }
+       }
+
+       &-highlights {
+               display: none;
+               padding: 0 @result-circle-general-margin 0 0;
+               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 )";
+               // And we want to shift the entire block to the left of the li
+               position: absolute;
+               left: 0;
+
+               .mw-rcfilters-ui-changesListWrapperWidget-highlighted & {
+                       display: inline-block;
+               }
+
+               div {
+                       .box-sizing( border-box );
+                       margin-right: @result-circle-margin;
+                       vertical-align: middle;
+                       // This is to make the dots appear at the center of the
+                       // text itself; it's a horrendous hack and blame JamesF for it.
+                       margin-top: -2px;
+               }
+
+               &-color {
+
+                       &-none {
+                               .mw-rcfilters-mixin-circle( @highlight-none, @result-circle-diameter, 0, true );
+                               display: inline-block;
+
+                               .mw-rcfilters-highlight-color-c1 &,
+                               .mw-rcfilters-highlight-color-c2 &,
+                               .mw-rcfilters-highlight-color-c3 &,
+                               .mw-rcfilters-highlight-color-c4 &,
+                               .mw-rcfilters-highlight-color-c5 & {
+                                       display: none;
+                               }
+                       }
+                       .result-circle( c1 );
+                       .result-circle( c2 );
+                       .result-circle( c3 );
+                       .result-circle( c4 );
+                       .result-circle( c5 );
+               }
+       }
+
+       // One color
+       .mw-rcfilters-highlight-color-c1 {
+               background-color: tint( @highlight-c1, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c2 {
+               background-color: tint( @highlight-c2, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c3 {
+               background-color: tint( @highlight-c3, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c4 {
+               background-color: tint( @highlight-c4, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c5 {
+               background-color: tint( @highlight-c5, 70% );
+       }
+
+       // Two colors
+       .highlight-color-mix( c1, c2 );
+       .highlight-color-mix( c1, c3 );
+       .highlight-color-mix( c1, c4 );
+       .highlight-color-mix( c1, c5 );
+       .highlight-color-mix( c2, c3 );
+       .highlight-color-mix( c2, c4 );
+       .highlight-color-mix( c2, c5 );
+       .highlight-color-mix( c3, c4 );
+       .highlight-color-mix( c3, c5 );
+       .highlight-color-mix( c4, c5 );
+
+       // Three colors
+       .highlight-color-mix( c1, c2, c3 );
+       .highlight-color-mix( c1, c2, c5 );
+       .highlight-color-mix( c1, c2, c4 );
+       .highlight-color-mix( c1, c3, c4 );
+       .highlight-color-mix( c1, c3, c5 );
+       .highlight-color-mix( c1, c4, c5 );
+       .highlight-color-mix( c2, c3, c4 );
+       .highlight-color-mix( c2, c3, c5 );
+       .highlight-color-mix( c2, c4, c5 );
+       .highlight-color-mix( c3, c4, c5 );
+
+       // Four colors
+       .highlight-color-mix( c1, c2, c3, c4 );
+       .highlight-color-mix( c1, c2, c3, c5 );
+       .highlight-color-mix( c1, c2, c4, c5 );
+       .highlight-color-mix( c1, c3, c4, c5 );
+       .highlight-color-mix( c2, c3, c4, c5 );
+
+       // Five colors:
+       .mw-rcfilters-highlight-color-c1.mw-rcfilters-highlight-color-c2.mw-rcfilters-highlight-color-c3.mw-rcfilters-highlight-color-c4.mw-rcfilters-highlight-color-c5 {
+               background-color: tint( mix( @highlight-c1, mix( @highlight-c2, mix( @highlight-c3, average( @highlight-c4, @highlight-c5 ), 20% ), 20% ), 20% ), 15% );
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less
new file mode 100644 (file)
index 0000000..8921f7a
--- /dev/null
@@ -0,0 +1,33 @@
+.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
new file mode 100644 (file)
index 0000000..615ac31
--- /dev/null
@@ -0,0 +1,19 @@
+@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;
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less
new file mode 100644 (file)
index 0000000..4619b6b
--- /dev/null
@@ -0,0 +1,31 @@
+@import "mw.rcfilters.mixins";
+
+.mw-rcfilters-ui-filterItemHighlightButton {
+
+       &-circle {
+               display: inline-block;
+               vertical-align: middle;
+               background-image: none;
+               margin-right: 0.2em;
+
+               &-color {
+                       &-c1 {
+                               // These values duplicate the sizing of the icon
+                               // width/height 1.875em
+                               .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0 );
+                       }
+                       &-c2 {
+                               .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0 );
+                       }
+                       &-c3 {
+                               .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0 );
+                       }
+                       &-c4 {
+                               .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0 );
+                       }
+                       &-c5 {
+                               .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 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
new file mode 100644 (file)
index 0000000..94da3ac
--- /dev/null
@@ -0,0 +1,42 @@
+@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.FilterWrapperWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
new file mode 100644 (file)
index 0000000..bdc94b3
--- /dev/null
@@ -0,0 +1,24 @@
+.mw-rcfilters-ui-filterWrapperWidget {
+       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
new file mode 100644 (file)
index 0000000..7fd3a21
--- /dev/null
@@ -0,0 +1,21 @@
+.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.HighlightColorPickerWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less
new file mode 100644 (file)
index 0000000..14c07c1
--- /dev/null
@@ -0,0 +1,73 @@
+@import "mw.rcfilters.mixins";
+
+.mw-rcfilters-ui-highlightColorPickerWidget {
+       &-label {
+               display: block;
+               font-weight: bold;
+               font-size: 1.2em;
+       }
+
+       &-buttonSelect {
+               &-color {
+                       .oo-ui-iconElement-icon {
+                               width: 2em;
+                               height: 2em;
+                       }
+
+                       &-none {
+                               .mw-rcfilters-mixin-circle( @highlight-none, 2em, 0.5em, true );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-none;
+                               }
+                       }
+                       &-c1 {
+                               .mw-rcfilters-mixin-circle( @highlight-c1 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c1;
+                               }
+                       }
+                       &-c2 {
+                               .mw-rcfilters-mixin-circle( @highlight-c2 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c2;
+                               }
+                       }
+                       &-c3 {
+                               .mw-rcfilters-mixin-circle( @highlight-c3 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c3;
+                               }
+                       }
+                       &-c4 {
+                               .mw-rcfilters-mixin-circle( @highlight-c4 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c4;
+                               }
+                       }
+                       &-c5 {
+                               .mw-rcfilters-mixin-circle( @highlight-c5 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c5;
+                               }
+                       }
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less
new file mode 100644 (file)
index 0000000..06840da
--- /dev/null
@@ -0,0 +1,8 @@
+.mw-rcfilters-ui-overlay {
+       font-size: 0.875em;
+       position: absolute;
+       top: 0;
+       right: 0;
+       left: 0;
+       z-index: 1;
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less
new file mode 100644 (file)
index 0000000..957e9e9
--- /dev/null
@@ -0,0 +1,16 @@
+.mw-rcfilters-ui {
+       &-table {
+               display: table;
+               width: 100%;
+       }
+
+       &-row {
+               display: table-row;
+       }
+
+       &-cell {
+               display: table-cell;
+               vertical-align: top;
+       }
+}
+
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less
new file mode 100644 (file)
index 0000000..1ef49e2
--- /dev/null
@@ -0,0 +1,19 @@
+// Highlight color definitions
+@highlight-none: #fff;
+@highlight-c1: #36c;
+@highlight-c2: #00af89;
+@highlight-c3: #fc3;
+@highlight-c4: #ff6d22;
+@highlight-c5: #d33;
+
+// Muted state
+@muted-opacity: 0.5;
+
+// Result list circle indicators
+// Defined and used in mw.rcfilters.ui.ChangesListWrapperWidget.less
+@result-circle-margin: 0.1em;
+@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;
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js
new file mode 100644 (file)
index 0000000..cf03932
--- /dev/null
@@ -0,0 +1,161 @@
+( 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 ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js
new file mode 100644 (file)
index 0000000..84248e1
--- /dev/null
@@ -0,0 +1,180 @@
+( function ( mw ) {
+       /**
+        * List of changes
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersViewModel View model
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changesListViewModel View model
+        * @param {jQuery} $changesListRoot Root element of the changes list to attach to
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget = function MwRcfiltersUiChangesListWrapperWidget(
+               filtersViewModel,
+               changesListViewModel,
+               $changesListRoot,
+               config
+       ) {
+               config = $.extend( {}, config, {
+                       $element: $changesListRoot
+               } );
+
+               // Parent
+               mw.rcfilters.ui.ChangesListWrapperWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
+
+               this.filtersViewModel = filtersViewModel;
+               this.changesListViewModel = changesListViewModel;
+
+               // Events
+               this.filtersViewModel.connect( this, {
+                       itemUpdate: 'onItemUpdate',
+                       highlightChange: 'onHighlightChange'
+               } );
+               this.changesListViewModel.connect( this, {
+                       invalidate: 'onModelInvalidate',
+                       update: 'onModelUpdate'
+               } );
+
+               this.$element.addClass( 'mw-rcfilters-ui-changesListWrapperWidget' );
+
+               // Set up highlight containers
+               this.setupHighlightContainers( this.$element );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.ChangesListWrapperWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.ChangesListWrapperWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Respond to the highlight feature being toggled on and off
+        *
+        * @param {boolean} highlightEnabled
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onHighlightChange = function ( highlightEnabled ) {
+               if ( highlightEnabled ) {
+                       this.applyHighlight();
+               } else {
+                       this.clearHighlight();
+               }
+       };
+
+       /**
+        * Respond to a filter item model update
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onItemUpdate = function () {
+               if ( this.filtersViewModel.isHighlightEnabled() ) {
+                       this.clearHighlight();
+                       this.applyHighlight();
+               }
+       };
+
+       /**
+        * Respond to changes list model invalidate
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelInvalidate = function () {
+               this.pushPending();
+       };
+
+       /**
+        * Respond to changes list model update
+        *
+        * @param {jQuery|string} $changesListContent The content of the updated changes list
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelUpdate = function ( $changesListContent ) {
+               var 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() )
+                       );
+               } else {
+                       this.$changesListContent = $changesListContent;
+                       this.$element.empty().append( this.$changesListContent );
+                       // Set up highlight containers
+                       this.setupHighlightContainers( this.$element );
+
+                       // Apply highlight
+                       this.applyHighlight();
+
+                       // Make sure enhanced RC re-initializes correctly
+                       mw.hook( 'wikipage.content' ).fire( this.$element );
+               }
+               this.popPending();
+       };
+
+       /**
+        * Set up the highlight containers with all color circle indicators.
+        *
+        * @param {jQuery|string} $content The content of the updated changes list
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.setupHighlightContainers = function ( $content ) {
+               var $highlights = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlights' )
+                               .append(
+                                       $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlights-color-none' )
+                                               .prop( 'data-color', 'none' )
+                               );
+
+               mw.rcfilters.HighlightColors.forEach( function ( color ) {
+                       $highlights.append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlights-color-' + color )
+                                       .prop( 'data-color', color )
+                       );
+               } );
+
+               if ( Number( mw.user.options.get( 'usenewrc' ) ) ) {
+                       // Enhanced RC
+                       $content.find( 'td.mw-enhanced-rc' )
+                               .parent()
+                               .prepend(
+                                       $( '<td>' )
+                                               .append( $highlights.clone() )
+                               );
+               } else {
+                       // Regular RC
+                       $content.find( 'ul.special li' )
+                               .prepend( $highlights.clone() );
+               }
+       };
+
+       /**
+        * Apply color classes based on filters highlight configuration
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.applyHighlight = function () {
+               if ( !this.filtersViewModel.isHighlightEnabled() ) {
+                       return;
+               }
+
+               this.filtersViewModel.getHighlightedItems().forEach( function ( filterItem ) {
+                       // Add highlight class to all highlighted list items
+                       this.$element.find( '.' + filterItem.getCssClass() )
+                               .addClass( 'mw-rcfilters-highlight-color-' + filterItem.getHighlightColor() );
+               }.bind( this ) );
+
+               // Turn on highlights
+               this.$element.addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlighted' );
+       };
+
+       /**
+        * Remove all color classes
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.clearHighlight = function () {
+               // Remove highlight classes
+               mw.rcfilters.HighlightColors.forEach( function ( color ) {
+                       this.$element.find( '.mw-rcfilters-highlight-color-' + color ).removeClass( 'mw-rcfilters-highlight-color-' + color );
+               }.bind( this ) );
+
+               // Turn off highlights
+               this.$element.removeClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlighted' );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js
new file mode 100644 (file)
index 0000000..86b3b11
--- /dev/null
@@ -0,0 +1,41 @@
+( function ( mw ) {
+       /**
+        * A widget representing a single toggle filter
+        *
+        * @extends OO.ui.CheckboxInputWidget
+        *
+        * @constructor
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.CheckboxInputWidget = function MwRcfiltersUiCheckboxInputWidget( config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.CheckboxInputWidget.parent.call( this, config );
+
+               // Event
+               this.$input.on( 'change', this.onUserChange.bind( this ) );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.CheckboxInputWidget, OO.ui.CheckboxInputWidget );
+
+       /* Events */
+
+       /**
+        * @event userChange
+        * @param {boolean} Current state of the checkbox
+        *
+        * The user has checked or unchecked this checkbox
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to checkbox change by a user and emit 'userChange'.
+        */
+       mw.rcfilters.ui.CheckboxInputWidget.prototype.onUserChange = function () {
+               this.emit( 'userChange', this.$input.prop( 'checked' ) );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js
new file mode 100644 (file)
index 0000000..50b7d15
--- /dev/null
@@ -0,0 +1,293 @@
+( 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
+        */
+       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.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'
+               } );
+               // 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();
+               }
+       };
+
+       /**
+        * 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
new file mode 100644 (file)
index 0000000..f858ab0
--- /dev/null
@@ -0,0 +1,88 @@
+( 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 ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js
new file mode 100644 (file)
index 0000000..32db0b6
--- /dev/null
@@ -0,0 +1,71 @@
+( function ( mw, $ ) {
+       /**
+        * A button to configure highlight for a filter item
+        *
+        * @extends OO.ui.PopupButtonWidget
+        *
+        * @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.FilterItemHighlightButton = function MwRcfiltersUiFilterItemHighlightButton( controller, model, config ) {
+               config = config || {};
+
+               this.colorPickerWidget = new mw.rcfilters.ui.HighlightColorPickerWidget( controller, model );
+
+               // Parent
+               mw.rcfilters.ui.FilterItemHighlightButton.parent.call( this, $.extend( {}, config, {
+                       icon: 'edit',
+                       indicator: 'down',
+                       popup: {
+                               anchor: false,
+                               padded: true,
+                               align: 'backwards',
+                               width: 290,
+                               $content: this.colorPickerWidget.$element
+                       }
+               } ) );
+
+               this.controller = controller;
+               this.model = model;
+
+               // Event
+               this.model.connect( this, { update: 'onModelUpdate' } );
+               this.colorPickerWidget.connect( this, { chooseColor: 'onChooseColor' } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterItemHighlightButton' );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterItemHighlightButton, OO.ui.PopupButtonWidget );
+
+       /* Methods */
+
+       /**
+        * Respond to item model update event
+        */
+       mw.rcfilters.ui.FilterItemHighlightButton.prototype.onModelUpdate = function () {
+               var currentColor = this.model.getHighlightColor(),
+                       widget = this;
+
+               this.$icon.toggleClass(
+                       'mw-rcfilters-ui-filterItemHighlightButton-circle',
+                       currentColor !== null
+               );
+
+               mw.rcfilters.HighlightColors.forEach( function ( c ) {
+                       widget.$icon
+                               .toggleClass(
+                                       'mw-rcfilters-ui-filterItemHighlightButton-circle-color-' + c,
+                                       c === currentColor
+                               );
+               } );
+       };
+
+       mw.rcfilters.ui.FilterItemHighlightButton.prototype.onChooseColor = function () {
+               this.popup.toggle( false );
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js
new file mode 100644 (file)
index 0000000..63db2b0
--- /dev/null
@@ -0,0 +1,143 @@
+( 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.FilterWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
new file mode 100644 (file)
index 0000000..d46bd4b
--- /dev/null
@@ -0,0 +1,95 @@
+( function ( mw ) {
+       /**
+        * List displaying all filter groups
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {Object} [config] Configuration object
+        * @cfg {Object} [filters] A definition of the filter groups in this list
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        */
+       mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FilterWrapperWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
+
+               this.controller = controller;
+               this.model = model;
+               this.$overlay = config.$overlay || this.$element;
+
+               this.filterPopup = new mw.rcfilters.ui.FiltersListWidget(
+                       this.controller,
+                       this.model,
+                       {
+                               label: mw.msg( 'rcfilters-filterlist-title' ),
+                               $overlay: this.$overlay
+                       }
+               );
+
+               this.textInput = new OO.ui.TextInputWidget( {
+                       classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
+                       icon: 'search',
+                       placeholder: mw.msg( 'rcfilters-search-placeholder' )
+               } );
+
+               this.capsule = new mw.rcfilters.ui.FilterCapsuleMultiselectWidget( controller, this.model, this.textInput, {
+                       $overlay: this.$overlay,
+                       popup: {
+                               $content: this.filterPopup.$element,
+                               classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
+                               width: 650
+                       }
+               } );
+
+               // 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 );
+       };
+
+       /* 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
new file mode 100644 (file)
index 0000000..ae9ee71
--- /dev/null
@@ -0,0 +1,157 @@
+( 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.FormWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
new file mode 100644 (file)
index 0000000..2513b07
--- /dev/null
@@ -0,0 +1,47 @@
+( function ( mw ) {
+       /**
+        * Wrapper for the RC form with hide/show links
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.dm.ChangesListViewModel} model Changes list view model
+        * @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 ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FormWrapperWidget.parent.call( this, $.extend( {}, config, {
+                       $element: $formRoot
+               } ) );
+
+               this.model = model;
+               this.$submitButton = this.$element.find( 'input[type=submit]' );
+
+               // Events
+               this.model.connect( this, {
+                       invalidate: 'onModelInvalidate',
+                       update: 'onModelUpdate'
+               } );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.Widget );
+
+       /**
+        * Respond to model invalidate
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onModelInvalidate = function () {
+               this.$submitButton.prop( 'disabled', true );
+       };
+
+       /**
+        * Respond to model update
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onModelUpdate = function () {
+               this.$submitButton.prop( 'disabled', false );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js
new file mode 100644 (file)
index 0000000..570647e
--- /dev/null
@@ -0,0 +1,112 @@
+( function ( mw, $ ) {
+       /**
+        * A widget representing a filter item highlight color picker
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.LabelElement
+        *
+        * @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.HighlightColorPickerWidget = function MwRcfiltersUiHighlightColorPickerWidget( controller, model, config ) {
+               var colors = [ 'none' ].concat( mw.rcfilters.HighlightColors );
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.HighlightColorPickerWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
+                       label: mw.message( 'rcfilters-highlightmenu-title' ).text()
+               } ) );
+
+               this.controller = controller;
+               this.model = model;
+
+               this.currentSelection = '';
+               this.buttonSelect = new OO.ui.ButtonSelectWidget( {
+                       items: colors.map( function ( color ) {
+                               return new OO.ui.ButtonOptionWidget( {
+                                       icon: color === 'none' ? 'check' : null,
+                                       data: color,
+                                       classes: [
+                                               'mw-rcfilters-ui-highlightColorPickerWidget-buttonSelect-color',
+                                               'mw-rcfilters-ui-highlightColorPickerWidget-buttonSelect-color-' + color
+                                       ],
+                                       framed: false
+                               } );
+                       } ),
+                       classes: 'mw-rcfilters-ui-highlightColorPickerWidget-buttonSelect'
+               } );
+               this.selectColor( 'none' );
+
+               // Event
+               this.model.connect( this, { update: 'onModelUpdate' } );
+               this.buttonSelect.connect( this, { choose: 'onChooseColor' } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-highlightColorPickerWidget' )
+                       .append(
+                               this.$label
+                                       .addClass( 'mw-rcfilters-ui-highlightColorPickerWidget-label' ),
+                               this.buttonSelect.$element
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.HighlightColorPickerWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.HighlightColorPickerWidget, OO.ui.mixin.LabelElement );
+
+       /* Events */
+
+       /**
+        * @event chooseColor
+        * @param {string} The chosen color
+        *
+        * A color has been chosen
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to item model update event
+        */
+       mw.rcfilters.ui.HighlightColorPickerWidget.prototype.onModelUpdate = function () {
+               this.selectColor( this.model.getHighlightColor() || 'none' );
+       };
+
+       /**
+        * Select the color for this widget
+        *
+        * @param {string} color Selected color
+        */
+       mw.rcfilters.ui.HighlightColorPickerWidget.prototype.selectColor = function ( color ) {
+               var previousItem = this.buttonSelect.getItemFromData( this.currentSelection ),
+                       selectedItem = this.buttonSelect.getItemFromData( color );
+
+               if ( this.currentSelection !== color ) {
+                       this.currentSelection = color;
+
+                       this.buttonSelect.selectItem( selectedItem );
+                       if ( previousItem ) {
+                               previousItem.setIcon( null );
+                       }
+
+                       if ( selectedItem ) {
+                               selectedItem.setIcon( 'check' );
+                       }
+               }
+       };
+
+       mw.rcfilters.ui.HighlightColorPickerWidget.prototype.onChooseColor = function ( button ) {
+               var color = button.data;
+               if ( color === 'none' ) {
+                       this.controller.clearHighlightColor( this.model.getName() );
+               } else {
+                       this.controller.setHighlightColor( this.model.getName(), color );
+               }
+               this.emit( 'chooseColor', color );
+       };
+}( mediaWiki, jQuery ) );
index d4c93fd..5ded184 100644 (file)
@@ -10,8 +10,8 @@
 .toc,
 .mw-warning,
 .toccolours {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
+       border: 1px solid #a2a9b1;
+       background-color: #f8f9fa;
        padding: 5px;
        font-size: 95%;
 }
@@ -35,7 +35,7 @@
 
        /* IE7 and earlier */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable declaration-block-no-duplicate-properties */
 
        padding: 7px;
 }
@@ -55,7 +55,7 @@ table.toc td {
 #toc h2,
 .toc h2 {
        display: inline;
-       border: none;
+       border: 0;
        padding: 0;
        font-size: 100%;
        font-weight: bold;
@@ -121,18 +121,20 @@ table.toc td {
 }
 
 /* Images */
-/* @noflip */div.floatright, table.floatright {
-       margin: 0 0 .5em .5em;
-       border: 0;
+/* @noflip */
+div.floatright,
+table.floatright {
+       margin: 0 0 0.5em 0.5em;
 }
 
 div.floatright p {
        font-style: italic;
 }
 
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0 .5em .5em 0;
-       border: 0;
+/* @noflip */
+div.floatleft,
+table.floatleft {
+       margin: 0 0.5em 0.5em 0;
 }
 
 div.floatleft p {
@@ -141,15 +143,15 @@ div.floatleft p {
 
 /* Thumbnails */
 div.thumb {
-       margin-bottom: .5em;
+       margin-bottom: 0.5em;
        width: auto;
        background-color: transparent;
 }
 
 div.thumbinner {
-       border: 1px solid #ccc;
+       border: 1px solid #c8ccd1;
        padding: 3px;
-       background-color: #f9f9f9;
+       background-color: #f8f9fa;
        font-size: 94%;
        text-align: center;
        /* new block formatting context,
@@ -158,11 +160,12 @@ div.thumbinner {
 }
 
 html .thumbimage {
-       border: 1px solid #ccc;
+       background-color: #fff;
+       border: 1px solid #c8ccd1;
 }
 
 html .thumbcaption {
-       border: none;
+       border: 0;
        line-height: 1.4em;
        padding: 3px;
        font-size: 94%;
@@ -199,7 +202,7 @@ div.magnify a {
 }
 
 img.thumbborder {
-       border: 1px solid #ddd;
+       border: 1px solid #eaecf0;
 }
 
 /* Directionality-specific styles for thumbnails - their positioning depends on content language */
@@ -246,12 +249,12 @@ img.thumbborder {
 
 /* @noflip */
 div.tright {
-       margin: .5em 0 1.3em 1.4em;
+       margin: 0.5em 0 1.3em 1.4em;
 }
 
 /* @noflip */
 div.tleft {
-       margin: .5em 1.4em 1.3em 0;
+       margin: 0.5em 1.4em 1.3em 0;
 }
 
 /* Hide elements that are marked as "empty" according to legacy Tidy rules,
index b7cc6ed..823ce05 100644 (file)
@@ -2,7 +2,7 @@
  * Icons and colors for external links.
  */
 
-/* Bug 66091 is blocking is from converting this file to LESS
+/* T68091 is blocking is from converting this file to LESS
  * and using the .background-image-svg mixin. */
 
 /* SVG support using a transparent gradient to guarantee cross-browser
        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 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"],
 .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 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"],
 .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 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?"],
 .link-document {
        background: url( images/document-ltr.png ) center right no-repeat;
        /* @embed */
index 346771f..b4fe934 100644 (file)
@@ -38,7 +38,8 @@ span.reference {
        unicode-bidi: isolate;
 }
 
-sup, sub {
+sup,
+sub {
        line-height: 1;
 }
 
@@ -54,7 +55,7 @@ figure[typeof*='mw:Image'] {
 
        &.mw-halign-right {
                /* @noflip */
-               margin: .5em 0 1.3em 1.4em;
+               margin: 0.5em 0 1.3em 1.4em;
                /* @noflip */
                clear: right;
                /* @noflip */
@@ -63,7 +64,7 @@ figure[typeof*='mw:Image'] {
 
        &.mw-halign-left {
                /* @noflip */
-               margin: .5em 1.4em 1.3em 0;
+               margin: 0.5em 1.4em 1.3em 0;
                /* @noflip */
                clear: left;
                /* @noflip */
@@ -77,7 +78,7 @@ figure[typeof*='mw:Image'] {
        }
 
        &.mw-halign-center {
-               margin: 0 auto .5em auto;
+               margin: 0 auto 0.5em auto;
                display: table;
                clear: none;
                float: none;
@@ -118,7 +119,7 @@ figure[typeof~='mw:Image/Frame'] {
        background-color: #f9f9f9;
        // Default to right alignment. This is needed since Parsoid only specifies the
        // alignment class when the alignment is explicitly set.
-       margin: .5em 0 1.3em 1.4em;
+       margin: 0.5em 0 1.3em 1.4em;
        clear: right;
        float: right;
 }
@@ -128,8 +129,11 @@ figure[typeof~='mw:Image/Frame'] > *:first-child > img,
 .mw-image-border > *:first-child > img {
        border: 1px solid #ccc;
        margin: 3px;
+       background: #fff;
 }
 
 /* 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"] > figcaption {
+       display: none;
+}
index 9c52b2a..46de7b5 100644 (file)
@@ -25,15 +25,16 @@ a:active {
        color: #faa700;
 }
 
-a:hover, a:focus {
+a:hover,
+a:focus {
        text-decoration: underline;
 }
 
-a:lang(ar),
-a:lang(kk-arab),
-a:lang(mzn),
-a:lang(ps),
-a:lang(ur) {
+a:lang( ar ),
+a:lang( kk-arab ),
+a:lang( mzn ),
+a:lang( ps ),
+a:lang( ur ) {
        text-decoration: none;
 }
 
@@ -41,11 +42,13 @@ a.stub {
        color: #723;
 }
 
-a.new, #p-personal a.new {
+a.new,
+#p-personal a.new {
        color: #ba0000;
 }
 
-a.new:visited, #p-personal a.new:visited {
+a.new:visited,
+#p-personal a.new:visited {
        color: #a55858;
 }
 
@@ -69,7 +72,7 @@ a.new:visited, #p-personal a.new:visited {
 }
 
 .mw-body a.external:visited {
-       color: #636; /* bug 3112 */
+       color: #636; /* T5112 */
 }
 
 .mw-body a.external:active {
@@ -82,16 +85,16 @@ a.new:visited, #p-personal a.new:visited {
 
 /* Inline Elements */
 img {
-       border: none;
+       border: 0;
        vertical-align: middle;
 }
 
 hr {
        height: 1px;
-       color: #aaa;
-       background-color: #aaa;
+       color: #a2a9b1;
+       background-color: #a2a9b1;
        border: 0;
-       margin: .2em 0;
+       margin: 0.2em 0;
 }
 
 /* Structural Elements */
@@ -106,9 +109,9 @@ h6 {
        font-weight: normal;
        margin: 0;
        overflow: hidden;
-       padding-top: .5em;
-       padding-bottom: .17em;
-       border-bottom: 1px solid #aaa;
+       padding-top: 0.5em;
+       padding-bottom: 0.17em;
+       border-bottom: 1px solid #a2a9b1;
 }
 
 h1 {
@@ -123,7 +126,7 @@ h3,
 h4,
 h5,
 h6 {
-       border-bottom: none;
+       border-bottom: 0;
        font-weight: bold;
 }
 
@@ -146,17 +149,17 @@ h6 {
 /* Some space under the headers in the content area */
 h1,
 h2 {
-       margin-bottom: .6em;
+       margin-bottom: 0.6em;
 }
 
 h3,
 h4,
 h5 {
-       margin-bottom: .3em;
+       margin-bottom: 0.3em;
 }
 
 p {
-       margin: .4em 0 .5em 0;
+       margin: 0.4em 0 0.5em 0;
 }
 
 p img {
@@ -165,36 +168,41 @@ p img {
 
 ul {
        list-style-type: square;
-       margin: .3em 0 0 1.6em;
+       margin: 0.3em 0 0 1.6em;
        padding: 0;
 }
 
 ol {
-       margin: .3em 0 0 3.2em;
+       margin: 0.3em 0 0 3.2em;
        padding: 0;
        list-style-image: none;
 }
 
 li {
-       margin-bottom: .1em;
+       margin-bottom: 0.1em;
 }
 
 dt {
        font-weight: bold;
-       margin-bottom: .1em;
+       margin-bottom: 0.1em;
 }
 
 dl {
-       margin-top: .2em;
-       margin-bottom: .5em;
+       margin-top: 0.2em;
+       margin-bottom: 0.5em;
 }
 
 dd {
        margin-left: 1.6em;
-       margin-bottom: .1em;
+       margin-bottom: 0.1em;
 }
 
-pre, code, tt, kbd, samp, .mw-code {
+pre,
+code,
+tt,
+kbd,
+samp,
+.mw-code {
        /*
         * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
         * Specifying any valid, second value will trigger correct behavior without forcing a different font.
@@ -204,8 +212,8 @@ pre, code, tt, kbd, samp, .mw-code {
 
 code {
        color: #000;
-       background-color: #f9f9f9;
-       border: 1px solid #ddd;
+       background-color: #f8f9fa;
+       border: 1px solid #eaecf0;
        border-radius: 2px;
        padding: 1px 4px;
 }
@@ -213,8 +221,8 @@ code {
 pre,
 .mw-code {
        color: #000;
-       background-color: #f9f9f9;
-       border: 1px solid #ddd;
+       background-color: #f8f9fa;
+       border: 1px solid #eaecf0;
        padding: 1em;
        /* Wrap lines in overflow. T2260, T103780 */
        white-space: pre-wrap;
@@ -227,7 +235,7 @@ table {
 
 /* Forms */
 fieldset {
-       border: 1px solid #2f6fab;
+       border: 1px solid #2a4b8d;
        margin: 1em 0 1em 0;
        padding: 0 1em 1em;
 }
@@ -238,18 +246,18 @@ fieldset.nested {
 }
 
 legend {
-       padding: .5em;
+       padding: 0.5em;
        font-size: 95%;
 }
 
 form {
-       border: none;
+       border: 0;
        margin: 0;
 }
 
 textarea {
        width: 100%;
-       padding: .1em;
+       padding: 0.1em;
        display: block;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
index 4ca2096..2be3bb2 100644 (file)
@@ -8,8 +8,8 @@
 
 /* Categories */
 .catlinks {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
+       border: 1px solid #a2a9b1;
+       background-color: #f8f9fa;
        padding: 5px;
        margin-top: 1em;
        clear: both;
 
 textarea {
        /* Support Firefox: Border rule required to override system appearance on Linux */
-       border: 1px solid #c0c0c0;
+       border: 1px solid #a2a9b1;
 }
 
 .editOptions {
-       background-color: #f0f0f0;
-       border: 1px solid #c0c0c0;
-       border-top: none;
+       background-color: #f8f9fa;
+       border: 1px solid #c8ccd1;
+       border-top: 0;
        padding: 1em 1em 1.5em 1em;
        margin-bottom: 2em;
 }
@@ -34,7 +34,7 @@ textarea {
        color: #000;
        font-weight: bold;
        margin: 2em 0 1em;
-       padding: .5em 1em;
+       padding: 0.5em 1em;
        vertical-align: middle;
 }
 
@@ -49,9 +49,9 @@ textarea {
 }
 
 .firstHeading {
-       margin-bottom: .1em;
-       /* These two rules hack around bug 2013 (fix for more limited bug 11325).
-        * When bug 2013 is fixed properly, they should be removed. */
+       margin-bottom: 0.1em;
+       /* These two rules hack around T4013 (fix for more limited T13325).
+        * When T4013 is fixed properly, they should be removed. */
        line-height: 1.2em;
        padding-bottom: 0;
 }
diff --git a/resources/src/mediawiki.special/images/special.search/book-icon.png b/resources/src/mediawiki.special/images/special.search/book-icon.png
new file mode 100644 (file)
index 0000000..07e3ec7
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/book-icon.png 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
new file mode 100644 (file)
index 0000000..6c3fa5f
--- /dev/null
@@ -0,0 +1,36 @@
+<?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
new file mode 100644 (file)
index 0000000..9aad230
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/course-icon.png 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
new file mode 100644 (file)
index 0000000..4fab1f3
--- /dev/null
@@ -0,0 +1,35 @@
+<?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
new file mode 100644 (file)
index 0000000..b279f4e
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/definition-icon.png 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
new file mode 100644 (file)
index 0000000..1d58906
--- /dev/null
@@ -0,0 +1,22 @@
+<?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
new file mode 100644 (file)
index 0000000..76ae7b9
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/dna-icon.png 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
new file mode 100644 (file)
index 0000000..b6472d2
--- /dev/null
@@ -0,0 +1,34 @@
+<?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
new file mode 100644 (file)
index 0000000..1ebbc74
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/image-icon.png 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
new file mode 100644 (file)
index 0000000..b68762e
--- /dev/null
@@ -0,0 +1,16 @@
+<?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
new file mode 100644 (file)
index 0000000..6b79590
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/news-icon.png 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
new file mode 100644 (file)
index 0000000..996bc84
--- /dev/null
@@ -0,0 +1,31 @@
+<?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
new file mode 100644 (file)
index 0000000..9d3ade3
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/quotation-icon.png 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
new file mode 100644 (file)
index 0000000..0a24b3e
--- /dev/null
@@ -0,0 +1,12 @@
+<?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
new file mode 100644 (file)
index 0000000..0de2821
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/textbook-icon.png 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
new file mode 100644 (file)
index 0000000..52446b8
--- /dev/null
@@ -0,0 +1,28 @@
+<?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
new file mode 100644 (file)
index 0000000..9540e5b
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/travel-icon.png 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
new file mode 100644 (file)
index 0000000..c61da34
--- /dev/null
@@ -0,0 +1,15 @@
+<?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 99f6c13..7f54b90 100644 (file)
@@ -43,7 +43,7 @@
 }
 
 .mw-apisandbox-help-field:last-child {
-       border-bottom: none;
+       border-bottom: 0;
 }
 
 .mw-apisandbox-optionalWidget {
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator.mw-apisandbox-clickable-indicator {
        cursor: pointer;
 }
+
+.mw-apisandbox-textInputCode .oo-ui-inputWidget-input {
+       font-family: monospace, monospace;
+       font-size: 0.8125em;
+       -moz-tab-size: 4;
+       -o-tab-size: 4;
+       tab-size: 4;
+}
index 217bd92..c989c83 100644 (file)
@@ -3,6 +3,7 @@
        'use strict';
        var ApiSandbox, Util, WidgetMethods, Validators,
                $content, panel, booklet, oldhash, windowManager, fullscreenButton,
+               formatDropdown,
                api = new mw.Api(),
                bookletPages = [],
                availableFormats = {},
@@ -51,9 +52,7 @@
                tokenWidget: {
                        alertTokenError: function ( code, error ) {
                                windowManager.openWindow( 'errorAlert', {
-                                       title: mw.message(
-                                               'apisandbox-results-fixtoken-fail', this.paramInfo.tokentype
-                                       ).parse(),
+                                       title: Util.parseMsg( 'apisandbox-results-fixtoken-fail', this.paramInfo.tokentype ),
                                        message: error,
                                        actions: [
                                                {
                                }
                        },
                        apiCheckValid: function () {
-                               var ok = this.getApiValue() !== undefined || suppressErrors;
+                               var ok = true,
+                                       pi = this.paramInfo;
+
+                               if ( !suppressErrors ) {
+                                       ok = this.getApiValue() !== undefined && !(
+                                               pi.allspecifier !== undefined &&
+                                               this.getItemsData().length > 1 &&
+                                               this.getItemsData().indexOf( pi.allspecifier ) !== -1
+                                       );
+                               }
+
                                this.setIcon( ok ? null : 'alert' );
                                this.setIconTitle( ok ? '' : mw.message( 'apisandbox-alert-field' ).plain() );
                                return $.Deferred().resolve( ok ).promise();
        };
 
        /**
-        * @class mw.special.ApiSandbox.Utils
+        * @class mw.special.ApiSandbox.Util
         * @private
         */
        Util = {
                                                } );
                                        } else if ( Util.apiBool( pi.multi ) ) {
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
-                                                       allowArbitrary: true
+                                                       allowArbitrary: true,
+                                                       allowDuplicates: Util.apiBool( pi.allowsduplicates )
                                                } );
                                                widget.paramInfo = pi;
                                                $.extend( widget, WidgetMethods.capsuleWidget );
                                                } else {
                                                        n = +value;
                                                        return !isNaN( n ) && isFinite( n ) &&
-                                                               // eslint-disable-next-line no-bitwise
-                                                               ( n | 0 ) === n &&
+                                                               Math.floor( n ) === n &&
                                                                n >= pi.min && n <= pi.apiSandboxMax;
                                                }
                                        } );
                                                return a.data - b.data;
                                        } );
                                        if ( Util.apiBool( pi.multi ) ) {
+                                               if ( pi.allspecifier !== undefined ) {
+                                                       items.unshift( new OO.ui.MenuOptionWidget( {
+                                                               data: pi.allspecifier,
+                                                               label: mw.message( 'apisandbox-multivalue-all-namespaces', pi.allspecifier ).text()
+                                                       } ) );
+                                               }
+
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        menu: { items: items }
                                                } );
                                                return new OO.ui.MenuOptionWidget( { data: String( v ), label: String( v ) } );
                                        } );
                                        if ( Util.apiBool( pi.multi ) ) {
+                                               if ( pi.allspecifier !== undefined ) {
+                                                       items.unshift( new OO.ui.MenuOptionWidget( {
+                                                               data: pi.allspecifier,
+                                                               label: mw.message( 'apisandbox-multivalue-all-values', pi.allspecifier ).text()
+                                                       } ) );
+                                               }
+
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        menu: { items: items }
                                                } );
 
                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                        allowArbitrary: true,
+                                       allowDuplicates: Util.apiBool( pi.allowsduplicates ),
                                        popup: {
                                                classes: [ 'mw-apisandbox-popup' ],
                                                $content: $content
                },
 
                /**
-                * Parse an HTML string, adding target="_blank" to any links
+                * Parse an HTML string and call Util.fixupHTML()
                 *
                 * @param {string} html HTML to parse
                 * @return {jQuery}
                 */
                parseHTML: function ( html ) {
                        var $ret = $( $.parseHTML( html ) );
-                       $ret.filter( 'a' ).add( $ret.find( 'a' ) )
+                       return Util.fixupHTML( $ret );
+               },
+
+               /**
+                * Parse an i18n message and call Util.fixupHTML()
+                *
+                * @param {string} key Key of message to get
+                * @param {...Mixed} parameters Values for $N replacements
+                * @return {jQuery}
+                */
+               parseMsg: function () {
+                       var $ret = mw.message.apply( mw.message, arguments ).parseDom();
+                       return Util.fixupHTML( $ret );
+               },
+
+               /**
+                * Fix HTML for ApiSandbox display
+                *
+                * Fixes are:
+                * - Add target="_blank" to any links
+                *
+                * @param {jQuery} $html DOM to process
+                * @return {jQuery}
+                */
+               fixupHTML: function ( $html ) {
+                       $html.filter( 'a' ).add( $html.find( 'a' ) )
                                .filter( '[href]:not([target])' )
                                .attr( 'target', '_blank' );
-                       return $ret;
+                       return $html;
+               },
+
+               /**
+                * Format a request and return a bunch of menu option widgets
+                *
+                * @param {Object} displayParams Query parameters, sanitized for display.
+                * @param {Object} rawParams Query parameters. You should probably use displayParams instead.
+                * @return {OO.ui.MenuOptionWidget[]} Each item's data should be an OO.ui.FieldLayout
+                */
+               formatRequest: function ( displayParams, rawParams ) {
+                       var jsonInput,
+                               items = [
+                                       new OO.ui.MenuOptionWidget( {
+                                               label: Util.parseMsg( 'apisandbox-request-format-url-label' ),
+                                               data: new OO.ui.FieldLayout(
+                                                       new OO.ui.TextInputWidget( {
+                                                               readOnly: true,
+                                                               value: mw.util.wikiScript( 'api' ) + '?' + $.param( displayParams )
+                                                       } ), {
+                                                               label: Util.parseMsg( 'apisandbox-request-url-label' )
+                                                       }
+                                               )
+                                       } ),
+                                       new OO.ui.MenuOptionWidget( {
+                                               label: Util.parseMsg( 'apisandbox-request-format-json-label' ),
+                                               data: new OO.ui.FieldLayout(
+                                                       jsonInput = new OO.ui.TextInputWidget( {
+                                                               classes: [ 'mw-apisandbox-textInputCode' ],
+                                                               readOnly: true,
+                                                               multiline: true,
+                                                               autosize: true,
+                                                               maxRows: 6,
+                                                               value: JSON.stringify( displayParams, null, '\t' )
+                                                       } ), {
+                                                               label: Util.parseMsg( 'apisandbox-request-json-label' )
+                                                       }
+                                               ).on( 'toggle', function ( visible ) {
+                                                       if ( visible ) {
+                                                               // Call updatePosition instead of adjustSize
+                                                               // because the latter has weird caching
+                                                               // behavior and the former bypasses it.
+                                                               jsonInput.updatePosition();
+                                                       }
+                                               } )
+                                       } )
+                               ];
+
+                       mw.hook( 'apisandbox.formatRequest' ).fire( items, displayParams, rawParams );
+
+                       return items;
+               },
+
+               /**
+                * Event handler for when formatDropdown's selection changes
+                */
+               onFormatDropdownChange: function () {
+                       var i,
+                               menu = formatDropdown.getMenu(),
+                               items = menu.getItems(),
+                               selectedField = menu.getSelectedItem() ? menu.getSelectedItem().getData() : null;
+
+                       for ( i = 0; i < items.length; i++ ) {
+                               items[ i ].getData().toggle( items[ i ].getData() === selectedField );
+                       }
                }
        };
 
 
                        $content
                                .empty()
-                               .append( $( '<p>' ).append( mw.message( 'apisandbox-intro' ).parse() ) )
+                               .append( $( '<p>' ).append( Util.parseMsg( 'apisandbox-intro' ) ) )
                                .append(
                                        $( '<div>', { id: 'mw-apisandbox-ui' } )
                                                .append( $toolbar )
                        }
 
                        $.when.apply( $, deferreds ).done( function () {
+                               var formatItems, menu, selectedLabel;
+
                                if ( $.inArray( false, arguments ) !== -1 ) {
                                        windowManager.openWindow( 'errorAlert', {
-                                               title: mw.message( 'apisandbox-submit-invalid-fields-title' ).parse(),
-                                               message: mw.message( 'apisandbox-submit-invalid-fields-message' ).parse(),
+                                               title: Util.parseMsg( 'apisandbox-submit-invalid-fields-title' ),
+                                               message: Util.parseMsg( 'apisandbox-submit-invalid-fields-message' ),
                                                actions: [
                                                        {
                                                                action: 'accept',
 
                                query = $.param( displayParams );
 
+                               formatItems = Util.formatRequest( displayParams, params );
+
                                // Force a 'fm' format with wrappedhtml=1, if available
                                if ( params.format !== undefined ) {
                                        if ( availableFormats.hasOwnProperty( params.format + 'fm' ) ) {
                                page.setupOutlineItem = function () {
                                        this.outlineItem.setLabel( mw.message( 'apisandbox-results' ).text() );
                                };
+
+                               if ( !formatDropdown ) {
+                                       formatDropdown = new OO.ui.DropdownWidget( {
+                                               menu: { items: [] }
+                                       } );
+                                       formatDropdown.getMenu().on( 'choose', Util.onFormatDropdownChange );
+                               }
+
+                               menu = formatDropdown.getMenu();
+                               selectedLabel = menu.getSelectedItem() ? menu.getSelectedItem().getLabel() : '';
+                               if ( typeof selectedLabel !== 'string' ) {
+                                       selectedLabel = selectedLabel.text();
+                               }
+                               menu.clearItems().addItems( formatItems );
+                               menu.chooseItem( menu.getItemFromLabel( selectedLabel ) || menu.getFirstSelectableItem() );
+
+                               // Fire the event to update field visibilities
+                               Util.onFormatDropdownChange();
+
                                page.$element.empty()
                                        .append(
                                                new OO.ui.FieldLayout(
-                                                       new OO.ui.TextInputWidget( {
-                                                               readOnly: true,
-                                                               value: mw.util.wikiScript( 'api' ) + '?' + query
-                                                       } ), {
-                                                               label: mw.message( 'apisandbox-request-url-label' ).parse()
+                                                       formatDropdown, {
+                                                               label: Util.parseMsg( 'apisandbox-request-selectformat-label' )
                                                        }
                                                ).$element,
+                                               $.map( formatItems, function ( item ) {
+                                                       return item.getData().$element;
+                                               } ),
                                                $result
                                        );
                                ApiSandbox.updateUI();
 
                                                $result.empty();
                                                if ( /^text\/mediawiki-api-prettyprint-wrapped(?:;|$)/.test( ct ) ) {
-                                                       data = $.parseJSON( data );
+                                                       data = JSON.parse( data );
                                                        if ( data.modules.length ) {
                                                                mw.loader.load( data.modules );
                                                        }
                                                        if ( data.status && data.status !== 200 ) {
                                                                $( '<div>' )
                                                                        .addClass( 'api-pretty-header api-pretty-status' )
-                                                                       .append(
-                                                                               mw.message( 'api-format-prettyprint-status', data.status, data.statustext ).parse()
-                                                                       )
+                                                                       .append( Util.parseMsg( 'api-format-prettyprint-status', data.status, data.statustext ) )
                                                                        .appendTo( $result );
                                                        }
                                                        $result.append( Util.parseHTML( data.html ) );
                                                                                booklet.setPage( '|results|' );
                                                                        } ).setDisabled( !paramsAreForced ) ).$element,
                                                                        new OO.ui.PopupButtonWidget( {
+                                                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                                                framed: false,
                                                                                icon: 'info',
                                                                                popup: {
-                                                                                       $content: $( '<div>' ).append( mw.message( 'apisandbox-continue-help' ).parse() ),
+                                                                                       $content: $( '<div>' ).append( Util.parseMsg( 'apisandbox-continue-help' ) ),
                                                                                        padded: true
                                                                                }
                                                                        } ).$element
 
                                if ( that.widgets[ name ] !== undefined ) {
                                        windowManager.openWindow( 'errorAlert', {
-                                               title: mw.message(
-                                                       'apisandbox-dynamic-error-exists', name
-                                               ).parse(),
+                                               title: Util.parseMsg( 'apisandbox-dynamic-error-exists', name ),
                                                actions: [
                                                        {
                                                                action: 'accept',
                                                                        dl.append( $( '<dd>', {
                                                                                addClass: 'info',
                                                                                append: [
-                                                                                       Util.parseHTML( mw.message(
+                                                                                       Util.parseMsg(
                                                                                                'api-help-param-limit2', pi.parameters[ i ].max, pi.parameters[ i ].highmax
-                                                                                       ).parse() ),
+                                                                                       ),
                                                                                        ' ',
-                                                                                       Util.parseHTML( mw.message( 'apisandbox-param-limit' ).parse() )
+                                                                                       Util.parseMsg( 'apisandbox-param-limit' )
                                                                                ]
                                                                        } ) );
                                                                } else {
                                                                        dl.append( $( '<dd>', {
                                                                                addClass: 'info',
                                                                                append: [
-                                                                                       Util.parseHTML( mw.message(
-                                                                                               'api-help-param-limit', pi.parameters[ i ].max
-                                                                                       ).parse() ),
+                                                                                       Util.parseMsg( 'api-help-param-limit', pi.parameters[ i ].max ),
                                                                                        ' ',
-                                                                                       Util.parseHTML( mw.message( 'apisandbox-param-limit' ).parse() )
+                                                                                       Util.parseMsg( 'apisandbox-param-limit' )
                                                                                ]
                                                                        } ) );
                                                                }
                                                                if ( tmp !== '' ) {
                                                                        dl.append( $( '<dd>', {
                                                                                addClass: 'info',
-                                                                               append: Util.parseHTML( mw.message(
+                                                                               append: Util.parseMsg(
                                                                                        'api-help-param-integer-' + tmp,
                                                                                        Util.apiBool( pi.parameters[ i ].multi ) ? 2 : 1,
                                                                                        pi.parameters[ i ].min, pi.parameters[ i ].max
-                                                                               ).parse() )
+                                                                               )
                                                                        } ) );
                                                                }
                                                                break;
                                        items.push( new OO.ui.FieldLayout(
                                                new OO.ui.Widget( {} ).toggle( false ), {
                                                        align: 'top',
-                                                       label: Util.parseHTML( mw.message( 'apisandbox-no-parameters' ).parse() )
+                                                       label: Util.parseMsg( 'apisandbox-no-parameters' )
                                                }
                                        ) );
                                }
index 4b8eced..3ad8005 100644 (file)
@@ -16,7 +16,8 @@
 }
 
 /* Common for Special:Allpages and Special:PrefixIndex */
-.mw-allpages-body, .mw-prefixindex-body {
+.mw-allpages-body,
+.mw-prefixindex-body {
        columns: 22em 3;
        -moz-columns: 22em 3;
        -webkit-columns: 22em 3;
index bdd45bc..29c0fea 100644 (file)
@@ -21,7 +21,6 @@
                        $checkboxes.prop( 'disabled', isAllNS );
                },
 
-               /** */
                init: function () {
                        $select = $( '#namespace' );
                        $checkboxes = $( '#nsassociated, #nsinvert' );
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js b/resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js
new file mode 100644 (file)
index 0000000..3810ac1
--- /dev/null
@@ -0,0 +1,80 @@
+( function ( mw, $ ) {
+
+       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' );
+
+       function itemTemplate( results ) {
+
+               var resultOutput = '', i, result, imageCaption, imageThumbnailSrc;
+
+               for ( i = 0; i < results.length; 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">' +
+                                               /* escaping response content */
+                                               mw.html.element( 'a', {
+                                                       href: '/wiki/' + result.title,
+                                                       'class': 'iw-result__mini-gallery__image',
+                                                       style: 'background-image: url(' + imageThumbnailSrc + ');'
+                                               }, new mw.html.Raw( imageCaption ) ) +
+                                       '</div>';
+               }
+
+               return resultOutput;
+       }
+
+       function itemWrapperTemplate( pageQuery, itemTemplateOutput ) {
+
+               return '<li class="iw-resultset iw-resultset--image" data-iw-resultsset-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">' +
+                               /* template output has been sanitized by mw.html.element */
+                               itemTemplateOutput +
+                               '</div>' +
+                               '<div class="iw-result__footer">' +
+                                       '<a href="/w/index.php?title=Special:Search&search=' + encodeURIComponent( pageQuery ) + '&fulltext=1&profile=images">' +
+                                               moreResultsText.escaped() +
+                                       '</a>' +
+                               '</div>' +
+                       '</li>';
+
+       }
+
+       api.get( {
+               action: 'query',
+               generator: 'search',
+               gsrsearch: pageUrl.query.search,
+               gsrnamespace: mw.config.get( 'wgNamespaceIds' ).file,
+               gsrlimit: 3,
+               prop: 'pageimages',
+               pilimit: 3,
+               piprop: 'thumbnail',
+               pithumbsize: 300,
+               formatversion: 2
+       } )
+       .done( function ( resp ) {
+               var results = ( resp.query && resp.query.pages ) ? resp.query.pages : false,
+                       multimediaWidgetTemplate;
+
+               if ( !results ) {
+                       return;
+               }
+
+               results.sort( function( a, b ) {
+                       return b.index - a.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 );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less b/resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less
new file mode 100644 (file)
index 0000000..8d63902
--- /dev/null
@@ -0,0 +1,224 @@
+/* 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();
+
+.generate-iwIcons( @i:1 ) when ( @i =< length( @interwikiContentTypes ) ) {
+       @iwIcon: extract( @interwikiContentTypes, @i );
+
+       .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' );
+       }
+
+       .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-result__mini-gallery__image {
+       display: block;
+       position: relative;
+       width: 100%;
+       height: 100%;
+       background-size: cover;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+
+.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__mini-gallery__image:hover > .iw-result__mini-gallery__caption {
+       visibility: visible;
+}
+
+/* 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;
+}
+
+/* no results
+span the interwiki results across the bottom of the page.
+*/
+
+.mw-search-nonefound ~ #mw-search-interwiki {
+       width: 100%;
+}
+
+.mw-search-nonefound ~ #mw-search-interwiki .iw-resultset {
+       width: 30%;
+       max-width: 300px;
+       margin-left: 0.5em;
+       margin-right: 0.5em;
+}
+
+/* mobile */
+@media only screen and ( max-width: 768px ) {
+       #mw-interwiki-results {
+               width: 100%;
+       }
+       .mw-search-results {
+               max-width: none !important;
+       }
+       .iw-resultset {
+               width: 45% !important;
+               margin-left: 0.5em !important;
+               margin-right: 0.5em !important;
+       }
+
+}
+
+@media only screen and ( max-width: 600px ) {
+       .iw-resultset {
+               width: 100% !important;
+               margin-left: 0 !important;
+               margin-right: 0 !important;
+               max-width: none !important;
+       }
+}
index 5191f92..89f5132 100644 (file)
@@ -15,7 +15,7 @@
        display: inline !ie;
 }
 .searchresults {
-       margin: 1em 0 1em .4em;
+       margin: 1em 0 1em 0.4em;
 }
 /* needs extra specificity to override `.mw-body p` selector */
 .mw-body .mw-search-nonefound {
 .mw-search-nonefound + .mw-search-interwiki-header {
        margin-top: 0;
 }
-.searchresult {
-       font-size: 95%;
-       max-width: 38em;
-}
+
 .mw-search-results {
-       margin-left: 0;
+       margin: 0;
        float: left;
+       max-width: 60%;
 }
 .mw-search-visualclear {
        clear: both;
@@ -53,9 +51,9 @@
        font-size: 97%;
 }
 .mw-search-profile-tabs {
-       background-color: #f3f3f3;
+       background-color: #f8f9fa;
        margin-top: 1em;
-       border: 1px solid #c0c0c0;
+       border: 1px solid #c8ccd1;
 }
 .search-types {
        float: left;
@@ -76,7 +74,7 @@
        padding: 0.5em;
 }
 .search-types .current a {
-       color: #333;
+       color: #222;
        cursor: default;
 }
 .search-types .current a:hover {
        float: right;
        padding: 0.5em;
        padding-right: 0.75em;
-       color: #666;
+       color: #54595d;
        font-size: 95%;
 }
 #mw-search-top-table div.oo-ui-actionFieldLayout {
        float: left;
        width: 100%;
 }
+
+/* Advanced options menu */
+/*==========================*/
+
 #mw-searchoptions {
        margin: 0;
        padding: 0.5em 0.75em 0.75em 0.75em;
-       background-color: #f9f9f9;
-       border: 1px solid #c0c0c0;
+       background-color: #f8f9fa;
+       border: 1px solid #c8ccd1;
        border-top-width: 0;
 }
 #mw-searchoptions legend {
 }
 #mw-searchoptions .divider {
        clear: both;
-       border-bottom: 1px solid #ddd;
+       border-bottom: 1px solid #eaecf0;
        padding-top: 0.5em;
        margin-bottom: 0.5em;
 }
        padding-left: 6em;
        font-size: 85%;
 }
+
 #mw-search-interwiki {
        float: right;
        width: 18em;
-       border: 1px solid #aaa;
+       border: 1px solid #a2a9b1;
        margin-top: 2ex;
 }
+
 .searchalttitle,
 #mw-search-interwiki li {
        font-size: 95%;
        font-size: 97%;
        text-align: left;
        padding: 0.15em 0.15em 0.2em 0.2em;
-       background-color: #ececec;
-       border-top: 1px solid #bbb;
+       background-color: #eaecf0;
+       border-top: 1px solid #c8ccd1;
 }
+
 .searchdidyoumean {
        font-size: 127%;
        margin-top: 0.8em;
        /* Note that this color won't affect the link, as desired. */
-       color: #c00;
+       color: #d33;
 }
index f818096..0ddf7fe 100644 (file)
                                // Output result
                                if ( $( '#wpDestFile' ).length ) {
                                        // Call decodeURIComponent function to remove possible URL-encoded characters
-                                       // from the file name (bug 30390). Especially likely with upload-form-url.
+                                       // from the file name (T32390). Especially likely with upload-form-url.
                                        // decodeURIComponent can throw an exception if input is invalid utf-8
                                        try {
                                                $( '#wpDestFile' ).val( decodeURIComponent( fname ) );
index 283df85..626a7e8 100644 (file)
@@ -3,7 +3,7 @@
  */
 .mw-destfile-warning {
        border: 1px solid #fde29b;
-       padding: .5em 1em;
+       padding: 0.5em 1em;
        margin-bottom: 1em;
        color: #705000;
        background-color: #fdf1d1;
diff --git a/resources/src/mediawiki.special/mediawiki.special.userrights.css b/resources/src/mediawiki.special/mediawiki.special.userrights.css
new file mode 100644 (file)
index 0000000..a4b4087
--- /dev/null
@@ -0,0 +1,12 @@
+/*!
+ * Styling for Special:UserRights
+ */
+.mw-userrights-nested {
+       margin-left: 1.2em;
+}
+
+.mw-userrights-nested span {
+       margin-left: 0.3em;
+       display: inline-block;
+       vertical-align: middle;
+}
index 0643988..3f864dd 100644 (file)
@@ -1,8 +1,18 @@
 /*!
  * JavaScript for Special:UserRights
  */
-( function () {
+( function ( $ ) {
        var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
        // Replace successbox with notifications
        convertmessagebox();
-}() );
+
+       // Dynamically show/hide the expiry selection underneath each checkbox
+       $( '#mw-userrights-form2 input[type=checkbox]' ).on( 'change', function ( e ) {
+               $( '#mw-userrights-nested-' + e.target.id ).toggle( e.target.checked );
+       } ).trigger( 'change' );
+
+       // Also dynamically show/hide the "other time" input under each dropdown
+       $( '.mw-userrights-nested select' ).on( 'change', function ( e ) {
+               $( e.target.parentNode ).find( 'input' ).toggle( $( e.target ).val() === 'other' );
+       } ).trigger( 'change' );
+}( jQuery ) );
index 5b259e7..ebb6b48 100644 (file)
@@ -18,3 +18,9 @@ th.mw-version-ext-col-label {
 .mw-version-ext-vcs-version {
        unicode-bidi: embed;
 }
+
+.mw-version-credits {
+       column-width: 18em;
+       -moz-column-width: 18em;
+       -webkit-column-width: 18em;
+}
index a35f4d1..7cc9b9b 100644 (file)
@@ -1,15 +1,61 @@
 /*!
  * JavaScript for Special:Watchlist
- *
- * This script is only loaded, if the user opt-in a setting in Special:Preferences,
- * that the watchlist should be automatically reloaded, when a filter option is
- * changed in the header form.
  */
-jQuery( function ( $ ) {
-       // add a listener on all form elements in the header form
-       $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () {
-               // submit the form, when one of the input fields was changed
-               $( '#mw-watchlist-form' ).submit();
+( function ( mw, $, OO ) {
+       $( function () {
+               var $progressBar, $resetForm = $( '#mw-watchlist-resetbutton' );
+
+               // If the user wants to reset their watchlist, use an API call to do so (no reload required)
+               // Adapted from a user script by User:NQ of English Wikipedia
+               // (User:NQ/WatchlistResetConfirm.js)
+               $resetForm.submit( function ( event ) {
+                       var $button = $resetForm.find( 'input[name=mw-watchlist-reset-submit]' );
+
+                       event.preventDefault();
+
+                       // Disable reset button to prevent multiple concurrent requests
+                       $button.prop( 'disabled', true );
+
+                       if ( !$progressBar ) {
+                               $progressBar = new OO.ui.ProgressBarWidget( { progress: false } ).$element;
+                               $progressBar.css( {
+                                       position: 'absolute',
+                                       width: '100%'
+                               } );
+                       }
+                       // Show progress bar
+                       $resetForm.append( $progressBar );
+
+                       // Use action=setnotificationtimestamp to mark all as visited,
+                       // then set all watchlist lines accordingly
+                       new mw.Api().postWithToken( 'csrf', {
+                               formatversion: 2,
+                               action: 'setnotificationtimestamp',
+                               entirewatchlist: true
+                       } ).done( function () {
+                               // Enable button again
+                               $button.prop( 'disabled', false );
+                               // Hide the button because further clicks can not generate any visual changes
+                               $button.css( 'visibility', 'hidden' );
+                               $progressBar.detach();
+                               $( '.mw-changeslist-line-watched' )
+                                       .removeClass( 'mw-changeslist-line-watched' )
+                                       .addClass( 'mw-changeslist-line-not-watched' );
+                       } ).fail( function () {
+                               // On error, fall back to server-side reset
+                               // First remove this submit listener and then re-submit the form
+                               $resetForm.off( 'submit' ).submit();
+                       } );
+               } );
+
+               // if the user wishes to reload the watchlist whenever a filter changes
+               if ( mw.user.options.get( 'watchlistreloadautomatically' ) ) {
+                       // add a listener on all form elements in the header form
+                       $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () {
+                               // submit the form when one of the input fields is modified
+                               $( '#mw-watchlist-form' ).submit();
+                       } );
+               }
        } );
 
-} );
+}( mediaWiki, jQuery, OO ) );
index 4c4e129..6397c73 100644 (file)
@@ -29,7 +29,6 @@ The anchor base type can be applied to `a` elements when a basic context styling
 having to assign it as a button type. `.mw-ui-anchor` only changes the text color, and should not be used in combination
 with other base classes, such as `.mw-ui-button`.
 
-
 Markup:
 <a href="#" class="mw-ui-anchor mw-ui-progressive">Progressive</a>
 <a href="#" class="mw-ui-anchor mw-ui-destructive">Destructive</a>
@@ -48,22 +47,16 @@ Styleguide 6.2.
        &.mw-ui-destructive {
                .mixin-mw-ui-anchor-styles( @colorDestructive );
        }
-
-       //`.mw-ui-constructive` is deprecated; consolidated with `progressive`, see T110555
-       &.mw-ui-constructive {
-               .mixin-mw-ui-anchor-styles( @colorConstructive );
-       }
 }
 
 /*
 Quiet anchors
 
-Use quiet anchors when they are less important and alongside other progressive/destructive/progressive
+Use quiet anchors when they are less important and alongside other progressive/destructive
 anchors. Use of quiet anchors is not recommended on mobile/tablet due to lack of hover state.
 
 Markup:
 <a href="#" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet">Progressive</a>
-<a href="#" class="mw-ui-anchor mw-ui-constructive mw-ui-quiet">Constructive</a>
 <a href="#" class="mw-ui-anchor mw-ui-destructive mw-ui-quiet">Destructive</a>
 
 Styleguide 6.2.1.
index 85795f4..5dc025f 100644 (file)
 //
 // Styleguide 2.1.
 .mw-ui-button {
-       // Inherit the font rather than apply user agent stylesheet (bug 70072)
+       // Inherit the font rather than apply user agent stylesheet (T72072)
        font-family: inherit;
        font-size: 1em;
        // Container layout
        display: inline-block;
        min-width: 4em;
        max-width: 28.75em; // equivalent to 460px, @see T95367
-       padding: .5em 1em;
+       padding: 0.5em 1em;
        margin: 0;
        border-radius: @borderRadius;
        .box-sizing( border-box );
@@ -43,7 +43,7 @@
 
        // IE 6 & 7 hack
        // https://stackoverflow.com/a/5838575/365238
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
        zoom: 1;
 
        // Ensure that buttons and inputs are nicely aligned when they have differing heights
index b0fbf51..f983087 100644 (file)
@@ -43,7 +43,7 @@
        display: table;
 
        * {
-               // reset font sizes (see bug 72727)
+               // reset font sizes (see T74727)
                font: inherit;
                vertical-align: middle;
        }
@@ -58,7 +58,7 @@
                // ensure the invisible checkbox takes up the required width
                width: @checkboxSize;
                height: @checkboxSize;
-               // This is needed for Firefox mobile (See bug 71750 to workaround default Firefox stylesheet)
+               // This is needed for Firefox mobile (See T73750 to workaround default Firefox stylesheet)
                max-width: none;
                margin: 0 0.4em 0 0;
                display: table-cell;
index 0035601..efb04ae 100644 (file)
@@ -90,4 +90,4 @@
        &.mw-ui-icon-small:before {
                background-size: 66.67% auto; // 66.67% of 24px equals 16px
        }
-}
\ No newline at end of file
+}
index 8bddb3a..21f5254 100644 (file)
@@ -23,6 +23,7 @@
 // Styleguide 1.1.
 .mw-ui-input {
        background-color: #fff;
+       color: @colorGray1;
        .box-sizing( border-box );
        display: block;
        width: 100%;
        vertical-align: middle;
 
        // Normalize & style placeholder text, see T139034
-       // Placeholder styles can't be grouped, otherwise they're ignored as invalid.
-
-       // Placeholder mixin
-       .mixin-placeholder() {
+       /* stylelint-disable indentation */
+       .mixin-placeholder( {
                color: @colorGray7;
-               font-style: italic;
-       }
-       // Firefox 4-18
-       &:-moz-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
-               opacity: 1;
-       }
-       // Firefox 19-
-       &::-moz-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
                opacity: 1;
-       }
-       // Internet Explorer 10-11
-       &:-ms-input-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
-       }
-       // WebKit, Blink, Edge
-       // Don't set `opacity < 1`, see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3901363/
-       &::-webkit-input-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
-       }
-       // W3C Standard Selectors Level 4
-       &:placeholder-shown {
-               .mixin-placeholder;
-       }
+       } );
+       /* stylelint-enable indentation */
 
        // Firefox: Remove red outline when `required` attribute set and invalid content.
        // See https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid
                // Remove the inner padding and cancel buttons in Chrome on OS X and Safari on OS X
                &::-webkit-search-cancel-button,
                &::-webkit-search-decoration {
-                       -webkit-appearance: none;
+                       -webkit-appearance: none;
                }
        }
 }
index 53c22b4..7538ff4 100644 (file)
@@ -43,7 +43,7 @@
        line-height: @radioSize;
 
        * {
-               // reset font sizes (see bug 72727)
+               // reset font sizes (see T74727)
                font: inherit;
                vertical-align: middle;
        }
@@ -55,7 +55,7 @@
                // ensure the invisible radio takes up the required width
                width: @radioSize;
                height: @radioSize;
-               // This is needed for Firefox mobile (See bug 71750 to workaround default Firefox stylesheet)
+               // This is needed for Firefox mobile (See T73750 to workaround default Firefox stylesheet)
                max-width: none;
                margin-right: 0.4em;
 
index 5551745..c0684d9 100644 (file)
@@ -16,7 +16,6 @@ Text
 Context classes may be used on elements with only plain-text content with the mw-ui-text base. When the context classes
 are used on interactive and block-level elements, the appropriate alternative base type classes should also be used. For
 example, mw-ui-anchor with A, or mw-ui-button with buttons.
-'Constructive' is deprecated and merged with 'Progressive'.
 
 Markup:
 <span class="mw-ui-text mw-ui-progressive">Progressive</span>
@@ -28,11 +27,10 @@ Styleguide 6.1.
 .mw-ui-text {
        // The selector order is like this on purpose; IE 6 ignores the second selector,
        // so we don't want to accidentally apply this color on all mw-ui-CONTEXT classes
-       .mw-ui-progressive&,
-       .mw-ui-constructive& {
+       &.mw-ui-progressive {
                color: @colorProgressive;
        }
-       .mw-ui-destructive& {
+       &.mw-ui-destructive {
                color: @colorDestructive;
        }
-}
\ No newline at end of file
+}
index 77f87f7..b5b9cbe 100644 (file)
@@ -1,10 +1,11 @@
+/* stylelint-disable no-duplicate-selectors */
 @import "mediawiki.widgets.datetime.definitions";
 
 .mw-widgets-datetime-calendarWidget {
        display: inline-block;
        position: relative;
        vertical-align: middle;
-       padding: .5em;
+       padding: 0.5em;
 
        &.mw-widgets-datetime-calendarWidget-dependent {
                display: block;
@@ -51,7 +52,7 @@
 
                        .oo-ui-buttonElement-button {
                                width: 100%;
-                               border: 1px dotted rgba( 255, 255, 255, 0.0 );
+                               border: 1px dotted rgba( 255, 255, 255, 0 );
                                .oo-ui-box-sizing( border-box );
                        }
 
index 1793849..ad49a42 100644 (file)
         *  - 'boolean': The field is a boolean.
         *  - 'toggleLocal': The field represents {@link #getLocal this.getLocal()}.
         *    Editing should directly call {@link #toggleLocal this.toggleLocal()}.
+        * @return {boolean} return.calendarComponent Whether this field is part of a calendar, e.g.
+        *  part of the date instead of the time.
         * @return {number} return.size Maximum number of characters in the field (when
         *  the 'intercalary' component is falsey). If 0, the field should be hidden entirely.
         * @return {Object.<string,number>} return.intercalarySize Map from
                                }
                                spec = {
                                        component: null,
+                                       calendarComponent: false,
                                        editable: false,
                                        type: 'static',
                                        value: params.slice( 1 ).join( '|' ),
                                                c = params[ 0 ] === '#' ? '' : ':';
                                                return {
                                                        component: 'zone',
+                                                       calendarComponent: false,
                                                        editable: true,
                                                        type: 'toggleLocal',
                                                        size: 5 + c.length,
                                        case 'full':
                                                spec = {
                                                        component: 'zone',
+                                                       calendarComponent: false,
                                                        editable: true,
                                                        type: 'toggleLocal',
                                                        values: params[ 0 ] === 'short' ? this.shortZones : this.fullZones,
index e9bedf5..3e4c5e2 100644 (file)
                                $field = $( '<span>' )
                                        .width( sz )
                                        .data( 'mw-widgets-datetime-dateTimeInputWidget-placeholder', placeholder );
+                               if ( spec.type !== 'static' ) {
+                                       $field.prop( 'tabIndex', -1 );
+                                       $field.on( 'focus', this.onFieldFocus.bind( this, $field ) );
+                               }
                                if ( spec.type === 'static' ) {
                                        $field.text( spec.value );
                                } else {
         * @param {jQuery.Event} e Focus event
         */
        mw.widgets.datetime.DateTimeInputWidget.prototype.onFieldFocus = function ( $field ) {
+               var spec = $field.data( 'mw-widgets-datetime-dateTimeInputWidget-fieldSpec' );
+
                if ( !this.isDisabled() ) {
                        if ( this.getValueAsDate() === null ) {
                                this.setValue( this.formatter.getDefaultDate() );
                        }
 
                        if ( this.calendar ) {
-                               this.calendar.toggle( true );
+                               this.calendar.toggle( !!spec.calendarComponent );
                        }
                }
        };
index 84788d2..1c6c490 100644 (file)
@@ -1,3 +1,4 @@
+/* stylelint-disable no-duplicate-selectors */
 @import "mediawiki.widgets.datetime.definitions";
 
 .mw-widgets-datetime-dateTimeInputWidget {
@@ -52,7 +53,6 @@
                margin: 0;
                background-color: #fff;
                color: #000;
-               border: solid 1px #ccc;
                box-shadow: inset 0 0 0 0 @progressive;
                border-radius: 0.1em;
                .oo-ui-transition(box-shadow @quick-ease);
@@ -92,7 +92,7 @@
                font-family: inherit;
                background-color: transparent;
                color: inherit;
-               border: none;
+               border: 0;
                box-shadow: none;
                text-align: center;
                vertical-align: middle;
index b280ead..6db2d06 100644 (file)
@@ -67,6 +67,7 @@
                        case 'year|#':
                                spec = {
                                        component: 'Year',
+                                       calendarComponent: true,
                                        type: 'number',
                                        size: 4,
                                        zeropad: false
@@ -76,6 +77,7 @@
                        case 'season|#':
                                spec = {
                                        component: 'Season',
+                                       calendarComponent: true,
                                        type: 'number',
                                        size: 1,
                                        intercalarySize: { 1: 0 },
@@ -86,6 +88,7 @@
                        case 'season|full':
                                spec = {
                                        component: 'Season',
+                                       calendarComponent: true,
                                        type: 'string',
                                        intercalarySize: { 1: 0 },
                                        values: {
                        case 'dow|full':
                                spec = {
                                        component: 'DOW',
+                                       calendarComponent: true,
                                        editable: false,
                                        type: 'string',
                                        intercalarySize: { 1: 0 },
                        case 'day|0':
                                spec = {
                                        component: 'Day',
+                                       calendarComponent: true,
                                        type: 'string',
                                        size: 2,
                                        intercalarySize: { 1: 13 },
                        case 'second|0':
                                spec = {
                                        component: tag.charAt( 0 ).toUpperCase() + tag.slice( 1 ),
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 2,
                                        zeropad: params[ 0 ] === '0'
                        case 'millisecond|0':
                                spec = {
                                        component: 'Millisecond',
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 3,
                                        zeropad: params[ 0 ] === '0'
index 9e9b15f..877edba 100644 (file)
@@ -2,7 +2,7 @@
 
        /**
         * Provides various methods needed for formatting dates and times. This
-        * implementation implments the proleptic Gregorian calendar over years
+        * implementation implements the proleptic Gregorian calendar over years
         * 0000–9999.
         *
         * @class
                        case 'year|0':
                                spec = {
                                        component: 'year',
+                                       calendarComponent: true,
                                        type: 'number',
                                        size: 4,
                                        zeropad: params[ 0 ] === '0'
                        case 'month|full':
                                spec = {
                                        component: 'month',
+                                       calendarComponent: true,
                                        type: 'string',
                                        values: params[ 0 ] === 'short' ? this.shortMonthNames : this.fullMonthNames
                                };
                        case 'dow|full':
                                spec = {
                                        component: 'dow',
+                                       calendarComponent: true,
                                        editable: false,
                                        type: 'string',
                                        values: params[ 0 ] === 'short' ? this.shortDayNames : this.fullDayNames
                        case 'month|0':
                        case 'day|#':
                        case 'day|0':
+                               spec = {
+                                       component: tag,
+                                       calendarComponent: true,
+                                       type: 'number',
+                                       size: 2,
+                                       zeropad: params[ 0 ] === '0'
+                               };
+                               break;
+
                        case 'hour|#':
                        case 'hour|0':
                        case 'minute|#':
                        case 'second|0':
                                spec = {
                                        component: tag,
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 2,
                                        zeropad: params[ 0 ] === '0'
                        case 'hour|012':
                                spec = {
                                        component: 'hour12',
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 2,
                                        zeropad: params[ 0 ] === '012'
                        case 'hour|period':
                                spec = {
                                        component: 'hour12period',
+                                       calendarComponent: false,
                                        type: 'boolean',
                                        values: this.hour12Periods
                                };
                        case 'millisecond|0':
                                spec = {
                                        component: 'millisecond',
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 3,
                                        zeropad: params[ 0 ] === '0'
diff --git a/resources/src/mediawiki.widgets/MediaSearch/broken-image.png b/resources/src/mediawiki.widgets/MediaSearch/broken-image.png
new file mode 100644 (file)
index 0000000..f5be958
Binary files /dev/null and b/resources/src/mediawiki.widgets/MediaSearch/broken-image.png differ
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js
new file mode 100644 (file)
index 0000000..dd07b92
--- /dev/null
@@ -0,0 +1,229 @@
+/*!
+ * MediaWiki Widgets - APIResultsProvider class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
+ */
+( function ( $, mw ) {
+
+       /**
+        * API Results Provider object.
+        *
+        * @class
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {string} apiurl The URL to the api
+        * @param {Object} [config] Configuration options
+        * @cfg {number} fetchLimit The default number of results to fetch
+        * @cfg {string} lang The language of the API
+        * @cfg {number} offset Initial offset, if relevant, to call results from
+        * @cfg {Object} ajaxSettings The settings for the ajax call
+        * @cfg {Object} staticParams The data parameters that are static and should
+        *  always be sent to the API request, as opposed to user parameters.
+        * @cfg {Object} userParams Initial user parameters to be sent as data to
+        *  the API request. These can change per request, like the search query term
+        *  or sizing parameters for images, etc.
+        */
+       mw.widgets.APIResultsProvider = function MwWidgetsAPIResultsProvider( apiurl, config ) {
+               config = config || {};
+
+               this.setAPIurl( apiurl );
+               this.setDefaultFetchLimit( config.fetchLimit || 30 );
+               this.setLang( config.lang );
+               this.setOffset( config.offset || 0 );
+               this.setAjaxSettings( config.ajaxSettings || {} );
+
+               this.staticParams = config.staticParams || {};
+               this.userParams = config.userParams || {};
+
+               this.toggleDepleted( false );
+
+               // Mixin constructors
+               OO.EventEmitter.call( this );
+       };
+
+       /* Setup */
+       OO.mixinClass( mw.widgets.APIResultsProvider, OO.EventEmitter );
+
+       /* Methods */
+
+       /**
+        * Get results from the source
+        *
+        * @param {number} howMany Number of results to ask for
+        * @return {jQuery.Promise} Promise that is resolved into an array
+        * of available results, or is rejected if no results are available.
+        */
+       mw.widgets.APIResultsProvider.prototype.getResults = function () {
+               var xhr,
+                       deferred = $.Deferred(),
+                       allParams = $.extend( {}, this.getStaticParams(), this.getUserParams() );
+
+               xhr = $.getJSON( this.getAPIurl(), allParams )
+                       .done( function ( data ) {
+                               if (
+                                       $.type( data ) !== 'array' ||
+                                       (
+                                               $.type( data ) === 'array' &&
+                                               data.length === 0
+                                       )
+                               ) {
+                                       deferred.resolve();
+                               } else {
+                                       deferred.resolve( data );
+                               }
+                       } );
+               return deferred.promise( { abort: xhr.abort } );
+       };
+
+       /**
+        * Set API url
+        *
+        * @param {string} apiurl API url
+        */
+       mw.widgets.APIResultsProvider.prototype.setAPIurl = function ( apiurl ) {
+               this.apiurl = apiurl;
+       };
+
+       /**
+        * Set api url
+        *
+        * @return {string} API url
+        */
+       mw.widgets.APIResultsProvider.prototype.getAPIurl = function () {
+               return this.apiurl;
+       };
+
+       /**
+        * Get the static, non-changing data parameters sent to the API
+        *
+        * @return {Object} Data parameters
+        */
+       mw.widgets.APIResultsProvider.prototype.getStaticParams = function () {
+               return this.staticParams;
+       };
+
+       /**
+        * Get the user-inputted dynamic data parameters sent to the API
+        *
+        * @return {Object} Data parameters
+        */
+       mw.widgets.APIResultsProvider.prototype.getUserParams = function () {
+               return this.userParams;
+       };
+
+       /**
+        * Set the data parameters sent to the API
+        *
+        * @param {Object} params User defined data parameters
+        */
+       mw.widgets.APIResultsProvider.prototype.setUserParams = function ( params ) {
+               // Asymmetrically compare (params is subset of this.userParams)
+               if ( !OO.compare( params, this.userParams, true ) ) {
+                       this.userParams = $.extend( {}, this.userParams, params );
+                       this.reset();
+               }
+       };
+
+       /**
+        * Reset the provider
+        */
+       mw.widgets.APIResultsProvider.prototype.reset = function () {
+               // Reset offset
+               this.setOffset( 0 );
+               // Reset depleted status
+               this.toggleDepleted( false );
+       };
+
+       /**
+        * Get fetch limit or 'page' size. This is the number
+        * of results per request.
+        *
+        * @return {number} limit
+        */
+       mw.widgets.APIResultsProvider.prototype.getDefaultFetchLimit = function () {
+               return this.limit;
+       };
+
+       /**
+        * Set limit
+        *
+        * @param {number} limit Default number of results to fetch from the API
+        */
+       mw.widgets.APIResultsProvider.prototype.setDefaultFetchLimit = function ( limit ) {
+               this.limit = limit;
+       };
+
+       /**
+        * Get provider API language
+        *
+        * @return {string} Provider API language
+        */
+       mw.widgets.APIResultsProvider.prototype.getLang = function () {
+               return this.lang;
+       };
+
+       /**
+        * Set provider API language
+        *
+        * @param {string} lang Provider API language
+        */
+       mw.widgets.APIResultsProvider.prototype.setLang = function ( lang ) {
+               this.lang = lang;
+       };
+
+       /**
+        * Get result offset
+        *
+        * @return {number} Offset Results offset for the upcoming request
+        */
+       mw.widgets.APIResultsProvider.prototype.getOffset = function () {
+               return this.offset;
+       };
+
+       /**
+        * Set result offset
+        *
+        * @param {number} offset Results offset for the upcoming request
+        */
+       mw.widgets.APIResultsProvider.prototype.setOffset = function ( offset ) {
+               this.offset = offset;
+       };
+
+       /**
+        * Check whether the provider is depleted and has no more results
+        * to hand off.
+        *
+        * @return {boolean} The provider is depleted
+        */
+       mw.widgets.APIResultsProvider.prototype.isDepleted = function () {
+               return this.depleted;
+       };
+
+       /**
+        * Toggle depleted state
+        *
+        * @param {boolean} isDepleted The provider is depleted
+        */
+       mw.widgets.APIResultsProvider.prototype.toggleDepleted = function ( isDepleted ) {
+               this.depleted = isDepleted !== undefined ? isDepleted : !this.depleted;
+       };
+
+       /**
+        * Get the default ajax settings
+        *
+        * @return {Object} Ajax settings
+        */
+       mw.widgets.APIResultsProvider.prototype.getAjaxSettings = function () {
+               return this.ajaxSettings;
+       };
+
+       /**
+        * Get the default ajax settings
+        *
+        * @param {Object} settings Ajax settings
+        */
+       mw.widgets.APIResultsProvider.prototype.setAjaxSettings = function ( settings ) {
+               this.ajaxSettings = settings;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js
new file mode 100644 (file)
index 0000000..3bc1d51
--- /dev/null
@@ -0,0 +1,224 @@
+/*!
+ * MediaWiki Widgets - APIResultsQueue class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
+ */
+( function ( $, mw ) {
+
+       /**
+        * API Results Queue object.
+        *
+        * @class
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} limit The default number of results to fetch
+        * @cfg {number} threshold The default number of extra results
+        *  that the queue should always strive to have on top of the
+        *  individual requests for items.
+        */
+       mw.widgets.APIResultsQueue = function MwWidgetsAPIResultsQueue( config ) {
+               config = config || {};
+
+               this.fileRepoPromise = null;
+               this.providers = [];
+               this.providerPromises = [];
+               this.queue = [];
+
+               this.params = {};
+
+               this.limit = config.limit || 20;
+               this.setThreshold( config.threshold || 10 );
+
+               // Mixin constructors
+               OO.EventEmitter.call( this );
+       };
+
+       /* Setup */
+       OO.mixinClass( mw.widgets.APIResultsQueue, OO.EventEmitter );
+
+       /* Methods */
+
+       /**
+        * Set up the queue and its resources.
+        * This should be overridden if there are any setup steps to perform.
+        *
+        * @return {jQuery.Promise} Promise that resolves when the resources
+        *  are set up. Note: The promise must have an .abort() functionality.
+        */
+       mw.widgets.APIResultsQueue.prototype.setup = function () {
+               return $.Deferred().resolve().promise( { abort: $.noop } );
+       };
+
+       /**
+        * Get items from the queue
+        *
+        * @param {number} [howMany] How many items to retrieve. Defaults to the
+        *  default limit supplied on initialization.
+        * @return {jQuery.Promise} Promise that resolves into an array of items.
+        */
+       mw.widgets.APIResultsQueue.prototype.get = function ( howMany ) {
+               var fetchingPromise = null,
+                       me = this;
+
+               howMany = howMany || this.limit;
+
+               // Check if the queue has enough items
+               if ( this.queue.length < howMany + this.threshold ) {
+                       // Call for more results
+                       fetchingPromise = this.queryProviders( howMany + this.threshold )
+                               .then( function ( items ) {
+                                       // Add to the queue
+                                       me.queue = me.queue.concat.apply( me.queue, items );
+                               } );
+               }
+
+               return $.when( fetchingPromise )
+                       .then( function () {
+                               return me.queue.splice( 0, howMany );
+                       } );
+
+       };
+
+       /**
+        * Get results from all providers
+        *
+        * @param {number} [howMany] How many items to retrieve. Defaults to the
+        *  default limit supplied on initialization.
+        * @return {jQuery.Promise} Promise that is resolved into an array
+        *  of fetched items. Note: The promise must have an .abort() functionality.
+        */
+       mw.widgets.APIResultsQueue.prototype.queryProviders = function ( howMany ) {
+               var i, len,
+                       queue = this;
+
+               // Make sure there are resources set up
+               return this.setup()
+                       .then( function () {
+                               // Abort previous requests
+                               for ( i = 0, len = queue.providerPromises.length; i < len; i++ ) {
+                                       queue.providerPromises[ i ].abort();
+                               }
+                               queue.providerPromises = [];
+                               // Set up the query to all providers
+                               for ( i = 0, len = queue.providers.length; i < len; i++ ) {
+                                       if ( !queue.providers[ i ].isDepleted() ) {
+                                               queue.providerPromises.push(
+                                                       queue.providers[ i ].getResults( howMany )
+                                               );
+                                       }
+                               }
+
+                               return $.when.apply( $, queue.providerPromises )
+                                       .then( Array.prototype.concat.bind( [] ) );
+                       } );
+       };
+
+       /**
+        * Set the search query for all the providers.
+        *
+        * This also makes sure to abort any previous promises.
+        *
+        * @param {Object} params API search parameters
+        */
+       mw.widgets.APIResultsQueue.prototype.setParams = function ( params ) {
+               var i, len;
+               if ( !OO.compare( params, this.params, true ) ) {
+                       this.reset();
+                       this.params = $.extend( this.params, params );
+                       // Reset queue
+                       this.queue = [];
+                       // Reset promises
+                       for ( i = 0, len = this.providerPromises.length; i < len; i++ ) {
+                               this.providerPromises[ i ].abort();
+                       }
+                       // Change queries
+                       for ( i = 0, len = this.providers.length; i < len; i++ ) {
+                               this.providers[ i ].setUserParams( this.params );
+                       }
+               }
+       };
+
+       /**
+        * Reset the queue and all its providers
+        */
+       mw.widgets.APIResultsQueue.prototype.reset = function () {
+               var i, len;
+               // Reset queue
+               this.queue = [];
+               // Reset promises
+               for ( i = 0, len = this.providerPromises.length; i < len; i++ ) {
+                       this.providerPromises[ i ].abort();
+               }
+               // Change queries
+               for ( i = 0, len = this.providers.length; i < len; i++ ) {
+                       this.providers[ i ].reset();
+               }
+       };
+
+       /**
+        * Get the data parameters sent to the API
+        *
+        * @return {Object} params API search parameters
+        */
+       mw.widgets.APIResultsQueue.prototype.getParams = function () {
+               return this.params;
+       };
+
+       /**
+        * Set the providers
+        *
+        * @param {mw.widgets.APIResultsProvider[]} providers An array of providers
+        */
+       mw.widgets.APIResultsQueue.prototype.setProviders = function ( providers ) {
+               this.providers = providers;
+       };
+
+       /**
+        * Add a provider to the group
+        *
+        * @param {mw.widgets.APIResultsProvider} provider A provider object
+        */
+       mw.widgets.APIResultsQueue.prototype.addProvider = function ( provider ) {
+               this.providers.push( provider );
+       };
+
+       /**
+        * Set the providers
+        *
+        * @return {mw.widgets.APIResultsProvider[]} providers An array of providers
+        */
+       mw.widgets.APIResultsQueue.prototype.getProviders = function () {
+               return this.providers;
+       };
+
+       /**
+        * Get the queue size
+        *
+        * @return {number} Queue size
+        */
+       mw.widgets.APIResultsQueue.prototype.getQueueSize = function () {
+               return this.queue.length;
+       };
+
+       /**
+        * Set queue threshold
+        *
+        * @param {number} threshold Queue threshold, below which we will
+        *  request more items
+        */
+       mw.widgets.APIResultsQueue.prototype.setThreshold = function ( threshold ) {
+               this.threshold = threshold;
+       };
+
+       /**
+        * Get queue threshold
+        *
+        * @return {number} threshold Queue threshold, below which we will
+        *  request more items
+        */
+       mw.widgets.APIResultsQueue.prototype.getThreshold = function () {
+               return this.threshold;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js
new file mode 100644 (file)
index 0000000..d767109
--- /dev/null
@@ -0,0 +1,322 @@
+/*!
+ * MediaWiki Widgets - MediaResourceProvider class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media resource provider.
+        *
+        * @class
+        * @extends mw.widgets.APIResultsProvider
+        *
+        * @constructor
+        * @param {string} apiurl The API url
+        * @param {Object} [config] Configuration options
+        * @cfg {string} [scriptDirUrl] The url of the API script
+        */
+       mw.widgets.MediaResourceProvider = function MwWidgetsMediaResourceProvider( apiurl, config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaResourceProvider.super.call( this, apiurl, config );
+
+               // Fetching configuration
+               this.scriptDirUrl = config.scriptDirUrl;
+               this.isLocal = config.local !== undefined;
+
+               if ( this.isLocal ) {
+                       this.setAPIurl( mw.util.wikiScript( 'api' ) );
+               } else {
+                       // If 'apiurl' is set, use that. Otherwise, build the url
+                       // from scriptDirUrl and /api.php suffix
+                       this.setAPIurl( this.getAPIurl() || ( this.scriptDirUrl + '/api.php' ) );
+               }
+
+               this.siteInfoPromise = null;
+               this.thumbSizes = [];
+               this.imageSizes = [];
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaResourceProvider, mw.widgets.APIResultsProvider );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaResourceProvider.prototype.getStaticParams = function () {
+               return $.extend(
+                       {},
+                       // Parent method
+                       mw.widgets.MediaResourceProvider.super.prototype.getStaticParams.call( this ),
+                       {
+                               action: 'query',
+                               iiprop: 'dimensions|url|mediatype|extmetadata|timestamp|user',
+                               iiextmetadatalanguage: this.getLang(),
+                               prop: 'imageinfo'
+                       }
+               );
+       };
+
+       /**
+        * Initialize the source and get the site info.
+        *
+        * Connect to the api url and retrieve the siteinfo parameters
+        * that are required for fetching results.
+        *
+        * @return {jQuery.Promise} Promise that resolves when the class
+        * properties are set.
+        */
+       mw.widgets.MediaResourceProvider.prototype.loadSiteInfo = function () {
+               var provider = this;
+
+               if ( !this.siteInfoPromise ) {
+                       this.siteInfoPromise = new mw.Api().get( {
+                               action: 'query',
+                               meta: 'siteinfo'
+                       } )
+                               .then( function ( data ) {
+                                       provider.setImageSizes( data.query.general.imagelimits || [] );
+                                       provider.setThumbSizes( data.query.general.thumblimits || [] );
+                                       provider.setUserParams( {
+                                               // Standard width per resource
+                                               iiurlwidth: provider.getStandardWidth()
+                                       } );
+                               } );
+               }
+               return this.siteInfoPromise;
+       };
+
+       /**
+        * Override parent method and get results from the source
+        *
+        * @param {number} [howMany] The number of items to pull from the API
+        * @return {jQuery.Promise} Promise that is resolved into an array
+        * of available results, or is rejected if no results are available.
+        */
+       mw.widgets.MediaResourceProvider.prototype.getResults = function ( howMany ) {
+               var xhr,
+                       aborted = false,
+                       provider = this;
+
+               return this.loadSiteInfo()
+                       .then( function () {
+                               if ( aborted ) {
+                                       return $.Deferred().reject();
+                               }
+                               xhr = provider.fetchAPIresults( howMany );
+                               return xhr;
+                       } )
+                       .then(
+                               function ( results ) {
+                                       if ( !results || results.length === 0 ) {
+                                               provider.toggleDepleted( true );
+                                               return [];
+                                       }
+                                       return results;
+                               },
+                               // Process failed, return an empty promise
+                               function () {
+                                       provider.toggleDepleted( true );
+                                       return $.Deferred().resolve( [] );
+                               }
+                       )
+                       .promise( { abort: function () {
+                               aborted = true;
+                               if ( xhr ) {
+                                       xhr.abort();
+                               }
+                       } } );
+       };
+
+       /**
+        * Get continuation API data
+        *
+        * @param {number} howMany The number of results to retrieve
+        * @return {Object} API request data
+        */
+       mw.widgets.MediaResourceProvider.prototype.getContinueData = function () {
+               return {};
+       };
+
+       /**
+        * Set continuation data for the next page
+        *
+        * @param {Object} continueData Continuation data
+        */
+       mw.widgets.MediaResourceProvider.prototype.setContinue = function () {
+       };
+
+       /**
+        * Sort the results
+        *
+        * @param {Object[]} results API results
+        * @return {Object[]} Sorted results
+        */
+       mw.widgets.MediaResourceProvider.prototype.sort = function ( results ) {
+               return results;
+       };
+
+       /**
+        * Call the API for search results.
+        *
+        * @param {number} howMany The number of results to retrieve
+        * @return {jQuery.Promise} Promise that resolves with an array of objects that contain
+        *  the fetched data.
+        */
+       mw.widgets.MediaResourceProvider.prototype.fetchAPIresults = function ( howMany ) {
+               var xhr, api,
+                       provider = this;
+
+               if ( !this.isValid() ) {
+                       return $.Deferred().reject().promise( { abort: $.noop } );
+               }
+
+               api = this.isLocal ? new mw.Api() : new mw.ForeignApi( this.getAPIurl(), { anonymous: true } );
+               xhr = api.get( $.extend( {}, this.getStaticParams(), this.getUserParams(), this.getContinueData( howMany ) ) );
+               return xhr
+                       .then( function ( data ) {
+                               var page, newObj, raw,
+                                       results = [];
+
+                               if ( data.error ) {
+                                       provider.toggleDepleted( true );
+                                       return [];
+                               }
+
+                               if ( data.continue ) {
+                                       // Update the offset for next time
+                                       provider.setContinue( data.continue );
+                               } else {
+                                       // This is the last available set of results. Mark as depleted!
+                                       provider.toggleDepleted( true );
+                               }
+
+                               // If the source returned no results, it will not have a
+                               // query property
+                               if ( data.query ) {
+                                       raw = data.query.pages;
+                                       if ( raw ) {
+                                               // Strip away the page ids
+                                               for ( page in raw ) {
+                                                       if ( !raw[ page ].imageinfo ) {
+                                                               // The search may give us pages that belong to the File:
+                                                               // namespace but have no files in them, either because
+                                                               // they were deleted or imported wrongly, or just started
+                                                               // as pages. In that case, the response will not include
+                                                               // imageinfo. Skip those files.
+                                                               continue;
+                                                       }
+                                                       newObj = raw[ page ].imageinfo[ 0 ];
+                                                       newObj.title = raw[ page ].title;
+                                                       newObj.index = raw[ page ].index;
+                                                       results.push( newObj );
+                                               }
+                                       }
+                               }
+                               return provider.sort( results );
+                       } )
+                       .promise( { abort: xhr.abort } );
+       };
+
+       /**
+        * Set name
+        *
+        * @param {string} name
+        */
+       mw.widgets.MediaResourceProvider.prototype.setName = function ( name ) {
+               this.name = name;
+       };
+
+       /**
+        * Get name
+        *
+        * @return {string} name
+        */
+       mw.widgets.MediaResourceProvider.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Get standard width, based on the provider source's thumb sizes.
+        *
+        * @return {number|undefined} fetchWidth
+        */
+       mw.widgets.MediaResourceProvider.prototype.getStandardWidth = function () {
+               return ( this.thumbSizes && this.thumbSizes[ this.thumbSizes.length - 1 ] ) ||
+                       ( this.imageSizes && this.imageSizes[ 0 ] ) ||
+                       // Fall back on a number
+                       300;
+       };
+
+       /**
+        * Get prop
+        *
+        * @return {string} prop
+        */
+       mw.widgets.MediaResourceProvider.prototype.getFetchProp = function () {
+               return this.fetchProp;
+       };
+
+       /**
+        * Set prop
+        *
+        * @param {string} prop
+        */
+       mw.widgets.MediaResourceProvider.prototype.setFetchProp = function ( prop ) {
+               this.fetchProp = prop;
+       };
+
+       /**
+        * Set thumb sizes
+        *
+        * @param {number[]} sizes Available thumbnail sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.setThumbSizes = function ( sizes ) {
+               this.thumbSizes = sizes;
+       };
+
+       /**
+        * Set image sizes
+        *
+        * @param {number[]} sizes Available image sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.setImageSizes = function ( sizes ) {
+               this.imageSizes = sizes;
+       };
+
+       /**
+        * Get thumb sizes
+        *
+        * @return {number[]} sizes Available thumbnail sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.getThumbSizes = function () {
+               return this.thumbSizes;
+       };
+
+       /**
+        * Get image sizes
+        *
+        * @return {number[]} sizes Available image sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.getImageSizes = function () {
+               return this.imageSizes;
+       };
+
+       /**
+        * Check if this source is valid.
+        *
+        * @return {boolean} Source is valid
+        */
+       mw.widgets.MediaResourceProvider.prototype.isValid = function () {
+               return this.isLocal ||
+                       // If we don't have either 'apiurl' or 'scriptDirUrl'
+                       // the source is invalid, and we will skip it
+                       this.apiurl !== undefined ||
+                       this.scriptDirUrl !== undefined;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js
new file mode 100644 (file)
index 0000000..34fa44b
--- /dev/null
@@ -0,0 +1,68 @@
+/*!
+ * MediaWiki Widgets - MediaResourceQueue class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media resource queue.
+        *
+        * @class
+        * @extends mw.widgets.APIResultsQueue
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} maxHeight The maximum height of the media, used in the
+        *  search call to the API.
+        */
+       mw.widgets.MediaResourceQueue = function MwWidgetsMediaResourceQueue( config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaResourceQueue.super.call( this, config );
+
+               this.maxHeight = config.maxHeight || 200;
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaResourceQueue, mw.widgets.APIResultsQueue );
+
+       /**
+        * Fetch the file repos.
+        *
+        * @return {jQuery.Promise} Promise that resolves when the resources are set up
+        */
+       mw.widgets.MediaResourceQueue.prototype.getFileRepos = function () {
+               var defaultSource = [ {
+                       url: mw.util.wikiScript( 'api' ),
+                       local: ''
+               } ];
+
+               if ( !this.fileRepoPromise ) {
+                       this.fileRepoPromise = new mw.Api().get( {
+                               action: 'query',
+                               meta: 'filerepoinfo'
+                       } ).then(
+                               function ( resp ) {
+                                       return resp.query && resp.query.repos || defaultSource;
+                               },
+                               function () {
+                                       return $.Deferred().resolve( defaultSource );
+                               }
+                       );
+               }
+
+               return this.fileRepoPromise;
+       };
+
+       /**
+        * Get image maximum height
+        *
+        * @return {string} Image max height
+        */
+       mw.widgets.MediaResourceQueue.prototype.getMaxHeight = function () {
+               return this.maxHeight;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css
new file mode 100644 (file)
index 0000000..bc752b5
--- /dev/null
@@ -0,0 +1,89 @@
+/*!
+ * MediaWiki Widgets - MediaResultWidget styles.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-mediaResultWidget {
+       display: inline-block;
+       position: relative;
+       padding: 0;
+       margin: 2px;
+       overflow: hidden;
+       box-sizing: border-box;
+       text-align: center;
+}
+
+.mw-widget-mediaResultWidget-error {
+       background-color: #f3f3f3;
+}
+
+.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,
+.mw-widget-mediaResultWidget-error .mw-widget-mediaResultWidget-thumbnail {
+       opacity: 1;
+}
+
+.mw-widget-mediaResultWidget-crop {
+       background-size: cover; /* stylelint-disable-line no-unsupported-browser-features */
+       background-position: center center;
+}
+
+.mw-widget-mediaResultWidget-overlay {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       box-shadow: inset 0 0 0 1px #ccc;
+}
+
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-highlighted,
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-selected {
+       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #fff;
+}
+
+.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-position: center center;
+       background-repeat: no-repeat;
+}
+
+.mw-widget-mediaResultWidget .mw-widget-mediaResultWidget-nameLabel {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       padding: 0.5em;
+       color: #fff;
+       text-shadow: 1px 1px #000; /* stylelint-disable-line no-unsupported-browser-features */
+       line-height: 1.125em;
+       background-color: rgba( 0, 0, 0, 0.5 );
+       text-overflow: ellipsis;
+       text-align: left;
+}
+
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-highlighted .mw-widget-mediaResultWidget-nameLabel {
+       background-color: rgba( 0, 0, 0, 0.75 );
+}
+
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-selected .mw-widget-mediaResultWidget-nameLabel {
+       background-color: #000;
+}
+
+.mw-widget-mediaSearchWidget-noresults {
+       padding-top: 1em;
+}
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js
new file mode 100644 (file)
index 0000000..7607e84
--- /dev/null
@@ -0,0 +1,274 @@
+/*!
+ * MediaWiki Widgets - MediaResultWidget class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates an mw.widgets.MediaResultWidget object.
+        *
+        * @class
+        * @extends OO.ui.OptionWidget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} [rowHeight] Height of the row this result is part of
+        * @cfg {number} [maxRowWidth] A limit for the width of the row this
+        *  result is a part of.
+        * @cfg {number} [minWidth] Minimum width for the result
+        * @cfg {number} [maxWidth] Maximum width for the result
+        */
+       mw.widgets.MediaResultWidget = function MwWidgetsMediaResultWidget( config ) {
+               // Configuration initialization
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaResultWidget.super.call( this, config );
+
+               // Properties
+               this.setRowHeight( config.rowHeight || 150 );
+               this.maxRowWidth = config.maxRowWidth || 500;
+               this.minWidth = config.minWidth || this.maxRowWidth / 5;
+               this.maxWidth = config.maxWidth || this.maxRowWidth * 2 / 3;
+
+               this.imageDimensions = {};
+
+               this.isAudio = this.data.mediatype === 'AUDIO';
+
+               // Store the thumbnail url
+               this.thumbUrl = this.data.thumburl;
+               this.src = null;
+               this.row = null;
+
+               this.$thumb = $( '<img>' )
+                       .addClass( 'mw-widget-mediaResultWidget-thumbnail' )
+                       .on( {
+                               load: this.onThumbnailLoad.bind( this ),
+                               error: this.onThumbnailError.bind( this )
+                       } );
+               this.$overlay = $( '<div>' )
+                       .addClass( 'mw-widget-mediaResultWidget-overlay' );
+
+               this.calculateSizing( this.data );
+
+               // Get wiki default thumbnail size
+               this.defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )
+                       .defaultUserOptions.defaultthumbsize;
+
+               // Initialization
+               this.setLabel( new mw.Title( this.data.title ).getNameText() );
+               this.$label.addClass( 'mw-widget-mediaResultWidget-nameLabel' );
+
+               this.$element
+                       .addClass( 'mw-widget-mediaResultWidget ve-ui-texture-pending' )
+                       .prepend( this.$thumb, this.$overlay );
+       };
+
+       /* Inheritance */
+
+       OO.inheritClass( mw.widgets.MediaResultWidget, OO.ui.OptionWidget );
+
+       /* Static methods */
+
+       // Copied from ve.dm.MWImageNode
+       mw.widgets.MediaResultWidget.static.resizeToBoundingBox = function ( imageDimensions, boundingBox ) {
+               var newDimensions = OO.copy( imageDimensions ),
+                       scale = Math.min(
+                               boundingBox.height / imageDimensions.height,
+                               boundingBox.width / imageDimensions.width
+                       );
+
+               if ( scale < 1 ) {
+                       // Scale down
+                       newDimensions = {
+                               width: Math.floor( newDimensions.width * scale ),
+                               height: Math.floor( newDimensions.height * scale )
+                       };
+               }
+               return newDimensions;
+       };
+
+       /* Methods */
+       /** */
+       mw.widgets.MediaResultWidget.prototype.onThumbnailLoad = function () {
+               this.$thumb.first().addClass( 've-ui-texture-transparency' );
+               this.$element
+                       .addClass( 'mw-widget-mediaResultWidget-done' )
+                       .removeClass( 've-ui-texture-pending' );
+       };
+
+       /** */
+       mw.widgets.MediaResultWidget.prototype.onThumbnailError = function () {
+               this.$thumb.last()
+                       .css( 'background-image', '' )
+                       .addClass( 've-ui-texture-alert' );
+               this.$element
+                       .addClass( 'mw-widget-mediaResultWidget-error' )
+                       .removeClass( 've-ui-texture-pending' );
+       };
+
+       /**
+        * Resize the thumbnail and wrapper according to row height and bounding boxes, if given.
+        *
+        * @param {Object} originalDimensions Original image dimensions with width and height values
+        * @param {Object} [boundingBox] Specific bounding box, if supplied
+        */
+       mw.widgets.MediaResultWidget.prototype.calculateSizing = function ( originalDimensions, boundingBox ) {
+               var wrapperPadding,
+                       imageDimensions = {};
+
+               boundingBox = boundingBox || {};
+
+               if ( this.isAudio ) {
+                       // HACK: We are getting the wrong information from the
+                       // API about audio files. Set their thumbnail to square 120px
+                       imageDimensions = {
+                               width: 120,
+                               height: 120
+                       };
+               } else {
+                       // Get the image within the bounding box
+                       imageDimensions = this.constructor.static.resizeToBoundingBox(
+                               // Image original dimensions
+                               {
+                                       width: originalDimensions.width || originalDimensions.thumbwidth,
+                                       height: originalDimensions.height || originalDimensions.thumbwidth
+                               },
+                               // Bounding box
+                               {
+                                       width: boundingBox.width || this.getImageMaxWidth(),
+                                       height: boundingBox.height || this.getRowHeight()
+                               }
+                       );
+               }
+               this.imageDimensions = imageDimensions;
+               // Set the thumbnail size
+               this.$thumb.css( this.imageDimensions );
+
+               // Set the box size
+               wrapperPadding = this.calculateWrapperPadding( this.imageDimensions );
+               this.$element.css( wrapperPadding );
+       };
+
+       /**
+        * Replace the empty .src attribute of the image with the
+        * actual src.
+        */
+       mw.widgets.MediaResultWidget.prototype.lazyLoad = function () {
+               if ( !this.hasSrc() ) {
+                       this.src = this.thumbUrl;
+                       this.$thumb.attr( 'src', this.thumbUrl );
+               }
+       };
+
+       /**
+        * Retrieve the store dimensions object
+        *
+        * @return {Object} Thumb dimensions
+        */
+       mw.widgets.MediaResultWidget.prototype.getDimensions = function () {
+               return this.dimensions;
+       };
+
+       /**
+        * Resize thumbnail and element according to the resize factor
+        *
+        * @param {number} resizeFactor The resizing factor for the image
+        */
+       mw.widgets.MediaResultWidget.prototype.resizeThumb = function ( resizeFactor ) {
+               var boundingBox,
+                       imageOriginalWidth = this.imageDimensions.width,
+                       wrapperWidth = this.$element.width();
+               // Set the new row height
+               this.setRowHeight( Math.ceil( this.getRowHeight() * resizeFactor ) );
+
+               boundingBox = {
+                       width: Math.ceil( this.imageDimensions.width * resizeFactor ),
+                       height: this.getRowHeight()
+               };
+
+               this.calculateSizing( this.data, boundingBox );
+
+               // We need to adjust the wrapper this time to fit the "perfect"
+               // dimensions, regardless of how small the image is
+               if ( imageOriginalWidth < wrapperWidth ) {
+                       boundingBox.width = wrapperWidth * resizeFactor;
+               }
+               this.$element.css( this.calculateWrapperPadding( boundingBox ) );
+       };
+
+       /**
+        * Adjust the wrapper padding for small images
+        *
+        * @param {Object} thumbDimensions Thumbnail dimensions
+        * @return {Object} Css styling for the wrapper
+        */
+       mw.widgets.MediaResultWidget.prototype.calculateWrapperPadding = function ( thumbDimensions ) {
+               var css = {
+                       height: this.rowHeight,
+                       width: thumbDimensions.width,
+                       lineHeight: this.getRowHeight() + 'px'
+               };
+
+               // Check if the image is too thin so we can make a bit of space around it
+               if ( thumbDimensions.width < this.minWidth ) {
+                       css.width = this.minWidth;
+               }
+
+               return css;
+       };
+
+       /**
+        * Set the row height for all size calculations
+        *
+        * @return {number} rowHeight Row height
+        */
+       mw.widgets.MediaResultWidget.prototype.getRowHeight = function () {
+               return this.rowHeight;
+       };
+
+       /**
+        * Set the row height for all size calculations
+        *
+        * @param {number} rowHeight Row height
+        */
+       mw.widgets.MediaResultWidget.prototype.setRowHeight = function ( rowHeight ) {
+               this.rowHeight = rowHeight;
+       };
+
+       mw.widgets.MediaResultWidget.prototype.setImageMaxWidth = function ( width ) {
+               this.maxWidth = width;
+       };
+       mw.widgets.MediaResultWidget.prototype.getImageMaxWidth = function () {
+               return this.maxWidth;
+       };
+
+       /**
+        * Set the row this result is in.
+        *
+        * @param {number} row Row number
+        */
+       mw.widgets.MediaResultWidget.prototype.setRow = function ( row ) {
+               this.row = row;
+       };
+
+       /**
+        * Get the row this result is in.
+        *
+        * @return {number} row Row number
+        */
+       mw.widgets.MediaResultWidget.prototype.getRow = function () {
+               return this.row;
+       };
+
+       /**
+        * Check if the image has a src attribute already
+        *
+        * @return {boolean} Thumbnail has its source attribute set
+        */
+       mw.widgets.MediaResultWidget.prototype.hasSrc = function () {
+               return !!this.src;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js
new file mode 100644 (file)
index 0000000..a46d911
--- /dev/null
@@ -0,0 +1,69 @@
+/*!
+ * MediaWiki Widgets - MediaSearchProvider class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media search provider.
+        *
+        * @class
+        * @extends mw.widgets.MediaResourceProvider
+        *
+        * @constructor
+        * @param {string} apiurl The API url
+        * @param {Object} [config] Configuration options
+        */
+       mw.widgets.MediaSearchProvider = function MwWidgetsMediaSearchProvider( apiurl, config ) {
+               config = config || {};
+
+               config.staticParams = $.extend( {
+                       generator: 'search',
+                       gsrnamespace: mw.config.get( 'wgNamespaceIds' ).file
+               }, config.staticParams );
+
+               // Parent constructor
+               mw.widgets.MediaSearchProvider.super.call( this, apiurl, config );
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaSearchProvider, mw.widgets.MediaResourceProvider );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.getContinueData = function ( howMany ) {
+               return {
+                       gsroffset: this.getOffset(),
+                       gsrlimit: howMany || this.getDefaultFetchLimit()
+               };
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.setContinue = function ( continueData ) {
+               // Update the offset for next time
+               this.setOffset( continueData.gsroffset );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.sort = function ( results ) {
+               return results.sort( function ( a, b ) {
+                       return a.index - b.index;
+               } );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.isValid = function () {
+               return this.getUserParams().gsrsearch && mw.widgets.MediaSearchProvider.super.prototype.isValid.call( this );
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js
new file mode 100644 (file)
index 0000000..7ee98bb
--- /dev/null
@@ -0,0 +1,82 @@
+/*!
+ * MediaWiki Widgets - MediaSearchQueue class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media resource queue.
+        *
+        * @class
+        * @extends mw.widgets.MediaResourceQueue
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} maxHeight The maximum height of the media, used in the
+        *  search call to the API.
+        */
+       mw.widgets.MediaSearchQueue = function MwWidgetsMediaSearchQueue( config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaSearchQueue.super.call( this, config );
+
+               this.searchQuery = '';
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaSearchQueue, mw.widgets.MediaResourceQueue );
+
+       /**
+        * Override parent method to set up the providers according to
+        * the file repos
+        *
+        * @return {jQuery.Promise} Promise that resolves when the resources are set up
+        */
+       mw.widgets.MediaSearchQueue.prototype.setup = function () {
+               var i, len,
+                       queue = this;
+
+               return this.getFileRepos().then( function ( sources ) {
+                       if ( queue.providers.length === 0 ) {
+                               // Set up the providers
+                               for ( i = 0, len = sources.length; i < len; i++ ) {
+                                       queue.providers.push( new mw.widgets.MediaSearchProvider(
+                                               sources[ i ].apiurl,
+                                               {
+                                                       name: sources[ i ].name,
+                                                       local: sources[ i ].local,
+                                                       scriptDirUrl: sources[ i ].scriptDirUrl,
+                                                       userParams: {
+                                                               gsrsearch: queue.getSearchQuery()
+                                                       },
+                                                       staticParams: {
+                                                               iiurlheight: queue.getMaxHeight()
+                                                       }
+                                               } )
+                                       );
+                               }
+                       }
+               } );
+       };
+
+       /**
+        * Set the search query
+        *
+        * @param {string} searchQuery API search query
+        */
+       mw.widgets.MediaSearchQueue.prototype.setSearchQuery = function ( searchQuery ) {
+               this.setParams( { gsrsearch: searchQuery } );
+       };
+
+       /**
+        * Get the search query
+        *
+        * @return {string} API search query
+        */
+       mw.widgets.MediaSearchQueue.prototype.getSearchQuery = function () {
+               return this.getParams().gsrsearch;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css
new file mode 100644 (file)
index 0000000..3d28ef8
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+ * MediaWiki Widgets - MediaSearchWidget styles.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-mediaSearchWidget .oo-ui-searchWidget-query .oo-ui-inputWidget {
+       max-width: none;
+}
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js
new file mode 100644 (file)
index 0000000..c6938e8
--- /dev/null
@@ -0,0 +1,462 @@
+/*!
+ * MediaWiki Widgets - MediaSearchWidget class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates an mw.widgets.MediaSearchWidget object.
+        *
+        * @class
+        * @extends OO.ui.SearchWidget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @param {number} [size] Vertical size of thumbnails
+        */
+       mw.widgets.MediaSearchWidget = function MwWidgetsMediaSearchWidget( config ) {
+               // Configuration initialization
+               config = $.extend( {
+                       placeholder: mw.msg( 'mw-widgets-mediasearch-input-placeholder' )
+               }, config );
+
+               // Parent constructor
+               mw.widgets.MediaSearchWidget.super.call( this, config );
+
+               // Properties
+               this.providers = {};
+               this.lastQueryValue = '';
+               this.searchQueue = new mw.widgets.MediaSearchQueue( {
+                       limit: this.constructor.static.limit,
+                       threshold: this.constructor.static.threshold
+               } );
+
+               this.queryTimeout = null;
+               this.itemCache = {};
+               this.promises = [];
+               this.lang = config.lang || 'en';
+               this.$panels = config.$panels;
+
+               this.externalLinkUrlProtocolsRegExp = new RegExp(
+                       '^(' + mw.config.get( 'wgUrlProtocols' ) + ')',
+                       'i'
+               );
+
+               // Masonry fit properties
+               this.rows = [];
+               this.rowHeight = config.rowHeight || 200;
+               this.layoutQueue = [];
+               this.numItems = 0;
+               this.currentItemCache = [];
+
+               this.resultsSize = {};
+
+               this.selected = null;
+
+               this.noItemsMessage = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'mw-widgets-mediasearch-noresults' ),
+                       classes: [ 'mw-widget-mediaSearchWidget-noresults' ]
+               } );
+               this.noItemsMessage.toggle( false );
+
+               // Events
+               this.$results.on( 'scroll', this.onResultsScroll.bind( this ) );
+               this.$query.append( this.noItemsMessage.$element );
+               this.results.connect( this, {
+                       add: 'onResultsAdd',
+                       remove: 'onResultsRemove'
+               } );
+
+               this.resizeHandler = OO.ui.debounce( this.afterResultsResize.bind( this ), 500 );
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-mediaSearchWidget' );
+       };
+
+       /* Inheritance */
+
+       OO.inheritClass( mw.widgets.MediaSearchWidget, OO.ui.SearchWidget );
+
+       /* Static properties */
+
+       mw.widgets.MediaSearchWidget.static.limit = 10;
+
+       mw.widgets.MediaSearchWidget.static.threshold = 5;
+
+       /* Methods */
+
+       /**
+        * Respond to window resize and check if the result display should
+        * be updated.
+        */
+       mw.widgets.MediaSearchWidget.prototype.afterResultsResize = function () {
+               var items = this.currentItemCache;
+
+               if (
+                       items.length > 0 &&
+                       (
+                               this.resultsSize.width !== this.$results.width() ||
+                               this.resultsSize.height !== this.$results.height()
+                       )
+               ) {
+                       this.resetRows();
+                       this.itemCache = {};
+                       this.processQueueResults( items );
+                       if ( this.results.getItems().length > 0 ) {
+                               this.lazyLoadResults();
+                       }
+
+                       // Cache the size
+                       this.resultsSize = {
+                               width: this.$results.width(),
+                               height: this.$results.height()
+                       };
+               }
+       };
+
+       /**
+        * Teardown the widget; disconnect the window resize event.
+        */
+       mw.widgets.MediaSearchWidget.prototype.teardown = function () {
+               $( window ).off( 'resize', this.resizeHandler );
+       };
+
+       /**
+        * Setup the widget; activate the resize event.
+        */
+       mw.widgets.MediaSearchWidget.prototype.setup = function () {
+               $( window ).on( 'resize', this.resizeHandler );
+       };
+
+       /**
+        * Query all sources for media.
+        *
+        * @method
+        */
+       mw.widgets.MediaSearchWidget.prototype.queryMediaQueue = function () {
+               var search = this,
+                       value = this.getQueryValue();
+
+               if ( value === '' ) {
+                       return;
+               }
+
+               this.query.pushPending();
+               search.noItemsMessage.toggle( false );
+
+               this.searchQueue.setSearchQuery( value );
+               this.searchQueue.get( this.constructor.static.limit )
+                       .then( function ( items ) {
+                               if ( items.length > 0 ) {
+                                       search.processQueueResults( items );
+                                       search.currentItemCache = search.currentItemCache.concat( items );
+                               }
+
+                               search.query.popPending();
+                               search.noItemsMessage.toggle( search.results.getItems().length === 0 );
+                               if ( search.results.getItems().length > 0 ) {
+                                       search.lazyLoadResults();
+                               }
+
+                       } );
+       };
+
+       /**
+        * Process the media queue giving more items
+        *
+        * @method
+        * @param {Object[]} items Given items by the media queue
+        */
+       mw.widgets.MediaSearchWidget.prototype.processQueueResults = function ( items ) {
+               var i, len, title,
+                       resultWidgets = [],
+                       inputSearchQuery = this.getQueryValue(),
+                       queueSearchQuery = this.searchQueue.getSearchQuery();
+
+               if ( inputSearchQuery === '' || queueSearchQuery !== inputSearchQuery ) {
+                       return;
+               }
+
+               for ( i = 0, len = items.length; i < len; i++ ) {
+                       title = new mw.Title( items[ i ].title ).getMainText();
+                       // Do not insert duplicates
+                       if ( !Object.prototype.hasOwnProperty.call( this.itemCache, title ) ) {
+                               this.itemCache[ title ] = true;
+                               resultWidgets.push(
+                                       new mw.widgets.MediaResultWidget( {
+                                               data: items[ i ],
+                                               rowHeight: this.rowHeight,
+                                               maxWidth: this.results.$element.width() / 3,
+                                               minWidth: 30,
+                                               rowWidth: this.results.$element.width()
+                                       } )
+                               );
+                       }
+               }
+               this.results.addItems( resultWidgets );
+
+       };
+
+       /**
+        * Get the sanitized query value from the input
+        *
+        * @return {string} Query value
+        */
+       mw.widgets.MediaSearchWidget.prototype.getQueryValue = function () {
+               var queryValue = this.query.getValue().trim();
+
+               if ( queryValue.match( this.externalLinkUrlProtocolsRegExp ) ) {
+                       queryValue = queryValue.match( /.+\/([^\/]+)/ )[ 1 ];
+               }
+               return queryValue;
+       };
+
+       /**
+        * Handle search value change
+        *
+        * @param {string} value New value
+        */
+       mw.widgets.MediaSearchWidget.prototype.onQueryChange = function () {
+               // Get the sanitized query value
+               var queryValue = this.getQueryValue();
+
+               if ( queryValue === this.lastQueryValue ) {
+                       return;
+               }
+
+               // Parent method
+               mw.widgets.MediaSearchWidget.super.prototype.onQueryChange.apply( this, arguments );
+
+               // Reset
+               this.itemCache = {};
+               this.currentItemCache = [];
+               this.resetRows();
+
+               // Empty the results queue
+               this.layoutQueue = [];
+
+               // Change resource queue query
+               this.searchQueue.setSearchQuery( queryValue );
+               this.lastQueryValue = queryValue;
+
+               // Queue
+               clearTimeout( this.queryTimeout );
+               this.queryTimeout = setTimeout( this.queryMediaQueue.bind( this ), 350 );
+       };
+
+       /**
+        * Handle results scroll events.
+        *
+        * @param {jQuery.Event} e Scroll event
+        */
+       mw.widgets.MediaSearchWidget.prototype.onResultsScroll = function () {
+               var position = this.$results.scrollTop() + this.$results.outerHeight(),
+                       threshold = this.results.$element.outerHeight() - this.rowHeight * 3;
+
+               // Check if we need to ask for more results
+               if ( !this.query.isPending() && position > threshold ) {
+                       this.queryMediaQueue();
+               }
+
+               this.lazyLoadResults();
+       };
+
+       /**
+        * Lazy-load the images that are visible.
+        */
+       mw.widgets.MediaSearchWidget.prototype.lazyLoadResults = function () {
+               var i, elementTop,
+                       items = this.results.getItems(),
+                       resultsScrollTop = this.$results.scrollTop(),
+                       position = resultsScrollTop + this.$results.outerHeight();
+
+               // Lazy-load results
+               for ( i = 0; i < items.length; i++ ) {
+                       elementTop = items[ i ].$element.position().top;
+                       if ( elementTop <= position && !items[ i ].hasSrc() ) {
+                               // Load the image
+                               items[ i ].lazyLoad();
+                       }
+               }
+       };
+
+       /**
+        * Reset all the rows; destroy the jQuery elements and reset
+        * the rows array.
+        */
+       mw.widgets.MediaSearchWidget.prototype.resetRows = function () {
+               var i, len;
+
+               for ( i = 0, len = this.rows.length; i < len; i++ ) {
+                       this.rows[ i ].$element.remove();
+               }
+
+               this.rows = [];
+               this.itemCache = {};
+       };
+
+       /**
+        * Find an available row at the end. Either we will need to create a new
+        * row or use the last available row if it isn't full.
+        *
+        * @return {number} Row index
+        */
+       mw.widgets.MediaSearchWidget.prototype.getAvailableRow = function () {
+               var row;
+
+               if ( this.rows.length === 0 ) {
+                       row = 0;
+               } else {
+                       row = this.rows.length - 1;
+               }
+
+               if ( !this.rows[ row ] ) {
+                       // Create new row
+                       this.rows[ row ] = {
+                               isFull: false,
+                               width: 0,
+                               items: [],
+                               $element: $( '<div>' )
+                                       .addClass( 'mw-widget-mediaResultWidget-row' )
+                                       .css( {
+                                               overflow: 'hidden'
+                                       } )
+                                       .data( 'row', row )
+                                       .attr( 'data-full', false )
+                       };
+                       // Append to results
+                       this.results.$element.append( this.rows[ row ].$element );
+               } else if ( this.rows[ row ].isFull ) {
+                       row++;
+                       // Create new row
+                       this.rows[ row ] = {
+                               isFull: false,
+                               width: 0,
+                               items: [],
+                               $element: $( '<div>' )
+                                       .addClass( 'mw-widget-mediaResultWidget-row' )
+                                       .css( {
+                                               overflow: 'hidden'
+                                       } )
+                                       .data( 'row', row )
+                                       .attr( 'data-full', false )
+                       };
+                       // Append to results
+                       this.results.$element.append( this.rows[ row ].$element );
+               }
+
+               return row;
+       };
+
+       /**
+        * Respond to add 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 ) {
+               var search = this;
+
+               // Add method to a queue; this queue will only run when the widget
+               // is visible
+               this.layoutQueue.push( function () {
+                       var i, j, ilen, jlen, itemWidth, row, effectiveWidth,
+                               resizeFactor,
+                               maxRowWidth = search.results.$element.width() - 15;
+
+                       // Go over the added items
+                       row = search.getAvailableRow();
+                       for ( i = 0, ilen = items.length; i < ilen; i++ ) {
+                               itemWidth = items[ i ].$element.outerWidth( true );
+
+                               // Add items to row until it is full
+                               if ( search.rows[ row ].width + itemWidth >= maxRowWidth ) {
+                                       // Mark this row as full
+                                       search.rows[ row ].isFull = true;
+                                       search.rows[ row ].$element.attr( 'data-full', true );
+
+                                       // Find the resize factor
+                                       effectiveWidth = search.rows[ row ].width;
+                                       resizeFactor = maxRowWidth / effectiveWidth;
+
+                                       search.rows[ row ].$element.attr( 'data-effectiveWidth', effectiveWidth );
+                                       search.rows[ row ].$element.attr( 'data-resizeFactor', resizeFactor );
+                                       search.rows[ row ].$element.attr( 'data-row', row );
+
+                                       // Resize all images in the row to fit the width
+                                       for ( j = 0, jlen = search.rows[ row ].items.length; j < jlen; j++ ) {
+                                               search.rows[ row ].items[ j ].resizeThumb( resizeFactor );
+                                       }
+
+                                       // find another row
+                                       row = search.getAvailableRow();
+                               }
+
+                               // Add the cumulative
+                               search.rows[ row ].width += itemWidth;
+
+                               // Store reference to the item and to the row
+                               search.rows[ row ].items.push( items[ i ] );
+                               items[ i ].setRow( row );
+
+                               // Append the item
+                               search.rows[ row ].$element.append( items[ i ].$element );
+                       }
+
+                       // If we have less than 4 rows, call for more images
+                       if ( search.rows.length < 4 ) {
+                               search.queryMediaQueue();
+                       }
+               } );
+               this.runLayoutQueue();
+       };
+
+       /**
+        * Run layout methods from the queue only if the element is visible.
+        */
+       mw.widgets.MediaSearchWidget.prototype.runLayoutQueue = function () {
+               var i, len;
+
+               if ( this.$element.is( ':visible' ) ) {
+                       for ( i = 0, len = this.layoutQueue.length; i < len; i++ ) {
+                               this.layoutQueue.pop()();
+                       }
+               }
+       };
+
+       /**
+        * Respond to removing results event in the results widget.
+        * Clear the relevant rows.
+        *
+        * @param {OO.ui.OptionWidget[]} items Removed items
+        */
+       mw.widgets.MediaSearchWidget.prototype.onResultsRemove = function ( items ) {
+               if ( items.length > 0 ) {
+                       // In the case of the media search widget, if any items are removed
+                       // all are removed (new search)
+                       this.resetRows();
+                       this.currentItemCache = [];
+               }
+       };
+
+       /**
+        * Set language for the search results.
+        *
+        * @param {string} lang Language
+        */
+       mw.widgets.MediaSearchWidget.prototype.setLang = function ( lang ) {
+               this.lang = lang;
+       };
+
+       /**
+        * Get language for the search results.
+        *
+        * @return {string} lang Language
+        */
+       mw.widgets.MediaSearchWidget.prototype.getLang = function () {
+               return this.lang;
+       };
+}( jQuery, mediaWiki ) );
index 4d90496..b929a5a 100644 (file)
@@ -5,6 +5,9 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 
+/* stylelint-disable no-duplicate-selectors */
+@import 'mediawiki.mixins';
+
 @calendarWidth: 21em;
 @calendarHeight: 14em;
 
@@ -14,7 +17,7 @@
 
 .mw-widget-calendarWidget-header {
        position: relative;
-       line-height: 2.5em;
+       line-height: 2.5;
 }
 
 .mw-widget-calendarWidget-header .oo-ui-buttonWidget {
 .mw-widget-calendarWidget-header .mw-widget-calendarWidget-labelButton {
        margin: 0 auto;
        display: block;
-       width: @calendarWidth - 2*3em;
+       width: @calendarWidth - 2 * 3em;
 
        .oo-ui-buttonElement-button {
-               width: @calendarWidth - 2*3em;
+               width: @calendarWidth - 2 * 3em;
                text-align: center;
        }
 }
                height: @calendarHeight;
        }
 
-       .mw-widget-calendarWidget-old-body {
-               // background: #fdd;
-       }
-
-       .mw-widget-calendarWidget-body:not(.mw-widget-calendarWidget-old-body):first-child {
+       .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
                margin-top: -@calendarHeight;
                margin-left: -@calendarWidth;
        }
 
-       .mw-widget-calendarWidget-body:not(.mw-widget-calendarWidget-old-body):last-child {
+       .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
                margin-top: 0;
                margin-left: 0;
        }
@@ -86,7 +85,7 @@
        .mw-widget-calendarWidget-body:first-child {
                margin-top: 0 !important;
                margin-left: 0 !important;
-               transition: 0.5s margin-left;
+               .transition( margin-left 500ms );
        }
 }
 
@@ -97,7 +96,7 @@
        .mw-widget-calendarWidget-body:first-child {
                margin-left: -@calendarWidth !important;
                margin-top: 0 !important;
-               transition: 0.5s margin-left;
+               .transition( margin-left 500ms );
        }
 }
 
        .mw-widget-calendarWidget-body:first-child {
                margin-left: 0 !important;
                margin-top: 0 !important;
-               transition: 0.5s margin-top;
+               .transition( margin-top 500ms );
        }
 }
 
        .mw-widget-calendarWidget-body:first-child {
                margin-left: 0 !important;
                margin-top: -@calendarHeight !important;
-               transition: 0.5s margin-top;
+               .transition( margin-top 500ms );
        }
 }
 
        width: @calendarWidth / 7;
        line-height: @calendarHeight / 7;
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
-       &:nth-child(7n) {
+       &:nth-child( 7n ) {
                width: @calendarWidth / 7 - 0.2em;
                margin-right: 0.2em;
        }
-       &:nth-child(7n+1) {
+       &:nth-child( 7n+1 ) {
                width: @calendarWidth / 7 - 0.2em;
                margin-left: 0.2em;
        }
-       &:nth-child(42) ~ & {
+       &:nth-child( 42 ) ~ & {
                line-height: @calendarHeight / 7 - 0.2em;
                margin-bottom: 0.2em;
        }
        width: @calendarWidth / 2;
        line-height: @calendarHeight / 6;
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
-       &:nth-child(2n) {
+       &:nth-child( 2n ) {
                width: @calendarWidth / 2 - 0.2em;
                margin-right: 0.2em;
        }
-       &:nth-child(2n+1) {
+       &:nth-child( 2n+1 ) {
                width: @calendarWidth / 2 - 0.2em;
                margin-left: 0.2em;
        }
-       &:nth-child(10) ~ & {
+       &:nth-child( 10 ) ~ & {
                line-height: @calendarHeight / 6 - 0.2em;
                margin-bottom: 0.2em;
        }
        width: @calendarWidth / 5;
        line-height: @calendarHeight / 4;
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
-       &:nth-child(5n) {
+       &:nth-child( 5n ) {
                width: @calendarWidth / 5 - 0.2em;
                margin-right: 0.2em;
        }
-       &:nth-child(5n+1) {
+       &:nth-child( 5n+1 ) {
                width: @calendarWidth / 5 - 0.2em;
                margin-left: 0.2em;
        }
-       &:nth-child(15) ~ & {
+       &:nth-child( 15 ) ~ & {
                line-height: @calendarHeight / 4 - 0.2em;
                margin-bottom: 0.2em;
        }
 
 /* Theme-specific */
 .mw-widget-calendarWidget {
-       box-shadow: inset 0 0 0 1px #ccc;
-}
+       .box-sizing( border-box );
+       border: 1px solid #a2a9b1;
+       .transition( ~'border-color 100ms, box-shadow 100ms' );
 
-.mw-widget-calendarWidget:focus {
-       outline: none;
-       box-shadow: inset 0 0 0 2px #36c;
-}
+       &:focus {
+               border-color: #36c;
+               box-shadow: inset 0 0 0 1px #36c;
+               outline: 0;
+       }
 
-.mw-widget-calendarWidget-day {
-       color: #444;
-       border-radius: 0.1em;
-}
+       &-day {
+               color: #222;
+               border-radius: 2px;
+       }
 
-.mw-widget-calendarWidget-day-heading {
-       font-weight: bold;
-       color: #555;
-}
+       &-day-heading {
+               color: #54595d;
+               font-weight: bold;
+       }
 
-.mw-widget-calendarWidget-day-additional {
-       color: #aaa;
-}
+       &-day-additional {
+               color: #a2a9b1;
 
-.mw-widget-calendarWidget-day-today {
-       box-shadow: inset 0 0 0 1px #3787fb;
-}
+               &:hover {
+                       color: #222;
+               }
+       }
 
-.mw-widget-calendarWidget-item-selected {
-       background-color: #d8e6fe;
-       color: #3787fb;
-}
+       &-day-today {
+               box-shadow: inset 0 0 0 1px #36c;
+       }
+
+       &-item {
+               .transition( ~'background-color 250ms, color 250ms' );
 
-.mw-widget-calendarWidget-item:hover {
-       background-color: #eee;
+               &:hover {
+                       background-color: #36c;
+                       color: #fff;
+               }
+
+               &-selected {
+                       background-color: #2a4b8d;
+                       color: #fff;
+               }
+       }
 }
index e0ec8e7..422c048 100644 (file)
@@ -52,6 +52,7 @@
                        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
index 7f5e608..0ec6a4c 100644 (file)
@@ -72,6 +72,8 @@
         *     while the widget is inactive. Should be as unambiguous as possible (for example, prefer to
         *     spell out the month, rather than rely on the order), even if that makes it longer. When not
         *     given, the default is language-specific.
+        * @cfg {boolean} [longDisplayFormat=false] If a custom displayFormat is not specified, use
+        *     unabbreviated day of the week and month names in the default language-specific displayFormat.
         * @cfg {string} [placeholderLabel=No date selected] Placeholder text shown when the widget is not
         *     selected. Default text taken from message `mw-widgets-dateinput-no-date`.
         * @cfg {string} [placeholderDateFormat] User-visible date format string displayed in the textual input
@@ -92,6 +94,7 @@
                // Config initialization
                config = $.extend( {
                        precision: 'day',
+                       longDisplayFormat: false,
                        required: false,
                        placeholderLabel: mw.msg( 'mw-widgets-dateinput-no-date' )
                }, config );
                this.inTextInput = 0;
                this.inputFormat = config.inputFormat;
                this.displayFormat = config.displayFormat;
+               this.longDisplayFormat = config.longDisplayFormat;
                this.required = config.required;
                this.placeholderLabel = config.placeholderLabel;
 
                        ll = localeData.longDateFormat( 'll' );
                        format = llll.replace( lll.replace( ll, '' ), '' );
 
+                       if ( this.longDisplayFormat ) {
+                               format = format.replace( 'MMM', 'MMMM' ).replace( 'ddd', 'dddd' );
+                       }
+
                        return format;
                }
        };
index 46e6b62..8ba9a99 100644 (file)
@@ -21,6 +21,7 @@
 
 .oo-ui-inline-spacing( @spacing, @cancelled-spacing: 0 ) {
        margin-right: @spacing;
+
        &:last-child {
                margin-right: @cancelled-spacing;
        }
 .mw-widget-dateInputWidget {
        display: inline-block;
        position: relative;
+       width: 21em;
+       margin-top: 0.25em;
+       .oo-ui-inline-spacing( 0.5em );
+       margin-bottom: 0.25em;
+       margin-left: 0;
 
        &-handle {
-               width: 100%;
+               background-color: #fff;
                display: inline-block;
-               cursor: pointer;
                position: relative;
-
+               .oo-ui-box-sizing( border-box );
+               width: 100%;
                .oo-ui-unselectable();
-               .oo-ui-box-sizing(border-box);
+               cursor: pointer;
+               padding: 0.5em 1em;
+               border: 1px solid #a2a9b1;
+               border-radius: 2px;
+               outline: 0;
+               line-height: 1.275;
+
+               > .oo-ui-labelElement-label {
+                       padding: 0;
+               }
 
                > .oo-ui-indicatorElement-indicator {
                        display: none;
                position: absolute;
                top: 0;
                right: 0;
-               height: 100%;
-       }
-
-       &.oo-ui-widget-disabled .mw-widget-dateInputWidget-handle {
-               cursor: default;
-       }
-
-       &-calendar {
-               position: absolute;
-               z-index: 1;
-       }
-
-       // Theme-specific styles
-       width: 21em;
-       margin: 0.25em 0;
-
-       .oo-ui-inline-spacing(0.5em);
-
-       &-handle {
-               padding: 0.5em 1em;
-               border: 1px solid #ccc;
-               border-radius: 0.1em;
-               line-height: 1.275em;
-               background-color: #fff;
-
-               > .oo-ui-labelElement-label {
-                       padding: 0;
-               }
-       }
-
-       &.oo-ui-indicatorElement .mw-widget-dateInputWidget-handle > .oo-ui-indicatorElement-indicator {
                width: @indicator-size;
+               height: 100%;
                margin: 0 0.775em;
        }
 
-       > .oo-ui-textInputWidget input {
-               padding-left: 1em;
-       }
-
        > .oo-ui-textInputWidget {
                z-index: 2;
+
+               & input {
+                       padding-left: 1em;
+               }
        }
 
        &-calendar {
                background-color: #fff;
+               position: absolute;
                margin-top: -2px;
+               box-shadow: 0 0.15em 0 0 rgba( 0, 0, 0, 0.15 );
+               z-index: 1;
 
                &:focus {
+                       box-shadow: inset 0 0 0 1px #36c, 0 0.15em 0 0 rgba( 0, 0, 0, 0.15 );
                        z-index: 3;
                }
        }
 
-       &.oo-ui-widget-enabled {
-               .mw-widget-dateInputWidget-handle:hover {
-                       border-color: #36c;
-               }
-       }
-
-       &.oo-ui-widget-disabled {
+       &-empty {
                .mw-widget-dateInputWidget-handle {
-                       color: #ccc;
-                       text-shadow: 0 1px 1px #fff;
-                       border-color: #ddd;
-                       background-color: #f3f3f3;
-
-                       > .oo-ui-indicatorElement-indicator {
-                               opacity: 0.2;
-                       }
+                       color: #54595d;
+                       outline: 0;
                }
-
        }
 
        &.oo-ui-flaggedElement-invalid {
                }
        }
 
-       &-empty {
+       &.oo-ui-widget-enabled {
+               .mw-widget-dateInputWidget-handle:hover {
+                       border-color: #72777d;
+               }
+       }
+
+       &.oo-ui-widget-disabled {
                .mw-widget-dateInputWidget-handle {
-                       color: #ccc;
+                       background-color: #eaecf0;
+                       color: #72777d;
+                       border-color: #c8ccd1;
+                       text-shadow: 0 1px 1px #fff;
+                       cursor: default;
+
+                       > .oo-ui-indicatorElement-indicator {
+                               opacity: 0.51;
+                       }
                }
        }
 }
index 39bee7c..0a73bef 100755 (executable)
@@ -34,7 +34,8 @@
                        icon: 'search',
                        maxLength: undefined,
                        performSearchOnClick: true,
-                       dataLocation: 'header'
+                       dataLocation: 'header',
+                       namespace: 0
                }, config );
 
                // Parent constructor
         * @inheritdoc mw.widgets.TitleWidget
         */
        mw.widgets.SearchInputWidget.prototype.getSuggestionsPromise = function () {
-               var api = new mw.Api(),
+               var api = this.getApi(),
                        promise,
                        self = this;
 
                // reuse the searchSuggest function from mw.searchSuggest
-               promise = mw.searchSuggest.request( api, this.getQueryValue(), $.noop, this.limit );
+               promise = mw.searchSuggest.request( api, this.getQueryValue(), $.noop, this.limit, this.getNamespace() );
 
                // tracking purposes
                promise.done( function ( data, jqXHR ) {
index ecfc880..4a59dae 100644 (file)
@@ -1,3 +1,5 @@
+@import 'mediawiki.mixins';
+
 .mw-widgets-stashedFileWidget {
        display: inline-block;
        vertical-align: middle;
        vertical-align: middle;
        position: relative;
        overflow: hidden;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
+       .box-sizing( border-box );
 
        > .mw-widgets-stashedFileWidget-label {
                line-height: 2.3em;
                margin: 0;
                overflow: hidden;
                white-space: nowrap;
-               -webkit-box-sizing: border-box;
-                  -moz-box-sizing: border-box;
-                               box-sizing: border-box;
+               .box-sizing( border-box );
                text-overflow: ellipsis;
                left: 0.5em;
                right: 2.375em;
        }
 
        .mw-widgets-stashedFileWidget-info {
-               border: none;
+               border: 0;
                background: none;
                display: block;
                height: 100%;
        }
 }
 
-
 .mw-widgets-stashedFileWidget-empty {
        .mw-widgets-stashedFileWidget-thumbnail-container {
                text-align: center;
index e1e50ea..9703eea 100644 (file)
@@ -6,16 +6,6 @@
  */
 ( function ( $, mw ) {
 
-       var interwikiPrefixesPromise = new mw.Api().get( {
-               action: 'query',
-               meta: 'siteinfo',
-               siprop: 'interwikimap'
-       } ).then( function ( data ) {
-               return $.map( data.query.interwikimap, function ( interwiki ) {
-                       return interwiki.prefix;
-               } );
-       } );
-
        /**
         * Mixin for title widgets
         *
@@ -36,6 +26,7 @@
         * @cfg {boolean} [validateTitle=true] Whether the input must be a valid title (if set to true,
         *  the widget will marks itself red for invalid inputs, including an empty query).
         * @cfg {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
+        * @cfg {mw.Api} [api] API object to use, creates a default mw.Api instance if not specified
         */
        mw.widgets.TitleWidget = function MwWidgetsTitleWidget( config ) {
                // Config initialization
@@ -56,6 +47,7 @@
                this.excludeCurrentPage = !!config.excludeCurrentPage;
                this.validateTitle = config.validateTitle !== undefined ? config.validateTitle : true;
                this.cache = config.cache;
+               this.api = config.api || new mw.Api();
 
                // Initialization
                this.$element.addClass( 'mw-widget-titleWidget' );
 
        OO.initClass( mw.widgets.TitleWidget );
 
+       /* Static properties */
+
+       mw.widgets.TitleWidget.static.interwikiPrefixesPromiseCache = {};
+
        /* Methods */
 
        /**
                this.namespace = namespace;
        };
 
+       mw.widgets.TitleWidget.prototype.getInterwikiPrefixesPromise = function () {
+               var api = this.getApi(),
+                       cache = this.constructor.static.interwikiPrefixesPromiseCache,
+                       key = api.defaults.ajax.url;
+               if ( !cache.hasOwnProperty( key ) ) {
+                       cache[ key ] = api.get( {
+                               action: 'query',
+                               meta: 'siteinfo',
+                               siprop: 'interwikimap',
+                               // Cache client-side for a day since this info is mostly static
+                               maxage: 60 * 60 * 24,
+                               smaxage: 60 * 60 * 24,
+                               // Workaround T97096 by setting uselang=content
+                               uselang: 'content'
+                       } ).then( function ( data ) {
+                               return $.map( data.query.interwikimap, function ( interwiki ) {
+                                       return interwiki.prefix;
+                               } );
+                       } );
+               }
+               return cache[ key ];
+       };
+
        /**
         * Get a promise which resolves with an API repsonse for suggested
         * links for the current query.
         */
        mw.widgets.TitleWidget.prototype.getSuggestionsPromise = function () {
                var req,
+                       api = this.getApi(),
                        query = this.getQueryValue(),
                        widget = this,
                        promiseAbortObject = { abort: function () {
                        } };
 
                if ( mw.Title.newFromText( query ) ) {
-                       return interwikiPrefixesPromise.then( function ( interwikiPrefixes ) {
+                       return this.getInterwikiPrefixesPromise().then( function ( interwikiPrefixes ) {
                                var params,
                                        interwiki = query.substring( 0, query.indexOf( ':' ) );
                                if (
                                                params.prop.push( 'pageterms' );
                                                params.wbptterms = 'description';
                                        }
-                                       req = new mw.Api().get( params );
+                                       req = api.get( params );
                                        promiseAbortObject.abort = req.abort.bind( req ); // TODO ew
                                        return req.then( function ( ret ) {
                                                if ( ret.query === undefined ) {
-                                                       ret = new mw.Api().get( { action: 'query', titles: query } );
+                                                       ret = api.get( { action: 'query', titles: query } );
                                                        promiseAbortObject.abort = ret.abort.bind( ret );
                                                }
                                                return ret;
                }
        };
 
+       /**
+        * Get the API object for title requests
+        *
+        * @return {mw.Api} MediaWiki API
+        */
+       mw.widgets.TitleWidget.prototype.getApi = function () {
+               return this.api;
+       };
+
        /**
         * Get option widgets from the server response
         *
                } );
 
                // If not found, run value through mw.Title to avoid treating a match as a
-               // mismatch where normalisation would make them matching (bug 48476)
+               // mismatch where normalisation would make them matching (T50476)
 
                pageExistsExact = (
                        Object.prototype.hasOwnProperty.call( pageData, this.getQueryValue() ) &&
index 86d4cfe..bbffe28 100644 (file)
@@ -48,7 +48,8 @@
                                }
                        }
 
-                       &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
+                       &.oo-ui-optionWidget-highlighted,
+                       &.oo-ui-optionWidget-selected {
                                &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
                                        opacity: 1;
                                }
@@ -71,7 +72,7 @@
                }
        }
 
-       &:not(&-withDescriptions) {
+       &:not( &-withDescriptions ) {
                .mw-widget-titleOptionWidget-description {
                        display: none;
                }
diff --git a/resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js b/resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js
new file mode 100644 (file)
index 0000000..70d7cb5
--- /dev/null
@@ -0,0 +1,163 @@
+/*!
+ * MediaWiki Widgets - UsersMultiselectWidget class.
+ *
+ * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * UsersMultiselectWidget can be used to input list of users in a single
+        * line.
+        *
+        * If used inside HTML form the results will be sent as the list of
+        * newline-separated usernames.
+        *
+        * @class
+        * @extends OO.ui.CapsuleMultiselectWidget
+        *
+        * @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] Number of results to show in autocomplete menu
+        * @cfg {string} [name] Name of input to submit results (when used in HTML forms)
+        */
+       mw.widgets.UsersMultiselectWidget = function MwWidgetsUsersMultiselectWidget( config ) {
+               // Config initialization
+               config = $.extend( {
+                       limit: 10
+               }, config, {
+                       // Because of using autocomplete (constantly changing menu), we need to
+                       // allow adding usernames, which do not present in the menu.
+                       allowArbitrary: true
+               } );
+
+               // Parent constructor
+               mw.widgets.UsersMultiselectWidget.parent.call( this, $.extend( {}, config, {} ) );
+
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+
+               // Properties
+               this.limit = config.limit;
+
+               if ( 'name' in config ) {
+                       // If used inside HTML form, then create hidden input, which will store
+                       // the results.
+                       this.hiddenInput = $( '<input>' )
+                               .attr( 'type', 'hidden' )
+                               .attr( 'name', config.name )
+                               .appendTo( this.$element );
+
+                       // Update with preset values
+                       this.updateHiddenInput();
+               }
+
+               this.menu = this.getMenu();
+
+               // Events
+               // Update contents of autocomplete menu as user types letters
+               this.$input.on( {
+                       keyup: this.updateMenuItems.bind( this )
+               } );
+               // When option is selected from autocomplete menu, update the menu
+               this.menu.connect( this, {
+                       select: 'updateMenuItems'
+               } );
+               // When list of selected usernames changes, update hidden input
+               this.connect( this, {
+                       change: 'updateHiddenInput'
+               } );
+
+               // API init
+               this.api = config.api || new mw.Api();
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.UsersMultiselectWidget, OO.ui.CapsuleMultiselectWidget );
+       OO.mixinClass( mw.widgets.UsersMultiselectWidget, OO.ui.mixin.PendingElement );
+
+       /* Methods */
+
+       /**
+        * Get currently selected usernames
+        *
+        * @return {Array} usernames
+        */
+       mw.widgets.UsersMultiselectWidget.prototype.getSelectedUsernames = function() {
+               return this.getItemsData();
+       };
+
+       /**
+        * Update autocomplete menu with items
+        *
+        * @private
+        */
+       mw.widgets.UsersMultiselectWidget.prototype.updateMenuItems = function() {
+               var inputValue = this.$input.val();
+
+               if ( inputValue === this.inputValue ) {
+                       // Do not restart api query if nothing has changed in the input
+                       return;
+               } else {
+                       this.inputValue = inputValue;
+               }
+
+               this.api.abort(); // Abort all unfinished api requests
+
+               if ( inputValue.length > 0 ) {
+                       this.pushPending();
+
+                       this.api.get( {
+                               action: 'query',
+                               list: 'allusers',
+                               // Prefix of list=allusers is case sensitive. Normalise first
+                               // character to uppercase so that "fo" may yield "Foo".
+                               auprefix: inputValue[ 0 ].toUpperCase() + inputValue.slice( 1 ),
+                               aulimit: this.limit
+                       } ).done( function( response ) {
+                               var suggestions = response.query.allusers,
+                                       selected = this.getSelectedUsernames();
+
+                               // Remove usernames, which are already selected from suggestions
+                               suggestions = suggestions.map( function ( user ) {
+                                       if ( selected.indexOf( user.name ) === -1 ) {
+                                               return new OO.ui.MenuOptionWidget( {
+                                                       data: user.name,
+                                                       label: user.name
+                                               } );
+                                       }
+                               } ).filter( function( item ) {
+                                       return item !== undefined;
+                               } );
+
+                               // Remove all items from menu add fill it with new
+                               this.menu.clearItems();
+
+                               // Additional check to prevent bug of autoinserting first suggestion
+                               // while removing user from the list
+                               if ( inputValue.length > 1 || suggestions.length > 1 ) {
+                                       this.menu.addItems( suggestions );
+                               }
+
+                               this.popPending();
+                       }.bind( this ) ).fail( this.popPending.bind( this ) );
+               } else {
+                       this.menu.clearItems();
+               }
+       };
+
+       /**
+        * If used inside HTML form, then update hiddenInput with list o
+        * newline-separated usernames.
+        *
+        * @private
+        */
+       mw.widgets.UsersMultiselectWidget.prototype.updateHiddenInput = function() {
+               if ( 'hiddenInput' in this ) {
+                       this.hiddenInput.val( this.getSelectedUsernames().join( '\n' ) );
+               }
+       };
+
+}( jQuery, mediaWiki ) );
index b9e05c3..37c0c9b 100644 (file)
@@ -51,7 +51,7 @@
        }
 
        // Pre-populate with fake ajax promises to save http requests for tokens
-       // we already have on the page via the user.tokens module (bug 34733).
+       // we already have on the page via the user.tokens module (T36733).
        promises[ defaultOptions.ajax.url ] = {};
        $.each( mw.user.tokens.get(), function ( key, value ) {
                // This requires #getToken to use the same key as user.tokens.
                /**
                 * Massage parameters from the nice format we accept into a format suitable for the API.
                 *
+                * NOTE: A value of undefined/null in an array will be represented by Array#join()
+                * as the empty string. Should we filter silently? Warn? Leave as-is?
+                *
                 * @private
                 * @param {Object} parameters (modified in-place)
                 * @param {boolean} useUS Whether to use U+001F when joining multi-valued parameters.
                                                        jqXHR
                                                );
                                        } else if ( result.error ) {
+                                               // errorformat=bc
                                                code = result.error.code === undefined ? 'unknown' : result.error.code;
                                                apiDeferred.reject( code, result, result, jqXHR );
+                                       } else if ( result.errors ) {
+                                               // errorformat!=bc
+                                               code = result.errors[ 0 ].code === undefined ? 'unknown' : result.errors[ 0 ].code;
+                                               apiDeferred.reject( code, result, result, jqXHR );
                                        } else {
                                                apiDeferred.resolve( result, jqXHR );
                                        }
                                                        } );
                                                }
 
-                                               // Different error, pass on to let caller handle the error code
-                                               return this;
+                                               // Let caller handle the error code
+                                               return $.Deferred().rejectWith( this, arguments );
                                        }
                                );
                        } ).promise( { abort: function () {
                        promiseGroup = promises[ this.defaults.ajax.url ];
                        d = promiseGroup && promiseGroup[ type + 'Token' ];
 
+                       if ( !promiseGroup ) {
+                               promiseGroup = promises[ this.defaults.ajax.url ] = {};
+                       }
+
                        if ( !d ) {
                                apiPromise = this.get( {
                                        action: 'query',
                                                // Clear promise. Do not cache errors.
                                                delete promiseGroup[ type + 'Token' ];
 
-                                               // Pass on to allow the caller to handle the error
-                                               return this;
+                                               // Let caller handle the error code
+                                               return $.Deferred().rejectWith( this, arguments );
                                        } )
                                        // Attach abort handler
                                        .promise( { abort: apiPromise.abort } );
 
                                // Store deferred now so that we can use it again even if it isn't ready yet
-                               if ( !promiseGroup ) {
-                                       promiseGroup = promises[ this.defaults.ajax.url ] = {};
-                               }
                                promiseGroup[ type + 'Token' ] = d;
                        }
 
        /**
         * @static
         * @property {Array}
-        * List of errors we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
+        * Very incomplete and outdated list of errors we might receive from the API. Do not use.
+        * @deprecated since 1.29
         */
        mw.Api.errors = [
                // occurs when POST aborted
                'stashwrongowner',
                'stashnosuchfilekey'
        ];
+       mw.log.deprecate( mw.Api, 'errors', mw.Api.errors, null, 'mw.Api.errors' );
 
        /**
         * @static
         * @property {Array}
-        * List of warnings we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
+        * Very incomplete and outdated list of warnings we might receive from the API. Do not use.
+        * @deprecated since 1.29
         */
        mw.Api.warnings = [
                'duplicate',
                'exists'
        ];
+       mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings, null, 'mw.Api.warnings' );
 
 }( mediaWiki, jQuery ) );
index 069fbbf..4930c4f 100644 (file)
@@ -26,7 +26,7 @@
                 * Any warnings returned by the API, including warnings about invalid option names or values,
                 * are ignored. However, do not rely on this behavior.
                 *
-                * If necessary, the options will be saved using several parallel API requests. Only one promise
+                * If necessary, the options will be saved using several sequential API requests. Only one promise
                 * is always returned that will be resolved when all requests complete.
                 *
                 * @param {Object} options Options as a `{ name: value, … }` object
@@ -35,7 +35,7 @@
                saveOptions: function ( options ) {
                        var name, value, bundleable,
                                grouped = [],
-                               deferreds = [];
+                               promise = $.Deferred().resolve();
 
                        for ( name in options ) {
                                value = options[ name ] === null ? null : String( options[ name ] );
                                        }
                                } else {
                                        if ( value !== null ) {
-                                               deferreds.push( this.postWithToken( 'csrf', {
-                                                       formatversion: 2,
-                                                       action: 'options',
-                                                       optionname: name,
-                                                       optionvalue: value
-                                               } ) );
+                                               promise = promise.then( function ( name, value ) {
+                                                       return this.postWithToken( 'csrf', {
+                                                               formatversion: 2,
+                                                               action: 'options',
+                                                               optionname: name,
+                                                               optionvalue: value
+                                                       } );
+                                               }.bind( this, name, value ) );
                                        } else {
                                                // Omitting value resets the option
-                                               deferreds.push( this.postWithToken( 'csrf', {
-                                                       formatversion: 2,
-                                                       action: 'options',
-                                                       optionname: name
-                                               } ) );
+                                               promise = promise.then( function ( name ) {
+                                                       return this.postWithToken( 'csrf', {
+                                                               formatversion: 2,
+                                                               action: 'options',
+                                                               optionname: name
+                                                       } );
+                                               }.bind( this, name ) );
                                        }
                                }
                        }
 
                        if ( grouped.length ) {
-                               deferreds.push( this.postWithToken( 'csrf', {
-                                       formatversion: 2,
-                                       action: 'options',
-                                       change: grouped
-                               } ) );
+                               promise = promise.then( function () {
+                                       return this.postWithToken( 'csrf', {
+                                               formatversion: 2,
+                                               action: 'options',
+                                               change: grouped
+                                       } );
+                               }.bind( this ) );
                        }
 
-                       return $.when.apply( $, deferreds );
+                       return promise;
                }
 
        } );
index 687b475..5299252 100644 (file)
@@ -19,7 +19,6 @@
         *  parameter)
         * @return {string} return.done.watch.title Full pagename
         * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
-        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
         */
        function doWatchInternal( pages, addParams ) {
                // XXX: Parameter addParams is undocumented because we inherit this
@@ -27,9 +26,9 @@
                var apiPromise = this.postWithToken( 'watch',
                        $.extend(
                                {
+                                       formatversion: 2,
                                        action: 'watch',
-                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       uselang: mw.config.get( 'wgUserLanguage' )
+                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages )
                                },
                                addParams
                        )
diff --git a/resources/src/mediawiki/htmlform/datetime.js b/resources/src/mediawiki/htmlform/datetime.js
deleted file mode 100644 (file)
index 2fd2396..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * HTMLForm enhancements:
- * Add minimal help for date and time fields
- */
-( function ( mw ) {
-
-       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
-               var supported = {};
-
-               $root
-                       .find( 'input.mw-htmlform-datetime-field' )
-                       .each( function () {
-                               var input,
-                                       type = this.getAttribute( 'type' );
-
-                               if ( type !== 'date' && type !== 'time' && type !== 'datetime' ) {
-                                       // WTF?
-                                       return;
-                               }
-
-                               if ( supported[ type ] === undefined ) {
-                                       // Assume that if the browser implements validation (so it
-                                       // rejects "bogus" as a value) then it supports a proper UI too.
-                                       input = document.createElement( 'input' );
-                                       input.setAttribute( 'type', type );
-                                       input.value = 'bogus';
-                                       supported[ type ] = ( input.value !== 'bogus' );
-                               }
-
-                               if ( supported[ type ] ) {
-                                       if ( !this.getAttribute( 'min' ) ) {
-                                               this.setAttribute( 'min', this.getAttribute( 'data-min' ) );
-                                       }
-                                       if ( !this.getAttribute( 'max' ) ) {
-                                               this.setAttribute( 'max', this.getAttribute( 'data-max' ) );
-                                       }
-                                       if ( !this.getAttribute( 'step' ) ) {
-                                               this.setAttribute( 'step', this.getAttribute( 'data-step' ) );
-                                       }
-                               }
-                       } );
-       } );
-
-}( mediaWiki ) );
index 5f60097..157ac06 100644 (file)
        }
 
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
-               $root.find( '.mw-htmlform-hide-if' ).each( function () {
-                       var v, i, fields, test, func, spec, self, modules, data, extraModules,
-                               $el = $( this );
-
+               var
+                       $fields = $root.find( '.mw-htmlform-hide-if' ),
+                       $oouiFields = $fields.filter( '[data-ooui]' ),
                        modules = [];
-                       if ( $el.is( '[data-ooui]' ) ) {
-                               modules.push( 'mediawiki.htmlform.ooui' );
+
+               if ( $oouiFields.length ) {
+                       modules.push( 'mediawiki.htmlform.ooui' );
+                       $oouiFields.each( function () {
+                               var data, extraModules,
+                                       $el = $( this );
+
                                data = $el.data( 'mw-modules' );
                                if ( data ) {
                                        // We can trust this value, 'data-mw-*' attributes are banned from user content in Sanitizer
                                        extraModules = data.split( ',' );
                                        modules.push.apply( modules, extraModules );
                                }
-                       }
+                       } );
+               }
+
+               mw.loader.using( modules ).done( function () {
+                       $fields.each( function () {
+                               var v, i, fields, test, func, spec, self,
+                                       $el = $( this );
 
-                       mw.loader.using( modules ).done( function () {
                                if ( $el.is( '[data-ooui]' ) ) {
                                        // self should be a FieldLayout that mixes in mw.htmlform.Element
                                        self = OO.ui.FieldLayout.static.infuse( $el );
                                test = v[ 1 ];
                                // The .toggle() method works mostly the same for jQuery objects and OO.ui.Widget
                                func = function () {
-                                       self.toggle( !test() );
+                                       var shouldHide = test();
+                                       self.toggle( !shouldHide );
+
+                                       // It is impossible to submit a form with hidden fields failing validation, e.g. one that
+                                       // is required. However, validity is not checked for disabled fields, as these are not
+                                       // submitted with the form. So we should also disable fields when hiding them.
+                                       if ( self instanceof jQuery ) {
+                                               // This also finds elements inside any nested fields (in case of HTMLFormFieldCloner),
+                                               // which is problematic. But it works because:
+                                               // * HTMLFormFieldCloner::createFieldsForKey() copies 'hide-if' rules to nested fields
+                                               // * jQuery collections like $fields are in document order, so we register event
+                                               //   handlers for parents first
+                                               // * Event handlers are fired in the order they were registered, so even if the handler
+                                               //   for parent messed up the child, the handle for child will run next and fix it
+                                               self.find( 'input, textarea, select' ).each( function () {
+                                                       var $this = $( this );
+                                                       if ( shouldHide ) {
+                                                               if ( $this.data( 'was-disabled' ) === undefined ) {
+                                                                       $this.data( 'was-disabled', $this.prop( 'disabled' ) );
+                                                               }
+                                                               $this.prop( 'disabled', true );
+                                                       } else {
+                                                               $this.prop( 'disabled', $this.data( 'was-disabled' ) );
+                                                       }
+                                               } );
+                                       } else {
+                                               // self is a OO.ui.FieldLayout
+                                               if ( shouldHide ) {
+                                                       if ( self.wasDisabled === undefined ) {
+                                                               self.wasDisabled = self.fieldWidget.isDisabled();
+                                                       }
+                                                       self.fieldWidget.setDisabled( true );
+                                               } else if ( self.wasDisabled !== undefined ) {
+                                                       self.fieldWidget.setDisabled( self.wasDisabled );
+                                               }
+                                       }
                                };
                                for ( i = 0; i < fields.length; i++ ) {
                                        // The .on() method works mostly the same for jQuery objects and OO.ui.Widget
index 19f8f3e..bc835b5 100644 (file)
@@ -4,4 +4,11 @@
                mw.hook( 'htmlform.enhance' ).fire( $( document ) );
        } );
 
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               // Turn HTML5 form validation back on, in cases where it was disabled server-side (see
+               // HTMLForm::needsJSForHtml5FormValidation()) because we need extra logic implemented in JS to
+               // validate correctly. Currently, this is only used for forms containing fields with 'hide-if'.
+               $root.find( '.mw-htmlform' ).removeAttr( 'novalidate' );
+       } );
+
 }( mediaWiki, jQuery ) );
index 40f4f52..dbf2b6b 100644 (file)
@@ -1,16 +1,33 @@
 /* OOUIHTMLForm styles */
 
-.mw-htmlform-ooui .mw-htmlform-submit-buttons {
-       margin-top: 1em;
+.mw-htmlform-ooui .mw-htmlform-field-HTMLCheckMatrix {
+       width: 100%;
 }
 
-.mw-htmlform-ooui .mw-htmlform-field-HTMLCheckMatrix,
-.mw-htmlform-ooui .mw-htmlform-matrix,
-.mw-htmlform-ooui .mw-htmlform-matrix tr {
-       width: 100%;
+.mw-htmlform-ooui .mw-htmlform-matrix {
+       border-spacing: 0;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix td {
+       padding: 0.35em 0.7em;
+       -webkit-transition: background-color 250ms;
+       -moz-transition: background-color 250ms;
+       transition: background-color 250ms;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:nth-child( even ) td {
+       background-color: #f8f9fa;
 }
 
-.mw-htmlform-ooui .mw-htmlform-matrix tr td.first {
+.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:not( :first-child ):hover td {
+       background-color: #eaecf0;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:first-child td {
+       background-color: #fff;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix td.first {
        margin-right: 5%;
        width: 39%;
 }
@@ -23,3 +40,8 @@
        display: inline-block;
        margin-right: 1em;
 }
+
+.mw-htmlform-ooui .htmlform-tip,
+.mw-htmlform-ooui .mw-htmlform-submit-buttons {
+       margin-top: 1em;
+}
index 1603130..a53e863 100644 (file)
@@ -1,5 +1,9 @@
 /* HTMLForm styles */
 
+.mw-htmlform {
+       clear: both;
+}
+
 table.mw-htmlform-nolabel td.mw-label {
        display: none;
 }
@@ -40,9 +44,10 @@ tr.mw-htmlform-vertical-label td.mw-label {
        margin-left: 4px;
 }
 
-.mw-icon-question:lang(ar),
-.mw-icon-question:lang(fa),
-.mw-icon-question:lang(ur) {
+/* stylelint-disable indentation */
+.mw-icon-question:lang( ar ),
+.mw-icon-question:lang( fa ),
+.mw-icon-question:lang( ur ) {
        -webkit-transform: scaleX( -1 );
        -ms-transform: scaleX( -1 );
        transform: scaleX( -1 );
index a5cf1d8..f2b6f5f 100644 (file)
                                                                        e.stopPropagation();
                                                                } );
                                                } );
+                                       }, function ( errorMsg ) {
+                                               booklet.getPage( 'upload' ).$element.msg( errorMsg );
+                                               return $.Deferred().resolve();
                                        } )
                                );
                        }
         * @return {mw.Upload}
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.createUpload = function () {
-               return new mw.ForeignStructuredUpload( this.target );
+               return new mw.ForeignStructuredUpload( this.target, {
+                       parameters: {
+                               errorformat: 'html',
+                               errorlang: mw.config.get( 'wgUserLanguage' ),
+                               errorsuselocal: 1,
+                               formatversion: 2
+                       }
+               } );
        };
 
        /* Form renderers */
index 9203e5e..0e2af50 100644 (file)
                        ) {
                                return this.title;
                        }
-                       return this.title[ 0 ].toUpperCase() + this.title.slice( 1 );
+                       // PHP's strtoupper differs from String.toUpperCase in a number of cases
+                       // Bug: T147646
+                       return mw.Title.phpCharToUpper( this.title[ 0 ] ) + this.title.slice( 1 );
                },
 
                /**
diff --git a/resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js b/resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js
new file mode 100644 (file)
index 0000000..2b39c9a
--- /dev/null
@@ -0,0 +1,255 @@
+// This file can't be parsed by JSDuck due to <https://github.com/tenderlove/rkelly/issues/35>.
+// (It is excluded in jsduck.json.)
+// ESLint suggests unquoting some object keys, which would render the file unparseable by Opera 12.
+/* eslint-disable quote-props */
+( function ( mw ) {
+       var toUpperMapping = {
+               'ß': 'ß',
+               'ʼn': 'ʼn',
+               'Dž': 'Dž',
+               'dž': 'Dž',
+               'Lj': 'Lj',
+               'lj': 'Lj',
+               'Nj': 'Nj',
+               'nj': 'Nj',
+               'ǰ': 'ǰ',
+               'Dz': 'Dz',
+               'dz': 'Dz',
+               'ʝ': 'Ʝ',
+               'ͅ': 'ͅ',
+               'ΐ': 'ΐ',
+               'ΰ': 'ΰ',
+               'և': 'և',
+               'ᏸ': 'Ᏸ',
+               'ᏹ': 'Ᏹ',
+               'ᏺ': 'Ᏺ',
+               'ᏻ': 'Ᏻ',
+               'ᏼ': 'Ᏼ',
+               'ᏽ': 'Ᏽ',
+               'ẖ': 'ẖ',
+               'ẗ': 'ẗ',
+               'ẘ': 'ẘ',
+               'ẙ': 'ẙ',
+               'ẚ': 'ẚ',
+               'ὐ': 'ὐ',
+               'ὒ': 'ὒ',
+               'ὔ': 'ὔ',
+               'ὖ': 'ὖ',
+               'ᾀ': 'ᾈ',
+               'ᾁ': 'ᾉ',
+               'ᾂ': 'ᾊ',
+               'ᾃ': 'ᾋ',
+               'ᾄ': 'ᾌ',
+               'ᾅ': 'ᾍ',
+               'ᾆ': 'ᾎ',
+               'ᾇ': 'ᾏ',
+               'ᾈ': 'ᾈ',
+               'ᾉ': 'ᾉ',
+               'ᾊ': 'ᾊ',
+               'ᾋ': 'ᾋ',
+               'ᾌ': 'ᾌ',
+               'ᾍ': 'ᾍ',
+               'ᾎ': 'ᾎ',
+               'ᾏ': 'ᾏ',
+               'ᾐ': 'ᾘ',
+               'ᾑ': 'ᾙ',
+               'ᾒ': 'ᾚ',
+               'ᾓ': 'ᾛ',
+               'ᾔ': 'ᾜ',
+               'ᾕ': 'ᾝ',
+               'ᾖ': 'ᾞ',
+               'ᾗ': 'ᾟ',
+               'ᾘ': 'ᾘ',
+               'ᾙ': 'ᾙ',
+               'ᾚ': 'ᾚ',
+               'ᾛ': 'ᾛ',
+               'ᾜ': 'ᾜ',
+               'ᾝ': 'ᾝ',
+               'ᾞ': 'ᾞ',
+               'ᾟ': 'ᾟ',
+               'ᾠ': 'ᾨ',
+               'ᾡ': 'ᾩ',
+               'ᾢ': 'ᾪ',
+               'ᾣ': 'ᾫ',
+               'ᾤ': 'ᾬ',
+               'ᾥ': 'ᾭ',
+               'ᾦ': 'ᾮ',
+               'ᾧ': 'ᾯ',
+               'ᾨ': 'ᾨ',
+               'ᾩ': 'ᾩ',
+               'ᾪ': 'ᾪ',
+               'ᾫ': 'ᾫ',
+               'ᾬ': 'ᾬ',
+               'ᾭ': 'ᾭ',
+               'ᾮ': 'ᾮ',
+               'ᾯ': 'ᾯ',
+               'ᾲ': 'ᾲ',
+               'ᾳ': 'ᾼ',
+               'ᾴ': 'ᾴ',
+               'ᾶ': 'ᾶ',
+               'ᾷ': 'ᾷ',
+               'ᾼ': 'ᾼ',
+               'ῂ': 'ῂ',
+               'ῃ': 'ῌ',
+               'ῄ': 'ῄ',
+               'ῆ': 'ῆ',
+               'ῇ': 'ῇ',
+               'ῌ': 'ῌ',
+               'ῒ': 'ῒ',
+               'ΐ': 'ΐ',
+               'ῖ': 'ῖ',
+               'ῗ': 'ῗ',
+               'ῢ': 'ῢ',
+               'ΰ': 'ΰ',
+               'ῤ': 'ῤ',
+               'ῦ': 'ῦ',
+               'ῧ': 'ῧ',
+               'ῲ': 'ῲ',
+               'ῳ': 'ῼ',
+               'ῴ': 'ῴ',
+               'ῶ': 'ῶ',
+               'ῷ': 'ῷ',
+               'ῼ': 'ῼ',
+               'ⅰ': 'ⅰ',
+               'ⅱ': 'ⅱ',
+               'ⅲ': 'ⅲ',
+               'ⅳ': 'ⅳ',
+               'ⅴ': 'ⅴ',
+               'ⅵ': 'ⅵ',
+               'ⅶ': 'ⅶ',
+               'ⅷ': 'ⅷ',
+               'ⅸ': 'ⅸ',
+               'ⅹ': 'ⅹ',
+               'ⅺ': 'ⅺ',
+               'ⅻ': 'ⅻ',
+               'ⅼ': 'ⅼ',
+               'ⅽ': 'ⅽ',
+               'ⅾ': 'ⅾ',
+               'ⅿ': 'ⅿ',
+               'ⓐ': 'ⓐ',
+               'ⓑ': 'ⓑ',
+               'ⓒ': 'ⓒ',
+               'ⓓ': 'ⓓ',
+               'ⓔ': 'ⓔ',
+               'ⓕ': 'ⓕ',
+               'ⓖ': 'ⓖ',
+               'ⓗ': 'ⓗ',
+               'ⓘ': 'ⓘ',
+               'ⓙ': 'ⓙ',
+               'ⓚ': 'ⓚ',
+               'ⓛ': 'ⓛ',
+               'ⓜ': 'ⓜ',
+               'ⓝ': 'ⓝ',
+               'ⓞ': 'ⓞ',
+               'ⓟ': 'ⓟ',
+               'ⓠ': 'ⓠ',
+               'ⓡ': 'ⓡ',
+               'ⓢ': 'ⓢ',
+               'ⓣ': 'ⓣ',
+               'ⓤ': 'ⓤ',
+               'ⓥ': 'ⓥ',
+               'ⓦ': 'ⓦ',
+               'ⓧ': 'ⓧ',
+               'ⓨ': 'ⓨ',
+               'ⓩ': 'ⓩ',
+               'ꞵ': 'Ꞵ',
+               'ꞷ': 'Ꞷ',
+               'ꭓ': 'Ꭓ',
+               'ꭰ': 'Ꭰ',
+               'ꭱ': 'Ꭱ',
+               'ꭲ': 'Ꭲ',
+               'ꭳ': 'Ꭳ',
+               'ꭴ': 'Ꭴ',
+               'ꭵ': 'Ꭵ',
+               'ꭶ': 'Ꭶ',
+               'ꭷ': 'Ꭷ',
+               'ꭸ': 'Ꭸ',
+               'ꭹ': 'Ꭹ',
+               'ꭺ': 'Ꭺ',
+               'ꭻ': 'Ꭻ',
+               'ꭼ': 'Ꭼ',
+               'ꭽ': 'Ꭽ',
+               'ꭾ': 'Ꭾ',
+               'ꭿ': 'Ꭿ',
+               'ꮀ': 'Ꮀ',
+               'ꮁ': 'Ꮁ',
+               'ꮂ': 'Ꮂ',
+               'ꮃ': 'Ꮃ',
+               'ꮄ': 'Ꮄ',
+               'ꮅ': 'Ꮅ',
+               'ꮆ': 'Ꮆ',
+               'ꮇ': 'Ꮇ',
+               'ꮈ': 'Ꮈ',
+               'ꮉ': 'Ꮉ',
+               'ꮊ': 'Ꮊ',
+               'ꮋ': 'Ꮋ',
+               'ꮌ': 'Ꮌ',
+               'ꮍ': 'Ꮍ',
+               'ꮎ': 'Ꮎ',
+               'ꮏ': 'Ꮏ',
+               'ꮐ': 'Ꮐ',
+               'ꮑ': 'Ꮑ',
+               'ꮒ': 'Ꮒ',
+               'ꮓ': 'Ꮓ',
+               'ꮔ': 'Ꮔ',
+               'ꮕ': 'Ꮕ',
+               'ꮖ': 'Ꮖ',
+               'ꮗ': 'Ꮗ',
+               'ꮘ': 'Ꮘ',
+               'ꮙ': 'Ꮙ',
+               'ꮚ': 'Ꮚ',
+               'ꮛ': 'Ꮛ',
+               'ꮜ': 'Ꮜ',
+               'ꮝ': 'Ꮝ',
+               'ꮞ': 'Ꮞ',
+               'ꮟ': 'Ꮟ',
+               'ꮠ': 'Ꮠ',
+               'ꮡ': 'Ꮡ',
+               'ꮢ': 'Ꮢ',
+               'ꮣ': 'Ꮣ',
+               'ꮤ': 'Ꮤ',
+               'ꮥ': 'Ꮥ',
+               'ꮦ': 'Ꮦ',
+               'ꮧ': 'Ꮧ',
+               'ꮨ': 'Ꮨ',
+               'ꮩ': 'Ꮩ',
+               'ꮪ': 'Ꮪ',
+               'ꮫ': 'Ꮫ',
+               'ꮬ': 'Ꮬ',
+               'ꮭ': 'Ꮭ',
+               'ꮮ': 'Ꮮ',
+               'ꮯ': 'Ꮯ',
+               'ꮰ': 'Ꮰ',
+               'ꮱ': 'Ꮱ',
+               'ꮲ': 'Ꮲ',
+               'ꮳ': 'Ꮳ',
+               'ꮴ': 'Ꮴ',
+               'ꮵ': 'Ꮵ',
+               'ꮶ': 'Ꮶ',
+               'ꮷ': 'Ꮷ',
+               'ꮸ': 'Ꮸ',
+               'ꮹ': 'Ꮹ',
+               'ꮺ': 'Ꮺ',
+               'ꮻ': 'Ꮻ',
+               'ꮼ': 'Ꮼ',
+               'ꮽ': 'Ꮽ',
+               'ꮾ': 'Ꮾ',
+               'ꮿ': 'Ꮿ',
+               'ff': 'ff',
+               'fi': 'fi',
+               'fl': 'fl',
+               'ffi': 'ffi',
+               'ffl': 'ffl',
+               'ſt': 'ſt',
+               'st': 'st',
+               'ﬓ': 'ﬓ',
+               'ﬔ': 'ﬔ',
+               'ﬕ': 'ﬕ',
+               'ﬖ': 'ﬖ',
+               'ﬗ': 'ﬗ'
+       };
+       mw.Title.phpCharToUpper = function ( chr ) {
+               var mapped = toUpperMapping[ chr ];
+               return mapped || chr.toUpperCase();
+       };
+}( mediaWiki ) );
index 03df086..72ce9f0 100644 (file)
@@ -1,7 +1,7 @@
 .mw-upload-bookletLayout-filePreview {
        width: 100%;
        height: 1em;
-       background-color: #eee;
+       background-color: #eaecf0;
        background-size: cover;
        background-position: center center;
        padding: 1.5em;
@@ -20,7 +20,7 @@
 }
 
 .mw-upload-bookletLayout-filePreview .oo-ui-progressBarWidget {
-       border: none;
+       border: 0;
        border-radius: 0;
        background-color: transparent;
        position: absolute;
@@ -30,6 +30,5 @@
 }
 
 .mw-upload-bookletLayout-filePreview .oo-ui-progressBarWidget-bar {
-       background-color: #36c;
        height: 0.5em;
-}
\ No newline at end of file
+}
index 100714a..172cac2 100644 (file)
 
                return this.upload.getApi().then(
                        function ( api ) {
-                               return $.when(
-                                       booklet.upload.loadConfig().then(
-                                               null,
-                                               function ( errorMsg ) {
-                                                       booklet.getPage( 'upload' ).$element.msg( errorMsg );
-                                                       return $.Deferred().resolve();
-                                               }
-                                       ),
-                                       // If the user can't upload anything, don't give them the option to.
-                                       api.getUserInfo().then( function ( userInfo ) {
+                               // If the user can't upload anything, don't give them the option to.
+                               return api.getUserInfo().then(
+                                       function ( userInfo ) {
                                                if ( userInfo.rights.indexOf( 'upload' ) === -1 ) {
-                                                       // TODO Use a better error message when not all logged-in users can upload
-                                                       booklet.getPage( 'upload' ).$element.msg( 'api-error-mustbeloggedin' );
+                                                       if ( mw.user.isAnon() ) {
+                                                               booklet.getPage( 'upload' ).$element.msg( 'apierror-mustbeloggedin', mw.msg( 'action-upload' ) );
+                                                       } else {
+                                                               booklet.getPage( 'upload' ).$element.msg( 'apierror-permissiondenied', mw.msg( 'action-upload' ) );
+                                                       }
                                                }
                                                return $.Deferred().resolve();
-                                       } )
-                               ).then(
-                                       null,
+                                       },
                                        // Always resolve, never reject
                                        function () { return $.Deferred().resolve(); }
                                );
         * @return {mw.Upload} Upload model
         */
        mw.Upload.BookletLayout.prototype.createUpload = function () {
-               return new mw.Upload();
+               return new mw.Upload( {
+                       parameters: {
+                               errorformat: 'html',
+                               errorlang: mw.config.get( 'wgUserLanguage' ),
+                               errorsuselocal: 1,
+                               formatversion: 2
+                       }
+               } );
        };
 
        /* Uploading */
         * @return {jQuery.Promise} A Promise that will be resolved with an OO.ui.Error.
         */
        mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
-               var message,
-                       state = this.upload.getState(),
+               var state = this.upload.getState(),
                        stateDetails = this.upload.getStateDetails(),
-                       error = stateDetails.error,
-                       warnings = stateDetails.upload && stateDetails.upload.warnings;
+                       error = stateDetails.errors ? stateDetails.errors[ 0 ] : false,
+                       warnings = stateDetails.upload && stateDetails.upload.warnings,
+                       $ul = $( '<ul>' );
 
                if ( state === mw.Upload.State.ERROR ) {
                        if ( !error ) {
                                // If there's an 'exception' key, this might be a timeout, or other connection problem
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
+                                       $( '<p>' ).msg( 'apierror-unknownerror', JSON.stringify( stateDetails ) ),
                                        { recoverable: false }
                                ) );
                        }
 
-                       // Errors in this format are produced by TitleBlacklist and AbuseFilter. Perhaps other
-                       // extensions will follow this format in the future.
-                       if ( error.message ) {
-                               return this.upload.getApi()
-                                       .then( function ( api ) {
-                                               // 'amenableparser' will expand templates and parser functions server-side.
-                                               // We still do the rest of wikitext parsing here (through jqueryMsg).
-                                               return api.loadMessagesIfMissing( [ error.message.key ], { amenableparser: true } )
-                                                       .then( function () {
-                                                               if ( !mw.message( error.message.key ).exists() ) {
-                                                                       return $.Deferred().reject();
-                                                               }
-                                                               return new OO.ui.Error(
-                                                                       $( '<p>' ).msg( error.message.key, error.message.params || [] ),
-                                                                       { recoverable: false }
-                                                               );
-                                                       } );
-                                       } )
-                                       .then( null, function () {
-                                               // We failed when loading the error message, or it doesn't actually exist, fall back
-                                               return $.Deferred().resolve( new OO.ui.Error(
-                                                       $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } );
-                       }
-
-                       if ( error.code === 'protectedpage' ) {
-                               message = mw.message( 'protectedpagetext' );
-                       } else {
-                               message = mw.message( 'api-error-' + error.code );
-                               if ( !message.exists() ) {
-                                       message = mw.message( 'api-error-unknownerror', JSON.stringify( stateDetails ) );
-                               }
-                       }
                        return $.Deferred().resolve( new OO.ui.Error(
-                               $( '<p>' ).append( message.parseDom() ),
+                               $( '<p>' ).html( error.html ),
                                { recoverable: false }
                        ) );
                }
                        // We could get more than one of these errors, these are in order
                        // of importance. For example fixing the thumbnail like file name
                        // won't help the fact that the file already exists.
-                       if ( warnings.stashfailed !== undefined ) {
-                               return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-stashfailed' ),
-                                       { recoverable: false }
-                               ) );
-                       } else if ( warnings.exists !== undefined ) {
+                       if ( warnings.exists !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'fileexists', 'File:' + warnings.exists ),
                                        { recoverable: false }
                                        { recoverable: false }
                                ) );
                        } else if ( warnings.duplicate !== undefined ) {
+                               $.each( warnings.duplicate, function ( i, filename ) {
+                                       var $a = $( '<a>' ).text( filename ),
+                                               href = mw.Title.makeTitle( mw.config.get( 'wgNamespaceIds' ).file, filename ).getUrl( {} );
+
+                                       $a.attr( { href: href, target: '_blank' } );
+                                       $ul.append( $( '<li>' ).append( $a ) );
+                               } );
+
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-duplicate', warnings.duplicate.length ),
+                                       $( '<p>' ).msg( 'file-exists-duplicate', warnings.duplicate.length ).append( $ul ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings[ 'thumb-name' ] !== undefined ) {
                                ) );
                        } else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-duplicate-archive', 1 ),
+                                       $( '<p>' ).msg( 'file-deleted-duplicate', 'File:' + warnings[ 'duplicate-archive' ] ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings[ 'was-deleted' ] !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-was-deleted' ),
+                                       $( '<p>' ).msg( 'filewasdeleted', 'File:' + warnings[ 'was-deleted' ] ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings.badfilename !== undefined ) {
index 0c47dbe..95263ec 100644 (file)
                 *  override each other (`true`) or automagically convert them to an array (`false`).
                 */
                function Uri( uri, options ) {
-                       var prop,
+                       var prop, hrefCur,
+                               hasOptions = ( options !== undefined ),
                                defaultUri = getDefaultUri();
 
                        options = typeof options === 'object' ? options : { strictMode: !!options };
                                                this.query = {};
                                        }
                                }
+                       } else if ( hasOptions ) {
+                               // We didn't get a URI in the constructor, but we got options.
+                               hrefCur = typeof documentLocation === 'string' ? documentLocation : documentLocation();
+                               this.parse( hrefCur, options );
                        } else {
-                               // If we didn't get a URI in the constructor, use the default one.
+                               // We didn't get a URI or options in the constructor, use the default instance.
                                return defaultUri.clone();
                        }
 
index 365e988..9a5a66f 100644 (file)
@@ -33,7 +33,8 @@ div.apihelp-linktrail {
        width: 20em;
 }
 
-.apihelp-deprecated, .apihelp-flag-deprecated,
+.apihelp-deprecated,
+.apihelp-flag-deprecated,
 .apihelp-flag-internal strong {
        font-weight: bold;
        color: #f00;
@@ -68,7 +69,7 @@ div.apihelp-linktrail {
 }
 
 .apihelp-parameters dt:after {
-       content: ':\A0'
+       content: ':\A0';
 }
 
 .apihelp-parameters dd {
index 3cca6eb..dec0571 100644 (file)
@@ -8,7 +8,7 @@
                padding: 0;
                margin: 0;
                background: none;
-               border: none;
+               border: 0;
        }
 
        table {
@@ -37,7 +37,7 @@
                tr {
                        background-color: #fff;
 
-                       &:nth-child(even) {
+                       &:nth-child( even ) {
                                background-color: #f9f9f9;
                        }
                }
@@ -63,9 +63,6 @@
        display: inline-block;
        padding: 10px 5px;
        font-size: 13px;
-       /* IE-hack for display: inline-block */
-       zoom: 1;
-       *display: inline;
 }
 
 .mw-debug-panelink {
@@ -185,6 +182,6 @@ a.mw-debug-panelabel:visited {
 }
 
 /* Cheapo hack to hide the first 3 lines of the backtrace */
-.mw-debug-backtrace li:nth-child(-n+3) {
+.mw-debug-backtrace li:nth-child( -n+3 ) {
        display: none;
 }
index 327c9c8..af9eb36 100644 (file)
@@ -2,7 +2,7 @@
  * Diff rendering
  */
 table.diff {
-       border: none;
+       border: 0;
        border-spacing: 4px;
        margin: 0;
        width: 100%;
index c392f2a..6a93fdd 100644 (file)
@@ -1,7 +1,7 @@
 .feedback-spinner {
        display: inline-block;
        zoom: 1;
-       *display: inline; /* IE7 and below */
+       *display: inline; /* IE7 and below */ /* stylelint-disable declaration-block-no-duplicate-properties */
        /* @embed */
        background: url( mediawiki.feedback.spinner.gif );
        width: 18px;
index 1662f0f..5a37f45 100644 (file)
        display: inline;
 }
 /* Display nested lists inline */
-.hlist dl dl, .hlist dl ol, .hlist dl ul,
-.hlist ol dl, .hlist ol ol, .hlist ol ul,
-.hlist ul dl, .hlist ul ol, .hlist ul ul {
+.hlist dl dl,
+.hlist dl ol,
+.hlist dl ul,
+.hlist ol dl,
+.hlist ol ol,
+.hlist ol ul,
+.hlist ul dl,
+.hlist ul ol,
+.hlist ul ul {
        display: inline;
 }
 /* Generate interpuncts */
        content: none;
 }
 /* Add parentheses around nested lists */
-.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,
-.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,
-.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {
+.hlist dd dd:first-child:before,
+.hlist dd dt:first-child:before,
+.hlist dd li:first-child:before,
+.hlist dt dd:first-child:before,
+.hlist dt dt:first-child:before,
+.hlist dt li:first-child:before,
+.hlist li dd:first-child:before,
+.hlist li dt:first-child:before,
+.hlist li li:first-child:before {
        content: "(";
        font-weight: normal;
 }
-.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,
-.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,
-.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {
+.hlist dd dd:last-child:after,
+.hlist dd dt:last-child:after,
+.hlist dd li:last-child:after,
+.hlist dt dd:last-child:after,
+.hlist dt dt:last-child:after,
+.hlist dt li:last-child:after,
+.hlist li dd:last-child:after,
+.hlist li dt:last-child:after,
+.hlist li li:last-child:after {
        content: ")";
        font-weight: normal;
 }
 /* For IE8 */
-.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,
-.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,
-.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {
+.hlist dd dd.hlist-last-child:after,
+.hlist dd dt.hlist-last-child:after,
+.hlist dd li.hlist-last-child:after,
+.hlist dt dd.hlist-last-child:after,
+.hlist dt dt.hlist-last-child:after,
+.hlist dt li.hlist-last-child:after,
+.hlist li dd.hlist-last-child:after,
+.hlist li dt.hlist-last-child:after,
+.hlist li li.hlist-last-child:after {
        content: ")";
        font-weight: normal;
 }
index fceeb64..7872818 100644 (file)
@@ -8,6 +8,7 @@
  * @singleton
  */
 
+/* global mwNow */
 /* eslint-disable no-use-before-define */
 
 ( function ( $ ) {
                 *
                 * @return {number} Current time
                 */
-               now: ( 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(); };
-               }() ),
+               now: mwNow,
+               // mwNow is defined in startup.js
 
                /**
                 * Format a string. Replace $1, $2 ... $N with positional arguments.
                                        el.media = media;
                                }
                                // If you end up here from an IE exception "SCRIPT: Invalid property value.",
-                               // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
+                               // see #addEmbeddedCSS, T33676, and T49277 for details.
                                el.href = url;
 
                                $( getMarker() ).before( el );
                                 *     { <media>: css }
                                 *     { <media>: [url, ..] }
                                 *
-                                * The reason css strings are not concatenated anymore is bug 31676. We now check
+                                * The reason css strings are not concatenated anymore is T33676. We now check
                                 * whether it's safe to extend the stylesheet.
                                 *
                                 * @protected
                                                                // 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 bug 41331.
+                                                               // URL set though attributes - when on HTTPS. See T43331.
                                                                l = document.createElement( 'link' );
                                                                l.rel = 'stylesheet';
                                                                l.href = modules;
                                        // Whether the store is in use on this page.
                                        enabled: null,
 
+                                       // Modules whose string representation exceeds 100 kB are
+                                       // ineligible for storage. See bug T66721.
                                        MODULE_SIZE_MAX: 100 * 1000,
 
                                        // The contents of the store, mapping '[name]@[version]' keys
                        return $.when.apply( $, all );
                } );
                loading.then( function () {
+                       /* global mwPerformance */
                        mwPerformance.mark( 'mwLoadEnd' );
                        mw.hook( 'resourceloader.loadEnd' ).fire();
                } );
index 926f8c5..4849f5a 100644 (file)
@@ -71,6 +71,7 @@
                $notificationContent.appendTo( $notification );
 
                // Private state parameters, meant for internal use only
+               // autoHideSeconds: String alias for number of seconds for timeout of auto-hiding notifications.
                // isOpen: Set to true after .start() is called to avoid double calls.
                //         Set back to false after .close() to avoid duplicating the close animation.
                // isPaused: false after .resume(), true after .pause(). Avoids duplicating or breaking the hide timeouts.
@@ -79,6 +80,9 @@
                //          to stop replacement of a tagged notification with another notification using the same message.
                // options: The options passed to the notification with a little sanitization. Used by various methods.
                // $notification: jQuery object containing the notification DOM node.
+               this.autoHideSeconds = options.autoHideSeconds &&
+                       notification.autoHideSeconds[ options.autoHideSeconds ] ||
+                       notification.autoHideSeconds.short;
                this.isOpen = false;
                this.isPaused = true;
                this.message = message;
                                // Already finished, so don't try to re-clear it
                                delete notif.timeout;
                                notif.close();
-                       }, notification.autoHideSeconds * 1000 );
+                       }, this.autoHideSeconds * 1000 );
                }
        };
 
         * @ignore
         */
        function init() {
-               var offset, $window = $( window );
+               var offset,
+                       isFloating = false;
 
                $area = $( '<div id="mw-notification-area" class="mw-notification-area mw-notification-area-layout"></div>' )
                        // Pause auto-hide timers when the mouse is in the notification area.
                $area.hide();
 
                function updateAreaMode() {
-                       var isFloating = $window.scrollTop() > offset.top;
+                       var shouldFloat = window.pageYOffset > offset.top;
+                       if ( isFloating === shouldFloat ) {
+                               return;
+                       }
+                       isFloating = shouldFloat;
                        $area
                                .toggleClass( 'mw-notification-area-floating', isFloating )
                                .toggleClass( 'mw-notification-area-layout', !isFloating );
                }
 
-               $window.on( 'scroll', updateAreaMode );
+               $( window ).on( 'scroll', updateAreaMode );
 
                // Initial mode
                updateAreaMode();
                 *   A boolean indicating whether the notifification should automatically
                 *   be hidden after shown. Or if it should persist.
                 *
+                * - autoHideSeconds:
+                *   Key to #autoHideSeconds for number of seconds for timeout of auto-hide
+                *   notifications.
+                *
                 * - tag:
                 *   An optional string. When a notification is tagged only one message
                 *   with that tag will be displayed. Trying to display a new notification
                 */
                defaults: {
                        autoHide: true,
+                       autoHideSeconds: 'short',
                        tag: false,
                        title: undefined,
                        type: false
                },
 
                /**
-                * @property {number}
-                * Number of seconds to wait before auto-hiding notifications.
+                * @private
+                * @property {Object}
                 */
-               autoHideSeconds: 5,
+               autoHideSeconds: {
+                       'short': 5,
+                       'long': 30
+               },
 
                /**
                 * @property {number}
-                * Maximum number of notifications to count down auto-hide timers for.
-                * Only the first #autoHideLimit notifications being displayed will
-                * auto-hide. Any notifications further down in the list will only start
-                * counting down to auto-hide after the first few messages have closed.
+                * Maximum number of simultaneous notifications to start auto-hide timers for.
+                * Only this number of notifications being displayed will be auto-hidden at one time.
+                * Any additional notifications in the list will only start counting their timeout for
+                * auto-hiding after the previous messages have been closed.
                 *
-                * This basically represents the number of notifications the user should
-                * be able to process in #autoHideSeconds time.
+                * This basically represents the minimal number of notifications the user should
+                * be able to process during the {@link #defaults default} #autoHideSeconds time.
                 */
                autoHideLimit: 3
        };
index b58cb69..d414232 100644 (file)
@@ -1,8 +1,3 @@
-/*!
- * An interface for scheduling background tasks.
- *
- * Loosely based on https://w3c.github.io/requestidlecallback/
- */
 ( function ( mw ) {
        var maxBusy = 50;
 
        /**
         * Schedule a deferred task to run in the background.
         *
+        * This allows code to perform tasks in the main thread without impacting
+        * time-critical operations such as animations and response to input events.
+        *
+        * Basic logic is as follows:
+        *
+        * - User input event should be acknowledged within 100ms per [RAIL].
+        * - Idle work should be grouped in blocks of upto 50ms so that enough time
+        *   remains for the event handler to execute and any rendering to take place.
+        * - Whenever a native event happens (e.g. user input), the deadline for any
+        *   running idle callback drops to 0.
+        * - As long as the deadline is non-zero, other callbacks pending may be
+        *   executed in the same idle period.
+        *
+        * See also:
+        *
+        * - <https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback>
+        * - <https://w3c.github.io/requestidlecallback/>
+        * - <https://developers.google.com/web/updates/2015/08/using-requestidlecallback>
+        * [RAIL]: https://developers.google.com/web/fundamentals/performance/rail
+        *
         * @member mw
         * @param {Function} callback
+        * @param {Object} [options]
+        * @param {number} [options.timeout] If set, the callback will be scheduled for
+        *  immediate execution after this amount of time (in milliseconds) if it didn't run
+        *  by that time.
         */
        mw.requestIdleCallback = mw.requestIdleCallbackInternal;
        /*
index cbbd254..bcb6c33 100644 (file)
@@ -4,12 +4,12 @@
 ( function ( mw, $ ) {
        mw.searchSuggest = {
                // queries the wiki and calls response with the result
-               request: function ( api, query, response, maxRows ) {
+               request: function ( api, query, response, maxRows, namespace ) {
                        return api.get( {
                                formatversion: 2,
                                action: 'opensearch',
                                search: query,
-                               namespace: 0,
+                               namespace: namespace || 0,
                                limit: maxRows,
                                suggest: true
                        } ).done( function ( data, jqXHR ) {
@@ -22,7 +22,7 @@
        };
 
        $( function () {
-               var api, map, searchboxesSelectors,
+               var api, searchboxesSelectors,
                        // Region where the suggestions box will appear directly below
                        // (using the same width). Can be a container element or the input
                        // itself, depending on what suits best in the environment.
                        $searchInput = $( '#searchInput' ),
                        previousSearchText = $searchInput.val();
 
-               // Compatibility map
-               map = {
-                       // SimpleSearch is broken in Opera < 9.6
-                       opera: [ [ '>=', 9.6 ] ],
-                       // Older Konquerors are unable to position the suggestions correctly (bug 50805)
-                       konqueror: [ [ '>=', '4.11' ] ],
-                       docomo: false,
-                       blackberry: false,
-                       // Support for iOS 6 or higher. It has not been tested on iOS 5 or lower
-                       ipod: [ [ '>=', 6 ] ],
-                       iphone: [ [ '>=', 6 ] ]
-               };
-
-               if ( !$.client.test( map ) ) {
-                       return;
-               }
-
                // Compute form data for search suggestions functionality.
                function getFormData( context ) {
                        var $form, baseHref, linkParams;
                                cache: true,
                                highlightInput: true
                        } )
-                       .bind( 'paste cut drop', function () {
+                       .on( 'paste cut drop', function () {
                                // make sure paste and cut events from the mouse and drag&drop events
                                // trigger the keypress handler and cause the suggestions to update
                                $( this ).trigger( 'keypress' );
index a9d17ff..2e09392 100644 (file)
@@ -1,65 +1,93 @@
 ( function ( mw ) {
        'use strict';
 
-       /**
-        * Library for storing device specific information. It should be used for storing simple
-        * strings and is not suitable for storing large chunks of data.
-        *
-        * @class mw.storage
-        * @singleton
-        */
-       mw.storage = {
-
-               localStorage: ( function () {
-                       // Catch exceptions to avoid fatal in Chrome's "Block data storage" mode
-                       // which throws when accessing the localStorage property itself, as opposed
-                       // to the standard behaviour of throwing on getItem/setItem. (T148998)
+       // Catch exceptions to avoid fatal in Chrome's "Block data storage" mode
+       // which throws when accessing the localStorage property itself, as opposed
+       // to the standard behaviour of throwing on getItem/setItem. (T148998)
+       var
+               localStorage = ( function () {
                        try {
                                return window.localStorage;
                        } catch ( e ) {}
                }() ),
-
-               /**
-                * Retrieve value from device storage.
-                *
-                * @param {string} key Key of item to retrieve
-                * @return {string|boolean} False when localStorage not available, otherwise string
-                */
-               get: function ( key ) {
+               sessionStorage = ( function () {
                        try {
-                               return mw.storage.localStorage.getItem( key );
+                               return window.sessionStorage;
                        } catch ( e ) {}
-                       return false;
-               },
+               }() );
 
-               /**
-                 * 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: function ( key, value ) {
-                       try {
-                               mw.storage.localStorage.setItem( key, value );
-                               return true;
-                       } catch ( e ) {}
-                       return false;
-               },
+       /**
+        * A wrapper for an HTML5 Storage interface (`localStorage` or `sessionStorage`)
+        * that is safe to call on all browsers.
+        *
+        * @class mw.SafeStorage
+        * @private
+        * @param {Object|undefined} store The Storage instance to wrap around
+        */
+       function SafeStorage( store ) {
+               this.store = store;
+       }
 
-               /**
-                 * Remove a value from device storage.
-                 *
-                 * @param {string} key Key of item to remove
-                 * @return {boolean} Whether the save succeeded or not
-                 */
-               remove: function ( key ) {
-                       try {
-                               mw.storage.localStorage.removeItem( key );
-                               return true;
-                       } catch ( e ) {}
-                       return false;
-               }
+       /**
+        * Retrieve value from device storage.
+        *
+        * @param {string} key Key of item to retrieve
+        * @return {string|boolean} False when localStorage not available, otherwise string
+        */
+       SafeStorage.prototype.get = function ( key ) {
+               try {
+                       return this.store.getItem( key );
+               } catch ( e ) {}
+               return false;
        };
 
+       /**
+         * 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 );
+                       return true;
+               } catch ( e ) {}
+               return false;
+       };
+
+       /**
+         * 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 );
+                       return true;
+               } catch ( e ) {}
+               return false;
+       };
+
+       /**
+        * A wrapper for the HTML5 `localStorage` interface
+        * that is safe to call on all browsers.
+        *
+        * @class
+        * @singleton
+        * @extends mw.SafeStorage
+        */
+       mw.storage = new SafeStorage( localStorage );
+
+       /**
+        * A wrapper for the HTML5 `sessionStorage` interface
+        * that is safe to call on all browsers.
+        *
+        * @class
+        * @singleton
+        * @extends mw.SafeStorage
+        */
+       mw.storage.session = new SafeStorage( sessionStorage );
+
 }( mediaWiki ) );
index a8188db..78634f6 100644 (file)
                        }
 
                        // Update tooltip for the access key after inserting into DOM
-                       // to get a localized access key label (bug 67946).
+                       // to get a localized access key label (T69946).
                        $link.updateTooltipAccessKeys();
 
                        return $item[ 0 ];
index 094c4df..3cb8e9d 100644 (file)
@@ -26,7 +26,7 @@
                // Initialize
                this.drawCarousel();
                this.setSizeRequirement();
-               this.toggleThumbnails( false );
+               this.toggleThumbnails( !!this.$gallery.attr( 'data-showthumbnails' ) );
                this.showCurrentImage();
 
                // Events
                        .removeAttr( 'height' );
 
                // Stretch image to take up the required size
-               if ( this.$thumbnail.width() > this.$thumbnail.height() ) {
-                       this.$img.attr( 'width', this.imageWidth + 'px' );
-               } else {
-                       this.$img.attr( 'height', this.imageHeight + 'px' );
-               }
+               this.$img.attr( 'height', ( this.imageHeight - this.$imgCaption.outerHeight() ) + 'px' );
 
                // Make the image smaller in case the current image
                // size is larger than the original file size.
                var imageLi = this.getCurrentImage(),
                        caption = imageLi.find( '.gallerytext' );
 
-               // Highlight current thumbnail
+               // The order of the following is important for size calculations
+               // 1. Highlight current thumbnail
                this.$gallery
                        .find( '.gallerybox.slideshow-current' )
                        .removeClass( 'slideshow-current' );
                imageLi.addClass( 'slideshow-current' );
 
-               // Show thumbnail stretched to the right size while the image loads
+               // 2. Show thumbnail
                this.$thumbnail = imageLi.find( 'img' );
                this.$img.attr( 'src', this.$thumbnail.attr( 'src' ) );
                this.$img.attr( 'alt', this.$thumbnail.attr( 'alt' ) );
                this.$imgLink.attr( 'href', imageLi.find( 'a' ).eq( 0 ).attr( 'href' ) );
-               this.setImageSize();
 
-               // Copy caption
+               // 3. Copy caption
                this.$imgCaption
                        .empty()
                        .append( caption.clone() );
 
-               // Load image at the required size
+               // 4. Stretch thumbnail to correct size
+               this.setImageSize();
+
+               // 5. Load image at the required size
                this.loadImage( this.$thumbnail ).done( function ( info, $img ) {
                        // Show this image to the user only if its still the current one
                        if ( this.$thumbnail.attr( 'src' ) === $img.attr( 'src' ) ) {
index 474d541..31def27 100644 (file)
@@ -28,8 +28,8 @@ li.gallerycaption {
 
 li.gallerybox div.thumb {
        text-align: center;
-       border: 1px solid #ccc;
-       background-color: #f9f9f9;
+       border: 1px solid #c8ccd1;
+       background-color: #f8f9fa;
        margin: 2px;
 }
 
@@ -58,7 +58,7 @@ div.gallerytext {
 /* new gallery stuff */
 ul.mw-gallery-nolines li.gallerybox div.thumb {
        background-color: transparent;
-       border: none;
+       border: 0;
 }
 
 ul.mw-gallery-nolines li.gallerybox div.gallerytext {
@@ -71,7 +71,7 @@ ul.mw-gallery-packed li.gallerybox div.thumb,
 ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
 ul.mw-gallery-packed-hover li.gallerybox div.thumb {
        background-color: transparent;
-       border: none;
+       border: 0;
 }
 
 ul.mw-gallery-packed li.gallerybox div.thumb img,
@@ -95,7 +95,7 @@ ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
 ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
        position: absolute;
        background: #fff;
-       background: rgba(255, 255, 255, 0.8);
+       background: rgba( 255, 255, 255, 0.8 );
        padding: 5px 10px;
        bottom: 0;
        left: 0; /* Needed for IE */
@@ -168,7 +168,7 @@ ul.gallery.mw-gallery-slideshow .mw-gallery-slideshow-buttons .oo-ui-buttonEleme
 }
 
 ul.mw-gallery-slideshow li.gallerybox div.thumb {
-       border: none;
+       border: 0;
        background: transparent;
 }
 
index 0c14865..80fc964 100644 (file)
@@ -3,7 +3,8 @@ li.gallerybox {
        display: inline-block;
 }
 
-ul.gallery, li.gallerybox {
+ul.gallery,
+li.gallerybox {
        zoom: 1;
        *display: inline;
 }
index 6038a57..6a7d0b9 100644 (file)
                        var page, url;
 
                        // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
-                       // We avoid using the URL in the link directly since it could have been manipulated (bug 66608)
+                       // We avoid using the URL in the link directly since it could have been manipulated (T68608)
                        page = Number( mw.util.getParamValue( 'page', this.href ) );
                        url = mw.util.getUrl( mw.config.get( 'wgPageName' ), { page: page } );
 
index cb46b11..d94b158 100644 (file)
@@ -30,6 +30,7 @@
                        $spinner = $.createSpinner( { size: 'small', type: 'inline' } );
                        $link.hide().after( $spinner );
 
+                       // @todo: data.messageHtml is no more. Convert to using errorformat=html.
                        api = new mw.Api();
                        api.rollback( page, user )
                                .then( function ( data ) {
index b860dbd..7d35cb7 100644 (file)
                $links = $links.filter( ':not( #bodyContent *, #content * )' );
 
                $links.click( function ( e ) {
-                       var action, api, $link;
+                       var mwTitle, action, api, $link;
 
+                       mwTitle = mw.Title.newFromText( title );
                        action = mwUriGetAction( this.href );
 
-                       if ( action !== 'watch' && action !== 'unwatch' ) {
+                       if ( !mwTitle || ( action !== 'watch' && action !== 'unwatch' ) ) {
                                // Let native browsing handle the link
                                return true;
                        }
 
                        api[ action ]( title )
                                .done( function ( watchResponse ) {
-                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
+                                       var message, otherAction = action === 'watch' ? 'unwatch' : 'watch';
 
-                                       mw.notify( $.parseHTML( watchResponse.message ), {
+                                       if ( mwTitle.getNamespaceId() > 0 && mwTitle.getNamespaceId() % 2 === 1 ) {
+                                               message = action === 'watch' ? 'addedwatchtext-talk' : 'removedwatchtext-talk';
+                                       } else {
+                                               message = action === 'watch' ? 'addedwatchtext' : 'removedwatchtext';
+                                       }
+
+                                       mw.notify( mw.message( message, mwTitle.getPrefixedText() ).parseDom(), {
                                                tag: 'watch-self'
                                        } );
 
                                        updateWatchLink( $link, otherAction );
 
                                        // Update the "Watch this page" checkbox on action=edit when the
-                                       // page is watched or unwatched via the tab (bug 12395).
-                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
+                                       // page is watched or unwatched via the tab (T14395).
+                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched === true );
                                } )
                                .fail( function () {
-                                       var cleanTitle, msg, link;
+                                       var msg, link;
 
                                        // Reset link to non-loading mode
                                        updateWatchLink( $link, action );
 
                                        // Format error message
-                                       cleanTitle = title.replace( /_/g, ' ' );
                                        link = mw.html.element(
                                                'a', {
                                                        href: mw.util.getUrl( title ),
-                                                       title: cleanTitle
-                                               }, cleanTitle
+                                                       title: mwTitle.getPrefixedText()
+                                               }, mwTitle.getPrefixedText()
                                        );
                                        msg = mw.message( 'watcherrortext', link );
 
index 0abb957..2b7ca16 100644 (file)
@@ -2,7 +2,7 @@
 // This affects English only (and languages without localisations, that fall back to English).
 // http://momentjs.com/docs/#/customization/long-date-formats/
 /* global moment */
-moment.locale( 'en', {
+moment.updateLocale( 'en', {
        longDateFormat: {
                // Unchanged, but have to be repeated here:
                LT: 'h:mm A',
index 13f26f0..8aba831 100644 (file)
@@ -2,7 +2,7 @@
 
 // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
 // wgTranslateNumerals is respected.
-moment.locale( moment.locale(), {
+moment.updateLocale( moment.locale(), {
        preparse: function ( s ) {
                var i,
                        table = mw.language.getDigitTransformTable();
index 99d9784..017d9fb 100644 (file)
@@ -1,4 +1,5 @@
 ( function ( mw ) {
+       var isMobile;
        // Connect OOjs UI to MediaWiki's localisation system
        OO.ui.getUserLanguages = mw.language.getFallbackLanguageChain;
        OO.ui.msg = mw.msg;
@@ -7,4 +8,10 @@
                mw.track( 'mw.deprecate', 'oojs-ui' );
                mw.log.warn( message );
        };
+       OO.ui.isMobile = function () {
+               if ( isMobile === undefined ) {
+                       isMobile = mw.config.get( 'skin' ) === 'minerva';
+               }
+               return isMobile;
+       };
 }( mediaWiki ) );
index f9cfecf..deb280a 100644 (file)
@@ -6,11 +6,19 @@
 
 /* global mw, $VARS, $CODE */
 
-// eslint-disable-next-line no-unused-vars
-var mediaWikiLoadStart = ( new Date() ).getTime(),
-       mwPerformance = ( window.performance && performance.mark ) ? performance : {
+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' );
 
@@ -21,17 +29,19 @@ mwPerformance.mark( 'mwLoadStart' );
  * - 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
+ * - Chrome 4+
  * - IE 9+
  * - Firefox 3.5+
- * - Safari 4+
+ * - Safari 5+
  * - Opera 10.5+
- * - Mobile Safari (iOS 1+)
+ * - Mobile Safari (iOS 4+)
  * - Android 2.0+
  *
  * Browsers we support in our no-javascript run-time (Grade C):
+ * - Chrome 1+
  * - IE 6+
  * - Firefox 3+
  * - Safari 3+
@@ -65,11 +75,15 @@ 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
                !(
-                       ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$/ ) ||
+                       ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$|googleweblight/ ) ||
                        ua.match( /PlayStation/i )
                )
        );
index c18f087..8922234 100644 (file)
@@ -11,11 +11,11 @@ Feature: Log in
 
   Scenario: Log in without entering credentials
     When I log in without entering credentials
-    Then error box should be visible
+    Then error message should be displayed for username
 
   Scenario: Log in without entering password
     When I log in without entering password
-    Then error box should be visible
+    Then error message should be displayed for password
 
   Scenario: Log in with incorrect username
     When I log in with incorrect username
index 9b35e99..14a2d76 100644 (file)
@@ -30,6 +30,14 @@ Then(/^error box should not be visible$/) do
   expect(on(LoginPage).error_message_element).not_to exist
 end
 
+Then(/^error message should be displayed for username$/) do
+  expect(on(LoginPage).username_error_element).to exist
+end
+
+Then(/^error message should be displayed for password$/) do
+  expect(on(LoginPage).password_error_element).to exist
+end
+
 Then(/^feedback should be (.+)$/) do |feedback|
   on(LoginPage) do |page|
     page.feedback_element.when_present.click
index 20e2744..de12aee 100644 (file)
@@ -4,5 +4,5 @@ class CreateAccountPage
   page_url '<%=params[:page_title]%>'
 
   button(:create_account, id: 'wpCreateaccount')
-  element(:error_message, css: 'div#userloginForm div.error')
+  element(:error_message, css: 'input#wpName2:required:invalid')
 end
index 4727318..c119b38 100644 (file)
@@ -10,10 +10,12 @@ class LoginPage
   button(:login, id: 'wpLoginAttempt')
   li(:logout, id: 'pt-logout')
   text_field(:password, id: 'wpPassword1')
+  element(:password_error, css: 'input#wpPassword1:required:invalid')
   a(:password_strength, text: 'password strength')
   a(:phishing, text: 'phishing')
   text_field(:username, id: 'wpName1')
   a(:username_displayed, title: /Your user page/)
+  element(:username_error, css: 'input#wpName1:required:invalid')
 
   def logged_in_as_element
     @browser.div(id: 'mw-content-text').p.b
index 53e724b..3733e60 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 
-use MediaWiki\MediaWikiServices;
-
 /**
  * Common code for test environment initialisation and teardown
  */
@@ -91,7 +89,7 @@ class TestSetup {
                ];
                $wgAuth = new MediaWiki\Auth\AuthManagerAuthPlugin();
 
-               // Bug 44192 Do not attempt to send a real e-mail
+               // T46192 Do not attempt to send a real e-mail
                Hooks::clear( 'AlternateUserMailer' );
                Hooks::register(
                        'AlternateUserMailer',
index 66df315..b67c9ab 100644 (file)
@@ -29,11 +29,13 @@ $wgAutoloadClasses += [
        # tests/common
        'TestSetup' => "$testDir/common/TestSetup.php",
 
+       # tests/integration
+       'MWHttpRequestTestCase' => "$testDir/integration/includes/http/MWHttpRequestTestCase.php",
+
        # tests/parser
        'DbTestPreviewer' => "$testDir/parser/DbTestPreviewer.php",
        'DbTestRecorder' => "$testDir/parser/DbTestRecorder.php",
        'DjVuSupport' => "$testDir/parser/DjVuSupport.php",
-       'TestRecorder' => "$testDir/parser/TestRecorder.php",
        'MultiTestRecorder' => "$testDir/parser/MultiTestRecorder.php",
        'ParserTestMockParser' => "$testDir/parser/ParserTestMockParser.php",
        'ParserTestRunner' => "$testDir/parser/ParserTestRunner.php",
diff --git a/tests/integration/includes/http/CurlHttpRequestTest.php b/tests/integration/includes/http/CurlHttpRequestTest.php
new file mode 100644 (file)
index 0000000..04f80f4
--- /dev/null
@@ -0,0 +1,5 @@
+<?php
+
+class CurlHttpRequestTest extends MWHttpRequestTestCase {
+       protected static $httpEngine = 'curl';
+}
diff --git a/tests/integration/includes/http/MWHttpRequestTestCase.php b/tests/integration/includes/http/MWHttpRequestTestCase.php
new file mode 100644 (file)
index 0000000..6d1fdf5
--- /dev/null
@@ -0,0 +1,243 @@
+<?php
+
+class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
+       protected static $httpEngine;
+       protected $oldHttpEngine;
+
+       public function setUp() {
+               parent::setUp();
+               $this->oldHttpEngine = Http::$httpEngine;
+               Http::$httpEngine = static::$httpEngine;
+
+               try {
+                       $request = MWHttpRequest::factory( 'null:' );
+               } catch ( DomainException $e ) {
+                       $this->markTestSkipped( static::$httpEngine . ' engine not supported' );
+               }
+
+               if ( static::$httpEngine === 'php' ) {
+                       $this->assertInstanceOf( PhpHttpRequest::class, $request );
+               } else {
+                       $this->assertInstanceOf( CurlHttpRequest::class, $request );
+               }
+       }
+
+       public function tearDown() {
+               parent::tearDown();
+               Http::$httpEngine = $this->oldHttpEngine;
+       }
+
+       // --------------------
+
+       public function testIsRedirect() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/get' );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertFalse( $request->isRedirect() );
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/redirect/1' );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertTrue( $request->isRedirect() );
+       }
+
+       public function testgetFinalUrl() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/redirect/3' );
+               if ( !$request->canFollowRedirects() ) {
+                       $this->markTestSkipped( 'cannot follow redirects' );
+               }
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertNotSame( 'http://httpbin.org/get', $request->getFinalUrl() );
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/redirect/3', [ 'followRedirects'
+                       => true ] );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertSame( 'http://httpbin.org/get', $request->getFinalUrl() );
+               $this->assertResponseFieldValue( 'url', 'http://httpbin.org/get', $request );
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/redirect/3', [ 'followRedirects'
+               => true ] );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertSame( 'http://httpbin.org/get', $request->getFinalUrl() );
+               $this->assertResponseFieldValue( 'url', 'http://httpbin.org/get', $request );
+
+               if ( static::$httpEngine === 'curl' ) {
+                       $this->markTestIncomplete( 'maxRedirects seems to be ignored by CurlHttpRequest' );
+                       return;
+               }
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/redirect/3', [ 'followRedirects'
+               => true, 'maxRedirects' => 1 ] );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertNotSame( 'http://httpbin.org/get', $request->getFinalUrl() );
+       }
+
+       public function testSetCookie() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/cookies' );
+               $request->setCookie( 'foo', 'bar' );
+               $request->setCookie( 'foo2', 'bar2', [ 'domain' => 'example.com' ] );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertResponseFieldValue( 'cookies', [ 'foo' => 'bar' ], $request );
+       }
+
+       public function testSetCookieJar() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/cookies' );
+               $cookieJar = new CookieJar();
+               $cookieJar->setCookie( 'foo', 'bar', [ 'domain' => 'httpbin.org' ] );
+               $cookieJar->setCookie( 'foo2', 'bar2', [ 'domain' => 'example.com' ] );
+               $request->setCookieJar( $cookieJar );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertResponseFieldValue( 'cookies', [ 'foo' => 'bar' ], $request );
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/cookies/set?foo=bar' );
+               $cookieJar = new CookieJar();
+               $request->setCookieJar( $cookieJar );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertHasCookie( 'foo', 'bar', $request->getCookieJar() );
+
+               $this->markTestIncomplete( 'CookieJar does not handle deletion' );
+               return;
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/cookies/delete?foo' );
+               $cookieJar = new CookieJar();
+               $cookieJar->setCookie( 'foo', 'bar', [ 'domain' => 'httpbin.org' ] );
+               $cookieJar->setCookie( 'foo2', 'bar2', [ 'domain' => 'httpbin.org' ] );
+               $request->setCookieJar( $cookieJar );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertNotHasCookie( 'foo', $request->getCookieJar() );
+               $this->assertHasCookie( 'foo2', 'bar2', $request->getCookieJar() );
+       }
+
+       public function testGetResponseHeaders() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/response-headers?Foo=bar' );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $headers = array_change_key_case( $request->getResponseHeaders(), CASE_LOWER );
+               $this->assertArrayHasKey( 'foo', $headers );
+               $this->assertSame( $request->getResponseHeader( 'Foo' ), 'bar' );
+       }
+
+       public function testSetHeader() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/headers' );
+               $request->setHeader( 'Foo', 'bar' );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertResponseFieldValue( [ 'headers', 'Foo' ], 'bar', $request );
+       }
+
+       public function testGetStatus() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/status/418' );
+               $status = $request->execute();
+               $this->assertFalse( $status->isOK() );
+               $this->assertSame( $request->getStatus(), 418 );
+       }
+
+       public function testSetUserAgent() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/user-agent' );
+               $request->setUserAgent( 'foo' );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertResponseFieldValue( 'user-agent', 'foo', $request );
+       }
+
+       public function testSetData() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/post', [ 'method' => 'POST' ] );
+               $request->setData( [ 'foo' => 'bar', 'foo2' => 'bar2' ] );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertResponseFieldValue( 'form', [ 'foo' => 'bar', 'foo2' => 'bar2' ], $request );
+       }
+
+       public function testSetCallback() {
+               if ( static::$httpEngine === 'php' ) {
+                       $this->markTestIncomplete( 'PhpHttpRequest does not use setCallback()' );
+                       return;
+               }
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/ip' );
+               $data = '';
+               $request->setCallback( function ( $fh, $content ) use ( &$data ) {
+                       $data .= $content;
+                       return strlen( $content );
+               } );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $data = json_decode( $data, true );
+               $this->assertInternalType( 'array', $data );
+               $this->assertArrayHasKey( 'origin', $data );
+       }
+
+       public function testBasicAuthentication() {
+               $request = MWHttpRequest::factory( 'http://httpbin.org/basic-auth/user/pass', [
+                       'username' => 'user',
+                       'password' => 'pass',
+               ] );
+               $status = $request->execute();
+               $this->assertTrue( $status->isGood() );
+               $this->assertResponseFieldValue( 'authenticated', true, $request );
+
+               $request = MWHttpRequest::factory( 'http://httpbin.org/basic-auth/user/pass', [
+                       'username' => 'user',
+                       'password' => 'wrongpass',
+               ] );
+               $status = $request->execute();
+               $this->assertFalse( $status->isOK() );
+               $this->assertSame( 401, $request->getStatus() );
+       }
+
+       // --------------------
+
+       /**
+        * Verifies that the request was successful, returned valid JSON and the given field of that
+        * JSON data is as expected.
+        * @param string|string[] $key Path to the data in the response object
+        * @param mixed $expectedValue
+        * @param MWHttpRequest $response
+        */
+       protected function assertResponseFieldValue( $key, $expectedValue, MWHttpRequest $response ) {
+               $this->assertSame( 200, $response->getStatus(), 'response status is not 200' );
+               $data = json_decode( $response->getContent(), true );
+               $this->assertInternalType( 'array', $data, 'response is not JSON' );
+               $keyPath = '';
+               foreach ( (array)$key as $keySegment ) {
+                       $keyPath .= ( $keyPath ? '.' : '' ) . $keySegment;
+                       $this->assertArrayHasKey( $keySegment, $data, $keyPath . ' not found' );
+                       $data = $data[$keySegment];
+               }
+               $this->assertSame( $expectedValue, $data );
+       }
+
+       /**
+        * Asserts that the cookie jar has the given cookie with the given value.
+        * @param string $expectedName Cookie name
+        * @param string $expectedValue Cookie value
+        * @param CookieJar $cookieJar
+        */
+       protected function assertHasCookie( $expectedName, $expectedValue, CookieJar $cookieJar ) {
+               $cookieJar = TestingAccessWrapper::newFromObject( $cookieJar );
+               $cookies = array_change_key_case( $cookieJar->cookie, CASE_LOWER );
+               $this->assertArrayHasKey( strtolower( $expectedName ), $cookies );
+               $cookie = TestingAccessWrapper::newFromObject(
+                       $cookies[strtolower( $expectedName )] );
+               $this->assertSame( $expectedValue, $cookie->value );
+       }
+
+       /**
+        * Asserts that the cookie jar does not have the given cookie.
+        * @param string $expectedName Cookie name
+        * @param CookieJar $cookieJar
+        */
+       protected function assertNotHasCookie( $name, CookieJar $cookieJar ) {
+               $cookieJar = TestingAccessWrapper::newFromObject( $cookieJar );
+               $this->assertArrayNotHasKey( strtolower( $name ),
+                       array_change_key_case( $cookieJar->cookie, CASE_LOWER ) );
+       }
+}
diff --git a/tests/integration/includes/http/PhpHttpRequestTest.php b/tests/integration/includes/http/PhpHttpRequestTest.php
new file mode 100644 (file)
index 0000000..d0222a5
--- /dev/null
@@ -0,0 +1,5 @@
+<?php
+
+class PhpHttpRequestTest extends MWHttpRequestTestCase {
+       protected static $httpEngine = 'php';
+}
index 7809ab3..5ce0b34 100644 (file)
@@ -201,4 +201,3 @@ class DbTestPreviewer extends TestRecorder {
                        . " and $postDate";
        }
 }
-
index 0e94301..04a2a8d 100644 (file)
@@ -81,4 +81,3 @@ class DbTestRecorder extends TestRecorder {
                $this->db->commit( __METHOD__ );
        }
 }
-
index 4739be4..73d4a47 100644 (file)
@@ -55,4 +55,3 @@ class DjVuSupport {
                        && is_executable( $wgDjvuTxt );
        }
 }
-
index cad3a53..ac9f150 100644 (file)
@@ -323,4 +323,3 @@ class ParserTestPrinter extends TestRecorder {
                return ( $success == $total );
        }
 }
-
index a15d09e..37ed85f 100644 (file)
@@ -84,4 +84,3 @@ class ParserTestResultNormalizer {
                        [ '<body>' => '', '</body>' => '' ] );
        }
 }
-
index 04c142a..7edde2a 100644 (file)
@@ -295,7 +295,7 @@ class ParserTestRunner {
                        MediaWikiServices::getInstance()->resetServiceForTesting( 'MediaHandlerFactory' );
                };
 
-               // SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
+               // SqlBagOStuff broke when using temporary tables on r40209 (T17892).
                // It seems to have been fixed since (r55079?), but regressed at some point before r85701.
                // This works around it for now...
                global $wgObjectCaches;
@@ -316,7 +316,7 @@ class ParserTestRunner {
 
        private function appendNamespaceSetup( &$setup, &$teardown ) {
                // Add a namespace shadowing a interwiki link, to test
-               // proper precedence when resolving links. (bug 51680)
+               // proper precedence when resolving links. (T53680)
                $setup['wgExtraNamespaces'] = [
                        100 => 'MemoryAlpha',
                        101 => 'MemoryAlpha_talk'
@@ -974,7 +974,10 @@ class ParserTestRunner {
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgLanguageCode' => $langCode,
                        'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
-                       'wgNamespacesWithSubpages' => [ 0 => isset( $opts['subpage'] ) ],
+                       'wgNamespacesWithSubpages' => [
+                               0 => isset( $opts['subpage'] ),
+                               2 => isset( $opts['subpage'] ),
+                       ],
                        'wgMaxTocLevel' => $maxtoclevel,
                        'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
                        'wgThumbLimits' => [ self::getOptionValue( 'thumbsize', $opts, 180 ) ],
@@ -1318,7 +1321,7 @@ class ParserTestRunner {
                if ( $this->useTemporaryTables ) {
                        if ( $this->db->getType() == 'sqlite' ) {
                                # Under SQLite the searchindex table is virtual and need
-                               # to be explicitly destroyed. See bug 29912
+                               # to be explicitly destroyed. See T31912
                                # See also MediaWikiTestCase::destroyDB()
                                wfDebug( __METHOD__ . " explicitly destroying sqlite virtual table parsertest_searchindex\n" );
                                $this->db->query( "DROP TABLE `parsertest_searchindex`" );
@@ -1508,7 +1511,11 @@ class ParserTestRunner {
                // get a reference to the mock object.
                MessageCache::singleton()->getParser();
                $restore = $this->executeSetupSnippets( [ 'wgParser' => new ParserTestMockParser ] );
-               $status = $page->doEditContent( ContentHandler::makeContent( $text, $title ), '', EDIT_NEW );
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( $text, $title ),
+                       '',
+                       EDIT_NEW | EDIT_INTERNAL
+               );
                $restore();
 
                if ( !$status->isOK() ) {
index f1a82ee..a62db5a 100644 (file)
@@ -9,4 +9,4 @@ To run parser tests via PHPUnit:
 
 You can optionally filter by title using --filter, e.g.
 
- ./phpunit.php --testsuite parsertests --filter="Bug 6200"
+ ./phpunit.php --testsuite parsertests --filter="T6400"
index 05b1216..7f64671 100644 (file)
@@ -125,7 +125,7 @@ class TestFileEditor {
                $line = $this->lines[$this->pos++];
                $heading = $this->getHeading( $line );
                $expectedEnd = 'end' . $heading;
-               $contents = $line;
+               $contents = "$line\n";
 
                do {
                        $line = $this->lines[$this->pos++];
index b6e811b..a96485d 100644 (file)
@@ -333,4 +333,3 @@ class TestFileReader {
                $this->requirements[$type][$name] = true;
        }
 }
-
index 4b81699..2731c4c 100644 (file)
@@ -91,4 +91,3 @@ class TestRecorder {
        }
 
 }
-
index 6b5fb48..39c9ca5 100644 (file)
@@ -58,7 +58,7 @@ class TidySupport {
                                'tidyConfigFile' => "$IP/includes/tidy/tidy.conf",
                                'tidyCommandLine' => '',
                        ];
-                       if ( extension_loaded( 'tidy' ) && class_exists( 'tidy' ) ) {
+                       if ( extension_loaded( 'tidy' ) && ( wfIsHHVM() || class_exists( 'tidy' ) ) ) {
                                $this->config['driver'] = wfIsHHVM() ? 'RaggettInternalHHVM' : 'RaggettInternalPHP';
                        } else {
                                if ( is_executable( $wgTidyBin ) ) {
index 5b17eac..be6e3a8 100644 (file)
@@ -271,6 +271,12 @@ Template:EmptyTRWithHTMLAttrTest
 </table>
 !!endarticle
 
+!! article
+Template:CircularRef
+!! text
+<ref>{{CircularRef}}</ref>
+!! endarticle
+
 ###
 ### Basic tests
 ###
@@ -280,6 +286,15 @@ Blank input
 !! html
 !! end
 
+!! test
+CircularRef
+!! wikitext
+{{CircularRef}}
+<references />
+!! html/parsoid
+<p><span about="#mwt1" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"CircularRef","href":"./Template:CircularRef"},"params":{},"i":0}}]}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">Error: Expansion loop detected at <a data-parsoid='{"a":{"href":null},"sa":{"href":"Template:CircularRef"}}'>Template:CircularRef</a></span></li></ol>
+!! end
 
 !! test
 Simple paragraph
@@ -513,6 +528,22 @@ Extra newlines between heading and content are swallowed
 </p>
 !! end
 
+!! test
+Heading with line break in nowiki
+!! options
+parsoid=wt2html
+!! wikitext
+== A <nowiki>B
+C</nowiki> ==
+!! html
+<h2><span class="mw-headline" id="A_B.0AC">A B
+C</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A B&#10;C">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! html/parsoid
+<h2 id="A_B.0AC">A <span typeof="mw:Nowiki">B
+C</span> </h2>
+!! end
+
 !! test
 Parsing an URL
 !! wikitext
@@ -578,7 +609,7 @@ Italics and bold
 
 !! end
 
-# this example taken from the [[simple:Moon]] article (bug 47326)
+# this example taken from the [[simple:Moon]] article (T49326)
 !! test
 Italics and possessives (1)
 !! wikitext
@@ -588,7 +619,7 @@ obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
 </p>
 !! end
 
-# this example taken from [[en:Flaming Pie]] (bug 49926)
+# this example taken from [[en:Flaming Pie]] (T51926)
 !! test
 Italics and possessives (2)
 !! wikitext
@@ -598,7 +629,7 @@ Italics and possessives (2)
 </p>
 !! end
 
-# this example taken from [[en:Dictionary]] (bug 49926)
+# this example taken from [[en:Dictionary]] (T51926)
 !! test
 Italics and possessives (3)
 !! wikitext
@@ -902,6 +933,7 @@ Italics and bold: 5-quote opening sequence: (5,6)
 ###
 ### multiple quote sequences in a line
 ###
+
 !! test
 Italics and bold: multiple quote sequences: (2,4,2)
 !! options
@@ -911,8 +943,7 @@ parsoid=wt2html
 !! html/*
 <p><i>foo'<b>bar</b></i>
 </p>
-!!end
-
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
@@ -924,7 +955,6 @@ Italics and bold: multiple quote sequences: (2,4,2+3) w/ nowiki
 </p>
 !! end
 
-
 !! test
 Italics and bold: multiple quote sequences: (2,4,3)
 !! options
@@ -934,8 +964,7 @@ parsoid=wt2html
 !! html/*
 <p><i>foo'<b>bar</b></i>
 </p>
-!!end
-
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
@@ -947,7 +976,6 @@ Italics and bold: multiple quote sequences: (2,4,3+2) w/ nowiki
 </p>
 !! end
 
-
 !! test
 Italics and bold: multiple quote sequences: (2,4,4)
 !! options
@@ -957,8 +985,7 @@ parsoid=wt2html
 !! html/*
 <p><i>foo'<b>bar'</b></i>
 </p>
-!!end
-
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
@@ -970,7 +997,6 @@ Italics and bold: multiple quote sequences: (2,4,4+2) w/ nowiki
 </p>
 !! end
 
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: multiple quote sequences: (3,4,2)
@@ -984,24 +1010,21 @@ parsoid=wt2html
 !! html/parsoid
 <p><b>foo'</b>bar<i></i>
 </p>
-!!end
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
 Italics and bold: multiple quote sequences: (3,4,2+2) w/ nowiki
-!! options
-parsoid
 !! wikitext
-'''<nowiki>foo'</nowiki>'''bar''<nowiki/>''
+'''foo''''bar''<nowiki/>''
 !! html/php
 <p><b>foo'</b>bar
 </p>
 !! html/parsoid
-<p><b><span typeof="mw:Nowiki">foo'</span></b>bar<i></i>
+<p><b>foo'</b>bar<i></i>
 </p>
 !! end
 
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: multiple quote sequences: (3,4,3)
@@ -1015,18 +1038,18 @@ parsoid=wt2html
 !! html/parsoid
 <p><b>foo'</b>bar<b></b>
 </p>
-!!end
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
 Italics and bold: multiple quote sequences: (3,4,3+3) w/ nowiki
 !! wikitext
-'''<nowiki>foo'</nowiki>'''bar'''<nowiki/>'''
+'''foo''''bar'''<nowiki/>'''
 !! html/php
 <p><b>foo'</b>bar
 </p>
 !! html/parsoid
-<p><b><span typeof="mw:Nowiki">foo'</span></b>bar<b></b>
+<p><b>foo'</b>bar<b></b>
 </p>
 !! end
 
@@ -1104,7 +1127,7 @@ The ''[[Main Page]]'''s talk page.
 <p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
 </p>
 !! html/parsoid
-<p>The <i><a rel="mw:WikiLink"  href="Main_Page" title="Main Page">Main Page</a>'</i>s talk page.</p>
+<p>The <i><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a>'</i>s talk page.</p>
 !! end
 
 !! test
@@ -1155,7 +1178,7 @@ Non-html5 tags should be accepted
 !! end
 
 !! test
-<wbr> is valid wikitext (bug 52468)
+<wbr> is valid wikitext (T54468)
 !! wikitext
 <wbr>
 !! html
@@ -1270,7 +1293,7 @@ Ruby markup (W3C-style)
 
 # The next two test different paths in the sanitizer.
 !! test
-Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
+Non-word characters don't terminate tag names (T19663, T42670, T54022)
 !! wikitext
 <blockquote|>a</blockquote>
 
@@ -1341,7 +1364,7 @@ array (
 !! end
 
 !! test
-Isolated close tags should be treated as literal text (bug 52760)
+Isolated close tags should be treated as literal text (T54760)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -1359,7 +1382,7 @@ parsoid=wt2html
 ###
 
 !! test
-Bare pipe character (bug 52363)
+Bare pipe character (T54363)
 !! wikitext
 |
 !! html
@@ -1368,7 +1391,7 @@ Bare pipe character (bug 52363)
 !! end
 
 !! test
-Bare pipe character from a template (bug 52363)
+Bare pipe character from a template (T54363)
 !! wikitext
 {{pipe}}
 !! html
@@ -1427,6 +1450,8 @@ Don't parse <nowiki><span class="error"></nowiki> (T149622)
 !! html/php
 <p>&lt;span class="error"&gt;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki">&lt;span class="error"></span></p>
 !! end
 
 !! test
@@ -1463,9 +1488,11 @@ nowiki 3
 Entities inside <nowiki>
 !! wikitext
 <nowiki>&lt;</nowiki>
-!! html
+!! html/php
 <p>&lt;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki"><span typeof="mw:Entity" data-parsoid='{"src":"&amp;lt;","srcContent":"&lt;"}'>&lt;</span></span></p>
 !! end
 
 !! test
@@ -2137,7 +2164,7 @@ Regression with preformatted in <center>
 !! end
 
 !! test
-Bug 52763: Preformatted in <blockquote>
+T54763: Preformatted in <blockquote>
 !! wikitext
 <blockquote>
  Blah
@@ -2161,7 +2188,7 @@ Bug 52763: Preformatted in <blockquote>
 !! end
 
 !! test
-Bug 51086: Double newlines in blockquotes should be turned into paragraphs
+T53086: Double newlines in blockquotes should be turned into paragraphs
 !! wikitext
 <blockquote>
 Foo
@@ -2178,7 +2205,7 @@ Bar
 !! end
 
 !! test
-Bug 15491: <ins>/<del> in blockquote
+T17491: <ins>/<del> in blockquote
 !! wikitext
 <blockquote>
 Foo <del>bar</del> <ins>baz</ins> quux
@@ -2193,9 +2220,9 @@ Foo <del>bar</del> <ins>baz</ins> quux
 
 # Note that the p-wrapping is newline sensitive, which could be
 # considered a bug: tidy will wrap only the 'Foo' in the example
-# below in a <p> tag. (see comment 23-25 of bug #6200)
+# below in a <p> tag. (see comment 23-25 of T8200)
 !! test
-Bug 15491: <ins>/<del> in blockquote (2)
+T17491: <ins>/<del> in blockquote (2)
 !! wikitext
 <blockquote>Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
@@ -2210,7 +2237,7 @@ Bug 15491: <ins>/<del> in blockquote (2)
 !! end
 
 !! test
-<pre> with attributes (bug 3202)
+<pre> with attributes (T5202)
 !! wikitext
 <pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
 !! html
@@ -2219,7 +2246,7 @@ Bug 15491: <ins>/<del> in blockquote (2)
 !! end
 
 !! test
-<pre> with width attribute (bug 3202)
+<pre> with width attribute (T5202)
 !! wikitext
 <pre width="8">Narrow screen goodies</pre>
 !! html
@@ -2228,7 +2255,7 @@ Bug 15491: <ins>/<del> in blockquote (2)
 !! end
 
 !! test
-<pre> with forbidden attribute (bug 3202)
+<pre> with forbidden attribute (T5202)
 !! wikitext
 <pre width="8" onmouseover="alert(document.cookie)">Narrow screen goodies</pre>
 !! html
@@ -2246,7 +2273,7 @@ Entities inside <pre>
 !! end
 
 !! test
-<pre> with forbidden attribute values (bug 3202)
+<pre> with forbidden attribute values (T5202)
 !! wikitext
 <pre width="8" style="border-width: expression(alert(document.cookie))">Narrow screen goodies</pre>
 !! html
@@ -2255,7 +2282,7 @@ Entities inside <pre>
 !! end
 
 !! test
-<nowiki> inside <pre> (bug 13238)
+<nowiki> inside <pre> (T15238)
 !! wikitext
 <pre>
 <nowiki>
@@ -2286,8 +2313,12 @@ Entities inside <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
+## aren't enclosed in nowikis.
 !! test
 <nowiki> and <pre> preference (first one wins)
+!! options
+parsoid=wt2html
 !! wikitext
 <pre>
 <nowiki>
@@ -2316,17 +2347,16 @@ Entities inside <pre>
 &lt;/pre&gt;
 </p>
 !! html/parsoid
-<pre data-parsoid='{"stx":"html","strippedNL":true}'>&lt;nowiki>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n&lt;nowiki>\n"}}'>&lt;nowiki>
 </pre>
-<p><span typeof="mw:Placeholder" data-parsoid='{"src":"&lt;/nowiki>"}'>&lt;/nowiki></span>
-&lt;/pre></p>
+<p>&lt;/nowiki></p>
+
 
 <p><span typeof="mw:Nowiki">
 &lt;pre>
 &lt;nowiki>
 &lt;/pre>
-</span>
-&lt;/pre></p>
+</span></p>
 !! end
 
 !! test
@@ -2340,9 +2370,7 @@ Entities inside <pre>
 
 # Parsoid doesn't strip empty tags, like Tidy does.
 !! test
-Empty pre; pre inside other HTML tags (bug 54946)
-!! options
-parsoid=wt2html,wt2wt
+Empty pre; pre inside other HTML tags (T56946)
 !! wikitext
 a
 
@@ -2367,9 +2395,9 @@ foo
 !! html/parsoid
 <p>a</p>
 
-<div><pre>foo
+<div data-parsoid='{"stx":"html"}'><pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\nfoo\n"}}'>foo
 </pre></div>
-<pre></pre>
+<pre typeof="mw:Extension/pre" about="#mwt4" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":""}}'></pre>
 !! end
 
 !! test
@@ -2385,7 +2413,7 @@ HTML pre followed by indent-pre
 
 # Note that tidy removes the empty <p> tags from the start and end.
 # Parsoid does not, by design.
-!!test
+!! test
 Block tag pre
 !! wikitext
 <p><pre>foo</pre></p>
@@ -2394,8 +2422,8 @@ Block tag pre
 foo
 </pre>
 !! html/parsoid
-<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre data-parsoid='{"stx":"html"}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
-!!end
+<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
+!! end
 
 !!test
 Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
@@ -2516,8 +2544,11 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 </pre>
 !!end
 
+## Hmm, should Parsoid rt this?
 !! test
 Pres with newline attributes
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <pre class="one
 two">hi</pre>
@@ -2525,8 +2556,7 @@ two">hi</pre>
 <pre class="one two">hi</pre>
 
 !! html/parsoid
-<pre class="one
-two" data-parsoid='{"stx":"html"}'>hi</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" class="one two" data-mw='{"name":"pre","attrs":{"class":"one two"},"body":{"extsrc":"hi"}}'>hi</pre>
 !! end
 
 !! test
@@ -2541,7 +2571,7 @@ Barack Obama <President> of the United States
 !! end
 
 !! test
-Handle broken pre-like tags (bug 64025)
+Handle broken pre-like tags (T66025)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -2558,7 +2588,7 @@ x
 </pre>
 <p>&lt;pre</p>
 !! html/parsoid
-<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"a":{"&lt;pre":null},"sa":{"&lt;pre":""},"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;pre &lt;pre>x&lt;/pre>"}},"i":0}}]}'>x</pre>
+<pre about="#mwt1" typeof="mw:Transclusion mw:Extension/pre" data-parsoid='{"a":{"&lt;pre":null},"sa":{"&lt;pre":""},"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;pre &lt;pre>x&lt;/pre>"}},"i":0}}]}'>x</pre>
 
 
 <p>&lt;pre </p>
@@ -2576,7 +2606,7 @@ parsoid=wt2html
 <pre style="width:50%;">{{echo|foo}}</pre>
 
 !! html/parsoid
-<pre style="width:50%;">{{echo|foo}}</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" style="width:50%;" data-mw='{"name":"pre","attrs":{"style":"width:50%;"},"body":{"extsrc":"{{echo|foo}}"}}'>{{echo|foo}}</pre>
 !! end
 
 # TODO / maybe: fix wt2wt for this
@@ -2727,6 +2757,10 @@ Templates: Handle comments in the target
 <!-- should be ignored -->
 |foo}}
 
+{{echo
+<!-- should be ignored and spaces on next line should not trip us up (T147742) -->
+  |foo}}
+
 {{echo<!-- should be ignored -->
 |foo}}
 
@@ -2738,10 +2772,13 @@ Templates: Handle comments in the target
 </p><p>foo
 </p><p>foo
 </p><p>foo
+</p><p>foo
 </p>
 !! html/parsoid
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo\n&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
 
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo\n&lt;!-- should be ignored and spaces on next line should not trip us up (T147742) -->\n  ","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
 
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo&lt;!-- should be ignored -->","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
@@ -2750,7 +2787,7 @@ Templates: Handle comments in the target
 !!end
 
 !! test
-Templates: Handle comments in parameter names (bug 67657)
+Templates: Handle comments in parameter names (T69657)
 !! wikitext
 {{echo|1
 <!-- should be ignored -->
@@ -2780,7 +2817,7 @@ Templates: Handle comments in parameter names (bug 67657)
 !!end
 
 !! test
-Templates: Other wikitext in parameter names (bug 67657)
+Templates: Other wikitext in parameter names (T69657)
 !! wikitext
 {{echo|''1''=foo}}
 !! html/php
@@ -2821,9 +2858,9 @@ Parsoid: pipe in transclusion parameter
 !! html/php+tidy
 <p><a rel="nofollow" class="external free" href="http://foo.com/a%7Cb">http://foo.com/a%7Cb</a></p>
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
+<p><a rel="mw:ExtLink" href="http://foo.com/a%7Cb" about="#mwt1"
 typeof="mw:Transclusion"
-data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p>
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a%7Cb</a></p>
 !! end
 
 !! test
@@ -2868,7 +2905,7 @@ parsoid=html2wt,wt2wt
 </p>
 !! end
 
-## Bug 52824
+## T54824
 !! test
 Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param
 !! options
@@ -2881,7 +2918,7 @@ parsoid=html2wt,wt2wt
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
 !! end
 
-## Bug 56733
+## T58733
 !! test
 Templates parameters with special tokenizing behavior dont get modified because of arg escaping
 !! wikitext
@@ -2892,7 +2929,7 @@ Templates parameters with special tokenizing behavior dont get modified because
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
 !! end
 
-## Bug T73412
+## T73412
 !! test
 Templates: Preserve blank parameter names
 !! wikitext
@@ -3009,7 +3046,7 @@ c
 !!end
 
 !!test
-2c. Indent-Pre and tables (bug 42252)
+2c. Indent-Pre and tables (T44252)
 !! wikitext
 {|
  |+ foo
@@ -3080,7 +3117,7 @@ a
 !!end
 
 !! test
-2g. Indented table markup mixed with indented pre content (proposed in bug 6200)
+2g. Indented table markup mixed with indented pre content (proposed in T8200)
 !! wikitext
  <table>
  <tr>
@@ -3234,6 +3271,17 @@ array (
  a <pre typeof="mw:Extension/tag" about="#mwt2" data-parsoid='{}' data-mw='{"name":"tag","attrs":{},"body":null}'></pre>
 !! end
 
+!! test
+5. Indent-Pre and html pre
+!! wikitext
+ <pre class="123">hi</pre>
+!! html/php
+ <pre class="123">hi</pre>
+
+!! html/parsoid
+ <pre typeof="mw:Extension/pre" about="#mwt2" class="123" data-mw='{"name":"pre","attrs":{"class":"123"},"body":{"extsrc":"hi"}}'>hi</pre>
+!! end
+
 !!test
 Render paragraphs when indent-pre is suppressed in blocklevels
 !! wikitext
@@ -3423,18 +3471,17 @@ foo
 foo
 </pre>
 !! html/parsoid
-<pre data-parsoid='{"stx":"html"}'>foo</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre>
 
-<pre data-parsoid='{"stx":"html","strippedNL":"\n"}'>
-foo
+<pre typeof="mw:Extension/pre" about="#mwt4" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\nfoo\n"}}'>foo
 </pre>
 
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt6" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\nfoo\n"}}'>
 
 foo
 </pre>
 
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt8" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\n\nfoo\n"}}'>
 
 
 foo
@@ -3478,7 +3525,7 @@ haha
 
 </pre>
 !! html/parsoid
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\n\n\n\nhaha\n\n\n\n\nhaha\n\n\n\n\n"}}'>
 
 
 
@@ -3529,7 +3576,7 @@ HTML-pre: 3: other wikitext
 </pre>
 
 !! html/parsoid
-<pre data-parsoid='{"stx":"html","strippedNL":true}'>* foo
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n* foo\n# bar\n= no-h =\n&#39;&#39; no-italic &#39;&#39;\n[[ NoLink ]]\n"}}'>* foo
 # bar
 = no-h =
 '' no-italic ''
@@ -3651,7 +3698,33 @@ Definition lists: self-closed tag
 !! end
 
 !! test
-Bug 11748: Literal closing tags
+Definition lists: ignore colons inside tags
+!! wikitext
+;one <b>two : tag <i>fun:</i>:</b>: def
+!! html
+<dl><dt>one <b>two&#160;: tag <i>fun:</i>:</b></dt>
+<dd> def</dd></dl>
+
+!! end
+
+!! test
+Definition lists: excess closed tags
+!! wikitext
+;one</b>two : bad tag fun
+!! html/php+tidy
+<dl>
+<dt>onetwo&#160;</dt>
+<dd>bad tag fun</dd>
+</dl>
+!! html/parsoid
+<dl>
+<dt>onetwo</dt>
+<dd>bad tag fun</dd>
+</dl>
+!! end
+
+!! test
+T13748: Literal closing tags
 !! wikitext
 <dl>
 <dt>test 1</dt>
@@ -3686,7 +3759,6 @@ Definition and unordered list using wiki syntax nested in unordered list using h
 !! end
 
 !! test
-
 Definition list with empty definition and following paragraph
 !! wikitext
 ; term:
@@ -3779,7 +3851,7 @@ should be left alone
 !! end
 
 !! test
-Definition Lists: Hacky use to indent tables, with comments (bug 63979)
+Definition Lists: Hacky use to indent tables, with comments (T65979)
 !! wikitext
 <!-- foo -->
 ::{|
@@ -4485,7 +4557,7 @@ Non-bracketed: http://example.com
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
 External links: numbered
 !! wikitext
@@ -4530,7 +4602,7 @@ http://example.com/1$2345
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
 External links: dollar sign in URL (autonumber)
 !! wikitext
@@ -4543,7 +4615,7 @@ External links: dollar sign in URL (autonumber)
 !!end
 
 !! test
-External links: open square bracket forbidden in URL (bug 4377)
+External links: open square bracket forbidden in URL (T6377)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -4556,7 +4628,7 @@ http://example.com/1[2345
 !! end
 
 !! test
-External links: open square bracket forbidden in URL (named) (bug 4377)
+External links: open square bracket forbidden in URL (named) (T6377)
 !! options
 parsoid=wt2html,html2html
 !! wikitext
@@ -4570,7 +4642,7 @@ parsoid=wt2html,html2html
 
 # parsoid adds a space before the link name
 !! test
-External links: open square bracket forbidden in URL (named) (bug 4377)
+External links: open square bracket forbidden in URL (named) (T6377)
 Parsoid variant.
 !! wikitext
 [http://example.com/1 [2345]
@@ -4580,7 +4652,7 @@ Parsoid variant.
 !!end
 
 !! test
-External links: nowiki in URL link text (bug 6230)
+External links: nowiki in URL link text (T8230)
 !! wikitext
 [http://example.com/ <nowiki>''example site''</nowiki>]
 !! html
@@ -4589,7 +4661,7 @@ External links: nowiki in URL link text (bug 6230)
 !! end
 
 !! test
-External links: newline forbidden in text (bug 6230 regression check)
+External links: newline forbidden in text (T8230 regression check)
 !! wikitext
 [http://example.com/ first
 second]
@@ -4617,7 +4689,7 @@ External links: protocol-relative URL in brackets
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
 External links: protocol-relative URL in brackets without text
 !! wikitext
@@ -4639,7 +4711,7 @@ External links: protocol-relative URL in free text is left alone
 !!end
 
 !! test
-External links: protocol-relative URL in the middle of a word is left alone (bug 30269)
+External links: protocol-relative URL in the middle of a word is left alone (T32269)
 !! wikitext
 foo//example.com/Foo
 !! html
@@ -4759,6 +4831,17 @@ news:'a'b''c''d e
 <p><a rel="mw:ExtLink" href="news:'a'b">news:'a'b</a><i>c</i>d e</p>
 !! end
 
+!! test
+External links: with entity
+!! wikitext
+[http://&#x20;www.librarieswithoutborders.org Libraries without borders]
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://+www.librarieswithoutborders.org">Libraries without borders</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://+www.librarieswithoutborders.org" data-parsoid='{"a":{"href":"http://+www.librarieswithoutborders.org"},"sa":{"href":"http://&amp;#x20;www.librarieswithoutborders.org"}}'>Libraries without borders</a></p>
+!! end
+
 !! test
 External links: Lone protocols are never linked (T105697)
 !! wikitext
@@ -4779,7 +4862,7 @@ bitcoin:;
 !! end
 
 !! test
-External links: No preceding word characters allowed (bug 65278)
+External links: No preceding word characters allowed (T67278)
 !! wikitext
 NOPEhttp://example.com
 N0http://example.com
@@ -4924,7 +5007,7 @@ Old &amp; use: http://x&amp;y
 !! end
 
 !! test
-External links: encoded equals (bug 6102)
+External links: encoded equals (T8102)
 !! wikitext
 http://example.com/?foo&#61;bar
 !! html/php
@@ -4936,7 +5019,7 @@ http://example.com/?foo&#61;bar
 
 ##
 ## Note that parsoid doesn't explicit mark autonumbered links, nor
-## does it number them.  As discussed in bug 53505, we can identify
+## does it number them.  As discussed in T55505, we can identify
 ## autonumbered links via CSS.
 ##
 
@@ -4980,7 +5063,7 @@ External links: [raw equals]
 # note that parsoid html is identical to [raw equals] case; so html2wt
 # mode will return the [raw equals] wikitext
 !! test
-External links: [encoded equals] (bug 6102)
+External links: [encoded equals] (T8102)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -5040,7 +5123,7 @@ http://e&zwnj;xample.com/
 !! end
 
 !! test
-External links: www.jpeg.org (bug 554)
+External links: www.jpeg.org (T2554)
 !! wikitext
 http://www.jpeg.org
 !! html
@@ -5048,9 +5131,9 @@ http://www.jpeg.org
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
-External links: URL within URL (original bug 2)
+External links: URL within URL (T2002)
 !! wikitext
 [http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
 !! html/php
@@ -5061,7 +5144,7 @@ External links: URL within URL (original bug 2)
 !! end
 
 !! test
-BUG 361: URL inside bracketed URL
+T2361: URL inside bracketed URL
 !! wikitext
 [http://www.example.com/foo http://www.example.com/bar]
 !! html
@@ -5070,7 +5153,7 @@ BUG 361: URL inside bracketed URL
 !! end
 
 !! test
-BUG 361: URL within URL, not bracketed
+T2361: URL within URL, not bracketed
 !! wikitext
 http://www.example.com/foo?=http://www.example.com/bar
 !! html
@@ -5079,7 +5162,7 @@ http://www.example.com/foo?=http://www.example.com/bar
 !! end
 
 !! test
-BUG 289: ">"-token in URL-tail
+T2289: ">"-token in URL-tail
 !! wikitext
 http://www.example.com/<hello>
 !! html
@@ -5088,7 +5171,7 @@ http://www.example.com/<hello>
 !!end
 
 !! test
-BUG 289: literal ">"-token in URL-tail
+T2289: literal ">"-token in URL-tail
 !! wikitext
 http://www.example.com/<b>html</b>
 !! html/php
@@ -5099,7 +5182,7 @@ http://www.example.com/<b>html</b>
 !! end
 
 !! test
-BUG 289: ">"-token in bracketed URL
+T2289: ">"-token in bracketed URL
 !! wikitext
 [http://www.example.com/<hello> stuff]
 !! html
@@ -5108,7 +5191,7 @@ BUG 289: ">"-token in bracketed URL
 !!end
 
 !! test
-BUG 289: literal ">"-token in bracketed URL
+T2289: literal ">"-token in bracketed URL
 !! wikitext
 [http://www.example.com/<b>html</b> stuff]
 !! html
@@ -5117,7 +5200,7 @@ BUG 289: literal ">"-token in bracketed URL
 !!end
 
 !! test
-BUG 289: literal double quote at end of URL
+T2289: literal double quote at end of URL
 !! wikitext
 http://www.example.com/"hello"
 !! html
@@ -5126,7 +5209,7 @@ http://www.example.com/"hello"
 !!end
 
 !! test
-BUG 289: literal double quote in bracketed URL
+T2289: literal double quote in bracketed URL
 !! wikitext
 [http://www.example.com/"hello" stuff]
 !! html
@@ -5135,7 +5218,7 @@ BUG 289: literal double quote in bracketed URL
 !!end
 
 !! test
-External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
+External links: multiple legal whitespace is fine, Magnus. Don't break it please. (T7081)
 !! wikitext
 [http://www.example.com  test]
 !! html
@@ -5155,7 +5238,7 @@ External links: link text with spaces
 !! end
 
 !! test
-External links: wiki links within external link (Bug 3695)
+External links: wiki links within external link (T5695)
 !! options
 parsoid=wt2html,html2html
 !! wikitext
@@ -5168,7 +5251,7 @@ parsoid=wt2html,html2html
 !! end
 
 !! test
-BUG 787: Links with one slash after the url protocol are invalid
+T2787: Links with one slash after the url protocol are invalid
 !! wikitext
 http:/example.com
 
@@ -5189,7 +5272,7 @@ Bracketed external links with template-generated invalid target
 !! end
 
 !! test
-Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
+T4702: Mismatched <i>, <b> and <a> tags are invalid
 !! wikitext
 ''[http://example.com text'']
 [http://example.com '''text]'''
@@ -5207,7 +5290,7 @@ Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
 
 
 !! test
-Bug 4781: %26 in URL
+T6781: %26 in URL
 !! wikitext
 http://www.example.com/?title=AT%26T
 !! html/php
@@ -5220,7 +5303,7 @@ http://www.example.com/?title=AT%26T
 # According to https://www.w3.org/TR/2011/WD-html5-20110525/Overview.html#parsing-urls a plain
 # % is actually legal in HTML5. Any change in output would need testing though.
 !! test
-Bug 4781, 5267: %25 in URL
+T6781, T7267: %25 in URL
 !! wikitext
 http://www.example.com/?title=100%25_Bran
 !! html/php
@@ -5231,7 +5314,7 @@ http://www.example.com/?title=100%25_Bran
 !! end
 
 !! test
-Bug 4781, 5267: %28, %29 in URL
+T6781, T7267: %28, %29 in URL
 !! wikitext
 http://www.example.com/?title=Ben-Hur_%281959_film%29
 !! html/php
@@ -5243,7 +5326,7 @@ http://www.example.com/?title=Ben-Hur_%281959_film%29
 
 
 !! test
-Bug 4781: %26 in autonumber URL
+T6781: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=AT%26T]
 !! html/php
@@ -5254,7 +5337,7 @@ Bug 4781: %26 in autonumber URL
 !! end
 
 !! test
-Bug 4781, 5267: %26 in autonumber URL
+T6781, T7267: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran]
 !! html/php
@@ -5265,7 +5348,7 @@ Bug 4781, 5267: %26 in autonumber URL
 !! end
 
 !! test
-Bug 4781, 5267: %28, %29 in autonumber URL
+T6781, T7267: %28, %29 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29]
 !! html/php
@@ -5277,7 +5360,7 @@ Bug 4781, 5267: %28, %29 in autonumber URL
 
 
 !! test
-Bug 4781: %26 in bracketed URL
+T6781: %26 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=AT%26T link]
 !! html/php
@@ -5288,7 +5371,7 @@ Bug 4781: %26 in bracketed URL
 !! end
 
 !! test
-Bug 4781, 5267: %25 in bracketed URL
+T6781, T7267: %25 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran link]
 !! html
@@ -5297,7 +5380,7 @@ Bug 4781, 5267: %25 in bracketed URL
 !! end
 
 !! test
-Bug 4781, 5267: %28, %29 in bracketed URL
+T6781, T7267: %28, %29 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
 !! html/php
@@ -5308,7 +5391,7 @@ Bug 4781, 5267: %28, %29 in bracketed URL
 !! end
 
 !! test
-External link containing a period in the anchor. (bug 63947)
+External link containing a period in the anchor. (T65947)
 !! wikitext
 [//foo.org/bar#baz. bang]
 
@@ -5323,7 +5406,7 @@ External link containing a period in the anchor. (bug 63947)
 !! end
 
 !! test
-External link containing a single quote. (bug 63947)
+External link containing a single quote. (T65947)
 !! wikitext
 [//foo.org/bar'baz]
 
@@ -5338,7 +5421,7 @@ External link containing a single quote. (bug 63947)
 !! end
 
 !! test
-External link containing double-single-quotes in text '' (bug 4598 sanity check)
+External link containing double-single-quotes in text '' (T6598 sanity check)
 !! wikitext
 Some [http://example.com/ pretty ''italics'' and stuff]!
 !! html
@@ -5347,7 +5430,7 @@ Some [http://example.com/ pretty ''italics'' and stuff]!
 !! end
 
 !! test
-External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check)
+External link containing double-single-quotes in text embedded in italics (T6598 sanity check)
 !! wikitext
 ''Some [http://example.com/ pretty ''italics'' and stuff]!''
 !! html
@@ -5421,7 +5504,7 @@ http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a></p>
 
-<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid[]=bar">http://example.com/index.php?foozoid[]=bar</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid%5B%5D=bar" data-parsoid='{"stx":"url","a":{"href":"http://example.com/index.php?foozoid%5B%5D=bar"},"sa":{"href":"http://example.com/index.php?foozoid&amp;#x5B;&amp;#x5D;=bar"}}'>http://example.com/index.php?foozoid%5B%5D=bar</a></p>
 !! end
 
 !! test
@@ -6307,7 +6390,7 @@ Nested table
 !! end
 
 !! test
-Invalid attributes in table cell (bug 1830)
+Invalid attributes in table cell (T3830)
 !! wikitext
 {|
 |Cell:|broken
@@ -6368,7 +6451,7 @@ parsoid=wt2html,html2html
 !! html/parsoid
 <table><tbody>
 <tr>
-<td data-parsoid='{"startTagSrc":"| ","attrSepSrc":"|","autoInsertedEnd":true}'><a rel="mw:ExtLink" href="ftp://|x||"></a>" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
+<td data-parsoid='{"startTagSrc":"| ","attrSepSrc":"|","autoInsertedEnd":true}'>[<a rel="mw:ExtLink" href="ftp://%7Cx" data-parsoid='{"stx":"url","a":{"href":"ftp://%7Cx"},"sa":{"href":"ftp://|x"}}'>ftp://%7Cx</a></td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'>]" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
 !! end
 
 !! test
@@ -6442,6 +6525,26 @@ parsoid=wt2html,html2html
 <span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"ho\">ha&lt;/div>"}},"i":0}}]}'>ho">ha</span>
 !! end
 
+!! test
+Break on | in element attribute name in template
+!! wikitext
+{{echo|<div cla|ss="hiho">ha</div>}}
+!! html/parsoid
+<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"},{"k":"ss","named":true}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;div cla"},"ss":{"wt":"\"hiho\">ha&lt;/div>"}},"i":0}}]}'>&lt;div cla</p>
+!! end
+
+!! test
+Don't break on | in extension attribute in template
+!! wikitext
+{{echo|<ref name="hi|ho">ha</ref>}}
+
+<references />
+!! html/parsoid
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-hi.7Cho_1-0" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref name=\"hi|ho\">ha&lt;/ref>"}},"i":0}}]}'><a href="./Main_Page#cite_note-hi.7Cho-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-hi.7Cho-1" id="cite_note-hi.7Cho-1"><a href="./Main_Page#cite_ref-hi.7Cho_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-hi.7Cho-1" class="mw-reference-text">ha</span></li></ol>
+!! end
+
 ## We don't support roundtripping of these attributes in Parsoid.
 ## Selective serialization takes care of preventing dirty diffs.
 ## But, on edits, we dirty-diff the invalid attribute text.
@@ -6612,9 +6715,9 @@ T107652: <ref>s in templates that also generate table cell attributes should be
 <references />
 !! html/parsoid
 <table>
-<tbody><tr><td style="background:#f9f9f9;" typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":["|",{"template":{"target":{"wt":"table_attribs_7","href":"./Template:Table_attribs_7"},"params":{},"i":0}}]}'>Foo<span class="mw-ref" id="cite_ref-1" rel="dc:references" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></td></tr>
+<tbody><tr><td style="background:#f9f9f9;" typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":["|",{"template":{"target":{"wt":"table_attribs_7","href":"./Template:Table_attribs_7"},"params":{},"i":0}}]}'>Foo<span class="mw-ref" id="cite_ref-1" rel="dc:references" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></td></tr>
 </tbody></table>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 !! test
@@ -6881,12 +6984,6 @@ Wikitext table with html-syntax row
 <td>foo</td></tr></tbody></table>
 !! end
 
-## Note that Parsoid output differs from PHP and PHP+tidy here.
-## The lack of <tr> tags in the PHP output is arguably a bug in the
-## PHP parser, which tidy then compounds by fostering the content
-## entirely out of the table.  Parsoid recognizes the table context
-## and generates <tr> and <td> wrappers as needed.  Hopefully nobody
-## depends on PHP's treatment of broken table markup!
 !! test
 Implicit <td> after a |-
 !! options
 !! html/php+tidy
 <p>a</p>
 !! html/parsoid
-<table>
-<tr><td>a</td></tr>
-</table>
-!! end
-
-# Again, Parsoid adds implicit <td>s here, PHP and Tidy strip the b out.
-!! test
-<pre> tags should be recognized in an explicit <td> context, but not in an implicit <td> context
-!! options
-parsoid=wt2html,html2html
-!! wikitext
-{|
-|-
-|
- a
-|-
- b
-|}
-!! html/php
-<table>
-
-<tr>
-<td>
-<pre>a
-</pre>
-</td></tr>
- b
-</table>
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'>a</p><table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
 
-!! html/php+tidy
-<p>b</p>
-<table>
-<tr>
-<td>
-<pre>
-a
-</pre></td>
-</tr>
-</table>
-!! html/parsoid
-<table>
-<tbody>
-<tr><td><pre>a</pre></td></tr>
-<tr><td> b</td></tr>
-</tbody>
-</table>
+</tr></tbody></table>
 !! end
 
-# PHP + Tidy strips the list out of the table; Parsoid wraps it.
-# Parsoid generates the missing <td>, so wt2wt won't succeed.
 !! test
 Lists should be recognized in an implicit <td> context
 !! options
@@ -6975,13 +7028,10 @@ parsoid=wt2html,html2html
 <li>a</li>
 </ul>
 !! html/parsoid
-<table>
-<tr>
-<td><ul>
-<li>a</li>
-</ul></td>
-</tr>
-</table>
+<ul data-parsoid='{"fostered":true,"autoInsertedEnd":true}'><li>a</li></ul><table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
+
+</tr></tbody></table>
 !! end
 
 !! test
@@ -7002,12 +7052,11 @@ Table cells not properly parsed in an implicit-td context
 !! html/parsoid
 <table>
 <tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
-<td style="background-color:#DC241f;" width="10px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":["",{"template":{"target":{"wt":"table_attribs_4","href":"./Template:Table_attribs_4"},"params":{},"i":0}}," "]}'> </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> a </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> b</td></tr>
-</tbody></table>
+<td style="background-color:#DC241f;" width="10px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"table_attribs_4","href":"./Template:Table_attribs_4"},"params":{},"i":0}}," || a || b"]}'> </td><td about="#mwt1"> a </td><td about="#mwt1"> b</td></tr>
 !! end
 
 !! test
-Parsoid: Round-trip tables directly followed by content (bug 51219)
+Parsoid: Round-trip tables directly followed by content (T53219)
 !! options
 parsoid=wt2html,wt2wt
 !! wikitext
@@ -7034,7 +7083,7 @@ parsoid=wt2html,wt2wt
 !! end
 
 !! test
-Parsoid: Default to a newline after tables in new content (bug 51219)
+Parsoid: Default to a newline after tables in new content (T53219)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -7426,7 +7475,7 @@ Piped link with multiple pipe characters in link text
 <p><a href="/wiki/Main_Page" title="Main Page">|The|Main|Page|</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="Main_Page" title="Main Page">|The|Main|Page|</a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">|The|Main|Page|</a></p>
 !! end
 
 !! test
@@ -7443,7 +7492,7 @@ Piped link with no link text
 !! test
 Piped link with empty link text
 !! wikitext
-[[Main Page|<nowiki />]] - empty nowiki
+[[Main Page|<nowiki/>]] - empty nowiki
 [[Main Page| ]] - empty space
 [[Main Page|&nbsp;]] - empty non breaking space
 !! html/php
@@ -7452,7 +7501,7 @@ Piped link with empty link text
 <a href="/wiki/Main_Page" title="Main Page">&#160;</a> - empty non breaking space
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki />"}'/></a> - empty nowiki
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><span typeof="mw:Nowiki"></span></a> - empty nowiki
 <a rel="mw:WikiLink" href="./Main_Page" title="Main Page"> </a> - empty space
 <a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span></a> - empty non breaking space</p>
 !! end
@@ -7518,7 +7567,7 @@ Some text
 !! endarticle
 
 !! test
-Bug 43661: Piped links with identical prefixes
+T45661: Piped links with identical prefixes
 !! wikitext
 [[prefixed article|prefixed articles with spaces]]
 
@@ -7596,17 +7645,15 @@ Link with multiple pipes
 </p>
 !! end
 
-# Note that parsoid does not munge anchor text; all non-space
-# characters are valid in HTML5 ids.
 !! test
-Anchor containing a #. (bug 63430)
+Anchor containing a #. (T65430)
 !! wikitext
 [[Main Page#And#Link]]
 !! html/php
 <p><a href="/wiki/Main_Page#And.23Link" title="Main Page">Main Page#And#Link</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page#And%23Link" title="Main Page">Main Page#And#Link</a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page#And.23Link" title="Main Page" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#And.23Link"},"sa":{"href":"Main Page#And#Link"}}'>Main Page#And#Link</a></p>
 !! end
 
 !! test
@@ -7635,7 +7682,7 @@ This is an article in the MemoryAlpha namespace
 !! endarticle
 
 !! test
-Namespace takes precedence over interwiki link (bug 51680)
+Namespace takes precedence over interwiki link (T53680)
 !! wikitext
 [[MemoryAlpha:AlphaTest]]
 !! html
@@ -7721,18 +7768,16 @@ Link containing % as a double hex sequence interpreted to hex sequence
 </p>
 !!end
 
-# note that parsoid does not munge anchor text; all non-space
-# characters are valid in HTML5 anchors.
+## Example for such a section: == < ==
 !! test
 Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
-Example for such a section: == < ==
 !! wikitext
 [[%23%3c]][[%23%3e]]
 !! html/php
 <p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page#%3C" title="Main Page">#&lt;</a><a rel="mw:WikiLink" href="./Main_Page#%3E" title="Main Page">#></a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page#.3C" title="Main Page" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#.3C"},"sa":{"href":"%23%3c"}}'>#&lt;</a><a rel="mw:WikiLink" href="./Main_Page#.3E" title="Main Page" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#.3E"},"sa":{"href":"%23%3e"}}'>#></a></p>
 !! end
 
 !! test
@@ -7776,7 +7821,7 @@ Link containing a tilde
 !! end
 
 !! test
-Link containing double-single-quotes '' (bug 4598)
+Link containing double-single-quotes '' (T6598)
 !! wikitext
 [[Lista d''e paise d''o munno]]
 !! html/php
@@ -7787,18 +7832,45 @@ Link containing double-single-quotes '' (bug 4598)
 !! end
 
 !! test
-Link containing double-single-quotes '' in text (bug 4598 sanity check)
+Link containing double quotes and spaces
+!! wikitext
+[[Cool "Gator"]]
+!! html/php
+<p><a href="/index.php?title=Cool_%22Gator%22&amp;action=edit&amp;redlink=1" class="new" title="Cool &quot;Gator&quot; (page does not exist)">Cool "Gator"</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Cool_%22Gator%22" title='Cool "Gator"'>Cool "Gator"</a></p>
+!! end
+
+!! test
+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>
+!! end
+
+!! test
+Redirect containing double quotes and spaces
+!! wikitext
+#REDIRECT [[Cool "Gator"]]
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Cool_%22Gator%22" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./Cool_%22Gator%22"},"sa":{"href":"Cool \"Gator\""}}'/>
+!! end
+
+!! test
+Link containing double-single-quotes '' in text (T6598 sanity check)
 !! wikitext
 Some [[Link|pretty ''italics'' and stuff]]!
 !! html/php
 <p>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!
 </p>
 !! html/parsoid
-<p>Some <a rel="mw:WikiLink" href="Link" title="Link">pretty <i>italics</i> and stuff</a>!</p>
+<p>Some <a rel="mw:WikiLink" href="./Link" title="Link">pretty <i>italics</i> and stuff</a>!</p>
 !! end
 
 !! test
-Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
+Link containing double-single-quotes '' in text embedded in italics (T6598 sanity check)
 !! wikitext
 ''Some [[Link|pretty ''italics'' and stuff]]!''
 !! html
@@ -7824,13 +7896,13 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 </p>
 !! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Denys_Savchenko_''Pentecoste''.jpg"><img resource="./File:Denys_Savchenko_''Pentecoste''.jpg" src="./Special:FilePath/Denys_Savchenko_''Pentecoste''.jpg" height="220" width="220"/></a></span></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''">''Pentecoste''</a></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''">Pentecoste</a></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''"><i>Pentecoste</i></a></p>
+<p><a rel="mw:WikiLink" href="./''Pentecoste''" title="''Pentecoste''">''Pentecoste''</a></p>
+<p><a rel="mw:WikiLink" href="./''Pentecoste''" title="''Pentecoste''">Pentecoste</a></p>
+<p><a rel="mw:WikiLink" href="./''Pentecoste''" title="''Pentecoste''"><i>Pentecoste</i></a></p>
 !! end
 
 !! test
-Broken image links with HTML captions (bug 39700)
+Broken image links with HTML captions (T41700)
 !! wikitext
 [[File:Nonexistent|<script></script>]]
 [[File:Nonexistent|100x100px|<script></script>]]
@@ -7921,11 +7993,11 @@ Piped link to URL: [[http://www.example.com|an example URL]]
 <p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
 </p>
 !! html/parsoid
-<p>Piped link to URL: [<a rel="mw:ExtLink" href="http://www.example.com|an">example URL</a>]</p>
+<p>Piped link to URL: [<a rel="mw:ExtLink" href="http://www.example.com%7Can" data-parsoid='{"a":{"href":"http://www.example.com%7Can"},"sa":{"href":"http://www.example.com|an"}}'>example URL</a>]</p>
 !! end
 
 !! test
-BUG 2: [[page|http://url/]] should link to page, not http://url/
+T2002: [[page|http://url/]] should link to page, not http://url/
 !! wikitext
 [[Main Page|http://url/]]
 !! html/php
@@ -7937,7 +8009,7 @@ BUG 2: [[page|http://url/]] should link to page, not http://url/
 
 # Parsoid does not mark self-links, by design.
 !! test
-BUG 337: Escaped self-links should be bold
+T2337: Escaped self-links should be bold
 !! options
 title=[[Bug462]]
 !! wikitext
@@ -8009,7 +8081,7 @@ Non-breaking spaces in title
 !!end
 
 !! test
-Internal link with ca linktrail, surrounded by bold apostrophes (bug 27473 primary issue)
+Internal link with ca linktrail, surrounded by bold apostrophes (T29473 primary issue)
 !! options
 language=ca
 !! wikitext
@@ -8020,7 +8092,7 @@ language=ca
 !! end
 
 !! test
-Internal link with ca linktrail, surrounded by italic apostrophes (bug 27473 primary issue)
+Internal link with ca linktrail, surrounded by italic apostrophes (T29473 primary issue)
 !! options
 language=ca
 !! wikitext
@@ -8031,7 +8103,7 @@ language=ca
 !! end
 
 !! test
-Internal link with en linktrail: no apostrophes (bug 27473)
+Internal link with en linktrail: no apostrophes (T29473)
 !! options
 language=en
 !! wikitext
@@ -8042,7 +8114,7 @@ language=en
 !! end
 
 !! test
-Internal link with ca linktrail with apostrophes (bug 27473)
+Internal link with ca linktrail with apostrophes (T29473)
 !! options
 language=ca
 !! wikitext
@@ -8053,7 +8125,7 @@ language=ca
 !! end
 
 !! test
-Internal link with kaa linktrail with apostrophes (bug 27473)
+Internal link with kaa linktrail with apostrophes (T29473)
 !! options
 language=kaa
 !! wikitext
@@ -8064,7 +8136,7 @@ language=kaa
 !! end
 
 !! test
-Link with multiple ":" in a subpage-supporting namespace (bug 63636)
+Link with multiple ":" in a subpage-supporting namespace (T65636)
 !! wikitext
 [[User:Foo/Test/63636:Bar|Test]]
 !! html/php
@@ -8079,19 +8151,32 @@ Link with multiple ":" in a subpage-supporting namespace (bug 63636)
 Handle title parsing for subpages
 !! options
 title=[[/123123]]
+subpage
 !! wikitext
 123
+!! html/php
+<p>123
+</p>
 !! html/parsoid
 <p>123</p>
 !! end
 
-## FIXME: Add a working php section here
+!! article
+User:Test/123
+!! text
+test 123
+!! endarticle
+
 !! test
 Link to a subpage from a namespace other than main
 !! options
-title=[[User:test]]
+title=[[User:Test]]
+subpage
 !! wikitext
 [[/123]]
+!! html/php
+<p><a href="/wiki/User:Test/123" title="User:Test/123">/123</a>
+</p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./User:Test/123" title="User:Test/123" data-parsoid='{"stx":"simple","a":{"href":"./User:Test/123"},"sa":{"href":"/123"}}'>/123</a></p>
 !! end
@@ -8113,7 +8198,8 @@ parsoid=wt2html
 !! test
 Purely hash wikilink
 !! options
-title=[[User:test/123]]
+title=[[User:Test/123]]
+subpage
 !! wikitext
 [[#a|b]]
 !! html/php
@@ -8125,12 +8211,10 @@ title=[[User:test/123]]
 
 !! test
 1. Interaction of linktrail and template encapsulation
-!! options
-parsoid
 !! wikitext
 {{echo|[[Foo]]}}l
-!! html
-<p><a rel="mw:WikiLink" href="Foo" title="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Foo" title="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
 !! end
 
 !! test
@@ -8200,7 +8284,7 @@ Parsoid link trail escaping
 !! options
 parsoid=html2wt,html2html
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="Apple" title="Apple">apple</a>s</p>
+<p><a rel="mw:WikiLink" href="./Apple" title="Apple">apple</a>s</p>
 !! wikitext
 [[apple]]<nowiki/>s
 !! end
@@ -8211,7 +8295,7 @@ Parsoid link prefix escaping
 language=is
 parsoid=html2wt,html2html
 !! html/parsoid
-<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður">söfnuður</a></p>
+<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="./Söfnuður" title="Söfnuður">söfnuður</a></p>
 !! wikitext
 Aðrir mótmælenda<nowiki/>[[söfnuður]]
 !! end
@@ -8236,12 +8320,10 @@ Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
 
 !! test
 Parsoid: Scoped parsing should handle mixed transclusions and plain text
-!! options
-parsoid
 !! wikitext
 [[Foo|{{echo|a}} b {{echo|c}}]]
-!! html
-<p><a rel="mw:WikiLink" href="Foo" title="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Foo" title="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
 !! end
 
 !! test
@@ -8252,7 +8334,7 @@ Link with angle bracket after anchor
 <p><a href="/wiki/Foo#.3Cbar.3E" title="Foo">Foo#&lt;bar&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Foo#%3Cbar%3E" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo#%3Cbar%3E"},"sa":{"href":"Foo#&lt;bar>"}}'>Foo#&lt;bar></a></p>
+<p><a rel="mw:WikiLink" href="./Foo#.3Cbar.3E" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo#.3Cbar.3E"},"sa":{"href":"Foo#&lt;bar>"}}'>Foo#&lt;bar></a></p>
 !! end
 
 ###
@@ -8273,7 +8355,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Inline interwiki link with empty title (bug 2372)
+Inline interwiki link with empty title (T4372)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -8286,7 +8368,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Interwiki link encoding conversion (bug 1636)
+Interwiki link encoding conversion (T3636)
 !! wikitext
 *[[Wikipedia:ro:Olteni&#0355;a]]
 *[[Wikipedia:ro:Olteni&#355;a]]
@@ -8302,7 +8384,7 @@ Interwiki link encoding conversion (bug 1636)
 !! end
 
 !! test
-Interwiki link with fragment (bug 2130)
+Interwiki link with fragment (T4130)
 !! wikitext
 [[MeatBall:SoftSecurity#foo]]
 !! html
@@ -8310,6 +8392,23 @@ Interwiki link with fragment (bug 2130)
 </p>
 !! end
 
+!! test
+Link scenarios with escaped fragments
+!! wikitext
+[[#Is this great?]]
+[[Foo#Is this great?]]
+[[meatball:Foo#Is this great?]]
+!! html/php
+<p><a href="#Is_this_great.3F">#Is this great?</a>
+<a href="/wiki/Foo#Is_this_great.3F" title="Foo">Foo#Is this great?</a>
+<a href="http://www.usemod.com/cgi-bin/mb.pl?Foo#Is_this_great.3F" class="extiw" title="meatball:Foo">meatball:Foo#Is this great?</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page#Is_this_great.3F" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#Is_this_great.3F"},"sa":{"href":"#Is this great?"}}'>#Is this great?</a>
+<a rel="mw:WikiLink" href="./Foo#Is_this_great.3F" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo#Is_this_great.3F"},"sa":{"href":"Foo#Is this great?"}}'>Foo#Is this great?</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?Foo#Is_this_great.3F" title="meatball:Foo" data-parsoid='{"stx":"simple","a":{"href":"http://www.usemod.com/cgi-bin/mb.pl?Foo#Is_this_great.3F"},"sa":{"href":"meatball:Foo#Is this great?"},"isIW":true}'>meatball:Foo#Is this great?</a></p>
+!! end
+
 # Ideally the wikipedia: prefix here should be proto-relative too
 # [CSA]: this is kind of a bogus test, as the PHP parser test doesn't
 # define the 'en' prefix, and originally the test used 'wikipedia',
@@ -8411,7 +8510,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Local interwiki link: prefix only (bug 64167)
+Local interwiki link: prefix only (T66167)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -8424,7 +8523,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Local interwiki link: with additional interwiki prefix (bug 61357)
+Local interwiki link: with additional interwiki prefix (T63357)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -8518,6 +8617,23 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Foo_bar" />
 !! end
 
+!! test
+Escaping of interlanguage links (T129218, T156308)
+!! wikitext
+Blah blah blah
+[[:es:Spanish]]
+[[ : zh : Chinese ]]
+!! html/php
+<p>Blah blah blah
+<a href="http://es.wikipedia.org/wiki/Spanish" class="extiw" title="es:Spanish">es:Spanish</a>
+<a href="http://zh.wikipedia.org/wiki/Chinese" class="extiw" title="zh:Chinese"> zh : Chinese </a>
+</p>
+!! html/parsoid
+<p>Blah blah blah
+<a rel="mw:ExtLink" href="http://es.wikipedia.org/wiki/Spanish" title="es:Spanish">es:Spanish</a>
+<a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese"> zh : Chinese </a></p>
+!! end
+
 ## parsoid html2wt will normalize the space to _
 !! test
 Space and question mark encoding in interlanguage links (T95473)
@@ -8550,7 +8666,7 @@ Blah blah blah
 !! end
 
 !! test
-Double interlanguage link, with prefix links (bug 8897)
+Double interlanguage link, with prefix links (T10897)
 !! options
 language=ln
 !! wikitext
@@ -8567,7 +8683,7 @@ Blah blah blah
 !! end
 
 !! test
-"Extra" interlanguage links (bug 32189 / gerrit 111390)
+"Extra" interlanguage links (T34189 / gerrit 111390)
 !! wikitext
 Blah blah blah
 [[mul:Article]]
@@ -8619,12 +8735,12 @@ language=ln
 !! end
 
 !! test
-Parsoid bug 53221: Wikilinks should be properly entity-escaped
+Parsoid T55221: Wikilinks should be properly entity-escaped
 !! options
 parsoid={ "modes": ["html2wt"], "suppressErrors": true }
 !! html/parsoid
-<p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
-<p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="./Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="./He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
 !! wikitext
 He&amp;nbsp;llo [[Foo|He&amp;nbsp;llo]]
 
@@ -8696,7 +8812,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Handle interwiki links pointing to the current wiki as plain wiki links (bug 45209)
+Handle interwiki links pointing to the current wiki as plain wiki links (T47209)
 !! wikitext
 [[mi:Foo]]
 !! html/php
@@ -8707,7 +8823,7 @@ Handle interwiki links pointing to the current wiki as plain wiki links (bug 452
 !! end
 
 !! test
-Interlanguage link with preceding local interwiki link (bug 68085)
+Interlanguage link with preceding local interwiki link (T70085)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -8954,7 +9070,7 @@ Broken br tag sanitization
 </p>
 !! end
 
-# TODO: Fix html2html mode (bug 51055)!
+# TODO: Fix html2html mode (T53055)!
 !! test
 Parsoid: Broken br tag recognition
 !! options
@@ -9338,7 +9454,7 @@ parsoid
 !! end
 
 !! test
-List items are not parsed correctly following a <pre> block (bug 785)
+List items are not parsed correctly following a <pre> block (T2785)
 !! wikitext
 * <pre>foo</pre>
 * <pre>bar</pre>
@@ -9349,8 +9465,8 @@ List items are not parsed correctly following a <pre> block (bug 785)
 <li> zar</li></ul>
 
 !! html/parsoid
-<ul><li> <pre data-parsoid='{"stx":"html"}'>foo</pre></li>
-<li> <pre data-parsoid='{"stx":"html"}'>bar</pre></li>
+<ul><li> <pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre></li>
+<li> <pre typeof="mw:Extension/pre" about="#mwt4" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"bar"}}'>bar</pre></li>
 <li> zar</li></ul>
 !! end
 
@@ -9547,7 +9663,7 @@ Unbalanced closing block tags break a list
 !! end
 
 # Parsoid fails this test, but it might be tricky to support properly.
-# See bug 68395.
+# See T70395.
 !! test
 Unbalanced closing non-block tags don't break a list
 (php parser relies on Tidy to fix up)
@@ -9589,7 +9705,7 @@ parsoid=wt2html,wt2wt,html2html
 <li><s> b </s></li></ol>
 !! end
 
-# See bug 68395.
+# See T70395.
 !!test
 1. List embedded in a formatting tag
 !! wikitext
@@ -9781,7 +9897,7 @@ Magic Word: {{CURRENTHOUR}}
 !! end
 
 !! test
-Magic Word: {{CURRENTWEEK}} (@bug 4594)
+Magic Word: {{CURRENTWEEK}} (T6594)
 !! wikitext
 {{CURRENTWEEK}}
 !! html
@@ -10128,7 +10244,7 @@ title=[['foo & bar = baz']]
 !! end
 
 !! test
-Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
+Magic Word: {{PAGENAME}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
 !! wikitext
@@ -10152,7 +10268,7 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 !! end
 
 !! test
-Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
+Magic Word: {{PAGENAMEE}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
 !! wikitext
@@ -10217,6 +10333,26 @@ Magic Word: {{SITENAME}}
 </p>
 !! end
 
+!! test
+Magic Word: {{PAGELANGUAGE}}
+!! options
+language=fr
+!! wikitext
+{{PAGELANGUAGE}}
+!! html
+<p>fr
+</p>
+!! end
+
+!! test
+Magic Word: {{PAGELANGUAGE}} on a page with no explicitly set language
+!! wikitext
+{{PAGELANGUAGE}}
+!! html
+<p>en
+</p>
+!! end
+
 !! test
 Case-sensitive magic words, when cased differently, should just be template transclusions
 !! wikitext
@@ -10253,7 +10389,7 @@ Parsoid: Page property magic word with magic word contents
 !! wikitext
 {{DISPLAYTITLE:''{{PAGENAME}}''}}
 !! html/parsoid
-<meta property="mw:PageProp/displaytitle" content="Main Page" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main Page&lt;/span>&lt;/i>"}]]}'/>
+<meta property="mw:PageProp/displaytitle" content="Main Page" about="#mwt3" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main Page&lt;/span>&lt;/i>"}]]}'/>
 !! end
 
 !! test
@@ -10283,7 +10419,7 @@ Namespace 1 {{ns:01}}
 !! end
 
 !! test
-Namespace 0 {{ns:0}} (bug 4783)
+Namespace 0 {{ns:0}} (T6783)
 !! wikitext
 {{ns:0}}
 !! html
@@ -10291,7 +10427,7 @@ Namespace 0 {{ns:0}} (bug 4783)
 !! end
 
 !! test
-Namespace 0 {{ns:00}} (bug 4783)
+Namespace 0 {{ns:00}} (T6783)
 !! wikitext
 {{ns:00}}
 !! html
@@ -10374,7 +10510,6 @@ language=de
 </p>
 !! end
 
-
 !! test
 Urlencode
 !! wikitext
@@ -10382,7 +10517,7 @@ Urlencode
 {{urlencode:hi world?!|WIKI}}
 {{urlencode:hi world?!|PATH}}
 {{urlencode:hi world?!|QUERY}}
-!! html
+!! html/php
 <p>hi+world%3F%21
 hi_world%3F!
 hi%20world%3F%21
@@ -10436,7 +10571,7 @@ __proto__
 ### Magic links
 ###
 !! test
-Magic links: internal link to RFC (bug 479)
+Magic links: internal link to RFC (T2479)
 !! wikitext
 [[RFC 123]]
 !! html/php
@@ -10447,7 +10582,7 @@ Magic links: internal link to RFC (bug 479)
 !! end
 
 !! test
-Magic links: RFC (bug 479)
+Magic links: RFC (T2479)
 !! wikitext
 RFC 822
 !! html/php
@@ -10458,7 +10593,7 @@ RFC 822
 !! end
 
 !! test
-Magic links: RFC (bug 65278)
+Magic links: RFC (T67278)
 !! wikitext
 This is RFC 822 but thisRFC 822 is not RFC 822linked.
 !! html/php
@@ -10469,7 +10604,7 @@ This is RFC 822 but thisRFC 822 is not RFC 822linked.
 !! end
 
 !! test
-Magic links: RFC (w/ non-newline whitespace, bug 28950/29025)
+Magic links: RFC (w/ non-newline whitespace, T30950/T31025)
 !! wikitext
 RFC &nbsp;&#160;&#0160;&#xA0;&#Xa0; 822
 RFC
@@ -10486,7 +10621,7 @@ RFC
 !! end
 
 !! test
-Magic links: ISBN (bug 1937)
+Magic links: ISBN (T3937)
 !! wikitext
 ISBN 0-306-40615-2
 !! html/php
@@ -10497,7 +10632,7 @@ ISBN 0-306-40615-2
 !! end
 
 !! test
-Magic links: ISBN (bug 65278)
+Magic links: ISBN (T67278)
 !! wikitext
 This is ISBN 978-0-316-09811-3 but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.
 !! html/php
@@ -10508,7 +10643,7 @@ This is ISBN 978-0-316-09811-3 but thisISBN 978-0-316-09811-3 is not ISBN 978-0-
 !! end
 
 !! test
-Magic links: ISBN (w/ non-newline whitespace, bug 28950/29025)
+Magic links: ISBN (w/ non-newline whitespace, T30950/T31025)
 !! wikitext
 ISBN &nbsp;&#160;&#0160;&#xA0;&#Xa0; 978&nbsp;0&#160;316&#0160;09811&#xA0;3
 ISBN
@@ -10542,7 +10677,7 @@ PMID 1234
 !! end
 
 !! test
-Magic links: PMID (bug 65278)
+Magic links: PMID (T67278)
 !! wikitext
 This is PMID 1234 but thisPMID 1234 is not PMID 1234linked.
 !! html/php
@@ -10553,7 +10688,7 @@ This is PMID 1234 but thisPMID 1234 is not PMID 1234linked.
 !! end
 
 !! test
-Magic links: PMID (w/ non-newline whitespace, bug 28950/29025)
+Magic links: PMID (w/ non-newline whitespace, T30950/T31025)
 !! wikitext
 PMID &nbsp;&#160;&#0160;&#xA0;&#Xa0; 1234
 PMID
@@ -10644,7 +10779,7 @@ Template with invalid target containing wikilink
 !! end
 
 !! test
-Template with just whitespace in it, bug #68421
+Template with just whitespace in it, T70421
 !! wikitext
 {{echo|{{ }}}}
 !! html/parsoid
@@ -10862,7 +10997,7 @@ Template with complex arguments
 !! end
 
 !! test
-BUG 553: link with two variables in a piped link
+T2553: link with two variables in a piped link
 !! wikitext
 {|
 |[[{{{1}}}|{{{2}}}]]
@@ -10875,7 +11010,8 @@ BUG 553: link with two variables in a piped link
 
 !! html/parsoid
 <table>
-<tbody><tr><td>[[<span about="#mwt5" typeof="mw:Param" data-parsoid='{"src":"{{{1}}}"}'>{{{1}}}</span>|<span about="#mwt2" typeof="mw:Param" data-parsoid='{"src":"{{{2}}}"}'>{{{2}}}</span>]]</td></tr>
+<tbody><tr><td>[[<span about="#mwt5" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"1"},"params":{},"i":0}}]}'>{{{1}}}</span>|<span about="#mwt2" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"2"},"params":{},"i":0}}]}'>{{{2}}}</span>]]</td></tr>
+</tbody></table>
 !! end
 
 # See: T2553
@@ -11022,7 +11158,7 @@ Template:table
 !! endarticle
 
 !! test
-BUG 529: Template with table, not included at beginning of line
+T2529: Template with table, not included at beginning of line
 !! wikitext
 foo {{table}}
 !! html
@@ -11041,7 +11177,7 @@ foo {{table}}
 !! end
 
 !! test
-BUG 523: Template shouldn't eat newline (or add an extra one before table)
+T2523: Template shouldn't eat newline (or add an extra one before table)
 !! wikitext
 foo
 {{table}}
@@ -11061,7 +11197,7 @@ foo
 !! end
 
 !! test
-BUG 41: Template parameters shown as broken links
+T2041: Template parameters shown as broken links
 !! wikitext
 {{{parameter}}}
 !! html
@@ -11309,7 +11445,7 @@ Template:Includeonly section
 !!endarticle
 
 !! test
-Bug 6563: Edit link generation for section shown by <includeonly>
+T8563: Edit link generation for section shown by <includeonly>
 !! wikitext
 {{includeonly section}}
 !! html
@@ -11320,7 +11456,7 @@ Bug 6563: Edit link generation for section shown by <includeonly>
 
 # Uses same input as the contents of [[Template:Includeonly section]]
 !! test
-Bug 6563: Section extraction for section shown by <includeonly>
+T8563: Section extraction for section shown by <includeonly>
 !! options
 section=T-2
 !! wikitext
@@ -11333,7 +11469,7 @@ section=T-2
 !! end
 
 !! test
-Bug 6563: Edit link generation for section suppressed by <includeonly>
+T8563: Edit link generation for section suppressed by <includeonly>
 !! wikitext
 <includeonly>
 ==Includeonly section==
@@ -11345,7 +11481,7 @@ Bug 6563: Edit link generation for section suppressed by <includeonly>
 !! end
 
 !! test
-Bug 6563: Section extraction for section suppressed by <includeonly>
+T8563: Section extraction for section suppressed by <includeonly>
 !! options
 section=1
 !! wikitext
@@ -11567,7 +11703,7 @@ parsoid=wt2html
 |c
 |}
 !!html/parsoid
-<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>a&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><table about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"a":{"{{{b}}}":null},"sa":{"{{{b}}}":""}}' data-mw='{"attribs":[[{"txt":"{{{b}}}","html":"&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"dsr\":[31,38,null,null],\"src\":\"{{{b}}}\"}&#39;>{{{b}}}&lt;/span>"},{"html":""}]]}'>
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>a&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><table about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"a":{"{{{b}}}":null},"sa":{"{{{b}}}":""}}' data-mw='{"attribs":[[{"txt":"{{{b}}}","html":"&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[31,38,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"templatearg\":{\"target\":{\"wt\":\"b\"},\"params\":{},\"i\":0}}]}&#39;>{{{b}}}&lt;/span>"},{"html":""}]]}'>
 <tbody><tr><td>c</td></tr>
 </tbody></table>
 !!end
@@ -12108,11 +12244,11 @@ Templates: HTML Tables: 5. Proper fostering of categories from inside
 parsoid=wt2html,wt2wt
 !! wikitext
 <table>[[Category:foo1]]<tr><td>foo</td></tr></table>
-<!--Two categories (Bug 50330)-->
+<!--Two categories (T52330)-->
 <table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>
 !! html
 <link rel="mw:PageProp/Category" href="./Category:Foo1"><table><tbody><tr><td>foo</td></tr></tbody></table>
-<!--Two categories (Bug 50330)-->
+<!--Two categories (T52330)-->
 <link rel="mw:PageProp/Category" href="./Category:Bar1"><link rel="mw:PageProp/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table>
 !!end
 
@@ -12252,11 +12388,11 @@ Templates: Wiki Tables: 7. Fosterable <ref>s should get fostered
 
 <references />
 !!html/parsoid
-<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"PartialTable","href":"./Template:PartialTable"},"params":{},"i":0}},"&lt;ref>foo&lt;/ref>\n|}"]}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span><table about="#mwt2">
+<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"PartialTable","href":"./Template:PartialTable"},"params":{},"i":0}},"&lt;ref>foo&lt;/ref>\n|}"]}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span><table about="#mwt2">
 <tbody>
 </tbody></table>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
 !!end
 
 !! test
@@ -12424,7 +12560,7 @@ Templates: Ugly templates: 4. newline-only template parameter inconsistency
 </p>
 !! end
 
-# Bug 64017 -- ugly wikitext with fostered content generates two template ranges that
+# T66017 -- ugly wikitext with fostered content generates two template ranges that
 # have a true overlap (T1-start - T2-start - T1-end - T2-end).
 !! test
 Templates: Ugly templates: 5. Template encapsulation test: Non-trivial overlap of template ranges is properly handled
@@ -12438,7 +12574,7 @@ Templates: Ugly templates: 5. Template encapsulation test: Non-trivial overlap o
 </table>
 !! end
 
-# Bug 64017 -- ugly wikitext with fostered content generates two template ranges
+# T66017 -- ugly wikitext with fostered content generates two template ranges
 # that are "identical" and generate nesting cycles in the algorithm
 !! test
 Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of template ranges is properly handled
@@ -12456,11 +12592,16 @@ Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of t
 Templates: Parameters substituted at the top-level
 !! wikitext
 {{{foo|''who'' {{echo|me}}? '''never!'''}}}
+
+{{{foo|bar|baz}}}
 !! html/php
 <p><i>who</i> me? <b>never!</b>
+</p><p>bar
 </p>
 !! html/parsoid
-<p about="#mwt2" typeof="mw:Param" data-parsoid="{&quot;src&quot;:&quot;{{{foo|''who'' {{echo|me}}? '''never!'''}}}&quot;}"><i>who</i> me? <b>never!</b></p>
+<p about="#mwt2" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"foo"},"params":{"1":{"wt":"&#39;&#39;who&#39;&#39; {{echo|me}}? &#39;&#39;&#39;never!&#39;&#39;&#39;"}},"i":0}}]}'><i>who</i> me? <b>never!</b></p>
+
+<p about="#mwt3" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"foo"},"params":{"1":{"wt":"bar"},"2":{"wt":"baz"}},"i":0}}]}'>bar</p>
 !! end
 
 !!test
@@ -12524,7 +12665,7 @@ pst
 MediaWiki
 !! end
 
-# This is bug 89, which I fixed. -- wtm
+# This is T2089, which I fixed. -- wtm
 !! test
 pre-save transform: subst: templates with parameters
 !! options
@@ -12542,7 +12683,7 @@ Template:nowikitest
 !! endarticle
 
 !! test
-pre-save transform: nowiki in subst (bug 1188)
+pre-save transform: nowiki in subst (T3188)
 !! options
 pst
 !! wikitext
@@ -12558,7 +12699,7 @@ This template has <!-- a comment --> in it.
 !! endarticle
 
 !! test
-pre-save transform: comment in subst (bug 1936)
+pre-save transform: comment in subst (T3936)
 !! options
 pst
 !! wikitext
@@ -12607,7 +12748,7 @@ Template:dangerous
 !!endarticle
 
 !!test
-(confirming safety of fix for subst bug 1936)
+(confirming safety of fix for subst T3936)
 !! wikitext
 {{Template:dangerous}}
 !! html
@@ -12616,7 +12757,7 @@ Template:dangerous
 !! end
 
 !! test
-pre-save transform: comment containing gallery (bug 5024)
+pre-save transform: comment containing gallery (T7024)
 !! options
 pst
 !! wikitext
@@ -12646,7 +12787,7 @@ pst
 !!end
 
 !! test
-pre-save transform: <noinclude> in subst (bug 3298)
+pre-save transform: <noinclude> in subst (T5298)
 !! options
 pst
 !! wikitext
@@ -12656,7 +12797,7 @@ Foobar
 !! end
 
 !! test
-pre-save transform: <onlyinclude> in subst (bug 3298)
+pre-save transform: <onlyinclude> in subst (T5298)
 !! options
 pst
 !! wikitext
@@ -12678,7 +12819,7 @@ Template:SafeSubstTest
 !! endarticle
 
 !! test
-bug 22297: safesubst: works during PST
+T24297: safesubst: works during PST
 !! options
 pst
 !! wikitext
@@ -12688,7 +12829,7 @@ FoobarFoobar
 !! end
 
 !! test
-bug 22297: safesubst: works during normal parse
+T24297: safesubst: works during normal parse
 !! wikitext
 {{SafeSubstTest}}
 !! html
@@ -12846,7 +12987,7 @@ pst title=[[Ns:Somearticle (IGNORED), Context]]
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
+pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, T32149)
 !! options
 pst
 !! wikitext
@@ -12866,7 +13007,7 @@ pst
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
+pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, T32149)
 !! options
 pst
 !! wikitext
@@ -12886,7 +13027,7 @@ pst
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
+pre-save transform: context links ("pipe trick") with parens and no space (Korean style, T32149)
 !! options
 pst
 !! wikitext
@@ -12906,7 +13047,7 @@ pst
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with commas (bug 21660)
+pre-save transform: context links ("pipe trick") with commas (T23660)
 !! options
 pst
 !! wikitext
@@ -12957,7 +13098,7 @@ pst
 
 
 !! test
-pre-save transform: Signature expansion in nowiki tags (bug 93)
+pre-save transform: Signature expansion in nowiki tags (T2093)
 !! options
 pst disabled
 !! wikitext
@@ -13080,7 +13221,7 @@ msg
 !! end
 
 !! test
-message transform: <noinclude> in transcluded template (bug 4926)
+message transform: <noinclude> in transcluded template (T6926)
 !! options
 msg
 !! wikitext
@@ -13090,7 +13231,7 @@ Foobar
 !! end
 
 !! test
-message transform: <onlyinclude> in transcluded template (bug 4926)
+message transform: <onlyinclude> in transcluded template (T6926)
 !! options
 msg
 !! wikitext
@@ -13212,7 +13353,7 @@ Image with caption
 !! end
 
 !! test
-Image with caption, bug 53312 #1
+Image with caption, T55312 #1
 !! wikitext
 [[File:Foobar.jpg|right|Caption page stuff]]
 !! html/php
@@ -13223,7 +13364,7 @@ Image with caption, bug 53312 #1
 !! end
 
 !! test
-Image with caption, bug 53312 #2
+Image with caption, T55312 #2
 !! wikitext
 [[File:Foobar.jpg|right|Caption page=]]
 !! html/php
@@ -13234,7 +13375,7 @@ Image with caption, bug 53312 #2
 !! end
 
 !! test
-Image with caption, bug 53312 #3
+Image with caption, T55312 #3
 !! wikitext
 [[File:Foobar.jpg|right|Caption page=stuff]]
 !! html/php
@@ -13245,7 +13386,7 @@ Image with caption, bug 53312 #3
 !! end
 
 !! test
-Allow empty links in image captions (Bug 60753)
+Allow empty links in image captions (T62753)
 !! options
 thumbsize=220
 !! wikitext
@@ -13407,7 +13548,7 @@ Image with multiple widths -- use last
 !! end
 
 !! test
-Image with multiple alignments -- use first (bug 48664)
+Image with multiple alignments -- use first (T50664)
 !! options
 thumbsize=220
 !! wikitext
@@ -13442,7 +13583,7 @@ Image with width attribute at different positions
 
 # a sad bit of backward-compatibility
 !! test
-Image with size specified with pxpx (bug 13500, 51628)
+Image with size specified with pxpx (T15500, T53628)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -13464,10 +13605,10 @@ Image with link parameter, wiki target
 <p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image"><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image"><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
-# parsoid bug 49293 (part 1)
+# parsoid T51293 (part 1)
 !! test
 Image with link parameter, URL target
 !! wikitext
@@ -13479,7 +13620,7 @@ Image with link parameter, URL target
 <p><span class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
-# parsoid bug 49293 (part 2)
+# parsoid T51293 (part 2)
 !! test
 Image with link parameter, protocol-less URL target
 !! wikitext
@@ -13571,7 +13712,7 @@ Image with link parameter (wiki target) and unnamed parameter
 <p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
@@ -13623,7 +13764,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
 !! end
 
 !! test
@@ -13665,7 +13806,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="Main_Page"><img alt="alttext" resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="./Main_Page"><img alt="alttext" resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
 !! end
 
 !! test
@@ -13678,7 +13819,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page" title="Main Page">Main Page</a></figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></figcaption></figure>
 !! end
 
 !! test
@@ -13691,7 +13832,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page" title="Main Page">Main Page</a></figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></figcaption></figure>
 !! end
 
 !! test
@@ -13929,7 +14070,7 @@ Add test with existing image page
 !! end
 
 !! test
-bug 18784  Link to non-existent image page with caption should use caption as link text
+T20784  Link to non-existent image page with caption should use caption as link text
 !! wikitext
 [[:Image:test|caption]]
 !! html
@@ -14014,7 +14155,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-BUG 1887: A ISBN with a thumbnail
+T3887: A ISBN with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|ISBN 1235467890]]
 !! html/php
@@ -14025,7 +14166,7 @@ BUG 1887: A ISBN with a thumbnail
 !! end
 
 !! test
-BUG 1887: A RFC with a thumbnail
+T3887: A RFC with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|This is RFC 12354]]
 !! html/php
@@ -14036,7 +14177,7 @@ BUG 1887: A RFC with a thumbnail
 !! end
 
 !! test
-BUG 1887: A mailto link with a thumbnail
+T3887: A mailto link with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|Please mailto:nobody@example.com]]
 !! html/php
@@ -14046,9 +14187,9 @@ BUG 1887: A mailto link with a thumbnail
 <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>Please <a rel="mw:ExtLink" href="mailto:nobody@example.com">mailto:nobody@example.com</a></figcaption></figure>
 !! end
 
-# Pending resolution to bug 368
+# Pending resolution to T2368
 !! test
-BUG 648: Frameless image caption with a link
+T2648: Frameless image caption with a link
 !! wikitext
 [[File:Foobar.jpg|text with a [[link]] in it]]
 !! html/php
@@ -14059,7 +14200,7 @@ BUG 648: Frameless image caption with a link
 !! end
 
 !! test
-BUG 648: Frameless image caption with a link (suffix)
+T2648: Frameless image caption with a link (suffix)
 !! wikitext
 [[File:Foobar.jpg|text with a [[link]]foo in it]]
 !! html/php
@@ -14070,7 +14211,7 @@ BUG 648: Frameless image caption with a link (suffix)
 !! end
 
 !! test
-BUG 648: Frameless image caption with an interwiki link
+T2648: Frameless image caption with an interwiki link
 !! wikitext
 [[File:Foobar.jpg|text with a [[MeatBall:Link]] in it]]
 !! html/php
@@ -14081,7 +14222,7 @@ BUG 648: Frameless image caption with an interwiki link
 !! end
 
 !! test
-BUG 648: Frameless image caption with a piped interwiki link
+T2648: Frameless image caption with a piped interwiki link
 !! wikitext
 [[File:Foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
 !! html/php
@@ -14110,6 +14251,19 @@ Escape HTML special chars in image alt text
 <p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp; &lt; > \""}]}' data-mw='{"caption":"&amp;amp; &amp;lt; > \""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 !! end
 
+!! test
+Escape HTML special chars in image alt text with LanguageConverter
+!! options
+language=zh
+!! wikitext
+[[File:Foobar.jpg|& < > "]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp; &lt; > \""}]}' data-mw='{"caption":"&amp;amp; &amp;lt; > \""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+!! end
+
 !! test
 Entities in file name and attributes
 !! wikitext
@@ -14122,7 +14276,7 @@ Entities in file name and attributes
 !! end
 
 !! test
-BUG 499: Alt text should have &#1234;, not &amp;1234;
+T2499: Alt text should have &#1234;, not &amp;1234;
 !! wikitext
 [[File:Foobar.jpg|&#9792;]]
 !! html/php
@@ -14142,7 +14296,7 @@ parsoid=wt2html,wt2wt,html2html
 <p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
 </p>
 !! html/parsoid
-<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a rel="mw:WikiLink" href="Main_Page" title="Main Page">this</a> is just an ordinary link.</p>
+<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">this</a> is just an ordinary link.</p>
 !! end
 
 !! test
@@ -14206,7 +14360,7 @@ and some more text.]]
 !! end
 
 !! test
-Bug 3090: External links other than http: in image captions
+T5090: External links other than http: in image captions
 !! wikitext
 [[File:Foobar.jpg|thumb|200x200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
 !! html/php
@@ -14255,7 +14409,7 @@ language=es
 <div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"></a></div>caption</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
@@ -14285,7 +14439,7 @@ parsoid=wt2html,wt2wt,html2html
 
 # Note that 'right' is the default alignment, despite the misspelled 'righ' below
 !! test
-Invalid image attributes (bug 62500)
+Invalid image attributes (T64500)
 !! options
 thumbsize=220
 parsoid=wt2html,wt2wt,html2html
@@ -14549,9 +14703,9 @@ T93580: 1. Templated <ref> inside block images
 
 <references />
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption with templated ref: {{echo|&lt;ref>foo&lt;/ref>}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>Caption with templated ref: <span about="#mwt5" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption with templated ref: {{echo|&lt;ref>foo&lt;/ref>}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>Caption with templated ref: <span about="#mwt5" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo&lt;/ref>"}},"i":0}}]}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></figcaption></figure>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 !! test
@@ -14561,9 +14715,9 @@ T93580: 2. <ref> inside inline images
 
 <references />
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: &lt;ref>foo&lt;/ref>"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,78,5,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}&#39;>&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,78,5,6]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: &lt;ref>foo&lt;/ref>"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,78,5,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}&#39;>&lt;a href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,78,5,6]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 !! test
@@ -14573,9 +14727,9 @@ T93580: 3. Templated <ref> inside inline images
 
 <references />
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|&lt;ref>{{echo|foo}}&lt;/ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion  mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;>&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|&lt;ref>{{echo|foo}}&lt;/ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion  mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;>&lt;a href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 ###
@@ -14629,8 +14783,8 @@ subpage title=[[Subpage test/1/2/3/4]]
 </p><p><a href="/wiki/Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">Subpage test/1/2/subpage</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">subpage</a></p>
-<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
+<p><a rel="mw:WikiLink" href="./Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">subpage</a></p>
+<p><a rel="mw:WikiLink" href="./Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
 !! end
 
 !! test
@@ -14654,7 +14808,7 @@ Parsoid: dot-slash prefixed wikilinks
 !! end
 
 !! test
-Render invalid page names as plain text (bug 51090)
+Render invalid page names as plain text (T53090)
 !! wikitext
 [[./../foo|bar]]
 [[foo�|bar]]
@@ -14736,7 +14890,7 @@ Disabled subpages
 !! end
 
 !! test
-BUG 561: {{/Subpage}}
+T2561: {{/Subpage}}
 !! options
 subpage title=[[Page]]
 !! wikitext
@@ -14920,12 +15074,12 @@ Bar
 Bar
 </p>
 !! html/parsoid
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Baz]]"}},"i":0}}]}'/></p>
-<link rel="mw:PageProp/Category" href="Category:Baz"/>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Baz]]"}},"i":0}}]}'/></p>
+<link rel="mw:PageProp/Category" href="./Category:Baz"/>
 !! end
 
 ## We used to, but no longer wt2wt this test since the default serializer
@@ -14935,7 +15089,7 @@ Bar
 ##
 ## The whitespace on the empty line is part of the test. Please do not delete
 !! test
-1. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
+1. Categories and newlines: All preceding newlines should be suppressed (courtesy T2087)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -14964,7 +15118,7 @@ This
 ##
 ## The whitespace on the empty line is part of the test. Please do not delete
 !! test
-2. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
+2. Categories and newlines: All preceding newlines should be suppressed (courtesy T2087)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -15160,7 +15314,7 @@ parsoid
 !! end
 
 !! test
-Normalize hrefs properly before testing for invalid link targets (bug 70894)
+Normalize hrefs properly before testing for invalid link targets (T72894)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -15205,7 +15359,7 @@ es:Alimento fr:Nourriture zh:食品
 !! end
 
 !! test
-Duplicate interlanguage links (bug 24502)
+Duplicate interlanguage links (T26502)
 !! options
 ill
 !! wikitext
@@ -15432,7 +15586,7 @@ __FORCETOC__
 !! end
 
 !! test
-TOC with wgMaxTocLevel=3 (bug 6204)
+TOC with wgMaxTocLevel=3 (T8204)
 !! options
 wgMaxTocLevel=3
 !! wikitext
@@ -15469,7 +15623,7 @@ wgMaxTocLevel=3
 !! end
 
 !! test
-TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
+TOC with wgMaxTocLevel=3 and two level four headings (T8204)
 !! options
 wgMaxTocLevel=3
 !! wikitext
@@ -15511,7 +15665,7 @@ Resolving duplicate section names
 !! end
 
 !! test
-Resolving duplicate section names with differing case (bug 10721)
+Resolving duplicate section names with differing case (T12721)
 !! wikitext
 == Foo bar ==
 == Foo Bar ==
@@ -15590,7 +15744,7 @@ __TOC__
 !! end
 
 !! test
-BUG 1219 URL next to image (good)
+T3219 URL next to image (good)
 !! wikitext
 http://example.com [[File:Foobar.jpg]]
 !! html/php
@@ -15601,7 +15755,7 @@ http://example.com [[File:Foobar.jpg]]
 !!end
 
 !! test
-Short headings with trailing space should match behavior of Parser::doHeadings (bug 19910)
+Short headings with trailing space should match behavior of Parser::doHeadings (T21910)
 !! wikitext
 === 
 The line above must have a trailing space!
@@ -15618,7 +15772,7 @@ But just in case it doesn't...
 !! end
 
 !! test
-Header with special characters (bug 25462)
+Header with special characters (T27462)
 !! wikitext
 The tooltips shall not show entities to the user (ie. be double escaped)
 
@@ -15761,7 +15915,7 @@ Headers with excess '=' characters
 !! end
 
 !! test
-HTML headers vs TOC (bug 23393)
+HTML headers vs TOC (T25393)
 (__NOEDITSECTION__ for clearer output, doesn't matter here)
 !! wikitext
 <h1>Header 1</h1>
@@ -15818,7 +15972,7 @@ c3-->
 !! end
 
 !! test
-BUG 1219 URL next to image (broken)
+T3219 URL next to image (broken)
 !! wikitext
 http://example.com[[File:Foobar.jpg]]
 !! html/php
@@ -15829,7 +15983,7 @@ http://example.com[[File:Foobar.jpg]]
 !!end
 
 !! test
-Bug 1186 news: in the middle of text
+T3186 news: in the middle of text
 !! wikitext
 http://en.wikinews.org/wiki/Wikinews:Workplace
 !! html
@@ -15929,7 +16083,7 @@ parsoid=wt2html,html2html
 <div id="title.3D">HTML rocks</div>
 
 !! html/parsoid
-<div id="title=" data-parsoid='{"stx":"html"}'>HTML rocks</div>
+<div id="title.3D" data-parsoid='{"stx":"html"}'>HTML rocks</div>
 !! end
 
 !! test
@@ -15957,7 +16111,7 @@ div with braces in attribute value
 !! wikitext
 <div title="{}">Foo</div>
 !! html/php
-<div title="&#123;}">Foo</div>
+<div title="&#123;&#125;">Foo</div>
 
 !! html/parsoid
 <div title="{}">Foo</div>
@@ -16087,22 +16241,22 @@ HTML tag with leading space is parsed as text
 !! end
 
 ###
-### Nesting tests (see bug 41545, 50604, 51081)
+### Nesting tests (see T43545, T52604, T53081)
 ###
 
-# This test case is fixed in Parsoid by domino 1.0.12. (bug 50604)
+# This test case is fixed in Parsoid by domino 1.0.12. (T52604)
 # Note that html2wt is considerably more difficult if we use <b> in
-# the test case, instead of <big>
+# the test case, instead of <small>
 !! test
 Ensure that HTML adoption agency algorithm is properly implemented.
 !! wikitext
-<big>X<big>Y</big>Z</big>
+<small>X<small>Y</small>Z</small>
 !! html
-<p><big>X<big>Y</big>Z</big>
+<p><small>X<small>Y</small>Z</small>
 </p>
 !! end
 
-# This was bug 41545 in the PHP parser.
+# This was T43545 in the PHP parser.
 # Note that tidy doesn't handle this correctly.
 !! test
 Nesting of <kbd>
@@ -16113,9 +16267,9 @@ Nesting of <kbd>
 </p>
 !! end
 
-# The following cases were bug 51081 in the PHP parser.
+# The following cases were T53081 in the PHP parser.
 # Note that there are some other nestable tags (b, i, etc) which are
-# not covered; see bug 51081 for discussion.
+# not covered; see T53081 for discussion.
 
 # Note that tidy doesn't handle this correctly.
 !! test
@@ -16203,7 +16357,7 @@ Media link with nasty text
 !! end
 
 !! test
-Media link to nonexistent file (bug 1702)
+Media link to nonexistent file (T3702)
 !! wikitext
 [[Media:No such.jpg]]
 !! html
@@ -16212,7 +16366,7 @@ Media link to nonexistent file (bug 1702)
 !! end
 
 !! test
-Image link to nonexistent file (bug 1850 - good)
+Image link to nonexistent file (T3850 - good)
 !! wikitext
 [[File:No_such.jpg]]
 !! html/php
@@ -16223,7 +16377,7 @@ Image link to nonexistent file (bug 1850 - good)
 !! end
 
 !! test
-:Image link to nonexistent file (bug 1850 - bad)
+:Image link to nonexistent file (T3850 - bad)
 !! wikitext
 [[:Image:No such.jpg]]
 !! html/php
@@ -16236,7 +16390,7 @@ Image link to nonexistent file (bug 1850 - good)
 
 
 !! test
-Character reference normalization in link text (bug 1938)
+Character reference normalization in link text (T3938)
 !! wikitext
 [[Main Page|this&that]]
 !! html
@@ -16253,7 +16407,7 @@ The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
 !! endarticle
 
 !! test
-(bug 19451) Links should refer to the normalized form.
+(T21451) Links should refer to the normalized form.
 !! wikitext
 [[&#xFB2E;]]
 [[&#x5d0;&#x5b7;]]
@@ -16270,7 +16424,7 @@ The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
 !! end
 
 !! test
-Empty attribute crash test (bug 2067)
+Empty attribute crash test (T4067)
 !! wikitext
 <font color="">foo</font>
 !! html
@@ -16279,7 +16433,7 @@ Empty attribute crash test (bug 2067)
 !! end
 
 !! test
-Empty attribute crash test single-quotes (bug 2067)
+Empty attribute crash test single-quotes (T4067)
 !! wikitext
 <font color=''>foo</font>
 !! html
@@ -16338,7 +16492,7 @@ parsoid=wt2html,html2html
 !! end
 
 !! test
-Bug 2095: link with three closing brackets
+T4095: link with three closing brackets
 !! wikitext
 [[Main Page]]]
 !! html/php
@@ -16349,7 +16503,7 @@ Bug 2095: link with three closing brackets
 !! end
 
 !! test
-Bug 2095: link with pipe and three closing brackets
+T4095: link with pipe and three closing brackets
 !! wikitext
 [[Main Page|link]]]
 !! html/php
@@ -16360,7 +16514,7 @@ Bug 2095: link with pipe and three closing brackets
 !! end
 
 !! test
-Bug 2095: link with pipe and three closing brackets, version 2
+T4095: link with pipe and three closing brackets, version 2
 !! wikitext
 [[Main Page|[http://example.com/]]]
 !! html/php
@@ -16394,17 +16548,19 @@ Template:Div style
 !! endarticle
 
 !! test
-Bug 2304: HTML attribute safety (safe template; regression bug 2309)
+T4304: HTML attribute safety (safe template; regression T4309)
 !! wikitext
 <div title="{{test}}"></div>
-!! html
+!! html/php
 <div title="This is a test template"></div>
 
+!! html/parsoid
+<div title="This is a test template" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"title":"This is a test template"},"sa":{"title":"{{test}}"}}' data-mw='{"attribs":[[{"txt":"title"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[12,20,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"test\",\"href\":\"./Template:Test\"},\"params\":{},\"i\":0}}]}&#39;>This is a test template&lt;/span>"}]]}'></div>
 !! end
 
 # Parsoid has enough context to handle this case
 !! test
-Bug 2304: HTML attribute safety (dangerous template; 2309)
+T4304: HTML attribute safety (dangerous template; 2309)
 !! wikitext
 <div title="{{dangerous attribute}}"></div>
 !! html/php
@@ -16415,34 +16571,41 @@ Bug 2304: HTML attribute safety (dangerous template; 2309)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (dangerous style template; 2309)
+T4304: HTML attribute safety (dangerous style template; 2309)
 !! wikitext
 <div style="{{dangerous style attribute}}"></div>
-!! html
+!! html/php
 <div style="/* insecure input */"></div>
 
+!! html/parsoid
+<div style="/* insecure input */" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"{{dangerous style attribute}}"}}' data-mw='{"attribs":[[{"txt":"style"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[12,41,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"dangerous style attribute\",\"href\":\"./Template:Dangerous_style_attribute\"},\"params\":{},\"i\":0}}]}&#39;>border-size: expression(alert(document.cookie))&lt;/span>"}]]}'></div>
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (safe parameter; 2309)
+T4304: HTML attribute safety (safe parameter; 2309)
 !! wikitext
 {{div style|width: 200px}}
-!! html
+!! html/php
 <div style="float: right; width: 200px">Magic div</div>
 
+!! html/parsoid
+<div style="float: right; width: 200px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","a":{"style":"float: right; width: 200px"},"sa":{"style":"float: right; {{{1}}}"},"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"div style","href":"./Template:Div_style"},"params":{"1":{"wt":"width: 200px"}},"i":0}}]}'>Magic div</div>
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (unsafe parameter; 2309)
+T4304: HTML attribute safety (unsafe parameter; 2309)
 !! wikitext
 {{div style|width: expression(alert(document.cookie))}}
-!! html
+!! html/php
 <div style="/* insecure input */">Magic div</div>
 
+!! html/parsoid
+<div style="/* insecure input */" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"float: right; {{{1}}}"},"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"div style","href":"./Template:Div_style"},"params":{"1":{"wt":"width: expression(alert(document.cookie))"}},"i":0}}]}'>Magic div</div>
 !! end
 
+## Parsoid output here differs; needs investigation.
 !! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
+T4304: HTML attribute safety (unsafe breakout parameter; 2309)
 !! wikitext
 {{div style|"><script>alert(document.cookie)</script>}}
 !! html
@@ -16450,8 +16613,9 @@ Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
 
 !! end
 
+## Parsoid output here differs; needs investigation.
 !! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
+T4304: HTML attribute safety (unsafe breakout parameter 2; 2309)
 !! wikitext
 {{div style|" ><script>alert(document.cookie)</script>}}
 !! html
@@ -16460,7 +16624,7 @@ Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (link)
+T4304: HTML attribute safety (link)
 !! wikitext
 <div title="[[Main Page]]"></div>
 !! html
@@ -16469,7 +16633,7 @@ Bug 2304: HTML attribute safety (link)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (italics)
+T4304: HTML attribute safety (italics)
 !! wikitext
 <div title="''foobar''"></div>
 !! html
@@ -16478,7 +16642,7 @@ Bug 2304: HTML attribute safety (italics)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (bold)
+T4304: HTML attribute safety (bold)
 !! wikitext
 <div title="'''foobar'''"></div>
 !! html
@@ -16486,9 +16650,8 @@ Bug 2304: HTML attribute safety (bold)
 
 !! end
 
-
 !! test
-Bug 2304: HTML attribute safety (ISBN)
+T4304: HTML attribute safety (ISBN)
 !! wikitext
 <div title="ISBN 1234567890"></div>
 !! html
@@ -16497,7 +16660,7 @@ Bug 2304: HTML attribute safety (ISBN)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (RFC)
+T4304: HTML attribute safety (RFC)
 !! wikitext
 <div title="RFC 1234"></div>
 !! html
@@ -16506,7 +16669,7 @@ Bug 2304: HTML attribute safety (RFC)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (PMID)
+T4304: HTML attribute safety (PMID)
 !! wikitext
 <div title="PMID 1234567890"></div>
 !! html
@@ -16515,7 +16678,7 @@ Bug 2304: HTML attribute safety (PMID)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (web link)
+T4304: HTML attribute safety (web link)
 !! wikitext
 <div title="http://example.com/"></div>
 !! html
@@ -16524,7 +16687,7 @@ Bug 2304: HTML attribute safety (web link)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (named web link)
+T4304: HTML attribute safety (named web link)
 !! wikitext
 <div title="[http://example.com/ link]"></div>
 !! html
@@ -16533,21 +16696,25 @@ Bug 2304: HTML attribute safety (named web link)
 !! end
 
 !! test
-Bug 3244: HTML attribute safety (extension; safe)
+T5244: HTML attribute safety (extension; safe)
 !! wikitext
 <div style="<nowiki>background:blue</nowiki>"></div>
-!! html
+!! html/php
 <div style="background:blue"></div>
 
+!! html/parsoid
+<div style="background:blue" data-parsoid='{"stx":"html","a":{"style":"background:blue"},"sa":{"style":"&lt;nowiki>background:blue&lt;/nowiki>"}}'></div>
 !! end
 
 !! test
-Bug 3244: HTML attribute safety (extension; unsafe)
+T5244: HTML attribute safety (extension; unsafe)
 !! wikitext
 <div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
-!! html
+!! html/php
 <div style="/* insecure input */"></div>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"&lt;nowiki>border-left:expression(alert(document.cookie))&lt;/nowiki>"}}'></div>
 !! end
 
 # More MSIE fun discovered by Tom Gilder
@@ -16556,96 +16723,119 @@ Bug 3244: HTML attribute safety (extension; unsafe)
 MSIE CSS safety test: spurious slash
 !! wikitext
 <div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
-!! html
+!! html/php
 <div style="/* insecure input */">evil</div>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:u\\rl(javascript:alert(&#39;boo&#39;))"}}'>evil</div>
 !! end
 
 !! test
 MSIE CSS safety test: hex code
 !! wikitext
 <div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
-!! html
+!! html/php
 <div style="/* insecure input */">evil</div>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:u\\72l(javascript:alert(&#39;boo&#39;))"}}'>evil</div>
 !! end
 
 !! test
 MSIE CSS safety test: comment in url
 !! wikitext
 <div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
-!! html
+!! html/php
 <div style="background-image:u rl(javascript:alert(&#39;boo&#39;))">evil</div>
 
+!! html/parsoid
+<div style="background-image:u rl(javascript:alert('boo'))" data-parsoid='{"stx":"html","a":{"style":"background-image:u rl(javascript:alert(&#39;boo&#39;))"},"sa":{"style":"background-image:u/**/rl(javascript:alert(&#39;boo&#39;))"}}'>evil</div>
 !! end
 
 !! test
 MSIE CSS safety test: comment in expression
 !! wikitext
 <div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
-!! html
+!! html/php
 <div style="background-image:expres sion(alert(&#39;boo4&#39;))">evil4</div>
 
+!! html/parsoid
+<div style="background-image:expres sion(alert('boo4'))" data-parsoid='{"stx":"html","a":{"style":"background-image:expres sion(alert(&#39;boo4&#39;))"},"sa":{"style":"background-image:expres/**/sion(alert(&#39;boo4&#39;))"}}'>evil4</div>
 !! end
 
 !! test
-CSS safety test (all browsers): vertical tab (bug 55332 / CVE-2013-4567)
+CSS safety test (all browsers): vertical tab (T57332 / CVE-2013-4567)
 !! wikitext
 <p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
-!! html
+!! html/php
 <p style="/* invalid control char */">A</p>
 
+!! html/parsoid
+<p style="/* invalid control char */" data-parsoid='{"stx":"html","a":{"style":"/* invalid control char */"},"sa":{"style":"font-size: 100px; background-image:url\\b(https://www.google.com/images/srpr/logo6w.png)"}}'>A</p>
 !! end
 
 !! test
-MSIE 6 CSS safety test: Fullwidth (bug 55332)
+MSIE 6 CSS safety test: Fullwidth (T57332)
 !! wikitext
 <p style="font-size: 100px; color: expression((title='XSSed'),'red')">A</p>
 <div style="top:EXPRESSION(alert())">B</div>
-!! html
+!! html/php
 <p style="/* insecure input */">A</p>
 <div style="/* insecure input */">B</div>
 
+!! html/parsoid
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expression((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>A</p>
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"top:EXPRESSION(alert())"}}'>B</div>
 !! end
 
 !! test
-MSIE 6 CSS safety test: IPA extensions (bug 55332)
+MSIE 6 CSS safety test: IPA extensions (T57332)
 !! wikitext
 <div style="background-image:uʀʟ(javascript:alert())">A</div>
 <p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
-!! html
+!! html/php
 <div style="/* insecure input */">A</div>
 <p style="/* insecure input */">B</p>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:uʀʟ(javascript:alert())"}}'>A</div>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expʀessɪoɴ((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>B</p>
 !! end
 
 !! test
-MSIE 6 CSS safety test: sup/sub script (bug 55332)
+MSIE 6 CSS safety test: sup/sub script (T57332)
 !! wikitext
 <div style="background-image:url⁽javascript:alert())">A</div>
 <div style="background-image:url₍javascript:alert())">B</div>
 <p style="font-size: 100px; color: expressioⁿ((title='XSSed'),'red')">C</p>
-!! html
+!! html/php
 <div style="/* insecure input */">A</div>
 <div style="/* insecure input */">B</div>
 <p style="/* insecure input */">C</p>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:url⁽javascript:alert())"}}'>A</div>
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:url₍javascript:alert())"}}'>B</div>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expressioⁿ((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>C</p>
 !! end
 
-# FIXME: Parsoid fails to sanitize this! See T58846.
 !! test
 Opera -o-link CSS
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <div
 title="&#100;&#97;&#116;&#97;&#58;&#116;&#101;&#120;&#116;&#47;&#104;&#116;&#109;&#108;&#44;&#60;&#105;&#109;&#103;&#32;&#115;&#114;&#99;&#61;&#49;&#32;&#111;&#110;&#101;&#114;&#114;&#111;&#114;&#61;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#62;"
 style="-o-link:attr(title);-o-link-source:current">X</div>
-!! html
+!! html/php
 <div title="data:text/html,&lt;img src=1 onerror=alert(1)&gt;" style="/* insecure input */">X</div>
 
+!! html/parsoid
+<div title="data:text/html,&lt;img src=1 onerror=alert(1)>" style="/* insecure input */" data-parsoid='{"stx":"html","a":{"title":"data:text/html,&lt;img src=1 onerror=alert(1)>","style":"/* insecure input */"},"sa":{"title":"&amp;#100;&amp;#97;&amp;#116;&amp;#97;&amp;#58;&amp;#116;&amp;#101;&amp;#120;&amp;#116;&amp;#47;&amp;#104;&amp;#116;&amp;#109;&amp;#108;&amp;#44;&amp;#60;&amp;#105;&amp;#109;&amp;#103;&amp;#32;&amp;#115;&amp;#114;&amp;#99;&amp;#61;&amp;#49;&amp;#32;&amp;#111;&amp;#110;&amp;#101;&amp;#114;&amp;#114;&amp;#111;&amp;#114;&amp;#61;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#49;&amp;#41;&amp;#62;","style":"-o-link:attr(title);-o-link-source:current"}}'>X</div>
 !! end
 
 !! test
-MSIE 6 CSS safety test: Repetition markers (bug 55332)
+MSIE 6 CSS safety test: Repetition markers (T57332)
 !! wikitext
 <p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
 <p style="font-size: 100px; color: expresゝion((title='XSSed'),'red')">B</p>
@@ -16654,7 +16844,7 @@ MSIE 6 CSS safety test: Repetition markers (bug 55332)
 <p style="font-size: 100px; color: expresﹽion((title='XSSed'),'red')">E</p>
 <p style="font-size: 100px; color: expresﹼion((title='XSSed'),'red')">F</p>
 <p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">G</p>
-!! html
+!! html/php
 <p style="/* insecure input */">A</p>
 <p style="/* insecure input */">B</p>
 <p style="/* insecure input */">C</p>
@@ -16663,6 +16853,14 @@ MSIE 6 CSS safety test: Repetition markers (bug 55332)
 <p style="/* insecure input */">F</p>
 <p style="/* insecure input */">G</p>
 
+!! html/parsoid
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expres〱ion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>A</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresゝion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>B</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresーion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>C</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresヽion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>D</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresﹽion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>E</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresﹼion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>F</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresーion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>G</p>
 !! end
 
 !! test
@@ -16718,7 +16916,7 @@ Template:Identity
 !! endarticle
 
 !! test
-Expansion of multi-line templates in attribute values (bug 6255)
+Expansion of multi-line templates in attribute values (T8255)
 !! wikitext
 <div style="background: {{identity|#00FF00}}">-</div>
 !! html
@@ -16726,22 +16924,21 @@ Expansion of multi-line templates in attribute values (bug 6255)
 
 !! end
 
-
 !! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check)
+Expansion of multi-line templates in attribute values (T8255 sanity check)
 !! wikitext
-<div style="background: 
+<div style="background:
 #00FF00">-</div>
 !! html/php
 <div style="background: #00FF00">-</div>
 
 !! html/parsoid
-<div style="background: 
+<div style="background:
 #00FF00">-</div>
 !! end
 
 !! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
+Expansion of multi-line templates in attribute values (T8255 sanity check 2)
 !! wikitext
 <div style="background: &#10;#00FF00">-</div>
 !! html
@@ -16760,6 +16957,7 @@ Tags which are hidden from Tidy cannot pass through the Sanitizer
 ###
 ### Parser hooks (see tests/parser/parserTestsParserHook.php for the <tag> extension)
 ###
+
 !! test
 Parser hook: empty input
 !! wikitext
@@ -16916,7 +17114,7 @@ array (
 !! end
 
 !! test
-Parser hook: argument containing a forward slash (bug 5344)
+Parser hook: argument containing a forward slash (T7344)
 !! wikitext
 <tag filename="/tmp/bla"></tag>
 !! html/php
@@ -16933,7 +17131,7 @@ array (
 
 ## Don't expect parsoid to rt this form.
 !! test
-Parser hook: empty input using terminated empty elements (bug 2374)
+Parser hook: empty input using terminated empty elements (T4374)
 !! options
 parsoid=wt2html,html2html
 !! wikitext
@@ -16953,7 +17151,7 @@ array (
 ## </tag> should be output literally since there is no matching tag that begins it
 ## Don't expect parsoid to rt this form.
 !! test
-Parser hook: basic arguments using terminated empty elements (bug 2374)
+Parser hook: basic arguments using terminated empty elements (T4374)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -17107,15 +17305,17 @@ Table not started</td></tr></table>
 Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
 !! wikitext
 <span id="æ: v">byte</span>[[#æ: v|backlink]]
-!! html
+!! html/php
 <p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
 </p>
+!! html/parsoid
+<p><span id=".C3.A6:_v" data-parsoid='{"stx":"html","a":{"id":".C3.A6:_v"},"sa":{"id":"æ: v"}}'>byte</span><a rel="mw:WikiLink" href="./Main_Page#.C3.A6:_v" data-parsoid='{"stx":"piped","a":{"href":"./Main_Page#.C3.A6:_v"},"sa":{"href":"#æ: v"}}'>backlink</a></p>
 !! end
 
 # In HTML5, the restrictions are that id must contain at least one character,
 # and must not contain any space characters.
 !! test
-Sanitizer: Validating the contents of the id attribute (bug 4515)
+Sanitizer: Validating the contents of the id attribute (T6515)
 !! options
 disabled
 !! wikitext
@@ -17126,7 +17326,7 @@ Something ...
 
 # In HTML5, id must be unique amongst all the ids in the element's home subtree.
 !! test
-Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
+Sanitizer: Validating id attribute uniqueness (T6515, T8301)
 !! options
 disabled
 !! wikitext
@@ -17160,7 +17360,7 @@ Sanitizer: Validating that <meta> and <link> work, but only for Microdata
 !! end
 
 !! test
-Language converter: output gets cut off unexpectedly (bug 5757)
+Language converter: output gets cut off unexpectedly (T7757)
 !! options
 language=zh
 !! wikitext
@@ -17180,7 +17380,7 @@ all additional text is vanished
 !! end
 
 !! test
-Self closed html pairs (bug 5487)
+Self closed html pairs (T7487)
 !! options
 !! wikitext
 <center><font id="bug" />Centered text</center>
@@ -17205,7 +17405,7 @@ C'est grave !
 !! end
 
 !! test
-Punctuation: CSS !important (bug 11874)
+Punctuation: CSS !important (T13874)
 !! wikitext
 <div style="width:50% !important">important</div>
 !! html
@@ -17214,7 +17414,7 @@ Punctuation: CSS !important (bug 11874)
 !!end
 
 !! test
-Punctuation: CSS ! important (bug 11874; with space after)
+Punctuation: CSS ! important (T13874; with space after)
 !! wikitext
 <div style="width:50% ! important">important</div>
 !! html
@@ -17223,7 +17423,7 @@ Punctuation: CSS ! important (bug 11874; with space after)
 !!end
 
 !! test
-HTML bullet list, closed tags (bug 5497)
+HTML bullet list, closed tags (T7497)
 !! wikitext
 <ul>
 <li>One</li>
@@ -17244,7 +17444,7 @@ HTML bullet list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML bullet list, unclosed tags (bug 5497)
+HTML bullet list, unclosed tags (T7497)
 !! wikitext
 <ul>
 <li>One
@@ -17264,7 +17464,7 @@ HTML bullet list, unclosed tags (bug 5497)
 !! end
 
 !! test
-HTML ordered list, closed tags (bug 5497)
+HTML ordered list, closed tags (T7497)
 !! wikitext
 <ol>
 <li>One</li>
@@ -17285,7 +17485,7 @@ HTML ordered list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML ordered list, unclosed tags (bug 5497)
+HTML ordered list, unclosed tags (T7497)
 !! options
 !! wikitext
 <ol>
@@ -17306,7 +17506,7 @@ HTML ordered list, unclosed tags (bug 5497)
 !! end
 
 !! test
-HTML nested bullet list, closed tags (bug 5497)
+HTML nested bullet list, closed tags (T7497)
 !! wikitext
 <ul>
 <li>One</li>
@@ -17341,7 +17541,7 @@ HTML nested bullet list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML nested bullet list, open tags (bug 5497)
+HTML nested bullet list, open tags (T7497)
 !! wikitext
 <ul>
 <li>One
@@ -17378,7 +17578,7 @@ HTML nested bullet list, open tags (bug 5497)
 !! end
 
 !! test
-HTML nested ordered list, closed tags (bug 5497)
+HTML nested ordered list, closed tags (T7497)
 !! wikitext
 <ol>
 <li>One</li>
@@ -17403,7 +17603,7 @@ HTML nested ordered list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML nested ordered list, open tags (bug 5497)
+HTML nested ordered list, open tags (T7497)
 !! wikitext
 <ol>
 <li>One
@@ -17450,9 +17650,9 @@ HTML ordered list item with parameters oddity
 
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !!test
-bug 5918: autonumbering
+T7918: autonumbering
 !! wikitext
 [http://first/] [http://second] [ftp://ftp]
 
@@ -17616,6 +17816,8 @@ http://===r:::https://b
 # Known to produce bad XML for now
 !! test
 Fuzz testing: Parser24
+!! options
+parsoid=wt2html
 !! wikitext
 {|
 {{{|
@@ -17625,7 +17827,7 @@ Fuzz testing: Parser24
 
 MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 |
-!! html
+!! html/php
 <table>
 {{{|
 <u class="&#124;">}}}} &gt;
@@ -17638,6 +17840,14 @@ MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 </tr>
 </table>
 
+!! html/parsoid
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'>{{{|
+<u class="|" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":""},"autoInsertedEnd":true}' data-mw='{"attribs":[[{"txt":"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}}","html":"{&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[21,79,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"templatearg\":{\"target\":{\"wt\":\"SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&amp;lt;noinclude>\"},\"params\":{},\"i\":0}}]}&#39;>{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}&lt;/span>}"},{"html":""}]]}'>
+<br style="onmouseover='alert(document.cookie);' " data-parsoid='{"stx":"html","selfClose":true}'/></u></p><p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'><u class="|" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":""},"autoInsertedEnd":true,"autoInsertedStart":true}' data-mw='{"attribs":[[{"txt":"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}}","html":"{&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[21,79,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"templatearg\":{\"target\":{\"wt\":\"SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&amp;lt;noinclude>\"},\"params\":{},\"i\":0}}]}&#39;>{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}&lt;/span>}"},{"html":""}]]}'>MOVE YOUR MOUSE CURSOR OVER THIS TEXT</u></p><table data-parsoid='{"autoInsertedEnd":true}'>
+
+
+
+<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'></td></tr></tbody></table>
 !! end
 
 # Note: the current result listed for this is not what the original one was,
@@ -17649,16 +17859,19 @@ MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 # <li class="&#124;&#124;">
 # }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
 !!test
-Fuzz testing: Parser25 (bug 6055)
+Fuzz testing: Parser25 (T8055)
 !! wikitext
 {{{
 | 
 <LI CLASS=||
  >
 }}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
-!! html
+!! html/php
 <p>&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
 </p>
+!! html/parsoid
+<span about="#mwt1" typeof="mw:Param" data-parsoid='{"pi":[[{"k":"1"},{"k":"2"},{"k":"3"}]]}' data-mw='{"parts":[{"templatearg":{"target":{"wt":"\n"},"params":{"1":{"wt":" \n&lt;LI CLASS="},"2":{"wt":""},"3":{"wt":"\n >\n"}},"i":0}},"blah\" onmouseover=\"alert(&#39;hello world&#39;);\" align=\"left\"&#39;&#39;&#39;MOVE MOUSE CURSOR OVER HERE"]}'> 
+</span><p about="#mwt1">&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b></p>
 !! end
 
 !!test
@@ -17683,7 +17896,7 @@ http://example.com<nowiki>junk</nowiki>
 <p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a><span typeof="mw:Nowiki">junk</span></p>
 !! end
 
-!!test
+!! test
 Fuzz testing: URL adjacent extension (no space, dirty; pre)
 !! wikitext
 http://example.com<pre>junk</pre>
@@ -17696,10 +17909,10 @@ http://example.com<pre>junk</pre>
 junk
 </pre>
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a></p><pre data-parsoid='{"stx":"html"}'>junk</pre>
-!!end
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a></p><pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"junk"}}'>junk</pre>
+!! end
 
-!!test
+!! test
 Fuzz testing: image with bogus manual thumbnail
 !! wikitext
 [[Image:foobar.jpg|thumbnail= ]]
@@ -17708,19 +17921,21 @@ Fuzz testing: image with bogus manual thumbnail
 
 !! 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>
-!!end
+!! end
 
 !! test
-Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
+Fuzz testing: encoded newline in generated HTML replacements (T8577)
 !! wikitext
 <pre dir="&#10;"></pre>
-!! html
+!! html/php
 <pre dir="&#10;"></pre>
 
+!! html/parsoid
+<pre typeof="mw:Extension/pre" about="#mwt2" dir="&amp;#10;" data-mw='{"name":"pre","attrs":{"dir":"&amp;#10;"},"body":{"extsrc":""}}'></pre>
 !! end
 
 !! test
-Parsing optional HTML elements (Bug 6171)
+Parsing optional HTML elements (T8171)
 !! options
 !! wikitext
 <table>
@@ -17742,7 +17957,7 @@ Parsing optional HTML elements (Bug 6171)
 !! end
 
 !! test
-Correct handling of <td>, <tr> (Bug 6171)
+Correct handling of <td>, <tr> (T8171)
 !! options
 !! wikitext
 <table>
@@ -17838,7 +18053,7 @@ Special page transclusion
 !! end
 
 !! test
-Special page transclusion twice (bug 5021)
+Special page transclusion twice (T7021)
 !! options
 !! wikitext
 {{Special:Prefixindex/Xyzzyx}}
@@ -18219,7 +18434,7 @@ section=2
 ==b==
 !! end
 
-# Formerly testing for bug 2587, now resolved by the use of unmarked sections
+# Formerly testing for T4587, now resolved by the use of unmarked sections
 # instead of respecting commented sections
 !! test
 Section extraction prefixed by comment (section 1)
@@ -18243,7 +18458,7 @@ section=2
 
 !!end
 
-# Formerly testing for bug 2607, now resolved by the use of unmarked sections
+# Formerly testing for T4607, now resolved by the use of unmarked sections
 # instead of respecting HTML-style headings
 !! test
 Section extraction, mixed wiki and html (section 1)
@@ -18278,7 +18493,7 @@ two
 !! end
 
 
-# Formerly testing for bug 3342
+# Formerly testing for T5342
 !! test
 Section extraction, heading surrounded by <noinclude>
 !! options
@@ -18290,7 +18505,7 @@ section=1
 ==marked==
 !!end
 
-# Test behavior of bug 19910
+# Test behavior of T21910
 !! test
 Sectiion with all-equals
 !! options
@@ -18638,7 +18853,7 @@ xxx
 !! end
 
 !! test
-Section replacement test with initial whitespace (bug 13728)
+Section replacement test with initial whitespace (T15728)
 !! options
 replace=2,"xxx"
 !! wikitext
@@ -18653,7 +18868,7 @@ xxx
 
 
 !! test
-Section extraction, heading followed by pre with 20 spaces (bug 6398)
+Section extraction, heading followed by pre with 20 spaces (T8398)
 !! options
 section=1
 !! wikitext
@@ -18665,7 +18880,7 @@ section=1
 !! end
 
 !! test
-Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
+Section extraction, heading followed by pre with 19 spaces (T8398 sanity check)
 !! options
 section=1
 !! wikitext
@@ -18678,7 +18893,7 @@ section=1
 
 
 !! test
-Section extraction, <pre> around bogus header (bug 10309)
+Section extraction, <pre> around bogus header (T12309)
 !! options
 section=2
 !! wikitext
@@ -18695,7 +18910,7 @@ stuff
 !! end
 
 !! test
-Section replacement, <pre> around bogus header (bug 10309)
+Section replacement, <pre> around bogus header (T12309)
 !! options
 replace=2,"xxx"
 !! wikitext
@@ -18715,7 +18930,6 @@ stuff
 xxx
 !! end
 
-
 !! test
 Handling of &#x0A; in URLs
 !! wikitext
@@ -18724,9 +18938,7 @@ Handling of &#x0A; in URLs
 <ul><li><ul><li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
 
 !! html/parsoid
-<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://
-a">irc://
-a</a></li></ul></li></ul>
+<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://%0Aa" data-parsoid='{"stx":"url","a":{"href":"irc://%0Aa"},"sa":{"href":"irc://&amp;#x0A;a"}}'>irc://%0Aa</a></li></ul></li></ul>
 !! end
 
 !! test
@@ -18740,7 +18952,6 @@ Handling of %0A in URLs
 <ul><li><ul><li> <a rel="mw:ExtLink" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
 !! end
 
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 5 quotes, code coverage +1 line
@@ -18858,8 +19069,14 @@ title=[[Parser test]]
 !! end
 ### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
 
+## Parsoid thinks the "centre" here is a property, not a caption.
 !! test
 Gallery
+!! options
+parsoid={
+  "modes": ["wt2html"],
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
 image1.png |
@@ -18871,7 +19088,7 @@ image4    |300px| centre
 [[x|xx]]]]
 * image6
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Image1.png</div>
@@ -18909,19 +19126,94 @@ image4    |300px| centre
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt3" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image1.png </span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image2.gif</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image3</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image4    </span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;"> image5.svg</span></div><div class="gallerytext"> <a rel="mw:ExtLink" href="http://///////">http://///////</a></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">* image6</span></div><div class="gallerytext"></div></li>
+</ul>
 !! end
 
 !! test
-Gallery (with options)
+Gallery (with options, html)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
 !! wikitext
-<gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
+<gallery widths="70px" heights="40px" perrow="2" caption="Foo [[Main Page]]">
 File:Nonexistent.jpg|caption
 File:Nonexistent.jpg
 image:foobar.jpg|some '''caption''' [[Main Page]]
 image:foobar.jpg
 image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 </gallery>
-!! html
+!! html/php
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
+       <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="height: 70px;">Nonexistent.jpg</div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="height: 70px;">Nonexistent.jpg</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+<p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+<p>blabla.
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px; _width: 226px;" typeof="mw:Extension/gallery" about="#mwt3" data-mw='{"name":"gallery","attrs":{"widths":"70px","heights":"40px","perrow":"2"},"body":{}}'>
+<li class="gallerycaption">Foo <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext">caption</div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></span></div><div class="gallerytext">some <b>caption</b> <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="This is a foo-bar." resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></span></div><div class="gallerytext">blabla.</div></li>
+</ul>
+!! end
+
+!! test
+Gallery (with options, extsrc)
+!! options
+parsoid={
+  "nativeGallery": false
+}
+!! wikitext
+<gallery widths="70px" heights="40px" perrow="2" caption="Foo [[Main Page]]">
+File:Nonexistent.jpg|caption
+File:Nonexistent.jpg
+image:foobar.jpg|some '''caption''' [[Main Page]]
+image:foobar.jpg
+image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
+</gallery>
+!! html/php
 <ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
        <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
@@ -18957,17 +19249,31 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px; _width: 226px;" typeof="mw:Extension/gallery" about="#mwt3" data-parsoid='{}' data-mw='{"name":"gallery","attrs":{"widths":"70px","heights":"40px","perrow":"2","caption":"Foo [[Main Page]]"},"body":{"extsrc":"\nFile:Nonexistent.jpg|caption\nFile:Nonexistent.jpg\nimage:foobar.jpg|some &#39;&#39;&#39;caption&#39;&#39;&#39; [[Main Page]]\nimage:foobar.jpg\nimage:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.\n"}}'>
+<li class="gallerycaption">Foo <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext">caption</div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></span></div><div class="gallerytext">some <b>caption</b> <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="This is a foo-bar." resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></span></div><div class="gallerytext">blabla.</div></li>
+</ul>
 !! end
 
 !! test
 Gallery with link that has fragment
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
 image:foobar.jpg|link=Main_Page
 image:foobar.jpg|link=Main_Page#section
 image:foobar.jpg|link=Main Page#section|caption
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
@@ -18988,16 +19294,56 @@ image:foobar.jpg|link=Main Page#section|caption
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./Main_Page#section"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./Main_Page#section"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext">caption</div></li>
+</ul>
+!! end
+
+## Whoops, Parsoid shouldn't be parsing templates in the attribute caption!
+!! test
+Gallery with template inside caption
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery caption="{{echo|hi}}">
+File:Foobar.jpg|{{echo|ho}}
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+       <li class='gallerycaption'>{{echo|hi}}</li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+<p>ho
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt6" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerycaption"><span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi"}},"i":0}}]}'>hi</span></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"><span about="#mwt5" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"ho"}},"i":0}}]}'>ho</span></div></li>
+</ul>
 !! end
 
 !! test
 Gallery with wikitext inside caption
+!! options
+parsoid={
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
-File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
-File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
+File:Foobar.jpg|alt=galleryalt|[[File:Foobar.jpg|alt=inneralt|20x20px|desc]]
+File:Foobar.jpg|alt=galleryalt|{{Test|unamedParam|alt=param}}
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
@@ -19015,18 +19361,27 @@ File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt6" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="galleryalt" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"><span typeof="mw:Image" data-mw='{"caption":"desc"}'><a href="./File:Foobar.jpg"><img alt="inneralt" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="2" width="20"/></a></span></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="galleryalt" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"><span about="#mwt4" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Test","href":"./Template:Test"},"params":{"1":{"wt":"unamedParam"},"alt":{"wt":"param"}},"i":0}}]}'>This is a test template</span></div></li>
+</ul>
 !! end
 
 !! test
-gallery (with showfilename option)
+Gallery (with showfilename option)
+!! options
+parsoid={
+  "nativeGallery": true
+}
 !! wikitext
-<gallery showfilename>
+<gallery showfilename="">
 File:Nonexistent.jpg|caption
 File:Nonexistent.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
+File:Foobar.jpg|some '''caption''' [[Main Page]]
 File:Foobar.jpg
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
@@ -19060,10 +19415,23 @@ some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt3" data-mw='{"name":"gallery","attrs":{"showfilename":""},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"><a href="./File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">File:Nonexistent.jpg</a>caption</div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"><a href="./File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">File:Nonexistent.jpg</a></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"><a href="./File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">File:Foobar.jpg</a>some <b>caption</b> <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"><a href="./File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">File:Foobar.jpg</a></div></li>
+</ul>
 !! end
 
+## Should Parsoid be preserving these variations?
 !! test
 Gallery (with namespace-less filenames)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
 File:Nonexistent.jpg
@@ -19071,7 +19439,7 @@ Nonexistent.jpg
 image:foobar.jpg
 foobar.jpg
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
@@ -19095,54 +19463,202 @@ foobar.jpg
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
 !! end
 
 !! test
-HTML Hex character encoding (spells the word "JavaScript")
+Gallery override link with WikiLink (T36852)
 !! options
-parsoid=wt2html,wt2wt,html2html
+parsoid={
+  "nativeGallery": true
+}
 !! wikitext
-&#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
+<gallery>
+File:Foobar.jpg|alt=galleryalt|link=InterWikiLink
+</gallery>
 !! html/php
-<p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
-</p>
-!! html/php+tidy
-<p>JavaScript</p>
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
 !! html/parsoid
-<p><span typeof="mw:Entity">J</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">v</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">S</span><span typeof="mw:Entity">c</span><span typeof="mw:Entity">r</span><span typeof="mw:Entity">i</span><span typeof="mw:Entity">p</span><span typeof="mw:Entity">t</span></p>
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-parsoid='{"dsr":[0,70,2,2]}' data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./InterWikiLink"><img alt="galleryalt" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
 !! end
 
 !! test
-HTML Hex character encoding bogus encoding (bug 26437 regression check)
+Gallery override link with absolute external link (T36852)
+!! options
+parsoid={
+  "nativeGallery": true
+}
 !! wikitext
-&#xsee;&#XSEE;
+<gallery>
+File:Foobar.jpg|alt=galleryalt|link=http://www.example.org
+</gallery>
 !! html/php
-<p>&amp;#xsee;&amp;#XSEE;
-</p>
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
 !! html/parsoid
-<p>&amp;#xsee;&amp;#XSEE;</p>
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="http://www.example.org"><img alt="galleryalt" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
 !! end
 
 !! test
-HTML Hex character encoding mixed case
+Gallery override link with absolute external link with LanguageConverter
 !! options
-parsoid=wt2html,wt2wt,html2html
-!! wikitext
-&#xEE;&#Xee;
-!! html/php
-<p>&#xee;&#xee;
+language=zh
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
+</gallery>
+!! result
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
 </p>
-!! html/php+tidy
-<p>îî</p>
-!! html/parsoid
-<p><span typeof="mw:Entity">î</span><span typeof="mw:Entity">î</span></p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
-# See: https://www.w3.org/TR/html5/syntax.html#character-references
-# Note that U+000C (form feed) is not a valid XML character, so
-# it is banned even though allowed in HTML5.
 !! test
-Illegal character references (T106578)
+Gallery override link with malicious javascript (T36852)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
+!! wikitext
+<gallery>
+File:Foobar.jpg|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./%22_onclick=%22alert('malicious_javascript_code!');"><img alt="galleryalt" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery with invalid title as link (T45964)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
+!! wikitext
+<gallery>
+File:Foobar.jpg|link=<
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext">link=&lt;</div></li>
+</ul>
+!! end
+
+!! test
+Serialize gallery without attrs in data-mw
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "nativeGallery": true
+}
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","body":{}}'>
+<li class="gallerycaption">123</li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Test.png</span></div><div class="gallerytext"></div></li>
+</ul>
+!! wikitext
+<gallery caption="123">
+File:Test.png
+</gallery>
+!! end
+
+!! test
+HTML Hex character encoding (spells the word "JavaScript")
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+&#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
+!! html/php
+<p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
+</p>
+!! html/php+tidy
+<p>JavaScript</p>
+!! html/parsoid
+<p><span typeof="mw:Entity">J</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">v</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">S</span><span typeof="mw:Entity">c</span><span typeof="mw:Entity">r</span><span typeof="mw:Entity">i</span><span typeof="mw:Entity">p</span><span typeof="mw:Entity">t</span></p>
+!! end
+
+!! test
+HTML Hex character encoding bogus encoding (T28437 regression check)
+!! wikitext
+&#xsee;&#XSEE;
+!! html/php
+<p>&amp;#xsee;&amp;#XSEE;
+</p>
+!! html/parsoid
+<p>&amp;#xsee;&amp;#XSEE;</p>
+!! end
+
+!! test
+HTML Hex character encoding mixed case
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+&#xEE;&#Xee;
+!! html/php
+<p>&#xee;&#xee;
+</p>
+!! html/php+tidy
+<p>îî</p>
+!! html/parsoid
+<p><span typeof="mw:Entity">î</span><span typeof="mw:Entity">î</span></p>
+!! end
+
+# See: https://www.w3.org/TR/html5/syntax.html#character-references
+# Note that U+000C (form feed) is not a valid XML character, so
+# it is banned even though allowed in HTML5.
+!! test
+Illegal character references (T106578)
 !! wikitext
 ; Null: &#00;
 ; FF: &#xC;
@@ -19252,7 +19768,7 @@ ISBN 1234567890
 !! end
 
 !! test
-Bug 22905: <abbr> followed by ISBN followed by </a>
+T24905: <abbr> followed by ISBN followed by </a>
 !! wikitext
 <abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
 !! html/php
@@ -19380,7 +19896,6 @@ dt/dd/dl test
 
 !!end
 
-
 # Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
 !! test
 Images with the "|" character in the comment
@@ -19390,7 +19905,7 @@ Images with the "|" character in the comment
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=|left|&amp;param2=|x">external</a> URL</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx" data-parsoid='{"a":{"href":"http://test/?param1=%7Cleft%7C&amp;param2=%7Cx"},"sa":{"href":"http://test/?param1=|left|&amp;param2=|x"}}'>external</a> URL</figcaption></figure>
 !! end
 
 !! test
@@ -19688,7 +20203,7 @@ ISBN 12345678901
 
 
 !! test
-ISBN with trailing year (bug 8110)
+ISBN with trailing year (T9110)
 !! wikitext
 ISBN 1-234-56789-0 - 2006
 
@@ -19737,7 +20252,7 @@ anchorencode deals with templates
 !! end
 
 !! test
-anchorencode encodes like the TOC generator: (bug 18431)
+anchorencode encodes like the TOC generator: (T20431)
 !! wikitext
 === _ +:.3A%3A&&amp;]] ===
 {{anchorencode: _ +:.3A%3A&&amp;]] }}
@@ -19749,7 +20264,7 @@ __NOEDITSECTION__
 !! end
 
 !! test
-Bug 6200: blockquotes and paragraph formatting
+T8200: blockquotes and paragraph formatting
 !! wikitext
 <blockquote>
 foo
@@ -19770,7 +20285,7 @@ bar
 !! end
 
 !! test
-Bug 8293: Use of center tag ruins paragraph formatting
+T10293: Use of center tag ruins paragraph formatting
 !! wikitext
 <center>
 foo
@@ -19932,7 +20447,7 @@ blah
 ## This wikitext usage is going to be fairly uncommon in production and
 ## selser will take care of preserving formatting in those scenarios.
 !! test
-Don't convert blue categorylinks to another variant (bug 33210)
+Don't convert blue categorylinks to another variant (T35210)
 !! options
 cat
 language=zh
@@ -19942,8 +20457,8 @@ parsoid=wt2html
 !! html/php
 cat=分类 sort=
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="A" title="A">A</a></p>
-<link rel="mw:PageProp/Category" href="Category:分类"/>
+<p><a rel="mw:WikiLink" href="./A" title="A">A</a></p>
+<link rel="mw:PageProp/Category" href="./Category:分类"/>
 !! end
 
 !! test
@@ -20101,7 +20616,7 @@ Should be stripped<span title="Exclamation">!</span>
 !! end
 
 !! test
-Bug 24072: more test on conversion rule for title
+T26072: more test on conversion rule for title
 !! options
 language=zh variant=zh-tw showtitle
 !! wikitext
@@ -20215,6 +20730,28 @@ Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiw
 </p>
 !! end
 
+!! test
+HTML markups with conversion syntax in attribs, nested in other conversion blocks
+!! options
+language=zh variant=zh-cn
+!! wikitext
+-{zh;zh-hans;zh-hant|<span title="-{X}-">A</span>}-
+!! html
+<p><span title="X">A</span>
+</p>
+!! end
+
+!! test
+HTML markups with conversion syntax in attribs, nested in other conversion blocks (not working yet)
+!! options
+language=zh variant=zh-cn disabled
+!! wikitext
+-{<span title="-{X}-">A</span>}-
+!! html
+<p><span title="X">A</span>
+</p>
+!! end
+
 # Since Parsoid is starting to emit canonical wikitext for links,
 # [http://example.com http://example.com] will not RT back to that
 # form anymore.
@@ -20294,36 +20831,133 @@ language=sr variant=sr-ec
 </p>
 !! end
 
-# FIXME: This test is currently broken in the PHP parser (bug 52661)
+# FIXME: This test is currently broken in the PHP parser T153761
+!! test
+T146304: Don't break template parsing if language converter markup is in the parameter.
+!! options
+language=sr variant=sr-ec
+disabled
+!! wikitext
+{{echo|-{R|foo}-}}
+!! html/php
+<p>foo
+</p>
+!! end
+
 !! test
-Don't break image parsing if language converter markup is in the caption.
+T146305: Don't break image parsing if language converter markup is in the caption.
 !! options
 language=sr
 !! wikitext
-[[File:Foobar.jpg|-{R|caption}-]]
+[[File:Foobar.jpg|thumb|-{R|caption:}-]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="internal" title="Повећај"></a></div>caption:</div></div></div>
+
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./Датотека:Foobar.jpg"><img resource="./Датотека:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><span typeof="mw:LanguageVariant" data-mw='{"disabled":true,"show":true,"text":"caption:"}'></span></figcaption></figure>
+!! end
+
+!! test
+T146305: Don't break image parsing if nested language converter markup is in the caption.
+!! options
+language=zh variant=zh-cn
+!! wikitext
+[[File:Foobar.jpg|thumb|-{zh-cn:blog (hk: -{zh-hans|WEBJOURNAL}-, tw: -{zh-hans|WEBLOG}-)}-]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="放大"></a></div>blog (hk: WEBJOURNAL, tw: WEBLOG)</div></div></div>
+
 !! html/parsoid
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><span typeof="mw:LanguageVariant" data-mw='{"bidir":[{"l":"zh-cn","t":"blog (hk: &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[42,64,null,2]}&#39; data-mw=&#39;{\"filter\":[\"zh-hans\"],\"text\":\"WEBJOURNAL\"}&#39;>&lt;/span>, tw: &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[70,88,null,2]}&#39; data-mw=&#39;{\"filter\":[\"zh-hans\"],\"text\":\"WEBLOG\"}&#39;>&lt;/span>)"}],"show":true}'></span></figcaption></figure>
+!! end
+
+!! test
+Don't break gallery if language converter markup is inside.
+!! options
+language=zh
+!! wikitext
+<gallery>
+File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=-{R|foo}-|-{R|bar}-]]|alt=-{R|bat}-
+File:foobar.jpg|{{Test|unamedParam|alt=-{R|param}-}}|alt=galleryalt
+</gallery>
+!! html
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="bat" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="bar"><img alt="foo" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+<p>This is a test template
 </p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
-# FIXME: This test is currently broken in the PHP parser (bug 52661)
 !! test
-Don't break list handling if language converter markup is in the item.
+T153135: Don't break list handling if language converter markup is in the item.
 !! options
 language=zh variant=zh-cn
 !! wikitext
 ;-{zh-cn:AAA;zh-tw:BBB}-
+;-{R|foo:bar}-
+!! html/php
+<dl><dt>AAA</dt>
+<dt>foo:bar</dt></dl>
+
+!! html/parsoid
+<dl>
+<dt><span typeof="mw:LanguageVariant" data-mw='{"bidir":[{"l":"zh-cn","t":"AAA"},{"l":"zh-tw","t":"BBB"}],"show":true}'></span></dt>
+<dt><span typeof="mw:LanguageVariant" data-mw='{"disabled":true,"show":true,"text":"foo:bar"}'></span></dt>
+</dl>
+!! end
+
+// Note that parsoid does not protect colons unless language converter
+// markup is properly nested, because it is a backtracking parser.
+!! test
+T153135: Unclosed markup in definition list (code coverage)
+!! options
+language=zh variant=zh-cn
+!! wikitext
+;<b>foo:bar
+;-{zh-cn:AAA
+!! html/php
+<dl><dt><b>foo:bar</dt>
+<dt>-{zh-cn:AAA</b></dt></dl>
+
+!! html/parsoid
+<dl>
+<dt><b>foo:bar</b></dt>
+<b>
+<dt>-{zh-cn</dt>
+<dd>AAA</dd>
+</b></dl>
+!! end
+
+!! test
+T153135: Nested language converter markup in definition list (code coverage)
+!! options
+language=zh variant=zh-cn
+!! wikitext
+;-{zh-cn:AAA -{zh-hans|foo:bar}- -{R|bat:baz}-}-:def
 !! html/php
-<dl><dt><span class="error">在手动语言转换规则中检测到错误</span></dd></dl>
+<dl><dt>AAA foo:bar bat:baz</dt>
+<dd>def</dd></dl>
 
 !! html/parsoid
-<dl><dt>AAA
-</dt></dl>
+<dl>
+<dt><span typeof="mw:LanguageVariant" data-mw='{"bidir":[{"l":"zh-cn","t":"AAA &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[13,32,null,2]}&#39; data-mw=&#39;{\"filter\":[\"zh-hans\"],\"text\":\"bar\"}&#39;>&lt;/span> &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"R\"],\"dsr\":[33,46,null,2]}&#39; data-mw=&#39;{\"disabled\":true,\"show\":true,\"text\":\"bat:baz\"}&#39;>&lt;/span>"}],"show":true}'></span></dt>
+<dd>def</dd>
+</dl>
 !! end
 
-# FIXME: This test is currently broken in the PHP parser (bug 52661)
 !! test
-Don't break table handling if language converter markup is in the cell.
+T153140: Don't break table handling if language converter markup is in the cell.
 !! options
 language=sr variant=sr-ec
 !! wikitext
@@ -20335,7 +20969,7 @@ language=sr variant=sr-ec
 <table>
 
 <tr>
-<td>Б}-
+<td> B
 </td></tr></table>
 
 !! html/parsoid
@@ -20348,7 +20982,7 @@ language=sr variant=sr-ec
 !! end
 
 !! test
-Bug 529: Uncovered bullet
+T2529: Uncovered bullet
 !! wikitext
 * Foo {{bullet}}
 !! html
@@ -20364,7 +20998,7 @@ Bug 529: Uncovered bullet
 # To test realistic parsing behavior, apply a tidy-like transformation to both
 # the expected output and your parser's output.
 !! test
-Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
+T2529: Uncovered bullet leaving empty list, normally removed by tidy
 !! wikitext
 ******* Foo {{bullet}}
 !! html
@@ -20374,7 +21008,7 @@ Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
 !! end
 
 !! test
-Bug 529: Uncovered table already at line-start
+T2529: Uncovered table already at line-start
 !! wikitext
 x
 
 !! end
 
 !! test
-Bug 529: Uncovered bullet in parser function result
+T2529: Uncovered bullet in parser function result
 !! wikitext
 * Foo {{lc:{{bullet}} }}
 !! html
@@ -20407,7 +21041,7 @@ Bug 529: Uncovered bullet in parser function result
 !! end
 
 !! test
-Bug 5678: Double-parsed template argument
+T7678: Double-parsed template argument
 !! wikitext
 {{lc:{{{1}}}|hello}}
 !! html
@@ -20416,7 +21050,7 @@ Bug 5678: Double-parsed template argument
 !! end
 
 !! test
-Bug 5678: Double-parsed template invocation
+T7678: Double-parsed template invocation
 !! wikitext
 {{lc:{{paramtest {{!}} param = hello }} }}
 !! html
@@ -20425,7 +21059,7 @@ Bug 5678: Double-parsed template invocation
 !! end
 
 !! test
-Case insensitivity of parser functions for non-ASCII characters (bug 8143)
+Case insensitivity of parser functions for non-ASCII characters (T10143)
 !! options
 language=cs
 title=[[Main Page]]
@@ -20570,9 +21204,9 @@ B</strong>
 </p>
 !! end
 
-# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
+# T8200: <blockquote> should behave like <div> with respect to line breaks
 !! test
-Bug 6200: paragraphs inside blockquotes (no extra line breaks)
+T8200: paragraphs inside blockquotes (no extra line breaks)
 !! wikitext
 <blockquote>Line one
 
@@ -20588,7 +21222,7 @@ Line two</blockquote>
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open)
+T8200: paragraphs inside blockquotes (extra line break on open)
 !! wikitext
 <blockquote>
 Line one
@@ -20607,7 +21241,7 @@ Line two</blockquote>
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on close)
+T8200: paragraphs inside blockquotes (extra line break on close)
 !! wikitext
 <blockquote>Line one
 
@@ -20627,7 +21261,7 @@ Line two
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
+T8200: paragraphs inside blockquotes (extra line break on open and close)
 !! wikitext
 <blockquote>
 Line one
@@ -20732,7 +21366,7 @@ Free external link invading image caption
 !! end
 
 !! test
-Bug 15196: localised external link numbers
+T17196: localised external link numbers
 !! options
 language=fa
 !! wikitext
@@ -20869,7 +21503,7 @@ comment local title=[[Main Page]]
 !!end
 
 !! test
-Edit comment with subpage link (bug 14080)
+Edit comment with subpage link (T16080)
 !! options
 comment
 subpage
@@ -20881,7 +21515,7 @@ Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/su
 !!end
 
 !! test
-Edit comment with subpage link and link text (bug 14080)
+Edit comment with subpage link and link text (T16080)
 !! options
 comment
 subpage
@@ -20893,7 +21527,7 @@ Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">nea
 !!end
 
 !! test
-Edit comment with bogus subpage link in non-subpage NS (bug 14080)
+Edit comment with bogus subpage link in non-subpage NS (T16080)
 !! options
 comment
 title=[[Subpage test]]
@@ -20954,7 +21588,7 @@ Edit comment with link with more than one pipe (T99346)
 comment
 !! wikitext
 [[Main Page|Many|pipes]]
-!! html
+!! html/php
 <a href="/wiki/Main_Page" title="Main Page">Many|pipes</a>
 !! end
 
@@ -20964,12 +21598,12 @@ Complex edit comment with link with more than one pipe (T99346)
 comment
 !! wikitext
 Created page with "<noinclude>[[Category:Requests for permissions/Bot|{{subst:#titleparts:{{subst:PAGENAME}}|1|3}}]]</noinclude> === [[User:MineoBot|]] 8=== {{Request for permissions/links|Mineo..."
-!! html
+!! html/php
 Created page with &quot;&lt;noinclude&gt;<a href="/index.php?title=Category:Requests_for_permissions/Bot&amp;action=edit&amp;redlink=1" class="new" title="Category:Requests for permissions/Bot (page does not exist)">{{subst:#titleparts:{{subst:PAGENAME}}|1|3}}</a>&lt;/noinclude&gt; === <a href="/index.php?title=User:MineoBot&amp;action=edit&amp;redlink=1" class="new" title="User:MineoBot (page does not exist)">User:MineoBot</a> 8=== {{Request for permissions/links|Mineo...&quot;
 !! end
 
 !! test
-Space normalisation on autocomment (bug 22784)
+Space normalisation on autocomment (T24784)
 !! options
 comment
 title=[[Main Page]]
@@ -20980,7 +21614,7 @@ title=[[Main Page]]
 !! end
 
 !! test
-percent-encoding and + signs in comments (Bug 26410)
+percent-encoding and + signs in comments (T28410)
 !! options
 comment
 !! wikitext
@@ -20989,7 +21623,7 @@ comment
 <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
 !! end
 
-# Parsoid doesn't support this yet: see bug 73581
+# Parsoid doesn't support this yet: see T75581
 # but it *should* omit the 'src' attribute if the image is bad.
 # PHP side of tests was disabled in
 # mediawiki/core:6bd31e7d95161a6e88fa86df60871051da997c3c
@@ -21005,7 +21639,7 @@ Bad images - basic functionality
 !! end
 
 !! test
-Bad images - bug 16039: text after bad image disappears
+Bad images - T18039: text after bad image disappears
 !! wikitext
 Foo bar
 [[File:Bad.jpg]]
@@ -21021,7 +21655,7 @@ Bar foo</p>
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) no displaytitle
+Verify that displaytitle works (T24501) no displaytitle
 !! options
 showtitle
 !! config
@@ -21036,7 +21670,7 @@ Parser test
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=false
+Verify that displaytitle works (T24501) RestrictDisplayTitle=false
 !! options
 showtitle
 title=[[Screen]]
@@ -21053,7 +21687,7 @@ whatever
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true mismatch
+Verify that displaytitle works (T24501) RestrictDisplayTitle=true mismatch
 !! options
 showtitle
 title=[[Screen]]
@@ -21070,7 +21704,7 @@ Screen
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true matching
+Verify that displaytitle works (T24501) RestrictDisplayTitle=true matching
 !! options
 showtitle
 title=[[Screen]]
@@ -21087,7 +21721,7 @@ screen
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false
+Verify that displaytitle works (T24501) AllowDisplayTitle=false
 !! options
 showtitle
 title=[[Screen]]
@@ -21104,7 +21738,7 @@ Screen
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false no DISPLAYTITLE
+Verify that displaytitle works (T24501) AllowDisplayTitle=false no DISPLAYTITLE
 !! options
 showtitle
 title=[[Screen]]
@@ -21119,7 +21753,7 @@ Screen
 !! end
 
 !! test
-Verify that displaytitle handles inline CSS styles (bug 26547) - rejected value
+Verify that displaytitle handles inline CSS styles (T28547) - rejected value
 !! options
 showtitle
 title=[[Screen]]
@@ -21136,7 +21770,7 @@ this is not the the title
 !! end
 
 !! test
-Verify that displaytitle handles inline CSS styles (bug 26547) - accepted value
+Verify that displaytitle handles inline CSS styles (T28547) - accepted value
 !! options
 showtitle
 title=[[Screen]]
@@ -21269,7 +21903,7 @@ preload
 !! end
 
 !! test
-Play a bit with r67090 and bug 3158
+Play a bit with r67090 and T5158
 !! wikitext
 <div style="width:50% !important">&nbsp;</div>
 <div style="width:50%&nbsp;!important">&nbsp;</div>
@@ -21316,7 +21950,7 @@ Strip reserved data attributes
 !! end
 
 !! test
-percent-encoding and + signs in internal links (Bug 26410)
+percent-encoding and + signs in internal links (T28410)
 !! wikitext
 [[User:+%]] [[Page+title%]]
 [[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
@@ -21336,7 +21970,7 @@ percent-encoding and + signs in internal links (Bug 26410)
 !! end
 
 !! test
-Special characters in embedded file links (bug 27679)
+Special characters in embedded file links (T29679)
 !! wikitext
 [[File:Contains & ampersand.jpg]]
 [[File:Does not exist.jpg|Title with & ampersand]]
@@ -21359,7 +21993,7 @@ Text&apos;s been normalized?
 !! end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
+T21052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
 !! wikitext
 http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
 !! html
@@ -21368,7 +22002,7 @@ http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
 !! end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
+T21052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
 !! wikitext
 [http://www.example.org/ ideograms]
 !! html
@@ -21377,7 +22011,7 @@ Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
 !! end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
+T21052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
 !! wikitext
 http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
 !! html
@@ -21405,7 +22039,7 @@ Template:Identical
 !! endarticle
 
 !! test
-Bug 31098 Template which includes system messages which includes the template
+T33098 Template which includes system messages which includes the template
 !! wikitext
 {{Identical}}
 !! html
@@ -21415,7 +22049,7 @@ Bug 31098 Template which includes system messages which includes the template
 !! end
 
 !! test
-Bug31490 Turkish: ucfirst 'blah'
+T33490 Turkish: ucfirst 'blah'
 !! options
 language=tr
 !! wikitext
@@ -21426,7 +22060,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: ucfirst 'ix'
+T33490 Turkish: ucfirst 'ix'
 !! options
 language=tr
 !! wikitext
@@ -21437,7 +22071,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: lcfirst 'BLAH'
+T33490 Turkish: lcfirst 'BLAH'
 !! options
 language=tr
 !! wikitext
@@ -21448,7 +22082,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: ucfırst (with a dotless i)
+T33490 Turkish: ucfırst (with a dotless i)
 !! options
 language=tr
 !! wikitext
@@ -21459,7 +22093,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 ucfırst (with a dotless i) with English language
+T33490 ucfırst (with a dotless i) with English language
 !! options
 language=en
 !! wikitext
@@ -21470,7 +22104,7 @@ language=en
 !! end
 
 !! test
-Bug 26375: TOC with italics
+T28375: TOC with italics
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -21488,7 +22122,7 @@ __TOC__
 !! end
 
 !! test
-Bug 26375: TOC with bold
+T28375: TOC with bold
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -21506,7 +22140,7 @@ __TOC__
 !! end
 
 !! test
-Bug 33845: Headings become cursive in TOC when they contain an image
+T35845: Headings become cursive in TOC when they contain an image
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -21524,7 +22158,7 @@ __TOC__
 !! end
 
 !! test
-Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
+T35845 (2): Headings become bold in TOC when they contain a blockquote
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -21679,7 +22313,7 @@ __TOC__
 !! end
 
 !! test
-Bug 72884: bdi element in ToC
+T74884: bdi element in ToC
 !! wikitext
 __TOC__
 == <bdi>test</bdi> ==
@@ -21742,17 +22376,17 @@ __TOC__
 !! end
 
 !! article
-MediaWiki:Bug32057
+MediaWiki:T34057
 !! text
 == {{int:headline_sample}} ==
 !! endarticle
 
 !! test
-Bug 32057: Title needed when expanding <h> nodes.
+T34057: Title needed when expanding <h> nodes.
 !! options
 title=[[Main Page]]
 !! wikitext
-{{int:Bug32057}}
+{{int:T34057}}
 !! html
 <h2><span class="mw-headline" id="Headline_text">Headline 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: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
@@ -21765,7 +22399,7 @@ Strip marker in urlencode
 {{urlencode:x<nowiki/>y|wiki}}
 {{urlencode:x<nowiki/>y|path}}
 {{urlencode:x<pre id="one">two</pre>y}}
-!! html
+!! html/php
 <p>xy
 xy
 xy
@@ -21816,7 +22450,7 @@ language=be-tarask
 !! end
 
 !! test
-Wrong option for formatNum (bug 56199)
+Wrong option for formatNum (T58199)
 !! wikitext
 {{formatnum:1,234.56|Random}}
 {{formatnum:1,234.56|EVERYTHING}}
@@ -21867,7 +22501,7 @@ Strip marker in anchorencode
 !! end
 
 !! test
-nowiki inside link inside heading (bug 18295)
+nowiki inside link inside heading (T20295)
 !! wikitext
 ==[[foo|x<nowiki>y</nowiki>z]]==
 !! html
@@ -21876,7 +22510,7 @@ nowiki inside link inside heading (bug 18295)
 !! end
 
 !! test
-new support for bdi element (bug 31817)
+new support for bdi element (T33817)
 !! wikitext
 <p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
 !! html
@@ -21897,832 +22531,192 @@ Ignore pipe between table row attributes
 <tr>
 <td> quux
 </td></tr>
-<tr id="foo" style="color: red">
-<td> bar
-</td></tr></table>
-
-!! end
-
-!!test
-Gallery override link with WikiLink (bug 34852)
-!! wikitext
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
-</gallery>
-!! html
-<ul class="gallery mw-gallery-traditional">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
-                       <div class="gallerytext">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with absolute external link (bug 34852)
-!! wikitext
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
-</gallery>
-!! html
-<ul class="gallery mw-gallery-traditional">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
-                       <div class="gallerytext">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with malicious javascript (bug 34852)
-!! wikitext
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
-</gallery>
-!! html
-<ul class="gallery mw-gallery-traditional">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
-                       <div class="gallerytext">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery with invalid title as link (bug 43964)
-!! wikitext
-<gallery>
-File:foobar.jpg|link=<
-</gallery>
-!! html
-<ul class="gallery mw-gallery-traditional">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
-!!test
-Language parser function
-!! wikitext
-{{#language:ar}}
-!! html
-<p>العربية
-</p>
-!! end
-
-!!test
-Padleft and padright as substr
-!! wikitext
-{{padleft:|3|abcde}}
-{{padright:|3|abcde}}
-!! html
-<p>abc
-abc
-</p>
-!! end
-
-!!test
-Special parser function
-!! wikitext
-{{#special:RandomPage}}
-{{#special:BaDtItLe}}
-{{#special:Foobar}}
-!! html
-<p>Special:Random
-Special:Badtitle
-Special:Foobar
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP://])
-!! wikitext
-[HttP://MediaWiki.Org/]
-!! html/php
-<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
-</p>
-!! html/parsoid
-<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/"></a></p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP:// title])
-!! wikitext
-[HttP://MediaWiki.Org/ MediaWiki]
-!! html
-<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing (HttP://)
-!! wikitext
-HttP://MediaWiki.Org/
-!! html/php
-<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
-</p>
-!! html/parsoid
-<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a></p>
-!! end
-
-!!test
-Disable TOC
-!! options
-notoc
-!! wikitext
-Lead
-== Section 1 ==
-== Section 2 ==
-== Section 3 ==
-== Section 4 ==
-== Section 5 ==
-!! html
-<p>Lead
-</p>
-
-<h2><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_2">Section 2</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: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_4">Section 4</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: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_5">Section 5</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: Section 5">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-
-!! end
-
-
-###
-### Parsoid-specific tests
-### Parsoid-PHP parser incompatibilities
-###
-!!test
-1. SOL-sensitive wikitext tokens as template-args
-!!options
-parsoid=wt2html,wt2wt
-!! wikitext
-{{echo|*a}}
-{{echo|#a}}
-{{echo|:a}}
-!! html
-<span about="#mwt1" typeof="mw:Transclusion">
-</span><ul about="#mwt1"><li>a</li>
-</ul>
-<span about="#mwt2" typeof="mw:Transclusion">
-</span><ol about="#mwt2"><li>a</li>
-</ol>
-<span about="#mwt3" typeof="mw:Transclusion">
-</span><dl about="#mwt3"><dd>a</dd>
-</dl>
-!!end
-
-#### -----------------------------------------------------------------
-#### Parsoid-specific functionality tests
-#### -----------------------------------------------------------------
-
-# Bug 63642/66749: Formatting elt fixup around images is cleaned up.
-# We know wt2wt will fail, but we expect selser to pass.
-# Due to the nature of our testing, wt2wt and selser tests will enter the
-# blacklist and we'll catch selser regressions based on changes to the
-# blacklist entries for selser tests.
-!! test
-1. Bad treebuilder fixup of formatting elt is cleaned up
-!! options
-parsoid=wt2html,wt2wt
-!! wikitext
-{|
-|
-<small>
-[[Image:Foobar.jpg|right|Test]]
-</small>
-|}
-!! html/parsoid
-<table>
-<tbody><tr><td>
-<small>
-<figure class="mw-default-size mw-halign-right" 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"/></a><figcaption>Test</figcaption></figure>
-</small>
-</td></tr>
-</tbody></table>
-!! end
-
-!! test
-2. Bad treebuilder fixup of formatting elt is cleaned up
-!! options
-parsoid=wt2html,wt2wt
-!! wikitext
-'''foo[[File:Foobar.jpg|thumb|caption]]bar'''
-
-<small>[[Image:Foobar.jpg|right|300px]]</small>
-!! html/parsoid
-
-<p><b>foo</b></p>
-<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><b>caption</b></figcaption></figure>
-<p><b>bar</b></p>
-<small><figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure></small>
-!! end
-
-!! test
-3. Bad treebuilder fixup of formatting elt is cleaned up
-!! options
-parsoid=wt2html,wt2wt
-!! wikitext
-<small>'''foo[[File:Foobar.jpg|thumb|caption]]bar'''</small>
-!! html/parsoid
-<p><small><b>foo</b></small></p>
-<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><small><b>caption</b></small></figcaption></figure>
-<p><small><b>bar</b></small></p>
-!! end
-
-!! test
-4. Bad treebuilder fixup of formatting elt is cleaned up: formatting tags around captionless images are ignored
-!! options
-parsoid=wt2html,wt2wt
-!! wikitext
-'''<small>[[Image:Foobar.jpg|right|300px]]</small>'''
-!! html/parsoid
-<p><b><small></small></b></p>
-<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure>
-<p></p>
-!! end
-
-#### ----------------------------------------------------------------
-#### Parsoid-only testing of Parsoid's impl of <ref> and <references>
-#### tags. Parsoid's output for these tags differs from that of the
-#### PHP parser.
-#### ----------------------------------------------------------------
-
-!!test
-Ref: 1. ref-location should be replaced with an index span
-!! wikitext
-A <ref>foo</ref>
-B <ref name="x">foo</ref>
-C <ref name="y" />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="#cite_note-x-2"><span class="mw-reflink-text">[2]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="#cite_note-y-3"><span class="mw-reflink-text">[3]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-x-2" id="cite_note-x-2"><a href="#cite_ref-x_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-y-3" id="cite_note-y-3"><a href="#cite_ref-y_3-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 2. ref-tags with identical names should all get the same index
-!! wikitext
-A <ref name="x">foo</ref>
-B <ref name="x" />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 3. spaces in ref-names should be ignored
-!! wikitext
-A <ref name="x">foo</ref>
-B <ref name=" x " />
-C <ref name= x  />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a><a href="#cite_ref-x_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-# NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
-!!test
-Ref: 4. 'constructor' should be accepted as a valid ref-name
-!! wikitext
-A <ref name="constructor">foo</ref>
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-constructor-1"},"attrs":{"name":"constructor"}}'><a href="#cite_note-constructor-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><a href="#cite_ref-constructor_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 5. body should accept generic wikitext
-!! wikitext
-A <ref>
- This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 6. indent-pres should not be output in ref-body
-!! wikitext
-A <ref>
- foo
- bar
- baz
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
- bar
- baz
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 7. No p-wrapping in ref-body
-!! wikitext
-A <ref>
-foo
-
-bar
-
-
-baz
-
-
-
-booz
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
-
-bar
-
-
-baz
-
-
-
-booz
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 8. transclusion wikitext has lower precedence
-!! wikitext
-A <ref> foo {{echo|</ref> B C}}
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C}}</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo {{echo|</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 9. unclosed comments should not leak out of ref-body
-!! wikitext
-A <ref> foo <!--</ref> B C
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 10. Unclosed HTML tags should not leak out of ref-body
-!! wikitext
-A <ref> <b> foo </ref> B C
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 11. ref-tags acts like an inline element wrt P-wrapping
-!! wikitext
-A <ref>foo</ref> B
-C <ref>bar</ref> D
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B
-C <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> D</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 12. ref-tags act as trailing newline migration barrier
-!! wikitext
-<!--the newline at the end of this line moves out of the p tag-->a
-
-b<!--the newline at the end of this line stays inside the p tag--> <ref />
-<ref />
-
-c
-<references />
-!! html/parsoid
-<!--the newline at the end of this line moves out of the p tag--><p>a</p>
-
-
-<p>b<!--the newline at the end of this line stays inside the p tag--> <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<p>c</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
-!!end
-
-!!test
-Ref: 13. ref-tags are not SOL-transparent and block indent-pres
-!! wikitext
-<ref>foo</ref> A
-<ref>bar
-</ref> B
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> A
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> B</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 14. A nested ref-tag should be emitted as plain text
-!! wikitext
-<ref>foo <ref>bar</ref> baz</ref>
-
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo &lt;ref>bar&lt;/ref> baz</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 15. ref-tags with identical names should get identical indexes
-!! wikitext
-A1 <ref name="a">foo</ref> A2 <ref name="a" />
-B1 <ref name="b" /> B2 <ref name="b">bar</ref>
-
-<references />
-!! html/parsoid
-<p>A1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a-1"},"attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span> A2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B1 <span about="#mwt7" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span> B2 <span about="#mwt8" class="mw-ref" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-a_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b_2-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-b_2-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-## We don't bother wt2wt-ing non-standard whitespace
-!!test
-Ref: 16. Tokenizer should accept non-standard whitespace in <ref> and </ref> tags
-!!options
-parsoid=wt2html
-!! wikitext
-A <ref >foo</ref >
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
-!!end
-
-!!test
-Ref: 17. Generate valid HTML5 id/about attributes
-!!wikitext
-<ref name="a b">foo</ref>
-
-<references />
-!!html/parsoid
-<p><span class="mw-ref" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="#cite_note-a_b-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_b-1" id="cite_note-a_b-1"><a href="#cite_ref-a_b_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 18. T58916: Extension attributes should be parsed as plain text
-!!wikitext
-<ref name="{{echo|a}}">foo</ref>
-
-<references />
-!!html/parsoid
-<p><span class="mw-ref" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1"},"attrs":{"name":"{{echo|a}}"}}'><a href="#cite_note-.7B.7Becho.7Ca.7D.7D-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><a href="#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 19. ref-tags with identical name encodings should get identical indexes
-!! wikitext
-1 <ref name="a & b">foo</ref> 2 <ref name="a &amp; b" />
-
-<references />
-!! html/parsoid
-<p>1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_.26_b-1"},"attrs":{"name":"a &amp; b"}}'><a href="#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span> 2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_.26_b_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-a_.26_b_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 20. ref-tags with identical names but different content should keep it
-!! wikitext
-A <ref name="foo">Foo one</ref>
-B <ref name="foo">Foo two</ref>
-C <ref name="foo" />
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-foo_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-foo-1"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy"><a href="#cite_ref-foo_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-foo_1-1"><span class="mw-linkback-text">2 </span></a><a href="#cite_ref-foo_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
-</ol>
-!!end
-
-!!test
-References: 1. references tag without any refs should be handled properly
-!! wikitext
-<references />
-!! html/parsoid
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
-!!end
-
-!!test
-References: 2. references tag with group only outputs references from that group
-!! wikitext
-A <ref group="a">foo</ref>
-B <ref group="b">bar</ref>
-C <ref>baz</ref>
-
-<references group="a" />
-<references />
-<references group="b" />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="#cite_note-2" data-mw-group="b"><span class="mw-reflink-text">[b 1]</span></a></span>
-C <span class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-3" id="cite_note-3"><a href="#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt12" data-mw-group="b" data-mw='{"name":"references","attrs":{"group":"b"}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" data-mw-group="b" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-References: 3. ref list should be cleared after processing references
-!! wikitext
-A <ref>foo</ref>
-
-<references />
-
-B <ref>bar</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-
-<p>B <span about="#mwt6" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
+<tr id="foo" style="color: red">
+<td> bar
+</td></tr></table>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
+!! end
 
 !!test
-References: 4. only referenced group should be cleared after processing references
+Language parser function
 !! wikitext
-A <ref group="a">afoo</ref>
-B <ref>bfoo</ref>
-
-<references group="a" />
-
-C <ref>cfoo</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
-</ol>
-
-<p>C <span about="#mwt8" class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3"><span class="mw-reflink-text">[2]</span></a></span></p>
+{{#language:ar}}
+!! html
+<p>العربية
+</p>
+!! end
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><a href="#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
-</ol>
-!!end
+!!test
+Padleft and padright as substr
+!! wikitext
+{{padleft:|3|abcde}}
+{{padright:|3|abcde}}
+!! html
+<p>abc
+abc
+</p>
+!! end
 
-## Don't expect this to rt since we're dropping content
-!! test
-References: 5. ref tags in references should be processed while ignoring all other content
-!! options
-parsoid=wt2html,html2html
+!!test
+Special parser function
 !! wikitext
-A <ref name="a" />
-B <ref name="b">bar</ref>
+{{#special:RandomPage}}
+{{#special:BaDtItLe}}
+{{#special:Foobar}}
+!! html
+<p>Special:Random
+Special:Badtitle
+Special:Foobar
+</p>
+!! end
 
-<references>
-<ref name="a">foo</ref>
-This should just get lost.
-</references>
+!!test
+T36939 - Case insensitive link parsing ([HttP://])
+!! wikitext
+[HttP://MediaWiki.Org/]
+!! html/php
+<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
+</p>
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
+<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/"></a></p>
+!! end
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{},"body":{"html":"\n&lt;span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>\n"}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
+!!test
+T36939 - Case insensitive link parsing ([HttP:// title])
+!! wikitext
+[HttP://MediaWiki.Org/ MediaWiki]
+!! html
+<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
+</p>
 !! end
 
-!! test
-References: 6. <references /> from a transclusion
+!!test
+T36939 - Case insensitive link parsing (HttP://)
 !! wikitext
-<ref>Foo</ref> {{echo|<references />}}
+HttP://MediaWiki.Org/
+!! html/php
+<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
+</p>
 !! html/parsoid
-<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
-</ol>
+<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a></p>
 !! end
 
-!! test
-References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
+!!test
+Disable TOC
+!! options
+notoc
 !! wikitext
-A <ref>foo bar for a</ref>
-B <ref group="X" name="b" />
-
-<references />
-
-<references group="X">
-<ref name="b">foo</ref>
-</references>
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="#cite_note-b-2" data-mw-group="X"><span class="mw-reflink-text">[X 1]</span></a></span>
+Lead
+== Section 1 ==
+== Section 2 ==
+== Section 3 ==
+== Section 4 ==
+== Section 5 ==
+!! html
+<p>Lead
 </p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
-</ol>
+<h2><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_2">Section 2</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: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_4">Section 4</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: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_5">Section 5</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: Section 5">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","attrs":{"group":"X"},"body":{"html":"\n&lt;span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[X 1]&lt;/span>&lt;/a>&lt;/span>\n"}}'>
-<li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
-</ol>
 !! end
 
-!! test
-References: 8. T88019: Remove <meta>s from templates inside <ref> that's itself inside a template
+
+###
+### Parsoid-specific tests
+### Parsoid-PHP parser incompatibilities
+###
+!!test
+1. SOL-sensitive wikitext tokens as template-args
+!!options
+parsoid=wt2html,wt2wt
 !! wikitext
-X{{echo|<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>}}
-<references />
-!! html/parsoid
-<p>X<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo {{echo|&lt;b>bar&lt;/b>}} and {{echo|baz}} boo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
+{{echo|*a}}
+{{echo|#a}}
+{{echo|:a}}
+!! html
+<span about="#mwt1" typeof="mw:Transclusion">
+</span><ul about="#mwt1"><li>a</li>
+</ul>
+<span about="#mwt2" typeof="mw:Transclusion">
+</span><ol about="#mwt2"><li>a</li>
 </ol>
+<span about="#mwt3" typeof="mw:Transclusion">
+</span><dl about="#mwt3"><dd>a</dd>
+</dl>
 !!end
 
-# This test only works in wt2html now as the <references /> are always generated
-# unless selser is active. Once T72722 is fixed, we should add a changes test
-# here to ensure that unrelated changes don't add the new <references />
-# when selser is active.
+#### -----------------------------------------------------------------
+#### Parsoid-specific functionality tests
+#### -----------------------------------------------------------------
+
+# T65642/T68749: Formatting elt fixup around images is cleaned up.
+# We know wt2wt will fail, but we expect selser to pass.
+# Due to the nature of our testing, wt2wt and selser tests will enter the
+# blacklist and we'll catch selser regressions based on changes to the
+# blacklist entries for selser tests.
 !! test
-References: 9. Generate missing references list at the end
+1. Bad treebuilder fixup of formatting elt is cleaned up
+!! options
+parsoid=wt2html,wt2wt
 !! wikitext
-A <ref>foo</ref>
-B <ref group="inexistent">bar</ref>
+{|
+|
+<small>
+[[Image:Foobar.jpg|right|Test]]
+</small>
+|}
 !! html/parsoid
-<p>A <span class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B <span class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="#cite_note-2" data-mw-group="inexistent"><span class="mw-reflink-text">[inexistent 1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="inexistent" data-mw='{"name":"references","attrs":{"group":"inexistent"},"autoGenerated":true}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" data-mw-group="inexistent" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
+<table>
+<tbody><tr><td>
+<small>
+<figure class="mw-default-size mw-halign-right" 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"/></a><figcaption>Test</figcaption></figure>
+</small>
+</td></tr>
+</tbody></table>
 !! end
 
 !! test
-References: 10. New <references/> shouldn't be added for unrelated edits.
+2. Bad treebuilder fixup of formatting elt is cleaned up
 !! options
-parsoid={
-  "modes": ["selser"],
-  "changes": [["#x", "remove"]],
-  "selser": "noauto"
-}
+parsoid=wt2html,wt2wt
 !! wikitext
-Unrelated text<span id="x"> that's going to disappear</span>.
-A <ref>foo</ref>
-!! wikitext/edited
-Unrelated text.
-A <ref>foo</ref>
-!!end
+'''foo[[File:Foobar.jpg|thumb|caption]]bar'''
 
-!! test
-Entities in ref name
-!! wikitext
-<ref name="test &amp; me">hi</ref>
-<references />
+<small>[[Image:Foobar.jpg|right|300px]]</small>
 !! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp;amp; me"}}'><a href="#cite_note-test_.26_me-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><a href="#cite_ref-test_.26_me_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
-</ol>
+
+<p><b>foo</b></p>
+<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><b>caption</b></figcaption></figure>
+<p><b>bar</b></p>
+<small><figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure></small>
 !! end
 
-## The output here may look funny, but it's what the php parser will do.  The
-## unclosed references tag becomes escaped text, and then a new references
-## tag is auto-generated.  The test is wt2html only because it roundtrips with
-## nowiki tags, and the auto-generated references tag is only dropped in
-## rtTestMode.
 !! test
-Generate references for unclosed references tag
+3. Bad treebuilder fixup of formatting elt is cleaned up
 !! options
-parsoid=wt2html
+parsoid=wt2html,wt2wt
 !! wikitext
-a<ref>foo</ref>
-
-<references>
+<small>'''foo[[File:Foobar.jpg|thumb|caption]]bar'''</small>
 !! html/parsoid
-<p>a<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<p>&lt;references></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+<p><small><b>foo</b></small></p>
+<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><small><b>caption</b></small></figcaption></figure>
+<p><small><b>bar</b></small></p>
 !! end
 
 !! test
-New reference serializes on its own line
+4. Bad treebuilder fixup of formatting elt is cleaned up: formatting tags around captionless images are ignored
 !! options
-parsoid=wt2wt,html2wt
+parsoid=wt2html,wt2wt
 !! wikitext
-foo
-<references />
+'''<small>[[Image:Foobar.jpg|right|300px]]</small>'''
 !! html/parsoid
-foo<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
+<p><b><small></small></b></p>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure>
+<p></p>
 !! end
 
 #### ----------------------------------------------------------------
@@ -22731,10 +22725,14 @@ foo<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data
 #### https://www.mediawiki.org/wiki/Parsoid/HTML_based_LST
 #### ----------------------------------------------------------------
 
+## We still need to support serializing the older format while content is stored.
 !! test
-LST Sections: 1. Simple section start and end
+LST Sections: Backwards compatibility
 !! options
-parsoid={ "suppressErrors": true }
+parsoid={
+  "suppressErrors": true,
+  "modes": ["html2wt"]
+}
 !! wikitext
 <section begin="2011-05-16" />
 <section end="2014-04-10 (MW 1.23wmf22)" />
@@ -22743,6 +22741,21 @@ parsoid={ "suppressErrors": true }
 <meta typeof="mw:Extension/LabeledSectionTransclusion/end" content="2014-04-10 (MW 1.23wmf22)"/></p>
 !! end
 
+## The unconventional output is the result of `usePHPPreProcessor` being
+## disabled in parserTests.js.  This test is mainly just to show <section> is
+## recognized as an extension tag w/o a native handler.
+!! test
+LST Sections: Newfangled approach
+!! options
+parsoid={ "suppressErrors": true }
+!! wikitext
+<section begin="2011-05-16" />
+<section end="2014-04-10 (MW 1.23wmf22)" />
+!! html/parsoid
+<p><span typeof="mw:Extension/section" about="#mwt1" data-parsoid='{"stx":"html","selfClose":true,"src":"&lt;section begin=\"2011-05-16\" />","tagWidths":[30,0]}'>&lt;section begin="2011-05-16" /></span>
+<span typeof="mw:Extension/section" about="#mwt2" data-parsoid='{"stx":"html","selfClose":true,"src":"&lt;section end=\"2014-04-10 (MW 1.23wmf22)\" />","tagWidths":[43,0]}'>&lt;section end="2014-04-10 (MW 1.23wmf22)" /></span></p>
+!! end
+
 #--------- Test stripping of empty nodes in template content ----------
 !!test
 Empty LI and TR nodes should be stripped from template content
@@ -23811,7 +23824,7 @@ parsoid=html2wt
 !! end
 
 !! test
-Links 6. Add <nowiki/>s between text-nodes and url-links when required (bug 64300)
+Links 6. Add <nowiki/>s between text-nodes and url-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -23846,7 +23859,7 @@ http://example.com(x<nowiki/>)
 !! end
 
 !! test
-Links 7a. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+Links 7a. Don't add spurious <nowiki/>s between text-nodes and url-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
 !! end
 
 !! test
-Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -23897,7 +23910,7 @@ http://example.com.,;:!?\
 !! end
 
 !! test
-Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (bug 64300)
+Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -23911,7 +23924,7 @@ X<nowiki/>RFC 123<nowiki/>y
 !! end
 
 !! test
-Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (bug 64300)
+Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -23931,7 +23944,7 @@ RFC 123&foo
 !! end
 
 !! test
-Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (bug 64300)
+Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -23945,7 +23958,7 @@ X<nowiki/>PMID 123<nowiki/>y
 !! end
 
 !! test
-Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (bug 64300)
+Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -23965,7 +23978,7 @@ PMID 123&foo
 !! end
 
 !! test
-Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (bug 64300)
+Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -23980,7 +23993,7 @@ a<nowiki/>ISBN 1234567890<nowiki/>b
 !! end
 
 !! test
-Links 13. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 64300)
+Links 13. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24081,11 +24094,11 @@ parsoid=html2wt
 <i>a'</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
 <i>a'</i> foo <b><a rel="mw:WikiLink" href="Bar" title="Bar" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[bar]]"}},"i":0}}]}'>bar</a></b>
 <a rel="mw:WikiLink" href="Foo" title="Foo">foo</a> x'<i><a href="Bar" rel="mw:WikiLink" title="Bar">bar</a></i>
-'<i>foo</i> <span class="mw-ref" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+'<i>foo</i> <span class="mw-ref" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
 '<i>foo</i> <div title="name">test</div>
 '<i>foo</i> and <br data-parsoid='{"stx":"html","noClose":true}'/> bar
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">test</span></li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">test</span></li>
 </ol>
 !! wikitext
 '''a'' foo ''[[bar]]''
 !! options
 parsoid=html2wt
 !! html/parsoid
-<p>foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i>a</i>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i>a</i>
  b</span></li>
 </ol>
 !! wikitext
@@ -24426,7 +24439,7 @@ parsoid=html2wt
 
 ## The quote-char in the input is necessary for triggering the bug
 !! test
-(Bug 52035) Nowiki-escaping should not get tripped by " :" in text
+(T54035) Nowiki-escaping should not get tripped by " :" in text
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -25113,7 +25126,7 @@ parsoid=wt2html
 </table>
 !!end
 
-# Parsoid only for bug 64747
+# Parsoid only for T66747
 !! test
 Properly encapsulate empty-content transclusions in fosterable positions
 !! wikitext
@@ -25209,7 +25222,7 @@ http://en.wikipedia.org/wiki/Foobar
 
 # 'mi' is a localinterwiki prefix as well as a language
 !! test
-Serialize interwiki links pointing to the current wiki as plain wiki links (bug 65869)
+Serialize interwiki links pointing to the current wiki as plain wiki links (T67869)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -25361,7 +25374,7 @@ parsoid={
 !!end
 
 !! test
-Image: Modifying alignment of an image (bug 48665)
+Image: Modifying alignment of an image (T50665)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25377,7 +25390,7 @@ parsoid={
 !! end
 
 !! test
-Image: Modifying mw-default-size of an frameless image (bug 62805)
+Image: Modifying mw-default-size of an frameless image (T64805)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25392,7 +25405,7 @@ parsoid={
 !! end
 
 !! test
-Image: Modifying valign of an image (bug 49221)
+Image: Modifying valign of an image (T51221)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25408,7 +25421,7 @@ parsoid={
 !! end
 
 !! test
-Image: Modifying alt attribute of an image (bug 56400)
+Image: Modifying alt attribute of an image (T58400)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25438,7 +25451,7 @@ parsoid={
 !!end
 
 !! test
-Image: empty alt attribute (bug 48924)
+Image: empty alt attribute (T50924)
 !! options
 parsoid
 !! wikitext
@@ -25448,7 +25461,7 @@ parsoid
 !! end
 
 !! test
-Image: new attributes should be serialized in wiki's language for RTL languages (bug 51852)
+Image: new attributes should be serialized in wiki's language for RTL languages (T53852)
 !! options
 parsoid=html2wt
 language=ar
@@ -25741,9 +25754,9 @@ parsoid={
   "scrubWikitext": true
 }
 !! html/parsoid
-<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
+<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">bar <link rel="mw:PageProp/Category" href="./Category:Baz" /> </span></li></ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">bar <link rel="mw:PageProp/Category" href="./Category:Baz" /> </span></li></ol>
 !! wikitext
 == foo <ref>bar 
 [[Category:Baz]] </ref> ==
@@ -25831,9 +25844,9 @@ parsoid=html2wt
 <h2> hi <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bogus","href":"./Template:Bogus"},"params":{"1":{"wt":"there\nyou"}},"i":0}}]}'>there</span><span about="#mwt1">
 </span><span about="#mwt1">you</span> </h2>
 
-<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
+<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">hello
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">hello
 there</span></li></ol>
 
 <ul><li>asd
@@ -26053,7 +26066,7 @@ parsoid={
 #------------------------------
 
 !!test
-Bug 54262: New entities
+T56262: New entities
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -26195,7 +26208,7 @@ WTS of autolinks with escapes (editing)
 parsoid={
   "modes": ["wt2wt"],
   "changes": [
-    [ "meta", "remove" ]
+    [ "span", "remove" ]
   ]
 }
 !! wikitext
@@ -26395,6 +26408,100 @@ parsoid=html2wt,wt2wt
 </table>
 !! end
 
+!! test
+T149209: WTS: Handle newlines in table cells properly
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table>
+<tbody>
+<tr><td>a
+b
+</td><td data-parsoid='{"stx_v":"row"}'>c</td></tr>
+<tr><td><p>x</p>
+</td><td data-parsoid='{"stx_v":"row", "startTagSrc": "{{!}}{{!}}"}'>y</td></tr>
+</tbody></table>
+<table>
+<tbody>
+<tr><th>a
+b
+</th><th data-parsoid='{"stx_v":"row"}'>c</th></tr>
+<tr><th><p>x</h>
+</th><th data-parsoid='{"stx_v":"row"}'>y</th></tr>
+</tbody></table>
+!! wikitext
+{|
+|a
+b
+|c
+|-
+|x
+{{!}}y
+|}
+{|
+!a
+b
+!c
+|-
+!x
+!y
+|}
+!! end
+
+!! test
+T149209: Selser: Handle newlines in table cells properly
+!! options
+parsoid={
+  "modes": ["selser"],
+  "changes": [
+    [ "#h1", "html", "a\nb\n" ],
+    [ "#h2", "html", "a\nb\n" ],
+    [ "#c1", "html", "a\nb\n" ],
+    [ "#c2", "html", "<p>a</p>" ],
+    [ "#c3", "html", "<p>a</p>" ],
+    [ "#c4", "html", "edit-me<p>a</p>" ]
+  ]
+}
+!! wikitext
+{|
+! id="h1" |edit-me!!1
+|-
+! id="h2" |edit-me||2
+|-
+| id="c1" |edit-me||3
+|-
+| id="c2" |edit-me||4
+|-
+| id="c3" |edit-me||p||q||r
+|-
+| id="c4" |edit-me||p||q||r
+|}
+!! wikitext/edited
+{|
+! id="h1" |a
+b
+!1
+|-
+! id="h2" |a
+b
+!2
+|-
+| id="c1" |a
+b
+|3
+|-
+| id="c2" |a
+|4
+|-
+| id="c3" |a
+|p||q||r
+|-
+| id="c4" |edit-me
+a
+|p||q||r
+|}
+!! end
+
 !! test
 HTML id attribute with Parsoid-like element ids should not be serialized to wikitext
 !! options
diff --git a/tests/phan/bin/phan b/tests/phan/bin/phan
new file mode 100755 (executable)
index 0000000..ad06823
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/bash
+
+# mediawiki-vagrant installs dont have realpath by default
+if ! which realpath > /dev/null; then
+       realpath() {
+               php -r "echo realpath('$*');"
+       }
+fi
+
+if hash php7.0 2>/dev/null; then
+       export PHP="php7.0"
+else
+       export PHP="php"
+fi
+
+# Note that this isn't loaded in via composer because then composer can
+# only be run with php7.0
+if [ ! -f "$PHAN" ]; then
+       # If no PHAN is specified then try to get location from PATH
+       export PHAN="$(which phan)"
+       if [ ! -f "$PHAN" ]; then
+               echo "The environment variable PHAN must point to the 'phan' file"
+               echo "in a checkout of https://github.com/etsy/phan.git"
+               echo "Or phan must be included in your PATH"
+               exit 1
+       fi
+else
+       export PHAN="$PHP $PHAN"
+fi
+
+if [ -z "$MW_INSTALL_PATH" ]; then
+       # Figure out where mediawiki is based on the location of this script
+       pushd "$(dirname "$0")" > /dev/null
+       export MW_INSTALL_PATH="$(git rev-parse --show-toplevel)"
+       popd >/dev/null
+fi
+
+# If the first argument doesn't start with a -, then it's a path
+# to another project (extension, skin, etc.) to analyze
+if [[ -n "$1" && "$1" != "-"* ]]; then
+       cd $1
+       shift
+else
+       cd "$(dirname "$0")"
+fi
+
+# Root directory of project
+export ROOT="$(git rev-parse --show-toplevel)"
+
+# Go to the root of this git repo
+cd "$ROOT"
+
+export CONFIG_FILE="$ROOT/tests/phan/config.php"
+if [ ! -f "$CONFIG_FILE" ]; then
+       echo "Could not find a phan config file to apply in"
+       echo "$CONFIG_FILE"
+       exit 1
+fi
+
+# Phan's issues directory
+export ISSUES="${ROOT}/tests/phan/issues"
+mkdir -p "$ISSUES"
+
+# Get the current hash of HEAD
+export REV="$(git rev-parse HEAD)"
+
+# Destination for issues found
+export RUN="${ISSUES}/issues-${REV}"
+
+
+# Run the analysis, emitting output to the
+# issues file.
+$PHAN \
+       --project-root-directory "$ROOT" \
+       --config-file "$CONFIG_FILE" \
+       --output "php://stdout" \
+       "${@}" \
+       | php "$MW_INSTALL_PATH/tests/phan/bin/postprocess-phan.php" "${@}" \
+       > $RUN
+
+EXIT_CODE="$?"
+
+# Re-link the latest file
+rm -f "${ISSUES}/latest"
+ln -s "${RUN}" "${ISSUES}/latest"
+
+# Output any issues that were found
+cat "${RUN}"
+
+exit $EXIT_CODE
diff --git a/tests/phan/bin/postprocess-phan.php b/tests/phan/bin/postprocess-phan.php
new file mode 100644 (file)
index 0000000..3e80598
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+
+abstract class Suppressor {
+       /**
+        * @param string $input
+        * @return bool do errors remain
+        */
+       abstract public function suppress( $input );
+
+       /**
+        * @param string[] $source
+        * @param string $type
+        * @param int $lineno
+        * @return bool
+        */
+       protected function isSuppressed( array $source, $type, $lineno ) {
+               return $lineno > 0 && preg_match(
+                       "|/\*\* @suppress {$type} |",
+                       $source[$lineno - 1]
+               );
+       }
+}
+
+class TextSuppressor extends Suppressor {
+       /**
+        * @param string $input
+        * @return bool do errors remain
+        */
+       public function suppress( $input ) {
+               $hasErrors = false;
+               $errors = [];
+               foreach ( explode( "\n", $input ) as $error ) {
+                       if ( empty( $error ) ) {
+                               continue;
+                       }
+                       if ( !preg_match( '/^(.*):(\d+) (Phan\w+) (.*)$/', $error, $matches ) ) {
+                               echo "Failed to parse line: $error\n";
+                               continue;
+                       }
+                       list( $source, $file, $lineno, $type, $message ) = $matches;
+                       $errors[$file][] = [
+                               'orig' => $error,
+                               // convert from 1 indexed to 0 indexed
+                               'lineno' => $lineno - 1,
+                               'type' => $type,
+                       ];
+               }
+               foreach ( $errors  as $file => $fileErrors ) {
+                       $source = file( $file );
+                       foreach ( $fileErrors as $error ) {
+                               if ( !$this->isSuppressed( $source, $error['type'], $error['lineno'] ) ) {
+                                       echo $error['orig'], "\n";
+                                       $hasErrors = true;
+                               }
+                       }
+               }
+
+               return $hasErrors;
+       }
+}
+
+class CheckStyleSuppressor extends Suppressor {
+       /**
+        * @param string $input
+        * @return bool True do errors remain
+        */
+       public function suppress( $input ) {
+               $dom = new DOMDocument();
+               $dom->loadXML( $input );
+               $hasErrors = false;
+               // DOMNodeList's are "live", convert to an array so it works as expected
+               $files = [];
+               foreach ( $dom->getElementsByTagName( 'file' ) as $file ) {
+                       $files[] = $file;
+               }
+               foreach ( $files as $file ) {
+                       $errors = [];
+                       foreach ( $file->getElementsByTagName( 'error' ) as $error ) {
+                               $errors[] = $error;
+                       }
+                       $source = file( $file->getAttribute( 'name' ) );
+                       $fileHasErrors = false;
+                       foreach ( $errors as $error ) {
+                               $lineno = $error->getAttribute( 'line' ) - 1;
+                               $type = $error->getAttribute( 'source' );
+                               if ( $this->isSuppressed( $source, $type, $lineno ) ) {
+                                       $error->parentNode->removeChild( $error );
+                               } else {
+                                       $fileHasErrors = true;
+                                       $hasErrors = true;
+                               }
+                       }
+                       if ( !$fileHasErrors ) {
+                               $file->parentNode->removeChild( $file );
+                       }
+               }
+               echo $dom->saveXML();
+
+               return $hasErrors;
+       }
+}
+
+class NoopSuppressor extends Suppressor {
+       private $mode;
+
+       public function __construct( $mode ) {
+               $this->mode = $mode;
+       }
+       public function suppress( $input ) {
+               echo "Unsupported output mode: {$this->mode}\n$input";
+               return true;
+       }
+}
+
+$opt = getopt( "m:", [ "output-mode:" ] );
+// if provided multiple times getopt returns an array
+if ( isset( $opt['m'] ) ) {
+       $mode = $opt['m'];
+} elseif ( isset( $mode['output-mode'] ) ) {
+       $mode = $opt['output-mode'];
+} else {
+       $mode = 'text';
+}
+if ( is_array( $mode ) ) {
+       // If an option is passed multiple times getopt returns an
+       // array. Just take the last one.
+       $mode = end( $mode );
+}
+
+switch ( $mode ) {
+case 'text':
+       $suppressor = new TextSuppressor();
+       break;
+case 'checkstyle':
+       $suppressor = new CheckStyleSuppressor();
+       break;
+default:
+       $suppressor = new NoopSuppressor( $mode );
+}
+
+$input = file_get_contents( 'php://stdin' );
+$hasErrors = $suppressor->suppress( $input );
+
+if ( $hasErrors ) {
+       exit( 1 );
+}
diff --git a/tests/phan/config.php b/tests/phan/config.php
new file mode 100644 (file)
index 0000000..90acc39
--- /dev/null
@@ -0,0 +1,462 @@
+<?php
+
+use \Phan\Config;
+
+// If xdebug is enabled, we need to increase the nesting level for phan
+ini_set( 'xdebug.max_nesting_level', 1000 );
+
+/**
+ * This configuration will be read and overlayed on top of the
+ * default configuration. Command line arguments will be applied
+ * after this file is read.
+ *
+ * @see src/Phan/Config.php
+ * See Config for all configurable options.
+ *
+ * A Note About Paths
+ * ==================
+ *
+ * Files referenced from this file should be defined as
+ *
+ * ```
+ *   Config::projectPath('relative_path/to/file')
+ * ```
+ *
+ * where the relative path is relative to the root of the
+ * project which is defined as either the working directory
+ * of the phan executable or a path passed in via the CLI
+ * '-d' flag.
+ */
+return [
+       /**
+        * A list of individual files to include in analysis
+        * with a path relative to the root directory of the
+        * project. directory_list won't find .inc files so
+        * we augment it here.
+        */
+       'file_list' => array_merge(
+               function_exists( 'register_postsend_function' ) ? [] : [ 'tests/phan/stubs/hhvm.php' ],
+               function_exists( 'wikidiff2_do_diff' ) ? [] : [ 'tests/phan/stubs/wikidiff.php' ],
+               function_exists( 'tideways_enable' ) ? [] : [ 'tests/phan/stubs/tideways.php' ],
+               class_exists( PEAR::class ) ? [] : [ 'tests/phan/stubs/mail.php' ],
+               class_exists( Memcached::class ) ? [] : [ 'tests/phan/stubs/memcached.php' ],
+               [
+                       'maintenance/7zip.inc',
+                       'maintenance/backup.inc',
+                       'maintenance/backupPrefetch.inc',
+                       'maintenance/cleanupTable.inc',
+                       'maintenance/CodeCleanerGlobalsPass.inc',
+                       'maintenance/commandLine.inc',
+                       'maintenance/importImages.inc',
+                       'maintenance/sqlite.inc',
+                       'maintenance/userDupes.inc',
+                       'maintenance/userOptions.inc',
+                       'maintenance/language/checkLanguage.inc',
+                       'maintenance/language/languages.inc',
+               ]
+       ),
+
+       /**
+        * A list of directories that should be parsed for class and
+        * method information. After excluding the directories
+        * defined in exclude_analysis_directory_list, the remaining
+        * files will be statically analyzed for errors.
+        *
+        * Thus, both first-party and third-party code being used by
+        * your application should be included in this list.
+        */
+       'directory_list' => [
+               'includes/',
+               'languages/',
+               'maintenance/',
+               'mw-config/',
+               'resources/',
+               'skins/',
+               'vendor/',
+       ],
+
+       /**
+        * A file list that defines files that will be excluded
+        * from parsing and analysis and will not be read at all.
+        *
+        * This is useful for excluding hopelessly unanalyzable
+        * files that can't be removed for whatever reason.
+        */
+       'exclude_file_list' => [],
+
+       /**
+        * A list of directories holding code that we want
+        * to parse, but not analyze. Also works for individual
+        * files.
+        */
+       "exclude_analysis_directory_list" => [
+               'vendor/',
+               'tests/phan/stubs/',
+               // The referenced classes are not available in vendor, only when
+               // included from composer.
+               'includes/composer/',
+               // Directly references classes that only exist in Translate extension
+               'maintenance/language/',
+               // External class
+               'includes/libs/jsminplus.php',
+               // separate repositories
+               'skins/',
+       ],
+
+       /**
+        * Backwards Compatibility Checking. This is slow
+        * and expensive, but you should consider running
+        * it before upgrading your version of PHP to a
+        * new version that has backward compatibility
+        * breaks.
+        */
+       'backward_compatibility_checks' => false,
+
+       /**
+        * A set of fully qualified class-names for which
+        * a call to parent::__construct() is required
+        */
+       'parent_constructor_required' => [
+       ],
+
+       /**
+        * Run a quick version of checks that takes less
+        * time at the cost of not running as thorough
+        * an analysis. You should consider setting this
+        * to true only when you wish you had more issues
+        * to fix in your code base.
+        *
+        * In quick-mode the scanner doesn't rescan a function
+        * or a method's code block every time a call is seen.
+        * This means that the problem here won't be detected:
+        *
+        * ```php
+        * <?php
+        * function test($arg):int {
+        *    return $arg;
+        * }
+        * test("abc");
+        * ```
+        *
+        * This would normally generate:
+        *
+        * ```sh
+        * test.php:3 TypeError return string but `test()` is declared to return int
+        * ```
+        *
+        * The initial scan of the function's code block has no
+        * type information for `$arg`. It isn't until we see
+        * the call and rescan test()'s code block that we can
+        * detect that it is actually returning the passed in
+        * `string` instead of an `int` as declared.
+        */
+       'quick_mode' => false,
+
+       /**
+        * By default, Phan will not analyze all node types
+        * in order to save time. If this config is set to true,
+        * Phan will dig deeper into the AST tree and do an
+        * analysis on all nodes, possibly finding more issues.
+        *
+        * See \Phan\Analysis::shouldVisit for the set of skipped
+        * nodes.
+        */
+       'should_visit_all_nodes' => true,
+
+       /**
+        * If enabled, check all methods that override a
+        * parent method to make sure its signature is
+        * compatible with the parent's. This check
+        * can add quite a bit of time to the analysis.
+        */
+       'analyze_signature_compatibility' => true,
+
+       // Emit all issues. They are then suppressed via
+       // suppress_issue_types, rather than a minimum
+       // severity.
+       "minimum_severity" => 0,
+
+       /**
+        * If true, missing properties will be created when
+        * they are first seen. If false, we'll report an
+        * error message if there is an attempt to write
+        * to a class property that wasn't explicitly
+        * defined.
+        */
+       'allow_missing_properties' => false,
+
+       /**
+        * Allow null to be cast as any type and for any
+        * type to be cast to null. Setting this to false
+        * will cut down on false positives.
+        */
+       'null_casts_as_any_type' => true,
+
+       /**
+        * If enabled, scalars (int, float, bool, string, null)
+        * are treated as if they can cast to each other.
+        *
+        * MediaWiki is pretty lax and uses many scalar
+        * types interchangably.
+        */
+       'scalar_implicit_cast' => true,
+
+       /**
+        * If true, seemingly undeclared variables in the global
+        * scope will be ignored. This is useful for projects
+        * with complicated cross-file globals that you have no
+        * hope of fixing.
+        */
+       'ignore_undeclared_variables_in_global_scope' => true,
+
+       /**
+        * Set to true in order to attempt to detect dead
+        * (unreferenced) code. Keep in mind that the
+        * results will only be a guess given that classes,
+        * properties, constants and methods can be referenced
+        * as variables (like `$class->$property` or
+        * `$class->$method()`) in ways that we're unable
+        * to make sense of.
+        */
+       'dead_code_detection' => false,
+
+       /**
+        * If true, the dead code detection rig will
+        * prefer false negatives (not report dead code) to
+        * false positives (report dead code that is not
+        * actually dead) which is to say that the graph of
+        * references will create too many edges rather than
+        * too few edges when guesses have to be made about
+        * what references what.
+        */
+       'dead_code_detection_prefer_false_negative' => true,
+
+       /**
+        * If disabled, Phan will not read docblock type
+        * annotation comments (such as for @return, @param,
+        * @var, @suppress, @deprecated) and only rely on
+        * types expressed in code.
+        */
+       'read_type_annotations' => true,
+
+       /**
+        * If a file path is given, the code base will be
+        * read from and written to the given location in
+        * order to attempt to save some work from being
+        * done. Only changed files will get analyzed if
+        * the file is read
+        */
+       'stored_state_file_path' => null,
+
+       /**
+        * Set to true in order to ignore issue suppression.
+        * This is useful for testing the state of your code, but
+        * unlikely to be useful outside of that.
+        */
+       'disable_suppression' => false,
+
+       /**
+        * If set to true, we'll dump the AST instead of
+        * analyzing files
+        */
+       'dump_ast' => false,
+
+       /**
+        * If set to a string, we'll dump the fully qualified lowercase
+        * function and method signatures instead of analyzing files.
+        */
+       'dump_signatures_file' => null,
+
+       /**
+        * If true (and if stored_state_file_path is set) we'll
+        * look at the list of files passed in and expand the list
+        * to include files that depend on the given files
+        */
+       'expand_file_list' => false,
+
+       // Include a progress bar in the output
+       'progress_bar' => false,
+
+       /**
+        * The probability of actually emitting any progress
+        * bar update. Setting this to something very low
+        * is good for reducing network IO and filling up
+        * your terminal's buffer when running phan on a
+        * remote host.
+        */
+       'progress_bar_sample_rate' => 0.005,
+
+       /**
+        * The number of processes to fork off during the analysis
+        * phase.
+        */
+       'processes' => 1,
+
+       /**
+        * Add any issue types (such as 'PhanUndeclaredMethod')
+        * to this black-list to inhibit them from being reported.
+        */
+       'suppress_issue_types' => [
+               // approximate error count: 8
+               "PhanDeprecatedClass",
+               // approximate error count: 441
+               "PhanDeprecatedFunction",
+               // approximate error count: 24
+               "PhanDeprecatedProperty",
+               // approximate error count: 12
+               "PhanParamReqAfterOpt",
+               // approximate error count: 748
+               "PhanParamSignatureMismatch",
+               // approximate error count: 7
+               "PhanParamSignatureMismatchInternal",
+               // approximate error count: 308
+               "PhanParamTooMany",
+               // approximate error count: 3
+               "PhanParamTooManyInternal",
+               // approximate error count: 1
+               "PhanRedefineFunctionInternal",
+               // approximate error count: 2
+               "PhanTraitParentReference",
+               // approximate error count: 4
+               "PhanTypeComparisonFromArray",
+               // approximate error count: 3
+               "PhanTypeInvalidRightOperand",
+               // approximate error count: 563
+               "PhanTypeMismatchArgument",
+               // approximate error count: 39
+               "PhanTypeMismatchArgumentInternal",
+               // approximate error count: 16
+               "PhanTypeMismatchForeach",
+               // approximate error count: 63
+               "PhanTypeMismatchProperty",
+               // approximate error count: 95
+               "PhanTypeMismatchReturn",
+               // approximate error count: 11
+               "PhanTypeMissingReturn",
+               // approximate error count: 5
+               "PhanTypeNonVarPassByRef",
+               // approximate error count: 27
+               "PhanUndeclaredConstant",
+               // approximate error count: 185
+               "PhanUndeclaredMethod",
+               // approximate error count: 1342
+               "PhanUndeclaredProperty",
+               // approximate error count: 3
+               "PhanUndeclaredStaticMethod",
+       ],
+
+       /**
+        * If empty, no filter against issues types will be applied.
+        * If this white-list is non-empty, only issues within the list
+        * will be emitted by Phan.
+        */
+       'whitelist_issue_types' => [
+               // 'PhanAccessMethodPrivate',
+               // 'PhanAccessMethodProtected',
+               // 'PhanAccessNonStaticToStatic',
+               // 'PhanAccessPropertyPrivate',
+               // 'PhanAccessPropertyProtected',
+               // 'PhanAccessSignatureMismatch',
+               // 'PhanAccessSignatureMismatchInternal',
+               // 'PhanAccessStaticToNonStatic',
+               // 'PhanCompatibleExpressionPHP7',
+               // 'PhanCompatiblePHP7',
+               // 'PhanContextNotObject',
+               // 'PhanDeprecatedClass',
+               // 'PhanDeprecatedFunction',
+               // 'PhanDeprecatedProperty',
+               // 'PhanEmptyFile',
+               // 'PhanNonClassMethodCall',
+               // 'PhanNoopArray',
+               // 'PhanNoopClosure',
+               // 'PhanNoopConstant',
+               // 'PhanNoopProperty',
+               // 'PhanNoopVariable',
+               // 'PhanParamRedefined',
+               // 'PhanParamReqAfterOpt',
+               // 'PhanParamSignatureMismatch',
+               // 'PhanParamSignatureMismatchInternal',
+               // 'PhanParamSpecial1',
+               // 'PhanParamSpecial2',
+               // 'PhanParamSpecial3',
+               // 'PhanParamSpecial4',
+               // 'PhanParamTooFew',
+               // 'PhanParamTooFewInternal',
+               // 'PhanParamTooMany',
+               // 'PhanParamTooManyInternal',
+               // 'PhanParamTypeMismatch',
+               // 'PhanParentlessClass',
+               // 'PhanRedefineClass',
+               // 'PhanRedefineClassInternal',
+               // 'PhanRedefineFunction',
+               // 'PhanRedefineFunctionInternal',
+               // 'PhanStaticCallToNonStatic',
+               // 'PhanSyntaxError',
+               // 'PhanTraitParentReference',
+               // 'PhanTypeArrayOperator',
+               // 'PhanTypeArraySuspicious',
+               // 'PhanTypeComparisonFromArray',
+               // 'PhanTypeComparisonToArray',
+               // 'PhanTypeConversionFromArray',
+               // 'PhanTypeInstantiateAbstract',
+               // 'PhanTypeInstantiateInterface',
+               // 'PhanTypeInvalidLeftOperand',
+               // 'PhanTypeInvalidRightOperand',
+               // 'PhanTypeMismatchArgument',
+               // 'PhanTypeMismatchArgumentInternal',
+               // 'PhanTypeMismatchDefault',
+               // 'PhanTypeMismatchForeach',
+               // 'PhanTypeMismatchProperty',
+               // 'PhanTypeMismatchReturn',
+               // 'PhanTypeMissingReturn',
+               // 'PhanTypeNonVarPassByRef',
+               // 'PhanTypeParentConstructorCalled',
+               // 'PhanTypeVoidAssignment',
+               // 'PhanUnanalyzable',
+               // 'PhanUndeclaredClass',
+               // 'PhanUndeclaredClassCatch',
+               // 'PhanUndeclaredClassConstant',
+               // 'PhanUndeclaredClassInstanceof',
+               // 'PhanUndeclaredClassMethod',
+               // 'PhanUndeclaredClassReference',
+               // 'PhanUndeclaredConstant',
+               // 'PhanUndeclaredExtendedClass',
+               // 'PhanUndeclaredFunction',
+               // 'PhanUndeclaredInterface',
+               // 'PhanUndeclaredMethod',
+               // 'PhanUndeclaredProperty',
+               // 'PhanUndeclaredStaticMethod',
+               // 'PhanUndeclaredStaticProperty',
+               // 'PhanUndeclaredTrait',
+               // 'PhanUndeclaredTypeParameter',
+               // 'PhanUndeclaredTypeProperty',
+               // 'PhanUndeclaredVariable',
+               // 'PhanUnreferencedClass',
+               // 'PhanUnreferencedConstant',
+               // 'PhanUnreferencedMethod',
+               // 'PhanUnreferencedProperty',
+               // 'PhanVariableUseClause',
+       ],
+
+       /**
+        * Override to hardcode existence and types of (non-builtin) globals in the global scope.
+        * Class names must be prefixed with '\\'.
+        * (E.g. ['_FOO' => '\\FooClass', 'page' => '\\PageClass', 'userId' => 'int'])
+        */
+       'globals_type_map' => [
+               'IP' => 'string',
+       ],
+
+       // Emit issue messages with markdown formatting
+       'markdown_issue_messages' => false,
+
+       /**
+        * Enable or disable support for generic templated
+        * class types.
+        */
+       'generic_types_enabled' => true,
+
+       // A list of plugin files to execute
+       'plugins' => [
+       ],
+];
diff --git a/tests/phan/issues/.gitkeep b/tests/phan/issues/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/phan/stubs/README b/tests/phan/stubs/README
new file mode 100644 (file)
index 0000000..c458ab5
--- /dev/null
@@ -0,0 +1,3 @@
+These stubs describe how code that is not available at analysis time should be
+used. No implementations are necessary, just define the classes and their
+methods and use phpdoc to describe what arguments are allowed.
diff --git a/tests/phan/stubs/hhvm.php b/tests/phan/stubs/hhvm.php
new file mode 100644 (file)
index 0000000..79feaa0
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+// @codingStandardsIgnoreFile
+
+/**
+ * @param callable $callback
+ * @param mixed ...$parameters
+ */
+function register_postsend_function( $callback ) {
+}
diff --git a/tests/phan/stubs/mail.php b/tests/phan/stubs/mail.php
new file mode 100644 (file)
index 0000000..7cd9016
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * Minimal set of classes necessary for UserMailer to be happy. Types
+ * taken from documentation at pear.php.net.
+ * @codingStandardsIgnoreFile
+ */
+
+class PEAR {
+       /**
+        * @param mixed $data
+        * @return bool
+        */
+       public static function isError( $data ) {
+       }
+}
+
+class PEAR_Error {
+       /**
+        * @return string
+        */
+       public function getMessage() {
+       }
+}
+
+class Mail {
+       /**
+        * @param string $driver
+        * @param array $params
+        * @return self
+        */
+       static public function factory( $driver, array $params = [] ) {
+       }
+
+       /**
+        * @param mixed $recipients
+        * @param array $headers
+        * @param string $body
+        * @return bool|PEAR_Error
+        */
+       public function send( $recipients, array $headers, $body ) {
+       }
+}
+
+class Mail_smtp extends Mail {
+}
+
+class Mail_mime {
+       /**
+        * @param mixed $params
+        */
+       public function __construct( $params = [] ) {
+       }
+
+       /**
+        * @param string $data
+        * @param bool $isfile
+        * @param bool $append
+        * @return bool|PEAR_Error
+        */
+       public function setTXTBody( $data, $isfile = false, $append = false ) {
+       }
+
+       /**
+        * @param string $data
+        * @param bool $isfile
+        * @return bool|PEAR_Error
+        */
+       public function setHTMLBody( $data, $isfile = false ) {
+       }
+
+       /**
+        * @param array|null $parms
+        * @param mixed $filename
+        * @param bool $skip_head
+        * @return string|bool|PEAR_Error
+        */
+       public function get( $params = null, $filename = null, $skip_head = false ) {
+       }
+
+       /**
+        * @param array|null $xtra_headers
+        * @param bool $overwrite
+        * @param bool $skip_content
+        * @return array
+        */
+       public function headers( array $xtra_headers = null, $overwrite = false, $skip_content = false ) {
+       }
+}
diff --git a/tests/phan/stubs/memcached.php b/tests/phan/stubs/memcached.php
new file mode 100644 (file)
index 0000000..ee47937
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * The phpstorm stubs package includes the Memcached class with two parameters and docs saying
+ * that they are optional. Phan can not detect this and thus throws an error for a usage with
+ * no params. So we have this small stub just for the constructor to allow no params.
+ * @see https://secure.php.net/manual/en/memcached.construct.php
+ * @codingStandardsIgnoreFile
+ */
+
+class Memcached {
+
+       public function __construct() {
+       }
+
+}
diff --git a/tests/phan/stubs/tideways.php b/tests/phan/stubs/tideways.php
new file mode 100644 (file)
index 0000000..1372219
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * Minimal set of classes necessary for Xhprof using tideways
+ * @codingStandardsIgnoreFile
+ */
+
+function tideways_enable(){
+}
+
+function tideways_disable(){
+}
diff --git a/tests/phan/stubs/wikidiff.php b/tests/phan/stubs/wikidiff.php
new file mode 100644 (file)
index 0000000..9bd5d8d
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+// @codingStandardsIgnoreFile
+
+/**
+ * @param string $text1
+ * @param string $text2
+ * @param int $numContextLines
+ * @return string
+ */
+function wikidiff2_do_diff( $text1, $text2, $numContextLines ) {
+}
index db1df5c..37f76ff 100644 (file)
@@ -255,6 +255,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                CACHE_ACCEL => $hashCache,
                                CACHE_MEMCACHED => $hashCache,
                                'apc' => $hashCache,
+                               'apcu' => $hashCache,
                                'xcache' => $hashCache,
                                'wincache' => $hashCache,
                        ] + $baseConfig->get( 'ObjectCaches' );
@@ -582,6 +583,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        /**
         * Make sure MediaWikiTestCase extending classes have called their
         * parent setUp method
+        *
+        * With strict coverage activated in PHP_CodeCoverage, this test would be
+        * marked as risky without the following annotation (T152923).
+        * @coversNothing
         */
        final public function testMediaWikiTestCaseParentSetupCalled() {
                $this->assertArrayHasKey( 'setUp', $this->called,
@@ -1087,11 +1092,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * Clones all tables in the given database (whatever database that connection has
         * open), to versions with the test prefix.
         *
-        * @param Database $db Database to use
+        * @param IMaintainableDatabase $db Database to use
         * @param string $prefix Prefix to use for test tables
         * @return bool True if tables were cloned, false if only the prefix was changed
         */
-       protected static function setupDatabaseWithTestPrefix( Database $db, $prefix ) {
+       protected static function setupDatabaseWithTestPrefix( IMaintainableDatabase $db, $prefix ) {
                $tablesCloned = self::listTables( $db );
                $dbClone = new CloneDatabase( $db, $tablesCloned, $prefix );
                $dbClone->useTemporaryTables( self::$useTemporaryTables );
@@ -1210,9 +1215,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                list( $proto, $cluster ) = explode( '://', $url, 2 );
                                // Avoid getMaster() because setupDatabaseWithTestPrefix()
                                // requires Database instead of plain DBConnRef/IDatabase
-                               $lb = $externalStoreDB->getLoadBalancer( $cluster );
-                               $dbw = $lb->getConnection( DB_MASTER );
-                               $dbws[] = $dbw;
+                               $dbws[] = $externalStoreDB->getMaster( $cluster );
                        }
                }
 
@@ -1326,11 +1329,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        /**
         * @since 1.18
         *
-        * @param Database $db
+        * @param IMaintainableDatabase $db
         *
         * @return array
         */
-       public static function listTables( Database $db ) {
+       public static function listTables( IMaintainableDatabase $db ) {
                $prefix = $db->tablePrefix();
                $tables = $db->listTables( $prefix, __METHOD__ );
 
@@ -1378,6 +1381,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( isset( PHPUnitMaintClass::$additionalOptions[$offset] ) ) {
                        return PHPUnitMaintClass::$additionalOptions[$offset];
                }
+
+               return null;
        }
 
        /**
index 8eb1fd5..68b91bf 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 
@@ -10,16 +11,30 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
        const BLANK_VERSION = '09p30q0';
 
        /**
-        * @param string $lang
-        * @param string $dir
+        * @param array|string $options Language code or options array
+        * - string 'lang' Language code
+        * - string 'dir' Language direction (ltr or rtl)
+        * - string 'modules' Pipe-separated list of module names
+        * - string|null 'only' "scripts" (unwrapped script), "styles" (stylesheet), or null
+        *    (mw.loader.implement).
         * @return ResourceLoaderContext
         */
-       protected function getResourceLoaderContext( $lang = 'en', $dir = 'ltr' ) {
-               $resourceLoader = new ResourceLoader();
+       protected function getResourceLoaderContext( $options = [], ResourceLoader $rl = null ) {
+               if ( is_string( $options ) ) {
+                       // Back-compat for extension tests
+                       $options = [ 'lang' => $options ];
+               }
+               $options += [
+                       'lang' => 'en',
+                       'dir' => 'ltr',
+                       'modules' => 'startup',
+                       'only' => 'scripts',
+               ];
+               $resourceLoader = $rl ?: new ResourceLoader();
                $request = new FauxRequest( [
-                               'lang' => $lang,
-                               'modules' => 'startup',
-                               'only' => 'scripts',
+                               'lang' => $options['lang'],
+                               'modules' => $options['modules'],
+                               'only' => $options['only'],
                                'skin' => 'vector',
                                'target' => 'phpunit',
                ] );
@@ -27,7 +42,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                        ->setConstructorArgs( [ $resourceLoader, $request ] )
                        ->setMethods( [ 'getDirection' ] )
                        ->getMock();
-               $ctx->method( 'getDirection' )->willReturn( $dir );
+               $ctx->method( 'getDirection' )->willReturn( $options['dir'] );
                return $ctx;
        }
 
@@ -140,7 +155,13 @@ class EmptyResourceLoader extends ResourceLoader {
        // and default registrations are done from ServiceWiring instead.
        public function __construct( Config $config = null, LoggerInterface $logger = null ) {
                $this->setLogger( $logger ?: new NullLogger() );
-               $this->config = $config ?: ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $this->config = $config ?: MediaWikiServices::getInstance()->getMainConfig();
+               // Source "local" is required by StartupModule
+               $this->addSource( 'local', $this->config->get( 'LoadScript' ) );
                $this->setMessageBlobStore( new MessageBlobStore( $this, $this->getLogger() ) );
        }
+
+       public function getErrors() {
+               return $this->errors;
+       }
 }
diff --git a/tests/phpunit/autoload.ide.php b/tests/phpunit/autoload.ide.php
new file mode 100644 (file)
index 0000000..074fab0
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * This file is PHPUnit autoload file for PhpStorm IDE and other JetBrains IDEs.
+ *
+ * This file should be set in `Languages and frameworks > PHP > PhpUnit`
+ * select `Use Composer autoloader` and set `Path to script` to `<path to this file>`.
+ * After that, tests can be run in PhpStorm using Right-click > Run or `Ctrl + Shift + F10`.
+ * Also, tests can be run with debugger very easily.
+ *
+ * This file basically does almost the same thing as `tests/phpunit/phpunit.php`, except that all
+ * code is going to be executed inside some function, so some hacks needed to make old code to be
+ * executed as if it was executed on top of the execution stack.
+ *
+ * PS: Mostly it is copy-paste from `phpunit.php` and `doMaintenance.php`.
+ *
+ * @file
+ */
+
+// Set a flag which can be used to detect when other scripts have been entered
+// through this entry point or not.
+use MediaWiki\MediaWikiServices;
+
+global $argv;
+$argv[1] = '--wiki';
+$argv[2] = getenv( 'WIKI_NAME' ) ?: 'wiki';
+
+require_once __DIR__ . "/phpunit.php";
+
+// Get an object to start us off
+/** @var Maintenance $maintenance */
+$maintenance = new PHPUnitMaintClass();
+
+// Basic sanity checks and such
+$maintenance->setup();
+
+// We used to call this variable $self, but it was moved
+// to $maintenance->mSelf. Keep that here for b/c
+$self = $maintenance->getName();
+global $IP;
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
+# Grab profiling functions
+require_once "$IP/includes/profiler/ProfilerFunctions.php";
+
+# Start the profiler
+$wgProfiler = [];
+if ( file_exists( "$IP/StartProfiler.php" ) ) {
+       require "$IP/StartProfiler.php";
+}
+
+$requireOnceGlobalsScope = function ( $file ) use ( $self ) {
+       foreach ( array_keys( $GLOBALS ) as $varName ) {
+               eval( sprintf( 'global $%s;', $varName ) );
+       }
+
+       require_once $file;
+
+       unset( $file );
+       $definedVars = get_defined_vars();
+       foreach ( $definedVars as $varName => $value ) {
+               eval( sprintf( 'global $%s; $%s = $value;', $varName, $varName ) );
+       }
+};
+
+// Some other requires
+$requireOnceGlobalsScope( "$IP/includes/Defines.php" );
+$requireOnceGlobalsScope( "$IP/includes/DefaultSettings.php" );
+$requireOnceGlobalsScope( "$IP/includes/GlobalFunctions.php" );
+
+foreach ( array_keys( $GLOBALS ) as $varName ) {
+       eval( sprintf( 'global $%s;', $varName ) );
+}
+
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+       require_once "$IP/vendor/autoload.php";
+}
+
+if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
+       # Use a callback function to configure MediaWiki
+       call_user_func( MW_CONFIG_CALLBACK );
+} else {
+       // Require the configuration (probably LocalSettings.php)
+       require $maintenance->loadSettings();
+}
+
+if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
+       if ( $wgLocalisationCacheConf['storeClass'] === false
+                && ( $wgLocalisationCacheConf['store'] == 'db'
+                         || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
+       ) {
+               $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+       }
+}
+
+$maintenance->finalSetup();
+// Some last includes
+$requireOnceGlobalsScope( "$IP/includes/Setup.php" );
+
+// Initialize main config instance
+$maintenance->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
+
+// Sanity-check required extensions are installed
+$maintenance->checkRequiredExtensions();
+
+// A good time when no DBs have writes pending is around lag checks.
+// This avoids having long running scripts just OOM and lose all the updates.
+$maintenance->setAgentAndTriggers();
diff --git a/tests/phpunit/data/localisationcache/ba.json b/tests/phpunit/data/localisationcache/ba.json
new file mode 100644 (file)
index 0000000..59b8912
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "present-ba": "ba"
+}
index 27600cd..39cce86 100644 (file)
@@ -1,5 +1,5 @@
 {
-       "present-uk": "en",
+       "present-ba": "en",
        "present-ru": "en",
        "present-en": "en"
 }
index 79e1444..c9f89d3 100644 (file)
@@ -1,4 +1,4 @@
 {
-       "present-uk": "ru",
+       "present-ba": "ru",
        "present-ru": "ru"
 }
diff --git a/tests/phpunit/data/localisationcache/uk.json b/tests/phpunit/data/localisationcache/uk.json
deleted file mode 100644 (file)
index f63ce5d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-       "present-uk": "uk"
-}
diff --git a/tests/phpunit/data/media/say-test.opus b/tests/phpunit/data/media/say-test.opus
new file mode 100644 (file)
index 0000000..168d218
Binary files /dev/null and b/tests/phpunit/data/media/say-test.opus differ
index 9f38659..63d05a0 100644 (file)
@@ -84,7 +84,7 @@ class BlockTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * per bug 26425
+        * per T28425
         */
        public function testBug26425BlockTimestampDefaultsToTime() {
                // delta to stop one-off errors when things happen to go over a second mark.
@@ -99,7 +99,7 @@ class BlockTest extends MediaWikiLangTestCase {
        /**
         * CheckUser since being changed to use Block::newFromTarget started failing
         * because the new function didn't accept empty strings like Block::load()
-        * had. Regression bug 29116.
+        * had. Regression T31116.
         *
         * @dataProvider provideBug29116Data
         * @covers Block::newFromTarget
@@ -409,4 +409,33 @@ class BlockTest extends MediaWikiLangTestCase {
                        "Account creation should not be blocked by default"
                );
        }
+
+       public function testSystemBlocks() {
+               $blockOptions = [
+                       'address' => 'UTBlockee',
+                       'reason' => 'test system block',
+                       'timestamp' => wfTimestampNow(),
+                       'expiry' => $this->db->getInfinity(),
+                       'byText' => 'MetaWikiUser',
+                       'systemBlock' => 'test',
+                       'enableAutoblock' => true,
+               ];
+               $block = new Block( $blockOptions );
+
+               $this->assertSame( 'test', $block->getSystemBlockType() );
+
+               try {
+                       $block->insert();
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( MWException $ex ) {
+                       $this->assertSame( 'Cannot insert a system block into the database', $ex->getMessage() );
+               }
+
+               try {
+                       $block->doAutoblock( '192.0.2.2' );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( MWException $ex ) {
+                       $this->assertSame( 'Cannot autoblock from a system block', $ex->getMessage() );
+               }
+       }
 }
index 5a01dc0..9507811 100644 (file)
@@ -53,7 +53,7 @@ class EditPageTest extends MediaWikiLangTestCase {
                                false
                        ],
                        [
-                               "An initial section with a fake heder (bug 32617)\n\n== Test == ??\nwtf",
+                               "An initial section with a fake heder (T34617)\n\n== Test == ??\nwtf",
                                false
                        ],
                        [
@@ -61,7 +61,7 @@ class EditPageTest extends MediaWikiLangTestCase {
                                "Section"
                        ],
                        [
-                               "== Section== \t\r\n followed by whitespace (bug 35051)",
+                               "== Section== \t\r\n followed by whitespace (T37051)",
                                'Section',
                        ],
                ];
index 5dd4f7a..4e95a30 100644 (file)
@@ -32,7 +32,7 @@ class ExtraParserTest extends MediaWikiTestCase {
        }
 
        /**
-        * @see Bug 8689
+        * @see T10689
         * @covers Parser::parse
         */
        public function testLongNumericLinesDontKillTheParser() {
index dcaf1f7..0c853e0 100644 (file)
@@ -23,8 +23,6 @@ class FormOptionsExposed extends FormOptions {
  * Test class for FormOptions initialization
  * Ensure the FormOptions::add() does what we want it to do.
  *
- * Generated by PHPUnit on 2011-02-28 at 20:46:27.
- *
  * Copyright © 2011, Antoine Musso
  *
  * @author Antoine Musso
index e491d61..2ee8b98 100644 (file)
@@ -10,7 +10,6 @@
 
 /**
  * Test class for FormOptions methods.
- * Generated by PHPUnit on 2011-02-28 at 20:46:27.
  *
  * Copyright © 2011, Antoine Musso
  *
index 5ca373d..b6682f7 100644 (file)
@@ -87,13 +87,13 @@ class WfTimestampTest extends MediaWikiTestCase {
        /**
         * This test checks wfTimestamp() with values outside.
         * It needs PHP 64 bits or PHP > 5.1.
-        * See r74778 and bug 25451
+        * See r74778 and T27451
         * @dataProvider provideOldTimestamps
         */
        public function testOldTimestamps( $input, $outputType, $output, $message ) {
                $timestamp = wfTimestamp( $outputType, $input );
                if ( substr( $output, 0, 1 ) === '/' ) {
-                       // Bug 64946: Day of the week calculations for very old
+                       // T66946: Day of the week calculations for very old
                        // timestamps varies from system to system.
                        $this->assertRegExp( $output, $timestamp, $message );
                } else {
index cbe2e2f..09c1040 100644 (file)
@@ -28,7 +28,6 @@ class WfUrlencodeTest extends MediaWikiTestCase {
        /**
         * Internal helper that actually run the test.
         * Called by the public methods testEncodingUrlWith...()
-        *
         */
        private function verifyEncodingFor( $server, $input, $expectations ) {
                $expected = $this->extractExpect( $server, $expectations );
index e2ee193..b7249e5 100644 (file)
@@ -633,35 +633,6 @@ class HtmlTest extends MediaWikiTestCase {
                return $ret;
        }
 
-       /**
-        * @covers Html::expandAttributes
-        */
-       public function testFormValidationBlacklist() {
-               $this->assertEmpty(
-                       Html::expandAttributes( [
-                               'min' => 1,
-                               'max' => 100,
-                               'pattern' => 'abc',
-                               'required' => true,
-                               'step' => 2
-                       ] ),
-                       'Blacklist form validation attributes.'
-               );
-               $this->assertEquals(
-                       ' step="any"',
-                       Html::expandAttributes(
-                               [
-                                       'min' => 1,
-                                       'max' => 100,
-                                       'pattern' => 'abc',
-                                       'required' => true,
-                                       'step' => 'any'
-                               ],
-                               'Allow special case "step=any".'
-                       )
-               );
-       }
-
        public function testWrapperInput() {
                $this->assertEquals(
                        '<input type="radio" value="testval" name="testname"/>',
diff --git a/tests/phpunit/includes/HttpTest.php b/tests/phpunit/includes/HttpTest.php
deleted file mode 100644 (file)
index c3804c6..0000000
+++ /dev/null
@@ -1,534 +0,0 @@
-<?php
-
-/**
- * @group Http
- */
-class HttpTest extends MediaWikiTestCase {
-       /**
-        * @dataProvider cookieDomains
-        * @covers Cookie::validateCookieDomain
-        */
-       public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
-               if ( $origin ) {
-                       $ok = Cookie::validateCookieDomain( $domain, $origin );
-                       $msg = "$domain against origin $origin";
-               } else {
-                       $ok = Cookie::validateCookieDomain( $domain );
-                       $msg = "$domain";
-               }
-               $this->assertEquals( $expected, $ok, $msg );
-       }
-
-       public static function cookieDomains() {
-               return [
-                       [ false, "org" ],
-                       [ false, ".org" ],
-                       [ true, "wikipedia.org" ],
-                       [ true, ".wikipedia.org" ],
-                       [ false, "co.uk" ],
-                       [ false, ".co.uk" ],
-                       [ false, "gov.uk" ],
-                       [ false, ".gov.uk" ],
-                       [ true, "supermarket.uk" ],
-                       [ false, "uk" ],
-                       [ false, ".uk" ],
-                       [ false, "127.0.0." ],
-                       [ false, "127." ],
-                       [ false, "127.0.0.1." ],
-                       [ true, "127.0.0.1" ],
-                       [ false, "333.0.0.1" ],
-                       [ true, "example.com" ],
-                       [ false, "example.com." ],
-                       [ true, ".example.com" ],
-
-                       [ true, ".example.com", "www.example.com" ],
-                       [ false, "example.com", "www.example.com" ],
-                       [ true, "127.0.0.1", "127.0.0.1" ],
-                       [ false, "127.0.0.1", "localhost" ],
-               ];
-       }
-
-       /**
-        * Test Http::isValidURI()
-        * @bug 27854 : Http::isValidURI is too lax
-        * @dataProvider provideURI
-        * @covers Http::isValidURI
-        */
-       public function testIsValidUri( $expect, $URI, $message = '' ) {
-               $this->assertEquals(
-                       $expect,
-                       (bool)Http::isValidURI( $URI ),
-                       $message
-               );
-       }
-
-       /**
-        * @covers Http::getProxy
-        */
-       public function testGetProxy() {
-               $this->setMwGlobals( 'wgHTTPProxy', 'proxy.domain.tld' );
-               $this->assertEquals(
-                       'proxy.domain.tld',
-                       Http::getProxy()
-               );
-       }
-
-       /**
-        * Feeds URI to test a long regular expression in Http::isValidURI
-        */
-       public static function provideURI() {
-               /** Format: 'boolean expectation', 'URI to test', 'Optional message' */
-               return [
-                       [ false, '¿non sens before!! http://a', 'Allow anything before URI' ],
-
-                       # (http|https) - only two schemes allowed
-                       [ true, 'http://www.example.org/' ],
-                       [ true, 'https://www.example.org/' ],
-                       [ true, 'http://www.example.org', 'URI without directory' ],
-                       [ true, 'http://a', 'Short name' ],
-                       [ true, 'http://étoile', 'Allow UTF-8 in hostname' ], # 'étoile' is french for 'star'
-                       [ false, '\\host\directory', 'CIFS share' ],
-                       [ false, 'gopher://host/dir', 'Reject gopher scheme' ],
-                       [ false, 'telnet://host', 'Reject telnet scheme' ],
-
-                       # :\/\/ - double slashes
-                       [ false, 'http//example.org', 'Reject missing colon in protocol' ],
-                       [ false, 'http:/example.org', 'Reject missing slash in protocol' ],
-                       [ false, 'http:example.org', 'Must have two slashes' ],
-                       # Following fail since hostname can be made of anything
-                       [ false, 'http:///example.org', 'Must have exactly two slashes, not three' ],
-
-                       # (\w+:{0,1}\w*@)? - optional user:pass
-                       [ true, 'http://user@host', 'Username provided' ],
-                       [ true, 'http://user:@host', 'Username provided, no password' ],
-                       [ true, 'http://user:pass@host', 'Username and password provided' ],
-
-                       # (\S+) - host part is made of anything not whitespaces
-                       // commented these out in order to remove @group Broken
-                       // @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
-                       // [ false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ],
-                       // [ false, 'http://exam:ple.org/', 'hostname can not use colons!' ],
-
-                       # (:[0-9]+)? - port number
-                       [ true, 'http://example.org:80/' ],
-                       [ true, 'https://example.org:80/' ],
-                       [ true, 'http://example.org:443/' ],
-                       [ true, 'https://example.org:443/' ],
-
-                       # Part after the hostname is / or / with something else
-                       [ true, 'http://example/#' ],
-                       [ true, 'http://example/!' ],
-                       [ true, 'http://example/:' ],
-                       [ true, 'http://example/.' ],
-                       [ true, 'http://example/?' ],
-                       [ true, 'http://example/+' ],
-                       [ true, 'http://example/=' ],
-                       [ true, 'http://example/&' ],
-                       [ true, 'http://example/%' ],
-                       [ true, 'http://example/@' ],
-                       [ true, 'http://example/-' ],
-                       [ true, 'http://example//' ],
-                       [ true, 'http://example/&' ],
-
-                       # Fragment
-                       [ true, 'http://exam#ple.org', ], # This one is valid, really!
-                       [ true, 'http://example.org:80#anchor' ],
-                       [ true, 'http://example.org/?id#anchor' ],
-                       [ true, 'http://example.org/?#anchor' ],
-
-                       [ false, 'http://a ¿non !!sens after', 'Allow anything after URI' ],
-               ];
-       }
-
-       /**
-        * 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 bug 29232 is taken care of (high-level handling of
-        * HTTP redirects).
-        */
-       public function testRelativeRedirections() {
-               $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!" )
-               );
-       }
-
-       /**
-        * Constant values are from PHP 5.3.28 using cURL 7.24.0
-        * @see https://secure.php.net/manual/en/curl.constants.php
-        *
-        * All constant values are present so that developers don’t need to remember
-        * to add them if added at a later date. The commented out constants were
-        * not found anywhere in the MediaWiki core code.
-        *
-        * Commented out constants that were not available in:
-        * HipHop VM 3.3.0 (rel)
-        * Compiler: heads/master-0-g08810d920dfff59e0774cf2d651f92f13a637175
-        * Repo schema: 3214fc2c684a4520485f715ee45f33f2182324b1
-        * Extension API: 20140829
-        *
-        * Commented out constants that were removed in PHP 5.6.0
-        *
-        * @covers CurlHttpRequest::execute
-        */
-       public function provideCurlConstants() {
-               return [
-                       [ 'CURLAUTH_ANY' ],
-                       [ 'CURLAUTH_ANYSAFE' ],
-                       [ 'CURLAUTH_BASIC' ],
-                       [ 'CURLAUTH_DIGEST' ],
-                       [ 'CURLAUTH_GSSNEGOTIATE' ],
-                       [ 'CURLAUTH_NTLM' ],
-                       // [ 'CURLCLOSEPOLICY_CALLBACK' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_OLDEST' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_SLOWEST' ], // removed in PHP 5.6.0
-                       [ 'CURLE_ABORTED_BY_CALLBACK' ],
-                       [ 'CURLE_BAD_CALLING_ORDER' ],
-                       [ 'CURLE_BAD_CONTENT_ENCODING' ],
-                       [ 'CURLE_BAD_FUNCTION_ARGUMENT' ],
-                       [ 'CURLE_BAD_PASSWORD_ENTERED' ],
-                       [ 'CURLE_COULDNT_CONNECT' ],
-                       [ 'CURLE_COULDNT_RESOLVE_HOST' ],
-                       [ 'CURLE_COULDNT_RESOLVE_PROXY' ],
-                       [ 'CURLE_FAILED_INIT' ],
-                       [ 'CURLE_FILESIZE_EXCEEDED' ],
-                       [ 'CURLE_FILE_COULDNT_READ_FILE' ],
-                       [ 'CURLE_FTP_ACCESS_DENIED' ],
-                       [ 'CURLE_FTP_BAD_DOWNLOAD_RESUME' ],
-                       [ 'CURLE_FTP_CANT_GET_HOST' ],
-                       [ 'CURLE_FTP_CANT_RECONNECT' ],
-                       [ 'CURLE_FTP_COULDNT_GET_SIZE' ],
-                       [ 'CURLE_FTP_COULDNT_RETR_FILE' ],
-                       [ 'CURLE_FTP_COULDNT_SET_ASCII' ],
-                       [ 'CURLE_FTP_COULDNT_SET_BINARY' ],
-                       [ 'CURLE_FTP_COULDNT_STOR_FILE' ],
-                       [ 'CURLE_FTP_COULDNT_USE_REST' ],
-                       [ 'CURLE_FTP_PORT_FAILED' ],
-                       [ 'CURLE_FTP_QUOTE_ERROR' ],
-                       [ 'CURLE_FTP_SSL_FAILED' ],
-                       [ 'CURLE_FTP_USER_PASSWORD_INCORRECT' ],
-                       [ 'CURLE_FTP_WEIRD_227_FORMAT' ],
-                       [ 'CURLE_FTP_WEIRD_PASS_REPLY' ],
-                       [ 'CURLE_FTP_WEIRD_PASV_REPLY' ],
-                       [ 'CURLE_FTP_WEIRD_SERVER_REPLY' ],
-                       [ 'CURLE_FTP_WEIRD_USER_REPLY' ],
-                       [ 'CURLE_FTP_WRITE_ERROR' ],
-                       [ 'CURLE_FUNCTION_NOT_FOUND' ],
-                       [ 'CURLE_GOT_NOTHING' ],
-                       [ 'CURLE_HTTP_NOT_FOUND' ],
-                       [ 'CURLE_HTTP_PORT_FAILED' ],
-                       [ 'CURLE_HTTP_POST_ERROR' ],
-                       [ 'CURLE_HTTP_RANGE_ERROR' ],
-                       [ 'CURLE_LDAP_CANNOT_BIND' ],
-                       [ 'CURLE_LDAP_INVALID_URL' ],
-                       [ 'CURLE_LDAP_SEARCH_FAILED' ],
-                       [ 'CURLE_LIBRARY_NOT_FOUND' ],
-                       [ 'CURLE_MALFORMAT_USER' ],
-                       [ 'CURLE_OBSOLETE' ],
-                       [ 'CURLE_OK' ],
-                       [ 'CURLE_OPERATION_TIMEOUTED' ],
-                       [ 'CURLE_OUT_OF_MEMORY' ],
-                       [ 'CURLE_PARTIAL_FILE' ],
-                       [ 'CURLE_READ_ERROR' ],
-                       [ 'CURLE_RECV_ERROR' ],
-                       [ 'CURLE_SEND_ERROR' ],
-                       [ 'CURLE_SHARE_IN_USE' ],
-                       // [ 'CURLE_SSH' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLE_SSL_CACERT' ],
-                       [ 'CURLE_SSL_CERTPROBLEM' ],
-                       [ 'CURLE_SSL_CIPHER' ],
-                       [ 'CURLE_SSL_CONNECT_ERROR' ],
-                       [ 'CURLE_SSL_ENGINE_NOTFOUND' ],
-                       [ 'CURLE_SSL_ENGINE_SETFAILED' ],
-                       [ 'CURLE_SSL_PEER_CERTIFICATE' ],
-                       [ 'CURLE_TELNET_OPTION_SYNTAX' ],
-                       [ 'CURLE_TOO_MANY_REDIRECTS' ],
-                       [ 'CURLE_UNKNOWN_TELNET_OPTION' ],
-                       [ 'CURLE_UNSUPPORTED_PROTOCOL' ],
-                       [ 'CURLE_URL_MALFORMAT' ],
-                       [ 'CURLE_URL_MALFORMAT_USER' ],
-                       [ 'CURLE_WRITE_ERROR' ],
-                       [ 'CURLFTPAUTH_DEFAULT' ],
-                       [ 'CURLFTPAUTH_SSL' ],
-                       [ 'CURLFTPAUTH_TLS' ],
-                       // [ 'CURLFTPMETHOD_MULTICWD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLFTPMETHOD_NOCWD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLFTPMETHOD_SINGLECWD' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLFTPSSL_ALL' ],
-                       [ 'CURLFTPSSL_CONTROL' ],
-                       [ 'CURLFTPSSL_NONE' ],
-                       [ 'CURLFTPSSL_TRY' ],
-                       // [ 'CURLINFO_CERTINFO' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLINFO_CONNECT_TIME' ],
-                       [ 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ],
-                       [ 'CURLINFO_CONTENT_LENGTH_UPLOAD' ],
-                       [ 'CURLINFO_CONTENT_TYPE' ],
-                       [ 'CURLINFO_EFFECTIVE_URL' ],
-                       [ 'CURLINFO_FILETIME' ],
-                       [ 'CURLINFO_HEADER_OUT' ],
-                       [ 'CURLINFO_HEADER_SIZE' ],
-                       [ 'CURLINFO_HTTP_CODE' ],
-                       [ 'CURLINFO_NAMELOOKUP_TIME' ],
-                       [ 'CURLINFO_PRETRANSFER_TIME' ],
-                       [ 'CURLINFO_PRIVATE' ],
-                       [ 'CURLINFO_REDIRECT_COUNT' ],
-                       [ 'CURLINFO_REDIRECT_TIME' ],
-                       // [ 'CURLINFO_REDIRECT_URL' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLINFO_REQUEST_SIZE' ],
-                       [ 'CURLINFO_SIZE_DOWNLOAD' ],
-                       [ 'CURLINFO_SIZE_UPLOAD' ],
-                       [ 'CURLINFO_SPEED_DOWNLOAD' ],
-                       [ 'CURLINFO_SPEED_UPLOAD' ],
-                       [ 'CURLINFO_SSL_VERIFYRESULT' ],
-                       [ 'CURLINFO_STARTTRANSFER_TIME' ],
-                       [ 'CURLINFO_TOTAL_TIME' ],
-                       [ 'CURLMSG_DONE' ],
-                       [ 'CURLM_BAD_EASY_HANDLE' ],
-                       [ 'CURLM_BAD_HANDLE' ],
-                       [ 'CURLM_CALL_MULTI_PERFORM' ],
-                       [ 'CURLM_INTERNAL_ERROR' ],
-                       [ 'CURLM_OK' ],
-                       [ 'CURLM_OUT_OF_MEMORY' ],
-                       [ 'CURLOPT_AUTOREFERER' ],
-                       [ 'CURLOPT_BINARYTRANSFER' ],
-                       [ 'CURLOPT_BUFFERSIZE' ],
-                       [ 'CURLOPT_CAINFO' ],
-                       [ 'CURLOPT_CAPATH' ],
-                       // [ 'CURLOPT_CERTINFO' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_CLOSEPOLICY' ], // removed in PHP 5.6.0
-                       [ 'CURLOPT_CONNECTTIMEOUT' ],
-                       [ 'CURLOPT_CONNECTTIMEOUT_MS' ],
-                       [ 'CURLOPT_COOKIE' ],
-                       [ 'CURLOPT_COOKIEFILE' ],
-                       [ 'CURLOPT_COOKIEJAR' ],
-                       [ 'CURLOPT_COOKIESESSION' ],
-                       [ 'CURLOPT_CRLF' ],
-                       [ 'CURLOPT_CUSTOMREQUEST' ],
-                       [ 'CURLOPT_DNS_CACHE_TIMEOUT' ],
-                       [ 'CURLOPT_DNS_USE_GLOBAL_CACHE' ],
-                       [ 'CURLOPT_EGDSOCKET' ],
-                       [ 'CURLOPT_ENCODING' ],
-                       [ 'CURLOPT_FAILONERROR' ],
-                       [ 'CURLOPT_FILE' ],
-                       [ 'CURLOPT_FILETIME' ],
-                       [ 'CURLOPT_FOLLOWLOCATION' ],
-                       [ 'CURLOPT_FORBID_REUSE' ],
-                       [ 'CURLOPT_FRESH_CONNECT' ],
-                       [ 'CURLOPT_FTPAPPEND' ],
-                       [ 'CURLOPT_FTPLISTONLY' ],
-                       [ 'CURLOPT_FTPPORT' ],
-                       [ 'CURLOPT_FTPSSLAUTH' ],
-                       [ 'CURLOPT_FTP_CREATE_MISSING_DIRS' ],
-                       // [ 'CURLOPT_FTP_FILEMETHOD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_FTP_SKIP_PASV_IP' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_FTP_SSL' ],
-                       [ 'CURLOPT_FTP_USE_EPRT' ],
-                       [ 'CURLOPT_FTP_USE_EPSV' ],
-                       [ 'CURLOPT_HEADER' ],
-                       [ 'CURLOPT_HEADERFUNCTION' ],
-                       [ 'CURLOPT_HTTP200ALIASES' ],
-                       [ 'CURLOPT_HTTPAUTH' ],
-                       [ 'CURLOPT_HTTPGET' ],
-                       [ 'CURLOPT_HTTPHEADER' ],
-                       [ 'CURLOPT_HTTPPROXYTUNNEL' ],
-                       [ 'CURLOPT_HTTP_VERSION' ],
-                       [ 'CURLOPT_INFILE' ],
-                       [ 'CURLOPT_INFILESIZE' ],
-                       [ 'CURLOPT_INTERFACE' ],
-                       [ 'CURLOPT_IPRESOLVE' ],
-                       // [ 'CURLOPT_KEYPASSWD' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_KRB4LEVEL' ],
-                       [ 'CURLOPT_LOW_SPEED_LIMIT' ],
-                       [ 'CURLOPT_LOW_SPEED_TIME' ],
-                       [ 'CURLOPT_MAXCONNECTS' ],
-                       [ 'CURLOPT_MAXREDIRS' ],
-                       // [ 'CURLOPT_MAX_RECV_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_MAX_SEND_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_NETRC' ],
-                       [ 'CURLOPT_NOBODY' ],
-                       [ 'CURLOPT_NOPROGRESS' ],
-                       [ 'CURLOPT_NOSIGNAL' ],
-                       [ 'CURLOPT_PORT' ],
-                       [ 'CURLOPT_POST' ],
-                       [ 'CURLOPT_POSTFIELDS' ],
-                       [ 'CURLOPT_POSTQUOTE' ],
-                       [ 'CURLOPT_POSTREDIR' ],
-                       [ 'CURLOPT_PRIVATE' ],
-                       [ 'CURLOPT_PROGRESSFUNCTION' ],
-                       // [ 'CURLOPT_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_PROXY' ],
-                       [ 'CURLOPT_PROXYAUTH' ],
-                       [ 'CURLOPT_PROXYPORT' ],
-                       [ 'CURLOPT_PROXYTYPE' ],
-                       [ 'CURLOPT_PROXYUSERPWD' ],
-                       [ 'CURLOPT_PUT' ],
-                       [ 'CURLOPT_QUOTE' ],
-                       [ 'CURLOPT_RANDOM_FILE' ],
-                       [ 'CURLOPT_RANGE' ],
-                       [ 'CURLOPT_READDATA' ],
-                       [ 'CURLOPT_READFUNCTION' ],
-                       // [ 'CURLOPT_REDIR_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_REFERER' ],
-                       [ 'CURLOPT_RESUME_FROM' ],
-                       [ 'CURLOPT_RETURNTRANSFER' ],
-                       // [ 'CURLOPT_SSH_AUTH_TYPES' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_SSH_PRIVATE_KEYFILE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_SSH_PUBLIC_KEYFILE' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_SSLCERT' ],
-                       [ 'CURLOPT_SSLCERTPASSWD' ],
-                       [ 'CURLOPT_SSLCERTTYPE' ],
-                       [ 'CURLOPT_SSLENGINE' ],
-                       [ 'CURLOPT_SSLENGINE_DEFAULT' ],
-                       [ 'CURLOPT_SSLKEY' ],
-                       [ 'CURLOPT_SSLKEYPASSWD' ],
-                       [ 'CURLOPT_SSLKEYTYPE' ],
-                       [ 'CURLOPT_SSLVERSION' ],
-                       [ 'CURLOPT_SSL_CIPHER_LIST' ],
-                       [ 'CURLOPT_SSL_VERIFYHOST' ],
-                       [ 'CURLOPT_SSL_VERIFYPEER' ],
-                       [ 'CURLOPT_STDERR' ],
-                       [ 'CURLOPT_TCP_NODELAY' ],
-                       [ 'CURLOPT_TIMECONDITION' ],
-                       [ 'CURLOPT_TIMEOUT' ],
-                       [ 'CURLOPT_TIMEOUT_MS' ],
-                       [ 'CURLOPT_TIMEVALUE' ],
-                       [ 'CURLOPT_TRANSFERTEXT' ],
-                       [ 'CURLOPT_UNRESTRICTED_AUTH' ],
-                       [ 'CURLOPT_UPLOAD' ],
-                       [ 'CURLOPT_URL' ],
-                       [ 'CURLOPT_USERAGENT' ],
-                       [ 'CURLOPT_USERPWD' ],
-                       [ 'CURLOPT_VERBOSE' ],
-                       [ 'CURLOPT_WRITEFUNCTION' ],
-                       [ 'CURLOPT_WRITEHEADER' ],
-                       // [ 'CURLPROTO_ALL' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_DICT' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_FILE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_FTP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_FTPS' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_HTTP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_HTTPS' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_LDAP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_LDAPS' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_SCP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_SFTP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_TELNET' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_TFTP' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLPROXY_HTTP' ],
-                       // [ 'CURLPROXY_SOCKS4' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLPROXY_SOCKS5' ],
-                       // [ 'CURLSSH_AUTH_DEFAULT' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_HOST' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_KEYBOARD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_NONE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_PASSWORD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_PUBLICKEY' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLVERSION_NOW' ],
-                       [ 'CURL_HTTP_VERSION_1_0' ],
-                       [ 'CURL_HTTP_VERSION_1_1' ],
-                       [ 'CURL_HTTP_VERSION_NONE' ],
-                       [ 'CURL_IPRESOLVE_V4' ],
-                       [ 'CURL_IPRESOLVE_V6' ],
-                       [ 'CURL_IPRESOLVE_WHATEVER' ],
-                       [ 'CURL_NETRC_IGNORED' ],
-                       [ 'CURL_NETRC_OPTIONAL' ],
-                       [ 'CURL_NETRC_REQUIRED' ],
-                       [ 'CURL_TIMECOND_IFMODSINCE' ],
-                       [ 'CURL_TIMECOND_IFUNMODSINCE' ],
-                       [ 'CURL_TIMECOND_LASTMOD' ],
-                       [ 'CURL_VERSION_IPV6' ],
-                       [ 'CURL_VERSION_KERBEROS4' ],
-                       [ 'CURL_VERSION_LIBZ' ],
-                       [ 'CURL_VERSION_SSL' ],
-               ];
-       }
-
-       /**
-        * Added this test based on an issue experienced with HHVM 3.3.0-dev
-        * where it did not define a cURL constant.
-        *
-        * @bug 70570
-        * @dataProvider provideCurlConstants
-        */
-       public function testCurlConstants( $value ) {
-               $this->assertTrue( defined( $value ), $value . ' not defined' );
-       }
-}
-
-/**
- * Class to let us overwrite MWHttpRequest respHeaders variable
- */
-class MWHttpRequestTester extends MWHttpRequest {
-       // function derived from the MWHttpRequest factory function but
-       // returns appropriate tester class here
-       public static function factory( $url, $options = null, $caller = __METHOD__ ) {
-               if ( !Http::$httpEngine ) {
-                       Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
-               } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
-                       throw new MWException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
-                               'Http::$httpEngine is set to "curl"' );
-               }
-
-               switch ( Http::$httpEngine ) {
-                       case 'curl':
-                               return new CurlHttpRequestTester( $url, $options, $caller );
-                       case 'php':
-                               if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
-                                       throw new MWException( __METHOD__ .
-                                               ': allow_url_fopen needs to be enabled for pure PHP HTTP requests to work. '
-                                                       . 'If possible, curl should be used instead. See http://php.net/curl.' );
-                               }
-
-                               return new PhpHttpRequestTester( $url, $options, $caller );
-                       default:
-               }
-       }
-}
-
-class CurlHttpRequestTester extends CurlHttpRequest {
-       function setRespHeaders( $name, $value ) {
-               $this->respHeaders[$name] = $value;
-       }
-}
-
-class PhpHttpRequestTester extends PhpHttpRequest {
-       function setRespHeaders( $name, $value ) {
-               $this->respHeaders[$name] = $value;
-       }
-}
index 428b012..ed4958f 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LikeMatch;
+
 /**
  * @group Database
  */
index 24db445..092d57b 100644 (file)
@@ -7,10 +7,8 @@
 
 /**
  * Test class for MWNamespace.
- * Generated by PHPUnit on 2011-02-20 at 21:01:55.
  * @todo covers tags
  * @todo FIXME: this test file is a mess
- *
  */
 class MWNamespaceTest extends MediaWikiTestCase {
        protected function setUp() {
index dc0c64c..cc95e38 100644 (file)
@@ -7,6 +7,7 @@ use MediaWiki\MediaWikiServices;
 use MediaWiki\Services\DestructibleService;
 use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceDisabledException;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * @covers MediaWiki\MediaWikiServices
@@ -308,7 +309,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'SearchEngineFactory' => [ 'SearchEngineFactory', SearchEngineFactory::class ],
                        'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
                        'SkinFactory' => [ 'SkinFactory', SkinFactory::class ],
-                       'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', 'LBFactory' ],
+                       'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', Wikimedia\Rdbms\LBFactory::class ],
                        'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
                        'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
                        'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
index 8390e1f..2694b85 100644 (file)
@@ -51,6 +51,10 @@ class MessageTest extends MediaWikiLangTestCase {
                                [],
                                [],
                        ],
+                       [
+                               [],
+                               [ [] ],
+                       ],
                        [
                                [ 'foo' ],
                                [ 'foo' ],
@@ -68,19 +72,37 @@ class MessageTest extends MediaWikiLangTestCase {
                                [ [ 'baz', 'foo' ] ],
                        ],
                        [
-                               [ 'baz', 'foo' ],
+                               [ Message::rawParam( 'baz' ) ],
+                               [ Message::rawParam( 'baz' ) ],
+                       ],
+                       [
+                               [ Message::rawParam( 'baz' ), 'foo' ],
+                               [ Message::rawParam( 'baz' ), 'foo' ],
+                       ],
+                       [
+                               [ Message::rawParam( 'baz' ) ],
+                               [ [ Message::rawParam( 'baz' ) ] ],
+                       ],
+                       [
+                               [ Message::rawParam( 'baz' ), 'foo' ],
+                               [ [ Message::rawParam( 'baz' ), 'foo' ] ],
+                       ],
+
+                       // Test handling of erroneous input, to detect if it changes
+                       [
+                               [ [ 'baz', 'foo' ], 'hhh' ],
                                [ [ 'baz', 'foo' ], 'hhh' ],
                        ],
                        [
-                               [ 'baz', 'foo' ],
+                               [ [ 'baz', 'foo' ], 'hhh', [ 'ahahahahha' ] ],
                                [ [ 'baz', 'foo' ], 'hhh', [ 'ahahahahha' ] ],
                        ],
                        [
-                               [ 'baz', 'foo' ],
+                               [ [ 'baz', 'foo' ], [ 'ahahahahha' ] ],
                                [ [ 'baz', 'foo' ], [ 'ahahahahha' ] ],
                        ],
                        [
-                               [ 'baz' ],
+                               [ [ 'baz' ], [ 'ahahahahha' ] ],
                                [ [ 'baz' ], [ 'ahahahahha' ] ],
                        ],
                ];
@@ -192,6 +214,14 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testWfMessageParams() {
                $this->assertSame( 'Return to $1.', wfMessage( 'returnto' )->text() );
                $this->assertSame( 'Return to $1.', wfMessage( 'returnto', [] )->text() );
+               $this->assertSame(
+                       'Return to 1,024.',
+                       wfMessage( 'returnto', Message::numParam( 1024 ) )->text()
+               );
+               $this->assertSame(
+                       'Return to 1,024.',
+                       wfMessage( 'returnto', [ Message::numParam( 1024 ) ] )->text()
+               );
                $this->assertSame(
                        'You have foo (bar).',
                        wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text()
@@ -200,6 +230,27 @@ class MessageTest extends MediaWikiLangTestCase {
                        'You have foo (bar).',
                        wfMessage( 'youhavenewmessages', [ 'foo', 'bar' ] )->text()
                );
+               $this->assertSame(
+                       'You have 1,024 (bar).',
+                       wfMessage(
+                               'youhavenewmessages',
+                               Message::numParam( 1024 ), 'bar'
+                       )->text()
+               );
+               $this->assertSame(
+                       'You have foo (2,048).',
+                       wfMessage(
+                               'youhavenewmessages',
+                               'foo', Message::numParam( 2048 )
+                       )->text()
+               );
+               $this->assertSame(
+                       'You have 1,024 (2,048).',
+                       wfMessage(
+                               'youhavenewmessages',
+                               [ Message::numParam( 1024 ), Message::numParam( 2048 ) ]
+                       )->text()
+               );
        }
 
        /**
@@ -397,7 +448,7 @@ class MessageTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * FIXME: This should not need database, but Language#formatExpiry does (bug 55912)
+        * FIXME: This should not need database, but Language#formatExpiry does (T57912)
         * @group Database
         * @covers Message::expiryParam
         * @covers Message::expiryParams
@@ -512,6 +563,136 @@ class MessageTest extends MediaWikiLangTestCase {
                );
        }
 
+       public static function provideListParam() {
+               $lang = Language::factory( 'de' );
+               $msg1 = new Message( 'mainpage', [], $lang );
+               $msg2 = new RawMessage( "''link''", [], $lang );
+
+               return [
+                       'Simple comma list' => [
+                               [ 'a', 'b', 'c' ],
+                               'comma',
+                               'text',
+                               'a, b, c'
+                       ],
+
+                       'Simple semicolon list' => [
+                               [ 'a', 'b', 'c' ],
+                               'semicolon',
+                               'text',
+                               'a; b; c'
+                       ],
+
+                       'Simple pipe list' => [
+                               [ 'a', 'b', 'c' ],
+                               'pipe',
+                               'text',
+                               'a | b | c'
+                       ],
+
+                       'Simple text list' => [
+                               [ 'a', 'b', 'c' ],
+                               'text',
+                               'text',
+                               'a, b and c'
+                       ],
+
+                       'Empty list' => [
+                               [],
+                               'comma',
+                               'text',
+                               ''
+                       ],
+
+                       'List with all "before" params, ->text()' => [
+                               [ "''link''", Message::numParam( 12345678 ) ],
+                               'semicolon',
+                               'text',
+                               '\'\'link\'\'; 12,345,678'
+                       ],
+
+                       'List with all "before" params, ->parse()' => [
+                               [ "''link''", Message::numParam( 12345678 ) ],
+                               'semicolon',
+                               'parse',
+                               '<i>link</i>; 12,345,678'
+                       ],
+
+                       'List with all "after" params, ->text()' => [
+                               [ $msg1, $msg2, Message::rawParam( '[[foo]]' ) ],
+                               'semicolon',
+                               'text',
+                               'Main Page; \'\'link\'\'; [[foo]]'
+                       ],
+
+                       'List with all "after" params, ->parse()' => [
+                               [ $msg1, $msg2, Message::rawParam( '[[foo]]' ) ],
+                               'semicolon',
+                               'parse',
+                               'Main Page; <i>link</i>; [[foo]]'
+                       ],
+
+                       'List with both "before" and "after" params, ->text()' => [
+                               [ $msg1, $msg2, Message::rawParam( '[[foo]]' ), "''link''", Message::numParam( 12345678 ) ],
+                               'semicolon',
+                               'text',
+                               'Main Page; \'\'link\'\'; [[foo]]; \'\'link\'\'; 12,345,678'
+                       ],
+
+                       'List with both "before" and "after" params, ->parse()' => [
+                               [ $msg1, $msg2, Message::rawParam( '[[foo]]' ), "''link''", Message::numParam( 12345678 ) ],
+                               'semicolon',
+                               'parse',
+                               'Main Page; <i>link</i>; [[foo]]; <i>link</i>; 12,345,678'
+                       ],
+               ];
+       }
+
+       /**
+        * @covers Message::listParam
+        * @covers Message::extractParam
+        * @covers Message::formatListParam
+        * @dataProvider provideListParam
+        */
+       public function testListParam( $list, $type, $format, $expect ) {
+               $lang = Language::factory( 'en' );
+
+               $msg = new RawMessage( '$1' );
+               $msg->params( [ Message::listParam( $list, $type ) ] );
+               $this->assertEquals(
+                       $expect,
+                       $msg->inLanguage( $lang )->$format()
+               );
+       }
+
+       /**
+        * @covers Message::extractParam
+        */
+       public function testMessageAsParam() {
+               $this->setMwGlobals( [
+                       'wgScript' => '/wiki/index.php',
+                       'wgArticlePath' => '/wiki/$1',
+               ] );
+
+               $msg = new Message( 'returnto', [
+                       new Message( 'apihelp-link', [
+                               'foo', new Message( 'mainpage', [], Language::factory( 'en' ) )
+                       ], Language::factory( 'de' ) )
+               ], Language::factory( 'es' ) );
+
+               $this->assertEquals(
+                       'Volver a [[Special:ApiHelp/foo|Página principal]].',
+                       $msg->text(),
+                       'Process with ->text()'
+               );
+               $this->assertEquals(
+                       '<p>Volver a <a href="/wiki/Special:ApiHelp/foo" title="Special:ApiHelp/foo">Página '
+                               . "principal</a>.\n</p>",
+                       $msg->parseAsBlock(),
+                       'Process with ->parseAsBlock()'
+               );
+       }
+
        public static function provideParser() {
                return [
                        [
index c637d34..50f851c 100644 (file)
@@ -7,12 +7,53 @@
  * @group Output
  *
  * @todo factor tests in this class into providers and test methods
- *
  */
 class OutputPageTest extends MediaWikiTestCase {
        const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)';
        const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)';
 
+       /**
+        * @covers OutputPage::addMeta
+        * @covers OutputPage::getMetaTags
+        * @covers OutputPage::getHeadLinksArray
+        */
+       public function testMetaTags() {
+               $outputPage = $this->newInstance();
+               $outputPage->addMeta( 'http:expires', '0' );
+               $outputPage->addMeta( 'keywords', 'first' );
+               $outputPage->addMeta( 'keywords', 'second' );
+               $outputPage->addMeta( 'og:title', 'Ta-duh' );
+
+               $expected = [
+                       [ 'http:expires', '0' ],
+                       [ 'keywords', 'first' ],
+                       [ 'keywords', 'second' ],
+                       [ 'og:title', 'Ta-duh' ],
+               ];
+               $this->assertSame( $expected, $outputPage->getMetaTags() );
+
+               $links = $outputPage->getHeadLinksArray();
+               $this->assertContains( '<meta http-equiv="expires" content="0"/>', $links );
+               $this->assertContains( '<meta name="keywords" content="first"/>', $links );
+               $this->assertContains( '<meta name="keywords" content="second"/>', $links );
+               $this->assertContains( '<meta property="og:title" content="Ta-duh"/>', $links );
+               $this->assertArrayNotHasKey( 'meta-robots', $links );
+       }
+
+       /**
+        * @covers OutputPage::setIndexPolicy
+        * @covers OutputPage::setFollowPolicy
+        * @covers OutputPage::getHeadLinksArray
+        */
+       public function testRobotsPolicies() {
+               $outputPage = $this->newInstance();
+               $outputPage->setIndexPolicy( 'noindex' );
+               $outputPage->setFollowPolicy( 'nofollow' );
+
+               $links = $outputPage->getHeadLinksArray();
+               $this->assertContains( '<meta name="robots" content="noindex,nofollow"/>', $links );
+       }
+
        /**
         * Tests a particular case of transformCssMedia, using the given input, globals,
         * expected return, and message
@@ -136,6 +177,99 @@ class OutputPageTest extends MediaWikiTestCase {
                ] );
        }
 
+       public static function provideTransformFilePath() {
+               $baseDir = dirname( __DIR__ ) . '/data/media';
+               return [
+                       // File that matches basePath, and exists. Hash found and appended.
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '/w/test.jpg',
+                               '/w/test.jpg?edcf2'
+                       ],
+                       // File that matches basePath, but not found on disk. Empty query.
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '/w/unknown.png',
+                               '/w/unknown.png?'
+                       ],
+                       // File not matching basePath. Ignored.
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '/files/test.jpg'
+                       ],
+                       // Empty string. Ignored.
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '',
+                               ''
+                       ],
+                       // Similar path, but with domain component. Ignored.
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '//example.org/w/test.jpg'
+                       ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               'https://example.org/w/test.jpg'
+                       ],
+                       // Unrelated path with domain component. Ignored.
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               'https://example.org/files/test.jpg'
+                       ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '//example.org/files/test.jpg'
+                       ],
+                       // Unrelated path with domain, and empty base path (root mw install). Ignored.
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '',
+                               'https://example.org/files/test.jpg'
+                       ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '',
+                               // T155310
+                               '//example.org/files/test.jpg'
+                       ],
+                       // Check UploadPath before ResourceBasePath (T155146)
+                       [
+                               'baseDir' => dirname( $baseDir ), 'basePath' => '',
+                               'uploadDir' => $baseDir, 'uploadPath' => '/images',
+                               '/images/test.jpg',
+                               '/images/test.jpg?edcf2'
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideTransformFilePath
+        * @covers OutputPage::transformFilePath
+        * @covers OutputPage::transformResourcePath
+        */
+       public function testTransformResourcePath( $baseDir, $basePath, $uploadDir = null,
+               $uploadPath = null, $path = null, $expected = null
+       ) {
+               if ( $path === null ) {
+                       // Skip optional $uploadDir and $uploadPath
+                       $path = $uploadDir;
+                       $expected = $uploadPath;
+                       $uploadDir = "$baseDir/images";
+                       $uploadPath = "$basePath/images";
+               }
+               $this->setMwGlobals( 'IP', $baseDir );
+               $conf = new HashConfig( [
+                       'ResourceBasePath' => $basePath,
+                       'UploadDirectory' => $uploadDir,
+                       'UploadPath' => $uploadPath,
+               ] );
+
+               MediaWiki\suppressWarnings();
+               $actual = OutputPage::transformResourcePath( $conf, $path );
+               MediaWiki\restoreWarnings();
+
+               $this->assertEquals( $expected ?: $path, $actual );
+       }
+
        public static function provideMakeResourceLoaderLink() {
                // @codingStandardsIgnoreStart Generic.Files.LineLength
                return [
@@ -288,7 +422,7 @@ class OutputPageTest extends MediaWikiTestCase {
        /**
         * @covers OutputPage::haveCacheVaryCookies
         */
-       function testHaveCacheVaryCookies() {
+       public function testHaveCacheVaryCookies() {
                $request = new FauxRequest();
                $context = new RequestContext();
                $context->setRequest( $request );
@@ -305,6 +439,60 @@ class OutputPageTest extends MediaWikiTestCase {
                $request->setCookie( 'Token', '123' );
                $this->assertTrue( $outputPage->haveCacheVaryCookies() );
        }
+
+       /*
+        * @covers OutputPage::addCategoryLinks
+        * @covers OutputPage::getCategories
+        */
+       public function testGetCategories() {
+               $fakeResultWrapper = new FakeResultWrapper( [
+                       (object) [
+                               'pp_value' => 1,
+                               'page_title' => 'Test'
+                       ],
+                       (object) [
+                               'page_title' => 'Test2'
+                       ]
+               ] );
+               $outputPage = $this->getMockBuilder( 'OutputPage' )
+                       ->setConstructorArgs( [ new RequestContext() ] )
+                       ->setMethods( [ 'addCategoryLinksToLBAndGetResult' ] )
+                       ->getMock();
+               $outputPage->expects( $this->any() )
+                       ->method( 'addCategoryLinksToLBAndGetResult' )
+                       ->will( $this->returnValue( $fakeResultWrapper ) );
+
+               $outputPage->addCategoryLinks( [
+                       'Test' => 'Test',
+                       'Test2' => 'Test2',
+               ] );
+               $this->assertEquals( [ 0 => 'Test', '1' => 'Test2' ], $outputPage->getCategories() );
+               $this->assertEquals( [ 0 => 'Test2' ], $outputPage->getCategories( 'normal' ) );
+               $this->assertEquals( [ 0 => 'Test' ], $outputPage->getCategories( 'hidden' ) );
+       }
+
+       /**
+        * @return OutputPage
+        */
+       private function newInstance() {
+               $context = new RequestContext();
+
+               $context->setConfig( new HashConfig( [
+                       'AppleTouchIcon' => false,
+                       'DisableLangConversion' => true,
+                       'EnableAPI' => false,
+                       'EnableCanonicalServerLink' => false,
+                       'Favicon' => false,
+                       'Feed' => false,
+                       'LanguageCode' => false,
+                       'ReferrerPolicy' => false,
+                       'RightsPage' => false,
+                       'RightsUrl' => false,
+                       'UniversalEditButton' => false,
+               ] ) );
+
+               return new OutputPage( $context );
+       }
 }
 
 /**
index 289853d..90b6396 100644 (file)
@@ -42,7 +42,7 @@ class PreferencesTest extends MediaWikiTestCase {
        }
 
        /**
-        * Placeholder to verify bug 34302
+        * Placeholder to verify T36302
         * @covers Preferences::profilePreferences
         */
        public function testEmailAuthenticationFieldWhenUserHasNoEmail() {
@@ -54,7 +54,7 @@ class PreferencesTest extends MediaWikiTestCase {
        }
 
        /**
-        * Placeholder to verify bug 34302
+        * Placeholder to verify T36302
         * @covers Preferences::profilePreferences
         */
        public function testEmailAuthenticationFieldWhenUserEmailNotAuthenticated() {
@@ -66,7 +66,7 @@ class PreferencesTest extends MediaWikiTestCase {
        }
 
        /**
-        * Placeholder to verify bug 34302
+        * Placeholder to verify T36302
         * @covers Preferences::profilePreferences
         */
        public function testEmailAuthenticationFieldWhenUserEmailIsAuthenticated() {
index bc43709..cf2e120 100644 (file)
@@ -129,11 +129,11 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                                'results' => [
                                        'Special:ActiveUsers',
                                        'Special:AllMessages',
-                                       'Special:AllMyFiles',
+                                       'Special:AllMyUploads',
                                ],
                                // Third result when testing offset
                                'offsetresult' => [
-                                       'Special:AllMyUploads',
+                                       'Special:AllPages',
                                ],
                        ] ],
                        [ [
@@ -146,7 +146,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                                ],
                                // Third result when testing offset
                                'offsetresult' => [
-                                       'Special:UncategorizedImages',
+                                       'Special:UncategorizedPages',
                                ],
                        ] ],
                        [ [
@@ -260,7 +260,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match not on top (bug 70958)',
+                               'Exact match not on top (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Bar',
@@ -274,7 +274,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match missing (bug 70958)',
+                               'Exact match missing (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Barbara',
index 7d3007b..642ada2 100644 (file)
@@ -274,18 +274,6 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $this->assertEquals( $page->getId(), $rev->getPage() );
        }
 
-       /**
-        * @covers Revision::getText
-        */
-       public function testGetText() {
-               $this->hideDeprecated( 'Revision::getText' );
-
-               $orig = $this->makeRevision( [ 'text' => 'hello hello.' ] );
-               $rev = Revision::newFromId( $orig->getId() );
-
-               $this->assertEquals( 'hello hello.', $rev->getText() );
-       }
-
        /**
         * @covers Revision::getContent
         */
index 767c963..c971a40 100644 (file)
@@ -311,28 +311,6 @@ class RevisionTest extends MediaWikiTestCase {
                );
        }
 
-       function dataGetText() {
-               // NOTE: we expect the help namespace to always contain wikitext
-               return [
-                       [ 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ],
-                       [ serialize( 'hello world' ), 'Hello', "testing", null, Revision::FOR_PUBLIC, null ],
-                       [ serialize( 'hello world' ), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, null ],
-               ];
-       }
-
-       /**
-        * @group Database
-        * @dataProvider dataGetText
-        * @covers Revision::getText
-        */
-       public function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
-               $this->hideDeprecated( 'Revision::getText' );
-
-               $rev = $this->newTestRevision( $text, $title, $model, $format );
-
-               $this->assertEquals( $expectedText, $rev->getText( $audience ) );
-       }
-
        public function dataGetSize() {
                return [
                        [ "hello world.", CONTENT_MODEL_WIKITEXT, 12 ],
@@ -375,14 +353,11 @@ class RevisionTest extends MediaWikiTestCase {
         * @covers Revision::__construct
         */
        public function testConstructWithText() {
-               $this->hideDeprecated( "Revision::getText" );
-
                $rev = new Revision( [
                        'text' => 'hello world.',
                        'content_model' => CONTENT_MODEL_JAVASCRIPT
                ] );
 
-               $this->assertNotNull( $rev->getText(), 'no content text' );
                $this->assertNotNull( $rev->getContent(), 'no content object available' );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
@@ -392,15 +367,12 @@ class RevisionTest extends MediaWikiTestCase {
         * @covers Revision::__construct
         */
        public function testConstructWithContent() {
-               $this->hideDeprecated( "Revision::getText" );
-
                $title = Title::newFromText( 'RevisionTest_testConstructWithContent' );
 
                $rev = new Revision( [
                        'content' => ContentHandler::makeContent( 'hello world.', $title, CONTENT_MODEL_JAVASCRIPT ),
                ] );
 
-               $this->assertNotNull( $rev->getText(), 'no content text' );
                $this->assertNotNull( $rev->getContent(), 'no content object available' );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
index 12db1a1..862b7d0 100644 (file)
@@ -211,7 +211,7 @@ class SanitizerTest extends MediaWikiTestCase {
                        [ [ 'foo6' => 'baz' ], 'foo6=baz', 'Numbers are allowed' ],
 
                        # This bit is more relaxed than XML rules, but some extensions use
-                       # it, like ProofreadPage (see bug 27539)
+                       # it, like ProofreadPage (see T29539)
                        [ [ '1foo' => 'baz' ], '1foo=baz', 'Leading numbers are allowed' ],
                        [ [], 'foo$=baz', 'Symbols are not allowed' ],
                        [ [], 'foo@=baz', 'Symbols are not allowed' ],
@@ -286,7 +286,7 @@ class SanitizerTest extends MediaWikiTestCase {
                        [ ' ', '/* /* */' ],
                        [ 'display: block;', "display:/* foo */block;" ],
                        [ 'display: block;', "display:\\2f\\2a foo \\2a\\2f block;",
-                               'Backslash-escaped comments must be stripped (bug 28450)' ],
+                               'Backslash-escaped comments must be stripped (T30450)' ],
                        [ '', '/* unfinished comment structure',
                                'Remove anything after a comment-start token' ],
                        [ '', "\\2f\\2a unifinished comment'",
index f47e74e..2448513 100644 (file)
@@ -64,7 +64,7 @@ class SanitizerValidateEmailTest extends PHPUnit_Framework_TestCase {
        }
 
        /**
-        * bug 26948 : comma were matched by an incorrect regexp range
+        * T28948 : comma were matched by an incorrect regexp range
         */
        public function testEmailWithCommasAreInvalids() {
                $this->invalid( "user,foo@example.org" );
index 3cb20e1..84a6adf 100644 (file)
@@ -33,30 +33,49 @@ use Psr\Log\LogLevel;
  */
 class TestLogger extends \Psr\Log\AbstractLogger {
        private $collect = false;
+       private $collectContext = false;
        private $buffer = [];
        private $filter = null;
 
        /**
-        * @param bool $collect Whether to collect logs
+        * @param bool $collect Whether to collect logs. @see setCollect()
         * @param callable $filter Filter logs before collecting/printing. Signature is
-        *  string|null function ( string $message, string $level );
+        *  string|null function ( string $message, string $level, array $context );
+        * @param bool $collectContext Whether to keep the context passed to log.
+        *                             @since 1.29 @see setCollectContext()
         */
-       public function __construct( $collect = false, $filter = null ) {
+       public function __construct( $collect = false, $filter = null, $collectContext = false ) {
                $this->collect = $collect;
+               $this->collectContext = $collectContext;
                $this->filter = $filter;
        }
 
        /**
         * Set the "collect" flag
         * @param bool $collect
+        * @return TestLogger $this
         */
        public function setCollect( $collect ) {
                $this->collect = $collect;
+               return $this;
+       }
+
+       /**
+        * Set the collectContext flag
+        *
+        * @param bool $collectContext
+        * @since 1.29
+        * @return TestLogger $this
+        */
+       public function setCollectContext( $collectContext ) {
+               $this->collectContext = $collectContext;
+               return $this;
        }
 
        /**
         * Return the collected logs
-        * @return array Array of array( string $level, string $message )
+        * @return array Array of array( string $level, string $message ), or
+        *   array( string $level, string $message, array $context ) if $collectContext was true.
         */
        public function getBuffer() {
                return $this->buffer;
@@ -73,14 +92,18 @@ class TestLogger extends \Psr\Log\AbstractLogger {
                $message = trim( $message );
 
                if ( $this->filter ) {
-                       $message = call_user_func( $this->filter, $message, $level );
+                       $message = call_user_func( $this->filter, $message, $level, $context );
                        if ( $message === null ) {
                                return;
                        }
                }
 
                if ( $this->collect ) {
-                       $this->buffer[] = [ $level, $message ];
+                       if ( $this->collectContext ) {
+                               $this->buffer[] = [ $level, $message, $context ];
+                       } else {
+                               $this->buffer[] = [ $level, $message ];
+                       }
                } else {
                        switch ( $level ) {
                                case LogLevel::DEBUG:
index 5ecdf56..9121178 100644 (file)
@@ -787,5 +787,21 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                # $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
                #   $user->blockedFor() == ''
                #   $user->mBlock->mExpiry == 'infinity'
+
+               $this->user->mBlockedby = $this->user->getName();
+               $this->user->mBlock = new Block( [
+                       'address' => '127.0.8.1',
+                       'by' => $this->user->getId(),
+                       'reason' => 'no reason given',
+                       'timestamp' => $now,
+                       'auto' => false,
+                       'expiry' => 10,
+                       'systemBlock' => 'test',
+               ] );
+               $this->assertEquals( [ [ 'systemblockedtext',
+                               '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
+                               'Useruser', 'test', '23:00, 31 December 1969', '127.0.8.1',
+                               $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ],
+                       $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
        }
 }
index 7925c6f..238b65f 100644 (file)
@@ -267,7 +267,7 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertEquals(
                        $expectedParam,
                        $par,
-                       "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter"
+                       "T33100 regression check: Title->fixSpecialName() should preserve parameter"
                );
        }
 
index 93687df..bdec0a5 100644 (file)
@@ -1233,7 +1233,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                        ->with( 'watchlisttoken' )
                        ->willReturn( '0123456789abcdef' );
 
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
                $queryService->getWatchedItemsWithRecentChangeInfo(
                        $user,
                        [ 'watchlistOwner' => $otherUser, 'watchlistOwnerToken' => $token ]
index ba47059..0bd0bcc 100644 (file)
@@ -2404,6 +2404,35 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                );
        }
 
+       public function testSetNotificationTimestampsForUser_nullTimestamp() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $timestamp = null;
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'update' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_notificationtimestamp' => null ],
+                               [ 'wl_user' => 1 ]
+                       )
+                       ->will( $this->returnValue( true ) );
+               $mockDb->expects( $this->exactly( 0 ) )
+                       ->method( 'timestamp' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return 'TS' . $value . 'TS';
+                       } ) );
+
+               $store = $this->newWatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $this->getMockCache()
+               );
+
+               $this->assertTrue(
+                       $store->setNotificationTimestampsForUser( $user, $timestamp )
+               );
+       }
+
        public function testSetNotificationTimestampsForUser_specificTargets() {
                $user = $this->getMockNonAnonUserWithId( 1 );
                $timestamp = '20100101010101';
index dbd1299..184dd43 100644 (file)
@@ -83,7 +83,7 @@ class XmlTest extends MediaWikiTestCase {
                $this->assertEquals(
                        '<input name="name" value="0" />',
                        Xml::input( 'name', false, 0 ),
-                       'Input with a value of 0 (bug 23797)'
+                       'Input with a value of 0 (T25797)'
                );
        }
 
@@ -305,17 +305,6 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       /**
-        * @covers Xml::escapeJsString
-        */
-       public function testEscapeJsStringSpecialChars() {
-               $this->assertEquals(
-                       '\\\\\r\n',
-                       Xml::escapeJsString( "\\\r\n" ),
-                       'escapeJsString() with special characters'
-               );
-       }
-
        /**
         * @covers Xml::encodeJsVar
         */
index 8b75d56..7327e85 100644 (file)
@@ -20,7 +20,7 @@ class ApiBaseTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         * @covers ApiBase::requireOnlyOneParameter
         */
        public function testRequireOnlyOneParameterZero() {
@@ -32,7 +32,7 @@ class ApiBaseTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         * @covers ApiBase::requireOnlyOneParameter
         */
        public function testRequireOnlyOneParameterTrue() {
@@ -58,10 +58,10 @@ class ApiBaseTest extends ApiTestCase {
                $context->setRequest( new FauxRequest( $input !== null ? [ 'foo' => $input ] : [] ) );
                $wrapper->mMainModule = new ApiMain( $context );
 
-               if ( $expected instanceof UsageException ) {
+               if ( $expected instanceof ApiUsageException ) {
                        try {
                                $wrapper->getParameterFromSettings( 'foo', $paramSettings, true );
-                       } catch ( UsageException $ex ) {
+                       } catch ( ApiUsageException $ex ) {
                                $this->assertEquals( $expected, $ex );
                        }
                } else {
@@ -73,9 +73,7 @@ class ApiBaseTest extends ApiTestCase {
 
        public static function provideGetParameterFromSettings() {
                $warnings = [
-                       'The value passed for \'foo\' contains invalid or non-normalized data. Textual data should ' .
-                       'be valid, NFC-normalized Unicode without C0 control characters other than ' .
-                       'HT (\\t), LF (\\n), and CR (\\r).'
+                       [ 'apiwarn-badutf8', 'foo' ],
                ];
 
                $c0 = '';
@@ -96,7 +94,7 @@ class ApiBaseTest extends ApiTestCase {
                        'String param, required, empty' => [
                                '',
                                [ ApiBase::PARAM_DFLT => 'default', ApiBase::PARAM_REQUIRED => true ],
-                               new UsageException( 'The foo parameter must be set', 'nofoo' ),
+                               ApiUsageException::newWithMessage( null, [ 'apierror-missingparam', 'foo' ] ),
                                []
                        ],
                        'Multi-valued parameter' => [
@@ -126,4 +124,52 @@ class ApiBaseTest extends ApiTestCase {
                ];
        }
 
+       public function testErrorArrayToStatus() {
+               $mock = new MockApi();
+
+               // Sanity check empty array
+               $expect = Status::newGood();
+               $this->assertEquals( $expect, $mock->errorArrayToStatus( [] ) );
+
+               // No blocked $user, so no special block handling
+               $expect = Status::newGood();
+               $expect->fatal( 'blockedtext' );
+               $expect->fatal( 'autoblockedtext' );
+               $expect->fatal( 'systemblockedtext' );
+               $expect->fatal( 'mainpage' );
+               $expect->fatal( 'parentheses', 'foobar' );
+               $this->assertEquals( $expect, $mock->errorArrayToStatus( [
+                       [ 'blockedtext' ],
+                       [ 'autoblockedtext' ],
+                       [ 'systemblockedtext' ],
+                       'mainpage',
+                       [ 'parentheses', 'foobar' ],
+               ] ) );
+
+               // Has a blocked $user, so special block handling
+               $user = $this->getMutableTestUser()->getUser();
+               $block = new \Block( [
+                       'address' => $user->getName(),
+                       'user' => $user->getID(),
+                       'reason' => __METHOD__,
+                       'expiry' => time() + 100500,
+               ] );
+               $block->insert();
+               $blockinfo = [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ];
+
+               $expect = Status::newGood();
+               $expect->fatal( ApiMessage::create( 'apierror-blocked', 'blocked', $blockinfo ) );
+               $expect->fatal( ApiMessage::create( 'apierror-autoblocked', 'autoblocked', $blockinfo ) );
+               $expect->fatal( ApiMessage::create( 'apierror-systemblocked', 'blocked', $blockinfo ) );
+               $expect->fatal( 'mainpage' );
+               $expect->fatal( 'parentheses', 'foobar' );
+               $this->assertEquals( $expect, $mock->errorArrayToStatus( [
+                       [ 'blockedtext' ],
+                       [ 'autoblockedtext' ],
+                       [ 'systemblockedtext' ],
+                       'mainpage',
+                       [ 'parentheses', 'foobar' ],
+               ], $user ) );
+       }
+
 }
index d2dccf9..832a113 100644 (file)
@@ -13,6 +13,14 @@ class ApiBlockTest extends ApiTestCase {
                $this->doLogin();
        }
 
+       protected function tearDown() {
+               $block = Block::newFromTarget( 'UTApiBlockee' );
+               if ( !is_null( $block ) ) {
+                       $block->delete();
+               }
+               parent::tearDown();
+       }
+
        protected function getTokens() {
                return $this->getTokenList( self::$users['sysop'] );
        }
@@ -65,8 +73,37 @@ class ApiBlockTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
-        * @expectedExceptionMessage The token parameter must be set
+        * Block by user ID
+        */
+       public function testMakeNormalBlockId() {
+               $tokens = $this->getTokens();
+               $user = User::newFromName( 'UTApiBlockee' );
+
+               if ( !$user->getId() ) {
+                       $this->markTestIncomplete( "The user UTApiBlockee does not exist." );
+               }
+
+               if ( !array_key_exists( 'blocktoken', $tokens ) ) {
+                       $this->markTestIncomplete( "No block token found" );
+               }
+
+               $data = $this->doApiRequest( [
+                       'action' => 'block',
+                       'userid' => $user->getId(),
+                       'reason' => 'Some reason',
+                       'token' => $tokens['blocktoken'] ], null, false, self::$users['sysop']->getUser() );
+
+               $block = Block::newFromTarget( 'UTApiBlockee' );
+
+               $this->assertTrue( !is_null( $block ), 'Block is valid.' );
+               $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
+               $this->assertEquals( 'Some reason', $block->mReason );
+               $this->assertEquals( 'infinity', $block->mExpiry );
+       }
+
+       /**
+        * @expectedException ApiUsageException
+        * @expectedExceptionMessage The "token" parameter must be set
         */
        public function testBlockingActionWithNoToken() {
                $this->doApiRequest(
index 3ad16d1..bb4ea75 100644 (file)
@@ -160,10 +160,8 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                try {
                        self::getManager( 'foo', $allModules, [ 'mock1', 'mock2' ] );
                        $this->fail( 'Expected exception not thrown' );
-               } catch ( UsageException $ex ) {
-                       $this->assertSame(
-                               'Invalid continue param. You should pass the original value returned by the previous query',
-                               $ex->getMessage(),
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'badcontinue' ),
                                'Expected exception'
                        );
                }
index 02d0a0d..e091153 100644 (file)
@@ -195,16 +195,16 @@ class ApiEditPageTest extends ApiTestCase {
                                'section' => '9999',
                                'text' => 'text',
                        ] );
-                       $this->fail( "Should have raised a UsageException" );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'nosuchsection', $e->getCodeString() );
+                       $this->fail( "Should have raised an ApiUsageException" );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, 'nosuchsection' ) );
                }
        }
 
        /**
         * Test action=edit&section=new
         * Run it twice so we test adding a new section on a
-        * page that doesn't exist (bug 52830) and one that
+        * page that doesn't exist (T54830) and one that
         * does exist
         */
        public function testEditNewSection() {
@@ -333,8 +333,8 @@ class ApiEditPageTest extends ApiTestCase {
                        ], null, self::$users['sysop']->getUser() );
 
                        $this->fail( 'redirect-appendonly error expected' );
-               } catch ( UsageException $ex ) {
-                       $this->assertEquals( 'redirect-appendonly', $ex->getCodeString() );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $ex, 'redirect-appendonly' ) );
                }
        }
 
@@ -369,8 +369,8 @@ class ApiEditPageTest extends ApiTestCase {
                        ], null, self::$users['sysop']->getUser() );
 
                        $this->fail( 'edit conflict expected' );
-               } catch ( UsageException $ex ) {
-                       $this->assertEquals( 'editconflict', $ex->getCodeString() );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $ex, 'editconflict' ) );
                }
        }
 
@@ -416,7 +416,7 @@ class ApiEditPageTest extends ApiTestCase {
                $count++;
 
                /*
-               * bug 41990: if the target page has a newer revision than the redirect, then editing the
+               * T43990: if the target page has a newer revision than the redirect, then editing the
                * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously
                * caused an edit conflict to be detected.
                */
@@ -474,7 +474,7 @@ class ApiEditPageTest extends ApiTestCase {
 
        public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
                $this->setExpectedException(
-                       'UsageException',
+                       'ApiUsageException',
                        'Direct editing via API is not supported for content model ' .
                                'testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
                );
index d13b00b..eaa4d17 100644 (file)
@@ -5,6 +5,30 @@
  */
 class ApiErrorFormatterTest extends MediaWikiLangTestCase {
 
+       /**
+        * @covers ApiErrorFormatter
+        */
+       public function testErrorFormatterBasics() {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'de' ), 'wikitext', false );
+               $this->assertSame( 'de', $formatter->getLanguage()->getCode() );
+
+               $formatter->addMessagesFromStatus( null, Status::newGood() );
+               $this->assertSame(
+                       [ ApiResult::META_TYPE => 'assoc' ],
+                       $result->getResultData()
+               );
+
+               $this->assertSame( [], $formatter->arrayFromStatus( Status::newGood() ) );
+
+               $wrappedFormatter = TestingAccessWrapper::newFromObject( $formatter );
+               $this->assertSame(
+                       'Blah "kbd" <X> 😊',
+                       $wrappedFormatter->stripMarkup( 'Blah <kbd>kbd</kbd> <b>&lt;X&gt;</b> &#x1f60a;' ),
+                       'stripMarkup'
+               );
+       }
+
        /**
         * @covers ApiErrorFormatter
         * @dataProvider provideErrorFormatter
@@ -22,7 +46,7 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
 
                $formatter->addWarning( 'string', 'mainpage' );
                $formatter->addError( 'err', 'mainpage' );
-               $this->assertSame( $expect1, $result->getResultData(), 'Simple test' );
+               $this->assertEquals( $expect1, $result->getResultData(), 'Simple test' );
 
                $result->reset();
                $formatter->addWarning( 'foo', 'mainpage' );
@@ -35,6 +59,17 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $formatter->addError( 'errWithData', $msg2 );
                $this->assertSame( $expect2, $result->getResultData(), 'Complex test' );
 
+               $this->assertEquals(
+                       $this->removeModuleTag( $expect2['warnings'][2] ),
+                       $formatter->formatMessage( $msg1 ),
+                       'formatMessage test 1'
+               );
+               $this->assertEquals(
+                       $this->removeModuleTag( $expect2['warnings'][3] ),
+                       $formatter->formatMessage( $msg2 ),
+                       'formatMessage test 2'
+               );
+
                $result->reset();
                $status = Status::newGood();
                $status->warning( 'mainpage' );
@@ -47,245 +82,256 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $this->assertSame( $expect3, $result->getResultData(), 'Status test' );
 
                $this->assertSame(
-                       $expect3['errors']['status'],
+                       array_map( [ $this, 'removeModuleTag' ], $expect3['errors'] ),
                        $formatter->arrayFromStatus( $status, 'error' ),
                        'arrayFromStatus test for error'
                );
                $this->assertSame(
-                       $expect3['warnings']['status'],
+                       array_map( [ $this, 'removeModuleTag' ], $expect3['warnings'] ),
                        $formatter->arrayFromStatus( $status, 'warning' ),
                        'arrayFromStatus test for warning'
                );
        }
 
+       private function removeModuleTag( $s ) {
+               if ( is_array( $s ) ) {
+                       unset( $s['module'] );
+               }
+               return $s;
+       }
+
        public static function provideErrorFormatter() {
-               $mainpagePlain = wfMessage( 'mainpage' )->useDatabase( false )->plain();
-               $parensPlain = wfMessage( 'parentheses', 'foobar' )->useDatabase( false )->plain();
-               $mainpageText = wfMessage( 'mainpage' )->inLanguage( 'de' )->text();
-               $parensText = wfMessage( 'parentheses', 'foobar' )->inLanguage( 'de' )->text();
+               $mainpageText = wfMessage( 'mainpage' )->inLanguage( 'de' )->useDatabase( false )->text();
+               $parensText = wfMessage( 'parentheses', 'foobar' )->inLanguage( 'de' )
+                       ->useDatabase( false )->text();
+               $mainpageHTML = wfMessage( 'mainpage' )->inLanguage( 'en' )->parse();
+               $parensHTML = wfMessage( 'parentheses', 'foobar' )->inLanguage( 'en' )->parse();
                $C = ApiResult::META_CONTENT;
                $I = ApiResult::META_INDEXED_TAG_NAME;
+               $overriddenData = [ 'overriddenData' => true, ApiResult::META_TYPE => 'assoc' ];
 
                return [
-                       [ 'wikitext', 'de', true,
+                       $tmp = [ 'wikitext', 'de', false,
                                [
                                        'errors' => [
-                                               'err' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'err', $C => 'text' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'string' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'string', $C => 'text' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'errWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'text' => $mainpageText,
-                                                               'overriddenData' => true, $C => 'text' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                       'data' => $overriddenData, 'module' => 'errWithData', $C => 'text' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'messageWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'text' => $mainpageText,
-                                                               'overriddenData' => true, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
-                                               'message' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
-                                               'foo' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       [ 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'foo', $C => 'text' ],
+                                               [ 'code' => 'parentheses', 'text' => $parensText, 'module' => 'foo', $C => 'text' ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'message', $C => 'text' ],
+                                               [ 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                       'data' => $overriddenData, 'module' => 'messageWithData', $C => 'text' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       [ 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'status', $C => 'text' ],
+                                               [ 'code' => 'parentheses', 'text' => $parensText, 'module' => 'status', $C => 'text' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       [ 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ],
-                                                       [ 'code' => 'overriddenCode', 'text' => $mainpageText,
-                                                               'overriddenData' => true, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'status', $C => 'text' ],
+                                               [ 'code' => 'parentheses', 'text' => $parensText, 'module' => 'status', $C => 'text' ],
+                                               [ 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                       'data' => $overriddenData, 'module' => 'status', $C => 'text' ],
+                                               $I => 'warning',
+                                       ],
+                               ],
+                       ],
+                       [ 'plaintext' ] + $tmp, // For these messages, plaintext and wikitext are the same
+                       [ 'html', 'en', true,
+                               [
+                                       'errors' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'err', $C => 'html' ],
+                                               $I => 'error',
+                                       ],
+                                       'warnings' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'string', $C => 'html' ],
+                                               $I => 'warning',
+                                       ],
+                               ],
+                               [
+                                       'errors' => [
+                                               [ 'code' => 'overriddenCode', 'html' => $mainpageHTML,
+                                                       'data' => $overriddenData, 'module' => 'errWithData', $C => 'html' ],
+                                               $I => 'error',
+                                       ],
+                                       'warnings' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'foo', $C => 'html' ],
+                                               [ 'code' => 'parentheses', 'html' => $parensHTML, 'module' => 'foo', $C => 'html' ],
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'message', $C => 'html' ],
+                                               [ 'code' => 'overriddenCode', 'html' => $mainpageHTML,
+                                                       'data' => $overriddenData, 'module' => 'messageWithData', $C => 'html' ],
+                                               $I => 'warning',
+                                       ],
+                               ],
+                               [
+                                       'errors' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'status', $C => 'html' ],
+                                               [ 'code' => 'parentheses', 'html' => $parensHTML, 'module' => 'status', $C => 'html' ],
+                                               $I => 'error',
+                                       ],
+                                       'warnings' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'status', $C => 'html' ],
+                                               [ 'code' => 'parentheses', 'html' => $parensHTML, 'module' => 'status', $C => 'html' ],
+                                               [ 'code' => 'overriddenCode', 'html' => $mainpageHTML,
+                                                       'data' => $overriddenData, 'module' => 'status', $C => 'html' ],
+                                               $I => 'warning',
                                        ],
                                ],
                        ],
                        [ 'raw', 'fr', true,
                                [
                                        'errors' => [
-                                               'err' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       $I => 'error',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'err',
                                                ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'string' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'string',
                                                ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'errWithData' => [
-                                                       [
-                                                               'code' => 'overriddenCode',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ],
-                                                               'overriddenData' => true
-                                                       ],
-                                                       $I => 'error',
+                                               [
+                                                       'code' => 'overriddenCode',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'data' => $overriddenData,
+                                                       'module' => 'errWithData',
                                                ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'messageWithData' => [
-                                                       [
-                                                               'code' => 'overriddenCode',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ],
-                                                               'overriddenData' => true
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'foo',
                                                ],
-                                               'message' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'parentheses',
+                                                       'key' => 'parentheses',
+                                                       'params' => [ 'foobar', $I => 'param' ],
+                                                       'module' => 'foo',
                                                ],
-                                               'foo' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'parentheses',
-                                                               'key' => 'parentheses',
-                                                               'params' => [ 'foobar', $I => 'param' ]
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'message',
                                                ],
+                                               [
+                                                       'code' => 'overriddenCode',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'data' => $overriddenData,
+                                                       'module' => 'messageWithData',
+                                               ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'status' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'parentheses',
-                                                               'key' => 'parentheses',
-                                                               'params' => [ 'foobar', $I => 'param' ]
-                                                       ],
-                                                       $I => 'error',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'status',
+                                               ],
+                                               [
+                                                       'code' => 'parentheses',
+                                                       'key' => 'parentheses',
+                                                       'params' => [ 'foobar', $I => 'param' ],
+                                                       'module' => 'status',
                                                ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'status' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'parentheses',
-                                                               'key' => 'parentheses',
-                                                               'params' => [ 'foobar', $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'overriddenCode',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ],
-                                                               'overriddenData' => true
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'status',
+                                               ],
+                                               [
+                                                       'code' => 'parentheses',
+                                                       'key' => 'parentheses',
+                                                       'params' => [ 'foobar', $I => 'param' ],
+                                                       'module' => 'status',
+                                               ],
+                                               [
+                                                       'code' => 'overriddenCode',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'data' => $overriddenData,
+                                                       'module' => 'status',
                                                ],
+                                               $I => 'warning',
                                        ],
                                ],
                        ],
                        [ 'none', 'fr', true,
                                [
                                        'errors' => [
-                                               'err' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'err' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'string' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'string' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'errWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'overriddenData' => true ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'overriddenCode', 'data' => $overriddenData,
+                                                       'module' => 'errWithData' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'messageWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'overriddenData' => true ],
-                                                       $I => 'warning',
-                                               ],
-                                               'message' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       $I => 'warning',
-                                               ],
-                                               'foo' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       [ 'code' => 'parentheses' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'foo' ],
+                                               [ 'code' => 'parentheses', 'module' => 'foo' ],
+                                               [ 'code' => 'mainpage', 'module' => 'message' ],
+                                               [ 'code' => 'overriddenCode', 'data' => $overriddenData,
+                                                       'module' => 'messageWithData' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       [ 'code' => 'parentheses' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'status' ],
+                                               [ 'code' => 'parentheses', 'module' => 'status' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       [ 'code' => 'parentheses' ],
-                                                       [ 'code' => 'overriddenCode', 'overriddenData' => true ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'status' ],
+                                               [ 'code' => 'parentheses', 'module' => 'status' ],
+                                               [ 'code' => 'overriddenCode', 'data' => $overriddenData, 'module' => 'status' ],
+                                               $I => 'warning',
                                        ],
                                ],
                        ],
@@ -302,7 +348,14 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $result = new ApiResult( 8388608 );
                $formatter = new ApiErrorFormatter_BackCompat( $result );
 
+               $this->assertSame( 'en', $formatter->getLanguage()->getCode() );
+
+               $this->assertSame( [], $formatter->arrayFromStatus( Status::newGood() ) );
+
                $formatter->addWarning( 'string', 'mainpage' );
+               $formatter->addWarning( 'raw',
+                       new RawMessage( 'Blah <kbd>kbd</kbd> <b>&lt;X&gt;</b> &#x1f61e;' )
+               );
                $formatter->addError( 'err', 'mainpage' );
                $this->assertSame( [
                        'error' => [
@@ -310,6 +363,10 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                                'info' => $mainpagePlain,
                        ],
                        'warnings' => [
+                               'raw' => [
+                                       'warnings' => 'Blah "kbd" <X> 😞',
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ],
                                'string' => [
                                        'warnings' => $mainpagePlain,
                                        ApiResult::META_CONTENT => 'warnings',
@@ -321,12 +378,13 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $result->reset();
                $formatter->addWarning( 'foo', 'mainpage' );
                $formatter->addWarning( 'foo', 'mainpage' );
-               $formatter->addWarning( 'foo', [ 'parentheses', 'foobar' ] );
+               $formatter->addWarning( 'xxx+foo', [ 'parentheses', 'foobar' ] );
                $msg1 = wfMessage( 'mainpage' );
                $formatter->addWarning( 'message', $msg1 );
                $msg2 = new ApiMessage( 'mainpage', 'overriddenCode', [ 'overriddenData' => true ] );
                $formatter->addWarning( 'messageWithData', $msg2 );
                $formatter->addError( 'errWithData', $msg2 );
+               $formatter->addWarning( null, 'mainpage' );
                $this->assertSame( [
                        'error' => [
                                'code' => 'overriddenCode',
@@ -334,6 +392,10 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                                'overriddenData' => true,
                        ],
                        'warnings' => [
+                               'unknown' => [
+                                       'warnings' => $mainpagePlain,
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ],
                                'messageWithData' => [
                                        'warnings' => $mainpagePlain,
                                        ApiResult::META_CONTENT => 'warnings',
@@ -350,6 +412,22 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                        ApiResult::META_TYPE => 'assoc',
                ], $result->getResultData(), 'Complex test' );
 
+               $this->assertSame(
+                       [
+                               'code' => 'mainpage',
+                               'info' => 'Main Page',
+                       ],
+                       $formatter->formatMessage( $msg1 )
+               );
+               $this->assertSame(
+                       [
+                               'code' => 'overriddenCode',
+                               'info' => 'Main Page',
+                               'overriddenData' => true,
+                       ],
+                       $formatter->formatMessage( $msg2 )
+               );
+
                $result->reset();
                $status = Status::newGood();
                $status->warning( 'mainpage' );
@@ -361,8 +439,8 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $formatter->addMessagesFromStatus( 'status', $status );
                $this->assertSame( [
                        'error' => [
-                               'code' => 'parentheses',
-                               'info' => $parensPlain,
+                               'code' => 'mainpage',
+                               'info' => $mainpagePlain,
                        ],
                        'warnings' => [
                                'status' => [
@@ -377,14 +455,16 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $this->assertSame(
                        [
                                [
-                                       'type' => 'error',
                                        'message' => 'mainpage',
-                                       'params' => [ $I => 'param' ]
+                                       'params' => [ $I => 'param' ],
+                                       'code' => 'mainpage',
+                                       'type' => 'error',
                                ],
                                [
-                                       'type' => 'error',
                                        'message' => 'parentheses',
-                                       'params' => [ 'foobar', $I => 'param' ]
+                                       'params' => [ 'foobar', $I => 'param' ],
+                                       'code' => 'parentheses',
+                                       'type' => 'error',
                                ],
                                $I => 'error',
                        ],
@@ -394,30 +474,157 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $this->assertSame(
                        [
                                [
-                                       'type' => 'warning',
                                        'message' => 'mainpage',
-                                       'params' => [ $I => 'param' ]
+                                       'params' => [ $I => 'param' ],
+                                       'code' => 'mainpage',
+                                       'type' => 'warning',
                                ],
                                [
-                                       'type' => 'warning',
                                        'message' => 'parentheses',
-                                       'params' => [ 'foobar', $I => 'param' ]
+                                       'params' => [ 'foobar', $I => 'param' ],
+                                       'code' => 'parentheses',
+                                       'type' => 'warning',
                                ],
                                [
                                        'message' => 'mainpage',
                                        'params' => [ $I => 'param' ],
-                                       'type' => 'warning'
+                                       'code' => 'mainpage',
+                                       'type' => 'warning',
                                ],
                                [
                                        'message' => 'mainpage',
                                        'params' => [ $I => 'param' ],
-                                       'type' => 'warning'
+                                       'code' => 'overriddenCode',
+                                       'type' => 'warning',
                                ],
                                $I => 'warning',
                        ],
                        $formatter->arrayFromStatus( $status, 'warning' ),
                        'arrayFromStatus test for warning'
                );
+
+               $result->reset();
+               $result->addValue( null, 'error', [ 'bogus' ] );
+               $formatter->addError( 'err', 'mainpage' );
+               $this->assertSame( [
+                       'error' => [
+                               'code' => 'mainpage',
+                               'info' => $mainpagePlain,
+                       ],
+                       ApiResult::META_TYPE => 'assoc',
+               ], $result->getResultData(), 'Overwrites bogus "error" value with real error' );
+       }
+
+       /**
+        * @dataProvider provideGetMessageFromException
+        * @covers ApiErrorFormatter::getMessageFromException
+        * @covers ApiErrorFormatter::formatException
+        * @param Exception $exception
+        * @param array $options
+        * @param array $expect
+        */
+       public function testGetMessageFromException( $exception, $options, $expect ) {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'en' ), 'html', false );
+
+               $msg = $formatter->getMessageFromException( $exception, $options );
+               $this->assertInstanceOf( Message::class, $msg );
+               $this->assertInstanceOf( IApiMessage::class, $msg );
+               $this->assertSame( $expect, [
+                       'text' => $msg->parse(),
+                       'code' => $msg->getApiCode(),
+                       'data' => $msg->getApiData(),
+               ] );
+
+               $expectFormatted = $formatter->formatMessage( $msg );
+               $formatted = $formatter->formatException( $exception, $options );
+               $this->assertSame( $expectFormatted, $formatted );
+       }
+
+       /**
+        * @dataProvider provideGetMessageFromException
+        * @covers ApiErrorFormatter_BackCompat::formatException
+        * @param Exception $exception
+        * @param array $options
+        * @param array $expect
+        */
+       public function testGetMessageFromException_BC( $exception, $options, $expect ) {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter_BackCompat( $result );
+
+               $msg = $formatter->getMessageFromException( $exception, $options );
+               $this->assertInstanceOf( Message::class, $msg );
+               $this->assertInstanceOf( IApiMessage::class, $msg );
+               $this->assertSame( $expect, [
+                       'text' => $msg->parse(),
+                       'code' => $msg->getApiCode(),
+                       'data' => $msg->getApiData(),
+               ] );
+
+               $expectFormatted = $formatter->formatMessage( $msg );
+               $formatted = $formatter->formatException( $exception, $options );
+               $this->assertSame( $expectFormatted, $formatted );
+               $formatted = $formatter->formatException( $exception, $options + [ 'bc' => true ] );
+               $this->assertSame( $expectFormatted['info'], $formatted );
+       }
+
+       public static function provideGetMessageFromException() {
+               return [
+                       'Normal exception' => [
+                               new RuntimeException( '<b>Something broke!</b>' ),
+                               [],
+                               [
+                                       'text' => '&#60;b&#62;Something broke!&#60;/b&#62;',
+                                       'code' => 'internal_api_error_RuntimeException',
+                                       'data' => [],
+                               ]
+                       ],
+                       'Normal exception, wrapped' => [
+                               new RuntimeException( '<b>Something broke!</b>' ),
+                               [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+                               [
+                                       'text' => '(&#60;b&#62;Something broke!&#60;/b&#62;)',
+                                       'code' => 'some-code',
+                                       'data' => [ 'foo' => 'bar', 'baz' => 42 ],
+                               ]
+                       ],
+                       'UsageException' => [
+                               new UsageException( '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ] ),
+                               [],
+                               [
+                                       'text' => '&#60;b&#62;Something broke!&#60;/b&#62;',
+                                       'code' => 'ue-code',
+                                       'data' => [ 'xxx' => 'yyy', 'baz' => 23 ],
+                               ]
+                       ],
+                       'UsageException, wrapped' => [
+                               new UsageException( '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ] ),
+                               [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+                               [
+                                       'text' => '(&#60;b&#62;Something broke!&#60;/b&#62;)',
+                                       'code' => 'some-code',
+                                       'data' => [ 'xxx' => 'yyy', 'baz' => 42, 'foo' => 'bar' ],
+                               ]
+                       ],
+                       'LocalizedException' => [
+                               new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
+                               [],
+                               [
+                                       'text' => 'Return to <b>FooBar</b>.',
+                                       'code' => 'returnto',
+                                       'data' => [],
+                               ]
+                       ],
+                       'LocalizedException, wrapped' => [
+                               new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
+                               [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+                               [
+                                       'text' => 'Return to <b>FooBar</b>.',
+                                       'code' => 'some-code',
+                                       'data' => [ 'foo' => 'bar', 'baz' => 42 ],
+                               ]
+                       ],
+               ];
        }
 
 }
index c111949..9060dfb 100644 (file)
@@ -53,8 +53,8 @@ class ApiMainTest extends ApiTestCase {
                                'assert' => $assert,
                        ], null, null, $user );
                        $this->assertFalse( $error ); // That no error was expected
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( $e->getCodeString(), $error );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, $error ) );
                }
        }
 
@@ -76,8 +76,8 @@ class ApiMainTest extends ApiTestCase {
                                'assertuser' => $user->getName() . 'X',
                        ], null, null, $user );
                        $this->fail( 'Expected exception not thrown' );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( $e->getCodeString(), 'assertnameduserfailed' );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, 'assertnameduserfailed' ) );
                }
        }
 
@@ -85,20 +85,15 @@ class ApiMainTest extends ApiTestCase {
         * Test if all classes in the main module manager exists
         */
        public function testClassNamesInModuleManager() {
-               global $wgAutoloadLocalClasses, $wgAutoloadClasses;
-
-               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
-               $classes = $wgAutoloadLocalClasses + $wgAutoloadClasses;
-
                $api = new ApiMain(
                        new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] )
                );
                $modules = $api->getModuleManager()->getNamesWithClasses();
+
                foreach ( $modules as $name => $class ) {
-                       $this->assertArrayHasKey(
-                               $class,
-                               $classes,
-                               'Class ' . $class . ' for api module ' . $name . ' not in autoloader (with exact case)'
+                       $this->assertTrue(
+                               class_exists( $class ),
+                               'Class ' . $class . ' for api module ' . $name . ' does not exist (with exact case)'
                        );
                }
        }
@@ -305,4 +300,281 @@ class ApiMainTest extends ApiTestCase {
                $main = new ApiMain( new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] ) );
                $this->assertTrue( $main->lacksSameOriginSecurity(), 'Hook, should lack security' );
        }
+
+       /**
+        * Test proper creation of the ApiErrorFormatter
+        * @covers ApiMain::__construct
+        * @dataProvider provideApiErrorFormatterCreation
+        * @param array $request Request parameters
+        * @param array $expect Expected data
+        *  - uselang: ApiMain language
+        *  - class: ApiErrorFormatter class
+        *  - lang: ApiErrorFormatter language
+        *  - format: ApiErrorFormatter format
+        *  - usedb: ApiErrorFormatter use-database flag
+        */
+       public function testApiErrorFormatterCreation( array $request, array $expect ) {
+               $context = new RequestContext();
+               $context->setRequest( new FauxRequest( $request ) );
+               $context->setLanguage( 'ru' );
+
+               $main = new ApiMain( $context );
+               $formatter = $main->getErrorFormatter();
+               $wrappedFormatter = TestingAccessWrapper::newFromObject( $formatter );
+
+               $this->assertSame( $expect['uselang'], $main->getLanguage()->getCode() );
+               $this->assertInstanceOf( $expect['class'], $formatter );
+               $this->assertSame( $expect['lang'], $formatter->getLanguage()->getCode() );
+               $this->assertSame( $expect['format'], $wrappedFormatter->format );
+               $this->assertSame( $expect['usedb'], $wrappedFormatter->useDB );
+       }
+
+       public static function provideApiErrorFormatterCreation() {
+               global $wgContLang;
+
+               return [
+                       'Default (BC)' => [ [], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+                       'BC ignores fields' => [ [ 'errorlang' => 'de', 'errorsuselocal' => 1 ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+                       'Explicit BC' => [ [ 'errorformat' => 'bc' ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+                       'Basic' => [ [ 'errorformat' => 'wikitext' ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter::class,
+                               'lang' => 'ru',
+                               'format' => 'wikitext',
+                               'usedb' => false,
+                       ] ],
+                       'Follows uselang' => [ [ 'uselang' => 'fr', 'errorformat' => 'plaintext' ], [
+                               'uselang' => 'fr',
+                               'class' => ApiErrorFormatter::class,
+                               'lang' => 'fr',
+                               'format' => 'plaintext',
+                               'usedb' => false,
+                       ] ],
+                       'Explicitly follows uselang' => [
+                               [ 'uselang' => 'fr', 'errorlang' => 'uselang', 'errorformat' => 'plaintext' ],
+                               [
+                                       'uselang' => 'fr',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'fr',
+                                       'format' => 'plaintext',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'uselang=content' => [
+                               [ 'uselang' => 'content', 'errorformat' => 'plaintext' ],
+                               [
+                                       'uselang' => $wgContLang->getCode(),
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => $wgContLang->getCode(),
+                                       'format' => 'plaintext',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'errorlang=content' => [
+                               [ 'errorlang' => 'content', 'errorformat' => 'plaintext' ],
+                               [
+                                       'uselang' => 'ru',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => $wgContLang->getCode(),
+                                       'format' => 'plaintext',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'Explicit parameters' => [
+                               [ 'errorlang' => 'de', 'errorformat' => 'html', 'errorsuselocal' => 1 ],
+                               [
+                                       'uselang' => 'ru',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'de',
+                                       'format' => 'html',
+                                       'usedb' => true,
+                               ]
+                       ],
+                       'Explicit parameters override uselang' => [
+                               [ 'errorlang' => 'de', 'uselang' => 'fr', 'errorformat' => 'raw' ],
+                               [
+                                       'uselang' => 'fr',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'de',
+                                       'format' => 'raw',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'Bogus language doesn\'t explode' => [
+                               [ 'errorlang' => '<bogus1>', 'uselang' => '<bogus2>', 'errorformat' => 'none' ],
+                               [
+                                       'uselang' => 'en',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'en',
+                                       'format' => 'none',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'Bogus format doesn\'t explode' => [ [ 'errorformat' => 'bogus' ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+               ];
+       }
+
+       /**
+        * @covers ApiMain::errorMessagesFromException
+        * @covers ApiMain::substituteResultWithError
+        * @dataProvider provideExceptionErrors
+        * @param Exception $exception
+        * @param array $expectReturn
+        * @param array $expectResult
+        */
+       public function testExceptionErrors( $error, $expectReturn, $expectResult ) {
+               $context = new RequestContext();
+               $context->setRequest( new FauxRequest( [ 'errorformat' => 'plaintext' ] ) );
+               $context->setLanguage( 'en' );
+               $context->setConfig( new MultiConfig( [
+                       new HashConfig( [
+                               'ShowHostnames' => true, 'ShowSQLErrors' => false,
+                               'ShowExceptionDetails' => true, 'ShowDBErrorBacktrace' => true,
+                       ] ),
+                       $context->getConfig()
+               ] ) );
+
+               $main = new ApiMain( $context );
+               $main->addWarning( new RawMessage( 'existing warning' ), 'existing-warning' );
+               $main->addError( new RawMessage( 'existing error' ), 'existing-error' );
+
+               $ret = TestingAccessWrapper::newFromObject( $main )->substituteResultWithError( $error );
+               $this->assertSame( $expectReturn, $ret );
+
+               // PHPUnit sometimes adds some SplObjectStorage garbage to the arrays,
+               // so let's try ->assertEquals().
+               $this->assertEquals(
+                       $expectResult,
+                       $main->getResult()->getResultData( [], [ 'Strip' => 'all' ] )
+               );
+       }
+
+       // Not static so $this->getMock() can be used
+       public function provideExceptionErrors() {
+               $reqId = WebRequest::getRequestId();
+               $doclink = wfExpandUrl( wfScript( 'api' ) );
+
+               $ex = new InvalidArgumentException( 'Random exception' );
+               $trace = wfMessage( 'api-exception-trace',
+                       get_class( $ex ),
+                       $ex->getFile(),
+                       $ex->getLine(),
+                       MWExceptionHandler::getRedactedTraceAsString( $ex )
+               )->inLanguage( 'en' )->useDatabase( false )->text();
+
+               $dbex = new DBQueryError( $this->getMock( 'IDatabase' ), 'error', 1234, 'SELECT 1', __METHOD__ );
+               $dbtrace = wfMessage( 'api-exception-trace',
+                       get_class( $dbex ),
+                       $dbex->getFile(),
+                       $dbex->getLine(),
+                       MWExceptionHandler::getRedactedTraceAsString( $dbex )
+               )->inLanguage( 'en' )->useDatabase( false )->text();
+
+               $apiEx1 = new ApiUsageException( null,
+                       StatusValue::newFatal( new ApiRawMessage( 'An error', 'sv-error1' ) ) );
+               TestingAccessWrapper::newFromObject( $apiEx1 )->modulePath = 'foo+bar';
+               $apiEx1->getStatusValue()->warning( new ApiRawMessage( 'A warning', 'sv-warn1' ) );
+               $apiEx1->getStatusValue()->warning( new ApiRawMessage( 'Another warning', 'sv-warn2' ) );
+               $apiEx1->getStatusValue()->fatal( new ApiRawMessage( 'Another error', 'sv-error2' ) );
+
+               return [
+                       [
+                               $ex,
+                               [ 'existing-error', 'internal_api_error_InvalidArgumentException' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [
+                                                       'code' => 'internal_api_error_InvalidArgumentException',
+                                                       'text' => "[$reqId] Exception caught: Random exception",
+                                               ]
+                                       ],
+                                       'trace' => $trace,
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+                       [
+                               $dbex,
+                               [ 'existing-error', 'internal_api_error_DBQueryError' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [
+                                                       'code' => 'internal_api_error_DBQueryError',
+                                                       'text' => "[$reqId] Database query error.",
+                                               ]
+                                       ],
+                                       'trace' => $dbtrace,
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+                       [
+                               new UsageException( 'Usage exception!', 'ue', 0, [ 'foo' => 'bar' ] ),
+                               [ 'existing-error', 'ue' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [ 'code' => 'ue', 'text' => "Usage exception!", 'data' => [ 'foo' => 'bar' ] ]
+                                       ],
+                                       'docref' => "See $doclink for API usage. Subscribe to the mediawiki-api-announce mailing " .
+                                               "list at &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; " .
+                                               "for notice of API deprecations and breaking changes.",
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+                       [
+                               $apiEx1,
+                               [ 'existing-error', 'sv-error1', 'sv-error2' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                               [ 'code' => 'sv-warn1', 'text' => 'A warning', 'module' => 'foo+bar' ],
+                                               [ 'code' => 'sv-warn2', 'text' => 'Another warning', 'module' => 'foo+bar' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [ 'code' => 'sv-error1', 'text' => 'An error', 'module' => 'foo+bar' ],
+                                               [ 'code' => 'sv-error2', 'text' => 'Another error', 'module' => 'foo+bar' ],
+                                       ],
+                                       'docref' => "See $doclink for API usage. Subscribe to the mediawiki-api-announce mailing " .
+                                               "list at &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; " .
+                                               "for notice of API deprecations and breaking changes.",
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+               ];
+       }
 }
index 8764b41..e405b3b 100644 (file)
@@ -23,6 +23,56 @@ class ApiMessageTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers ApiMessageTrait
+        */
+       public function testCodeDefaults() {
+               $msg = new ApiMessage( 'foo' );
+               $this->assertSame( 'foo', $msg->getApiCode() );
+
+               $msg = new ApiMessage( 'apierror-bar' );
+               $this->assertSame( 'bar', $msg->getApiCode() );
+
+               $msg = new ApiMessage( 'apiwarn-baz' );
+               $this->assertSame( 'baz', $msg->getApiCode() );
+
+               // BC case
+               $msg = new ApiMessage( 'actionthrottledtext' );
+               $this->assertSame( 'ratelimited', $msg->getApiCode() );
+
+               $msg = new ApiMessage( [ 'apierror-missingparam', 'param' ] );
+               $this->assertSame( 'noparam', $msg->getApiCode() );
+       }
+
+       /**
+        * @covers ApiMessageTrait
+        * @dataProvider provideInvalidCode
+        * @param mixed $code
+        */
+       public function testInvalidCode( $code ) {
+               $msg = new ApiMessage( 'foo' );
+               try {
+                       $msg->setApiCode( $code );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertTrue( true );
+               }
+
+               try {
+                       new ApiMessage( 'foo', $code );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertTrue( true );
+               }
+       }
+
+       public static function provideInvalidCode() {
+               return [
+                       [ '' ],
+                       [ 42 ],
+               ];
+       }
+
        /**
         * @covers ApiMessage
         * @covers ApiMessageTrait
@@ -105,14 +155,32 @@ class ApiMessageTest extends MediaWikiTestCase {
         * @covers ApiMessage::create
         */
        public function testApiMessageCreate() {
-               $this->assertInstanceOf( 'ApiMessage', ApiMessage::create( new Message( 'mainpage' ) ) );
-               $this->assertInstanceOf( 'ApiRawMessage', ApiMessage::create( new RawMessage( 'mainpage' ) ) );
-               $this->assertInstanceOf( 'ApiMessage', ApiMessage::create( 'mainpage' ) );
+               $this->assertInstanceOf( ApiMessage::class, ApiMessage::create( new Message( 'mainpage' ) ) );
+               $this->assertInstanceOf(
+                       ApiRawMessage::class, ApiMessage::create( new RawMessage( 'mainpage' ) )
+               );
+               $this->assertInstanceOf( ApiMessage::class, ApiMessage::create( 'mainpage' ) );
+
+               $msg = new ApiMessage( [ 'parentheses', 'foobar' ] );
+               $msg2 = new Message( 'parentheses', [ 'foobar' ] );
 
-               $msg = new ApiMessage( 'mainpage' );
                $this->assertSame( $msg, ApiMessage::create( $msg ) );
+               $this->assertEquals( $msg, ApiMessage::create( $msg2 ) );
+               $this->assertEquals( $msg, ApiMessage::create( [ 'parentheses', 'foobar' ] ) );
+               $this->assertEquals( $msg,
+                       ApiMessage::create( [ 'message' => 'parentheses', 'params' => [ 'foobar' ] ] )
+               );
+               $this->assertSame( $msg,
+                       ApiMessage::create( [ 'message' => $msg, 'params' => [ 'xxx' ] ] )
+               );
+               $this->assertEquals( $msg,
+                       ApiMessage::create( [ 'message' => $msg2, 'params' => [ 'xxx' ] ] )
+               );
+               $this->assertSame( $msg,
+                       ApiMessage::create( [ 'message' => $msg ] )
+               );
 
-               $msg = new ApiRawMessage( 'mainpage' );
+               $msg = new ApiRawMessage( [ 'parentheses', 'foobar' ] );
                $this->assertSame( $msg, ApiMessage::create( $msg ) );
        }
 
index 5358f29..23fa7bc 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 
-use MediaWiki\MediaWikiServices;
-
 class ApiOpenSearchTest extends MediaWikiTestCase {
        public function testGetAllowedParams() {
                $config = $this->replaceSearchEngineConfig();
index 0a577c1..ef70626 100644 (file)
@@ -30,7 +30,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->any() )
                        ->method( 'getEffectiveGroups' )->will( $this->returnValue( [ '*', 'user' ] ) );
                $this->mUserMock->expects( $this->any() )
-                       ->method( 'isAllowed' )->will( $this->returnValue( true ) );
+                       ->method( 'isAllowedAny' )->will( $this->returnValue( true ) );
 
                // Set up callback for User::getOptionKinds
                $this->mUserMock->expects( $this->any() )
@@ -146,7 +146,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         */
        public function testNoToken() {
                $request = $this->getSampleRequest( [ 'token' => null ] );
@@ -163,13 +163,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        $request = $this->getSampleRequest();
 
                        $this->executeQuery( $request );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'notloggedin', $e->getCodeString() );
-                       $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
-
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $e, 'notloggedin' ) );
                        return;
                }
-               $this->fail( "UsageException was not thrown" );
+               $this->fail( "ApiUsageException was not thrown" );
        }
 
        public function testNoOptionname() {
@@ -177,13 +175,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        $request = $this->getSampleRequest( [ 'optionvalue' => '1' ] );
 
                        $this->executeQuery( $request );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'nooptionname', $e->getCodeString() );
-                       $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
-
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $e, 'nooptionname' ) );
                        return;
                }
-               $this->fail( "UsageException was not thrown" );
+               $this->fail( "ApiUsageException was not thrown" );
        }
 
        public function testNoChanges() {
@@ -200,13 +196,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        $request = $this->getSampleRequest();
 
                        $this->executeQuery( $request );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'nochanges', $e->getCodeString() );
-                       $this->assertEquals( 'No changes were requested', $e->getMessage() );
-
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $e, 'nochanges' ) );
                        return;
                }
-               $this->fail( "UsageException was not thrown" );
+               $this->fail( "ApiUsageException was not thrown" );
        }
 
        public function testReset() {
@@ -400,7 +394,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'options' => 'success',
                        'warnings' => [
                                'options' => [
-                                       'warnings' => "Validation error for 'special': cannot be set by this module"
+                                       'warnings' => "Validation error for \"special\": cannot be set by this module."
                                ]
                        ]
                ], $response );
@@ -423,7 +417,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'options' => 'success',
                        'warnings' => [
                                'options' => [
-                                       'warnings' => "Validation error for 'unknownOption': not a valid preference"
+                                       'warnings' => "Validation error for \"unknownOption\": not a valid preference."
                                ]
                        ]
                ], $response );
index b72a4f8..f01a670 100644 (file)
@@ -23,12 +23,10 @@ class ApiParseTest extends ApiTestCase {
                                'page' => $somePage ] );
 
                        $this->fail( "API did not return an error when parsing a nonexistent page" );
-               } catch ( UsageException $ex ) {
-                       $this->assertEquals(
-                               'missingtitle',
-                               $ex->getCodeString(),
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'missingtitle' ),
                                "Parse request for nonexistent page must give 'missingtitle' error: "
-                                       . var_export( $ex->getMessageArray(), true )
+                                       . var_export( self::getErrorFormatter()->arrayFromStatus( $ex->getStatusValue() ), true )
                        );
                }
        }
index 7687236..9f28aaf 100644 (file)
@@ -13,7 +13,7 @@ class ApiQueryAllPagesTest extends ApiTestCase {
        }
 
        /**
-        *Test bug 25702
+        *Test T27702
         *Prefixes of API search requests are not handled with case sensitivity and may result
         *in wrong search results
         */
index eaeb3ae..0a2cd83 100644 (file)
@@ -1498,7 +1498,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $otherUser->setOption( 'watchlisttoken', '1234567890' );
                $otherUser->saveSettings();
 
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRequest( [
                        'wlowner' => $otherUser->getName(),
@@ -1507,7 +1507,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testOwnerAndTokenParams_noWatchlistTokenSet() {
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRequest( [
                        'wlowner' => $this->getNonLoggedInTestUser()->getName(),
index d6f315d..0f01664 100644 (file)
@@ -503,7 +503,7 @@ class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
                $otherUser->setOption( 'watchlisttoken', '1234567890' );
                $otherUser->saveSettings();
 
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRawRequest( [
                        'wrowner' => $otherUser->getName(),
@@ -512,7 +512,7 @@ class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
        }
 
        public function testOwnerAndTokenParams_userHasNoWatchlistToken() {
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRawRequest( [
                        'wrowner' => $this->getNotLoggedInTestUser()->getName(),
index d8282be..a4ca8a1 100644 (file)
@@ -43,9 +43,9 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertEquals( $out['status'], 'Success' );
                $this->assertArrayHasKey( 'items', $out );
                $item = $out['items'][0];
-               $this->assertArrayHasKey( 'userhidden', $item );
-               $this->assertArrayHasKey( 'commenthidden', $item );
-               $this->assertArrayHasKey( 'texthidden', $item );
+               $this->assertTrue( $item['userhidden'], 'userhidden' );
+               $this->assertTrue( $item['commenthidden'], 'commenthidden' );
+               $this->assertTrue( $item['texthidden'], 'texthidden' );
                $this->assertEquals( $item['id'], $revid );
 
                // Now check that that revision was actually hidden
@@ -70,9 +70,9 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertArrayHasKey( 'items', $out2 );
                $item = $out2['items'][0];
 
-               $this->assertArrayNotHasKey( 'userhidden', $item );
-               $this->assertArrayNotHasKey( 'commenthidden', $item );
-               $this->assertArrayNotHasKey( 'texthidden', $item );
+               $this->assertFalse( $item['userhidden'], 'userhidden' );
+               $this->assertFalse( $item['commenthidden'], 'commenthidden' );
+               $this->assertFalse( $item['texthidden'], 'texthidden' );
 
                $this->assertEquals( $item['id'], $revid );
 
@@ -107,11 +107,11 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertEquals( $out['status'], 'Success' );
                $this->assertArrayHasKey( 'items', $out );
                $item = $out['items'][0];
-               // Check it has userhidden & texthidden keys
-               // but no commenthidden key
-               $this->assertArrayHasKey( 'userhidden', $item );
-               $this->assertArrayNotHasKey( 'commenthidden', $item );
-               $this->assertArrayHasKey( 'texthidden', $item );
+               // Check it has userhidden & texthidden
+               // but not commenthidden
+               $this->assertTrue( $item['userhidden'], 'userhidden' );
+               $this->assertFalse( $item['commenthidden'], 'commenthidden' );
+               $this->assertTrue( $item['texthidden'], 'texthidden' );
                $this->assertEquals( $item['id'], $revid );
        }
 }
index 7e1f9d8..6b299c9 100644 (file)
@@ -3,6 +3,8 @@
 abstract class ApiTestCase extends MediaWikiLangTestCase {
        protected static $apiUrl;
 
+       protected static $errorFormatter = null;
+
        /**
         * @var ApiTestContext
         */
@@ -196,6 +198,26 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                return $data[0]['tokens'];
        }
 
+       protected static function getErrorFormatter() {
+               if ( self::$errorFormatter === null ) {
+                       self::$errorFormatter = new ApiErrorFormatter(
+                               new ApiResult( false ),
+                               Language::factory( 'en' ),
+                               'none'
+                       );
+               }
+               return self::$errorFormatter;
+       }
+
+       public static function apiExceptionHasCode( ApiUsageException $ex, $code ) {
+               return (bool)array_filter(
+                       self::getErrorFormatter()->arrayFromStatus( $ex->getStatusValue() ),
+                       function ( $e ) use ( $code ) {
+                               return is_array( $e ) && $e['code'] === $code;
+                       }
+               );
+       }
+
        public function testApiTestGroup() {
                $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) );
                $constraint = PHPUnit_Framework_Assert::logicalOr(
index b63bf2e..971b63c 100644 (file)
@@ -14,7 +14,7 @@ class ApiUnblockTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         */
        public function testWithNoToken() {
                $this->doApiRequest(
index de2b56b..9b79e6c 100644 (file)
@@ -67,9 +67,9 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        $this->doApiRequest( [
                                'action' => 'upload'
                        ] );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
-                       $this->assertEquals( "The token parameter must be set", $e->getMessage() );
+                       $this->assertEquals( 'The "token" parameter must be set', $e->getMessage() );
                }
                $this->assertTrue( $exception, "Got exception" );
        }
@@ -83,7 +83,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        $this->doApiRequestWithToken( [
                                'action' => 'upload',
                        ], $session, self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "One of the parameters filekey, file, url is required",
                                $e->getMessage() );
@@ -129,7 +129,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -168,7 +168,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $exception = false;
                try {
                        $this->doApiRequestWithToken( $params, $session, self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $this->assertContains( 'The file you submitted was empty', $e->getMessage() );
                        $exception = true;
                }
@@ -218,7 +218,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -235,7 +235,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -289,7 +289,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -314,7 +314,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -371,7 +371,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertFalse( $exception );
@@ -400,12 +400,12 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertFalse( $exception, "No UsageException exception." );
+               $this->assertFalse( $exception, "No ApiUsageException exception." );
 
                // clean up
                $this->deleteFileByFileName( $fileName );
@@ -476,7 +476,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                                try {
                                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                                self::$users['uploader']->getUser() );
-                               } catch ( UsageException $e ) {
+                               } catch ( ApiUsageException $e ) {
                                        $this->markTestIncomplete( $e->getMessage() );
                                }
                                // Make sure we got a valid chunk continue:
@@ -504,7 +504,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        try {
                                list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                        self::$users['uploader']->getUser() );
-                       } catch ( UsageException $e ) {
+                       } catch ( ApiUsageException $e ) {
                                $this->markTestIncomplete( $e->getMessage() );
                        }
                        // Make sure we got a valid chunk continue:
@@ -544,7 +544,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
index 19afc14..7b91094 100644 (file)
@@ -16,8 +16,6 @@ class ApiWatchTest extends ApiTestCase {
                return $this->getTokenList( self::$users['sysop'] );
        }
 
-       /**
-        */
        public function testWatchEdit() {
                $tokens = $this->getTokens();
 
@@ -74,8 +72,6 @@ class ApiWatchTest extends ApiTestCase {
                return $data;
        }
 
-       /**
-        */
        public function testWatchProtect() {
                $tokens = $this->getTokens();
 
@@ -92,8 +88,6 @@ class ApiWatchTest extends ApiTestCase {
                $this->assertArrayHasKey( 'edit', $data[0]['protect']['protections'][0] );
        }
 
-       /**
-        */
        public function testGetRollbackToken() {
                $this->getTokens();
 
@@ -146,11 +140,11 @@ class ApiWatchTest extends ApiTestCase {
 
                        $this->assertArrayHasKey( 'rollback', $data[0] );
                        $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
-               } catch ( UsageException $ue ) {
-                       if ( $ue->getCodeString() == 'onlyauthor' ) {
+               } catch ( ApiUsageException $ue ) {
+                       if ( self::apiExceptionHasCode( $ue, 'onlyauthor' ) ) {
                                $this->markTestIncomplete( "Only one author to 'Help:UTPage', cannot test rollback" );
                        } else {
-                               $this->fail( "Received error '" . $ue->getCodeString() . "'" );
+                               $this->fail( "Received error '" . $ue->getMessage() . "'" );
                        }
                }
        }
index d7db538..1407c10 100644 (file)
@@ -9,7 +9,11 @@ class MockApi extends ApiBase {
        public function __construct() {
        }
 
-       public function setWarning( $warning ) {
+       public function getModulePath() {
+               return $this->getModuleName();
+       }
+
+       public function addWarning( $warning, $code = null, $data = null ) {
                $this->warnings[] = $warning;
        }
 
index f5b50e5..9915a38 100644 (file)
@@ -12,4 +12,8 @@ class MockApiQueryBase extends ApiQueryBase {
        public function getModuleName() {
                return $this->name;
        }
+
+       public function getModulePath() {
+               return 'query+' . $this->getModuleName();
+       }
 }
index 0028bbb..3aa1db3 100644 (file)
@@ -133,12 +133,10 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
                        $printer->closePrinter();
                        ob_end_clean();
                        $this->fail( 'Expected exception not thrown' );
-               } catch ( UsageException $ex ) {
+               } catch ( ApiUsageException $ex ) {
                        ob_end_clean();
-                       $this->assertSame(
-                               'This response cannot be represented using format=php. ' .
-                                       'See https://phabricator.wikimedia.org/T68776',
-                               $ex->getMessage(),
+                       $this->assertTrue(
+                               $ex->getStatusValue()->hasMessage( 'apierror-formatphp' ),
                                'Expected exception'
                        );
                }
index 3fef0b0..0f8c8ee 100644 (file)
@@ -105,11 +105,11 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
                                [ 'includexmlnamespace' => 1 ] ],
 
                        // xslt param
-                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Invalid or non-existent stylesheet specified</xml></warnings></api>',
+                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Invalid or non-existent stylesheet specified.</xml></warnings></api>',
                                [ 'xslt' => 'DoesNotExist' ] ],
                        [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should be in the MediaWiki namespace.</xml></warnings></api>',
                                [ 'xslt' => 'ApiFormatXmlTest' ] ],
-                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should have .xsl extension.</xml></warnings></api>',
+                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should have &quot;.xsl&quot; extension.</xml></warnings></api>',
                                [ 'xslt' => 'MediaWiki:ApiFormatXmlTest' ] ],
                        [ [],
                                '<?xml version="1.0"?><?xml-stylesheet href="' .
index e5971b4..fbc794e 100644 (file)
@@ -325,7 +325,7 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
        }
 
        /**
-        * Test bug 51821
+        * Test T53821
         */
        public function testGeneratorRedirects() {
                $this->editPage( 'AQBT-Target', 'test' );
index 8cb2327..8026e54 100644 (file)
@@ -99,11 +99,11 @@ class ApiQueryTest extends ApiTestCase {
                $exceptionCaught = false;
                try {
                        $this->assertEquals( $expected, $api->titlePartToKey( $titlePart, $namespace ) );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exceptionCaught = true;
                }
                $this->assertEquals( $expectException, $exceptionCaught,
-                       'UsageException thrown by titlePartToKey' );
+                       'ApiUsageException thrown by titlePartToKey' );
        }
 
        function provideTestTitlePartToKey() {
@@ -123,21 +123,16 @@ class ApiQueryTest extends ApiTestCase {
         * Test if all classes in the query module manager exists
         */
        public function testClassNamesInModuleManager() {
-               global $wgAutoloadLocalClasses, $wgAutoloadClasses;
-
-               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
-               $classes = $wgAutoloadLocalClasses + $wgAutoloadClasses;
-
                $api = new ApiMain(
                        new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] )
                );
                $queryApi = new ApiQuery( $api, 'query' );
                $modules = $queryApi->getModuleManager()->getNamesWithClasses();
+
                foreach ( $modules as $name => $class ) {
-                       $this->assertArrayHasKey(
-                               $class,
-                               $classes,
-                               'Class ' . $class . ' for api module ' . $name . ' not in autoloader (with exact case)'
+                       $this->assertTrue(
+                               class_exists( $class ),
+                               'Class ' . $class . ' for api module ' . $name . ' does not exist (with exact case)'
                        );
                }
        }
index a1cdf7e..a57682b 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group AuthManager
  * @covers MediaWiki\Auth\AbstractPasswordPrimaryAuthenticationProvider
@@ -26,7 +28,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
-               $provider->setConfig( \ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
                $obj = $providerPriv->getPasswordFactory();
@@ -38,7 +40,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
-               $provider->setConfig( \ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
@@ -56,7 +58,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                );
                $provider->setConfig( new \MultiConfig( [
                        $config,
-                       \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                ] ) );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
@@ -105,7 +107,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
-               $provider->setConfig( \ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
@@ -121,7 +123,8 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                ] );
 
                $manager = new AuthManager(
-                       new \FauxRequest(), \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       new \FauxRequest(),
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
 
                $provider = $this->getMockForAbstractClass(
index d482453..b96455e 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group AuthManager
  * @group Database
@@ -17,7 +19,8 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                $request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) );
 
                $manager = new AuthManager(
-                       $request, \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       $request,
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
 
                $provider = new LegacyHookPreAuthenticationProvider();
index caf1680..72a03c3 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group AuthManager
  * @group Database
@@ -28,7 +30,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                }
                $config = new \MultiConfig( [
                        $this->config,
-                       \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                ] );
 
                if ( !$this->manager ) {
@@ -449,7 +451,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $changeReq->password = $newpass;
                $provider->providerChangeAuthenticationData( $changeReq );
 
-               if ( $loginOnly ) {
+               if ( $loginOnly && $changed ) {
                        $old = 'fail';
                        $new = 'fail';
                        $expectExpiry = null;
index d4ebe34..bc7d65e 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -32,7 +33,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                }
                $config = new \MultiConfig( [
                        $this->config,
-                       \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                ] );
 
                if ( !$this->manager ) {
@@ -520,10 +521,6 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $provider = $this->getProvider( [ 'emailEnabled' => false ] );
                $status = $provider->providerAllowsAuthenticationDataChange( $req, true );
                $this->assertEquals( \StatusValue::newFatal( 'passwordreset-emaildisabled' ), $status );
-               $req->hasBackchannel = true;
-               $status = $provider->providerAllowsAuthenticationDataChange( $req, true );
-               $this->assertFalse( $status->hasMessage( 'passwordreset-emaildisabled' ) );
-               $req->hasBackchannel = false;
 
                $provider = $this->getProvider( [ 'passwordReminderResendTime' => 10 ] );
                $status = $provider->providerAllowsAuthenticationDataChange( $req, true );
@@ -686,18 +683,10 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $provider = $this->getProvider( [ 'emailEnabled' => false ] );
                $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
                $this->assertEquals( \StatusValue::newFatal( 'emaildisabled' ), $status );
-               $req->hasBackchannel = true;
-               $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
-               $this->assertFalse( $status->hasMessage( 'emaildisabled' ) );
-               $req->hasBackchannel = false;
 
                $provider = $this->getProvider( [ 'emailEnabled' => true ] );
                $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
                $this->assertEquals( \StatusValue::newFatal( 'noemailcreate' ), $status );
-               $req->hasBackchannel = true;
-               $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
-               $this->assertFalse( $status->hasMessage( 'noemailcreate' ) );
-               $req->hasBackchannel = false;
 
                $user->setEmail( 'test@localhost.localdomain' );
                $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
index 20f4cbc..2f3e27c 100644 (file)
@@ -226,7 +226,7 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider->postAuthentication( \User::newFromName( 'SomeUser' ),
                        AuthenticationResponse::newPass() );
                $this->assertSame( [
-                       [ \Psr\Log\LogLevel::ERROR, 'throttler data not found for {user}' ],
+                       [ \Psr\Log\LogLevel::INFO, 'throttler data not found for {user}' ],
                ], $logger->getBuffer() );
        }
 }
index 9c723c0..e5bb237 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use MediaWiki\MediaWikiServices;
 
 /**
  * @group Database
@@ -39,7 +40,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @covers GenderCache::getGenderOf
         */
        public function testUserName( $userKey, $expectedGender ) {
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
@@ -53,7 +54,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         */
        public function testUserObjects( $userKey, $expectedGender ) {
                $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
@@ -79,7 +80,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         */
        public function testStripSubpages( $userKey, $expectedGender ) {
                $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $gender = $genderCache->getGenderOf( "$username/subpage" );
                $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
        }
index 697eb2d..5eed01c 100644 (file)
@@ -61,21 +61,21 @@ class LocalisationCacheTest extends MediaWikiTestCase {
 
        public function testRecacheFallbacks() {
                $lc = $this->getMockLocalisationCache();
-               $lc->recache( 'uk' );
+               $lc->recache( 'ba' );
                $this->assertEquals(
                        [
-                               'present-uk' => 'uk',
+                               'present-ba' => 'ba',
                                'present-ru' => 'ru',
                                'present-en' => 'en',
                        ],
-                       $lc->getItem( 'uk', 'messages' ),
+                       $lc->getItem( 'ba', 'messages' ),
                        'Fallbacks are only used to fill missing data'
                );
        }
 
        public function testRecacheFallbacksWithHooks() {
                // Use hook to provide updates for messages. This is what the
-               // LocalisationUpdate extension does. See bug 68781.
+               // LocalisationUpdate extension does. See T70781.
                $this->mergeMwGlobalArrayValue( 'wgHooks', [
                        'LocalisationCacheRecacheFallback' => [
                                function (
@@ -84,7 +84,7 @@ class LocalisationCacheTest extends MediaWikiTestCase {
                                        array &$cache
                                ) {
                                        if ( $code === 'ru' ) {
-                                               $cache['messages']['present-uk'] = 'ru-override';
+                                               $cache['messages']['present-ba'] = 'ru-override';
                                                $cache['messages']['present-ru'] = 'ru-override';
                                                $cache['messages']['present-en'] = 'ru-override';
                                        }
@@ -93,14 +93,14 @@ class LocalisationCacheTest extends MediaWikiTestCase {
                ] );
 
                $lc = $this->getMockLocalisationCache();
-               $lc->recache( 'uk' );
+               $lc->recache( 'ba' );
                $this->assertEquals(
                        [
-                               'present-uk' => 'uk',
+                               'present-ba' => 'ba',
                                'present-ru' => 'ru-override',
                                'present-en' => 'ru-override',
                        ],
-                       $lc->getItem( 'uk', 'messages' ),
+                       $lc->getItem( 'ba', 'messages' ),
                        'Updates provided by hooks follow the normal fallback order.'
                );
        }
index bd744c0..b03eeba 100644 (file)
@@ -92,13 +92,44 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                        // Existing message with customizations on the fallbacks
                        [ 'sunday', 'ab', 'амҽыш' ],
 
-                       // bug 46579
+                       // T48579
                        [ 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none' ],
                        // UI language different from content language should only use de/none as last option
                        [ 'FallbackLanguageTest-NoDervContLang', 'fit', 'de/none' ],
                ];
        }
 
+       public function testReplaceMsg() {
+               global $wgContLang;
+
+               $messageCache = MessageCache::singleton();
+               $message = 'go';
+               $uckey = $wgContLang->ucfirst( $message );
+               $oldText = $messageCache->get( $message ); // "Ausführen"
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->startAtomic( __METHOD__ ); // simulate request and block deferred updates
+               $messageCache->replace( $uckey, 'Allez!' );
+               $this->assertEquals( 'Allez!',
+                       $messageCache->getMsgFromNamespace( $uckey, 'de' ),
+                       'Updates are reflected in-process immediately' );
+               $this->assertEquals( 'Allez!',
+                       $messageCache->get( $message ),
+                       'Updates are reflected in-process immediately' );
+               $this->makePage( 'Go', 'de', 'Race!' );
+               $dbw->endAtomic( __METHOD__ );
+
+               $this->assertEquals( 0,
+                       DeferredUpdates::pendingUpdatesCount(),
+                       'Post-commit deferred update triggers a run of all updates' );
+
+               $this->assertEquals( 'Race!', $messageCache->get( $message ), 'Correct final contents' );
+
+               $this->makePage( 'Go', 'de', $oldText );
+               $messageCache->replace( $uckey, $oldText ); // deferred update runs immediately
+               $this->assertEquals( $oldText, $messageCache->get( $message ), 'Content restored' );
+       }
+
        /**
         * There's a fallback case where the message key is given as fully qualified -- this
         * should ignore the passed $lang and use the language from the key
index ccabab6..4ff1eb8 100644 (file)
@@ -69,19 +69,12 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
 
                $diff = [ 'curid' => 5, 'diff' => 191, 'oldid' => 190 ];
                $cur = [ 'curid' => 5, 'diff' => 0, 'oldid' => 191 ];
-               $this->assertQueryLink( 'cur', $cur, $cacheEntry->curlink, 'cur link' );
-               $this->assertQueryLink( 'prev', $diff, $cacheEntry->lastlink, 'prev link' );
-               $this->assertQueryLink( 'diff', $diff, $cacheEntry->difflink, 'diff link' );
+               $this->assertQueryLink( 'cur', $cur, $cacheEntry->curlink );
+               $this->assertQueryLink( 'prev', $diff, $cacheEntry->lastlink );
+               $this->assertQueryLink( 'diff', $diff, $cacheEntry->difflink );
        }
 
        public function testNewForDeleteChange() {
-               $expected = [
-                       'title' => 'Abc',
-                       'user' => 'TestRecentChangesUser',
-                       'timestamp' => '21:21',
-                       'numberofWatchingusers' => 0,
-                       'unpatrolled' => false
-               ];
                $user = $this->getMutableTestUser()->getUser();
                $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
                        'delete',
index f42cb95..8a76618 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class ConfigFactoryTest extends MediaWikiTestCase {
 
        /**
@@ -140,7 +142,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
        public function testGetDefaultInstance() {
                // NOTE: the global config factory returned here has been overwritten
                // for operation in test mode. It may not reflect LocalSettings.
-               $factory = ConfigFactory::getDefaultInstance();
+               $factory = MediaWikiServices::getInstance()->getConfigFactory();
                $this->assertInstanceOf( 'Config', $factory->makeConfig( 'main' ) );
        }
 
index 39948ca..ae66253 100644 (file)
@@ -367,22 +367,6 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertFalse( $handler->supportsDirectEditing(), 'direct editing is not supported' );
        }
 
-       /**
-        * @covers ContentHandler::runLegacyHooks
-        */
-       public function testRunLegacyHooks() {
-               Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
-
-               $content = new WikitextContent( 'test text' );
-               $ok = ContentHandler::runLegacyHooks(
-                       'testRunLegacyHooks',
-                       [ 'foo', &$content, 'bar' ]
-               );
-
-               $this->assertTrue( $ok, "runLegacyHooks should have returned true" );
-               $this->assertEquals( "TEST TEXT", $content->getNativeData() );
-       }
-
        public static function dummyHookHandler( $foo, &$text, $bar ) {
                if ( $text === null || $text === false ) {
                        return false;
@@ -425,6 +409,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertArrayHasKey( 'external_link', $fields );
                $this->assertArrayHasKey( 'outgoing_link', $fields );
                $this->assertArrayHasKey( 'template', $fields );
+               $this->assertArrayHasKey( 'content_model', $fields );
        }
 
        private function newSearchEngine() {
@@ -461,6 +446,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertArrayHasKey( 'language', $data );
                $this->assertArrayHasKey( 'testDataField', $data );
                $this->assertEquals( 'test content', $data['testDataField'] );
+               $this->assertEquals( 'wikitext', $data['content_model'] );
        }
 
        /**
@@ -475,4 +461,13 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertContains( 'one who smiths', $out->getRawText() );
        }
 
+       /**
+        * @covers ContentHandler::getContentModels
+        */
+       public function testGetContentModelsHook() {
+               $this->setTemporaryHook( 'GetContentModels', function ( &$models ) {
+                       $models[] = 'Ferrari';
+               } );
+               $this->assertContains( 'Ferrari', ContentHandler::getContentModels() );
+       }
 }
index dbb126f..b95462a 100644 (file)
  * @copyright © 2013 Wikimedia Foundation Inc.
  */
 
+use Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\MySQLMasterPos;
+
 /**
  * Fake class around abstract class so we can call concrete methods.
  */
@@ -116,7 +120,7 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
        /**
         * Feeds testAddIdentifierQuotes
         *
-        * Named per bug 20281 convention.
+        * Named per T22281 convention.
         */
        function provideDiapers() {
                return [
@@ -170,7 +174,7 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
        }
 
        function getMockForViews() {
-               $db = $this->getMockBuilder( 'DatabaseMysql' )
+               $db = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->setMethods( [ 'fetchRow', 'query' ] )
                        ->getMock();
@@ -314,7 +318,7 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
         * @dataProvider provideLagAmounts
         */
        function testPtHeartbeat( $lag ) {
-               $db = $this->getMockBuilder( 'DatabaseMysql' )
+               $db = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->setMethods( [
                                'getLagDetectionMethod', 'getHeartbeatData', 'getMasterServerInfo' ] )
index 656e661..57754bc 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LikeMatch;
+
 /**
  * Test the abstract database layer
  * This is a non DBMS depending test.
index 172d686..10bf028 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\Blob;
+
 class DatabaseSqliteMock extends DatabaseSqlite {
        private $lastQuery;
 
index c5603c4..ce05e33 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\DatabaseDomain;
+
 /**
  * Helper for testing the methods from the Database class
  * @since 1.22
index d8773f8..4b857ce 100644 (file)
@@ -1,4 +1,10 @@
 <?php
+
+use Wikimedia\Rdbms\LBFactorySimple;
+use Wikimedia\Rdbms\LBFactoryMulti;
+use Wikimedia\Rdbms\ChronologyProtector;
+use Wikimedia\Rdbms\MySQLMasterPos;
+
 /**
  * Holds tests for LBFactory abstract MediaWiki class.
  *
@@ -29,7 +35,7 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @dataProvider getLBFactoryClassProvider
         */
        public function testGetLBFactoryClass( $expected, $deprecated ) {
-               $mockDB = $this->getMockBuilder( 'DatabaseMysql' )
+               $mockDB = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -51,9 +57,12 @@ class LBFactoryTest extends MediaWikiTestCase {
        public function getLBFactoryClassProvider() {
                return [
                        # Format: new class, old class
-                       [ 'LBFactorySimple', 'LBFactory_Simple' ],
-                       [ 'LBFactorySingle', 'LBFactory_Single' ],
-                       [ 'LBFactoryMulti', 'LBFactory_Multi' ],
+                       [ Wikimedia\Rdbms\LBFactorySimple::class, 'LBFactory_Simple' ],
+                       [ Wikimedia\Rdbms\LBFactorySingle::class, 'LBFactory_Single' ],
+                       [ Wikimedia\Rdbms\LBFactoryMulti::class, 'LBFactory_Multi' ],
+                       [ Wikimedia\Rdbms\LBFactorySimple::class, 'LBFactorySimple' ],
+                       [ Wikimedia\Rdbms\LBFactorySingle::class, 'LBFactorySingle' ],
+                       [ Wikimedia\Rdbms\LBFactoryMulti::class, 'LBFactoryMulti' ],
                ];
        }
 
@@ -178,7 +187,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                $mPos = new MySQLMasterPos( 'db1034-bin.000976', '843431247' );
 
                $now = microtime( true );
-               $mockDB = $this->getMockBuilder( 'DatabaseMysql' )
+               $mockDB = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mockDB->method( 'writesOrCallbacksPending' )->willReturn( true );
index 602a175..9e4dbea 100644 (file)
@@ -66,13 +66,13 @@ EOT
                $this->assertNotEquals(
                        '',
                        $this->updateText( $text ),
-                       'Bug 18609'
+                       'T20609'
                );
        }
 
        /**
         * @covers SearchUpdate::updateText
-        * Test bug 32712
+        * Test T34712
         * Test if unicode quotes in article links make its search index empty
         */
        public function testUnicodeLinkSearchIndexError() {
index 8366541..6c93c79 100644 (file)
@@ -112,7 +112,8 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
        }
 
        protected function getMocks() {
-               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+               $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
+                       ->disableOriginalClone()
                        ->disableOriginalConstructor()
                        ->getMock();
 
index 92a54fa..d3f9374 100644 (file)
@@ -25,7 +25,7 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                        ]
                ] );
 
-               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+               $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
 
index 4dc8fec..337c65c 100644 (file)
@@ -15,7 +15,7 @@ class StoreBatchTest extends MediaWikiTestCase {
                global $wgFileBackends;
                parent::setUp();
 
-               # Forge a FSRepo object to not have to rely on local wiki settings
+               # Forge a FileRepo object to not have to rely on local wiki settings
                $tmpPrefix = $this->getNewTempDirectory();
                if ( $this->getCliArg( 'use-filebackend' ) ) {
                        $name = $this->getCliArg( 'use-filebackend' );
@@ -63,7 +63,7 @@ class StoreBatchTest extends MediaWikiTestCase {
         * @param string $originalName The title of the image
         * @param string $srcPath The filepath or virtual URL
         * @param int $flags Flags to pass into repo::store().
-        * @return FileRepoStatus
+        * @return Status
         */
        private function storeit( $originalName, $srcPath, $flags ) {
                $hashPath = $this->repo->getHashPath( $originalName );
index dd5b58b..f97716b 100644 (file)
@@ -51,7 +51,7 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
 
        public function testValidateAllowsOnlyKnownTags() {
                $field = new HTMLCheckMatrix( self::$defaultOptions );
-               $this->assertInternalType( 'string', $this->validate( $field, [ 'foo' ] ) );
+               $this->assertInstanceOf( Message::class, $this->validate( $field, [ 'foo' ] ) );
        }
 
        public function testValidateAcceptsPartialTagList() {
diff --git a/tests/phpunit/includes/http/HttpTest.php b/tests/phpunit/includes/http/HttpTest.php
new file mode 100644 (file)
index 0000000..a598d13
--- /dev/null
@@ -0,0 +1,534 @@
+<?php
+
+/**
+ * @group Http
+ */
+class HttpTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider cookieDomains
+        * @covers Cookie::validateCookieDomain
+        */
+       public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
+               if ( $origin ) {
+                       $ok = Cookie::validateCookieDomain( $domain, $origin );
+                       $msg = "$domain against origin $origin";
+               } else {
+                       $ok = Cookie::validateCookieDomain( $domain );
+                       $msg = "$domain";
+               }
+               $this->assertEquals( $expected, $ok, $msg );
+       }
+
+       public static function cookieDomains() {
+               return [
+                       [ false, "org" ],
+                       [ false, ".org" ],
+                       [ true, "wikipedia.org" ],
+                       [ true, ".wikipedia.org" ],
+                       [ false, "co.uk" ],
+                       [ false, ".co.uk" ],
+                       [ false, "gov.uk" ],
+                       [ false, ".gov.uk" ],
+                       [ true, "supermarket.uk" ],
+                       [ false, "uk" ],
+                       [ false, ".uk" ],
+                       [ false, "127.0.0." ],
+                       [ false, "127." ],
+                       [ false, "127.0.0.1." ],
+                       [ true, "127.0.0.1" ],
+                       [ false, "333.0.0.1" ],
+                       [ true, "example.com" ],
+                       [ false, "example.com." ],
+                       [ true, ".example.com" ],
+
+                       [ true, ".example.com", "www.example.com" ],
+                       [ false, "example.com", "www.example.com" ],
+                       [ true, "127.0.0.1", "127.0.0.1" ],
+                       [ false, "127.0.0.1", "localhost" ],
+               ];
+       }
+
+       /**
+        * Test Http::isValidURI()
+        * T29854 : Http::isValidURI is too lax
+        * @dataProvider provideURI
+        * @covers Http::isValidURI
+        */
+       public function testIsValidUri( $expect, $URI, $message = '' ) {
+               $this->assertEquals(
+                       $expect,
+                       (bool)Http::isValidURI( $URI ),
+                       $message
+               );
+       }
+
+       /**
+        * @covers Http::getProxy
+        */
+       public function testGetProxy() {
+               $this->setMwGlobals( 'wgHTTPProxy', 'proxy.domain.tld' );
+               $this->assertEquals(
+                       'proxy.domain.tld',
+                       Http::getProxy()
+               );
+       }
+
+       /**
+        * Feeds URI to test a long regular expression in Http::isValidURI
+        */
+       public static function provideURI() {
+               /** Format: 'boolean expectation', 'URI to test', 'Optional message' */
+               return [
+                       [ false, '¿non sens before!! http://a', 'Allow anything before URI' ],
+
+                       # (http|https) - only two schemes allowed
+                       [ true, 'http://www.example.org/' ],
+                       [ true, 'https://www.example.org/' ],
+                       [ true, 'http://www.example.org', 'URI without directory' ],
+                       [ true, 'http://a', 'Short name' ],
+                       [ true, 'http://étoile', 'Allow UTF-8 in hostname' ], # 'étoile' is french for 'star'
+                       [ false, '\\host\directory', 'CIFS share' ],
+                       [ false, 'gopher://host/dir', 'Reject gopher scheme' ],
+                       [ false, 'telnet://host', 'Reject telnet scheme' ],
+
+                       # :\/\/ - double slashes
+                       [ false, 'http//example.org', 'Reject missing colon in protocol' ],
+                       [ false, 'http:/example.org', 'Reject missing slash in protocol' ],
+                       [ false, 'http:example.org', 'Must have two slashes' ],
+                       # Following fail since hostname can be made of anything
+                       [ false, 'http:///example.org', 'Must have exactly two slashes, not three' ],
+
+                       # (\w+:{0,1}\w*@)? - optional user:pass
+                       [ true, 'http://user@host', 'Username provided' ],
+                       [ true, 'http://user:@host', 'Username provided, no password' ],
+                       [ true, 'http://user:pass@host', 'Username and password provided' ],
+
+                       # (\S+) - host part is made of anything not whitespaces
+                       // commented these out in order to remove @group Broken
+                       // @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
+                       // [ false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ],
+                       // [ false, 'http://exam:ple.org/', 'hostname can not use colons!' ],
+
+                       # (:[0-9]+)? - port number
+                       [ true, 'http://example.org:80/' ],
+                       [ true, 'https://example.org:80/' ],
+                       [ true, 'http://example.org:443/' ],
+                       [ true, 'https://example.org:443/' ],
+
+                       # Part after the hostname is / or / with something else
+                       [ true, 'http://example/#' ],
+                       [ true, 'http://example/!' ],
+                       [ true, 'http://example/:' ],
+                       [ true, 'http://example/.' ],
+                       [ true, 'http://example/?' ],
+                       [ true, 'http://example/+' ],
+                       [ true, 'http://example/=' ],
+                       [ true, 'http://example/&' ],
+                       [ true, 'http://example/%' ],
+                       [ true, 'http://example/@' ],
+                       [ true, 'http://example/-' ],
+                       [ true, 'http://example//' ],
+                       [ true, 'http://example/&' ],
+
+                       # Fragment
+                       [ true, 'http://exam#ple.org', ], # This one is valid, really!
+                       [ true, 'http://example.org:80#anchor' ],
+                       [ true, 'http://example.org/?id#anchor' ],
+                       [ true, 'http://example.org/?#anchor' ],
+
+                       [ false, 'http://a ¿non !!sens after', 'Allow anything after URI' ],
+               ];
+       }
+
+       /**
+        * 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).
+        */
+       public function testRelativeRedirections() {
+               $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!" )
+               );
+       }
+
+       /**
+        * Constant values are from PHP 5.3.28 using cURL 7.24.0
+        * @see https://secure.php.net/manual/en/curl.constants.php
+        *
+        * All constant values are present so that developers don’t need to remember
+        * to add them if added at a later date. The commented out constants were
+        * not found anywhere in the MediaWiki core code.
+        *
+        * Commented out constants that were not available in:
+        * HipHop VM 3.3.0 (rel)
+        * Compiler: heads/master-0-g08810d920dfff59e0774cf2d651f92f13a637175
+        * Repo schema: 3214fc2c684a4520485f715ee45f33f2182324b1
+        * Extension API: 20140829
+        *
+        * Commented out constants that were removed in PHP 5.6.0
+        *
+        * @covers CurlHttpRequest::execute
+        */
+       public function provideCurlConstants() {
+               return [
+                       [ 'CURLAUTH_ANY' ],
+                       [ 'CURLAUTH_ANYSAFE' ],
+                       [ 'CURLAUTH_BASIC' ],
+                       [ 'CURLAUTH_DIGEST' ],
+                       [ 'CURLAUTH_GSSNEGOTIATE' ],
+                       [ 'CURLAUTH_NTLM' ],
+                       // [ 'CURLCLOSEPOLICY_CALLBACK' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_OLDEST' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_SLOWEST' ], // removed in PHP 5.6.0
+                       [ 'CURLE_ABORTED_BY_CALLBACK' ],
+                       [ 'CURLE_BAD_CALLING_ORDER' ],
+                       [ 'CURLE_BAD_CONTENT_ENCODING' ],
+                       [ 'CURLE_BAD_FUNCTION_ARGUMENT' ],
+                       [ 'CURLE_BAD_PASSWORD_ENTERED' ],
+                       [ 'CURLE_COULDNT_CONNECT' ],
+                       [ 'CURLE_COULDNT_RESOLVE_HOST' ],
+                       [ 'CURLE_COULDNT_RESOLVE_PROXY' ],
+                       [ 'CURLE_FAILED_INIT' ],
+                       [ 'CURLE_FILESIZE_EXCEEDED' ],
+                       [ 'CURLE_FILE_COULDNT_READ_FILE' ],
+                       [ 'CURLE_FTP_ACCESS_DENIED' ],
+                       [ 'CURLE_FTP_BAD_DOWNLOAD_RESUME' ],
+                       [ 'CURLE_FTP_CANT_GET_HOST' ],
+                       [ 'CURLE_FTP_CANT_RECONNECT' ],
+                       [ 'CURLE_FTP_COULDNT_GET_SIZE' ],
+                       [ 'CURLE_FTP_COULDNT_RETR_FILE' ],
+                       [ 'CURLE_FTP_COULDNT_SET_ASCII' ],
+                       [ 'CURLE_FTP_COULDNT_SET_BINARY' ],
+                       [ 'CURLE_FTP_COULDNT_STOR_FILE' ],
+                       [ 'CURLE_FTP_COULDNT_USE_REST' ],
+                       [ 'CURLE_FTP_PORT_FAILED' ],
+                       [ 'CURLE_FTP_QUOTE_ERROR' ],
+                       [ 'CURLE_FTP_SSL_FAILED' ],
+                       [ 'CURLE_FTP_USER_PASSWORD_INCORRECT' ],
+                       [ 'CURLE_FTP_WEIRD_227_FORMAT' ],
+                       [ 'CURLE_FTP_WEIRD_PASS_REPLY' ],
+                       [ 'CURLE_FTP_WEIRD_PASV_REPLY' ],
+                       [ 'CURLE_FTP_WEIRD_SERVER_REPLY' ],
+                       [ 'CURLE_FTP_WEIRD_USER_REPLY' ],
+                       [ 'CURLE_FTP_WRITE_ERROR' ],
+                       [ 'CURLE_FUNCTION_NOT_FOUND' ],
+                       [ 'CURLE_GOT_NOTHING' ],
+                       [ 'CURLE_HTTP_NOT_FOUND' ],
+                       [ 'CURLE_HTTP_PORT_FAILED' ],
+                       [ 'CURLE_HTTP_POST_ERROR' ],
+                       [ 'CURLE_HTTP_RANGE_ERROR' ],
+                       [ 'CURLE_LDAP_CANNOT_BIND' ],
+                       [ 'CURLE_LDAP_INVALID_URL' ],
+                       [ 'CURLE_LDAP_SEARCH_FAILED' ],
+                       [ 'CURLE_LIBRARY_NOT_FOUND' ],
+                       [ 'CURLE_MALFORMAT_USER' ],
+                       [ 'CURLE_OBSOLETE' ],
+                       [ 'CURLE_OK' ],
+                       [ 'CURLE_OPERATION_TIMEOUTED' ],
+                       [ 'CURLE_OUT_OF_MEMORY' ],
+                       [ 'CURLE_PARTIAL_FILE' ],
+                       [ 'CURLE_READ_ERROR' ],
+                       [ 'CURLE_RECV_ERROR' ],
+                       [ 'CURLE_SEND_ERROR' ],
+                       [ 'CURLE_SHARE_IN_USE' ],
+                       // [ 'CURLE_SSH' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLE_SSL_CACERT' ],
+                       [ 'CURLE_SSL_CERTPROBLEM' ],
+                       [ 'CURLE_SSL_CIPHER' ],
+                       [ 'CURLE_SSL_CONNECT_ERROR' ],
+                       [ 'CURLE_SSL_ENGINE_NOTFOUND' ],
+                       [ 'CURLE_SSL_ENGINE_SETFAILED' ],
+                       [ 'CURLE_SSL_PEER_CERTIFICATE' ],
+                       [ 'CURLE_TELNET_OPTION_SYNTAX' ],
+                       [ 'CURLE_TOO_MANY_REDIRECTS' ],
+                       [ 'CURLE_UNKNOWN_TELNET_OPTION' ],
+                       [ 'CURLE_UNSUPPORTED_PROTOCOL' ],
+                       [ 'CURLE_URL_MALFORMAT' ],
+                       [ 'CURLE_URL_MALFORMAT_USER' ],
+                       [ 'CURLE_WRITE_ERROR' ],
+                       [ 'CURLFTPAUTH_DEFAULT' ],
+                       [ 'CURLFTPAUTH_SSL' ],
+                       [ 'CURLFTPAUTH_TLS' ],
+                       // [ 'CURLFTPMETHOD_MULTICWD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLFTPMETHOD_NOCWD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLFTPMETHOD_SINGLECWD' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLFTPSSL_ALL' ],
+                       [ 'CURLFTPSSL_CONTROL' ],
+                       [ 'CURLFTPSSL_NONE' ],
+                       [ 'CURLFTPSSL_TRY' ],
+                       // [ 'CURLINFO_CERTINFO' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLINFO_CONNECT_TIME' ],
+                       [ 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ],
+                       [ 'CURLINFO_CONTENT_LENGTH_UPLOAD' ],
+                       [ 'CURLINFO_CONTENT_TYPE' ],
+                       [ 'CURLINFO_EFFECTIVE_URL' ],
+                       [ 'CURLINFO_FILETIME' ],
+                       [ 'CURLINFO_HEADER_OUT' ],
+                       [ 'CURLINFO_HEADER_SIZE' ],
+                       [ 'CURLINFO_HTTP_CODE' ],
+                       [ 'CURLINFO_NAMELOOKUP_TIME' ],
+                       [ 'CURLINFO_PRETRANSFER_TIME' ],
+                       [ 'CURLINFO_PRIVATE' ],
+                       [ 'CURLINFO_REDIRECT_COUNT' ],
+                       [ 'CURLINFO_REDIRECT_TIME' ],
+                       // [ 'CURLINFO_REDIRECT_URL' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLINFO_REQUEST_SIZE' ],
+                       [ 'CURLINFO_SIZE_DOWNLOAD' ],
+                       [ 'CURLINFO_SIZE_UPLOAD' ],
+                       [ 'CURLINFO_SPEED_DOWNLOAD' ],
+                       [ 'CURLINFO_SPEED_UPLOAD' ],
+                       [ 'CURLINFO_SSL_VERIFYRESULT' ],
+                       [ 'CURLINFO_STARTTRANSFER_TIME' ],
+                       [ 'CURLINFO_TOTAL_TIME' ],
+                       [ 'CURLMSG_DONE' ],
+                       [ 'CURLM_BAD_EASY_HANDLE' ],
+                       [ 'CURLM_BAD_HANDLE' ],
+                       [ 'CURLM_CALL_MULTI_PERFORM' ],
+                       [ 'CURLM_INTERNAL_ERROR' ],
+                       [ 'CURLM_OK' ],
+                       [ 'CURLM_OUT_OF_MEMORY' ],
+                       [ 'CURLOPT_AUTOREFERER' ],
+                       [ 'CURLOPT_BINARYTRANSFER' ],
+                       [ 'CURLOPT_BUFFERSIZE' ],
+                       [ 'CURLOPT_CAINFO' ],
+                       [ 'CURLOPT_CAPATH' ],
+                       // [ 'CURLOPT_CERTINFO' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_CLOSEPOLICY' ], // removed in PHP 5.6.0
+                       [ 'CURLOPT_CONNECTTIMEOUT' ],
+                       [ 'CURLOPT_CONNECTTIMEOUT_MS' ],
+                       [ 'CURLOPT_COOKIE' ],
+                       [ 'CURLOPT_COOKIEFILE' ],
+                       [ 'CURLOPT_COOKIEJAR' ],
+                       [ 'CURLOPT_COOKIESESSION' ],
+                       [ 'CURLOPT_CRLF' ],
+                       [ 'CURLOPT_CUSTOMREQUEST' ],
+                       [ 'CURLOPT_DNS_CACHE_TIMEOUT' ],
+                       [ 'CURLOPT_DNS_USE_GLOBAL_CACHE' ],
+                       [ 'CURLOPT_EGDSOCKET' ],
+                       [ 'CURLOPT_ENCODING' ],
+                       [ 'CURLOPT_FAILONERROR' ],
+                       [ 'CURLOPT_FILE' ],
+                       [ 'CURLOPT_FILETIME' ],
+                       [ 'CURLOPT_FOLLOWLOCATION' ],
+                       [ 'CURLOPT_FORBID_REUSE' ],
+                       [ 'CURLOPT_FRESH_CONNECT' ],
+                       [ 'CURLOPT_FTPAPPEND' ],
+                       [ 'CURLOPT_FTPLISTONLY' ],
+                       [ 'CURLOPT_FTPPORT' ],
+                       [ 'CURLOPT_FTPSSLAUTH' ],
+                       [ 'CURLOPT_FTP_CREATE_MISSING_DIRS' ],
+                       // [ 'CURLOPT_FTP_FILEMETHOD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_FTP_SKIP_PASV_IP' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_FTP_SSL' ],
+                       [ 'CURLOPT_FTP_USE_EPRT' ],
+                       [ 'CURLOPT_FTP_USE_EPSV' ],
+                       [ 'CURLOPT_HEADER' ],
+                       [ 'CURLOPT_HEADERFUNCTION' ],
+                       [ 'CURLOPT_HTTP200ALIASES' ],
+                       [ 'CURLOPT_HTTPAUTH' ],
+                       [ 'CURLOPT_HTTPGET' ],
+                       [ 'CURLOPT_HTTPHEADER' ],
+                       [ 'CURLOPT_HTTPPROXYTUNNEL' ],
+                       [ 'CURLOPT_HTTP_VERSION' ],
+                       [ 'CURLOPT_INFILE' ],
+                       [ 'CURLOPT_INFILESIZE' ],
+                       [ 'CURLOPT_INTERFACE' ],
+                       [ 'CURLOPT_IPRESOLVE' ],
+                       // [ 'CURLOPT_KEYPASSWD' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_KRB4LEVEL' ],
+                       [ 'CURLOPT_LOW_SPEED_LIMIT' ],
+                       [ 'CURLOPT_LOW_SPEED_TIME' ],
+                       [ 'CURLOPT_MAXCONNECTS' ],
+                       [ 'CURLOPT_MAXREDIRS' ],
+                       // [ 'CURLOPT_MAX_RECV_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_MAX_SEND_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_NETRC' ],
+                       [ 'CURLOPT_NOBODY' ],
+                       [ 'CURLOPT_NOPROGRESS' ],
+                       [ 'CURLOPT_NOSIGNAL' ],
+                       [ 'CURLOPT_PORT' ],
+                       [ 'CURLOPT_POST' ],
+                       [ 'CURLOPT_POSTFIELDS' ],
+                       [ 'CURLOPT_POSTQUOTE' ],
+                       [ 'CURLOPT_POSTREDIR' ],
+                       [ 'CURLOPT_PRIVATE' ],
+                       [ 'CURLOPT_PROGRESSFUNCTION' ],
+                       // [ 'CURLOPT_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_PROXY' ],
+                       [ 'CURLOPT_PROXYAUTH' ],
+                       [ 'CURLOPT_PROXYPORT' ],
+                       [ 'CURLOPT_PROXYTYPE' ],
+                       [ 'CURLOPT_PROXYUSERPWD' ],
+                       [ 'CURLOPT_PUT' ],
+                       [ 'CURLOPT_QUOTE' ],
+                       [ 'CURLOPT_RANDOM_FILE' ],
+                       [ 'CURLOPT_RANGE' ],
+                       [ 'CURLOPT_READDATA' ],
+                       [ 'CURLOPT_READFUNCTION' ],
+                       // [ 'CURLOPT_REDIR_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_REFERER' ],
+                       [ 'CURLOPT_RESUME_FROM' ],
+                       [ 'CURLOPT_RETURNTRANSFER' ],
+                       // [ 'CURLOPT_SSH_AUTH_TYPES' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_PRIVATE_KEYFILE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_PUBLIC_KEYFILE' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_SSLCERT' ],
+                       [ 'CURLOPT_SSLCERTPASSWD' ],
+                       [ 'CURLOPT_SSLCERTTYPE' ],
+                       [ 'CURLOPT_SSLENGINE' ],
+                       [ 'CURLOPT_SSLENGINE_DEFAULT' ],
+                       [ 'CURLOPT_SSLKEY' ],
+                       [ 'CURLOPT_SSLKEYPASSWD' ],
+                       [ 'CURLOPT_SSLKEYTYPE' ],
+                       [ 'CURLOPT_SSLVERSION' ],
+                       [ 'CURLOPT_SSL_CIPHER_LIST' ],
+                       [ 'CURLOPT_SSL_VERIFYHOST' ],
+                       [ 'CURLOPT_SSL_VERIFYPEER' ],
+                       [ 'CURLOPT_STDERR' ],
+                       [ 'CURLOPT_TCP_NODELAY' ],
+                       [ 'CURLOPT_TIMECONDITION' ],
+                       [ 'CURLOPT_TIMEOUT' ],
+                       [ 'CURLOPT_TIMEOUT_MS' ],
+                       [ 'CURLOPT_TIMEVALUE' ],
+                       [ 'CURLOPT_TRANSFERTEXT' ],
+                       [ 'CURLOPT_UNRESTRICTED_AUTH' ],
+                       [ 'CURLOPT_UPLOAD' ],
+                       [ 'CURLOPT_URL' ],
+                       [ 'CURLOPT_USERAGENT' ],
+                       [ 'CURLOPT_USERPWD' ],
+                       [ 'CURLOPT_VERBOSE' ],
+                       [ 'CURLOPT_WRITEFUNCTION' ],
+                       [ 'CURLOPT_WRITEHEADER' ],
+                       // [ 'CURLPROTO_ALL' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_DICT' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FILE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FTPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_HTTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_HTTPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_LDAP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_LDAPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_SCP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_SFTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_TELNET' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_TFTP' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLPROXY_HTTP' ],
+                       // [ 'CURLPROXY_SOCKS4' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLPROXY_SOCKS5' ],
+                       // [ 'CURLSSH_AUTH_DEFAULT' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_HOST' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_KEYBOARD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_NONE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_PASSWORD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_PUBLICKEY' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLVERSION_NOW' ],
+                       [ 'CURL_HTTP_VERSION_1_0' ],
+                       [ 'CURL_HTTP_VERSION_1_1' ],
+                       [ 'CURL_HTTP_VERSION_NONE' ],
+                       [ 'CURL_IPRESOLVE_V4' ],
+                       [ 'CURL_IPRESOLVE_V6' ],
+                       [ 'CURL_IPRESOLVE_WHATEVER' ],
+                       [ 'CURL_NETRC_IGNORED' ],
+                       [ 'CURL_NETRC_OPTIONAL' ],
+                       [ 'CURL_NETRC_REQUIRED' ],
+                       [ 'CURL_TIMECOND_IFMODSINCE' ],
+                       [ 'CURL_TIMECOND_IFUNMODSINCE' ],
+                       [ 'CURL_TIMECOND_LASTMOD' ],
+                       [ 'CURL_VERSION_IPV6' ],
+                       [ 'CURL_VERSION_KERBEROS4' ],
+                       [ 'CURL_VERSION_LIBZ' ],
+                       [ 'CURL_VERSION_SSL' ],
+               ];
+       }
+
+       /**
+        * Added this test based on an issue experienced with HHVM 3.3.0-dev
+        * where it did not define a cURL constant.
+        *
+        * @T72570
+        * @dataProvider provideCurlConstants
+        */
+       public function testCurlConstants( $value ) {
+               $this->assertTrue( defined( $value ), $value . ' not defined' );
+       }
+}
+
+/**
+ * Class to let us overwrite MWHttpRequest respHeaders variable
+ */
+class MWHttpRequestTester extends MWHttpRequest {
+       // function derived from the MWHttpRequest factory function but
+       // returns appropriate tester class here
+       public static function factory( $url, $options = null, $caller = __METHOD__ ) {
+               if ( !Http::$httpEngine ) {
+                       Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
+               } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
+                       throw new DomainException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
+                               'Http::$httpEngine is set to "curl"' );
+               }
+
+               switch ( Http::$httpEngine ) {
+                       case 'curl':
+                               return new CurlHttpRequestTester( $url, $options, $caller );
+                       case 'php':
+                               if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
+                                       throw new DomainException( __METHOD__ .
+                                               ': allow_url_fopen needs to be enabled for pure PHP HTTP requests to work. '
+                                                       . 'If possible, curl should be used instead. See http://php.net/curl.' );
+                               }
+
+                               return new PhpHttpRequestTester( $url, $options, $caller );
+                       default:
+               }
+       }
+}
+
+class CurlHttpRequestTester extends CurlHttpRequest {
+       function setRespHeaders( $name, $value ) {
+               $this->respHeaders[$name] = $value;
+       }
+}
+
+class PhpHttpRequestTester extends PhpHttpRequest {
+       function setRespHeaders( $name, $value ) {
+               $this->respHeaders[$name] = $value;
+       }
+}
index 5e3c626..8e06f9e 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Integration test that checks import success and
  * LinkCache integration.
@@ -77,7 +79,7 @@ class ImportLinkCacheIntegrationTest extends MediaWikiTestCase {
 
                $importer = new WikiImporter(
                        $importStreamSource->value,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setDebug( true );
 
index 9d05d15..53d91c6 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use MediaWiki\MediaWikiServices;
 
 /**
  * Test class for Import methods.
@@ -25,7 +26,7 @@ class ImportTest extends MediaWikiLangTestCase {
 
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
 
                $importer->doImport();
@@ -92,7 +93,7 @@ EOF
 
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setPageOutCallback( $callback );
                $importer->doImport();
@@ -175,7 +176,7 @@ EOF
 
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setSiteInfoCallback( $callback );
                $importer->doImport();
diff --git a/tests/phpunit/includes/installer/DatabaseUpdaterTest.php b/tests/phpunit/includes/installer/DatabaseUpdaterTest.php
deleted file mode 100644 (file)
index 2a75cf4..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-<?php
-
-class DatabaseUpdaterTest extends MediaWikiTestCase {
-
-       public function testSetAppliedUpdates() {
-               $db = new FakeDatabase();
-               $dbu = new FakeDatabaseUpdater( $db );
-               $dbu->setAppliedUpdates( "test", [] );
-               $expected = "updatelist-test-" . time() . "0";
-               $actual = $db->lastInsertData['ul_key'];
-               $this->assertEquals( $expected, $actual, var_export( $db->lastInsertData, true ) );
-               $dbu->setAppliedUpdates( "test", [] );
-               $expected = "updatelist-test-" . time() . "1";
-               $actual = $db->lastInsertData['ul_key'];
-               $this->assertEquals( $expected, $actual, var_export( $db->lastInsertData, true ) );
-       }
-}
-
-class FakeDatabase extends Database {
-       public $lastInsertTable;
-       public $lastInsertData;
-
-       function __construct() {
-               $this->cliMode = true;
-               $this->connLogger = new \Psr\Log\NullLogger();
-               $this->queryLogger = new \Psr\Log\NullLogger();
-               $this->errorLogger = function ( Exception $e ) {
-                       wfWarn( get_class( $e ) . ": {$e->getMessage()}" );
-               };
-               $this->currentDomain = DatabaseDomain::newUnspecified();
-       }
-
-       function clearFlag( $arg, $remember = self::REMEMBER_NOTHING ) {
-       }
-
-       function setFlag( $arg, $remember = self::REMEMBER_NOTHING ) {
-       }
-
-       public function insert( $table, $a, $fname = __METHOD__, $options = [] ) {
-               $this->lastInsertTable = $table;
-               $this->lastInsertData = $a;
-       }
-
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        *
-        * @return string
-        */
-       function getType() {
-               // TODO: Implement getType() method.
-       }
-
-       /**
-        * Open a connection to the database. Usually aborts on failure
-        *
-        * @param string $server Database server host
-        * @param string $user Database user name
-        * @param string $password Database user password
-        * @param string $dbName Database name
-        * @return bool
-        * @throws DBConnectionError
-        */
-       function open( $server, $user, $password, $dbName ) {
-               // TODO: Implement open() method.
-       }
-
-       /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper|stdClass $res Object as returned from Database::query(), etc.
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchObject( $res ) {
-               // TODO: Implement fetchObject() method.
-       }
-
-       /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper $res Result object as returned from Database::query(), etc.
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchRow( $res ) {
-               // TODO: Implement fetchRow() method.
-       }
-
-       /**
-        * Get the number of rows in a result object
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numRows( $res ) {
-               // TODO: Implement numRows() method.
-       }
-
-       /**
-        * Get the number of fields in a result object
-        * @see https://secure.php.net/mysql_num_fields
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numFields( $res ) {
-               // TODO: Implement numFields() method.
-       }
-
-       /**
-        * Get a field name in a result object
-        * @see https://secure.php.net/mysql_field_name
-        *
-        * @param mixed $res A SQL result
-        * @param int $n
-        * @return string
-        */
-       function fieldName( $res, $n ) {
-               // TODO: Implement fieldName() method.
-       }
-
-       /**
-        * Get the inserted value of an auto-increment row
-        *
-        * The value inserted should be fetched from nextSequenceValue()
-        *
-        * Example:
-        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-        * $dbw->insert( 'page', [ 'page_id' => $id ] );
-        * $id = $dbw->insertId();
-        *
-        * @return int
-        */
-       function insertId() {
-               // TODO: Implement insertId() method.
-       }
-
-       /**
-        * Change the position of the cursor in a result object
-        * @see https://secure.php.net/mysql_data_seek
-        *
-        * @param mixed $res A SQL result
-        * @param int $row
-        */
-       function dataSeek( $res, $row ) {
-               // TODO: Implement dataSeek() method.
-       }
-
-       /**
-        * Get the last error number
-        * @see https://secure.php.net/mysql_errno
-        *
-        * @return int
-        */
-       function lastErrno() {
-               // TODO: Implement lastErrno() method.
-       }
-
-       /**
-        * Get a description of the last error
-        * @see https://secure.php.net/mysql_error
-        *
-        * @return string
-        */
-       function lastError() {
-               // TODO: Implement lastError() method.
-       }
-
-       /**
-        * mysql_fetch_field() wrapper
-        * Returns false if the field doesn't exist
-        *
-        * @param string $table Table name
-        * @param string $field Field name
-        *
-        * @return Field
-        */
-       function fieldInfo( $table, $field ) {
-               // TODO: Implement fieldInfo() method.
-       }
-
-       /**
-        * Get information about an index into an object
-        * @param string $table Table name
-        * @param string $index Index name
-        * @param string $fname Calling function name
-        * @return mixed Database-specific index description class or false if the index does not exist
-        */
-       function indexInfo( $table, $index, $fname = __METHOD__ ) {
-               // TODO: Implement indexInfo() method.
-       }
-
-       /**
-        * Get the number of rows affected by the last write query
-        * @see https://secure.php.net/mysql_affected_rows
-        *
-        * @return int
-        */
-       function affectedRows() {
-               // TODO: Implement affectedRows() method.
-       }
-
-       /**
-        * Wrapper for addslashes()
-        *
-        * @param string $s String to be slashed.
-        * @return string Slashed string.
-        */
-       function strencode( $s ) {
-               // TODO: Implement strencode() method.
-       }
-
-       /**
-        * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[https://www.mysql.com/ MySQL]";
-        * Should at least contain plain text, if for some reason
-        * your database has no website.
-        *
-        * @return string Wikitext of a link to the server software's web site
-        */
-       function getSoftwareLink() {
-               // TODO: Implement getSoftwareLink() method.
-       }
-
-       /**
-        * A string describing the current software version, like from
-        * mysql_get_server_info().
-        *
-        * @return string Version information from the database server.
-        */
-       function getServerVersion() {
-               // TODO: Implement getServerVersion() method.
-       }
-
-       /**
-        * Closes underlying database connection
-        * @since 1.20
-        * @return bool Whether connection was closed successfully
-        */
-       protected function closeConnection() {
-               // TODO: Implement closeConnection() method.
-       }
-
-       /**
-        * The DBMS-dependent part of query()
-        *
-        * @param string $sql SQL query.
-        * @return ResultWrapper|bool Result object to feed to fetchObject,
-        *   fetchRow, ...; or false on failure
-        */
-       protected function doQuery( $sql ) {
-               // TODO: Implement doQuery() method.
-       }
-}
-
-class FakeDatabaseUpdater extends DatabaseUpdater {
-       function __construct( $db ) {
-               $this->db = $db;
-               self::$updateCounter = 0;
-       }
-
-       /**
-        * Get an array of updates to perform on the database. Should return a
-        * multi-dimensional array. The main key is the MediaWiki version (1.12,
-        * 1.13...) with the values being arrays of updates, identical to how
-        * updaters.inc did it (for now)
-        *
-        * @return array
-        */
-       protected function getCoreUpdateList() {
-               return [];
-       }
-
-       public function canUseNewUpdatelog() {
-               return true;
-       }
-
-       public function setAppliedUpdates( $version, $updates = [] ) {
-               parent::setAppliedUpdates( $version, $updates );
-       }
-}
index 137dfb7..b1ad77a 100644 (file)
@@ -82,31 +82,32 @@ class InterwikiTest extends MediaWikiTestCase {
 
                $this->setWgInterwikiCache( false );
 
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
-                       Interwiki::getAllPrefixes(),
+                       $interwikiLookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
                $this->assertEquals(
                        [ $dewiki ],
-                       Interwiki::getAllPrefixes( true ),
+                       $interwikiLookup->getAllPrefixes( true ),
                        'getAllPrefixes()'
                );
                $this->assertEquals(
                        [ $zzwiki ],
-                       Interwiki::getAllPrefixes( false ),
+                       $interwikiLookup->getAllPrefixes( false ),
                        'getAllPrefixes()'
                );
 
-               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertFalse( Interwiki::isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertFalse( $interwikiLookup->isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
 
-               $this->assertNull( Interwiki::fetch( null ), 'no prefix' );
-               $this->assertFalse( Interwiki::fetch( 'xyz' ), 'unknown prefix' );
+               $this->assertNull( $interwikiLookup->fetch( null ), 'no prefix' );
+               $this->assertFalse( $interwikiLookup->fetch( 'xyz' ), 'unknown prefix' );
 
-               $interwiki = Interwiki::fetch( 'de' );
+               $interwiki = $interwikiLookup->fetch( 'de' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
-               $this->assertSame( $interwiki, Interwiki::fetch( 'de' ), 'in-process caching' );
+               $this->assertSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'in-process caching' );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
@@ -115,7 +116,7 @@ class InterwikiTest extends MediaWikiTestCase {
                $this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' );
 
                Interwiki::invalidateCache( 'de' );
-               $this->assertNotSame( $interwiki, Interwiki::fetch( 'de' ), 'invalidate cache' );
+               $this->assertNotSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'invalidate cache' );
        }
 
        /**
@@ -190,22 +191,23 @@ class InterwikiTest extends MediaWikiTestCase {
 
                $this->setWgInterwikiCache( $cdbFile );
 
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
-                       Interwiki::getAllPrefixes(),
+                       $interwikiLookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
 
-               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
 
-               $interwiki = Interwiki::fetch( 'de' );
+               $interwiki = $interwikiLookup->fetch( 'de' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
 
-               $interwiki = Interwiki::fetch( 'zz' );
+               $interwiki = $interwikiLookup->fetch( 'zz' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
@@ -236,22 +238,23 @@ class InterwikiTest extends MediaWikiTestCase {
 
                $this->setWgInterwikiCache( $cdbData );
 
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
-                       Interwiki::getAllPrefixes(),
+                       $interwikiLookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
 
-               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
 
-               $interwiki = Interwiki::fetch( 'de' );
+               $interwiki = $interwikiLookup->fetch( 'de' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
 
-               $interwiki = Interwiki::fetch( 'zz' );
+               $interwiki = $interwikiLookup->fetch( 'zz' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
index 366714b..2e5c0bb 100644 (file)
@@ -54,7 +54,7 @@ class CSSMinTest extends MediaWikiTestCase {
                        [ "foo, bar {\n\tprop: value; /* comment */\n}", "foo,bar{prop:value; }" ],
 
                        // Keep track of things that aren't as minified as much as they
-                       // could be (bug 35493)
+                       // could be (T37493)
                        [ 'foo { prop: value ;}', 'foo{prop:value }' ],
                        [ 'foo { prop : value; }', 'foo{prop :value}' ],
                        [ 'foo { prop: value ; }', 'foo{prop:value }' ],
@@ -105,7 +105,7 @@ class CSSMinTest extends MediaWikiTestCase {
                                'foo { prop: url(http://example.org/bar.png); }',
                        ],
                        [
-                               'With trailing slash on remote (bug 27052)',
+                               'With trailing slash on remote (T29052)',
                                [ 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux/', false ],
                                'foo { prop: url(http://example.org/bar.png); }',
                        ],
@@ -370,7 +370,7 @@ class CSSMinTest extends MediaWikiTestCase {
                                '{ background: /*asd*/ url(http://localhost/w/something.png); background: /*jkl*/ url(http://localhost/w/something.png); }',
                        ],
                        [
-                               'Sanity check for offending line from jquery.ui.theme.css (bug 60077)',
+                               'Sanity check for offending line from jquery.ui.theme.css (T62077)',
                                '.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }',
                                '.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(http://localhost/w/images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }',
                        ],
@@ -418,7 +418,7 @@ class CSSMinTest extends MediaWikiTestCase {
        }
 
        /**
-        * Seperated because they are currently broken (bug 35492)
+        * Seperated because they are currently broken (T37492)
         *
         * @group Broken
         * @dataProvider provideStringCases
index 3787962..ca12f6c 100644 (file)
@@ -10,7 +10,7 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        [ "/* Foo *\n*bar\n*/", "" ],
 
                        /**
-                        * Slashes used inside block comments (bug 26931).
+                        * Slashes used inside block comments (T28931).
                         * At some point there was a bug that caused this comment to be ended at '* /',
                         * causing /M... to be left as the beginning of a regex.
                         */
@@ -60,7 +60,7 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        [ "5.3.\nx;", "5.3.x;" ],
 
                        // Semicolon insertion between an expression having an inline
-                       // comment after it, and a statement on the next line (bug 27046).
+                       // comment after it, and a statement on the next line (T29046).
                        [
                                "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}",
                                "var a=this\nfor(b=0;c<d;b++){}"
@@ -127,7 +127,7 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        // newline insertion after 1000 chars: break after the "++", not before
                        [ str_repeat( ';', 996 ) . "if(x++);", str_repeat( ';', 996 ) . "if(x++\n);" ],
 
-                       // Unicode letter characters should pass through ok in identifiers (bug 31187)
+                       // Unicode letter characters should pass through ok in identifiers (T33187)
                        [ "var KaŝSkatolVal = {}", 'var KaŝSkatolVal={}' ],
 
                        // Per spec unicode char escape values should work in identifiers,
index 85927a3..787d9a8 100644 (file)
@@ -52,11 +52,21 @@ class MimeMagicTest extends PHPUnit_Framework_TestCase {
 
        /**
         * Test to make sure that encoder=ffmpeg2theora doesn't trigger
-        * MEDIATYPE_VIDEO (bug 63584)
+        * MEDIATYPE_VIDEO (T65584)
         */
        function testOggRecognize() {
                $oggFile = __DIR__ . '/../../../data/media/say-test.ogg';
                $actualType = $this->mimeAnalyzer->getMediaType( $oggFile, 'application/ogg' );
                $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
        }
+
+       /**
+        * Test to make sure that Opus audio files don't trigger
+        * MEDIATYPE_MULTIMEDIA (bug T151352)
+        */
+       function testOpusRecognize() {
+               $oggFile = __DIR__ . '/../../../data/media/say-test.opus';
+               $actualType = $this->mimeAnalyzer->getMediaType( $oggFile, 'application/ogg' );
+               $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
+       }
 }
index aa46c96..d7ed4bd 100644 (file)
@@ -872,6 +872,62 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                $this->assertGreaterThan( -5.1, $curTTL, "Correct CTL" );
        }
 
+       /**
+        * @covers WANObjectCache::reap()
+        * @covers WANObjectCache::reapCheckKey()
+        */
+       public function testReap() {
+               $vKey1 = wfRandomString();
+               $vKey2 = wfRandomString();
+               $tKey1 = wfRandomString();
+               $tKey2 = wfRandomString();
+               $value = 'moo';
+
+               $knownPurge = time() - 60;
+               $goodTime = microtime( true ) - 5;
+               $badTime = microtime( true ) - 300;
+
+               $this->internalCache->set(
+                       WANObjectCache::VALUE_KEY_PREFIX . $vKey1,
+                       [
+                               WANObjectCache::FLD_VERSION => WANObjectCache::VERSION,
+                               WANObjectCache::FLD_VALUE => $value,
+                               WANObjectCache::FLD_TTL => 3600,
+                               WANObjectCache::FLD_TIME => $goodTime
+                       ]
+               );
+               $this->internalCache->set(
+                       WANObjectCache::VALUE_KEY_PREFIX . $vKey2,
+                       [
+                               WANObjectCache::FLD_VERSION => WANObjectCache::VERSION,
+                               WANObjectCache::FLD_VALUE => $value,
+                               WANObjectCache::FLD_TTL => 3600,
+                               WANObjectCache::FLD_TIME => $badTime
+                       ]
+               );
+               $this->internalCache->set(
+                       WANObjectCache::TIME_KEY_PREFIX . $tKey1,
+                       WANObjectCache::PURGE_VAL_PREFIX . $goodTime
+               );
+               $this->internalCache->set(
+                       WANObjectCache::TIME_KEY_PREFIX . $tKey2,
+                       WANObjectCache::PURGE_VAL_PREFIX . $badTime
+               );
+
+               $this->assertEquals( $value, $this->cache->get( $vKey1 ) );
+               $this->assertEquals( $value, $this->cache->get( $vKey2 ) );
+               $this->cache->reap( $vKey1, $knownPurge, $bad1 );
+               $this->cache->reap( $vKey2, $knownPurge, $bad2 );
+
+               $this->assertFalse( $bad1 );
+               $this->assertTrue( $bad2 );
+
+               $this->cache->reapCheckKey( $tKey1, $knownPurge, $tBad1 );
+               $this->cache->reapCheckKey( $tKey2, $knownPurge, $tBad2 );
+               $this->assertFalse( $tBad1 );
+               $this->assertTrue( $tBad2 );
+       }
+
        /**
         * @covers WANObjectCache::set()
         */
@@ -926,6 +982,8 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                $wanCache->getMulti( [ 'x', 'y' ], $ctls, [ 'check2' ] );
                $wanCache->getWithSetCallback( 'p', 30, $valFunc );
                $wanCache->getCheckKeyTime( 'zzz' );
+               $wanCache->reap( 'x', time() - 300 );
+               $wanCache->reap( 'zzz', time() - 300 );
        }
 
        /**
diff --git a/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php b/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php
new file mode 100644 (file)
index 0000000..cd350e5
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+
+namespace Wikimedia\Tests\Rdbms;
+
+use IDatabase;
+use Wikimedia\Rdbms\LoadBalancer;
+use PHPUnit_Framework_MockObject_MockObject;
+use Wikimedia\Rdbms\ConnectionManager;
+
+/**
+ * @covers Wikimedia\Rdbms\ConnectionManager
+ *
+ * @license GPL-2.0+
+ * @author Daniel Kinzler
+ */
+class ConnectionManagerTest extends \PHPUnit_Framework_TestCase {
+
+       /**
+        * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
+        */
+       private function getIDatabaseMock() {
+               return $this->getMock( IDatabase::class );
+       }
+
+       /**
+        * @return LoadBalancer|PHPUnit_Framework_MockObject_MockObject
+        */
+       private function getLoadBalancerMock() {
+               $lb = $this->getMockBuilder( LoadBalancer::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               return $lb;
+       }
+
+       public function testGetReadConnection_nullGroups() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnection' )
+                       ->with( DB_REPLICA, [ 'group1' ], 'someDbName' )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new ConnectionManager( $lb, 'someDbName', [ 'group1' ] );
+               $actual = $manager->getReadConnection();
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testGetReadConnection_withGroups() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnection' )
+                       ->with( DB_REPLICA, [ 'group2' ], 'someDbName' )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new ConnectionManager( $lb, 'someDbName', [ 'group1' ] );
+               $actual = $manager->getReadConnection( [ 'group2' ] );
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testGetWriteConnection() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnection' )
+                       ->with( DB_MASTER, [ 'group1' ], 'someDbName' )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new ConnectionManager( $lb, 'someDbName', [ 'group1' ] );
+               $actual = $manager->getWriteConnection();
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testReleaseConnection() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'reuseConnection' )
+                       ->with( $database )
+                       ->will( $this->returnValue( null ) );
+
+               $manager = new ConnectionManager( $lb );
+               $manager->releaseConnection( $database );
+       }
+
+       public function testGetReadConnectionRef_nullGroups() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnectionRef' )
+                       ->with( DB_REPLICA, [ 'group1' ], 'someDbName' )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new ConnectionManager( $lb, 'someDbName', [ 'group1' ] );
+               $actual = $manager->getReadConnectionRef();
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testGetReadConnectionRef_withGroups() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnectionRef' )
+                       ->with( DB_REPLICA, [ 'group2' ], 'someDbName' )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new ConnectionManager( $lb, 'someDbName', [ 'group1' ] );
+               $actual = $manager->getReadConnectionRef( [ 'group2' ] );
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testGetWriteConnectionRef() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnectionRef' )
+                       ->with( DB_MASTER, [ 'group1' ], 'someDbName' )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new ConnectionManager( $lb, 'someDbName', [ 'group1' ] );
+               $actual = $manager->getWriteConnectionRef();
+
+               $this->assertSame( $database, $actual );
+       }
+
+}
diff --git a/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php b/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php
new file mode 100644 (file)
index 0000000..3b26d6f
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+namespace Wikimedia\Tests\Rdbms;
+
+use IDatabase;
+use Wikimedia\Rdbms\LoadBalancer;
+use PHPUnit_Framework_MockObject_MockObject;
+use Wikimedia\Rdbms\SessionConsistentConnectionManager;
+
+/**
+ * @covers Wikimedia\Rdbms\SessionConsistentConnectionManager
+ *
+ * @license GPL-2.0+
+ * @author Daniel Kinzler
+ */
+class SessionConsistentConnectionManagerTest extends \PHPUnit_Framework_TestCase {
+
+       /**
+        * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
+        */
+       private function getIDatabaseMock() {
+               return $this->getMock( IDatabase::class );
+       }
+
+       /**
+        * @return LoadBalancer|PHPUnit_Framework_MockObject_MockObject
+        */
+       private function getLoadBalancerMock() {
+               $lb = $this->getMockBuilder( LoadBalancer::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               return $lb;
+       }
+
+       public function testGetReadConnection() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnection' )
+                       ->with( DB_REPLICA )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new SessionConsistentConnectionManager( $lb );
+               $actual = $manager->getReadConnection();
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testGetReadConnectionReturnsWriteDbOnForceMatser() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnection' )
+                       ->with( DB_MASTER )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new SessionConsistentConnectionManager( $lb );
+               $manager->prepareForUpdates();
+               $actual = $manager->getReadConnection();
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testGetWriteConnection() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnection' )
+                       ->with( DB_MASTER )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new SessionConsistentConnectionManager( $lb );
+               $actual = $manager->getWriteConnection();
+
+               $this->assertSame( $database, $actual );
+       }
+
+       public function testForceMaster() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'getConnection' )
+                       ->with( DB_MASTER )
+                       ->will( $this->returnValue( $database ) );
+
+               $manager = new SessionConsistentConnectionManager( $lb );
+               $manager->prepareForUpdates();
+               $manager->getReadConnection();
+       }
+
+       public function testReleaseConnection() {
+               $database = $this->getIDatabaseMock();
+               $lb = $this->getLoadBalancerMock();
+
+               $lb->expects( $this->once() )
+                       ->method( 'reuseConnection' )
+                       ->with( $database )
+                       ->will( $this->returnValue( null ) );
+
+               $manager = new SessionConsistentConnectionManager( $lb );
+               $manager->releaseConnection( $database );
+       }
+}
index d13fbf9..3dc7e28 100644 (file)
@@ -1,7 +1,9 @@
 <?php
 
+use Wikimedia\Rdbms\DatabaseDomain;
+
 /**
- * @covers DatabaseDomain
+ * @covers Wikimedia\Rdbms\DatabaseDomain
  */
 class DatabaseDomainTest extends PHPUnit_Framework_TestCase {
        public static function provideConstruct() {
index ac52a39..9291eb6 100644 (file)
@@ -56,7 +56,7 @@ class XMPTest extends PHPUnit_Framework_TestCase  {
                        [ 'invalid-child-not-struct', 'Test child props not in struct or ignored' ],
                        [ 'no-recognized-props', 'Test namespace and no recognized props' ],
                        [ 'no-namespace', 'Test non-namespaced attributes are ignored' ],
-                       [ 'bag-for-seq', "Allow bag's instead of seq's. (bug 27105)" ],
+                       [ 'bag-for-seq', "Allow bag's instead of seq's. (T29105)" ],
                        [ 'utf16BE', 'UTF-16BE encoding' ],
                        [ 'utf16LE', 'UTF-16LE encoding' ],
                        [ 'utf32BE', 'UTF-32BE encoding' ],
index a21a3ff..c2b791e 100644 (file)
@@ -309,7 +309,7 @@ class LogFormatterTest extends MediaWikiLangTestCase {
 
        /**
         * The testIrcMsgForAction* tests are supposed to cover the hacky
-        * LogFormatter::getIRCActionText / bug 34508
+        * LogFormatter::getIRCActionText / T36508
         *
         * Third parties bots listen to those messages. They are clever enough
         * to fetch the i18n messages from the wiki and then analyze the IRC feed
index a81e7ec..f48507d 100644 (file)
@@ -10,6 +10,41 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
        public static function provideRightsLogDatabaseRows() {
                return [
                        // Current format
+                       [
+                               [
+                                       'type' => 'rights',
+                                       'action' => 'rights',
+                                       'comment' => 'rights comment',
+                                       'user' => 0,
+                                       'user_text' => 'Sysop',
+                                       'namespace' => NS_USER,
+                                       'title' => 'User',
+                                       'params' => [
+                                               '4::oldgroups' => [],
+                                               '5::newgroups' => [ 'sysop', 'bureaucrat' ],
+                                               'oldmetadata' => [],
+                                               'newmetadata' => [
+                                                       [ 'expiry' => null ],
+                                                       [ 'expiry' => '20160101123456' ]
+                                               ],
+                                       ],
+                               ],
+                               [
+                                       'text' => 'Sysop changed group membership for User from (none) to '
+                                               . 'bureaucrat (temporary, until 12:34, 1 January 2016) and administrator',
+                                       'api' => [
+                                               'oldgroups' => [],
+                                               'newgroups' => [ 'sysop', 'bureaucrat' ],
+                                               'oldmetadata' => [],
+                                               'newmetadata' => [
+                                                       [ 'group' => 'sysop', 'expiry' => 'infinity' ],
+                                                       [ 'group' => 'bureaucrat', 'expiry' => '2016-01-01T12:34:56Z' ],
+                                               ],
+                                       ],
+                               ],
+                       ],
+
+                       // Previous format (oldgroups and newgroups as arrays, no metadata)
                        [
                                [
                                        'type' => 'rights',
@@ -30,11 +65,16 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                        'api' => [
                                                'oldgroups' => [],
                                                'newgroups' => [ 'sysop', 'bureaucrat' ],
+                                               'oldmetadata' => [],
+                                               'newmetadata' => [
+                                                       [ 'group' => 'sysop', 'expiry' => 'infinity' ],
+                                                       [ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
+                                               ],
                                        ],
                                ],
                        ],
 
-                       // Legacy format
+                       // Legacy format (oldgroups and newgroups as numeric-keyed strings)
                        [
                                [
                                        'type' => 'rights',
@@ -56,6 +96,11 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                        'api' => [
                                                'oldgroups' => [],
                                                'newgroups' => [ 'sysop', 'bureaucrat' ],
+                                               'oldmetadata' => [],
+                                               'newmetadata' => [
+                                                       [ 'group' => 'sysop', 'expiry' => 'infinity' ],
+                                                       [ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
+                                               ],
                                        ],
                                ],
                        ],
@@ -116,6 +161,13 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                        'api' => [
                                                'oldgroups' => [ 'sysop' ],
                                                'newgroups' => [ 'sysop', 'bureaucrat' ],
+                                               'oldmetadata' => [
+                                                       [ 'group' => 'sysop', 'expiry' => 'infinity' ],
+                                               ],
+                                               'newmetadata' => [
+                                                       [ 'group' => 'sysop', 'expiry' => 'infinity' ],
+                                                       [ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
+                                               ],
                                        ],
                                ],
                        ],
@@ -142,6 +194,13 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                        'api' => [
                                                'oldgroups' => [ 'sysop' ],
                                                'newgroups' => [ 'sysop', 'bureaucrat' ],
+                                               'oldmetadata' => [
+                                                       [ 'group' => 'sysop', 'expiry' => 'infinity' ],
+                                               ],
+                                               'newmetadata' => [
+                                                       [ 'group' => 'sysop', 'expiry' => 'infinity' ],
+                                                       [ 'group' => 'bureaucrat', 'expiry' => 'infinity' ],
+                                               ],
                                        ],
                                ],
                        ],
index 3d0724f..e9fc84e 100644 (file)
@@ -33,7 +33,7 @@ class FormatMetadataTest extends MediaWikiMediaTestCase {
                $this->assertNotNull( $dateIndex, 'Date entry exists in metadata' );
                $this->assertEquals( '0000:01:00 00:02:27',
                        $meta['visible'][$dateIndex]['value'],
-                       'File with invalid date metadata (bug 29471)' );
+                       'File with invalid date metadata (T31471)' );
        }
 
        /**
index e854ab5..196f688 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 /**
- * Specificly for testing Media handlers. Sets up a FSFile backend
+ * Specificly for testing Media handlers. Sets up a FileRepo backend
  */
 abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
 
-       /** @var FSRepo */
+       /** @var FileRepo */
        protected $repo;
        /** @var FSFileBackend */
        protected $backend;
@@ -19,7 +19,7 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
                if ( $this->createsThumbnails() ) {
                        // We need a temp directory for the thumbnails
                        // the container is named 'temp-thumb' because it is the
-                       // thumb directory for a FSRepo named "temp".
+                       // thumb directory for a repo named "temp".
                        $containers['temp-thumb'] = $this->getNewTempDirectory();
                }
 
@@ -29,11 +29,11 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
                        'containerPaths' => $containers,
                        'tmpDirectory' => $this->getNewTempDirectory()
                ] );
-               $this->repo = new FSRepo( $this->getRepoOptions() );
+               $this->repo = new FileRepo( $this->getRepoOptions() );
        }
 
        /**
-        * @return array Argument for FSRepo constructor
+        * @return array Argument for FileRepo constructor
         */
        protected function getRepoOptions() {
                return [
index 3049e2f..9bfd5f6 100644 (file)
@@ -75,7 +75,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                        ],
                        [
                                "$base/Toll_Texas_1.svg",
-                               // This file triggered bug 31719, needs entity expansion in the xmlns checks
+                               // This file triggered T33719, needs entity expansion in the xmlns checks
                                [
                                        'width' => 385,
                                        'height' => 385,
index 3a3b514..34b2525 100644 (file)
@@ -5,7 +5,7 @@
  */
 class ArticleTablesTest extends MediaWikiLangTestCase {
        /**
-        * Make sure that bug 14404 doesn't strike again. We don't want
+        * Make sure that T16404 doesn't strike again. We don't want
         * templatelinks based on the user language when {{int:}} is used, only the
         * content language.
         *
@@ -13,7 +13,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
         * @covers Title::getLinksFrom
         */
        public function testTemplatelinksUsesContentLanguage() {
-               $title = Title::newFromText( 'Bug 14404' );
+               $title = Title::newFromText( 'T16404' );
                $page = WikiPage::factory( $title );
                $user = new User();
                $user->mRights = [ 'createpage', 'edit', 'purge' ];
@@ -22,7 +22,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
 
                $page->doEditContent(
                        new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
+                       'Test code for T16404',
                        0,
                        false,
                        $user
@@ -35,7 +35,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                // We need an edit, a purge is not enough to regenerate the tables
                $page->doEditContent(
                        new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
+                       'Test code for T16404',
                        EDIT_UPDATE,
                        false,
                        $user
index a96a296..7d0813d 100644 (file)
@@ -63,13 +63,9 @@ class ArticleTest extends MediaWikiTestCase {
         * @covers Article::onArticleCreate
         * @covers Article::onArticleDelete
         * @covers Article::onArticleEdit
-        * @covers Article::getAutosummary
         */
        public function testStaticFunctions() {
                $this->hideDeprecated( 'Article::selectFields' );
-               $this->hideDeprecated( 'Article::getAutosummary' );
-               $this->hideDeprecated( 'WikiPage::getAutosummary' );
-               $this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
 
                $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
                        "Article static functions" );
@@ -79,7 +75,5 @@ class ArticleTest extends MediaWikiTestCase {
                        "Article static functions" );
                $this->assertEquals( true, is_callable( "ImagePage::onArticleEdit" ),
                        "Article static functions" );
-               $this->assertTrue( is_string( CategoryPage::getAutosummary( '', '', 0 ) ),
-                       "Article static functions" );
        }
 }
index 4b7ebd3..6b911bf 100644 (file)
@@ -5,7 +5,7 @@
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
  * @group medium
- **/
+ */
 class WikiPageTest extends MediaWikiLangTestCase {
 
        protected $pages_to_delete;
@@ -155,67 +155,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
        }
 
-       /**
-        * @covers WikiPage::doEdit
-        * @deprecated since 1.21. Should be removed when WikiPage::doEdit() gets removed
-        */
-       public function testDoEdit() {
-               $this->hideDeprecated( "WikiPage::doEdit" );
-               $this->hideDeprecated( "WikiPage::getText" );
-               $this->hideDeprecated( "Revision::getText" );
-
-               // NOTE: assume help namespace will default to wikitext
-               $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
-
-               $page = $this->newPage( $title );
-
-               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
-                       . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
-
-               $page->doEdit( $text, "[[testing]] 1" );
-
-               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
-               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
-               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
-
-               $id = $page->getId();
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
-                       . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
-
-               $page->doEdit( $text, "testing 2" );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
-       }
-
        /**
         * @covers WikiPage::doDeleteArticle
         */
@@ -242,10 +181,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        $page->getContent(),
                        "WikiPage::getContent should return null after page was deleted"
                );
-               $this->assertFalse(
-                       $page->getText(),
-                       "WikiPage::getText should return false after page was deleted"
-               );
 
                $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
                $this->assertFalse(
@@ -332,24 +267,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( "some text", $content->getNativeData() );
        }
 
-       /**
-        * @covers WikiPage::getText
-        */
-       public function testGetText() {
-               $this->hideDeprecated( "WikiPage::getText" );
-
-               $page = $this->newPage( "WikiPageTest_testGetText" );
-
-               $text = $page->getText();
-               $this->assertFalse( $text );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $text = $page->getText();
-               $this->assertEquals( "some text", $text );
-       }
-
        /**
         * @covers WikiPage::getContentModel
         */
@@ -835,6 +752,47 @@ more stuff
        }
         */
 
+       /**
+        * @covers WikiPage::getOldestRevision
+        */
+       public function testGetOldestRevision() {
+               $page = $this->newPage( "WikiPageTest_testGetOldestRevision" );
+               $page->doEditContent(
+                       new WikitextContent( 'one' ),
+                       "first edit",
+                       EDIT_NEW
+               );
+               $rev1 = $page->getRevision();
+
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       new WikitextContent( 'two' ),
+                       "second edit",
+                       EDIT_UPDATE
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       new WikitextContent( 'three' ),
+                       "third edit",
+                       EDIT_UPDATE
+               );
+
+               // sanity check
+               $this->assertNotEquals(
+                       $rev1->getId(),
+                       $page->getRevision()->getId(),
+                       '$page->getRevision()->getId()'
+               );
+
+               // actual test
+               $this->assertEquals(
+                       $rev1->getId(),
+                       $page->getOldestRevision()->getId(),
+                       '$page->getOldestRevision()->getId()'
+               );
+       }
+
        /**
         * @todo FIXME: this is a better rollback test than the one below, but it
         * keeps failing in jenkins for some reason.
@@ -879,6 +837,7 @@ more stuff
                $this->assertEquals( 'Admin', $rev1->getUserText() );
 
                # now, try the actual rollback
+               $admin->addToDatabase();
                $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $token = $admin->getEditToken(
                        [ $page->getTitle()->getPrefixedText(), $user2->getName() ],
@@ -911,6 +870,7 @@ more stuff
        public function testDoRollback() {
                $admin = new User();
                $admin->setName( "Admin" );
+               $admin->addToDatabase();
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
@@ -937,10 +897,7 @@ more stuff
 
                # now, try the rollback
                $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
-               $token = $admin->getEditToken(
-                       [ $page->getTitle()->getPrefixedText(), $user1->getName() ],
-                       null
-               );
+               $token = $admin->getEditToken( 'rollback' );
                $errors = $page->doRollback(
                        $user1->getName(),
                        "testing revert",
@@ -967,6 +924,7 @@ more stuff
        public function testDoRollbackFailureSameContent() {
                $admin = new User();
                $admin->setName( "Admin" );
+               $admin->addToDatabase();
                $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
 
                $text = "one";
@@ -982,6 +940,7 @@ more stuff
 
                $user1 = new User();
                $user1->setName( "127.0.1.11" );
+               $user1->addToDatabase();
                $user1->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
@@ -995,10 +954,7 @@ more stuff
 
                # now, do a the rollback from the same user was doing the edit before
                $resultDetails = [];
-               $token = $user1->getEditToken(
-                       [ $page->getTitle()->getPrefixedText(), $user1->getName() ],
-                       null
-               );
+               $token = $user1->getEditToken( 'rollback' );
                $errors = $page->doRollback(
                        $user1->getName(),
                        "testing revert same user",
@@ -1012,10 +968,7 @@ more stuff
 
                # now, try the rollback
                $resultDetails = [];
-               $token = $admin->getEditToken(
-                       [ $page->getTitle()->getPrefixedText(), $user1->getName() ],
-                       null
-               );
+               $token = $admin->getEditToken( 'rollback' );
                $errors = $page->doRollback(
                        $user1->getName(),
                        "testing revert",
@@ -1034,63 +987,6 @@ more stuff
                $this->assertEquals( "one", $page->getContent()->getNativeData() );
        }
 
-       public static function provideGetAutosummary() {
-               return [
-                       [
-                               'Hello there, world!',
-                               '#REDIRECT [[Foo]]',
-                               0,
-                               '/^Redirected page .*Foo/'
-                       ],
-
-                       [
-                               null,
-                               'Hello world!',
-                               EDIT_NEW,
-                               '/^Created page .*Hello/'
-                       ],
-
-                       [
-                               'Hello there, world!',
-                               '',
-                               0,
-                               '/^Blanked/'
-                       ],
-
-                       [
-                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
-                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
-                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
-                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
-                               'Hello world!',
-                               0,
-                               '/^Replaced .*Hello/'
-                       ],
-
-                       [
-                               'foo',
-                               'bar',
-                               0,
-                               '/^$/'
-                       ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideGetAutoSummary
-        * @covers WikiPage::getAutosummary
-        */
-       public function testGetAutosummary( $old, $new, $flags, $expected ) {
-               $this->hideDeprecated( "WikiPage::getAutosummary" );
-
-               $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
-
-               $summary = $page->getAutosummary( $old, $new, $flags );
-
-               $this->assertTrue( (bool)preg_match( $expected, $summary ),
-                       "Autosummary didn't match expected pattern $expected: $summary" );
-       }
-
        public static function provideGetAutoDeleteReason() {
                return [
                        [
index fc5d660..eb163d3 100644 (file)
@@ -66,4 +66,3 @@ class ReverseChronologicalPagerTest extends MediaWikiLangTestCase {
                }
        }
 }
-
index d12fee3..414ab8f 100644 (file)
@@ -51,7 +51,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
                $this->assertPreloaded(
                        '<pre>monospaced</pre>',
                        '<pre>monospaced</pre>',
-                       '<pre> in preloaded text must be unstripped (bug 27467)'
+                       '<pre> in preloaded text must be unstripped (T29467)'
                );
        }
 
@@ -62,7 +62,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
                $this->assertPreloaded(
                        '<nowiki>[[Dummy title]]</nowiki>',
                        '<nowiki>[[Dummy title]]</nowiki>',
-                       '<nowiki> in preloaded text must be unstripped (bug 27467)'
+                       '<nowiki> in preloaded text must be unstripped (T29467)'
                );
        }
 
index c491e6b..11a2197 100644 (file)
@@ -214,7 +214,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        [ "Factorial" ], # https://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium
                        [ "All_system_messages" ], # https://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki
                        [ "Fundraising" ], # https://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor.
-                       [ "NestedTemplates" ], # bug 27936
+                       [ "NestedTemplates" ], # T29936
                ] );
                // @codingStandardsIgnoreEnd
        }
index d16200b..5ea7b1d 100644 (file)
@@ -61,6 +61,7 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                $upp = $this->getUserPasswordPolicy();
 
                $user = User::newFromName( 'TestUserPolicy' );
+               $user->addToDatabase();
                $user->addGroup( 'sysop' );
 
                $this->assertArrayEquals(
@@ -106,6 +107,7 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
                $upp = $this->getUserPasswordPolicy();
 
                $user = User::newFromName( $username );
+               $user->addToDatabase();
                foreach ( $groups as $group ) {
                        $user->addGroup( $group );
                }
diff --git a/tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php b/tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php
new file mode 100644 (file)
index 0000000..e3ea139
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+
+class RCFeedIntegrationTest extends MediaWikiTestCase {
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( [
+                       'wgCanonicalServer' => 'https://example.org',
+                       'wgServerName' => 'example.org',
+                       'wgScriptPath' => '/w',
+                       'wgDBname' => 'example',
+                       'wgDBprefix' => '',
+                       'wgRCFeeds' => [],
+                       'wgRCEngines' => [],
+               ] );
+       }
+
+       /**
+        * @covers RecentChange::notifyRCFeeds
+        * @covers RecentChange::getEngine
+        * @covers RCFeed::factory
+        * @covers FormattedRCFeed::__construct
+        * @covers FormattedRCFeed::notify
+        * @covers JSONRCFeedFormatter::formatArray
+        * @covers MachineReadableRCFeedFormatter::getLine
+        */
+       public function testNotify() {
+               $feed = $this->getMockBuilder( 'RCFeedEngine' )
+                       ->setConstructorArgs( [ [ 'formatter' => 'JSONRCFeedFormatter' ] ] )
+                       ->setMethods( [ 'send' ] )
+                       ->getMock();
+
+               $feed->method( 'send' )
+                       ->willReturn( true );
+
+               $feed->expects( $this->once() )
+                       ->method( 'send' )
+                       ->with( $this->anything(), $this->callback( function ( $line ) {
+                               $this->assertJsonStringEqualsJsonString(
+                                       json_encode( [
+                                               'id' => null,
+                                               'type' => 'log',
+                                               'namespace' => 0,
+                                               'title' => 'Example',
+                                               'comment' => '',
+                                               'timestamp' => 1301644800,
+                                               'user' => 'UTSysop',
+                                               'bot' => false,
+                                               'log_id' => 0,
+                                               'log_type' => 'move',
+                                               'log_action' => 'move',
+                                               'log_params' => [
+                                                       'color' => 'green',
+                                                       'nr' => 42,
+                                                       'pet' => 'cat',
+                                               ],
+                                               'log_action_comment' => '',
+                                               'server_url' => 'https://example.org',
+                                               'server_name' => 'example.org',
+                                               'server_script_path' => '/w',
+                                               'wiki' => 'example',
+                                       ] ),
+                                       $line
+                               );
+                               return true;
+                       } ) );
+
+               $this->setMwGlobals( [
+                       'wgRCFeeds' => [
+                               'myfeed' => [
+                                       'uri' => 'test://localhost:1234',
+                                       'formatter' => 'JSONRCFeedFormatter',
+                               ],
+                       ],
+                       'wgRCEngines' => [
+                               'test' => $feed,
+                       ],
+               ] );
+               $logpage = SpecialPage::getTitleFor( 'Log', 'move' );
+               $user = $this->getTestSysop()->getUser();
+               $rc = RecentChange::newLogEntry(
+                       '20110401080000',
+                       $logpage, // &$title
+                       $user, // &$user
+                       '', // $actionComment
+                       '127.0.0.1', // $ip
+                       'move', // $type
+                       'move', // $action
+                       Title::makeTitle( 0, 'Example' ), // $target
+                       '', // $logComment
+                       LogEntryBase::makeParamBlob( [
+                               '4::color' => 'green',
+                               '5:number:nr' => 42,
+                               'pet' => 'cat',
+                       ] )
+               );
+               $rc->notifyRCFeeds();
+       }
+}
diff --git a/tests/phpunit/includes/registration/CoreVersionCheckerTest.php b/tests/phpunit/includes/registration/CoreVersionCheckerTest.php
deleted file mode 100644 (file)
index 1dfcd82..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @covers CoreVersionChecker
- */
-class CoreVersionCheckerTest extends PHPUnit_Framework_TestCase {
-       /**
-        * @dataProvider provideCheck
-        */
-       public function testCheck( $coreVersion, $constraint, $expected ) {
-               $checker = new CoreVersionChecker( $coreVersion );
-               $this->assertEquals( $expected, $checker->check( $constraint ) );
-       }
-
-       public static function provideCheck() {
-               return [
-                       // [ $wgVersion, constraint, expected ]
-                       [ '1.25alpha', '>= 1.26', false ],
-                       [ '1.25.0', '>= 1.26', false ],
-                       [ '1.26alpha', '>= 1.26', true ],
-                       [ '1.26alpha', '>= 1.26.0', true ],
-                       [ '1.26alpha', '>= 1.26.0-stable', false ],
-                       [ '1.26.0', '>= 1.26.0-stable', true ],
-                       [ '1.26.1', '>= 1.26.0-stable', true ],
-                       [ '1.27.1', '>= 1.26.0-stable', true ],
-                       [ '1.26alpha', '>= 1.26.1', false ],
-                       [ '1.26alpha', '>= 1.26alpha', true ],
-                       [ '1.26alpha', '>= 1.25', true ],
-                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ],
-                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ],
-                       [ '1.26.1', '>= 1.26.2, <=1.26.0', false ],
-                       [ '1.26.1', '^1.26.2', false ],
-                       // Accept anything for un-parsable version strings
-                       [ '1.26mwf14', '== 1.25alpha', true ],
-                       [ 'totallyinvalid', '== 1.0', true ],
-               ];
-       }
-}
index 11995de..71f760d 100644 (file)
@@ -450,8 +450,9 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $globalSettings = TestingAccessWrapper::newFromClass(
                        ExtensionProcessor::class )->globalSettings;
 
+               $version = ExtensionRegistry::MANIFEST_VERSION;
                $schema = FormatJson::decode(
-                       file_get_contents( "$IP/docs/extension.schema.json" ),
+                       file_get_contents( "$IP/docs/extension.schema.v$version.json" ),
                        true
                );
                $missing = [];
index 1de4265..9b57e1c 100644 (file)
@@ -259,7 +259,7 @@ class ExtensionRegistryTest extends MediaWikiTestCase {
                                                'JsonZeroConfig' => [
                                                        'namespace' => 480,
                                                        'nsName' => 'Zero',
-                                                       'isLocal' => false,
+                                                       'isLocal' => true,
                                                ],
                                        ],
                                ],
diff --git a/tests/phpunit/includes/registration/VersionCheckerTest.php b/tests/phpunit/includes/registration/VersionCheckerTest.php
new file mode 100644 (file)
index 0000000..9ee5881
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * @covers VersionChecker
+ */
+class VersionCheckerTest extends PHPUnit_Framework_TestCase {
+       /**
+        * @dataProvider provideCheck
+        */
+       public function testCheck( $coreVersion, $constraint, $expected ) {
+               $checker = new VersionChecker( $coreVersion );
+               $this->assertEquals( $expected, !(bool)$checker->checkArray( [
+                       'FakeExtension' => [
+                               'MediaWiki' => $constraint,
+                       ],
+               ] )
+               );
+       }
+
+       public static function provideCheck() {
+               return [
+                       // [ $wgVersion, constraint, expected ]
+                       [ '1.25alpha', '>= 1.26', false ],
+                       [ '1.25.0', '>= 1.26', false ],
+                       [ '1.26alpha', '>= 1.26', true ],
+                       [ '1.26alpha', '>= 1.26.0', true ],
+                       [ '1.26alpha', '>= 1.26.0-stable', false ],
+                       [ '1.26.0', '>= 1.26.0-stable', true ],
+                       [ '1.26.1', '>= 1.26.0-stable', true ],
+                       [ '1.27.1', '>= 1.26.0-stable', true ],
+                       [ '1.26alpha', '>= 1.26.1', false ],
+                       [ '1.26alpha', '>= 1.26alpha', true ],
+                       [ '1.26alpha', '>= 1.25', true ],
+                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ],
+                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ],
+                       [ '1.26.1', '>= 1.26.2, <=1.26.0', false ],
+                       [ '1.26.1', '^1.26.2', false ],
+                       // Accept anything for un-parsable version strings
+                       [ '1.26mwf14', '== 1.25alpha', true ],
+                       [ 'totallyinvalid', '== 1.0', true ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideType
+        */
+       public function testType( $given, $expected ) {
+               $checker = new VersionChecker( '1.0.0' );
+               $checker
+                       ->setLoadedExtensionsAndSkins( [
+                               'FakeDependency' => [
+                                       'version' => '1.0.0',
+                               ],
+                       ] );
+               $this->assertEquals( $expected, $checker->checkArray( [
+                       'FakeExtension' => $given,
+               ] )
+               );
+       }
+
+       public static function provideType() {
+               return [
+                       // valid type
+                       [
+                               [
+                                       'extensions' => [
+                                               'FakeDependency' => '1.0.0'
+                                       ]
+                               ],
+                               []
+                       ],
+                       [
+                               [
+                                       'MediaWiki' => '1.0.0'
+                               ],
+                               []
+                       ],
+               ];
+       }
+
+       /**
+        * Check, if a non-parsable version constraint does not throw an exception or
+        * returns any error message.
+        */
+       public function testInvalidConstraint() {
+               $checker = new VersionChecker( '1.0.0' );
+               $checker
+                       ->setLoadedExtensionsAndSkins( [
+                               'FakeDependency' => [
+                                       'version' => 'not really valid',
+                               ],
+                       ] );
+               $this->assertEquals( [ "FakeDependency does not have a valid version string." ],
+                       $checker->checkArray( [
+                               'FakeExtension' => [
+                                       'extensions' => [
+                                               'FakeDependency' => '1.24.3',
+                                       ],
+                               ],
+                       ] )
+               );
+
+               $checker = new VersionChecker( '1.0.0' );
+               $checker
+                       ->setLoadedExtensionsAndSkins( [
+                               'FakeDependency' => [
+                                       'version' => '1.24.3',
+                               ],
+                       ] );
+
+               $this->setExpectedException( 'UnexpectedValueException' );
+               $checker->checkArray( [
+                       'FakeExtension' => [
+                               'FakeDependency' => 'not really valid',
+                       ]
+               ] );
+       }
+}
index 528c322..2db3c16 100644 (file)
@@ -246,8 +246,14 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                                'context' => [ 'debug' => true ],
                                'modules' => [ 'test.styles.pure', 'test.styles.mixed' ],
                                'only' => ResourceLoaderModule::TYPE_STYLES,
-                               'output' => '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>' . "\n"
-                                       . '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.mixed&amp;only=styles&amp;skin=fallback"/>',
+                               'output' => '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.mixed&amp;only=styles&amp;skin=fallback"/>' . "\n"
+                                       . '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>',
+                       ],
+                       [
+                               'context' => [ 'debug' => false ],
+                               'modules' => [ 'test.styles.pure', 'test.styles.mixed' ],
+                               'only' => ResourceLoaderModule::TYPE_STYLES,
+                               'output' => '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.mixed%2Cpure&amp;only=styles&amp;skin=fallback"/>',
                        ],
                        [
                                'context' => [],
index 1093039..b658efb 100644 (file)
@@ -14,6 +14,7 @@ class ResourceLoaderContextTest extends PHPUnit_Framework_TestCase {
                        'ResourceLoaderDebug' => false,
                        'DefaultSkin' => 'fallback',
                        'LanguageCode' => 'nl',
+                       'LoadScript' => '/w/load.php',
                ] ) );
        }
 
@@ -104,4 +105,13 @@ class ResourceLoaderContextTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( 'Example', $ctx->getUser() );
                $this->assertEquals( 'Example', $ctx->getUserObj()->getName() );
        }
+
+       public function testMsg() {
+               $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [
+                       'lang' => 'en'
+               ] ) );
+               $msg = $ctx->msg( 'mainpage' );
+               $this->assertInstanceOf( Message::class, $msg );
+               $this->assertSame( 'Main Page', $msg->useDatabase( false )->plain() );
+       }
 }
index 8b29983..4a3b90a 100644 (file)
@@ -130,7 +130,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                $modules = self::getModules();
                $rl = new ResourceLoaderFileModule( $modules[$name] );
                $rl->setName( $name );
-               $ctx = $this->getResourceLoaderContext( 'en', 'ltr' );
+               $ctx = $this->getResourceLoaderContext();
                $this->assertEquals( $rl->getScript( $ctx ), $expected );
        }
 
@@ -210,8 +210,14 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                ] );
                $expectedModule->setName( 'testing' );
 
-               $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
-               $contextRtl = $this->getResourceLoaderContext( 'he', 'rtl' );
+               $contextLtr = $this->getResourceLoaderContext( [
+                       'lang' => 'en',
+                       'dir' => 'ltr',
+               ] );
+               $contextRtl = $this->getResourceLoaderContext( [
+                       'lang' => 'he',
+                       'dir' => 'rtl',
+               ] );
 
                // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and
                // the @noflip annotations are always preserved, we need to strip them first.
@@ -282,9 +288,9 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                        'File has leading BOM'
                );
 
-               $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
+               $context = $this->getResourceLoaderContext();
                $this->assertEquals(
-                       $testModule->getStyles( $contextLtr ),
+                       $testModule->getStyles( $context ),
                        [ 'all' => ".efbbbf_bom_char_at_start_of_file {}\n" ],
                        'Leading BOM removed when concatenating files'
                );
index 179a8ed..84b56d4 100644 (file)
@@ -61,7 +61,10 @@ class ResourceLoaderImageTest extends ResourceLoaderTestCase {
                static $contexts = [];
 
                $image = $this->getTestImage( $imageName );
-               $context = $this->getResourceLoaderContext( $languageCode, $dirMap[$languageCode] );
+               $context = $this->getResourceLoaderContext( [
+                       'lang' => $languageCode,
+                       'dir' => $dirMap[$languageCode],
+               ] );
 
                $this->assertEquals( $image->getPath( $context ), $this->imagesPath . '/' . $path );
        }
@@ -87,7 +90,7 @@ class ResourceLoaderImageTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderImage::massageSvgPathdata
         */
        public function testGetImageData() {
-               $context = $this->getResourceLoaderContext( 'en', 'ltr' );
+               $context = $this->getResourceLoaderContext();
 
                $image = $this->getTestImage( 'remove' );
                $data = file_get_contents( $this->imagesPath . '/remove.svg' );
index 1ecdf21..e0a82d0 100644 (file)
@@ -14,6 +14,11 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                                'Foo' => '#eeeeee',
                                'bar' => 5,
                        ],
+                       // Clear ResourceLoaderGetConfigVars hooks (called by StartupModule)
+                       // to avoid notices during testMakeModuleResponse for missing
+                       // wgResourceLoaderLESSVars keys in extension hooks.
+                       'wgHooks' => [],
+                       'wgShowExceptionDetails' => true,
                ] );
        }
 
@@ -441,4 +446,135 @@ mw.example();
                        $this->assertTrue( true );
                }
        }
+
+       protected function getFailFerryMock() {
+               $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
+                       ->setMethods( [ 'getScript' ] )
+                       ->getMock();
+               $mock->method( 'getScript' )->will( $this->throwException(
+                       new Exception( 'Ferry not found' )
+               ) );
+               return $mock;
+       }
+
+       protected function getSimpleModuleMock( $script = '' ) {
+               $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
+                       ->setMethods( [ 'getScript' ] )
+                       ->getMock();
+               $mock->method( 'getScript' )->willReturn( $script );
+               return $mock;
+       }
+
+       /**
+        * @covers ResourceLoader::getCombinedVersion
+        */
+       public function testGetCombinedVersion() {
+               $rl = new EmptyResourceLoader();
+               $rl->register( [
+                       'foo' => self::getSimpleModuleMock(),
+                       'ferry' => self::getFailFerryMock(),
+                       'bar' => self::getSimpleModuleMock(),
+               ] );
+               $context = $this->getResourceLoaderContext( [], $rl );
+
+               $this->assertEquals(
+                       ResourceLoader::makeHash( self::BLANK_VERSION ),
+                       $rl->getCombinedVersion( $context, [ 'foo' ] ),
+                       'compute foo'
+               );
+
+               // Verify that getCombinedVersion() does not throw when ferry fails.
+               // Instead it gracefully continues to combine the remaining modules.
+               $this->assertEquals(
+                       ResourceLoader::makeHash( self::BLANK_VERSION . self::BLANK_VERSION ),
+                       $rl->getCombinedVersion( $context, [ 'foo', 'ferry', 'bar' ] ),
+                       'compute foo+ferry+bar (T152266)'
+               );
+       }
+
+       /**
+        * Verify that when building module content in a load.php response,
+        * an exception from one module will not break script output from
+        * other modules.
+        */
+       public function testMakeModuleResponseError() {
+               $modules = [
+                       'foo' => self::getSimpleModuleMock( 'foo();' ),
+                       'ferry' => self::getFailFerryMock(),
+                       'bar' => self::getSimpleModuleMock( 'bar();' ),
+               ];
+               $rl = new EmptyResourceLoader();
+               $rl->register( $modules );
+               $context = $this->getResourceLoaderContext(
+                       [
+                               'modules' => 'foo|ferry|bar',
+                               'only' => 'scripts',
+                       ],
+                       $rl
+               );
+
+               $response = $rl->makeModuleResponse( $context, $modules );
+               $errors = $rl->getErrors();
+
+               $this->assertCount( 1, $errors );
+               $this->assertRegExp( '/Ferry not found/', $errors[0] );
+               $this->assertEquals(
+                       'foo();bar();mw.loader.state( {
+    "ferry": "error",
+    "foo": "ready",
+    "bar": "ready"
+} );',
+                       $response
+               );
+       }
+
+       /**
+        * Verify that when building the startup module response,
+        * an exception from one module class will not break the entire
+        * startup module response. See T152266.
+        */
+       public function testMakeModuleResponseStartupError() {
+               $rl = new EmptyResourceLoader();
+               $rl->register( [
+                       'foo' => self::getSimpleModuleMock( 'foo();' ),
+                       'ferry' => self::getFailFerryMock(),
+                       'bar' => self::getSimpleModuleMock( 'bar();' ),
+                       'startup' => [ 'class' => 'ResourceLoaderStartUpModule' ],
+               ] );
+               $context = $this->getResourceLoaderContext(
+                       [
+                               'modules' => 'startup',
+                               'only' => 'scripts',
+                       ],
+                       $rl
+               );
+
+               $this->assertEquals(
+                       [ 'foo', 'ferry', 'bar', 'startup' ],
+                       $rl->getModuleNames(),
+                       'getModuleNames'
+               );
+
+               $modules = [ 'startup' => $rl->getModule( 'startup' ) ];
+               $response = $rl->makeModuleResponse( $context, $modules );
+               $errors = $rl->getErrors();
+
+               $this->assertRegExp( '/Ferry not found/', $errors[0] );
+               $this->assertCount( 1, $errors );
+               $this->assertRegExp(
+                       '/isCompatible.*function startUp/s',
+                       $response,
+                       'startup response undisrupted (T152266)'
+               );
+               $this->assertRegExp(
+                       '/register\([^)]+"ferry",\s*""/s',
+                       $response,
+                       'startup response registers broken module'
+               );
+               $this->assertRegExp(
+                       '/state\([^)]+"ferry":\s*"error"/s',
+                       $response,
+                       'startup response sets state to error'
+               );
+       }
 }
index e0de588..6833893 100644 (file)
@@ -126,11 +126,11 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                                'results' => [
                                        'Special:ActiveUsers',
                                        'Special:AllMessages',
-                                       'Special:AllMyFiles',
+                                       'Special:AllMyUploads',
                                ],
                                // Third result when testing offset
                                'offsetresult' => [
-                                       'Special:AllMyUploads',
+                                       'Special:AllPages',
                                ],
                        ] ],
                        [ [
@@ -143,7 +143,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                                ],
                                // Third result when testing offset
                                'offsetresult' => [
-                                       'Special:UncategorizedImages',
+                                       'Special:UncategorizedPages',
                                ],
                        ] ],
                        [ [
@@ -230,7 +230,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match not on top (bug 70958)',
+                               'Exact match not on top (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Bar',
@@ -244,7 +244,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match missing (bug 70958)',
+                               'Exact match missing (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Barbara',
index 6273f47..48a72d3 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace MediaWiki\Session;
 
-use AuthPlugin;
 use MediaWikiTestCase;
 use Psr\Log\LogLevel;
 use User;
@@ -1005,7 +1004,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( [
                        [
-                               LogLevel::WARNING,
+                               LogLevel::INFO,
                                'Session "{session}": Unverified user provided and no metadata to auth it',
                        ]
                ], $logger->getBuffer() );
index edb8f9f..7e37907 100644 (file)
@@ -148,6 +148,11 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $sites->count() );
        }
 
+       /**
+        * @param Site[] $sites
+        *
+        * @return SiteStore
+        */
        private function getHashSiteStore( array $sites ) {
                $siteStore = new HashSiteStore();
                $siteStore->saveSites( $sites );
index ff544cd..e8260ac 100644 (file)
@@ -39,4 +39,64 @@ class SkinTemplateTest extends MediaWikiTestCase {
                        ]
                ];
        }
+
+       /**
+        * @return PHPUnit_Framework_MockObject_MockObject|OutputPage
+        */
+       private function getMockOutputPage( $isSyndicated, $html ) {
+               $mock = $this->getMockBuilder( OutputPage::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mock->expects( $this->once() )
+                       ->method( 'isSyndicated' )
+                       ->will( $this->returnValue( $isSyndicated ) );
+               $mock->expects( $this->once() )
+                       ->method( 'getHTML' )
+                       ->will( $this->returnValue( $html ) );
+               return $mock;
+       }
+
+       public function provideSetupSkinUserCss() {
+               $defaultStyles = [
+                       'mediawiki.legacy.shared',
+                       'mediawiki.legacy.commonPrint',
+                       'mediawiki.sectionAnchor',
+               ];
+               $buttonStyle = 'mediawiki.ui.button';
+               $feedStyle = 'mediawiki.feedlink';
+               return [
+                       [
+                               $this->getMockOutputPage( false, '' ),
+                               $defaultStyles
+                       ],
+                       [
+                               $this->getMockOutputPage( true, '' ),
+                               array_merge( $defaultStyles, [ $feedStyle ] )
+                       ],
+                       [
+                               $this->getMockOutputPage( false, 'FOO mw-ui-button BAR' ),
+                               array_merge( $defaultStyles, [ $buttonStyle ] )
+                       ],
+                       [
+                               $this->getMockOutputPage( true, 'FOO mw-ui-button BAR' ),
+                               array_merge( $defaultStyles, [ $feedStyle, $buttonStyle ] )
+                       ],
+               ];
+       }
+
+       /**
+        * @param PHPUnit_Framework_MockObject_MockObject|OutputPage $outputPageMock
+        * @param string[] $expectedModuleStyles
+        *
+        * @covers SkinTemplate::setupSkinUserCss
+        * @dataProvider provideSetupSkinUserCss
+        */
+       public function testSetupSkinUserCss( $outputPageMock, $expectedModuleStyles ) {
+               $outputPageMock->expects( $this->once() )
+                       ->method( 'addModuleStyles' )
+                       ->with( $expectedModuleStyles );
+
+               $skinTemplate = new SkinTemplate();
+               $skinTemplate->setupSkinUserCss( $outputPageMock );
+       }
 }
index c1083af..1208a20 100644 (file)
  */
 class QueryAllSpecialPagesTest extends MediaWikiTestCase {
 
+       /**
+        * @var SpecialPage[]
+        */
+       private $queryPages;
+
        /** List query pages that can not be tested automatically */
        protected $manualTest = [
                'LinkSearchPage'
@@ -36,8 +41,9 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
 
                foreach ( QueryPage::getPages() as $page ) {
                        $class = $page[0];
+                       $name = $page[1];
                        if ( !in_array( $class, $this->manualTest ) ) {
-                               $this->queryPages[$class] = new $class;
+                               $this->queryPages[$class] = SpecialPageFactory::getPage( $name );
                        }
                }
        }
index 074045d..9c71261 100644 (file)
@@ -14,7 +14,7 @@ class SpecialBooksourcesTest extends SpecialPageTestBase {
                        [ '9780136091817', false ],
                        [ '123456789X', true ],
 
-                       // Bug 67021
+                       // T69021
                        [ '1413304541', false ],
                        [ '141330454X', false ],
                        [ '1413304540', true ],
index cd84d79..ab3ac55 100644 (file)
@@ -33,7 +33,7 @@ class SpecialEditWatchlistTest extends SpecialPageTestBase {
                $user = new TestUser( __METHOD__ );
                list( $html, ) = $this->executeSpecialPage( 'clear', null, 'qqx', $user->getUser() );
                $this->assertRegExp(
-                       '/<form action=".*?Special:EditWatchlist\/clear" method="post" class="visualClear">/',
+                       '/<form class="mw-htmlform" action=".*?Special:EditWatchlist\/clear" method="post">/',
                        $html
                );
        }
index cc16e5f..9b0fb6a 100644 (file)
@@ -22,9 +22,17 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        protected $rc;
 
        /** helper to test SpecialRecentchanges::buildMainQueryConds() */
-       private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
+       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();
@@ -40,12 +48,24 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       $expected,
-                       $queryConditions,
+                       self::normalizeCondition( $expected ),
+                       self::normalizeCondition( $queryConditions ),
                        $message
                );
        }
 
+       private static function normalizeCondition( $conds ) {
+               $normalized = array_map(
+                       function ( $k, $v ) {
+                               return is_numeric( $k ) ? $v : "$k = $v";
+                       },
+                       array_keys( $conds ),
+                       $conds
+               );
+               sort( $normalized );
+               return $normalized;
+       }
+
        /** return false if condition begin with 'rc_timestamp ' */
        private static function filterOutRcTimestampCondition( $var ) {
                return ( false === strpos( $var, 'rc_timestamp ' ) );
@@ -55,8 +75,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => "rc_namespace = '0'",
+                               "rc_type != '6'",
+                               "rc_namespace = '0'",
                        ],
                        [
                                'namespace' => NS_MAIN,
@@ -69,8 +89,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
+                               "rc_type != '6'",
+                               "rc_namespace != '0'",
                        ],
                        [
                                'namespace' => NS_MAIN,
@@ -81,15 +101,15 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @bug 2429
+        * T4429
         * @dataProvider provideNamespacesAssociations
         */
        public function testRcNsFilterAssociation( $ns1, $ns2 ) {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
+                               "rc_type != '6'",
+                               "(rc_namespace = '$ns1' OR rc_namespace = '$ns2')",
                        ],
                        [
                                'namespace' => $ns1,
@@ -100,15 +120,15 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @bug 2429
+        * T4429
         * @dataProvider provideNamespacesAssociations
         */
        public function testRcNsFilterAssociationWithInversion( $ns1, $ns2 ) {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
+                               "rc_type != '6'",
+                               "(rc_namespace != '$ns1' AND rc_namespace != '$ns2')",
                        ],
                        [
                                'namespace' => $ns1,
@@ -129,4 +149,380 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                        [ 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
+               );
+
+               $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 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
+               );
+       }
+
+       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
+               );
+       }
+
+       public function testRcHidepageedits() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                               "rc_type != '0'",
+                       ],
+                       [
+                               'hidepageedits' => 1,
+                       ],
+                       "rc conditions: hidepageedits=1"
+               );
+       }
+
+       public function testRcHidenewpages() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                               "rc_type != '1'",
+                       ],
+                       [
+                               'hidenewpages' => 1,
+                       ],
+                       "rc conditions: hidenewpages=1"
+               );
+       }
+
+       public function testRcHidelog() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                               "rc_type != '3'",
+                       ],
+                       [
+                               'hidelog' => 1,
+                       ],
+                       "rc conditions: hidelog=1"
+               );
+       }
+
+       public function testRcHidehumans() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 1,
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidebots' => 0,
+                               'hidehumans' => 1,
+                       ],
+                       "rc conditions: hidebots=0 hidehumans=1"
+               );
+       }
+
+       public function testRcHidepatrolledDisabledFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1 (user not allowed)",
+                       $user
+               );
+       }
+
+       public function testRcHideunpatrolledDisabledFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hideunpatrolled=1 (user not allowed)",
+                       $user
+               );
+       }
+       public function testRcHidepatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_patrolled = 0",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1",
+                       $user
+               );
+       }
+
+       public function testRcHideunpatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_patrolled = 1",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hideunpatrolled=1",
+                       $user
+               );
+       }
+
+       public function testRcHideminorFilter() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_minor = 0",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hideminor' => 1,
+                       ],
+                       "rc conditions: hideminor=1"
+               );
+       }
+
+       public function testRcHidemajorFilter() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_minor = 1",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidemajor' => 1,
+                       ],
+                       "rc conditions: hidemajor=1"
+               );
+       }
+
+       // This is probably going to change when we do auto-fix of
+       // filters combinations that don't make sense but for now
+       // it's the behavior therefore it's the test.
+       public function testRcHidepatrolledHideunpatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_patrolled = 0",
+                               "rc_patrolled = 1",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1 hideunpatrolled=1",
+                       $user
+               );
+       }
+
+       public function testFilterUserExpLevel() {
+               $this->setMwGlobals( [
+                       'wgLearnerEdits' => 10,
+                       'wgLearnerMemberSince' => 4,
+                       'wgExperiencedUserEdits' => 500,
+                       'wgExperiencedUserMemberSince' => 30,
+               ] );
+
+               $this->createUsers( [
+                       'Newcomer1' => [ 'edits' => 2, 'days' => 2 ],
+                       'Newcomer2' => [ 'edits' => 12, 'days' => 3 ],
+                       'Newcomer3' => [ 'edits' => 8, 'days' => 5 ],
+                       'Learner1' => [ 'edits' => 15, 'days' => 10 ],
+                       'Learner2' => [ 'edits' => 450, 'days' => 20 ],
+                       'Learner3' => [ 'edits' => 460, 'days' => 33 ],
+                       'Learner4' => [ 'edits' => 525, 'days' => 28 ],
+                       'Experienced1' => [ 'edits' => 538, 'days' => 33 ],
+               ] );
+
+               // newcomers only
+               $this->assertArrayEquals(
+                       [ 'Newcomer1', 'Newcomer2', 'Newcomer3' ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer' ] )
+               );
+
+               // newcomers and learner
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer,learner' ] )
+               );
+
+               // newcomers and more learner
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer,experienced' ] )
+               );
+
+               // learner only
+               $this->assertArrayEquals(
+                       [ 'Learner1', 'Learner2', 'Learner3', 'Learner4' ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'learner' ] )
+               );
+
+               // more experienced only
+               $this->assertArrayEquals(
+                       [ 'Experienced1' ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'experienced' ] )
+               );
+
+               // learner and more experienced
+               $this->assertArrayEquals(
+                       [
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'learner,experienced' ] )
+               );
+
+               // newcomers, learner, and more experienced
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer,learner,experienced' ] )
+               );
+
+               // 'all'
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'all' ] )
+               );
+       }
+
+       private function createUsers( $specs ) {
+               $dbw = wfGetDB( DB_MASTER );
+               foreach ( $specs as $name => $spec ) {
+                       User::createNew(
+                               $name,
+                               [
+                                       'editcount' => $spec['edits'],
+                                       'registration' => $dbw->timestamp( $this->daysAgo( $spec['days'] ) ),
+                                       'email' => 'ut',
+                               ]
+                       );
+               }
+       }
+
+       private function fetchUsers( $filters ) {
+               $specialRC = new SpecialRecentChanges();
+
+               $tables = [];
+               $conds = [];
+               $join_conds = [];
+
+               $specialRC->filterOnUserExperienceLevel(
+                       $tables,
+                       $conds,
+                       $join_conds,
+                       $filters
+               );
+
+               $result = wfGetDB( DB_MASTER )->select(
+                       'user',
+                       'user_name',
+                       array_filter( $conds ) + [ 'user_email' => 'ut' ]
+               );
+
+               $usernames = [];
+               foreach ( $result as $row ) {
+                       $usernames[] = $row->user_name;
+               }
+
+               return $usernames;
+       }
+
+       private function daysAgo( $days ) {
+               $secondsPerDay = 86400;
+               return time() - $days * $secondsPerDay;
+       }
 }
index 3fa8a9f..9daae97 100644 (file)
@@ -73,7 +73,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        [
                                $EMPTY_REQUEST, $NO_USER_PREF,
                                'default', $defaultNS,
-                               'Bug 33270: No request nor user preferences should give default profile'
+                               'T35270: No request nor user preferences should give default profile'
                        ],
                        [
                                [ 'ns5' => 1 ], $NO_USER_PREF,
@@ -88,7 +88,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                                return "searchNs$ns";
                        }, $defaultNS ), 0 ),
                                'advanced', [ 2, 14 ],
-                               'Bug 33583: search with no option should honor User search preferences'
+                               'T35583: search with no option should honor User search preferences'
                                        . ' and have all other namespace disabled'
                        ],
                ];
@@ -121,13 +121,15 @@ class SpecialSearchTest extends MediaWikiTestCase {
                ] );
 
                # Initialize [[Special::Search]]
+               $ctx = new RequestContext();
+               $term = '{{SITENAME}}';
+               $ctx->setRequest( new FauxRequest( [ 'search' => $term, 'fulltext' => 1 ] ) );
+               $ctx->setTitle( Title::newFromText( 'Special:Search' ) );
                $search = new SpecialSearch();
-               $search->getContext()->setTitle( Title::newFromText( 'Special:Search' ) );
-               $search->load();
+               $search->setContext( $ctx );
 
                # Simulate a user searching for a given term
-               $term = '{{SITENAME}}';
-               $search->showResults( $term );
+               $search->execute( '' );
 
                # Lookup the HTML page title set for that page
                $pageTitle = $search
@@ -203,6 +205,27 @@ class SpecialSearchTest extends MediaWikiTestCase {
 
                return $mock;
        }
+
+       public function testSubPageRedirect() {
+               $this->setMwGlobals( [
+                       'wgScript' => '/w/index.php',
+               ] );
+
+               $ctx = new RequestContext;
+               $sp = Title::newFromText( 'Special:Search/foo_bar' );
+               SpecialPageFactory::executePath( $sp, $ctx );
+               $url = $ctx->getOutput()->getRedirect();
+               // some older versions of hhvm have a bug that doesn't parse relative
+               // urls with a port, so help it out a little bit.
+               // https://github.com/facebook/hhvm/issues/7136
+               $url = wfExpandUrl( $url, PROTO_CURRENT );
+
+               $parts = parse_url( $url );
+               $this->assertEquals( '/w/index.php', $parts['path'] );
+               parse_str( $parts['query'], $query );
+               $this->assertEquals( 'Special:Search', $query['title'] );
+               $this->assertEquals( 'foo bar', $query['search'] );
+       }
 }
 
 class SpecialSearchTestMockResultSet extends SearchResultSet {
diff --git a/tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php b/tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php
new file mode 100644 (file)
index 0000000..64e78f2
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Tests for Special:Uncategorizedcategories
+ */
+class UncategorizedCategoriesPageTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider provideTestGetQueryInfoData
+        */
+       public function testGetQueryInfo( $msgContent, $expected ) {
+               $msg = new RawMessage( $msgContent );
+               $mockContext = $this->getMockBuilder( 'RequestContext' )->getMock();
+               $mockContext->method( 'msg' )->willReturn( $msg );
+               $special = new UncategorizedCategoriesPage();
+               $special->setContext( $mockContext );
+               $this->assertEquals( [
+                       'tables' => [
+                               0 => 'page',
+                               1 => 'categorylinks',
+                       ],
+                       'fields' => [
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title',
+                       ],
+                       'conds' => [
+                               0 => 'cl_from IS NULL',
+                               'page_namespace' => 14,
+                               'page_is_redirect' => 0,
+                       ] + $expected,
+                       'join_conds' => [
+                               'categorylinks' => [
+                                       0 => 'LEFT JOIN',
+                                       1 => 'cl_from = page_id',
+                               ],
+                       ],
+               ], $special->getQueryInfo() );
+       }
+
+       public function provideTestGetQueryInfoData() {
+               return [
+                       [
+                               "* Stubs\n* Test\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'Stubs','Test','*','*_test123' )" ]
+                       ],
+                       [
+                               "Stubs\n* Test\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'Test','*','*_test123' )" ]
+                       ],
+                       [
+                               "* StubsTest\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'StubsTest','*','*_test123' )" ]
+                       ],
+                       [ "", [] ],
+                       [ "\n\n\n", [] ],
+                       [ "\n", [] ],
+                       [ "Test\n*Test2", [ 1 => "page_title not in ( 'Test2' )" ] ],
+                       [ "Test", [] ],
+                       [ "*Test\nTest2", [ 1 => "page_title not in ( 'Test' )" ] ],
+                       [ "Test\nTest2", [] ],
+               ];
+       }
+}
index f69ecaf..d93181c 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class BalancerTest extends MediaWikiTestCase {
-       private $balancer;
 
        /**
         * Anything that needs to happen before your tests should go here.
@@ -11,20 +10,20 @@ class BalancerTest extends MediaWikiTestCase {
                // This makes sure that all the various cleanup and restorations
                // happen as they should (including the restoration for setMwGlobals).
                parent::setUp();
-               $this->balancer = new MediaWiki\Tidy\Balancer( [
-                       'strict' => false, /* not strict */
-                       'allowedHtmlElements' => null, /* no sanitization */
-                       'tidyCompat' => false, /* standard parser */
-                       'allowComments' => true, /* comment parsing */
-               ] );
        }
 
        /**
         * @covers MediaWiki\Tidy\Balancer::balance
         * @dataProvider provideBalancerTests
         */
-       public function testBalancer( $description, $input, $expected ) {
-               $output = $this->balancer->balance( $input );
+       public function testBalancer( $description, $input, $expected, $useTidy ) {
+               $balancer = new MediaWiki\Tidy\Balancer( [
+                       'strict' => false, /* not strict */
+                       'allowedHtmlElements' => null, /* no sanitization */
+                       'tidyCompat' => $useTidy, /* standard parser */
+                       'allowComments' => true, /* comment parsing */
+               ] );
+               $output = $balancer->balance( $input );
 
                // Ignore self-closing tags
                $output = preg_replace( '/\s*\/>/', '>', $output );
@@ -86,7 +85,7 @@ class BalancerTest extends MediaWikiTestCase {
                                        // Skip tests involving unusual doctypes.
                                        continue;
                                }
-                               $literalre = "~ <rdar: | <isindex | < /? (
+                               $literalre = "~ <rdar: | < /? (
                                        html | head | body | frame | frameset | plaintext
                                ) > ~xi";
                                if ( preg_match( $literalre, $case['data'] ) ) {
@@ -146,10 +145,20 @@ class BalancerTest extends MediaWikiTestCase {
                                $tests[] = [
                                        $filename, # use better description?
                                        $data,
-                                       $html
+                                       $html,
+                                       false # strict HTML5 compat mode, no tidy
                                ];
                        }
                }
+
+               # Some additional tests for mediawiki-specific features
+               $tests[] = [
+                       'Round-trip serialization for <pre>/<listing>/<textarea>',
+                       "<pre>\n\na</pre><listing>\n\nb</listing><textarea>\n\nc</textarea>",
+                       "<pre>\n\na</pre><listing>\n\nb</listing><textarea>\n\nc</textarea>",
+                       true # use the tidy-compatible mode
+               ];
+
                return $tests;
        }
 }
index beb3659..2b1c3e8 100644 (file)
         "html": "<html><head></head><body><p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p></body></html>",
         "noQuirksBodyHtml": "<p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p>"
       }
+    },
+    {
+      "data": "<b><em><foo><foob><fooc><aside></b></em>",
+      "errors": [
+        "(1,35): adoption-agency-1.3",
+        "(1,40): adoption-agency-1.3",
+        "(1,40): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "em": true,
+            "foo": true,
+            "foob": true,
+            "fooc": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b",
+            "children": [
+              {
+                "tag": "em",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "children": [
+                      {
+                        "tag": "foob",
+                        "children": [
+                          {
+                            "tag": "fooc"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "tag": "aside",
+            "children": [
+              {
+                "tag": "b"
+              }
+            ]
+          }
+        ],
+        "html": "<b><em><foo><foob><fooc></fooc></foob></foo></em></b><aside><b></b></aside>",
+        "noQuirksBodyHtml": "<b><em><foo><foob><fooc></fooc></foob></foo></em></b><aside><b></b></aside>"
+      }
     }
   ],
   "adoption02.dat": [
       "data": "FOO&#11111111111ZOO",
       "errors": [
         "(1,3): expected-doctype-but-got-chars",
-        "(1,13): illegal-codepoint-for-numeric-entity"
+        "(1,16): numeric-entity-without-semicolon",
+        "(1,16): illegal-codepoint-for-numeric-entity"
       ],
       "document": {
         "props": {
       "data": "FOO&#1111111111ZOO",
       "errors": [
         "(1,3): expected-doctype-but-got-chars",
-        "(1,13): illegal-codepoint-for-numeric-entity"
+        "(1,15): numeric-entity-without-semicolon",
+        "(1,15): illegal-codepoint-for-numeric-entity"
       ],
       "document": {
         "props": {
       "data": "FOO&#111111111111ZOO",
       "errors": [
         "(1,3): expected-doctype-but-got-chars",
-        "(1,13): illegal-codepoint-for-numeric-entity"
+        "(1,17): numeric-entity-without-semicolon",
+        "(1,17): illegal-codepoint-for-numeric-entity"
       ],
       "document": {
         "props": {
     {
       "data": "<plaintext><foo>",
       "errors": [
-        "16: End of file seen and there were open elements.",
-        "11: Unclosed element “plaintext”."
+        "(1,16): expected-closing-tag-but-got-eof"
       ],
       "fragment": {
         "name": "desc",
       "data": "<isindex>",
       "errors": [
         "(1,9): expected-doctype-but-got-start-tag",
-        "(1,9): deprecated-tag"
+        "(1,9): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
+            "isindex": true
           }
         },
         "tree": [
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
+                    "tag": "isindex"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+        "html": "<html><head></head><body><isindex></isindex></body></html>",
+        "noQuirksBodyHtml": "<isindex></isindex>"
       }
     },
     {
       "data": "<isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\">",
       "errors": [
         "(1,48): expected-doctype-but-got-start-tag",
-        "(1,48): deprecated-tag"
+        "(1,48): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
+            "isindex": true
           }
         },
         "tree": [
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form",
+                    "tag": "isindex",
                     "attrs": [
                       {
                         "name": "action",
                         "value": "B"
-                      }
-                    ],
-                    "children": [
+                      },
                       {
-                        "tag": "hr"
+                        "name": "foo",
+                        "value": "D"
                       },
                       {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "C"
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "foo",
-                                "value": "D"
-                              },
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
+                        "name": "name",
+                        "value": "A"
                       },
                       {
-                        "tag": "hr"
+                        "name": "prompt",
+                        "value": "C"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<html><head></head><body><form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form>"
+        "html": "<html><head></head><body><isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\"></isindex></body></html>",
+        "noQuirksBodyHtml": "<isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\"></isindex>"
       }
     },
     {
       "data": "<form><isindex>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,15): deprecated-tag",
         "(1,15): expected-closing-tag-but-got-eof"
       ],
       "document": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true
+            "form": true,
+            "isindex": true
           }
         },
         "tree": [
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form"
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "isindex"
+                      }
+                    ]
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><form></form></body></html>",
-        "noQuirksBodyHtml": "<form></form>"
+        "html": "<html><head></head><body><form><isindex></isindex></form></body></html>",
+        "noQuirksBodyHtml": "<form><isindex></isindex></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><isindex>x</isindex>x",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "isindex": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "isindex",
+                    "children": [
+                      {
+                        "text": "x"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><isindex>x</isindex>x</body></html>",
+        "noQuirksBodyHtml": "<isindex>x</isindex>x"
       }
     }
   ],
       }
     },
     {
-      "data": "<!doctype html><main><p>foo</main>bar",
-      "errors": [],
+      "data": "<!doctype html><main><p>foo</main>bar",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "main": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "main",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "bar"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><main><p>foo</p></main>bar</body></html>",
+        "noQuirksBodyHtml": "<main><p>foo</p></main>bar"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>xxx<svg><x><g><a><main><b>",
+      "errors": [
+        " * (1,42) unexpected HTML-like start tag token in foreign content",
+        " * (1,42) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg x": true,
+            "svg g": true,
+            "svg a": true,
+            "svg main": true,
+            "b": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "xxx"
+                  },
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "x",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "g",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "a",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "main",
+                                    "ns": "http://www.w3.org/2000/svg"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>xxx<svg><x><g><a><main></main></a></g></x></svg><b></b></body></html>",
+        "noQuirksBodyHtml": "xxx<svg><x><g><a><main><b></b></main></a></g></x></svg>"
+      }
+    }
+  ],
+  "math.dat": [
+    {
+      "data": "<math><tr><td><mo><tr>",
+      "errors": [],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tr": true,
+            "math td": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tr",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "td",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tr><td><mo></mo></td></tr></math>",
+        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+      }
+    },
+    {
+      "data": "<math><tr><td><mo><tr>",
+      "errors": [],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tr": true,
+            "math td": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tr",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "td",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tr><td><mo></mo></td></tr></math>",
+        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+      }
+    },
+    {
+      "data": "<math><thead><mo><tbody>",
+      "errors": [],
+      "fragment": {
+        "name": "thead"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math thead": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "thead",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><thead><mo></mo></thead></math>",
+        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+      }
+    },
+    {
+      "data": "<math><tfoot><mo><tbody>",
+      "errors": [],
+      "fragment": {
+        "name": "tfoot"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tfoot": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tfoot",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tfoot><mo></mo></tfoot></math>",
+        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+      }
+    },
+    {
+      "data": "<math><tbody><mo><tfoot>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tbody": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tbody",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tbody><mo></mo></tbody></math>",
+        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+      }
+    },
+    {
+      "data": "<math><tbody><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tbody": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tbody",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tbody><mo></mo></tbody></math>",
+        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+      }
+    },
+    {
+      "data": "<math><thead><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math thead": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "thead",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><thead><mo></mo></thead></math>",
+        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+      }
+    },
+    {
+      "data": "<math><tfoot><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tfoot": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tfoot",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tfoot><mo></mo></tfoot></math>",
+        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+      }
+    }
+  ],
+  "menuitem-element.dat": [
+    {
+      "data": "<menuitem>",
+      "errors": [
+        "10: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><menuitem></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem></menuitem>"
+      }
+    },
+    {
+      "data": "</menuitem>",
+      "errors": [
+        "11: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.",
+        "11: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A<menuitem>B",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "B"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem><menuitem>B</menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem><menuitem>B</menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A<menu>B</menu>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "menu": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "menu",
+                    "children": [
+                      {
+                        "text": "B"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem><menu>B</menu></body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem><menu>B</menu>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A<hr>B",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "hr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "hr"
+                  },
+                  {
+                    "text": "B"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem><hr>B</body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem><hr>B"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><li><menuitem><li>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "li": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "li",
+                    "children": [
+                      {
+                        "tag": "menuitem"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "li"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><li><menuitem></menuitem></li><li></li></body></html>",
+        "noQuirksBodyHtml": "<li><menuitem></menuitem></li><li></li>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><p></menuitem>x",
+      "errors": [
+        "39: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "x"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><p>x</p></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><p>x</p></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><p><b></p><menuitem>",
+      "errors": [
+        "25: End tag “p” seen, but there were open elements.",
+        "21: Unclosed element “b”.",
+        "35: End of file seen and there were open elements."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "menuitem"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><b></b></p><b><menuitem></menuitem></b></body></html>",
+        "noQuirksBodyHtml": "<p><b></b></p><b><menuitem></menuitem></b>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><asdf></menuitem>x",
+      "errors": [
+        "40: End tag “menuitem” seen, but there were open elements.",
+        "31: Unclosed element “asdf”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "asdf": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "asdf"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><asdf></asdf></menuitem>x</body></html>",
+        "noQuirksBodyHtml": "<menuitem><asdf></asdf></menuitem>x"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html></menuitem>",
+      "errors": [
+        "26: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html></menuitem>",
+      "errors": [
+        "26: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><head></menuitem>",
+      "errors": [
+        "26: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><select><menuitem></select>",
+      "errors": [
+        "33: Stray start tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><option><menuitem>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "option": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "tag": "menuitem"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><option><menuitem></menuitem></option></body></html>",
+        "noQuirksBodyHtml": "<option><menuitem></menuitem></option>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><option>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><option></option></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><option></option></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem></body>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><p>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "p"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><p></p></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><p></p></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><li>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "li": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "li"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><li></li></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><li></li></menuitem>"
+      }
+    }
+  ],
+  "namespace-sensitivity.dat": [
+    {
+      "data": "<body><table><tr><td><svg><td><foreignObject><span></td>Foo",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg td": true,
+            "svg foreignObject": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Foo"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "td",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "tag": "foreignObject",
+                                            "ns": "http://www.w3.org/2000/svg",
+                                            "children": [
+                                              {
+                                                "tag": "span"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table>"
+      }
+    }
+  ],
+  "noscript01.dat": [
+    {
+      "data": "<head><noscript><!doctype html><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 31 Unexpected DOCTYPE. Ignored."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><html class=\"foo\"><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 34 html needs to be the first start tag."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "class",
+                "value": "foo"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html class=\"foo\"><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript></noscript>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-tag"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript>   </noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "   ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript>   </noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript>   </noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><!--foo--></noscript>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-tag"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><basefont><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "basefont": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "tag": "basefont"
+                      },
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><basefont><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><basefont><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><bgsound><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "bgsound": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "tag": "bgsound"
+                      },
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><bgsound><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><bgsound><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><link><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
             "html": true,
             "head": true,
-            "body": true,
-            "main": true,
-            "p": true
+            "noscript": true,
+            "link": true,
+            "body": true
           },
-          "doctype": true
+          "comment": true
         },
         "tree": [
-          {
-            "doctype": "html"
-          },
           {
             "tag": "html",
             "children": [
               {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "main",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "p",
-                        "children": [
-                          {
-                            "text": "foo"
-                          }
-                        ]
+                        "tag": "link"
+                      },
+                      {
+                        "comment": "foo"
                       }
                     ]
-                  },
-                  {
-                    "text": "bar"
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><main><p>foo</p></main>bar</body></html>",
-        "noQuirksBodyHtml": "<main><p>foo</p></main>bar"
+        "html": "<html><head><noscript><link><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><link><!--foo--></noscript>"
       }
     },
     {
-      "data": "<!DOCTYPE html>xxx<svg><x><g><a><main><b>",
+      "data": "<head><noscript><meta><!--foo--></noscript>",
       "errors": [
-        " * (1,42) unexpected HTML-like start tag token in foreign content",
-        " * (1,42) unexpected end of file"
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
       ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
             "html": true,
             "head": true,
-            "body": true,
-            "svg svg": true,
-            "svg x": true,
-            "svg g": true,
-            "svg a": true,
-            "svg main": true,
-            "b": true
+            "noscript": true,
+            "meta": true,
+            "body": true
           },
-          "doctype": true
+          "comment": true
         },
         "tree": [
-          {
-            "doctype": "html"
-          },
           {
             "tag": "html",
             "children": [
               {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
+                "tag": "head",
                 "children": [
                   {
-                    "text": "xxx"
-                  },
-                  {
-                    "tag": "svg",
-                    "ns": "http://www.w3.org/2000/svg",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "x",
-                        "ns": "http://www.w3.org/2000/svg",
-                        "children": [
-                          {
-                            "tag": "g",
-                            "ns": "http://www.w3.org/2000/svg",
-                            "children": [
-                              {
-                                "tag": "a",
-                                "ns": "http://www.w3.org/2000/svg",
-                                "children": [
-                                  {
-                                    "tag": "main",
-                                    "ns": "http://www.w3.org/2000/svg"
-                                  }
-                                ]
-                              }
-                            ]
-                          }
-                        ]
+                        "tag": "meta"
+                      },
+                      {
+                        "comment": "foo"
                       }
                     ]
-                  },
-                  {
-                    "tag": "b"
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body>xxx<svg><x><g><a><main></main></a></g></x></svg><b></b></body></html>",
-        "noQuirksBodyHtml": "xxx<svg><x><g><a><main><b></b></main></a></g></x></svg>"
+        "html": "<html><head><noscript><meta><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><meta><!--foo--></noscript>"
       }
-    }
-  ],
-  "math.dat": [
+    },
     {
-      "data": "<math><tr><td><mo><tr>",
-      "errors": [],
-      "fragment": {
-        "name": "td"
-      },
+      "data": "<head><noscript><noframes>XXX</noscript></noframes></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tr": true,
-            "math td": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "noframes": true,
+            "body": true
+          },
+          "no_escape": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tr",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "td",
-                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "mo",
-                        "ns": "http://www.w3.org/1998/Math/MathML"
+                        "tag": "noframes",
+                        "children": [
+                          {
+                            "text": "XXX</noscript>",
+                            "no_escape": true
+                          }
+                        ]
                       }
                     ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tr><td><mo></mo></td></tr></math>",
-        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+        "html": "<html><head><noscript><noframes>XXX</noscript></noframes></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><noframes>XXX</noscript></noframes></noscript>"
       }
     },
     {
-      "data": "<math><tr><td><mo><tr>",
-      "errors": [],
-      "fragment": {
-        "name": "tr"
-      },
+      "data": "<head><noscript><style>XXX</style></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tr": true,
-            "math td": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tr",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "td",
-                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "mo",
-                        "ns": "http://www.w3.org/1998/Math/MathML"
+                        "tag": "style",
+                        "children": [
+                          {
+                            "text": "XXX",
+                            "no_escape": true
+                          }
+                        ]
                       }
                     ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tr><td><mo></mo></td></tr></math>",
-        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+        "html": "<html><head><noscript><style>XXX</style></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><style>XXX</style></noscript>"
       }
     },
     {
-      "data": "<math><thead><mo><tbody>",
-      "errors": [],
-      "fragment": {
-        "name": "thead"
-      },
+      "data": "<head><noscript></br><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 21 Element br not allowed in a inhead-noscript context",
+        "Line: 1 Col: 21 Unexpected end tag (br). Treated as br element.",
+        "Line: 1 Col: 42 Unexpected end tag (noscript). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math thead": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true,
+            "br": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "thead",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "comment": "foo"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<math><thead><mo></mo></thead></math>",
-        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+        "html": "<html><head><noscript></noscript></head><body><br><!--foo--></body></html>",
+        "noQuirksBodyHtml": "<noscript><br><!--foo--></noscript>"
       }
     },
     {
-      "data": "<math><tfoot><mo><tbody>",
-      "errors": [],
-      "fragment": {
-        "name": "tfoot"
-      },
+      "data": "<head><noscript><head class=\"foo\"><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 34 Unexpected start tag (head)."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tfoot": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tfoot",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tfoot><mo></mo></tfoot></math>",
-        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
       }
     },
     {
-      "data": "<math><tbody><mo><tfoot>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript><noscript class=\"foo\"><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 34 Unexpected start tag (noscript)."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tbody": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tbody",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tbody><mo></mo></tbody></math>",
-        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><noscript class=\"foo\"><!--foo--></noscript></noscript>"
       }
     },
     {
-      "data": "<math><tbody><mo></table>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript></p><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 20 Unexpected end tag (p). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tbody": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tbody",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tbody><mo></mo></tbody></math>",
-        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><p></p><!--foo--></noscript>"
       }
     },
     {
-      "data": "<math><thead><mo></table>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript><p><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 19 Element p not allowed in a inhead-noscript context",
+        "Line: 1 Col: 40 Unexpected end tag (noscript). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math thead": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true,
+            "p": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "thead",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<math><thead><mo></mo></thead></math>",
-        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+        "html": "<html><head><noscript></noscript></head><body><p><!--foo--></p></body></html>",
+        "noQuirksBodyHtml": "<noscript><p><!--foo--></p></noscript>"
       }
     },
     {
-      "data": "<math><tfoot><mo></table>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript>XXX<!--foo--></noscript></head>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 19 Unexpected non-space character. Expected inhead-noscript content",
+        "Line: 1 Col: 30 Unexpected end tag (noscript). Ignored.",
+        "Line: 1 Col: 37 Unexpected end tag (head). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tfoot": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tfoot",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "XXX"
+                  },
+                  {
+                    "comment": "foo"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<math><tfoot><mo></mo></tfoot></math>",
-        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+        "html": "<html><head><noscript></noscript></head><body>XXX<!--foo--></body></html>",
+        "noQuirksBodyHtml": "<noscript>XXX<!--foo--></noscript>"
       }
-    }
-  ],
-  "namespace-sensitivity.dat": [
+    },
     {
-      "data": "<body><table><tr><td><svg><td><foreignObject><span></td>Foo",
-      "errors": [],
+      "data": "<head><noscript>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-tag",
+        "(1,6): eof-in-head-noscript"
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
             "html": true,
             "head": true,
-            "body": true,
-            "table": true,
-            "tbody": true,
-            "tr": true,
-            "td": true,
-            "svg svg": true,
-            "svg td": true,
-            "svg foreignObject": true,
-            "span": true
+            "noscript": true,
+            "body": true
           }
         },
         "tree": [
             "tag": "html",
             "children": [
               {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
+                "tag": "head",
                 "children": [
                   {
-                    "text": "Foo"
-                  },
-                  {
-                    "tag": "table",
-                    "children": [
-                      {
-                        "tag": "tbody",
-                        "children": [
-                          {
-                            "tag": "tr",
-                            "children": [
-                              {
-                                "tag": "td",
-                                "children": [
-                                  {
-                                    "tag": "svg",
-                                    "ns": "http://www.w3.org/2000/svg",
-                                    "children": [
-                                      {
-                                        "tag": "td",
-                                        "ns": "http://www.w3.org/2000/svg",
-                                        "children": [
-                                          {
-                                            "tag": "foreignObject",
-                                            "ns": "http://www.w3.org/2000/svg",
-                                            "children": [
-                                              {
-                                                "tag": "span"
-                                              }
-                                            ]
-                                          }
-                                        ]
-                                      }
-                                    ]
-                                  }
-                                ]
-                              }
-                            ]
-                          }
-                        ]
-                      }
-                    ]
+                    "tag": "noscript"
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<html><head></head><body>Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table></body></html>",
-        "noQuirksBodyHtml": "Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table>"
+        "html": "<html><head><noscript></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript></noscript>"
       }
     }
   ],
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nA",
-                        "extraNL": true
+                        "text": "\nA"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nA</pre>"
       }
     },
     {
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nA",
-                        "extraNL": true
+                        "text": "\nA"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nA</pre>"
       }
     },
     {
     {
       "data": "<html><ruby>a<rb>b<span></ruby></html>",
       "errors": [
-        "(1,6): expected-doctype-but-got-start-tag"
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,31): unexpected-end-tag"
       ],
       "document": {
         "props": {
     {
       "data": "<html><ruby>a<rt>b<span></ruby></html>",
       "errors": [
-        "(1,6): expected-doctype-but-got-start-tag"
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,31): unexpected-end-tag"
       ],
       "document": {
         "props": {
     {
       "data": "<html><ruby>a<rp>b<span></ruby></html>",
       "errors": [
-        "(1,6): expected-doctype-but-got-start-tag"
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,31): unexpected-end-tag"
       ],
       "document": {
         "props": {
         "(1,11): unexpected-start-tag-in-select",
         "(1,27): unexpected-select-in-select",
         "(1,39): unexpected-end-tag",
-        "(1,48): unexpected-end-tag",
-        "(1,49): expected-closing-tag-but-got-eof"
+        "(1,48): unexpected-end-tag"
       ],
       "document": {
         "props": {
         "(1,11): unexpected-start-tag-in-select",
         "(1,27): unexpected-select-in-select",
         "(1,39): unexpected-end-tag",
-        "(1,48): unexpected-end-tag",
-        "(1,48): expected-closing-tag-but-got-eof"
+        "(1,48): unexpected-end-tag"
       ],
       "document": {
         "props": {
         "noQuirksBodyHtml": "<math attributename=\"\" attributetype=\"\" basefrequency=\"\" baseprofile=\"\" calcmode=\"\" clippathunits=\"\" diffuseconstant=\"\" edgemode=\"\" filterunits=\"\" glyphref=\"\" gradienttransform=\"\" gradientunits=\"\" kernelmatrix=\"\" kernelunitlength=\"\" keypoints=\"\" keysplines=\"\" keytimes=\"\" lengthadjust=\"\" limitingconeangle=\"\" markerheight=\"\" markerunits=\"\" markerwidth=\"\" maskcontentunits=\"\" maskunits=\"\" numoctaves=\"\" pathlength=\"\" patterncontentunits=\"\" patterntransform=\"\" patternunits=\"\" pointsatx=\"\" pointsaty=\"\" pointsatz=\"\" preservealpha=\"\" preserveaspectratio=\"\" primitiveunits=\"\" refx=\"\" refy=\"\" repeatcount=\"\" repeatdur=\"\" requiredextensions=\"\" requiredfeatures=\"\" specularconstant=\"\" specularexponent=\"\" spreadmethod=\"\" startoffset=\"\" stddeviation=\"\" stitchtiles=\"\" surfacescale=\"\" systemlanguage=\"\" tablevalues=\"\" targetx=\"\" targety=\"\" textlength=\"\" viewbox=\"\" viewtarget=\"\" xchannelselector=\"\" ychannelselector=\"\" zoomandpan=\"\"></math>"
       }
     },
+    {
+      "data": "<!DOCTYPE html><body><svg contentScriptType='' contentStyleType='' externalResourcesRequired='' filterRes=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg contentScriptType=\"\" contentStyleType=\"\" externalResourcesRequired=\"\" filterres=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' EXTERNALRESOURCESREQUIRED='' FILTERRES=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg contentScriptType=\"\" contentStyleType=\"\" externalResourcesRequired=\"\" filterres=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg contentscripttype='' contentstyletype='' externalresourcesrequired='' filterres=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg contentScriptType=\"\" contentStyleType=\"\" externalResourcesRequired=\"\" filterres=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><math contentScriptType='' contentStyleType='' externalResourcesRequired='' filterRes=''></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></math></body></html>",
+        "noQuirksBodyHtml": "<math contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></math>"
+      }
+    },
     {
       "data": "<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg>",
       "errors": [],
     {
       "data": "<!doctype html><script><!",
       "errors": [
+        "(1,25): expected-script-data-but-got-eof",
         "(1,25): expected-named-closing-tag-but-got-eof"
       ],
       "document": {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><iframe></noscript></head><body>X</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
       "data": "<script><!",
       "errors": [
         "(1,8): expected-doctype-but-got-start-tag",
+        "(1,10): expected-script-data-but-got-eof",
         "(1,10): expected-named-closing-tag-but-got-eof"
       ],
       "document": {
           }
         ],
         "html": "<html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><iframe></noscript></head><body>X</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
         "noQuirksBodyHtml": "<p></p><h1></h1>"
       }
     },
-    {
-      "data": "<!doctype html><form><isindex>",
-      "errors": [
-        "(1,30): deprecated-tag",
-        "(1,30): expected-closing-tag-but-got-eof"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form></form></body></html>",
-        "noQuirksBodyHtml": "<form></form>"
-      }
-    },
-    {
-      "data": "<!doctype html><isindex action=\"POST\">",
-      "errors": [
-        "(1,38): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "attrs": [
-                      {
-                        "name": "action",
-                        "value": "POST"
-                      }
-                    ],
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
-      }
-    },
-    {
-      "data": "<!doctype html><isindex prompt=\"this is isindex\">",
-      "errors": [
-        "(1,49): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "this is isindex"
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form>"
-      }
-    },
     {
       "data": "<!doctype html><isindex type=\"hidden\">",
       "errors": [
-        "(1,38): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              },
-                              {
-                                "name": "type",
-                                "value": "hidden"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form>"
-      }
-    },
-    {
-      "data": "<!doctype html><isindex name=\"foo\">",
-      "errors": [
-        "(1,35): deprecated-tag"
+        "(1,38): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
+            "isindex": true
           },
           "doctype": true
         },
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
+                    "tag": "isindex",
+                    "attrs": [
                       {
-                        "tag": "hr"
+                        "name": "type",
+                        "value": "hidden"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+        "html": "<!DOCTYPE html><html><head></head><body><isindex type=\"hidden\"></isindex></body></html>",
+        "noQuirksBodyHtml": "<isindex type=\"hidden\"></isindex>"
       }
     },
     {
     {
       "data": "<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>",
       "errors": [
-        "(1,68): unexpected-select-in-select",
-        "(1,76): expected-closing-tag-but-got-eof"
+        "(1,68): unexpected-select-in-select"
       ],
       "document": {
         "props": {
         "noQuirksBodyHtml": "<!-- XXX - XXX - XXX -->"
       }
     },
-    {
-      "data": "<isindex test=x name=x>",
-      "errors": [
-        "(1,23): expected-doctype-but-got-start-tag",
-        "(1,23): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          }
-        },
-        "tree": [
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              },
-                              {
-                                "name": "test",
-                                "value": "x"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form>"
-      }
-    },
     {
       "data": "test\ntest",
       "errors": [
     {
       "data": "<option><option>",
       "errors": [
-        "(1,8): expected-doctype-but-got-start-tag",
-        "(1,16): expected-closing-tag-but-got-eof"
+        "(1,8): expected-doctype-but-got-start-tag"
       ],
       "document": {
         "props": {
                     "children": [
                       {
                         "tag": "annotation-xml",
-                        "ns": "http://www.w3.org/1998/Math/MathML"
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"application/svg+xml\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,58): unexpected-html-element-in-foreign-content",
+        "(1,58): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "application/svg+xml"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/svg+xml\"></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/svg+xml\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,60): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "application/xhtml+xml"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,60): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "aPPlication/xhtmL+xMl"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"text/html\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,48): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "text/html"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
                       }
                     ]
-                  },
-                  {
-                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml></annotation-xml></math><div></div></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"application/svg+xml\"><div>",
+      "data": "<math><annotation-xml encoding=\"Text/htmL\"><div>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,58): unexpected-html-element-in-foreign-content",
-        "(1,58): expected-closing-tag-but-got-eof"
+        "(1,48): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
                         "attrs": [
                           {
                             "name": "encoding",
-                            "value": "application/svg+xml"
+                            "value": "Text/htmL"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
                           }
                         ]
                       }
                     ]
-                  },
-                  {
-                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/svg+xml\"></annotation-xml></math><div></div></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/svg+xml\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>",
+      "data": "<math><annotation-xml encoding=\" text/html \"><div>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,60): expected-closing-tag-but-got-eof"
+        "(1,50): unexpected-html-element-in-foreign-content",
+        "(1,50): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
                         "attrs": [
                           {
                             "name": "encoding",
-                            "value": "application/xhtml+xml"
-                          }
-                        ],
-                        "children": [
-                          {
-                            "tag": "div"
+                            "value": " text/html "
                           }
                         ]
                       }
                     ]
+                  },
+                  {
+                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml encoding=\" text/html \"></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\" text/html \"><div></div></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>",
+      "data": "<math><annotation-xml> </annotation-xml>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,60): expected-closing-tag-but-got-eof"
+        "(1,40): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "head": true,
             "body": true,
             "math math": true,
-            "math annotation-xml": true,
-            "div": true
+            "math annotation-xml": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
-                          {
-                            "name": "encoding",
-                            "value": "aPPlication/xhtmL+xMl"
-                          }
-                        ],
                         "children": [
                           {
-                            "tag": "div"
+                            "text": " "
                           }
                         ]
                       }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml</annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml</annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"text/html\"><div>",
+      "data": "<math><annotation-xml>c</annotation-xml>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,48): expected-closing-tag-but-got-eof"
+        "(1,40): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "head": true,
             "body": true,
             "math math": true,
-            "math annotation-xml": true,
-            "div": true
+            "math annotation-xml": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
+                        "children": [
                           {
-                            "name": "encoding",
-                            "value": "text/html"
+                            "text": "c"
                           }
-                        ],
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml>c</annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml>c</annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml><!--foo-->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,32): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
                         "children": [
                           {
-                            "tag": "div"
+                            "comment": "foo"
                           }
                         ]
                       }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml><!--foo--></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><!--foo--></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"Text/htmL\"><div>",
+      "data": "<math><annotation-xml></svg>x",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,48): expected-closing-tag-but-got-eof"
+        "(1,28): unexpected-end-tag",
+        "(1,29): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "head": true,
             "body": true,
             "math math": true,
-            "math annotation-xml": true,
-            "div": true
+            "math annotation-xml": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
-                          {
-                            "name": "encoding",
-                            "value": "Text/htmL"
-                          }
-                        ],
                         "children": [
                           {
-                            "tag": "div"
+                            "text": "x"
                           }
                         ]
                       }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml>x</annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml>x</annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\" text/html \"><div>",
+      "data": "<math><annotation-xml><svg>x",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,50): unexpected-html-element-in-foreign-content",
-        "(1,50): expected-closing-tag-but-got-eof"
+        "(1,28): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "body": true,
             "math math": true,
             "math annotation-xml": true,
-            "div": true
+            "svg svg": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
+                        "children": [
                           {
-                            "name": "encoding",
-                            "value": " text/html "
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "text": "x"
+                              }
+                            ]
                           }
                         ]
                       }
                     ]
-                  },
-                  {
-                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\" text/html \"></annotation-xml></math><div></div></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\" text/html \"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml><svg>x</svg></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><svg>x</svg></annotation-xml></math>"
       }
     }
   ],
         "noQuirksBodyHtml": "<command>A</command>"
       }
     },
-    {
-      "data": "<!DOCTYPE html><body><menuitem>A",
-      "errors": [],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "menuitem": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "menuitem"
-                  },
-                  {
-                    "text": "A"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</body></html>",
-        "noQuirksBodyHtml": "<menuitem>A"
-      }
-    },
     {
       "data": "<!DOCTYPE html><body><embed>A",
       "errors": [],
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nfoo",
-                        "extraNL": true
+                        "text": "\nfoo"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nfoo</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nfoo</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nfoo</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nfoo</pre>"
       }
     },
     {
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nA",
-                        "extraNL": true
+                        "text": "\nA"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nA</pre>"
       }
     },
     {
             "body": true,
             "textarea": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "textarea",
                     "children": [
                       {
-                        "text": "\nfoo",
-                        "extraNL": true
+                        "text": "\nfoo"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><textarea>\n\nfoo</textarea></body></html>",
-        "noQuirksBodyHtml": "<textarea>\n\nfoo</textarea>"
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>\nfoo</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>\nfoo</textarea>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript></head><body>--&gt;</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>--></noscript>"
       }
     }
   ],
         "(1,14): foster-parenting-character",
         "(1,20): foster-parenting-character",
         "(1,25): unexpected-end-tag",
+        "(1,25): unexpected-end-tag-in-special-element",
         "(1,26): foster-parenting-character"
       ],
       "document": {
     {
       "data": "</select><option>",
       "errors": [
-        "(1,9): XXX-undefined-error",
-        "(1,17): eof-in-select"
+        "(1,9): XXX-undefined-error"
       ],
       "fragment": {
         "name": "select"
     {
       "data": "<input><option>",
       "errors": [
-        "(1,7): unexpected-input-in-select",
-        "(1,15): eof-in-select"
+        "(1,7): unexpected-input-in-select"
       ],
       "fragment": {
         "name": "select"
     {
       "data": "<keygen><option>",
       "errors": [
-        "(1,8): unexpected-input-in-select",
-        "(1,16): eof-in-select"
+        "(1,8): unexpected-input-in-select"
       ],
       "fragment": {
         "name": "select"
     {
       "data": "<textarea><option>",
       "errors": [
-        "(1,10): unexpected-input-in-select",
-        "(1,18): eof-in-select"
+        "(1,10): unexpected-input-in-select"
       ],
       "fragment": {
         "name": "select"
         "(1,25): unexpected-select-in-select",
         "(1,59): unexpected-select-in-select",
         "(1,93): unexpected-select-in-select",
-        "(1,127): unexpected-select-in-select",
-        "(1,127): expected-closing-tag-but-got-eof"
+        "(1,127): unexpected-select-in-select"
       ],
       "document": {
         "props": {
           }
         ],
         "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
-        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
+        "noQuirksBodyHtml": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>"
       }
     },
     {
           }
         ],
         "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
-        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
+        "noQuirksBodyHtml": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>"
       }
     },
     {
         "noQuirksBodyHtml": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food></food></fooc></fooc></fooc></fooc></foob></foob></foob></foob></foo></em></b><aside><b></b></aside>"
       }
     },
-    {
-      "data": "<isindex action=\"x\">",
-      "errors": [],
-      "fragment": {
-        "name": "table"
-      },
-      "document": {
-        "props": {
-          "tags": {
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          }
-        },
-        "tree": [
-          {
-            "tag": "form",
-            "attrs": [
-              {
-                "name": "action",
-                "value": "x"
-              }
-            ],
-            "children": [
-              {
-                "tag": "hr"
-              },
-              {
-                "tag": "label",
-                "children": [
-                  {
-                    "text": "This is a searchable index. Enter search keywords: "
-                  },
-                  {
-                    "tag": "input",
-                    "attrs": [
-                      {
-                        "name": "name",
-                        "value": "isindex"
-                      }
-                    ]
-                  }
-                ]
-              },
-              {
-                "tag": "hr"
-              }
-            ]
-          }
-        ],
-        "html": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>",
-        "noQuirksBodyHtml": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
-      }
-    },
     {
       "data": "<option><XH<optgroup></optgroup>",
       "errors": [],
       }
     }
   ]
-}
+}
\ No newline at end of file
index 6be272f..a42c86c 100644 (file)
@@ -297,31 +297,31 @@ class UploadBaseTest extends MediaWikiTestCase {
                                '<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="https://upload.wikimedia.org/wikipedia/commons/3/34/Bahnstrecke_Zeitz-Camburg_1930.png" /> </svg>',
                                true,
                                true,
-                               'SVG with non-local image href (bug 65839)'
+                               'SVG with non-local image href (T67839)'
                        ],
                        [
                                '<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="/w/index.php?title=User:Jeeves/test.xsl&amp;action=raw&amp;format=xml" ?> <svg> <height>50</height> <width>100</width> </svg>',
                                true,
                                true,
-                               'SVG with remote stylesheet (bug 57550)'
+                               'SVG with remote stylesheet (T59550)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewbox="-1 -1 15 15"> <rect y="0" height="13" width="12" stroke="#179" rx="1" fill="#2ac"/> <text x="1.5" y="11" font-family="courier" stroke="white" font-size="16"><![CDATA[B]]></text> <iframe xmlns="http://www.w3.org/1999/xhtml" srcdoc="&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x45;&#x44;&#x20;&#x3D;&#x3E;&#x20;&#x44;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x28;&#x27;&#x2B;&#x74;&#x6F;&#x70;&#x2E;&#x64;&#x6F;&#x63;&#x75;&#x6D;&#x65;&#x6E;&#x74;&#x2E;&#x64;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x2B;&#x27;&#x29;&#x27;&#x29;&#x3B;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;"></iframe> </svg>',
                                true,
                                true,
-                               'SVG with rembeded iframe (bug 60771)'
+                               'SVG with rembeded iframe (T62771)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@import url("https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org");</style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
                                true,
                                true,
-                               'SVG with @import in style element (bug 69008)'
+                               'SVG with @import in style element (T71008)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@import url("https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org");<foo/></style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
                                true,
                                true,
-                               'SVG with @import in style element and child element (bug 69008#c11)'
+                               'SVG with @import in style element and child element (T71008#c11)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@imporT "https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org";</style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
@@ -333,19 +333,19 @@ class UploadBaseTest extends MediaWikiTestCase {
                                '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:url(https://www.google.com/images/srpr/logo11w.png)"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image (bug 69008)'
+                               'SVG with remote background image (T71008)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:\55rl(https://www.google.com/images/srpr/logo11w.png)"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image, encoded (bug 69008)'
+                               'SVG with remote background image, encoded (T71008)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg"> <style> #a { background-image:\55rl(\'https://www.google.com/images/srpr/logo11w.png\'); } </style> <rect width="100" height="100" id="a"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image, in style element (bug 69008)'
+                               'SVG with remote background image, in style element (T71008)'
                        ],
                        [
                                // This currently doesn't seem to work in any browsers, but in case
@@ -353,7 +353,7 @@ class UploadBaseTest extends MediaWikiTestCase {
                                '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:image(\'sprites.svg#xywh=40,0,20,20\')"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image using image() (bug 69008)'
+                               'SVG with remote background image using image() (T71008)'
                        ],
                        [
                                // As reported by Cure53
index 6d17a68..62081aa 100644 (file)
@@ -58,7 +58,7 @@ class UploadFromUrlTest extends ApiTestCase {
                        $this->doApiRequest( [
                                'action' => 'upload',
                        ] );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "The token parameter must be set", $e->getMessage() );
                }
@@ -70,7 +70,7 @@ class UploadFromUrlTest extends ApiTestCase {
                                'action' => 'upload',
                                'token' => $token,
                        ], $data );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "One of the parameters sessionkey, file, url is required",
                                $e->getMessage() );
@@ -84,7 +84,7 @@ class UploadFromUrlTest extends ApiTestCase {
                                'url' => 'http://www.example.com/test.png',
                                'token' => $token,
                        ], $data );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "The filename parameter must be set", $e->getMessage() );
                }
@@ -99,7 +99,7 @@ class UploadFromUrlTest extends ApiTestCase {
                                'filename' => 'UploadFromUrlTest.png',
                                'token' => $token,
                        ], $data );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "Permission denied", $e->getMessage() );
                }
index 9b25505..7c40a2d 100644 (file)
@@ -19,7 +19,7 @@ class UploadStashTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               // Setup a file for bug 29408
+               // Setup a file for T31408
                $this->bug29408File = wfTempDir() . '/bug29408';
                file_put_contents( $this->bug29408File, "\x00" );
 
@@ -62,7 +62,7 @@ class UploadStashTest extends MediaWikiTestCase {
 
                // Throws exception caught by PHPUnit on failure
                $file = $stash->stashFile( $this->bug29408File );
-               // We'll never reach this point if we hit bug 29408
+               // We'll never reach this point if we hit T31408
                $this->assertTrue( true, 'Unrecognized file without extension' );
 
                $stash->removeFile( $file->getFileKey() );
index 4db636b..7ff882a 100644 (file)
@@ -11,7 +11,7 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
         */
        public function testIsAllowed( $passwordResetRoutes, $enableEmail,
                $allowsAuthenticationDataChange, $canEditPrivate, $canSeePassword,
-               $userIsBlocked, $isAllowed, $isAllowedToDisplayPassword
+               $userIsBlocked, $isAllowed
        ) {
                $config = new HashConfig( [
                        'PasswordResetRoutes' => $passwordResetRoutes,
@@ -40,8 +40,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                $passwordReset = new PasswordReset( $config, $authManager );
 
                $this->assertSame( $isAllowed, $passwordReset->isAllowed( $user )->isGood() );
-               $this->assertSame( $isAllowedToDisplayPassword,
-                       $passwordReset->isAllowed( $user, true )->isGood() );
        }
 
        public function provideIsAllowed() {
@@ -54,7 +52,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -64,7 +61,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -74,7 +70,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -84,7 +79,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -94,7 +88,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => true,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -104,7 +97,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => false,
                                'userIsBlocked' => false,
                                'isAllowed' => true,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -114,7 +106,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => true,
-                               'isAllowedToDisplayPassword' => true,
                        ],
                ];
        }
diff --git a/tests/phpunit/includes/user/UserGroupMembershipTest.php b/tests/phpunit/includes/user/UserGroupMembershipTest.php
new file mode 100644 (file)
index 0000000..a297f29
--- /dev/null
@@ -0,0 +1,151 @@
+<?php
+
+/**
+ * @group Database
+ */
+class UserGroupMembershipTest extends MediaWikiTestCase {
+       /**
+        * @var User Belongs to no groups
+        */
+       protected $userNoGroups;
+       /**
+        * @var User Belongs to the 'unittesters' group indefinitely, and the
+        * 'testwriters' group with expiry
+        */
+       protected $userTester;
+       /**
+        * @var string The timestamp, in TS_MW format, of the expiry of $userTester's
+        * membership in the 'testwriters' group
+        */
+       protected $expiryTime;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( [
+                       'wgGroupPermissions' => [
+                               'unittesters' => [
+                                       'runtest' => true,
+                               ],
+                               'testwriters' => [
+                                       'writetest' => true,
+                               ]
+                       ]
+               ] );
+
+               $this->userNoGroups = new User;
+               $this->userNoGroups->setName( 'NoGroups' );
+               $this->userNoGroups->addToDatabase();
+
+               $this->userTester = new User;
+               $this->userTester->setName( 'Tester' );
+               $this->userTester->addToDatabase();
+               $this->userTester->addGroup( 'unittesters' );
+               $this->expiryTime = wfTimestamp( TS_MW, time() + 100500 );
+               $this->userTester->addGroup( 'testwriters', $this->expiryTime );
+       }
+
+       /**
+        * @covers UserGroupMembership::insert
+        * @covers UserGroupMembership::delete
+        */
+       public function testAddAndRemoveGroups() {
+               $user = new User;
+               $user->addToDatabase();
+
+               // basic tests
+               $ugm = new UserGroupMembership( $user->getId(), 'unittesters' );
+               $this->assertTrue( $ugm->insert() );
+               $user->clearInstanceCache();
+               $this->assertContains( 'unittesters', $user->getGroups() );
+               $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
+               $this->assertTrue( $user->isAllowed( 'runtest' ) );
+
+               // try updating without allowUpdate. Should fail
+               $ugm = new UserGroupMembership( $user->getId(), 'unittesters', $this->expiryTime );
+               $this->assertFalse( $ugm->insert() );
+
+               // now try updating with allowUpdate
+               $this->assertTrue( $ugm->insert( 2 ) );
+               $user->clearInstanceCache();
+               $this->assertContains( 'unittesters', $user->getGroups() );
+               $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
+               $this->assertTrue( $user->isAllowed( 'runtest' ) );
+
+               // try removing the group
+               $ugm->delete();
+               $user->clearInstanceCache();
+               $this->assertThat( $user->getGroups(),
+                       $this->logicalNot( $this->contains( 'unittesters' ) ) );
+               $this->assertThat( $user->getGroupMemberships(),
+                       $this->logicalNot( $this->arrayHasKey( 'unittesters' ) ) );
+               $this->assertFalse( $user->isAllowed( 'runtest' ) );
+
+               // check that the user group is now in user_former_groups
+               $this->assertContains( 'unittesters', $user->getFormerGroups() );
+       }
+
+       private function addUserTesterToExpiredGroup() {
+               // put $userTester in a group with expiry in the past
+               $ugm = new UserGroupMembership( $this->userTester->getId(), 'sysop', '20010102030405' );
+               $ugm->insert();
+       }
+
+       /**
+        * @covers UserGroupMembership::getMembershipsForUser
+        */
+       public function testGetMembershipsForUser() {
+               $this->addUserTesterToExpiredGroup();
+
+               // check that the user in no groups has no group memberships
+               $ugms = UserGroupMembership::getMembershipsForUser( $this->userNoGroups->getId() );
+               $this->assertEmpty( $ugms );
+
+               // check that the user in 2 groups has 2 group memberships
+               $testerUserId = $this->userTester->getId();
+               $ugms = UserGroupMembership::getMembershipsForUser( $testerUserId );
+               $this->assertCount( 2, $ugms );
+
+               // check that the required group memberships are present on $userTester,
+               // with the correct user IDs and expiries
+               $expectedGroups = [ 'unittesters', 'testwriters' ];
+
+               foreach ( $expectedGroups as $group ) {
+                       $this->assertArrayHasKey( $group, $ugms );
+                       $this->assertEquals( $ugms[$group]->getUserId(), $testerUserId );
+                       $this->assertEquals( $ugms[$group]->getGroup(), $group );
+
+                       if ( $group === 'unittesters' ) {
+                               $this->assertNull( $ugms[$group]->getExpiry() );
+                       } elseif ( $group === 'testwriters' ) {
+                               $this->assertEquals( $ugms[$group]->getExpiry(), $this->expiryTime );
+                       }
+               }
+       }
+
+       /**
+        * @covers UserGroupMembership::getMembership
+        */
+       public function testGetMembership() {
+               $this->addUserTesterToExpiredGroup();
+
+               // groups that the user doesn't belong to shouldn't be returned
+               $ugm = UserGroupMembership::getMembership( $this->userNoGroups->getId(), 'sysop' );
+               $this->assertFalse( $ugm );
+
+               // implicit groups shouldn't be returned
+               $ugm = UserGroupMembership::getMembership( $this->userNoGroups->getId(), 'user' );
+               $this->assertFalse( $ugm );
+
+               // expired groups shouldn't be returned
+               $ugm = UserGroupMembership::getMembership( $this->userTester->getId(), 'sysop' );
+               $this->assertFalse( $ugm );
+
+               // groups that the user does belong to should be returned with correct properties
+               $ugm = UserGroupMembership::getMembership( $this->userTester->getId(), 'unittesters' );
+               $this->assertInstanceOf( UserGroupMembership::class, $ugm );
+               $this->assertEquals( $ugm->getUserId(), $this->userTester->getId() );
+               $this->assertEquals( $ugm->getGroup(), 'unittesters' );
+               $this->assertNull( $ugm->getExpiry() );
+       }
+}
index 0819bf2..fea4a44 100644 (file)
@@ -25,6 +25,7 @@ class UserTest extends MediaWikiTestCase {
                $this->setUpPermissionGlobals();
 
                $this->user = new User;
+               $this->user->addToDatabase();
                $this->user->addGroup( 'unittesters' );
        }
 
@@ -99,6 +100,7 @@ class UserTest extends MediaWikiTestCase {
         */
        public function testUserGetRightsHooks() {
                $user = new User;
+               $user->addToDatabase();
                $user->addGroup( 'unittesters' );
                $user->addGroup( 'testwriters' );
                $userWrapper = TestingAccessWrapper::newFromObject( $user );
@@ -345,29 +347,29 @@ class UserTest extends MediaWikiTestCase {
                $user = $this->getMutableTestUser()->getUser();
 
                $user->setOption( 'userjs-someoption', 'test' );
-               $user->setOption( 'cols', 200 );
+               $user->setOption( 'rclimit', 200 );
                $user->saveSettings();
 
                $user = User::newFromName( $user->getName() );
                $user->load( User::READ_LATEST );
                $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
-               $this->assertEquals( 200, $user->getOption( 'cols' ) );
+               $this->assertEquals( 200, $user->getOption( 'rclimit' ) );
 
                $user = User::newFromName( $user->getName() );
                MediaWikiServices::getInstance()->getMainWANObjectCache()->clearProcessCache();
                $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
-               $this->assertEquals( 200, $user->getOption( 'cols' ) );
+               $this->assertEquals( 200, $user->getOption( 'rclimit' ) );
        }
 
        /**
-        * Bug 37963
+        * T39963
         * Make sure defaults are loaded when setOption is called.
         * @covers User::loadOptions
         */
        public function testAnonOptions() {
                global $wgDefaultUserOptions;
                $this->user->setOption( 'userjs-someoption', 'test' );
-               $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
+               $this->assertEquals( $wgDefaultUserOptions['rclimit'], $this->user->getOption( 'rclimit' ) );
                $this->assertEquals( 'test', $this->user->getOption( 'userjs-someoption' ) );
        }
 
@@ -597,16 +599,17 @@ class UserTest extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => true,
                        'wgCookiePrefix' => 'wmsitetitle',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
 
                // 1. Log in a test user, and block them.
                $user1tmp = $this->getTestUser()->getUser();
                $request1 = new FauxRequest();
                $request1->getSession()->setUser( $user1tmp );
-               $expiryFiveDays = time() + ( 5 * 24 * 60 * 60 );
+               $expiryFiveHours = wfTimestamp() + ( 5 * 60 * 60 );
                $block = new Block( [
                        'enableAutoblock' => true,
-                       'expiry' => wfTimestamp( TS_MW, $expiryFiveDays ),
+                       'expiry' => wfTimestamp( TS_MW, $expiryFiveHours ),
                ] );
                $block->setTarget( $user1tmp );
                $block->insert();
@@ -624,12 +627,13 @@ class UserTest extends MediaWikiTestCase {
                // Test for the desired cookie name, value, and expiry.
                $cookies = $request1->response()->getCookies();
                $this->assertArrayHasKey( 'wmsitetitleBlockID', $cookies );
-               $this->assertEquals( $block->getId(), $cookies['wmsitetitleBlockID']['value'] );
-               $this->assertEquals( $expiryFiveDays, $cookies['wmsitetitleBlockID']['expire'] );
+               $this->assertEquals( $expiryFiveHours, $cookies['wmsitetitleBlockID']['expire'] );
+               $cookieValue = Block::getIdFromCookieValue( $cookies['wmsitetitleBlockID']['value'] );
+               $this->assertEquals( $block->getId(), $cookieValue );
 
                // 2. Create a new request, set the cookies, and see if the (anon) user is blocked.
                $request2 = new FauxRequest();
-               $request2->setCookie( 'BlockID', $block->getId() );
+               $request2->setCookie( 'BlockID', $block->getCookieValue() );
                $user2 = User::newFromSession( $request2 );
                $user2->load();
                $this->assertNotEquals( $user1->getId(), $user2->getId() );
@@ -667,6 +671,7 @@ class UserTest extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => false,
                        'wgCookiePrefix' => 'wm_no_cookies',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
 
                // 1. Log in a test user, and block them.
@@ -696,15 +701,14 @@ class UserTest extends MediaWikiTestCase {
 
        /**
         * When a user is autoblocked and a cookie is set to track them, the expiry time of the cookie
-        * should match the block's expiry. If the block is infinite, the cookie expiry time should
-        * match $wgCookieExpiration. If the expiry time is changed, the cookie's should change with it.
+        * should match the block's expiry, to a maximum of 24 hours. If the expiry time is changed,
+        * the cookie's should change with it.
         */
        public function testAutoblockCookieInfiniteExpiry() {
-               $cookieExpiration = 20 * 24 * 60 * 60; // 20 days
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => true,
-                       'wgCookieExpiration' => $cookieExpiration,
                        'wgCookiePrefix' => 'wm_infinite_block',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
                // 1. Log in a test user, and block them indefinitely.
                $user1Tmp = $this->getTestUser()->getUser();
@@ -724,12 +728,19 @@ class UserTest extends MediaWikiTestCase {
                $this->assertTrue( $block->isAutoblocking() );
                $this->assertGreaterThanOrEqual( 1, $user1->getBlockId() );
                $cookies = $request1->response()->getCookies();
-               // Calculate the expected cookie expiry date.
+               // Test the cookie's expiry to the nearest minute.
                $this->assertArrayHasKey( 'wm_infinite_blockBlockID', $cookies );
-               $this->assertEquals( time() + $cookieExpiration, $cookies['wm_infinite_blockBlockID']['expire'] );
+               $expOneDay = wfTimestamp() + ( 24 * 60 * 60 );
+               // Check for expiry dates in a 10-second window, to account for slow testing.
+               $this->assertEquals(
+                       $expOneDay,
+                       $cookies['wm_infinite_blockBlockID']['expire'],
+                       'Expiry date',
+                       5.0
+               );
 
-               // 3. Change the block's expiry (to 2 days), and the cookie's should be changed also.
-               $newExpiry = time() + 2 * 24 * 60 * 60;
+               // 3. Change the block's expiry (to 2 hours), and the cookie's should be changed also.
+               $newExpiry = wfTimestamp() + 2 * 60 * 60;
                $block->mExpiry = wfTimestamp( TS_MW, $newExpiry );
                $block->update();
                $user2tmp = $this->getTestUser()->getUser();
@@ -739,9 +750,187 @@ class UserTest extends MediaWikiTestCase {
                $user2->mBlock = $block;
                $user2->load();
                $cookies = $request2->response()->getCookies();
+               $this->assertEquals( wfTimestamp( TS_MW, $newExpiry ), $block->getExpiry() );
                $this->assertEquals( $newExpiry, $cookies['wm_infinite_blockBlockID']['expire'] );
 
                // Clean up.
                $block->delete();
        }
+
+       public function testSoftBlockRanges() {
+               global $wgUser;
+
+               $this->setMwGlobals( [
+                       'wgSoftBlockRanges' => [ '10.0.0.0/8' ],
+                       'wgUser' => null,
+               ] );
+
+               // IP isn't in $wgSoftBlockRanges
+               $request = new FauxRequest();
+               $request->setIP( '192.168.0.1' );
+               $wgUser = User::newFromSession( $request );
+               $this->assertNull( $wgUser->getBlock() );
+
+               // IP is in $wgSoftBlockRanges
+               $request = new FauxRequest();
+               $request->setIP( '10.20.30.40' );
+               $wgUser = User::newFromSession( $request );
+               $block = $wgUser->getBlock();
+               $this->assertInstanceOf( Block::class, $block );
+               $this->assertSame( 'wgSoftBlockRanges', $block->getSystemBlockType() );
+
+               // Make sure the block is really soft
+               $request->getSession()->setUser( $this->getTestUser()->getUser() );
+               $wgUser = User::newFromSession( $request );
+               $this->assertFalse( $wgUser->isAnon(), 'sanity check' );
+               $this->assertNull( $wgUser->getBlock() );
+       }
+
+       /**
+        * Test that a modified BlockID cookie doesn't actually load the relevant block (T152951).
+        */
+       public function testAutoblockCookieInauthentic() {
+               // Set up the bits of global configuration that we use.
+               $this->setMwGlobals( [
+                       'wgCookieSetOnAutoblock' => true,
+                       'wgCookiePrefix' => 'wmsitetitle',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
+               ] );
+
+               // 1. Log in a blocked test user.
+               $user1tmp = $this->getTestUser()->getUser();
+               $request1 = new FauxRequest();
+               $request1->getSession()->setUser( $user1tmp );
+               $block = new Block( [ 'enableAutoblock' => true ] );
+               $block->setTarget( $user1tmp );
+               $block->insert();
+               $user1 = User::newFromSession( $request1 );
+               $user1->mBlock = $block;
+               $user1->load();
+
+               // 2. Create a new request, set the cookie to an invalid value, and make sure the (anon)
+               // user not blocked.
+               $request2 = new FauxRequest();
+               $request2->setCookie( 'BlockID', $block->getId() . '!zzzzzzz' );
+               $user2 = User::newFromSession( $request2 );
+               $user2->load();
+               $this->assertTrue( $user2->isAnon() );
+               $this->assertFalse( $user2->isLoggedIn() );
+               $this->assertFalse( $user2->isBlocked() );
+
+               // Clean up.
+               $block->delete();
+       }
+
+       /**
+        * The BlockID cookie is normally verified with a HMAC, but not if wgSecretKey is not set.
+        * This checks that a non-authenticated cookie still works.
+        */
+       public function testAutoblockCookieNoSecretKey() {
+               // Set up the bits of global configuration that we use.
+               $this->setMwGlobals( [
+                       'wgCookieSetOnAutoblock' => true,
+                       'wgCookiePrefix' => 'wmsitetitle',
+                       'wgSecretKey' => null,
+               ] );
+
+               // 1. Log in a blocked test user.
+               $user1tmp = $this->getTestUser()->getUser();
+               $request1 = new FauxRequest();
+               $request1->getSession()->setUser( $user1tmp );
+               $block = new Block( [ 'enableAutoblock' => true ] );
+               $block->setTarget( $user1tmp );
+               $block->insert();
+               $user1 = User::newFromSession( $request1 );
+               $user1->mBlock = $block;
+               $user1->load();
+               $this->assertTrue( $user1->isBlocked() );
+
+               // 2. Create a new request, set the cookie to just the block ID, and the user should
+               // still get blocked when they log in again.
+               $request2 = new FauxRequest();
+               $request2->setCookie( 'BlockID', $block->getId() );
+               $user2 = User::newFromSession( $request2 );
+               $user2->load();
+               $this->assertNotEquals( $user1->getId(), $user2->getId() );
+               $this->assertNotEquals( $user1->getToken(), $user2->getToken() );
+               $this->assertTrue( $user2->isAnon() );
+               $this->assertFalse( $user2->isLoggedIn() );
+               $this->assertTrue( $user2->isBlocked() );
+               $this->assertEquals( true, $user2->getBlock()->isAutoblocking() ); // Non-strict type-check.
+
+               // Clean up.
+               $block->delete();
+       }
+
+       public function testIsPingLimitable() {
+               $request = new FauxRequest();
+               $request->setIP( '1.2.3.4' );
+               $user = User::newFromSession( $request );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [] );
+               $this->assertTrue( $user->isPingLimitable() );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [ '1.2.3.4' ] );
+               $this->assertFalse( $user->isPingLimitable() );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [ '1.2.3.0/8' ] );
+               $this->assertFalse( $user->isPingLimitable() );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [] );
+               $noRateLimitUser = $this->getMockBuilder( User::class )->disableOriginalConstructor()
+                       ->setMethods( [ 'getIP', 'getRights' ] )->getMock();
+               $noRateLimitUser->expects( $this->any() )->method( 'getIP' )->willReturn( '1.2.3.4' );
+               $noRateLimitUser->expects( $this->any() )->method( 'getRights' )->willReturn( [ 'noratelimit' ] );
+               $this->assertFalse( $noRateLimitUser->isPingLimitable() );
+       }
+
+       public function provideExperienceLevel() {
+               return [
+                       [ 2, 2, 'newcomer' ],
+                       [ 12, 3, 'newcomer' ],
+                       [ 8, 5, 'newcomer' ],
+                       [ 15, 10, 'learner' ],
+                       [ 450, 20, 'learner' ],
+                       [ 460, 33, 'learner' ],
+                       [ 525, 28, 'learner' ],
+                       [ 538, 33, 'experienced' ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideExperienceLevel
+        */
+       public function testExperienceLevel( $editCount, $memberSince, $expLevel ) {
+               $this->setMwGlobals( [
+                       'wgLearnerEdits' => 10,
+                       'wgLearnerMemberSince' => 4,
+                       'wgExperiencedUserEdits' => 500,
+                       'wgExperiencedUserMemberSince' => 30,
+               ] );
+
+               $db = wfGetDB( DB_MASTER );
+
+               $data = new stdClass();
+               $data->user_id = 1;
+               $data->user_name = 'name';
+               $data->user_real_name = 'Real Name';
+               $data->user_touched = 1;
+               $data->user_token = 'token';
+               $data->user_email = 'a@a.a';
+               $data->user_email_authenticated = null;
+               $data->user_email_token = 'token';
+               $data->user_email_token_expires = null;
+               $data->user_editcount = $editCount;
+               $data->user_registration = $db->timestamp( time() - $memberSince * 86400 );
+               $user = User::newFromRow( $data );
+
+               $this->assertEquals( $expLevel, $user->getExperienceLevel() );
+       }
+
+       public function testExperienceLevelAnon() {
+               $user = User::newFromName( '10.11.12.13', false );
+
+               $this->assertFalse( $user->getExperienceLevel() );
+       }
 }
index cb1b3d2..6506d58 100644 (file)
@@ -237,7 +237,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        protected function mockDb() {
                // @TODO: mock from Database
                // FIXME: the constructor normally sets mAtomicLevels and mSrvCache
-               $databaseMysql = $this->getMockBuilder( 'DatabaseMysql' )
+               $databaseMysql = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
                $databaseMysql->expects( $this->any() )
diff --git a/tests/phpunit/includes/utils/ClassCollectorTest.php b/tests/phpunit/includes/utils/ClassCollectorTest.php
new file mode 100644 (file)
index 0000000..e8a228e
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @covers ClassCollector
+ */
+class ClassCollectorTest extends PHPUnit_Framework_TestCase {
+
+       public static function provideCases() {
+               return [
+                       [
+                               "class Foo {}",
+                               [ 'Foo' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass Bar {}",
+                               [ 'Example\Foo', 'Example\Bar' ],
+                       ],
+                       [
+                               "class_alias( 'Foo', 'Bar' );",
+                               [ 'Bar' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass_alias( 'Example\Foo', 'Foo' );",
+                               [ 'Example\Foo', 'Foo' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass_alias( 'Example\Foo', 'Bar' );",
+                               [ 'Example\Foo', 'Bar' ],
+                       ],
+                       [
+                               "class_alias( Foo::class, 'Bar' );",
+                               [ 'Bar' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass_alias( Foo::class, 'Bar' );",
+                               [ 'Example\Foo', 'Bar' ],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideCases
+        */
+       public function testGetClasses( $code, array $classes, $message = null ) {
+               $cc = new ClassCollector();
+               $this->assertEquals( $classes, $cc->getClasses( "<?php\n$code" ), $message );
+       }
+}
index e2e6492..22fd7b8 100644 (file)
@@ -1337,7 +1337,7 @@ class LanguageTest extends LanguageClassesTestCase {
                                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn"
                                )
                        ],
-                       // The following two data sets come from bug 36839. They fail if checkTitleEncoding uses a regexp to test for
+                       // The following two data sets come from T38839. They fail if checkTitleEncoding uses a regexp to test for
                        // valid UTF-8 encoding and the pcre.recursion_limit is low (like, say, 1024). They succeed if checkTitleEncoding
                        // uses mb_check_encoding for its test.
                        [
@@ -1585,7 +1585,7 @@ class LanguageTest extends LanguageClassesTestCase {
         * @covers Language::translateBlockExpiry()
         * @dataProvider provideTranslateBlockExpiry
         */
-       public function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
+       public function testTranslateBlockExpiry( $expectedData, $str, $now, $desc ) {
                $lang = $this->getLang();
                if ( is_array( $expectedData ) ) {
                        list( $func, $arg ) = $expectedData;
@@ -1593,27 +1593,40 @@ class LanguageTest extends LanguageClassesTestCase {
                } else {
                        $expected = $expectedData;
                }
-               $this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
+               $this->assertEquals( $expected, $lang->translateBlockExpiry( $str, null, $now ), $desc );
        }
 
        public static function provideTranslateBlockExpiry() {
                return [
-                       [ '2 hours', '2 hours', 'simple data from ipboptions' ],
-                       [ 'indefinite', 'infinite', 'infinite from ipboptions' ],
-                       [ 'indefinite', 'infinity', 'alternative infinite from ipboptions' ],
-                       [ 'indefinite', 'indefinite', 'another alternative infinite from ipboptions' ],
-                       [ [ 'formatDuration', 1023 * 60 * 60 ], '1023 hours', 'relative' ],
-                       [ [ 'formatDuration', -1023 ], '-1023 seconds', 'negative relative' ],
-                       [ [ 'formatDuration', 0 ], 'now', 'now' ],
+                       [ '2 hours', '2 hours', 0, 'simple data from ipboptions' ],
+                       [ 'indefinite', 'infinite', 0, 'infinite from ipboptions' ],
+                       [ 'indefinite', 'infinity', 0, 'alternative infinite from ipboptions' ],
+                       [ 'indefinite', 'indefinite', 0, 'another alternative infinite from ipboptions' ],
+                       [ [ 'formatDuration', 1023 * 60 * 60 ], '1023 hours', 0, 'relative' ],
+                       [ [ 'formatDuration', -1023 ], '-1023 seconds', 0, 'negative relative' ],
+                       [
+                               [ 'formatDuration', 1023 * 60 * 60 ],
+                               '1023 hours',
+                               wfTimestamp( TS_UNIX, '19910203040506' ),
+                               'relative with initial timestamp'
+                       ],
+                       [ [ 'formatDuration', 0 ], 'now', 0, 'now' ],
                        [
                                [ 'timeanddate', '20120102070000' ],
                                '2012-1-1 7:00 +1 day',
+                               0,
                                'mixed, handled as absolute'
                        ],
-                       [ [ 'timeanddate', '19910203040506' ], '1991-2-3 4:05:06', 'absolute' ],
-                       [ [ 'timeanddate', '19700101000000' ], '1970-1-1 0:00:00', 'absolute at epoch' ],
-                       [ [ 'timeanddate', '19691231235959' ], '1969-12-31 23:59:59', 'time before epoch' ],
-                       [ 'dummy', 'dummy', 'return garbage as is' ],
+                       [ [ 'timeanddate', '19910203040506' ], '1991-2-3 4:05:06', 0, 'absolute' ],
+                       [ [ 'timeanddate', '19700101000000' ], '1970-1-1 0:00:00', 0, 'absolute at epoch' ],
+                       [ [ 'timeanddate', '19691231235959' ], '1969-12-31 23:59:59', 0, 'time before epoch' ],
+                       [
+                               [ 'timeanddate', '19910910000000' ],
+                               '10 september',
+                               wfTimestamp( TS_UNIX, '19910203040506' ),
+                               'partial'
+                       ],
+                       [ 'dummy', 'dummy', 0, 'return garbage as is' ],
                ];
        }
 
index 37c8fe0..26db106 100644 (file)
@@ -15,19 +15,19 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @see bug 23156 & r64981
+        * @see T25156 & r64981
         * @covers Language::commafy
         */
        public function testSearchRightSingleQuotationMarkAsApostroph() {
                $this->assertEquals(
                        "'",
                        $this->getLang()->normalizeForSearch( '’' ),
-                       'bug 23156: U+2019 conversion to U+0027'
+                       'T25156: U+2019 conversion to U+0027'
                );
        }
 
        /**
-        * @see bug 23156 & r64981
+        * @see T25156 & r64981
         * @covers Language::commafy
         */
        public function testCommafy() {
@@ -36,7 +36,7 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @see bug 23156 & r64981
+        * @see T25156 & r64981
         * @covers Language::commafy
         */
        public function testDoesNotCommafyFourDigitsNumber() {
index 771cda5..c1b774a 100644 (file)
@@ -5,7 +5,7 @@
  * @file
  */
 
-/** Tests for MediaWiki languages/classes/LanguageHe.php */
+/** Tests for MediaWiki Hebrew grammar transformation handling */
 class LanguageHeTest extends LanguageClassesTestCase {
        /**
         * The most common usage for the plural forms is two forms,
index 5eacd88..6bac031 100644 (file)
@@ -10,7 +10,7 @@ class LanguageMlTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider providerFormatNum
-        * @see bug 29495
+        * T31495
         * @covers Language::formatNum
         */
        public function testFormatNum( $result, $value ) {
index 9a1823b..28d71df 100644 (file)
@@ -9,7 +9,7 @@
 class LanguageTrTest extends LanguageClassesTestCase {
 
        /**
-        * See @bug 28040
+        * See T30040
         * Credits to irc://irc.freenode.net/wikipedia-tr users:
         *  - berm
         *  - []LuCkY[]
@@ -48,7 +48,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
                        [ 'lcfirst', 'ı', 'lower', 'ı' ],
                        [ 'lcfirst', 'i', 'lower', 'i' ],
 
-                       # A real example taken from bug 28040 using
+                       # A real example taken from T30040 using
                        # https://tr.wikipedia.org/wiki/%C4%B0Phone
                        [ 'lcfirst', 'iPhone', 'lower', 'iPhone' ],
 
index bd10856..cb3d227 100644 (file)
@@ -5,6 +5,7 @@
 // without changing the visibility and without working around hacks in
 // Maintenance.php
 // For the same reason, we cannot just use FakeMaintenance.
+use MediaWiki\MediaWikiServices;
 
 /**
  * makes parts of the API of Maintenance that is hidden by protected visibily
@@ -23,7 +24,6 @@
  * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
  * finally call simulateShutdown on MaintenanceFixup instance before a test
  * ends.
- *
  */
 class MaintenanceFixup extends Maintenance {
 
@@ -826,7 +826,7 @@ class MaintenanceTest extends MediaWikiTestCase {
        public function testGetConfig() {
                $this->assertInstanceOf( 'Config', $this->m->getConfig() );
                $this->assertSame(
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+                       MediaWikiServices::getInstance()->getMainConfig(),
                        $this->m->getConfig()
                );
        }
index b3f8e3e..2c5931d 100644 (file)
@@ -22,7 +22,7 @@ class BaseDumpTest extends MediaWikiTestCase {
                        $this->dump->close();
                }
 
-               // Bug 37458, parent teardown need to be done after closing the
+               // T39458, parent teardown need to be done after closing the
                // dump or it might cause some permissions errors.
                parent::tearDown();
        }
index 2e35eca..5a28bfb 100644 (file)
@@ -75,11 +75,11 @@ class FetchTextTest extends MediaWikiTestCase {
 
        // We add 5 Revisions for this test. Their corresponding text id's
        // are stored in the following 5 variables.
-       private $textId1;
-       private $textId2;
-       private $textId3;
-       private $textId4;
-       private $textId5;
+       protected static $textId1;
+       protected static $textId2;
+       protected static $textId3;
+       protected static $textId4;
+       protected static $textId5;
 
        /**
         * @var Exception|null As the current MediaWikiTestCase::run is not
@@ -88,7 +88,7 @@ class FetchTextTest extends MediaWikiTestCase {
         * we catch the exception and store it until we are in setUp and may
         * finally rethrow the exception without crashing the test suite.
         */
-       private $exceptionFromAddDBData;
+       protected static $exceptionFromAddDBDataOnce;
 
        /**
         * @var FetchText The (mocked) FetchText that is to test
@@ -123,17 +123,13 @@ class FetchTextTest extends MediaWikiTestCase {
                throw new MWException( "Could not determine text id" );
        }
 
-       function addDBData() {
-               $this->tablesUsed[] = 'page';
-               $this->tablesUsed[] = 'revision';
-               $this->tablesUsed[] = 'text';
-
+       function addDBDataOnce() {
                $wikitextNamespace = $this->getDefaultWikitextNS();
 
                try {
                        $title = Title::newFromText( 'FetchTextTestPage1', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId1 = $this->addRevision(
+                       self::$textId1 = $this->addRevision(
                                $page,
                                "FetchTextTestPage1Text1",
                                "FetchTextTestPage1Summary1"
@@ -141,30 +137,30 @@ class FetchTextTest extends MediaWikiTestCase {
 
                        $title = Title::newFromText( 'FetchTextTestPage2', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId2 = $this->addRevision(
+                       self::$textId2 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text1",
                                "FetchTextTestPage2Summary1"
                        );
-                       $this->textId3 = $this->addRevision(
+                       self::$textId3 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text2",
                                "FetchTextTestPage2Summary2"
                        );
-                       $this->textId4 = $this->addRevision(
+                       self::$textId4 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text3",
                                "FetchTextTestPage2Summary3"
                        );
-                       $this->textId5 = $this->addRevision(
+                       self::$textId5 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text4 some additional Text  ",
                                "FetchTextTestPage2Summary4 extra "
                        );
                } catch ( Exception $e ) {
                        // We'd love to pass $e directly. However, ... see
-                       // documentation of exceptionFromAddDBData
-                       $this->exceptionFromAddDBData = $e;
+                       // documentation of exceptionFromAddDBDataOnce
+                       self::$exceptionFromAddDBDataOnce = $e;
                }
        }
 
@@ -172,8 +168,8 @@ class FetchTextTest extends MediaWikiTestCase {
                parent::setUp();
 
                // Check if any Exception is stored for rethrowing from addDBData
-               if ( $this->exceptionFromAddDBData !== null ) {
-                       throw $this->exceptionFromAddDBData;
+               if ( self::$exceptionFromAddDBDataOnce !== null ) {
+                       throw self::$exceptionFromAddDBDataOnce;
                }
 
                $this->fetchText = new SemiMockedFetchText();
@@ -198,24 +194,29 @@ class FetchTextTest extends MediaWikiTestCase {
        // provider would not know the required ids.
 
        function testExistingSimple() {
-               $this->assertFilter( $this->textId2,
-                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+               $this->assertFilter( self::$textId2,
+                       self::$textId2 . "\n23\nFetchTextTestPage2Text1" );
        }
 
        function testExistingSimpleWithNewline() {
-               $this->assertFilter( $this->textId2 . "\n",
-                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+               $this->assertFilter( self::$textId2 . "\n",
+                       self::$textId2 . "\n23\nFetchTextTestPage2Text1" );
        }
 
        function testExistingSeveral() {
-               $this->assertFilter( "$this->textId1\n$this->textId5\n"
-                               . "$this->textId3\n$this->textId3",
-                       implode( "", [
-                               $this->textId1 . "\n23\nFetchTextTestPage1Text1",
-                               $this->textId5 . "\n44\nFetchTextTestPage2Text4 "
+               $this->assertFilter(
+                       join( "\n", [
+                               self::$textId1,
+                               self::$textId5,
+                               self::$textId3,
+                               self::$textId3,
+                       ] ),
+                       implode( '', [
+                               self::$textId1 . "\n23\nFetchTextTestPage1Text1",
+                               self::$textId5 . "\n44\nFetchTextTestPage2Text4 "
                                        . "some additional Text",
-                               $this->textId3 . "\n23\nFetchTextTestPage2Text2",
-                               $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               self::$textId3 . "\n23\nFetchTextTestPage2Text2",
+                               self::$textId3 . "\n23\nFetchTextTestPage2Text2"
                        ] ) );
        }
 
@@ -224,7 +225,7 @@ class FetchTextTest extends MediaWikiTestCase {
        }
 
        function testNonExisting() {
-               $this->assertFilter( $this->textId5 + 10, ( $this->textId5 + 10 ) . "\n-1\n" );
+               $this->assertFilter( self::$textId5 + 10, ( self::$textId5 + 10 ) . "\n-1\n" );
        }
 
        function testNegativeInteger() {
@@ -233,13 +234,13 @@ class FetchTextTest extends MediaWikiTestCase {
 
        function testFloatingPointNumberExisting() {
                // float -> int -> revision
-               $this->assertFilter( $this->textId3 + 0.14159,
-                       $this->textId3 . "\n23\nFetchTextTestPage2Text2" );
+               $this->assertFilter( self::$textId3 + 0.14159,
+                       self::$textId3 . "\n23\nFetchTextTestPage2Text2" );
        }
 
        function testFloatingPointNumberNonExisting() {
-               $this->assertFilter( $this->textId5 + 3.14159,
-                       ( $this->textId5 + 3 ) . "\n-1\n" );
+               $this->assertFilter( self::$textId5 + 3.14159,
+                       ( self::$textId5 + 3 ) . "\n-1\n" );
        }
 
        function testCharacters() {
@@ -247,15 +248,15 @@ class FetchTextTest extends MediaWikiTestCase {
        }
 
        function testMix() {
-               $this->assertFilter( "ab\n" . $this->textId4 . ".5cd\n\nefg\n" . $this->textId2
-                               . "\n" . $this->textId3,
+               $this->assertFilter( "ab\n" . self::$textId4 . ".5cd\n\nefg\n" . self::$textId2
+                               . "\n" . self::$textId3,
                        implode( "", [
                                "0\n-1\n",
-                               $this->textId4 . "\n23\nFetchTextTestPage2Text3",
+                               self::$textId4 . "\n23\nFetchTextTestPage2Text3",
                                "0\n-1\n",
                                "0\n-1\n",
-                               $this->textId2 . "\n23\nFetchTextTestPage2Text1",
-                               $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               self::$textId2 . "\n23\nFetchTextTestPage2Text1",
+                               self::$textId3 . "\n23\nFetchTextTestPage2Text2"
                        ] ) );
        }
 }
index 6ed4495..d712254 100644 (file)
@@ -34,7 +34,6 @@ class DummyContentHandlerForTesting extends ContentHandler {
 
        /**
         * Creates an empty Content object of the type supported by this ContentHandler.
-        *
         */
        public function makeEmptyContent() {
                return new DummyContentForTesting( '' );
index 6797f59..8ee45a8 100644 (file)
@@ -40,7 +40,7 @@ class MockFSFile extends FSFile {
 
        /**
         * August 22 – The theft of the Mona Lisa is discovered in the Louvre."
-        * @bug 20281
+        * T22281
         */
        public function getSize() {
                return 1911;
index aaa1feb..af03fe6 100644 (file)
@@ -123,7 +123,7 @@ class SideBarTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * bug 33321 - Make sure there's a | after transforming.
+        * T35321 - Make sure there's a | after transforming.
         * @group Database
         * @covers SkinTemplate::addToSidebarPlain
         */
diff --git a/tests/phpunit/specials/SpecialSearchTest.php b/tests/phpunit/specials/SpecialSearchTest.php
deleted file mode 100644 (file)
index 20e88f5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-class SpecialSearchText extends \PHPUnit_Framework_TestCase {
-       public function testSubPageRedirect() {
-               $ctx = new RequestContext;
-
-               SpecialPageFactory::executePath(
-                       Title::newFromText( 'Special:Search/foo_bar' ),
-                       $ctx
-               );
-               $url = $ctx->getOutput()->getRedirect();
-               // some older versions of hhvm have a bug that doesn't parse relative
-               // urls with a port, so help it out a little bit.
-               // https://github.com/facebook/hhvm/issues/7136
-               $url = wfExpandUrl( $url, PROTO_CURRENT );
-
-               $parts = parse_url( $url );
-               $this->assertEquals( '/w/index.php', $parts['path'] );
-               parse_str( $parts['query'], $query );
-               $this->assertEquals( 'Special:Search', $query['title'] );
-               $this->assertEquals( 'foo bar', $query['search'] );
-       }
-}
index f36b51a..d81e8c6 100644 (file)
@@ -68,6 +68,7 @@ class AutoLoaderTest extends MediaWikiTestCase {
                        }
 
                        // We could use token_get_all() here, but this is faster
+                       // Note: Keep in sync with ClassCollector
                        $matches = [];
                        preg_match_all( '/
                                ^ [\t ]* (?:
@@ -78,6 +79,11 @@ class AutoLoaderTest extends MediaWikiTestCase {
                                                ([\'"]) (?P<original> [^\'"]+) \g{-2} \s* , \s*
                                                ([\'"]) (?P<alias> [^\'"]+ ) \g{-2} \s*
                                        \) \s* ;
+                               |
+                                       class_alias \s* \( \s*
+                                               (?P<originalStatic> [a-zA-Z0-9_]+)::class \s* , \s*
+                                               ([\'"]) (?P<aliasString> [^\'"]+ ) \g{-2} \s*
+                                       \) \s* ;
                                )
                        /imx', $contents, $matches, PREG_SET_ORDER );
 
@@ -95,11 +101,18 @@ class AutoLoaderTest extends MediaWikiTestCase {
 
                        foreach ( $matches as $match ) {
                                if ( !empty( $match['class'] ) ) {
+                                       // 'class Foo {}'
                                        $class = $fileNamespace . $match['class'];
                                        $actual[$class] = $file;
                                        $classesInFile[$class] = true;
                                } else {
-                                       $aliasesInFile[$match['alias']] = $match['original'];
+                                       if ( !empty( $match['original'] ) ) {
+                                               // 'class_alias( "Foo", "Bar" );'
+                                               $aliasesInFile[$match['alias']] = $match['original'];
+                                       } else {
+                                               // 'class_alias( Foo::class, "Bar" );'
+                                               $aliasesInFile[$match['aliasString']] = $fileNamespace . $match['originalStatic'];
+                                       }
                                }
                        }
 
index 98a0fbb..30bae78 100644 (file)
@@ -45,9 +45,12 @@ class ContentHandlerSanityTest extends MediaWikiTestCase {
                $handlerClass = get_class( $handler );
                $contentClass = get_class( $content );
 
-               $this->assertTrue(
-                       $content->isValid(),
-                       "$handlerClass::makeEmptyContent() did not return a valid content ($contentClass::isValid())"
-               );
+               if ( $handler->supportsDirectEditing() ) {
+                       $this->assertTrue(
+                               $content->isValid(),
+                               "$handlerClass::makeEmptyContent() did not return a valid content ($contentClass::isValid())"
+                       );
+               }
        }
+
 }
index e11fd8a..b19376d 100644 (file)
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-use Composer\Spdx\SpdxLicenses;
-use JsonSchema\Validator;
-
 /**
  * Validates all loaded extensions and skins using the ExtensionRegistry
  * against the extension.json schema in the docs/ folder.
  */
 class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
 
+       /**
+        * @var ExtensionJsonValidator
+        */
+       protected $validator;
+
        public function setUp() {
                parent::setUp();
-               if ( !class_exists( Validator::class ) ) {
-                       $this->markTestSkipped(
-                               'The JsonSchema library cannot be found,' .
-                               ' please install it through composer to run extension.json validation tests.'
-                       );
-               }
+
+               $this->validator = new ExtensionJsonValidator( [ $this, 'markTestSkipped' ] );
+               $this->validator->checkDependencies();
 
                if ( !ExtensionRegistry::getInstance()->getAllThings() ) {
                        $this->markTestSkipped(
@@ -55,56 +54,12 @@ class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
         * @param string $path Path to thing's json file
         */
        public function testPassesValidation( $path ) {
-               $data = json_decode( file_get_contents( $path ) );
-               $this->assertInstanceOf( 'stdClass', $data, "$path is not valid JSON" );
-
-               $this->assertObjectHasAttribute( 'manifest_version', $data,
-                       "$path does not have manifest_version set." );
-               $version = $data->manifest_version;
-               if ( $version !== ExtensionRegistry::MANIFEST_VERSION ) {
-                       $schemaPath = __DIR__ . "/../../../docs/extension.schema.v$version.json";
-               } else {
-                       $schemaPath = __DIR__ . '/../../../docs/extension.schema.json';
-               }
-
-               // Not too old
-               $this->assertTrue(
-                       $version >= ExtensionRegistry::OLDEST_MANIFEST_VERSION,
-                       "$path is using a non-supported schema version"
-               );
-               // Not too new
-               $this->assertTrue(
-                       $version <= ExtensionRegistry::MANIFEST_VERSION,
-                       "$path is using a non-supported schema version"
-               );
-
-               $licenseError = false;
-               if ( class_exists( SpdxLicenses::class ) && isset( $data->{'license-name'} )
-                       // Check if it's a string, if not, schema validation will display an error
-                       && is_string( $data->{'license-name'} )
-               ) {
-                       $licenses = new SpdxLicenses();
-                       $valid = $licenses->validate( $data->{'license-name'} );
-                       if ( !$valid ) {
-                               $licenseError = '[license-name] Invalid SPDX license identifier, '
-                                       . 'see <https://spdx.org/licenses/>';
-                       }
-               }
-
-               $validator = new Validator;
-               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
-               if ( $validator->isValid() && !$licenseError ) {
-                       // All good.
+               try {
+                       $this->validator->validate( $path );
+                       // All good
                        $this->assertTrue( true );
-               } else {
-                       $out = "$path did pass validation.\n";
-                       foreach ( $validator->getErrors() as $error ) {
-                               $out .= "[{$error['property']}] {$error['message']}\n";
-                       }
-                       if ( $licenseError ) {
-                               $out .= "$licenseError\n";
-                       }
-                       $this->assertTrue( false, $out );
+               } catch ( ExtensionJsonValidationError $e ) {
+                       $this->assertEquals( false, $e->getMessage() );
                }
        }
 }
index 2e6bf37..2fba76b 100644 (file)
@@ -11,7 +11,6 @@
  * @copyright © 2012, Niklas Laxström
  * @copyright © 2012, Santhosh Thottingal
  * @copyright © 2012, Timo Tijhof
- *
  */
 class ResourcesTest extends MediaWikiTestCase {
 
index e48a116..7a33a22 100644 (file)
@@ -7,4 +7,3 @@ class CoreParserTestSuite extends PHPUnit_Framework_TestSuite {
        }
 
 }
-
index 1c64485..edc81ff 100644 (file)
@@ -138,7 +138,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
 
        /**
         * @covers MediaWikiTestCase::setLogger
-        * @covers MediaWikiTestCase::restoreLogger
+        * @covers MediaWikiTestCase::restoreLoggers
         */
        public function testLoggersAreRestoredOnTearDown_replacingExistingLogger() {
                $logger1 = LoggerFactory::getInstance( 'foo' );
@@ -153,7 +153,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
 
        /**
         * @covers MediaWikiTestCase::setLogger
-        * @covers MediaWikiTestCase::restoreLogger
+        * @covers MediaWikiTestCase::restoreLoggers
         */
        public function testLoggersAreRestoredOnTearDown_replacingNonExistingLogger() {
                $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
@@ -167,7 +167,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
 
        /**
         * @covers MediaWikiTestCase::setLogger
-        * @covers MediaWikiTestCase::restoreLogger
+        * @covers MediaWikiTestCase::restoreLoggers
         */
        public function testLoggersAreRestoredOnTearDown_replacingSameLoggerTwice() {
                $logger1 = LoggerFactory::getInstance( 'baz' );
diff --git a/tests/qunit/.eslintrc.json b/tests/qunit/.eslintrc.json
new file mode 100644 (file)
index 0000000..b3a46f4
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "extends": "../../.eslintrc.json",
+       "env": {
+               "qunit": true
+       },
+       "globals": {
+               "sinon": false
+       },
+       "rules": {
+               "operator-linebreak": 0,
+               "quote-props": [ "error", "as-needed" ],
+               "valid-jsdoc": 0
+       }
+}
index e30088d..1278ecb 100644 (file)
@@ -93,6 +93,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
+                       'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
@@ -136,6 +137,7 @@ return [
                        'mediawiki.util',
                        'mediawiki.viewport',
                        'mediawiki.special.recentchanges',
+                       'mediawiki.rcfilters.filters.dm',
                        'mediawiki.language',
                        'mediawiki.cldr',
                        'mediawiki.cookie',
index 5a96dc3..1c79f6d 100644 (file)
@@ -16,7 +16,7 @@
 /*
  * @example QUnit
  * <code>
-       QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+       QUnit.test( 'Output matches PHP parser', function ( assert ) {
                mw.messages.set( mw.libs.phpParserData.messages );
                $.each( mw.libs.phpParserData.tests, function ( i, test ) {
                        QUnit.stop();
@@ -133,7 +133,7 @@ class GenerateJqueryMsgData extends Maintenance {
                                . "// languages, and parser modes. Intended for use by a unit test framework by looping\n"
                                . "// through the object and comparing its parser return value with the 'result' property.\n"
                                . '// Last generated with ' . basename( __FILE__ ) . ' at ' . gmdate( 'r' ) . "\n"
-                               . "//jscs:disable\n"
+                               . "/* eslint-disable */\n"
                                . "\n"
                                . 'mediaWiki.libs.phpParserData = ' . FormatJson::encode( $phpParserData, true ) . ";\n";
 
index 498acc1..90dc1b2 100644 (file)
@@ -2,7 +2,7 @@
 // languages, and parser modes. Intended for use by a unit test framework by looping
 // through the object and comparing its parser return value with the 'result' property.
 // Last generated with generateJqueryMsgData.php at Fri, 10 Jul 2015 11:44:08 +0000
-//jscs:disable
+/* eslint-disable */
 
 mediaWiki.libs.phpParserData = {
     "messages": {
index b79c192..cef5c15 100644 (file)
@@ -1,8 +1,8 @@
-/*global CompletenessTest, sinon */
+/* global CompletenessTest, sinon */
 ( function ( $, mw, QUnit ) {
        'use strict';
 
-       var mwTestIgnore, mwTester, addons;
+       var mwTestIgnore, addons;
 
        /**
         * Add bogus to url to prevent IE crazy caching
        // killing the test and assuming timeout failure.
        QUnit.config.testTimeout = 60 * 1000;
 
+       // Reduce default animation duration from 400ms to 0ms for unit tests
+       // eslint-disable-next-line no-underscore-dangle
+       $.fx.speeds._default = 0;
+
        // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
        QUnit.config.urlConfig.push( {
                id: 'debug',
                        return false;
                };
 
-               mwTester = new CompletenessTest( mw, mwTestIgnore );
+               // eslint-disable-next-line no-new
+               new CompletenessTest( mw, mwTestIgnore );
        }
 
        /**
                }
 
                function freshMessagesCopy( custom ) {
-                       return $.extend( /*deep=*/true, {}, liveMessages.get(), custom );
+                       return $.extend( /* deep */true, {}, liveMessages.get(), custom );
                }
 
                /**
                }
        } ) );
 
-       QUnit.test( 'Setup', 3, function ( assert ) {
+       QUnit.test( 'Setup', function ( assert ) {
                assert.equal( mw.html.escape( 'foo' ), 'mocked', 'setup() callback was ran.' );
                assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
                mw.messages.set( 'testMsg', 'Bar.' );
        } );
 
-       QUnit.test( 'Teardown', 2, function ( assert ) {
+       QUnit.test( 'Teardown', function ( assert ) {
                assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
        } );
 
-       QUnit.test( 'Loader status', 2, function ( assert ) {
+       QUnit.test( 'Loader status', function ( assert ) {
                var i, len, state,
                        modules = mw.loader.getModuleNames(),
                        error = [],
                assert.deepEqual( missing, [], 'Modules in missing state' );
        } );
 
-       QUnit.test( 'htmlEqual', 8, function ( assert ) {
+       QUnit.test( 'htmlEqual', function ( assert ) {
                assert.htmlEqual(
                        '<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
                        '<div><p data-length=\'10\'  class=\'some classes\'>Child paragraph with <a href=\'http://example.com\' >A link</a></p>Regular text<span>A span</span></div>',
 
        QUnit.module( 'test.mediawiki.qunit.testrunner-after', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Teardown', 3, function ( assert ) {
+       QUnit.test( 'Teardown', function ( assert ) {
                assert.equal( mw.html.escape( '<' ), '&lt;', 'teardown() callback was ran.' );
                assert.equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
                assert.equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
index 532a6ce..e4b6157 100644 (file)
@@ -1,4 +1,6 @@
 ( function ( $ ) {
+       var getAccessKeyPrefixTestData, updateTooltipAccessKeysTestData;
+
        QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
                messages: {
                        brackets: '[$1]',
@@ -6,36 +8,47 @@
                }
        } ) );
 
-       var getAccessKeyPrefixTestData = [
-                       // ua string, platform string, expected prefix
-                       // Internet Explorer
-                       [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-' ],
-                       [ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-' ],
-                       [ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-' ],
-                       // Firefox
-                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-' ],
-                       [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-' ],
-                       [ 'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-' ],
-                       // Safari / Konqueror
-                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-alt-' ],
-                       [ 'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-' ],
-                       [ 'Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-' ],
-                       // Opera
-                       [ 'Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-' ],
-                       [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'alt-shift-' ],
-                       // Chrome
-                       [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-' ],
-                       [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ]
-               ],
-               // strings appended to title to make sure updateTooltipAccessKeys handles them correctly
-               updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
+       getAccessKeyPrefixTestData = [
+               // ua string, platform string, expected prefix
+               // Internet Explorer
+               [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-' ],
+               [ 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136', 'Win64', 'alt-' ],
+               // Firefox
+               [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-' ],
+               [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-' ],
+               [ 'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-' ],
+               [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0', 'MacIntel', 'ctrl-option-' ],
+               [ 'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121202 Firefox/17.0 Iceweasel/17.0.1', 'Linux 1686', 'alt-shift-' ],
+               [ 'Mozilla/5.0 (Windows NT 5.2; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0', 'Win32', 'alt-' ],
+               // Safari / Konqueror
+               [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-option-' ],
+               [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3', 'MacIntel', 'ctrl-' ],
+               [ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-' ],
+               // Opera
+               [ 'Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-' ],
+               [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'alt-shift-' ],
+               // Chrome
+               [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-' ],
+               [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ],
+               // Unknown! Note: These aren't necessarily *right*, this is just
+               // testing that we're getting the expected output based on the
+               // platform.
+               [ 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.0.1) Gecko/20021111 Chimera/0.6', 'MacPPC', 'ctrl-' ],
+               [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5', 'Linux i686', 'alt-' ]
+       ];
+       // strings appended to title to make sure updateTooltipAccessKeys handles them correctly
+       updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
 
        function makeInput( title, accessKey ) {
                // The properties aren't escaped, so make sure you don't call this function with values that need to be escaped!
                return '<input title="' + title + '" ' + ( accessKey ? 'accessKey="' + accessKey + '" ' : '' ) + ' />';
        }
 
-       QUnit.test( 'getAccessKeyPrefix', getAccessKeyPrefixTestData.length, function ( assert ) {
+       QUnit.test( 'getAccessKeyPrefix', function ( assert ) {
                var i;
                for ( i = 0; i < getAccessKeyPrefixTestData.length; i++ ) {
                        assert.equal( $.fn.updateTooltipAccessKeys.getAccessKeyPrefix( {
@@ -45,7 +58,7 @@
                }
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys - current browser', 2, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys - current browser', function ( assert ) {
                var title = $( makeInput( 'Title', 'a' ) ).updateTooltipAccessKeys().prop( 'title' ),
                        // The new title should be something like "Title [alt-a]", but the exact label will depend on the browser.
                        // The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
@@ -55,7 +68,7 @@
                assert.notEqual( result[ 1 ], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys - no access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys - no access key', function ( assert ) {
                var i, oldTitle, $input, newTitle;
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
                        oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
@@ -66,9 +79,9 @@
                }
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys - with access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
-               $.fn.updateTooltipAccessKeys.setTestMode( true );
+       QUnit.test( 'updateTooltipAccessKeys - with access key', function ( assert ) {
                var i, oldTitle, $input, newTitle;
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
                        oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
                        $input = $( makeInput( oldTitle, 'a' ) );
                $.fn.updateTooltipAccessKeys.setTestMode( false );
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys with label element', 2, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys with label element', function ( assert ) {
+               var html, $label, $input;
                $.fn.updateTooltipAccessKeys.setTestMode( true );
-               var html = '<label for="testInput" title="Title">Label</label><input id="testInput" accessKey="a" />',
-                       $label, $input;
+               html = '<label for="testInput" title="Title">Label</label><input id="testInput" accessKey="a" />';
                $( '#qunit-fixture' ).html( html );
                $label = $( '#qunit-fixture label' );
                $input = $( '#qunit-fixture input' );
                $.fn.updateTooltipAccessKeys.setTestMode( false );
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys with label element as parent', 2, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys with label element as parent', function ( assert ) {
+               var html, $label, $input;
                $.fn.updateTooltipAccessKeys.setTestMode( true );
-               var html = '<label title="Title">Label<input id="testInput" accessKey="a" /></label>',
-               $label, $input;
+               html = '<label title="Title">Label<input id="testInput" accessKey="a" /></label>';
                $( '#qunit-fixture' ).html( html );
                $label = $( '#qunit-fixture label' );
                $input = $( '#qunit-fixture input' );
index a1b2e5c..c3521ba 100644 (file)
@@ -17,7 +17,7 @@
                return i;
        }
 
-       QUnit.test( 'Position right', 4, function ( assert ) {
+       QUnit.test( 'Position right', function ( assert ) {
                // We need this thing to be visible, so append it to the DOM
                var $span, spanText, d, spanTextNew,
                        origText = 'This is a really long random string and there is no way it fits in 100 pixels.',
index e6aa3aa..558e641 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Simple text', 5, function ( assert ) {
+       QUnit.test( 'Simple text', function ( assert ) {
                var azLc = 'abcdefghijklmnopqrstuvwxyz',
                        azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                        num = '0123456789',
@@ -16,7 +16,7 @@
 
        } );
 
-       QUnit.test( 'Special text', 4, function ( assert ) {
+       QUnit.test( 'Special text', function ( assert ) {
                // https://en.wikipedia.org/wiki/UTF-8
                var u0024 = '$',
                        // Cent symbol
index 81c116c..c7b7cc0 100644 (file)
                        expected: ''
                }, options );
 
-               QUnit.asyncTest( opt.description, 1, function ( assert ) {
-                       setTimeout( function () {
-                               opt.$input.appendTo( '#qunit-fixture' );
+               QUnit.test( opt.description, function ( assert ) {
+                       opt.$input.appendTo( '#qunit-fixture' );
 
-                               // Simulate pressing keys for each of the sample characters
-                               addChars( opt.$input, opt.sample );
+                       // Simulate pressing keys for each of the sample characters
+                       addChars( opt.$input, opt.sample );
 
-                               assert.equal(
-                                       opt.$input.val(),
-                                       opt.expected,
-                                       'New value matches the expected string'
-                               );
-
-                               QUnit.start();
-                       } );
+                       assert.equal(
+                               opt.$input.val(),
+                               opt.expected,
+                               'New value matches the expected string'
+                       );
                } );
        }
 
@@ -72,7 +68,7 @@
        } );
 
        byteLimitTest( {
-               description: 'Plain text input. Calling byteLimit with no parameters and no maxlength attribute (bug 36310)',
+               description: 'Plain text input. Calling byteLimit with no parameters and no maxlength attribute (T38310)',
                $input: $( '<input>' ).attr( 'type', 'text' )
                        .byteLimit(),
                sample: simpleSample,
                expected: '1234'
        } );
 
-       // Regression tests for bug 41450
+       // Regression tests for T43450
        byteLimitTest( {
                description: 'Input filter of which the base exceeds the limit',
                $input: $( '<input>' ).attr( 'type', 'text' )
                expected: ''
        } );
 
-       QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
-               var $el, $elA, $elB;
+       QUnit.test( 'Confirm properties and attributes set', function ( assert ) {
+               var $el;
 
                $el = $( '<input>' ).attr( 'type', 'text' )
                        .attr( 'maxlength', '7' )
 
                assert.strictEqual( $el.attr( 'maxlength' ), undefined, 'maxlength attribute removed for limit with callback' );
 
-               $elA = $( '<input>' ).attr( 'type', 'text' )
+               $( '<input>' ).attr( 'type', 'text' )
                        .addClass( 'mw-test-byteLimit-foo' )
                        .attr( 'maxlength', '7' )
                        .appendTo( '#qunit-fixture' );
 
-               $elB = $( '<input>' ).attr( 'type', 'text' )
+               $( '<input>' ).attr( 'type', 'text' )
                        .addClass( 'mw-test-byteLimit-foo' )
                        .attr( 'maxlength', '12' )
                        .appendTo( '#qunit-fixture' );
                $el.byteLimit();
        } );
 
-       QUnit.test( 'Trim from insertion when limit exceeded', 2, function ( assert ) {
+       QUnit.test( 'Trim from insertion when limit exceeded', function ( assert ) {
                var $el;
 
-               // Use a new <input /> because the bug only occurs on the first time
-               // the limit it reached (bug 40850)
+               // Use a new <input> because the bug only occurs on the first time
+               // the limit it reached (T42850)
                $el = $( '<input>' ).attr( 'type', 'text' )
                        .appendTo( '#qunit-fixture' )
                        .byteLimit( 3 )
index 9afd793..ca6a512 100644 (file)
@@ -1,18 +1,15 @@
 ( function ( $ ) {
-       QUnit.module( 'jquery.color', QUnit.newMwEnvironment( {
-               setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
-               }
-       } ) );
+       QUnit.module( 'jquery.color', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'animate', 1, function ( assert ) {
-               var $canvas = $( '<div>' ).css( 'background-color', '#fff' );
+       QUnit.test( 'animate', function ( assert ) {
+               var done = assert.async(),
+                       $canvas = $( '<div>' ).css( 'background-color', '#fff' ).appendTo( '#qunit-fixture' );
 
-               $canvas.animate( { backgroundColor: '#000' }, 10 ).promise().then( function () {
-                       var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
-                       assert.deepEqual( endColors, [ 0, 0, 0 ], 'end state' );
-               } );
-
-               this.clock.tick( 20 );
+               $canvas.animate( { 'background-color': '#000' }, 3 ).promise()
+                       .done( function () {
+                               var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
+                               assert.deepEqual( endColors, [ 0, 0, 0 ], 'end state' );
+                       } )
+                       .always( done );
        } );
 }( jQuery ) );
index 00de895..d6208e9 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'getRGB', 18, function ( assert ) {
+       QUnit.test( 'getRGB', function ( assert ) {
                assert.strictEqual( $.colorUtil.getRGB(), undefined, 'No arguments' );
                assert.strictEqual( $.colorUtil.getRGB( '' ), undefined, 'Empty string' );
                assert.deepEqual( $.colorUtil.getRGB( [ 0, 100, 255 ] ), [ 0, 100, 255 ], 'Parse array of rgb values' );
@@ -26,7 +26,7 @@
                assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
        } );
 
-       QUnit.test( 'rgbToHsl', 1, function ( assert ) {
+       QUnit.test( 'rgbToHsl', function ( assert ) {
                var hsl, ret;
 
                // Cross-browser differences in decimals...
@@ -42,7 +42,7 @@
                assert.deepEqual( ret, [ 0.33, 0.73, 0.75 ], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
        } );
 
-       QUnit.test( 'hslToRgb', 1, function ( assert ) {
+       QUnit.test( 'hslToRgb', function ( assert ) {
                var rgb, ret;
                rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
 
@@ -52,7 +52,7 @@
                assert.deepEqual( ret, [ 183, 240, 168 ], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
        } );
 
-       QUnit.test( 'getColorBrightness', 2, function ( assert ) {
+       QUnit.test( 'getColorBrightness', function ( assert ) {
                var a, b;
                a = $.colorUtil.getColorBrightness( 'red', +0.1 );
                assert.equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
index ca3f418..74d8509 100644 (file)
@@ -1,10 +1,10 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'getAttrs()', 1, function ( assert ) {
+       QUnit.test( 'getAttrs()', function ( assert ) {
                var attrs = {
                                foo: 'bar',
-                               'class': 'lorem',
+                               class: 'lorem',
                                'data-foo': 'data value'
                        },
                        $el = $( '<div>' ).attr( attrs );
index 8c62876..6a265eb 100644 (file)
@@ -1,17 +1,17 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'devicePixelRatio', 1, function ( assert ) {
+       QUnit.test( 'devicePixelRatio', function ( assert ) {
                var devicePixelRatio = $.devicePixelRatio();
                assert.equal( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
        } );
 
-       QUnit.test( 'bracketedDevicePixelRatio', 1, function ( assert ) {
-               var devicePixelRatio = $.devicePixelRatio();
-               assert.equal( typeof devicePixelRatio, 'number', '$.bracketedDevicePixelRatio() returns a number' );
+       QUnit.test( 'bracketedDevicePixelRatio', function ( assert ) {
+               var ratio = $.bracketedDevicePixelRatio();
+               assert.equal( typeof ratio, 'number', '$.bracketedDevicePixelRatio() returns a number' );
        } );
 
-       QUnit.test( 'bracketDevicePixelRatio', 8, function ( assert ) {
+       QUnit.test( 'bracketDevicePixelRatio', function ( assert ) {
                assert.equal( $.bracketDevicePixelRatio( 0.75 ), 1, '0.75 gives 1' );
                assert.equal( $.bracketDevicePixelRatio( 1 ), 1, '1 gives 1' );
                assert.equal( $.bracketDevicePixelRatio( 1.25 ), 1.5, '1.25 gives 1.5' );
@@ -22,7 +22,7 @@
                assert.equal( $.bracketDevicePixelRatio( 3 ), 2, '3 gives 2' );
        } );
 
-       QUnit.test( 'matchSrcSet', 6, function ( assert ) {
+       QUnit.test( 'matchSrcSet', function ( assert ) {
                var srcset = 'onefive.png 1.5x, two.png 2x';
 
                // Nice exact matches
index e1fb96d..0dac22e 100644 (file)
        QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Check', function ( assert ) {
-               var $fixture, cases = [
-                       {
-                               desc: 'Test 001',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 002',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue ',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 003',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue Ö',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
-                       },
-                       {
-                               desc: 'Test 004',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue Öy',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
-                       },
-                       {
-                               desc: 'Test 005',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 006',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue ',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 007',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue Ö',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
-                       },
-                       {
-                               desc: 'Test 008',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue Öy',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
-                       },
-                       {
-                               desc: 'Test 009: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Österreich',
-                               expected: '<span class="highlight">Österreich</span>'
-                       },
-                       {
-                               desc: 'Test 010: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Ö',
-                               expected: '<span class="highlight">Ö</span>sterreich'
-                       },
-                       {
-                               desc: 'Test 011: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Öst',
-                               expected: '<span class="highlight">Öst</span>erreich'
-                       },
-                       {
-                               desc: 'Test 012: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Oe',
-                               expected: 'Österreich'
-                       },
-                       {
-                               desc: 'Test 013: Highlighter broken on punctuation mark?',
-                               text: 'So good. To be there',
-                               highlight: 'good',
-                               expected: 'So <span class="highlight">good</span>. To be there'
-                       },
-                       {
-                               desc: 'Test 014: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: 'be',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 015: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: ' be',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 016: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: 'be ',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 017: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: ' be ',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 018: en de Highlighter broken on special character at the end?',
-                               text: 'So good. xbß',
-                               highlight: 'xbß',
-                               expected: 'So good. <span class="highlight">xbß</span>'
-                       },
-                       {
-                               desc: 'Test 019: en de Highlighter broken on special character at the end?',
-                               text: 'So good. xbß.',
-                               highlight: 'xbß.',
-                               expected: 'So good. <span class="highlight">xbß.</span>'
-                       },
-                       {
-                               desc: 'Test 020: RTL he Hebrew',
-                               text: 'חסיד אומות העולם',
-                               highlight: 'חסיד אומות העולם',
-                               expected: '<span class="highlight">חסיד</span> <span class="highlight">אומות</span> <span class="highlight">העולם</span>'
-                       },
-                       {
-                               desc: 'Test 021: RTL he Hebrew',
-                               text: 'חסיד אומות העולם',
-                               highlight: 'חסי',
-                               expected: '<span class="highlight">חסי</span>ד אומות העולם'
-                       },
-                       {
-                               desc: 'Test 022: ja Japanese',
-                               text: '諸国民の中の正義の人',
-                               highlight: '諸国民の中の正義の人',
-                               expected: '<span class="highlight">諸国民の中の正義の人</span>'
-                       },
-                       {
-                               desc: 'Test 023: ja Japanese',
-                               text: '諸国民の中の正義の人',
-                               highlight: '諸国',
-                               expected: '<span class="highlight">諸国</span>民の中の正義の人'
-                       },
-                       {
-                               desc: 'Test 024: fr French text and « french quotes » (guillemets)',
-                               text: '« L\'oiseau est sur l’île »',
-                               highlight: '« L\'oiseau est sur l’île »',
-                               expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
-                       },
-                       {
-                               desc: 'Test 025: fr French text and « french quotes » (guillemets)',
-                               text: '« L\'oiseau est sur l’île »',
-                               highlight: '« L\'oise',
-                               expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
-                       },
-                       {
-                               desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
-                               text: '« L\'oiseau est sur l’île »',
-                               highlight: '« L',
-                               expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
-                       },
-                       {
-                               desc: 'Test 026: ru Russian',
-                               text: 'Праведники мира',
-                               highlight: 'Праведники мира',
-                               expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
-                       },
-                       {
-                               desc: 'Test 027: ru Russian',
-                               text: 'Праведники мира',
-                               highlight: 'Праве',
-                               expected: '<span class="highlight">Праве</span>дники мира'
-                       },
-                       {
-                               desc: 'Test 028 ka Georgian',
-                               text: 'მთავარი გვერდი',
-                               highlight: 'მთავარი გვერდი',
-                               expected: '<span class="highlight">მთავარი</span> <span class="highlight">გვერდი</span>'
-                       },
-                       {
-                               desc: 'Test 029 ka Georgian',
-                               text: 'მთავარი გვერდი',
-                               highlight: 'მთა',
-                               expected: '<span class="highlight">მთა</span>ვარი გვერდი'
-                       },
-                       {
-                               desc: 'Test 030 hy Armenian',
-                               text: 'Նոնա Գափրինդաշվիլի',
-                               highlight: 'Նոնա Գափրինդաշվիլի',
-                               expected: '<span class="highlight">Նոնա</span> <span class="highlight">Գափրինդաշվիլի</span>'
-                       },
-                       {
-                               desc: 'Test 031 hy Armenian',
-                               text: 'Նոնա Գափրինդաշվիլի',
-                               highlight: 'Նոն',
-                               expected: '<span class="highlight">Նոն</span>ա Գափրինդաշվիլի'
-                       },
-                       {
-                               desc: 'Test 032: th Thai',
-                               text: 'พอล แอร์ดิช',
-                               highlight: 'พอล แอร์ดิช',
-                               expected: '<span class="highlight">พอล</span> <span class="highlight">แอร์ดิช</span>'
-                       },
-                       {
-                               desc: 'Test 033: th Thai',
-                               text: 'พอล แอร์ดิช',
-                               highlight: 'พอ',
-                               expected: '<span class="highlight">พอ</span>ล แอร์ดิช'
-                       },
-                       {
-                               desc: 'Test 034: RTL ar Arabic',
-                               text: 'بول إيردوس',
-                               highlight: 'بول إيردوس',
-                               expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
-                       },
-                       {
-                               desc: 'Test 035: RTL ar Arabic',
-                               text: 'بول إيردوس',
-                               highlight: 'بو',
-                               expected: '<span class="highlight">بو</span>ل إيردوس'
-                       }
-               ];
-               QUnit.expect( cases.length );
+               var $fixture,
+                       cases = [
+                               {
+                                       desc: 'Test 001',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 002',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue ',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 003',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue Ö',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+                               },
+                               {
+                                       desc: 'Test 004',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue Öy',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+                               },
+                               {
+                                       desc: 'Test 005',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 006',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue ',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 007',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue Ö',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+                               },
+                               {
+                                       desc: 'Test 008',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue Öy',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+                               },
+                               {
+                                       desc: 'Test 009: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Österreich',
+                                       expected: '<span class="highlight">Österreich</span>'
+                               },
+                               {
+                                       desc: 'Test 010: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Ö',
+                                       expected: '<span class="highlight">Ö</span>sterreich'
+                               },
+                               {
+                                       desc: 'Test 011: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Öst',
+                                       expected: '<span class="highlight">Öst</span>erreich'
+                               },
+                               {
+                                       desc: 'Test 012: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Oe',
+                                       expected: 'Österreich'
+                               },
+                               {
+                                       desc: 'Test 013: Highlighter broken on punctuation mark?',
+                                       text: 'So good. To be there',
+                                       highlight: 'good',
+                                       expected: 'So <span class="highlight">good</span>. To be there'
+                               },
+                               {
+                                       desc: 'Test 014: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: 'be',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 015: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: ' be',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 016: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: 'be ',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 017: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: ' be ',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 018: en de Highlighter broken on special character at the end?',
+                                       text: 'So good. xbß',
+                                       highlight: 'xbß',
+                                       expected: 'So good. <span class="highlight">xbß</span>'
+                               },
+                               {
+                                       desc: 'Test 019: en de Highlighter broken on special character at the end?',
+                                       text: 'So good. xbß.',
+                                       highlight: 'xbß.',
+                                       expected: 'So good. <span class="highlight">xbß.</span>'
+                               },
+                               {
+                                       desc: 'Test 020: RTL he Hebrew',
+                                       text: 'חסיד אומות העולם',
+                                       highlight: 'חסיד אומות העולם',
+                                       expected: '<span class="highlight">חסיד</span> <span class="highlight">אומות</span> <span class="highlight">העולם</span>'
+                               },
+                               {
+                                       desc: 'Test 021: RTL he Hebrew',
+                                       text: 'חסיד אומות העולם',
+                                       highlight: 'חסי',
+                                       expected: '<span class="highlight">חסי</span>ד אומות העולם'
+                               },
+                               {
+                                       desc: 'Test 022: ja Japanese',
+                                       text: '諸国民の中の正義の人',
+                                       highlight: '諸国民の中の正義の人',
+                                       expected: '<span class="highlight">諸国民の中の正義の人</span>'
+                               },
+                               {
+                                       desc: 'Test 023: ja Japanese',
+                                       text: '諸国民の中の正義の人',
+                                       highlight: '諸国',
+                                       expected: '<span class="highlight">諸国</span>民の中の正義の人'
+                               },
+                               {
+                                       desc: 'Test 024: fr French text and « french quotes » (guillemets)',
+                                       text: '« L\'oiseau est sur l’île »',
+                                       highlight: '« L\'oiseau est sur l’île »',
+                                       expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
+                               },
+                               {
+                                       desc: 'Test 025: fr French text and « french quotes » (guillemets)',
+                                       text: '« L\'oiseau est sur l’île »',
+                                       highlight: '« L\'oise',
+                                       expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
+                               },
+                               {
+                                       desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
+                                       text: '« L\'oiseau est sur l’île »',
+                                       highlight: '« L',
+                                       expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
+                               },
+                               {
+                                       desc: 'Test 026: ru Russian',
+                                       text: 'Праведники мира',
+                                       highlight: 'Праведники мира',
+                                       expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
+                               },
+                               {
+                                       desc: 'Test 027: ru Russian',
+                                       text: 'Праведники мира',
+                                       highlight: 'Праве',
+                                       expected: '<span class="highlight">Праве</span>дники мира'
+                               },
+                               {
+                                       desc: 'Test 028 ka Georgian',
+                                       text: 'მთავარი გვერდი',
+                                       highlight: 'მთავარი გვერდი',
+                                       expected: '<span class="highlight">მთავარი</span> <span class="highlight">გვერდი</span>'
+                               },
+                               {
+                                       desc: 'Test 029 ka Georgian',
+                                       text: 'მთავარი გვერდი',
+                                       highlight: 'მთა',
+                                       expected: '<span class="highlight">მთა</span>ვარი გვერდი'
+                               },
+                               {
+                                       desc: 'Test 030 hy Armenian',
+                                       text: 'Նոնա Գափրինդաշվիլի',
+                                       highlight: 'Նոնա Գափրինդաշվիլի',
+                                       expected: '<span class="highlight">Նոնա</span> <span class="highlight">Գափրինդաշվիլի</span>'
+                               },
+                               {
+                                       desc: 'Test 031 hy Armenian',
+                                       text: 'Նոնա Գափրինդաշվիլի',
+                                       highlight: 'Նոն',
+                                       expected: '<span class="highlight">Նոն</span>ա Գափրինդաշվիլի'
+                               },
+                               {
+                                       desc: 'Test 032: th Thai',
+                                       text: 'พอล แอร์ดิช',
+                                       highlight: 'พอล แอร์ดิช',
+                                       expected: '<span class="highlight">พอล</span> <span class="highlight">แอร์ดิช</span>'
+                               },
+                               {
+                                       desc: 'Test 033: th Thai',
+                                       text: 'พอล แอร์ดิช',
+                                       highlight: 'พอ',
+                                       expected: '<span class="highlight">พอ</span>ล แอร์ดิช'
+                               },
+                               {
+                                       desc: 'Test 034: RTL ar Arabic',
+                                       text: 'بول إيردوس',
+                                       highlight: 'بول إيردوس',
+                                       expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
+                               },
+                               {
+                                       desc: 'Test 035: RTL ar Arabic',
+                                       text: 'بول إيردوس',
+                                       highlight: 'بو',
+                                       expected: '<span class="highlight">بو</span>ل إيردوس'
+                               }
+                       ];
 
                $.each( cases, function ( i, item ) {
                        $fixture = $( '<p>' ).text( item.text ).highlightText( item.highlight );
index c503fc9..a3e46ab 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $, mw ) {
        QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
+       QUnit.test( 'Handle basic replacements', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'basic', 'Basic stuff' );
 
@@ -30,7 +30,7 @@
                assert.strictEqual( $lc.attr( 'placeholder' ), 'Basic stuff', 'Attribute: placeholder-msg' );
        } );
 
-       QUnit.test( 'Proper escaping', 2, function ( assert ) {
+       QUnit.test( 'Proper escaping', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'properfoo', '<proper esc="test">' );
 
@@ -50,7 +50,8 @@
                assert.strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
        } );
 
-       QUnit.test( 'Options', 7, function ( assert ) {
+       QUnit.test( 'Options', function ( assert ) {
+               var html, $lc, x, sitename = 'Wikipedia';
                mw.messages.set( {
                        'foo-lorem': 'Lorem',
                        'foo-ipsum': 'Ipsum',
@@ -60,7 +61,6 @@
                        'foo-bazz-label': 'The Bazz ($1)',
                        'foo-welcome': 'Welcome to $1! (last visit: $2)'
                } );
-               var html, $lc, x, sitename = 'Wikipedia';
 
                // Message key prefix
                html = '<div><span title-msg="lorem"><html:msg key="ipsum" /></span></div>';
                assert.strictEqual( $lc.attr( 'title' ), 'Read more about bazz at Wikipedia (last modified: 3 minutes ago)', 'Combination of options prefix, params and keys - attr' );
        } );
 
-       QUnit.test( 'Handle data text', 2, function ( assert ) {
+       QUnit.test( 'Handle data text', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'option-one', 'Item 1' );
                mw.messages.set( 'option-two', 'Item 2' );
                assert.strictEqual( $lc.eq( 1 ).text(), mw.msg( 'option-two' ), 'data-msg-text becomes text of options' );
        } );
 
-       QUnit.test( 'Handle data html', 2, function ( assert ) {
+       QUnit.test( 'Handle data html', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'html', 'behold... there is a <a>link</a> here!!' );
                html = '<div><div data-msg-html="html"></div></div>';
index c51e409..4e77d72 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw, $ ) {
        var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
 
-       QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment( {
-               setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
-               }
-       } ) );
+       QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
 
        function prepareCollapsible( html, options ) {
                return $( $.parseHTML( html ) )
@@ -15,9 +11,8 @@
        }
 
        // This test is first because if it fails, then almost all of the latter tests are meaningless.
-       QUnit.test( 'testing hooks/triggers', 4, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'testing hooks/triggers', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>'
                        ),
                        $content = $collapsible.find( '.mw-collapsible-content' ),
 
                        // ...expanding happens here
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                // ...collapsing happens here
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 
-       QUnit.test( 'basic operation (<div>)', 5, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'basic operation (<div>)', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>'
                        ),
                        $content = $collapsible.find( '.mw-collapsible-content' ),
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 
-       QUnit.test( 'basic operation (<table>)', 7, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'basic operation (<table>)', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<table class="mw-collapsible">' +
                                        '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
                                        '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 
        function tableWithCaptionTest( $collapsible, test, assert ) {
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        }
 
-       QUnit.test( 'basic operation (<table> with caption)', 10, function ( assert ) {
+       QUnit.test( 'basic operation (<table> with caption)', function ( assert ) {
                tableWithCaptionTest( prepareCollapsible(
                        '<table class="mw-collapsible">' +
                                '<caption>' + loremIpsum + '</caption>' +
                ), this, assert );
        } );
 
-       QUnit.test( 'basic operation (<table> with caption and <thead>)', 10, function ( assert ) {
+       QUnit.test( 'basic operation (<table> with caption and <thead>)', function ( assert ) {
                tableWithCaptionTest( prepareCollapsible(
                        '<table class="mw-collapsible">' +
                                '<caption>' + loremIpsum + '</caption>' +
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        }
 
-       QUnit.test( 'basic operation (<ul>)', 7, function ( assert ) {
+       QUnit.test( 'basic operation (<ul>)', function ( assert ) {
                listTest( 'ul', this, assert );
        } );
 
-       QUnit.test( 'basic operation (<ol>)', 7, function ( assert ) {
+       QUnit.test( 'basic operation (<ol>)', function ( assert ) {
                listTest( 'ol', this, assert );
        } );
 
-       QUnit.test( 'basic operation when synchronous (options.instantHide)', 2, function ( assert ) {
+       QUnit.test( 'basic operation when synchronous (options.instantHide)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>',
                                { instantHide: true }
                assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
        } );
 
-       QUnit.test( 'mw-made-collapsible data added', 1, function ( assert ) {
+       QUnit.test( 'mw-made-collapsible data added', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div>' + loremIpsum + '</div>'
                        );
                assert.equal( $collapsible.data( 'mw-made-collapsible' ), true, 'mw-made-collapsible data present' );
        } );
 
-       QUnit.test( 'mw-collapsible added when missing', 1, function ( assert ) {
+       QUnit.test( 'mw-collapsible added when missing', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div>' + loremIpsum + '</div>'
                        );
                assert.assertTrue( $collapsible.hasClass( 'mw-collapsible' ), 'mw-collapsible class present' );
        } );
 
-       QUnit.test( 'mw-collapsed added when missing', 1, function ( assert ) {
+       QUnit.test( 'mw-collapsed added when missing', function ( assert ) {
                var $collapsible = prepareCollapsible(
                        '<div>' + loremIpsum + '</div>',
                                { collapsed: true }
                assert.assertTrue( $collapsible.hasClass( 'mw-collapsed' ), 'mw-collapsed class present' );
        } );
 
-       QUnit.test( 'initial collapse (mw-collapsed class)', 2, function ( assert ) {
+       QUnit.test( 'initial collapse (mw-collapsed class)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
                        ),
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
-       QUnit.test( 'initial collapse (options.collapsed)', 2, function ( assert ) {
+       QUnit.test( 'initial collapse (options.collapsed)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>',
                                { collapsed: true }
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
-       QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', 2, function ( assert ) {
+       QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', 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( 'collapse/expand text (data-collapsetext, data-expandtext)', 2, function ( assert ) {
+       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 +
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
-       QUnit.test( 'collapse/expand text (options.collapseText, options.expandText)', 2, function ( assert ) {
+       QUnit.test( 'collapse/expand text (options.collapseText, options.expandText)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>',
                                { collapseText: 'Collapse me!', expandText: 'Expand me!' }
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
-       QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'cloned collapsibles can be made collapsible again', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>'
                        ),
                        $clone = $collapsible.clone() // clone without data and events
                } );
 
                $clone.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 }( mediaWiki, jQuery ) );
index 029edd5..aeda516 100644 (file)
@@ -10,7 +10,7 @@
                }
        } ) );
 
-       QUnit.test( 'String functions', 7, function ( assert ) {
+       QUnit.test( 'String functions', function ( assert ) {
                assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
                assert.equal( $.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
                assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
@@ -24,7 +24,7 @@
                assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
        } );
 
-       QUnit.test( 'isDomElement', 6, function ( assert ) {
+       QUnit.test( 'isDomElement', function ( assert ) {
                assert.strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
                        'isDomElement: HTMLElement' );
                assert.strictEqual( $.isDomElement( document.createTextNode( '' ) ), true,
@@ -39,7 +39,7 @@
                        'isDomElement: Plain Object' );
        } );
 
-       QUnit.test( 'isEmpty', 7, function ( assert ) {
+       QUnit.test( 'isEmpty', function ( assert ) {
                assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmpty: "string"' );
                assert.strictEqual( $.isEmpty( '0' ), true, 'isEmpty: "0"' );
                assert.strictEqual( $.isEmpty( '' ), true, 'isEmpty: ""' );
@@ -51,7 +51,7 @@
                assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmpty: { length: 0 }' );
        } );
 
-       QUnit.test( 'Comparison functions', 5, function ( assert ) {
+       QUnit.test( 'Comparison functions', function ( assert ) {
                assert.ok( $.compareArray( [ 0, 'a', [], [ 2, 'b' ] ], [ 0, 'a', [], [ 2, 'b' ] ] ),
                        'compareArray: Two deep arrays that are excactly the same' );
                assert.ok( !$.compareArray( [ 1 ], [ 2 ] ), 'compareArray: Two different arrays (false)' );
index 5d0ddeb..dd7666b 100644 (file)
@@ -1,8 +1,9 @@
 ( function ( $ ) {
+       var html, testElement;
 
        QUnit.module( 'jquery.placeholder', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'caches results of feature tests', 2, function ( assert ) {
+       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' );
        } );
                return;
        }
 
-       var 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>',
+       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' );
 
                $el.placeholder( placeholder );
        };
 
-       QUnit.test( 'emulates placeholder for <input type=text>', 22, function ( assert ) {
+       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>', 22, function ( 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>', 22, function ( 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>', 22, function ( 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>', 22, function ( 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>', 13, function ( 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' ) );
 
-               var selector = '#input-type-password',
-                       $el = $( selector ),
-                       el = $el[ 0 ],
-                       placeholder = el.getAttribute( 'placeholder' );
+               $el = $( selector );
+               el = $el[ 0 ];
+               placeholder = el.getAttribute( 'placeholder' );
 
                assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
 
 
        } );
 
-       QUnit.test( 'emulates placeholder for <textarea></textarea>', 22, function ( assert ) {
+       QUnit.test( 'emulates placeholder for <textarea>', function ( assert ) {
                $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
                testElement( $( '#textarea' ), assert );
        } );
index 1213793..ec3539b 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'firstTabIndex', 2, function ( assert ) {
+       QUnit.test( 'firstTabIndex', function ( assert ) {
                var html, $testA, $testB;
                html = '<form>' +
                        '<input tabindex="7" />' +
@@ -17,7 +17,7 @@
                assert.strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
        } );
 
-       QUnit.test( 'lastTabIndex', 2, function ( assert ) {
+       QUnit.test( 'lastTabIndex', function ( assert ) {
                var html, $testA, $testB;
                html = '<form>' +
                        '<input tabindex="7" />' +
index 11ceeea..c0b1657 100644 (file)
                                                'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
                                names: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
+                                       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
@@ -54,7 +54,7 @@
         * @param {function($table)} callback something to do before we start the testcase
         */
        function parserTest( msg, parserId, data, callback ) {
-               QUnit.test( msg, data.length * 2, function ( assert ) {
+               QUnit.test( msg, function ( assert ) {
                        var extractedR, extractedF, parser;
 
                        if ( callback !== undefined ) {
@@ -73,7 +73,7 @@
                } );
        }
 
-       text  = [
+       text = [
                [ 'Mars', true, 'mars', 'Simple text' ],
                [ 'Mẘas', true, 'mẘas', 'Non ascii character' ],
                [ 'A sentence', true, 'a sentence', 'A sentence with space chars' ]
@@ -88,7 +88,7 @@
                [ '1.238.27.1', true, 1238027001, 'An IP address with small numbers' ],
                [ '238.27.1', false, 238027001, 'A malformed IP Address' ],
                [ '1', false, 1, 'A super malformed IP Address' ],
-               [ 'Just text', false, 0, 'A line with just text' ],
+               [ 'Just text', false, -Infinity, 'A line with just text' ],
                [ '45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ],
                [ '45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ]
        ];
                [ '2000',               false, 0, 'Plain 4-digit year' ],
                [ '2000-01',            false, 0, 'Year with month' ],
                [ '2000-01-01', true, 946684800000, 'Year with month and day' ],
-               [ '2000-13-01', true, 0, 'Non existant month' ],
-               [ '2000-01-32', true, 0, 'Non existant day' ],
+               [ '2000-13-01', true, -Infinity, 'Non existant month' ],
+               [ '2000-01-32', true, -Infinity, 'Non existant day' ],
                [ '2000-01-01T12:30:30',                true, 946729830000, 'Date with a time' ],
                [ '2000-01-01T12:30:30Z',       true, 946729830000, 'Date with a UTC+0 time' ],
-               [ '2000-01-01T24:30:30Z',       true, 0, 'Date with invalid hours' ],
-               [ '2000-01-01T12:60:30Z',       true, 0, 'Date with invalid minutes' ],
+               [ '2000-01-01T24:30:30Z',       true, -Infinity, 'Date with invalid hours' ],
+               [ '2000-01-01T12:60:30Z',       true, -Infinity, 'Date with invalid minutes' ],
                [ '2000-01-01T12:30:61Z',       true, 946729800000, 'Date with invalid amount of seconds, drops seconds' ],
                [ '2000-01-01T23:59:59Z',       true, 946771199000, 'Edges of time' ],
                [ '2000-01-01T12:30:30.111Z',   true, 946729830111, 'Date with milliseconds' ],
                [ '2000-01-01T12:30:30.11111Z', true, 946729830111, 'Date with too high precision' ],
-               [ '2000-01-01T12:30:30,111Z',   true, 0, 'Date with milliseconds and , separator' ],
+               [ '2000-01-01T12:30:30,111Z',   true, -Infinity, 'Date with milliseconds and , separator' ],
                [ '2000-01-01T12:30:30+01:00',  true, 946726230000, 'Date time in UTC+1' ],
                [ '2000-01-01T12:30:30+01:30',  true, 946724430000, 'Date time in UTC+1:30' ],
                [ '2000-01-01T12:30:30-01:00',  true, 946733430000, 'Date time in UTC-1' ],
                [ '2000-01-01T12:30:30-01:30',  true, 946735230000, 'Date time in UTC-1:30' ],
-               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1 ' ],
+               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1' ],
                [ '2000-01-01Postfix', true, 946684800000, 'Date with appended postfix' ],
                [ '2000-01-01 Postfix', true, 946684800000, 'Date with separate postfix' ]
                /* Disable testcases, because behavior is browser dependant */
                } );
        } );
 
-       // TODO add numbers sorting tests for bug 8115 with a different language
+       // TODO add numbers sorting tests for T10115 with a different language
 
 }( jQuery, mediaWiki ) );
index ca26aaf..5b973f6 100644 (file)
                                                'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
                                names: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
+                                       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
                $tr.appendTo( $thead );
 
                for ( i = 0; i < data.length; i++ ) {
-                       /*jshint loopfunc: true */
                        $tr = $( '<tr>' );
+                       // eslint-disable-next-line no-loop-func
                        $.each( data[ i ], function ( j, str ) {
                                var $td = $( '<td>' );
                                $td.text( str ).appendTo( $tr );
                simple,
                simpleAsc,
                function ( $table ) {
+                       var event;
                        $table.tablesorter(
                                { sortList: [ { 0: 'desc' }, { 1: 'desc' } ] }
                        );
                        $table.find( '.headerSort:eq(0)' ).click();
 
                        // Pretend to click while pressing the multi-sort key
-                       var event = $.Event( 'click' );
+                       event = $.Event( 'click' );
                        event[ $table.data( 'tablesorter' ).config.sortMultiSortKey ] = true;
                        $table.find( '.headerSort:eq(1)' ).trigger( event );
                }
        );
-       QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
+       QUnit.test( 'Reset sorting making table appear unsorted', function ( assert ) {
                var $table = tableCreate( header, simple );
                $table.tablesorter(
                        { sortList: [
                }
        );
 
-       QUnit.test( 'Basic planet table: one unsortable column', 3, function ( assert ) {
+       QUnit.test( 'Basic planet table: one unsortable column', function ( assert ) {
                var $table = tableCreate( header, planets ),
                        $cell;
                $table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' );
 
        // Regression tests!
        tableTest(
-               'Bug 28775: German-style (dmy) short numeric dates',
+               'T30775: German-style (dmy) short numeric dates',
                [ 'Date' ],
                [
                        // German-style dates are day-month-year
        );
 
        tableTest(
-               'Bug 28775: American-style (mdy) short numeric dates',
+               'T30775: American-style (mdy) short numeric dates',
                [ 'Date' ],
                [
                        // American-style dates are month-day-year
        );
 
        tableTest(
-               'Bug 17141: IPv4 address sorting',
+               'T19141: IPv4 address sorting',
                [ 'IP' ],
                ipv4,
                ipv4Sorted,
                }
        );
        tableTest(
-               'Bug 17141: IPv4 address sorting (reverse)',
+               'T19141: IPv4 address sorting (reverse)',
                [ 'IP' ],
                ipv4,
                reversed( ipv4Sorted ),
                }
        );
 
-       QUnit.test( 'Rowspan not exploded on init', 1, function ( assert ) {
+       QUnit.test( 'Rowspan not exploded on init', function ( assert ) {
                var $table = tableCreate( header, planets );
 
                // Modify the table to have a multiple-row-spanning cell:
                }
        );
 
-       QUnit.test( 'Test detection routine', 1, function ( assert ) {
+       QUnit.test( 'Test detection routine', function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
        } );
 
        /** FIXME: the diff output is not very readeable. */
-       QUnit.test( 'bug 32047 - caption must be before thead', 1, function ( assert ) {
+       QUnit.test( 'T34047 - caption must be before thead', function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
                assert.equal(
                        $table.children().get( 0 ).nodeName,
                        'CAPTION',
-                       'First element after <thead> must be <caption> (bug 32047)'
+                       'First element after <thead> must be <caption> (T34047)'
                );
        } );
 
-       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', 3, function ( assert ) {
+       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
                var $table, data;
 
                // Example 1: All cells except one cell without data-sort-value,
                ], 'Order matches expected order (based on data-sort-value attribute values)' );
 
                // Example 3: Test that live changes are used from data-sort-value,
-               // even if they change after the tablesorter is constructed (bug 38152).
+               // even if they change after the tablesorter is constructed (T40152).
                $table = $(
                        '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
                                '<tbody>' +
                        .tablesorter()
                        .find( '.headerSort:eq(0)' ).click();
 
-               // Change the sortValue data properties (bug 38152)
+               // Change the sortValue data properties (T40152)
                // - change data
                $table.find( 'td:contains(A)' ).data( 'sortValue', 3 );
                // - add data
 
        } );
 
-       tableTest( 'bug 8115: sort numbers with commas (ascending)',
+       tableTest( 'T10115: sort numbers with commas (ascending)',
                [ 'Numbers' ], numbers, numbersAsc,
                function ( $table ) {
                        $table.tablesorter();
                }
        );
 
-       tableTest( 'bug 8115: sort numbers with commas (descending)',
+       tableTest( 'T10115: sort numbers with commas (descending)',
                [ 'Numbers' ], numbers, reversed( numbersAsc ),
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click().click();
                }
        );
-       // TODO add numbers sorting tests for bug 8115 with a different language
+       // TODO add numbers sorting tests for T10115 with a different language
 
-       QUnit.test( 'bug 32888 - Tables inside a tableheader cell', 2, function ( assert ) {
+       QUnit.test( 'T34888 - Tables inside a tableheader cell', function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable" id="mw-bug-32888">' +
                assert.equal(
                        $table.find( '> thead:eq(0) > tr > th.headerSort' ).length,
                        1,
-                       'Child tables inside a headercell should not interfere with sortable headers (bug 32888)'
+                       'Child tables inside a headercell should not interfere with sortable headers (T34888)'
                );
                assert.equal(
                        $( '#mw-bug-32888-2' ).find( 'th.headerSort' ).length,
                        0,
-                       'The headers of child tables inside a headercell should not be sortable themselves (bug 32888)'
+                       'The headers of child tables inside a headercell should not be sortable themselves (T34888)'
                );
        } );
 
                }
        );
 
-       QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
+       QUnit.test( 'Sorting images using alt text', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (complex)', 1, function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (complex)', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (with format autodetection)', 1, function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (with format autodetection)', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'bug 38911 - The row with the largest amount of columns should receive the sort indicators', 3, function ( assert ) {
+       QUnit.test( 'T40911 - The row with the largest amount of columns should receive the sort indicators', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', 2, function ( assert ) {
+       QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       QUnit.test( 'holes in the table headers should not throw JS errors', 2, function ( assert ) {
+       QUnit.test( 'holes in the table headers should not throw JS errors', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       // bug 53527
-       QUnit.test( 'td cells in thead should not be taken into account for longest row calculation', 2, function ( assert ) {
+       // T55527
+       QUnit.test( 'td cells in thead should not be taken into account for longest row calculation', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       // bug 41889 - exploding rowspans in more complex cases
+       // T43889 - exploding rowspans in more complex cases
        tableTestHTML(
                'Rowspan exploding with row headers',
                '<table class="sortable">' +
                ]
        );
 
-       // bug 53211 - exploding rowspans in more complex cases
+       // T55211 - exploding rowspans in more complex cases
        QUnit.test(
-               'Rowspan exploding with row headers and colspans', 1, function ( assert ) {
+               'Rowspan exploding with row headers and colspans', function ( assert ) {
                        var $table = $( '<table class="sortable">' +
                                '<thead><tr><th rowspan="2">n</th><th colspan="2">foo</th><th rowspan="2">baz</th></tr>' +
                                '<tr><th>foo</th><th>bar</th></tr></thead>' +
                ]
        );
 
-       QUnit.test( 'bug 105731 - incomplete rows in table body', 3, function ( assert ) {
+       QUnit.test( 'T105731 - incomplete rows in table body', function ( assert ) {
                var $table, parsers;
                $table = $(
                        '<table class="sortable">' +
 
                assert.equal(
                        parsers[ 1 ].format( $table.find( 'tbody > tr > td:eq(1)' ).text() ),
-                       0,
-                       'empty cell is sorted as number 0'
+                       -Infinity,
+                       'empty cell is sorted as number -Infinity'
                );
        } );
 
-       QUnit.test( 'bug T114721 - use of expand-child class', 2, function ( assert ) {
+       QUnit.test( 'bug T114721 - use of expand-child class', function ( assert ) {
                var $table, parsers;
                $table = $(
                        '<table class="sortable">' +
index 1001679..f958e09 100644 (file)
@@ -1,4 +1,28 @@
 ( function ( $ ) {
+       var caretSample,
+               sig = {
+                       pre: '--~~~~'
+               },
+               bold = {
+                       pre: '\'\'\'',
+                       peri: 'Bold text',
+                       post: '\'\'\''
+               },
+               h2 = {
+                       pre: '== ',
+                       peri: 'Heading 2',
+                       post: ' ==',
+                       regex: /^(\s*)(={1,6})(.*?)\2(\s*)$/,
+                       regexReplace: '$1==$3==$4',
+                       ownline: true
+               },
+               ulist = {
+                       pre: '* ',
+                       peri: 'Bulleted list item',
+                       post: '',
+                       ownline: true,
+                       splitlines: true
+               };
 
        QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
 
                }, opt.after );
 
                QUnit.test( opt.description, function ( assert ) {
-                       var $textarea, start, end, options, text, selected,
-                               tests = 1;
-                       if ( opt.after.selected !== null ) {
-                               tests++;
-                       }
-                       QUnit.expect( tests );
+                       var $textarea, start, end, options, text, selected;
 
                        $textarea = $( '<textarea>' );
 
                } );
        }
 
-       var caretSample,
-               sig = {
-                       pre: '--~~~~'
-               },
-               bold = {
-                       pre: '\'\'\'',
-                       peri: 'Bold text',
-                       post: '\'\'\''
-               },
-               h2 = {
-                       pre: '== ',
-                       peri: 'Heading 2',
-                       post: ' ==',
-                       regex: /^(\s*)(={1,6})(.*?)\2(\s*)$/,
-                       regexReplace: '$1==$3==$4',
-                       ownline: true
-               },
-               ulist = {
-                       pre: '* ',
-                       peri: 'Bulleted list item',
-                       post: '',
-                       ownline: true,
-                       splitlines: true
-               };
-
        encapsulateTest( {
                description: 'Adding sig to end of text',
                before: {
        } );
 
        function caretTest( options ) {
-               QUnit.test( options.description, 2, function ( assert ) {
+               QUnit.test( options.description, function ( assert ) {
                        var pos,
                                $textarea = $( '<textarea>' ).text( options.text );
 
 
        caretSample = 'Some big text that we like to work with. Nothing fancy... you know what I mean?';
 
-       /* @broken: Disabled per bug 34820
+       /* @broken: Disabled per T36820
        caretTest({
-               description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
+               description: 'getCaretPosition with original/empty selection - T33847 with IE 6/7/8',
                text: caretSample,
                start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
                end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
index 9d0fdf5..69ab797 100644 (file)
@@ -3,16 +3,10 @@
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                        this.server.respondImmediately = true;
-                       this.clock = this.sandbox.useFakeTimers();
-               },
-               teardown: function () {
-                       // https://github.com/jquery/jquery/issues/2453
-                       this.clock.tick();
                }
        } ) );
 
        QUnit.test( 'origin is included in GET requests', function ( assert ) {
-               QUnit.expect( 1 );
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
-               api.get( {} );
+               return api.get( {} );
        } );
 
        QUnit.test( 'origin is included in POST requests', function ( assert ) {
-               QUnit.expect( 2 );
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
@@ -33,7 +26,7 @@
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
-               api.post( {} );
+               return api.post( {} );
        } );
 
 }( mediaWiki ) );
index a0c7daf..8ad1290 100644 (file)
@@ -2,29 +2,24 @@
        QUnit.module( 'mediawiki.api.category', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
        QUnit.test( '.getCategoriesByPrefix()', function ( assert ) {
-               QUnit.expect( 1 );
+               this.server.respondWith( [ 200, { 'Content-Type': 'application/json' },
+                       '{ "query": { "allpages": [ ' +
+                               '{ "title": "Category:Food" },' +
+                               '{ "title": "Category:Fool Supermarine S.6" },' +
+                               '{ "title": "Category:Fools" }' +
+                               '] } }'
+               ] );
 
-               var api = new mw.Api();
-
-               api.getCategoriesByPrefix( 'Foo' ).done( function ( matches ) {
+               return new mw.Api().getCategoriesByPrefix( 'Foo' ).then( function ( matches ) {
                        assert.deepEqual(
                                matches,
                                [ 'Food', 'Fool Supermarine S.6', 'Fools' ]
                        );
                } );
-
-               this.server.respond( function ( req ) {
-                       req.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "query": { "allpages": [ ' +
-                                       '{ "title": "Category:Food" },' +
-                                       '{ "title": "Category:Fool Supermarine S.6" },' +
-                                       '{ "title": "Category:Fools" }' +
-                                       '] } }'
-                       );
-               } );
        } );
 }( mediaWiki ) );
index f83f66c..13d7dcc 100644 (file)
@@ -15,7 +15,7 @@
                                                pages: [ {
                                                        pageid: 1,
                                                        ns: 0,
-                                                       title:  'Sandbox',
+                                                       title: 'Sandbox',
                                                        revisions: [ {
                                                                timestamp: '2016-01-01T12:00:00Z',
                                                                contentformat: 'text/x-wiki',
@@ -56,7 +56,7 @@
                                                pages: [ {
                                                        pageid: 4,
                                                        ns: 0,
-                                                       title:  'Async',
+                                                       title: 'Async',
                                                        revisions: [ {
                                                                timestamp: '2016-02-01T12:00:00Z',
                                                                contentformat: 'text/x-wiki',
@@ -97,7 +97,7 @@
                                                pages: [ {
                                                        pageid: 3,
                                                        ns: 0,
-                                                       title:  'Param',
+                                                       title: 'Param',
                                                        revisions: [ {
                                                                timestamp: '2016-03-01T12:00:00Z',
                                                                contentformat: 'text/x-wiki',
                        if ( /edit.+text=Sand/.test( req.requestBody ) ) {
                                req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
                                        edit: {
-                                               'new': true,
+                                               new: true,
                                                result: 'Success',
                                                newrevid: 41,
                                                newtimestamp: '2016-04-01T12:00:00Z'
index 5880962..7282b3f 100644 (file)
@@ -2,14 +2,21 @@
        QUnit.module( 'mediawiki.api.messages', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
        QUnit.test( '.getMessages()', function ( assert ) {
-               QUnit.expect( 1 );
+               this.server.respondWith( /ammessages=foo%7Cbaz/, [
+                       200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "query": { "allmessages": [' +
+                               '{ "name": "foo", "content": "Foo bar" },' +
+                               '{ "name": "baz", "content": "Baz Quux" }' +
+                               '] } }'
+               ] );
 
-               var api = new mw.Api();
-               api.getMessages( [ 'foo', 'baz' ] ).then( function ( messages ) {
+               return new mw.Api().getMessages( [ 'foo', 'baz' ] ).then( function ( messages ) {
                        assert.deepEqual(
                                messages,
                                {
                                }
                        );
                } );
-
-               this.server.respond( /ammessages=foo%7Cbaz/, [
-                       200,
-                       { 'Content-Type': 'application/json' },
-                       '{ "query": { "allmessages": [' +
-                               '{ "name": "foo", "content": "Foo bar" },' +
-                               '{ "name": "baz", "content": "Baz Quux" }' +
-                               '] } }'
-               ] );
        } );
 }( mediaWiki ) );
index 0797f32..854e4b1 100644 (file)
@@ -2,14 +2,12 @@
        QUnit.module( 'mediawiki.api.options', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
        QUnit.test( 'saveOption', function ( assert ) {
-               QUnit.expect( 2 );
-
-               var
-                       api = new mw.Api(),
+               var api = new mw.Api(),
                        stub = this.sandbox.stub( mw.Api.prototype, 'saveOptions' );
 
                api.saveOption( 'foo', 'bar' );
@@ -19,8 +17,6 @@
        } );
 
        QUnit.test( 'saveOptions without Unit Separator', function ( assert ) {
-               QUnit.expect( 13 );
-
                var api = new mw.Api( { useUS: false } );
 
                // We need to respond to the request for token first, otherwise the other requests won't be sent
                                '{ "query": { "tokens": { "csrftoken": "+\\\\" } } }' ]
                );
 
-               api.saveOptions( {} ).done( function () {
-                       assert.ok( true, 'Request completed: empty case' );
-               } );
-               api.saveOptions( { foo: 'bar' } ).done( function () {
-                       assert.ok( true, 'Request completed: simple' );
-               } );
-               api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: two options' );
-               } );
-               api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: not bundleable' );
-               } );
-               api.saveOptions( { foo: null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option' );
-               } );
-               api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option, not bundleable' );
-               } );
-
                // Requests are POST, match requestBody instead of url
                this.server.respond( function ( request ) {
-                       switch ( request.requestBody ) {
+                       if ( $.inArray( request.requestBody, [
                                // simple
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C',
                                // two options
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C',
                                // not bundleable
-                               case 'action=options&format=json&formatversion=2&optionname=foo&optionvalue=bar%7Cquux&token=%2B%5C':
-                               case 'action=options&format=json&formatversion=2&optionname=bar&optionvalue=a%7Cb%7Cc&token=%2B%5C':
-                               case 'action=options&format=json&formatversion=2&change=baz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&optionname=foo&optionvalue=bar%7Cquux&token=%2B%5C',
+                               'action=options&format=json&formatversion=2&optionname=bar&optionvalue=a%7Cb%7Cc&token=%2B%5C',
+                               'action=options&format=json&formatversion=2&change=baz%3Dquux&token=%2B%5C',
                                // reset an option
-                               case 'action=options&format=json&formatversion=2&change=foo&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo&token=%2B%5C',
                                // reset an option, not bundleable
-                               case 'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C':
-                                       assert.ok( true, 'Repond to ' + request.requestBody );
-                                       request.respond( 200, { 'Content-Type': 'application/json' },
-                                               '{ "options": "success" }' );
-                                       break;
-                               default:
-                                       assert.ok( false, 'Unexpected request: ' + request.requestBody );
+                               'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C'
+                       ] ) !== -1 ) {
+                               assert.ok( true, 'Repond to ' + request.requestBody );
+                               request.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "options": "success" }' );
+                       } else {
+                               assert.ok( false, 'Unexpected request: ' + request.requestBody );
                        }
                } );
+
+               return QUnit.whenPromisesComplete(
+                       api.saveOptions( {} ).then( function () {
+                               assert.ok( true, 'Request completed: empty case' );
+                       } ),
+                       api.saveOptions( { foo: 'bar' } ).then( function () {
+                               assert.ok( true, 'Request completed: simple' );
+                       } ),
+                       api.saveOptions( { foo: 'bar', baz: 'quux' } ).then( function () {
+                               assert.ok( true, 'Request completed: two options' );
+                       } ),
+                       api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).then( function () {
+                               assert.ok( true, 'Request completed: not bundleable' );
+                       } ),
+                       api.saveOptions( { foo: null } ).then( function () {
+                               assert.ok( true, 'Request completed: reset an option' );
+                       } ),
+                       api.saveOptions( { 'foo|bar=quux': null } ).then( function () {
+                               assert.ok( true, 'Request completed: reset an option, not bundleable' );
+                       } )
+               );
        } );
 
        QUnit.test( 'saveOptions with Unit Separator', function ( assert ) {
-               QUnit.expect( 14 );
-
                var api = new mw.Api( { useUS: true } );
 
                // We need to respond to the request for token first, otherwise the other requests won't be sent
                                '{ "query": { "tokens": { "csrftoken": "+\\\\" } } }' ]
                );
 
-               api.saveOptions( {} ).done( function () {
-                       assert.ok( true, 'Request completed: empty case' );
-               } );
-               api.saveOptions( { foo: 'bar' } ).done( function () {
-                       assert.ok( true, 'Request completed: simple' );
-               } );
-               api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: two options' );
-               } );
-               api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: bundleable with unit separator' );
-               } );
-               api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', 'baz=baz': 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: not bundleable with unit separator' );
-               } );
-               api.saveOptions( { foo: null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option' );
-               } );
-               api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option, not bundleable' );
-               } );
-
                // Requests are POST, match requestBody instead of url
                this.server.respond( function ( request ) {
-                       switch ( request.requestBody ) {
+                       if ( $.inArray( request.requestBody, [
                                // simple
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C',
                                // two options
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C',
                                // bundleable with unit separator
-                               case 'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc%1Fbaz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc%1Fbaz%3Dquux&token=%2B%5C',
                                // not bundleable with unit separator
-                               case 'action=options&format=json&formatversion=2&optionname=baz%3Dbaz&optionvalue=quux&token=%2B%5C':
-                               case 'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&optionname=baz%3Dbaz&optionvalue=quux&token=%2B%5C',
+                               'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc&token=%2B%5C',
                                // reset an option
-                               case 'action=options&format=json&formatversion=2&change=foo&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo&token=%2B%5C',
                                // reset an option, not bundleable
-                               case 'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C':
-                                       assert.ok( true, 'Repond to ' + request.requestBody );
-                                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C'
+                       ] ) !== -1 ) {
+                               assert.ok( true, 'Repond to ' + request.requestBody );
+                               request.respond( 200, { 'Content-Type': 'application/json' },
                                                '{ "options": "success" }' );
-                                       break;
-                               default:
-                                       assert.ok( false, 'Unexpected request: ' + request.requestBody );
+                       } else {
+                               assert.ok( false, 'Unexpected request: ' + request.requestBody );
                        }
                } );
+
+               return QUnit.whenPromisesComplete(
+                       api.saveOptions( {} ).done( function () {
+                               assert.ok( true, 'Request completed: empty case' );
+                       } ),
+                       api.saveOptions( { foo: 'bar' } ).done( function () {
+                               assert.ok( true, 'Request completed: simple' );
+                       } ),
+                       api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
+                               assert.ok( true, 'Request completed: two options' );
+                       } ),
+                       api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
+                               assert.ok( true, 'Request completed: bundleable with unit separator' );
+                       } ),
+                       api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', 'baz=baz': 'quux' } ).done( function () {
+                               assert.ok( true, 'Request completed: not bundleable with unit separator' );
+                       } ),
+                       api.saveOptions( { foo: null } ).done( function () {
+                               assert.ok( true, 'Request completed: reset an option' );
+                       } ),
+                       api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
+                               assert.ok( true, 'Request completed: reset an option, not bundleable' );
+                       } )
+               );
        } );
 }( mediaWiki ) );
index dc0cff4..74da009 100644 (file)
@@ -2,42 +2,44 @@
        QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
-       QUnit.test( 'Hello world', function ( assert ) {
-               QUnit.expect( 3 );
+       QUnit.test( '.parse( string )', function ( assert ) {
+               this.server.respondWith( /action=parse.*&text='''Hello(\+|%20)world'''/, [ 200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "parse": { "text": "<p><b>Hello world</b></p>" } }'
+               ] );
 
-               var api = new mw.Api();
-
-               api.parse( '\'\'\'Hello world\'\'\'' ).done( function ( html ) {
+               return new mw.Api().parse( '\'\'\'Hello world\'\'\'' ).done( function ( html ) {
                        assert.equal( html, '<p><b>Hello world</b></p>', 'Parse wikitext by string' );
                } );
+       } );
 
-               api.parse( {
+       QUnit.test( '.parse( Object.toString )', function ( assert ) {
+               this.server.respondWith( /action=parse.*&text='''Hello(\+|%20)world'''/, [ 200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "parse": { "text": "<p><b>Hello world</b></p>" } }'
+               ] );
+
+               return new mw.Api().parse( {
                        toString: function () {
                                return '\'\'\'Hello world\'\'\'';
                        }
                } ).done( function ( html ) {
                        assert.equal( html, '<p><b>Hello world</b></p>', 'Parse wikitext by toString object' );
                } );
+       } );
 
-               this.server.respondWith( /action=parse.*&text='''Hello\+world'''/, function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "parse": { "text": "<p><b>Hello world</b></p>" } }'
-                       );
-               } );
-
-               api.parse( new mw.Title( 'Earth' ) ).done( function ( html ) {
-                       assert.equal( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object'  );
-               } );
+       QUnit.test( '.parse( mw.Title )', function ( assert ) {
+               this.server.respondWith( /action=parse.*&page=Earth/, [ 200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "parse": { "text": "<p><b>Earth</b> is a planet.</p>" } }'
+               ] );
 
-               this.server.respondWith( /action=parse.*&page=Earth/, function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "parse": { "text": "<p><b>Earth</b> is a planet.</p>" } }'
-                       );
+               return new mw.Api().parse( new mw.Title( 'Earth' ) ).done( function ( html ) {
+                       assert.equal( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object' );
                } );
-
-               this.server.respond();
        } );
 }( mediaWiki ) );
index 3a959a3..e10a7fa 100644 (file)
                return sequence( bodies );
        }
 
+       // Utility to make inline use with an assert easier
+       function match( text, pattern ) {
+               var m = text.match( pattern );
+               return m && m[ 1 ] || null;
+       }
+
        QUnit.test( 'get()', function ( assert ) {
                var api = new mw.Api();
 
@@ -44,7 +50,7 @@
                } );
        } );
 
-       QUnit.test( 'API error', function ( assert ) {
+       QUnit.test( 'API error errorformat=bc', function ( assert ) {
                var api = new mw.Api();
 
                this.server.respond( [ 200, { 'Content-Type': 'application/json' },
                        .always( assert.async() );
        } );
 
+       QUnit.test( 'API error errorformat!=bc', function ( assert ) {
+               var api = new mw.Api();
+
+               this.server.respond( [ 200, { 'Content-Type': 'application/json' },
+                       '{ "errors": [ { "code": "unknown_action", "key": "unknown-error", "params": [] } ] }'
+               ] );
+
+               api.get( { action: 'doesntexist' } )
+                       .fail( function ( errorCode ) {
+                               assert.equal( errorCode, 'unknown_action', 'API error should reject the deferred' );
+                       } )
+                       .always( assert.async() );
+       } );
+
        QUnit.test( 'FormData support', function ( assert ) {
                var api = new mw.Api();
 
                return api.post( { action: 'test' }, { contentType: 'multipart/form-data' } );
        } );
 
-       QUnit.test( 'Converting arrays to pipe-separated', function ( assert ) {
+       QUnit.test( 'Converting arrays to pipe-separated (string)', function ( assert ) {
                var api = new mw.Api();
 
                this.server.respond( function ( request ) {
-                       assert.ok( request.url.match( /test=foo%7Cbar%7Cbaz/ ), 'Pipe-separated value was submitted' );
+                       assert.equal( match( request.url, /test=([^&]+)/ ), 'foo%7Cbar%7Cbaz', 'Pipe-separated value was submitted' );
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
                return api.get( { test: [ 'foo', 'bar', 'baz' ] } );
        } );
 
+       QUnit.test( 'Converting arrays to pipe-separated (mw.Title)', function ( assert ) {
+               var api = new mw.Api();
+
+               this.server.respond( function ( request ) {
+                       assert.equal( match( request.url, /test=([^&]+)/ ), 'Foo%7CBar', 'Pipe-separated value was submitted' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               return api.get( { test: [ new mw.Title( 'Foo' ), new mw.Title( 'Bar' ) ] } );
+       } );
+
+       QUnit.test( 'Converting arrays to pipe-separated (misc primitives)', function ( assert ) {
+               var api = new mw.Api();
+
+               this.server.respond( function ( request ) {
+                       assert.equal( match( request.url, /test=([^&]+)/ ), 'true%7Cfalse%7C%7C%7C0%7C1%2E2', 'Pipe-separated value was submitted' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               // undefined/null will become empty string
+               return api.get( { test: [ true, false, undefined, null, 0, 1.2 ] } );
+       } );
+
        QUnit.test( 'Omitting false booleans', function ( assert ) {
                var api = new mw.Api();
 
                        ]
                ) );
 
-               // Don't cache error (bug 65268)
+               // Don't cache error (T67268)
                return api.getToken( 'testerror' )
                        .then( null, function ( err ) {
                                assert.equal( err, 'bite-me', 'Expected error' );
 
                return api.postWithToken( 'testassertpost', { action: 'example', key: 'foo', assert: 'user' } )
                        // Cast error to success and vice versa
-                       .then( function ( ) {
+                       .then( function () {
                                return $.Deferred().reject( 'Unexpected success' );
                        }, function ( errorCode ) {
                                assert.equal( errorCode, 'assertuserfailed', 'getToken fails assert' );
                this.server.respond( [ 200, { 'Content-Type': 'application/json' }, '{ "example": "quux" }' ] );
 
                return api.postWithToken( 'csrf',
-                               { action: 'example' },
-                               {
-                                       headers: {
-                                               'X-Foo': 'Bar'
-                                       }
+                       { action: 'example' },
+                       {
+                               headers: {
+                                       'X-Foo': 'Bar'
                                }
-                       )
-                       .then( function () {
-                               assert.equal( test.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
+                       }
+               )
+               .then( function () {
+                       assert.equal( test.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
 
-                               return api.postWithToken( 'csrf',
-                                       { action: 'example' },
-                                       function () {
-                                               assert.ok( false, 'This parameter cannot be a callback' );
-                                       }
-                               );
-                       } )
-                       .then( function ( data ) {
-                               assert.equal( data.example, 'quux' );
+                       return api.postWithToken( 'csrf',
+                               { action: 'example' },
+                               function () {
+                                       assert.ok( false, 'This parameter cannot be a callback' );
+                               }
+                       );
+               } )
+               .then( function ( data ) {
+                       assert.equal( data.example, 'quux' );
 
-                               assert.equal( test.server.requests.length, 2, 'Request made' );
-                       } );
+                       assert.equal( test.server.requests.length, 2, 'Request made' );
+               } );
        } );
 
        QUnit.test( 'postWithToken() - badtoken', function ( assert ) {
                }
        } );
 
-       QUnit.test( '#abort', 3, function ( assert ) {
+       QUnit.test( '#abort', function ( assert ) {
                this.api.get( {
                        a: 1
                } );
index 10fcd5d..bfaf7f2 100644 (file)
@@ -2,7 +2,6 @@
        QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
 
        QUnit.test( 'Basic functionality', function ( assert ) {
-               QUnit.expect( 2 );
                var api = new mw.Api();
                assert.ok( api.upload );
                assert.throws( function () {
@@ -11,7 +10,6 @@
        } );
 
        QUnit.test( 'Set up iframe upload', function ( assert ) {
-               QUnit.expect( 5 );
                var $iframe, $form, $input,
                        api = new mw.Api();
 
index 64a5184..8641469 100644 (file)
@@ -2,37 +2,45 @@
        QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
-       QUnit.test( '.watch()', function ( assert ) {
-               QUnit.expect( 4 );
-
-               var api = new mw.Api();
-
-               // Ensure we don't mistake a single item array for a single item and vice versa.
-               // The query parameter in request is the same either way (separated by pipe).
-               api.watch( 'Foo' ).done( function ( item ) {
-                       assert.equal( item.title, 'Foo' );
-               } );
-
-               api.watch( [ 'Foo' ] ).done( function ( items ) {
-                       assert.equal( items[ 0 ].title, 'Foo' );
+       QUnit.test( '.watch( string )', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       // Match POST requestBody
+                       if ( /action=watch.*&titles=Foo(&|$)/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "watch": [ { "title": "Foo", "watched": true, "message": "<b>Added</b>" } ] }'
+                               );
+                       }
                } );
 
-               api.watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
-                       assert.equal( items[ 0 ].title, 'Foo' );
-                       assert.equal( items[ 1 ].title, 'Bar' );
+               return new mw.Api().watch( 'Foo' ).done( function ( item ) {
+                       assert.equal( item.title, 'Foo' );
                } );
+       } );
 
-               // Requests are POST, match requestBody instead of url
+       // Ensure we don't mistake a single item array for a single item and vice versa.
+       // The query parameter in request is the same either way (separated by pipe).
+       QUnit.test( '.watch( Array ) - single', function ( assert ) {
                this.server.respond( function ( req ) {
+                       // Match POST requestBody
                        if ( /action=watch.*&titles=Foo(&|$)/.test( req.requestBody ) ) {
                                req.respond( 200, { 'Content-Type': 'application/json' },
                                        '{ "watch": [ { "title": "Foo", "watched": true, "message": "<b>Added</b>" } ] }'
                                );
                        }
+               } );
+
+               return new mw.Api().watch( [ 'Foo' ] ).done( function ( items ) {
+                       assert.equal( items[ 0 ].title, 'Foo' );
+               } );
+       } );
 
+       QUnit.test( '.watch( Array ) - multi', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       // Match POST requestBody
                        if ( /action=watch.*&titles=Foo%7CBar/.test( req.requestBody ) ) {
                                req.respond( 200, { 'Content-Type': 'application/json' },
                                        '{ "watch": [ ' +
                                );
                        }
                } );
+
+               return new mw.Api().watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
+                       assert.equal( items[ 0 ].title, 'Foo' );
+                       assert.equal( items[ 1 ].title, 'Bar' );
+               } );
        } );
+
 }( mediaWiki ) );
diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
new file mode 100644 (file)
index 0000000..3a940d0
--- /dev/null
@@ -0,0 +1,1272 @@
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.rcfilters - FiltersViewModel' );
+
+       QUnit.test( 'Setting up filters', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'group1filter1',
+                                                       label: 'Group 1: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'group1filter2',
+                                                       label: 'Group 1: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'group2filter1',
+                                                       label: 'Group 2: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'group2filter2',
+                                                       label: 'Group 2: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 2'
+                                               }
+                                       ]
+                               },
+                               group3: {
+                                       title: 'Group 3',
+                                       type: 'string_options',
+                                       filters: [
+                                               {
+                                                       name: 'group3filter1',
+                                                       label: 'Group 3: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 3'
+                                               },
+                                               {
+                                                       name: 'group3filter2',
+                                                       label: 'Group 3: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 3'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.ok(
+                       model.getItemByName( 'group1filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group1filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3filter2' ) instanceof mw.rcfilters.dm.FilterItem,
+                       'Filters instantiated and stored correctly'
+               );
+
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       {
+                               group1filter1: false,
+                               group1filter2: false,
+                               group2filter1: false,
+                               group2filter2: false,
+                               group3filter1: false,
+                               group3filter2: false
+                       },
+                       'Initial state of filters'
+               );
+
+               model.updateFilters( {
+                       group1filter1: true,
+                       group2filter2: true,
+                       group3filter1: true
+               } );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       {
+                               group1filter1: true,
+                               group1filter2: false,
+                               group2filter1: false,
+                               group2filter2: true,
+                               group3filter1: true,
+                               group3filter2: false
+                       },
+                       'Updating filter states correctly'
+               );
+       } );
+
+       QUnit.test( 'Finding matching filters', function ( assert ) {
+               var matches,
+                       definition = {
+                               group1: {
+                                       title: 'Group 1 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'
+                                               }
+                                       ]
+                               }
+                       },
+                       testCases = [
+                               {
+                                       query: 'group',
+                                       expectedMatches: {
+                                               group1: [ 'group1filter1', 'group1filter2' ],
+                                               group2: [ 'group2filter1' ]
+                                       },
+                                       reason: 'Finds filters starting with the query string'
+                               },
+                               {
+                                       query: 'filter 2 in group',
+                                       expectedMatches: {
+                                               group1: [ 'group1filter2' ],
+                                               group2: [ 'group2filter2' ]
+                                       },
+                                       reason: 'Finds filters containing the query string in their description'
+                               },
+                               {
+                                       query: 'title',
+                                       expectedMatches: {
+                                               group1: [ 'group1filter1', 'group1filter2' ],
+                                               group2: [ 'group2filter1', 'group2filter2' ]
+                                       },
+                                       reason: 'Finds filters containing the query string in their group title'
+                               }
+                       ],
+                       model = new mw.rcfilters.dm.FiltersViewModel(),
+                       extractNames = function ( matches ) {
+                               var result = {};
+                               Object.keys( matches ).forEach( function ( groupName ) {
+                                       result[ groupName ] = matches[ groupName ].map( function ( item ) {
+                                               return item.getName();
+                                       } );
+                               } );
+                               return result;
+                       };
+
+               model.initializeFilters( definition );
+
+               testCases.forEach( function ( testCase ) {
+                       matches = model.findMatches( testCase.query );
+                       assert.deepEqual(
+                               extractNames( matches ),
+                               testCase.expectedMatches,
+                               testCase.reason
+                       );
+               } );
+
+               matches = model.findMatches( 'foo' );
+               assert.ok(
+                       $.isEmptyObject( matches ),
+                       'findMatches returns an empty object when no results found'
+               );
+       } );
+
+       QUnit.test( 'getParametersFromFilters', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter1',
+                                                       label: 'Group 1: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'hidefilter2',
+                                                       label: 'Group 1: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'hidefilter3',
+                                                       label: 'Group 1: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 1'
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter4',
+                                                       label: 'Group 2: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'hidefilter5',
+                                                       label: 'Group 2: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 2'
+                                               },
+                                               {
+                                                       name: 'hidefilter6',
+                                                       label: 'Group 2: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 2'
+                                               }
+                                       ]
+                               },
+                               group3: {
+                                       title: 'Group 3',
+                                       type: 'string_options',
+                                       separator: ',',
+                                       filters: [
+                                               {
+                                                       name: 'filter7',
+                                                       label: 'Group 3: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 3'
+                                               },
+                                               {
+                                                       name: 'filter8',
+                                                       label: 'Group 3: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 3'
+                                               },
+                                               {
+                                                       name: 'filter9',
+                                                       label: 'Group 3: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 3'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               // Starting with all filters unselected
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'Unselected filters return all parameters falsey or \'all\'.'
+               );
+
+               // Select 1 filter
+               model.updateFilters( {
+                       hidefilter1: true,
+                       hidefilter2: false,
+                       hidefilter3: false,
+                       hidefilter4: false,
+                       hidefilter5: false,
+                       hidefilter6: false
+               } );
+               // Only one filter in one group
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (one selected, the others are true)
+                               hidefilter1: 0,
+                               hidefilter2: 1,
+                               hidefilter3: 1,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'One filters in one "send_unselected_if_any" group returns the other parameters truthy.'
+               );
+
+               // Select 2 filters
+               model.updateFilters( {
+                       hidefilter1: true,
+                       hidefilter2: true,
+                       hidefilter3: false,
+                       hidefilter4: false,
+                       hidefilter5: false,
+                       hidefilter6: false
+               } );
+               // Two selected filters in one group
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (two selected, the others are true)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 1,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'One filters in one "send_unselected_if_any" group returns the other parameters truthy.'
+               );
+
+               // Select 3 filters
+               model.updateFilters( {
+                       hidefilter1: true,
+                       hidefilter2: true,
+                       hidefilter3: true,
+                       hidefilter4: false,
+                       hidefilter5: false,
+                       hidefilter6: false
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all false)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'All filters selected in one "send_unselected_if_any" group returns all parameters falsy.'
+               );
+
+               // Select 1 filter from string_options
+               model.updateFilters( {
+                       filter7: true,
+                       filter8: false,
+                       filter9: false
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'filter7'
+                       },
+                       'One filter selected in "string_option" group returns that filter in the value.'
+               );
+
+               // Select 2 filters from string_options
+               model.updateFilters( {
+                       filter7: true,
+                       filter8: true,
+                       filter9: false
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'filter7,filter8'
+                       },
+                       'Two filters selected in "string_option" group returns those filters in the value.'
+               );
+
+               // Select 3 filters from string_options
+               model.updateFilters( {
+                       filter7: true,
+                       filter8: true,
+                       filter9: true
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'All filters selected in "string_option" group returns \'all\'.'
+               );
+
+       } );
+
+       QUnit.test( 'getFiltersFromParameters', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter1',
+                                                       label: 'Show filter 1',
+                                                       description: 'Description of Filter 1 in Group 1',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'hidefilter2',
+                                                       label: 'Show filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'hidefilter3',
+                                                       label: 'Show filter 3',
+                                                       description: 'Description of Filter 3 in Group 1',
+                                                       default: true
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter4',
+                                                       label: 'Show filter 4',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'hidefilter5',
+                                                       label: 'Show filter 5',
+                                                       description: 'Description of Filter 2 in Group 2',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'hidefilter6',
+                                                       label: 'Show filter 6',
+                                                       description: 'Description of Filter 3 in Group 2'
+                                               }
+                                       ]
+                               },
+                               group3: {
+                                       title: 'Group 3',
+                                       type: 'string_options',
+                                       separator: ',',
+                                       filters: [
+                                               {
+                                                       name: 'filter7',
+                                                       label: 'Group 3: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 3'
+                                               },
+                                               {
+                                                       name: 'filter8',
+                                                       label: 'Group 3: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 3',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'filter9',
+                                                       label: 'Group 3: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 3'
+                                               }
+                                       ]
+                               }
+                       },
+                       defaultFilterRepresentation = {
+                               // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters
+                               hidefilter1: false,
+                               hidefilter2: true,
+                               hidefilter3: false,
+                               hidefilter4: true,
+                               hidefilter5: false,
+                               hidefilter6: true,
+                               // Group 3, "string_options", default values correspond to parameters and filters
+                               filter7: false,
+                               filter8: true,
+                               filter9: false
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               // Empty query = only default values
+               assert.deepEqual(
+                       model.getFiltersFromParameters( {} ),
+                       defaultFilterRepresentation,
+                       'Empty parameter query results in filters in initial default state'
+               );
+
+               assert.deepEqual(
+                       model.getFiltersFromParameters( {
+                               hidefilter2: '1'
+                       } ),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               hidefilter1: false, // The text is "show filter 1"
+                               hidefilter2: false, // The text is "show filter 2"
+                               hidefilter3: false // The text is "show filter 3"
+                       } ),
+                       'One truthy parameter in a group whose other parameters are true by default makes the rest of the filters in the group false (unchecked)'
+               );
+
+               assert.deepEqual(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '1',
+                               hidefilter2: '1',
+                               hidefilter3: '1'
+                       } ),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               hidefilter1: false, // The text is "show filter 1"
+                               hidefilter2: false, // The text is "show filter 2"
+                               hidefilter3: false // The text is "show filter 3"
+                       } ),
+                       'All paremeters in the same \'send_unselected_if_any\' group false is equivalent to none are truthy (checked) in the interface'
+               );
+
+               // The ones above don't update the model, so we have a clean state.
+               // getFiltersFromParameters is stateless; any change is unaffected by the current state
+               // This test is demonstrating wrong usage of the method;
+               // We should be aware that getFiltersFromParameters is stateless,
+               // so each call gives us a filter state that only reflects the query given.
+               // This means that the two calls to updateFilters() below collide.
+               // The result of the first is overridden by the result of the second,
+               // since both get a full state object from getFiltersFromParameters that **only** relates
+               // to the input it receives.
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '1'
+                       } )
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter6: '1'
+                       } )
+               );
+
+               // The result here is ignoring the first updateFilters call
+               // We should receive default values + hidefilter6 as false
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               hidefilter5: false,
+                               hidefilter6: false
+                       } ),
+                       'getFiltersFromParameters does not care about previous or existing state.'
+               );
+
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '0'
+                       } )
+               );
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '1'
+                       } )
+               );
+
+               // Simulates minor edits being hidden in preferences, then unhidden via URL
+               // override.
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       defaultFilterRepresentation,
+                       'After checking and then unchecking a \'send_unselected_if_any\' filter (without touching other filters in that group), results are default'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: true,
+                               filter8: false,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing 1 value, results in the corresponding filter as checked'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,filter8'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: true,
+                               filter8: true,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing 2 values, results in both corresponding filters as checked'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,filter8,filter9'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: false,
+                               filter8: false,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing all values, results in all filters of the group as unchecked.'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,all,filter9'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: false,
+                               filter8: false,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as unchecked.'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,foo,filter9'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: true,
+                               filter8: false,
+                               filter9: true
+                       } ),
+                       'A \'string_options\' parameter containing an invalid value, results in the invalid value ignored and the valid corresponding filters checked.'
+               );
+       } );
+
+       QUnit.test( 'sanitizeStringOptionGroup', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'string_options',
+                                       filters: [
+                                               {
+                                                       name: 'filter1',
+                                                       label: 'Show filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'filter2',
+                                                       label: 'Show filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'filter3',
+                                                       label: 'Show filter 3',
+                                                       description: 'Description of Filter 3 in Group 1'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.deepEqual(
+                       model.sanitizeStringOptionGroup( 'group1', [ 'filter1', 'filter1', 'filter2' ] ),
+                       [ 'filter1', 'filter2' ],
+                       'Remove duplicate values'
+               );
+
+               assert.deepEqual(
+                       model.sanitizeStringOptionGroup( 'group1', [ 'filter1', 'foo', 'filter2' ] ),
+                       [ 'filter1', 'filter2' ],
+                       'Remove invalid values'
+               );
+
+               assert.deepEqual(
+                       model.sanitizeStringOptionGroup( 'group1', [ 'filter1', 'all', 'filter2' ] ),
+                       [ 'all' ],
+                       'If any value is "all", the only value is "all".'
+               );
+       } );
+
+       QUnit.test( 'setFiltersToDefaults', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       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'
+                                               }
+                                       ]
+                               }
+                       },
+                       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 }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+               // Select a filter that has subset with another filter
+               model.updateFilters( {
+                       filter1: true
+               } );
+
+               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true },
+                               filter2: { included: true },
+                               filter5: { 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.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true },
+                               filter2: { included: true },
+                               filter3: { included: true },
+                               filter4: { selected: true },
+                               filter5: { included: true }
+                       } ),
+                       'Filters that have multiple subsets are represented.'
+               );
+
+               // Remove one filter (but leave the other) that affects filter2
+               model.updateFilters( {
+                       filter1: false
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               filter2: { included: false },
+                               filter3: { included: true },
+                               filter4: { selected: true },
+                               filter5: { included: true }
+                       } ),
+                       'Removing a filter only un-includes its subset if there is no other filter affecting.'
+               );
+
+               model.updateFilters( {
+                       filter4: false
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+               assert.deepEqual(
+                       model.getFullState(),
+                       baseFullState,
+                       'Removing all supersets also un-includes the subsets.'
+               );
+       } );
+
+       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' }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel(),
+                       isCapsuleItemMuted = function ( filterName ) {
+                               var itemModel = model.getItemByName( filterName ),
+                                       groupModel = itemModel.getGroupModel();
+
+                               // This is the logic inside the capsule widget
+                               return (
+                                       // The capsule item widget only appears if the item is selected
+                                       itemModel.isSelected() &&
+                                       // Muted state is only valid if group is full coverage and all items are selected
+                                       groupModel.isFullCoverage() && groupModel.areAllSelected()
+                               );
+                       },
+                       getCurrentItemsMutedState = function () {
+                               return {
+                                       filter1: isCapsuleItemMuted( 'filter1' ),
+                                       filter2: isCapsuleItemMuted( 'filter2' ),
+                                       filter3: isCapsuleItemMuted( 'filter3' ),
+                                       filter4: isCapsuleItemMuted( 'filter4' ),
+                                       filter5: isCapsuleItemMuted( 'filter5' ),
+                                       filter6: isCapsuleItemMuted( 'filter6' )
+                               };
+                       },
+                       baseMuteState = {
+                               filter1: false,
+                               filter2: false,
+                               filter3: false,
+                               filter4: false,
+                               filter5: false,
+                               filter6: false
+                       };
+
+               model.initializeFilters( definition );
+
+               // Starting state, no selection, all items are non-muted
+               assert.deepEqual(
+                       getCurrentItemsMutedState(),
+                       baseMuteState,
+                       'No selection - all items are non-muted'
+               );
+
+               // Select most (but not all) items in each group
+               model.updateFilters( {
+                       filter1: true,
+                       filter2: true,
+                       filter4: true,
+                       filter5: true
+               } );
+
+               // Both groups have multiple (but not all) items selected, all items are non-muted
+               assert.deepEqual(
+                       getCurrentItemsMutedState(),
+                       baseMuteState,
+                       'Not all items in the group selected - all items are non-muted'
+               );
+
+               // Select all items in 'fullCoverage' group (group2)
+               model.updateFilters( {
+                       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
+                       } ),
+                       '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
+               } );
+
+               // 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
+                       } ),
+                       '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
+               } );
+               assert.deepEqual(
+                       getCurrentItemsMutedState(),
+                       baseMuteState,
+                       'Not all items in the group are checked - all items are non-muted regardless of group coverage'
+               );
+       } );
+
+       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'
+                                               }
+                                       ]
+                               }
+                       },
+                       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 }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       baseFullState,
+                       'Initial state: no conflicts because no selections.'
+               );
+
+               // Select a filter that has a conflict with another
+               model.updateFilters( {
+                       filter1: true // conflicts: filter2, filter4
+               } );
+
+               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true },
+                               filter2: { conflicted: true },
+                               filter4: { conflicted: true }
+                       } ),
+                       'Selecting a filter set its conflicts list as "conflicted".'
+               );
+
+               // Select one of the conflicts (both filters are now conflicted and selected)
+               model.updateFilters( {
+                       filter4: true // conflicts: filter 1
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true, conflicted: true },
+                               filter2: { conflicted: true },
+                               filter4: { selected: true, conflicted: true }
+                       } ),
+                       'Selecting a conflicting filter sets both sides to conflicted and selected.'
+               );
+
+               // Select another filter from filter4 group, meaning:
+               // now filter1 no longer conflicts with filter4
+               model.updateFilters( {
+                       filter6: true // conflicts: filter2
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter6' ) );
+
+               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 }
+                       } ),
+                       'Selecting a non-conflicting filter from a conflicting group 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' }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.ok(
+                       !model.isHighlightEnabled(),
+                       'Initially, highlight is disabled.'
+               );
+
+               model.toggleHighlight( true );
+               assert.ok(
+                       model.isHighlightEnabled(),
+                       'Highlight is enabled on toggle.'
+               );
+
+               model.setHighlightColor( 'filter1', 'color1' );
+               model.setHighlightColor( 'filter2', 'color2' );
+
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter1',
+                               'filter2'
+                       ],
+                       'Highlighted items are highlighted.'
+               );
+
+               assert.equal(
+                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       'color1',
+                       'Item highlight color is set.'
+               );
+
+               model.setHighlightColor( 'filter1', 'color1changed' );
+               assert.equal(
+                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       'color1changed',
+                       'Item highlight color is changed on setHighlightColor.'
+               );
+
+               model.clearHighlightColor( 'filter1' );
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter2'
+                       ],
+                       'Clear highlight from an item results in the item no longer being highlighted.'
+               );
+
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               model.setHighlightColor( 'filter1', 'color1' );
+               model.setHighlightColor( 'filter2', 'color2' );
+               model.setHighlightColor( 'filter3', 'color3' );
+
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter1',
+                               'filter2',
+                               'filter3'
+                       ],
+                       'Even if highlights are not enabled, the items remember their highlight state'
+                       // NOTE: When actually displaying the highlights, the UI checks whether
+                       // highlighting is generally active and then goes over the highlighted
+                       // items. The item models, however, and the view model in general, still
+                       // retains the knowledge about which filters have different colors, so we
+                       // can seamlessly return to the colors the user previously chose if they
+                       // reapply highlights.
+               );
+
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               model.setHighlightColor( 'filter1', 'color1' );
+               model.setHighlightColor( 'filter6', 'color6' );
+
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter1'
+                       ],
+                       'Items without a specified class identifier are not highlighted.'
+               );
+       } );
+}( mediaWiki, jQuery ) );
index edc2716..35b6b71 100644 (file)
@@ -3,7 +3,7 @@
 
        // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
-       QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
+       QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
                var selectHtml, $env, $options,
                        rc = require( 'mediawiki.special.recentchanges' );
 
index 2388497..97c82fb 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.RegExp' );
 
-       QUnit.test( 'escape', 16, function ( assert ) {
+       QUnit.test( 'escape', function ( assert ) {
                var specials, normal;
 
                specials = [
index 910bcc1..1bc4c06 100644 (file)
@@ -1,79 +1,80 @@
 ( function ( mw, $ ) {
+       /* eslint-disable camelcase */
        var repeat = function ( input, multiplier ) {
-               return new Array( multiplier + 1 ).join( input );
-       },
-       cases = {
+                       return new Array( multiplier + 1 ).join( input );
+               },
                // See also TitleTest.php#testSecureAndSplit
-               valid: [
-                       'Sandbox',
-                       'A "B"',
-                       'A \'B\'',
-                       '.com',
-                       '~',
-                       '"',
-                       '\'',
-                       'Talk:Sandbox',
-                       'Talk:Foo:Sandbox',
-                       'File:Example.svg',
-                       'File_talk:Example.svg',
-                       'Foo/.../Sandbox',
-                       'Sandbox/...',
-                       'A~~',
-                       ':A',
-                       // Length is 256 total, but only title part matters
-                       'Category:' + repeat( 'x', 248 ),
-                       repeat( 'x', 252 )
-               ],
-               invalid: [
-                       '',
-                       ':',
-                       '__  __',
-                       '  __  ',
-                       // Bad characters forbidden regardless of wgLegalTitleChars
-                       'A [ B',
-                       'A ] B',
-                       'A { B',
-                       'A } B',
-                       'A < B',
-                       'A > B',
-                       'A | B',
-                       'A \t B',
-                       'A \n B',
-                       // URL encoding
-                       'A%20B',
-                       'A%23B',
-                       'A%2523B',
-                       // XML/HTML character entity references
-                       // Note: The ones with # are commented out as those are interpreted as fragment and
-                       // as such end up being valid.
-                       'A &eacute; B',
-                       // 'A &#233; B',
-                       // 'A &#x00E9; B',
-                       // Subject of NS_TALK does not roundtrip to NS_MAIN
-                       'Talk:File:Example.svg',
-                       // Directory navigation
-                       '.',
-                       '..',
-                       './Sandbox',
-                       '../Sandbox',
-                       'Foo/./Sandbox',
-                       'Foo/../Sandbox',
-                       'Sandbox/.',
-                       'Sandbox/..',
-                       // Tilde
-                       'A ~~~ Name',
-                       'A ~~~~ Signature',
-                       'A ~~~~~ Timestamp',
-                       repeat( 'x', 256 ),
-                       // Extension separation is a js invention, for length
-                       // purposes it is part of the title
-                       repeat( 'x', 252 ) + '.json',
-                       // Namespace prefix without actual title
-                       'Talk:',
-                       'Category: ',
-                       'Category: #bar'
-               ]
-       };
+               cases = {
+                       valid: [
+                               'Sandbox',
+                               'A "B"',
+                               'A \'B\'',
+                               '.com',
+                               '~',
+                               '"',
+                               '\'',
+                               'Talk:Sandbox',
+                               'Talk:Foo:Sandbox',
+                               'File:Example.svg',
+                               'File_talk:Example.svg',
+                               'Foo/.../Sandbox',
+                               'Sandbox/...',
+                               'A~~',
+                               ':A',
+                               // Length is 256 total, but only title part matters
+                               'Category:' + repeat( 'x', 248 ),
+                               repeat( 'x', 252 )
+                       ],
+                       invalid: [
+                               '',
+                               ':',
+                               '__  __',
+                               '  __  ',
+                               // Bad characters forbidden regardless of wgLegalTitleChars
+                               'A [ B',
+                               'A ] B',
+                               'A { B',
+                               'A } B',
+                               'A < B',
+                               'A > B',
+                               'A | B',
+                               'A \t B',
+                               'A \n B',
+                               // URL encoding
+                               'A%20B',
+                               'A%23B',
+                               'A%2523B',
+                               // XML/HTML character entity references
+                               // Note: The ones with # are commented out as those are interpreted as fragment and
+                               // as such end up being valid.
+                               'A &eacute; B',
+                               // 'A &#233; B',
+                               // 'A &#x00E9; B',
+                               // Subject of NS_TALK does not roundtrip to NS_MAIN
+                               'Talk:File:Example.svg',
+                               // Directory navigation
+                               '.',
+                               '..',
+                               './Sandbox',
+                               '../Sandbox',
+                               'Foo/./Sandbox',
+                               'Foo/../Sandbox',
+                               'Sandbox/.',
+                               'Sandbox/..',
+                               // Tilde
+                               'A ~~~ Name',
+                               'A ~~~~ Signature',
+                               'A ~~~~~ Timestamp',
+                               repeat( 'x', 256 ),
+                               // Extension separation is a js invention, for length
+                               // purposes it is part of the title
+                               repeat( 'x', 252 ) + '.json',
+                               // Namespace prefix without actual title
+                               'Talk:',
+                               'Category: ',
+                               'Category: #bar'
+                       ]
+               };
 
        QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( {
                // mw.Title relies on these three config vars
                                // testing custom / localized namespace
                                100: 'Penguins'
                        },
-                       // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
                        wgNamespaceIds: {
                                media: -2,
                                special: -1,
                                penguins: 100,
                                antarctic_waterfowl: 100
                        },
-                       // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
                        wgCaseSensitiveNamespaces: []
                }
        } ) );
 
-       QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
+       QUnit.test( 'constructor', function ( assert ) {
                var i, title;
                for ( i = 0; i < cases.valid.length; i++ ) {
                        title = new mw.Title( cases.valid[ i ] );
                }
                for ( i = 0; i < cases.invalid.length; i++ ) {
-                       /*jshint loopfunc:true */
                        title = cases.invalid[ i ];
+                       // eslint-disable-next-line no-loop-func
                        assert.throws( function () {
                                return new mw.Title( title );
                        }, cases.invalid[ i ] );
                }
        } );
 
-       QUnit.test( 'newFromText', cases.valid.length + cases.invalid.length, function ( assert ) {
+       QUnit.test( 'newFromText', function ( assert ) {
                var i;
                for ( i = 0; i < cases.valid.length; i++ ) {
                        assert.equal(
                }
        } );
 
-       QUnit.test( 'makeTitle', 6, function ( assert ) {
+       QUnit.test( 'makeTitle', function ( assert ) {
                var cases, i, title, expected,
                        NS_MAIN = 0,
                        NS_TALK = 1,
                }
        } );
 
-       QUnit.test( 'Basic parsing', 21, function ( assert ) {
+       QUnit.test( 'Basic parsing', function ( assert ) {
                var title;
                title = new mw.Title( 'File:Foo_bar.JPG' );
 
                assert.equal( title.getPrefixedText(), '.foo' );
        } );
 
-       QUnit.test( 'Transformation', 12, function ( assert ) {
+       QUnit.test( 'Transformation', function ( assert ) {
                var title;
 
                title = new mw.Title( 'File:quux pif.jpg' );
                assert.equal( title.getFragment(), ' foo bar baz', 'Fragment' );
        } );
 
-       QUnit.test( 'Namespace detection and conversion', 10, function ( assert ) {
+       QUnit.test( 'Namespace detection and conversion', function ( assert ) {
                var title;
 
                title = new mw.Title( 'File:User:Example' );
                assert.equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
        } );
 
-       QUnit.test( 'Throw error on invalid title', 1, function ( assert ) {
+       QUnit.test( 'Throw error on invalid title', function ( assert ) {
                assert.throws( function () {
                        return new mw.Title( '' );
                }, 'Throw error on empty string' );
        } );
 
-       QUnit.test( 'Case-sensivity', 3, function ( assert ) {
+       QUnit.test( 'Case-sensivity', function ( assert ) {
                var title;
 
                // Default config
                title = new mw.Title( 'article' );
                assert.equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
 
+               title = new mw.Title( 'ß' );
+               assert.equal( title.toString(), 'ß', 'Uppercasing matches PHP behaviour (ß -> ß, not SS)' );
+
+               title = new mw.Title( 'dž (digraph)' );
+               assert.equal( title.toString(), 'Dž_(digraph)', 'Uppercasing matches PHP behaviour (dž -> Dž, not DŽ)' );
+
                // $wgCapitalLinks = false;
                mw.config.set( 'wgCaseSensitiveNamespaces', [ 0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15 ] );
 
                assert.equal( title.toString(), 'User:John', '$wgCapitalLinks=false: User namespace is insensitive, first-letter becomes uppercase' );
        } );
 
-       QUnit.test( 'toString / toText', 2, function ( assert ) {
+       QUnit.test( 'toString / toText', function ( assert ) {
                var title = new mw.Title( 'Some random page' );
 
                assert.equal( title.toString(), title.getPrefixedDb() );
                assert.equal( title.toText(), title.getPrefixedText() );
        } );
 
-       QUnit.test( 'getExtension', 7, function ( assert ) {
+       QUnit.test( 'getExtension', function ( assert ) {
                function extTest( pagename, ext, description ) {
                        var title = new mw.Title( pagename );
                        assert.equal( title.getExtension(), ext, description || pagename );
 
                extTest( 'MediaWiki:Vector.js', 'js' );
                extTest( 'User:Example/common.css', 'css' );
-               extTest( 'File:Example.longextension', 'longextension', 'Extension parsing not limited (bug 36151)' );
+               extTest( 'File:Example.longextension', 'longextension', 'Extension parsing not limited (T38151)' );
                extTest( 'Example/information.json', 'json', 'Extension parsing not restricted from any namespace' );
                extTest( 'Foo.', null, 'Trailing dot is not an extension' );
                extTest( 'Foo..', null, 'Trailing dots are not an extension' );
                // extTest( '.NET', null, 'Leading dot is (or is not?) an extension' );
        } );
 
-       QUnit.test( 'exists', 3, function ( assert ) {
+       QUnit.test( 'exists', function ( assert ) {
                var title;
 
                // Empty registry, checks default to null
 
        } );
 
-       QUnit.test( 'getUrl', 4, function ( assert ) {
+       QUnit.test( 'getUrl', function ( assert ) {
                var title;
                mw.config.set( {
                        wgScript: '/w/index.php',
                assert.equal( title.getUrl( { meme: true } ), '/w/index.php?title=User_talk:John_Cena&meme=true#And_His_Name_Is', 'title with fragment and query parameter' );
        } );
 
-       QUnit.test( 'newFromImg', 44, function ( assert ) {
+       QUnit.test( 'newFromImg', function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'getRelativeText', 5, function ( assert ) {
+       QUnit.test( 'getRelativeText', function ( assert ) {
                var i, thisCase, title,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'normalizeExtension', 5, function ( assert ) {
+       QUnit.test( 'normalizeExtension', function ( assert ) {
                var extension, i, thisCase, prefix,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'newFromUserInput', 12, function ( assert ) {
+       QUnit.test( 'newFromUserInput', function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'newFromFileName', 54, function ( assert ) {
+       QUnit.test( 'newFromFileName', function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
index 97185fc..e56c933 100644 (file)
@@ -11,7 +11,7 @@
        } ) );
 
        $.each( [ true, false ], function ( i, strictMode ) {
-               QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', 2, function ( assert ) {
+               QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', function ( assert ) {
                        var uriString, uri;
                        uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
                        uri = new mw.Uri( uriString, {
@@ -59,7 +59,7 @@
                } );
        } );
 
-       QUnit.test( 'Constructor( String[, Object ] )', 11, function ( assert ) {
+       QUnit.test( 'Constructor( String[, Object ] )', function ( assert ) {
                var uri;
 
                uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                } );
                assert.equal( uri.toString(), 'http://example.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
 
-               /*jshint -W001 */
                uri = new mw.Uri( 'http://example.com/index.php?key=key&hasOwnProperty=hasOwnProperty&constructor=constructor&watch=watch' );
                assert.deepEqual(
                        uri.query,
                        },
                        'Keys in query strings support names of Object prototypes (bug T114344)'
                );
-               /*jshint +W001 */
        } );
 
-       QUnit.test( 'Constructor( Object )', 3, function ( assert ) {
+       QUnit.test( 'Constructor( Object )', function ( assert ) {
                var uri = new mw.Uri( {
                        protocol: 'http',
                        host: 'www.foo.local',
                );
        } );
 
-       QUnit.test( 'Constructor( empty )', 4, function ( assert ) {
+       QUnit.test( 'Constructor( empty[, Object ] )', function ( assert ) {
                var testuri, MyUri, uri;
 
-               testuri = 'http://example.org/w/index.php';
+               testuri = 'http://example.org/w/index.php?a=1&a=2';
                MyUri = mw.UriRelative( testuri );
 
                uri = new MyUri();
 
                uri = new MyUri( '' );
                assert.equal( uri.toString(), testuri, 'empty string' );
+
+               uri = new MyUri( null, { overrideKeys: true } );
+               assert.deepEqual( uri.query, { a: '2' }, 'null, with options' );
        } );
 
-       QUnit.test( 'Properties', 8, function ( assert ) {
+       QUnit.test( 'Properties', function ( assert ) {
                var uriBase, uri;
 
                uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
                assert.ok( uri.toString().indexOf( 'pif=paf' ) >= 0, 'extend query arguments' );
        } );
 
-       QUnit.test( '.getQueryString()', 2, function ( assert ) {
+       QUnit.test( '.getQueryString()', function ( assert ) {
                var uri = new mw.Uri( 'http://search.example.com/?q=uri' );
 
                assert.deepEqual(
 
        } );
 
-       QUnit.test( '.clone()', 6, function ( assert ) {
+       QUnit.test( '.clone()', function ( assert ) {
                var original, clone;
 
                original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
                assert.deepEqual(
                        original.query,
                        { one: '1', two: '2' },
-                       'Properties is deep cloned (bug 37708)'
+                       'Properties is deep cloned (T39708)'
                );
        } );
 
-       QUnit.test( '.toString() after query manipulation', 8, function ( assert ) {
+       QUnit.test( '.toString() after query manipulation', function ( assert ) {
                var uri;
 
                uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                assert.equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
        } );
 
-       QUnit.test( 'Variable defaultUri', 2, function ( assert ) {
+       QUnit.test( 'Variable defaultUri', function ( assert ) {
                var uri,
                        href = 'http://example.org/w/index.php#here',
                        UriClass = mw.UriRelative( function () {
                );
        } );
 
-       QUnit.test( 'Advanced URL', 11, function ( assert ) {
+       QUnit.test( 'Advanced URL', function ( assert ) {
                var uri, queryString, relativePath;
 
                uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
                assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragment in relative path' );
        } );
 
-       QUnit.test( 'Parse a uri with an @ symbol in the path and query', 1, function ( assert ) {
+       QUnit.test( 'Parse a uri with an @ symbol in the path and query', function ( assert ) {
                var uri = new mw.Uri( 'http://www.example.com/test@test?x=@uri&y@=uri&z@=@' );
 
                assert.deepEqual(
                );
        } );
 
-       QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
+       QUnit.test( 'Handle protocol-relative URLs', function ( assert ) {
                var UriRel, uri;
 
                UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
                assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
        } );
 
-       QUnit.test( 'bug 35658', 2, function ( assert ) {
+       QUnit.test( 'T37658', function ( assert ) {
                var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
 
                testProtocol = 'https://';
index 399db91..4170897 100644 (file)
@@ -1,6 +1,4 @@
 ( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
-
        var pluralTestcases = {
                /*
                 * Sample:
                ]
        };
 
+       QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
+
        function pluralTest( langCode, tests ) {
-               QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
-                       for ( var i = 0; i < tests.length; i++ ) {
+               QUnit.test( 'Plural Test for ' + langCode, function ( assert ) {
+                       var i;
+                       for ( i = 0; i < tests.length; i++ ) {
                                assert.equal(
                                        mw.language.convertPlural( tests[ i ][ 0 ], tests[ i ][ 1 ] ),
                                        tests[ i ][ 2 ],
index 7a13f0f..59bf737 100644 (file)
@@ -20,7 +20,7 @@
                }
        } ) );
 
-       QUnit.test( 'set( key, value )', 7, function ( assert ) {
+       QUnit.test( 'set( key, value )', function ( assert ) {
                var call;
 
                // Simple case
@@ -53,7 +53,7 @@
                assert.strictEqual( call[ 1 ], '0', '0 is value' );
        } );
 
-       QUnit.test( 'set( key, value, expires )', 6, function ( assert ) {
+       QUnit.test( 'set( key, value, expires )', function ( assert ) {
                var date, options;
 
                date = new Date();
@@ -91,7 +91,7 @@
                assert.strictEqual( options.expires, date, 'custom expiration (with wgCookieExpiration=0)' );
        } );
 
-       QUnit.test( 'set( key, value, options )', 4, function ( assert ) {
+       QUnit.test( 'set( key, value, options )', function ( assert ) {
                var date, call;
 
                mw.cookie.set( 'foo', 'bar', {
                }, 'Options (incl. expires)' );
        } );
 
-       QUnit.test( 'get( key ) - no values', 6, function ( assert ) {
+       QUnit.test( 'get( key ) - no values', function ( assert ) {
                var key, value;
 
                mw.cookie.get( 'foo' );
                assert.strictEqual( value, 'bar', 'Custom default value' );
        } );
 
-       QUnit.test( 'get( key ) - with value', 1, function ( assert ) {
+       QUnit.test( 'get( key ) - with value', function ( assert ) {
                var value;
 
                $.cookie.returns( 'bar' );
                assert.strictEqual( value, 'bar', 'Return value of cookie' );
        } );
 
-       QUnit.test( 'get( key, prefix )', 1, function ( assert ) {
+       QUnit.test( 'get( key, prefix )', function ( assert ) {
                var key;
 
                mw.cookie.get( 'foo', 'bar' );
index 587c893..46d7837 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $, mw ) {
        QUnit.module( 'mediawiki.errorLogger', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'installGlobalHandler', 7, function ( assert ) {
+       QUnit.test( 'installGlobalHandler', function ( assert ) {
                var w = {},
                        errorMessage = 'Foo',
                        errorUrl = 'http://example.com',
@@ -24,7 +24,7 @@
                w.onerror( errorMessage, errorUrl, errorLine, errorColumn, errorObject );
                sinon.assert.calledWithExactly( mw.track, 'global.error',
                        sinon.match( { errorMessage: errorMessage, url: errorUrl, lineNumber: errorLine,
-                       columnNumber: errorColumn, errorObject: errorObject } ) );
+                               columnNumber: errorColumn, errorObject: errorObject } ) );
 
                w = { onerror: oldHandler };
 
index 774b205..177c358 100644 (file)
@@ -17,7 +17,7 @@
 
        QUnit.module( 'mediawiki.experiments' );
 
-       QUnit.test( 'getBucket( experiment, token )', 4, function ( assert ) {
+       QUnit.test( 'getBucket( experiment, token )', function ( assert ) {
                var experiment = createExperiment(),
                        token = '123457890';
 
index b4028ec..16f8cf3 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.html' );
 
-       QUnit.test( 'escape', 2, function ( assert ) {
+       QUnit.test( 'escape', function ( assert ) {
                assert.throws(
                        function () {
                                mw.html.escape();
@@ -17,7 +17,7 @@
                );
        } );
 
-       QUnit.test( 'element()', 1, function ( assert ) {
+       QUnit.test( 'element()', function ( assert ) {
                assert.equal(
                        mw.html.element(),
                        '<undefined/>',
                );
        } );
 
-       QUnit.test( 'element( tagName )', 1, function ( assert ) {
+       QUnit.test( 'element( tagName )', function ( assert ) {
                assert.equal( mw.html.element( 'div' ), '<div/>', 'DIV' );
        } );
 
-       QUnit.test( 'element( tagName, attrs )', 2, function ( assert ) {
+       QUnit.test( 'element( tagName, attrs )', function ( assert ) {
                assert.equal( mw.html.element( 'div', {} ), '<div/>', 'DIV' );
 
                assert.equal(
@@ -43,7 +43,7 @@
                );
        } );
 
-       QUnit.test( 'element( tagName, attrs, content )', 8, function ( assert ) {
+       QUnit.test( 'element( tagName, attrs, content )', function ( assert ) {
 
                assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'DIV with empty attributes and content' );
 
index 1218137..3b549bd 100644 (file)
@@ -1,4 +1,5 @@
 ( function ( mw, $ ) {
+       /* eslint-disable camelcase */
        var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
                expectedListUsersSitename, expectedLinkPagenamee, expectedEntrypoints,
                mwLanguageCache = {},
@@ -45,7 +46,6 @@
                },
                config: {
                        wgArticlePath: '/wiki/$1',
-                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
                        wgNamespaceIds: {
                                template: 10,
                                template_talk: 11,
@@ -53,7 +53,6 @@
                                szablon: 10,
                                dyskusja_szablonu: 11
                        },
-                       // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
                        wgFormattedNamespaces: {
                                // Localised
                                10: 'Szablon',
         *  that may be asynchronous. Invoke the callback parameter when done.
         */
        function process( tasks ) {
-               /*jshint latedef:false */
                function abort() {
                        tasks.splice( 0, tasks.length );
+                       // eslint-disable-next-line no-use-before-define
                        next();
                }
                function next() {
+                       var task;
                        if ( !tasks ) {
                                // This happens if after the process is completed, one of our callbacks is
                                // invoked. This can happen if a test timed out but the process was still
                                // running. In that case, ignore it. Don't invoke complete() a second time.
                                return;
                        }
-                       var task = tasks.shift();
+                       task = tasks.shift();
                        if ( task ) {
                                task( next, abort );
                        } else {
                next();
        }
 
-       QUnit.test( 'Replace', 15, function ( assert ) {
+       QUnit.test( 'Replace', function ( assert ) {
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
 
                assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
                );
        } );
 
-       QUnit.test( 'Plural', 9, function ( assert ) {
+       QUnit.test( 'Plural', function ( assert ) {
                assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
                assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
                assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
                assert.equal( formatParse( 'plural-empty-explicit-form', 2 ), 'There is me and other people.' );
        } );
 
-       QUnit.test( 'Gender', 15, function ( assert ) {
+       QUnit.test( 'Gender', function ( assert ) {
                var originalGender = mw.user.options.get( 'gender' );
 
                // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
                mw.user.options.set( 'gender', originalGender );
        } );
 
-       QUnit.test( 'Case changing', 8, function ( assert ) {
+       QUnit.test( 'Case changing', function ( assert ) {
                mw.messages.set( 'to-lowercase', '{{lc:thIS hAS MEsSed uP CapItaliZatiON}}' );
                assert.equal( formatParse( 'to-lowercase' ), 'this has messed up capitalization', 'To lowercase' );
 
                assert.equal( formatParse( 'all-caps-except-first' ), 'tHIS HAS MESSED UP CAPITALIZATION', 'To opposite sentence case' );
        } );
 
-       QUnit.test( 'Grammar', 2, function ( assert ) {
+       QUnit.test( 'Grammar', function ( assert ) {
                assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj Wiki', 'Grammar Test with sitename' );
 
                mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
                assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
        } );
 
-       QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+       QUnit.test( 'Match PHP parser', function ( assert ) {
+               var tasks;
                mw.messages.set( mw.libs.phpParserData.messages );
-               var tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
+               tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
+                       var done = assert.async();
                        return function ( next, abort ) {
-                               var done = assert.async();
                                getMwLanguage( test.lang )
                                        .then( function ( langClass ) {
+                                               var parser;
                                                mw.config.set( 'wgUserLanguage', test.lang );
-                                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                                               // eslint-disable-next-line new-cap
+                                               parser = new mw.jqueryMsg.parser( { language: langClass } );
                                                assert.equal(
                                                        parser.parse( test.key, test.args ).html(),
                                                        test.result,
                process( tasks );
        } );
 
-       QUnit.test( 'Links', 15, function ( assert ) {
+       QUnit.test( 'Links', function ( assert ) {
                var testCases,
                        expectedDisambiguationsText,
                        expectedMultipleBars,
                } );
        } );
 
-       QUnit.test( 'Replacements in links', 14, function ( assert ) {
+       QUnit.test( 'Replacements in links', function ( assert ) {
                var testCases = [
                        [
                                'extlink-param-href-full',
        } );
 
        // Tests that {{-transformation vs. general parsing are done as requested
-       QUnit.test( 'Curly brace transformation', 16, function ( assert ) {
+       QUnit.test( 'Curly brace transformation', function ( assert ) {
                var oldUserLang = mw.config.get( 'wgUserLanguage' );
 
                assertBothModes( assert, [ 'gender-msg', 'Bob', 'male' ], 'Bob: blue', 'gender is resolved' );
                mw.config.set( 'wgUserLanguage', oldUserLang );
        } );
 
-       QUnit.test( 'Int', 4, function ( assert ) {
+       QUnit.test( 'Int', function ( assert ) {
                var newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Foobar}}|foobar]] for more info). If you are here by mistake, click your browser\'s back button.',
                        expectedNewarticletext,
                        helpPageTitle = 'Help:Foobar';
                );
        } );
 
-       QUnit.test( 'Ns', 4, function ( assert ) {
+       QUnit.test( 'Ns', function ( assert ) {
                mw.messages.set( 'ns-template-talk', '{{ns:Template talk}}' );
                assert.equal(
                        formatParse( 'ns-template-talk' ),
 
        // Tests that getMessageFunction is used for non-plain messages with curly braces or
        // square brackets, but not otherwise.
-       QUnit.test( 'mw.Message.prototype.parser monkey-patch', 22, function ( assert ) {
+       QUnit.test( 'mw.Message.prototype.parser monkey-patch', function ( assert ) {
                var oldGMF, outerCalled, innerCalled;
 
                mw.messages.set( {
                },
                {
                        lang: 'hi',
-                       number: '१२३४५६,७८९',
+                       number: '१,२३,४५६',
                        result: '123456',
                        integer: true,
                        description: 'formatnum test for Hindi, Devanagari digits passed to get integer value'
                }
        ];
 
-       QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
+       QUnit.test( 'formatnum', function ( assert ) {
+               var queue;
                mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
                mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
-               var queue = $.map( formatnumTests, function ( test ) {
+               queue = $.map( formatnumTests, function ( test ) {
+                       var done = assert.async();
                        return function ( next, abort ) {
-                               var done = assert.async();
                                getMwLanguage( test.lang )
                                        .then( function ( langClass ) {
+                                               var parser;
                                                mw.config.set( 'wgUserLanguage', test.lang );
-                                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                                               // eslint-disable-next-line new-cap
+                                               parser = new mw.jqueryMsg.parser( { language: langClass } );
                                                assert.equal(
                                                        parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg',
                                                                [ test.number ] ).html(),
        } );
 
        // HTML in wikitext
-       QUnit.test( 'HTML', 33, function ( assert ) {
+       QUnit.test( 'HTML', function ( assert ) {
                mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
 
                assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
                );
        } );
 
-       QUnit.test( 'Nowiki', 3, function ( assert ) {
+       QUnit.test( 'Nowiki', function ( assert ) {
                mw.messages.set( 'jquerymsg-nowiki-link', 'Foo <nowiki>[[bar]]</nowiki> baz.' );
                assert.equal(
                        formatParse( 'jquerymsg-nowiki-link' ),
                );
        } );
 
-       QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {
+       QUnit.test( 'Behavior in case of invalid wikitext', function ( assert ) {
+               var logSpy;
                mw.messages.set( 'invalid-wikitext', '<b>{{FAIL}}</b>' );
 
                this.suppressWarnings();
-               var logSpy = this.sandbox.spy( mw.log, 'warn' );
+               logSpy = this.sandbox.spy( mw.log, 'warn' );
 
                assert.equal(
                        formatParse( 'invalid-wikitext' ),
                assert.equal( logSpy.callCount, 2, 'mw.log.warn calls' );
        } );
 
-       QUnit.test( 'Integration', 5, function ( assert ) {
+       QUnit.test( 'Integration', function ( assert ) {
                var expected, logSpy, msg;
 
                expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
index 3b5915a..b0b2e7a 100644 (file)
@@ -5,7 +5,7 @@
 ( function ( $ ) {
        QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Variable with Unicode letter in name', 3, function ( assert ) {
+       QUnit.test( 'Variable with Unicode letter in name', function ( assert ) {
                var orig, ŝablono;
 
                orig = 'some token';
        });
        */
 
-       QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function ( assert ) {
+       QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (T14130)', function ( assert ) {
                var maxn, n,
                        expected, $textarea;
 
                maxn = 4;
-               QUnit.expect( maxn * 2 );
 
                function repeat( str, n ) {
                        var out;
index e4c3851..b965079 100644 (file)
@@ -1,13 +1,15 @@
 ( function ( mw, $ ) {
        'use strict';
 
+       var grammarTests;
+
        QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.liveLangData = mw.language.data.values;
-                       mw.language.data.values = $.extend( true, {}, this.liveLangData );
+                       this.liveLangData = mw.language.data;
+                       mw.language.data = {};
                },
                teardown: function () {
-                       mw.language.data.values = this.liveLangData;
+                       mw.language.data = this.liveLangData;
                },
                messages: {
                        // mw.language.listToText test
@@ -17,7 +19,7 @@
                }
        } ) );
 
-       QUnit.test( 'mw.language getData and setData', 3, function ( assert ) {
+       QUnit.test( 'mw.language getData and setData', function ( assert ) {
                mw.language.setData( 'en', 'testkey', 'testvalue' );
                assert.equal( mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
                assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
@@ -25,7 +27,7 @@
                assert.equal( mw.language.getData( 'en-US', 'testkey' ), 'testvalue', 'Case insensitive test for mw.language' );
        } );
 
-       QUnit.test( 'mw.language.commafy test', 9, function ( assert ) {
+       QUnit.test( 'mw.language.commafy test', function ( assert ) {
                mw.language.setData( 'en', 'digitGroupingPattern', null );
                mw.language.setData( 'en', 'digitTransformTable', null );
                mw.language.setData( 'en', 'separatorTransformTable', null );
                assert.equal( mw.language.commafy( 123456789.567, '###,###,#0.00' ), '1,234,567,89.56', 'Decimal part as group of 3 and last one 2' );
        } );
 
+       QUnit.test( 'mw.language.convertNumber', function ( assert ) {
+               mw.language.setData( 'en', 'digitGroupingPattern', null );
+               mw.language.setData( 'en', 'digitTransformTable', null );
+               mw.language.setData( 'en', 'separatorTransformTable', { ',': '.', '.': ',' } );
+               mw.config.set( 'wgUserLanguage', 'en' );
+               mw.config.set( 'wgTranslateNumerals', true );
+
+               assert.equal( mw.language.convertNumber( 1800 ), '1.800', 'formatting' );
+               assert.equal( mw.language.convertNumber( '1.800', true ), '1800', 'unformatting' );
+       } );
+
+       QUnit.test( 'mw.language.convertNumber - digitTransformTable', function ( assert ) {
+               mw.config.set( 'wgUserLanguage', 'hi' );
+               mw.config.set( 'wgTranslateNumerals', true );
+               mw.language.setData( 'hi', 'digitGroupingPattern', null );
+               mw.language.setData( 'hi', 'separatorTransformTable', { ',': '.', '.': ',' } );
+
+               // Example from Hindi (MessagesHi.php)
+               mw.language.setData( 'hi', 'digitTransformTable', {
+                       0: '०',
+                       1: '१',
+                       2: '२'
+               } );
+
+               assert.equal( mw.language.convertNumber( 1200 ), '१.२००', 'format' );
+               assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform' );
+               assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain' );
+
+               mw.config.set( 'wgTranslateNumerals', false );
+
+               assert.equal( mw.language.convertNumber( 1200 ), '1.200', 'format (digit transform disabled)' );
+               assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform (when disabled)' );
+               assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain (digit transform disabled)' );
+       } );
+
        function grammarTest( langCode, test ) {
                // The test works only if the content language is opt.language
                // because it requires [lang].js to be loaded.
                QUnit.test( 'Grammar test for lang=' + langCode, function ( assert ) {
-                       QUnit.expect( test.length );
-
-                       for ( var i = 0; i < test.length; i++ ) {
+                       var i;
+                       for ( i = 0; i < test.length; i++ ) {
                                assert.equal(
                                        mw.language.convertGrammar( test[ i ].word, test[ i ].grammarForm ),
                                        test[ i ].expected,
@@ -60,7 +96,7 @@
        }
 
        // These tests run only for the current UI language.
-       var grammarTests = {
+       grammarTests = {
                bs: [
                        {
                                word: 'word',
                }
        } );
 
-       QUnit.test( 'List to text test', 4, function ( assert ) {
+       QUnit.test( 'List to text test', function ( assert ) {
                assert.equal( mw.language.listToText( [] ), '', 'Blank list' );
                assert.equal( mw.language.listToText( [ 'a' ] ), 'a', 'Single item' );
                assert.equal( mw.language.listToText( [ 'a', 'b' ] ), 'a and b', 'Two items' );
index 92d1326..6f9af76 100644 (file)
 
                function isCssImportApplied() {
                        // Trigger reflow, repaint, redraw, whatever (cross-browser)
-                       var x = $element.css( 'height' );
-                       x = el.innerHTML;
+                       $element.css( 'height' );
+                       el.innerHTML;
                        el.className = el.className;
-                       x = document.documentElement.clientHeight;
+                       document.documentElement.clientHeight;
 
                        return $element.css( prop ) === val;
                }
@@ -75,7 +75,7 @@
                );
        }
 
-       QUnit.test( 'Basic', 2, function ( assert ) {
+       QUnit.test( 'Basic', function ( assert ) {
                var isAwesomeDone;
 
                mw.loader.testCallback = function () {
@@ -94,7 +94,7 @@
                } );
        } );
 
-       QUnit.test( 'Object method as module name', 2, function ( assert ) {
+       QUnit.test( 'Object method as module name', function ( assert ) {
                var isAwesomeDone;
 
                mw.loader.testCallback = function () {
                } );
        } );
 
-       QUnit.test( '.using( .. ) Promise', 2, function ( assert ) {
+       QUnit.test( '.using( .. ) Promise', function ( assert ) {
                var isAwesomeDone;
 
                mw.loader.testCallback = function () {
                .done( function () {
                        assert.strictEqual( isAwesomeDone, true, 'test.promise module should\'ve caused isAwesomeDone to be true' );
                        delete mw.loader.testCallback;
-
                } )
                .fail( function () {
                        assert.ok( false, 'Error callback fired while loader.using "test.promise" module' );
        } );
 
        QUnit.test( '.using() Error: Circular dependency', function ( assert ) {
+               var done = assert.async();
+
                mw.loader.register( [
                        [ 'test.circle1', '0', [ 'test.circle2' ] ],
                        [ 'test.circle2', '0', [ 'test.circle3' ] ],
                        function fail( e ) {
                                assert.ok( /Circular/.test( String( e ) ), 'Detect circular dependency' );
                        }
-               );
+               )
+               .always( done );
        } );
 
        QUnit.test( '.load() - Error: Circular dependency', function ( assert ) {
        } );
 
        QUnit.test( '.using() - Error: Unregistered', function ( assert ) {
+               var done = assert.async();
+
                mw.loader.using( 'test.using.unreg' ).then(
                        function done() {
                                assert.ok( false, 'Unexpected resolution, expected error.' );
                        function fail( e ) {
                                assert.ok( /Unknown/.test( String( e ) ), 'Detect unknown dependency' );
                        }
-               );
+               ).always( done );
        } );
 
-       QUnit.test( '.load() - Error: Unregistered (ignored)', 0, function ( assert ) {
+       QUnit.test( '.load() - Error: Unregistered (ignored)', function ( assert ) {
+               assert.expect( 0 );
                mw.loader.load( 'test.using.unreg2' );
        } );
 
-       QUnit.test( '.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
+       QUnit.test( '.implement( styles={ "css": [text, ..] } )', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
                return mw.loader.using( 'test.implement.a' );
        } );
 
-       QUnit.test( '.implement( styles={ "url": { <media>: [url, ..] } } )', 7, function ( assert ) {
+       QUnit.test( '.implement( styles={ "url": { <media>: [url, ..] } } )', function ( assert ) {
                var $element1 = $( '<div class="mw-test-implement-b1"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-b2"></div>' ).appendTo( '#qunit-fixture' ),
                        $element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' ),
                                url: {
                                        print: [ urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' ) ],
                                        screen: [
-                                               // bug 40834: Make sure it actually works with more than 1 stylesheet reference
+                                               // T42834: Make sure it actually works with more than 1 stylesheet reference
                                                urlStyleTest( '.mw-test-implement-b2', 'float', 'left' ),
                                                urlStyleTest( '.mw-test-implement-b3', 'float', 'right' )
                                        ]
        } );
 
        // Backwards compatibility
-       QUnit.test( '.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
+       QUnit.test( '.implement( styles={ <media>: text } ) (back-compat)', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
        } );
 
        // Backwards compatibility
-       QUnit.test( '.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
+       QUnit.test( '.implement( styles={ <media>: [url, ..] } ) (back-compat)', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' ),
                        done = assert.async();
                        'test.implement.d',
                        function () {
                                assertStyleAsync( assert, $element, 'float', 'right', function () {
-                                       assert.notEqual( $element2.css( 'text-align' ), 'center', 'print style is not applied (bug 40500)' );
+                                       assert.notEqual( $element2.css( 'text-align' ), 'center', 'print style is not applied (T42500)' );
                                        done();
                                } );
                        },
                mw.loader.load( 'test.implement.d' );
        } );
 
-       // @import (bug 31676)
-       QUnit.test( '.implement( styles has @import )', 7, function ( assert ) {
+       // @import (T33676)
+       QUnit.test( '.implement( styles has @import )', function ( assert ) {
                var isJsExecuted, $element,
                        done = assert.async();
 
                } );
        } );
 
-       QUnit.test( '.implement( dependency with styles )', 4, function ( assert ) {
+       QUnit.test( '.implement( dependency with styles )', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-e"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-e2"></div>' ).appendTo( '#qunit-fixture' );
 
                return mw.loader.using( 'test.implement.e' );
        } );
 
-       QUnit.test( '.implement( only scripts )', 1, function ( assert ) {
+       QUnit.test( '.implement( only scripts )', function ( assert ) {
                mw.loader.implement( 'test.onlyscripts', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.onlyscripts' ), 'ready' );
        } );
 
-       QUnit.test( '.implement( only messages )', 2, function ( assert ) {
-               assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
+       QUnit.test( '.implement( only messages )', function ( assert ) {
+               assert.assertFalse( mw.messages.exists( 'T31107' ), 'Verify that the test message doesn\'t exist yet' );
 
-               // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
-               mw.loader.implement( 'test.implement.msgs', [], {}, { bug_29107: 'loaded' } );
-               // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
+               mw.loader.implement( 'test.implement.msgs', [], {}, { T31107: 'loaded' } );
 
                return mw.loader.using( 'test.implement.msgs', function () {
-                       assert.ok( mw.messages.exists( 'bug_29107' ), 'Bug 29107: messages-only module should implement ok' );
+                       assert.ok( mw.messages.exists( 'T31107' ), 'T31107: messages-only module should implement ok' );
                }, function () {
                        assert.ok( false, 'Error callback fired while implementing "test.implement.msgs" module' );
                } );
        } );
 
-       QUnit.test( '.implement( empty )', 1, function ( assert ) {
+       QUnit.test( '.implement( empty )', function ( assert ) {
                mw.loader.implement( 'test.empty' );
                assert.strictEqual( mw.loader.getState( 'test.empty' ), 'ready' );
        } );
 
-       QUnit.test( 'Broken indirect dependency', 4, function ( assert ) {
+       QUnit.test( 'Broken indirect dependency', function ( assert ) {
                // don't emit an error event
                this.sandbox.stub( mw, 'track' );
 
                assert.strictEqual( mw.track.callCount, 1 );
        } );
 
-       QUnit.test( 'Out-of-order implementation', 9, function ( assert ) {
+       QUnit.test( 'Out-of-order implementation', function ( assert ) {
                mw.loader.register( [
                        [ 'test.module4', '0' ],
                        [ 'test.module5', '0', [ 'test.module4' ] ],
                assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
        } );
 
-       QUnit.test( 'Missing dependency', 13, function ( assert ) {
+       QUnit.test( 'Missing dependency', function ( assert ) {
                mw.loader.register( [
                        [ 'test.module7', '0' ],
                        [ 'test.module8', '0', [ 'test.module7' ] ],
                );
        } );
 
-       QUnit.test( 'Dependency handling', 5, function ( assert ) {
+       QUnit.test( 'Dependency handling', function ( assert ) {
                var done = assert.async();
                mw.loader.register( [
                        // [module, version, dependencies, group, source]
                );
        } );
 
-       QUnit.test( 'Skip-function handling', 5, function ( assert ) {
+       QUnit.test( 'Skip-function handling', function ( assert ) {
                mw.loader.register( [
                        // [module, version, dependencies, group, source, skip]
                        [ 'testSkipped', '1', [], null, 'testloader', 'return true;' ],
                );
        } );
 
-       QUnit.asyncTest( '.load( "//protocol-relative" ) - T32825', 2, function ( assert ) {
+       QUnit.asyncTest( '.load( "//protocol-relative" ) - T32825', function ( assert ) {
                // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
                // Test is for regressions!
 
                mw.loader.load( target );
        } );
 
-       QUnit.asyncTest( '.load( "/absolute-path" )', 2, function ( assert ) {
+       QUnit.asyncTest( '.load( "/absolute-path" )', function ( assert ) {
                // Forge a URL to the test callback script
                var target = QUnit.fixurl(
                        mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
                } );
        } );
 
-       QUnit.test( 'Executing race - T112232', 2, function ( assert ) {
+       QUnit.test( 'Executing race - T112232', function ( assert ) {
                var done = false;
 
                // The red herring schedules its CSS buffer first. In T112232, a bug in the
                        } );
        } );
 
-       QUnit.test( 'require()', 6, function ( assert ) {
+       QUnit.test( 'require()', function ( assert ) {
                mw.loader.register( [
                        [ 'test.require1', '0' ],
                        [ 'test.require2', '0' ],
index b3c4bee..923f97d 100644 (file)
@@ -7,7 +7,7 @@
                }
        } ) );
 
-       QUnit.test( 'register', 2, function ( assert ) {
+       QUnit.test( 'register', function ( assert ) {
                var testMessagePosterConstructor = function () {};
 
                mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
index 6cef4a7..436cb2e 100644 (file)
@@ -1,36 +1,56 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.storage' );
 
-       QUnit.test( 'set/get with localStorage', 3, function ( assert ) {
-               this.sandbox.stub( mw.storage, 'localStorage', {
+       QUnit.test( 'set/get with storage support', function ( assert ) {
+               var stub = {
                        setItem: this.sandbox.spy(),
                        getItem: this.sandbox.stub()
-               } );
+               };
+               stub.getItem.withArgs( 'foo' ).returns( 'test' );
+               stub.getItem.returns( null );
+               this.sandbox.stub( mw.storage, 'store', stub );
 
                mw.storage.set( 'foo', 'test' );
-               assert.ok( mw.storage.localStorage.setItem.calledOnce );
+               assert.ok( stub.setItem.calledOnce );
 
-               mw.storage.localStorage.getItem.withArgs( 'foo' ).returns( 'test' );
-               mw.storage.localStorage.getItem.returns( null );
                assert.strictEqual( mw.storage.get( 'foo' ), 'test', 'Check value gets stored.' );
                assert.strictEqual( mw.storage.get( 'bar' ), null, 'Unset values are null.' );
        } );
 
-       QUnit.test( 'set/get without localStorage', 3, function ( assert ) {
-               this.sandbox.stub( mw.storage, 'localStorage', {
+       QUnit.test( 'set/get with storage methods disabled', function ( assert ) {
+               // This covers browsers where storage is disabled
+               // (quota full, or security/privacy settings).
+               // On most browsers, these interface will be accessible with
+               // their methods throwing.
+               var stub = {
                        getItem: this.sandbox.stub(),
                        removeItem: this.sandbox.stub(),
                        setItem: this.sandbox.stub()
-               } );
+               };
+               stub.getItem.throws();
+               stub.setItem.throws();
+               stub.removeItem.throws();
+               this.sandbox.stub( mw.storage, 'store', stub );
 
-               mw.storage.localStorage.getItem.throws();
                assert.strictEqual( mw.storage.get( 'foo' ), false );
-
-               mw.storage.localStorage.setItem.throws();
                assert.strictEqual( mw.storage.set( 'foo', 'test' ), false );
+               assert.strictEqual( mw.storage.remove( 'foo', 'test' ), false );
+       } );
+
+       QUnit.test( 'set/get with storage object disabled', function ( assert ) {
+               // On other browsers, these entire object is disabled.
+               // `'localStorage' in window` would be true (and pass feature test)
+               // but trying to read the object as window.localStorage would throw
+               // an exception. Such case would instantiate SafeStorage with
+               // undefined after the internal try/catch.
+               var old = mw.storage.store;
+               mw.storage.store = undefined;
 
-               mw.storage.localStorage.removeItem.throws();
+               assert.strictEqual( mw.storage.get( 'foo' ), false );
+               assert.strictEqual( mw.storage.set( 'foo', 'test' ), false );
                assert.strictEqual( mw.storage.remove( 'foo', 'test' ), false );
+
+               mw.storage.store = old;
        } );
 
 }( mediaWiki ) );
index 38ae5e4..cb583e7 100644 (file)
@@ -10,7 +10,7 @@
                }
        } );
 
-       QUnit.test( 'render', 2, function ( assert ) {
+       QUnit.test( 'render', function ( assert ) {
                var html, htmlPartial, data, partials,
                        template = mw.template.get( 'stub', 'test_greeting.mustache' ),
                        partial = mw.template.get( 'stub', 'test_greeting_suffix.mustache' );
index 86fd828..a282325 100644 (file)
@@ -24,7 +24,7 @@
                }
        } );
 
-       QUnit.test( 'add', 1, function ( assert ) {
+       QUnit.test( 'add', function ( assert ) {
                assert.throws(
                        function () {
                                mw.template.add( 'module', 'test_templates_foo', 'hello' );
@@ -33,7 +33,7 @@
                );
        } );
 
-       QUnit.test( 'compile', 1, function ( assert ) {
+       QUnit.test( 'compile', function ( assert ) {
                assert.throws(
                        function () {
                                mw.template.compile( '{{foo}}', 'rainbow' );
@@ -42,7 +42,7 @@
                );
        } );
 
-       QUnit.test( 'get', 4, function ( assert ) {
+       QUnit.test( 'get', function ( assert ) {
                assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.xyz' ), 'xyz compiler' );
                assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.abc' ), 'abc default compiler' );
                assert.throws(
index bac8274..d3e73ae 100644 (file)
@@ -31,7 +31,7 @@
                }
        } ) );
 
-       QUnit.test( 'Initial check', 8, function ( assert ) {
+       QUnit.test( 'Initial check', function ( assert ) {
                assert.ok( window.jQuery, 'jQuery defined' );
                assert.ok( window.$, '$ defined' );
                assert.strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
@@ -51,7 +51,7 @@
                this.restoreWarnings();
        } );
 
-       QUnit.test( 'mw.format', 2, function ( assert ) {
+       QUnit.test( 'mw.format', function ( assert ) {
                assert.equal(
                        mw.format( 'Format $1 $2', 'foo', 'bar' ),
                        'Format foo bar',
                );
        } );
 
+       QUnit.test( 'mw.now', function ( assert ) {
+               assert.equal( typeof mw.now(), 'number', 'Return a number' );
+               assert.equal(
+                       String( Math.round( mw.now() ) ).length,
+                       String( +new Date() ).length,
+                       'Match size of current timestamp'
+               );
+       } );
+
        QUnit.test( 'mw.Map', function ( assert ) {
                var arry, conf, funky, globalConf, nummy, someValues;
 
 
        } );
 
-       QUnit.test( 'mw.msg', 14, function ( assert ) {
+       QUnit.test( 'mw.msg', function ( assert ) {
                assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
                assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
                assert.equal( mw.msg( 'goodbye' ), '⧼goodbye⧽', 'Gets message with default options (nonexistent message)' );
                assert.equal( mw.msg( 'int-msg' ), 'Some Other Message', 'int is resolved' );
        } );
 
-       QUnit.test( 'mw.hook', 13, function ( assert ) {
+       QUnit.test( 'mw.hook', function ( assert ) {
                var hook, add, fire, chars, callback;
 
                mw.hook( 'test.hook.unfired' ).add( function () {
index 89eb45f..297f0fd 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
+       QUnit.asyncTest( 'toggleToc', function ( assert ) {
                var tocHtml, $toggleLink, $tocList;
 
                assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
index 5329be6..6c27c5b 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.track' );
 
-       QUnit.test( 'track', 1, function ( assert ) {
+       QUnit.test( 'track', function ( assert ) {
                var sequence = [];
                mw.trackSubscribe( 'simple', function ( topic, data ) {
                        sequence.push( [ topic, data ] );
@@ -15,7 +15,7 @@
                ], 'Events after subscribing' );
        } );
 
-       QUnit.test( 'trackSubscribe', 4, function ( assert ) {
+       QUnit.test( 'trackSubscribe', function ( assert ) {
                var now,
                        sequence = [];
                mw.track( 'before', { key: 1 } );
@@ -40,7 +40,7 @@
                } );
        } );
 
-       QUnit.test( 'trackUnsubscribe', 1, function ( assert ) {
+       QUnit.test( 'trackUnsubscribe', function ( assert ) {
                var sequence = [];
                function unsubber( topic, data ) {
                        sequence.push( [ topic, data ] );
index 6dd17f1..01665e5 100644 (file)
@@ -29,7 +29,7 @@
                        [ false, ':::' ],
                        [ false, '::0:', 'IPv6 ending in a lone ":"' ],
 
-                       [ true,  '::', 'IPv6 zero address' ],
+                       [ true, '::', 'IPv6 zero address' ],
 
                        [ false, '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' ],
                        [ false, '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' ],
                        [ false, 'fc::100:', 'IPv6 ending with lone ":"' ],
                        [ false, 'fc:::100', 'IPv6 with ":::" in the middle' ],
 
-                       [ true,  'fc::100', 'IPv6 with "::" and 2 words' ],
-                       [ true,  'fc::100:a', 'IPv6 with "::" and 3 words' ],
-                       [ true,  'fc::100:a:d', 'IPv6 with "::" and 4 words' ],
-                       [ true,  'fc::100:a:d:1', 'IPv6 with "::" and 5 words' ],
-                       [ true,  'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' ],
-                       [ true,  'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' ],
-                       [ true,  '2001::df', 'IPv6 with "::" and 2 words' ],
-                       [ true,  '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' ],
-                       [ true,  '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' ],
+                       [ true, 'fc::100', 'IPv6 with "::" and 2 words' ],
+                       [ true, 'fc::100:a', 'IPv6 with "::" and 3 words' ],
+                       [ true, 'fc::100:a:d', 'IPv6 with "::" and 4 words' ],
+                       [ true, 'fc::100:a:d:1', 'IPv6 with "::" and 5 words' ],
+                       [ true, 'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' ],
+                       [ true, 'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' ],
+                       [ true, '2001::df', 'IPv6 with "::" and 2 words' ],
+                       [ true, '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' ],
+                       [ true, '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' ],
 
                        [ false, 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' ],
                        [ false, 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' ]
                }
        } ) );
 
-       QUnit.test( 'rawurlencode', 1, function ( assert ) {
+       QUnit.test( 'rawurlencode', function ( assert ) {
                assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
        } );
 
-       QUnit.test( 'escapeId', 17, function ( assert ) {
+       QUnit.test( 'escapeId', function ( assert ) {
                mw.config.set( 'wgExperimentalHtmlIds', false );
                $.each( {
                        '+': '.2B',
                } );
        } );
 
-       QUnit.test( 'wikiUrlencode', 11, function ( assert ) {
+       QUnit.test( 'wikiUrlencode', function ( assert ) {
                assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
                // See also wfUrlencodeTest.php#provideURLS
                $.each( {
                } );
        } );
 
-       QUnit.test( 'getUrl', 14, function ( assert ) {
+       QUnit.test( 'getUrl', function ( assert ) {
                var href;
                mw.config.set( {
                        wgScript: '/w/index.php',
                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' );
        } );
 
-       QUnit.test( 'wikiScript', 4, function ( assert ) {
+       QUnit.test( 'wikiScript', function ( assert ) {
                mw.config.set( {
                        // customized wgScript for T41103
                        wgScript: '/w/i.php',
                assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
        } );
 
-       QUnit.test( 'addCSS', 3, function ( assert ) {
+       QUnit.test( 'addCSS', function ( assert ) {
                var $el, style;
                $el = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
 
                $( style.ownerNode ).remove();
        } );
 
-       QUnit.test( 'getParamValue', 5, function ( assert ) {
+       QUnit.test( 'getParamValue', function ( assert ) {
                var url;
 
                url = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
                assert.strictEqual( mw.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 (bug 27427)' );
+               assert.strictEqual( mw.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', 'Bug 30441: getParamValue must understand "+" encoding of space' );
+               assert.strictEqual( mw.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', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
+               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'T32441: getParamValue must understand "+" encoding of space (multiple spaces)' );
        } );
 
-       QUnit.test( '$content', 2, function ( assert ) {
+       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' );
        } );
         * Previously, test elements where invisible to the selector since only
         * one element can have a given id.
         */
-       QUnit.test( 'addPortletLink', 13, function ( assert ) {
+       QUnit.test( 'addPortletLink', function ( assert ) {
                var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
                        addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
 
                assert.equal(
                        $( '#p-test-custom #c-barmenu ul li' ).length,
                        1,
-                       'addPortletLink did not add the item to all <ul> elements in the portlet (bug 35082)'
+                       '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',
                assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
        } );
 
-       QUnit.test( 'validateEmail', 6, function ( assert ) {
+       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( mw.util.validateEmail( 'userfoo@ex-ample.org' ), true, 'Emails may contain a hyphen' );
        } );
 
-       QUnit.test( 'isIPv6Address', 40, function ( assert ) {
+       QUnit.test( 'isIPv6Address', function ( assert ) {
                $.each( IPV6_CASES, function ( i, ipCase ) {
                        assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
-       QUnit.test( 'isIPv4Address', 11, function ( assert ) {
+       QUnit.test( 'isIPv4Address', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
                        assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
-       QUnit.test( 'isIPAddress', 51, function ( assert ) {
+       QUnit.test( 'isIPAddress', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
                        assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
index f404294..9864166 100644 (file)
@@ -25,7 +25,7 @@
                }
        } ) );
 
-       QUnit.test( 'isElementInViewport', 6, function ( assert ) {
+       QUnit.test( 'isElementInViewport', function ( assert ) {
                var viewport = $.extend( {}, DEFAULT_VIEWPORT );
                assert.ok( mw.viewport.isElementInViewport( this.el, viewport ),
                        'It should return true when the element is fully enclosed in the viewport' );
@@ -60,7 +60,7 @@
                        'It should default to the window object if no viewport is given' );
        } );
 
-       QUnit.test( 'isElementInViewport with scrolled page', 1, function ( assert ) {
+       QUnit.test( 'isElementInViewport with scrolled page', function ( assert ) {
                var viewport = {
                                top: 2000,
                                left: 0,
@@ -83,7 +83,7 @@
                window.scrollTo( 0, 0 );
        } );
 
-       QUnit.test( 'isElementCloseToViewport', 3, function ( assert ) {
+       QUnit.test( 'isElementCloseToViewport', function ( assert ) {
                var
                        viewport = {
                                top: 90,
index 045b633..02ca243 100644 (file)
@@ -1,4 +1,4 @@
-/*global isCompatible: true */
+/* global isCompatible: true */
 ( function ( $ ) {
        var testcases = {
                tested: [
                        // MeeGo
                        'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13',
                        // UC Mini (speed mode on)
-                       'Mozilla/5.0 (X11; U; Linux i686; zh-CN; r:1.2.3.4) Gecko/'
+                       'Mozilla/5.0 (X11; U; Linux i686; zh-CN; r:1.2.3.4) Gecko/',
+                       // Google Web Light proxy
+                       'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko; googleweblight) Chrome/38.0.1025.166 Mobile Safari/535.19'
                ]
        };
 
        QUnit.module( 'startup', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'isCompatible( featureTestable )', testcases.tested.length, function ( assert ) {
+       QUnit.test( 'isCompatible( featureTestable )', function ( assert ) {
                $.each( testcases.tested, function ( i, ua ) {
-                               assert.strictEqual( isCompatible( ua ), true, ua );
-                       }
-               );
+                       assert.strictEqual( isCompatible( ua ), true, ua );
+               } );
        } );
 
-       QUnit.test( 'isCompatible( blacklisted )', testcases.blacklisted.length, function ( assert ) {
+       QUnit.test( 'isCompatible( blacklisted )', function ( assert ) {
                $.each( testcases.blacklisted, function ( i, ua ) {
-                               assert.strictEqual( isCompatible( ua ), false, ua );
-                       }
-               );
+                       assert.strictEqual( isCompatible( ua ), false, ua );
+               } );
        } );
 }( jQuery ) );
index fca25c5..c38b89c 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -341,6 +341,7 @@ function wfStreamThumb( array $params ) {
        // Check for thumbnail generation errors...
        $msg = wfMessage( 'thumbnail_error' );
        $errorCode = 500;
+
        if ( !$thumb ) {
                $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
                if ( $errorMsg instanceof MessageSpecifier &&
@@ -350,6 +351,7 @@ function wfStreamThumb( array $params ) {
                }
        } elseif ( $thumb->isError() ) {
                $errorMsg = $thumb->getHtmlMsg();
+               $errorCode = $thumb->getHttpStatusCode();
        } elseif ( !$thumb->hasFile() ) {
                $errorMsg = $msg->rawParams( 'No path supplied in thumbnail object' )->escaped();
        } elseif ( $thumb->fileIsSource() ) {
diff --git a/wiki.phtml b/wiki.phtml
deleted file mode 100644 (file)
index a197545..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-// Stub file for compatibility with older versions of MediaWiki
-include_once './index.php';